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

import com.google.common.collect.Maps;
import com.jeeplus.common.oss.OSSClientUtil;
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.common.websocket.onchat.ChatServerPool;
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.oa_evection.dao.oa_evection.OaEvectionDao;
import com.jeeplus.modules.oa_evection.entity.oa_evection.OaEvection;
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.entity.Workattachment;
import com.jeeplus.modules.sys.service.WorkattachmentService;
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.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.java_websocket.WebSocket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 出差流程Service
 *
 * @author 丁旭
 * @version 2017-05-22
 */
@Service
@Transactional(readOnly = true)
public class OaEvectionService extends CrudService<OaEvectionDao, OaEvection> {
    @Autowired
    private OaEvectionDao oaEvectionDao;
    @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 PushinfoService pushinfoService;
    @Autowired
    private WorkProjectNotifyService workProjectNotifyService;
    @Autowired
    private WorkattachmentService workattachmentService;

    @SuppressWarnings("unchecked")
    public OaEvection get(String id) {
        OaEvection oaEvection = oaEvectionDao.get(id);
        Map<String, Object> variables = null;

        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(oaEvection.getProcessInstanceId()).singleResult();
        if (historicProcessInstance != null) {
            variables = Collections3.extractToMap(historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list(), "variableName", "value");
        } else {
            variables = runtimeService.getVariables(runtimeService.createProcessInstanceQuery().processInstanceId(oaEvection.getProcessInstanceId()).active().singleResult().getId());
        }
        oaEvection.setVariables(variables);

        List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(oaEvection.getId(),"73");
        oaEvection.setWorkattachmentList(workattachmentList);
        return oaEvection;
    }

    @SuppressWarnings("unchecked")
    public OaEvection getById(String id) {
        OaEvection oaEvection = oaEvectionDao.get(id);
        return oaEvection;
    }

    @Transactional(readOnly = false)
    public Map getEvectionById(String id, String type) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        OaEvection oaEvection = this.getById(id);
        Map<String, Object> map = Maps.newHashMap();
        if (oaEvection != null) {
            User user = userDao.get(oaEvection.getCreateBy());
            String officeName = "";
            if (user != null) {
                map.put("userName", user.getName());
                map.put("photo", user.getPhoto());
                map.put("users", user.getId());
                Office office = user.getOffice();
                if (office != null && office.getName() != null) {
                    officeName = office.getName();
                }
            }
            map.put("officeName", officeName);
            map.put("createDate", oaEvection.getCreateDate() == null ? "" : sdf.format(oaEvection.getCreateDate()));
            map.put("startTime", oaEvection.getStartTime());
            map.put("endTime", oaEvection.getEndTime());
            map.put("address", oaEvection.getAddress());
            map.put("dateCount", oaEvection.getDateCount());
            map.put("reason", oaEvection.getReason());
            map.put("approvalId", id);
            map.put("status", oaEvection.getStatus());
            map.put("companyId", oaEvection.getCompanyId());
            /*map.put("files", oaEvection.getFiles() == null ? "" : oaEvection.getFiles());*/
            List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(oaEvection.getId(),"73");
            String files = "";
            if (workattachmentList!=null && workattachmentList.size()!=0){
                for (Workattachment workattachment : workattachmentList){
                    files += workattachment.getUrl()+",";
                }
                if (files.length() > 1) {
                    files = files.substring(0, files.length() - 1);
                }
            }
            map.put("files", files);
            List<Act> list = actTaskService.histoicFlowList(oaEvection.getProcessInstanceId(), "", "");
            List<Act> list2 = actTaskService.toMyStartedList(oaEvection.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", "evection");
            }
            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 (oaEvection.getStatus().equals("4") || oaEvection.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) && oaEvection.getStatus().equals("4")) {
                                        activityName = "审核驳回";
                                        state = "1";
                                    } else if (i == (list.size() - 2) && oaEvection.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();
                                }
                            }

                            if (type.equals("1") || type.equals("2")) {
                                maps.put("activityName", activityName);
                                maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
                            } else if (type.equals("3")) {
                                maps.put("activityName", activityName);
                                maps.put("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(assigneeName)) {
                                        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 (oaEvection.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;
    }

    public List<OaEvection> findList(OaEvection oaEvection) {
        return super.findList(oaEvection);
    }

    public Page<OaEvection> findPage(Page<OaEvection> page, OaEvection oaEvection) {
        return super.findPage(page, oaEvection);
    }

    //暂存
    @Transactional(readOnly = false)
    public void save(OaEvection oaEvection) {
        super.save(oaEvection);
    }

    //启动流程
    @Transactional(readOnly = false)
    public void submit(OaEvection oaEvection, Map<String, Object> variables, String type) {
        // 保存业务数据
        if (StringUtils.isBlank(oaEvection.getId())) {
            // 保存业务数据
            super.save(oaEvection);

            logger.debug("save entity: {}", oaEvection);

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

            // 启动流程
            String businessKey = oaEvection.getId().toString();
            variables.put("type", "evection");
            variables.put("busId", businessKey);
            variables.put("title", oaEvection.getReason());//设置标题；

            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OA_EVECTION[0], businessKey, variables);
            oaEvection.setProcessInstance(processInstance);
            // 更新流程实例ID
            oaEvection.setProcessInstanceId(processInstance.getId());
            oaEvectionDao.updateProcessInstanceId(oaEvection);

        } else {
            oaEvection.preUpdate();
            oaEvectionDao.update(oaEvection);
            oaEvection.getAct().setComment(("yes".equals(oaEvection.getAct().getFlag()) ? "[重申] " : "[销毁] ") + oaEvection.getAct().getComment());

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

    }

    @Transactional(readOnly = false)
    public void saveFile(OaEvection oaEvection) {
        if (StringUtils.isBlank(oaEvection.getId())) {
            oaEvection.preInsert();
            oaEvectionDao.insert(oaEvection);
        } else {
            oaEvection.preUpdate();
            oaEvectionDao.update(oaEvection);
        }
    }

    @Transactional(readOnly = false)
    public void delete(OaEvection oaEvection) {
        oaEvectionDao.delete(oaEvection);
    }

    @Transactional(readOnly = false)
    public void update(OaEvection oaEvection) {
        oaEvection.preUpdate();
        oaEvectionDao.update(oaEvection);
    }

    /**
     * 获取流程详细信息
     *
     * @param processInstanceId
     */
    @SuppressWarnings("unchecked")
    public OaEvection getByProcessInstanceId(String processInstanceId) {
        OaEvection oaEvection = oaEvectionDao.getByProcessInstanceId(processInstanceId);
        return oaEvection;
    }

    /**
     * 查询待办任务
     *
     * @param userId 用户ID
     * @return
     */
    public List<OaEvection> findTodoTasks(String userId) {

        List<OaEvection> results = new ArrayList<OaEvection>();
        List<Task> tasks = new ArrayList<Task>();
        // 根据当前人的ID查询
        List<Task> todoList = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OA_EVECTION[0]).taskAssignee(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();

        // 根据当前人未签收的任务
        List<Task> unsignedTasks = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OA_EVECTION[0]).taskCandidateUser(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();
        // 合并
        tasks.addAll(todoList);
        tasks.addAll(unsignedTasks);
        // 根据流程的业务ID查询实体并关联
        for (Task task : tasks) {
            String processInstanceId = task.getProcessInstanceId();
            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
            String businessKey = processInstance.getBusinessKey();
            OaEvection oaEvection = oaEvectionDao.get(businessKey);
            oaEvection.setTask(task);
            oaEvection.setProcessInstance(processInstance);
            oaEvection.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId((processInstance.getProcessDefinitionId())).singleResult());
            results.add(oaEvection);
        }
        return results;
    }


    /* * 审核审批保存
     * @param testAudit
     */
    @Transactional(readOnly = false)
    public void auditSave(OaEvection oaEvection) {

        // 设置意见
        oaEvection.getAct().setComment(("yes".equals(oaEvection.getAct().getFlag()) ? "[同意] " : "[驳回] ") + oaEvection.getAct().getComment());

        // 对不同环节的业务逻辑进行操作
        String taskDefKey = oaEvection.getAct().getTaskDefKey();

        //发送通知
        WorkProjectNotify notify = new WorkProjectNotify();
        notify.setNotifyId(oaEvection.getId());
        notify.setCompanyId(UserUtils.getSelectCompany().getId());
        notify.setType("26");
        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(oaEvection.getAct().getFlag()) ? false : true);

        // 提交流程任务
        actTaskService.complete(oaEvection.getAct().getTaskId(), oaEvection.getAct().getProcInsId(), oaEvection.getAct().getComment(), vars);
        boolean state = actTaskService.isProcessEnd(oaEvection.getAct().getProcInsId());
        oaEvection.setStatus("2");
        if (!state) {
            if ("yes".equals(oaEvection.getAct().getFlag())) {
                oaEvection.setStatus("3");
            } else {
                oaEvection.setStatus("4");
            }
        }
        oaEvection.preUpdate();
        this.update(oaEvection);

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

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

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

        //抄送
        if ("3".equals(oaEvection.getStatus()) || "4".equals(oaEvection.getStatus())) {
            ApprovalCopy approvalCopy = approvalCopyService.getByApprovalId(oaEvection.getId());
            if (approvalCopy != null && StringUtils.isNotBlank(approvalCopy.getCCId())) {
                WorkProjectNotify notify1 = new WorkProjectNotify();
                notify1.setNotifyId(oaEvection.getId());
                notify1.setCompanyId(UserUtils.getSelectCompany().getId());
                notify1.setType("26");
                notify1.setStatus("0");
                notify1.setNotifyRole("");
                notify1.setContent(oaEvection.getAct().getComment());
                String[] ccIds = approvalCopy.getCCId().split(",");
                for (String ccId : ccIds) {
                    if (StringUtils.isNotBlank(ccId)) {
                        notify1.setUser(new User(ccId));
                        if ("3".equals(oaEvection.getStatus())) {
                            notify1.setTitle(UserUtils.get(oaEvection.getCreateBy().getId()).getName() + "的出差申请已通过");
                        }
                        if ("4".equals(oaEvection.getStatus())) {
                            notify1.setTitle(UserUtils.get(oaEvection.getCreateBy().getId()).getName() + "的出差申请被驳回");
                        }
                        notify1.setRemarks("待通知");
                        notify1.setId("");
                        workProjectNotifyService.save(notify1);
                    }
                }
            }
        }
    }

    public Page<OaEvection> find(Page<OaEvection> page, OaEvection oaEvection) {

        oaEvection.getSqlMap().put("dsf", dataScopeFilter(oaEvection.getCurrentUser(), "o", "u", "", MenuStatusEnum.OA_EVECTION.getValue()));

        oaEvection.setPage(page);
        page.setList(oaEvectionDao.findList(oaEvection));
        for (OaEvection 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 boolean saveEvection(OaEvection oaEvection, MultipartFile[] this_upload_files) {
        oaEvection.setStatus("1");
        String approverId = "";
        List<String> adds = oaEvection.getAdds();
        for(int i = 0;i<adds.size();i++){
            if(i + 1 == adds.size()){
                approverId += adds.get(i);
            }else{
                approverId += adds.get(i) + ",";
            }
        }
        oaEvection.setIds(approverId);
        Map<String, Object> variables = Maps.newHashMap();
        //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               /* String startTime = requestMap.get("startTime");//格式化时间
                String endTime = requestMap.get("endTime");//格式化时间
                String userId = requestMap.get("userId");

                String address = requestMap.get("address"); // 出差地点
                String dateCount = requestMap.get("dateCount"); // 出差天数
                String reason = requestMap.get("reason"); // 出差原因

                String approverId = requestMap.get("approverId");//审批人
                String CCId = requestMap.get("CCId");//抄送人7
                String delFlag="0"; //审核流程状态标记 0 待审核 1 审核完成
                User user = new User(); //记录请假人的
                OaEvection oaEvection = new OaEvection();*/
        String type = "1";
        String alias = "1";
        List<String> assigneeList = new ArrayList<String>(); //分配任务的人员
        if (approverId != null && !approverId.equals("")) {
            if (!UserUtils.getUser().isAdmin() && approverId.contains(UserUtils.getUser().getId())) {
                logger.error("启动出差流程失败：");
                return false;
            }
            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());
        User CC = new User();
        CC.setId(oaEvection.getCCId());
        User user = UserUtils.getUser();
        oaEvection.setCreateBy(user);
        oaEvection.setStatus("1");
        oaEvection.setUpdateBy(user);
        oaEvection.setDelFlag("0");
        oaEvection.setCompanyId(UserUtils.getSelectCompany() == null ? "" : UserUtils.getSelectCompany().getId());
        oaEvection.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
        submit(oaEvection, variables, type);

        if(this_upload_files!=null&&this_upload_files.length>0){
            OSSClientUtil ossClientUtil = new OSSClientUtil();
            for (int i = 0; i < this_upload_files.length; i++) {
                MultipartFile file = this_upload_files[i];
                if(file!=null && !file.isEmpty()&& file.getSize()>0){
                    uploadFile(ossClientUtil,file,oaEvection,"73");
                }
            }
        }

        ApprovalCopy approvalCopy = new ApprovalCopy();
        approvalCopy.setCCId(oaEvection.getCCId() == null ? "" : oaEvection.getCCId());
        approvalCopy.setUserId(user.getId());
        approvalCopy.setType("evection");
        approvalCopy.setRemarks(oaEvection.getReason());
        approvalCopy.setApprovalId(oaEvection.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());
            UserUtils.pushIm(alias,"申请人:" + user.getName() + ",出差申请 待审批!");
            /*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(alias);
            for (WebSocket toUserConn:toUserConns) {
                String message = "{\"to\":\""+alias+"\"," +
                        "\"msg\":\"审批信息 申请人:" + user.getName() + ",出差申请 待审批!\"," +
                        "\"useType\":\"sys\"}";
                ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
            }*/
        }

        String title = "审批";
        String content = UserUtils.getUser().getName() + "的出差申请需要你审批";
        String status = "待审批";
        String remarks = "开始时间：" + oaEvection.getStartTime() + "\n"
                + "结束时间：" + oaEvection.getEndTime() + "\n"
                + "出差地点:" + oaEvection.getAddress();
        Map extras = new HashMap();
        extras.put("type", "4001");
        extras.put("id", oaEvection.getId());
        extras.put("procDefKey", "evection");

        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(oaEvection.getId());
        pushinfo.setTitle(title);
        pushinfo.setStatus(status);
        pushinfo.setContent(content);
        pushinfo.setMobile("ios,android");
        pushinfo.setCompanyId(UserUtils.getSelectCompany() == null ? "" : UserUtils.getSelectCompany().getId());
        pushinfo.setAddcontent("evection");
        pushinfo.setPushUserId(alias);
        pushinfo.setParentType("singleApproval");
        pushinfoService.save(pushinfo);
        return true;

    }

    @Transactional(readOnly = false)
    public String uploadFile(OSSClientUtil ossClientUtil, MultipartFile file, OaEvection oaEvection, String flag) {
        String fileName = file.getOriginalFilename();
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        String url = ossClientUtil.uploadFile2OSS(file,"evection");
        Workattachment workattachment = new Workattachment();
        workattachment.setUrl(url);
        workattachment.setType(fileType);
        workattachment.setAttachmentName(fileName);
        workattachment.setAttachmentUser(UserUtils.getUser().getId());
        workattachment.setAttachmentId(oaEvection.getId());
        workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
        workattachment.setAttachmentFlag(flag);
        workattachmentService.save(workattachment);
        return url;
    }

    @Transactional(readOnly = false)
    public void sendNotify(String chaosongIds, String shenpiId, String goOutId) {
        if (StringUtils.isNotBlank(goOutId)) {
            if (StringUtils.isNotBlank(chaosongIds)) {
                WorkProjectNotify notify = new WorkProjectNotify();
                notify.setTitle(UserUtils.getUser().getName() + "发起了出差申请");
                notify.setRemarks("待通知");
                notify.setContent(UserUtils.getUser().getName() + "的出差申请");
                notify.setNotifyRole("");
                notify.setNotifyId(goOutId);
                notify.setStatus("0");
                notify.setCompanyId(UserUtils.getSelectCompany().getId());
                notify.setType("26");
                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(shenpiId)) {
                WorkProjectNotify notify = new WorkProjectNotify();
                notify.setTitle("您有新的出差申请待审批");
                notify.setRemarks("待审批");
                notify.setContent("出差申请--待审批");
                notify.setNotifyRole("");
                notify.setUser(new User(shenpiId));
                notify.setNotifyId(goOutId);
                notify.setStatus("0");
                notify.setCompanyId(UserUtils.getSelectCompany().getId());
                notify.setType("26");
                workProjectNotifyService.save(notify);
            }
        }
    }

    public List getCreateDateList(String companyId, String date) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("companyId", companyId);
        map.put("date", date);
        return oaEvectionDao.getCreateDateList(map);
    }

    public List<OaEvection> findByCompany2(OaEvection oaEvection, String date) {
        Map<String, Object> map = new HashMap<>();
        map.put("evection", oaEvection);
        map.put("date", date);
        return oaEvectionDao.findByCompany2(map);
    }

    public List getCreateDateList1(String time) {
        Map<String,String> map = new HashMap<String,String>();
        map.put("userId",UserUtils.getUser().getId());
        map.put("time",time);
        return oaEvectionDao.getCreateDateList1(map);
    }
    public List<OaEvection> findByCompany1(String time){
        Map<String,String> map = new HashMap<String,String>();
        map.put("userId",UserUtils.getUser().getId());
        map.put("time",time);
        return oaEvectionDao.findByCompany1(map);
    }

    public List getCreateDateListAll(String time) {
        Map<String,String> map = new HashMap<String,String>();
        OaEvection w=new OaEvection();
        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.OA_EVECTION.getValue()));
        map.put("time",time);
        return oaEvectionDao.getCreateDateListAll(map);
    }
    public List<OaEvection> findByCompanyAll(String time){
        Map<String,String> map = new HashMap<String,String>();
        OaEvection w=new OaEvection();
        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.OA_EVECTION.getValue()));
        map.put("time",time);
        return oaEvectionDao.findByCompanyAll(map);
    }

    public List<OaEvection> findByManage(Map<String,Object> map) {
        return oaEvectionDao.findByManage(map);
    }
    public List<OaEvection> findByCompanySelf(Map<String,Object> map) {
        return oaEvectionDao.findByCompanySelf(map);
    }
}