yangys
2025-08-10 8318e40770d53c87e2d5921d2d11f8de47c61e76
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
 
package org.springblade.mdm.program.service;
 
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.mapper.NcNodeMapper;
import org.springblade.mdm.program.vo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
 
/**
 * 程序节点
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class NcNodeService extends BizServiceImpl<NcNodeMapper, NcNode> {
 
 
    public void saveNcCode(NcNodeVO vo) {
        NcNode ncNode = new NcNode();
 
        BeanUtils.copyProperties(vo, ncNode);
        ncNode.setId(null);
        ncNode.setParentIds(buildParentIds(vo.getParentId()));
 
        this.save(ncNode);
    }
 
    /**
     * 构建父id节点
     * @param nodeId 节点id
     * @return
     */
    String buildParentIds(long nodeId){
        if(nodeId == 0L){
            return "0";
        }
        NcNode pNode = this.baseMapper.selectById(nodeId);
 
        return pNode.getParentIds()+","+pNode.getId();
    }
    /**
     * 更新节点
     * @param vo
     */
    public void updateNcNode(NcNodeVO vo) {
        NcNode ncNode = this.getById(vo.getId());
        ncNode.setName(vo.getName());
        ncNode.setNodeType(vo.getNodeType());
        ncNode.setDescription(vo.getDescription());
        ncNode.setRemark(vo.getRemark());
        ncNode.setMachineCode(vo.getMachineCode());
        ncNode.setParentIds(buildParentIds(vo.getParentId()));
 
        this.updateById(ncNode);
    }
 
    /**
     * 懒加载列表
     * @param parentId 父节点ID
     * @return
     */
    public List<NcNodeVO> lazyList(Long parentId) {
        // 判断点击搜索但是没有查询条件的情况
        if (Func.isEmpty(parentId)) {
            parentId = 0L;
        }
 
        return baseMapper.lazyList(parentId);
    }
 
 
    /**
     * 查询现有固化的程序,暂定条件:零组件号相同,且是同一机床组
     *      * @param name 程序名称
     * @param name
     * @return
     */
    public NcNode getLastProgramNode(String name) {
        return this.getBaseMapper().getLastProgramNode(name);
    }
 
 
    /**
     * 首页树查询
     * @param queryVO
     * @return
     */
    public List<NcNodeVO> searchList(NcNodeQueryVO queryVO) {
        //1.根据关进字和节点类型查询初始列表,查询的原始列表,需要hasChild字段,所以使用mapper.xml
        List<NcNodeVO> oriList = this.getBaseMapper().searchList(queryVO);
        if ("10".equals(queryVO.getNodeType())) {
            //搜索的根级别,直接返回
            return oriList;
        }
 
        List<NcNodeVO> allVos = new ArrayList<NcNodeVO>();//已经加入过的节点,用于去重
        List<NcNodeVO> rootVos = new ArrayList<NcNodeVO>();
 
        //List<NcNode> rootNodes = new ArrayList<>();
 
        for(NcNodeVO vo : oriList){
            allVos.add(vo);
            //上级各级的节点
            List<NcNodeVO> parents = this.getBaseMapper().searchListInIds(Func.toLongList(vo.getParentIds()));
 
            for(NcNodeVO pvo : parents){
                if(pvo.getParentId() == 0L){
                    rootVos.add(pvo);
                }
                allVos.add(pvo);
            }
        }
        for(NcNodeVO root : rootVos){
            addNodeChildren(root, allVos);
 
        }
        return rootVos;
    }
 
    void addNodeChildren(NcNodeVO node, List<NcNodeVO> allNodes) {
        for(NcNodeVO vo : allNodes){
            if(Objects.equals(vo.getParentId(), node.getId())){
                node.addChildren(vo);
            }
        }
 
        if(node.getChildren()!=null && !node.getChildren().isEmpty()){
            for(NcNodeVO child : node.getChildren()){
                addNodeChildren(child, allNodes);
            }
        }
    }
 
    NcNodeVO toNodeVO(NcNode node){
        NcNodeVO vo = new NcNodeVO();
 
        BeanUtils.copyProperties(node, vo);
 
        return vo;
    }
 
    /**
     * 获取程序包名的数据
     * @param programName 程序名称(程序包名)
     * @return 程序报包名的节点
     */
    public NcNode getProgramPackageByName(String programName) {
        List<NcNode> pkgs = this.lambdaQuery().eq(NcNode::getName, programName)
            .eq(NcNode::getIsLastEdition,1)
            .eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE).list();
        if(pkgs.isEmpty()){
            return null;
        }else{
            return pkgs.get(0);
        }
 
    }
 
    /**
     * 查询节点的历史列表(节点的上级节点”程序包名“因为存在多个版本,所以历史记录也需要根据不同版本程序包名进行查询)
     * @param id
     * @return
     */
    @Transactional(readOnly = true)
    public List<NcNodeVO> historyByNodeId(Long id) {
        NcNode node = this.getById(id);
        NcNode parentNode = this.getById(node.getParentId());
        return this.baseMapper.historyByParentIdAndName(node.getName(),parentNode);
    }
 
    /**
     * 获取“程序包名”试切的最新版本
     * @param name 节点名称
     * @return 最新版本程序报名节点
     */
    public NcNode getLastEditionTryingProgramPackage(String name){
        //.or(NcNode::getIsCured,0)
        List<NcNode> pkgList = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, name).and(i->{
                i.eq(NcNode::getIsCured, 0).or().isNull(NcNode::getIsCured);
            }).likeRight(NcNode::getParentIds,"0,1,")
            .eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();
 
        if(pkgList.isEmpty()){
            return null;
        }else{
            return pkgList.get(0);
        }
    }
 
    /**
     * 根据父节点和名称,查询文件界节点列表
     * @param name 节点/文件名称
     * @param parentId 父节点id
     */
    public NcNode getLastEditionProgramFile(String name,Long parentId) {
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_FILE)
            .eq(NcNode::getName, name).eq(NcNode::getParentId,parentId)
            .eq(NcNode::getIsLastEdition,1).list();
        if(nodes.isEmpty()){
            return null;
        }else {
            return nodes.get(0);
        }
    }
 
    /**
     * 获取node的历史列表(同一个父节点下,同名的所有节点)
     * @param pkgNode node
     * @return 历史列表,报错节点本身
     */
    public List<NcNode> getNodeHistory(NcNode pkgNode) {
        return this.lambdaQuery().eq(NcNode::getParentId,pkgNode.getParentId())
            .eq(NcNode::getName,pkgNode.getName()).list();
    }
 
    /**
     * 生成程序包名/程序名称
     * @param drawingNo 零组件号
     * @param processNo 工序版次
     * @return 程序包名/程序名称
     */
    public static String genProgramName(String drawingNo,String processNo){
        return drawingNo+"-"+processNo;
    }
 
    /**
     * 获取最新版本的 已固化节点
     * @param programPkgName
     * @return
     */
    public NcNode getLastEditionCuredProgramPackage(String programPkgName) {
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName).eq(NcNode::getIsCured,1)
            .eq(NcNode::getIsLastEdition,1).list();
 
        if(nodes.isEmpty()){
            return null;
        }else {
            return nodes.get(0);
        }
    }
 
    /**
     * 根据流程实例id获取node节点,都是程序包节点
     * @param processInstanceId 流程实例id
     * @return 对应额系欸但那
     */
    public NcNode getByProcessInstanceId(String processInstanceId) {
        Optional<NcNode> nodeOpt = this.lambdaQuery().eq(NcNode::getProcessInstanceId,processInstanceId).oneOpt();
        return nodeOpt.orElse(null);
    }
 
    /**
     * 物理删除节点id下的子节点(性能考虑,否则数据太多)
     * @param nodeId 节点id
     */
    public void deleteSubNodes(Long nodeId) {
        this.baseMapper.deleteSubNodes(nodeId);
    }
 
    /**
     * 获取程序包下所有层序文件节点
     * @param packageNodeId 程序包名 节点id
     * @return 包下属的程序文件
     */
    public List<NcNode> getProgramFilesByPackageId(Long packageNodeId) {
        return this.lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_FILE)
            .eq(NcNode::getParentId,packageNodeId).eq(NcNode::getIsLastEdition,1).list();
    }
 
    /**
     * 升级版本号(+1)
     * @param nodeId 节点id
     */
    @Transactional
    public void upgradeVersionNumber(Long nodeId) {
        NcNode node = this.getById(nodeId);
        node.upgradeVersionNUmber();
        this.updateById(node);
 
    }
}