/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.workovertimeform.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.workovertimeform.dao.WorkOvertimeFormDao;
import com.jeeplus.modules.workovertimeform.entity.WorkOvertimeForm;
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 丁旭
 * @version 2017-04-26
 */
@Service
@Transactional(readOnly = true)
public class WorkOvertimeFormService extends CrudService<WorkOvertimeFormDao, WorkOvertimeForm> {

    @Autowired
    private WorkOvertimeFormDao workOvertimeFormDao ;
    @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;

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

        List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(workOvertimeForm.getId(),"72");
        workOvertimeForm.setWorkattachmentList(workattachmentList);
        return workOvertimeForm;

    }

    public WorkOvertimeForm getById(String id){
        WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.get(id);
        return workOvertimeForm;
    }

    @Transactional(readOnly = false)
    public Map getOverTimeById(String id,String type){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        WorkOvertimeForm workOvertimeForm = this.getById(id);
        Map<String,Object> map = Maps.newHashMap();
        if(workOvertimeForm!=null){
            User user = userDao.get(workOvertimeForm.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",workOvertimeForm.getCreateDate()==null?"":sdf.format(workOvertimeForm.getCreateDate()));
            map.put("startTime",workOvertimeForm.getStartTime());
            map.put("endTime",workOvertimeForm.getEndTime());
            String isHolidays = workOvertimeForm.getIsHolidays();
            if (isHolidays.equals("1")){
                isHolidays = "是";
            }else if (isHolidays.equals("2")){
                isHolidays = "不是";
            }
            map.put("isHolidays",isHolidays);
            //map.put("office",workOvertimeForm.getOffice().getName());
            map.put("status",workOvertimeForm.getStatus());
            map.put("reason",workOvertimeForm.getReason());
            map.put("companyId",workOvertimeForm.getCompanyId());
            map.put("approvalId",id);
            map.put("status",workOvertimeForm.getStatus());
           /* map.put("files", workOvertimeForm.getFiles()==null?"": workOvertimeForm.getFiles());*/
            List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(workOvertimeForm.getId(),"72");
            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);
            map.put("longTime",workOvertimeForm.getLongTime()==null?"":workOvertimeForm.getLongTime());
            List<Act> list = actTaskService.histoicFlowList(workOvertimeForm.getProcessInstanceId(), "", "");
            List<Act> list2 = actTaskService.toMyStartedList(workOvertimeForm.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", "overtime");
            }
            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 (workOvertimeForm.getStatus().equals("4") || workOvertimeForm.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) && workOvertimeForm.getStatus().equals("4")){
                                        activityName = "审核驳回";
                                        state = "1";
                                    }else if (i == (list.size()-2) && workOvertimeForm.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 {
                                if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
                                    assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
                                }
                                activityName = act.getHistIns().getActivityName();
                            }
                            if (workOvertimeForm.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;
    }

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

    public List<WorkOvertimeForm> findList(WorkOvertimeForm workOvertimeForm) {
        return super.findList(workOvertimeForm);
    }

    public Page<WorkOvertimeForm> findPage(Page<WorkOvertimeForm> page, WorkOvertimeForm workOvertimeForm) {
        return super.findPage(page, workOvertimeForm);
    }

    @Transactional(readOnly = false)
    public void save(WorkOvertimeForm workOvertimeForm) {
        super.save(workOvertimeForm);
    }

    @Transactional(readOnly = false)
    public void present(WorkOvertimeForm workOvertimeForm,Map<String, Object> variables,String type){
        // 保存业务数据
        if (StringUtils.isBlank(workOvertimeForm.getId())) {
            super.save(workOvertimeForm);

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

            // 用来设置启动流程的人员ID，引擎会自动把用户ID保存到activiti:initiator中
            identityService.setAuthenticatedUserId(workOvertimeForm.getCurrentUser().getId());
            // 启动流程
            String businessKey = workOvertimeForm.getId().toString();
            variables.put("type", "overtimeform");
            variables.put("busId", businessKey);
            variables.put("title", workOvertimeForm.getReason());//设置标题；

            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OVERTIMEFORM[0], businessKey, variables);
            workOvertimeForm.setProcessInstance(processInstance);
            workOvertimeForm.setProcessInstanceId(processInstance.getProcessInstanceId());
            workOvertimeFormDao.updateProcessInstanceId(workOvertimeForm);

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

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


    }

    @Transactional(readOnly = false)
    public void saveFile(WorkOvertimeForm workOvertimeForm) {
        if (StringUtils.isBlank(workOvertimeForm.getId())){
            workOvertimeForm.preInsert();
            workOvertimeFormDao.insert(workOvertimeForm);
        }else{
            workOvertimeForm.preUpdate();
            workOvertimeFormDao.update(workOvertimeForm);
        }
    }

    @Transactional(readOnly = false)
    public void delete(WorkOvertimeForm workOvertimeForm) {
        workOvertimeFormDao.delete(workOvertimeForm);
    }

    @Transactional(readOnly = false)
    public void update(WorkOvertimeForm workOvertimeForm) {
        workOvertimeFormDao.update(workOvertimeForm);
    }

    /**
     * 查询待办任务
     * @param userId 用户ID
     * @return
     */
    public List<WorkOvertimeForm> findTodoTasks(String userId) {
        List<WorkOvertimeForm> results = new ArrayList<>();
        List<Task> tasks = new ArrayList<Task>();
        // 根据当前人的ID查询
        List<Task> todoList = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OVERTIMEFORM[0]).taskAssignee(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();
        // 根据当前人未签收的任务
        List<Task> unsignedTasks = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OVERTIMEFORM[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();
            WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.get(businessKey);
            workOvertimeForm.setTask(task);
            workOvertimeForm.setProcessInstance(processInstance);
            workOvertimeForm.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId((processInstance.getProcessDefinitionId())).singleResult());
            results.add(workOvertimeForm);
        }
        return results;
    }



    public Page<WorkOvertimeForm> find(Page<WorkOvertimeForm> page, WorkOvertimeForm workOvertimeForm) {

        workOvertimeForm.getSqlMap().put("dsf", dataScopeFilter(workOvertimeForm.getCurrentUser(), "o", "u","", MenuStatusEnum.WORK_OVERTIME_FORM.getValue()));

        workOvertimeForm.setPage(page);
        page.setList(workOvertimeFormDao.findList(workOvertimeForm));

        for(WorkOvertimeForm 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(WorkOvertimeForm workOvertimeForm) {

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

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

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

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

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

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

    /* * 审批保存
     * @param testAudit
     */
    @Transactional(readOnly = false)
    public boolean saveWorkovertimeform(WorkOvertimeForm workOvertimeForm,MultipartFile[] this_upload_files) {
        try {
            Map<String, Object> variables = Maps.newHashMap();
            workOvertimeForm.setStatus("1");
            String approverId = "";
            List<String> adds = workOvertimeForm.getAdds();
            for(int i = 0;i<adds.size();i++){
                if(i + 1 == adds.size()){
                    approverId += adds.get(i);
                }else{
                    approverId += adds.get(i) + ",";
                }
            }
            workOvertimeForm.setIds(approverId);
            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(workOvertimeForm.getCCId());
            User user = UserUtils.getUser();
            workOvertimeForm.setUser(user);
            workOvertimeForm.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
            workOvertimeForm.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
            workOvertimeForm.setOffice(UserUtils.getSelectOffice());
            workOvertimeForm.setCreateBy(user);
            workOvertimeForm.setUpdateBy(user);
            workOvertimeForm.setDelFlag("0");
            workOvertimeForm.setStatus("1");
            present(workOvertimeForm, 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,workOvertimeForm,"72");
                    }
                }
            }

            ApprovalCopy approvalCopy = new ApprovalCopy();
            approvalCopy.setCCId(workOvertimeForm.getCCId());
            approvalCopy.setUserId(user.getId());
            approvalCopy.setRemarks(workOvertimeForm.getReason());
            approvalCopy.setType("overtime");
            approvalCopy.setApproverId(approverId);
            approvalCopy.setApprovalId(workOvertimeForm.getId());
            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 = "开始时间："+workOvertimeForm.getStartTime()+ "\n"
                    +"结束时间："+workOvertimeForm.getEndTime()+ "\n"
                    +"加班时长（小时）："+workOvertimeForm.getLongTime();
            Map extras = new HashMap();
            extras.put("type", "4001");
            extras.put("id", workOvertimeForm.getId());
            extras.put("procDefKey", "overtime");

            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(workOvertimeForm.getId());
            pushinfo.setTitle(title);
            pushinfo.setContent(content);
            pushinfo.setStatus(status);
            pushinfo.setAddcontent("overtime");
            pushinfo.setMobile("ios,android");
            pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
            pushinfo.setPushUserId(alias);
            pushinfo.setParentType("singleApproval");
            pushinfoService.save(pushinfo);
            if (b){
                return true;
            }
        } catch (Exception e) {
            logger.error("启动加班流程失败：", e);
        }
        return false;
    }

    @Transactional(readOnly = false)
    public String uploadFile(OSSClientUtil ossClientUtil, MultipartFile file, WorkOvertimeForm workOvertimeForm, String flag) {
        String fileName = file.getOriginalFilename();
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        String url = ossClientUtil.uploadFile2OSS(file,"overtimeform");
        Workattachment workattachment = new Workattachment();
        workattachment.setUrl(url);
        workattachment.setType(fileType);
        workattachment.setAttachmentName(fileName);
        workattachment.setAttachmentUser(UserUtils.getUser().getId());
        workattachment.setAttachmentId(workOvertimeForm.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("25");
                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("25");
                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 workOvertimeFormDao.getCreateDateList(map);
    }

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