whycxzp
2024-01-11 58812e817088e7e09d2d43c58edf0e222c048020
技术规格书接口
4个文件已修改
4个文件已添加
472 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/TechnicalSpecificationController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/TechnicalSpecificationMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/TechnicalSpecification.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DocUserService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/ProductHistoryService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/SoftwareService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/TechnicalSpecificationService.java 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/CommonUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | 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) {