diff --git a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java index ad13a6e6..bf0d9655 100644 --- a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java +++ b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java @@ -180,7 +180,7 @@ public interface ErrorCodeConstants { ErrorCode MATERIAL_INFOMATION_NOT_EXISTS = new ErrorCode(1_032_160_000, "试剂耗材不存在"); ErrorCode MATERIAL_PRODUCT_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料分类/大类不存在"); ErrorCode MATERIAL_PRODUCT_PARENT_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料分类/大类的父类不存在"); - ErrorCode MATERIAL_PRODUCT_CODE_MODELNO_EXISTED = new ErrorCode(1_032_160_000, "物料大类【编码+型号】重复"); + ErrorCode MATERIAL_PRODUCT_CODE_SPECIFICATION_EXISTED = new ErrorCode(1_032_160_000, "物料大类【编码+规格】重复"); ErrorCode MATERIAL_CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_032_160_000, "分类下含有子分类或物料大类,不可删除"); ErrorCode MATERIAL_PRODUCT_EXISTS_BATCH = new ErrorCode(1_032_160_000, "物料大类下存在物料批次,不可删除"); ErrorCode MATERIAL_PRODUCTS_EXISTS_CATEGORY = new ErrorCode(1_032_160_000, "物料大类列表中存在分类数据"); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/datapermission/QMSMultiDataPermissionHandler.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/datapermission/QMSMultiDataPermissionHandler.java index c8fe6e7f..4619762d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/datapermission/QMSMultiDataPermissionHandler.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/datapermission/QMSMultiDataPermissionHandler.java @@ -215,6 +215,7 @@ public class QMSMultiDataPermissionHandler implements MultiDataPermissionHandler // 添加到上下文中,避免重复计算 loginUser.setContext(QMS_PERMISSION_CONTEXT_KEY, qmsDataPermission); } + Long ctxDeptId = DeptContextHolder.getDeptId(); // 计算有效的部门与自查标记:当存在上下文部门且未被忽略时,强制仅使用该部门,以避免默认全量或空权限分支 Set effectiveDeptIds = qmsDataPermission.getDeptIds(); @@ -234,9 +235,10 @@ public class QMSMultiDataPermissionHandler implements MultiDataPermissionHandler } // 情况二:仅在有效部门集合为空且不可查看自己时,才认为无权限;若上下文提供部门,则跳过该兜底 - if (CollUtil.isEmpty(effectiveDeptIds) && Boolean.FALSE.equals(effectiveSelf)) { - return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 - } + // TODO 这个逻辑暂时先注释,好像是存在用户角色时,不会设置部门 +// if (CollUtil.isEmpty(effectiveDeptIds) && Boolean.FALSE.equals(effectiveSelf)) { +// return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 +// } // 情况三,拼接 Dept 和 Company User 的条件,最后组合 Expression deptExpression = buildDeptExpression(tableName, deptIdCol, tableAlias, effectiveDeptIds); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java index 582acff3..2188cdcf 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java @@ -153,7 +153,7 @@ public class MaterialBatchController implements BusinessControllerMarker { MaterialBatchImportExcelVO.builder() .productName("无水硼砂") .productCode("W11174909") - .productModelNo("95%") + .productSpecification("95%") .supplier("供应商 1") .manufacturerDate(LocalDate.parse("2026-03-15")) .dueDate(LocalDate.parse("2026-08-11")) @@ -164,7 +164,7 @@ public class MaterialBatchController implements BusinessControllerMarker { MaterialBatchImportExcelVO.builder() .productName("氧化钙") .productCode("W10102372") - .productModelNo("AR500g/瓶") + .productSpecification("AR") .supplier("供应商 2") .manufacturerDate(LocalDate.parse("2026-04-16")) .dueDate(LocalDate.parse("2026-09-18")) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInfomationController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInfomationController.java index 1163023b..a03b330d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInfomationController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInfomationController.java @@ -1,12 +1,18 @@ package com.zt.plat.module.qms.resource.material.controller.admin; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONObject; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationSaveReqVO; +import com.zt.plat.module.qms.resource.material.controller.vo.export.MaterialLedgerExportVO; import com.zt.plat.module.qms.resource.material.controller.vo.query.MaterialInfomationQueryVO; import com.zt.plat.module.qms.resource.material.controller.vo.resp.MaterialInfomationLedgerRespVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; import com.zt.plat.module.qms.resource.material.service.MaterialInfomationService; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -35,6 +41,7 @@ import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog; import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*; +@Slf4j @Tag(name = "管理后台 - 物料实例") @RestController @RequestMapping("/qms/resource/material-infomation") @@ -126,18 +133,33 @@ public class MaterialInfomationController implements BusinessControllerMarker { } @GetMapping("/export-ledger") - @Operation(summary = "导出危化品台账") + @Operation(summary = "导出台账") public void exportHazardousLedger(@Valid MaterialInfomationPageReqVO pageReqVO, HttpServletResponse response) throws IOException { -// ArrayList exportVOS = getLedgerExportVOS(); // 暂时只获取危化品台账 pageReqVO.setHazardous(1); PageResult pageResult = materialInfomationService.getMaterialInventoryLedgerPage(pageReqVO); -// // 3. 导出 Excel -// ComplexExcelUtils.writeHazardousLedger( -// response, "危险化学品管理台账.xls", "危险化学品管理台账", exportVOS -// -// ); + + // 导出 Excel + List list = pageResult.getList(); + if (CollUtil.isEmpty(list)) { + ExcelUtils.write(response, "物料危化品库存台账.xls", "危化品库存台账", MaterialLedgerExportVO.class, + BeanUtils.toBean(list, MaterialLedgerExportVO.class)); + return; + } + List exportVOS = list.stream().map(respVO -> { + MaterialLedgerExportVO exportVO = BeanUtils.toBean(respVO, MaterialLedgerExportVO.class); + JSONObject productCustomConfig = respVO.getProductCustomConfig(); + if (productCustomConfig == null) return exportVO; + MaterialLedgerExportVO extraProps = productCustomConfig.get("extraProps", MaterialLedgerExportVO.class); + if (extraProps == null) return exportVO; + BeanUtil.copyProperties(extraProps, exportVO, CopyOptions.create().setIgnoreNullValue(true)); + return exportVO; + }).toList(); + ExcelUtils.write(response, "物料危化品库存台账.xls", "危化品库存台账", + MaterialLedgerExportVO.class, + exportVOS); + } } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java index fd7b3ac0..df4c1034 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java @@ -1,12 +1,10 @@ package com.zt.plat.module.qms.resource.material.controller.vo; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.*; -import io.swagger.v3.oas.annotations.media.Schema; import com.zt.plat.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; -import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java index eaa294d8..c83830c9 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java @@ -42,6 +42,10 @@ public class MaterialBatchRespVO { @ExcelProperty("物料大类编码") private String productCode; + @Schema(description = "物料大类规格") + @ExcelProperty("物料大类规格") + private String productSpecification; + @Schema(description = "物料大类型号") @ExcelProperty("物料大类型号") private String productModelNo; @@ -94,6 +98,10 @@ public class MaterialBatchRespVO { @ExcelProperty("供应商id") private Long supplierId; + @Schema(description = "供应商") + @ExcelProperty("供应商") + private String supplierName; + @Schema(description = "生产日期") @ExcelProperty("生产日期") private LocalDateTime manufacturerDate; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/importer/MaterialBatchImportExcelVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/importer/MaterialBatchImportExcelVO.java index 1bf00be5..dcd07aba 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/importer/MaterialBatchImportExcelVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/importer/MaterialBatchImportExcelVO.java @@ -26,8 +26,8 @@ public class MaterialBatchImportExcelVO { @ExcelProperty("物料编码") private String productCode; - @ExcelProperty("物料型号") - private String productModelNo; + @ExcelProperty("物料规格") + private String productSpecification; @ExcelProperty("供应商") private String supplier; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInfomationDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInfomationDO.java index 4eda5957..e93a3b10 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInfomationDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInfomationDO.java @@ -134,6 +134,16 @@ public class MaterialInfomationDO extends BusinessBaseDO { @TableField("MNGR_USER_NAME") private String managerUserName; /** + * 所属部门id + */ + @TableField("BLG_DEPT_ID") + private Long belongDepartmentId; + /** + * 所属部门 + */ + @TableField("BLG_DEPT_NAME") + private String belongDepartmentName; + /** * 开封状态,0-未开封,1-已开封 */ @TableField("OPN_STS") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java index b215d9fb..3823e9df 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java @@ -11,6 +11,7 @@ import com.zt.plat.framework.security.core.LoginUser; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.module.qms.core.aspect.annotation.QmsPermission; import com.zt.plat.module.qms.enums.QmsCommonConstant; +import com.zt.plat.module.qms.office.supplier.dal.dataobject.SupplierDO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; @@ -48,7 +49,7 @@ public interface MaterialBatchMapper extends BaseMapperX { .orderByDesc(MaterialBatchDO::getId)); } - @QmsPermission(moduleDataRoleCodes = "ytjyAdmin", deptIdColumn = "ASN_DEPT_ID") + @QmsPermission(deptIdColumn = "ASN_DEPT_ID") default PageResult selectPageWithPdtInfo(MaterialBatchPageReqVO reqVO, List pdtIds) { MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() @@ -56,14 +57,17 @@ public interface MaterialBatchMapper extends BaseMapperX { .selectAs(MaterialProductDO::getName, MaterialBatchRespVO::getProductName) .selectAs(MaterialProductDO::getCode, MaterialBatchRespVO::getProductCode) .selectAs(MaterialProductDO::getStandardCapacity, MaterialBatchRespVO::getStandardCapacity) + .selectAs(MaterialProductDO::getSpecification, MaterialBatchRespVO::getProductSpecification) .selectAs(MaterialProductDO::getModelNo, MaterialBatchRespVO::getProductModelNo) // 标签模板,用于入库 .selectAs(MaterialProductDO::getLabelTemplateKey, MaterialBatchRespVO::getLabelTemplateKey) // 生产日期和到期日期,用于验收和入库 .selectAs("batch.MFR_DT", MaterialBatchDO::getManufacturerDate) .selectAs("batch.DUE_DT", MaterialBatchDO::getDueDate) + .selectAs(SupplierDO::getName, MaterialBatchRespVO::getSupplierName) .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialBatchDO::getProductId) .leftJoin(MaterialBatchDO.class, "batch", MaterialBatchDO::getId, MaterialBatchDO::getParentId) + .leftJoin(SupplierDO.class, SupplierDO::getId, MaterialBatchDO::getSupplierId) // 只要批次 .eq(MaterialBatchGongType.batch.name().equals(reqVO.getDataType()), MaterialBatchDO::getParentId, 0) // 只要工段 diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java index bc81cbd1..ea7e696c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java @@ -7,6 +7,7 @@ import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX; import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigWarehouseLocationDO; +import com.zt.plat.module.qms.core.aspect.annotation.QmsPermission; import com.zt.plat.module.qms.resource.device.dal.dataobject.DeviceConfigBusinessRuleDO; import com.zt.plat.module.qms.resource.device.dal.dataobject.DeviceProductDO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationPageReqVO; @@ -55,6 +56,7 @@ public interface MaterialInfomationMapper extends BaseMapperX selectPageWithPdtInfo(MaterialInfomationPageReqVO reqVO) { MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() .select(MaterialInfomationDO::getId, @@ -233,7 +235,7 @@ public interface MaterialInfomationMapper extends BaseMapperX selectInventoryLedgerPage(MaterialInfomationPageReqVO reqVO) { MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() .select(MaterialInfomationDO::getProductId) - .selectAs(MaterialInfomationDO::getDeptId, MaterialInfomationLedgerRespVO::getDepartmentId) + .selectAs(MaterialInfomationDO::getBelongDepartmentId, MaterialInfomationLedgerRespVO::getDepartmentId) .select(MaterialInfomationDO::getLocationId) .selectCount(MaterialInfomationDO::getId, MaterialInfomationLedgerRespVO::getDepartmentInventoryQuantity) .innerJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) @@ -241,7 +243,7 @@ public interface MaterialInfomationMapper extends BaseMapperX batches = pageResult.getList(); @@ -531,11 +531,12 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { // 检验 for (MaterialBatchImportExcelVO batch : importList) { if (StrUtil.isEmpty(batch.getProductCode())) throw new ServiceException(1_032_160_000, "物料编码不能为空"); - if (batch.getInboundQuantity() == null || batch.getInboundQuantity().compareTo(BigDecimal.ZERO) < 0) - throw new ServiceException(1_032_160_000, "批次数量不能小于0"); + if (StrUtil.isEmpty(batch.getProductSpecification())) throw new ServiceException(1_032_160_000, "物料规格不能为空"); + if (batch.getInboundQuantity() == null || batch.getInboundQuantity().compareTo(BigDecimal.ZERO) <= 0) + throw new ServiceException(1_032_160_000, "批次数量需要大于0"); } // 获取大类id 每个物料都得校验是否存在 - Set pdtCodes = importList.stream().map(MaterialBatchImportExcelVO::getProductCode).collect(Collectors.toSet()); + /*Set pdtCodes = importList.stream().map(MaterialBatchImportExcelVO::getProductCode).collect(Collectors.toSet()); List products = materialProductService.getProductListByPdtCodes(new ArrayList<>(pdtCodes)); if (CollUtil.isEmpty(products)) throw new ServiceException(1_032_160_000, "未找到对应的物料"); Map productDOMapByCode = products.stream().collect(Collectors.toMap(MaterialProductDO::getCode, Function.identity())); @@ -549,6 +550,30 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { if (CollUtil.isNotEmpty(notFoundCodes)) { throw new ServiceException(1_032_160_000, "未找到以下物料:" + String.join(", ", notFoundCodes)); } + }*/ + // 获取物料编码和规格,使用编码 + 规格匹配物料 + Set pdtCodes = importList.stream().map(MaterialBatchImportExcelVO::getProductCode).collect(Collectors.toSet()); + Set specifications = importList.stream().map(MaterialBatchImportExcelVO::getProductSpecification).collect(Collectors.toSet()); + List products = materialProductService.getProductListByCodeAndSpec(new ArrayList<>(pdtCodes), new ArrayList<>(specifications)); + if (CollUtil.isEmpty(products)) throw new ServiceException(1_032_160_000, "未找到对应的物料"); + + // 构建编码 + 规格的组合键用于校验 + Map productDOMapByKey = products.stream().collect(Collectors.toMap( + p -> p.getCode() + "_" + p.getSpecification(), + Function.identity(), + (v1, v2) -> v1 + )); + + // 校验是否所有导入的物料都能找到 + List notFoundMaterials = new ArrayList<>(); + for (MaterialBatchImportExcelVO importItem : importList) { + String key = importItem.getProductCode() + "_" + importItem.getProductSpecification(); + if (!productDOMapByKey.containsKey(key)) { + notFoundMaterials.add(String.format("物料【%s】+【%s】", importItem.getProductCode(), importItem.getProductSpecification())); + } + } + if (CollUtil.isNotEmpty(notFoundMaterials)) { + throw new ServiceException(1_032_160_000, "未找到以下物料:" + String.join(", ", notFoundMaterials)); } // 获取供应商 Set supplierNames = importList.stream().map(MaterialBatchImportExcelVO::getSupplier).filter(Objects::nonNull).collect(Collectors.toSet()); @@ -573,7 +598,9 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { // 保存批次 Map finalSupplierDOMapByName = supplierDOMapByName; List batchDOS = importList.stream().map(importBat -> { - MaterialProductDO productDO = productDOMapByCode.get(importBat.getProductCode()); + String key = importBat.getProductCode() + "_" + importBat.getProductSpecification(); + MaterialProductDO productDO = productDOMapByKey.get(key); + // MaterialProductDO productDO = productDOMapByCode.get(importBat.getProductCode()); LocalDate manufacturerDate = importBat.getManufacturerDate(); MaterialBatchDO batchDO = new MaterialBatchDO() .setParentId(0L) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java index f2693854..f98cd29a 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java @@ -172,7 +172,7 @@ public interface MaterialInfomationService { * @param batch 批次信息 * @return 物料信息 */ - List saveMaterialInfomationsByBatInb(Long locationId, BigDecimal reqQuantity, Long gongduanId, MaterialProductDO product, MaterialBatchDO batch); + List saveMaterialInfomationsByBatInb(Long locationId, BigDecimal reqQuantity, MaterialBatchDO gong, MaterialProductDO product, MaterialBatchDO batch); /** * 批量更新物料信息 diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java index a22f7549..46fbe53e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -33,7 +34,10 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -171,6 +175,10 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService @Override public void save(MaterialInfomationDO infomationDO) { materialInfomationMapper.insert(infomationDO); + if (infomationDO.getBelongDepartmentId() == null || StrUtil.isEmpty(infomationDO.getBelongDepartmentName())) { + infomationDO.setBelongDepartmentId(infomationDO.getDeptId()).setBelongDepartmentName(infomationDO.getDeptName()); + this.updateById(infomationDO); + } } @Override @@ -201,7 +209,7 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .setInitialVolume(totalOperationQuantity) .setRemainingVolume(totalOperationQuantity) .setProductId(productId) - .setCode(sequenceUtil.genCode(MaterialConstants.SEQUENCE_INF_KEY)) + .setCode(this.getInfomationCode(product.getCustomConfig())) .setManufacturerDate(LocalDate.now()) .setExpirationDate(LocalDate.now().plusDays(product.getDue())) .setUsageStatus(0) @@ -214,9 +222,10 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService @Override public MaterialInfomationDO saveMaterialInfomationByStdSolMake(Long productId, MaterialStandardSolutionDO mtrlStandSol) { MaterialInfomationDO infomationDO = new MaterialInfomationDO(); + MaterialProductDO product = materialProductService.getMaterialProduct(productId); infomationDO .setProductId(productId) - .setCode(sequenceUtil.genCode(MaterialConstants.SEQUENCE_INF_KEY)) + .setCode(this.getInfomationCode(product.getCustomConfig())) .setManufacturerDate(LocalDate.from(mtrlStandSol.getMakeDate())) .setExpirationDate(LocalDate.from(mtrlStandSol.getDueDate())) .setUsageStatus(0) @@ -227,14 +236,14 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService } @Override - public List saveMaterialInfomationsByBatInb(Long locationId, BigDecimal reqQuantity, Long gongduanId, MaterialProductDO product, MaterialBatchDO batch) { + public List saveMaterialInfomationsByBatInb(Long locationId, BigDecimal reqQuantity, MaterialBatchDO gong, MaterialProductDO product, MaterialBatchDO batch) { List infomationDOS = new ArrayList<>(); for (int i = 0; i < reqQuantity.intValue(); i++) { MaterialInfomationDO infomationDO = new MaterialInfomationDO(); infomationDO .setProductId(product.getId()).setBatchId(batch.getId()) .setLocationId(locationId) - .setGongduanId(gongduanId) + .setGongduanId(gong.getId()) .setName(product.getName()) .setSpecification(product.getSpecification()).setModelNo(product.getModelNo()) .setParameter(product.getParameter()) @@ -246,9 +255,11 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .setManufacturerDate(batch.getManufacturerDate()).setExpirationDate(batch.getDueDate()) .setInitialVolume(product.getStandardCapacity()) .setRemainingVolume(product.getStandardCapacity()) + .setBelongDepartmentId(gong.getAssignDepartmentId()) + .setBelongDepartmentName(gong.getAssignDepartmentName()) .setOrigin(MaterialInfomationOrigin.batch_inbound.name()); - // 生成编号 - String code = sequenceUtil.genCode(MaterialConstants.SEQUENCE_INF_KEY); + // 生成编号 - 需要检查是否有自定义编号 + String code = getInfomationCode(product.getCustomConfig()); infomationDO.setCode(code); infomationDOS.add(infomationDO); } @@ -256,6 +267,13 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService return infomationDOS; } + private String getInfomationCode(String customConfig) { + cn.hutool.json.JSONObject customConfigObj = JSONUtil.parseObj(customConfig); + String sequenceRule = customConfigObj.getStr("sequenceRule"); + String sequenceKey = StrUtil.isEmpty(sequenceRule) ? MaterialConstants.SEQUENCE_INF_KEY : sequenceRule; + return sequenceUtil.genCode(sequenceKey); + } + @Override public void updateByIds(List infomationIds, MaterialInfomationDO materialInfomationDO) { materialInfomationMapper.update(materialInfomationDO, Wrappers.lambdaQuery(MaterialInfomationDO.class) @@ -438,6 +456,7 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService MaterialProductDO productDO = productMap.get(item.getProductId()); item.setProductName(productDO.getName()) .setProductCode(productDO.getCode()) + .setSpecification(productDO.getSpecification()).setModelNo(productDO.getModelNo()) .setProductCustomConfig(JSONUtil.parseObj(productDO.getCustomConfig())); }); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java index 563ee746..c5ab3a6f 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java @@ -89,7 +89,7 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb MaterialBatchDO batch = materialBatchService.getMaterialBatch(batchId); if (batch == null || batch.getParentId() != 0) throw exception(MATERIAL_BATCH_NOT_EXISTS); Long locationId = createReqVO.getLocationId(); - List infomationDOS = materialInfomationService.saveMaterialInfomationsByBatInb(locationId, reqQuantity, gongduanId, product, batch); + List infomationDOS = materialInfomationService.saveMaterialInfomationsByBatInb(locationId, reqQuantity, gongDO, product, batch); // 5.保存入库明细 materialInventoryInboundDetailService.saveInboundDetails(infomationDOS, inbound, batchId, gongduanId); // 是否为检定入库 diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java index 9fbb4a7c..522ef2ed 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java @@ -155,4 +155,13 @@ public interface MaterialProductService { * @return 物料数据 */ List getProductListByPdtCodes(List pdtCodes); + + /** + * 根据编码和规格获取物料数据 + * + * @param codes 编码列表 + * @param specifications 规格列表 + * @return 物料数据 + */ + List getProductListByCodeAndSpec(List codes, List specifications); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java index 4a5d3627..1a2eb9dc 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java @@ -190,15 +190,15 @@ public class MaterialProductServiceImpl implements MaterialProductService { MaterialProductDO mtrl = BeanUtils.toBean(createReqVO, MaterialProductDO.class); mtrl.setNodeType(DataTypeConstant.DATA_TYPE_DATA); - // 编码 + 型号 做重复检查条件 + // 编码 + 规格 做重复检查 LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX() .eqIfPresent(MaterialProductDO::getCode, createReqVO.getCode()) - .eqIfPresent(MaterialProductDO::getModelNo, createReqVO.getModelNo()) + .eqIfPresent(MaterialProductDO::getSpecification, createReqVO.getSpecification()) .eqIfPresent(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA); // 新增 if (reqId == null) { boolean exists = materialProductMapper.exists(queryWrapperX); - if (exists) throw exception(MATERIAL_PRODUCT_CODE_MODELNO_EXISTED); + if (exists) throw exception(MATERIAL_PRODUCT_CODE_SPECIFICATION_EXISTED); // 从直接父分类获取是否危险品、是否标准物质、是否标准溶液 MaterialProductDO prnCtg = materialProductMapper.selectById(mtrl.getParentId()); if (prnCtg != null) { @@ -217,7 +217,7 @@ public class MaterialProductServiceImpl implements MaterialProductService { if (origDO == null) throw exception(MATERIAL_PRODUCT_NOT_EXISTS); queryWrapperX.neIfPresent(MaterialProductDO::getId, reqId); boolean exists = materialProductMapper.exists(queryWrapperX); - if (exists) throw exception(MATERIAL_PRODUCT_CODE_MODELNO_EXISTED); + if (exists) throw exception(MATERIAL_PRODUCT_CODE_SPECIFICATION_EXISTED); businessFileService.deleteBusinessFileList(createReqVO.getDeleteFileIdList()); @@ -483,4 +483,15 @@ public class MaterialProductServiceImpl implements MaterialProductService { .in(MaterialProductDO::getCode, pdtCodes)); } + @Override + public List getProductListByCodeAndSpec(List codes, List specifications) { + if (CollUtil.isEmpty(codes) || CollUtil.isEmpty(specifications)) { + return Collections.emptyList(); + } + + return materialProductMapper.selectList(Wrappers.lambdaQuery(MaterialProductDO.class) + .in(MaterialProductDO::getCode, codes) + .in(MaterialProductDO::getSpecification, specifications)); + } + } \ No newline at end of file