Houjie
2025-07-09 c0948102eda828d4eae62d18392adaca56e345e0
Merge remote-tracking branch 'origin/master'
已修改9个文件
757 ■■■■■ 文件已修改
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamInspectionOrderServiceImpl.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamWeekMaintenanceOrderServiceImpl.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java 183 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
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;
    }
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;
    }
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);
}
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
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("企业微信同步功能已禁用");
    }
    /**
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);
}
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(","));
    }
}
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) {
            // 将userId转为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 {