复核页面调整修改

This commit is contained in:
秦鸿展
2026-04-07 10:53:26 +08:00
parent 7f32271adc
commit 65ae591f86
15 changed files with 1138 additions and 0 deletions
@@ -0,0 +1,66 @@
package com.mhd.wms.application.service.reviewOrder;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
import com.mhd.wms.interfaces.dto.reviewOrder.ReviewOrderDetailDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 复核单应用服务:列表、详情
*/
@Service
public class ReviewOrderApplicationService {
@Autowired
private ReviewOrderMapper reviewOrderMapper;
public List<ReviewOrderPO> queryList(ReviewOrderDO query) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1L) {
query.setTopOrganizationId(topOrganizationId);
}
}
return reviewOrderMapper.queryList(query);
}
public ReviewOrderDetailDTO getDetailByReviewOrderId(Long reviewOrderId) {
if (reviewOrderId == null) {
throw new ServiceException("复核单ID不能为空");
}
ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderId(reviewOrderId);
if (header == null) {
throw new ServiceException("复核单不存在或已删除");
}
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderId);
ReviewOrderDetailDTO result = new ReviewOrderDetailDTO();
result.setHeader(header);
result.setDetails(details);
return result;
}
public ReviewOrderDetailDTO getDetailByReviewOrderNumber(String reviewOrderNumber) {
if (StringUtils.isEmpty(reviewOrderNumber)) {
throw new ServiceException("复核单号不能为空");
}
ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderNumber(reviewOrderNumber);
if (header == null) {
throw new ServiceException("复核单不存在或已删除");
}
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderNumber(reviewOrderNumber);
ReviewOrderDetailDTO result = new ReviewOrderDetailDTO();
result.setHeader(header);
result.setDetails(details);
return result;
}
}
@@ -43,6 +43,7 @@ import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService;
import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO;
import com.mhd.wms.domain.pickingOrder.repository.todo.PickingOrderDO;
import com.mhd.wms.domain.pushSyncBms.PushSyncBmsDomainService;
import com.mhd.wms.domain.reviewOrder.service.ReviewOrderDomainService;
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockInOrder.service.StockInOrderDomainService;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
@@ -91,6 +92,9 @@ public class PickingOrderDomainService {
private IWaveOrderService waveOrderService;
@Autowired
private IWaveOutOrderService waveOutOrderService;
@Autowired
private ReviewOrderDomainService reviewOrderDomainService;
@Autowired
private IHandoverTaskOrderService handoverTaskOrderService;
@Autowired
@@ -661,6 +665,8 @@ public class PickingOrderDomainService {
if (pickingOrderPO.getReview() != null && pickingOrderPO.getReview() == 2) {
genHandoverTaskOrder(pickingOrderPO);
}
// 需要复核且本出库下拣货全部完成时生成复核单,并将出库单置为复核中(8)
reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPO, stockOutOrder);
}
//同步BMS结算系统,生成业务单据
//这里只有不需要复核的时候才推送,需要复核的在复核流程推送
@@ -0,0 +1,87 @@
package com.mhd.wms.domain.reviewOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.web.domain.BaseVOEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 复核单明细 review_material_detail
*/
@Data
@TableName("review_material_detail")
public class ReviewMaterialDetail extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long reviewMaterialDetailId;
private Long reviewOrderId;
private String reviewOrderNumber;
private String outOrderNumber;
private Long outUniqueId;
private Long materialDetailId;
private Long materialBaseInfoId;
private String materialCode;
private String materialName;
private String barCode;
private String unitCode;
private String unitName;
private BigDecimal pendingReviewQty;
private BigDecimal reviewedQty;
private BigDecimal cancelQty;
private String receiptOrderNumber;
private String lotNo;
private String batchNumber;
private Date productionDate;
private Date expiryDate;
private Date inventoryDate;
private String batchRefNo;
private String sheetRefNo;
private String boxPalletNo;
private String extAttr1;
private String extAttr2;
private Date extAttr3;
private Date extAttr4;
private BigDecimal reviewQtyEa;
private BigDecimal netWeightKg;
private BigDecimal grossWeightKg;
private BigDecimal volumeCbm;
private BigDecimal areaSqm;
private String remark;
}
@@ -0,0 +1,56 @@
package com.mhd.wms.domain.reviewOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.web.domain.BaseVOEntity;
import lombok.Data;
import java.util.Date;
/**
* 复核单主表 review_order
*/
@Data
@TableName("review_order")
public class ReviewOrder extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long reviewOrderId;
private String reviewOrderNumber;
private Long outOrderId;
private String outOrderNumber;
private Long organizationId;
private String organizationName;
private Long topOrganizationId;
/** 复核状态:1-待复核 2-复核中 3-已复核 */
private Integer reviewStatus;
/** 复核下发:0-否 1-是 */
private String issuedFlag;
private Date issuedTime;
private Long warehouseId;
private String warehouseCode;
private String warehouseName;
private Long customerId;
private String customerCode;
private String customerName;
private Date receiveTime;
private String remark;
}
@@ -0,0 +1,10 @@
package com.mhd.wms.domain.reviewOrder.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.reviewOrder.entity.ReviewMaterialDetail;
/**
* 复核单明细持久化
*/
public interface ReviewMaterialDetailMapper extends BaseMapper<ReviewMaterialDetail> {
}
@@ -0,0 +1,41 @@
package com.mhd.wms.domain.reviewOrder.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.reviewOrder.entity.ReviewOrder;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 复核单:列表、详情头、明细 + MyBatis-Plus 基础 CRUD
*/
public interface ReviewOrderMapper extends BaseMapper<ReviewOrder> {
/**
* 复核单列表(PC 列表页)
*/
List<ReviewOrderPO> queryList(ReviewOrderDO query);
/**
* 详情-主表(按主键)
*/
ReviewOrderPO selectHeaderByReviewOrderId(@Param("reviewOrderId") Long reviewOrderId);
/**
* 详情-主表(按复核单号)
*/
ReviewOrderPO selectHeaderByReviewOrderNumber(@Param("reviewOrderNumber") String reviewOrderNumber);
/**
* 详情-明细行(按复核单主键)
*/
List<ReviewMaterialDetailPO> queryDetailByReviewOrderId(@Param("reviewOrderId") Long reviewOrderId);
/**
* 详情-明细行(按复核单号,明细表冗余字段,可不关联主表)
*/
List<ReviewMaterialDetailPO> queryDetailByReviewOrderNumber(@Param("reviewOrderNumber") String reviewOrderNumber);
}
@@ -0,0 +1,131 @@
package com.mhd.wms.domain.reviewOrder.repository.po;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 复核单明细(review_material_detail
*/
@Data
@ApiModel(value = "复核单明细", description = "复核/取消复核明细行")
public class ReviewMaterialDetailPO extends BaseVOEntity {
@ApiModelProperty("明细主键")
private Long reviewMaterialDetailId;
@ApiModelProperty("复核单ID")
private Long reviewOrderId;
@ApiModelProperty("复核单号")
private String reviewOrderNumber;
@ApiModelProperty("出库单号")
private String outOrderNumber;
@ApiModelProperty("出库明细 unique_id")
private Long outUniqueId;
@ApiModelProperty("出库物料明细表主键")
private Long materialDetailId;
@ApiModelProperty("物料基础信息ID")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
private String materialName;
@ApiModelProperty("物料条码")
private String barCode;
@ApiModelProperty("单位代码")
private String unitCode;
@ApiModelProperty("单位名称")
private String unitName;
@ApiModelProperty("待复核数量")
private BigDecimal pendingReviewQty;
@ApiModelProperty("已复核数量")
private BigDecimal reviewedQty;
@ApiModelProperty("取消复核数量")
private BigDecimal cancelQty;
@ApiModelProperty("入库单号")
private String receiptOrderNumber;
@ApiModelProperty("LOT编号")
private String lotNo;
@ApiModelProperty("批次号")
private String batchNumber;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("生产日期")
private Date productionDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("过期日期")
private Date expiryDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("存货日期")
private Date inventoryDate;
@ApiModelProperty("Batch Ref NO's")
private String batchRefNo;
@ApiModelProperty("Sheet Ref NO's")
private String sheetRefNo;
@ApiModelProperty("箱号/卡板号")
private String boxPalletNo;
@ApiModelProperty("扩展属性1")
private String extAttr1;
@ApiModelProperty("扩展属性2")
private String extAttr2;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("扩展属性3")
private Date extAttr3;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("扩展属性4")
private Date extAttr4;
@ApiModelProperty("复核数量EA")
private BigDecimal reviewQtyEa;
@ApiModelProperty("净重KG")
private BigDecimal netWeightKg;
@ApiModelProperty("毛重KG")
private BigDecimal grossWeightKg;
@ApiModelProperty("体积CBM")
private BigDecimal volumeCbm;
@ApiModelProperty("面积SQM")
private BigDecimal areaSqm;
@ApiModelProperty("备注")
private String remark;
}
@@ -0,0 +1,76 @@
package com.mhd.wms.domain.reviewOrder.repository.po;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 复核单主表列表/详情头(review_order
*/
@Data
@ApiModel(value = "复核单主表", description = "复核单主表展示")
public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("复核单主键")
private Long reviewOrderId;
@ApiModelProperty("复核单号")
private String reviewOrderNumber;
@ApiModelProperty("出库单ID")
private Long outOrderId;
@ApiModelProperty("出库单号")
private String outOrderNumber;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("复核状态:1-待复核 2-复核中 3-已复核")
private Integer reviewStatus;
@ApiModelProperty("复核下发 0否 1是")
private String issuedFlag;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("复核下发时间")
private Date issuedTime;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
private String warehouseName;
@ApiModelProperty("客户ID")
private Long customerId;
@ApiModelProperty("客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
private String customerName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("任务接收时间")
private Date receiveTime;
@ApiModelProperty("备注")
private String remark;
}
@@ -0,0 +1,51 @@
package com.mhd.wms.domain.reviewOrder.repository.todo;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 复核单列表查询条件(对应表 review_order
*/
@Data
public class ReviewOrderDO extends BaseVOEntity {
@ApiModelProperty("复核单主键")
private Long reviewOrderId;
@ApiModelProperty("复核单号(模糊)")
private String reviewOrderNumber;
@ApiModelProperty("出库单号(模糊)")
private String outOrderNumber;
@ApiModelProperty("复核状态:1-待复核 2-复核中 3-已复核")
private Integer reviewStatus;
@ApiModelProperty("复核下发:0-否 1-是")
private String issuedFlag;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("客户名称(模糊)")
private String customerName;
@ApiModelProperty("创建时间起(字符串,格式与库一致即可,如 yyyy-MM-dd)")
private String createTimeStart;
@ApiModelProperty("创建时间止")
private String createTimeEnd;
@ApiModelProperty("接收时间起")
private String receiveTimeStart;
@ApiModelProperty("接收时间止")
private String receiveTimeEnd;
}
@@ -0,0 +1,214 @@
package com.mhd.wms.domain.reviewOrder.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.OrderSequence;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
import com.mhd.wms.domain.pickingOrder.entity.PickingOrder;
import com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO;
import com.mhd.wms.domain.pickingOrder.repository.facade.IPickingOrderService;
import com.mhd.wms.domain.reviewOrder.entity.ReviewMaterialDetail;
import com.mhd.wms.domain.reviewOrder.entity.ReviewOrder;
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewMaterialDetailMapper;
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 复核单领域:拣货完成后生成复核单等
*/
@Service
@Slf4j
public class ReviewOrderDomainService {
@Autowired
private ReviewOrderMapper reviewOrderMapper;
@Autowired
private ReviewMaterialDetailMapper reviewMaterialDetailMapper;
@Autowired
private IPickingOrderService pickingOrderService;
@Autowired
private IPickingMaterialDetailService pickingMaterialDetailService;
@Autowired
private OutMaterialDetailMapper outMaterialDetailMapper;
@Autowired
private IStockOutOrderService stockOutOrderService;
/**
* 拣货全部完成后,若出库单需要复核,则生成复核单头+明细,并将出库单状态置为「复核中」(8)。
* 仅处理普通拣货单(type=1);波次拣货(type=2)暂不生成,避免一单多出库口径不一致。
*/
@Transactional(rollbackFor = Exception.class)
public void tryGenerateReviewOrderAfterPickingComplete(PickingOrderPO pickingOrderPO, StockOutOrder stockOutOrder) {
if (pickingOrderPO == null || stockOutOrder == null) {
return;
}
if (!Integer.valueOf(1).equals(pickingOrderPO.getReview())) {
return;
}
if (!Integer.valueOf(1).equals(pickingOrderPO.getType())) {
return;
}
String outOrderNumber = pickingOrderPO.getOrderNumber();
if (outOrderNumber == null) {
return;
}
List<PickingOrder> pickingOrders = pickingOrderService.list(new LambdaQueryWrapper<PickingOrder>()
.eq(PickingOrder::getOrderNumber, outOrderNumber)
.eq(PickingOrder::getType, 1)
.eq(PickingOrder::getDelFlag, 1));
if (pickingOrders.isEmpty()) {
return;
}
boolean allPickingFinished = pickingOrders.stream()
.allMatch(p -> p.getStatus() != null && p.getStatus() == 3);
if (!allPickingFinished) {
return;
}
long exists = reviewOrderMapper.selectCount(new LambdaQueryWrapper<ReviewOrder>()
.eq(ReviewOrder::getOutOrderNumber, outOrderNumber)
.eq(ReviewOrder::getDelFlag, 1));
if (exists > 0) {
log.debug("复核单已存在,跳过生成 outOrderNumber={}", outOrderNumber);
return;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null) {
throw new ServiceException("登录信息失效,无法生成复核单");
}
String reviewOrderNumber = OrderSequence.getOrderCode("FH");
Date now = new Date();
ReviewOrder header = new ReviewOrder();
header.setReviewOrderNumber(reviewOrderNumber);
header.setOutOrderId(stockOutOrder.getOutOrderId());
header.setOutOrderNumber(stockOutOrder.getOutOrderNumber());
header.setOrganizationId(stockOutOrder.getOrganizationId());
header.setOrganizationName(stockOutOrder.getOrganizationName());
header.setTopOrganizationId(stockOutOrder.getTopOrganizationId());
header.setReviewStatus(1);
header.setIssuedFlag("0");
header.setWarehouseId(stockOutOrder.getWarehouseId());
header.setWarehouseCode(stockOutOrder.getWarehouseCode());
header.setWarehouseName(stockOutOrder.getWarehouseName());
header.setCustomerId(stockOutOrder.getCustomerId());
header.setCustomerCode(stockOutOrder.getCustomerCode());
header.setCustomerName(stockOutOrder.getCustomerName());
header.setDelFlag(1);
header.setCreateBy(loginUser.getUserid());
header.setCreateByName(loginUser.getUsername());
header.setCreateTime(now);
header.setUpdateBy(loginUser.getUserid());
header.setUpdateByName(loginUser.getUsername());
header.setUpdateTime(now);
reviewOrderMapper.insert(header);
Long reviewOrderId = header.getReviewOrderId();
if (reviewOrderId == null) {
throw new ServiceException("复核单主表保存失败");
}
for (PickingOrder po : pickingOrders) {
List<PickingMaterialDetail> lines = pickingMaterialDetailService.list(new LambdaQueryWrapper<PickingMaterialDetail>()
.eq(PickingMaterialDetail::getPickingOrderNumber, po.getPickingOrderNumber())
.eq(PickingMaterialDetail::getDelFlag, 1));
for (PickingMaterialDetail line : lines) {
ReviewMaterialDetail row = buildDetailFromPicking(line, reviewOrderId, reviewOrderNumber, outOrderNumber, loginUser, now);
reviewMaterialDetailMapper.insert(row);
}
}
StockOutOrder statusUpdate = new StockOutOrder();
statusUpdate.setStatus(8);
statusUpdate.setUpdateBy(loginUser.getUserid());
statusUpdate.setUpdateByName(loginUser.getUsername());
statusUpdate.setUpdateTime(now);
stockOutOrderService.update(statusUpdate, new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber));
log.info("拣货完成已生成复核单 reviewOrderNumber={} outOrderNumber={}", reviewOrderNumber, outOrderNumber);
}
private ReviewMaterialDetail buildDetailFromPicking(PickingMaterialDetail line, Long reviewOrderId, String reviewOrderNumber,
String outOrderNumber, LoginUser loginUser, Date now) {
ReviewMaterialDetail d = new ReviewMaterialDetail();
d.setReviewOrderId(reviewOrderId);
d.setReviewOrderNumber(reviewOrderNumber);
d.setOutOrderNumber(outOrderNumber);
d.setOutUniqueId(line.getOutUniqueId());
d.setMaterialBaseInfoId(line.getMaterialBaseInfoId());
d.setMaterialCode(line.getMaterialCode());
d.setMaterialName(line.getMaterialName());
d.setBarCode(line.getBarCode());
d.setUnitCode(line.getUnitCode());
d.setUnitName(line.getUnitName());
BigDecimal pending = line.getPickingQuantity() != null ? line.getPickingQuantity() : line.getQuantity();
if (pending == null) {
pending = BigDecimal.ZERO;
}
d.setPendingReviewQty(pending);
d.setReviewedQty(BigDecimal.ZERO);
d.setCancelQty(BigDecimal.ZERO);
d.setBatchNumber(line.getBatchNumber());
d.setProductionDate(line.getProductionDate());
d.setExpiryDate(line.getExpiryDate());
d.setInventoryDate(line.getInventoryDate());
d.setBatchRefNo(line.getBatchRefNo());
d.setSheetRefNo(line.getSheetRefNo());
d.setBoxPalletNo(line.getBoxPalletNo());
d.setExtAttr1(line.getExtAttr1());
d.setExtAttr2(line.getExtAttr2());
d.setExtAttr3(line.getExtAttr3());
d.setExtAttr4(line.getExtAttr4());
d.setReviewQtyEa(pending);
d.setNetWeightKg(line.getTotalNetWeight());
d.setGrossWeightKg(line.getTotalGrossWeight());
d.setVolumeCbm(line.getTotalVolume());
d.setAreaSqm(line.getTotalArea());
d.setRemark(line.getRemark());
d.setDelFlag(1);
d.setCreateBy(loginUser.getUserid());
d.setCreateByName(loginUser.getUsername());
d.setCreateTime(now);
d.setUpdateBy(loginUser.getUserid());
d.setUpdateByName(loginUser.getUsername());
d.setUpdateTime(now);
if (line.getOutUniqueId() != null) {
OutMaterialDetail outMd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId())
.eq(OutMaterialDetail::getDelFlag, 1));
if (outMd == null) {
outMd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId()));
}
if (outMd != null) {
d.setMaterialDetailId(outMd.getMaterialDetailId());
}
}
return d;
}
}
@@ -0,0 +1,20 @@
package com.mhd.wms.interfaces.assember.reviewOrder;
import com.mhd.common.core.utils.IgnoreNullUtil;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
import com.mhd.wms.interfaces.dto.reviewOrder.ReviewOrderDTO;
import org.springframework.stereotype.Component;
/**
* 复核单 DTO ↔ DO
*/
@Component
public class ReviewOrderAssembler {
public ReviewOrderDO toDO(ReviewOrderDTO dto) {
ReviewOrderDO reviewOrderDO = new ReviewOrderDO();
BeanUtils.copyProperties(dto, reviewOrderDO, IgnoreNullUtil.getNullPropertyNames(dto));
return reviewOrderDO;
}
}
@@ -0,0 +1,51 @@
package com.mhd.wms.interfaces.dto.reviewOrder;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 复核单查询/入参 DTO(列表条件与主键)
*/
@Data
public class ReviewOrderDTO extends BaseVOEntity {
@ApiModelProperty("复核单主键")
private Long reviewOrderId;
@ApiModelProperty("复核单号(模糊)")
private String reviewOrderNumber;
@ApiModelProperty("出库单号(模糊)")
private String outOrderNumber;
@ApiModelProperty("复核状态:1-待复核 2-复核中 3-已复核")
private Integer reviewStatus;
@ApiModelProperty("复核下发:0-否 1-是")
private String issuedFlag;
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("客户名称(模糊)")
private String customerName;
@ApiModelProperty("创建时间起 yyyy-MM-dd")
private String createTimeStart;
@ApiModelProperty("创建时间止 yyyy-MM-dd")
private String createTimeEnd;
@ApiModelProperty("接收时间起 yyyy-MM-dd")
private String receiveTimeStart;
@ApiModelProperty("接收时间止 yyyy-MM-dd")
private String receiveTimeEnd;
}
@@ -0,0 +1,26 @@
package com.mhd.wms.interfaces.dto.reviewOrder;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 复核单详情:主表 + 明细行
*/
@Data
@ApiModel("复核单详情")
public class ReviewOrderDetailDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("复核单头")
private ReviewOrderPO header;
@ApiModelProperty("复核明细列表")
private List<ReviewMaterialDetailPO> details;
}
@@ -0,0 +1,54 @@
package com.mhd.wms.interfaces.facadeApi.reviewOrder;
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.wms.application.service.reviewOrder.ReviewOrderApplicationService;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
import com.mhd.wms.interfaces.assember.reviewOrder.ReviewOrderAssembler;
import com.mhd.wms.interfaces.dto.reviewOrder.ReviewOrderDTO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* PC 复核单接口:列表、详情(头+明细)
*/
@RestController
@RequestMapping("/reviewOrderApi")
public class ReviewOrderApi extends BaseController {
@Autowired
private ReviewOrderApplicationService reviewOrderApplicationService;
@Resource
private ReviewOrderAssembler reviewOrderAssembler;
@ApiOperation("复核单分页列表")
@GetMapping("/list")
public TableDataInfo list(ReviewOrderDTO reviewOrderDTO) {
ReviewOrderDO query = reviewOrderAssembler.toDO(reviewOrderDTO);
startPage();
List<ReviewOrderPO> list = reviewOrderApplicationService.queryList(query);
return getDataTable(list);
}
@ApiOperation("复核单详情(按主键,含明细)")
@GetMapping("/detail/{reviewOrderId}")
public AjaxResult detail(@PathVariable("reviewOrderId") Long reviewOrderId) {
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId));
}
@ApiOperation("复核单详情(按复核单号,含明细)")
@GetMapping("/detailByNumber/{reviewOrderNumber}")
public AjaxResult detailByNumber(@PathVariable("reviewOrderNumber") String reviewOrderNumber) {
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderNumber(reviewOrderNumber));
}
}
@@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper">
<resultMap type="com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO" id="ReviewOrderResult">
<result property="reviewOrderId" column="review_order_id"/>
<result property="reviewOrderNumber" column="review_order_number"/>
<result property="outOrderId" column="out_order_id"/>
<result property="outOrderNumber" column="out_order_number"/>
<result property="organizationId" column="organization_id"/>
<result property="organizationName" column="organization_name"/>
<result property="topOrganizationId" column="top_organization_id"/>
<result property="reviewStatus" column="review_status"/>
<result property="issuedFlag" column="issued_flag"/>
<result property="issuedTime" column="issued_time"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="warehouseCode" column="warehouse_code"/>
<result property="warehouseName" column="warehouse_name"/>
<result property="customerId" column="customer_id"/>
<result property="customerCode" column="customer_code"/>
<result property="customerName" column="customer_name"/>
<result property="receiveTime" column="receive_time"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createByName" column="create_by_name"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateByName" column="update_by_name"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
<resultMap type="com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO" id="ReviewMaterialDetailResult">
<result property="reviewMaterialDetailId" column="review_material_detail_id"/>
<result property="reviewOrderId" column="review_order_id"/>
<result property="reviewOrderNumber" column="review_order_number"/>
<result property="outOrderNumber" column="out_order_number"/>
<result property="outUniqueId" column="out_unique_id"/>
<result property="materialDetailId" column="material_detail_id"/>
<result property="materialBaseInfoId" column="material_base_info_id"/>
<result property="materialCode" column="material_code"/>
<result property="materialName" column="material_name"/>
<result property="barCode" column="bar_code"/>
<result property="unitCode" column="unit_code"/>
<result property="unitName" column="unit_name"/>
<result property="pendingReviewQty" column="pending_review_qty"/>
<result property="reviewedQty" column="reviewed_qty"/>
<result property="cancelQty" column="cancel_qty"/>
<result property="receiptOrderNumber" column="receipt_order_number"/>
<result property="lotNo" column="lot_no"/>
<result property="batchNumber" column="batch_number"/>
<result property="productionDate" column="production_date"/>
<result property="expiryDate" column="expiry_date"/>
<result property="inventoryDate" column="inventory_date"/>
<result property="batchRefNo" column="batch_ref_no"/>
<result property="sheetRefNo" column="sheet_ref_no"/>
<result property="boxPalletNo" column="box_pallet_no"/>
<result property="extAttr1" column="ext_attr_1"/>
<result property="extAttr2" column="ext_attr_2"/>
<result property="extAttr3" column="ext_attr_3"/>
<result property="extAttr4" column="ext_attr_4"/>
<result property="reviewQtyEa" column="review_qty_ea"/>
<result property="netWeightKg" column="net_weight_kg"/>
<result property="grossWeightKg" column="gross_weight_kg"/>
<result property="volumeCbm" column="volume_cbm"/>
<result property="areaSqm" column="area_sqm"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createByName" column="create_by_name"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateByName" column="update_by_name"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
<sql id="reviewOrderSelectColumns">
a.review_order_id,
a.review_order_number,
a.out_order_id,
a.out_order_number,
a.organization_id,
a.organization_name,
a.top_organization_id,
a.review_status,
a.issued_flag,
a.issued_time,
a.warehouse_id,
a.warehouse_code,
a.warehouse_name,
a.customer_id,
a.customer_code,
a.customer_name,
a.receive_time,
a.remark,
a.create_by,
a.create_by_name,
a.create_time,
a.update_by,
a.update_by_name,
a.update_time,
a.del_flag
</sql>
<sql id="reviewOrderWhere">
<if test="reviewOrderId != null">
and a.review_order_id = #{reviewOrderId}
</if>
<if test="reviewOrderNumber != null and reviewOrderNumber != ''">
and a.review_order_number like concat('%', #{reviewOrderNumber}, '%')
</if>
<if test="outOrderNumber != null and outOrderNumber != ''">
and a.out_order_number like concat('%', #{outOrderNumber}, '%')
</if>
<if test="reviewStatus != null">
and a.review_status = #{reviewStatus}
</if>
<if test="issuedFlag != null and issuedFlag != ''">
and a.issued_flag = #{issuedFlag}
</if>
<if test="organizationId != null">
and a.organization_id = #{organizationId}
</if>
<if test="topOrganizationId != null">
and a.top_organization_id = #{topOrganizationId}
</if>
<if test="warehouseId != null">
and a.warehouse_id = #{warehouseId}
</if>
<if test="customerName != null and customerName != ''">
and a.customer_name like concat('%', #{customerName}, '%')
</if>
<if test="createTimeStart != null and createTimeStart != ''">
and date_format(a.create_time, '%Y-%m-%d') &gt;= #{createTimeStart}
</if>
<if test="createTimeEnd != null and createTimeEnd != ''">
and date_format(a.create_time, '%Y-%m-%d') &lt;= #{createTimeEnd}
</if>
<if test="receiveTimeStart != null and receiveTimeStart != ''">
and date_format(a.receive_time, '%Y-%m-%d') &gt;= #{receiveTimeStart}
</if>
<if test="receiveTimeEnd != null and receiveTimeEnd != ''">
and date_format(a.receive_time, '%Y-%m-%d') &lt;= #{receiveTimeEnd}
</if>
<choose>
<when test="delFlag != null">
and a.del_flag = #{delFlag}
</when>
<otherwise>
and a.del_flag = 1
</otherwise>
</choose>
</sql>
<!-- 复核单列表查询 -->
<select id="queryList" parameterType="com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO"
resultMap="ReviewOrderResult">
select
<include refid="reviewOrderSelectColumns"/>
from review_order a
<where>
<include refid="reviewOrderWhere"/>
</where>
order by a.create_time desc
</select>
<!-- 详情:主表 by id -->
<select id="selectHeaderByReviewOrderId" resultMap="ReviewOrderResult">
select
<include refid="reviewOrderSelectColumns"/>
from review_order a
where a.review_order_id = #{reviewOrderId}
and a.del_flag = 1
</select>
<!-- 详情:主表 by 复核单号 -->
<select id="selectHeaderByReviewOrderNumber" resultMap="ReviewOrderResult">
select
<include refid="reviewOrderSelectColumns"/>
from review_order a
where a.review_order_number = #{reviewOrderNumber}
and a.del_flag = 1
</select>
<sql id="reviewMaterialDetailColumns">
d.review_material_detail_id,
d.review_order_id,
d.review_order_number,
d.out_order_number,
d.out_unique_id,
d.material_detail_id,
d.material_base_info_id,
d.material_code,
d.material_name,
d.bar_code,
d.unit_code,
d.unit_name,
d.pending_review_qty,
d.reviewed_qty,
d.cancel_qty,
d.receipt_order_number,
d.lot_no,
d.batch_number,
d.production_date,
d.expiry_date,
d.inventory_date,
d.batch_ref_no,
d.sheet_ref_no,
d.box_pallet_no,
d.ext_attr_1,
d.ext_attr_2,
d.ext_attr_3,
d.ext_attr_4,
d.review_qty_ea,
d.net_weight_kg,
d.gross_weight_kg,
d.volume_cbm,
d.area_sqm,
d.remark,
d.create_by,
d.create_by_name,
d.create_time,
d.update_by,
d.update_by_name,
d.update_time,
d.del_flag
</sql>
<!-- 详情:明细 by 复核单主键 -->
<select id="queryDetailByReviewOrderId" resultMap="ReviewMaterialDetailResult">
select
<include refid="reviewMaterialDetailColumns"/>
from review_material_detail d
where d.review_order_id = #{reviewOrderId}
and d.del_flag = 1
order by d.review_material_detail_id asc
</select>
<!-- 详情:明细 by 复核单号 -->
<select id="queryDetailByReviewOrderNumber" resultMap="ReviewMaterialDetailResult">
select
<include refid="reviewMaterialDetailColumns"/>
from review_material_detail d
where d.review_order_number = #{reviewOrderNumber}
and d.del_flag = 1
order by d.review_material_detail_id asc
</select>
</mapper>