From f3860391401d7dd0c2e5e4d0ecef8f79f7331182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 4 Jul 2025 16:19:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/admin/controller/BomController.java | 54 ++++++++ .../admin/controller/MaterialController.java | 34 ++++- .../StructuralPackageController.java | 21 ++- .../processor/MaterialZipImportProcessor.java | 115 +++++++++++++++ .../admin/service/BomControllerService.java | 53 +++++++ .../wms/admin/service/BomMaterialService.java | 16 +++ .../service/MaterialControllerService.java | 122 ++++++++++++++++ .../StructuralPackageControllerService.java | 131 +++++++++++++++++- .../resources/template/钢构包导出.xlsx | Bin 0 -> 10944 bytes .../wms/common/pojo/dto/BomMaterialDTO.java | 57 ++++++++ .../pojo/dto/MaterialAllExcelExportDTO.java | 90 ++++++++++++ .../pojo/dto/MaterialExcelExportDTO.java | 53 +++---- .../common/pojo/dto/PackageMaterialDTO.java | 2 +- .../nflg/wms/common/pojo/qo/BomSearchQO.java | 20 +++ .../nflg/wms/common/pojo/qo/BomUpdateQO.java | 24 ++++ .../nflg/wms/repository/entity/WmsBom.java | 84 +++++++++++ .../wms/repository/mapper/WmsBomMapper.java | 16 +++ .../repository/service/IWmsBomService.java | 27 ++++ .../service/IWmsMaterialService.java | 2 + .../service/impl/WmsBomServiceImpl.java | 100 +++++++++++++ .../service/impl/WmsMaterialServiceImpl.java | 5 + .../main/resources/mapper/WmsBomMapper.xml | 5 + .../resources/mapper/WmsMaterialMapper.xml | 2 +- .../mapper/WmsStructuralPackageMapper.xml | 2 +- .../wms/repository/CodeGeneratorTest.java | 2 +- 25 files changed, 1005 insertions(+), 32 deletions(-) create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BomController.java create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/processor/MaterialZipImportProcessor.java create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomControllerService.java create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomMaterialService.java create mode 100644 nflg-wms-admin/src/main/resources/template/钢构包导出.xlsx create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialAllExcelExportDTO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomSearchQO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomUpdateQO.java create mode 100644 nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBom.java create mode 100644 nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsBomMapper.java create mode 100644 nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java create mode 100644 nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java create mode 100644 nflg-wms-repository/src/main/resources/mapper/WmsBomMapper.xml diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BomController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BomController.java new file mode 100644 index 00000000..e1e48953 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BomController.java @@ -0,0 +1,54 @@ +package com.nflg.wms.admin.controller; + +import com.nflg.wms.admin.service.BomControllerService; +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.qo.BomSearchQO; +import com.nflg.wms.common.pojo.qo.BomUpdateQO; +import com.nflg.wms.starter.BaseController; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +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; + +/** + * 齐套管理 + */ +@RestController +@RequestMapping("/bom") +public class BomController extends BaseController { + + @Resource + private BomControllerService bomControllerService; + + /** + * 新增 + */ + @PostMapping("add") + public ApiResult add(@Valid @RequestBody BomMaterialDTO request){ + bomControllerService.add(request); + return ApiResult.success(); + } + + /** + * 更新 + */ + @PostMapping("update") + public ApiResult update(@Valid @RequestBody BomUpdateQO request){ + bomControllerService.update(request); + return ApiResult.success(); + } + + /** + * 搜索 + * @param request 搜索参数 + */ + @PostMapping("search") + public ApiResult> search(@Valid @RequestBody BomSearchQO request){ + return ApiResult.success(bomControllerService.search(request)); + } + +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java index de15d41e..d04ae01e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/MaterialController.java @@ -12,7 +12,10 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -65,9 +68,38 @@ public class MaterialController extends BaseController { /** * 导出未设置物料清单 */ - @PostMapping("export") + @PostMapping("exportNotSet") public void exportNotSet(HttpServletResponse response) throws Exception { materialControllerService.exportNotSet(response); } + /** + * 导出选择的数据 + * @param ids id列表,为空时导出模板 + */ + @PostMapping("exportSelect") + public void exportSelect(HttpServletResponse response,@RequestBody List ids) throws Exception { + materialControllerService.exportSelect(response,ids); + } + + /** + * 批量上传物料图片 + * @param files 文件列表 + */ + @Transactional + @PostMapping("uploadPics") + public ApiResult uploadPics(HttpServletResponse response, @Valid @RequestParam("files") @NotEmpty List files) throws Exception { + return materialControllerService.uploadPics(response,files); + } + + /** + * 上传物料图片zip压缩包 + * @param file zip压缩包 + */ + @Transactional + @PostMapping("uploadZip") + public ApiResult uploadZip(HttpServletResponse response, @Valid @RequestParam("file") @NotEmpty MultipartFile file) throws Exception { + return materialControllerService.uploadZip(response,file); + } + } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java index 3b26a5cc..f23c78f6 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java @@ -6,6 +6,7 @@ import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.dto.PackageMaterialDTO; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.PackageVO; +import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -23,7 +24,7 @@ import java.util.List; */ @RestController @RequestMapping("/package") -public class StructuralPackageController { +public class StructuralPackageController extends BaseController { @Resource private StructuralPackageControllerService packageControllerService; @@ -111,4 +112,22 @@ public class StructuralPackageController { return packageControllerService.importMaterials(response,packageId,file); } + /** + * 导入钢构包 + * @param file 文件 + */ + @Transactional + @PostMapping("importKit") + public ApiResult importKit(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException { + return packageControllerService.importKit(response,file); + } + + /** + * 导出钢构包 + */ + @GetMapping("exportKit") + public void exportKit(HttpServletResponse response,@Valid @RequestParam @NotNull Long id) throws Exception { + packageControllerService.exportKit(response,id); + } + } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/processor/MaterialZipImportProcessor.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/processor/MaterialZipImportProcessor.java new file mode 100644 index 00000000..e37f5514 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/processor/MaterialZipImportProcessor.java @@ -0,0 +1,115 @@ +package com.nflg.wms.admin.processor; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.nflg.wms.admin.service.BomMaterialService; +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import com.nflg.wms.repository.entity.WmsMaterial; +import com.nflg.wms.repository.service.IWmsMaterialService; +import com.nflg.wms.starter.service.FileUploadService; +import jakarta.annotation.Resource; +import org.apache.commons.io.FilenameUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Objects; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +@Component(value = "materialZipImportProcessor") +public class MaterialZipImportProcessor implements BasicProcessor { + + @Resource + private IWmsMaterialService materialService; + + @Resource + private BomMaterialService bomMaterialService; + + @Resource + private FileUploadService fileUploadService; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + OmsLogger omsLogger = context.getOmsLogger(); + List params=StrUtil.split(context.getInstanceParams(), "|"); + String zipUrl=params.get(0); + String userName= params.get(1); + if (StrUtil.isBlank(zipUrl)) { + omsLogger.error("无效的zip地址"); + return new ProcessResult(false, "无效的zip地址"); + } + try (InputStream is = new URL(zipUrl).openStream(); ZipInputStream zis = new ZipInputStream(is)) { + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + String name = entry.getName(); + omsLogger.info("开始处理文件:{}",name); + if (!entry.isDirectory()) { + ByteArrayOutputStream osOut = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + while ((len = zis.read(buffer)) > 0) { + osOut.write(buffer, 0, len); + } + String materialNo = name.substring(0, name.lastIndexOf(".")); + omsLogger.info("物料编号:{}", materialNo); + BomMaterialDTO bomMaterialDTO = bomMaterialService.getMaterial(materialNo); + if (Objects.isNull(bomMaterialDTO)) { + omsLogger.error("主数据中未查找到该物料:{}", materialNo); + } else { + WmsMaterial wmsMaterial = materialService.getCurrent(materialNo); + if (Objects.isNull(wmsMaterial) || !(StrUtil.isNotBlank(wmsMaterial.getImage()) && Objects.nonNull(wmsMaterial.getWeight()))) { + omsLogger.info("添加图纸"); + wmsMaterial = new WmsMaterial() + .setId(null) + .setVersion(Objects.isNull(wmsMaterial) ? 1 : wmsMaterial.getVersion() + 1) + .setNo(bomMaterialDTO.getNo()) + .setDescribe(bomMaterialDTO.getDescribe()) + .setDrawingNo(bomMaterialDTO.getDrawingNo()) + .setCreateBy(userName) + .setCreateTime(LocalDateTime.now()); + } else { + omsLogger.info("更新图纸"); + wmsMaterial.setDescribe(bomMaterialDTO.getDescribe()); + wmsMaterial.setDrawingNo(bomMaterialDTO.getDrawingNo()); + wmsMaterial.setUpdateBy(userName); + wmsMaterial.setUpdateTime(LocalDateTime.now()); + } + try(ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) { + String picUrl=fileUploadService.upload(buildFilePath(name), isIn); + omsLogger.info("上传后的图片地址:{}", picUrl); + wmsMaterial.setImage(picUrl); + if (materialService.saveOrUpdate(wmsMaterial)){ + omsLogger.info("保存成功,id:"+wmsMaterial.getId()); + }else { + omsLogger.error("保存失败"); + } + }catch (Exception ex){ + omsLogger.error("上传图片失败:{}", ex.getMessage()); + } + } + } + omsLogger.info("处理完毕"); + omsLogger.info("-----------------------------------------"); + zis.closeEntry(); + } + } + return new ProcessResult(true, "处理完毕"); + } + + private String buildFilePath(String fileName) { + String fileType="." + FilenameUtils.getExtension(fileName); + return StrUtil.format("admin/task/{}/{}/{}{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + , RandomUtil.randomString(4), IdUtil.fastUUID(), fileType); + } +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomControllerService.java new file mode 100644 index 00000000..68366e31 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomControllerService.java @@ -0,0 +1,53 @@ +package com.nflg.wms.admin.service; + +import cn.hutool.core.convert.Convert; +import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import com.nflg.wms.common.pojo.qo.BomSearchQO; +import com.nflg.wms.common.pojo.qo.BomUpdateQO; +import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.repository.entity.WmsBom; +import com.nflg.wms.repository.service.IWmsBomService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Component +public class BomControllerService { + + @Resource + private IWmsBomService bomService; + + @Transactional + public void add(@Valid BomMaterialDTO dto) { + WmsBom parent = Convert.convert(WmsBom.class, dto); + parent.setCreateBy(UserUtil.getUserName()); + parent.setCreateTime(LocalDateTime.now()); + bomService.add(parent, dto.getChildren().stream().map(it->{ + WmsBom wmsBom = Convert.convert(WmsBom.class, it); + wmsBom.setCreateBy(UserUtil.getUserName()); + wmsBom.setCreateTime(LocalDateTime.now()); + return wmsBom; + }).toList()); + } + + public void update(@Valid BomUpdateQO request) { + bomService.update(request.getParentId(),request.getChildren().stream().map(it->{ + WmsBom wmsBom = Convert.convert(WmsBom.class, it); + wmsBom.setUpdateBy(UserUtil.getUserName()); + wmsBom.setUpdateTime(LocalDateTime.now()); + if (Objects.isNull(wmsBom.getId())){ + wmsBom.setParentId(request.getParentId()); + } + return wmsBom; + }).toList()); + } + + public PageData search(@Valid BomSearchQO request) { + return bomService.search(request); + } +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomMaterialService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomMaterialService.java new file mode 100644 index 00000000..9346708d --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BomMaterialService.java @@ -0,0 +1,16 @@ +package com.nflg.wms.admin.service; + +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import org.springframework.stereotype.Component; + +@Component +public class BomMaterialService { + + public BomMaterialDTO getMaterial(String no){ + // TODO 从主数据平台获取物料信息 + return new BomMaterialDTO() + .setNo("test") + .setDescribe("测试的虚拟物料") + .setDrawingNo("tttt"); + } +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java index 163282a5..1d4c386a 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java @@ -1,8 +1,14 @@ package com.nflg.wms.admin.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.nflg.wms.common.pojo.ApiResult; +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import com.nflg.wms.common.pojo.dto.MaterialAllExcelExportDTO; import com.nflg.wms.common.pojo.dto.MaterialExcelExportDTO; import com.nflg.wms.common.pojo.qo.MaterialAddQO; import com.nflg.wms.common.pojo.qo.MaterialSearchQO; @@ -12,20 +18,31 @@ import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.WmsMaterial; import com.nflg.wms.repository.service.IWmsMaterialService; +import com.nflg.wms.starter.service.FileUploadService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import org.apache.commons.io.FilenameUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.Workbook; +import tech.powerjob.client.PowerJobClient; +import tech.powerjob.common.request.query.JobInfoQuery; +import tech.powerjob.common.response.JobInfoDTO; +import tech.powerjob.common.response.ResultDTO; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -36,6 +53,15 @@ public class MaterialControllerService { @Resource private IWmsMaterialService materialService; + @Resource + private BomMaterialService bomMaterialService; + + @Resource + private FileUploadService fileUploadService; + + @Resource + private PowerJobClient powerJobClient; + public void add(@Valid MaterialAddQO request) { WmsMaterial wmsMaterial = Convert.convert(WmsMaterial.class, request); wmsMaterial.setCreateBy(UserUtil.getUserName()); @@ -77,4 +103,100 @@ public class MaterialControllerService { .addSheet(new ListSheet<>(datas).setRowHeight(100)) .writeTo(response.getOutputStream()); } + + public void exportSelect(HttpServletResponse response, List ids) throws IOException { + if (CollectionUtil.isEmpty(ids)){ + exportTemplate(response); + }else { + List wmsMaterials = materialService.listByIds(ids); + List datas = wmsMaterials.stream().map(model -> Convert.convert(MaterialAllExcelExportDTO.class, model)).collect(Collectors.toList()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + if (CollectionUtil.isEmpty(datas)) { + + }else { + new Workbook() + .addSheet(new ListSheet<>(datas).setRowHeight(100)) + .writeTo(response.getOutputStream()); + } + } + } + + private void exportTemplate(HttpServletResponse response) throws IOException { + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("图纸导入模板.xlsx", StandardCharsets.UTF_8)); + List datas = new ArrayList<>(); + datas.add(new MaterialExcelExportDTO() + .setNo("") + .setDescribe("") + .setWidth("") + .setHeight("") + .setWeight("") + .setLength("") + .setRequirement("")); + new Workbook() + .addSheet(new ListSheet<>(datas)) + .writeTo(response.getOutputStream()); + } + + @Transactional + public ApiResult uploadPics(HttpServletResponse response, @Valid @NotEmpty List files) throws Exception { + List pics = new ArrayList<>(); + List materials = new ArrayList<>(); + for (MultipartFile file : files){ + String name = file.getOriginalFilename(); + String materialNo = name.substring(0, name.lastIndexOf(".")); + BomMaterialDTO bomMaterialDTO = bomMaterialService.getMaterial(materialNo); + if (Objects.isNull(bomMaterialDTO)) { + pics.add(name); + } else { + WmsMaterial wmsMaterial=materialService.getCurrent(materialNo); + if (Objects.isNull(wmsMaterial) || !(StrUtil.isNotBlank(wmsMaterial.getImage()) && Objects.nonNull(wmsMaterial.getWeight()))){ + wmsMaterial=new WmsMaterial() + .setId(null) + .setVersion(Objects.isNull(wmsMaterial)?1:wmsMaterial.getVersion()+1) + .setNo(bomMaterialDTO.getNo()) + .setDescribe(bomMaterialDTO.getDescribe()) + .setDrawingNo(bomMaterialDTO.getDrawingNo()) + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + }else { + wmsMaterial.setDescribe(bomMaterialDTO.getDescribe()); + wmsMaterial.setDrawingNo(bomMaterialDTO.getDrawingNo()); + wmsMaterial.setUpdateBy(UserUtil.getUserName()); + wmsMaterial.setUpdateTime(LocalDateTime.now()); + } + String url = fileUploadService.upload(buildFilePath(name), file); + wmsMaterial.setImage(url); + materials.add(wmsMaterial); + } + } + if (CollectionUtil.isEmpty(pics)) { + if (CollectionUtil.isNotEmpty(materials)) { + materialService.saveOrUpdateBatch(materials); + } + return ApiResult.success(); + }else { + return ApiResult.error("以下图片SAP料号无效:"+StrUtil.join(",", pics)); + } + } + + private String buildFilePath(String fileName) { + String fileType="." + FilenameUtils.getExtension(fileName); + return StrUtil.format("admin/{}/{}/{}/{}{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), UserUtil.getUserId() + , RandomUtil.randomString(4), IdUtil.fastUUID(), fileType); + } + + public ApiResult uploadZip(HttpServletResponse response, @Valid @NotEmpty MultipartFile file) throws Exception{ + String name = file.getOriginalFilename(); + VUtil.trueThrowBusinessError(!StrUtil.endWith(name, ".zip")).throwMessage("请上传zip格式的压缩包"); + String url = fileUploadService.upload(buildFilePath(name), file); + JobInfoQuery query = new JobInfoQuery(); + query.setJobNameEq("图纸zip导入"); + ResultDTO> result = powerJobClient.queryJob(query); + if (result.isSuccess()) { + powerJobClient.runJob(result.getData().get(0).getId(),url+"|"+UserUtil.getUserName(),0); + return ApiResult.success("任务已提交"); + } else { + return ApiResult.error(result.getMessage()); + } + } } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java index a9b25e07..bd5b50ee 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java @@ -18,7 +18,11 @@ 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.WmsMaterial; +import com.nflg.wms.repository.entity.WmsModel; import com.nflg.wms.repository.entity.WmsStructuralPackage; +import com.nflg.wms.repository.service.IWmsMaterialService; +import com.nflg.wms.repository.service.IWmsModelService; import com.nflg.wms.repository.service.IWmsStructuralPackageService; import com.nflg.wms.starter.service.FileUploadService; import jakarta.annotation.Resource; @@ -26,14 +30,19 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.ttzero.excel.entity.ListSheet; +import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.Workbook; +import org.ttzero.excel.reader.ExcelReader; +import org.ttzero.excel.reader.Sheet; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -48,6 +57,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +@Slf4j @Component public class StructuralPackageControllerService { @@ -57,6 +67,11 @@ public class StructuralPackageControllerService { @Resource private FileUploadService fileUploadService; + @Resource + private IWmsMaterialService materialService; + + @Resource + private IWmsModelService modelService; @Transactional public void add(@Valid PackageAddQO request) { @@ -183,8 +198,10 @@ public class StructuralPackageControllerService { } if (StrUtil.isBlank(dto.getVersion())) { sb.append("图纸版本不能为空;"); + }else if (!NumberUtils.isCreatable(dto.getVersion())){ + sb.append("图纸版本无效;"); } else { - materialDTO.setVersion(dto.getVersion()); + materialDTO.setVersion(Integer.valueOf(dto.getVersion())); } dto.setError(sb.toString()); materialDTOS.add(materialDTO); @@ -203,4 +220,116 @@ public class StructuralPackageControllerService { } return false; } + + public ApiResult importKit(HttpServletResponse response, MultipartFile file) throws IOException { + WmsStructuralPackage packageInfo = new WmsStructuralPackage() + .setCreateBy(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + List materials = new ArrayList<>(); + StringBuilder sb=new StringBuilder(); + Sheet sheet = ExcelReader.read(file.getInputStream()).sheet(0); + sheet.rows().forEach(row -> { + switch (row.getRowNum()) { + case 2: + String no = row.getString(1); + VUtil.trueThrowBusinessError(StrUtil.isBlank(no)).throwMessage("钢构包编码不能为空"); + WmsMaterial material=materialService.getCurrent(no); + VUtil.trueThrowBusinessError(Objects.isNull(material)).throwMessage("钢构包编码无效"); + packageInfo.setNo(no); + packageInfo.setName(material.getDescribe()); + packageInfo.setDrawingNo(material.getDrawingNo()); + String modelNo= row.getString(3); + VUtil.trueThrowBusinessError(StrUtil.isBlank(modelNo)).throwMessage("机型编号不能为空"); + List modelNos=StrUtil.split(modelNo, ","); + List models=modelService.lambdaQuery().select(WmsModel::getId, WmsModel::getNo).eq(WmsModel::getEnable,true).in(WmsModel::getNo, modelNos).list(); + modelNos.removeIf(mno -> models.stream().anyMatch(model -> model.getNo().equals(mno))); + VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(modelNos)).throwMessage("以下机型编号无效:"+StrUtil.join(",", modelNos)); + packageInfo.setModelIds(StrUtil.join(",",models.stream().map(WmsModel::getId).toList())); + break; + case 3: + String cate = row.getString(1); + VUtil.trueThrowBusinessError(StrUtil.isBlank(cate)).throwMessage("种类不能为空"); + packageInfo.setCate(cate); + String eco = row.getString(3); + VUtil.trueThrowBusinessError(StrUtil.isBlank(eco)).throwMessage("ECO不能为空"); + packageInfo.setEco( eco); + break; + case 4: + String remark = row.getString(3); + packageInfo.setRemark(remark); + String version = row.getString(1); + VUtil.trueThrowBusinessError(StrUtil.isBlank(version)).throwMessage("版本号不能为空"); + VUtil.trueThrowBusinessError(!NumberUtils.isCreatable(version)).throwMessage("版本号无效"); + packageInfo.setVersion(Integer.valueOf(version)); + VUtil.trueThrowBusinessError(packageService.lambdaQuery() + .eq(WmsStructuralPackage::getNo, packageInfo.getNo()) + .eq(WmsStructuralPackage::getVersion, packageInfo.getVersion()) + .exists()) + .throwMessage("该版本已存在"); + VUtil.trueThrowBusinessError(StrUtil.isBlank(packageInfo.getRemark()) + && packageService.lambdaQuery().eq(WmsStructuralPackage::getNo, packageInfo.getNo()).exists()) + .throwMessage("修改日志不能为空"); + break; + default: + if (row.getRowNum() > 6){ + String mno = row.getString(0); + if (StrUtil.isBlank(mno)){ + sb.append(StrUtil.format("第{}行零件编码不能为空;", row.getRowNum())); + break; + } + WmsMaterial material1 = materialService.getCurrent(mno); + if (Objects.isNull(material1)) { + sb.append("零件编码").append(mno).append("无效;"); + break; + } + PackageMaterialDTO dto = new PackageMaterialDTO(); + dto.setNo(mno); + dto.setName(material1.getDescribe()); + dto.setVersion(material1.getVersion()); + dto.setStation(row.getString(1)); + dto.setTray(row.getString(2)); + String num=row.getString(3); + if (StrUtil.isBlank(num)){ + sb.append(StrUtil.format("第{}行数量不能为空;", row.getRowNum())); + }else if (!NumberUtils.isCreatable(num)){ + sb.append(StrUtil.format("第{}行数量无效;", row.getRowNum())); + }else { + dto.setNum(new BigDecimal(num)); + } + num=row.getString(4); + if (StrUtil.isBlank(num)){ + sb.append(StrUtil.format("第{}行重量不能为空;", row.getRowNum())); + }else if (!NumberUtils.isCreatable(num)){ + sb.append(StrUtil.format("第{}行重量无效;", row.getRowNum())); + }else { + dto.setWeight(new BigDecimal(num)); + } + dto.setCreateBy(UserUtil.getUserName()); + dto.setCreateTime(DateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd")); + materials.add(dto); + } + break; + } + }); + VUtil.trueThrowBusinessError(!sb.isEmpty()).throwMessage("数据校验失败:"+ sb); + packageInfo.setWeight(materials.stream() + .map(m -> m.getWeight().multiply(m.getNum())) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + packageInfo.setMaterials(JSONUtil.toJsonStr(materials)); + packageService.add(packageInfo); + return ApiResult.success(); + } + + public void exportKit(HttpServletResponse response, @Valid @NotNull Long id) throws IOException { + PackageVO packageInfo = packageService.getInfo(id); + VUtil.trueThrowBusinessError(Objects.isNull(packageInfo)).throwMessage("数据不存在"); + List list = JSONUtil.toList(packageInfo.getMaterials(), PackageMaterialDTO.class); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(packageInfo.getNo()+"钢构包.xlsx", StandardCharsets.UTF_8)); + new Workbook() + .addSheet(new TemplateSheet(new ClassPathResource("template/钢构包导出.xlsx").getInputStream()) + .setData(packageInfo) + .setData("list", list) + ).writeTo(response.getOutputStream()); + } } diff --git a/nflg-wms-admin/src/main/resources/template/钢构包导出.xlsx b/nflg-wms-admin/src/main/resources/template/钢构包导出.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad80eb6cffb9d0bccc138d5a886c3a31384bc698 GIT binary patch literal 10944 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 Kau`%Exc>*smgH#w literal 0 HcmV?d00001 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java new file mode 100644 index 00000000..97b96e9d --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/BomMaterialDTO.java @@ -0,0 +1,57 @@ +package com.nflg.wms.common.pojo.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@Accessors(chain = true) +public class BomMaterialDTO { + + private Long id; + + /** + * 父级id + */ + private Long parentId; + + /** + * SAP料号 + */ + @NotBlank + private String no; + + /** + * 物料描述 + */ + @NotBlank + private String describe; + + /** + * 图号 + */ + private String drawingNo; + + /** + * 重量 + */ + @NotBlank + private BigDecimal weight; + + /** + * 数量 + */ + @NotNull + private BigDecimal num; + + /** + * 下级 + */ + @NotEmpty + private List children; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialAllExcelExportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialAllExcelExportDTO.java new file mode 100644 index 00000000..a6b57a77 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialAllExcelExportDTO.java @@ -0,0 +1,90 @@ +package com.nflg.wms.common.pojo.dto; + +import lombok.Data; +import org.ttzero.excel.annotation.ExcelColumn; +import org.ttzero.excel.annotation.MediaColumn; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class MaterialAllExcelExportDTO { + + /** + * SAP料号 + */ + @ExcelColumn("SAP料号") + private String no; + + /** + * SAP料号描述 + */ + @ExcelColumn("SAP料号描述") + private String describe; + + /** + * 重量 + */ + @ExcelColumn("重量") + private BigDecimal weight; + + /** + * 长度 + */ + @ExcelColumn("长度") + private BigDecimal length; + + /** + * 宽度 + */ + @ExcelColumn("宽度") + private BigDecimal width; + + /** + * 高度 + */ + @ExcelColumn("高度") + private BigDecimal height; + + /** + * 打包要求 + */ + @ExcelColumn("打包要求") + private String requirement; + + /** + * 图片 + */ + @MediaColumn + private String image; + + /** + * 当前版本号 + */ + @ExcelColumn("当前版本号") + private Integer version; + + /** + * 创建人 + */ + @ExcelColumn("创建人") + private String createBy; + + /** + * 创建时间 + */ + @ExcelColumn("创建时间") + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + @ExcelColumn("最后更新人") + private String updateBy; + + /** + * 最后更新时间 + */ + @ExcelColumn("最后更新时间") + private LocalDateTime updateTime; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialExcelExportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialExcelExportDTO.java index a5b1478e..0137d2c9 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialExcelExportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialExcelExportDTO.java @@ -3,61 +3,64 @@ package com.nflg.wms.common.pojo.dto; import lombok.Data; import lombok.experimental.Accessors; import org.ttzero.excel.annotation.ExcelColumn; -import org.ttzero.excel.annotation.MediaColumn; - -import java.math.BigDecimal; @Data @Accessors(chain = true) public class MaterialExcelExportDTO { + /** + * ID + */ + @ExcelColumn("ID") + private Long id; + /** * SAP料号 */ - @ExcelColumn("*SAP料号") + @ExcelColumn("SAP料号") private String no; /** - * 物料描述 + * SAP料号描述 */ - @ExcelColumn("*物料描述") + @ExcelColumn("SAP料号描述") private String describe; - /** - * 图片 - */ - @MediaColumn - private String image; +// /** +// * 图片 +// */ +// @MediaColumn +// private String image; - /** - * 当前版本号 - */ - @ExcelColumn("当前版本号") - private Integer version; +// /** +// * 当前版本号 +// */ +// @ExcelColumn("当前版本号") +// private Integer version; /** * 重量 */ @ExcelColumn("重量") - private BigDecimal weight; + private String weight; /** * 长度 */ @ExcelColumn("长度") - private BigDecimal length; + private String length; /** * 宽度 */ @ExcelColumn("宽度") - private BigDecimal width; + private String width; /** * 高度 */ @ExcelColumn("高度") - private BigDecimal height; + private String height; /** * 打包要求 @@ -65,9 +68,9 @@ public class MaterialExcelExportDTO { @ExcelColumn("打包要求") private String requirement; - /** - * 备注 - */ - @ExcelColumn("备注") - private String remark; +// /** +// * 备注 +// */ +// @ExcelColumn("备注") +// private String remark; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialDTO.java index 4d49e798..1d285870 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialDTO.java @@ -40,7 +40,7 @@ public class PackageMaterialDTO { /** * 版本 */ - private String version; + private Integer version; /** * 创建人 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomSearchQO.java new file mode 100644 index 00000000..01050ba9 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomSearchQO.java @@ -0,0 +1,20 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class BomSearchQO extends PageQO{ + + /** + * SAP料号 + */ + @NotBlank + private String no; + + /** + * 物料描述 + */ + @NotBlank + private String describe; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomUpdateQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomUpdateQO.java new file mode 100644 index 00000000..4f055a15 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/BomUpdateQO.java @@ -0,0 +1,24 @@ +package com.nflg.wms.common.pojo.qo; + +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class BomUpdateQO { + + /** + * 父级id + */ + @NotNull + private Long parentId; + + /** + * 子级物料 + */ + @NotEmpty + private List children; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBom.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBom.java new file mode 100644 index 00000000..d7fcfceb --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBom.java @@ -0,0 +1,84 @@ +package com.nflg.wms.repository.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + *

+ * 齐套 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Getter +@Setter +@ToString +@TableName("wms_bom") +@Accessors(chain = true) +public class WmsBom implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 上级id + */ + private Long parentId; + + /** + * SAP料号 + */ + private String no; + + /** + * 物料描述 + */ + private String describe; + + /** + * 图号 + */ + private String drawingNo; + + /** + * 数量 + */ + private BigDecimal num; + + /** + * 重量 + */ + private BigDecimal weight; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 最后更新人 + */ + private String updateBy; + + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsBomMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsBomMapper.java new file mode 100644 index 00000000..3e11c653 --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsBomMapper.java @@ -0,0 +1,16 @@ +package com.nflg.wms.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.wms.repository.entity.WmsBom; + +/** + *

+ * 齐套 Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface WmsBomMapper extends BaseMapper { + +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java new file mode 100644 index 00000000..62b90f03 --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java @@ -0,0 +1,27 @@ +package com.nflg.wms.repository.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import com.nflg.wms.common.pojo.qo.BomSearchQO; +import com.nflg.wms.repository.entity.WmsBom; +import jakarta.validation.Valid; + +import java.util.List; + +/** + *

+ * 齐套 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface IWmsBomService extends IService { + + void add(WmsBom parent, List list); + + void update(Long parentId, List list); + + PageData search(@Valid BomSearchQO request); +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsMaterialService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsMaterialService.java index 2280c40a..e7c78e19 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsMaterialService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsMaterialService.java @@ -29,4 +29,6 @@ public interface IWmsMaterialService extends IService { List getHistory(@Valid @NotBlank String no); List getNotSet(); + + WmsMaterial getCurrent(String no); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java new file mode 100644 index 00000000..8f3d3cfb --- /dev/null +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java @@ -0,0 +1,100 @@ +package com.nflg.wms.repository.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.dto.BomMaterialDTO; +import com.nflg.wms.common.pojo.qo.BomSearchQO; +import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.WmsBom; +import com.nflg.wms.repository.mapper.WmsBomMapper; +import com.nflg.wms.repository.service.IWmsBomService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + *

+ * 齐套 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Service +public class WmsBomServiceImpl extends ServiceImpl implements IWmsBomService { + + @Transactional + @Override + public void add(WmsBom parent, List list) { + parent.setParentId(0L); + save(parent); + list.forEach(it -> { + it.setParentId(parent.getId()); + }); + saveBatch(list); + } + + @Transactional + @Override + public void update(Long parentId, List list) { + WmsBom parent = getById(parentId); + VUtil.trueThrowBusinessError(Objects.isNull(parent)).throwMessage("数据不存在"); + parent.setUpdateBy(UserUtil.getUserName()); + parent.setUpdateTime(LocalDateTime.now()); + updateById(parent); + saveOrUpdateBatch(list); + } + + @Override + public PageData search(BomSearchQO request) { + List boms = lambdaQuery() + .like(StrUtil.isNotBlank(request.getNo()), WmsBom::getNo, request.getNo()) + .like(StrUtil.isNotBlank(request.getDescribe()), WmsBom::getDescribe, request.getDescribe()) + .list(); + Set parentIds = boms.stream().map(WmsBom::getParentId).filter(parentId -> !Objects.equals(parentId, 0L)).collect(Collectors.toSet()); + if (CollectionUtil.isNotEmpty(parentIds)) { + boms.addAll(listByIds(parentIds)); + } + List datas = boms.stream() + .filter(it -> it.getParentId() == 0L) + .sorted(Comparator.comparing(WmsBom::getId)) + .skip((long) (request.getPage() - 1) * request.getPageSize()) + .limit(request.getPageSize()) + .map(it -> new BomMaterialDTO() + .setId(it.getId()) + .setParentId(it.getParentId()) + .setNo(it.getNo()) + .setDescribe(it.getDescribe()) + .setDrawingNo(it.getDrawingNo()) + .setNum(it.getNum()) + .setWeight(it.getWeight()) + .setChildren(boms.stream() + .filter(child -> child.getParentId().equals(it.getId())) + .map(child -> { + return new BomMaterialDTO() + .setId(child.getId()) + .setParentId(child.getParentId()) + .setNo(child.getNo()) + .setDescribe(child.getDescribe()) + .setDrawingNo(child.getDrawingNo()) + .setNum(child.getNum()) + .setWeight(child.getWeight()); + }) + .toList() + )).toList(); + return new PageData() + .setPage(request.getPage()) + .setPageSize(request.getPageSize()) + .setTotal(datas.size()) + .setItems(datas); + } +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsMaterialServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsMaterialServiceImpl.java index 28c12938..a792a4da 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsMaterialServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsMaterialServiceImpl.java @@ -60,4 +60,9 @@ public class WmsMaterialServiceImpl extends ServiceImpl getNotSet() { return baseMapper.getNotSet(); } + + @Override + public WmsMaterial getCurrent(String no) { + return lambdaQuery().eq(WmsMaterial::getNo, no).orderByDesc(WmsMaterial::getId).last("limit 1").one(); + } } diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsBomMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsBomMapper.xml new file mode 100644 index 00000000..7d612ad7 --- /dev/null +++ b/nflg-wms-repository/src/main/resources/mapper/WmsBomMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml index 430b2ae8..113b586e 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml @@ -13,7 +13,7 @@ and describe like concat('%', #{request.describe}, '%') - ORDER BY "no",id DESC; + ORDER BY "no",id DESC