package com.jspxcms.core.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jspxcms.core.domain.Info;
import com.jspxcms.core.domain.InfoBuffer;
import com.jspxcms.core.domain.InfoDetail;
import com.jspxcms.core.domain.InfoFile;
import com.jspxcms.core.domain.InfoImage;
import com.jspxcms.core.domain.Node;
import com.jspxcms.core.domain.User;
import com.jspxcms.core.domain.Workflow;
import com.jspxcms.core.listener.InfoDeleteListener;
import com.jspxcms.core.listener.InfoListener;
import com.jspxcms.core.listener.NodeDeleteListener;
import com.jspxcms.core.listener.OrgDeleteListener;
import com.jspxcms.core.listener.SiteDeleteListener;
import com.jspxcms.core.listener.UserDeleteListener;
import com.jspxcms.core.repository.InfoDao;
import com.jspxcms.core.service.InfoAttributeService;
import com.jspxcms.core.service.InfoBufferService;
import com.jspxcms.core.service.InfoDetailService;
import com.jspxcms.core.service.InfoNodeService;
import com.jspxcms.core.service.InfoService;
import com.jspxcms.core.service.InfoSpecialService;
import com.jspxcms.core.service.InfoTagService;
import com.jspxcms.core.service.NodeService;
import com.jspxcms.core.service.SiteService;
import com.jspxcms.core.service.UserService;
import com.jspxcms.core.service.WorkflowService;
import com.jspxcms.core.support.DeleteException;
/**
* 信息Service实现
*
* @author liufang
*
*/
@Service
@Transactional
public class InfoServiceImpl implements InfoService, SiteDeleteListener,
OrgDeleteListener, NodeDeleteListener, UserDeleteListener {
public Info save(Info bean, InfoDetail detail, Integer[] nodeIds,
Integer[] specialIds, Map<String, String> customs,
Map<String, String> clobs, List<InfoImage> images,
List<InfoFile> files, Integer[] attrIds,
Map<String, String> attrImages, String[] tagNames, Integer nodeId,
Integer creatorId, Boolean draft, Integer siteId) {
bean.setSite(siteService.get(siteId));
User creator = userService.get(creatorId);
bean.setCreator(creator);
bean.setOrg(creator.getOrg());
Node node = nodeService.refer(nodeId);
bean.setNode(node);
bean.setCustoms(customs);
bean.setClobs(clobs);
bean.setImages(images);
bean.setFiles(files);
if (detail != null && StringUtils.isNotBlank(detail.getSmallImage())) {
bean.setWithImage(true);
}
Workflow workflow = null;
// 流程处理
if (draft != null && draft) {
// 草稿
bean.setStatus(Info.DRAFT);
} else {
workflow = node.getWorkflow();
if (workflow != null) {
bean.setStatus(Info.AUDITING);
} else {
bean.setStatus(Info.NORMAL);
}
}
bean.applyDefaultValue();
bean = dao.save(bean);
infoDetailService.save(detail, bean);
// 将InfoBuffer对象一并保存,以免在网页浏览时再保存,导致并发保存报错
infoBufferService.save(new InfoBuffer(), bean);
infoAttrService.save(bean, attrIds, attrImages);
infoNodeService.save(bean, nodeIds, nodeId);
infoTagService.save(bean, tagNames);
infoSpecialService.save(bean, specialIds);
if (workflow != null) {
int step = workflowService.auditPass(workflow, creator, creator,
Info.WORKFLOW_TYPE, bean.getId(), null);
if (step >= 0) {
// 状态最大值只支持9
if (step > 9) {
step = 9;
}
bean.setStatus(Integer.toString(step));
} else {
bean.setStatus(Info.NORMAL);
}
}
firePostSave(new Info[] { bean });
return bean;
}
public Info update(Info bean, InfoDetail detail, Integer[] nodeIds,
Integer[] specialIds, Map<String, String> customs,
Map<String, String> clobs, List<InfoImage> images,
List<InfoFile> files, Integer[] attrIds,
Map<String, String> attrImages, String[] tagNames, Integer nodeId,
Boolean draft) {
if (detail != null && StringUtils.isNotBlank(detail.getSmallImage())) {
bean.setWithImage(true);
}
if (draft != null) {
if (draft) {
bean.setStatus(Info.DRAFT);
} else {
bean.setStatus(Info.NORMAL);
}
}
bean.applyDefaultValue();
bean = dao.save(bean);
if (nodeId != null) {
nodeService.derefer(bean.getNode());
bean.setNode(nodeService.refer(nodeId));
}
bean.getCustoms().clear();
if (!CollectionUtils.isEmpty(customs)) {
bean.getCustoms().putAll(customs);
}
bean.getClobs().clear();
if (!CollectionUtils.isEmpty(clobs)) {
bean.getClobs().putAll(clobs);
}
bean.getImages().clear();
if (!CollectionUtils.isEmpty(images)) {
bean.getImages().addAll(images);
}
bean.getFiles().clear();
if (!CollectionUtils.isEmpty(files)) {
bean.getFiles().addAll(files);
}
infoDetailService.update(detail, bean);
infoAttrService.update(bean, attrIds, attrImages);
infoNodeService.update(bean, nodeIds, nodeId);
infoTagService.update(bean, tagNames);
infoSpecialService.update(bean, specialIds);
firePostUpdate(new Info[] { bean });
return bean;
}
public Info[] auditPass(Integer[] ids, Integer userId, String opinion) {
Info info;
Workflow workflow;
User operator = userService.get(userId);
List<Info> infos = new ArrayList<Info>();
for (Integer id : ids) {
info = dao.findOne(id);
String status = info.getStatus();
// 审核中、退稿、草稿、投稿、采集可审核通过。
if (info.isAuditing() || status.equals(Info.DRAFT)
|| status.equals(Info.CONTRIBUTE)
|| status.equals(Info.COLLECTED)
|| status.equals(Info.REJECTION)) {
workflow = info.getNode().getWorkflow();
int step = workflowService.auditPass(workflow,
info.getCreator(), operator, Info.WORKFLOW_TYPE,
info.getId(), opinion);
if (step == 0) {
continue;
}
if (step == -1) {
info.setStatus(Info.NORMAL);
} else if (step > 0) {
if (step > 9) {
step = 9;
}
info.setStatus(String.valueOf(step));
}
infos.add(info);
}
}
return infos.toArray(new Info[infos.size()]);
}
public Info[] auditReject(Integer[] ids, Integer userId, String opinion) {
Info info;
Workflow workflow;
User operator = userService.get(userId);
List<Info> infos = new ArrayList<Info>();
for (Integer id : ids) {
info = dao.findOne(id);
String status = info.getStatus();
// 审核中、已终审可审核退回。
if (info.isAuditing() || status.equals(Info.NORMAL)) {
workflow = info.getNode().getWorkflow();
int step = workflowService.auditReject(workflow,
info.getCreator(), operator, Info.WORKFLOW_TYPE,
info.getId(), opinion);
if (step == 0) {
// 没有任何操作
continue;
}
if (step == -1) {
info.setStatus(Info.REJECTION);
} else if (step > 0) {
if (step > 9) {
step = 9;
}
info.setStatus(String.valueOf(step));
}
infos.add(info);
}
}
return infos.toArray(new Info[infos.size()]);
}
public Info[] submit(Integer[] ids, Integer userId) {
Info info;
Workflow workflow;
User operator = userService.get(userId);
List<Info> infos = new ArrayList<Info>();
for (Integer id : ids) {
info = dao.findOne(id);
if (info.getStatus().equals(Info.DRAFT)
|| info.getStatus().equals(Info.REJECTION)
|| info.getStatus().equals(Info.COLLECTED)) {
workflow = info.getNode().getWorkflow();
int step = workflowService.auditPass(workflow,
info.getCreator(), operator, Info.WORKFLOW_TYPE,
info.getId(), null);
if (step == 0) {
continue;
}
if (step > 0) {
// 状态最大值只支持9
if (step > 9) {
step = 9;
}
info.setStatus(Integer.toString(step));
} else if (step == -1) {
info.setStatus(Info.NORMAL);
}
infos.add(info);
}
}
return infos.toArray(new Info[infos.size()]);
}
public Info[] antiSubmit(Integer[] ids) {
Info info;
List<Info> infos = new ArrayList<Info>();
for (Integer id : ids) {
info = dao.findOne(id);
if (info.getStatus().equals(Info.REJECTION)) {
info.setStatus(Info.DRAFT);
infos.add(info);
}
}
return infos.toArray(new Info[infos.size()]);
}
private Info doDelete(Integer id) {
Info entity = dao.findOne(id);
if (entity != null) {
dao.delete(entity);
}
return entity;
}
public Info delete(Integer id) {
firePreDelete(new Integer[] { id });
Info bean = doDelete(id);
if (bean != null) {
firePostDelete(new Info[] { bean });
}
return bean;
}
public Info[] delete(Integer[] ids) {
firePreDelete(ids);
List<Info> list = new ArrayList<Info>(ids.length);
Info bean;
for (int i = 0; i < ids.length; i++) {
bean = delete(ids[i]);
if (bean != null) {
list.add(bean);
}
}
Info[] beans = list.toArray(new Info[list.size()]);
firePostDelete(beans);
return beans;
}
public void preUserDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByUserId(Arrays.asList(ids)) > 0) {
throw new DeleteException("info.management");
}
}
}
public void preNodeDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByNodeId(Arrays.asList(ids)) > 0) {
throw new DeleteException("info.management");
}
}
}
public void preOrgDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countByOrgId(Arrays.asList(ids)) > 0) {
throw new DeleteException("info.management");
}
}
}
public void preSiteDelete(Integer[] ids) {
if (ArrayUtils.isNotEmpty(ids)) {
if (dao.countBySiteId(Arrays.asList(ids)) > 0) {
throw new DeleteException("info.management");
}
}
}
private void firePostSave(Info[] bean) {
if (!CollectionUtils.isEmpty(listeners)) {
for (InfoListener listener : listeners) {
listener.postInfoSave(bean);
}
}
}
private void firePostUpdate(Info[] bean) {
if (!CollectionUtils.isEmpty(listeners)) {
for (InfoListener listener : listeners) {
listener.postInfoUpdate(bean);
}
}
}
private void firePreDelete(Integer[] ids) {
if (!CollectionUtils.isEmpty(deleteListeners)) {
for (InfoDeleteListener listener : deleteListeners) {
listener.preInfoDelete(ids);
}
}
}
private void firePostDelete(Info[] bean) {
if (!CollectionUtils.isEmpty(listeners)) {
for (InfoListener listener : listeners) {
listener.postInfoDelete(bean);
}
}
}
private List<InfoListener> listeners;
private List<InfoDeleteListener> deleteListeners;
@Autowired(required = false)
public void setListeners(List<InfoListener> listeners) {
this.listeners = listeners;
}
@Autowired(required = false)
public void setDeleteListeners(List<InfoDeleteListener> deleteListeners) {
this.deleteListeners = deleteListeners;
}
private WorkflowService workflowService;
private InfoAttributeService infoAttrService;
private InfoTagService infoTagService;
private InfoSpecialService infoSpecialService;
private InfoNodeService infoNodeService;
private InfoDetailService infoDetailService;
private InfoBufferService infoBufferService;
private NodeService nodeService;
private UserService userService;
private SiteService siteService;
@Autowired
public void setWorkflowService(WorkflowService workflowService) {
this.workflowService = workflowService;
}
@Autowired
public void setInfoAttrService(InfoAttributeService infoAttrService) {
this.infoAttrService = infoAttrService;
}
@Autowired
public void setInfoTagService(InfoTagService infoTagService) {
this.infoTagService = infoTagService;
}
@Autowired
public void setInfoSpecialService(InfoSpecialService infoSpecialService) {
this.infoSpecialService = infoSpecialService;
}
@Autowired
public void setInfoNodeService(InfoNodeService infoNodeService) {
this.infoNodeService = infoNodeService;
}
@Autowired
public void setInfoDetailService(InfoDetailService infoDetailService) {
this.infoDetailService = infoDetailService;
}
@Autowired
public void setInfoBufferService(InfoBufferService infoBufferService) {
this.infoBufferService = infoBufferService;
}
@Autowired
public void setNodeService(NodeService nodeService) {
this.nodeService = nodeService;
}
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@Autowired
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
private InfoDao dao;
@Autowired
public void setDao(InfoDao dao) {
this.dao = dao;
}
}