guarantee-lsq 2 rokov pred
rodič
commit
e8d2d319d1

+ 11 - 0
platform-common/src/main/java/com/platform/common/constant/CommonConstants.java

@@ -291,6 +291,9 @@ public interface CommonConstants {
     Integer STATUS_VERIFY_PASS = 1; // 审核通过
     Integer STATUS_VERIFY_REFUSED = 2; // 审核驳回
     String THIRD_PARTY_YONGYOU = "用友";
+    // 区域负责人通知类型
+    String MM_CLOSE_REPAIR = "1"; // 关闭工单
+    String MM_REPAIR_UP = "2"; // 维修上报
     /**
      * 龙岩维修 end
      */
@@ -300,4 +303,12 @@ public interface CommonConstants {
     String CHANGE_TYPE_SB_STATUS = "4"; // 设备状态变动
     String CHANGE_TYPE_SB_ZZH = "5"; // 设备原号变动
     String CHANGE_TYPE_SB_PPNO = "6"; // 设备父位号变动
+
+    /**
+     * 维修类型
+     */
+    int PLAN_FLAG = 1; // 计划性维修
+    int NO_PLAN_FLAG = 2; // 非计划性维修
+    int OTHER = 3; // 其他
+    int NORMAL = 4; // 日常维修
 }

+ 1 - 1
platform-dao/src/main/java/com/platform/dao/dto/repair/RepairApplicationFormDTO.java

@@ -157,7 +157,7 @@ public class RepairApplicationFormDTO extends BaseDTO implements Serializable {
      */
     private Double dealMinutes;
     /**
-     * 设备停机修复时间:报修类型:1:计划性维修,2非计划性维修,3其他
+     * 设备停机修复时间:报修类型:1:计划性维修,2非计划性维修,3其他  4 日常维修
      */
     private Integer category;
     /**

+ 5 - 1
platform-dao/src/main/java/com/platform/dao/enums/RepairApplicationFormStatusEnum.java

@@ -36,7 +36,7 @@ public enum RepairApplicationFormStatusEnum {
      */
     REBACK(5),
     /**
-     * 	已完成
+     * 	已完成/生产审核通过
      */
     FINISHED(6),
     /**
@@ -67,6 +67,10 @@ public enum RepairApplicationFormStatusEnum {
      * 维修主管-维修上报
      */
     MM_REPAIR_FAIL(13),
+    /**
+     * 工单关闭
+     */
+    MM_REPAIR_CLOSE(14),
     ;
     private final Integer value;
 }

+ 1 - 0
platform-dao/src/main/java/com/platform/dao/enums/WorkplaceBacklogDetailTypeEnum.java

@@ -23,6 +23,7 @@ public enum WorkplaceBacklogDetailTypeEnum {
     REPAIR_FINISH(3, "维修完成通知"),
     REPAIR_MANAGE_RECEIVE(17, "工程师接单通知"),
     REPAIR_REPORT_LEADER(18, "维修上报通知"),
+    REPAIR_REPORT_CLOSE(26, "维修工单关闭"),
     REPAIR_REPORT_LEADER_TRANSFER(19, "主管派单通知"),
     REPAIR_DISPATCH(4, "维修派工通知"),
     REPAIR_BACK(5, "维修驳回通知"),

+ 7 - 0
platform-service/src/main/java/com/platform/service/repair/strategy/RepairBaseStrategy.java

@@ -86,4 +86,11 @@ public interface RepairBaseStrategy {
      * @return
      */
     RepairApplicationFormDTO reportLeaderHandle(RepairApplicationFormDTO model);
+
+    /**
+     * 关闭工单
+     * @param dto
+     * @return
+     */
+    RepairApplicationFormDTO closeRepair(RepairApplicationFormDTO dto);
 }

+ 21 - 1
platform-service/src/main/java/com/platform/service/repair/strategy/RepairStrategyFactory.java

@@ -6,6 +6,7 @@ import com.platform.common.util.BeanUtils;
 import com.platform.dao.enums.SysConfigEnum;
 import com.platform.service.repair.strategy.impl.AllocateRepairBaseStrategy;
 import com.platform.service.repair.strategy.impl.BaseRepairBaseStrategy;
+import com.platform.service.repair.strategy.impl.LongYanPlanRepairStrategy;
 import com.platform.service.repair.strategy.impl.LongYanRepairStrategy;
 
 /**
@@ -20,11 +21,30 @@ public class RepairStrategyFactory {
                 strategy = (AllocateRepairBaseStrategy)BeanUtils.getBean("allocateRepairBaseStrategy");
                 break;
             case CommonConstants.REPAIR_STRATEGY_MODEL_DISPATCH_LONG_YAN:
-                strategy = (LongYanRepairStrategy)BeanUtils.getBean("longYanRepairStrategy");
+                strategy = (LongYanPlanRepairStrategy)BeanUtils.getBean("longYanPlanRepairStrategy");
                 break;
             case CommonConstants.REPAIR_STRATEGY_MODEL_BASE:
                 break;
         }
         return strategy;
     }
+
+    /**
+     * 根据维修类型获取执行策略
+     * @param category
+     * @return
+     */
+    public static RepairBaseStrategy getStrategy(int category){
+        RepairBaseStrategy strategy = (BaseRepairBaseStrategy)BeanUtils.getBean("baseRepairBaseStrategy");
+        switch (category){
+            case CommonConstants.NO_PLAN_FLAG:
+            case CommonConstants.OTHER:
+                strategy = (LongYanRepairStrategy)BeanUtils.getBean("longYanRepairStrategy");
+                break;
+            case CommonConstants.PLAN_FLAG:
+            case CommonConstants.NORMAL:
+                break;
+        }
+        return strategy;
+    }
 }

+ 924 - 0
platform-service/src/main/java/com/platform/service/repair/strategy/impl/LongYanPlanRepairStrategy.java

@@ -0,0 +1,924 @@
+package com.platform.service.repair.strategy.impl;
+
+import com.platform.common.cache.ConfigCache;
+import com.platform.common.constant.CommonConstants;
+import com.platform.common.exception.DeniedException;
+import com.platform.common.model.UserInfo;
+import com.platform.common.util.*;
+import com.platform.dao.dto.repair.*;
+import com.platform.dao.dto.upms.SysUserDTO;
+import com.platform.dao.entity.customize.CustomFieldTemplateData;
+import com.platform.dao.entity.repair.RepairApplicationForm;
+import com.platform.dao.entity.sb.SbInfo;
+import com.platform.dao.entity.upms.SysUser;
+import com.platform.dao.enums.*;
+import com.platform.dao.mapper.customize.CustomFieldTemplateDataMapper;
+import com.platform.dao.mapper.sb.SbPositionMapper;
+import com.platform.dao.mapper.upms.SysUserDeptMapper;
+import com.platform.dao.mapper.upms.SysUserMapper;
+import com.platform.dao.util.MessageTemplateUtil;
+import com.platform.dao.vo.SysUserVO;
+import com.platform.service.part.PartInfoService;
+import com.platform.service.repair.strategy.AbstractRepairBaseStrategy;
+import com.platform.service.util.SendMessageUtils;
+import org.springframework.stereotype.Component;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 维修接单模式  -- 龙岩
+ * 报修指定
+ * 维修主管出方案
+ * 多个维修人执行
+ * 维修审核
+ * 生产审核
+ */
+@Component
+public class LongYanPlanRepairStrategy extends AbstractRepairBaseStrategy {
+    @Resource
+    private SysUserMapper sysUserMapper;
+    @Resource
+    private CustomFieldTemplateDataMapper customFieldTemplateDataMapper;
+    @Resource
+    private PartInfoService partInfoService;
+    @Resource
+    private SbPositionMapper sbPositionMapper;
+    @Resource
+    private SysUserDeptMapper sysUserDeptMapper;
+
+
+    /**
+     * 龙岩计划性维修报
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationForm callRepair(RepairApplicationFormDTO model) {
+        RepairApplicationForm form = super.callRepair(model);
+        // 是否具有报修权限
+        UserInfo userInfo = SecurityUtils.getUserInfo();
+        if(userInfo.getSuperAdmin() == 0){
+            // 根据用户的角色来定
+            String role = getCurrentRoles();
+            if(!role.contains(SysRoleCodeEnum.Maintenance_Leader.name())){
+                throw new DeniedException("班组长具有报修权限,如需报修,请管理员配置权限!");
+            }
+        }
+        String repairDeptId = model.getRepairDeptId();
+        if(StringUtils.isBlank(repairDeptId)){
+            throw new DeniedException("送修部门不能为空!");
+        }
+        form.setRepairDeptId(repairDeptId); // 存储维修部门ID
+        List<SysUserVO> sysUserVOList = getRepairMangers(repairDeptId,null,SysRoleCodeEnum.REPAIR_MANAGE.name());
+        if(sysUserVOList == null || sysUserVOList.size() ==0){
+            throw new DeniedException("该维修部门,没有工程师,请确认!");
+        }
+        // 报修人
+        form.setActualUser(SecurityUtils.getUserInfo().getUsername());
+        form.setUserId(SecurityUtils.getUserInfo().getUserId());
+        // 区域负责人
+        form.setReportLeaderId(getReportLeaderId(model.getSbId()));
+        repairApplicationFormMapper.insert(form);
+        // 记录维修状态跟踪
+        addRepairStatusRecord(form,"报修");
+        // 给相关的工程师推送信息
+        sendMessageToRepairManger(form,sysUserVOList,CommonConstants.CALL_REPAIR_NOTICE);
+        // 给该部门班组长推送信息
+        List<SysUserVO> banzuzhangs = getRepairMangers(repairDeptId,null,SysRoleCodeEnum.Maintenance_Leader.name());
+        if(banzuzhangs != null && banzuzhangs.size() > 0){
+            sendMessageToRepairManger(form,banzuzhangs,CommonConstants.CALL_REPAIR_NOTICE);
+        }
+        // 给二十四小时人员发送信息
+        String everyWhereUsers = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_TWENTY_FOUR_USER.name());
+        if(StringUtils.isNotBlank(everyWhereUsers)){
+            sendMessageToRepairManger(form,getUserVOs(everyWhereUsers.trim()),CommonConstants.CALL_REPAIR_NOTICE);
+        }
+        return form;
+    }
+
+    private List<SysUserVO> getUserVOs(String user){
+        String[] users = user.split(",");
+        List<SysUserVO> vos = ListUtils.newArrayList();
+        for(String name : users){
+            SysUser u = sysUserService.selectByUsername(name);
+            if(u != null)
+                vos.add(BeanConverterUtil.copyObjectProperties(u,SysUserVO.class));
+        }
+        return vos;
+    }
+
+
+    private String getReportLeaderId(String sbId){
+        String positionId = sbInfoService.getById(sbId).getPositionId();
+        if(StringUtils.isBlank(positionId)){
+            throw new DeniedException("该设备的设备位置尚未设置,请设置");
+        }
+        return sbPositionMapper.getById(positionId).getUserId();
+    }
+
+    public static void main(String[] args) {
+        Map<String,String> maps = new HashMap<>();
+        maps.put("13410011001","12121,2323,2323");
+        maps.put("13410011002","12121,2323,2323");
+        System.out.println(JsonUtils.objectToJson(maps));
+        Map<String,String> covertMap = JsonUtils.jsonToMap("{\"13410011002\":\"12121,2323,2323\",\"13410011001\":\"12121,2323,2323\"}");
+        System.out.println(covertMap.get("13410011001"));
+    }
+
+    /**
+     * 获取当前用户的角色集合
+     * @return
+     */
+    private String getCurrentRoles(){
+        // 根据用户的角色来定
+        StringBuilder roleCodes = new StringBuilder();
+        SecurityUtils.getUserInfo().getRoleCodes().forEach(item-> {
+            roleCodes.append(item).append(",");
+        });
+        return roleCodes.toString();
+    }
+
+    /**
+     * 获取指定部门下的工程师
+     * @param repairDeptId
+     * @param userId
+     * @return
+     */
+    private List<SysUserVO> getRepairMangers(String repairDeptId,String userId,String roleCode){
+        SysUserDTO queryUserDTO = new SysUserDTO();
+        queryUserDTO.setDeptId(repairDeptId);
+        queryUserDTO.setRoleCode(roleCode);
+        queryUserDTO.setUserId(userId);
+        return sysUserMapper.selectDeptRoleUser(queryUserDTO);
+    }
+
+    /**
+     * 获取设备部位关联的维修部门
+     * @param model
+     * @return
+     */
+    private String queryRepairDeptId(RepairApplicationFormDTO model){
+        String repairDeptId = "";
+        if(StringUtils.isNotBlank(model.getPartId())){
+            repairDeptId = partInfoService.getModelById(model.getPartId()).getRepairDeptId();
+        }
+        if(StringUtils.isBlank(repairDeptId)){
+            repairDeptId = sbInfoService.getModelById(model.getSbId()).getRepairDeptId();
+        }
+        return repairDeptId;
+    }
+
+    @Override
+    public RepairApplicationFormDTO receiveRepair(RepairApplicationFormDTO model) {
+        if(StringUtils.isBlank(model.getRepairDeptId())){
+            throw new DeniedException("必须携带设备关联维修部门");
+        }
+        boolean continueFlag = Boolean.FALSE;
+        synchronized (this){
+            // 判断接单方式,根据接单角色进行区分 工程师 班组长 维修人
+            LocalDateTime now = LocalDateTime.now();
+            UserInfo userInfo = SecurityUtils.getUserInfo();
+            RepairApplicationForm form = new RepairApplicationForm();
+            form.setId(model.getId());
+            String roles = getCurrentRoles();
+            if(roles.contains(SysRoleCodeEnum.Maintenance.name()) || roles.contains(SysRoleCodeEnum.Maintenance_Leader.name())){
+                // 维修人和班组长接单
+                form.setRepairUserName(userInfo.getUsername());
+                form.setRepairUserId(userInfo.getUserId());
+                form.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
+                form.setRepairStartTime(LocalDateTime.now()); // 接单后就开始维修
+                continueFlag = Boolean.TRUE;
+                model.setRepairUserName(form.getRepairUserName());
+                model.setRepairUserId(form.getRepairUserId());
+            }else if(roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name())){
+                // 工程师接单
+                form.setDispatchUserId(SecurityUtils.getUserInfo().getUserId());
+                form.setStatus(RepairApplicationFormStatusEnum.RECEIVED.getValue());
+            }else{
+                throw new DeniedException("您不具备承接报修单的能力");
+            }
+            form.setReceiveTime(now);
+            form.setReceiveMinutes(DateUtils.getDurationHours(model.getApplyTime(), now)); // 接单时长
+            // 判断接单是否超时
+            String minuteStr = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_WARN_MINUTE.name());
+            if (StringUtils.isBlank(minuteStr)) {
+                form.setReceiveOvertime(false);
+            } else if (form.getReceiveMinutes() > Double.valueOf(minuteStr)) {
+                form.setReceiveOvertime(true);
+            } else {
+                form.setReceiveOvertime(false);
+            }
+            form.setUpdateTime(LocalDateTime.now());
+            repairApplicationFormMapper.updateByPrimaryKeySelective(form);
+        }
+        // 通知报修人,已接单
+        sendMessageToRepairCaller(model,CommonConstants.CALL_REPAIR_RECEIVE);
+        // 添加状态跟踪
+        model.setStatus(RepairApplicationFormStatusEnum.RECEIVED.getValue());
+        addRepairStatusRecord(BeanConverterUtil.copyObjectProperties(model,RepairApplicationForm.class),"已接单");
+        if(continueFlag){
+            // 添加状态跟踪
+            model.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
+            addRepairStatusRecord(BeanConverterUtil.copyObjectProperties(model,RepairApplicationForm.class),"维修中");
+            // 添加维修记录
+            addRepairRecord(model);
+        }
+        return model;
+    }
+
+    @Override
+    public RepairApplicationForm callRepairAgain(RepairApplicationFormDTO model) {
+        RepairApplicationForm form = repairApplicationFormMapper.selectByPrimaryKey(model.getId());
+        SysUserDTO queryUserDTO = new SysUserDTO();
+        queryUserDTO.setDeptId(model.getRepairDeptId());
+        queryUserDTO.setRoleCode(SysRoleCodeEnum.REPAIR_MANAGE.name());
+        List<SysUserVO> sysUserVOList = sysUserMapper.selectDeptRoleUser(queryUserDTO);
+        if(sysUserVOList == null || sysUserVOList.size() ==0 || sysUserVOList.size() > 1){
+            throw new DeniedException("您选择的维修部门,无维修主管或存在多个维修主管");
+        }
+        form.setDispatchUserId(sysUserVOList.get(0).getUserId());
+        form.setStatus(RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(form);
+        // 给相关的维修主管推送信息
+        sendMessageToRepairManger(form,sysUserVOList,CommonConstants.CALL_REPAIR_NOTICE);
+        return null;
+    }
+
+    /**
+     * 记录审核
+     * @param form
+     */
+    private void addRepairVerifyRecord(RepairApplicationFormDTO form,Integer status,Integer type){
+        CustomFieldTemplateData data = new CustomFieldTemplateData();
+        data.setId(IdGeneratorUtils.getObjectId());
+        data.setObjId(form.getId());
+        data.setCreatedTime(LocalDateTime.now());
+        data.setCreatedUserId(SecurityUtils.getUserInfo().getUserId());
+        data.setCreatedUserName(SecurityUtils.getUserInfo().getUsername());
+        data.setRemark(CommonConstants.REPAIR_VERIFY_RECORD);
+        RepairVerifyRecordTemplateData dataInfo = new RepairVerifyRecordTemplateData();
+        dataInfo.setRemark(form.getRemark());
+        dataInfo.setStatus(status);
+        dataInfo.setType(type);
+        data.setData(JsonUtils.objectToJson(dataInfo));
+        data.setDelFlag(0);
+        customFieldTemplateDataMapper.insert(data);
+        // 保存维修记录图片
+        sysFileService.saveFile(data.getId(), SysFileTypeEnum.REPAIR_CHECK_IMGS.getValue(), form.getVerifyImages());
+        sysFileService.saveFile(data.getId(), SysFileTypeEnum.REPAIR_CHECK_FILES.getValue(), form.getVerifyFiles());
+    }
+
+    /**
+     * 记录维修状态
+     * @param form
+     */
+    private void addRepairStatusRecord(RepairApplicationForm form,String remark){
+        CustomFieldTemplateData data = new CustomFieldTemplateData();
+        data.setId(IdGeneratorUtils.getObjectId());
+        data.setObjId(form.getId());
+        data.setCreatedTime(LocalDateTime.now());
+        data.setCreatedUserId(SecurityUtils.getUserInfo().getUserId());
+        data.setCreatedUserName(SecurityUtils.getUserInfo().getUsername());
+        data.setRemark(CommonConstants.REPAIR_STATUS_RECORD);
+        RepairStatusTemplateData dataInfo = new RepairStatusTemplateData();
+        dataInfo.setRemark(remark);
+        dataInfo.setStatus(form.getStatus());
+        data.setData(JsonUtils.objectToJson(dataInfo));
+        data.setDelFlag(0);
+        customFieldTemplateDataMapper.insert(data);
+    }
+
+    /**
+     * 工程师派工给班组长
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO sendRepair(RepairApplicationFormDTO model) {
+        RepairApplicationFormDTO superModel = super.sendRepair(model);
+        // 判断是否具有派单权限
+        UserInfo userInfo = SecurityUtils.getUserInfo();
+        if(userInfo.getSuperAdmin() == 0){
+            String roles = getCurrentRoles();
+            if(!roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name()) && !roles.contains(SysRoleCodeEnum.MM.name())){
+                throw new DeniedException("不具备派单权限");
+            }
+        }
+        if(StringUtils.isBlank(superModel.getRepairUserId())){
+            throw new DeniedException("请指派维修人");
+        }
+        SysUser repairUser = sysUserMapper.selectByPrimaryKey(superModel.getRepairUserId());
+        superModel.setRepairUserName(repairUser.getUsername());
+        // 修改维修状态并记录
+        RepairApplicationForm applicationForm = new RepairApplicationForm();
+        applicationForm.setId(model.getId());
+        applicationForm.setRepairUserId(superModel.getRepairUserId()); // 当前维修人
+        applicationForm.setRepairUserName(repairUser.getUsername());
+        applicationForm.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
+        superModel.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
+        if (superModel.getRepairStartTime() == null) {
+            applicationForm.setRepairStartTime(LocalDateTime.now());
+            superModel.setRepairStartTime(applicationForm.getRepairStartTime());
+        }
+        applicationForm.setUpdateTime(LocalDateTime.now());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
+        // 添加状态跟踪
+        addRepairStatusRecord(BeanConverterUtil.copyObjectProperties(superModel,RepairApplicationForm.class),"维修中");
+        // 添加维修记录
+        addRepairRecord(superModel);
+        // 给报修人发送消息
+        //sendMessageToRepairCaller(superModel,CommonConstants.CALL_REPAIR_PASS);
+        // 给维修人发送消息
+        sendMessageToRepairer(superModel);
+        // 启动超时监控
+        overTimeListen(model.getId());
+        return superModel;
+    }
+
+    /**
+     * 报修驳回
+     * @param model
+     */
+    @Override
+    public void refusedRepair(RepairApplicationFormDTO model) {
+        RepairApplicationForm updRepair = new RepairApplicationForm();
+        updRepair.setId(model.getId());
+        updRepair.setRemark(model.getRemark());
+        updRepair.setStatus(RepairApplicationFormStatusEnum.REFUSED_REPAIR.getValue());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(updRepair);
+        // 添加状态记录
+        addRepairStatusRecord(updRepair,"报修驳回");
+        // 通知报修人
+        sendMessageToRepairCaller(model,CommonConstants.CALL_REPAIR_REFUSED);
+    }
+
+    /**
+     * 维修人上报
+     * @param model
+     */
+    @Override
+    public void stopRepairByPerson(RepairApplicationFormDTO model) {
+        if(StringUtils.isBlank(model.getReportLeaderId())){
+            throw new DeniedException("上报对象不能为空");
+        }
+        if(StringUtils.isBlank(model.getRemark())){
+            throw new DeniedException("上报原因不能为空");
+        }
+        // 1、完善终止人的维修记录
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        editRepairRecord(model,CommonConstants.REPAIR_RECORD_EDIT_STOP);
+        // 2、回写并修改维修表
+        // 根据角色判断自己上报人角色
+        RepairApplicationForm updRepair = new RepairApplicationForm();
+        updRepair.setId(model.getId());
+        updRepair.setRemarkTwo(model.getRemark());
+        updRepair.setRepairUserId(model.getReportLeaderId());
+        if(model.getRoleType() != null && model.getRoleType() == 3){ // 更新维修单的区域负责人
+            updRepair.setReportLeaderId(model.getReportLeaderId());
+        }
+        /*if(roles.contains(SysRoleCodeEnum.Maintenance.name())){
+            // 更新维修人
+            updRepair.setRepairUserId(model.getReportLeaderId());
+        }else if(roles.contains(SysRoleCodeEnum.Maintenance_Leader.name())){
+            // 班组长上报
+            updRepair.setDispatchUserId(model.getReportLeaderId());
+        }*/
+        updRepair.setStatus(RepairApplicationFormStatusEnum.REPAIR_FAIL.getValue());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(updRepair);
+        // 3、状态记录表
+        addRepairStatusRecord(updRepair,"维修上报");
+        // 4、通知你上报的人
+        sendMessageToReportLeader(form,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(model.getReportLeaderId()),SysUserVO.class));
+    }
+
+    /**
+     * 上报处理方法
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO reportLeaderHandle(RepairApplicationFormDTO model) {
+        String statusRemark = "自主处理";
+        RepairApplicationForm existForm = repairApplicationFormMapper.selectById(model.getId());
+        RepairApplicationForm form = new RepairApplicationForm();
+        form.setId(model.getId());
+        form.setStatus(RepairApplicationFormStatusEnum.PROCESSING.getValue());
+        // 处理方式 自主处理和继续上报
+        String roles = getCurrentRoles();
+        if(model.getReportHandleType() == 1){
+            if(StringUtils.isBlank(model.getReportLeaderId())){
+                throw new DeniedException("派工对象不能为空");
+            }
+            // 自主处理
+            if(roles.contains(SysRoleCodeEnum.Maintenance_Leader.name())){
+                // 班组长处理,重新指派维修人
+                form.setRepairUserId(model.getRepairUserId());
+                // 维修记录
+                String repairUserName = sysUserMapper.selectUserNameById(model.getRepairUserId());
+                model.setRepairUserName(repairUserName);
+                addRepairRecord(model);
+                // 通知维修人
+                sendMessageToRepairer(BeanConverterUtil.copyObjectProperties(existForm,RepairApplicationFormDTO.class));
+            }else if(roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name())){
+                // 工程师处理
+                form.setRepairUserId(model.getRepairUserId());
+                // 维修记录
+                String repairUserName = sysUserMapper.selectUserNameById(model.getRepairUserId());
+                model.setRepairUserName(repairUserName);
+                addRepairRecord(model);
+                // 通知维修人
+                sendMessageToRepairer(BeanConverterUtil.copyObjectProperties(existForm,RepairApplicationFormDTO.class));
+            }else if(roles.contains(SysRoleCodeEnum.MM.name())){
+                // 区域负责人处理
+                form.setDispatchUserId(model.getDispatchUserId());
+                form.setStatus(RepairApplicationFormStatusEnum.MM_DISPATCH.getValue());
+                // 主管派单通知工程师
+                SysUserDTO queryUser = new SysUserDTO();
+                queryUser.setUserId(model.getDispatchUserId());
+                sendMessageToRepairManger(existForm,sysUserMapper.getSysUserVO(queryUser),CommonConstants.REPORT_REPAIR);
+            }
+        } else if(model.getReportHandleType() == 2){
+            if(StringUtils.isBlank(model.getRemark())){
+                throw new DeniedException("上报原因不能为空");
+            }
+            statusRemark = "维修上报";
+            String leaderId = model.getReportLeaderId();
+            form.setRemarkTwo(model.getRemark());
+            // 继续上报
+            form.setStatus(RepairApplicationFormStatusEnum.REPAIR_FAIL.getValue());
+            if(roles.contains(SysRoleCodeEnum.Maintenance_Leader.name())){
+                if(StringUtils.isBlank(model.getReportLeaderId())){
+                    throw new DeniedException("上报对象不能为空");
+                }
+                form.setRepairUserId(null);
+                form.setDispatchUserId(model.getReportLeaderId());
+            }else if(roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name())){
+                // 工程师上报
+                leaderId = existForm.getReportLeaderId();
+                form.setDispatchUserId(null);
+                form.setStatus(RepairApplicationFormStatusEnum.MM_REPAIR_FAIL.getValue());
+            }
+            // 上报通知
+            sendMessageToReportLeader(existForm,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(leaderId),SysUserVO.class));
+        }
+        repairApplicationFormMapper.updateLongYan(form);
+        // 添加状态记录
+        addRepairStatusRecord(form,statusRemark);
+        return model;
+    }
+
+    @Override
+    public RepairApplicationFormDTO closeRepair(RepairApplicationFormDTO dto) {
+        return null;
+    }
+
+    /**
+     * 维修人提交维修完成
+     * @param dto
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO dto) {
+        super.handleRepair(dto);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(dto.getId());
+        // 计算维修时长
+        editRepairRecord(dto,CommonConstants.REPAIR_RECORD_EDIT_ADD);
+        // 此处放在工程师结单时
+        /*double currentHour = form.getRepairMinutes() == null ? 0.0:form.getRepairMinutes();
+        form.setRepairMinutes(currentHour + hours);
+        // 判断维修是否超时
+        String hourFirstStr = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_OVERTIME_MINUTE_FIRST.name());
+        int hourFirst = 180;// 默认3小时,180分钟
+        if (StringUtils.isNotBlank(hourFirstStr)) {
+            hourFirst = Integer.valueOf(hourFirstStr) * 60;
+        }
+        if (form.getRepairMinutes() > hourFirst) {
+            form.setRepairOvertime(true);
+        } else {
+            form.setRepairOvertime(false);
+        }*/
+        repairApplicationFormMapper.updateByPrimaryKeySelective(form);
+        // 添加状态记录
+        addRepairStatusRecord(form,"维修完成待审");
+        // 通知工程师审核
+        SysUserVO vo = BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(form.getDispatchUserId()),SysUserVO.class);
+        sendMessageToRepairManger(form,ListUtils.newArrayList(vo),CommonConstants.REPAIR_COMPLETE_NOTICE);
+        return dto;
+    }
+
+    /**
+     * 工程师之间的转派
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO dispatchRepair(RepairApplicationFormDTO model) {
+        // 完成维修和维修上报的状态才给转派
+        if(model.getStatus() != RepairApplicationFormStatusEnum.REPAIR_FAIL.getValue() &&
+        model.getStatus() != RepairApplicationFormStatusEnum.WAIT_SUBMIT.getValue() &&
+                model.getStatus() != RepairApplicationFormStatusEnum.MM_REPAIR_FAIL.getValue()){
+            throw new DeniedException("该状态下不允许转派");
+        }
+        // 角色是否符合要求
+        String roles = getCurrentRoles();
+        if(!roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name()) && !roles.contains(SysRoleCodeEnum.MM.name())){
+            throw new DeniedException("不具备转派的权限");
+        }
+        SysUser user = sysUserMapper.selectByPrimaryKey(model.getDispatchUserId());
+        RepairApplicationForm form = repairApplicationFormMapper.selectByPrimaryKey(model.getId());
+        // 转派人为工程师时
+        if(model.getRoleType() == 2){
+            model.setDispatchUserId(form.getDispatchUserId());
+            // 添加维修转派记录
+            //addRepairDispatchRecord(model,user);
+            // 更新维修信息
+            form.setDispatchUserId(user.getUserId());
+            //form.setRepairUserId(null);
+            //form.setStatus(RepairApplicationFormStatusEnum.DISPATCH_REPAIR.getValue());
+            //form.setUpdateTime(LocalDateTime.now());
+            //repairApplicationFormMapper.updateLongYan(form);
+            // 添加状态记录
+            //addRepairStatusRecord(form,"维修转派");
+        }else if(model.getRoleType() == 4){ // 区域负责人转派
+            model.setDispatchUserId(form.getReportLeaderId());
+            // 添加维修转派记录
+            //addRepairDispatchRecord(model,user);
+            // 更新维修信息
+            form.setReportLeaderId(user.getUserId());
+            form.setRepairDeptId(sysUserDeptMapper.selectDeptIdByUserId(user.getUserId()));
+            //form.setRepairUserId(null);
+            //form.setStatus(RepairApplicationFormStatusEnum.DISPATCH_REPAIR.getValue());
+            //form.setUpdateTime(LocalDateTime.now());
+            //repairApplicationFormMapper.updateLongYan(form);
+            // 添加状态记录
+            //addRepairStatusRecord(form,"维修转派");
+        }
+        // 添加维修转派记录
+        addRepairDispatchRecord(model,user);
+        form.setRepairUserId(null);
+        form.setStatus(RepairApplicationFormStatusEnum.DISPATCH_REPAIR.getValue());
+        form.setUpdateTime(LocalDateTime.now());
+        repairApplicationFormMapper.updateLongYan(form);
+        // 添加状态记录
+        addRepairStatusRecord(form,"维修转派");
+        return model;
+    }
+
+    /**
+     * 提交生产审核
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationForm submitRepair(RepairApplicationFormDTO model) {
+        // 判断是否具有接单权限
+        String roles = getCurrentRoles();
+        if(!roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name()) && !roles.contains(SysRoleCodeEnum.MM.name())){
+            throw new DeniedException("对不起,您不具备结单权限");
+        }
+        RepairApplicationForm form = super.submitRepair(model);
+        // 添加状态跟踪
+        addRepairStatusRecord(form,"生产审核中");
+        // 添加审核记录
+        addRepairVerifyRecord(model,CommonConstants.STATUS_VERIFY_PASS, CommonConstants.TYPE_REPAIR_MANAGER_VERIFY);
+        // 通知报修人(生产审核)
+        sendMessageToRepairCaller(BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class),CommonConstants.CALL_REPAIR_SUCCESS);
+        // 通知相关领导
+        sendMessageToLeader(BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class),CommonConstants.CALL_REPAIR_COMPLETE);
+        return form;
+    }
+
+    /**
+     * 生产审核通过
+     * @param model
+     */
+    @Override
+    public void verifyRepair(RepairApplicationFormDTO model) {
+        // 判断是否具有权限
+        String roles = getCurrentRoles();
+        if(!roles.contains(SysRoleCodeEnum.REPAIR_EXAMINE.name())){
+            throw new DeniedException("对不起,您不具有审核权限");
+        }
+        super.verifyRepair(model);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        // 添加跟踪状态
+        addRepairStatusRecord(form,"维修完成");
+        // 添加审核记录
+        addRepairVerifyRecord(model,CommonConstants.STATUS_VERIFY_PASS, CommonConstants.TYPE_CALLER_VERIFY);
+        // 通知主管,是否通知维修人
+        SysUserVO vo = BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(form.getDispatchUserId()),SysUserVO.class);
+        //sendMessageToRepairManger(form,vo,CommonConstants.CALL_REPAIR_FINISH);
+    }
+
+    @Override
+    public RepairApplicationFormDTO verifyRefused(RepairApplicationFormDTO model) {
+        // 判断是否具有权限
+        String roles = getCurrentRoles();
+        if(!roles.contains(SysRoleCodeEnum.REPAIR_EXAMINE.name())){
+            throw new DeniedException("对不起,您不具有审核权限");
+        }
+        super.verifyRefused(model);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        // 添加跟踪状态
+        addRepairStatusRecord(form,"生产驳回");
+        // 添加审核记录
+        addRepairVerifyRecord(model,CommonConstants.STATUS_VERIFY_REFUSED, CommonConstants.TYPE_CALLER_VERIFY);
+        // 通知主管,再次派工维修
+        SysUserVO vo = BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(form.getDispatchUserId()),SysUserVO.class);
+        //sendMessageToRepairManger(form,vo,CommonConstants.CALL_REPAIR_FAIL);
+        return model;
+    }
+
+    /**
+     * 根据情况修改数据
+     * @param form
+     * @param type 1 回写数据 2 终止
+     */
+    private double editRepairRecord(RepairApplicationFormDTO form,String type){
+        double hours = 0.0;
+        // 获取维修记录
+        CustomFieldTemplateData queryData = getLastRepairRecord(form.getId(),form.getRepairUserId());
+        CustomFieldTemplateData updData = new CustomFieldTemplateData();
+        updData.setId(queryData.getId());
+        updData.setUpdateTime(LocalDateTime.now());
+        RepairRecordTemplateData dataInfo = JsonUtils.jsonToModel(queryData.getData(),RepairRecordTemplateData.class);
+        updData.setUpdateTime(LocalDateTime.now());
+        hours = DateUtils.getDurationHours(queryData.getCreatedTime(), updData.getUpdateTime());
+        dataInfo.setRepairMinutes(hours);
+        dataInfo.setRemark(form.getRemark());
+        // 保存维修记录图片和文件
+        sysFileService.saveFile(queryData.getId(), SysFileTypeEnum.REPAIR_REPAIR_IMGS.getValue(), form.getRepairFileList());
+        sysFileService.saveFile(queryData.getId(), SysFileTypeEnum.REPAIR_REPAIR_FILES.getValue(), form.getOpinionFileList());
+        updData.setData(JsonUtils.objectToJson(dataInfo));
+        customFieldTemplateDataMapper.updateByPrimaryKeySelective(updData);
+        return hours;
+    }
+
+    /**
+     * 获取最近一次维修记录
+     * @param repairId
+     * @return
+     */
+    private CustomFieldTemplateData getLastRepairRecord(String repairId,String repairUserId){
+        // 获取维修记录
+        Weekend<CustomFieldTemplateData> weekend = new Weekend<>(CustomFieldTemplateData.class);
+        WeekendCriteria<CustomFieldTemplateData, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria = weekendCriteria.andEqualTo(CustomFieldTemplateData::getRemark,CommonConstants.REPAIR_RECORD)
+                .andEqualTo(CustomFieldTemplateData::getObjId,repairId);
+        if(StringUtils.isNotBlank(repairUserId)){
+            weekendCriteria.andEqualTo(CustomFieldTemplateData::getCreatedUserId,repairUserId);
+        }
+        weekend.orderBy("createdTime").desc();
+        List<CustomFieldTemplateData> list = customFieldTemplateDataMapper.selectByExample(weekend);
+        if(list == null || list.size() == 0){
+            throw new DeniedException("维修记录异常,请联系技术处理");
+        }
+        return list.get(0);
+    }
+
+
+    /**
+     * 添加维修记录
+     * @param form
+     */
+    private void addRepairRecord(RepairApplicationFormDTO form){
+        CustomFieldTemplateData data = new CustomFieldTemplateData();
+        data.setId(IdGeneratorUtils.getObjectId());
+        data.setObjId(form.getId());
+        data.setCreatedTime(LocalDateTime.now());
+        data.setCreatedUserId(form.getRepairUserId());
+        data.setCreatedUserName(form.getRepairUserName());
+        data.setRemark(CommonConstants.REPAIR_RECORD);
+        RepairRecordTemplateData dataInfo = new RepairRecordTemplateData();
+        dataInfo.setOpinion(form.getRemark());
+        dataInfo.setRemark("");
+        dataInfo.setRepairMinutes(0.0);
+        dataInfo.setFile("");
+        dataInfo.setImageList("");
+        data.setData(JsonUtils.objectToJson(dataInfo));
+        data.setDelFlag(0);
+        customFieldTemplateDataMapper.insert(data);
+    }
+
+    /**
+     * 添加维修转派记录
+     * @param form
+     */
+    private void addRepairDispatchRecord(RepairApplicationFormDTO form,SysUser user){
+        SysUser oldUser = sysUserMapper.selectByPrimaryKey(form.getDispatchUserId());
+        CustomFieldTemplateData data = new CustomFieldTemplateData();
+        data.setId(IdGeneratorUtils.getObjectId());
+        data.setObjId(form.getId());
+        data.setCreatedTime(LocalDateTime.now());
+        data.setCreatedUserId(form.getDispatchUserId());
+        data.setCreatedUserName(oldUser.getUsername());
+        data.setRemark(CommonConstants.REPAIR_DISPATCH_RECORD);
+        RepairDispatchTemplateData dataInfo = new RepairDispatchTemplateData();
+        dataInfo.setOldDispatchUserId(oldUser.getUserId());
+        dataInfo.setOldDispatchUserName(oldUser.getUsername());
+        dataInfo.setRemark(form.getRepairDispatchRemark());
+        dataInfo.setDispatchUserId(user.getUserId());
+        dataInfo.setDispatchUserName(user.getUsername());
+        dataInfo.setFile("");
+        dataInfo.setImageList("");
+        data.setData(JsonUtils.objectToJson(dataInfo));
+        data.setDelFlag(0);
+        customFieldTemplateDataMapper.insert(data);
+    }
+
+
+    /**
+     * 给报修人发送消息
+     * @param model
+     * @param type 1 报修成功 2 报修驳回 3 维修成功 4 工程师接单
+     */
+    private void sendMessageToRepairCaller(RepairApplicationFormDTO model,String type){
+        SysUser user = sysUserMapper.selectByPrimaryKey(model.getUserId());    // 推送对象
+        String messageInfo = ""; // 通知内容
+        Integer detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_RECEIVE.getValue();
+        String[] values = null; // 微信填充内容
+        String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_RECEIVE_SUCCESS_WECHAT_TEMPLATE_ID.name()); // 微信模板ID
+        String detailUrl = "pages/service-detail/service-detail?id=" + model.getId(); // 微信跳转url
+        switch (type){
+            case CommonConstants.CALL_REPAIR_PASS:
+                messageInfo = MessageTemplateUtil.getRepairStart(model.getNo());
+                values = new String[]{"您提交的报修单已开始维修!",model.getNo(),"维修中",DateUtils.dateToString(model.getRepairStartTime()),"请知悉"};
+                break;
+            case CommonConstants.CALL_REPAIR_REFUSED:
+                messageInfo = MessageTemplateUtil.getRefusedReceive(model.getNo(),model.getRemark());
+                values = new String[]{"您提交的报修单已被驳回!",model.getNo(),"报修驳回","","请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_BACK.getValue();
+                break;
+            case CommonConstants.CALL_REPAIR_SUCCESS:
+                messageInfo = MessageTemplateUtil.getRepairSuccess(model.getNo());
+                values = new String[]{"您提交的报修单已维修完成!",model.getNo(),"维修完成","","请尽快审核"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_FINISH.getValue();
+                break;
+            case CommonConstants.CALL_REPAIR_RECEIVE:
+                messageInfo = MessageTemplateUtil.getReceive(model.getNo());
+                values = new String[]{"您提交的报修单已被工程师接单!",model.getNo(),"已接单","","请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_MANAGE_RECEIVE.getValue();
+                break;
+        }
+        // 1、站内信和email
+        sendWorkplaceAndEmailNew(ListUtils.newArrayList(user.getEmail()),
+                ListUtils.newArrayList(user.getUserId()),model.getId(),messageInfo, detailType);
+        // 2、微信
+        SendMessageUtils.sendWechatNew(ListUtils.newArrayList(user.getWxOpenId()),detailUrl,values,wechatTemplateId);
+        // 3、短信
+        if(StringUtils.isNotBlank(user.getPhone()) && user.getPhone().trim().length() == 11){
+            SendMessageUtils.sendCommonSms(ListUtils.newArrayList(user.getPhone()),messageInfo);
+        }
+    }
+
+    /**
+     * 给相关领导发送消息
+     * @param model
+     * @param type 1 报修成功 2 报修驳回 3 维修成功 4 工程师接单 5 维修结单
+     */
+    private void sendMessageToLeader(RepairApplicationFormDTO model,String type){
+        // 获取推送对象
+        /*List<SysUserVO> userVOS = getRepairMangers(null,null,SysRoleCodeEnum.REPAIR_LEADER.name());
+        if(userVOS != null && userVOS.size() > 0){
+            String messageInfo = ""; // 通知内容
+            Integer detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_FINISH.getValue();
+            String[] values = null; // 微信填充内容
+            String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_RECEIVE_SUCCESS_WECHAT_TEMPLATE_ID.name()); // 微信模板ID
+            String detailUrl = "pages/service-detail/service-detail?id=" + model.getId(); // 微信跳转url
+            switch (type){
+                case CommonConstants.CALL_REPAIR_COMPLETE:
+                    messageInfo = MessageTemplateUtil.getRepairSuccessForLeader(model.getNo());
+                    values = new String[]{"您有一条维修结单消息!",model.getNo(),"维修结单",DateUtils.dateToString(model.getRepairStartTime()),"请知悉"};
+                    break;
+            }
+            Map<String,List<String>> maps = getPushReceivers(userVOS);
+            // 1、站内信和email
+            sendWorkplaceAndEmailNew(maps.get("mails"),maps.get("userIds"),model.getId(),messageInfo, detailType);
+            // 2、微信
+            SendMessageUtils.sendWechatNew(maps.get("openIds"),detailUrl,values,wechatTemplateId);
+            // 3、短信
+            SendMessageUtils.sendCommonSms(maps.get("phones"),messageInfo);
+        }*/
+    }
+
+    /**
+     * 给维修人发送消息
+     * @param model
+     */
+    private void sendMessageToRepairer(RepairApplicationFormDTO model){
+        SbInfo sbInfo = sbInfoService.getModelById(model.getSbId());
+        SysUser user = sysUserMapper.selectByPrimaryKey(model.getRepairUserId());
+        // 1、站内信
+        String domain = getAndCheckPcDomain();
+        String repairUrl = domain + "repair/form?no=" + model.getNo();
+        // 获取站内信内容
+        String info = MessageTemplateUtil.getVmHtmlContent(repairUrl,
+                model, sbInfo);
+        sendWorkplaceAndEmailNew(ListUtils.newArrayList(user.getEmail()),
+                ListUtils.newArrayList(user.getUserId()),model.getId(),info, WorkplaceBacklogDetailTypeEnum.REPAIR_DISPATCH.getValue());
+        // 2、微信
+        String[] values = new String[]{"你有一条维修任务!",model.getActualUser(),sbInfo.getName(),DateUtils.dateToString(model.getApplyTime()),model.getSbCph(),model.getContent(),"请知悉"};
+        String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_NOTICE_SUCCESS_WECHAT_TEMPLATE_ID.name());
+        String detailUrl = "pages/service-detail/service-detail?id=" + model.getId();
+        SendMessageUtils.sendWechatNew(ListUtils.newArrayList(user.getWxOpenId()),detailUrl,values,wechatTemplateId);
+        // 3、短信
+        SendMessageUtils.sendCommonSms(ListUtils.newArrayList(user.getPhone()),info);
+    }
+
+    /**
+     * 给维修主管推送消息
+     * @param form
+     * @param type 1 报修通知 2 维修终止通知 3 维修完成  4 生产驳回  5 主管派单通知
+     */
+    private void sendMessageToRepairManger(RepairApplicationForm form,List<SysUserVO> userVOs,String type){
+        SbInfo sbInfo = sbInfoService.getModelById(form.getSbId());
+        String domain = getAndCheckPcDomain();
+        String repairUrl = domain + "repair/form?no=" + form.getNo();
+        String info = MessageTemplateUtil.getVmHtmlContent(repairUrl,
+                BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class), sbInfo);
+        Integer detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_APPLICATION.getValue();
+        String[] values = null;
+        String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_SEND_SUCCESS_WECHAT_TEMPLATE_ID.name());;
+        String detailUrl = "pages/service-detail/service-detail?id=" + form.getId();
+        switch (type){
+            case CommonConstants.CALL_REPAIR_NOTICE:
+                values = new String[]{"有一条新的报修消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                break;
+            case CommonConstants.REPAIR_FAIL_NOTICE:
+                values = new String[]{"维修单终止维修消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请再次派工"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_APPLICATION_STOP.getValue();
+                break;
+            case CommonConstants.REPAIR_COMPLETE_NOTICE:
+                values = new String[]{"维修完成消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请确认后,提交生产审核"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_OK.getValue();
+                break;
+            case CommonConstants.CALL_REPAIR_FAIL:
+                values = new String[]{"维修审核驳回消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_BACK.getValue();
+                break;
+            case CommonConstants.CALL_REPAIR_FINISH:
+                values = new String[]{"维修生产通过消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_FINISH.getValue();
+                break;
+            case CommonConstants.REPORT_REPAIR:
+                values = new String[]{"维修主管派单消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_REPORT_LEADER_TRANSFER.getValue();
+                break;
+        }
+        Map<String,List<String>> maps = getPushReceivers(userVOs);
+        // 1、站内信
+        sendWorkplaceAndEmailNew(maps.get("mails"),maps.get("userIds"),form.getId(),info, detailType);
+        // 2、微信
+        SendMessageUtils.sendWechatNew(maps.get("openIds"),detailUrl,values,wechatTemplateId);
+        // 3、短信
+        SendMessageUtils.sendCommonSms(maps.get("phones"),info);
+    }
+
+    /**
+     * 维修上报通知
+     * @param form
+     * @param userVOs
+     */
+    private void sendMessageToReportLeader(RepairApplicationForm form,SysUserVO userVOs){
+        SbInfo sbInfo = sbInfoService.getModelById(form.getSbId());
+        String domain = getAndCheckPcDomain();
+        String repairUrl = domain + "repair/form?no=" + form.getNo();
+        String info = MessageTemplateUtil.getVmHtmlContent(repairUrl,
+                BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class), sbInfo);
+        Integer detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_REPORT_LEADER.getValue();
+        String[] values = new String[]{"有一条新的维修上报消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+        String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_SEND_SUCCESS_WECHAT_TEMPLATE_ID.name());;
+        String detailUrl = "pages/service-detail/service-detail?id=" + form.getId();
+        // 1、站内信
+        sendWorkplaceAndEmailNew(ListUtils.newArrayList(userVOs.getEmail()),ListUtils.newArrayList(userVOs.getUserId()),form.getId(),info, detailType);
+        // 2、微信
+        SendMessageUtils.sendWechatNew(ListUtils.newArrayList(userVOs.getWxOpenId()),detailUrl,values,wechatTemplateId);
+        // 3、短信
+        SendMessageUtils.sendCommonSms(ListUtils.newArrayList(userVOs.getPhone()),info);
+    }
+
+    private Map<String,List<String>> getPushReceivers(List<SysUserVO> userVOS){
+        Map<String,List<String>> retInfos = new HashMap<>();
+        List<String> mails = ListUtils.newArrayList();
+        List<String> userIds = ListUtils.newArrayList();
+        List<String> openIds = ListUtils.newArrayList();
+        List<String> phones = ListUtils.newArrayList();
+        userVOS.forEach(item -> {
+            mails.add(item.getEmail());
+            userIds.add(item.getUserId());
+            openIds.add(item.getWxOpenId());
+            phones.add(item.getPhone());
+        });
+        retInfos.put("mails",mails);
+        retInfos.put("userIds",userIds);
+        retInfos.put("openIds",openIds);
+        retInfos.put("phones",phones);
+        return retInfos;
+    }
+}

+ 36 - 5
platform-service/src/main/java/com/platform/service/repair/strategy/impl/LongYanRepairStrategy.java

@@ -11,7 +11,6 @@ import com.platform.dao.entity.customize.CustomFieldTemplateData;
 import com.platform.dao.entity.repair.RepairApplicationForm;
 import com.platform.dao.entity.sb.SbInfo;
 import com.platform.dao.entity.upms.SysUser;
-import com.platform.dao.entity.upms.SysUserDept;
 import com.platform.dao.enums.*;
 import com.platform.dao.mapper.customize.CustomFieldTemplateDataMapper;
 import com.platform.dao.mapper.sb.SbPositionMapper;
@@ -395,7 +394,7 @@ public class LongYanRepairStrategy extends AbstractRepairBaseStrategy {
         // 3、状态记录表
         addRepairStatusRecord(updRepair,"维修上报");
         // 4、通知你上报的人
-        sendMessageToReportLeader(form,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(model.getReportLeaderId()),SysUserVO.class));
+        sendMessageToReportLeader(form,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(model.getReportLeaderId()),SysUserVO.class),CommonConstants.MM_REPAIR_UP);
     }
 
     /**
@@ -466,7 +465,7 @@ public class LongYanRepairStrategy extends AbstractRepairBaseStrategy {
                 form.setStatus(RepairApplicationFormStatusEnum.MM_REPAIR_FAIL.getValue());
             }
             // 上报通知
-            sendMessageToReportLeader(existForm,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(leaderId),SysUserVO.class));
+            sendMessageToReportLeader(existForm,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(leaderId),SysUserVO.class),CommonConstants.MM_REPAIR_UP);
         }
         repairApplicationFormMapper.updateLongYan(form);
         // 添加状态记录
@@ -474,6 +473,28 @@ public class LongYanRepairStrategy extends AbstractRepairBaseStrategy {
         return model;
     }
 
+    @Override
+    public RepairApplicationFormDTO closeRepair(RepairApplicationFormDTO dto) {
+        // 判断是否具有关闭工单权限
+        UserInfo userInfo = SecurityUtils.getUserInfo();
+        if(userInfo.getSuperAdmin() == 0){
+            String roles = getCurrentRoles();
+            if(!roles.contains(SysRoleCodeEnum.REPAIR_MANAGE.name()) && !roles.contains(SysRoleCodeEnum.MM.name())){
+                throw new DeniedException("不具备关闭工单权限");
+            }
+        }
+        RepairApplicationForm queryForm = repairApplicationFormMapper.selectById(dto.getId());
+        // 修改工单状态
+        RepairApplicationForm form = new RepairApplicationForm();
+        form.setId(dto.getId());
+        form.setStatus(RepairApplicationFormStatusEnum.MM_REPAIR_CLOSE.getValue());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(form);
+        // 通知区域负责人
+        SysUserVO vo = sysUserService.selectUserVO(queryForm.getReportLeaderId());
+        sendMessageToReportLeader(queryForm,vo,CommonConstants.MM_CLOSE_REPAIR);
+        return null;
+    }
+
     /**
      * 维修人提交维修完成
      * @param dto
@@ -881,16 +902,26 @@ public class LongYanRepairStrategy extends AbstractRepairBaseStrategy {
      * @param form
      * @param userVOs
      */
-    private void sendMessageToReportLeader(RepairApplicationForm form,SysUserVO userVOs){
+    private void sendMessageToReportLeader(RepairApplicationForm form,SysUserVO userVOs,String type){
         SbInfo sbInfo = sbInfoService.getModelById(form.getSbId());
         String domain = getAndCheckPcDomain();
         String repairUrl = domain + "repair/form?no=" + form.getNo();
         String info = MessageTemplateUtil.getVmHtmlContent(repairUrl,
                 BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class), sbInfo);
         Integer detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_REPORT_LEADER.getValue();
-        String[] values = new String[]{"有一条新的维修上报消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+        String[] values = null;
         String wechatTemplateId = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_SEND_SUCCESS_WECHAT_TEMPLATE_ID.name());;
         String detailUrl = "pages/service-detail/service-detail?id=" + form.getId();
+        switch (type){
+            case CommonConstants.MM_CLOSE_REPAIR:
+                values = new String[]{"工单关闭消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_REPORT_CLOSE.getValue();
+                break;
+            case CommonConstants.MM_REPAIR_UP:
+                values = new String[]{"有一条新的维修上报消息!",form.getNo(),sbInfo.getName(),form.getContent(),form.getSbCph(),"请知悉"};
+                detailType = WorkplaceBacklogDetailTypeEnum.REPAIR_REPORT_LEADER.getValue();
+                break;
+        }
         // 1、站内信
         sendWorkplaceAndEmailNew(ListUtils.newArrayList(userVOs.getEmail()),ListUtils.newArrayList(userVOs.getUserId()),form.getId(),info, detailType);
         // 2、微信