yangys
2025-08-06 053a438acf9ec33e182b25211ce8108f0367feac
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
 
package org.springblade.mdm.flow.service;
 
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.RuntimeService;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.api.IResultCode;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.mapper.FlowProgramFileMapper;
import org.springblade.mdm.flow.vo.ProgramUploadVO;
import org.springblade.mdm.utils.FileContentUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
 
/**
 * 流程程序处理,包括上传,查询展示
 *
 * @author yangys
 */
@Slf4j
@Service
public class FlowProgramFileService extends BizServiceImpl<FlowProgramFileMapper, FlowProgramFile> {
    @Autowired
    private OssTemplate ossTemplate;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private FlowCommonService flowCommonService;
 
    /**
     * 上传程序徐文件(编制节点调用)
     * @param uploadVO 上传对象
     */
    public void uploadFlowProgramFile(ProgramUploadVO uploadVO) {
 
        FlowProgramProperties progProps= flowCommonService.getProgramProperties(uploadVO.getProcessInstanceId());
        MultipartFile file = uploadVO.getFile();
        if(file.getSize() == 0){
            throw new ServiceException("程序文件不可为空文件");
        }
        checkFilename(file.getOriginalFilename(),progProps);
 
        String programName = getProgramName(progProps);
 
        BladeFile bfile = ossTemplate.putFile(file);
 
        FlowProgramFile progFile = new FlowProgramFile();
        progFile.setName(file.getOriginalFilename());
        progFile.setOssName(bfile.getName());
        progFile.setProcessInstanceId(uploadVO.getProcessInstanceId());
        progFile.setIsCured(0);
        progFile.setProgramName(programName);
 
        save(progFile);
 
    }
 
    /**
     * 获取程序名称
     * @param progProps
     * @return
     */
    String getProgramName(FlowProgramProperties progProps){
        return progProps.getDrawingNo()+"-"+progProps.getProcessNo();
    }
 
    /**
     * 检查文件名合法性
     * @param filename 文件名
     * @param programProperties 程序属性,发起时填写的
     */
    void checkFilename(String filename,FlowProgramProperties programProperties){
        //程序名称:零件号加工序号,文件名应该以此开头
        String expectedProgramName = programProperties.getDrawingNo()+"-"+programProperties.getProcessNo();
        if(!StringUtils.startsWith(filename,expectedProgramName)){
 
            IResultCode rc = new IResultCode() {
                @Override
                public String getMessage() {
                    return "程序文件名不合法,应为:"+expectedProgramName+"-"+programProperties.getCraftEdition()+"-[段数]-[段号].[文件扩展名]";
                }
 
                @Override
                public int getCode() {
                    return 1;
                }
            };
            throw new ServiceException(rc);
            //throw new ServiceException("程序文件名不合法,应为:"+expectedProgramName+"-"+programProperties.getCraftEdition()+"-[段数]-[段号].[文件扩展名]");
        }
 
        //截取后面的段数和第几段
        String endPart = StringUtils.removeStart(filename,expectedProgramName+"-"+programProperties.getCraftEdition()+"-");
 
        //去掉扩展名
        if(endPart.contains(".")){
            endPart = endPart.substring(0,endPart.indexOf("."));
        }
 
        int sepCount = StringUtils.countMatches(endPart,"-");
        if(sepCount != 1){//- 号应该是1个
            IResultCode rc = new IResultCode() {
                @Override
                public String getMessage() {
                    return "程序文件名不合法,应为:"+expectedProgramName+"-"+programProperties.getCraftEdition()+"-[段数]-[段号].[文件扩展名]";
                }
 
                @Override
                public int getCode() {
                    return 2;
                }
            };
            throw new ServiceException(rc);
            //throw new ServiceException("程序文件名不合法,应为:"+expectedProgramName+"-"+programProperties.getCraftEdition()+"-[段数]-[段号].[文件扩展名]");
        }
 
        String[] arr = StringUtils.split(endPart,"-");
        if(!StringUtils.isNumeric(arr[0]) || Func.toInt(arr[0]) >99 || Func.toInt(arr[0]) < 1){
            IResultCode rc = new IResultCode() {
                @Override
                public String getMessage() {
                    return "程序段数不合法,应为两位以内整数";
                }
 
                @Override
                public int getCode() {
                    return 3;
                }
            };
            throw new ServiceException(rc);
        }
        int segCount = Func.toInt(arr[0]);
 
        if(!StringUtils.isNumeric(arr[1]) || Func.toInt(arr[1]) < 1 || Func.toInt(arr[1]) > segCount){
            IResultCode rc = new IResultCode() {
                @Override
                public String getMessage() {
                    return "程序段号不合法,应为两位以内整数且小于等于段数。";
                }
 
                @Override
                public int getCode() {
                    return 4;
                }
            };
            throw new ServiceException(rc);
        }
    }
 
    /**
     * 获取文件内容
     * @param id 文件id
     * @return 文件内容文本
     */
    public String getFileContent(Long id) {
        String result  ="";
 
        FlowProgramFile programFile = this.getById(id);
        /*
            String fileName = programFile.getOssName();
            try (InputStream inputStream = ossTemplate.statFileStream(fileName)) {
                result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        */
 
        String fileName = programFile.getOssName();
        try (InputStream inputStream = ossTemplate.statFileStream(fileName)) {
            result = FileContentUtil.getContentFromStream(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
 
        return result;
    }
 
    /**
     * 验证程序文件的完整性,仅在编制节点使用
     * @param processInstanceId 流程实例id
     */
    public void checkProgramFiles(String processInstanceId,boolean isPass) {
        List<FlowProgramFile> flowPrograms = this.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, processInstanceId).orderByAsc(FlowProgramFile::getCreateTime).list();
        if(isPass && flowPrograms.isEmpty()){
            throw new ServiceException("请上传程序文件");
        }
        int totalSeg = 0;
        if(!flowPrograms.isEmpty()){
            FlowProgramFile progFile = flowPrograms.get(0);
            totalSeg = getProgramSegCount(progFile.getName());
        }
 
        if(totalSeg != flowPrograms.size()){
            throw new ServiceException("应上传"+totalSeg+"段程序,实际上传"+flowPrograms.size()+"段");
        }
 
 
    }
 
    /**
     * 根据文件名获取程序总段树
     * @param filename 文件名
     * @return
     */
    int getProgramSegCount(String filename){
        int idx = filename.lastIndexOf(".");
        String tempstr = filename.substring(0,idx);//去掉扩展名
        //System.out.println(tempstr);
        idx = tempstr.lastIndexOf("-");
        tempstr = tempstr.substring(0,idx);
        //System.out.println(tempstr);
        idx = tempstr.lastIndexOf("-");
        tempstr = tempstr.substring(idx+1);
        //System.out.println(tempstr);
        return Func.toInt(tempstr);
    }
}