yangys
2025-08-11 b5b668d2728665ca05d15be8862ceb0a2796fc67
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
package org.springblade.mdm.flow.task.cure;
 
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.DelegateExecution;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.commons.contants.ParamContants;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.service.NcNodeAutoCreateService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.system.feign.ISysClient;
import org.springframework.stereotype.Component;
 
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
 
@Slf4j
@Component("cureFinishOperateTask")
@AllArgsConstructor
public class CureFinishOperateTask {
    private final NcNodeService nodeService;
    private final NcNodeAutoCreateService ncNodeAutoCreateService;
    private final FlowCommonService flowCommonService;
    private final ISysClient sysClient;
    /**
     * 默认有效期间(月数),2年
     */
    private static final int DEFAULT_VALID_MONTH = 24;
    /**
     * 固化审批通过处理任务,
     * @param execution 流程execution
     */
    public void execute(DelegateExecution execution) {
        log.info("执行固化程序任务服务,流程实例id={}", execution.getProcessInstanceId());
        //固化程序检查有效期,
        //1.将流程设置
        dealWithNode(execution.getProcessInstanceId());
    }
 
    /**
     * 处理node状态。
     * @param processInstanceId 流程实例id
     */
    void dealWithNode(String processInstanceId) {
        //程序包节点和下属程序节点(包括历史节点非最新版本的)从试切挪到固化下面
        //程序包节点 设置未已固化
        NcNode pkgNode =  nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId, processInstanceId).one();
        if(pkgNode.isDeviationProgram()){
            //偏离的程序直接锁定
            pkgNode.setIsLocked(1);
            nodeService.updateById(pkgNode);
        }else {
            pkgNode.setIsCured(1);
            //设置过期日期
            pkgNode.setExpireDate(calculateExpireDate());
            nodeService.updateById(pkgNode);
 
            List<NcNode> historyProgramPackageNodes = nodeService.getNodeHistory(pkgNode);
            moveNodeToCuredTree(pkgNode, historyProgramPackageNodes, flowCommonService.getProgramProperties(processInstanceId));
        }
    }
 
    /**
     * 将节点和历史节点挪动到固化的同级节点下
     * @param historyProgramPackageNodes 程序包名 历史节点
     */
    void moveNodeToCuredTree(NcNode pkgNode,List<NcNode> historyProgramPackageNodes, FlowProgramProperties programProperties) {
        //创建节点到机床级别.(固化树)
        NcNode machineNode = ncNodeAutoCreateService.createNodeTreeToMachine(programProperties);
 
        //移动到固化树下的机床节点下层
        //String newParentIds = machineNode.getParentIds()+","+machineNode.getId();
 
        //更新机床 下属节点的数据 为旧版本,锁定(最新版本=0,lock=1).
        /*
        this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, newParentIds)
            .in(NcNode::getNodeType, Arrays.asList(NcNode.TYPE_PROGRAM_PACKAGE,NcNode.TYPE_PROGRAM_FILE))
            .set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
         */
        //机床下现在没有文件了,程序包名升级与机床同级了,改为找到机床同级程序包名更新了
        this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, machineNode.getParentIds())
            .in(NcNode::getNodeType, Arrays.asList(NcNode.TYPE_PROGRAM_PACKAGE,NcNode.TYPE_PROGRAM_FILE))
            .set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
 
        for(NcNode hisPackageNode : historyProgramPackageNodes){
            if(!hisPackageNode.getId().equals(pkgNode.getId())){
                hisPackageNode.setIsLastEdition(0);
            }
            hisPackageNode.setParentId(machineNode.getId());
            hisPackageNode.setParentIds(machineNode.getParentIds());//程序包与机床节点同级
 
            //处理程序包下层的程序节点
            List<NcNode> programNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,hisPackageNode.getId()).list();
            for(NcNode programNode : programNodes){
                programNode.setParentIds(hisPackageNode.getParentIds()+","+hisPackageNode.getId());
            }
            nodeService.updateBatchById(programNodes);
        }
        nodeService.updateBatchById(historyProgramPackageNodes);
 
    }
 
    /**
     * 计算有效期
     * @return
     */
    private Date calculateExpireDate() {
        R<String> validMonResult = sysClient.getParamValue(ParamContants.CURE_VALID_MONTH_KEY);
 
        int month = DEFAULT_VALID_MONTH;
        if(validMonResult.isSuccess() && validMonResult.getData()!=null){
            month = Integer.parseInt(validMonResult.getData());
        }
 
        LocalDate now = LocalDate.now();
        return DateUtil.toDate(now.plusMonths(month));
    }
 
}