/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.workpayment.service;

import com.google.common.collect.Maps;
import com.jeeplus.common.persistence.Page;
import com.jeeplus.common.service.CrudService;
import com.jeeplus.common.utils.Collections3;
import com.jeeplus.common.utils.JPushClientUtil;
import com.jeeplus.common.utils.MenuStatusEnum;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.act.entity.Act;
import com.jeeplus.modules.act.service.ActTaskService;
import com.jeeplus.modules.act.utils.ActUtils;
import com.jeeplus.modules.pushinfo.entity.Pushinfo;
import com.jeeplus.modules.pushinfo.service.PushinfoService;
import com.jeeplus.modules.sys.dao.UserDao;
import com.jeeplus.modules.sys.entity.Office;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.service.OfficeService;
import com.jeeplus.modules.sys.utils.UserUtils;
import com.jeeplus.modules.workapprovalcopy.entity.ApprovalCopy;
import com.jeeplus.modules.workapprovalcopy.service.ApprovalCopyService;
import com.jeeplus.modules.workpayment.dao.WorkPaymentDao;
import com.jeeplus.modules.workpayment.entity.WorkPayment;
import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 付款申请Service
 * @author fgy
 * @version 2018-01-16
 */
@SuppressWarnings("all")
@Service
@Transactional(readOnly = true)
public class WorkPaymentService extends CrudService<WorkPaymentDao, WorkPayment> {

	@Autowired
	private WorkPaymentDao workPaymentDao;
	@Autowired
	private RuntimeService runtimeService;
	@Autowired
	protected TaskService taskService;
	@Autowired
	protected HistoryService historyService;
	@Autowired
	protected RepositoryService repositoryService;
	@Autowired
	private IdentityService identityService;
	@Autowired
	private UserDao userDao;
	@Autowired
	private ActTaskService actTaskService;
	@Autowired
	private ApprovalCopyService approvalCopyService;
	@Autowired
	private OfficeService officeService;
	@Autowired
	private PushinfoService pushinfoService;
	@Autowired
	private WorkProjectNotifyService workProjectNotifyService;

	public WorkPayment get(String id) {
		WorkPayment workPayment = workPaymentDao.get(id);
		Map<String,Object> variables=null;
		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(workPayment.getProcessInstanceId()).singleResult();
		if(historicProcessInstance!=null) {
			variables = Collections3.extractToMap(historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list(), "variableName", "value");
		} else {
			variables = runtimeService.getVariables(runtimeService.createProcessInstanceQuery().processInstanceId(workPayment.getProcessInstanceId()).active().singleResult().getId());
		}
		workPayment.setVariables(variables);
		return workPayment;
	}
	
	public List<WorkPayment> findList(WorkPayment workPayment) {
		return super.findList(workPayment);
	}
	
	public Page<WorkPayment> findPage(Page<WorkPayment> page, WorkPayment workPayment) {
		workPayment.getSqlMap().put("dsf", dataScopeFilter(workPayment.getCurrentUser(), "o", "u","", MenuStatusEnum.WORK_PETTYCASH.getValue()));
		workPayment.setPage(page);
		page.setList(workPaymentDao.findList(workPayment));
		if(page.getList()!=null && page.getList().size()>0){
			for(WorkPayment item : page.getList()) {
				String processInstanceId = item.getProcessInstanceId();
				HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
				if(historicProcessInstance!=null) {
					item.setHistoricProcessInstance(historicProcessInstance);
					item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
				} else {
					ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
					if (processInstance != null){
						item.setProcessInstance(processInstance);
						item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
					}
				}
				ProcessInstance processInstance = actTaskService.getProcIns(item.getProcessInstanceId());
				if (processInstance!=null) {
					Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
					if (StringUtils.isNotBlank(taskInfok.getAssignee()) && taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
						item.setTask(taskInfok);
					}
				}
			}
		}
		return page;
	}
	
	@Transactional(readOnly = false)
	public void save(WorkPayment workPayment) {
		super.save(workPayment);
	}
	
	@Transactional(readOnly = false)
	public void delete(WorkPayment workPayment) {
		super.delete(workPayment);
	}

	@Transactional(readOnly = false)
	public void update(WorkPayment workPayment) {
		workPaymentDao.update(workPayment);
	}
	public WorkPayment getByProcessInstanceId(String processInstanceId) {
		WorkPayment workPayment = workPaymentDao.getByProcessInstanceId(processInstanceId);
		return workPayment;
	}
	public WorkPayment getById(String id) {
		WorkPayment workPayment = workPaymentDao.get(id);
		return workPayment;
	}

	@Transactional(readOnly = false)
	public Map<String,Boolean> saveWorkPettyCash(WorkPayment workPayment) {
		Map<String,Boolean> resultMap = Maps.newHashMap();
		try {
			workPayment.setStatus("1");
			String approverId = "";
			List<String> adds = workPayment.getAdds();
			for(int i = 0;i<adds.size();i++){
				if(i + 1 == adds.size()){
					approverId += adds.get(i);
				}else{
					approverId += adds.get(i) + ",";
				}
			}
			workPayment.setIds(approverId);
			Map<String, Object> variables = Maps.newHashMap();
			String type = "1";
			String alias = "1";
			List<String> assigneeList=new ArrayList<String>(); //分配任务的人员
			if(!UserUtils.getUser().isAdmin() && approverId!=null && !approverId.equals("")) {
				if (approverId.contains(UserUtils.getUser().getId())){
					logger.error("付款申请失败,审批人不能为本人");
					resultMap.put("flag",false);
					return resultMap;
				}
				String[] approverIds = approverId.split(",");
				for (int i =0 ;i<approverIds.length;i++){
					assigneeList.add(approverIds[i]);
				}
				type = approverIds.length+"";
				alias = approverIds[0];
			}
			variables.put("assigneeList", assigneeList);
			variables.put("count",assigneeList.size());
			Office office = UserUtils.getSelectOffice();//付款申请部门
			Office company = UserUtils.getSelectCompany();
			User user = UserUtils.getUser();
			workPayment.setCompany(company);
			workPayment.setOffice(office);
			workPayment.setCreateBy(user);
			workPayment.setUpdateBy(user);
			workPayment.setDelFlag("0");
			workPayment.setStatus("1");
			workPayment.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
			workPayment.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
			save(workPayment,variables,type);
			ApprovalCopy approvalCopy = new ApprovalCopy();
			approvalCopy.setCCId(workPayment.getCCid());
			approvalCopy.setUserId(user.getId());
			approvalCopy.setType("payment");
			approvalCopy.setRemarks(workPayment.getReason());
			approvalCopy.setApprovalId(workPayment.getId());
			approvalCopy.setApproverId(approverId);
			approvalCopy.setReadFlag("0");
			approvalCopyService.save(approvalCopy);

			//给抄送人、审批人发送通知
			if(approvalCopy!=null && org.apache.commons.lang3.StringUtils.isNotBlank(approvalCopy.getId())){
				String chaosongIds = approvalCopy.getCCId();//给所有抄送人发送通知
				String shenpiIds = alias;//给审批流程的第一个人发送通知
				this.sendNotify(chaosongIds,shenpiIds,approvalCopy.getApprovalId());
				String content = "审批信息 申请人:" + user.getName() + ",付款申请: 待审批!";
				UserUtils.pushIm(alias,content);
			}

			String title="审批";
			String content =  user.getName()+"的付款申请需要你审批";
			String status = "待审批";
			Office office1 = workPayment.getOffice();
			String officeName = "";
			if (office1!=null){
				Office o = officeService.get(office1.getId());
				officeName = o.getName();
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Date payDate = workPayment.getPayDate();
			String payDateStr = payDate==null?"":sdf.format(payDate);
			String remarks = "付款申请部门："+office.getName()+ "\n"
					+"付款事由："+workPayment.getReason()+"\n"
					+"付款金额："+workPayment.getAmount();
			Map extras = new HashMap();
			extras.put("type", "4001");
			extras.put("id", workPayment.getId());
			extras.put("procDefKey", "payment");

			boolean b = JPushClientUtil.sendNotificationToAlias(title, content, extras, alias);
			Pushinfo pushinfo = new Pushinfo();
			pushinfo.setCurrentUser(UserUtils.getUser());
			pushinfo.setRemarks(remarks);
			pushinfo.setUserId(UserUtils.getUser().getId());
			pushinfo.setType("4001");
			pushinfo.setPushId(workPayment.getId());
			pushinfo.setTitle(title);
			pushinfo.setContent(content);
			pushinfo.setPushUserId(alias);
			pushinfo.setParentType("singleApproval");
			pushinfo.setStatus(status);
			pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
			pushinfo.setAddcontent("payment");
			pushinfo.setMobile("ios,android");
			pushinfoService.save(pushinfo);
			if (b){
				resultMap.put("flag",true);
				resultMap.put("b",b);
				return resultMap;
			}
		} catch (Exception e) {
			logger.error("启动付款流程失败：", e);
		}
		resultMap.put("flag",false);
		return resultMap;
	}

	@Transactional(readOnly = false)
	public void sendNotify(String chaosongIds, String shenpiIds, String paymentId) {
		if(StringUtils.isNotBlank(paymentId)){
			if(StringUtils.isNotBlank(chaosongIds)){
				WorkProjectNotify notify = new WorkProjectNotify();
				notify.setTitle(UserUtils.getUser().getName()+"发起了付款申请");
				notify.setRemarks("待通知");
				notify.setContent(UserUtils.getUser().getName()+"的付款申请");
				notify.setNotifyRole("");
				notify.setNotifyId(paymentId);
				notify.setStatus("0");
				notify.setCompanyId(UserUtils.getSelectCompany().getId());
				notify.setType("34");
				String[] arr = chaosongIds.split(",");
				for (String id : arr){
					if(StringUtils.isNotBlank(id)){
						notify.setId("");
						notify.setUser(new User(id));
						workProjectNotifyService.save(notify);
					}
				}
			}
			if(StringUtils.isNotBlank(shenpiIds)){
				WorkProjectNotify notify = new WorkProjectNotify();
				notify.setTitle("您有新的付款申请待审批");
				notify.setRemarks("待审批");
				notify.setContent("付款申请--待审批");
				notify.setNotifyRole("");
				notify.setUser(new User(shenpiIds));
				notify.setNotifyId(paymentId);
				notify.setStatus("0");
				notify.setCompanyId(UserUtils.getSelectCompany().getId());
				notify.setType("34");
				workProjectNotifyService.save(notify);
			}
		}
	}

	@Transactional(readOnly = false)
	public void save(WorkPayment workPayment, Map<String, Object> variables, String type) {
		// 保存业务数据
		if (StringUtils.isBlank(workPayment.getId())) {
			// 保存业务数据
			workPayment.preInsert();
			workPaymentDao.insert(workPayment);
			logger.debug("save entity: {}", workPayment);

			// 用来设置启动流程的人员ID，引擎会自动把用户ID保存到activiti:initiator中
			identityService.setAuthenticatedUserId(workPayment.getCurrentUser().getId());

			// 启动流程
			String businessKey = workPayment.getId().toString();
			variables.put("type", "payment");
			variables.put("busId", businessKey);
			variables.put("title", workPayment.getReason());//设置标题；
			ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OA_PAYMENT[0], businessKey, variables);

			// 更新流程实例ID
			workPayment.setProcessInstanceId(processInstance.getId());
			workPayment.setProcessInstance(processInstance);
			workPaymentDao.updateProcessInstanceId(workPayment);

			logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[] {
					ActUtils.PD_OA_PAYMENT[0], businessKey, processInstance.getId(), variables });
		}else{
			workPayment.preUpdate();
			workPaymentDao.update(workPayment);
			workPayment.getAct().setComment(("yes".equals(workPayment.getAct().getFlag())?"[重申] ":"[销毁] ")+workPayment.getAct().getComment());

			// 完成流程任务
			Map<String, Object> vars = Maps.newHashMap();
			vars.put("reApply", "yes".equals(workPayment.getAct().getFlag())? true : false);
			actTaskService.complete(workPayment.getAct().getTaskId(), workPayment.getAct().getProcInsId(), workPayment.getAct().getComment(), workPayment.getComment(), vars);
		}
	}

	@Transactional(readOnly = false)
	public void auditSave(WorkPayment workPayment) {

		// 设置意见
		workPayment.getAct().setComment(("yes".equals(workPayment.getAct().getFlag())?"[同意] ":"[驳回] ")+workPayment.getAct().getComment());
		workPayment.preUpdate();
		this.update(workPayment);
		// 对不同环节的业务逻辑进行操作
		String taskDefKey = workPayment.getAct().getTaskDefKey();

		//发送通知
		WorkProjectNotify notify = new WorkProjectNotify();
		notify.setNotifyId(workPayment.getId());
		notify.setCompanyId(UserUtils.getSelectCompany().getId());
		notify.setType("34");
		notify.setStatus("0");
		notify.setNotifyRole("");

		//业务逻辑对应的条件表达式
		String exp = "";
		// 审核环节
		if ("audit1".equals(taskDefKey)){
			exp = "pass";
		}else if ("audit2".equals(taskDefKey)){
			exp = "pass";
		}else if ("audit3".equals(taskDefKey)){
			exp = "pass";
		}else if ("audit4".equals(taskDefKey)){
			exp = "pass";
		}else if ("audit5".equals(taskDefKey)){
			exp = "pass";
		}else if("apply_end".equals(taskDefKey)){
			exp = "pass";
		}
		// 未知环节，直接返回
		else{
			return;
		}

		// 提交流程任务
		Map<String, Object> vars = Maps.newHashMap();
		vars.put(exp, "yes".equals(workPayment.getAct().getFlag())? false : true);
		// 提交流程任务
		actTaskService.complete(workPayment.getAct().getTaskId(), workPayment.getAct().getProcInsId(), workPayment.getAct().getComment(), vars);
		boolean state = actTaskService.isProcessEnd(workPayment.getAct().getProcInsId());
		workPayment.setStatus("2");
		if (!state){
			if ("yes".equals(workPayment.getAct().getFlag())){
				workPayment.setStatus("3");
			}else {
				workPayment.setStatus("4");
			}
		}
		workPayment.preUpdate();
		this.update(workPayment);

		//需在workSealForm更新后 操作：
		//1待审核  2审核中 3通过 4驳回 5已撤销 6催办中
		if("2".equals(workPayment.getStatus())){
			workPayment = this.get(workPayment.getId());
			String userId = workPayment.getVariables().get("assignee").toString();
			if(StringUtils.isNotBlank(userId)){
				notify.setUser(UserUtils.get(userId));
			}
			notify.setTitle("您有新的付款申请待审批");
			notify.setRemarks("待审批");
			notify.setContent("备用金申请--待审批");

		}else if("3".equals(workPayment.getStatus())){
			notify.setUser(workPayment.getCreateBy());
			notify.setTitle("您的付款申请已通过");
			notify.setRemarks("待通知");
			notify.setContent(workPayment.getAct().getComment());
		}else if("4".equals(workPayment.getStatus())){
			notify.setUser(workPayment.getCreateBy());
			notify.setTitle("您的付款申请被驳回");
			notify.setRemarks("待通知");
			notify.setContent(workPayment.getAct().getComment());
		}
		workProjectNotifyService.save(notify);

		//更新审核人的阅读状态
		WorkProjectNotify notify2 = new WorkProjectNotify();
		notify2.setUser(UserUtils.getUser());
		notify2.setNotifyId(workPayment.getId());
		workProjectNotifyService.readByNotifyIdAndNotifyUser(notify2);

		//抄送
		if("3".equals(workPayment.getStatus()) || "4".equals(workPayment.getStatus())){
			ApprovalCopy approvalCopy = approvalCopyService.getByApprovalId(workPayment.getId());
			if(approvalCopy!=null && StringUtils.isNotBlank(approvalCopy.getCCId())){
				WorkProjectNotify notify1= new WorkProjectNotify();
				notify1.setNotifyId(workPayment.getId());
				notify1.setCompanyId(UserUtils.getSelectCompany().getId());
				notify1.setType("34");
				notify1.setStatus("0");
				notify1.setNotifyRole("");
				notify1.setContent(workPayment.getAct().getComment());
				String[] ccIds = approvalCopy.getCCId().split(",");
				for(String ccId : ccIds){
					if(StringUtils.isNotBlank(ccId)){
						notify1.setUser(new User(ccId));
						if("3".equals(workPayment.getStatus())){
							notify1.setTitle(UserUtils.get(workPayment.getCreateBy().getId()).getName()+"的付款申请已通过");
						}
						if("4".equals(workPayment.getStatus())){
							notify1.setTitle(UserUtils.get(workPayment.getCreateBy().getId()).getName()+"的付款申请被驳回");
						}
						notify1.setRemarks("待通知");
						notify1.setId("");
						workProjectNotifyService.save(notify1);
					}
				}
			}
		}
	}
	@Transactional(readOnly = false)
	public Map getPaymentById(String id, String type) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		WorkPayment workPayment = this.getById(id);
		Map<String,Object> map = Maps.newHashMap();
		if(workPayment!=null){
			User user = userDao.get(workPayment.getCreateBy());
			String officeName = "";
			if(user!=null){
				map.put("userName", user.getName());
				map.put("users", user.getId());
				map.put("photo",user.getPhoto());
				Office office = user.getOffice();
				if(office!=null && office.getName()!=null){
					officeName = office.getName();
				}
			}
			map.put("officeName",officeName);
			map.put("createDate",workPayment.getCreateDate()==null?"":sdf.format(workPayment.getCreateDate()));
			map.put("payDate",workPayment.getPayDate()==null?"":sdf.format(workPayment.getPayDate()));
			map.put("payObject",workPayment.getPayObject());
			map.put("payBank",workPayment.getPayBank());
			map.put("payBankAccount",workPayment.getPayBankAccount());
			String payType = workPayment.getPayType();
			if (payType.equals("1")){
				payType = "支票";
			}else if (payType.equals("2")){
				payType = "贷记";
			}else if (payType.equals("3")){
				payType = "电汇";
			}else if (payType.equals("4")){
				payType = "汇票";
			}else if (payType.equals("5")){
				payType = "现金";
			}else if (payType.equals("6")){
				payType = "银行卡";
			}else if (payType.equals("7")){
				payType = "其他";
			}
			map.put("payType",payType);
			map.put("status",workPayment.getStatus());
			map.put("amount",workPayment.getAmount());
			map.put("amountCN",workPayment.getAmountCN());
			map.put("remarks",workPayment.getRemarks());
			String office = "";
			if(workPayment.getOffice()!=null && workPayment.getOffice().getName()!=null){
				office = workPayment.getOffice().getName();
			}

			map.put("reason",workPayment.getReason());
			map.put("approvalId",id);
			List<Act> list = actTaskService.histoicFlowList(workPayment.getProcessInstanceId(), "", "");
			List<Act> list2 = actTaskService.toMyStartedList(workPayment.getProcessInstanceId());
			if (list2!=null && list2.size()!=0) {
				Act act1 = list2.get(list2.size()-1);
				map.put("taskId", act1.getTaskId());
				map.put("taskName", act1.getTaskName());
				map.put("procInsId", act1.getProcInsId());
				map.put("procDefId", act1.getProcDefId());
				map.put("actStatus", act1.getStatus()==null?"todo":act1.getStatus());
				map.put("taskDefKey", act1.getTaskDefKey());
				map.put("procDefKey", "payment");
			}
			List list1 = new ArrayList();
			String approvalStatus = "0";
			String assigneeName = "";
			if (list!=null && list.size()!=0) {
				if (list.get(0).getHistIns().getActivityName().contains("审批")) {
					for (int i = list.size() - 1; i > -1; i--) {
						Act act = list.get(i);
						Map<String, Object> maps = new HashMap<String, Object>();
						String state = "0";
						String activityName = "";
						if (act.getHistIns().getActivityName().contains("审批")) {
							if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
								activityName = "已审批";
								if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
									approvalStatus = "1";
								}
							} else {
								activityName = "待审批";
								state = "2";
							}
						} else {
							activityName = act.getHistIns().getActivityName();
						}
						maps.put("activityName", activityName);
						maps.put("assigneeName", UserUtils.getUser().getName().equals(act.getAssigneeName()) ? "我" : act.getAssigneeName());
						maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
						maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
						maps.put("durationTime", act.getDurationTime());
						maps.put("state", state);
						maps.put("userId", act.getCurrentUser().getId());
						list1.add(maps);
					}
				} else {
					if (workPayment.getStatus().equals("4") || workPayment.getStatus().equals("3")){
						for (int i = 0; i < list.size()-1; i++) {
							Act act = list.get(i);
							Map<String, Object> maps = new HashMap<String, Object>();
							String state = "0";
							String activityName = "";
							if (act.getHistIns().getActivityName().contains("发起申请")) {
								activityName = act.getHistIns().getActivityName();
								assigneeName = act.getAssigneeName();
							}else if (act.getHistIns().getActivityName().contains("审批")) {
								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
								}
								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
									activityName = "已审批";
									if (UserUtils.getUser().getName().equals(assigneeName)){
										approvalStatus = "1";
									}
									if (i == (list.size()-2) && workPayment.getStatus().equals("4")){
										activityName = "审核驳回";
										state = "1";
									}else if (i == (list.size()-2) && workPayment.getStatus().equals("3")){
										activityName = "审核成功";
									}
								} else {
									activityName = "待审批";
									state = "2";
								}
							}
							else {
								activityName = act.getHistIns().getActivityName();
								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
								}
							}
							maps.put("activityName", activityName);
							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
							maps.put("durationTime", act.getDurationTime());
							maps.put("state", state);
							maps.put("userId", act.getCurrentUser().getId());
							list1.add(maps);
						}
					}else {
						for (int i = 0; i < list.size(); i++) {
							Act act = list.get(i);
							Map<String, Object> maps = new HashMap<String, Object>();
							String state = "0";
							String activityName = "";
							if (act.getHistIns().getActivityName().contains("发起申请")) {
								activityName = act.getHistIns().getActivityName();
								assigneeName = act.getAssigneeName();
							}else if (act.getHistIns().getActivityName().contains("审批")) {
								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
								}
								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
									activityName = "已审批";
									if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
										approvalStatus = "1";
									}
								} else {
									activityName = "待审批";
									state = "2";
								}
							}
							else {
								activityName = act.getHistIns().getActivityName();
								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
								}
							}
							if (workPayment.getStatus().equals("5") && i == list.size() - 1) {
								activityName = "已撤销";
								state = "1";
							}
							maps.put("activityName", activityName);
							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
							maps.put("durationTime", act.getDurationTime());
							maps.put("state", state);
							maps.put("userId", act.getCurrentUser().getId());
							list1.add(maps);
						}
					}
				}
			}
			map.put("approvalStatus", approvalStatus);
			ApprovalCopy approvalCopy = new ApprovalCopy();
			approvalCopy.setApprovalId(id);
			List<ApprovalCopy> approvalCopyList = approvalCopyService.findList(approvalCopy);
			String CCName = "";
			String CCId = "";
			Boolean readFlag = false;
			if (approvalCopyList!=null && approvalCopyList.size()!=0) {
				ApprovalCopy approvalCopy1 = approvalCopyList.get(0);
				CCId = approvalCopy1.getCCId();
				String[] CCid = approvalCopy1.getCCId().split(",");
				readFlag = approvalCopy1.getReadFlag().equals("0");
				if (type.equals("3") && readFlag){
					approvalCopy1.setReadFlag("1");
					approvalCopyService.save(approvalCopy1);
				}
				for (String userId : CCid) {
					User CCUser = UserUtils.get(userId);
					if (CCUser != null) {
						CCName = CCUser.getName() + ",";
					}
				}
				if (CCName.length() > 1) {
					CCName = CCName.substring(0, CCName.length() - 1);
				} else {
					CCName = "";
				}
			}
			map.put("nameCopy",CCName);
			map.put("CCId",CCId);
			map.put("process",list1);

		}
		return  map;
	}
}