diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationService.java index b9a91529..2a9826c4 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationService.java @@ -79,4 +79,12 @@ public interface ConfigWarehouseLocationService { * @return 存放位置列表 */ List getListByIds(List ids); + + /** + * 获得存放位置列表 + * + * @param warehouseIds 仓库id集合 + * @return 存放位置列表 + */ + List getLocationsByWarehouseIds(List warehouseIds); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationServiceImpl.java index 5e7709eb..2428b7b9 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/service/ConfigWarehouseLocationServiceImpl.java @@ -2,6 +2,7 @@ package com.zt.plat.module.qms.business.config.service; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.module.qms.business.config.controller.vo.ConfigPermissionSaveReqVO; @@ -194,4 +195,12 @@ public class ConfigWarehouseLocationServiceImpl implements ConfigWarehouseLocati return configWarehouseLocationMapper.selectByIds(ids); } + + @Override + public List getLocationsByWarehouseIds(List warehouseIds) { + if (CollUtil.isEmpty(warehouseIds)) return Collections.emptyList(); + return configWarehouseLocationMapper.selectList(Wrappers.lambdaQuery(ConfigWarehouseLocationDO.class) + .eq(ConfigWarehouseLocationDO::getDataType, QmsWarehouseLocationConstant.DATA_TYPE_LOCATION) + .in(ConfigWarehouseLocationDO::getParentId, warehouseIds)); + } } \ 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/admin/MaterialInventoryCheckDetailController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryCheckDetailController.java index 2a8a18a6..5b7de1c0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryCheckDetailController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryCheckDetailController.java @@ -46,6 +46,12 @@ public class MaterialInventoryCheckDetailController implements BusinessControlle return success(materialInventoryCheckDetailService.createMaterialInventoryCheckDetail(createReqVO)); } + @PutMapping("/inventory-inf") + @Operation(summary = "盘点物料") + public CommonResult inventoryCheckInfomation(@Valid @RequestBody MaterialInventoryCheckDetailSaveReqVO inventoryReqVO) { + return success(materialInventoryCheckDetailService.inventoryCheckInfomation(inventoryReqVO)); + } + // @PutMapping("/update") @Operation(summary = "更新库存盘点明细") @PreAuthorize("@ss.hasPermission('qms:material-inventory-check-detail:update')") @@ -85,8 +91,8 @@ public class MaterialInventoryCheckDetailController implements BusinessControlle @Operation(summary = "获得库存盘点明细分页") // @PreAuthorize("@ss.hasPermission('qms:material-inventory-check-detail:query')") public CommonResult> getMaterialInventoryCheckDetailPage(@Valid MaterialInventoryCheckDetailPageReqVO pageReqVO) { - PageResult pageResult = materialInventoryCheckDetailService.getMaterialInventoryCheckDetailPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MaterialInventoryCheckDetailRespVO.class)); + PageResult pageResult = materialInventoryCheckDetailService.getPageWithInf(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java index 7188f879..5f1b6c20 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java @@ -16,12 +16,6 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @Data public class MaterialInfomationPageReqVO extends PageParam { - @Schema(description = "业务类型 inventory_check_detail-盘点明细") - private MaterialInfomationPageBusinessType businessType; - - @Schema(description = "盘点项id") - private Long checkItemId; - @Schema(description = "物料大类id", example = "2691") private Long productId; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationRespVO.java index abe80b29..def9fcb7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationRespVO.java @@ -194,6 +194,9 @@ public class MaterialInfomationRespVO { @Schema(description = "盘点明细id") private Long checkDetailId; + @Schema(description = "是否在库") + private Integer present; + @Schema(description = "初始总量") @ExcelProperty("初始总量") private BigDecimal initialVolume; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailPageReqVO.java index 8f7a2929..a8515013 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailPageReqVO.java @@ -13,8 +13,11 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @Data public class MaterialInventoryCheckDetailPageReqVO extends PageParam { + @Schema(description = "盘点单id") + private Long checkId; + @Schema(description = "盘点项id", example = "1655") - private Long parentId; + private Long itemId; @Schema(description = "物料实例id", example = "6754") private Long infomationId; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailRespVO.java index 18e45b2a..bb86a43e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailRespVO.java @@ -26,14 +26,25 @@ public class MaterialInventoryCheckDetailRespVO { @ExcelProperty("物料实例id") private Long infomationId; + @Schema(description = "物料名称") + private String infomationName; + + @Schema(description = "物料编号") + private String infomationCode; + + @Schema(description = "批次号") + private String batchNo; + + @Schema(description = "存放位置") + private String locationName; + + @Schema(description = "存放位置编码") + private String locationCode; + @Schema(description = "是否存在,1-存在,0-不存在") @ExcelProperty("是否存在,1-存在,0-不存在") private Integer present; - @Schema(description = "物料编号,系统不存在的临时存储起来") - @ExcelProperty("物料编号,系统不存在的临时存储起来") - private String infomationCode; - @Schema(description = "当前数量") @ExcelProperty("当前数量") private String currentQuantity; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailSaveReqVO.java index 526b3a82..7979f3f1 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryCheckDetailSaveReqVO.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; + @Schema(description = "管理后台 - 库存盘点明细新增/修改 Request VO") @Data public class MaterialInventoryCheckDetailSaveReqVO { @@ -27,7 +29,7 @@ public class MaterialInventoryCheckDetailSaveReqVO { private String infomationCode; @Schema(description = "当前数量") - private String currentQuantity; + private BigDecimal currentQuantity; @Schema(description = "状态", example = "1") private String status; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleRespVO.java index 8ff9d96a..a8fd6fa8 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleRespVO.java @@ -2,6 +2,7 @@ package com.zt.plat.module.qms.resource.material.controller.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; import com.zt.plat.module.qms.core.aspect.annotation.Dict; import io.swagger.v3.oas.annotations.media.Schema; @@ -91,6 +92,9 @@ public class MaterialLifecycleRespVO { @Schema(description = "事由/说明") private String reason; + @Schema(description = "自定义json配置") + private String customConfig; + @Schema(description = "所属部门") @ExcelProperty("所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductPageReqVO.java index fa691806..04c47ee9 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductPageReqVO.java @@ -8,6 +8,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.List; import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -15,6 +16,18 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @Data public class MaterialProductPageReqVO extends PageParam { + @Schema(description = "业务类型") + private String businessType; + + @Schema(description = "部门ids") + private List departmentIds; + + @Schema(description = "仓库ids") + private List warehouseIds; + + @Schema(description = "库位ids") + private List locationIds; + @Schema(description = "父id", example = "7533") private Long parentId; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInventoryCheckDetailDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInventoryCheckDetailDO.java index b849808b..41587f16 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInventoryCheckDetailDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialInventoryCheckDetailDO.java @@ -52,11 +52,6 @@ public class MaterialInventoryCheckDetailDO extends BusinessBaseDO { @TableField("PRST") private Integer present; /** - * 物料编号,系统不存在的临时存储起来 - */ - @TableField("INF_CD") - private String infomationCode; - /** * 当前数量 */ @TableField("CRNT_QTY") 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 e73a358a..40fe1b37 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 @@ -61,7 +61,6 @@ public interface MaterialInfomationMapper extends BaseMapperX selectPageWithPdtInfo(MaterialInfomationPageReqVO reqVO) { - MaterialInfomationPageBusinessType businessType = reqVO.getBusinessType(); MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() .select(MaterialInfomationDO::getId, MaterialInfomationDO::getProductId, MaterialInfomationDO::getBatchId, MaterialInfomationDO::getGongduanId, @@ -252,42 +251,4 @@ public interface MaterialInfomationMapper extends BaseMapperX selectPageWithPdtInfoByCheck(MaterialInfomationPageReqVO reqVO, LocalDateTime checkTime, Long checkItemId, List checkItemInfIds) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() - // 选择需要的字段 - .select(MaterialInfomationDO::getId, MaterialInfomationDO::getCode) - .select(MaterialProductDO::getName, MaterialProductDO::getSpecification) - .select(MaterialBatchDO::getBatchNo) - .selectAs(ConfigWarehouseLocationDO::getCode, MaterialInfomationRespVO::getLocationCode) - //.selectAs(MaterialInventoryCheckDetailDO::getPresent, MaterialInfomationRespVO::getPresent) - .selectAs(MaterialInventoryCheckDetailDO::getCurrentQuantity, MaterialInfomationRespVO::getCheckQuantity) - .selectAs(MaterialInventoryCheckDetailDO::getId, MaterialInfomationRespVO::getCheckDetailId) - // 关联产品表 - .innerJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) - .leftJoin(MaterialBatchDO.class, MaterialBatchDO::getId, MaterialInfomationDO::getBatchId) - .leftJoin(ConfigWarehouseLocationDO.class, ConfigWarehouseLocationDO::getId, MaterialInfomationDO::getLocationId) - // 左连接盘点明细表,用于判断是否已盘点 - .leftJoin(MaterialInventoryCheckDetailDO.class, MaterialInventoryCheckDetailDO::getInfomationId, - MaterialInfomationDO::getId) - // 条件:在库 OR 已盘点 - .and(wrapperX -> { - if (CollUtil.isNotEmpty(checkItemInfIds)) { - wrapperX.ne(MaterialInfomationDO::getUsageStatus, 1) // 在库 - .or() - .in(MaterialInfomationDO::getId, checkItemInfIds); // 已盘点 - } else { - // 没有已盘点的记录,只查询在库的 - wrapperX.ne(MaterialInfomationDO::getUsageStatus, 1); - } - } - ) - .eqIfExists(MaterialInfomationDO::getProductId, reqVO.getProductId()) - // 筛选条件:盘点时间之前创建的物料 - .le(MaterialInfomationDO::getCreateTime, checkTime) - .orderByAsc(MaterialInventoryCheckDetailDO::getId) - // .orderByDesc(MaterialInfomationDO::getId) - ; - return selectJoinPage(reqVO, MaterialInfomationRespVO.class, wrapper); - } } \ 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/dal/mapper/MaterialInventoryCheckDetailMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryCheckDetailMapper.java index 9f95658d..3ea834bd 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryCheckDetailMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryCheckDetailMapper.java @@ -1,9 +1,15 @@ package com.zt.plat.module.qms.resource.material.dal.mapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.zt.plat.framework.common.pojo.PageResult; 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.resource.material.controller.vo.MaterialInventoryCheckDetailPageReqVO; +import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailRespVO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryCheckDetailDO; import org.apache.ibatis.annotations.Mapper; @@ -17,10 +23,9 @@ public interface MaterialInventoryCheckDetailMapper extends BaseMapperX selectPage(MaterialInventoryCheckDetailPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MaterialInventoryCheckDetailDO::getItemId, reqVO.getParentId()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getItemId, reqVO.getItemId()) .eqIfPresent(MaterialInventoryCheckDetailDO::getInfomationId, reqVO.getInfomationId()) .eqIfPresent(MaterialInventoryCheckDetailDO::getPresent, reqVO.getPresent()) - .eqIfPresent(MaterialInventoryCheckDetailDO::getInfomationCode, reqVO.getInfomationCode()) .eqIfPresent(MaterialInventoryCheckDetailDO::getCurrentQuantity, reqVO.getCurrentQuantity()) .eqIfPresent(MaterialInventoryCheckDetailDO::getStatus, reqVO.getStatus()) .eqIfPresent(MaterialInventoryCheckDetailDO::getDisposalMethod, reqVO.getDisposalMethod()) @@ -30,4 +35,28 @@ public interface MaterialInventoryCheckDetailMapper extends BaseMapperX selectPageWithInf(MaterialInventoryCheckDetailPageReqVO reqVO) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() + .selectAll(MaterialInventoryCheckDetailDO.class) + .selectAs(MaterialInfomationDO::getCode, MaterialInventoryCheckDetailRespVO::getInfomationCode) + .selectAs(MaterialInfomationDO::getName, MaterialInventoryCheckDetailRespVO::getInfomationName) + .selectAs(MaterialBatchDO::getBatchNo, MaterialInventoryCheckDetailRespVO::getBatchNo) + .selectAs(ConfigWarehouseLocationDO::getName, MaterialInventoryCheckDetailRespVO::getLocationName) + .selectAs(ConfigWarehouseLocationDO::getCode, MaterialInventoryCheckDetailRespVO::getLocationCode) + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialInventoryCheckDetailDO::getInfomationId) + .leftJoin(MaterialBatchDO.class, MaterialBatchDO::getId, MaterialInfomationDO::getBatchId) + .leftJoin(ConfigWarehouseLocationDO.class, ConfigWarehouseLocationDO::getId, MaterialInfomationDO::getLocationId) + .eqIfPresent(MaterialInventoryCheckDetailDO::getCheckId, reqVO.getCheckId()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getItemId, reqVO.getItemId()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getInfomationId, reqVO.getInfomationId()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getPresent, reqVO.getPresent()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getDisposalMethod, reqVO.getDisposalMethod()) + .eqIfPresent(MaterialInventoryCheckDetailDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) + .betweenIfPresent(MaterialInventoryCheckDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(MaterialInventoryCheckDetailDO::getPresent) + .orderByDesc(MaterialInventoryCheckDetailDO::getId); + + return selectJoinPage(reqVO, MaterialInventoryCheckDetailRespVO.class, wrapper); + } } \ 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/dal/mapper/MaterialProductMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java index a8300a26..28f509ea 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java @@ -1,11 +1,13 @@ package com.zt.plat.module.qms.resource.material.dal.mapper; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.zt.plat.framework.common.pojo.PageResult; 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.constant.DataTypeConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.*; @@ -24,9 +26,8 @@ import java.util.stream.Collectors; @Mapper public interface MaterialProductMapper extends BaseMapperX { -// @QmsPermission(deptDataRoleCodes = "ytjyDeptAndSub", moduleDataRoleCodes = "qms_material_manager") default PageResult selectPage(MaterialProductPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() + LambdaQueryWrapper wrapper = new LambdaQueryWrapperX() .eq(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA) .eqIfPresent(MaterialProductDO::getParentId, reqVO.getParentId()) .eqIfPresent(MaterialProductDO::getInventoryAlarmLevel, reqVO.getInventoryAlarmLevel()) @@ -56,9 +57,26 @@ public interface MaterialProductMapper extends BaseMapperX { .eqIfPresent(MaterialProductDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) .eqIfPresent(MaterialProductDO::getRemark, reqVO.getRemark()) .betweenIfPresent(MaterialProductDO::getCreateTime, reqVO.getCreateTime()) - .orderByAsc(MaterialProductDO::getSortNo) + ; + // 使用 EXISTS 子查询过滤有指定部门或库位库存的产品 + if (CollUtil.isNotEmpty(reqVO.getDepartmentIds())) { + String deptIdsStr = reqVO.getDepartmentIds().stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + wrapper.exists("SELECT 1 FROM t_mtrl_inf WHERE t_mtrl_inf.PDT_ID = t_mtrl_pdt.ID AND t_mtrl_inf.USG_STS <> 1 AND t_mtrl_inf.BLG_DEPT_ID IN (" + deptIdsStr + ")"); + } + + if (CollUtil.isNotEmpty(reqVO.getLocationIds())) { + String locationIdsStr = reqVO.getLocationIds().stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + wrapper.exists("SELECT 1 FROM t_mtrl_inf WHERE t_mtrl_inf.PDT_ID = t_mtrl_pdt.ID AND t_mtrl_inf.USG_STS <> 1 AND t_mtrl_inf.LOC_ID IN (" + locationIdsStr + ")"); + } + + wrapper.orderByAsc(MaterialProductDO::getSortNo) .orderByAsc(MaterialProductDO::getIdPath) - .orderByDesc(MaterialProductDO::getId)); + .orderByDesc(MaterialProductDO::getId); + return selectPage(reqVO, wrapper); } default boolean checkIsExistsBatchByPdt(List ids){ @@ -86,6 +104,27 @@ public interface MaterialProductMapper extends BaseMapperX { )); } + default Map getStockQuantityByPdtIds(List mtrlIds, List warehouseIds) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(MaterialProductDO::getId) + .selectCount(MaterialInfomationDO::getId, "quantity") + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getProductId, MaterialProductDO::getId) + .leftJoin(ConfigWarehouseLocationDO.class, "location", ConfigWarehouseLocationDO::getId, MaterialInfomationDO::getLocationId) + .leftJoin(ConfigWarehouseLocationDO.class, "warehouse", ConfigWarehouseLocationDO::getId, "location", ConfigWarehouseLocationDO::getParentId) + .in(MaterialProductDO::getId, mtrlIds) + .ne(MaterialInfomationDO::getUsageStatus, 1) + .in(CollUtil.isNotEmpty(warehouseIds), "warehouse.ID", warehouseIds) + .groupBy(MaterialProductDO::getId); + + List> maps = selectJoinMaps(wrapper); + if (CollUtil.isEmpty(maps)) return new HashMap<>(); + + return maps.stream().collect(Collectors.toMap( + map -> (Long) map.get("ID"), + map -> (Long) map.get("QUANTITY") + )); + } + default boolean checkIsExistsSolutionByPdt(List ids) { MPJLambdaWrapperX wrapperXMakeApply = new MPJLambdaWrapperX() .innerJoin(MaterialLifecycleDetailDO.class, MaterialLifecycleDetailDO::getProductId, MaterialProductDO::getId) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerHeadHandler.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerHeadHandler.java deleted file mode 100644 index d994cd6c..00000000 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerHeadHandler.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.zt.plat.module.qms.resource.material.handler.excel; - -import com.alibaba.excel.write.handler.RowWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteTableHolder; -import org.apache.poi.ss.usermodel.Row; - -public class MaterialHazardousLedgerHeadHandler implements RowWriteHandler { - - @Override - public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { - /*if (!isHead || relativeRowIndex != 0) { - return; - } - - var sheet = writeSheetHolder.getSheet(); - - // 第一行:大标题 - var titleRow = sheet.getRow(0); - var titleCell = titleRow.createCell(0); - titleCell.setCellValue("云铜检测危化品管理台账"); - - // 第二行:基础信息和储存情况 - var row2 = sheet.getRow(1); - var baseInfoCell = row2.createCell(0); - baseInfoCell.setCellValue("基础信息"); - - var storageInfoCell = row2.createCell(13); - storageInfoCell.setCellValue("储存情况"); - - // 第三行:详细表头 - var row3 = sheet.getRow(2); - String[] headers = {"序号", "单位", "名称", "物质", "危险特性", "英文名", "别名", - "危险类别", "是否剧毒", "CAS 号", "UN 号", "危规号", - "储存量合计", "化学分析室", "", "", "", "", - "综合分析室", "", "", "", "", - "试金分析室", "", "", "", "", - "易制爆", "易制毒", "备注"}; - - for (int i = 0; i < headers.length; i++) { - var cell = row3.createCell(i); - cell.setCellValue(headers[i]); - }*/ - // 只在写入表头的第 0 行时执行 - if (!isHead || relativeRowIndex != 0) { - return; - } - - var sheet = writeSheetHolder.getSheet(); - - // 1. 处理第 0 行(大标题) - var titleRow = sheet.getRow(0); - if (titleRow == null) { - titleRow = sheet.createRow(0); - } - var titleCell = titleRow.createCell(0); - titleCell.setCellValue("云铜检测危化品管理台账"); - - // 2. 处理第 1 行(基础信息、储存情况、易制爆、易制毒、备注) - var row2 = sheet.getRow(1); - if (row2 == null) { - row2 = sheet.createRow(1); - } - // 基础信息 (A列) - row2.createCell(0).setCellValue("基础信息"); - // 储存情况 (N列,即索引13) - row2.createCell(13).setCellValue("储存情况"); - // 易制爆 (AC列,索引28) - row2.createCell(28).setCellValue("易制爆"); - // 易制毒 (AD列,索引29) - row2.createCell(29).setCellValue("易制毒"); - // 备注 (AE列,索引30) - row2.createCell(30).setCellValue("备注"); - - // 3. 处理第 2 行(详细列头) - var row3 = sheet.getRow(2); - if (row3 == null) { - row3 = sheet.createRow(2); - } - String[] headers = { - "序号", "单位", "名称", "物质", "危险特性", "英文名", "别名", - "危险类别", "是否剧毒", "CAS 号", "UN 号", "危规号", - "储存量合计", "化学分析室", "", "", "", "", - "综合分析室", "", "", "", "", - "试金分析室", "", "", "", "", - "", "", "" // 易制爆、易制毒、备注在第二行已设置,这里留空 - }; - - for (int i = 0; i < headers.length; i++) { - var cell = row3.createCell(i); - cell.setCellValue(headers[i]); - } - } -} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerStyleHandler.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerStyleHandler.java deleted file mode 100644 index a8c3c1b0..00000000 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/handler/excel/MaterialHazardousLedgerStyleHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zt.plat.module.qms.resource.material.handler.excel; - -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; -import org.apache.poi.ss.util.CellRangeAddress; - -public class MaterialHazardousLedgerStyleHandler implements SheetWriteHandler { - @Override - public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { - - var sheet = writeSheetHolder.getSheet(); - - // 合并大标题(第一行 A:AE,如果备注列需要可扩展到 AE) - sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 30)); - - // 基础信息:只合并第二行 A2:M2 - sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 12)); - - // 储存情况:只合并第二行 N2:AB2(避开 AC、AD、AE) - sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 27)); - - // 化学分析室:合并第三行 N3:R3 - sheet.addMergedRegion(new CellRangeAddress(2, 2, 13, 17)); - - // 综合分析室:合并第三行 S3:W3 - sheet.addMergedRegion(new CellRangeAddress(2, 2, 18, 22)); - - // 试金分析室:合并第三行 X3:AB3 - sheet.addMergedRegion(new CellRangeAddress(2, 2, 23, 27)); - - // 易制爆:合并第二行到第三行的 AC 列 (AC2:AC3) - sheet.addMergedRegion(new CellRangeAddress(1, 2, 28, 28)); - - // 易制毒:合并第二行到第三行的 AD 列 (AD2:AD3) - sheet.addMergedRegion(new CellRangeAddress(1, 2, 29, 29)); - - // 备注:合并第二行到第三行的 AE 列 (AE2:AE3) - sheet.addMergedRegion(new CellRangeAddress(1, 2, 30, 30)); - } -} 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 398a7356..a1120831 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 @@ -9,6 +9,7 @@ import com.zt.plat.module.qms.enums.LockType; 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.MaterialLifecycleRespVO; 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.*; @@ -222,4 +223,13 @@ public interface MaterialInfomationService { * @return 物料库存台账 */ PageResult getMaterialInventoryLedgerPage(@Valid MaterialInfomationPageReqVO pageReqVO); + + + /** + * 根据盘点单id获取盘点物料信息 + * + * @param lfcWithDtl 盘点单 + * @return 盘点物料信息 + */ + List getCheckInfsByCheckLfc(MaterialLifecycleRespVO lfcWithDtl); } \ 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/MaterialInfomationServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java index 3e6f6b06..e020e492 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 @@ -4,6 +4,7 @@ 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.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.exception.ServiceException; @@ -16,9 +17,7 @@ import com.zt.plat.module.qms.core.code.SequenceUtil; import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.enums.LockType; import com.zt.plat.module.qms.resource.material.constant.MaterialConstants; -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.*; 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.*; @@ -38,10 +37,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; 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.function.Function; import java.util.stream.Collectors; @@ -156,20 +152,6 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService @Override public PageResult getMaterialInfomationPageWithPdtInfo(MaterialInfomationPageReqVO pageReqVO) { - MaterialInfomationPageBusinessType businessType = pageReqVO.getBusinessType(); - if (businessType == MaterialInfomationPageBusinessType.inventory_check_detail) { - Long checkItemId = pageReqVO.getCheckItemId(); - if (checkItemId == null) throw new ServiceException(1_032_160_000, "盘点项ID不能为空"); - MaterialInventoryCheckItemDO checkItem = materialInventoryCheckItemService.getMaterialInventoryCheckItem(checkItemId); - if (checkItem == null) throw new ServiceException(1_032_160_000, "盘点项不存在"); - MaterialLifecycleDO lifecycleDO = materialLifecycleService.getMaterialLifecycle(checkItem.getParentId()); - LocalDateTime checkTime = lifecycleDO.getCreateTime(); - // 已盘点的明细id - List detailList = materialInventoryCheckItemService.getDetailListById(checkItemId); - List checkItemInfIds = detailList.stream().map(MaterialInventoryCheckDetailDO::getInfomationId).toList(); - log.info("盘点项明细id:{}", checkItemInfIds); - return materialInfomationMapper.selectPageWithPdtInfoByCheck(pageReqVO, checkTime, checkItemId, checkItemInfIds); - } PageResult pageResult = materialInfomationMapper.selectPageWithPdtInfo(pageReqVO); if (pageReqVO.getNeedDetectExistHazardousMake()) { List infomationRespVOS = pageResult.getList(); @@ -445,6 +427,30 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService return result.setList(list); } + @Override + public List getCheckInfsByCheckLfc(MaterialLifecycleRespVO lfcWithDtl) { + LocalDateTime createTime = lfcWithDtl.getCreateTime(); + cn.hutool.json.JSONObject customConfig = JSONUtil.parseObj(lfcWithDtl.getCustomConfig()); + cn.hutool.json.JSONArray jsonDepartmentIds = customConfig.getJSONArray("departmentIds"); + cn.hutool.json.JSONArray jsonWarehouseIds = customConfig.getJSONArray("warehouseIds"); + List departmentIds = CollUtil.isEmpty(jsonWarehouseIds) ? List.of() : jsonDepartmentIds.toList(Long.class); + List warehouseIds = CollUtil.isEmpty(jsonWarehouseIds) ? List.of() : jsonWarehouseIds.toList(Long.class); + List checkItems = lfcWithDtl.getCheckItems(); + Set pdtIds = checkItems.stream().map(MaterialInventoryCheckItemRespVO::getProductId).collect(Collectors.toSet()); + List locations = configWarehouseLocationService.getLocationsByWarehouseIds(warehouseIds); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(MaterialInfomationDO.class) + .ne(MaterialInfomationDO::getUsageStatus, 1) + .le(MaterialInfomationDO::getCreateTime, createTime); + // 部门不参与数据过滤 + /*if (CollUtil.isNotEmpty(departmentIds)) + wrapper.in(MaterialInfomationDO::getDeptId, departmentIds);*/ + if (CollUtil.isNotEmpty(pdtIds)) + wrapper.in(MaterialInfomationDO::getProductId, pdtIds); + if (CollUtil.isNotEmpty(locations)) + wrapper.in(MaterialInfomationDO::getLocationId, locations.stream().map(ConfigWarehouseLocationDO::getId).toList()); + return materialInfomationMapper.selectList(wrapper); + } + private void calculateSuperiorDepartmentInventory(List list) { // 按上级部门 ID 分组,统计每个上级部门的总库存 Map superiorDeptInventoryMap = list.stream() diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailService.java index a55a427f..01fa43c1 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailService.java @@ -68,4 +68,27 @@ public interface MaterialInventoryCheckDetailService { * @return 盘点项列表 */ List getListByItemId(Long itemId); + + /** + * 批量添加盘点明细 + * + * @param checkDetailDOS 盘点明细列表 + */ + void addBatch(List checkDetailDOS); + + /** + * 盘点 + * + * @param inventoryReqVO 盘点信息 + * @return 盘点后物料信息 + */ + MaterialInventoryCheckDetailRespVO inventoryCheckInfomation(@Valid MaterialInventoryCheckDetailSaveReqVO inventoryReqVO); + + /** + * 盘点明细分页列表 + * + * @param pageReqVO 请求参数 + * @return 盘点列表 + */ + PageResult getPageWithInf(@Valid MaterialInventoryCheckDetailPageReqVO pageReqVO); } \ 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/MaterialInventoryCheckDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailServiceImpl.java index 7ee0b2d4..12323c0b 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckDetailServiceImpl.java @@ -1,10 +1,16 @@ 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.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigWarehouseLocationDO; +import com.zt.plat.module.qms.business.config.service.ConfigWarehouseLocationService; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailSaveReqVO; @@ -13,7 +19,6 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventory import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryCheckItemDO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycleDO; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialInventoryCheckDetailMapper; -import groovy.transform.TailRecursive; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -44,39 +49,15 @@ public class MaterialInventoryCheckDetailServiceImpl implements MaterialInventor private MaterialLifecycleService materialLifecycleService; @Autowired private MaterialInventoryCheckItemService materialInventoryCheckItemService; + @Autowired + private ConfigWarehouseLocationService configWarehouseLocationService; @Transactional @Override public MaterialInventoryCheckDetailRespVO createMaterialInventoryCheckDetail(MaterialInventoryCheckDetailSaveReqVO createReqVO) { - Long infomationId = createReqVO.getInfomationId(); - MaterialInfomationDO infomationDO = materialInfomationService.getMaterialInfomation(infomationId); - if (infomationDO == null) throw exception(MATERIAL_INFOMATION_NOT_EXISTS); - Long checkId = createReqVO.getCheckId(); - MaterialLifecycleDO lifecycleDO = materialLifecycleService.getMaterialLifecycle(checkId); - if (lifecycleDO == null) throw exception(MATERIAL_LIFECYCLE_NOT_EXISTS); - // 关联到盘点项 - MaterialInventoryCheckItemDO item = materialInventoryCheckItemService.getItemByCheckIdAndPdtId(checkId, infomationDO.getProductId()); - if (item == null) throw exception(MATERIAL_INVENTORY_CHECK_ITEM_NOT_EXISTS); - // 检查是否已经盘点过 - boolean exists = materialInventoryCheckDetailMapper.exists(Wrappers.lambdaQuery(MaterialInventoryCheckDetailDO.class) - .eq(MaterialInventoryCheckDetailDO::getCheckId, checkId) - .eq(MaterialInventoryCheckDetailDO::getInfomationId, infomationId)); - if (exists) throw new ServiceException(1_032_160_000, "此物料已盘点过"); MaterialInventoryCheckDetailDO checkDetailDO = BeanUtils.toBean(createReqVO, MaterialInventoryCheckDetailDO.class); - LocalDateTime checkCreateTime = lifecycleDO.getCreateTime(); - Integer usageStatus = infomationDO.getUsageStatus(); - if (infomationDO.getCreateTime().isAfter(checkCreateTime)) throw new ServiceException(10001, "此物料在发起盘点后入库,不可盘点"); - // TODO 发起盘点后出库的和发起盘点前出库的需要分别处理 - if (usageStatus == 1) { - // 物料已出库 - checkDetailDO.setPresent(0); - } - checkDetailDO.setItemId(item.getId()); // 插入 materialInventoryCheckDetailMapper.insert(checkDetailDO); - - item.setActual(item.getActual().add(BigDecimal.valueOf(1))); - materialInventoryCheckItemService.updateById(item); // 返回 return BeanUtils.toBean(checkDetailDO, MaterialInventoryCheckDetailRespVO.class); } @@ -135,4 +116,69 @@ public class MaterialInventoryCheckDetailServiceImpl implements MaterialInventor .eq(MaterialInventoryCheckDetailDO::getItemId, itemId)); } + @Override + public void addBatch(List checkDetailDOS) { + if (CollUtil.isEmpty(checkDetailDOS)) return; + materialInventoryCheckDetailMapper.insertBatch(checkDetailDOS); + } + + @Override + public MaterialInventoryCheckDetailRespVO inventoryCheckInfomation(MaterialInventoryCheckDetailSaveReqVO inventoryReqVO) { + Long infomationId = inventoryReqVO.getInfomationId(); + MaterialInfomationDO infomationDO = materialInfomationService.getMaterialInfomation(infomationId); + if (infomationDO == null) throw exception(MATERIAL_INFOMATION_NOT_EXISTS); + Long checkId = inventoryReqVO.getCheckId(); + MaterialLifecycleDO lifecycleDO = materialLifecycleService.getMaterialLifecycle(checkId); + if (lifecycleDO == null) throw exception(MATERIAL_LIFECYCLE_NOT_EXISTS); + if (lifecycleDO.getSubmitStatus() != 1) throw new ServiceException(1_032_160_000, "盘点单未提交"); + + LocalDateTime checkTime = lifecycleDO.getApplyTime(); + if (infomationDO.getCreateTime().isAfter(checkTime)) throw new ServiceException(1_032_160_000, "此物料在发起盘点后入库,不可盘点"); + + // 检查是否已经盘点过 + MaterialInventoryCheckDetailDO checkDetailDO = materialInventoryCheckDetailMapper.selectOne(Wrappers.lambdaQuery(MaterialInventoryCheckDetailDO.class) + .eq(MaterialInventoryCheckDetailDO::getCheckId, checkId) + .eq(MaterialInventoryCheckDetailDO::getInfomationId, infomationId)); + MaterialInventoryCheckItemDO item = materialInventoryCheckItemService.getItemByCheckIdAndPdtId(checkId, infomationDO.getProductId()); + if (checkDetailDO != null) { + if (checkDetailDO.getPresent() == 1) throw new ServiceException(1_032_160_000, "此物料已盘点过"); + } else { + // 检查是否未领用了没拿走的情况 + if (infomationDO.getUsageStatus() != 1) throw new ServiceException(1_032_160_000, "此盘点单不可盘点该物料"); + // 根据仓库和盘点项匹配物料 + // 1. 匹配上 新建盘点明细(领用了没拿走) + // 2. 匹配不上 新建盘点项和盘点明细(领用了没拿走且大类不在盘点项中) + JSONObject cstCfgObj = JSONUtil.parseObj(lifecycleDO.getCustomConfig()); + JSONArray jsonWarehouseIds = cstCfgObj.getJSONArray("warehouseIds"); + List warehouseIds = CollUtil.isEmpty(jsonWarehouseIds) ? List.of() : jsonWarehouseIds.toList(Long.class); + if (CollUtil.isEmpty(warehouseIds)) throw new ServiceException(1_032_160_000, "此盘点单没有配置盘点仓库"); + ConfigWarehouseLocationDO location = configWarehouseLocationService.getConfigWarehouseLocation(infomationDO.getLocationId()); + if (location == null) throw exception(CONFIG_WAREHOUSE_LOCATION_NOT_EXISTS); + // 仓库匹配不成功, + if (!warehouseIds.contains(location.getParentId())) throw new ServiceException(1_032_160_000, "该物料所在的仓库不在此盘点单中"); + if (item == null) { + // 盘点项匹配不成功,新建盘点项 + item = new MaterialInventoryCheckItemDO() + .setParentId(checkId).setProductId(infomationDO.getProductId()) + .setExpected(BigDecimal.valueOf(0)) + .setRemark("盘点过程中新增的盘点项"); + materialInventoryCheckItemService.save(item); + } + checkDetailDO = new MaterialInventoryCheckDetailDO() + .setCheckId(checkId).setItemId(item.getId()).setInfomationId(infomationId) + .setCurrentQuantity(inventoryReqVO.getCurrentQuantity()) + .setRemark(StrUtil.isEmpty(inventoryReqVO.getRemark()) ? "已领用未拿走" : inventoryReqVO.getRemark()); + } + checkDetailDO.setPresent(1); + materialInventoryCheckDetailMapper.updateById(checkDetailDO); + item.setActual(item.getActual().add(BigDecimal.valueOf(1))); + materialInventoryCheckItemService.updateById(item); + return BeanUtils.toBean(checkDetailDO, MaterialInventoryCheckDetailRespVO.class); + } + + @Override + public PageResult getPageWithInf(MaterialInventoryCheckDetailPageReqVO pageReqVO) { + return materialInventoryCheckDetailMapper.selectPageWithInf(pageReqVO); + } + } \ 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/MaterialInventoryCheckItemService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemService.java index 65c71fcb..da0ae9a5 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemService.java @@ -113,7 +113,7 @@ public interface MaterialInventoryCheckItemService { * * @param items 盘点项 */ - void updateByIds(List items); + void updateBatch(List items); /** * 根据盘点项id查询盘点明细 @@ -122,4 +122,11 @@ public interface MaterialInventoryCheckItemService { * @return 盘点项详情 */ List getDetailListById(Long id); + + /** + * 保存盘点项 + * + * @param item 盘点项 + */ + void save(MaterialInventoryCheckItemDO item); } \ 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/MaterialInventoryCheckItemServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemServiceImpl.java index 91f8432b..3d6efe73 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryCheckItemServiceImpl.java @@ -131,7 +131,7 @@ public class MaterialInventoryCheckItemServiceImpl implements MaterialInventoryC } @Override - public void updateByIds(List items) { + public void updateBatch(List items) { materialInventoryCheckItemMapper.updateBatch(items); } @@ -140,4 +140,9 @@ public class MaterialInventoryCheckItemServiceImpl implements MaterialInventoryC return materialInventoryCheckDetailService.getListByItemId(id); } + @Override + public void save(MaterialInventoryCheckItemDO item) { + materialInventoryCheckItemMapper.insert(item); + } + } \ 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/MaterialLifecycleServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java index 01f33157..e40fb0e3 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java @@ -41,8 +41,8 @@ import com.zt.plat.module.system.api.user.AdminUserApi; import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.jspecify.annotations.NonNull; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -106,6 +106,9 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , private AdminUserApi adminUserApi; @Autowired private MaterialInventoryCheckItemService materialInventoryCheckItemService; + @Lazy + @Autowired + private MaterialInventoryCheckDetailService materialInventoryCheckDetailService; @Transactional @Override @@ -598,6 +601,18 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , if (CollUtil.isNotEmpty(warehouseIds)) respVO.setWarehouseIds(warehouseIds.toList(Long.class)); List checkItems = materialInventoryCheckItemService.getListWithPdtInfoByLfcId(lifecycleDO.getId()); + if (CollUtil.isEmpty(checkItems)) return respVO; + if (lifecycleDO.getSubmitStatus() == 1) { + respVO.setCheckItems(checkItems); + return respVO; + } + List pdtIds = checkItems.stream().map(MaterialInventoryCheckItemRespVO::getProductId).toList(); + Map stockQuantityByPdtId = materialProductService.getStockQuantityByPdtIds(pdtIds); + if (CollUtil.isEmpty(stockQuantityByPdtId)) return respVO; + checkItems.forEach(item -> { + Long qty = stockQuantityByPdtId.get(item.getProductId()); + item.setExpected(BigDecimal.valueOf(qty == null ? 0L : qty)); + }); respVO.setCheckItems(checkItems); } return respVO; @@ -626,7 +641,14 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , if (lifecycleDO == null) throw exception(MATERIAL_LIFECYCLE_NOT_EXISTS); Integer submitStatus = lifecycleDO.getSubmitStatus(); if (submitStatus == 1) throw new ServiceException(1_032_160_000, "申请已经提交过"); - lifecycleDO.setApplyTime(LocalDateTime.now()); + String loginUserNickname = SecurityFrameworkUtils.getLoginUserNickname(); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) throw new ServiceException(1_032_160_000, "登录用户不存在"); + lifecycleDO.setApplyUser(loginUserNickname) + .setApplyUserId(loginUser.getId()) + .setApplyDepartment(loginUser.getVisitDeptName()) + .setApplyDepartmentId(loginUser.getVisitDeptId()) + .setApplyTime(LocalDateTime.now()); MaterialFlowType flowType = MaterialFlowType.fromName(lifecycleDO.getBusinessType()); switch (flowType) { case acceptance -> @@ -651,9 +673,35 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , } case inventory_check -> { // 盘点项不存在时不允许提交 - List checkItems = materialInventoryCheckItemService.getListByLfcId(id); + MaterialLifecycleRespVO lfcWithDtl = this.getMaterialLifecycleWithDetailList(id); + List checkItems = lfcWithDtl.getCheckItems(); if (CollUtil.isEmpty(checkItems)) throw new ServiceException(1_032_160_000, "盘点项不存在,不可提交"); + // 更新盘点项库存数量 + List checkItemDOS = BeanUtils.toBean(checkItems, MaterialInventoryCheckItemDO.class); + List pdtIds = checkItemDOS.stream().map(MaterialInventoryCheckItemDO::getProductId).toList(); + Map stockQuantityByPdtId = materialProductService.getStockQuantityByPdtIds(pdtIds); + checkItemDOS.forEach(item -> { + Long qty = stockQuantityByPdtId.get(item.getProductId()); + item.setExpected(BigDecimal.valueOf(qty == null ? 0L : qty)); + }); + materialInventoryCheckItemService.updateBatch(checkItemDOS); lifecycleDO.setProgress(QmsCommonConstant.IN_PROGRESS); + // 查询出符合条件的物料明细 + List infs = materialInfomationService.getCheckInfsByCheckLfc(lfcWithDtl); + // 生成盘点明细 + if (CollUtil.isNotEmpty(infs)) { + Map checkItemMapByPdtId = checkItemDOS.stream().collect(Collectors.toMap(MaterialInventoryCheckItemDO::getProductId, Function.identity())); + List checkDetailDOS = infs.stream().map(inf -> { + MaterialInventoryCheckDetailDO detail = new MaterialInventoryCheckDetailDO(); + detail.setCheckId(id); + detail.setItemId(checkItemMapByPdtId.get(inf.getProductId()).getId()); + detail.setInfomationId(inf.getId()); + detail.setPresent(0); + return detail; + }).toList(); + materialInventoryCheckDetailService.addBatch(checkDetailDOS); + } + } } @@ -739,7 +787,7 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , // TODO 盘亏出库 } }); - materialInventoryCheckItemService.updateByIds(items); + materialInventoryCheckItemService.updateBatch(items); } materialLifecycleMapper.updateById(lifecycleDO); return true; 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 520e5d08..d578dd72 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 @@ -12,6 +12,8 @@ import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; +import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigWarehouseLocationDO; +import com.zt.plat.module.qms.business.config.service.ConfigWarehouseLocationService; import com.zt.plat.module.qms.common.service.BusinessFileService; import com.zt.plat.module.qms.core.constant.DataTypeConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO; @@ -51,6 +53,9 @@ public class MaterialProductServiceImpl implements MaterialProductService { @Autowired private BusinessFileService businessFileService; + @Autowired + private ConfigWarehouseLocationService configWarehouseLocationService; + /** * 保存分类 * @@ -378,13 +383,20 @@ public class MaterialProductServiceImpl implements MaterialProductService { @Override public PageResult getMaterialInventoryPage(MaterialProductPageReqVO pageReqVO) { + List warehouseIds = pageReqVO.getWarehouseIds(); + if (CollUtil.isNotEmpty(warehouseIds)) { + List locations = configWarehouseLocationService.getLocationsByWarehouseIds(warehouseIds); + if (CollUtil.isNotEmpty(locations)) { + pageReqVO.setLocationIds(locations.stream().map(ConfigWarehouseLocationDO::getId).toList()); + } + } PageResult pageResult = materialProductMapper.selectPage(pageReqVO); List mtrlDos = pageResult.getList(); if (CollUtil.isEmpty(mtrlDos)) return new PageResult<>(new ArrayList<>(), pageResult.getTotal()); List mtrlIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); List voList = mtrlDos.stream().map(m -> BeanUtils.toBean(m, MaterialProductRespVO.class)).toList(); // 一次性获取大类下的库存数量 - Map stockQuantityMap = materialProductMapper.getStockQuantityByPdtIds(mtrlIds); + Map stockQuantityMap = materialProductMapper.getStockQuantityByPdtIds(mtrlIds, warehouseIds); for (MaterialProductRespVO vo : voList) { Long val = stockQuantityMap.get(vo.getId()); vo.setInventoryQuantity(BigDecimal.valueOf(val == null ? 0L : val)); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/utils/ComplexExcelUtils.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/utils/ComplexExcelUtils.java deleted file mode 100644 index b193c964..00000000 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/utils/ComplexExcelUtils.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zt.plat.module.qms.resource.material.utils; - -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import com.zt.plat.module.qms.resource.material.controller.vo.export.MaterialLedgerExportVO; -import com.zt.plat.module.qms.resource.material.handler.excel.MaterialHazardousLedgerHeadHandler; -import com.zt.plat.module.qms.resource.material.handler.excel.MaterialHazardousLedgerStyleHandler; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.List; - -public class ComplexExcelUtils { - public static void writeHazardousLedger(HttpServletResponse response, - String filename, String sheetName, - List dataList) throws IOException { - // 创建 ExcelWriter - EasyExcel.write(response.getOutputStream(), MaterialLedgerExportVO.class) - .autoCloseStream(false) - .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - // 注册自定义表头处理器 - .registerWriteHandler(new MaterialHazardousLedgerHeadHandler()) - // 注册自定义样式处理器 - .registerWriteHandler(new MaterialHazardousLedgerStyleHandler()) - .sheet(sheetName) - .doWrite(dataList); - - // 设置响应头 - response.addHeader("Content-Disposition", "attachment;filename=" - + URLEncoder.encode(filename, StandardCharsets.UTF_8)); - response.setContentType("application/vnd.ms-excel;charset=UTF-8"); - } - -}