src/main/java/com/whyc/controller/TechnicalSpecificationController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/mapper/TechnicalSpecificationMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/pojo/TechnicalSpecification.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/DocUserService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/ProductHistoryService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/SoftwareService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/TechnicalSpecificationService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/CommonUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/whyc/controller/TechnicalSpecificationController.java
New file @@ -0,0 +1,56 @@ package com.whyc.controller; import com.google.gson.reflect.TypeToken; import com.whyc.dto.Response; import com.whyc.pojo.TechnicalSpecification; import com.whyc.service.TechnicalSpecificationService; import com.whyc.util.ActionUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.text.ParseException; @Api(tags = "技术规格书") @RestController @RequestMapping("technicalSpecification") public class TechnicalSpecificationController { @Autowired private TechnicalSpecificationService service; @ApiOperation("excel解析") @PostMapping("excelParse") public Response excelParse(@RequestParam MultipartFile multipartFile) throws IOException, InvalidFormatException, ParseException { Response<Object> response = new Response<>(); String name=multipartFile.getOriginalFilename(); assert name != null; if(!name.substring(name.length()-4).equals(".xls") && !name.substring(name.length()-5).equals(".xlsx")){ response.set(1,false,"文件解析错误:上传格式非excel格式"); }else{ response = service.excelParse(multipartFile.getInputStream()); } return response; } @ApiOperation("软件上传") @PostMapping("upload") public Response upload(@RequestParam MultipartFile file1,@RequestParam MultipartFile file2,@RequestParam String technicalSpecificationStr) throws IOException { TechnicalSpecification specification = ActionUtil.getGson().fromJson(technicalSpecificationStr,new TypeToken<TechnicalSpecification>(){}.getType()); return service.upload(file1,file2,specification); } @ApiOperation("更新锁定状态") @PostMapping("updateLock") public Response updateLock(@RequestParam int id,@RequestParam int lockFlag) throws IOException { return service.updateLock(id,lockFlag); } } src/main/java/com/whyc/mapper/TechnicalSpecificationMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.TechnicalSpecification; public interface TechnicalSpecificationMapper extends CustomMapper<TechnicalSpecification> { } src/main/java/com/whyc/pojo/TechnicalSpecification.java
New file @@ -0,0 +1,178 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import org.apache.ibatis.type.Alias; import java.util.Date; @TableName(value = "tb_technical_specification") @Alias("TechnicalSpecification") public class TechnicalSpecification { private Integer id; private String fileName; private String fileUrl; private String excelUrl; @ApiModelProperty("软件类型") private String type; private String version; @ApiModelProperty("软件基于版本") private String basedVersion; @ApiModelProperty("负责人") private String owner; @ApiModelProperty("归档日期") private String filingDate; @ApiModelProperty("适用机型-物料编码") private String applyMaterialCode; @ApiModelProperty("适用机型-规格型号") private String applyModel; @ApiModelProperty("适用机型-定制单号") private String applyCustomCode; @ApiModelProperty("发布说明") private String releaseNotes; private Date createTime; @ApiModelProperty("锁定状态") private int lockFlag; @ApiModelProperty("锁定原因") private String lockReason; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFileUrl() { return fileUrl; } public void setFileUrl(String fileUrl) { this.fileUrl = fileUrl; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getBasedVersion() { return basedVersion; } public void setBasedVersion(String basedVersion) { this.basedVersion = basedVersion; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public String getFilingDate() { return filingDate; } public void setFilingDate(String filingDate) { this.filingDate = filingDate; } public String getApplyMaterialCode() { return applyMaterialCode; } public void setApplyMaterialCode(String applyMaterialCode) { this.applyMaterialCode = applyMaterialCode; } public String getApplyModel() { return applyModel; } public void setApplyModel(String applyModel) { this.applyModel = applyModel; } public String getReleaseNotes() { return releaseNotes; } public void setReleaseNotes(String releaseNotes) { this.releaseNotes = releaseNotes; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getExcelUrl() { return excelUrl; } public void setExcelUrl(String excelUrl) { this.excelUrl = excelUrl; } public int getLockFlag() { return lockFlag; } public void setLockFlag(int lockFlag) { this.lockFlag = lockFlag; } public String getApplyCustomCode() { return applyCustomCode; } public void setApplyCustomCode(String applyCustomCode) { this.applyCustomCode = applyCustomCode; } public String getLockReason() { return lockReason; } public void setLockReason(String lockReason) { this.lockReason = lockReason; } } src/main/java/com/whyc/service/DocUserService.java
@@ -2,6 +2,7 @@ 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.FileDirPath; @@ -202,4 +203,11 @@ List<DocUser> list=mapper.selectList(wrapper); return new Response().setII(1,list.size()>0,list,"返回数据"); } public boolean checkExists(String userName) { QueryWrapper<DocUser> query = Wrappers.query(); query.eq("name",userName).last(" limit 1"); DocUser docUser = mapper.selectOne(query); return docUser != null; } } src/main/java/com/whyc/service/ProductHistoryService.java
@@ -14,6 +14,7 @@ import com.whyc.pojo.ProductLockLog; import com.whyc.util.ActionUtil; import com.whyc.util.DateUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -251,4 +252,15 @@ } return null; } public boolean checkExists(String parentCode, String customCode) { QueryWrapper<ProductHistory> query = Wrappers.query(); query.eq("parent_code",parentCode); if(!StringUtils.isBlank(customCode)){ //标准产品 query.eq("custom_code",customCode); } query.last(" limit 1"); ProductHistory productHistory = mapper.selectOne(query); return productHistory!=null; } } src/main/java/com/whyc/service/SoftwareService.java
@@ -9,7 +9,6 @@ import com.whyc.dto.FileDirPath; import com.whyc.dto.Response; import com.whyc.mapper.SoftwareMapper; import com.whyc.pojo.DocUser; import com.whyc.pojo.Software; import com.whyc.util.ActionUtil; import com.whyc.util.CommonUtil; @@ -199,9 +198,9 @@ } 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(".")); //文件重命名(严格遵守名称规则的情况下不会重名) 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 softwareDir = rootFile + "software" + File.separator + software.getOwner()+ File.separator + software.getFileName(); src/main/java/com/whyc/service/TechnicalSpecificationService.java
New file @@ -0,0 +1,200 @@ package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.dto.Response; import com.whyc.mapper.TechnicalSpecificationMapper; import com.whyc.pojo.TechnicalSpecification; 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; @Service public class TechnicalSpecificationService { @Resource private TechnicalSpecificationMapper mapper; @Autowired private DocUserService userService; @Autowired private ProductHistoryService productHistoryService; @Autowired private DocLogService logService; 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 excelName = file2Name.substring(0,file2Name.lastIndexOf(".")); if(!(fileNameUnion).equals(excelName)){ return new Response().set(1,false,"技术规格书excel的命名与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.setLockFlag(1); specification.setLockReason("系统默认锁定,新版本技术规则书上传"); mapper.insert(specification); //锁定适用机型的生效版本 lockOtherByAppliedProduct(specification); return new Response().set(1,true,"上传完成"); } private void lockOtherByAppliedProduct(TechnicalSpecification specification) { 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); } public Response updateLock(int id, int lockFlag) { String userName = ActionUtil.getUser().getName(); TechnicalSpecification specificationInDB = get(id); if(!userName.equals(specificationInDB.getOwner())){ return new Response().set(1,false,"非负责人无法解锁"); } //存在解锁版本,无法解锁 return null; } private TechnicalSpecification get(int id){ return mapper.selectById(id); } } src/main/java/com/whyc/util/CommonUtil.java
@@ -89,6 +89,11 @@ docLogService.record2(request,uId,name,operationType,msg,msgDetail); } /** * 物料编码自动填充补齐 * @param code * @return */ public static String codeAutoFill(String code){ int length = code.length(); if (length == 9) {