From c0948102eda828d4eae62d18392adaca56e345e0 Mon Sep 17 00:00:00 2001
From: Houjie <714924425@qq.com>
Date: 星期三, 09 七月 2025 09:19:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java                             |   52 ++++
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java                        |  165 ++++++++++++
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java                                     |    6 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java                                 |  152 +++++++++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java                          |    2 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java |  183 ++++++++++++-
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java                  |    7 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java                             |  170 +++++++++++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java                    |   20 
 9 files changed, 720 insertions(+), 37 deletions(-)

diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java
index 568f263..c7cc465 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java
@@ -12,8 +12,12 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.flowable.engine.HistoryService;
 import org.flowable.engine.TaskService;
+import org.flowable.engine.impl.el.DateUtil;
 import org.flowable.task.api.Task;
+import org.flowable.task.api.history.HistoricTaskInstance;
+import org.flowable.variable.api.persistence.entity.VariableInstance;
 import org.jeecg.common.api.vo.FileUploadResult;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -34,16 +38,22 @@
 import org.jeecg.modules.eam.request.EamInspectionOrderRequest;
 import org.jeecg.modules.eam.service.*;
 import org.jeecg.modules.eam.vo.EquipmentInspectionStatistics;
-import org.jeecg.modules.eam.vo.EquipmentRepairStatistics;
 import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
 import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
 import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.qywx.message.vo.TemplateCard;
+import org.jeecg.modules.qywx.message.vo.TemplateCardEntity;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.IMdcProductionService;
 import org.jeecg.modules.system.service.IMdcUserProductionService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.IThirdAppService;
+import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -89,6 +99,12 @@
     private IEamEquipmentExtendService eamEquipmentExtendService;
     @Autowired
     private IMdcProductionService mdcProductionService;
+    @Autowired
+    private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private HistoryService historyService;
 
     @Override
     public IPage<EamInspectionOrder> queryPageList(Page<EamInspectionOrder> page, EamInspectionOrderQuery query) {
@@ -210,7 +226,154 @@
             //鏇存柊璁惧淇濆吇鐘舵��
             eamEquipmentExtendService.updateEquipmentInspectionStatus(eamInspectionOrder.getEquipmentId(), EquipmentMaintenanceStatus.UNDER_INSPECTION.name());
         }
+        //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+        sendQywxTemplateCardMessage(eamInspectionOrder, null);
         return true;
+    }
+
+    private void sendQywxTemplateCardMessage(EamInspectionOrder eamInspectionOrder, EamInspectionOrderRequest request) {
+        TemplateCard templateCard = new TemplateCard();
+        String inspectionStatus = eamInspectionOrder.getInspectionStatus();
+        EamEquipment equipment = eamEquipmentService.getById(eamInspectionOrder.getEquipmentId());
+        eamInspectionOrder.setEquipmentCode(equipment.getEquipmentCode());
+        if (InspectionStatus.WAIT_INSPECTION.name().equals(inspectionStatus)) {
+            //宸ュ崟寰呴鍙栵紝鎺ㄩ�佹秷鎭粰鎵�鏈夋搷浣滃伐
+            String orgId = Optional.ofNullable(eamEquipmentService.getById(eamInspectionOrder.getEquipmentId()))
+                    .map(EamEquipment::getOrgId)
+                    .orElse(null);
+            if (orgId == null) {
+                throw new IllegalArgumentException("鏈壘鍒拌澶囩殑缁勭粐 ID");
+            }
+            //鏌ヨ璇ヨ澶囨墍灞炰骇绾跨殑鎵�鏈夋搷浣滃伐
+            List<SysUser> sysUserList = mdcUserProductionService.queryByPostAndProId("PCR0001", orgId);
+            List<String> usernameList = sysUserList.stream().map(SysUser::getUsername).collect(Collectors.toList());
+            if (usernameList.isEmpty()) {
+                throw new IllegalArgumentException("鏈壘鍒拌璁惧鎵�灞炰骇绾跨殑鎿嶄綔宸ワ紝璇疯仈绯荤鐞嗗憳澶勭悊");
+            }
+            String nextAssigneeStr = usernameList.stream()
+                    .filter(Objects::nonNull) // 鍙�夛細杩囨护 null 鍊�
+                    .collect(Collectors.joining(","));
+            String touser = wechatEnterpriseService.getTouser(nextAssigneeStr, false);
+            templateCard.setTouser(touser);
+        }
+        if (InspectionStatus.UNDER_INSPECTION.name().equals(inspectionStatus)) {
+            //宸ュ崟宸插紑濮嬬偣妫�锛屾帹閫佹秷鎭粰鍏蜂綋鎿嶄綔宸ワ紙鏂板宸ュ崟鏃舵寚瀹氥�侀鍙栧伐鍗曠殑鎿嶄綔宸ワ級
+            String operator = eamInspectionOrder.getOperator();
+            if (StrUtil.isNotBlank(operator)) {
+                //鏂板宸ュ崟鏃躲�佸伐鍗曢鍙栨椂宸叉寚瀹氱偣妫�浜�
+                String touser = wechatEnterpriseService.getTouser(operator, false);
+                templateCard.setTouser(touser);
+            }
+        }
+        if (InspectionStatus.WAIT_CONFIRM.name().equals(inspectionStatus)) {
+            //宸ュ崟宸茬偣妫�瀹屾垚锛屾帹閫佹秷鎭粰鐝粍闀跨‘璁�
+            List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            String nextAssigneeStr = nextAssignee.stream()
+                    .filter(Objects::nonNull) // 鍙�夛細杩囨护 null 鍊�
+                    .collect(Collectors.joining(","));
+            String touser = wechatEnterpriseService.getTouser(nextAssigneeStr, false);
+            templateCard.setTouser(touser);
+        }
+        if (InspectionStatus.COMPLETE.name().equals(inspectionStatus)) {
+            //宸ュ崟宸茬‘璁ゅ畬鎴愶紝鎺ㄩ�佹秷鎭粰鐐规浜�
+            String touser = wechatEnterpriseService.getTouser(eamInspectionOrder.getOperator(), false);
+            templateCard.setTouser(touser);
+        }
+
+        TemplateCardEntity templateCardEntity = new TemplateCardEntity();
+        templateCard.setTemplate_card(templateCardEntity);
+        templateCardEntity.setTask_id(eamInspectionOrder.getId());
+        TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle();
+        mainTitle.setTitle("璁惧鐐规");
+        templateCardEntity.setMain_title(mainTitle);
+
+        if (InspectionStatus.WAIT_INSPECTION.name().equals(inspectionStatus)) {
+            templateCardEntity.setSub_title_text("鏂板璁惧鐐规宸ュ崟: " + eamInspectionOrder.getOrderNum() + " ,璇疯繘鍏ョ郴缁熼鍙�");
+        }
+        if (InspectionStatus.UNDER_INSPECTION.name().equals(inspectionStatus)) {
+            if (Objects.nonNull(request) && StrUtil.isNotBlank(request.getConfirmDealType())) {
+                //鏄┏鍥炵殑鍗曞瓙
+                templateCardEntity.setSub_title_text("宸ュ崟: " + eamInspectionOrder.getOrderNum() + " 琚┏鍥烇紝璇烽噸鏂拌繘琛岃澶囩偣妫�");
+            } else {
+                templateCardEntity.setSub_title_text("宸ュ崟: " + eamInspectionOrder.getOrderNum() + " 宸茶棰嗗彇锛屽紑濮嬭繘琛岃澶囩偣妫�");
+            }
+        }
+        if (InspectionStatus.WAIT_CONFIRM.name().equals(inspectionStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + eamInspectionOrder.getOrderNum() + " 宸插畬鎴愯澶囩偣妫�,璇疯繘鍏ョ郴缁熺‘璁�");
+        }
+        if (InspectionStatus.COMPLETE.name().equals(inspectionStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + eamInspectionOrder.getOrderNum() + " 宸插畬鎴愮偣妫�鍚庣‘璁�");
+        }
+
+        List<TemplateCardEntity.HorizontalContent> horizontalContentList = CollectionUtil.newArrayList();
+        TemplateCardEntity.HorizontalContent content1 = new TemplateCardEntity.HorizontalContent();
+        content1.setKeyname("宸ュ崟鍙�");
+        content1.setValue(eamInspectionOrder.getOrderNum());
+        horizontalContentList.add(content1);
+        TemplateCardEntity.HorizontalContent content2 = new TemplateCardEntity.HorizontalContent();
+        content2.setKeyname("璁惧缂栧彿");
+        content2.setValue(eamInspectionOrder.getEquipmentCode());
+        horizontalContentList.add(content2);
+
+        //濡傛灉宸ュ崟鐘舵�佷负寰呯偣妫�锛堟病鎸囧畾鐐规浜虹殑鏈鍙栫姸鎬侊級锛屾祦绋嬫槸娌℃湁鍚姩鐨勶紝鏃犳硶鑾峰彇鑺傜偣淇℃伅
+        if (!InspectionStatus.WAIT_INSPECTION.name().equals(inspectionStatus)) {
+            WorkTaskDataVo previousFlowInfo = flowTaskService.getPreviousFlowInfo(eamInspectionOrder.getId());
+            TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+            content3.setKeyname("鍓嶉┍鑺傜偣");
+            content3.setValue(previousFlowInfo.getPreNode());
+            horizontalContentList.add(content3);
+            TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+            content4.setKeyname("褰撳墠鑺傜偣");
+            if (InspectionStatus.COMPLETE.name().equals(inspectionStatus)) {
+                content4.setValue("宸插畬鎴�");
+            } else {
+                content4.setValue(previousFlowInfo.getName());
+            }
+            horizontalContentList.add(content4);
+        }
+
+        TemplateCardEntity.HorizontalContent content5 = new TemplateCardEntity.HorizontalContent();
+        TemplateCardEntity.HorizontalContent content6 = new TemplateCardEntity.HorizontalContent();
+        TemplateCardEntity.HorizontalContent content7 = new TemplateCardEntity.HorizontalContent();
+
+        if (InspectionStatus.WAIT_INSPECTION.name().equals(inspectionStatus)) {
+            content5.setKeyname("鍙戣捣浜�");
+            SysUser sysUser = sysUserService.getUserByName(eamInspectionOrder.getCreateBy());
+            content5.setValue(sysUser.getRealname());
+            horizontalContentList.add(content5);
+        }
+        if (InspectionStatus.UNDER_INSPECTION.name().equals(inspectionStatus) && (Objects.isNull(request) || StrUtil.isBlank(request.getConfirmDealType()))) {
+            content6.setKeyname("棰嗗彇浜�");
+            SysUser sysUser = sysUserService.getUserByName(eamInspectionOrder.getOperator());
+            content6.setValue(sysUser.getRealname());
+            horizontalContentList.add(content6);
+        }
+        if (InspectionStatus.WAIT_CONFIRM.name().equals(inspectionStatus)) {
+            content5.setKeyname("鐐规浜�");
+            SysUser sysUser = sysUserService.getUserByName(eamInspectionOrder.getOperator());
+            content5.setValue(sysUser.getRealname());
+            horizontalContentList.add(content5);
+        }
+        if ((InspectionStatus.COMPLETE.name().equals(inspectionStatus) || InspectionStatus.UNDER_INSPECTION.name().equals(inspectionStatus)) && (Objects.nonNull(request) && StrUtil.isNotBlank(request.getConfirmDealType()))) {
+            content5.setKeyname("纭浜�");
+            SysUser sysUser = sysUserService.getUserByName(eamInspectionOrder.getCreateBy());
+            content5.setValue(sysUser.getRealname());
+            horizontalContentList.add(content5);
+        }
+        if ((InspectionStatus.COMPLETE.name().equals(inspectionStatus) || InspectionStatus.UNDER_INSPECTION.name().equals(inspectionStatus)) && (Objects.nonNull(request) && StrUtil.isNotBlank(request.getConfirmDealType()))) {
+            content7.setKeyname("纭鎰忚");
+            content7.setValue("1".equals(request.getConfirmDealType()) ? "閫氳繃" : "椹冲洖");
+            horizontalContentList.add(content7);
+        }
+
+        templateCardEntity.setHorizontal_content_list(horizontalContentList);
+
+        TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction();
+        cardAction.setType(1);
+        cardAction.setUrl("http://houjie.xalxzn.com:8866/h5");
+        templateCardEntity.setCard_action(cardAction);
+
+        wechatEnterpriseService.sendTemplateCardMsg(templateCard, true);
     }
 
     /**
@@ -296,6 +459,8 @@
             this.updateById(eamInspectionOrder);
             //鏇存柊璁惧淇濆吇鐘舵��
             eamEquipmentExtendService.updateEquipmentInspectionStatus(eamInspectionOrder.getEquipmentId(), EquipmentMaintenanceStatus.UNDER_INSPECTION.name());
+            //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+            sendQywxTemplateCardMessage(eamInspectionOrder, null);
             return true;
         }
     }
@@ -374,6 +539,9 @@
             // 鏇存柊宸ュ崟淇℃伅
             updateEamInspectionOrder(eamInspectionOrder);
 
+            //寰俊娑堟伅鎺ㄩ��
+            sendQywxTemplateCardMessage(eamInspectionOrder, eamInspectionOrderRequest);
+
             //鏌ヨ鏁版嵁,杩涜璁惧缁翠慨澶勭悊
             if (eamInspectionOrder.getInspectionStatus().equals(InspectionStatus.WAIT_CONFIRM.name())) {
                 updateEamInspectionOrderDetail(eamInspectionOrder);
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
index 9f28cc2..9faa0c0 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
@@ -25,10 +25,7 @@
 import org.jeecg.modules.eam.entity.EamRepairOrder;
 import org.jeecg.modules.eam.entity.EamReportRepair;
 import org.jeecg.modules.eam.mapper.EamRepairOrderMapper;
-import org.jeecg.modules.eam.request.EamRepairOrderQuery;
-import org.jeecg.modules.eam.request.EamRepairOrderRequest;
-import org.jeecg.modules.eam.request.EamRepairOrderResponse;
-import org.jeecg.modules.eam.request.EamReportRepairQuery;
+import org.jeecg.modules.eam.request.*;
 import org.jeecg.modules.eam.service.IEamEquipmentExtendService;
 import org.jeecg.modules.eam.service.IEamEquipmentService;
 import org.jeecg.modules.eam.service.IEamRepairOrderService;
@@ -38,11 +35,18 @@
 import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
 import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
 import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.qywx.message.vo.TemplateCard;
+import org.jeecg.modules.qywx.message.vo.TemplateCardEntity;
+import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -50,6 +54,7 @@
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 缁翠慨宸ュ崟
@@ -85,6 +90,12 @@
 
     @Resource
     private IEamEquipmentExtendService eamEquipmentExtendService;
+
+    @Resource
+    private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
+
+    @Resource
+    private ISysUserService sysUserService;
 
     /**
      * 鍒嗛〉鍒楄〃
@@ -205,6 +216,8 @@
             eamReportRepairService.updateById(eamReportRepair);
             //鏇存柊璁惧缁翠慨鐘舵��
             eamEquipmentExtendService.updateEquipmentRepairStatus(eamReportRepair.getEquipmentId(), EquipmentRepairStatus.UNDER_REPAIR.name());
+            //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+            sendQywxTemplateCardMessage(eamRepairOrder, eamReportRepair, null);
         }
     }
 
@@ -249,7 +262,134 @@
             eamReportRepairService.updateById(eamReportRepair);
             //鏇存柊璁惧缁翠慨鐘舵��
             eamEquipmentExtendService.updateEquipmentRepairStatus(eamReportRepair.getEquipmentId(), EquipmentRepairStatus.UNDER_REPAIR.name());
+            //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+            sendQywxTemplateCardMessage(eamRepairOrder, null, null);
         }
+    }
+
+    private void sendQywxTemplateCardMessage(EamRepairOrder eamRepairOrder, EamReportRepair reportRepair, EamRepairOrderRequest request) {
+        TemplateCard templateCard = new TemplateCard();
+        String repairStatus = eamRepairOrder.getRepairStatus();
+        EamEquipment equipment = eamEquipmentService.getById(eamRepairOrder.getEquipmentId());
+        eamRepairOrder.setEquipmentCode(equipment.getEquipmentCode());
+        if (ReportRepairEnum.UNDER_REPAIR.name().equals(repairStatus)) {
+            //宸ュ崟宸叉寚娲撅紝鎺ㄩ�佹秷鎭粰缁翠慨宸�
+            String repairer = eamRepairOrder.getRepairer();
+            String touser = wechatEnterpriseService.getTouser(repairer, false);
+            templateCard.setTouser(touser);
+        }
+        if (ReportRepairEnum.WAIT_SPARES.name().equals(repairStatus)) {
+            //宸ュ崟杩涘叆绛夊緟澶囦欢鐘舵�侊紝鎺ㄩ�佹秷鎭粰璁惧绠$悊鍛�
+            List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            String nextAssigneeStr = nextAssignee.stream()
+                    .filter(Objects::nonNull) // 鍙�夛細杩囨护 null 鍊�
+                    .collect(Collectors.joining(","));
+            String touser = wechatEnterpriseService.getTouser(nextAssigneeStr, false);
+            templateCard.setTouser(touser);
+        }
+        if (ReportRepairEnum.WAIT_CONFIRM.name().equals(repairStatus)) {
+            //宸ュ崟杩涘叆寰呯‘璁ょ姸鎬侊紝鎺ㄩ�佹秷鎭粰鎶ヤ慨鍛�
+            String touser = wechatEnterpriseService.getTouser(reportRepair.getCreateBy(), false);
+            templateCard.setTouser(touser);
+        }
+
+        TemplateCardEntity templateCardEntity = new TemplateCardEntity();
+        templateCard.setTemplate_card(templateCardEntity);
+        templateCardEntity.setTask_id(eamRepairOrder.getId());
+        TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle();
+        mainTitle.setTitle("璁惧缁翠慨");
+        templateCardEntity.setMain_title(mainTitle);
+
+        if (ReportRepairEnum.UNDER_REPAIR.name().equals(repairStatus)) {
+            if (Objects.isNull(reportRepair) && Objects.isNull(request)) {
+                templateCardEntity.setSub_title_text("鏀跺埌鎸囨淳缁翠慨宸ュ崟: " + eamRepairOrder.getRepairCode() + " 璇峰紑濮嬭繘琛岀淮淇�");
+            } else if (Objects.isNull(request)) {
+                templateCardEntity.setSub_title_text("宸查鍙栫淮淇伐鍗�: " + eamRepairOrder.getRepairCode() + " 寮�濮嬭繘琛岀淮淇�");
+            }
+            else {
+                templateCardEntity.setSub_title_text("缁翠慨宸ュ崟: " + eamRepairOrder.getRepairCode() + " 澶囦欢宸插埌浣嶏紝璇风户缁繘琛岀淮淇�");
+            }
+        }
+        if (ReportRepairEnum.WAIT_SPARES.name().equals(repairStatus)) {
+            templateCardEntity.setSub_title_text("缁翠慨宸ュ崟: " + eamRepairOrder.getRepairCode() + " 闇�瑕侀鐢ㄥ浠�");
+        }
+        if (ReportRepairEnum.WAIT_CONFIRM.name().equals(repairStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + eamRepairOrder.getRepairCode() + " 宸插畬鎴愯澶囩淮淇紝璇疯繘鍏ョ郴缁熺‘璁�");
+        }
+
+        List<TemplateCardEntity.HorizontalContent> horizontalContentList = CollectionUtil.newArrayList();
+        TemplateCardEntity.HorizontalContent content1 = new TemplateCardEntity.HorizontalContent();
+        content1.setKeyname("宸ュ崟鍙�");
+        content1.setValue(eamRepairOrder.getRepairCode());
+        horizontalContentList.add(content1);
+        TemplateCardEntity.HorizontalContent content2 = new TemplateCardEntity.HorizontalContent();
+        content2.setKeyname("璁惧缂栧彿");
+        content2.setValue(eamRepairOrder.getEquipmentCode());
+        horizontalContentList.add(content2);
+
+        //濡傛灉宸ュ崟鐘舵�佷负寰呯淮淇紙娌℃寚娲剧淮淇汉锛夛紝娴佺▼鏄病鏈夊惎鍔ㄧ殑锛屾棤娉曡幏鍙栬妭鐐逛俊鎭�
+        if (!ReportRepairEnum.WAIT_REPAIR.name().equals(repairStatus)) {
+            WorkTaskDataVo previousFlowInfo = flowTaskService.getPreviousFlowInfo(eamRepairOrder.getId());
+            TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+            content3.setKeyname("鍓嶉┍鑺傜偣");
+            content3.setValue(previousFlowInfo.getPreNode());
+            horizontalContentList.add(content3);
+            TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+            content4.setKeyname("褰撳墠鑺傜偣");
+            if (InspectionStatus.COMPLETE.name().equals(repairStatus)) {
+                content4.setValue("宸插畬鎴�");
+            } else {
+                content4.setValue(previousFlowInfo.getName());
+            }
+            horizontalContentList.add(content4);
+        }
+
+        TemplateCardEntity.HorizontalContent content5 = new TemplateCardEntity.HorizontalContent();
+        TemplateCardEntity.HorizontalContent content6 = new TemplateCardEntity.HorizontalContent();
+
+        if (ReportRepairEnum.UNDER_REPAIR.name().equals(repairStatus)) {
+            SysUser sysUser = sysUserService.getUserByName(eamRepairOrder.getRepairer());
+            if (Objects.isNull(reportRepair) && Objects.isNull(request)) {
+                content5.setKeyname("鎸囨淳浜�");
+                SysUser assignUser = sysUserService.getUserByName(eamRepairOrder.getCreateBy());
+                content5.setValue(assignUser.getRealname());
+                horizontalContentList.add(content5);
+            } else if (Objects.isNull(request)) {
+                TemplateCardEntity.HorizontalContent content = new TemplateCardEntity.HorizontalContent();
+                content.setKeyname("棰嗗彇浜�");
+                content.setValue(sysUser.getRealname());
+                horizontalContentList.add(content);
+            } else {
+                content5.setKeyname("澶囦欢棰嗗彇浜�");
+                SysUser assignUser = sysUserService.getUserByName(request.getAssignee());
+                content5.setValue(assignUser.getRealname());
+                horizontalContentList.add(content5);
+            }
+            content6.setKeyname("缁翠慨浜�");
+            content6.setValue(sysUser.getRealname());
+            horizontalContentList.add(content6);
+        }
+        if (ReportRepairEnum.WAIT_SPARES.name().equals(repairStatus) || ReportRepairEnum.WAIT_CONFIRM.name().equals(repairStatus)) {
+            content5.setKeyname("缁翠慨浜�");
+            SysUser repairUser = sysUserService.getUserByName(eamRepairOrder.getRepairer());
+            content5.setValue(repairUser.getRealname());
+            horizontalContentList.add(content5);
+        }
+        if (ReportRepairEnum.WAIT_CONFIRM.name().equals(repairStatus)) {
+            content6.setKeyname("纭浜�");
+            SysUser sysUser = sysUserService.getUserByName(reportRepair.getCreateBy());
+            content6.setValue(sysUser.getRealname());
+            horizontalContentList.add(content6);
+        }
+
+        templateCardEntity.setHorizontal_content_list(horizontalContentList);
+
+        TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction();
+        cardAction.setType(1);
+        cardAction.setUrl("http://houjie.xalxzn.com:8866/h5");
+        templateCardEntity.setCard_action(cardAction);
+
+        wechatEnterpriseService.sendTemplateCardMsg(templateCard, true);
     }
 
     @Override
@@ -410,6 +550,10 @@
         this.baseMapper.updateById(eamRepairOrder);
         // 鍚屾鏇存柊鎶ヤ慨琛ㄧ姸鎬�
         eamReportRepairService.updateById(eamReportRepair);
+        if (!ReportRepairEnum.COMPLETE.name().equals(eamRepairOrder.getRepairStatus())) {
+            //鎺ㄩ�佷紒涓氬井淇℃秷鎭紙娴佺▼瀹岀粨涓嶅彂閫佹秷鎭級
+            sendQywxTemplateCardMessage(eamRepairOrder, eamReportRepair, request);
+        }
         return eamRepairOrder;
     }
 
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java
index af99fcd..bb05add 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java
@@ -36,10 +36,15 @@
 import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
 import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
+import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.qywx.message.vo.TemplateCard;
+import org.jeecg.modules.qywx.message.vo.TemplateCardEntity;
+import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.IMdcProductionService;
 import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;
 import org.jeecg.modules.system.vo.UserSelector;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -86,6 +91,8 @@
     private IEamEquipmentExtendService eamEquipmentExtendService;
     @Autowired
     private IMdcProductionService mdcProductionService;
+    @Autowired
+    private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -141,6 +148,8 @@
                 eamWeekMaintenanceOrderMapper.updateById(order);
                 //鏇存柊璁惧淇濆吇鐘舵��
                 eamEquipmentExtendService.updateEquipmentMaintenanceStatus(order.getEquipmentId(), EquipmentMaintenanceStatus.UNDER_MAINTENANCE.name());
+                //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+                sendQywxTemplateCardMessage(order, null);
                 return result.isSuccess();
             }
         }
@@ -331,9 +340,161 @@
         if (result != null) {
             //鏇存柊璁惧淇濆吇鐘舵��
             eamEquipmentExtendService.updateEquipmentMaintenanceStatus(entity.getEquipmentId(), EquipmentMaintenanceStatus.UNDER_MAINTENANCE.name());
+            //鎺ㄩ�佷紒涓氬井淇℃秷鎭�
+            sendQywxTemplateCardMessage(entity, null);
             return result.isSuccess();
         }
         return true;
+    }
+
+    private void sendQywxTemplateCardMessage(EamWeekMaintenanceOrder order, EamWeekMaintenanceRequest request) {
+        TemplateCard templateCard = new TemplateCard();
+        EamEquipment equipment = eamEquipmentService.getById(order.getEquipmentId());
+        order.setEquipmentCode(equipment.getEquipmentCode());
+        String maintenanceStatus = order.getMaintenanceStatus();
+        if (WeekMaintenanceStatusEnum.UNDER_MAINTENANCE.name().equals(maintenanceStatus)) {
+            //宸ュ崟淇濆吇涓紝鎺ㄩ�佹秷鎭粰淇濆吇浜猴紙鏂板宸ュ崟鏃舵寚瀹氥�佷繚鍏讳汉棰嗗彇锛�
+            String operator = order.getOperator();
+            String touser = wechatEnterpriseService.getTouser(operator, false);
+            templateCard.setTouser(touser);
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_CONFIRM.name().equals(maintenanceStatus)
+                || WeekMaintenanceStatusEnum.WAIT_INITIAL_ACCEPTANCE.name().equals(maintenanceStatus)
+                || WeekMaintenanceStatusEnum.WAIT_FINAL_ACCEPTANCE.name().equals(maintenanceStatus)) {
+            //宸ュ崟宸蹭繚鍏诲畬鎴愬緟纭锛屾帹閫佹秷鎭粰鐝粍闀�
+            //鐝粍闀垮凡纭锛屾帹閫佹秷鎭粰璁惧绠$悊鍛樼‘璁�
+            //璁惧绠$悊鍛樺凡纭锛屾帹閫佺粰璁捐兘閮ㄧ鐞嗗憳纭
+            List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            String nextAssigneeStr = nextAssignee.stream()
+                    .filter(Objects::nonNull) // 鍙�夛細杩囨护 null 鍊�
+                    .collect(Collectors.joining(","));
+            String touser = wechatEnterpriseService.getTouser(nextAssigneeStr, false);
+            templateCard.setTouser(touser);
+        }
+
+        TemplateCardEntity templateCardEntity = new TemplateCardEntity();
+        templateCard.setTemplate_card(templateCardEntity);
+        templateCardEntity.setTask_id(order.getId());
+        TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle();
+        mainTitle.setTitle("璁惧鍛ㄤ繚");
+        templateCardEntity.setMain_title(mainTitle);
+
+        if (WeekMaintenanceStatusEnum.UNDER_MAINTENANCE.name().equals(maintenanceStatus)) {
+            if (Objects.nonNull(request) && StrUtil.isNotBlank(request.getConfirmDealType())) {
+                templateCardEntity.setSub_title_text("宸ュ崟: " + order.getOrderNum() + " 琚┏鍥烇紝璇烽噸鏂版墽琛屼繚鍏诲悗鎻愪氦");
+            } else {
+                templateCardEntity.setSub_title_text("宸查鍙栧懆淇濆伐鍗�: " + order.getOrderNum() + "锛屽紑濮嬭繘琛屼繚鍏�");
+            }
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_CONFIRM.name().equals(maintenanceStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + order.getOrderNum() + " 宸蹭繚鍏诲畬鎴愶紝璇疯繘鍏ョ郴缁熺‘璁�");
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_INITIAL_ACCEPTANCE.name().equals(maintenanceStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + order.getOrderNum() + " 宸蹭繚鍏诲畬鎴愶紝璇疯繘鍏ョ郴缁熻繘琛屽垵楠屾敹");
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_FINAL_ACCEPTANCE.name().equals(maintenanceStatus)) {
+            templateCardEntity.setSub_title_text("宸ュ崟: " + order.getOrderNum() + " 宸插畬鎴愬垵楠屾敹锛岃杩涘叆绯荤粺杩涜缁堥獙鏀�");
+        }
+
+        List<TemplateCardEntity.HorizontalContent> horizontalContentList = CollectionUtil.newArrayList();
+        TemplateCardEntity.HorizontalContent content1 = new TemplateCardEntity.HorizontalContent();
+        content1.setKeyname("宸ュ崟鍙�");
+        content1.setValue(order.getOrderNum());
+        horizontalContentList.add(content1);
+        TemplateCardEntity.HorizontalContent content2 = new TemplateCardEntity.HorizontalContent();
+        content2.setKeyname("璁惧缂栧彿");
+        content2.setValue(order.getEquipmentCode());
+        horizontalContentList.add(content2);
+
+        //濡傛灉宸ュ崟鐘舵�佷负寰呬繚鍏伙紙娌℃寚瀹氫繚鍏讳汉鐨勬湭棰嗗彇鐘舵�侊級锛屾祦绋嬫槸娌℃湁鍚姩鐨勶紝鏃犳硶鑾峰彇鑺傜偣淇℃伅
+        if (!WeekMaintenanceStatusEnum.WAIT_MAINTENANCE.name().equals(maintenanceStatus)) {
+            WorkTaskDataVo previousFlowInfo = flowTaskService.getPreviousFlowInfo(order.getId());
+            TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+            content3.setKeyname("鍓嶉┍鑺傜偣");
+            content3.setValue(previousFlowInfo.getPreNode());
+            horizontalContentList.add(content3);
+            TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+            content4.setKeyname("褰撳墠鑺傜偣");
+            if (WeekMaintenanceStatusEnum.COMPLETE.name().equals(maintenanceStatus)) {
+                content4.setValue("宸插畬鎴�");
+            } else {
+                content4.setValue(previousFlowInfo.getName());
+            }
+            horizontalContentList.add(content4);
+        }
+
+        if (WeekMaintenanceStatusEnum.UNDER_MAINTENANCE.name().equals(maintenanceStatus)) {
+            if (Objects.isNull(request)) {
+                //鏂板鐨勫伐鍗曪紙鎸囧畾浜嗕繚鍏讳汉锛夈�佹柊棰嗗彇鐨勫伐鍗�
+                TemplateCardEntity.HorizontalContent content = new TemplateCardEntity.HorizontalContent();
+                content.setKeyname("鍙戣捣浜�");
+                SysUser sysUser = sysUserService.getUserByName(order.getCreateBy());
+                content.setValue(sysUser.getRealname());
+                horizontalContentList.add(content);
+            } else {
+                //琚┏鍥炵殑宸ュ崟
+                TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+                TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+                String confirmAssign = request.getAssignee();
+                SysUser confirmUser = sysUserService.getUserByName(confirmAssign);
+                content3.setKeyname("纭浜�");
+                content3.setValue(confirmUser.getRealname());
+                horizontalContentList.add(content3);
+                content4.setKeyname("纭鎰忚");
+                content4.setValue("椹冲洖");
+                horizontalContentList.add(content4);
+            }
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_CONFIRM.name().equals(maintenanceStatus)) {
+            TemplateCardEntity.HorizontalContent content = new TemplateCardEntity.HorizontalContent();
+            content.setKeyname("淇濆吇浜�");
+            SysUser sysUser = sysUserService.getUserByName(order.getOperator());
+            content.setValue(sysUser.getRealname());
+            horizontalContentList.add(content);
+            //TemplateCardEntity.HorizontalContent content = new TemplateCardEntity.HorizontalContent();
+            //List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            //String realNameStr = sysUserService.getRealNameStrByUserNameList(nextAssignee);
+            //content.setKeyname("纭浜�");
+            //content.setValue(realNameStr);
+            //horizontalContentList.add(content);
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_INITIAL_ACCEPTANCE.name().equals(maintenanceStatus)) {
+            TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+            //TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+            String confirmAssignee = request.getAssignee();
+            SysUser confirmUser = sysUserService.getUserByName(confirmAssignee);
+            content3.setKeyname("纭浜�");
+            content3.setValue(confirmUser.getRealname());
+            horizontalContentList.add(content3);
+            //List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            //String realNameStr = sysUserService.getRealNameStrByUserNameList(nextAssignee);
+            //content4.setKeyname("鍒濋獙浜�");
+            //content4.setValue(realNameStr);
+            //horizontalContentList.add(content4);
+        }
+        if (WeekMaintenanceStatusEnum.WAIT_FINAL_ACCEPTANCE.name().equals(maintenanceStatus)) {
+            TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+            //TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+            String initialAssignee = request.getAssignee();
+            SysUser initialUser = sysUserService.getUserByName(initialAssignee);
+            content3.setKeyname("鍒濋獙浜�");
+            content3.setValue(initialUser.getRealname());
+            horizontalContentList.add(content3);
+            //List<String> nextAssignee = (List<String>) request.getValues().get("NextAssignee");
+            //String realNameStr = sysUserService.getRealNameStrByUserNameList(nextAssignee);
+            //content4.setKeyname("缁堥獙浜�");
+            //content4.setValue(realNameStr);
+            //horizontalContentList.add(content4);
+        }
+
+        templateCardEntity.setHorizontal_content_list(horizontalContentList);
+
+        TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction();
+        cardAction.setType(1);
+        cardAction.setUrl("http://houjie.xalxzn.com:8866/h5");
+        templateCardEntity.setCard_action(cardAction);
+
+        wechatEnterpriseService.sendTemplateCardMsg(templateCard, true);
     }
 
     @Override
@@ -506,6 +667,10 @@
         }
         //淇濆瓨宸ュ崟
         eamWeekMaintenanceOrderMapper.updateById(entity);
+        //鎺ㄩ�佷紒涓氬井淇℃秷鎭紝宸ュ崟瀹岀粨涓嶅彂閫�
+        if (!WeekMaintenanceStatusEnum.COMPLETE.name().equals(entity.getMaintenanceStatus())) {
+            sendQywxTemplateCardMessage(entity, request);
+        }
         return entity;
     }
 
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java
index bb5278e..8a6624b 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java
@@ -5,6 +5,7 @@
 import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto;
 import org.jeecg.modules.flowable.domain.dto.FlowViewerDto;
 import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
 
 import java.io.InputStream;
 import java.util.List;
@@ -182,7 +183,10 @@
      */
     Result getNextFlowNode(FlowTaskVo flowTaskVo);
 
-
+    /**
+     * 閫氳繃涓氬姟鏁版嵁id鑾峰彇涓婁竴鑺傜偣淇℃伅
+     */
+    WorkTaskDataVo getPreviousFlowInfo(String dataId);
 
 
 }
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
index 5fd4330..95ac97a 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
@@ -19,6 +19,7 @@
 import org.flowable.common.engine.api.FlowableObjectNotFoundException;
 import org.flowable.common.engine.impl.identity.Authentication;
 import org.flowable.engine.ProcessEngineConfiguration;
+import org.flowable.engine.TaskService;
 import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstanceQuery;
@@ -34,6 +35,7 @@
 import org.flowable.task.api.TaskQuery;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.SpringContextUtils;
 import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto;
@@ -50,6 +52,7 @@
 import org.jeecg.modules.flowable.domain.dto.FlowTaskDto;
 import org.jeecg.modules.flowable.domain.dto.FlowViewerDto;
 import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
+import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
 import org.jeecg.modules.flowable.factory.FlowServiceFactory;
 import org.jeecg.modules.flowable.flow.CustomProcessDiagramGenerator;
 import org.jeecg.modules.flowable.flow.FindNextNodeUtil;
@@ -78,6 +81,8 @@
     private IFlowThirdService iFlowThirdService;
     @Autowired
     FlowMyBusinessServiceImpl flowMyBusinessService;
+    @Autowired
+    private TaskService taskService;
     /**
      * 瀹屾垚浠诲姟
      *
@@ -1381,6 +1386,53 @@
         return Result.OK(flowNextDto);
     }
 
+    @Override
+    public WorkTaskDataVo getPreviousFlowInfo(String dataId) {
+        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getByDataId(dataId);
+        if (flowMyBusiness == null) {
+            throw new JeecgBootException("鏈壘鍒版祦绋嬫暟鎹紒");
+        }
+
+        String taskId = flowMyBusiness.getTaskId();
+        String processInstanceId = flowMyBusiness.getProcessInstanceId();
+        WorkTaskDataVo taskDataVo = new WorkTaskDataVo();
+        // 濡傛灉褰撳墠浠诲姟ID涓虹┖锛屽垯灏濊瘯浠庡巻鍙蹭换鍔′腑鑾峰彇鏈�鍚庝竴涓畬鎴愮殑浠诲姟
+        if (StringUtils.isBlank(taskId)) {
+            List<HistoricTaskInstance> historicTasks = historyService
+                    .createHistoricTaskInstanceQuery()
+                    .processInstanceId(processInstanceId)
+                    .orderByTaskCreateTime()
+                    .desc()
+                    .list();
+
+            if (CollectionUtils.isEmpty(historicTasks)) {
+                throw new JeecgBootException("鎵句笉鍒板巻鍙蹭换鍔¤褰�");
+            }
+
+            HistoricTaskInstance lastTask = historicTasks.get(0);
+            buildWorkTaskDataVo(taskDataVo, lastTask.getId(), lastTask.getName(), lastTask.getCreateTime());
+        } else {
+            Task task = taskService.createTaskQuery().taskId(taskId).active().singleResult();
+            if (task == null) {
+                throw new JeecgBootException("鎵句笉鍒板搴斾换鍔�");
+            } else {
+                buildWorkTaskDataVo(taskDataVo, task.getId(), task.getName(), task.getCreateTime());
+            }
+        }
+        return taskDataVo;
+    }
+
+    private void buildWorkTaskDataVo(WorkTaskDataVo taskDataVo, String id, String name, Date createTime) {
+        taskDataVo.setId(id);
+        taskDataVo.setName(name);
+        taskDataVo.setCreateTime(createTime);
+        HistoricActivityInstance previousNode = flowMyBusinessService.getPreviousNode(id);
+        if (previousNode != null) {
+            taskDataVo.setPreNode(previousNode.getActivityName());
+            taskDataVo.setPreNodeAssignee(previousNode.getAssignee());
+        }
+    }
+
     /**
      * 鑾峰彇涓嬩竴涓妭鐐逛俊鎭�,娴佺▼瀹氫箟涓婄殑鑺傜偣淇℃伅
      * @param taskId 褰撳墠鑺傜偣id
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java
index df102e8..2f31b53 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java
@@ -72,17 +72,17 @@
      */
     @GetMapping("/sync/wechatEnterprise/user/toLocal")
     public Result syncWechatEnterpriseUserToLocal(@RequestParam(value = "ids", required = false) String ids) {
-        return Result.error("鐢变簬浼佷笟寰俊鎺ュ彛璋冩暣锛屽悓姝ュ埌鏈湴鍔熻兘宸插け鏁�");
+        //return Result.error("鐢变簬浼佷笟寰俊鎺ュ彛璋冩暣锛屽悓姝ュ埌鏈湴鍔熻兘宸插け鏁�");
 
-//        if (thirdAppConfig.isWechatEnterpriseEnabled()) {
-//            SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppUserToLocal();
-//            if (syncInfo.getFailInfo().size() == 0) {
-//                return Result.OK("鍚屾鎴愬姛", syncInfo);
-//            } else {
-//                return Result.error("鍚屾澶辫触", syncInfo);
-//            }
-//        }
-//        return Result.error("浼佷笟寰俊鍚屾鍔熻兘宸茬鐢�");
+        if (thirdAppConfig.isWechatEnterpriseEnabled()) {
+            SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppUserToLocal();
+            if (syncInfo.getFailInfo().size() == 0) {
+                return Result.OK("鍚屾鎴愬姛", syncInfo);
+            } else {
+                return Result.error("鍚屾澶辫触", syncInfo);
+            }
+        }
+        return Result.error("浼佷笟寰俊鍚屾鍔熻兘宸茬鐢�");
     }
 
     /**
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
index 4a23faa..20c9d63 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -330,4 +330,6 @@
 	 * @return
 	 */
     List<UserSelector> selectOperatorList(String equipmentCode, String productionId, String positionCode);
+
+	String getRealNameStrByUserNameList(List<String> usernameList);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
index d2d6455..20f95a1 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -762,4 +762,11 @@
 		List<UserSelector> collect = sysUsers.stream().map(user -> new UserSelector(user.getId(), user.getUsername(), user.getRealname())).collect(Collectors.toList());
 		return collect;
 	}
+
+	@Override
+	public String getRealNameStrByUserNameList(List<String> usernameList) {
+		List<SysUser> userList = list(new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, usernameList)
+				.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0));
+        return userList.stream().map(SysUser::getRealname).collect(Collectors.joining(","));
+	}
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
index 4eab929..f98789b 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -14,6 +15,7 @@
 import com.jeecg.qywx.api.user.vo.User;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.flowable.common.engine.impl.util.CollectionUtil;
 import org.jeecg.common.api.dto.message.MessageDTO;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.util.JwtUtil;
@@ -23,6 +25,9 @@
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.config.JeecgBaseConfig;
 import org.jeecg.config.thirdapp.ThirdAppConfig;
+import org.jeecg.modules.qywx.message.MessageAPI;
+import org.jeecg.modules.qywx.message.vo.TemplateCard;
+import org.jeecg.modules.qywx.message.vo.TemplateCardEntity;
 import org.jeecg.modules.system.entity.*;
 import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
 import org.jeecg.modules.system.mapper.SysUserMapper;
@@ -31,6 +36,7 @@
 import org.jeecg.modules.system.service.*;
 import org.jeecg.modules.system.vo.thirdapp.JwDepartmentTreeVo;
 import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
@@ -39,6 +45,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 /**
@@ -383,7 +390,7 @@
             return syncInfo;
         }
         // 鑾峰彇浼佷笟寰俊鎵�鏈夌殑鐢ㄦ埛
-        List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken);
+        List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1433010418", null, null, accessToken);
         if (qwUsersList == null) {
             syncInfo.addFailInfo("浼佷笟寰俊鐢ㄦ埛鍒楄〃鏌ヨ澶辫触锛�");
             return syncInfo;
@@ -398,10 +405,10 @@
              * 2. 鏈湴琛ㄩ噷娌℃湁锛屽氨鍏堢敤鎵嬫満鍙峰垽鏂紝涓嶉�氳繃鍐嶇敤username鍒ゆ柇銆�
              */
             SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE);
-            List<SysUser> collect = sysUsersList.stream().filter(user -> (qwUser.getMobile().equals(user.getPhone()) || qwUser.getUserid().equals(user.getUsername()))
+            List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getUsername())
                                                                 ).collect(Collectors.toList());
 
-            if (collect != null && collect.size() > 0) {
+            if (CollectionUtil.isNotEmpty(collect)) {
                 SysUser sysUserTemp = collect.get(0);
                 // 寰幆鍒版璇存槑鐢ㄦ埛鍖归厤鎴愬姛锛岃繘琛屾洿鏂版搷浣�
                 SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp);
@@ -413,7 +420,7 @@
                     this.syncUserCollectErrInfo(e, qwUser, syncInfo);
                 }
 
-                this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser.getUserid());
+                this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser);
                 // 鏇存柊瀹屾垚锛岀洿鎺ヨ烦鍒颁笅涓�娆″閮ㄥ惊鐜户缁�
             }else{
                 // 娌″尮閰嶅埌鐢ㄦ埛鍒欒蛋鏂板閫昏緫
@@ -425,7 +432,7 @@
                 } catch (Exception e) {
                     this.syncUserCollectErrInfo(e, qwUser, syncInfo);
                 }
-                this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser.getUserid());
+                this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser);
             }
         }
         return syncInfo;
@@ -447,6 +454,20 @@
             sysThirdAccount.setThirdType(THIRD_TYPE);
         }
         sysThirdAccount.setThirdUserId(qwUserId);
+        sysThirdAccountService.saveOrUpdate(sysThirdAccount);
+    }
+
+    private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, User qwUser) {
+        if (sysThirdAccount == null) {
+            sysThirdAccount = new SysThirdAccount();
+            sysThirdAccount.setThirdUserId(qwUser.getUserid());
+            sysThirdAccount.setRealname(qwUser.getName());
+            sysThirdAccount.setThirdUserUuid(qwUser.getUserid());
+            sysThirdAccount.setStatus(1);
+            sysThirdAccount.setDelFlag(0);
+            sysThirdAccount.setThirdType(THIRD_TYPE);
+        }
+        sysThirdAccount.setSysUserId(sysUserId);
         sysThirdAccountService.saveOrUpdate(sysThirdAccount);
     }
 
@@ -643,22 +664,23 @@
         if (oConvertUtils.isEmpty(sysUser.getWorkNo())) {
             sysUser.setWorkNo(qwUser.getUserid());
         }
-        try {
-            sysUser.setSex(Integer.parseInt(qwUser.getGender()));
-        } catch (NumberFormatException ignored) {
-        }
+        //浼佷笟寰俊鎺ュ彛鏇存柊鍚庯紝涓嶅湪杩斿洖 鎬у埆銆侀偖绠便�佹墜鏈哄彿鐮� 瀛楁
+        //try {
+        //    sysUser.setSex(Integer.parseInt(qwUser.getGender()));
+        //} catch (NumberFormatException ignored) {
+        //}
         // 鍥犱负鍞竴閿害鏉熺殑鍘熷洜锛屽鏋滃師鏁版嵁鍜屾棫鏁版嵁鐩稿悓锛屽氨涓嶆洿鏂�
-        if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) {
-            sysUser.setEmail(qwUser.getEmail());
-        } else {
-            sysUser.setEmail(null);
-        }
+        //if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) {
+        //    sysUser.setEmail(qwUser.getEmail());
+        //} else {
+        //    sysUser.setEmail(null);
+        //}
         // 鍥犱负鍞竴閿害鏉熺殑鍘熷洜锛屽鏋滃師鏁版嵁鍜屾棫鏁版嵁鐩稿悓锛屽氨涓嶆洿鏂�
-        if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) {
-            sysUser.setPhone(qwUser.getMobile());
-        } else {
-            sysUser.setPhone(null);
-        }
+        //if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) {
+        //    sysUser.setPhone(qwUser.getMobile());
+        //} else {
+        //    sysUser.setPhone(null);
+        //}
 
         // 鍚敤/绂佺敤鎴愬憳锛堢姸鎬侊級锛岃鍒欎笉鍚岋紝闇�瑕佽浆鎹�
         // 浼佷笟寰俊瑙勫垯锛�1琛ㄧず鍚敤鎴愬憳锛�0琛ㄧず绂佺敤鎴愬憳
@@ -822,7 +844,7 @@
             String userId = announcement.getUserIds();
             String[] userIds = null;
             if(oConvertUtils.isNotEmpty(userId)){
-                userIds = userId.substring(0, (userId.length() - 1)).split(",");
+                userIds = userId.substring(0, userId.length()).split(",");
             }else{
                 LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId());
@@ -857,7 +879,126 @@
         return JwMessageAPI.sendTextCardMessage(textCard, accessToken);
     }
 
-    private String getTouser(String origin, boolean toAll) {
+    /**
+     * 鍙戦�佹ā鏉垮崱鐗囨秷鎭紙涓氬姟娴佺▼璋冪敤姝ゆ柟娉曪級
+     * @param templateCard
+     * @param verifyConfig
+     * @return
+     */
+    public JSONObject sendTemplateCardMsg(TemplateCard templateCard, boolean verifyConfig) {
+        if (verifyConfig && !thirdAppConfig.isWechatEnterpriseEnabled()) {
+            return null;
+        }
+        String accessToken = this.getAppAccessToken();
+        if (accessToken == null) {
+            return null;
+        }
+        templateCard.setAgentid(thirdAppConfig.getWechatEnterprise().getAgentIdInt());
+        return MessageAPI.sendTemplateCardMessage(templateCard, accessToken);
+    }
+
+    /**
+     * 鍙戦�佹ā鏉垮崱鐗囨秷鎭紙娑堟伅娴嬭瘯璋冪敤姝ゆ柟娉曪級
+     *
+     * @return
+     */
+    public JSONObject sendTemplateCardMsg(SysAnnouncement announcement, boolean verifyConfig) {
+        if (verifyConfig && !thirdAppConfig.isWechatEnterpriseEnabled()) {
+            return null;
+        }
+        String accessToken = this.getAppAccessToken();
+        if (accessToken == null) {
+            return null;
+        }
+
+        TemplateCard templateCard = new TemplateCard();
+        templateCard.setAgentid(thirdAppConfig.getWechatEnterprise().getAgentIdInt());
+        boolean isToAll = CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType());
+        String usernameString = "";
+        if (!isToAll) {
+            // 灏唘serId杞负username
+            String userId = announcement.getUserIds();
+            String[] userIds = null;
+            if (oConvertUtils.isNotEmpty(userId)) {
+                userIds = userId.substring(0, userId.length()).split(",");
+            } else {
+                LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId());
+                SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper);
+                userIds = new String[]{sysAnnouncementSend.getUserId()};
+            }
+
+            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(SysUser::getId, userIds);
+            List<SysUser> userList = userMapper.selectList(queryWrapper);
+            List<String> usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList());
+            usernameString = String.join(",", usernameList);
+        }
+        templateCard.setTouser(this.getTouser(usernameString, isToAll));
+
+        TemplateCardEntity templateCardEntity = new TemplateCardEntity();
+        templateCard.setTemplate_card(templateCardEntity);
+        templateCardEntity.setTask_id(UUID.randomUUID().toString().replaceAll("-", ""));
+        TemplateCardEntity.Source source = new TemplateCardEntity.Source();
+        source.setIcon_url("https://www.jeecg.org/logo.png");
+        source.setDesc("璁惧绠$悊娴嬭瘯");
+        templateCardEntity.setSource(source);
+        TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle();
+        mainTitle.setTitle("璁惧鍛ㄤ繚");
+        //mainTitle.setDesc("璁惧鍛ㄤ繚淇℃伅");
+        templateCardEntity.setMain_title(mainTitle);
+        templateCardEntity.setSub_title_text("璁惧鍛ㄤ繚娴佺▼璇︽儏");
+        List<TemplateCardEntity.HorizontalContent> horizontalContentList = getHorizontalContents();
+        templateCardEntity.setHorizontal_content_list(horizontalContentList);
+        TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction();
+        cardAction.setType(1);
+        cardAction.setUrl("https://houjie.xalxzn.com:8866/h5");
+        templateCardEntity.setCard_action(cardAction);
+        TemplateCardEntity.ActionMenu actionMenu = new TemplateCardEntity.ActionMenu();
+        actionMenu.setDesc("鏇村");
+        actionMenu.setAction_list(cn.hutool.core.collection.CollectionUtil
+                .newArrayList(new TemplateCardEntity.ActionMenu.ActionList("鎺ユ敹鎺ㄩ��", "A"),
+                        new TemplateCardEntity.ActionMenu.ActionList("涓嶅啀鎺ㄩ��", "B")));
+        templateCardEntity.setAction_menu(actionMenu);
+        //templateCardEntity.setJump_list(cn.hutool.core.collection.CollectionUtil
+        //        .newArrayList(new TemplateCardEntity.Jump(1, "浼佷笟寰俊瀹樼綉", "https://work.weixin.qq.com")));
+        //TemplateCardEntity.CardImage cardImage = new TemplateCardEntity.CardImage();
+        //cardImage.setUrl("https://www.jeecg.org/logo.png");
+        //templateCardEntity.setCard_image(cardImage);
+        return MessageAPI.sendTemplateCardMessage(templateCard, accessToken);
+    }
+
+    @NotNull
+    private static List<TemplateCardEntity.HorizontalContent> getHorizontalContents() {
+        List<TemplateCardEntity.HorizontalContent> horizontalContentList = new ArrayList<>();
+        TemplateCardEntity.HorizontalContent content1 = new TemplateCardEntity.HorizontalContent();
+        content1.setKeyname("娴佺▼鎻忚堪");
+        content1.setValue("宸ュ崟鍙�:WMCR2025050011;璁惧缂栧彿:031-41杩涜璁惧鍛ㄤ繚");
+        horizontalContentList.add(content1);
+        TemplateCardEntity.HorizontalContent content2 = new TemplateCardEntity.HorizontalContent();
+        content2.setKeyname("涔嬪墠澶勭悊浜�");
+        content2.setValue("绠$悊鍛�");
+        horizontalContentList.add(content2);
+        TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent();
+        content3.setKeyname("鍓嶉┍鑺傜偣");
+        content3.setValue("鍛ㄤ繚棰嗗彇");
+        horizontalContentList.add(content3);
+        TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent();
+        content4.setKeyname("褰撳墠鑺傜偣");
+        content4.setValue("鍛ㄤ繚鎵ц");
+        horizontalContentList.add(content4);
+        TemplateCardEntity.HorizontalContent content5 = new TemplateCardEntity.HorizontalContent();
+        content5.setKeyname("宸ュ崟鍙�");
+        content5.setValue("WMCR2025050011");
+        horizontalContentList.add(content5);
+        TemplateCardEntity.HorizontalContent content6 = new TemplateCardEntity.HorizontalContent();
+        content6.setKeyname("璁惧缂栧彿");
+        content6.setValue("031-41");
+        horizontalContentList.add(content6);
+        return horizontalContentList;
+    }
+
+    public String getTouser(String origin, boolean toAll) {
         if (toAll) {
             return "@all";
         } else {

--
Gitblit v1.9.3