whyclxw
3 天以前 29aed8c1fde9c1fc6d248ba8028914e038442306
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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
package com.whyc.service;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.Response;
import com.whyc.mapper.TechnicalSpecificationMapper;
import com.whyc.pojo.TechnicalSpecification;
import com.whyc.pojo.TechnicalSpecificationLockLog;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
 
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
 
@Service
public class TechnicalSpecificationService {
    @Resource
    private TechnicalSpecificationMapper mapper;
 
    @Autowired
    private DocUserService userService;
 
    @Autowired
    private ProductHistoryService productHistoryService;
 
    @Autowired
    private TechnicalSpecificationLockLogService lockLogService;
 
    public Response<Object> excelParse(InputStream inputStream) throws IOException, InvalidFormatException, ParseException {
        TechnicalSpecification specification = new TechnicalSpecification();
 
        Workbook workbook = null;
        workbook = WorkbookFactory.create(inputStream);
        inputStream.close();
        //取第一个sheet表
        Sheet sheet = workbook.getSheetAt(0);
        /*int lastRowNum = sheet.getLastRowNum();
        //校准lastRowNum
        for (int i = 8; i <= lastRowNum; i++) {
            if(sheet.getRow(i).getCell(1).getStringCellValue().equals("发布说明")){
                lastRowNum = i;
                break;
            }
        }*/
        //这里是固定的行8
        int lastRowNum = 8;
        //取固定部分值
        specification.setFileName(sheet.getRow(2).getCell(2).getStringCellValue());
        String typeStr = sheet.getRow(3).getCell(2).getStringCellValue();
        String[] typeArr = typeStr.split(" ");
        for (int i = 0; i < typeArr.length; i++) {
            //excel单元格中的✔对应字符,这里是R不是þ
            if(typeArr[i].startsWith("R")){
                specification.setType(typeArr[i].replace("R","").trim());
                break;
            }
        }
        specification.setVersion(sheet.getRow(4).getCell(2).getStringCellValue());
        specification.setBasedVersion(sheet.getRow(4).getCell(4).getStringCellValue());
 
        specification.setOwner(sheet.getRow(5).getCell(2).getStringCellValue());
        Cell cellFilingDate = sheet.getRow(5).getCell(4);
        if(cellFilingDate.getCellType() == Cell.CELL_TYPE_NUMERIC){
            Date dateCellValue = cellFilingDate.getDateCellValue();
            specification.setFilingDate(DateUtil.YYYY_MM_DD.format(dateCellValue));
            System.out.println(dateCellValue);
        }else {
            cellFilingDate.setCellType(Cell.CELL_TYPE_STRING);
            specification.setFilingDate(cellFilingDate.getStringCellValue());
        }
        //最后一行,取发布说明
        specification.setReleaseNotes(sheet.getRow(8).getCell(2).getStringCellValue());
 
        //行num=7是适用机型
        int applyModelNum = 7;
        //取第3列,第5列
        Cell cell = sheet.getRow(applyModelNum).getCell(2);
        cell.setCellType(Cell.CELL_TYPE_STRING);
        String stringCellValue = cell.getStringCellValue();
        if(StringUtils.isNotBlank(stringCellValue)){
            specification.setApplyMaterialCode(CommonUtil.codeAutoFill(stringCellValue));
        }
        specification.setApplyModel(sheet.getRow(applyModelNum).getCell(4).getStringCellValue());
        String customCode = sheet.getRow(applyModelNum).getCell(6).getStringCellValue();
        if(StringUtils.isBlank(customCode)){ //如果为空或者空字符串,则统一为""
            customCode = "";
        }
        specification.setApplyCustomCode(customCode);
 
        return new Response().setII(1,true,specification,"文件解析成功");
 
    }
    @Transactional
    public Response upload(MultipartFile file1, MultipartFile file2, TechnicalSpecification specification) throws IOException {
        //附件
        String file1Name = file1.getOriginalFilename();
        //excel
        String file2Name = file2.getOriginalFilename();
        //非空校验: 文件名,文件类型,版本,负责人,归档日期,物料编码,规格型号
        if(
            StringUtils.isBlank(specification.getFileName())
            || StringUtils.isBlank(specification.getType())
            || StringUtils.isBlank(specification.getVersion())
            || StringUtils.isBlank(specification.getOwner())
            || StringUtils.isBlank(specification.getFilingDate())
            || StringUtils.isBlank(specification.getApplyMaterialCode())
            || StringUtils.isBlank(specification.getApplyModel())
        ){
            return new Response().set(1,false,"文件名,文件类型,版本,负责人,归档日期,物料编码,规格型号 中至少有一项为空");
        }
 
        //校验规格书附件名称=说明书中的文件名称+版本号
        String fileNameUnion = specification.getFileName() + specification.getVersion();
        String attachmentName = file1Name.substring(0,file1Name.lastIndexOf("."));
        if(!(fileNameUnion).equals(attachmentName)){
            return new Response().set(1,false,"附件的命名与技术规格书excel内的文件名+版本号称不一致");
        }
        //校验负责人是否存在
        boolean checkExists = userService.checkExists(specification.getOwner());
        if(!checkExists){
            return new Response().set(1,false,"负责人不存在");
        }
        //校验产品是否存在
        boolean productCheckExists = productHistoryService.checkExists(specification.getApplyMaterialCode(), specification.getApplyCustomCode());
        if(!productCheckExists){
            return new Response().set(1,false,"规格书适用机型不存在");
        }
        //是否需要校验相同机型是否存在同版本号的? TODO
 
        Date date = new Date();
        String dateUnion = DateUtil.YYYY_MM_DD_HH_MM_SS_UNION.format(date);
        //文件重命名(严格遵守名称规则的情况下不会重名)
        file1Name = file1Name.substring(0,file1Name.lastIndexOf(".")) + "_" + dateUnion +file1Name.substring(file1Name.lastIndexOf("."));
        file2Name = file2Name.substring(0,file2Name.lastIndexOf(".")) + "_" + dateUnion +file2Name.substring(file2Name.lastIndexOf("."));
        //存储路径
        String rootFile = CommonUtil.getRootFile();
        String specificationDir = rootFile + "technical_specification" + File.separator + specification.getOwner()+ File.separator + specification.getFileName();
        String specificationHttpUrl = specificationDir.substring(specificationDir.lastIndexOf("doc_file"+ File.separator + "technical_specification"));
        File specificationDirFile = new File(specificationDir);
        if(!specificationDirFile.exists()){
            specificationDirFile.mkdirs();
        }
        file1.transferTo(new File(specificationDir+File.separator+file1Name));
        file2.transferTo(new File(specificationDir+File.separator+file2Name));
        //设置路径
 
        specification.setFileUrl(specificationHttpUrl+File.separator+file1Name);
        specification.setExcelUrl(specificationHttpUrl+File.separator+file2Name);
        specification.setCreateTime(date);
        specification.setUploadUser(ActionUtil.getUser().getName());
        //锁定-负责人才能解锁
        specification.setLockFlag(1);
        mapper.insert(specification);
        //锁定适用机型的生效版本
        lockOtherByAppliedProduct(specification);
        //锁定日志
        TechnicalSpecificationLockLog lockLog = new TechnicalSpecificationLockLog();
        lockLog.setUserName("系统");
        lockLog.setTechnicalSpecificationId(specification.getId());
        lockLog.setReason("系统默认锁定,新版本技术规则书上传");
        lockLog.setCreateTime(date);
        lockLog.setStatus(0);
        lockLogService.add(lockLog);
        return new Response().set(1,true,"上传完成");
    }
 
    private void lockOtherByAppliedProduct(TechnicalSpecification specification) {
        //先查询
        QueryWrapper<TechnicalSpecification> query = Wrappers.query();
        query.eq("apply_material_code",specification.getApplyMaterialCode());
        query.eq("apply_custom_code", specification.getApplyCustomCode());
        query.eq("lock_flag",0);
        query.last(" limit 1");
        TechnicalSpecification specificationToBeLocked = mapper.selectOne(query);
        if(specificationToBeLocked !=null){ //存在生效的,需要被锁定
            specificationToBeLocked.setLockFlag(1);
            mapper.updateById(specificationToBeLocked);
            //锁定日志
            TechnicalSpecificationLockLog lockLog = new TechnicalSpecificationLockLog();
            lockLog.setUserName("系统");
            lockLog.setTechnicalSpecificationId(specificationToBeLocked.getId());
            lockLog.setReason("系统默认锁定,新版本技术规则书上传,旧版本锁定");
            lockLog.setCreateTime(new Date());
            lockLog.setStatus(0);
            lockLogService.add(lockLog);
        }
 
 
        UpdateWrapper<TechnicalSpecification> update = Wrappers.update();
        update.set("lock_flag",1);
        //update.set("lock_reason","系统默认锁定,新版本技术规则书上传,旧版本锁定");
        update.eq("apply_material_code",specification.getApplyMaterialCode());
        update.eq("apply_custom_code", specification.getApplyCustomCode());
 
        update.eq("lock_flag",0);
        update.last(" limit 1");
 
        mapper.update(null,update);
    }
 
    @Transactional
    public Response updateLock(int id, int lockFlag, String reason) {
        Date date = new Date();
        String userName = ActionUtil.getUser().getName();
        TechnicalSpecification specificationInDB = get(id);
        if(!userName.equals(specificationInDB.getOwner())){
            return new Response().set(1,false,"非负责人无法解锁");
        }
        //校验解锁时,存在解锁版本,无法解锁
        if(lockFlag == 0){
            TechnicalSpecification availableVersion = getAvailableVersion(specificationInDB.getApplyMaterialCode(),specificationInDB.getApplyCustomCode());
            if(availableVersion!=null){
                if(!availableVersion.getOwner().equals(userName)) {
                    return new Response().set(1, false, "存在生效版本,无法解锁. 目前生效版本负责人为" + availableVersion.getOwner() + ",生效版本为:" + availableVersion.getVersion());
                }else{
                    //锁定目前生效版本
                    availableVersion.setLockFlag(1);
                    mapper.updateById(availableVersion);
                    //锁定日志
                    TechnicalSpecificationLockLog lockLog = new TechnicalSpecificationLockLog();
                    lockLog.setUserName(userName);
                    lockLog.setTechnicalSpecificationId(id);
                    lockLog.setReason("新版本解锁,此旧版本锁定");
                    lockLog.setCreateTime(date);
                    lockLog.setStatus(0);
                    lockLogService.add(lockLog);
                }
            }
        }
        specificationInDB.setLockFlag(lockFlag);
        mapper.updateById(specificationInDB);
        //锁定/解锁日志
        TechnicalSpecificationLockLog lockLog = new TechnicalSpecificationLockLog();
        lockLog.setUserName(userName);
        lockLog.setTechnicalSpecificationId(id);
        lockLog.setReason(reason);
        lockLog.setCreateTime(date);
        lockLog.setStatus(lockFlag==1?0:1);
        lockLogService.add(lockLog);
        return new Response().set(1, true, "更新完成");
    }
 
    private TechnicalSpecification getAvailableVersion(String applyMaterialCode, String applyCustomCode) {
        QueryWrapper<TechnicalSpecification> query = Wrappers.query();
        query.eq("apply_material_code",applyMaterialCode);
        query.eq("apply_custom_code",applyCustomCode);
        query.eq("lock_flag",0);
        query.last(" limit 1");
        return mapper.selectOne(query);
    }
 
    private TechnicalSpecification get(int id){
        return mapper.selectById(id);
    }
 
    //查询技术规格书
    public Response getInfo(String applyMaterialCode, String applyModel, String applyCustomCode, String owner, Integer lockFlag
                            ,int pageNum, int pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        QueryWrapper<TechnicalSpecification> query = Wrappers.query();
        if(applyMaterialCode!=null&&!applyMaterialCode.isEmpty()){
            query.like("apply_material_code",applyMaterialCode);
        }
        if(applyModel!=null&&!applyModel.isEmpty()){
            query.like("apply_model",applyModel);
        }
        if(applyCustomCode!=null){
            if(applyCustomCode.equals("")){
                query.eq("apply_custom_code",applyCustomCode);
            }else{
                query.like("apply_custom_code",applyCustomCode);
            }
        }
        if(owner!=null&&!owner.isEmpty()){
            query.like("owner",owner);
        }
        if(lockFlag!=null){
            query.eq("lock_flag",lockFlag);
        }
        List<TechnicalSpecification> list=mapper.selectList(query);
        //标识每条记录适用机型可用的版本的负责人是不是这条记录的负责人
        if(list!=null&&list.size()>0){
            for (TechnicalSpecification t:list) {
                TechnicalSpecification enableTe=getEnableVersion(t);
                if(enableTe!=null){
                   if(enableTe.getOwner().equals(t.getOwner())){
                       t.setFlag(1);
                   }else{
                       t.setFlag(0);
                   }
                }else {
                    t.setFlag(1);
                }
            }
        }
        PageInfo pageInfo=new PageInfo(list);
        return new Response().setII(1,list!=null,pageInfo,"查询技术规格书");
    }
    //查询每条记录适用机型可用的版本
    public TechnicalSpecification getEnableVersion(TechnicalSpecification t){
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.eq("apply_material_code",t.getApplyMaterialCode());
        wrapper.eq("apply_model",t.getApplyModel());
        wrapper.eq("apply_custom_code",t.getApplyCustomCode());
        wrapper.last("limit 1");
        TechnicalSpecification enableTe=mapper.selectOne(wrapper);
        return enableTe;
    }
 
   //查询指定技术规格书的所有版本
    public Response getVersionByInfo(String applyMaterialCode, String applyModel, String applyCustomCode) {
        QueryWrapper<TechnicalSpecification> query = Wrappers.query();
        if(applyMaterialCode!=null&&!applyMaterialCode.isEmpty()){
            query.eq("apply_material_code",applyMaterialCode);
        }
        if(applyModel!=null&&!applyModel.isEmpty()){
            query.eq("apply_model",applyModel);
        }
        if(applyCustomCode!=null){
            query.eq("apply_custom_code",applyCustomCode);
        }
        List<TechnicalSpecification> list=mapper.selectList(query);
        //标识每条记录适用机型可用的版本的负责人是不是这条记录的负责人
        if(list!=null&&list.size()>0){
            for (TechnicalSpecification t:list) {
                TechnicalSpecification enableTe=getEnableVersion(t);
                if(enableTe!=null){
                    if(enableTe.getOwner().equals(t.getOwner())){
                        t.setFlag(1);
                    }else{
                        t.setFlag(0);
                    }
                }else {
                    t.setFlag(1);
                }
            }
        }
        return new Response().setII(1,list!=null,list,"查询指定技术规格书的所有版本");
    }
}