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

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.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.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.workgoout.dao.GoOutDao;
import com.jeeplus.modules.workgoout.entity.GoOut;
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 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 LXH
 * @version 2017-07-05
 */
@SuppressWarnings("all")
@Service
@Transactional(readOnly = true)
public class GoOutService extends CrudService<GoOutDao, GoOut> {

    @Autowired
    private GoOutDao goOutDao;
    @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;

    /**
     * 获取流程详细及工作流参数
     * @param id
     */
    @SuppressWarnings("unchecked")
    public GoOut get(String id) {
        GoOut goOut = goOutDao.get(id);

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

        List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(goOut.getId(), "75");
        goOut.setWorkattachmentList(workattachmentList);

        return goOut;
    }

    public GoOut getById(String id) {
        GoOut goOut = goOutDao.get(id);

        return goOut;
    }

    @Transactional(readOnly = false)
    public Map getGoOutById(String id,String type) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        GoOut goOut = this.getById(id);
        Map<String,Object> map = Maps.newHashMap();
        String officeName = "";
        if(goOut!=null){
            User user = userDao.get(goOut.getCreateBy());
            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",goOut.getCreateDate()==null?"":sdf.format(goOut.getCreateDate()));
            map.put("startTime",goOut.getStartTime());
            map.put("endTime",goOut.getEndTime());
            map.put("gooutDay",goOut.getGooutDay());
            map.put("gooutTime",goOut.getGooutTime());
            map.put("gooutReason",goOut.getGooutReason());
            map.put("companyId",goOut.getCompanyId());
            map.put("approvalId",id);
            map.put("status",goOut.getStatus());
            /*map.put("files",goOut.getFiles()==null?"":goOut.getFiles());*/
            List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(goOut.getId(),"75");
            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(goOut.getProcessInstanceId(), "", "");
            List<Act> list2 = actTaskService.toMyStartedList(goOut.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", "goout");
            }
            List list1 = new ArrayList();
            String approvalStatus = "0";
            if (list!=null && list.size()!=0) {
                String assigneeName = "";
                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();
                        }
                        if (type.equals("1") || type.equals("2")) {
                            maps.put("activityName", activityName);
                            maps.put("assigneeName", UserUtils.getUser().getName().equals(act.getAssigneeName()) ? "我" : act.getAssigneeName());
                        } else if (type.equals("3")) {
                            maps.put("activityName", activityName);
                            maps.put("assigneeName", 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 (goOut.getStatus().equals("4") || goOut.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) && goOut.getStatus().equals("4")){
                                        activityName = "审核驳回";
                                        state = "1";
                                    }else if (i == (list.size()-2) && goOut.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(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 (goOut.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;
    }

    @Transactional(readOnly = false)
    public void delete(GoOut goOut) {
        goOutDao.delete(goOut);
    }

    @Transactional(readOnly = false)
    public void update(GoOut goOut) {
        goOut.preUpdate();
        goOutDao.update(goOut);
    }

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

    /**
     * 启动流程
     * @param entity
     */
    @Transactional(readOnly = false)
    public void save(GoOut goOut, Map<String, Object> variables,String type) {
        // 保存业务数据
        if (StringUtils.isBlank(goOut.getId())) {
            goOut.preInsert();
            goOutDao.insert(goOut);
            logger.debug("save entity: {}", goOut);

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

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

            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_GO_OUT[0], businessKey, variables);
            goOut.setProcessInstance(processInstance);
            // 更新流程实例ID
            goOut.setProcessInstanceId(processInstance.getId());
            goOutDao.updateProcessInstanceId(goOut);
        }else{
            goOut.preUpdate();
            goOutDao.update(goOut);
            goOut.getAct().setComment(("yes".equals(goOut.getAct().getFlag()) ? "[重申] " : "[销毁] ") + goOut.getAct().getComment());

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

    }

    @Transactional(readOnly = false)
    public void saveFile(GoOut goOut) {
        if (StringUtils.isBlank(goOut.getId())){
            goOut.preInsert();
            goOutDao.insert(goOut);
        }else{
            goOut.preUpdate();
            goOutDao.update(goOut);
        }
    }

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

        List<GoOut> results = new ArrayList<GoOut>();
        List<Task> tasks = new ArrayList<Task>();
        // 根据当前人的ID查询
        List<Task> todoList = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_GO_OUT[0]).taskAssignee(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();
        // 根据当前人未签收的任务
        List<Task> unsignedTasks = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_GO_OUT[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();
            GoOut goOut = goOutDao.get(businessKey);
            goOut.setTask(task);
            goOut.setProcessInstance(processInstance);
            goOut.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId((processInstance.getProcessDefinitionId())).singleResult());
            results.add(goOut);
        }
        return results;
    }



    public Page<GoOut> find(Page<GoOut> page, GoOut goOut) {

        goOut.getSqlMap().put("dsf", dataScopeFilter(goOut.getCurrentUser(), "o", "u","", MenuStatusEnum.GO_OUT.getValue()));

        goOut.setPage(page);
        page.setList(goOutDao.findList(goOut));

        for(GoOut 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;
    }

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

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

        //发送通知
        WorkProjectNotify notify = new WorkProjectNotify();
        notify.setNotifyId(goOut.getId());
        notify.setCompanyId(UserUtils.getSelectCompany().getId());
        notify.setType("28");
        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(goOut.getAct().getFlag())? false : true);
        // 提交流程任务
        actTaskService.complete(goOut.getAct().getTaskId(), goOut.getAct().getProcInsId(), goOut.getAct().getComment(), vars);
        boolean state = actTaskService.isProcessEnd(goOut.getAct().getProcInsId());
        goOut.setStatus("2");
        if (!state){
            if ("yes".equals(goOut.getAct().getFlag())){
                goOut.setStatus("3");
            }else {
                goOut.setStatus("4");
            }
        }
        goOut.preUpdate();
        this.update(goOut);

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

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

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

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

    /* * 审核保存
     * @param testAudit
     */
    @Transactional(readOnly = false)
    public Boolean saveGoOut(GoOut goOut, MultipartFile[] this_upload_files) {
        try {
            goOut.setStatus("1");
            String approverId = "";
            List<String> adds = goOut.getAdds();
            for(int i = 0;i<adds.size();i++){
                if(i + 1 == adds.size()){
                    approverId += adds.get(i);
                }else{
                    approverId += adds.get(i) + ",";
                }
            }
            goOut.setIds(approverId);
            Map<String, Object> variables = Maps.newHashMap();
            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())){
                   /* ajaxJson.setMsg("外出申请失败,审批人不能为本人");
                    ajaxJson.setErrorCode("101");
                    ajaxJson.setSuccess(false);*/
                    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(goOut.getCCId());
            User user = UserUtils.getUser();
            goOut.setUser(user);
            goOut.setCreateBy(user);
            goOut.setUpdateBy(user);
            goOut.setStatus("1");
            goOut.setDelFlag("0");
            goOut.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
            goOut.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
            save(goOut, 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,goOut,"75");
                    }
                }
            }

            ApprovalCopy approvalCopy = new ApprovalCopy();
            approvalCopy.setCCId(goOut.getCCId());
            approvalCopy.setUserId(user.getId());
            approvalCopy.setType("goout");
            approvalCopy.setApprovalId(goOut.getId());
            approvalCopy.setRemarks(goOut.getGooutReason());
            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 =  UserUtils.getUser().getName()+"的外出申请需要你审批";
            String status = "待审批";
            String remarks =  "开始时间："+goOut.getStartTime()+ "\n"
                    +"结束时间："+goOut.getEndTime()+ "\n"
                    +"外出天数："+goOut.getGooutDay();
            Map extras = new HashMap();
            extras.put("type", "4001");
            extras.put("id", goOut.getId());
            extras.put("procDefKey", "goout");

            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(goOut.getId());
            pushinfo.setTitle(title);
            pushinfo.setContent(content);
            pushinfo.setStatus(status);
            pushinfo.setPushUserId(alias);
            pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
            pushinfo.setAddcontent("goout");
            pushinfo.setMobile("ios,android");
            pushinfo.setParentType("singleApproval");
            pushinfoService.save(pushinfo);
            if (b){
                return true;
            }else {
                return false;
            }
        } catch (Exception e) {
            logger.error("外出申请流程失败：", e);
            return false;
        }
    }
    @Transactional(readOnly = false)
    public String uploadFile(OSSClientUtil ossClientUtil, MultipartFile file, GoOut goOut, String flag) {
        String fileName = file.getOriginalFilename();
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        String url = ossClientUtil.uploadFile2OSS(file,"goout");
        Workattachment workattachment = new Workattachment();
        workattachment.setUrl(url);
        workattachment.setType(fileType);
        workattachment.setAttachmentName(fileName);
        workattachment.setAttachmentUser(UserUtils.getUser().getId());
        workattachment.setAttachmentId(goOut.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("28");
                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("28");
                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 goOutDao.getCreateDateList(map);
    }

    public List<GoOut> findByCompany2(GoOut goOut, String date) {
        Map<String,Object> map = new HashMap<>();
        map.put("goOut",goOut);
        map.put("date",date);
        return goOutDao.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 goOutDao.getCreateDateList1(map);
    }
    public List<GoOut> findByCompany1(String time){
        Map<String,String> map = new HashMap<String,String>();
        map.put("userId",UserUtils.getUser().getId());
        map.put("time",time);
        return goOutDao.findByCompany1(map);
    }
    public List getCreateDateListAll(String time) {
        Map<String,String> map = new HashMap<String,String>();
        GoOut w=new GoOut();
        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.GO_OUT.getValue()));
        map.put("time",time);
        return goOutDao.getCreateDateListAll(map);
    }
    public List<GoOut> findByCompanyAll(String time){
        Map<String,String> map = new HashMap<String,String>();
        GoOut w=new GoOut();
        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.GO_OUT.getValue()));
        map.put("time",time);
        return goOutDao.findByCompanyAll(map);
    }

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