diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/contractManage/ContractManageApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/contractManage/ContractManageApplicationService.java index 96e150e9f..9013a1f84 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/contractManage/ContractManageApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/contractManage/ContractManageApplicationService.java @@ -1124,4 +1124,51 @@ public class ContractManageApplicationService { public ContractManagePO getGeneralContract() { return contractManageDomainService.getGeneralContract(); } + + /** + * 合同导出(合同头字段 + 明细拍平成一行一条明细) + */ + public List buildExportList(ContractManageDO contractManageDO) { + List contractList = this.queryList(contractManageDO); + List exportList = new ArrayList<>(); + if (contractList == null || contractList.isEmpty()) { + return exportList; + } + List contractManageIds = contractList.stream() + .map(ContractManagePO::getContractManageId) + .collect(Collectors.toList()); + Map> detailMap = contractManageDetailDomainService + .queryListByManageIds(contractManageIds).stream() + .collect(Collectors.groupingBy(ContractManageDetailPO::getContractManageId)); + + for (ContractManagePO contract : contractList) { + List details = detailMap.get(contract.getContractManageId()); + if (details != null && !details.isEmpty()) { + for (ContractManageDetailPO detail : details) { + ContractManageExportVO vo = new ContractManageExportVO(); + // 合同头字段整体复制 + BeanUtils.copyProperties(contract, vo); + // 明细字段显式赋值(合同头/明细存在同名字段,避免互相覆盖) + vo.setSubjectType(detail.getSubjectType()); + vo.setFirstSubjectCode(detail.getFirstSubjectCode()); + vo.setFirstSubjectName(detail.getFirstSubjectName()); + vo.setSecondSubjectCode(detail.getSecondSubjectCode()); + vo.setSecondSubjectName(detail.getSecondSubjectName()); + vo.setAccountingStrategy(detail.getAccountingStrategy()); + vo.setBillingAttributes(detail.getBillingAttributes()); + vo.setSubjectEffectiveDate(detail.getSubjectEffectiveDate()); + vo.setSubjectExpirationDate(detail.getSubjectExpirationDate()); + vo.setDocumentType(detail.getDocumentType()); + vo.setServiceItemsName(detail.getServiceItemsName()); + exportList.add(vo); + } + } else { + // 无明细的合同也保留一行头字段 + ContractManageExportVO vo = new ContractManageExportVO(); + BeanUtils.copyProperties(contract, vo); + exportList.add(vo); + } + } + return exportList; + } } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManageDetail/service/ContractManageDetailDomainService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManageDetail/service/ContractManageDetailDomainService.java index 31a5a2ffa..5e5a14585 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManageDetail/service/ContractManageDetailDomainService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/contractManageDetail/service/ContractManageDetailDomainService.java @@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** * 合同管理详情 @@ -95,5 +96,29 @@ public class ContractManageDetailDomainService { return resultList; } + /** + * 根据多个合同管理id批量查询合同科目详情(一次SQL查询,避免逐合同N+1) + * @param contractManageIds 合同管理id集合 + * @return 合同科目详情列表 + */ + public List queryListByManageIds(Collection contractManageIds) { + List resultList = new ArrayList<>(); + if (contractManageIds == null || contractManageIds.isEmpty()) { + return resultList; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(ContractManageDetail::getContractManageId, contractManageIds); + queryWrapper.eq(ContractManageDetail::getDelFlag, 1); + List contractManageDetails = contractManageDetailService.list(queryWrapper); + if (contractManageDetails != null && contractManageDetails.size() > 0) { + for (ContractManageDetail contractManageDetail : contractManageDetails) { + ContractManageDetailPO contractManageDetailPO = new ContractManageDetailPO(); + BeanUtils.copyProperties(contractManageDetail, contractManageDetailPO); + resultList.add(contractManageDetailPO); + } + } + return resultList; + } + } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageExportVO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageExportVO.java new file mode 100644 index 000000000..dde51f867 --- /dev/null +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/contractManage/ContractManageExportVO.java @@ -0,0 +1,102 @@ +package com.mhd.basic.interfaces.dto.contractManage; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 合同管理导出对象(合同头字段 + 科目明细字段,拍平为一行一条明细) + * + * @author gen + * @date 2024-06-07 + */ +@Data +@ApiModel(value = "合同管理导出对象", description = "合同管理导出对象(含明细)") +public class ContractManageExportVO { + + /** ====== 合同头字段(与 ContractManagePO 的 @Excel 一致) ====== */ + @Excel(name = "合同编号") + private String contractNumber; + + @Excel(name = "合同名称") + private String contractName; + + @Excel(name = "是否通用合同", readConverterExp = "1=是,2=否") + private Integer commonContractFlag; + + @Excel(name = "合同类型", readConverterExp = "1=仓储,2=运输,3=其他") + private Integer contractType; + + @Excel(name = "合同状态", readConverterExp = "1=未生效,2=使用中,3=已过期,4=已作废") + private Integer contractState; + + @Excel(name = "签订单位") + private String signingUnit; + + @Excel(name = "结算主体") + private String settlementCustomers; + + @Excel(name = "我司身份", readConverterExp = "1=甲方,2=乙方") + private Integer ourIdentity; + + @Excel(name = "账期", readConverterExp = "1=每月,2=双月,3=季度") + private Integer accountingPeriod; + + @Excel(name = "合同签订日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date signingDate; + + @Excel(name = "合同生效日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date effectiveDate; + + @Excel(name = "合同到期日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date expirationDate; + + @Excel(name = "组织名称") + private String organizationName; + + @Excel(name = "客户类型") + private String customerType; + + @Excel(name = "是否自动出账", readConverterExp = "1=是,2=否") + private Integer automaticFlag; + + @Excel(name = "备注") + private String remark; + + /** ====== 明细字段(来源于 contract_manage_detail) ====== */ + @Excel(name = "结算科目类型", readConverterExp = "1=通用,2=临时") + private Integer subjectType; + + @Excel(name = "一级费用科目code") + private String firstSubjectCode; + + @Excel(name = "一级费用科目") + private String firstSubjectName; + + @Excel(name = "二级费用科目code") + private String secondSubjectCode; + + @Excel(name = "二级费用科目") + private String secondSubjectName; + + @Excel(name = "计费策略") + private String accountingStrategy; + + @Excel(name = "计费周期") + private String billingAttributes; + + @Excel(name = "科目生效日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date subjectEffectiveDate; + + @Excel(name = "科目到期日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date subjectExpirationDate; + + @Excel(name = "单据类型") + private String documentType; + + @Excel(name = "费用类别") + private String serviceItemsName; +} diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/contractManage/ContractManageApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/contractManage/ContractManageApi.java index c48ef479b..139de36e1 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/contractManage/ContractManageApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/contractManage/ContractManageApi.java @@ -1,8 +1,11 @@ package com.mhd.basic.interfaces.facade.contractManage; +import java.io.IOException; +import java.net.URLEncoder; import java.util.List; import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler; +import com.mhd.basic.interfaces.dto.contractManage.ContractManageExportVO; import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO; import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceReturn; import io.swagger.annotations.ApiOperation; @@ -14,9 +17,11 @@ import com.mhd.basic.domain.contractManage.repository.todo.ContractManageDO; import com.mhd.basic.domain.contractManage.repository.po.ContractManagePO; import com.mhd.basic.application.service.contractManage.ContractManageApplicationService; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.common.core.utils.poi.ExcelUtil; /** * 合同管理Api @@ -205,7 +210,24 @@ public class ContractManageApi extends BaseController{ return AjaxResult.success(list); } + @ApiOperation("导出合同(含明细)") + @GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public void export(ContractManageDTO contractManageDTO, HttpServletResponse response) throws IOException + { + //转换实体 + ContractManageDO contractManageDO = new ContractManageDO(); + BeanUtils.copyProperties(contractManageDTO, contractManageDO); + //查询全量(不分页)并拍平明细 + List list = contractManageApplicationService.buildExportList(contractManageDO); + //设置下载头,防止浏览器乱码 + String fileName = URLEncoder.encode("合同导出", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelUtil util = new ExcelUtil<>(ContractManageExportVO.class); + util.exportExcel(response, list, "合同导出"); + } } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java index c0bb0bcce..348f3b829 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java @@ -181,17 +181,9 @@ public class ReservationStockInOrderApplicationService { * 新增入库单 */ public Boolean insert(ReservationStockInOrderDO stockInOrderDO) { -// 如果仓库ID为空,从当前登录用户的关联仓库中获取 + // 仓库为必填项,前端必须选择入库仓库 if (stockInOrderDO.getWarehouseId() == null) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser == null) { - throw new ServiceException("登录已失效,请重新登录"); - } - AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); - if (associationWarehouseCacheDO == null || associationWarehouseCacheDO.getWarehouseId() == null) { - throw new ServiceException("当前用户未配置关联仓库,请先配置仓库"); - } - stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + throw new ServiceException("请选择入库仓库"); } //设置仓库 setWarehouseInfo(stockInOrderDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/statementStatistics/StatementStatisticsService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/statementStatistics/StatementStatisticsService.java index 367e97829..f358a9a11 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/statementStatistics/StatementStatisticsService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/statementStatistics/StatementStatisticsService.java @@ -25,6 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.lang.reflect.Field; +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -127,6 +128,17 @@ public class StatementStatisticsService { } } List immediateInventoryPOS = materialInventoryDomainService.queryImmediateInventoryList(immediateInventoryDO); + + // 库存数量合计:与列表同筛选条件、不分页统计全部库存数量,回填到每行 + if (!CollectionUtils.isEmpty(immediateInventoryPOS)) { + BigDecimal totalInventoryQuantity = materialInventoryDomainService.sumImmediateInventoryQuantity(immediateInventoryDO); + if (totalInventoryQuantity == null) { + totalInventoryQuantity = BigDecimal.ZERO; + } + BigDecimal finalTotal = totalInventoryQuantity; + immediateInventoryPOS.forEach(po -> po.setTotalInventoryQuantity(finalTotal)); + } + // 性能优化:批量获取批次属性,避免N+1查询问题 // 1. 收集所有唯一的materialBaseInfoId Set materialBaseInfoIdSet = immediateInventoryPOS.stream() diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index ea0c33038..e90b63607 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -2222,24 +2222,31 @@ public class StockReceiptOrderApplicationService { } /** - * PDA 抄码收货不采集毛重、体积、面积:在装配前将对应请求字段置 0,避免 getInfo 带回的累计展示值被当作本次增量。 + * PDA 抄码收货不采集毛重、体积、面积:在装配前将对应请求字段置 null, + * 利用 MyBatis-Plus NOT_NULL 策略跳过这些字段,避免覆盖已有累计数据。 + * @param lines 收货明细列表 */ private static void normalizePdaCopyReceiptGrossVolumeAreaToZero(List lines) { + // 没有明细时,直接返回 if (CollectionUtils.isEmpty(lines)) { return; } + // 有明细时,遍历 for (ReceiptMaterialDetailDO line : lines) { + // 跳过 line 为 null if (line == null) { continue; } + // 在装配之前将字段置为 null if (isPdaCopyReceiptLine(line)) { - line.setReceiptGrossWeight(BigDecimal.ZERO); - line.setTotalGrossWeight(BigDecimal.ZERO); - line.setReceiptVolume(BigDecimal.ZERO); - line.setTotalVolume(BigDecimal.ZERO); - line.setReceiptArea(BigDecimal.ZERO); - line.setTotalArea(BigDecimal.ZERO); + line.setReceiptGrossWeight(null); + line.setTotalGrossWeight(null); + line.setReceiptVolume(null); + line.setTotalVolume(null); + line.setReceiptArea(null); + line.setTotalArea(null); } + // 递归,确保每一个子行都会独立通过 isPdaCopyReceiptLine 判断是否需要清字段 normalizePdaCopyReceiptGrossVolumeAreaToZero(line.getChildren()); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/facade/IMaterialInventoryService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/facade/IMaterialInventoryService.java index a3000dca6..d21794b81 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/facade/IMaterialInventoryService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/facade/IMaterialInventoryService.java @@ -71,6 +71,12 @@ public interface IMaterialInventoryService extends IService */ public List queryImmediateInventoryList(ImmediateInventoryDO immediateInventoryDO); + /** + * 查询即时库存合计数量 + */ + public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO); + + /** * @description 增加指定库存 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/mapper/MaterialInventoryMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/mapper/MaterialInventoryMapper.java index a609f19c0..2cb15e4f0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/mapper/MaterialInventoryMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/mapper/MaterialInventoryMapper.java @@ -91,6 +91,12 @@ public interface MaterialInventoryMapper extends BaseMapper */ public List queryImmediateInventoryList(ImmediateInventoryDO immediateInventoryDO); + /** + * 查询即时库存合计数量(与列表相同筛选条件,返回库存数量总和) + */ + public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO); + + @Select("SELECT SUM(inventory_quantity) FROM material_inventory a LEFT JOIN material_base_info b ON a.material_base_info_id = b.material_base_info_id WHERE a.del_flag = 1 AND b.shipper_id = #{shipperId} AND b.material_base_info_id = #{materialBaseInfoId}") public BigDecimal sumInventoryQuantityByShipperAndMaterialCode(@Param("shipperId") Long shipperId, @Param("materialBaseInfoId") Long materialBaseInfoId); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java index 8b25a0600..4b1e1b14e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java @@ -464,11 +464,29 @@ public class MaterialInventoryImpl extends ServiceImpl queryImmediateInventoryList(ImmediateInventoryDO immediateInventoryDO) { return materialInventoryMapper.queryImmediateInventoryList(immediateInventoryDO); } + /** + * 查询即时库存合计数量 + *

与列表查询使用相同筛选条件但不分页,统计筛选条件下所有库存数量之和

+ * + * @param immediateInventoryDO 即时库存查询条件(与列表查询保持一致,保证合计口径一致) + * @return 库存数量合计值,无数据时为 0 + */ + @Override + public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO) { + return materialInventoryMapper.sumImmediateInventoryQuantity(immediateInventoryDO); + } + /** * @description 增加指定库存 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/service/MaterialInventoryDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/service/MaterialInventoryDomainService.java index 46d5d1d11..30eba9147 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/service/MaterialInventoryDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/service/MaterialInventoryDomainService.java @@ -103,6 +103,20 @@ public class MaterialInventoryDomainService { return materialInventoryService.queryImmediateInventoryList(immediateInventoryDO); } + /** + * 查询即时库存合计数量 + */ + public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO) { + return materialInventoryService.sumImmediateInventoryQuantity(immediateInventoryDO); + } + + /** + * 根据查询条件获取物料库存信息 + *

按货主、组织、物料、仓库、库位等条件查询,返回汇总后的库存信息(含库存数量合计)

+ * + * @param materialInventoryDO 物料库存查询条件(含货主、顶级组织、物料基础信息、仓库、库位等) + * @return 匹配条件的物料库存信息,无匹配数据时返回 null + */ public MaterialInventoryPO selectOneByWhere(MaterialInventoryDO materialInventoryDO) { return materialInventoryService.selectOneByWhere(materialInventoryDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index c9c533d42..5226eb019 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -459,6 +459,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList); - if (!uniqueIds.isEmpty()) { - IMaterialMoreDetailService.remove(new QueryWrapper() - .eq("order_number", receiptOrderNumber) - .in("material_detail_unique_id", uniqueIds) - .eq("del_flag", 1)); - } - } - IMaterialMoreDetailService.saveBatch(materialMoreDetailList); - } +// if (!CollectionUtils.isEmpty(materialMoreDetailList)){ +// String receiptOrderNumber = stockReceiptOrderDO.getReceiptOrderNumber(); +// if (StringUtils.isBlank(receiptOrderNumber) && !CollectionUtils.isEmpty(receiptMaterialDetailDOList)) { +// receiptOrderNumber = receiptMaterialDetailDOList.get(0).getReceiptOrderNumber(); +// } +// if (StringUtils.isNotBlank(receiptOrderNumber)) { +// java.util.Set uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList); +// if (!uniqueIds.isEmpty()) { +// IMaterialMoreDetailService.remove(new QueryWrapper() +// .eq("order_number", receiptOrderNumber) +// .in("material_detail_unique_id", uniqueIds) +// .eq("del_flag", 1)); +// } +// } +// IMaterialMoreDetailService.saveBatch(materialMoreDetailList); +// } //批量新增序列号 if (!CollectionUtils.isEmpty(materialDetailSerialNumberList)){ inMaterialDetailSerialNumberService.saveBatch(materialDetailSerialNumberList); @@ -513,6 +519,144 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl materialMoreDetailList, + StockReceiptOrderDO stockReceiptOrderDO, + List receiptMaterialDetailDOList) { + // 无批次属性则直接返回 + if (CollectionUtils.isEmpty(materialMoreDetailList)) { + return; + } + // 无收货单号无法做增量更新,退回全量插入 + String receiptOrderNumber = stockReceiptOrderDO.getReceiptOrderNumber(); + if (StringUtils.isBlank(receiptOrderNumber) && !CollectionUtils.isEmpty(receiptMaterialDetailDOList)) { + receiptOrderNumber = receiptMaterialDetailDOList.get(0).getReceiptOrderNumber(); + } + // 无收货单号无法做增量更新,退回全量插入 + if (StringUtils.isBlank(receiptOrderNumber)) { + IMaterialMoreDetailService.saveBatch(materialMoreDetailList); + return; + } + // 无明细唯一ID无法做增量更新,退回全量插入 + java.util.Set uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList); + if (uniqueIds.isEmpty()) { + IMaterialMoreDetailService.saveBatch(materialMoreDetailList); + return; + } + // 查询已存在的批次属性记录 + List existingList = IMaterialMoreDetailService.list( + new QueryWrapper() + .eq("order_number", receiptOrderNumber) // 收货单号 + .in("material_detail_unique_id", uniqueIds) // 明细唯一ID + .eq("del_flag", 1)); // 删除标志 + // 按 materialDetailUniqueId + batchDetailId 构建索引 + Map existingMap = new HashMap<>(); + for (MaterialMoreDetail existing : existingList) { + String key = buildMaterialMoreDetailKey(existing.getMaterialDetailUniqueId(), existing.getBatchDetailId()); + existingMap.put(key, existing); + } + // 分离:需要更新的 以及 需要新增的;跳过空值(保留旧数据) + List toUpdate = new ArrayList<>(); + List toInsert = new ArrayList<>(); + for (MaterialMoreDetail incoming : materialMoreDetailList) { + // attributeValue 为空/空白时跳过,不覆盖已有数据 + if (StringUtils.isBlank(incoming.getAttributeValue())) { + continue; + } + // 按 materialDetailUniqueId + batchDetailId 构建索引 + String key = buildMaterialMoreDetailKey(incoming.getMaterialDetailUniqueId(), incoming.getBatchDetailId()); + // 已存在的批次属性记录 + MaterialMoreDetail existing = existingMap.get(key); + // 存在则更新 ,不存在则新增 + if (existing != null) { + // 设置主键走 update,保留已有记录的 id + incoming.setMaterialMoreDetailId(existing.getMaterialMoreDetailId()); + // 更新现有记录 + toUpdate.add(incoming); + } else { + // 插入新的记录 + toInsert.add(incoming); + } + } + // 判断需更新的记录是否存在,存在则更新 + if (!toUpdate.isEmpty()) { + IMaterialMoreDetailService.updateBatchById(toUpdate); + } + // 判断是否存在需新增的记录,存在则批量插入 + if (!toInsert.isEmpty()) { + IMaterialMoreDetailService.saveBatch(toInsert); + } + } + + /** + * 构建批次属性索引 + * @param materialDetailUniqueId 明细唯一ID + * @param batchDetailId 批次属性ID + * @return 批次属性索引 + */ + private static String buildMaterialMoreDetailKey(Long materialDetailUniqueId, Long batchDetailId) { + return (materialDetailUniqueId != null ? materialDetailUniqueId : "null") + "_" + + (batchDetailId != null ? batchDetailId : "null"); + } + + /** + * 将 total* 指标字段中值为 0 的置为 null。 + * MyBatis-Plus 默认 NOT_NULL 策略下,null 不参与 SET 子句,已有数据得以保留。 + * 注意:仅对「未填写」场景生效;用户确实需要填 0 的极端场景不受影响(因前端通常传 null 表示未填)。 + * @param receiptMaterialDetail 收货明细 + * 需保证 total* 字段已赋值。 + * 需保证 alreadyReceipt* 字段已赋值。 + * 静态方法修改 receiptMaterialDetail 参数 + **/ + private static void normalizeZeroMetricsToNull(ReceiptMaterialDetail receiptMaterialDetail) { + // entity 为 null 时直接返回 + if (receiptMaterialDetail == null) { + return; + } + // receiptMaterialDetail totalNetWeight 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getTotalNetWeight())) { + receiptMaterialDetail.setTotalNetWeight(null); + } + // receiptMaterialDetail totalGrossWeight 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getTotalGrossWeight())) { + receiptMaterialDetail.setTotalGrossWeight(null); + } + // receiptMaterialDetail totalVolume 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getTotalVolume())) { + receiptMaterialDetail.setTotalVolume(null); + } + // receiptMaterialDetail totalArea 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getTotalArea())) { + receiptMaterialDetail.setTotalArea(null); + } + // receiptMaterialDetail alreadyReceiptNetWeight 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getAlreadyReceiptNetWeight())) { + receiptMaterialDetail.setAlreadyReceiptNetWeight(null); + } + // receiptMaterialDetail alreadyReceiptGrossWeight 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getAlreadyReceiptGrossWeight())) { + receiptMaterialDetail.setAlreadyReceiptGrossWeight(null); + } + // receiptMaterialDetail alreadyReceiptVolume 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getAlreadyReceiptVolume())) { + receiptMaterialDetail.setAlreadyReceiptVolume(null); + } + // receiptMaterialDetail alreadyReceiptArea 字段为 0 时置为 null + if (isZeroBigDecimal(receiptMaterialDetail.getAlreadyReceiptArea())) { + receiptMaterialDetail.setAlreadyReceiptArea(null); + } + } + + private static boolean isZeroBigDecimal(BigDecimal val) { + return val != null && val.compareTo(BigDecimal.ZERO) == 0; + } + private void setMore(ReceiptMaterialDetailDO receiptMaterialDetailDO) { List materialMoreDetailList = receiptMaterialDetailDO.getMaterialMoreDetailList(); if (!CollectionUtils.isEmpty(materialMoreDetailList)) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/po/ImmediateInventoryPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/po/ImmediateInventoryPO.java index db0d45dd8..8d9f51786 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/po/ImmediateInventoryPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/po/ImmediateInventoryPO.java @@ -42,10 +42,18 @@ public class ImmediateInventoryPO { @Excel(name = "物料条形码") private String barCode; + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + @ApiModelProperty("库存数量") @Excel(name = "库存数量") private BigDecimal inventoryQuantity; + @ApiModelProperty("库存数量合计(当前查询条件下所有库存数量之和)") + @Excel(name = "库存数量合计") + private BigDecimal totalInventoryQuantity; + @ApiModelProperty("可用数量 ") @Excel(name = "可用数量 ") private BigDecimal allocationQuantity; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/todo/ImmediateInventoryDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/todo/ImmediateInventoryDO.java index 326891292..17049ffc4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/todo/ImmediateInventoryDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/statementStatistics/todo/ImmediateInventoryDO.java @@ -44,6 +44,10 @@ public class ImmediateInventoryDO extends BaseVOEntity { @Excel(name = "物料条形码") private String barCode; + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + @ApiModelProperty("仓库id") @Excel(name = "仓库id") private Long warehouseId; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/statementStatistics/ImmediateInventoryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/statementStatistics/ImmediateInventoryDTO.java index 8310831b6..34fa01360 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/statementStatistics/ImmediateInventoryDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/statementStatistics/ImmediateInventoryDTO.java @@ -45,6 +45,10 @@ public class ImmediateInventoryDTO { @Excel(name = "物料条形码") private String barCode; + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + @ApiModelProperty("仓库id") @Excel(name = "仓库id") private Long warehouseId; diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 484fcf602..5a5708903 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -162,7 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.material_base_info_id = #{materialBaseInfoId} - and a.material_detail_id, = #{materialDetailId} + and a.material_detail_id = #{materialDetailId} @@ -313,7 +313,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and mi.material_base_info_id = #{materialBaseInfoId} - and mi.material_detail_id, = #{materialDetailId} + and mi.material_detail_id = #{materialDetailId} @@ -781,12 +781,280 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and container_id = #{containerId} + + + and a.organization_id = #{organizationId} + + + + and a.top_organization_id = #{topOrganizationId} + + + + and (a.shipper_name = #{shipperName} OR b.shipper_name = #{shipperName}) + + + + and a.shipper_id = #{shipperId} + + + + and a.warehouse_id = #{warehouseId} + + + + and a.warehouse_code = #{warehouseCode} + + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + + and b.material_name = #{materialName} + + + + and b.material_code = #{materialCode} + + + + and b.bar_code = #{barCode} + + + + and b.specification_model = #{specificationModel} + + + + and a.batch_number = #{batchNumber} + + + + and ifnull( + ( + SELECT + sum( c.receipt_quantity ) + FROM + receipt_material_detail c + LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number + AND d.del_flag = 1 + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 + WHERE + c.del_flag = 1 and d.STATUS = 3 + AND e.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + and (c.BATCH_REF_NO = a.batch_ref_no or (c.BATCH_REF_NO is null and a.BATCH_REF_NO is null)) + and (c.SHEET_REF_NO = a.sheet_ref_no or (c.SHEET_REF_NO is null and a.SHEET_REF_NO is null)) + and (c.BOX_PALLET_NO = a.BOX_PALLET_NO or (c.BOX_PALLET_NO is null and a.BOX_PALLET_NO is null)) + and (c.EXT_ATTR_1 = a.EXT_ATTR_1 or (c.EXT_ATTR_1 is null and a.EXT_ATTR_1 is null)) + and (c.EXT_ATTR_2 = a.EXT_ATTR_2 or (c.EXT_ATTR_2 is null and a.EXT_ATTR_2 is null)) + and (c.EXT_ATTR_3 = a.EXT_ATTR_3 or (c.EXT_ATTR_3 is null and a.EXT_ATTR_3 is null)) + and (c.EXT_ATTR_4 = a.EXT_ATTR_4 or (c.EXT_ATTR_4 is null and a.EXT_ATTR_4 is null)) + and (c.PRODUCTION_DATE = a.PRODUCTION_DATE or (c.PRODUCTION_DATE is null and a.PRODUCTION_DATE is null)) + and (c.EXPIRY_DATE = a.EXPIRY_DATE or (c.EXPIRY_DATE is null and a.EXPIRY_DATE is null)) + and (c.INVENTORY_DATE = a.INVENTORY_DATE or (c.INVENTORY_DATE is null and a.INVENTORY_DATE is null)) + ), + 0 + )> #{receivedQuantityStart} + + + + and ifnull( + ( + SELECT + sum( c.receipt_quantity ) + FROM + receipt_material_detail c + LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number + AND d.del_flag = 1 + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 + WHERE + c.del_flag = 1 and d.STATUS = 3 + AND e.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + and (c.BATCH_REF_NO = a.batch_ref_no or (c.BATCH_REF_NO is null and a.BATCH_REF_NO is null)) + and (c.SHEET_REF_NO = a.sheet_ref_no or (c.SHEET_REF_NO is null and a.SHEET_REF_NO is null)) + and (c.BOX_PALLET_NO = a.BOX_PALLET_NO or (c.BOX_PALLET_NO is null and a.BOX_PALLET_NO is null)) + and (c.EXT_ATTR_1 = a.EXT_ATTR_1 or (c.EXT_ATTR_1 is null and a.EXT_ATTR_1 is null)) + and (c.EXT_ATTR_2 = a.EXT_ATTR_2 or (c.EXT_ATTR_2 is null and a.EXT_ATTR_2 is null)) + and (c.EXT_ATTR_3 = a.EXT_ATTR_3 or (c.EXT_ATTR_3 is null and a.EXT_ATTR_3 is null)) + and (c.EXT_ATTR_4 = a.EXT_ATTR_4 or (c.EXT_ATTR_4 is null and a.EXT_ATTR_4 is null)) + and (c.PRODUCTION_DATE = a.PRODUCTION_DATE or (c.PRODUCTION_DATE is null and a.PRODUCTION_DATE is null)) + and (c.EXPIRY_DATE = a.EXPIRY_DATE or (c.EXPIRY_DATE is null and a.EXPIRY_DATE is null)) + and (c.INVENTORY_DATE = a.INVENTORY_DATE or (c.INVENTORY_DATE is null and a.INVENTORY_DATE is null)) + ), + 0 + ) < #{receivedQuantityEnd} + + + + and ifnull( + ( + SELECT + sum( c.shelves_quantity ) + FROM + shelf_material_detail c + LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number + AND d.del_flag = 1 + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 + WHERE + c.del_flag = 1 + AND e.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + ), + 0 + ) > #{shelvesQuantityStart} + + + + and ifnull( + ( + SELECT + sum( c.shelves_quantity ) + FROM + shelf_material_detail c + LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number + AND d.del_flag = 1 + LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 + WHERE + c.del_flag = 1 + AND e.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + ), + 0 + ) < #{shelvesQuantityEnd} + + + + and ifnull( + ( + SELECT + sum( c.picking_quantity ) + FROM + picking_material_detail c + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 + WHERE + c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 + AND d.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID + ), + 0 + ) > #{pickQuantityStart} + + + + and ifnull( + ( + SELECT + sum( c.picking_quantity ) + FROM + picking_material_detail c + LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 + left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 + WHERE + c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 + AND d.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID + ), + 0 + ) < #{pickQuantityEnd} + + + + and + ifnull( + ( + SELECT + SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY + FROM + OUT_MATERIAL_DETAIL c + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 + LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER + WHERE + d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) + AND d.DEL_FLAG = 1 + AND c.DEL_FLAG = 1 + and e.del_flag = 1 + AND d.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID + ), + 0 + ) > #{checkQuantityBegin} + + + + and + ifnull( + ( + SELECT + SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY + FROM + OUT_MATERIAL_DETAIL c + LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 + LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER + WHERE + d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) + AND d.DEL_FLAG = 1 + AND c.DEL_FLAG = 1 + and e.del_flag = 1 + AND d.warehouse_id = a.warehouse_id + AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) + AND c.material_base_info_id = a.material_base_info_id + AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID + ), + 0 + ) < #{checkQuantityEnd} + + + + and a.inventory_quantity = #{inventoryQuantity} + + + + and a.inventory_quantity > #{inventoryQuantityStart} + + + + and a.inventory_quantity < #{inventoryQuantityEnd} + + + + and a.allocation_quantity > #{allocationQuantityStart} + + + + and a.allocation_quantity < #{allocationQuantityEnd} + + + + and a.freeze_quantity > #{freezeQuantityStart} + + + + and a.freeze_quantity < #{freezeQuantityEnd} + + + + + @@ -826,6 +1094,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.material_name, b.material_code, b.bar_code, + b.specification_model, @@ -995,271 +1264,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE a.del_flag = 1 - - and a.organization_id = #{organizationId} - - - - and a.top_organization_id = #{topOrganizationId} - - - - and (a.shipper_name = #{shipperName} OR b.shipper_name = #{shipperName}) - - - - and a.shipper_id = #{shipperId} - - - - and a.warehouse_id = #{warehouseId} - - - - and a.warehouse_code = #{warehouseCode} - - - - and a.warehouse_name like concat('%', #{warehouseName}, '%') - - - - and b.material_name = #{materialName} - - - - and b.material_code = #{materialCode} - - - - and b.bar_code = #{barCode} - - - - and a.batch_number = #{batchNumber} - - - - and ifnull( - ( - SELECT - sum( c.receipt_quantity ) - FROM - receipt_material_detail c - LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number - AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 - WHERE - c.del_flag = 1 and d.STATUS = 3 - AND e.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - and (c.BATCH_REF_NO = a.batch_ref_no or (c.BATCH_REF_NO is null and a.BATCH_REF_NO is null)) - and (c.SHEET_REF_NO = a.sheet_ref_no or (c.SHEET_REF_NO is null and a.SHEET_REF_NO is null)) - and (c.BOX_PALLET_NO = a.BOX_PALLET_NO or (c.BOX_PALLET_NO is null and a.BOX_PALLET_NO is null)) - and (c.EXT_ATTR_1 = a.EXT_ATTR_1 or (c.EXT_ATTR_1 is null and a.EXT_ATTR_1 is null)) - and (c.EXT_ATTR_2 = a.EXT_ATTR_2 or (c.EXT_ATTR_2 is null and a.EXT_ATTR_2 is null)) - and (c.EXT_ATTR_3 = a.EXT_ATTR_3 or (c.EXT_ATTR_3 is null and a.EXT_ATTR_3 is null)) - and (c.EXT_ATTR_4 = a.EXT_ATTR_4 or (c.EXT_ATTR_4 is null and a.EXT_ATTR_4 is null)) - and (c.PRODUCTION_DATE = a.PRODUCTION_DATE or (c.PRODUCTION_DATE is null and a.PRODUCTION_DATE is null)) - and (c.EXPIRY_DATE = a.EXPIRY_DATE or (c.EXPIRY_DATE is null and a.EXPIRY_DATE is null)) - and (c.INVENTORY_DATE = a.INVENTORY_DATE or (c.INVENTORY_DATE is null and a.INVENTORY_DATE is null)) - ), - 0 - )> #{receivedQuantityStart} - - - - and ifnull( - ( - SELECT - sum( c.receipt_quantity ) - FROM - receipt_material_detail c - LEFT JOIN stock_receipt_order d ON c.receipt_order_number = d.receipt_order_number - AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 - WHERE - c.del_flag = 1 and d.STATUS = 3 - AND e.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - and (c.BATCH_REF_NO = a.batch_ref_no or (c.BATCH_REF_NO is null and a.BATCH_REF_NO is null)) - and (c.SHEET_REF_NO = a.sheet_ref_no or (c.SHEET_REF_NO is null and a.SHEET_REF_NO is null)) - and (c.BOX_PALLET_NO = a.BOX_PALLET_NO or (c.BOX_PALLET_NO is null and a.BOX_PALLET_NO is null)) - and (c.EXT_ATTR_1 = a.EXT_ATTR_1 or (c.EXT_ATTR_1 is null and a.EXT_ATTR_1 is null)) - and (c.EXT_ATTR_2 = a.EXT_ATTR_2 or (c.EXT_ATTR_2 is null and a.EXT_ATTR_2 is null)) - and (c.EXT_ATTR_3 = a.EXT_ATTR_3 or (c.EXT_ATTR_3 is null and a.EXT_ATTR_3 is null)) - and (c.EXT_ATTR_4 = a.EXT_ATTR_4 or (c.EXT_ATTR_4 is null and a.EXT_ATTR_4 is null)) - and (c.PRODUCTION_DATE = a.PRODUCTION_DATE or (c.PRODUCTION_DATE is null and a.PRODUCTION_DATE is null)) - and (c.EXPIRY_DATE = a.EXPIRY_DATE or (c.EXPIRY_DATE is null and a.EXPIRY_DATE is null)) - and (c.INVENTORY_DATE = a.INVENTORY_DATE or (c.INVENTORY_DATE is null and a.INVENTORY_DATE is null)) - ), - 0 - ) < #{receivedQuantityEnd} - - - - and ifnull( - ( - SELECT - sum( c.shelves_quantity ) - FROM - shelf_material_detail c - LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number - AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 - WHERE - c.del_flag = 1 - AND e.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - ), - 0 - ) > #{shelvesQuantityStart} - - - - and ifnull( - ( - SELECT - sum( c.shelves_quantity ) - FROM - shelf_material_detail c - LEFT JOIN stock_shelf_order d ON c.shelf_order_number = d.shelf_order_number - AND d.del_flag = 1 - LEFT JOIN stock_in_order e ON d.in_order_number = e.in_order_number and e.DEL_FLAG = 1 and d.DEL_FLAG = 1 - WHERE - c.del_flag = 1 - AND e.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR e.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - ), - 0 - ) < #{shelvesQuantityEnd} - - - - and ifnull( - ( - SELECT - sum( c.picking_quantity ) - FROM - picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 - WHERE - c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 - AND d.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID - ), - 0 - ) > #{pickQuantityStart} - - - - and ifnull( - ( - SELECT - sum( c.picking_quantity ) - FROM - picking_material_detail c - LEFT JOIN picking_order d ON c.picking_order_number = d.PICKING_ORDER_NUMBER and c.del_flag = 1 and d.del_flag=1 - left join STOCK_OUT_ORDER e ON d.ORDER_NUMBER = e.OUT_ORDER_NUMBER and e.del_flag = 1 - WHERE - c.del_flag = 1 and d.STATUS = 3 and e.STATUS = 7 - AND d.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID - ), - 0 - ) < #{pickQuantityEnd} - - - - - and - ifnull( - ( - SELECT - SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY - FROM - OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 - LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER - WHERE - d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) - AND d.DEL_FLAG = 1 - AND c.DEL_FLAG = 1 - and e.del_flag = 1 - AND d.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID - ), - 0 - ) > #{checkQuantityBegin} - - - - and - ifnull( - ( - SELECT - SUM(c.CHECK_QUANTITY) AS CHECK_QUANTITY - FROM - OUT_MATERIAL_DETAIL c - LEFT JOIN STOCK_OUT_ORDER d ON c.OUT_ORDER_NUMBER = d.OUT_ORDER_NUMBER and c.del_flag = 1 and d.del_flag = 1 - LEFT JOIN HANDOVER_TASK_ORDER e ON d.OUT_ORDER_NUMBER = e.ORDER_NUMBER - WHERE - d.CHECK_STATUS in (2,3) and e.STATUS = 1 and d.STATUS in (8,12) - AND d.DEL_FLAG = 1 - AND c.DEL_FLAG = 1 - and e.del_flag = 1 - AND d.warehouse_id = a.warehouse_id - AND (a.shipper_id IS NULL OR d.shipper_id = a.shipper_id) - AND c.material_base_info_id = a.material_base_info_id - AND c.MATERIAL_INVENTORY_ID = a.MATERIAL_INVENTORY_ID - ), - 0 - ) < #{checkQuantityEnd} - - - - and a.inventory_quantity = #{inventoryQuantity} - - - - and a.inventory_quantity > #{inventoryQuantityStart} - - - - and a.inventory_quantity < #{inventoryQuantityEnd} - - - - and a.allocation_quantity > #{allocationQuantityStart} - - - - and a.allocation_quantity < #{allocationQuantityEnd} - - - - and a.freeze_quantity > #{freezeQuantityStart} - - - - and a.freeze_quantity < #{freezeQuantityEnd} - + ORDER BY GREATEST( IFNULL(a.update_time, '1970-01-01 00:00:00'), IFNULL(( @@ -1330,6 +1335,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + +