guarantee-lsq 2 years ago
parent
commit
f472f54e6a
39 changed files with 1797 additions and 45 deletions
  1. 22 1
      platform-common/src/main/java/com/platform/common/constant/CommonConstants.java
  2. 21 0
      platform-dao/src/main/java/com/platform/dao/dto/repair/RepairApplicationFormDTO.java
  3. 19 0
      platform-dao/src/main/java/com/platform/dao/dto/repair/RepairRecordTemplateData.java
  4. 97 0
      platform-dao/src/main/java/com/platform/dao/dto/repair/RepairSchemeDTO.java
  5. 12 0
      platform-dao/src/main/java/com/platform/dao/dto/repair/RepairStatusTemplateData.java
  6. 5 0
      platform-dao/src/main/java/com/platform/dao/entity/repair/RepairApplicationForm.java
  7. 87 0
      platform-dao/src/main/java/com/platform/dao/entity/repair/RepairScheme.java
  8. 12 1
      platform-dao/src/main/java/com/platform/dao/enums/RepairApplicationFormStatusEnum.java
  9. 4 1
      platform-dao/src/main/java/com/platform/dao/enums/SysConfigEnum.java
  10. 3 1
      platform-dao/src/main/java/com/platform/dao/enums/SysFileTypeEnum.java
  11. 6 0
      platform-dao/src/main/java/com/platform/dao/enums/SysRoleCodeEnum.java
  12. 1 0
      platform-dao/src/main/java/com/platform/dao/enums/WorkplaceBacklogDetailTypeEnum.java
  13. 2 0
      platform-dao/src/main/java/com/platform/dao/mapper/repair/RepairApplicationFormMapper.java
  14. 26 0
      platform-dao/src/main/java/com/platform/dao/mapper/repair/RepairSchemeMapper.java
  15. 8 0
      platform-dao/src/main/java/com/platform/dao/util/MessageTemplateUtil.java
  16. 100 0
      platform-dao/src/main/java/com/platform/dao/vo/export/repair/ExportRepairSchemeVO.java
  17. 6 0
      platform-dao/src/main/java/com/platform/dao/vo/query/customize/CustomFieldTemplateDataVO.java
  18. 84 0
      platform-dao/src/main/java/com/platform/dao/vo/query/repair/RepairSchemeVO.java
  19. 5 0
      platform-dao/src/main/java/com/platform/dao/vo/repair/RepairApplicationFormVO.java
  20. 21 3
      platform-dao/src/main/resources/mapper/repair/RepairApplicationFormMapper.xml
  21. 81 0
      platform-dao/src/main/resources/mapper/repair/RepairSchemeMapper.xml
  22. 12 10
      platform-dao/src/main/resources/mapper/upms/SysUserMapper.xml
  23. 16 0
      platform-rest/src/main/java/com/platform/rest/controller/customize/CustomFieldTemplateDataController.java
  24. 16 3
      platform-rest/src/main/java/com/platform/rest/controller/repair/RepairApplicationFormController.java
  25. 142 0
      platform-rest/src/main/java/com/platform/rest/controller/repair/RepairSchemeController.java
  26. 17 0
      platform-service/src/main/java/com/platform/service/customize/CustomFieldTemplateDataService.java
  27. 51 6
      platform-service/src/main/java/com/platform/service/customize/impl/CustomFieldTemplateDataServiceImpl.java
  28. 9 0
      platform-service/src/main/java/com/platform/service/repair/RepairApplicationFormService.java
  29. 51 0
      platform-service/src/main/java/com/platform/service/repair/RepairSchemeService.java
  30. 64 2
      platform-service/src/main/java/com/platform/service/repair/impl/RepairApplicationFormServiceImpl.java
  31. 106 0
      platform-service/src/main/java/com/platform/service/repair/impl/RepairSchemeServiceImpl.java
  32. 64 16
      platform-service/src/main/java/com/platform/service/repair/strategy/AbstractRepairBaseStrategy.java
  33. 20 1
      platform-service/src/main/java/com/platform/service/repair/strategy/RepairBaseStrategy.java
  34. 4 0
      platform-service/src/main/java/com/platform/service/repair/strategy/RepairStrategyFactory.java
  35. 22 0
      platform-service/src/main/java/com/platform/service/repair/strategy/impl/AllocateRepairBaseStrategy.java
  36. 22 0
      platform-service/src/main/java/com/platform/service/repair/strategy/impl/BaseRepairBaseStrategy.java
  37. 454 0
      platform-service/src/main/java/com/platform/service/repair/strategy/impl/LongYanRepairStrategy.java
  38. 71 0
      platform-service/src/main/java/com/platform/service/util/SendMessageUtils.java
  39. 34 0
      platform-service/src/main/java/com/platform/service/wechat/util/WeChatMessageUtil.java

+ 22 - 1
platform-common/src/main/java/com/platform/common/constant/CommonConstants.java

@@ -250,7 +250,7 @@ public interface CommonConstants {
 
     String REPAIR_STRATEGY_MODEL_DISPATCH = "2"; // 派发模式,路由到具体派发人那里,由派发人进行分配处理
 
-    String REPAIR_STRATEGY_MODEL_DISPATCH_SB_MANAGER = "3"; // 派送给设备管理者进行维修
+    String REPAIR_STRATEGY_MODEL_DISPATCH_LONG_YAN = "3"; // 维修模式之龙岩
 
 
     /**
@@ -259,5 +259,26 @@ public interface CommonConstants {
     String SB_SCRAP_FORM = "sb_info_scrap"; // 设备报废单
     String SB_STOP_FORM = "sb_info_stop"; // 设备停用单
     String SB_ALLOCATE_FORM = "sb_info_allocate"; // 设备调拨单
+    String REPAIR_STATUS_RECORD = "repair_status_record"; // 维修状态记录
+    String REPAIR_RECORD = "repair_record"; // 维修记录
 
+    /**
+     * 龙岩维修 start
+     */
+    // 报修
+    String CALL_REPAIR_PASS = "1";
+    String CALL_REPAIR_REFUSED = "2";
+    String CALL_REPAIR_SUCCESS = "3";
+    // 维修记录
+    String REPAIR_RECORD_EDIT_ADD = "1";
+    String REPAIR_RECORD_EDIT_STOP = "2";
+    // 维修主管
+    String CALL_REPAIR_NOTICE = "1";
+    String REPAIR_FAIL_NOTICE = "2";
+    String REPAIR_COMPLETE_NOTICE = "3";
+    String CALL_REPAIR_FAIL = "4";
+    String CALL_REPAIR_FINISH = "5";
+    /**
+     * 龙岩维修 end
+     */
 }

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

@@ -339,4 +339,25 @@ public class RepairApplicationFormDTO extends BaseDTO implements Serializable {
     private String dispatchUserId;
 
     private Integer checkAllFlag;
+
+    /**
+     * 维修部门ID
+     */
+    private String repairDeptId;
+
+    /**
+     * 修改之前的部门ID
+     */
+    private String oldRepairDeptId;
+
+    private String repairCallerMobile;
+    /**
+     * 维修记录填充数据
+     */
+    private String imageList;
+
+    /**
+     * 维修记录填充数据
+     */
+    private String file;
 }

+ 19 - 0
platform-dao/src/main/java/com/platform/dao/dto/repair/RepairRecordTemplateData.java

@@ -0,0 +1,19 @@
+package com.platform.dao.dto.repair;
+
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class RepairRecordTemplateData implements Serializable {
+
+    /**
+     * 维修时长
+     */
+    private Double repairMinutes;
+
+    private String remark;
+
+    private String file;
+
+    private String imageList;
+}

+ 97 - 0
platform-dao/src/main/java/com/platform/dao/dto/repair/RepairSchemeDTO.java

@@ -0,0 +1,97 @@
+package com.platform.dao.dto.repair;
+
+import com.platform.common.bean.BaseDTO;
+import com.platform.common.validation.group.UpdateGroup;
+import com.platform.dao.entity.upms.SysFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Description 维修方案表DTO
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class RepairSchemeDTO extends BaseDTO implements Serializable {
+
+    private String id;
+    /**
+     * 维修单
+     */
+    private String repairId;
+    /**
+     * 维修意见
+     */
+    private String opinion;
+    /**
+     * 维修意见图
+     */
+    private List<SysFile> imageList;
+    /**
+     * 维修方案文件
+     */
+    private List<SysFile> opinionFile;
+    /**
+     * 方案提供者ID
+     */
+    private String createdUserId;
+    /**
+     * 方案修改者ID
+     */
+    private String updateUserId;
+    /**
+     * 方案提供者
+     */
+    private String createdUserName;
+    /**
+     * 方案修改人
+     */
+    private String updateUserName;
+    /**
+     * 方案添加时间
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 方案添加时间开始
+     */
+    private LocalDateTime createdTimeStart;
+    /**
+     * 方案添加时间结束
+     */
+    private LocalDateTime createdTimeEnd;
+    /**
+     * 方案修改时间
+     */
+    private LocalDateTime updateTime;
+    /**
+     * 方案修改时间开始
+     */
+    private LocalDateTime updateTimeStart;
+    /**
+     * 方案修改时间结束
+     */
+    private LocalDateTime updateTimeEnd;
+    /**
+     * 状态保留字段
+     */
+    private Integer status;
+    /**
+     * 删除标识 0 正常 1 删除
+     */
+    private Integer deleteFlag;
+    /**
+     * 关键字
+     */
+    private String keyword;
+
+}

+ 12 - 0
platform-dao/src/main/java/com/platform/dao/dto/repair/RepairStatusTemplateData.java

@@ -0,0 +1,12 @@
+package com.platform.dao.dto.repair;
+
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class RepairStatusTemplateData implements Serializable {
+
+    private Integer status;
+
+    private String remark;
+}

+ 5 - 0
platform-dao/src/main/java/com/platform/dao/entity/repair/RepairApplicationForm.java

@@ -239,6 +239,7 @@ public class RepairApplicationForm implements Serializable {
 
     /**
      * 分配人ID
+     * 龙岩的维修主管ID
      */
     private String dispatchUserId;
 
@@ -283,5 +284,9 @@ public class RepairApplicationForm implements Serializable {
      */
     @Transient
     private DataScope dataScope;
+    /**
+     * 维修部门ID
+     */
+    private String repairDeptId;
 
 }

+ 87 - 0
platform-dao/src/main/java/com/platform/dao/entity/repair/RepairScheme.java

@@ -0,0 +1,87 @@
+package com.platform.dao.entity.repair;
+
+import lombok.Data;
+
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.LocalDate;
+
+import lombok.experimental.Accessors;
+import com.platform.common.bean.DataScope;
+
+import javax.persistence.Transient;
+
+/**
+ * @Description 维修方案表实体类
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@Table(name = "t_repair_scheme")
+public class RepairScheme implements Serializable {
+
+    /**
+     * 主键
+     */
+    @Id
+    private String id;
+    /**
+     * 维修单
+     */
+    private String repairId;
+    /**
+     * 维修意见
+     */
+    private String opinion;
+    /**
+     * 维修意见图
+     */
+    //private String imageList;
+    /**
+     * 维修方案文件
+     */
+    //private String opinionFile;
+    /**
+     * 方案提供者ID
+     */
+    private String createdUserId;
+    /**
+     * 方案修改者ID
+     */
+    private String updateUserId;
+    /**
+     * 方案提供者
+     */
+    private String createdUserName;
+    /**
+     * 方案修改人
+     */
+    private String updateUserName;
+    /**
+     * 方案添加时间
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 方案修改时间
+     */
+    private LocalDateTime updateTime;
+    /**
+     * 状态保留字段
+     */
+    private Integer status;
+    /**
+     * 删除标识 0 正常 1 删除
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 数据权限
+     */
+    @Transient
+    private DataScope dataScope;
+
+}

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

@@ -22,19 +22,30 @@ public enum RepairApplicationFormStatusEnum {
     PROCESSING(2),
     /**
      * 待审核
+     * 龙岩-待维修主管审核
      */
     WAIT_SUBMIT(3),
     /**
      * 审核中
+     * 龙岩-待生产审核
      */
     NOT_ACCEPTANCE(4),
     /**
      * 已驳回
+     * 生产驳回
      */
     REBACK(5),
     /**
      * 	已完成
      */
-    FINISHED(6);
+    FINISHED(6),
+    /**
+     * 	报修被拒
+     */
+    REFUSED_REPAIR(7),
+    /**
+     * 	维修失败,再次派工
+     */
+    REPAIR_FAIL(8);
     private final Integer value;
 }

+ 4 - 1
platform-dao/src/main/java/com/platform/dao/enums/SysConfigEnum.java

@@ -45,7 +45,10 @@ public enum SysConfigEnum {
     REPAIR_SUPER_USERS("维修管理中的超级用户集合"),
     PURCHASE_FORM_SUPER_USERS("采购入库单的超级用户集合"),
     REPAIR_STRATEGY_MODEL("维修策略模式选择"),
-    STORE_SUPER_USERS("仓库管理中的超级用户集合");
+    STORE_SUPER_USERS("仓库管理中的超级用户集合"),
+    REPAIR_SEND_SUCCESS_WECHAT_TEMPLATE_ID("报修后通知维修主管"),
+    REPAIR_RECEIVE_SUCCESS_WECHAT_TEMPLATE_ID("报修接收后通知报修人"),
+    REPAIR_NOTICE_SUCCESS_WECHAT_TEMPLATE_ID("派工后通知维修人"),;
     private final String typeName;
 
 }

+ 3 - 1
platform-dao/src/main/java/com/platform/dao/enums/SysFileTypeEnum.java

@@ -33,7 +33,9 @@ public enum SysFileTypeEnum {
     CHECK_STANDARD_FILES(22, "保养文件"),
     CHECK_JOB_FILES(23, "保养任务完成文件"),
     Sb_MEASURE_IMGS(31, "计量图片"),
-    Sb_MEASURE_FILES(32, "计量文件");
+    Sb_MEASURE_FILES(32, "计量文件"),
+    REPAIR_SCHEME_IMGS(33, "维修-方案图片"),
+    REPAIR_SCHEME_FILES(34, "维修-方案文件");
     private Integer value;
     private final String description;
 }

+ 6 - 0
platform-dao/src/main/java/com/platform/dao/enums/SysRoleCodeEnum.java

@@ -133,12 +133,18 @@ public enum SysRoleCodeEnum {
     XJZG,
     /**
      * 报修单最后审核人员
+     * 龙岩报修人
      */
     REPAIR_EXAMINE,
     /**
      * 报修派工角色
      */
     REPAIR_DISPATCH,
+
+    /**
+     * 维修主管
+     */
+    REPAIR_MANAGE,
     ;
 
 }

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

@@ -19,6 +19,7 @@ public enum WorkplaceBacklogDetailTypeEnum {
      */
     SPARE_PICK(1, "领用申请通知"),
     REPAIR_APPLICATION(2, "报修申请通知"),
+    REPAIR_APPLICATION_STOP(25, "维修终止通知"),
     REPAIR_FINISH(3, "维修完成通知"),
     REPAIR_DISPATCH(4, "维修派工通知"),
     REPAIR_BACK(5, "维修驳回通知"),

+ 2 - 0
platform-dao/src/main/java/com/platform/dao/mapper/repair/RepairApplicationFormMapper.java

@@ -62,4 +62,6 @@ public interface RepairApplicationFormMapper extends MyMapper<RepairApplicationF
     void updateForRepairDispatch(RepairApplicationForm model);
 
     List<RepairApplicationFormVO> getRepairCount(RepairApplicationFormDTO dto);
+
+    void updateLongYan(RepairApplicationForm model);
 }

+ 26 - 0
platform-dao/src/main/java/com/platform/dao/mapper/repair/RepairSchemeMapper.java

@@ -0,0 +1,26 @@
+package com.platform.dao.mapper.repair;
+
+import com.platform.dao.dto.repair.RepairSchemeDTO;
+import com.platform.dao.config.MyMapper;
+import com.platform.dao.entity.repair.RepairScheme;
+import com.platform.dao.vo.query.repair.RepairSchemeVO;
+import org.springframework.stereotype.Component;
+import java.util.List;
+
+
+/**
+ * @Description 维修方案表 mapper
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Component
+public interface RepairSchemeMapper extends MyMapper<RepairScheme> {
+    /**
+     * 分页查询
+     * @param dto
+     * @return
+     */
+    List<RepairSchemeVO> selectList(RepairSchemeDTO dto);
+
+}

+ 8 - 0
platform-dao/src/main/java/com/platform/dao/util/MessageTemplateUtil.java

@@ -261,6 +261,14 @@ public class MessageTemplateUtil {
         return String.format("您的报修【%s】已接受,正在处理,请等待", id);
     }
 
+    public static String getRefusedReceive(String no,String reason) {
+        return String.format("您的报修【%s】被驳回,驳回原因【%s】,请知悉!", no,reason);
+    }
+
+    public static String getRepairSuccess(String no) {
+        return String.format("您的报修【%s】已完成,请尽快审核确认!", no);
+    }
+
     public static String getReceiveExamine(String id) {
         return String.format("维修【%s】工单已经完成,等待您审核", id);
     }

+ 100 - 0
platform-dao/src/main/java/com/platform/dao/vo/export/repair/ExportRepairSchemeVO.java

@@ -0,0 +1,100 @@
+package com.platform.dao.vo.export.repair;
+
+import com.platform.office.annotation.Excel;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.LocalDate;
+
+/**
+ * @Description 维修方案表导出VO
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+public class ExportRepairSchemeVO implements Serializable {
+
+    /**
+     * 主键
+     */
+    @Excel(name = "主键", orderNum = "1")
+    private String id;
+
+    /**
+     * 维修单
+     */
+    @Excel(name = "维修单", orderNum = "2")
+    private String repairId;
+
+    /**
+     * 维修意见
+     */
+    @Excel(name = "维修意见", orderNum = "3")
+    private String opinion;
+
+    /**
+     * 维修意见图
+     */
+    @Excel(name = "维修意见图", orderNum = "4")
+    private String imageList;
+
+    /**
+     * 维修方案文件
+     */
+    @Excel(name = "维修方案文件", orderNum = "5")
+    private String opinionFile;
+
+    /**
+     * 方案提供者ID
+     */
+    @Excel(name = "方案提供者ID", orderNum = "6")
+    private String createdUserId;
+
+    /**
+     * 方案修改者ID
+     */
+    @Excel(name = "方案修改者ID", orderNum = "7")
+    private String updateUserId;
+
+    /**
+     * 方案提供者
+     */
+    @Excel(name = "方案提供者", orderNum = "8")
+    private String createdUserName;
+
+    /**
+     * 方案修改人
+     */
+    @Excel(name = "方案修改人", orderNum = "9")
+    private String updateUserName;
+
+    /**
+     * 方案添加时间
+     */
+    @Excel(name = "方案添加时间", orderNum = "10")
+    private LocalDateTime createdTime;
+
+    /**
+     * 方案修改时间
+     */
+    @Excel(name = "方案修改时间", orderNum = "11")
+    private LocalDateTime updateTime;
+
+    /**
+     * 状态保留字段
+     */
+    @Excel(name = "状态保留字段", orderNum = "12")
+    private Integer status;
+
+    /**
+     * 删除标识 0 正常 1 删除
+     */
+    @Excel(name = "删除标识 0 正常 1 删除", orderNum = "13")
+    private Integer deleteFlag;
+
+
+}

+ 6 - 0
platform-dao/src/main/java/com/platform/dao/vo/query/customize/CustomFieldTemplateDataVO.java

@@ -127,4 +127,10 @@ public class CustomFieldTemplateDataVO extends BaseVO implements Serializable {
      * 删除标识 0 nomalr 1 deleted
      */
     private Integer DelFlag;
+
+    private Double repairHours;
+
+    private String imageList;
+
+    private String file;
 }

+ 84 - 0
platform-dao/src/main/java/com/platform/dao/vo/query/repair/RepairSchemeVO.java

@@ -0,0 +1,84 @@
+package com.platform.dao.vo.query.repair;
+
+import com.platform.dao.entity.upms.SysFile;
+import lombok.Data;
+import com.platform.common.bean.BaseVO;
+import com.platform.common.bean.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Description 维修方案表VO结果类
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class RepairSchemeVO extends BaseVO implements Serializable {
+
+    /**
+     * 主键
+     */
+    private String id;
+    /**
+     * 维修单
+     */
+    private String repairId;
+    /**
+     * 维修意见
+     */
+    private String opinion;
+    /**
+     * 维修意见图
+     */
+    private List<SysFile> imageList;
+    /**
+     * 维修方案文件
+     */
+    private List<SysFile> opinionFile;
+    /**
+     * 方案提供者ID
+     */
+    private String createdUserId;
+    /**
+     * 方案修改者ID
+     */
+    private String updateUserId;
+    /**
+     * 方案提供者
+     */
+    private String createdUserName;
+    /**
+     * 方案修改人
+     */
+    private String updateUserName;
+    /**
+     * 方案添加时间
+     */
+    private LocalDateTime createdTime;
+    /**
+     * 方案修改时间
+     */
+    private LocalDateTime updateTime;
+    /**
+     * 状态保留字段
+     */
+    private Integer status;
+    /**
+     * 删除标识 0 正常 1 删除
+     */
+    private Integer deleteFlag;
+
+    private String repairNo;
+
+
+}

+ 5 - 0
platform-dao/src/main/java/com/platform/dao/vo/repair/RepairApplicationFormVO.java

@@ -367,4 +367,9 @@ public class RepairApplicationFormVO extends BaseVO implements Serializable {
     private String weekDayName;
 
     private BigDecimal count;
+
+    /**
+     * 维修部门ID
+     */
+    private String repairDeptId;
 }

+ 21 - 3
platform-dao/src/main/resources/mapper/repair/RepairApplicationFormMapper.xml

@@ -5,7 +5,7 @@
         application.*,
         user.real_name as userName,
         user2.real_name as repairUserName,
-        user3.real_name as checkUserName,
+        user3.username as checkUserName,
         sb.model as model,
         sb.name as sbName,part.name as partName,
         sb.no as sbNo, sb.cph as sbCph, sb.model_id as modelId,
@@ -18,7 +18,7 @@
         from t_repair_application_form application
         left join t_sys_user user on application.user_id = user.user_id
         left join t_sys_user user2 on application.repair_user_id = user2.user_id
-        left join t_sys_user user3 on application.check_user_id = user3.user_id
+        left join t_sys_user user3 on application.dispatch_user_id = user3.user_id
         left join t_sb_info sb on application.sb_id = sb.id
         left join t_error_type error on application.repair_error_type_id = error.id
         left join t_part_info part on application.part_id = part.id
@@ -124,7 +124,7 @@
         from t_repair_application_form application
         left join t_sys_user user on application.user_id = user.user_id
         left join t_sys_user user2 on application.repair_user_id = user2.user_id
-        left join t_sys_user user3 on application.check_user_id = user3.user_id
+        left join t_sys_user user3 on application.dispatch_user_id = user3.user_id
         left join t_sb_info sb on application.sb_id = sb.id
         left join t_part_info part on application.part_id = part.id
         left join t_error_type error on application.repair_error_type_id = error.id
@@ -290,4 +290,22 @@
         </where>
         group by status
     </select>
+
+    <update id="updateLongYan" parameterType="com.platform.dao.entity.repair.RepairApplicationForm">
+        update t_repair_application_form
+        <set>
+            repair_user_id = null,
+            repair_user_name = null,
+            <if test="remark != null">
+                remark = #{remark},
+            </if>
+            <if test="status != null">
+                status = #{status},
+            </if>
+            <if test="repairMinutes != null">
+                repair_minutes = #{repairMinutes},
+            </if>
+        </set>
+        where id = #{id}
+    </update>
 </mapper>

+ 81 - 0
platform-dao/src/main/resources/mapper/repair/RepairSchemeMapper.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.platform.dao.mapper.repair.RepairSchemeMapper">
+    <sql id="Base_Column_List">
+                             repair.id,
+                                     repair.repair_id,
+                                     repair.opinion,
+                                     repair.created_user_id,
+                                     repair.update_user_id,
+                                     repair.created_user_name,
+                                     repair.update_user_name,
+                                     repair.created_time,
+                                     repair.update_time,
+                                     repair.status,
+                                     repair.delete_flag
+                        </sql>
+    <sql id="Ref_Column_List">
+                                                                         repair.repair_id,
+                                     repair.opinion,
+                                                                                                                                                                                                                                                                                                             repair.status,
+                                     repair.delete_flag
+                                </sql>
+    <sql id="List_Condition">
+        <if test="id != null and id != ''">
+            and repair.id = #{id}
+        </if>
+        <if test="repairId != null and repairId != ''">
+            and repair.repair_id = #{repairId}
+        </if>
+        <if test="opinion != null and opinion != ''">
+            and repair.opinion = #{opinion}
+        </if>
+        <if test="createdUserId != null and createdUserId != ''">
+            and repair.created_user_id = #{createdUserId}
+        </if>
+        <if test="updateUserId != null and updateUserId != ''">
+            and repair.update_user_id = #{updateUserId}
+        </if>
+        <if test="createdUserName != null and createdUserName != ''">
+            and repair.created_user_name = #{createdUserName}
+        </if>
+        <if test="updateUserName != null and updateUserName != ''">
+            and repair.update_user_name = #{updateUserName}
+        </if>
+        <if test="createdTimeStart != null">
+            and repair.created_time <![CDATA[>=]]>; #{createdTimeStart}
+        </if>
+        <if test="createdTimeEnd != null">
+            and repair.created_time <![CDATA[<=]]> #{createdTimeEnd}
+        </if>
+        <if test="createdTime != null">
+            and repair.created_time = #{createdTime}
+        </if>
+        <if test="updateTimeStart != null">
+            and repair.update_time <![CDATA[>=]]>; #{updateTimeStart}
+        </if>
+        <if test="updateTimeEnd != null">
+            and repair.update_time <![CDATA[<=]]> #{updateTimeEnd}
+        </if>
+        <if test="updateTime != null">
+            and repair.update_time = #{updateTime}
+        </if>
+        <if test="status != null">
+            and repair.status = #{status}
+        </if>
+        <if test="deleteFlag != null">
+            and repair.delete_flag = #{deleteFlag}
+        </if>
+        <if test="keyword != null and keyword != ''">
+            and repair.id like concat(concat('%',#{keyword}),'%')
+        </if>
+    </sql>
+    <select id="selectList" parameterType="com.platform.dao.dto.repair.RepairSchemeDTO"
+            resultType="com.platform.dao.vo.query.repair.RepairSchemeVO">
+        select repair.*
+        from t_repair_scheme as repair
+        <where>
+            <include refid="List_Condition"/>
+        </where>
+    </select>
+</mapper>

+ 12 - 10
platform-dao/src/main/resources/mapper/upms/SysUserMapper.xml

@@ -123,6 +123,9 @@
                 #{item}
             </foreach>
         </if>
+        <if test="deptId != null">
+            and ud.dept_id = #{deptId}
+        </if>
         <choose>
             <when test="orderByFlag != null and orderByFlag == 1">
                 order by u.created_time asc
@@ -139,16 +142,15 @@
         where user_id = #{value}
     </select>
 
-    <select id="getSysUserList"
-            parameterType="com.platform.dao.dto.upms.SysUserDeptDTO"
+    <select id="getSysUserList" parameterType="com.platform.dao.dto.upms.SysUserDeptDTO"
             resultType="com.platform.dao.vo.SysUserVO">
-            select distinct user.username as username,user.real_name realName, user.user_id userId  from t_sys_user user join t_sys_user_role urole on
-            urole.user_id=user.user_id
-            join t_sys_role role on
-            urole.role_id=role.role_id
-            where
-                    role.role_name='维修人员'
-                    and user.status=1
-
+    select distinct user.username as username,user.real_name realName, user.user_id userId  from t_sys_user user
+    join t_sys_user_role urole on urole.user_id = user.user_id
+    join t_sys_role role on urole.role_id = role.role_id
+    join t_sys_user_dept dept on user.user_id = dept.user_id 
+    where role.role_name = '维修人员' and user.status = 1 
+    <if test="deptId != null and deptId != ''">
+        and dept.dept_id = #{deptId}
+    </if>
     </select>
 </mapper>

+ 16 - 0
platform-rest/src/main/java/com/platform/rest/controller/customize/CustomFieldTemplateDataController.java

@@ -44,6 +44,17 @@ public class CustomFieldTemplateDataController {
         return new R<>(customFieldTemplateDataService.getModelById(id));
     }
 
+    /**
+     * 通过id查询单条记录
+     *
+     * @param id 主键
+     * @return R
+     */
+    @GetMapping("/repair/longyan/{id}")
+    public R<CustomFieldTemplateDataVO> getLongYanRepairById(@PathVariable("id") String id) {
+        return new R<>(customFieldTemplateDataService.getVOByRepairThree(id));
+    }
+
     /**
      * 通过id查询单条记录
      *
@@ -151,6 +162,11 @@ public class CustomFieldTemplateDataController {
         return new R<>(customFieldTemplateDataService.selectPageList(customFieldTemplateDataDTO, pageNum, pageSize));
     }
 
+    @GetMapping("/repair/longyan/page")
+    public R<AbstractPageResultBean<CustomFieldTemplateDataVO>> queryLongYan(CustomFieldTemplateDataDTO customFieldTemplateDataDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
+        return new R<>(customFieldTemplateDataService.selectPageList(customFieldTemplateDataDTO, pageNum, pageSize));
+    }
+
     /**
      * 获取列表
      *

+ 16 - 3
platform-rest/src/main/java/com/platform/rest/controller/repair/RepairApplicationFormController.java

@@ -100,6 +100,19 @@ public class RepairApplicationFormController {
         }else{
             repairApplicationFormService.modModelByDTO(repairApplicationFormDTO);
         }
+        // 需要发起
+        if(!repairApplicationFormDTO.getRepairDeptId().equals(repairApplicationFormDTO.getOldRepairDeptId())){
+            RepairStrategyFactory.getStrategy().callRepairAgain(repairApplicationFormDTO);
+        }
+        return new R<>();
+    }
+
+    @SysLog("报修驳回")
+    @PutMapping("/refused/{id}")
+    //@PreAuthorize("@pms.hasPermission('repair-application-forms-edit')")
+    public R refusedRepair(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody RepairApplicationFormDTO repairApplicationFormDTO) {
+        repairApplicationFormDTO.setId(id);
+        RepairStrategyFactory.getStrategy().refusedRepair(repairApplicationFormDTO);
         return new R<>();
     }
 
@@ -141,7 +154,8 @@ public class RepairApplicationFormController {
      */
     @GetMapping("/page")
     public R query(RepairApplicationFormDTO repairApplicationFormDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
-        return new R<>(repairApplicationFormService.selectPageInfoVO(repairApplicationFormDTO, pageNum, pageSize));
+        //return new R<>(repairApplicationFormService.selectPageInfoVO(repairApplicationFormDTO, pageNum, pageSize));
+        return new R<>(repairApplicationFormService.selectPageInfoVOByModelThree(repairApplicationFormDTO, pageNum, pageSize));
     }
 
     /**
@@ -212,8 +226,7 @@ public class RepairApplicationFormController {
     @PreAuthorize("@pms.hasPermission('repair-application-forms-dispatch')")
     public R dispatch(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody RepairApplicationFormDTO repairFormDTO) {
         repairFormDTO.setId(id);
-        RepairStrategyFactory.getStrategy().dispatchRepair(repairFormDTO);
-        //repairApplicationFormService.dispatchModelByDTO(repairFormDTO);
+        RepairStrategyFactory.getStrategy().sendRepair(repairFormDTO);
         return new R<>();
     }
 

+ 142 - 0
platform-rest/src/main/java/com/platform/rest/controller/repair/RepairSchemeController.java

@@ -0,0 +1,142 @@
+package com.platform.rest.controller.repair;
+
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.util.BeanConverterUtil;
+import com.platform.common.util.R;
+import com.platform.common.validation.group.AddGroup;
+import com.platform.common.validation.group.UpdateGroup;
+import com.platform.dao.dto.repair.RepairSchemeDTO;
+import com.platform.dao.entity.repair.RepairScheme;
+import com.platform.dao.util.ExcelUtil;
+import com.platform.dao.vo.export.repair.ExportRepairSchemeVO;
+import com.platform.dao.vo.query.repair.RepairSchemeVO;
+import com.platform.rest.log.annotation.SysLog;
+import com.platform.service.repair.RepairSchemeService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @Description 维修方案表 控制器
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/repair/repairs")
+public class RepairSchemeController {
+
+  private final  RepairSchemeService repairSchemeService;
+
+  /**
+   * 通过id查询单条记录
+   *
+   * @param id 主键
+   * @return R
+   */
+  @GetMapping("/{id}")
+  public R<RepairSchemeVO> getById(@PathVariable("id") String id){
+      return new R<>(repairSchemeService.getVOById(id));
+  }
+
+  /**
+   * 新增记录
+   *
+   * @param repairSchemeDTO 维修方案表DTO
+   * @return R
+   */
+  @SysLog("新增维修方案表")
+  @PostMapping
+  @PreAuthorize("@pms.hasPermission('repair-repairs-add')")
+  public R save(@Validated({AddGroup.class}) @RequestBody RepairSchemeDTO repairSchemeDTO) {
+      return new R<>(repairSchemeService.saveByDTO(repairSchemeDTO));
+  }
+
+  /**
+   * 修改记录
+   *
+   * @param repairSchemeDTO 维修方案表DTO
+   * @return R
+   */
+  @SysLog("修改维修方案表")
+  @PutMapping("/{id}")
+  @PreAuthorize("@pms.hasPermission('repair-repairs-edit')")
+  public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody RepairSchemeDTO repairSchemeDTO) {
+      repairSchemeService.updateByDTO(repairSchemeDTO);
+      return new R<>();
+  }
+
+
+                                                                                
+  /**
+   * 通过id删除一条记录
+   *
+   * @param id 主键
+   * @return R
+   */
+  @SysLog("删除维修方案表")
+  @DeleteMapping("/{id}")
+  @PreAuthorize("@pms.hasPermission('repair-repairs-del')")
+  public R removeById(@PathVariable String id){
+    repairSchemeService.deleteByPrimaryKey(id);
+    return new R<>();
+  }
+
+    /**
+     * 批量记录
+     *
+     * @param ids 主键
+     * @return R
+     */
+    @SysLog("批量删除维修方案表")
+    @DeleteMapping("")
+    @PreAuthorize("@pms.hasPermission('repair-repairs-del')")
+    public R removeIds(@RequestBody List<String> ids){
+        repairSchemeService.batchDelete(ids);
+        return new R<>();
+    }
+
+  /**
+   * 获取分页
+   *
+   * @param pageNum 当前页码
+   * @param pageSize 每页条数
+   * @param repairSchemeDTO 维修方案表DTO
+   * @return R
+   */
+  @GetMapping("/page")
+  public R<AbstractPageResultBean<RepairSchemeVO>> query(RepairSchemeDTO repairSchemeDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
+      return new R<>(repairSchemeService.selectPageList(repairSchemeDTO, pageNum, pageSize));
+  }
+
+  /**
+   * 获取列表
+   *
+   * @param repairSchemeDTO 维修方案表DTO
+   * @return R
+   */
+  @GetMapping("")
+  public R query(RepairSchemeDTO repairSchemeDTO) {
+      return new R<>(repairSchemeService.getModelListByDTO(repairSchemeDTO));
+  }
+
+  /**
+     * 维修方案表导出
+     *
+     * @param repairSchemeDTO 维修方案表DTO
+     * @return R
+     */
+  @GetMapping("/export")
+  @SysLog("维修方案表导出")
+  @PreAuthorize("@pms.hasPermission('repair-repairs-export')")
+  public void export(HttpServletResponse response, RepairSchemeDTO repairSchemeDTO) {
+    List<RepairScheme> list = repairSchemeService.getModelListByDTO(repairSchemeDTO);
+    ExcelUtil.exportResponseDict(response, ExportRepairSchemeVO.class, BeanConverterUtil.copyListProperties(list, ExportRepairSchemeVO.class), "维修方案表");
+  }
+
+}

+ 17 - 0
platform-service/src/main/java/com/platform/service/customize/CustomFieldTemplateDataService.java

@@ -1,5 +1,6 @@
 package com.platform.service.customize;
 
+import com.platform.dao.entity.customize.CustomFieldTemplate;
 import com.platform.dao.vo.query.customize.CustomFieldTemplateDataVO;
 import com.platform.dao.dto.customize.CustomFieldTemplateDataDTO;
 import com.platform.dao.entity.customize.CustomFieldTemplateData;
@@ -52,4 +53,20 @@ public interface CustomFieldTemplateDataService extends IBaseService<CustomField
     CustomFieldTemplateDataVO getVOById(String id);
 
     void deleteOne(String id);
+
+    /**
+     * 龙岩维修记录以及状态跟踪
+     * @param record
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    AbstractPageResultBean<CustomFieldTemplateDataVO> selectPageListRepairThree(CustomFieldTemplateDataDTO record, int pageNum, int pageSize);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    CustomFieldTemplateDataVO getVOByRepairThree(String id);
 }

+ 51 - 6
platform-service/src/main/java/com/platform/service/customize/impl/CustomFieldTemplateDataServiceImpl.java

@@ -1,15 +1,13 @@
 package com.platform.service.customize.impl;
 
-import com.github.pagehelper.Page;
 import com.github.pagehelper.PageHelper;
 import com.platform.common.bean.AbstractPageResultBean;
-import com.platform.common.util.BeanConverterUtil;
-import com.platform.common.util.IdGeneratorUtils;
-import com.platform.common.util.SecurityUtils;
-import com.platform.common.util.StringUtils;
+import com.platform.common.constant.CommonConstants;
+import com.platform.common.util.*;
 import com.platform.dao.bean.MyPage;
 import com.platform.dao.dto.customize.CustomFieldTemplateDataDTO;
-import com.platform.dao.entity.customize.CustomFieldTemplate;
+import com.platform.dao.dto.repair.RepairRecordTemplateData;
+import com.platform.dao.dto.repair.RepairStatusTemplateData;
 import com.platform.dao.entity.customize.CustomFieldTemplateData;
 import com.platform.dao.enums.CustomFieldTemplateDataStatusEnum;
 import com.platform.dao.enums.CustomFieldTemplateDataTypeEnum;
@@ -140,4 +138,51 @@ public class CustomFieldTemplateDataServiceImpl extends BaseServiceImpl<CustomFi
         updData.setDelFlag(1);
         mapper.updateByPrimaryKeySelective(updData);
     }
+
+    @Override
+    public AbstractPageResultBean<CustomFieldTemplateDataVO> selectPageListRepairThree(CustomFieldTemplateDataDTO record, int pageNum, int pageSize) {
+        if(record.getDelFlag() == null){
+            record.setDelFlag(false); // 默认正常数据
+        }
+        AbstractPageResultBean<CustomFieldTemplateDataVO> pageInfos = new MyPage(mapper.selectList(record));
+        if(pageInfos != null && pageInfos.getRows() != null && pageInfos.getRows().size() > 0){ // 统一判断
+            switch (record.getRemark()){
+                case CommonConstants.REPAIR_RECORD:
+                    writeBackToRecord(pageInfos);
+                    break;
+                case CommonConstants.REPAIR_STATUS_RECORD:
+                    writeBackToStatus(pageInfos);
+                    break;
+            }
+        }
+        return pageInfos;
+    }
+
+    @Override
+    public CustomFieldTemplateDataVO getVOByRepairThree(String id) {
+        CustomFieldTemplateData info = mapper.selectByPrimaryKey(id);
+        CustomFieldTemplateDataVO vo = BeanConverterUtil.copyObjectProperties(info,CustomFieldTemplateDataVO.class);
+        RepairRecordTemplateData data = JsonUtils.jsonToModel(vo.getData(),RepairRecordTemplateData.class);
+        vo.setDataRemark(data.getRemark());
+        vo.setRepairHours(data.getRepairMinutes());
+        vo.setImageList(data.getImageList());
+        vo.setFile(data.getFile());
+        return null;
+    }
+
+    private void writeBackToRecord(AbstractPageResultBean<CustomFieldTemplateDataVO> pageInfos){
+        for(CustomFieldTemplateDataVO vo : pageInfos.getRows()){
+            RepairRecordTemplateData data = JsonUtils.jsonToModel(vo.getData(),RepairRecordTemplateData.class);
+            vo.setDataRemark(data.getRemark());
+            vo.setRepairHours(data.getRepairMinutes());
+        }
+    }
+
+    private void writeBackToStatus(AbstractPageResultBean<CustomFieldTemplateDataVO> pageInfos){
+        for(CustomFieldTemplateDataVO vo : pageInfos.getRows()){
+            RepairStatusTemplateData data = JsonUtils.jsonToModel(vo.getData(),RepairStatusTemplateData.class);
+            vo.setDataRemark(data.getRemark());
+            vo.setStatus(data.getStatus());
+        }
+    }
 }

+ 9 - 0
platform-service/src/main/java/com/platform/service/repair/RepairApplicationFormService.java

@@ -137,4 +137,13 @@ public interface RepairApplicationFormService extends IBaseService<RepairApplica
     List<RepairApplicationFormVO> getCurrentlyList(String userId);
 
     NoticeNumberVO getNoticeNumberVO();
+
+    /**
+     * 维修模式三-分页数据
+     * @param record   :
+     * @param pageNum  :
+     * @param pageSize :
+     * @return :
+     */
+    MyVOPage<RepairApplicationFormVO> selectPageInfoVOByModelThree(RepairApplicationFormDTO record, int pageNum, int pageSize);
 }

+ 51 - 0
platform-service/src/main/java/com/platform/service/repair/RepairSchemeService.java

@@ -0,0 +1,51 @@
+package com.platform.service.repair;
+
+import com.platform.dao.vo.query.repair.RepairSchemeVO;
+import com.platform.dao.dto.repair.RepairSchemeDTO;
+import com.platform.dao.entity.repair.RepairScheme;
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.service.base.IBaseService;
+
+import javax.sound.midi.Receiver;
+import java.util.List;
+
+/**
+ * @Description 维修方案表 service
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+public interface RepairSchemeService extends IBaseService<RepairScheme, RepairSchemeDTO> {
+
+   /**
+    * 批量删除
+    *
+    * @param ids :
+    * @return :
+    */
+    int batchDelete(List<String> ids);
+
+    /**
+     * 分页查询
+     * @param record
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    AbstractPageResultBean<RepairSchemeVO> selectPageList(RepairSchemeDTO record, int pageNum, int pageSize);
+
+    /**
+     * 保存维修方案
+     * @param model
+     * @return
+     */
+    RepairScheme saveByDTO(RepairSchemeDTO model);
+
+    /**
+     * 修改维修方案
+     * @param model
+     */
+    void updateByDTO(RepairSchemeDTO model);
+
+    RepairSchemeVO getVOById(String id);
+}

+ 64 - 2
platform-service/src/main/java/com/platform/service/repair/impl/RepairApplicationFormServiceImpl.java

@@ -31,7 +31,6 @@ import com.platform.dao.entity.upms.SysUser;
 import com.platform.dao.enums.*;
 import com.platform.dao.mapper.check.CheckJobMapper;
 import com.platform.dao.mapper.repair.*;
-import com.platform.dao.mapper.upms.SysFileMapper;
 import com.platform.dao.mapper.upms.SysUserMapper;
 import com.platform.dao.mapper.upms.SysUserRoleMapper;
 import com.platform.dao.mapper.workplace.WorkplaceBacklogMapper;
@@ -55,7 +54,6 @@ import com.platform.service.sb.SbInfoService;
 import com.platform.service.upms.SysFileService;
 import com.platform.service.upms.SysUserDeptService;
 import com.platform.service.upms.SysUserService;
-import com.platform.service.util.SysFileUtils;
 import com.platform.service.wechat.util.WeChatMessageUtil;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -181,6 +179,70 @@ public class RepairApplicationFormServiceImpl extends BaseServiceImpl<RepairAppl
         return noticeNumberVO;
     }
 
+    @Override
+    public MyVOPage<RepairApplicationFormVO> selectPageInfoVOByModelThree(RepairApplicationFormDTO record, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        if(StringUtils.isBlank(record.getSbId())){ // 非获取设备的维修记录
+            UserInfo userInfo = SecurityUtils.getUserInfo();
+            if(record.getSearchType() != null){
+                List<Integer> statusList = new ArrayList<>();
+                if(record.getSearchType() == 1){ // 我的报修
+                    record.setUserId(userInfo.getUserId());
+                    // filter 分为   已接收 已驳回
+                    if(record.getFilter() != null){ // 待接收
+                        if(record.getFilter() == RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue()){
+                            statusList.add(record.getFilter());
+                        }
+                        if(record.getFilter() == RepairApplicationFormStatusEnum.PROCESSING.getValue()){ // 已接收
+                            statusList.add(record.getFilter());
+                        }
+                        if(record.getFilter() == RepairApplicationFormStatusEnum.REFUSED_REPAIR.getValue()){ // 已驳回
+                            statusList.add(record.getFilter());
+                        }
+                    }
+                }else if(record.getSearchType() == 2){ // 我的维修
+                    record.setRepairUserId(userInfo.getUserId());
+                }else if(record.getSearchType() == 3){ // 待接收工单-维修主管
+                    record.setDispatchUserId(userInfo.getUserId());
+                    statusList.add(RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue());
+                }else if(record.getSearchType() == 4){ // 待分配工单-维修主管
+                    record.setDispatchUserId(userInfo.getUserId());
+                    //statusList.add(RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue());
+                    statusList.add(RepairApplicationFormStatusEnum.REBACK.getValue());
+                    statusList.add(RepairApplicationFormStatusEnum.REPAIR_FAIL.getValue());
+                }else if(record.getSearchType() == 5){ // 维修审批-维修主管
+                    record.setDispatchUserId(userInfo.getUserId());
+                    statusList.add(RepairApplicationFormStatusEnum.WAIT_SUBMIT.getValue());
+                }else if(record.getSearchType() == 6){ // 维修审批-生产
+                    record.setUserId(userInfo.getUserId());
+                    statusList.add(RepairApplicationFormStatusEnum.NOT_ACCEPTANCE.getValue());
+                }else if(record.getSearchType() == -1){// 全部工单
+                    // 根据用户的角色来定
+                    StringBuilder roleCodes = new StringBuilder();
+                    userInfo.getRoleCodes().forEach(item-> {
+                        roleCodes.append(item).append(",");
+                    });
+                    String role = roleCodes.toString();
+                    if(userInfo.getSuperAdmin() == 0){ // 非超级管理员
+                        if(role.contains(SysRoleCodeEnum.REPAIR_MANAGE.name())){
+                            // 维修主管
+                            record.setDispatchUserId(userInfo.getUserId());
+                        }else if(role.contains(SysRoleCodeEnum.REPAIR_EXAMINE.name())){
+                            // 报修+终审
+                            record.setUserId(userInfo.getUserId());
+                        }else if(role.contains(SysRoleCodeEnum.Maintenance.name())){
+                            record.setRepairUserId(userInfo.getUserId());
+                        }else{
+                            record.setRepairUserId(userInfo.getUserId());
+                        }
+                    }
+                }
+                record.setStatusList(statusList);
+            }
+        }
+        return new MyVOPage<>(mapper.selectPageList(record));
+    }
+
     @Override
     public List<RepairApplicationFormVO> getVOListByDTO(RepairApplicationFormDTO model) {
         List<RepairApplicationFormVO> list = mapper.selectPageList(model);

+ 106 - 0
platform-service/src/main/java/com/platform/service/repair/impl/RepairSchemeServiceImpl.java

@@ -0,0 +1,106 @@
+package com.platform.service.repair.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.util.BeanConverterUtil;
+import com.platform.common.util.IdGeneratorUtils;
+import com.platform.common.util.ListUtils;
+import com.platform.common.util.SecurityUtils;
+import com.platform.dao.bean.MyPage;
+import com.platform.dao.dto.repair.RepairSchemeDTO;
+import com.platform.dao.entity.repair.RepairApplicationForm;
+import com.platform.dao.entity.repair.RepairScheme;
+import com.platform.dao.entity.upms.SysFile;
+import com.platform.dao.enums.SysFileTypeEnum;
+import com.platform.dao.mapper.repair.RepairApplicationFormMapper;
+import com.platform.dao.mapper.repair.RepairSchemeMapper;
+import com.platform.dao.vo.query.repair.RepairSchemeVO;
+import com.platform.service.base.impl.BaseServiceImpl;
+import com.platform.service.repair.RepairSchemeService;
+import com.platform.service.upms.SysFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @Description 维修方案表 service 实现类
+ * @Author lsq
+ * @Date 2022-06-30 09:20:39
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@AllArgsConstructor
+@Service("repairSchemeService")
+public class RepairSchemeServiceImpl extends BaseServiceImpl<RepairSchemeMapper, RepairScheme, RepairSchemeDTO> implements RepairSchemeService {
+    private final SysFileService sysFileService;
+    private final RepairApplicationFormMapper repairApplicationFormMapper;
+
+    @Override
+    public int batchDelete(List<String> ids) {
+        Weekend<RepairScheme> weekend = new Weekend<>(RepairScheme.class);
+        WeekendCriteria<RepairScheme, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andIn(RepairScheme::getId, ids);
+        mapper.deleteByExample(weekend);
+        return 1;
+    }
+
+    @Override
+    public AbstractPageResultBean<RepairSchemeVO> selectPageList(RepairSchemeDTO record, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        return new MyPage(mapper.selectList(record));
+    }
+
+    @Override
+    public RepairScheme saveByDTO(RepairSchemeDTO model) {
+        RepairScheme scheme = BeanConverterUtil.copyObjectProperties(model, RepairScheme.class);
+        scheme.setCreatedUserName(SecurityUtils.getUserInfo().getUsername());
+        scheme.setCreatedUserId(SecurityUtils.getUserInfo().getUserId());
+        scheme.setCreatedTime(LocalDateTime.now());
+        scheme.setId(IdGeneratorUtils.getObjectId());
+        mapper.insert(scheme);
+        model.setId(scheme.getId());
+        sysFileService.saveFile(model.getId(), SysFileTypeEnum.REPAIR_SCHEME_IMGS.getValue(), model.getImageList());
+        sysFileService.saveFile(model.getId(), SysFileTypeEnum.REPAIR_SCHEME_FILES.getValue(), model.getOpinionFile());
+        return scheme;
+    }
+
+    @Override
+    public void updateByDTO(RepairSchemeDTO model) {
+        super.modModelByDTO(model);
+        sysFileService.saveFile(model.getId(), SysFileTypeEnum.REPAIR_SCHEME_IMGS.getValue(), model.getImageList());
+        sysFileService.saveFile(model.getId(), SysFileTypeEnum.REPAIR_SCHEME_FILES.getValue(), model.getOpinionFile());
+    }
+
+    @Override
+    public RepairSchemeVO getVOById(String id) {
+        RepairScheme info = mapper.selectByPrimaryKey(id);
+        RepairSchemeVO model = BeanConverterUtil.copyObjectProperties(info,RepairSchemeVO.class);
+        Weekend<SysFile> weekendFile = new Weekend<>(SysFile.class);
+        weekendFile.weekendCriteria().andEqualTo(SysFile::getTargetId, id);
+        List<SysFile> sysFiles = sysFileService.getListByTargetAndType(id, null);
+        List<SysFile> imageList = ListUtils.newArrayList();
+        List<SysFile> fileList = ListUtils.newArrayList();
+        sysFiles.forEach(item -> {
+            if (item.getType().equals(SysFileTypeEnum.REPAIR_SCHEME_IMGS.getValue())) {
+                imageList.add(item);
+            }
+            if (item.getType().equals(SysFileTypeEnum.REPAIR_SCHEME_FILES.getValue())) {
+                fileList.add(item);
+            }
+        });
+        model.setImageList(imageList);
+        model.setOpinionFile(fileList);
+        model.setRepairNo(repairApplicationFormMapper.selectByPrimaryKey(model.getRepairId()).getNo());
+        return model;
+    }
+
+    @Override
+    public AbstractPageResultBean<RepairScheme> selectPageInfo(RepairSchemeDTO record, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        return new MyPage(mapper.selectList(record));
+    }
+
+                                                                                                                                                                }

+ 64 - 16
platform-service/src/main/java/com/platform/service/repair/strategy/AbstractRepairBaseStrategy.java

@@ -1,8 +1,6 @@
 package com.platform.service.repair.strategy;
 
 import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.platform.common.cache.ConfigCache;
 import com.platform.common.constant.RedisKeyConstants;
 import com.platform.common.exception.BusinessException;
@@ -12,17 +10,14 @@ import com.platform.dao.dto.repair.RepairApplicationFormDTO;
 import com.platform.dao.dto.sb.SbInfoDTO;
 import com.platform.dao.entity.repair.RepairApplicationForm;
 import com.platform.dao.entity.sb.SbInfo;
-import com.platform.dao.entity.upms.SysFile;
 import com.platform.dao.entity.upms.SysUser;
 import com.platform.dao.enums.*;
 import com.platform.dao.mapper.repair.RepairApplicationFormMapper;
-import com.platform.dao.mapper.upms.SysFileMapper;
 import com.platform.dao.util.MessageTemplateUtil;
 import com.platform.service.event.WorkplaceBacklogEvent;
 import com.platform.service.sb.SbInfoService;
 import com.platform.service.upms.SysFileService;
 import com.platform.service.upms.SysUserService;
-import com.platform.service.util.SysFileUtils;
 import com.platform.service.wechat.util.WeChatMessageUtil;
 import lombok.extern.slf4j.Slf4j;
 import tk.mybatis.mapper.weekend.Weekend;
@@ -125,7 +120,9 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
     public RepairApplicationFormDTO sendRepair(RepairApplicationFormDTO model) {
         String id = model.getId();
         RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(id);
-        if (!RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue().equals(applicationForm.getStatus()) && !RepairApplicationFormStatusEnum.REBACK.getValue().equals(applicationForm.getStatus())) {
+        if (!RepairApplicationFormStatusEnum.NOT_ALLOCATED.getValue().equals(applicationForm.getStatus()) &&
+                !RepairApplicationFormStatusEnum.REBACK.getValue().equals(applicationForm.getStatus()) &&
+                !RepairApplicationFormStatusEnum.REPAIR_FAIL.equals(applicationForm.getStatus())) {
             throw new BusinessException("该状态不允许接收任务");
         }
         SbInfo sbInfo = sbInfoService.getModelById(applicationForm.getSbId());
@@ -142,7 +139,7 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
     }
 
     @Override
-    public void handleRepair(RepairApplicationFormDTO dto) {
+    public RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO dto) {
         // 1. 将维修单的状态修改已完成
         RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(dto.getId());
         applicationForm.setStatus(RepairApplicationFormStatusEnum.WAIT_SUBMIT.getValue());
@@ -153,10 +150,10 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
         if (dto.getRepairEndTime() != null) {
             applicationForm.setRepairEndTime(dto.getRepairEndTime());
         }
-        applicationForm.setRepairMinutes(DateUtils.getDurationHours(applicationForm.getRepairStartTime(), applicationForm.getRepairEndTime()));
+        //applicationForm.setRepairMinutes(DateUtils.getDurationHours(applicationForm.getRepairStartTime(), applicationForm.getRepairEndTime()));
         applicationForm.setDealMinutes(DateUtils.getDurationHours(applicationForm.getApplyTime(), applicationForm.getRepairEndTime()));
         // 根据配置判断维修是否超时
-        String hourFirstStr = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_OVERTIME_MINUTE_FIRST.name());
+       /* String hourFirstStr = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_OVERTIME_MINUTE_FIRST.name());
         int hourFirst = 180;// 默认3小时,180分钟
         if (StringUtils.isNotBlank(hourFirstStr)) {
             hourFirst = Integer.valueOf(hourFirstStr) * 60;
@@ -165,18 +162,19 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
             applicationForm.setRepairOvertime(true);
         } else {
             applicationForm.setRepairOvertime(false);
-        }
+        }*/
         applicationForm.setRepairContent(dto.getRepairContent());
         applicationForm.setNeedStop(dto.getNeedStop());
         applicationForm.setUpdateTime(LocalDateTime.now());
         applicationForm.setOutType(dto.getOutType());
         // 保存维修图片
-        sysFileService.saveFile(dto.getId(), SysFileTypeEnum.REPAIR_REPAIR_IMGS.getValue(), dto.getRepairFileList());
+        //sysFileService.saveFile(dto.getId(), SysFileTypeEnum.REPAIR_REPAIR_IMGS.getValue(), dto.getRepairFileList());
         repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
         // 更新设备状态为使用中
         SbInfo sbInfo = sbInfoService.getModelById(applicationForm.getSbId());
         sbInfo.setStatus(SbInfoStatusEnum.IN_USE.getValue());
         sbInfoService.modModelByPrimaryKey(sbInfo);
+        return dto;
     }
 
     @Override
@@ -271,6 +269,21 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
         repairApplicationFormMapper.updateByPrimaryKeySelective(BeanConverterUtil.copyObjectProperties(model, RepairApplicationForm.class));
     }
 
+    @Override
+    public void refusedRepair(RepairApplicationFormDTO model) {
+        System.out.println("--------------子类自行实现--------------");
+    }
+
+    @Override
+    public void stopRepairByPerson(RepairApplicationFormDTO model) {
+        System.out.println("--------------子类自行实现--------------");
+    }
+
+    @Override
+    public RepairApplicationForm callRepairAgain(RepairApplicationFormDTO model) {
+        return null;
+    }
+
     /**
      * 推送站内信和邮箱
      * @param mails
@@ -295,17 +308,41 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
                 model.getId(), userIds, mails));
     }
 
+    public void sendWorkplaceAndEmailNew(List<String> mails,List<String> userIds,String repairId,String content,Integer detailType){
+        // 通过给当天值班维修人员
+        SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.REPAIR.getValue(), detailType,
+                repairId, content, repairId, userIds, mails));
+    }
+
+
     /**
-     * 微信通知
-     * @param openIds
-     * @param model
-     * @param sb
+     * 新版微信推送
+     * @param openIds 微信绑定ID
+     * @param detailUrl 跳转详情Url
+     * @param values   具体信息
+     * @param wechatTemplateId  微信模板ID
      */
+    public void sendWechatNew(List<String> openIds,String detailUrl,String[] values,String wechatTemplateId){
+        if (CollectionUtil.isNotEmpty(openIds)) {
+            String mobileDomain = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SYSTEM_DOMAIN_MOBILE.name());
+            if (StringUtils.isBlank(mobileDomain)) {
+                throw new BusinessException("请先设置系统域名地址,系统管理-》系统参数配置-》SYSTEM_DOMAIN_MOBILE");
+            }
+            if (!mobileDomain.endsWith("/")) {
+                mobileDomain = mobileDomain + "/";
+            }
+            detailUrl = mobileDomain + detailUrl;
+            for (String openId : openIds) {
+                log.info("开始发送微信通知,用户openId: " + openId);
+                WeChatMessageUtil.sendWechatMessage(openId, detailUrl, values,wechatTemplateId);
+            }
+        }
+    }
+
     public void sendWechat(List<String> openIds,RepairApplicationFormDTO model,SbInfo sb){
         // 发送微信通知
         log.info("发送微信通知,维修单id: " + model.getId() );
         if (CollectionUtil.isNotEmpty(openIds)) {
-
             String mobileDomain = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SYSTEM_DOMAIN_MOBILE.name());
             if (StringUtils.isBlank(mobileDomain)) {
                 throw new BusinessException("请先设置系统域名地址,系统管理-》系统参数配置-》SYSTEM_DOMAIN_MOBILE");
@@ -409,4 +446,15 @@ public abstract class AbstractRepairBaseStrategy implements RepairBaseStrategy{
                 repairId, MessageTemplateUtil.getReceive(repairNo),
                 repairId, ListUtils.newArrayList(userId)));
     }
+
+    public String getAndCheckPcDomain(){
+        String domain = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SYSTEM_DOMAIN.name());
+        if (StringUtils.isBlank(domain)) {
+            throw new BusinessException("请先设置系统域名地址,系统管理-》系统参数配置-》SYSTEM_DOMAIN");
+        }
+        if (!domain.endsWith("/")) {
+            domain = domain + "/";
+        }
+        return domain;
+    }
 }

+ 20 - 1
platform-service/src/main/java/com/platform/service/repair/strategy/RepairBaseStrategy.java

@@ -14,6 +14,12 @@ public interface RepairBaseStrategy {
      */
     RepairApplicationForm callRepair(RepairApplicationFormDTO model);
 
+    /**
+     * 报修驳回提交
+     * @param model
+     */
+    RepairApplicationForm callRepairAgain(RepairApplicationFormDTO model);
+
     /**
      * 派工/领取任务
      * @param model
@@ -24,7 +30,7 @@ public interface RepairBaseStrategy {
      * 维修完成
      * @param model
      */
-    void handleRepair(RepairApplicationFormDTO model);
+    RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO model);
 
     /**
      * 提交审核
@@ -54,4 +60,17 @@ public interface RepairBaseStrategy {
      * @param model
      */
     void sendRepairToThird(RepairApplicationFormDTO model);
+
+    /**
+     * 报修驳回
+     * @param model
+     */
+    void refusedRepair(RepairApplicationFormDTO model);
+
+    /**
+     * 搞不定,终止维修
+     * 另请高明吧
+     * @param model
+     */
+    void stopRepairByPerson(RepairApplicationFormDTO model);
 }

+ 4 - 0
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.LongYanRepairStrategy;
 
 /**
  * 获取具体策略类
@@ -18,6 +19,9 @@ public class RepairStrategyFactory {
             case CommonConstants.REPAIR_STRATEGY_MODEL_DISPATCH:
                 strategy = (AllocateRepairBaseStrategy)BeanUtils.getBean("allocateRepairBaseStrategy");
                 break;
+            case CommonConstants.REPAIR_STRATEGY_MODEL_DISPATCH_LONG_YAN:
+                strategy = (LongYanRepairStrategy)BeanUtils.getBean("longYanRepairStrategy");
+                break;
             case CommonConstants.REPAIR_STRATEGY_MODEL_BASE:
                 break;
         }

+ 22 - 0
platform-service/src/main/java/com/platform/service/repair/strategy/impl/AllocateRepairBaseStrategy.java

@@ -264,4 +264,26 @@ public class AllocateRepairBaseStrategy extends AbstractRepairBaseStrategy {
         sendSms(receiverList,BeanConverterUtil.copyObjectProperties(applicationForm, RepairApplicationFormDTO.class),sb);
         return model;
     }
+
+    @Override
+    public RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO dto) {
+        super.handleRepair(dto);
+        RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(dto.getId());
+        applicationForm.setRepairMinutes(DateUtils.getDurationHours(applicationForm.getRepairStartTime(), applicationForm.getRepairEndTime()));
+        // 根据配置判断维修是否超时
+        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 (applicationForm.getRepairMinutes() > hourFirst) {
+            applicationForm.setRepairOvertime(true);
+        } else {
+            applicationForm.setRepairOvertime(false);
+        }
+        // 保存维修图片
+        sysFileService.saveFile(dto.getId(), SysFileTypeEnum.REPAIR_REPAIR_IMGS.getValue(), dto.getRepairFileList());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
+        return dto;
+    }
 }

+ 22 - 0
platform-service/src/main/java/com/platform/service/repair/strategy/impl/BaseRepairBaseStrategy.java

@@ -192,6 +192,28 @@ public class BaseRepairBaseStrategy extends AbstractRepairBaseStrategy {
         return model;
     }
 
+    @Override
+    public RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO dto) {
+        super.handleRepair(dto);
+        RepairApplicationForm applicationForm = repairApplicationFormMapper.selectById(dto.getId());
+        applicationForm.setRepairMinutes(DateUtils.getDurationHours(applicationForm.getRepairStartTime(), applicationForm.getRepairEndTime()));
+        // 根据配置判断维修是否超时
+        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 (applicationForm.getRepairMinutes() > hourFirst) {
+            applicationForm.setRepairOvertime(true);
+        } else {
+            applicationForm.setRepairOvertime(false);
+        }
+        // 保存维修图片
+        sysFileService.saveFile(dto.getId(), SysFileTypeEnum.REPAIR_REPAIR_IMGS.getValue(), dto.getRepairFileList());
+        repairApplicationFormMapper.updateByPrimaryKeySelective(applicationForm);
+        return dto;
+    }
+
     public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
         RepairApplicationFormDTO dto = new RepairApplicationFormDTO();
         RepairBaseStrategy tt = new BaseRepairBaseStrategy();

+ 454 - 0
platform-service/src/main/java/com/platform/service/repair/strategy/impl/LongYanRepairStrategy.java

@@ -0,0 +1,454 @@
+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.util.*;
+import com.platform.dao.dto.repair.RepairApplicationFormDTO;
+import com.platform.dao.dto.repair.RepairRecordTemplateData;
+import com.platform.dao.dto.repair.RepairStatusTemplateData;
+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.RepairApplicationFormStatusEnum;
+import com.platform.dao.enums.SysConfigEnum;
+import com.platform.dao.enums.SysRoleCodeEnum;
+import com.platform.dao.enums.WorkplaceBacklogDetailTypeEnum;
+import com.platform.dao.mapper.customize.CustomFieldTemplateDataMapper;
+import com.platform.dao.mapper.upms.SysUserMapper;
+import com.platform.dao.util.MessageTemplateUtil;
+import com.platform.dao.vo.SysUserVO;
+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.List;
+
+/**
+ * 维修接单模式  -- 龙岩
+ * 报修指定
+ * 维修主管出方案
+ * 多个维修人执行
+ * 维修审核
+ * 生产审核
+ */
+@Component
+public class LongYanRepairStrategy extends AbstractRepairBaseStrategy {
+    @Resource
+    private SysUserMapper sysUserMapper;
+    @Resource
+    private CustomFieldTemplateDataMapper customFieldTemplateDataMapper;
+
+    /**
+     * 龙岩报修人报修
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationForm callRepair(RepairApplicationFormDTO model) {
+        RepairApplicationForm form = super.callRepair(model);
+        // 设置报修推送地方
+        if(StringUtils.isBlank(model.getRepairDeptId())){
+            throw new DeniedException("报修必须选择维修部门");
+        }
+        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.setActualUser(SecurityUtils.getUserInfo().getUsername());
+        form.setUserId(SecurityUtils.getUserInfo().getUserId());
+        repairApplicationFormMapper.insert(form);
+        // 记录维修状态跟踪
+        addRepairStatusRecord(form,"报修");
+        // 给相关的维修主管推送信息
+        sendMessageToRepairManger(form,sysUserVOList.get(0),CommonConstants.CALL_REPAIR_NOTICE);
+        return form;
+    }
+
+    @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.get(0),CommonConstants.CALL_REPAIR_NOTICE);
+        return null;
+    }
+
+    /**
+     * 记录维修状态
+     * @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));
+        customFieldTemplateDataMapper.insert(data);
+    }
+
+    /**
+     * 维修主管接收并指派报修人
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO sendRepair(RepairApplicationFormDTO model) {
+        RepairApplicationFormDTO superModel = super.sendRepair(model);
+        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());
+        superModel.setRepairUserName(repairUser.getUsername());
+        if (superModel.getRepairStartTime() == null) {
+            applicationForm.setRepairStartTime(LocalDateTime.now());
+            superModel.setRepairStartTime(LocalDateTime.now());
+        }
+        applicationForm.setReceiveMinutes(DateUtils.getDurationHours(superModel.getApplyTime(), superModel.getRepairStartTime()));
+        // 判断接单是否超时
+        String minuteStr = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.REPAIR_WARN_MINUTE.name());
+        if (StringUtils.isBlank(minuteStr)) {
+            applicationForm.setReceiveOvertime(false);
+        } else if (applicationForm.getReceiveMinutes() > Double.valueOf(minuteStr)) {
+            applicationForm.setReceiveOvertime(true);
+        } else {
+            applicationForm.setReceiveOvertime(false);
+        }
+        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) {
+        // 1、完善终止人的维修记录
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        double hours = editRepairRecord(model,CommonConstants.REPAIR_RECORD_EDIT_STOP);
+        // 2、回写并修改维修表
+        RepairApplicationForm updRepair = new RepairApplicationForm();
+        updRepair.setId(model.getId());
+        updRepair.setRemark(model.getRemark());
+        updRepair.setStatus(RepairApplicationFormStatusEnum.REPAIR_FAIL.getValue());
+        updRepair.setRepairMinutes(form.getRepairMinutes() + hours);
+        updRepair.setRepairUserName(null);
+        updRepair.setRepairUserId(null);
+        repairApplicationFormMapper.updateLongYan(updRepair);
+        // 3、状态记录表
+        addRepairStatusRecord(updRepair,"维修转派中");
+        // 4、通知维修主管
+        sendMessageToRepairManger(form,BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(model.getDispatchUserId()),SysUserVO.class),CommonConstants.REPAIR_FAIL_NOTICE);
+    }
+
+    /**
+     * 维修人提交维修完成
+     * @param dto
+     * @return
+     */
+    @Override
+    public RepairApplicationFormDTO handleRepair(RepairApplicationFormDTO dto) {
+        super.handleRepair(dto);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(dto.getId());
+        // 计算维修时长
+        double hours = editRepairRecord(dto,CommonConstants.REPAIR_RECORD_EDIT_ADD);
+        form.setRepairMinutes(form.getRepairMinutes() + 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,vo,CommonConstants.REPAIR_COMPLETE_NOTICE);
+        return dto;
+    }
+
+    /**
+     * 提交生产审核
+     * @param model
+     * @return
+     */
+    @Override
+    public RepairApplicationForm submitRepair(RepairApplicationFormDTO model) {
+        RepairApplicationForm form = super.submitRepair(model);
+        // 添加状态跟踪
+        addRepairStatusRecord(form,"待生产确认");
+        // 通知报修人(生产审核)
+        sendMessageToRepairCaller(BeanConverterUtil.copyObjectProperties(form,RepairApplicationFormDTO.class),CommonConstants.CALL_REPAIR_SUCCESS);
+        return form;
+    }
+
+    /**
+     * 生产审核通过
+     * @param model
+     */
+    @Override
+    public void verifyRepair(RepairApplicationFormDTO model) {
+        super.verifyRepair(model);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        // 添加跟踪状态
+        addRepairStatusRecord(form,"维修完成");
+        // 通知主管,是否通知维修人
+        SysUserVO vo = BeanConverterUtil.copyObjectProperties(sysUserMapper.selectByPrimaryKey(form.getDispatchUserId()),SysUserVO.class);
+        sendMessageToRepairManger(form,vo,CommonConstants.CALL_REPAIR_FINISH);
+    }
+
+    @Override
+    public RepairApplicationFormDTO verifyRefused(RepairApplicationFormDTO model) {
+        super.verifyRefused(model);
+        RepairApplicationForm form = repairApplicationFormMapper.selectById(model.getId());
+        // 添加跟踪状态
+        addRepairStatusRecord(form,"生产驳回");
+        // 通知主管,再次派工维修
+        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;
+        // 获取维修记录
+        Weekend<CustomFieldTemplateData> weekend = new Weekend<>(CustomFieldTemplateData.class);
+        WeekendCriteria<CustomFieldTemplateData, Object> weekendCriteria = weekend.weekendCriteria();
+        weekendCriteria.andEqualTo(CustomFieldTemplateData::getRemark,CommonConstants.REPAIR_STATUS_RECORD)
+                .andEqualTo(CustomFieldTemplateData::getObjId,form.getId()).
+                andEqualTo(CustomFieldTemplateData::getCreatedUserId,form.getRepairUserId());
+        weekend.orderBy("createdTime").desc();
+        List<CustomFieldTemplateData> list = customFieldTemplateDataMapper.selectByExample(weekend);
+        if(list == null || list.size() == 0){
+            throw new DeniedException("维修记录异常,请联系技术处理");
+        }
+        CustomFieldTemplateData queryData = list.get(0);
+        CustomFieldTemplateData updData = new CustomFieldTemplateData();
+        updData.setId(queryData.getId());
+        updData.setUpdateTime(LocalDateTime.now());
+        RepairRecordTemplateData dataInfo = JsonUtils.jsonToModel(queryData.getData(),RepairRecordTemplateData.class);
+        switch (type){
+            case CommonConstants.REPAIR_RECORD_EDIT_STOP: // 终止维修,计算时长
+                updData.setUpdateTime(LocalDateTime.now());
+                hours = DateUtils.getDurationHours(queryData.getCreatedTime(), updData.getUpdateTime());
+                dataInfo.setRepairMinutes(hours);
+                dataInfo.setRemark(form.getRemark());
+                dataInfo.setImageList(form.getImageList());
+                dataInfo.setFile(form.getFile());
+                break;
+            case CommonConstants.REPAIR_RECORD_EDIT_ADD:    // 完成维修
+                updData.setUpdateTime(LocalDateTime.now());
+                hours = DateUtils.getDurationHours(queryData.getCreatedTime(), updData.getUpdateTime());
+                dataInfo.setRepairMinutes(hours);
+                dataInfo.setImageList(form.getImageList());
+                dataInfo.setFile(form.getFile());
+                dataInfo.setRemark(form.getRemark());
+                break;
+        }
+        updData.setData(JsonUtils.objectToJson(dataInfo));
+        customFieldTemplateDataMapper.updateByPrimaryKeySelective(updData);
+        return hours;
+    }
+
+    /**
+     * 添加维修记录
+     * @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.setRemark("");
+        dataInfo.setRepairMinutes(0.0);
+        dataInfo.setFile("");
+        dataInfo.setImageList("");
+        data.setData(JsonUtils.objectToJson(dataInfo));
+        customFieldTemplateDataMapper.insert(data);
+    }
+
+
+    /**
+     * 给报修人发送消息
+     * @param model
+     * @param type 1 报修成功 2 报修驳回 3 维修成功
+     */
+    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/repair-detail/repair-detail?detailId=" + model.getId(); // 微信跳转url
+        switch (type){
+            case CommonConstants.CALL_REPAIR_PASS:
+                messageInfo = MessageTemplateUtil.getReceive(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(),"报修驳回","","请知悉"};
+                break;
+            case CommonConstants.CALL_REPAIR_SUCCESS:
+                messageInfo = MessageTemplateUtil.getRepairSuccess(model.getNo());
+                values = new String[]{"您提交的报修单已维修完成!",model.getNo(),"报修完成","","请知悉"};
+                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
+     */
+    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.getFreemarkerHtmlContent(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/repair-detail/repair-detail?detailId=" + 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 生产驳回
+     */
+    private void sendMessageToRepairManger(RepairApplicationForm form,SysUserVO userVO,String type){
+        SbInfo sbInfo = sbInfoService.getModelById(form.getSbId());
+        String domain = getAndCheckPcDomain();
+        String repairUrl = domain + "repair/form?no=" + form.getNo();
+        String info = MessageTemplateUtil.getFreemarkerHtmlContent(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/repair-detail/repair-detail?detailId=" + 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;
+        }
+        // 1、站内信
+        sendWorkplaceAndEmailNew(ListUtils.newArrayList(userVO.getEmail()),
+                ListUtils.newArrayList(userVO.getUserId()),form.getId(),info, detailType);
+        // 2、微信
+        SendMessageUtils.sendWechatNew(ListUtils.newArrayList(userVO.getWxOpenId()),detailUrl,values,wechatTemplateId);
+        // 3、短信
+        SendMessageUtils.sendCommonSms(ListUtils.newArrayList(userVO.getPhone()),info);
+    }
+}

+ 71 - 0
platform-service/src/main/java/com/platform/service/util/SendMessageUtils.java

@@ -0,0 +1,71 @@
+package com.platform.service.util;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.platform.common.cache.ConfigCache;
+import com.platform.common.constant.RedisKeyConstants;
+import com.platform.common.exception.BusinessException;
+import com.platform.common.util.BeanUtils;
+import com.platform.common.util.RedisUtils;
+import com.platform.common.util.SendSms;
+import com.platform.common.util.StringUtils;
+import com.platform.dao.enums.SysConfigEnum;
+import com.platform.service.wechat.util.WeChatMessageUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+@Slf4j
+public class SendMessageUtils {
+    /**
+     * 短信推送
+     * @param receiverList
+     * @param info
+     */
+    public static void sendCommonSms(List<String> receiverList, String info){
+        if (CollectionUtil.isNotEmpty(receiverList) && BeanUtils.isProd()) {
+            for (String receiver : receiverList) {
+                try {
+                    String numStr = RedisUtils.getString(RedisKeyConstants.HW_SMS + receiver);
+                    boolean isSend = false;
+                    if (StringUtils.isBlank(numStr)) {
+                        isSend = true;
+                        RedisUtils.setString(RedisKeyConstants.HW_SMS + receiver, "1", 24, TimeUnit.HOURS);
+                    } else if (Integer.valueOf(numStr) < 5) {
+                        isSend = true;
+                        RedisUtils.setString(RedisKeyConstants.HW_SMS + receiver, String.valueOf(Integer.valueOf(numStr) + 1), 24, TimeUnit.HOURS);
+                    }
+                    if (isSend) {
+                        System.out.println("templateParas_repair: " + info);
+                        SendSms.sendRepairSms(receiver, info);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 新版微信推送
+     * @param openIds 微信绑定ID
+     * @param detailUrl 跳转详情Url
+     * @param values   具体信息
+     * @param wechatTemplateId  微信模板ID
+     */
+    public static void sendWechatNew(List<String> openIds,String detailUrl,String[] values,String wechatTemplateId){
+        if (CollectionUtil.isNotEmpty(openIds)) {
+            String mobileDomain = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SYSTEM_DOMAIN_MOBILE.name());
+            if (StringUtils.isBlank(mobileDomain)) {
+                throw new BusinessException("请先设置系统域名地址,系统管理-》系统参数配置-》SYSTEM_DOMAIN_MOBILE");
+            }
+            if (!mobileDomain.endsWith("/")) {
+                mobileDomain = mobileDomain + "/";
+            }
+            detailUrl = mobileDomain + detailUrl;
+            for (String openId : openIds) {
+                log.info("开始发送微信通知,用户openId: " + openId);
+                WeChatMessageUtil.sendWechatMessage(openId, detailUrl, values,wechatTemplateId);
+            }
+        }
+    }
+}

+ 34 - 0
platform-service/src/main/java/com/platform/service/wechat/util/WeChatMessageUtil.java

@@ -1,6 +1,7 @@
 package com.platform.service.wechat.util;
 
 import com.platform.common.cache.ConfigCache;
+import com.platform.common.exception.DeniedException;
 import com.platform.common.util.DateUtils;
 import com.platform.common.util.SpringContextHolder;
 import com.platform.common.util.StringUtils;
@@ -109,4 +110,37 @@ public class WeChatMessageUtil {
         }
     }
 
+    /**
+     * 微信推送
+     * @param openId
+     * @param url
+     * @param values
+     */
+    public static void sendWechatMessage(String openId, String url, String[] values,String wechatTemplateId) {
+        try {
+            if(StringUtils.isBlank(url)){
+                throw new DeniedException("跳转详情url不能为空");
+            }
+            if (isSend() && StringUtils.isNotBlank(openId)) {
+                String[] colors = getColors(values.length);
+                WechatTemplateRequest request = WechatTemplateRequestBuilder.getRepairRequest(url, wechatTemplateId,openId, values, colors);
+                SpringContextHolder.publishEvent(new WechatEvent(request));
+            }
+        } catch (Exception e) {
+            log.error("发送微信消息失败", e);
+        }
+    }
+
+    /**
+     * 获取微信colors
+     * @param length
+     * @return
+     */
+    private static String[] getColors(int length){
+        String[] colors = new String[length];
+        for(int i=0;i<length;i++){
+            colors[i] = "#000000";
+        }
+        return colors;
+    }
 }