From b3cbd8cec13746f156c7b9b3406d7c220063e2ae Mon Sep 17 00:00:00 2001
From: qianshijiang <1965297290@qq.com>
Date: Tue, 30 Dec 2025 16:00:21 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
base-server/src/main/resources/logback-spring.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/base-server/src/main/resources/logback-spring.xml b/base-server/src/main/resources/logback-spring.xml
index 1af842df..19d38bf5 100644
--- a/base-server/src/main/resources/logback-spring.xml
+++ b/base-server/src/main/resources/logback-spring.xml
@@ -90,6 +90,12 @@
+
+
+
+
+
+
From 791fe644bff1e5fae1fe49e8adf45f8c0f6549b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=BD=98=E8=8D=A3=E6=99=9F?=
<9691125+pan-rongsheng@user.noreply.gitee.com>
Date: Tue, 30 Dec 2025 17:55:08 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=8B=93=E5=B1=95?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../module/erp/enums/ErrorCodeConstants.java | 2 +
.../admin/erp/ErpMaterialController.java | 5 +-
.../erp/vo/ErpMaterialCorrSaveReqVO.java | 27 ++-
.../admin/erp/vo/MaterialAttributeUtils.java | 211 ++++++++++++++++++
.../rpc/config/RpcConfiguration.java | 16 ++
.../erp/ErpErpMaterialCorrService.java | 2 +-
.../erp/ErpErpMaterialCorrServiceImpl.java | 17 +-
.../service/erp/ErpFactoryServiceImpl.java | 5 +
.../erp/service/erp/ErpMaterialService.java | 2 +-
.../service/erp/ErpMaterialServiceImpl.java | 90 +++++++-
10 files changed, 346 insertions(+), 31 deletions(-)
create mode 100644 zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/MaterialAttributeUtils.java
create mode 100644 zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/framework/rpc/config/RpcConfiguration.java
diff --git a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/enums/ErrorCodeConstants.java b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/enums/ErrorCodeConstants.java
index 1e9b2f20..7a7ec42b 100644
--- a/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/enums/ErrorCodeConstants.java
+++ b/zt-module-erp/zt-module-erp-api/src/main/java/com/zt/plat/module/erp/enums/ErrorCodeConstants.java
@@ -55,4 +55,6 @@ public interface ErrorCodeConstants {
ErrorCode ERP_CONTRACT_NOT_EXISTS = new ErrorCode(1_016_000_001, "ERP合同数据不存在");
ErrorCode ERP_PRODUCTIVE_ORDER_NOT_EXISTS = new ErrorCode(1_017_000_001, "ERP生产订单数据不存在");
+
+ ErrorCode MATERIAL_ERROR = new ErrorCode( 1_017_000_009, "主物料信息错误");
}
\ No newline at end of file
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
index 087210c5..4f959433 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
@@ -38,7 +38,6 @@ public class ErpMaterialController {
@Resource
private ErpMaterialService erpMaterialService;
-
@PostMapping("/create")
@Operation(summary = "创建ERP物料数据")
@PreAuthorize("@ss.hasPermission('sply:erp-material:create')")
@@ -121,8 +120,8 @@ public class ErpMaterialController {
@PostMapping("/createErpMaterialCorr")
@Operation(summary = "创建ERP物料关系")
@PreAuthorize("@ss.hasPermission('sply:erp-material:create')")
- public CommonResult> createErpMaterialCorr(@Valid @RequestBody List erpMaterialCorrSaveReqVOS) {
- return success(erpMaterialService.createErpMaterialCorr(erpMaterialCorrSaveReqVOS));
+ public CommonResult> createErpMaterialCorr(@Valid @RequestBody ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO) {
+ return success(erpMaterialService.createErpMaterialCorr(erpMaterialCorrSaveReqVO));
}
//删除物料关系
@DeleteMapping("/deleteErpMaterialCorr")
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpMaterialCorrSaveReqVO.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpMaterialCorrSaveReqVO.java
index 33708985..f325a67b 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpMaterialCorrSaveReqVO.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/ErpMaterialCorrSaveReqVO.java
@@ -1,11 +1,12 @@
package com.zt.plat.module.erp.controller.admin.erp.vo;
-
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
+import java.util.List;
+
@Schema(description = "管理后台 - 物料拓展关系 Request VO")
@Data
public class ErpMaterialCorrSaveReqVO {
@@ -22,19 +23,25 @@ public class ErpMaterialCorrSaveReqVO {
@NotNull(message = "拓展关系主物料不能为空")
private Long materialParentId;
- /**
- * 物料ID
- */
- @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED)
- private Long materialId;
/**
* 拓展关系主物料编号
*/
@Schema(description = "拓展关系主物料编号")
- private String materialParentCode;
+ private String materialParentCode;
/**
- * 物料编码
+ * 拓展关系物料
*/
- @Schema(description = "拓展关系物料编号")
- private String materialCode;
+ @Schema(description = "拓展关系物料")
+ private List materials;
+
+ @Data
+ @Schema(description = "拓展关系物料")
+ public static class Materials {
+ @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long materialId;
+ @Schema(description = "物料编码")
+ private String materialCode;
+ }
}
+
+
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/MaterialAttributeUtils.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/MaterialAttributeUtils.java
new file mode 100644
index 00000000..33744a74
--- /dev/null
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/vo/MaterialAttributeUtils.java
@@ -0,0 +1,211 @@
+package com.zt.plat.module.erp.controller.admin.erp.vo;
+
+import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationRespDTO;
+import lombok.Getter;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 物料扩展属性安全取值工具类(适配所有属性编码)
+ */
+public class MaterialAttributeUtils {
+
+ /**
+ * 物料属性编码枚举(统一管理所有属性code)
+ * 关联属性编码、名称、数据类型
+ */
+ @Getter
+ public enum MaterialAttrCode {
+ MTRL_BASE_UNIT_CODE("mtrlBaseUnitCode", "基本计量单位编码", DataType.STRING),
+ MTRL_BASE_UNIT_NAME("mtrlBaseUnitName", "基本计量单位描述", DataType.STRING),
+ MTRL_SHORT_DESC("mtrlShortDesc", "短描述", DataType.STRING),
+ MTRL_LONG_DESC("mtrlLongDesc", "长描述", DataType.STRING),
+ MTRL_CHALCO_CODE("mtrlChalcoCode", "中铝编码", DataType.STRING),
+ MTRL_ZHONGTONG_CODE("mtrlZhongtongCode", "中铜编码", DataType.STRING),
+ MTRL_SPECIFICATION("mtrlSpecification", "规格", DataType.STRING),
+ MTRL_TEXTURE("mtrlTexture", "材质", DataType.STRING),
+ MTRL_RECORD_TIME("mtrlRecordTime", "记录时间", DataType.DATETIME),
+ MTRL_DRAWING_NUMBER("mtrlDrawingNumber", "图号", DataType.STRING),
+ MTRL_ORDER_NUMBER("mtrlOrderNumber", "订货号", DataType.STRING),
+ MTRL_OTHER_PARAMETERS("mtrlOtherParameters", "其它参数", DataType.STRING),
+ MTRL_EQUIPMENT_CATEGORY("mtrlEquipmentCategory", "设备类别", DataType.STRING),
+ MTRL_MANUFACTURER("mtrlManufacturer", "主机生产商", DataType.STRING),
+ MTRL_SOURCE("mtrlSource", "来源", DataType.STRING),
+ MTRL_MODEL("mtrlModel", "型号", DataType.STRING),
+ MTRL_ELEMENT("mtrlElement", "金属元素", DataType.TEXT),
+ MTRL_DECIMAL("mtrlDecimal", "小数位数", DataType.NUMBER);
+
+ private final String code;
+ private final String name;
+ private final DataType dataType;
+
+ MaterialAttrCode(String code, String name, DataType dataType) {
+ this.code = code;
+ this.name = name;
+ this.dataType = dataType;
+ }
+
+ // 根据code获取枚举(容错)
+ public static MaterialAttrCode getByCode(String code) {
+ if (code == null || code.isEmpty()) {
+ return null;
+ }
+ for (MaterialAttrCode attrCode : values()) {
+ if (attrCode.code.equals(code)) {
+ return attrCode;
+ }
+ }
+ return null;
+ }
+
+ // 获取所有属性编码列表
+ public static List getAllCodes() {
+ return Arrays.stream(values())
+ .map(MaterialAttrCode::getCode)
+ .collect(Collectors.toList());
+ }
+ }
+
+ /**
+ * 数据类型枚举
+ */
+ public enum DataType {
+ STRING, NUMBER, TEXT, DATETIME
+ }
+
+ /**
+ * 物料属性封装Record(Java 16+)
+ * 包含所有属性的安全取值
+ */
+ public record MaterialAttribute(
+ // 基础属性
+ String mtrlBaseUnitCode,
+ String mtrlBaseUnitName,
+ String mtrlShortDesc,
+ String mtrlLongDesc,
+ String mtrlChalcoCode,
+ String mtrlZhongtongCode,
+ String mtrlSpecification,
+ String mtrlTexture,
+ LocalDateTime mtrlRecordTime,
+ // 扩展属性
+ String mtrlDrawingNumber,
+ String mtrlOrderNumber,
+ String mtrlOtherParameters,
+ String mtrlEquipmentCategory,
+ String mtrlManufacturer,
+ String mtrlSource,
+ String mtrlModel,
+ String mtrlElement,
+ Integer mtrlDecimal // 小数位数(数字类型)
+ ) {
+ // 空值默认构造器(避免NPE)
+ public static MaterialAttribute empty() {
+ return new MaterialAttribute(
+ null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null
+ );
+ }
+ }
+
+ /**
+ * 从DTO中安全提取所有物料属性
+ * @param dto 物料信息DTO
+ * @return 封装后的物料属性Record
+ */
+ public static MaterialAttribute safeExtractAllAttributes(MaterialInfomationRespDTO dto) {
+ // 1. 空值校验
+ if (dto == null || dto.getFlatAttributes() == null) {
+ return MaterialAttribute.empty();
+ }
+
+ Map attrs = dto.getFlatAttributes();
+
+ // 2. 按数据类型安全取值
+ return new MaterialAttribute(
+ getTypedValue(attrs, MaterialAttrCode.MTRL_BASE_UNIT_CODE),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_BASE_UNIT_NAME),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_SHORT_DESC),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_LONG_DESC),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_CHALCO_CODE),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_ZHONGTONG_CODE),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_SPECIFICATION),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_TEXTURE),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_RECORD_TIME),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_DRAWING_NUMBER),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_ORDER_NUMBER),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_OTHER_PARAMETERS),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_EQUIPMENT_CATEGORY),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_MANUFACTURER),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_SOURCE),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_MODEL),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_ELEMENT),
+ getTypedValue(attrs, MaterialAttrCode.MTRL_DECIMAL)
+ );
+ }
+
+ /**
+ * 通用类型安全取值方法
+ * @param attrs 属性Map
+ * @param attrCode 属性编码枚举
+ * @return 对应类型的值(空/类型不匹配返回null)
+ */
+ @SuppressWarnings("unchecked")
+ private static T getTypedValue(Map attrs, MaterialAttrCode attrCode) {
+ if (attrCode == null) {
+ return null;
+ }
+
+ Object value = attrs.get(attrCode.getCode());
+ if (value == null || value.toString().trim().isEmpty()) {
+ return null;
+ }
+
+ String strValue = value.toString().trim();
+ try {
+ // 根据数据类型转换
+ return switch (attrCode.getDataType()) {
+ case STRING, TEXT -> (T) strValue;
+ case NUMBER -> (T) Integer.valueOf(strValue);
+ case DATETIME -> (T) LocalDateTime.parse(strValue);
+ };
+ } catch (NumberFormatException | DateTimeParseException | ClassCastException e) {
+ // 类型转换失败返回null,可添加日志
+ return null;
+ }
+ }
+
+ /**
+ * 单独获取某个属性值(按需取值)
+ * @param dto 物料DTO
+ * @param attrCode 属性编码枚举
+ * @return 对应类型的值
+ */
+ public static T getSingleAttribute(MaterialInfomationRespDTO dto, MaterialAttrCode attrCode) {
+ if (dto == null || dto.getFlatAttributes() == null || attrCode == null) {
+ return null;
+ }
+ return getTypedValue(dto.getFlatAttributes(), attrCode);
+ }
+
+ /**
+ * 获取flatAttributes中存在的所有属性编码(过滤空值)
+ * @param dto 物料DTO
+ * @return 非空属性编码列表
+ */
+ public static List getExistAttributeCodes(MaterialInfomationRespDTO dto) {
+ if (dto == null || dto.getFlatAttributes() == null) {
+ return Collections.emptyList();
+ }
+
+ return dto.getFlatAttributes().entrySet().stream()
+ .filter(entry -> entry.getValue() != null && !entry.getValue().toString().trim().isEmpty())
+ .map(Map.Entry::getKey)
+ .filter(key -> MaterialAttrCode.getByCode(key) != null) // 只保留枚举中定义的编码
+ .collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/framework/rpc/config/RpcConfiguration.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/framework/rpc/config/RpcConfiguration.java
new file mode 100644
index 00000000..c1ce4caa
--- /dev/null
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/framework/rpc/config/RpcConfiguration.java
@@ -0,0 +1,16 @@
+package com.zt.plat.module.erp.framework.rpc.config;
+
+import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi;
+import com.zt.plat.module.infra.api.businessfile.BusinessFileApi;
+import com.zt.plat.module.infra.api.file.FileApi;
+
+import com.zt.plat.module.system.api.dept.DeptApi;
+import com.zt.plat.module.system.api.sequence.SequenceApi;
+import com.zt.plat.module.system.api.user.AdminUserApi;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(value = "erpRpcConfiguration", proxyBeanMethods = false)
+@EnableFeignClients(clients = {DeptApi.class, SequenceApi.class, AdminUserApi.class, BusinessFileApi.class, FileApi.class, MaterialInfomationApi.class})
+public class RpcConfiguration {
+}
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
index 08883e83..1abae0f7 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
@@ -13,6 +13,6 @@ import java.util.List;
* @author 后台管理
*/
public interface ErpErpMaterialCorrService {
- List create(@Valid List reqVO);
+ List create(@Valid ErpMaterialCorrSaveReqVO reqVO);
void deleteBatch(BatchDeleteReqVO reqVO);
}
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
index 328c6a9b..3338e5cf 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
@@ -10,6 +10,7 @@ import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
+import java.util.ArrayList;
import java.util.List;
@Service
@@ -19,10 +20,18 @@ public class ErpErpMaterialCorrServiceImpl implements ErpErpMaterialCorrService{
private ErpErpMaterialCorrMapper erpErpMaterialCorrMapper;
@Override
- public List create(List reqVO) {
- List bean = BeanUtils.toBean(reqVO, ErpMaterialCorrDO.class);
- erpErpMaterialCorrMapper.insertBatch(bean);
- return BeanUtils.toBean(bean, ErpMaterialCorrRspVO.class);
+ public List create(ErpMaterialCorrSaveReqVO reqVO) {
+ List erpMaterialCorrDOS=new ArrayList<>();
+ reqVO.getMaterials().forEach(materials -> {
+ erpMaterialCorrDOS.add(ErpMaterialCorrDO.builder()
+ .materialParentId(reqVO.getMaterialParentId())
+ .materialParentCode(reqVO.getMaterialParentCode())
+ .materialId(materials.getMaterialId())
+ .materialCode(materials.getMaterialCode())
+ .build());
+ });
+ erpErpMaterialCorrMapper.insertBatch(erpMaterialCorrDOS);
+ return BeanUtils.toBean(erpMaterialCorrDOS, ErpMaterialCorrRspVO.class);
}
@Override
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpFactoryServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpFactoryServiceImpl.java
index 116fcdf8..c24f8e8f 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpFactoryServiceImpl.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpFactoryServiceImpl.java
@@ -269,6 +269,11 @@ public class ErpFactoryServiceImpl implements ErpFactoryService {
private void saveData(ProcessingResult result) {
// 批量新增和更新
if (!result.toInsert.isEmpty()) {
+ //自动绑定工厂
+ result.toInsert.forEach(r->{
+ r.setRelName(r.getName());
+ r.setRelnumber(r.getNumber());
+ });
erpFactoryMapper.insertBatch(result.toInsert);
// 批量查询刚插入数据的id,提升效率
List insertedNumbers = result.toInsert.stream()
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
index 535b59bb..8acfb62a 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
@@ -70,7 +70,7 @@ public interface ErpMaterialService {
String getMaterialUnit(String materialNumber);
- List createErpMaterialCorr(List erpMaterialCorrSaveReqVOS);
+ List createErpMaterialCorr(ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO);
void deleteErpMaterialCorr(BatchDeleteReqVO reqVO);
}
\ No newline at end of file
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
index bff8b253..f0891592 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
@@ -4,12 +4,15 @@ import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.handler.annotation.XxlJob;
+import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.api.BaseApi;
import com.zt.plat.module.api.dto.MaterialOtherDTO;
+import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi;
+import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationRespDTO;
import com.zt.plat.module.erp.api.dto.ErpMaterialDTO;
import com.zt.plat.module.erp.controller.admin.erp.vo.*;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpWarehouseDO;
@@ -19,16 +22,14 @@ import com.zt.plat.module.erp.enums.OftenEnum;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpMaterialDO;
import com.zt.plat.module.erp.dal.mysql.erp.ErpMaterialMapper;
import jakarta.annotation.Resource;
+import jakarta.validation.constraints.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDate;
import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -54,6 +55,8 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
private ErpConfig erpConfig;
@Resource
private ErpErpMaterialCorrService erpMaterialCorrService;
+ @Resource
+ private MaterialInfomationApi materialInfomationApi;
@Override
public ErpMaterialRespVO createErpMaterial(ErpMaterialSaveReqVO createReqVO) {
@@ -184,16 +187,66 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
}
@Override
- public List createErpMaterialCorr(List erpMaterialCorrSaveReqVOS) {
- List erpMaterialCorrRspVOS = erpMaterialCorrService.create(erpMaterialCorrSaveReqVOS);
- return erpMaterialCorrRspVOS.stream().map(erpMaterialCorrRspVO -> {
- //TODO 通过物料id返回物料信息
- ErpMaterialRespVO erpMaterialRespVO = new ErpMaterialRespVO();
- BeanUtils.copyProperties(erpMaterialCorrRspVO, erpMaterialRespVO);
- return erpMaterialRespVO;
- }).collect(Collectors.toList());
+ public List createErpMaterialCorr(ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO) {
+ List erpMaterialCorrRspVOS = erpMaterialCorrService.create(erpMaterialCorrSaveReqVO);
+ List erpMaterialRespVOS = new ArrayList<>();
+ Set parentIds = erpMaterialCorrRspVOS.stream().map(ErpMaterialCorrRspVO::getMaterialParentId).filter(Objects::nonNull).collect(Collectors.toSet());
+ Set materialIds = erpMaterialCorrRspVOS.stream().map(ErpMaterialCorrRspVO::getMaterialId).filter(Objects::nonNull).collect(Collectors.toSet());
+ if (parentIds.size() != 1) {
+ throw exception(MATERIAL_ERROR);
+ }
+ ErpMaterialRespVO erpMaterialParent = buildErpMaterialRespDataById(parentIds.iterator().next());
+ erpMaterialRespVOS.add(erpMaterialParent);
+ if (!materialIds.isEmpty()) {
+ for (Long materialId : materialIds) {
+ ErpMaterialRespVO erpMaterialRespVO = buildErpMaterialRespDataById(materialId);
+ erpMaterialRespVOS.add(erpMaterialRespVO);
+ }
+ }
+ return erpMaterialRespVOS;
}
+ private ErpMaterialRespVO buildErpMaterialRespDataById(Long id) {
+ CommonResult materialInfomation = materialInfomationApi.getMaterialInfomation(id);
+ return BeanUtils.toBean(buildErpMaterialDOData(materialInfomation), ErpMaterialRespVO.class);
+ }
+
+ public ErpMaterialDO buildErpMaterialDOData(CommonResult materialInfomation) {
+ if (materialInfomation.getData() == null) {
+ return new ErpMaterialDO();
+ }
+ ErpMaterialDO erpMaterialDO = new ErpMaterialDO();
+ MaterialInfomationRespDTO data = materialInfomation.getData();
+ MaterialAttributeUtils.MaterialAttribute materialAttribute = MaterialAttributeUtils.safeExtractAllAttributes(data);
+ // 有对应关系的字段赋值
+ erpMaterialDO.setId(data.getId()); // 主键
+ erpMaterialDO.setMaterialName(data.getName()); // 物料名称
+ erpMaterialDO.setDownCenterNumber(materialAttribute.mtrlZhongtongCode()); // 中铜物料编码
+ erpMaterialDO.setCenterNumber(materialAttribute.mtrlChalcoCode()); // 中铝物料编码
+ erpMaterialDO.setUnit(materialAttribute.mtrlBaseUnitCode()); // 计量单位编码
+ erpMaterialDO.setUnitDescription(materialAttribute.mtrlBaseUnitName()); // 计量单位描述
+ erpMaterialDO.setMaterialLengthDescription(materialAttribute.mtrlLongDesc()); // 物料长描述
+ if (materialAttribute.mtrlDecimal() != null) {
+ erpMaterialDO.setDecimalValue(materialAttribute.mtrlDecimal().longValue()); // 小数位数
+ }
+ erpMaterialDO.setAbbreviation(materialAttribute.mtrlElement()); // 金属元素缩写
+ erpMaterialDO.setCreateDate(materialAttribute.mtrlRecordTime()); // 创建日期(物料记录时间)
+
+ // 无对应关系的字段(暂未赋值,需根据业务补充映射规则)
+ // erpMaterialDO.setMaterialType(null); // 物料类型
+ // erpMaterialDO.setMaterialGroupDate(null); // 物料大类组
+ // erpMaterialDO.setExternalMaterialGroupDate(null); // 外部物料小类组
+ // erpMaterialDO.setMaterialTypeDescription(null); // 物料类型描述
+ // erpMaterialDO.setMaterialGroupDescription(null); // 物料组描述
+ // erpMaterialDO.setExternalMaterialGroupDescription(null); // 外部物料小类组描述
+ // erpMaterialDO.setType(null); // 类型(TP)
+ // erpMaterialDO.setName(null); // 金属元素名称(NAME字段,需区分物料名称)
+ // erpMaterialDO.setCoding(null); // 金属元素编码
+ // erpMaterialDO.setGradeUnit(null); // 品位单位
+ return erpMaterialDO;
+ }
+
+
@Override
public void deleteErpMaterialCorr(BatchDeleteReqVO reqVO) {
erpMaterialCorrService.deleteBatch(reqVO);
@@ -321,4 +374,17 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
.collect(Collectors.toList());
myRedisConfig.updateRedisCache(key, existingNumbers);
}
+
+ public record MaterialAttribute(
+ String baseUnitCode, // 基础单位编码
+ String baseUnitName, // 基础单位名称
+ String shortDesc, // 物料短描述
+ String longDesc, // 物料长描述
+ String chalcoCode, // 中铝编码
+ String zhongtongCode, // 中铜编码
+ String specification, // 规格
+ String texture, // 材质
+ String recordTime// 记录时间
+ ) {
+ }
}
\ No newline at end of file
From 69375988c25ab3a53102b45293ae7a5884317851 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=BD=98=E8=8D=A3=E6=99=9F?=
<9691125+pan-rongsheng@user.noreply.gitee.com>
Date: Tue, 30 Dec 2025 18:08:59 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=8B=93=E5=B1=95?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../admin/erp/ErpMaterialController.java | 55 +++++++++++++------
.../erp/ErpErpMaterialCorrService.java | 2 +
.../erp/ErpErpMaterialCorrServiceImpl.java | 5 ++
.../erp/service/erp/ErpMaterialService.java | 4 ++
.../service/erp/ErpMaterialServiceImpl.java | 37 ++++++++-----
5 files changed, 72 insertions(+), 31 deletions(-)
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
index 4f959433..2c25b78a 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/controller/admin/erp/ErpMaterialController.java
@@ -38,6 +38,7 @@ public class ErpMaterialController {
@Resource
private ErpMaterialService erpMaterialService;
+
@PostMapping("/create")
@Operation(summary = "创建ERP物料数据")
@PreAuthorize("@ss.hasPermission('sply:erp-material:create')")
@@ -65,7 +66,7 @@ public class ErpMaterialController {
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除ERP物料数据")
- @PreAuthorize("@ss.hasPermission('sply:erp-material:delete')")
+ @PreAuthorize("@ss.hasPermission('sply:erp-material:delete')")
public CommonResult deleteErpMaterialList(@RequestBody BatchDeleteReqVO req) {
erpMaterialService.deleteErpMaterialListByIds(req.getIds());
return success(true);
@@ -93,12 +94,12 @@ public class ErpMaterialController {
@PreAuthorize("@ss.hasPermission('sply:erp-material:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportErpMaterialExcel(@Valid ErpMaterialPageReqVO pageReqVO,
- HttpServletResponse response) throws IOException {
+ HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List list = erpMaterialService.getErpMaterialPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "ERP物料数据.xls", "数据", ErpMaterialRespVO.class,
- BeanUtils.toBean(list, ErpMaterialRespVO.class));
+ BeanUtils.toBean(list, ErpMaterialRespVO.class));
}
@PostMapping("/getErpMaterialTask")
@@ -116,20 +117,38 @@ public class ErpMaterialController {
PageResult pageResult = erpMaterialService.getErpMaterialPageAndOther(pageReqVO);
return success(BeanUtils.toBean(pageResult, ErpMaterialRespVO.class));
}
- //创建物料拓展关系
- @PostMapping("/createErpMaterialCorr")
- @Operation(summary = "创建ERP物料关系")
- @PreAuthorize("@ss.hasPermission('sply:erp-material:create')")
- public CommonResult> createErpMaterialCorr(@Valid @RequestBody ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO) {
- return success(erpMaterialService.createErpMaterialCorr(erpMaterialCorrSaveReqVO));
- }
- //删除物料关系
- @DeleteMapping("/deleteErpMaterialCorr")
- @Operation(summary = "删除ERP物料关系")
- @PreAuthorize("@ss.hasPermission('sply:erp-material:delete')")
- public CommonResult deleteErpMaterialCorr(@RequestBody BatchDeleteReqVO req) {
- erpMaterialService.deleteErpMaterialCorr(req);
- return success(true);
- }
+ //创建物料拓展关系
+ @PostMapping("/createErpMaterialCorr")
+ @Operation(summary = "创建ERP物料关系")
+ @PreAuthorize("@ss.hasPermission('sply:erp-material:create')")
+ public CommonResult> createErpMaterialCorr(@Valid @RequestBody ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO) {
+ return success(erpMaterialService.createErpMaterialCorr(erpMaterialCorrSaveReqVO));
+ }
+
+ //删除物料关系
+ @DeleteMapping("/deleteErpMaterialCorr")
+ @Operation(summary = "删除ERP物料关系")
+ @PreAuthorize("@ss.hasPermission('sply:erp-material:delete')")
+ public CommonResult deleteErpMaterialCorr(@RequestBody BatchDeleteReqVO req) {
+ erpMaterialService.deleteErpMaterialCorr(req);
+ return success(true);
+ }
+
+ //通过物料id查询物料详情
+ @GetMapping("/getErpMaterialById")
+ @Operation(summary = "通过物料id查询物料详情")
+ @PreAuthorize("@ss.hasPermission('sply:erp-material:query')")
+ public CommonResult getErpMaterialById(@RequestParam("id") Long id) {
+ ErpMaterialDO erpMaterial = erpMaterialService.getErpMaterialById(id);
+ return success(BeanUtils.toBean(erpMaterial, ErpMaterialRespVO.class));
+ }
+ //通过主物料查询子物料信息
+ @GetMapping("/getErpMaterialByMainMaterialById")
+ @Operation(summary = "通过主物料查询子物料信息")
+ @PreAuthorize("@ss.hasPermission('sply:erp-material:query')")
+ public CommonResult> getErpMaterialByMainMaterial(@RequestParam("id") Long mainMaterialId) {
+ List erpMaterial = erpMaterialService.getErpMaterialByMainMaterial(mainMaterialId);
+ return success(BeanUtils.toBean(erpMaterial, ErpMaterialRespVO.class));
+ }
}
\ No newline at end of file
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
index 1abae0f7..e8d1a1f2 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrService.java
@@ -15,4 +15,6 @@ import java.util.List;
public interface ErpErpMaterialCorrService {
List create(@Valid ErpMaterialCorrSaveReqVO reqVO);
void deleteBatch(BatchDeleteReqVO reqVO);
+
+ List getErpMaterialByMainMaterial(Long mainMaterialId);
}
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
index 3338e5cf..0a59dd29 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpErpMaterialCorrServiceImpl.java
@@ -38,4 +38,9 @@ public class ErpErpMaterialCorrServiceImpl implements ErpErpMaterialCorrService{
public void deleteBatch(BatchDeleteReqVO reqVO) {
erpErpMaterialCorrMapper.deleteByIds(reqVO.getIds());
}
+
+ @Override
+ public List getErpMaterialByMainMaterial(Long mainMaterialId) {
+ return BeanUtils.toBean( erpErpMaterialCorrMapper.selectList(ErpMaterialCorrDO::getMaterialParentId, mainMaterialId), ErpMaterialCorrRspVO.class);
+ }
}
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
index 8acfb62a..ca0cbbf5 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialService.java
@@ -73,4 +73,8 @@ public interface ErpMaterialService {
List createErpMaterialCorr(ErpMaterialCorrSaveReqVO erpMaterialCorrSaveReqVO);
void deleteErpMaterialCorr(BatchDeleteReqVO reqVO);
+
+ ErpMaterialDO getErpMaterialById(Long id);
+
+ List getErpMaterialByMainMaterial(Long mainMaterialId);
}
\ No newline at end of file
diff --git a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
index f0891592..8316f464 100644
--- a/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
+++ b/zt-module-erp/zt-module-erp-server/src/main/java/com/zt/plat/module/erp/service/erp/ErpMaterialServiceImpl.java
@@ -252,6 +252,30 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
erpMaterialCorrService.deleteBatch(reqVO);
}
+ @Override
+ public ErpMaterialDO getErpMaterialById(Long id) {
+ CommonResult materialInfomation = materialInfomationApi.getMaterialInfomation(id);
+ return buildErpMaterialDOData(materialInfomation);
+ }
+
+ @Override
+ public List getErpMaterialByMainMaterial(Long mainMaterial) {
+ List erpMaterialByMainMaterial = erpMaterialCorrService.getErpMaterialByMainMaterial(mainMaterial);
+ List erpMaterialDOList = new ArrayList<>();
+ CommonResult> materialInfomationListByIds = materialInfomationApi.getMaterialInfomationListByIds(erpMaterialByMainMaterial.stream().map(ErpMaterialCorrRspVO::getMaterialId).toList());
+ if (materialInfomationListByIds.getData() == null || materialInfomationListByIds.getData().isEmpty()) {
+ return erpMaterialDOList;
+ }
+ materialInfomationListByIds.getData().forEach(
+ materialInfomation -> {
+ ErpMaterialDO erpMaterialDO = buildErpMaterialDOData(CommonResult.success(materialInfomation));
+ erpMaterialDOList.add(erpMaterialDO);
+ }
+ );
+
+ return erpMaterialDOList;
+ }
+
@Override
@Transactional
@XxlJob("getErpMaterialTask")
@@ -374,17 +398,4 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
.collect(Collectors.toList());
myRedisConfig.updateRedisCache(key, existingNumbers);
}
-
- public record MaterialAttribute(
- String baseUnitCode, // 基础单位编码
- String baseUnitName, // 基础单位名称
- String shortDesc, // 物料短描述
- String longDesc, // 物料长描述
- String chalcoCode, // 中铝编码
- String zhongtongCode, // 中铜编码
- String specification, // 规格
- String texture, // 材质
- String recordTime// 记录时间
- ) {
- }
}
\ No newline at end of file