Merge branch 'dev-ty1.2' into dev

This commit is contained in:
rcx
2026-08-05 18:32:42 +08:00
16 changed files with 725 additions and 300 deletions
@@ -1124,4 +1124,51 @@ public class ContractManageApplicationService {
public ContractManagePO getGeneralContract() {
return contractManageDomainService.getGeneralContract();
}
/**
* 合同导出(合同头字段 + 明细拍平成一行一条明细)
*/
public List<ContractManageExportVO> buildExportList(ContractManageDO contractManageDO) {
List<ContractManagePO> contractList = this.queryList(contractManageDO);
List<ContractManageExportVO> exportList = new ArrayList<>();
if (contractList == null || contractList.isEmpty()) {
return exportList;
}
List<Long> contractManageIds = contractList.stream()
.map(ContractManagePO::getContractManageId)
.collect(Collectors.toList());
Map<Long, List<ContractManageDetailPO>> detailMap = contractManageDetailDomainService
.queryListByManageIds(contractManageIds).stream()
.collect(Collectors.groupingBy(ContractManageDetailPO::getContractManageId));
for (ContractManagePO contract : contractList) {
List<ContractManageDetailPO> 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;
}
}
@@ -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<ContractManageDetailPO> queryListByManageIds(Collection<Long> contractManageIds) {
List<ContractManageDetailPO> resultList = new ArrayList<>();
if (contractManageIds == null || contractManageIds.isEmpty()) {
return resultList;
}
LambdaQueryWrapper<ContractManageDetail> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ContractManageDetail::getContractManageId, contractManageIds);
queryWrapper.eq(ContractManageDetail::getDelFlag, 1);
List<ContractManageDetail> 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;
}
}
@@ -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;
}
@@ -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<ContractManageExportVO> 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<ContractManageExportVO> util = new ExcelUtil<>(ContractManageExportVO.class);
util.exportExcel(response, list, "合同导出");
}
}
@@ -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);
@@ -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<ImmediateInventoryPO> 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<Long> materialBaseInfoIdSet = immediateInventoryPOS.stream()
@@ -2222,24 +2222,31 @@ public class StockReceiptOrderApplicationService {
}
/**
* PDA 抄码收货不采集毛重、体积、面积:在装配前将对应请求字段置 0,避免 getInfo 带回的累计展示值被当作本次增量。
* PDA 抄码收货不采集毛重、体积、面积:在装配前将对应请求字段置 null
* 利用 MyBatis-Plus NOT_NULL 策略跳过这些字段,避免覆盖已有累计数据。
* @param lines 收货明细列表
*/
private static void normalizePdaCopyReceiptGrossVolumeAreaToZero(List<ReceiptMaterialDetailDO> 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());
}
}
@@ -71,6 +71,12 @@ public interface IMaterialInventoryService extends IService<MaterialInventory>
*/
public List<ImmediateInventoryPO> queryImmediateInventoryList(ImmediateInventoryDO immediateInventoryDO);
/**
* 查询即时库存合计数量
*/
public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO);
/**
* @description 增加指定库存
* @author ZhouGY
@@ -91,6 +91,12 @@ public interface MaterialInventoryMapper extends BaseMapper<MaterialInventory>
*/
public List<ImmediateInventoryPO> 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);
@@ -464,11 +464,29 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
}
}
/**
* 分页查询即时库存列表
*
* @param immediateInventoryDO 即时库存查询条件含组织权限货主物料仓库数量区间等筛选条件
* @return 即时库存列表
*/
@Override
public List<ImmediateInventoryPO> queryImmediateInventoryList(ImmediateInventoryDO immediateInventoryDO) {
return materialInventoryMapper.queryImmediateInventoryList(immediateInventoryDO);
}
/**
* 查询即时库存合计数量
* <p>与列表查询使用相同筛选条件但不分页统计筛选条件下所有库存数量之和</p>
*
* @param immediateInventoryDO 即时库存查询条件与列表查询保持一致保证合计口径一致
* @return 库存数量合计值无数据时为 0
*/
@Override
public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO) {
return materialInventoryMapper.sumImmediateInventoryQuantity(immediateInventoryDO);
}
/**
* @description 增加指定库存
* @author ZhouGY
@@ -103,6 +103,20 @@ public class MaterialInventoryDomainService {
return materialInventoryService.queryImmediateInventoryList(immediateInventoryDO);
}
/**
* 查询即时库存合计数量
*/
public BigDecimal sumImmediateInventoryQuantity(ImmediateInventoryDO immediateInventoryDO) {
return materialInventoryService.sumImmediateInventoryQuantity(immediateInventoryDO);
}
/**
* 根据查询条件获取物料库存信息
* <p>按货主组织物料仓库库位等条件查询返回汇总后的库存信息含库存数量合计</p>
*
* @param materialInventoryDO 物料库存查询条件含货主顶级组织物料基础信息仓库库位等
* @return 匹配条件的物料库存信息无匹配数据时返回 null
*/
public MaterialInventoryPO selectOneByWhere(MaterialInventoryDO materialInventoryDO) {
return materialInventoryService.selectOneByWhere(materialInventoryDO);
}
@@ -459,6 +459,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
ReceiptMaterialDetail receiptMaterialDetailChild = new ReceiptMaterialDetail();
BeanUtils.copyProperties(receiptMaterialDetailDOChild, receiptMaterialDetailChild);
alignPersistedReceiptQuantityToCumulative(receiptMaterialDetailDOChild, receiptMaterialDetailChild);
normalizeZeroMetricsToNull(receiptMaterialDetailChild);
receiptMaterialDetailChild.setCreateBy(loginUser.getUserid());
receiptMaterialDetailChild.setCreateByName(loginUser.getUsername());
receiptMaterialDetailChild.setCreateTime(new Date());
@@ -474,9 +475,12 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
}
}
ReceiptMaterialDetail receiptMaterialDetail = new ReceiptMaterialDetail();
BeanUtils.copyProperties(receiptMaterialDetailDO, receiptMaterialDetail);
alignPersistedReceiptQuantityToCumulative(receiptMaterialDetailDO, receiptMaterialDetail);
// total* 字段为 0 或空字符串时置为 null避免 MyBatis-Plus NOT_NULL 策略下覆盖已有数据
normalizeZeroMetricsToNull(receiptMaterialDetail);
receiptMaterialDetail.setUpdateBy(loginUser.getUserid());
receiptMaterialDetail.setUpdateByName(loginUser.getUsername());
receiptMaterialDetail.setUpdateTime(new Date());
@@ -488,23 +492,25 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
//保存物料明细信息
saveOrUpdateBatch(receiptMaterialDetailList);
//批量新增/更新物料更多属性保留已有值仅更新有值的属性不再先删后插
mergeMaterialMoreDetail(materialMoreDetailList, stockReceiptOrderDO, receiptMaterialDetailDOList);
//批量新增/更新物料更多属性先删除该收货单下所有明细的旧批次属性再插入新值避免重复插入导致更新失效
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<Long> uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList);
if (!uniqueIds.isEmpty()) {
IMaterialMoreDetailService.remove(new QueryWrapper<MaterialMoreDetail>()
.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<Long> uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList);
// if (!uniqueIds.isEmpty()) {
// IMaterialMoreDetailService.remove(new QueryWrapper<MaterialMoreDetail>()
// .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<ReceiptMaterialDetail
updateInMaterialDetailFromAttributeOption(receiptMaterialDetailDOList);
}
/**
* 批量合并物料更多属性有值则更新无值跳过保留旧值不存在则新增
* 替代原先 DELETE 全部再 INSERT的策略避免未填写字段丢失已有数据
* @param materialMoreDetailList 本次收货提交的批次属性列表
* @param stockReceiptOrderDO 收货单信息用于获取收货单号
* @param receiptMaterialDetailDOList 收货明细列表用于提取 uniqueId 集合
*/
private void mergeMaterialMoreDetail(List<MaterialMoreDetail> materialMoreDetailList,
StockReceiptOrderDO stockReceiptOrderDO,
List<ReceiptMaterialDetailDO> 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<Long> uniqueIds = collectReceiptDetailUniqueIds(receiptMaterialDetailDOList);
if (uniqueIds.isEmpty()) {
IMaterialMoreDetailService.saveBatch(materialMoreDetailList);
return;
}
// 查询已存在的批次属性记录
List<MaterialMoreDetail> existingList = IMaterialMoreDetailService.list(
new QueryWrapper<MaterialMoreDetail>()
.eq("order_number", receiptOrderNumber) // 收货单号
.in("material_detail_unique_id", uniqueIds) // 明细唯一ID
.eq("del_flag", 1)); // 删除标志
// materialDetailUniqueId + batchDetailId 构建索引
Map<String, MaterialMoreDetail> existingMap = new HashMap<>();
for (MaterialMoreDetail existing : existingList) {
String key = buildMaterialMoreDetailKey(existing.getMaterialDetailUniqueId(), existing.getBatchDetailId());
existingMap.put(key, existing);
}
// 分离需要更新的 以及 需要新增的跳过空值保留旧数据
List<MaterialMoreDetail> toUpdate = new ArrayList<>();
List<MaterialMoreDetail> 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<MaterialMoreDetailDO> materialMoreDetailList = receiptMaterialDetailDO.getMaterialMoreDetailList();
if (!CollectionUtils.isEmpty(materialMoreDetailList)) {
@@ -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;
@@ -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;
@@ -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;
@@ -162,7 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and a.material_base_info_id = #{materialBaseInfoId}
</if>
<if test="materialDetailId != null ">
and a.material_detail_id, = #{materialDetailId}
and a.material_detail_id = #{materialDetailId}
</if>
<!-- 容器号或批次号:containerOrBatch 优先;若 batchNumber 与 containerCode 相同则按 OR 查(PDA 单输入框传两个相同值) -->
<choose>
@@ -313,7 +313,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and mi.material_base_info_id = #{materialBaseInfoId}
</if>
<if test="materialDetailId != null ">
and mi.material_detail_id, = #{materialDetailId}
and mi.material_detail_id = #{materialDetailId}
</if>
<choose>
<when test="containerOrBatch != null and containerOrBatch != ''">
@@ -781,12 +781,280 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and container_id = #{containerId}
</update>
<sql id="immediateInventoryQueryWhere">
<if test="organizationId != null ">
and a.organization_id = #{organizationId}
</if>
<if test="topOrganizationId != null ">
and a.top_organization_id = #{topOrganizationId}
</if>
<if test="shipperName != null and shipperName != ''">
and (a.shipper_name = #{shipperName} OR b.shipper_name = #{shipperName})
</if>
<if test="shipperId != null and shipperId != '' ">
and a.shipper_id = #{shipperId}
</if>
<if test="warehouseId != null and warehouseId != '' ">
and a.warehouse_id = #{warehouseId}
</if>
<if test="warehouseCode != null and warehouseCode != '' ">
and a.warehouse_code = #{warehouseCode}
</if>
<if test="warehouseName != null and warehouseName != '' ">
and a.warehouse_name like concat('%', #{warehouseName}, '%')
</if>
<if test="materialName != null and materialName != '' ">
and b.material_name = #{materialName}
</if>
<if test="materialCode != null and materialCode != '' ">
and b.material_code = #{materialCode}
</if>
<if test="barCode != null and barCode != '' ">
and b.bar_code = #{barCode}
</if>
<if test="specificationModel != null and specificationModel != ''">
and b.specification_model = #{specificationModel}
</if>
<if test="batchNumber != null and batchNumber != ''">
and a.batch_number = #{batchNumber}
</if>
<if test="receivedQuantityStart != null ">
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}
</if>
<if test="receivedQuantityEnd != null ">
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
) &lt; #{receivedQuantityEnd}
</if>
<if test="shelvesQuantityStart != null ">
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}
</if>
<if test="shelvesQuantityEnd != null ">
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
) &lt; #{shelvesQuantityEnd}
</if>
<if test="pickQuantityStart != null ">
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}
</if>
<if test="pickQuantityEnd != null ">
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
) &lt; #{pickQuantityEnd}
</if>
<if test="checkQuantityBegin != null ">
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}
</if>
<if test="checkQuantityEnd != null ">
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
) &lt; #{checkQuantityEnd}
</if>
<if test="inventoryQuantity != null ">
and a.inventory_quantity = #{inventoryQuantity}
</if>
<if test="inventoryQuantityStart != null ">
and a.inventory_quantity > #{inventoryQuantityStart}
</if>
<if test="inventoryQuantityEnd != null ">
and a.inventory_quantity &lt; #{inventoryQuantityEnd}
</if>
<if test="allocationQuantityStart != null ">
and a.allocation_quantity > #{allocationQuantityStart}
</if>
<if test="allocationQuantityEnd != null ">
and a.allocation_quantity &lt; #{allocationQuantityEnd}
</if>
<if test="freezeQuantityStart != null ">
and a.freeze_quantity > #{freezeQuantityStart}
</if>
<if test="freezeQuantityEnd != null ">
and a.freeze_quantity &lt; #{freezeQuantityEnd}
</if>
</sql>
<resultMap type="com.mhd.wms.domain.statementStatistics.po.ImmediateInventoryPO" id="queryImmediateInventoryListResult">
<result property="shipperName" column="shipper_name" />
<result property="materialCode" column="material_code" />
<result property="materialName" column="material_name" />
<result property="barCode" column="bar_code" />
<result property="specificationModel" column="specification_model" />
<result property="totalInventoryQuantity" column="total_inventory_quantity" />
<result property="warehouseName" column="warehouse_name" />
<result property="inventoryQuantity" column="inventory_quantity" />
<result property="allocationQuantity" column="allocation_quantity" />
@@ -826,6 +1094,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
b.material_name,
b.material_code,
b.bar_code,
b.specification_model,
<!-- sum(a.inventory_quantity) inventory_quantity,
sum(a.allocation_quantity) allocation_quantity,
sum(a.freeze_quantity) freeze_quantity,-->
@@ -995,271 +1264,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
WHERE
a.del_flag = 1
<if test="organizationId != null ">
and a.organization_id = #{organizationId}
</if>
<if test="topOrganizationId != null ">
and a.top_organization_id = #{topOrganizationId}
</if>
<if test="shipperName != null and shipperName != ''">
and (a.shipper_name = #{shipperName} OR b.shipper_name = #{shipperName})
</if>
<if test="shipperId != null and shipperId != '' ">
and a.shipper_id = #{shipperId}
</if>
<if test="warehouseId != null and warehouseId != '' ">
and a.warehouse_id = #{warehouseId}
</if>
<if test="warehouseCode != null and warehouseCode != '' ">
and a.warehouse_code = #{warehouseCode}
</if>
<if test="warehouseName != null and warehouseName != '' ">
and a.warehouse_name like concat('%', #{warehouseName}, '%')
</if>
<if test="materialName != null and materialName != '' ">
and b.material_name = #{materialName}
</if>
<if test="materialCode != null and materialCode != '' ">
and b.material_code = #{materialCode}
</if>
<if test="barCode != null and barCode != '' ">
and b.bar_code = #{barCode}
</if>
<if test="batchNumber != null and batchNumber != ''">
and a.batch_number = #{batchNumber}
</if>
<if test="receivedQuantityStart != null ">
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}
</if>
<if test="receivedQuantityEnd != null ">
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
) &lt; #{receivedQuantityEnd}
</if>
<if test="shelvesQuantityStart != null ">
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}
</if>
<if test="shelvesQuantityEnd != null ">
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
) &lt; #{shelvesQuantityEnd}
</if>
<if test="pickQuantityStart != null ">
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}
</if>
<if test="pickQuantityEnd != null ">
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
) &lt; #{pickQuantityEnd}
</if>
<!--
GROUP BY
a.warehouse_id,
a.material_base_info_id,
a.shipper_id
HAVING 1=1-->
<if test="checkQuantityBegin != null ">
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}
</if>
<if test="checkQuantityEnd != null ">
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
) &lt; #{checkQuantityEnd}
</if>
<if test="inventoryQuantity != null ">
and a.inventory_quantity = #{inventoryQuantity}
</if>
<if test="inventoryQuantityStart != null ">
and a.inventory_quantity > #{inventoryQuantityStart}
</if>
<if test="inventoryQuantityEnd != null ">
and a.inventory_quantity &lt; #{inventoryQuantityEnd}
</if>
<if test="allocationQuantityStart != null ">
and a.allocation_quantity > #{allocationQuantityStart}
</if>
<if test="allocationQuantityEnd != null ">
and a.allocation_quantity &lt; #{allocationQuantityEnd}
</if>
<if test="freezeQuantityStart != null ">
and a.freeze_quantity > #{freezeQuantityStart}
</if>
<if test="freezeQuantityEnd != null ">
and a.freeze_quantity &lt; #{freezeQuantityEnd}
</if>
<include refid="immediateInventoryQueryWhere"/>
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"
</select>
<select id="sumImmediateInventoryQuantity" parameterType="com.mhd.wms.domain.statementStatistics.todo.ImmediateInventoryDO"
resultType="java.math.BigDecimal">
SELECT IFNULL(SUM(a.inventory_quantity), 0)
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
<include refid="immediateInventoryQueryWhere"/>
</select>
<select id="selectListByWhere" parameterType="com.mhd.wms.domain.materialInventory.entity.MaterialInventory"
resultMap="MaterialInventoryResult">