diff --git a/nflg-wms-admin/pom.xml b/nflg-wms-admin/pom.xml
index 46080351..63413daf 100644
--- a/nflg-wms-admin/pom.xml
+++ b/nflg-wms-admin/pom.xml
@@ -96,6 +96,10 @@
2.17.0
compile
+
+ org.apache.commons
+ commons-lang3
+
diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java
index d70118af..e5e58b98 100644
--- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ModelController.java
@@ -7,6 +7,7 @@ import com.nflg.wms.common.pojo.qo.EnableQO;
import com.nflg.wms.common.pojo.qo.ModelAddQO;
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
import com.nflg.wms.common.pojo.qo.ModelUpdateQO;
+import com.nflg.wms.common.pojo.vo.WmsModelSimpleVO;
import com.nflg.wms.repository.entity.WmsModel;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
@@ -76,6 +77,14 @@ public class ModelController extends BaseController {
return ApiResult.success(modelControllerService.search(request));
}
+ /**
+ * 获取机型列表
+ */
+ @GetMapping("getSimpleList")
+ public ApiResult> getSimpleList(){
+ return ApiResult.success(modelControllerService.getSimpleList());
+ }
+
/**
* 导入机型
* @param 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
new file mode 100644
index 00000000..3b26a5cc
--- /dev/null
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageController.java
@@ -0,0 +1,114 @@
+package com.nflg.wms.admin.controller;
+
+import com.nflg.wms.admin.service.StructuralPackageControllerService;
+import com.nflg.wms.common.pojo.ApiResult;
+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 jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 钢构包管理
+ */
+@RestController
+@RequestMapping("/package")
+public class StructuralPackageController {
+
+ @Resource
+ private StructuralPackageControllerService packageControllerService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("add")
+ public ApiResult add(@Valid @RequestBody PackageAddQO request){
+ packageControllerService.add(request);
+ return ApiResult.success();
+ }
+
+ /**
+ * 更新
+ */
+ @PostMapping("update")
+ public ApiResult update(@Valid @RequestBody PackageUpdateQO request){
+ packageControllerService.update(request);
+ return ApiResult.success();
+ }
+
+ /**
+ * 启用/禁用
+ * @param request 请求参数
+ */
+ @PostMapping("/enable")
+ public ApiResult enable(@Valid @RequestBody EnableQO request){
+ packageControllerService.enable(request);
+ return ApiResult.success();
+ }
+
+ /**
+ * 搜索
+ * @param request 搜索参数
+ */
+ @PostMapping("search")
+ public ApiResult> search(@Valid @RequestBody PackageSearchQO request){
+ return ApiResult.success(packageControllerService.search(request));
+ }
+
+ /**
+ * 获取图纸历史记录
+ * @param no SAP料号
+ */
+ @GetMapping("/getHistory")
+ public ApiResult> getHistory(@Valid @RequestParam @NotBlank String no){
+ return ApiResult.success(packageControllerService.getHistory(no));
+ }
+
+ /**
+ * 获取详细信息
+ * @param id 包ID
+ */
+ @GetMapping("/getInfo")
+ public ApiResult getInfo(@Valid @RequestParam @NotNull Long id){
+ return ApiResult.success(packageControllerService.getInfo(id));
+ }
+
+ /**
+ * 获取老鼠图
+ * @param request 搜索参数
+ */
+ @PostMapping("getMaterials")
+ public ApiResult> getMaterials(@Valid @RequestBody PackageMaterialSearchQO request){
+ return ApiResult.success(packageControllerService.getMaterials(request));
+ }
+
+ /**
+ * 导出零件清单
+ */
+ @GetMapping("exportMaterials")
+ public void exportMaterials(HttpServletResponse response,@Valid @RequestParam @NotNull Long packageId) throws Exception {
+ packageControllerService.exportMaterials(response,packageId);
+ }
+
+ /**
+ * 导入零件清单
+ * @param file 文件
+ */
+ @Transactional
+ @PostMapping("importMaterials")
+ public ApiResult importMaterials(HttpServletResponse response,@Valid @RequestParam @NotNull Long packageId
+ , @RequestParam(value = "file") MultipartFile file) throws IOException {
+ return packageControllerService.importMaterials(response,packageId,file);
+ }
+
+}
diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java
index ccf68a84..92979088 100644
--- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ModelControllerService.java
@@ -13,6 +13,7 @@ import com.nflg.wms.common.pojo.qo.EnableQO;
import com.nflg.wms.common.pojo.qo.ModelAddQO;
import com.nflg.wms.common.pojo.qo.ModelSearchQO;
import com.nflg.wms.common.pojo.qo.ModelUpdateQO;
+import com.nflg.wms.common.pojo.vo.WmsModelSimpleVO;
import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.UserUtil;
@@ -132,12 +133,7 @@ public class ModelControllerService {
public void exportSelect(HttpServletResponse response,List ids) throws IOException {
List users = CollectionUtil.isNotEmpty(ids)?modelService.listByIds(ids):new ArrayList<>();
- List datas = users.stream().map(model -> {
- ModelExcelExportDTO dto = new ModelExcelExportDTO();
- dto.setNo(model.getNo());
- dto.setRemark(model.getRemark());
- return dto;
- }).collect(Collectors.toList());
+ List datas = users.stream().map(model -> Convert.convert(ModelExcelExportDTO.class, model)).collect(Collectors.toList());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("机型导出.xlsx", StandardCharsets.UTF_8));
if (CollectionUtil.isEmpty(datas)){
@@ -149,4 +145,14 @@ public class ModelControllerService {
.addSheet(new ListSheet<>(datas))
.writeTo(response.getOutputStream());
}
+
+ public List getSimpleList() {
+ return modelService.lambdaQuery()
+ .select(WmsModel::getId, WmsModel::getNo)
+ .eq(WmsModel::getEnable, true)
+ .list()
+ .stream()
+ .map(model -> Convert.convert(WmsModelSimpleVO.class, model))
+ .collect(Collectors.toList());
+ }
}
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
new file mode 100644
index 00000000..a9b25e07
--- /dev/null
+++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StructuralPackageControllerService.java
@@ -0,0 +1,206 @@
+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.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.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.WmsStructuralPackage;
+import com.nflg.wms.repository.service.IWmsStructuralPackageService;
+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.NotNull;
+import org.apache.commons.lang3.math.NumberUtils;
+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 java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Component
+public class StructuralPackageControllerService {
+
+ @Resource
+ private IWmsStructuralPackageService packageService;
+
+ @Resource
+ private FileUploadService fileUploadService;
+
+
+ @Transactional
+ public void add(@Valid PackageAddQO request) {
+ WmsStructuralPackage structuralPackage = Convert.convert(WmsStructuralPackage.class, request);
+ structuralPackage.setCreateBy(UserUtil.getUserName());
+ structuralPackage.setCreateTime(LocalDateTime.now());
+ structuralPackage.setModelIds(StrUtil.join(",", request.getModelIds()));
+ structuralPackage.setMaterials(JSONUtil.toJsonStr(request.getMaterials()));
+ packageService.add(structuralPackage);
+ }
+
+ public void update(@Valid PackageUpdateQO request) {
+ WmsStructuralPackage structuralPackage = Convert.convert(WmsStructuralPackage.class, request);
+ structuralPackage.setUpdateBy(UserUtil.getUserName());
+ structuralPackage.setUpdateTime(LocalDateTime.now());
+ structuralPackage.setModelIds(StrUtil.join(",", request.getModelIds()));
+ structuralPackage.setMaterials(JSONUtil.toJsonStr(request.getMaterials()));
+ packageService.update(structuralPackage);
+ }
+
+ public void enable(@Valid EnableQO request) {
+ packageService.enable(request);
+ }
+
+ public IPage search(@Valid PackageSearchQO request) {
+ return packageService.search(request);
+ }
+
+ public List getHistory(@Valid @NotBlank String no) {
+ return packageService.getHistory(no);
+ }
+
+ public PackageVO getInfo(@Valid @NotNull Long id) {
+ return packageService.getInfo(id);
+ }
+
+ public PageData getMaterials(@Valid PackageMaterialSearchQO request) {
+ return packageService.getMaterials(request);
+ }
+
+ public void exportMaterials(HttpServletResponse response,Long packageId) throws IOException {
+ PackageVO vo = packageService.getInfo(packageId);
+ List datas = vo.getMaterialList().stream().map(info -> Convert.convert(PackageMaterialExcelExportDTO.class, info)).collect(Collectors.toList());
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(vo.getNo()+"零件清单导出.xlsx", StandardCharsets.UTF_8));
+ if (CollectionUtil.isEmpty(datas)){
+ datas.add(new PackageMaterialExcelExportDTO()
+ .setNo("(必填)零件编码")
+ .setName("(必填)零件名称")
+ .setStation("(必填)工位序号")
+ .setTray("(必填)托盘序号")
+ .setWeight(BigDecimal.ZERO)
+ .setNum(BigDecimal.ZERO)
+ .setVersion("(必填)图纸版本"));
+ }
+ new Workbook()
+ .addSheet(new ListSheet<>(datas))
+ .writeTo(response.getOutputStream());
+ }
+
+ @Transactional
+ public ApiResult importMaterials(HttpServletResponse response, @Valid @NotNull Long packageId, MultipartFile file) throws IOException {
+ PackageVO vo = packageService.getInfo(packageId);
+ VUtil.trueThrowBusinessError(Objects.isNull(vo)).throwMessage("未找到该结构包");
+ List data = EecExcelUtil.getExcelContext(file.getInputStream(), PackageMaterialExcelImportDTO.class);
+ VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(data)).throwMessage("导入文件内容为空");
+ if (checkAndImport(vo, data)) {
+ return ApiResult.success();
+ } else {
+ try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) {
+ new Workbook()
+ .addSheet(new ListSheet<>(data))
+ .writeTo(osOut);
+ try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) {
+ return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败", fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx", isIn));
+ }
+ } catch (Exception e) {
+ return ApiResult.error(STATE.BusinessError, "保存文件出错");
+ }
+ }
+ }
+
+ @Transactional
+ public boolean checkAndImport(PackageVO vo,List data) {
+ List materialDTOS = new ArrayList<>();
+ for (PackageMaterialExcelImportDTO dto : data) {
+ PackageMaterialDTO materialDTO = new PackageMaterialDTO();
+ StringBuilder sb = new StringBuilder();
+ if (StrUtil.isBlank(dto.getNo())) {
+ sb.append("零件编码不能为空;");
+ } else {
+ materialDTO.setNo(dto.getNo());
+ }
+ if (StrUtil.isBlank(dto.getName())) {
+ sb.append("零件名称不能为空;");
+ } else {
+ materialDTO.setName(dto.getName());
+ }
+ if (StrUtil.isBlank(dto.getStation())) {
+ sb.append("工位序号不能为空;");
+ } else {
+ materialDTO.setStation(dto.getStation());
+ }
+ if (StrUtil.isBlank(dto.getTray())) {
+ sb.append("托盘序号不能为空;");
+ } else {
+ materialDTO.setTray(dto.getTray());
+ }
+ if (StrUtil.isBlank(dto.getNum())) {
+ sb.append("数量不能为空;");
+ }else if(!NumberUtils.isCreatable(dto.getNum())){
+ sb.append("数量无效;");
+ }
+ else {
+ materialDTO.setNum(new BigDecimal(dto.getNum()));
+ }
+ if (StrUtil.isBlank(dto.getWeight())) {
+ sb.append("重量不能为空;");
+ }else if(!NumberUtils.isCreatable(dto.getWeight())){
+ sb.append("重量无效;");
+ }
+ else {
+ materialDTO.setWeight(new BigDecimal(dto.getWeight()));
+ }
+ if (StrUtil.isBlank(dto.getVersion())) {
+ sb.append("图纸版本不能为空;");
+ } else {
+ materialDTO.setVersion(dto.getVersion());
+ }
+ dto.setError(sb.toString());
+ materialDTOS.add(materialDTO);
+ }
+ if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) {
+ List materials = new ArrayList<>(vo.getMaterialList());
+ materials.removeIf(info -> materialDTOS.stream().anyMatch(it -> it.getNo().equals(info.getNo())));
+ materials.addAll(materialDTOS);
+ packageService.lambdaUpdate()
+ .set(WmsStructuralPackage::getMaterials, JSONUtil.toJsonStr(materials))
+ .set(WmsStructuralPackage::getUpdateBy, UserUtil.getUserName())
+ .set(WmsStructuralPackage::getUpdateTime, LocalDateTime.now())
+ .eq(WmsStructuralPackage::getId, vo.getId())
+ .update();
+ return true;
+ }
+ return false;
+ }
+}
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
new file mode 100644
index 00000000..4d49e798
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialDTO.java
@@ -0,0 +1,64 @@
+package com.nflg.wms.common.pojo.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class PackageMaterialDTO {
+
+ /**
+ * 编号
+ */
+ private String no;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 工位
+ */
+ private String station;
+
+ /**
+ * 托盘
+ */
+ private String tray;
+
+ /**
+ * 数量
+ */
+ private BigDecimal num;
+
+ /**
+ * 重量
+ */
+ private BigDecimal weight;
+
+ /**
+ * 版本
+ */
+ private String version;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private String createTime;
+
+ /**
+ * 修改人
+ */
+ private String updateBy;
+
+ /**
+ * 修改时间
+ */
+ private String updateTime;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelExportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelExportDTO.java
new file mode 100644
index 00000000..cdef3960
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelExportDTO.java
@@ -0,0 +1,54 @@
+package com.nflg.wms.common.pojo.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.ttzero.excel.annotation.ExcelColumn;
+
+import java.math.BigDecimal;
+
+@Data
+@Accessors(chain = true)
+public class PackageMaterialExcelExportDTO {
+
+ /**
+ * 零件编码
+ */
+ @ExcelColumn("零件编码")
+ private String no;
+
+ /**
+ * 零件名称
+ */
+ @ExcelColumn("零件名称")
+ private String name;
+
+ /**
+ * 工位序号
+ */
+ @ExcelColumn("工位序号")
+ private String station;
+
+ /**
+ * 托盘序号
+ */
+ @ExcelColumn("托盘序号")
+ private String tray;
+
+ /**
+ * 数量
+ */
+ @ExcelColumn("数量")
+ private BigDecimal num;
+
+ /**
+ * 单个重量
+ */
+ @ExcelColumn("单个重量")
+ private BigDecimal weight;
+
+ /**
+ * 图纸版本
+ */
+ @ExcelColumn("图纸版本")
+ private String version;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelImportDTO.java
new file mode 100644
index 00000000..5fa26973
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/PackageMaterialExcelImportDTO.java
@@ -0,0 +1,56 @@
+package com.nflg.wms.common.pojo.dto;
+
+import lombok.Data;
+import org.ttzero.excel.annotation.ExcelColumn;
+
+@Data
+public class PackageMaterialExcelImportDTO {
+
+ /**
+ * 零件编码
+ */
+ @ExcelColumn("零件编码")
+ private String no;
+
+ /**
+ * 零件名称
+ */
+ @ExcelColumn("零件名称")
+ private String name;
+
+ /**
+ * 工位序号
+ */
+ @ExcelColumn("工位序号")
+ private String station;
+
+ /**
+ * 托盘序号
+ */
+ @ExcelColumn("托盘序号")
+ private String tray;
+
+ /**
+ * 数量
+ */
+ @ExcelColumn("数量")
+ private String num;
+
+ /**
+ * 单个重量
+ */
+ @ExcelColumn("单个重量")
+ private String weight;
+
+ /**
+ * 图纸版本
+ */
+ @ExcelColumn("图纸版本")
+ private String version;
+
+ /**
+ * 错误信息
+ */
+ @ExcelColumn("错误信息")
+ private String error;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java
index cc2c04a3..0427e004 100644
--- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialAddQO.java
@@ -20,6 +20,11 @@ public class MaterialAddQO {
@NotBlank
private String describe;
+ /**
+ * 图号
+ */
+ private String drawingNo;
+
/**
* 图片
*/
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java
new file mode 100644
index 00000000..7791f9a8
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageAddQO.java
@@ -0,0 +1,78 @@
+package com.nflg.wms.common.pojo.qo;
+
+import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class PackageAddQO {
+
+ /**
+ * 编码
+ */
+ @NotBlank
+ private String no;
+
+ /**
+ * 名称
+ */
+ @NotBlank
+ private String name;
+
+ /**
+ * 图号
+ */
+ @NotBlank
+ private String drawingNo;
+
+ /**
+ * 总重
+ */
+ @NotNull
+ private BigDecimal weight;
+
+ /**
+ * 机型编号
+ */
+ @NotEmpty
+ private List modelIds;
+
+ /**
+ * 种类
+ */
+ @NotBlank
+ private String cate;
+
+ /**
+ * ECO
+ */
+ private String eco;
+
+ /**
+ * 版本号
+ */
+ @NotNull
+ private Integer version;
+
+ /**
+ * 修改日志
+ */
+ private String remark;
+
+ /**
+ * 是否启用
+ */
+ @NotNull
+ private Boolean enable;
+
+ /**
+ * 零件清单
+ */
+ @NotEmpty
+ private List materials;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageMaterialSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageMaterialSearchQO.java
new file mode 100644
index 00000000..2f7aaf9c
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageMaterialSearchQO.java
@@ -0,0 +1,14 @@
+package com.nflg.wms.common.pojo.qo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class PackageMaterialSearchQO extends PageQO {
+
+ /**
+ * 钢构包id
+ */
+ @NotNull
+ private Long packageId;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageSearchQO.java
new file mode 100644
index 00000000..5cc56397
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageSearchQO.java
@@ -0,0 +1,19 @@
+package com.nflg.wms.common.pojo.qo;
+
+import lombok.Data;
+
+@Data
+public class PackageSearchQO extends PageQO {
+
+ /**
+ * 钢构包料号/名称
+ */
+ private String no;
+
+ private String eco;
+
+ /**
+ * 机型id
+ */
+ private Long modelId;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageUpdateQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageUpdateQO.java
new file mode 100644
index 00000000..8136b453
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/PackageUpdateQO.java
@@ -0,0 +1,11 @@
+package com.nflg.wms.common.pojo.qo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class PackageUpdateQO extends PackageAddQO{
+
+ @NotNull
+ private Long id;
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialVO.java
index 1caf070e..f5450aae 100644
--- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialVO.java
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialVO.java
@@ -21,6 +21,11 @@ public class MaterialVO {
*/
private String describe;
+ /**
+ * 图号
+ */
+ private String drawingNo;
+
/**
* 图片
*/
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PackageVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PackageVO.java
new file mode 100644
index 00000000..204225fc
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/PackageVO.java
@@ -0,0 +1,106 @@
+package com.nflg.wms.common.pojo.vo;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+
+@Data
+public class PackageVO {
+
+ private Long id;
+
+ /**
+ * 编码
+ */
+ private String no;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 图号
+ */
+ private String drawingNo;
+
+ /**
+ * 总重
+ */
+ private BigDecimal weight;
+
+ /**
+ * 种类
+ */
+ private String cate;
+
+ /**
+ * ECO
+ */
+ private String eco;
+
+ /**
+ * 版本号
+ */
+ private Integer version;
+
+ /**
+ * 修改日志
+ */
+ private String remark;
+
+ /**
+ * 是否启用
+ */
+ private Boolean enable;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 最后更新人
+ */
+ private String updateBy;
+
+ /**
+ * 最后更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 机型编号
+ */
+ private String modelNos;
+
+ /**
+ * 零件清单
+ */
+ @JsonIgnore
+ private String materials;
+
+ /**
+ * 零件清单
+ */
+ private List materialList;
+
+ public List getMaterialList() {
+ if (StrUtil.isBlank( materials)){
+ return Collections.emptyList();
+ }
+ return JSONUtil.toList(materials, PackageMaterialDTO.class);
+ }
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/WmsModelSimpleVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/WmsModelSimpleVO.java
new file mode 100644
index 00000000..4670bfa9
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/WmsModelSimpleVO.java
@@ -0,0 +1,14 @@
+package com.nflg.wms.common.pojo.vo;
+
+import lombok.Data;
+
+@Data
+public class WmsModelSimpleVO {
+
+ private Long id;
+
+ /**
+ * 机型编号
+ */
+ private String no;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java
index 03d5303b..82a15a1f 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java
@@ -40,6 +40,11 @@ public class WmsMaterial implements Serializable {
*/
private String describe;
+ /**
+ * 图号
+ */
+ private String drawingNo;
+
/**
* 图片
*/
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java
new file mode 100644
index 00000000..d71a3a6d
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStructuralPackage.java
@@ -0,0 +1,109 @@
+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
+@Accessors(chain = true)
+@TableName("wms_structural_package")
+public class WmsStructuralPackage implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 编码
+ */
+ private String no;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 图号
+ */
+ private String drawingNo;
+
+ /**
+ * 总重
+ */
+ private BigDecimal weight;
+
+ /**
+ * 机型编号
+ */
+ private String modelIds;
+
+ /**
+ * 种类
+ */
+ private String cate;
+
+ /**
+ * ECO
+ */
+ private String eco;
+
+ /**
+ * 版本号
+ */
+ private Integer version;
+
+ /**
+ * 修改日志
+ */
+ private String remark;
+
+ /**
+ * 是否启用
+ */
+ private Boolean enable;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 最后更新人
+ */
+ private String updateBy;
+
+ /**
+ * 最后更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 零件清单
+ */
+ private String materials;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageMapper.java
new file mode 100644
index 00000000..8c47ecc7
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageMapper.java
@@ -0,0 +1,27 @@
+package com.nflg.wms.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nflg.wms.common.pojo.qo.PackageSearchQO;
+import com.nflg.wms.common.pojo.vo.PackageVO;
+import com.nflg.wms.repository.entity.WmsStructuralPackage;
+
+import java.util.List;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface WmsStructuralPackageMapper extends BaseMapper {
+
+ IPage search(PackageSearchQO request, Page> objectPage);
+
+ List getHistory(String no);
+
+ PackageVO getInfo(Long id);
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageService.java
new file mode 100644
index 00000000..da83d868
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageService.java
@@ -0,0 +1,41 @@
+package com.nflg.wms.repository.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.nflg.wms.common.pojo.PageData;
+import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
+import com.nflg.wms.common.pojo.qo.EnableQO;
+import com.nflg.wms.common.pojo.qo.PackageMaterialSearchQO;
+import com.nflg.wms.common.pojo.qo.PackageSearchQO;
+import com.nflg.wms.common.pojo.vo.PackageVO;
+import com.nflg.wms.repository.entity.WmsStructuralPackage;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+public interface IWmsStructuralPackageService extends IService {
+
+ void add(WmsStructuralPackage structuralPackage);
+
+ void update(WmsStructuralPackage structuralPackage);
+
+ void enable(@Valid EnableQO request);
+
+ IPage search(@Valid PackageSearchQO request);
+
+ List getHistory(@Valid @NotBlank String no);
+
+ PackageVO getInfo(@Valid @NotNull Long id);
+
+ PageData getMaterials(@Valid PackageMaterialSearchQO request);
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageServiceImpl.java
new file mode 100644
index 00000000..1aa60bdb
--- /dev/null
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageServiceImpl.java
@@ -0,0 +1,104 @@
+package com.nflg.wms.repository.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.nflg.wms.common.pojo.PageData;
+import com.nflg.wms.common.pojo.dto.PackageMaterialDTO;
+import com.nflg.wms.common.pojo.qo.EnableQO;
+import com.nflg.wms.common.pojo.qo.PackageMaterialSearchQO;
+import com.nflg.wms.common.pojo.qo.PackageSearchQO;
+import com.nflg.wms.common.pojo.vo.PackageVO;
+import com.nflg.wms.common.util.UserUtil;
+import com.nflg.wms.common.util.VUtil;
+import com.nflg.wms.repository.entity.WmsStructuralPackage;
+import com.nflg.wms.repository.mapper.WmsStructuralPackageMapper;
+import com.nflg.wms.repository.service.IAuditLogService;
+import com.nflg.wms.repository.service.IWmsStructuralPackageService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author 代码生成器生成
+ * @since 2025
+ */
+@Service
+public class WmsStructuralPackageServiceImpl extends ServiceImpl implements IWmsStructuralPackageService {
+
+ @Resource
+ private IAuditLogService auditLogService;
+
+ @Transactional
+ @Override
+ public void add(WmsStructuralPackage structuralPackage) {
+ VUtil.trueThrowBusinessError(lambdaQuery().eq(WmsStructuralPackage::getNo, structuralPackage.getNo())
+ .eq(WmsStructuralPackage::getVersion, structuralPackage.getVersion())
+ .ne(Objects.nonNull(structuralPackage.getId()),WmsStructuralPackage::getId, structuralPackage.getId())
+ .exists()).throwMessage("该版本的钢构包编码已存在");
+ save(structuralPackage);
+ auditLogService.addInsert(WmsStructuralPackage.class, structuralPackage,structuralPackage.getCreateBy());
+ }
+
+ @Transactional
+ @Override
+ public void update(WmsStructuralPackage structuralPackage) {
+ WmsStructuralPackage old=getById(structuralPackage.getId());
+ VUtil.trueThrowBusinessError(Objects.isNull(old)).throwMessage("该钢构包不存在");
+ VUtil.trueThrowBusinessError(Objects.equals(structuralPackage.getVersion(),old.getVersion()))
+ .throwMessage("更新数据必须修改版本号");
+ structuralPackage.setId(null);
+ add(structuralPackage);
+ }
+
+ @Transactional
+ @Override
+ public void enable(EnableQO request) {
+ WmsStructuralPackage old = getById(request.getId());
+ VUtil.trueThrowBusinessError(Objects.isNull(old)).throwMessage("钢构包不存在");
+ lambdaUpdate()
+ .set(WmsStructuralPackage::getEnable, request.getEnable())
+ .set(WmsStructuralPackage::getUpdateBy, UserUtil.getUserName())
+ .set(WmsStructuralPackage::getUpdateTime, LocalDateTime.now())
+ .eq(WmsStructuralPackage::getId, request.getId())
+ .update();
+ WmsStructuralPackage newInfo = getById(request.getId());
+ auditLogService.addUpdate(WmsStructuralPackage.class, old, newInfo, UserUtil.getUserName());
+ }
+
+ @Override
+ public IPage search(PackageSearchQO request) {
+ return baseMapper.search(request,new Page<>(request.getPage(),request.getPageSize()));
+ }
+
+ @Override
+ public List getHistory(String no) {
+ return baseMapper.getHistory(no);
+ }
+
+ @Override
+ public PackageVO getInfo(Long id) {
+ return baseMapper.getInfo(id);
+ }
+
+ @Override
+ public PageData getMaterials(PackageMaterialSearchQO request) {
+ WmsStructuralPackage info = getById(request.getPackageId());
+ List materials = JSONUtil.toList(info.getMaterials(), PackageMaterialDTO.class);
+ materials = materials.stream().skip(request.getPage() - 1).limit(request.getPageSize()).toList();
+ return new PageData()
+ .setPage(request.getPage())
+ .setPageSize(request.getPageSize())
+ .setTotal(materials.size())
+ .setItems(materials);
+ }
+}
diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml
index 029b5e74..430b2ae8 100644
--- a/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml
+++ b/nflg-wms-repository/src/main/resources/mapper/WmsMaterialMapper.xml
@@ -4,11 +4,14 @@
diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml
new file mode 100644
index 00000000..75b30995
--- /dev/null
+++ b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java b/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java
index 356b0280..5588d791 100644
--- a/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java
+++ b/nflg-wms-repository/src/test/java/com/nflg/wms/repository/CodeGeneratorTest.java
@@ -33,7 +33,7 @@ public class CodeGeneratorTest {
)
.strategyConfig(builder -> {
builder
- .addInclude("wms_storage_bin") //只生成指定表
+ .addInclude("wms_structural_package") //只生成指定表
.entityBuilder().idType(IdType.ASSIGN_ID)
.enableLombok()
.enableChainModel()