/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.content.document.service;
import static com.ewcms.common.lang.EmptyUtil.isCollectionEmpty;
import static com.ewcms.common.lang.EmptyUtil.isNotNull;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ewcms.content.document.BaseException;
import com.ewcms.content.document.dao.ArticleMainDAO;
import com.ewcms.content.document.dao.ReviewProcessDAO;
import com.ewcms.content.document.model.Article;
import com.ewcms.content.document.model.ArticleMain;
import com.ewcms.content.document.model.Article.Status;
import com.ewcms.content.document.model.ReviewGroup;
import com.ewcms.content.document.model.ReviewProcess;
import com.ewcms.content.document.model.ReviewUser;
import com.ewcms.security.manage.model.User;
import com.ewcms.security.manage.service.UserServiceable;
@Service
public class ReviewProcessService implements ReviewProcessServiceable {
@Autowired
private ReviewProcessDAO reviewProcessDAO;
@Autowired
private ArticleMainDAO articleMainDAO;
@Autowired
private UserServiceable userService;
@Autowired
private OperateTrackServiceable operateTrackService;
@Override
public Long addReviewProcess(Integer channelId, ReviewProcess reviewProcess, List<String> userNames, List<String> groupNames) throws BaseException {
ReviewProcess reviewProcess_entity = reviewProcessDAO.findIsEntityReviewProcessByChannelAndName(channelId, reviewProcess.getName());
if (isNotNull(reviewProcess_entity)){
throw new BaseException("流程名称已定义,请重新输入其他名称!", "流程名称已定义,请重新输入其他名称!");
}
if (isCollectionEmpty(userNames) && isCollectionEmpty(groupNames)){
throw new BaseException("用户组和用户不能同时为空,必须选择一项以上!", "用户组和用户不能同时为空,必须选择一项以上!");
}
List<ReviewProcess> vos = reviewProcessDAO.findReviewProcessByChannel(channelId);
reviewProcess.setChannelId(channelId);
setUpReviewUserAndGroup(reviewProcess, userNames, groupNames);
if (vos == null || vos.isEmpty()){
reviewProcess.setPrevProcess(null);
reviewProcessDAO.persist(reviewProcess);
}else{
ReviewProcess lastVo = reviewProcessDAO.findLastReviewProcessByChannel(channelId);
reviewProcess.setPrevProcess(lastVo);
reviewProcess.setNextProcess(null);
lastVo.setNextProcess(reviewProcess);
reviewProcessDAO.merge(lastVo);
}
return reviewProcess.getId();
}
@Override
public void delReviewProcess(Long reviewProcessId) {
ReviewProcess vo = reviewProcessDAO.get(reviewProcessId);
if (vo.getPrevProcess() == null){
if (vo.getNextProcess() != null){
ReviewProcess nextVo = reviewProcessDAO.get(vo.getNextProcess().getId());
nextVo.setPrevProcess(null);
reviewProcessDAO.merge(nextVo);
}
}else{
if (vo.getNextProcess() == null){
ReviewProcess prevVo = reviewProcessDAO.get(vo.getPrevProcess().getId());
prevVo.setNextProcess(null);
reviewProcessDAO.merge(prevVo);
}else{
ReviewProcess prevVo = reviewProcessDAO.get(vo.getPrevProcess().getId());
ReviewProcess nextVo = reviewProcessDAO.get(vo.getNextProcess().getId());
prevVo.setNextProcess(nextVo);
nextVo.setPrevProcess(prevVo);
reviewProcessDAO.merge(nextVo);
reviewProcessDAO.merge(prevVo);
}
}
List<ArticleMain> articleMains = reviewProcessDAO.findArticleMainByReviewProcess(vo.getChannelId(), reviewProcessId);
if (articleMains != null && !articleMains.isEmpty()){
for (ArticleMain articleMain : articleMains){
Article article = articleMain.getArticle();
if (article == null) continue;
operateTrackService.addOperateTrack(articleMain.getId(), article.getStatusDescription(), "审核流程【" + vo.getName() + "】已经被删除。", "");
article.setReviewProcess(null);
article.setStatus(Status.REVIEWBREAK);
articleMain.setArticle(article);
articleMainDAO.merge(articleMain);
}
}
reviewProcessDAO.removeByPK(reviewProcessId);
}
@Override
public void downReviewProcess(Integer channelId, Long reviewProcessId) {
ReviewProcess vo = reviewProcessDAO.get(reviewProcessId);
if (vo.getNextProcess() != null){
ReviewProcess prevVo = vo.getPrevProcess();
ReviewProcess nextVo = vo.getNextProcess();
ReviewProcess nextnextVo = nextVo.getNextProcess();
if (nextnextVo != null){
nextnextVo.setPrevProcess(vo);
reviewProcessDAO.merge(nextnextVo);
}
if (prevVo != null){
prevVo.setNextProcess(nextVo);
reviewProcessDAO.merge(prevVo);
}
vo.setPrevProcess(nextVo);
vo.setNextProcess(nextVo.getNextProcess());
reviewProcessDAO.merge(vo);
nextVo.setPrevProcess(prevVo);
nextVo.setNextProcess(vo);
reviewProcessDAO.merge(nextVo);
}
}
@Override
public void upReivewProcess(Integer channelId, Long reviewProcessId) {
ReviewProcess vo = reviewProcessDAO.get(reviewProcessId);
if (vo.getPrevProcess() != null){
ReviewProcess prevVo = vo.getPrevProcess();
ReviewProcess nextVo = vo.getNextProcess();
ReviewProcess prevprevVo = prevVo.getPrevProcess();
if (prevprevVo != null){
prevprevVo.setNextProcess(vo);
reviewProcessDAO.merge(prevprevVo);
}
if (nextVo != null){
nextVo.setPrevProcess(prevVo);
reviewProcessDAO.merge(nextVo);
}
vo.setPrevProcess(prevVo.getPrevProcess());
vo.setNextProcess(prevVo);
reviewProcessDAO.merge(vo);
prevVo.setPrevProcess(vo);
prevVo.setNextProcess(nextVo);
reviewProcessDAO.merge(prevVo);
}
}
@Override
public Long updReviewProcess(ReviewProcess reviewProcess, List<String> userNames, List<String> groupNames) throws BaseException {
ReviewProcess entity = reviewProcessDAO.findIsEntityReviewProcessByChannelAndName(reviewProcess.getChannelId(), reviewProcess.getName());
if (isNotNull(entity) && reviewProcess.getId().longValue() != entity.getId().longValue()){
throw new BaseException("流程名称已定义,请重新输入其他名称!", "流程名称已定义,请重新输入其他名称!");
}
if (isCollectionEmpty(userNames) && isCollectionEmpty(groupNames)){
throw new BaseException("用户组和用户不能同时为空,必须选择一项以上!", "用户组和用户不能同时为空,必须选择一项以上!");
}
setUpReviewUserAndGroup(reviewProcess, userNames, groupNames);
reviewProcess.setPrevProcess(entity.getPrevProcess());
reviewProcess.setNextProcess(entity.getNextProcess());
reviewProcessDAO.merge(reviewProcess);
return reviewProcess.getId();
}
@Override
public ReviewProcess findReviewProcess(Long reviewProcessId) {
return reviewProcessDAO.get(reviewProcessId);
}
@Override
public List<ReviewProcess> findReviewProcessByChannel(Integer channelId) {
return reviewProcessDAO.findReviewProcessByChannel(channelId);
}
@Override
public ReviewProcess findFirstReviewProcessByChannel(Integer channelId) {
return reviewProcessDAO.findFirstReviewProcessByChannel(channelId);
}
@Override
public Long findReviewProcessCountByChannel(Integer channelId) {
return reviewProcessDAO.findReviewProcessCountByChannel(channelId);
}
private void setUpReviewUserAndGroup(ReviewProcess reviewProcess, List<String> userNames, List<String> groupNames){
List<ReviewGroup> reviewGroups = new ArrayList<ReviewGroup>();
ReviewGroup reviewGroup;
for (String groupName : groupNames){
reviewGroup = new ReviewGroup();
reviewGroup.setGroupName(groupName);
reviewGroups.add(reviewGroup);
}
reviewProcess.setReviewGroups(reviewGroups);
List<ReviewUser> reviewUsers = new ArrayList<ReviewUser>();
ReviewUser reviewUser;
for (String userName : userNames){
reviewUser = new ReviewUser();
reviewUser.setUserName(userName);
reviewUser.setRealName(findUserRealNameByUserName(userName));
reviewUsers.add(reviewUser);
}
reviewProcess.setReviewUsers(reviewUsers);
}
private String findUserRealNameByUserName(String userName){
User user = userService.getUser(userName);
return user.getUserInfo().getName();
}
@Override
public Boolean findReviewUserIsEntityByProcessIdAndUserName(Long reviewProcessId, String userName) {
return reviewProcessDAO.findReviewUserIsEntityByProcessIdAndUserName(reviewProcessId, userName);
}
@Override
public Boolean findReviewGroupIsEntityByProcessIdAndUserName(Long reviewProcessId, String goupName) {
return reviewProcessDAO.findReviewGroupIsEntityByProcessIdAndUserName(reviewProcessId, goupName);
}
}