1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package org.jeecg.modules.eam.job;
 
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.WeekMaintenanceStatusEnum;
import org.jeecg.modules.eam.entity.EamWeekMaintenanceOrder;
import org.jeecg.modules.eam.service.IEamWeekMaintenanceOrderService;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.quartz.entity.QuartzJob;
import org.jeecg.modules.quartz.entity.SysQuartzLog;
import org.jeecg.modules.quartz.service.IQuartzJobService;
import org.jeecg.modules.quartz.service.ISysQuartzLogService;
import org.jeecg.modules.qywx.message.vo.TemplateCard;
import org.jeecg.modules.qywx.message.vo.TemplateCardEntity;
import org.jeecg.modules.system.entity.MdcProduction;
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.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * 待领取周保工单企业微信消息推送定时任务
 */
@Slf4j
@Component
public class WeekMaintenanceOrderWxMessageSendJob implements Job {
 
    @Autowired
    private IEamWeekMaintenanceOrderService eamWeekMaintenanceOrderService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
    @Autowired
    private ISysQuartzLogService sysQuartzLogService;
    @Autowired
    private IQuartzJobService quartzJobService;
    @Autowired
    private IMdcProductionService mdcProductionService;
 
    @Value("${wechatEnterprise.cardActionUrl}")
    private String cardActionUrl;
 
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info("待周保工单企业微信消息推送任务开始执行,时间:{}", DateUtils.now());
        //任务日志
        SysQuartzLog quartzLog = new SysQuartzLog();
        quartzLog.setCreateTime(new Date());
        List<QuartzJob> byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName());
        if (byJobClassName != null && !byJobClassName.isEmpty()) {
            quartzLog.setJobId(byJobClassName.get(0).getId());
        }
        long startTime = System.currentTimeMillis();
        try {
            //查询所有待保养的周保工单
            List<EamWeekMaintenanceOrder> unReceivedOrderList = eamWeekMaintenanceOrderService.selectUnReceivedMaintenanceOrder();
            if (!unReceivedOrderList.isEmpty()) {
                //有待保养的工单,推送企业微信消息
                Map<String, List<EamWeekMaintenanceOrder>> unReceivedOrderMap = unReceivedOrderList.stream()
                        .collect(Collectors.groupingBy(EamWeekMaintenanceOrder::getOrgId));
                Set<String> productionIds = selectTwoLevelProductionIds(unReceivedOrderMap.keySet());
                StringBuilder message = new StringBuilder();
                for (String orgId : productionIds) {
                    //查询该产线下的所有操作工
                    List<UserSelector> userSelectorList = sysUserService.selectOperatorList(null, orgId, BusinessCodeConst.PCR0001);
                    if (userSelectorList.isEmpty()) {
                        log.error("id为:{},的产线未配置操作工用户,无法推送周保工单领取提醒消息", orgId);
                        message.append("id为: ").append(orgId).append(" 的产线未配置操作工用户,无法推送周保工单领取提醒消息").append("\n");
                    } else {
                        String toUsers = userSelectorList.stream().map(UserSelector::getUsername).collect(Collectors.joining(","));
                        String touser = wechatEnterpriseService.getTouser(toUsers, false);
                        //构造消息体内容
                        TemplateCard templateCard = new TemplateCard();
                        templateCard.setTouser(touser);
                        TemplateCardEntity templateCardEntity = new TemplateCardEntity();
                        templateCard.setTemplate_card(templateCardEntity);
                        templateCardEntity.setTask_id(UUID.randomUUID().toString().replaceAll("-", ""));
                        TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle();
                        mainTitle.setTitle("设备周保");
                        templateCardEntity.setMain_title(mainTitle);
                        templateCardEntity.setSub_title_text("您有待领取周保工单,请进入系统领取");
                        TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction();
                        cardAction.setType(1);
                        cardAction.setUrl(cardActionUrl);
                        templateCardEntity.setCard_action(cardAction);
                        JSONObject jsonObject = wechatEnterpriseService.sendTemplateCardMsg(templateCard, true);
                        Integer errcode = (Integer) jsonObject.get("errcode");
                        if (errcode == 0) {
                            log.info("推送待领取周保工单企业微信消息成功,{}", jsonObject.toJSONString());
                            message.append("推送待领取周保工单企业微信消息成功,").append(jsonObject.toJSONString()).append("\n");
                        } else {
                            log.error("推送待领取周保工单企业微信消息失败,{}", jsonObject.toJSONString());
                            message.append("推送待领取周保工单企业微信消息失败,").append(jsonObject.toJSONString()).append("\n");
                        }
                    }
                }
                quartzLog.setIsSuccess(0);
                quartzLog.setExceptionDetail(message.toString());
            } else {
                log.info("无待领取周保工单,无需推送工单领取提醒消息");
                quartzLog.setIsSuccess(0);
                quartzLog.setParams("无待领取周保工单,无需推送工单领取提醒消息");
            }
        } catch (Exception e) {
            log.error("待周保工单企业微信消息推送任务执行失败,{}", e.getMessage(), e);
            quartzLog.setIsSuccess(-1);
            quartzLog.setExceptionDetail(ThrowableUtil.getStackTrace(e));
        }
        long endTime = System.currentTimeMillis();
        quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime)));
        sysQuartzLogService.save(quartzLog);
    }
 
    //如果当前产线是三级,查询对应二级产线,如果不是不做处理
    private Set<String> selectTwoLevelProductionIds(Set<String> productionIds) {
        Set<String> result = new HashSet<>();
        List<MdcProduction> mdcProductionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().in(MdcProduction::getId, productionIds));
        for (MdcProduction production : mdcProductionList) {
            //如果是三级产线,查找对应的二级产线,添加进结果集
            if ("3".equals(production.getOrgType())) {
                mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>()
                        .eq(MdcProduction::getId, production.getParentId())
                        .eq(MdcProduction::getOrgType, "2"))
                        .stream().findFirst().ifPresent(mdcProduction -> result.add(mdcProduction.getId()));
            }
            //如果是二级产线,添加进结果集
            if ("2".equals(production.getOrgType())) {
                result.add(production.getId());
            }
        }
        return result;
    }
}