feat(material): 新增物料及齐套管理相关功能

- 新增BomControllerService实现齐套物料增删改查及Excel导入导出功能
- 新增BomMaterialService对接主物料系统进行物料信息查询和登录鉴权
- 新增MaterialController及MaterialControllerService实现图纸管理接口和服务
- 实现物料图片和zip批量上传功能,支持权限校验和异步任务提交
- 支持物料分类查询、历史版本查询及物料列表导出功能
- 优化导入数据校验逻辑,导入失败时导出错误结果文件
- 统一接口返回ApiResult封装并支持分页查询展示
- 引入PowerJob任务调度集成,支持图纸zip导入异步处理
- 代码结构调整,规范命名及异常处理逻辑
This commit is contained in:
曹鹏飞 2026-04-15 14:45:13 +08:00
parent d6d759ef19
commit e3e8dc3a25
11 changed files with 104 additions and 46 deletions

View File

@ -3,7 +3,7 @@ package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.QmsQcMaterialControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.qo.BomMaterialListQO;
import com.nflg.wms.common.pojo.qo.QmsQcMaterialAddQO;
import com.nflg.wms.common.pojo.qo.QmsQcMaterialSearchQO;
@ -15,11 +15,7 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@ -98,7 +94,7 @@ public class QmsQcMaterialController extends BaseController {
* 搜索主物料系统物料信息
*/
@PostMapping("searchBomMaterial")
public ApiResult<PageData<BomMaterialDTO>> searchBomMaterial(@Valid @RequestBody BomMaterialListQO request){
public ApiResult<PageData<MaterialMainDTO>> searchBomMaterial(@Valid @RequestBody BomMaterialListQO request){
return ApiResult.success(qcMaterialControllerService.searchBomMaterial(request));
}
}

View File

@ -9,8 +9,8 @@ import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.BomPageResultDTO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.dto.QmsQcMaterialImportDTO;
import com.nflg.wms.common.pojo.qo.BomMaterialListQO;
import com.nflg.wms.common.pojo.qo.QmsQcMaterialAddQO;
@ -433,9 +433,9 @@ public class QmsQcMaterialControllerService {
return pathName.toString();
}
public PageData<BomMaterialDTO> searchBomMaterial(@Valid BomMaterialListQO request) {
BomPageResultDTO<BomMaterialDTO> bomPageResultDTO = bomMaterialService.searchMaterial(request);
return new PageData<BomMaterialDTO>()
public PageData<MaterialMainDTO> searchBomMaterial(@Valid BomMaterialListQO request) {
BomPageResultDTO<MaterialMainDTO> bomPageResultDTO = bomMaterialService.searchMaterial(request);
return new PageData<MaterialMainDTO>()
.setPage(request.getPage())
.setPageSize(request.getPageSize())
.setTotal((int) bomPageResultDTO.getTotal())

View File

@ -4,14 +4,13 @@ import com.nflg.wms.admin.service.MaterialControllerService;
import com.nflg.wms.common.constant.UserType;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.MaterialCategoryVO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.EbomParentVO;
import com.nflg.wms.common.pojo.vo.MaterialVO;
import com.nflg.wms.common.pojo.vo.QueryMaterialsVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.WmsMaterial;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
@ -155,7 +154,7 @@ public class MaterialController extends BaseController {
* 搜索主物料系统物料信息
*/
@PostMapping("searchBomMaterial")
public ApiResult<PageData<BomMaterialDTO>> searchBomMaterial(@Valid @RequestBody BomMaterialListQO request){
public ApiResult<PageData<MaterialMainDTO>> searchBomMaterial(@Valid @RequestBody BomMaterialListQO request){
return ApiResult.success(materialControllerService.searchBomMaterial(request));
}

View File

@ -9,6 +9,7 @@ import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomExportExcelDTO;
import com.nflg.wms.common.pojo.dto.BomImportExcelDTO;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.qo.BomUpdateQO;
import com.nflg.wms.common.pojo.qo.ScanTypeUpdateQO;
@ -139,7 +140,7 @@ public class BomControllerService {
if (Objects.isNull(dto.getParentNo())) {
sb.append("父级物料编号不能为空;");
} else {
BomMaterialDTO pm = bomMaterialService.getMaterialInfo(dto.getParentNo());
MaterialMainDTO pm = bomMaterialService.getMaterialInfo(dto.getParentNo());
if (Objects.isNull(pm)) {
sb.append("父级物料编号无效");
} else {
@ -168,7 +169,7 @@ public class BomControllerService {
if (StrUtil.isBlank(dto.getChildNo())) {
sb.append("子级物料编号不能为空;");
} else {
BomMaterialDTO cm = bomMaterialService.getMaterialInfo(dto.getChildNo());
MaterialMainDTO cm = bomMaterialService.getMaterialInfo(dto.getChildNo());
if (Objects.isNull(cm)) {
sb.append("子级物料编号无效;");
} else if (bom.getParentId() != 0L) {

View File

@ -44,7 +44,6 @@ import tech.powerjob.common.request.query.JobInfoQuery;
import tech.powerjob.common.response.JobInfoDTO;
import tech.powerjob.common.response.ResultDTO;
import javax.print.attribute.standard.PrinterURI;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -166,7 +165,7 @@ public class MaterialControllerService {
for (MultipartFile file : files) {
String name = file.getOriginalFilename();
String materialNo = name.substring(0, name.lastIndexOf("."));
BomMaterialDTO bomMaterialDTO = bomMaterialService.getMaterialInfo(materialNo);
MaterialMainDTO bomMaterialDTO = bomMaterialService.getMaterialInfo(materialNo);
if (Objects.isNull(bomMaterialDTO)) {
pics.add(name);
} else {
@ -225,9 +224,9 @@ public class MaterialControllerService {
}
}
public PageData<BomMaterialDTO> searchBomMaterial(@Valid BomMaterialListQO request) {
BomPageResultDTO<BomMaterialDTO> bomPageResultDTO = bomMaterialService.searchMaterial(request);
return new PageData<BomMaterialDTO>()
public PageData<MaterialMainDTO> searchBomMaterial(@Valid BomMaterialListQO request) {
BomPageResultDTO<MaterialMainDTO> bomPageResultDTO = bomMaterialService.searchMaterial(request);
return new PageData<MaterialMainDTO>()
.setPage(request.getPage())
.setPageSize(request.getPageSize())
.setTotal((int) bomPageResultDTO.getTotal())

View File

@ -4,12 +4,11 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.dto.StorageExcelExportDTO;
import com.nflg.wms.common.pojo.dto.StorageExcelImportDTO;
import com.nflg.wms.common.pojo.qo.EnableQO;
@ -21,8 +20,14 @@ import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.service.*;
import com.nflg.wms.repository.entity.DictionaryItem;
import com.nflg.wms.repository.entity.WmsBin;
import com.nflg.wms.repository.entity.WmsStorage;
import com.nflg.wms.repository.entity.WmsWarehouse;
import com.nflg.wms.repository.service.IDictionaryItemService;
import com.nflg.wms.repository.service.IWmsBinService;
import com.nflg.wms.repository.service.IWmsStorageService;
import com.nflg.wms.repository.service.IWmsWarehouseService;
import com.nflg.wms.starter.service.BomMaterialService;
import com.nflg.wms.starter.service.FileUploadService;
import jakarta.annotation.Resource;
@ -146,7 +151,7 @@ public class StorageControllerService {
if (StrUtil.isBlank(dto.getMaterialNo())) {
sb.append("物料编号不能为空;");
} else {
BomMaterialDTO material = bomMaterialService.getMaterialInfo(dto.getMaterialNo());
MaterialMainDTO material = bomMaterialService.getMaterialInfo(dto.getMaterialNo());
if (Objects.isNull(material)) {
sb.append("物料编号无效;");
} else {

View File

@ -2,30 +2,32 @@ package com.nflg.wms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO;
import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.*;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialExcelExportDTO;
import com.nflg.wms.common.pojo.dto.PackageMaterialExcelImportDTO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.PackageVO;
import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.entity.WmsInTaskItem;
import com.nflg.wms.repository.entity.WmsMaterial;
import com.nflg.wms.repository.entity.WmsModel;
import com.nflg.wms.repository.entity.WmsStructuralPackage;
import com.nflg.wms.repository.service.*;
import com.nflg.wms.starter.service.BomMaterialService;
import com.nflg.wms.starter.service.FileUploadService;
@ -312,7 +314,7 @@ public class StructuralPackageControllerService {
case 2:
String no = row.getString(1);
VUtil.trueThrowBusinessError(StrUtil.isBlank(no)).throwMessage("钢构包编码不能为空");
BomMaterialDTO material = bomMaterialService.getMaterialInfo(no);
MaterialMainDTO material = bomMaterialService.getMaterialInfo(no);
VUtil.trueThrowBusinessError(Objects.isNull(material)).throwMessage("钢构包编码无效");
packageInfo.setNo(no);
packageInfo.setName(material.getMaterialDesc());

View File

@ -0,0 +1,54 @@
package com.nflg.wms.common.pojo.dto;
import lombok.Data;
@Data
public class MaterialMainDTO {
private Long rowId;
private String materialNo;
private String materialName;
private String materialDesc;
private String materialDescEn;
private String drawingNo;
/**
* 物料单位
*/
private String materialUnit;
/**
* 物料状态 1:激活 2:禁止采购 3:售后专用 4:冻结 5:完全弃用
*/
private Integer materialState;
/**
* 一级分类编号
*/
private String firstMaterialCategoryCode;
/**
* 二级分类编号
*/
private String secondMaterialCategoryCode;
/**
* 三级分类编号
*/
private String thirdMaterialCategoryCode;
/**
* 大类/中类/小类/细分类
*/
private String oldCategoryNameTree;
/**
* 物料规格
*/
private String materialSpecifications;
}

View File

@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BomMaterialListQO extends PageQO{
public class BomMaterialListQO extends PageQO {
/**
* 物料编号
@ -22,10 +22,10 @@ public class BomMaterialListQO extends PageQO{
/**
* 物料分类不需要设置
*/
private int materialClass=0;
private int materialClass = 0;
/**
* 物料一级分类编码
* 分类编码
*/
private String firstMaterialCategoryCode;
private String materialCategoryCode;
}

View File

@ -5,7 +5,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.constant.UserType;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.dto.MaterialMainDTO;
import com.nflg.wms.repository.entity.WmsMaterial;
import com.nflg.wms.repository.service.IWmsMaterialService;
import com.nflg.wms.starter.service.BomMaterialService;
@ -27,7 +27,6 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@ -69,7 +68,7 @@ public class MaterialZipImportProcessor implements BasicProcessor {
}
String materialNo = name.substring(0, name.lastIndexOf("."));
omsLogger.info("物料编号:{}", materialNo);
BomMaterialDTO bomMaterialDTO = bomMaterialService.getMaterialInfo(materialNo);
MaterialMainDTO bomMaterialDTO = bomMaterialService.getMaterialInfo(materialNo);
if (Objects.isNull(bomMaterialDTO)) {
omsLogger.error("主数据中未查找到该物料:{}", materialNo);
} else {

View File

@ -106,13 +106,13 @@ public class BomMaterialService {
return Optional.ofNullable(resultDTO.getData()).orElse(Collections.emptyList());
}
public BomMaterialDTO getMaterialInfo(String no) {
public MaterialMainDTO getMaterialInfo(String no) {
VUtil.trueThrowBusinessError(StrUtil.isBlank(no)).throwMessage("物料编号不能为空");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("authorization", getToken());
HttpEntity<Void> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<BomResultDTO<BomMaterialDTO>> response = restTemplate.exchange(
ResponseEntity<BomResultDTO<MaterialMainDTO>> response = restTemplate.exchange(
baseUrl + materialInfoUrl + no,
HttpMethod.GET,
requestEntity,
@ -122,29 +122,32 @@ public class BomMaterialService {
log.info("查询主物料系统返回状态码:" + response.getStatusCode().value());
VUtil.trueThrowBusinessError(!response.getStatusCode().is2xxSuccessful())
.throwMessage("查询主物料系统失败");
BomResultDTO<BomMaterialDTO> resultDTO = response.getBody();
BomResultDTO<MaterialMainDTO> resultDTO = response.getBody();
log.info("查询主物料系统返回数据:" + JSONUtil.toJsonStr(resultDTO));
return resultDTO.getData();
}
public BomPageResultDTO<BomMaterialDTO> searchMaterial(BomMaterialListQO qo) {
public BomPageResultDTO<MaterialMainDTO> searchMaterial(BomMaterialListQO qo) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("authorization", getToken());
HttpEntity<BomMaterialListQO> requestEntity = new HttpEntity<>(qo, headers);
ResponseEntity<BomResultDTO<BomPageResultDTO<BomMaterialDTO>>> response = restTemplate.exchange(
ResponseEntity<BomResultDTO<BomPageResultDTO<MaterialMainDTO>>> response = restTemplate.exchange(
baseUrl + materialSearchUrl,
HttpMethod.POST,
requestEntity,
new ParameterizedTypeReference<>() {
}
);
// ResponseEntity<String> responseEntity=restTemplate.postForEntity(baseUrl + materialSearchUrl, requestEntity, String.class);
log.info("查询主物料系统返回状态码:" + response.getStatusCode().value());
VUtil.trueThrowBusinessError(!response.getStatusCode().is2xxSuccessful())
.throwMessage("查询主物料系统失败");
BomResultDTO<BomPageResultDTO<BomMaterialDTO>> resultDTO = response.getBody();
BomResultDTO<BomPageResultDTO<MaterialMainDTO>> resultDTO = response.getBody();
log.info("查询主物料系统返回数据:" + JSONUtil.toJsonStr(resultDTO));
return resultDTO.getData();
// log.info("查询主物料系统返回数据:" +responseEntity.getBody());
// return new BomPageResultDTO();
}
private String getToken() {