出入库单oms;

This commit is contained in:
王奎兴
2026-04-14 19:03:01 +08:00
parent 1fa6d88545
commit 281bf9b965
58 changed files with 10194 additions and 29 deletions
@@ -0,0 +1,496 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 物料明细对象 material_detail
*
* @author gen
* @date 2024-05-21
*/
@Data
public class ReservationOutMaterialDetail extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("订单物料明细id")
@TableId(type = IdType.AUTO)
private Long materialDetailId;
@ApiModelProperty("业务唯一id")
@JsonSerialize(using = ToStringSerializer.class)
private Long uniqueId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("物料基础信息id")
@Excel(name = "物料基础信息id")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
@Excel(name = "物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
@Excel(name = "物料名称")
private String materialName;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("已分配数量")
@Excel(name = "已分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("本次分配数量")
@Excel(name = "本次分配数量")
@TableField(exist = false)
private BigDecimal nowAllocationQuantity;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("包装规格id")
@Excel(name = "包装规格id")
private Long packId;
@ApiModelProperty("包装规格编码")
@Excel(name = "包装规格编码")
private String packCode;
@ApiModelProperty("包装规格名称")
@Excel(name = "包装规格名称")
private String packName;
@ApiModelProperty("包装详情id")
@Excel(name = "包装详情id")
private Long packDetailId;
@ApiModelProperty("单位代码:EA IP CS PL OT")
@Excel(name = "单位代码:EA IP CS PL OT")
private String unitCode;
@ApiModelProperty("单位名称")
@Excel(name = "单位名称")
private String unitName;
@ApiModelProperty("单位数量")
@Excel(name = "单位数量")
private BigDecimal unitNumber;
@ApiModelProperty("物料仓库控制信息id")
@Excel(name = "物料仓库控制信息id")
private Long materialWarehouseControlId;
@ApiModelProperty("是否序列号管理: 1-是 2-否")
@Excel(name = "是否序列号管理: 1-是 2-否")
private Integer serialNumberManage;
@ApiModelProperty("物料库存id")
@Excel(name = "物料库存id")
private Long materialInventoryId;
@ApiModelProperty("批次号")
@Excel(name = "批次号")
private String batchNumber;
@ApiModelProperty("物料状态编码")
@Excel(name = "物料状态编码")
private String materialStatusCode;
@ApiModelProperty("物料状态名称")
@Excel(name = "物料状态名称")
private String materialStatusName;
@ApiModelProperty("容器id")
@Excel(name = "容器id")
private Long containerId;
@ApiModelProperty("容器编码")
@Excel(name = "容器编码")
private String containerCode;
@ApiModelProperty("容器类型 数据字典")
@Excel(name = "容器类型 数据字典")
private String containerType;
@ApiModelProperty("容器类型名称 数据字典")
@Excel(name = "容器类型名称 数据字典")
private String containerTypeName;
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("分配库区id")
@Excel(name = "分配库区id")
private Long storageSectionId;
@ApiModelProperty("分配库区编码")
@Excel(name = "分配库区编码")
private String storageCode;
@ApiModelProperty("分配库区名称")
@Excel(name = "分配库区名称")
private String storageName;
@ApiModelProperty("分配库位id")
@Excel(name = "分配库位id")
private Long storageLocationId;
@ApiModelProperty("分配库位编码")
@Excel(name = "分配库位编码")
private String storageLocationCode;
@ApiModelProperty("分配库位名称")
@Excel(name = "分配库位名称")
private String storageLocationName;
@ApiModelProperty("层级深度,从一级开始递增")
private Integer level;
@ApiModelProperty("父级唯一Id")
private Long parentUniqueId;
@ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改")
@Excel(name = "是否允许修改: 1-是 2-否")
private Integer allowModify;
@ApiModelProperty("是否生成拣货单: 1-是 2-否")
@Excel(name = "是否生成拣货单: 1-是 2-否")
private Integer genPickingOrder;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty("越库单id")
private Long overStockId;
@ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成")
@Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成")
private Integer overStockStatus;
@ApiModelProperty("越库类型:1-直接越库 2-分拨越库")
@Excel(name = "越库类型:1-直接越库 2-分拨越库")
private Long overStockType;
/**
* 商品名称
*/
@ApiModelProperty("商品名称")
@Excel(name = "商品名称")
private String commodityName;
/**
* 商品编码
*/
@ApiModelProperty("商品编码")
@Excel(name = "商品编码")
private String commodityNo;
/**
* 料号
*/
@ApiModelProperty("料号")
@Excel(name = "料号")
private String materialNo;
/**
* 规格型号
*/
@ApiModelProperty("规格型号")
@Excel(name = "规格型号")
private String specificationModel;
/**
* 商品SKU码
*/
@ApiModelProperty("商品SKU码")
@Excel(name = "商品SKU码")
private String skucode;
/**
* Invoice No
*/
@ApiModelProperty("Invoice No")
@Excel(name = "Invoice No")
private String invoiceNo;
/**
* 升
*/
@ApiModelProperty("")
@Excel(name = "")
private String liter;
/**
* 尺寸
*/
@ApiModelProperty("尺寸")
@Excel(name = "尺寸")
private String size;
/**
* 申报单位
*/
@ApiModelProperty("申报单位")
@Excel(name = "申报单位")
private String declareUnit;
/**
* Batch Ref NOs
*/
@ApiModelProperty("Batch Ref NOs")
@Excel(name = "Batch Ref NOs")
private String batchRefNo;
/**
* Sheet Ref NOs
*/
@ApiModelProperty("Sheet Ref NOs")
@Excel(name = "Sheet Ref NOs")
private String sheetRefNo;
/**
* 原产国
*/
@ApiModelProperty("原产国")
@Excel(name = "原产国")
private String countryOfOrigin;
/**
* 箱号/卡板号
*/
@ApiModelProperty("箱号/卡板号")
@Excel(name = "箱号/卡板号")
private String boxPalletNo;
/**
* 币制
*/
@ApiModelProperty("币制")
@Excel(name = "币制")
private String currency;
/**
* 申报数量
*/
@ApiModelProperty("申报数量")
@Excel(name = "申报数量")
private BigDecimal declareQuantity;
/**
* 箱数
*/
@ApiModelProperty("箱数")
@Excel(name = "箱数")
private BigDecimal caseCount;
/**
* 件数
*/
@ApiModelProperty("件数")
@Excel(name = "件数")
private BigDecimal pieceCount;
/**
* 出库数量
*/
@ApiModelProperty("出库数量")
@Excel(name = "出库数量")
private BigDecimal outboundQuantity;
/**
* 总净重(KG)
*/
@ApiModelProperty("总净重(KG)")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
/**
* 总毛重(KG)
*/
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
/**
* 总体积(CBM)
*/
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
/**
* 总面积(SQM)
*/
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
/**
* 总价
*/
@ApiModelProperty("总价")
@Excel(name = "总价")
private BigDecimal totalAmount;
/**
* 单位
*/
@ApiModelProperty("单位")
@Excel(name = "单位")
private String unit;
@ApiModelProperty("扩展属性1")
@Excel(name = "扩展属性1")
@TableField("ext_attr_1")
private String extAttr1;
@ApiModelProperty("扩展属性2")
@Excel(name = "扩展属性2")
@TableField("ext_attr_2")
private String extAttr2;
@ApiModelProperty("生产日期")
@Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date productionDate;
@ApiModelProperty("过期日期")
@Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expiryDate;
@ApiModelProperty("存货日期")
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("扩展属性3")
@Excel(name = "扩展属性3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@TableField("ext_attr_3")
private Date extAttr3;
@ApiModelProperty("扩展属性4")
@Excel(name = "扩展属性4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@TableField("ext_attr_4")
private Date extAttr4;
/**
* 库存数量(仅用于前端展示,从material_inventory表中带出)
*/
@ApiModelProperty("分配时库存数量")
private BigDecimal inventoryQuantity;
@TableField(exist = false)
private BigDecimal actualQuantity;
@ApiModelProperty("复核总净重(KG)")
@Excel(name = "复核总净重(KG)")
private BigDecimal checkNetWeight;
@ApiModelProperty("复核总毛重(KG)")
@Excel(name = "复核总毛重(KG)")
private BigDecimal checkGrossWeight;
@ApiModelProperty("复核总体积(CBM)")
@Excel(name = "复核总体积(CBM)")
private BigDecimal checkVolume;
@ApiModelProperty("复核总面积(SQM)")
@Excel(name = "复核总面积(SQM)")
private BigDecimal checkArea;
@ApiModelProperty("是否已分配")
@Excel(name = "是否已分配")
private String isAllocated;
@ApiModelProperty("合同收费")
@Excel(name = "合同收费")
private BigDecimal contractFee;
@ApiModelProperty("每月仓租")
@Excel(name = "每月仓租")
private BigDecimal monthlyWarehouseFee;
@ApiModelProperty("半月仓租")
@Excel(name = "半月仓租")
private BigDecimal halfMonthWhFee;
@ApiModelProperty("折扣(%)")
@Excel(name = "折扣(%)")
private BigDecimal discountRate;
@ApiModelProperty("单体积(CBM)")
@Excel(name = "单体积(CBM)")
private BigDecimal singleVolume;
@ApiModelProperty("单毛重(KG)")
@Excel(name = "单毛重(KG)")
private BigDecimal singleGrossWeight;
@ApiModelProperty("lot编号")
@Excel(name = "lot编号")
private String lotNo;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("库存单位")
@Excel(name = "库存单位")
private String stockUnit;
@ApiModelProperty("库存数量")
@Excel(name = "库存数量")
private BigDecimal stockQuantity;
}
@@ -0,0 +1,68 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.entity.ReservationOutMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailBaseDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import java.util.List;
/**
* 物料明细Service接口
*
* @author gen
* @date 2024-05-21
*/
public interface IReservationOutMaterialDetailService extends IService<ReservationOutMaterialDetail>
{
/**
* 分页查询物料明细列表
*/
public List<ReservationOutMaterialDetailPO> queryList(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* 关联出库单 查询物料明细列表
*/
public List<ReservationOutMaterialDetailPO> queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO);
public List<ReservationOutMaterialDetailPO> queryListChildren(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* 新增物料明细
*/
public Boolean insert(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* 修改物料明细
*/
public Boolean update(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* 新增物料明细
*/
public Boolean batchInsert(String orderNumber, List<ReservationOutMaterialDetailDO> outMaterialDetailDOList);
/**
* 修改物料明细
*/
public Boolean batchUpdate(List<ReservationOutMaterialDetailDO> outMaterialDetailDOList, ReservationOutMaterialDetailBaseDO outMaterialDetailBaseDO);
/**
* 批量删除物料明细
*/
public Boolean delete(Long[] materialDetailIds);
/**
* 查询物料明细
*/
public ReservationOutMaterialDetailPO getInfo(Long materialDetailId);
}
@@ -0,0 +1,56 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.entity.ReservationOutMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import java.util.List;
/**
* 物料明细Mapper接口
*
* @author gen
* @date 2024-05-21
*/
public interface ReservationOutMaterialDetailMapper extends BaseMapper<ReservationOutMaterialDetail>
{
/**
* 查询物料明细列表
*/
public List<ReservationOutMaterialDetailPO> queryList(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* 关联出库单 查询物料明细列表
*/
public List<ReservationOutMaterialDetailPO> queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO);
/**
* @description 批量修改指定物料明细分配数量
* @author ZhouGY
* @date 2024/6/7 14:29
* @param outMaterialDetailDO
* @return int
*/
public int batchAddAllocationQuantityByIds(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* @description 批量修改指定物料明细拣货数量
* @author ZhouGY
* @date 2024/6/7 14:29
* @param outMaterialDetailDO
* @return int
*/
public int batchAddPickingQuantityByIds(ReservationOutMaterialDetailDO outMaterialDetailDO);
/**
* @description 批量修改指定物料明细拣货数量
* @author ZhouGY
* @date 2024/6/7 14:29
* @param outMaterialDetailDO
* @return int
*/
public int batchAddPickingQuantityByUniqueIds(ReservationOutMaterialDetailDO outMaterialDetailDO);
}
@@ -0,0 +1,264 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.persistence;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.core.constant.SnowFlakeConstants;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.IgnoreNullUtil;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.utils.uuid.IdGenerator;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.QueryOrderOverStockDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.entity.ReservationOutMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.facade.IReservationOutMaterialDetailService;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.mapper.ReservationOutMaterialDetailMapper;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailBaseDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper;
import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO;
import com.mhd.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 物料明细Service业务层处理
*
* @author gen
* @date 2024-05-21
*/
@Service
public class ReservationOutMaterialDetailImpl extends ServiceImpl<ReservationOutMaterialDetailMapper, ReservationOutMaterialDetail> implements IReservationOutMaterialDetailService {
@Autowired
private ReservationOutMaterialDetailMapper outMaterialDetailMapper;
// @Autowired
// private IReservationOutMaterialDetailSerialNumberService outMaterialDetailSerialNumberService;
@Autowired
private IdGenerator idGenerator;
@Autowired
private ReservationStockInOrderMapper reservationStockInOrderMapper;
// @Autowired
// private MaterialBaseInfoMapper materialBaseInfoMapper;
/**
* 查询物料明细列表
*/
@Override
public List<ReservationOutMaterialDetailPO> queryList(ReservationOutMaterialDetailDO outMaterialDetailDO)
{
return outMaterialDetailMapper.queryList(outMaterialDetailDO);
}
/**
* 关联出库单 查询物料明细列表
*/
@Override
public List<ReservationOutMaterialDetailPO> queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO) {
return outMaterialDetailMapper.queryOutOrderList(queryOrderOverStockDO);
}
/**
* 查询物料明细列表
*/
@Override
public List<ReservationOutMaterialDetailPO> queryListChildren(ReservationOutMaterialDetailDO outMaterialDetailDO)
{
List<ReservationOutMaterialDetailPO> outMaterialDetailPOList = outMaterialDetailMapper.queryList(outMaterialDetailDO);
// 获取查询的层级
List<ReservationOutMaterialDetailPO> outMaterialDetailParentList = outMaterialDetailPOList
.stream().filter(e -> 1 == e.getLevel()).collect(Collectors.toList());
// 递归查询子集
outMaterialDetailParentList.forEach(materialDetailPO -> materialDetailPO.setChildren(getChildren(materialDetailPO.getUniqueId(), outMaterialDetailPOList, 2)));
return outMaterialDetailParentList;
}
private List<ReservationOutMaterialDetailPO> getChildren(Long parentUniqueId, List<ReservationOutMaterialDetailPO> materialDetailPOList, Integer maxLevel){
List<ReservationOutMaterialDetailPO> childrenCityList = materialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)){
childrenCityList.forEach(childrenCity -> {
if (childrenCity.getLevel() < maxLevel){
childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), materialDetailPOList, maxLevel));
}
});
}
return childrenCityList;
}
/**
* 新增物料明细
*/
@Override
public Boolean insert(ReservationOutMaterialDetailDO outMaterialDetailDO) {
ReservationOutMaterialDetail outMaterialDetail = new ReservationOutMaterialDetail();
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
return this.save(outMaterialDetail);
}
/**
* 修改物料明细
*/
@Override
public Boolean update(ReservationOutMaterialDetailDO outMaterialDetailDO) {
ReservationOutMaterialDetail outMaterialDetail = new ReservationOutMaterialDetail();
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
return this.updateById(outMaterialDetail);
}
/**
* @description 批量新增物流明细
* @author ZhouGY
* @date 2024/5/22 9:27
* @param outOrderNumber
* @param outMaterialDetailDOList
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean batchInsert(String outOrderNumber, List<ReservationOutMaterialDetailDO> outMaterialDetailDOList) {
if (CollectionUtils.isEmpty(outMaterialDetailDOList)) {
throw new ServiceException("物料明细不能为空");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
// 批量新增或修改
// 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底)
final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
&& !loginUser.getUserPo().getUserName().trim().isEmpty())
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
? loginUser.getRealname()
: loginUser.getUsername();
List<ReservationOutMaterialDetail> outMaterialDetailList = new ArrayList<>();
for (ReservationOutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList){
ReservationOutMaterialDetail outMaterialDetail = new ReservationOutMaterialDetail();
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
outMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
outMaterialDetail.setOutOrderNumber(outOrderNumber);
outMaterialDetail.setTopOrganizationId(loginUser.getUserPo().getOrganizationId());
outMaterialDetail.setOrganizationId(loginUser.getUserPo().getOrganizationId());
outMaterialDetail.setOrganizationName(loginUser.getUserPo().getOrganizationName());
outMaterialDetail.setCreateBy(loginUser.getUserid());
outMaterialDetail.setCreateByName(userRealName);
outMaterialDetail.setCreateTime(new Date());
outMaterialDetail.setQuantity(outMaterialDetail.getOutboundQuantity());
String materialNo = outMaterialDetail.getMaterialNo();
List<MaterialBaseInfoPO> materialBaseInfos = reservationStockInOrderMapper.getMaterialBaseInfoList(materialNo);
//List<MaterialBaseInfoPO> materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper<MaterialBaseInfo>().lambda().eq(MaterialBaseInfo::getMaterialCode, materialNo));
if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) {
outMaterialDetail.setCommodityName(materialBaseInfos.get(0).getMaterialName());
outMaterialDetail.setBarCode(materialBaseInfos.get(0).getBarCode());
outMaterialDetail.setPackName(materialBaseInfos.get(0).getPackName());
outMaterialDetail.setPackCode(materialBaseInfos.get(0).getPackCode());
outMaterialDetail.setUnitCode(materialBaseInfos.get(0).getUnitCode());
outMaterialDetail.setUnitName(materialBaseInfos.get(0).getUnitName());
}
outMaterialDetailList.add(outMaterialDetail);
}
return saveBatch(outMaterialDetailList);
}
/**
* @description 批量修改物流明细
* @author ZhouGY
* @date 2024/5/22 9:27
* @param outMaterialDetailDOList
* @param outMaterialDetailBaseDO
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean batchUpdate(List<ReservationOutMaterialDetailDO> outMaterialDetailDOList, ReservationOutMaterialDetailBaseDO outMaterialDetailBaseDO) {
if (CollectionUtils.isEmpty(outMaterialDetailDOList)) {
throw new ServiceException("物料明细不能为空");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
List<ReservationOutMaterialDetail> outMaterialDetailDbList = outMaterialDetailMapper.selectList(new QueryWrapper<ReservationOutMaterialDetail>().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, outMaterialDetailBaseDO.getOutOrderNumber()));
Map<Long, ReservationOutMaterialDetail> materialDetailMap = outMaterialDetailDbList.stream().collect(Collectors.toMap(ReservationOutMaterialDetail::getMaterialDetailId, Function.identity()));
//批量新增或修改物料信息
List<ReservationOutMaterialDetail> outMaterialDetailList = new ArrayList<>();
//需要修改的物流明细
List<Long> materialDetailIdsByUpdate = new ArrayList<>();
for (ReservationOutMaterialDetailDO outMaterialDetailDO : outMaterialDetailDOList){
//判断是否需要修改
ReservationOutMaterialDetail outMaterialDetail = materialDetailMap.get(outMaterialDetailDO.getMaterialDetailId());
if (outMaterialDetail == null){
outMaterialDetail = new ReservationOutMaterialDetail();
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
outMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
outMaterialDetail.setOutOrderNumber(outMaterialDetailBaseDO.getOutOrderNumber());
outMaterialDetail.setOrganizationId(outMaterialDetailBaseDO.getOrganizationId());
outMaterialDetail.setOrganizationName(outMaterialDetailBaseDO.getOrganizationName());
outMaterialDetail.setTopOrganizationId(outMaterialDetailBaseDO.getTopOrganizationId());
}else {
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
outMaterialDetail.setUpdateBy(loginUser.getUserid());
outMaterialDetail.setUpdateByName(loginUser.getUsername());
outMaterialDetail.setUpdateTime(new Date());
materialDetailIdsByUpdate.add(outMaterialDetailDO.getMaterialDetailId());
}
outMaterialDetailList.add(outMaterialDetail);
}
//需修改的物料明细id集合不为空
if (!CollectionUtils.isEmpty(materialDetailIdsByUpdate)){
List<Long> materialDetailIdsByDb = outMaterialDetailDbList.stream().map(ReservationOutMaterialDetail::getMaterialDetailId).collect(Collectors.toList());
//过滤需要修改的id集合
materialDetailIdsByDb.removeAll(materialDetailIdsByUpdate);
//判断是否存在需要删除的物流明细 标记删除
if (!CollectionUtils.isEmpty(materialDetailIdsByDb)){
update(new UpdateWrapper<ReservationOutMaterialDetail>().lambda()
.set(ReservationOutMaterialDetail::getDelFlag, 2)
.set(ReservationOutMaterialDetail::getUpdateBy, loginUser.getUserid())
.set(ReservationOutMaterialDetail::getUpdateByName, loginUser.getUsername())
.set(ReservationOutMaterialDetail::getUpdateTime, new Date())
.in(ReservationOutMaterialDetail::getMaterialDetailId, materialDetailIdsByDb));
}
}
//保存物料明细信息
return saveOrUpdateBatch(outMaterialDetailList);
}
/**
* 批量删除物料明细
*/
@Override
public Boolean delete(Long[] materialDetailIds ) {
List<ReservationOutMaterialDetail> list = new ArrayList<>();
for (Long id : materialDetailIds) {
ReservationOutMaterialDetail outMaterialDetail = new ReservationOutMaterialDetail();
outMaterialDetail.setMaterialDetailId(id);
outMaterialDetail.setDelFlag(2);
list.add(outMaterialDetail);
}
return this.updateBatchById(list);
}
/**
* 修改物料明细
*/
@Override
public ReservationOutMaterialDetailPO getInfo(Long materialDetailId) {
ReservationOutMaterialDetail outMaterialDetail = this.getById(materialDetailId);
ReservationOutMaterialDetailPO outMaterialDetailPO = new ReservationOutMaterialDetailPO();
BeanUtils.copyProperties(outMaterialDetail, outMaterialDetailPO);
return outMaterialDetailPO;
}
}
@@ -0,0 +1,42 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.po;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author ZhouGY
* @title OutMaterialCheckPO
* @description: 出库复审信息统计
* @date 2024/5/31 10:33
**/
@Data
public class OutMaterialCheckPO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("物料数")
private Integer count;
@ApiModelProperty("总重量")
@Excel(name = "总重量")
private BigDecimal weightLimit;
@ApiModelProperty("总体积")
@Excel(name = "总体积")
private BigDecimal volumeLimit;
@ApiModelProperty("数量EA")
private BigDecimal number;
@ApiModelProperty("需扫描数")
private BigDecimal wantNumber;
@ApiModelProperty("已扫描数")
private BigDecimal alreadyNumber;
@ApiModelProperty("未扫描数")
private BigDecimal notHaveNumber;
}
@@ -0,0 +1,528 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.po;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mhd.common.core.annotation.Excel;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderBaseDO;
import com.mhd.system.api.domain.MaterialMoreDetailPO;
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;
import java.util.List;
/**
* 物料明细对象 material_detail
*
* @author gen
* @date 2024-05-21
*/
@Data
@ApiModel(value = "物料明细对象", description = "物料明细响应对象")
public class ReservationOutMaterialDetailPO extends ReservationStockOutOrderBaseDO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("订单物料明细id")
private Long materialDetailId;
@ApiModelProperty("业务唯一id")
@JsonSerialize(using = ToStringSerializer.class)
private Long uniqueId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("物料基础信息id")
@Excel(name = "物料基础信息id")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
@Excel(name = "物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
@Excel(name = "物料名称")
private String materialName;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("已分配数量")
@Excel(name = "已分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("本次分配数量")
@Excel(name = "本次分配数量")
@TableField(exist = false)
private BigDecimal nowAllocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("待复核数量")
@Excel(name = "待复核数量")
private BigDecimal waitCheckQuantity;
@ApiModelProperty("复核数量输入框字段,默认等于待复核数量")
@TableField(exist = false)
private BigDecimal actualQuantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("包装规格id")
@Excel(name = "包装规格id")
private Long packId;
@ApiModelProperty("包装规格编码")
@Excel(name = "包装规格编码")
private String packCode;
@ApiModelProperty("包装规格名称")
@Excel(name = "包装规格名称")
private String packName;
@ApiModelProperty("包装详情id")
@Excel(name = "包装详情id")
private Long packDetailId;
@ApiModelProperty("单位代码:EA IP CS PL OT")
@Excel(name = "单位代码:EA IP CS PL OT")
private String unitCode;
@ApiModelProperty("单位名称")
@Excel(name = "单位名称")
private String unitName;
@ApiModelProperty("单位数量")
@Excel(name = "单位数量")
private BigDecimal unitNumber;
@ApiModelProperty("物料仓库控制信息id")
@Excel(name = "物料仓库控制信息id")
private Long materialWarehouseControlId;
@ApiModelProperty("是否序列号管理: 1-是 2-否")
@Excel(name = "是否序列号管理: 1-是 2-否")
private Integer serialNumberManage;
@ApiModelProperty("物料库存id")
@Excel(name = "物料库存id")
private Long materialInventoryId;
@ApiModelProperty("批次号")
@Excel(name = "批次号")
private String batchNumber;
@ApiModelProperty("物料状态编码")
@Excel(name = "物料状态编码")
private String materialStatusCode;
@ApiModelProperty("物料状态名称")
@Excel(name = "物料状态名称")
private String materialStatusName;
@ApiModelProperty("容器id")
@Excel(name = "容器id")
private Long containerId;
@ApiModelProperty("容器编码")
@Excel(name = "容器编码")
private String containerCode;
@ApiModelProperty("容器类型 数据字典")
@Excel(name = "容器类型 数据字典")
private String containerType;
@ApiModelProperty("容器类型名称 数据字典")
@Excel(name = "容器类型名称 数据字典")
private String containerTypeName;
@ApiModelProperty("库存数量(仅展示)")
private BigDecimal inventoryQuantity;
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("分配库区id")
@Excel(name = "分配库区id")
private Long storageSectionId;
@ApiModelProperty("分配库区编码")
@Excel(name = "分配库区编码")
private String storageCode;
@ApiModelProperty("分配库区名称")
@Excel(name = "分配库区名称")
private String storageName;
@ApiModelProperty("分配库位id")
@Excel(name = "分配库位id")
private Long storageLocationId;
@ApiModelProperty("分配库位编码")
@Excel(name = "分配库位编码")
private String storageLocationCode;
@ApiModelProperty("分配库位名称")
@Excel(name = "分配库位名称")
private String storageLocationName;
@ApiModelProperty("层级深度,从一级开始递增")
private Integer level;
@ApiModelProperty("父级唯一Id")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentUniqueId;
@ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改")
@Excel(name = "是否允许修改: 1-是 2-否")
private Integer allowModify;
@ApiModelProperty("是否生成拣货单: 1-是 2-否")
@Excel(name = "是否生成拣货单: 1-是 2-否")
private Integer genPickingOrder;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty("物料明细")
private List<ReservationOutMaterialDetailPO> children;
@ApiModelProperty("越库单id")
private Long overStockId;
@ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成")
@Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成")
private Integer overStockStatus;
@ApiModelProperty("越库类型:1-直接越库 2-分拨越库")
@Excel(name = "越库类型:1-直接越库 2-分拨越库")
private Long overStockType;
/**
* 商品名称
*/
@ApiModelProperty("商品名称")
@Excel(name = "商品名称")
private String commodityName;
/**
* 商品编码
*/
@ApiModelProperty("商品编码")
@Excel(name = "商品编码")
private String commodityNo;
/**
* 料号
*/
@ApiModelProperty("料号")
@Excel(name = "料号")
private String materialNo;
/**
* 规格型号
*/
@ApiModelProperty("规格型号")
@Excel(name = "规格型号")
private String specificationModel;
/**
* 商品SKU码
*/
@ApiModelProperty("商品SKU码")
@Excel(name = "商品SKU码")
private String skucode;
/**
* Invoice No
*/
@ApiModelProperty("Invoice No")
@Excel(name = "Invoice No")
private String invoiceNo;
/**
* 升
*/
@ApiModelProperty("")
@Excel(name = "")
private String liter;
/**
* 尺寸
*/
@ApiModelProperty("尺寸")
@Excel(name = "尺寸")
private String size;
/**
* 申报单位
*/
@ApiModelProperty("申报单位")
@Excel(name = "申报单位")
private String declareUnit;
/**
* Batch Ref NOs
*/
@ApiModelProperty("Batch Ref NOs")
@Excel(name = "Batch Ref NOs")
private String batchRefNo;
/**
* Sheet Ref NOs
*/
@ApiModelProperty("Sheet Ref NOs")
@Excel(name = "Sheet Ref NOs")
private String sheetRefNo;
/**
* 原产国
*/
@ApiModelProperty("原产国")
@Excel(name = "原产国")
private String countryOfOrigin;
/**
* 箱号/卡板号
*/
@ApiModelProperty("箱号/卡板号")
@Excel(name = "箱号/卡板号")
private String boxPalletNo;
/**
* 币制
*/
@ApiModelProperty("币制")
@Excel(name = "币制")
private String currency;
/**
* 申报数量
*/
@ApiModelProperty("申报数量")
@Excel(name = "申报数量")
private BigDecimal declareQuantity;
/**
* 箱数
*/
@ApiModelProperty("箱数")
@Excel(name = "箱数")
private BigDecimal caseCount;
/**
* 件数
*/
@ApiModelProperty("件数")
@Excel(name = "件数")
private BigDecimal pieceCount;
/**
* 出库数量
*/
@ApiModelProperty("出库数量")
@Excel(name = "出库数量")
private BigDecimal outboundQuantity;
/**
* 总净重(KG)
*/
@ApiModelProperty("总净重(KG)")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
/**
* 总毛重(KG)
*/
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
/**
* 总体积(CBM)
*/
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
/**
* 总面积(SQM)
*/
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
/**
* 总价
*/
@ApiModelProperty("总价")
@Excel(name = "总价")
private BigDecimal totalAmount;
/**
* 单位
*/
@ApiModelProperty("单位")
@Excel(name = "单位")
private String unit;
@ApiModelProperty("扩展字段1")
@Excel(name = "扩展字段1")
private String extAttr1;
@ApiModelProperty("扩展字段2")
@Excel(name = "扩展字段2")
private String extAttr2;
@ApiModelProperty("生产日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date productionDate;
@ApiModelProperty("过期日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expiryDate;
@ApiModelProperty("存货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date extAttr3;
@ApiModelProperty("ExtAttr4")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date extAttr4;
@ApiModelProperty("更多属性明细列表")
@TableField(exist = false)
private List<MaterialMoreDetailPO> materialMoreDetailList;
@ApiModelProperty("分配按钮显示类型:1-显示库存分配,2-显示取消分配")
@TableField(exist = false)
private Integer allocationButtonType;
@ApiModelProperty("复核总净重(KG)")
@Excel(name = "复核总净重(KG)")
private BigDecimal checkNetWeight;
@ApiModelProperty("复核总毛重(KG)")
@Excel(name = "复核总毛重(KG)")
private BigDecimal checkGrossWeight;
@ApiModelProperty("复核总体积(CBM)")
@Excel(name = "复核总体积(CBM)")
private BigDecimal checkVolume;
@ApiModelProperty("复核总面积(SQM)")
@Excel(name = "复核总面积(SQM)")
private BigDecimal checkArea;
@ApiModelProperty("是否已分配")
@Excel(name = "是否已分配")
private String isAllocated;
@ApiModelProperty("合同收费")
@Excel(name = "合同收费")
private BigDecimal contractFee;
@ApiModelProperty("每月仓租")
@Excel(name = "每月仓租")
private BigDecimal monthlyWarehouseFee;
@ApiModelProperty("半月仓租")
@Excel(name = "半月仓租")
private BigDecimal halfMonthWhFee;
@ApiModelProperty("折扣(%)")
@Excel(name = "折扣(%)")
private BigDecimal discountRate;
@ApiModelProperty("单体积(CBM)")
@Excel(name = "单体积(CBM)")
private BigDecimal singleVolume;
@ApiModelProperty("单毛重(KG)")
@Excel(name = "单毛重(KG)")
private BigDecimal singleGrossWeight;
@ApiModelProperty("lot编号")
@Excel(name = "lot编号")
private String lotNo;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("库存单位")
@Excel(name = "库存单位")
private String stockUnit;
@ApiModelProperty("库存数量")
@Excel(name = "库存数量")
private BigDecimal stockQuantity;
@ApiModelProperty("出库异常明细:计划数量(复核异常场景=拣货数量)")
@TableField(exist = false)
private BigDecimal abnormalPlanQuantity;
@ApiModelProperty("出库异常明细:作业数量(复核异常场景=实际复核数量)")
@TableField(exist = false)
private BigDecimal abnormalWorkQuantity;
}
@@ -0,0 +1,34 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author ZhouGY
* @title StockBaseDO
* @description: TODO
* @date 2024/5/23 20:30
**/
@Data
public class ReservationOutMaterialDetailBaseDO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
}
@@ -0,0 +1,475 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
//import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.todo.ReservationOutMaterialDetailSerialNumberDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 物料明细对象 material_detail
*
* @author gen
* @date 2024-05-21
*/
@Data
public class ReservationOutMaterialDetailDO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("订单物料明细id")
private Long materialDetailId;
@ApiModelProperty("业务唯一id")
@JsonSerialize(using = ToStringSerializer.class)
private Long uniqueId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("物料基础信息id")
@Excel(name = "物料基础信息id")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
@Excel(name = "物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
@Excel(name = "物料名称")
private String materialName;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("已分配数量")
@Excel(name = "已分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("本次分配数量")
@Excel(name = "本次分配数量")
@TableField(exist = false)
private BigDecimal nowAllocationQuantity;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("包装规格id")
@Excel(name = "包装规格id")
private Long packId;
@ApiModelProperty("包装规格编码")
@Excel(name = "包装规格编码")
private String packCode;
@ApiModelProperty("包装规格名称")
@Excel(name = "包装规格名称")
private String packName;
@ApiModelProperty("包装详情id")
@Excel(name = "包装详情id")
private Long packDetailId;
@ApiModelProperty("单位代码:EA IP CS PL OT")
@Excel(name = "单位代码:EA IP CS PL OT")
private String unitCode;
@ApiModelProperty("单位名称")
@Excel(name = "单位名称")
private String unitName;
@ApiModelProperty("单位数量")
@Excel(name = "单位数量")
private BigDecimal unitNumber;
@ApiModelProperty("物料仓库控制信息id")
@Excel(name = "物料仓库控制信息id")
private Long materialWarehouseControlId;
@ApiModelProperty("是否序列号管理: 1-是 2-否")
@Excel(name = "是否序列号管理: 1-是 2-否")
private Integer serialNumberManage;
@ApiModelProperty("物料库存id")
@Excel(name = "物料库存id")
private Long materialInventoryId;
@ApiModelProperty("批次号")
@Excel(name = "批次号")
private String batchNumber;
@ApiModelProperty("物料状态编码")
@Excel(name = "物料状态编码")
private String materialStatusCode;
@ApiModelProperty("物料状态名称")
@Excel(name = "物料状态名称")
private String materialStatusName;
@ApiModelProperty("容器id")
@Excel(name = "容器id")
private Long containerId;
@ApiModelProperty("容器编码")
@Excel(name = "容器编码")
private String containerCode;
@ApiModelProperty("容器类型 数据字典")
@Excel(name = "容器类型 数据字典")
private String containerType;
@ApiModelProperty("容器类型名称 数据字典")
@Excel(name = "容器类型名称 数据字典")
private String containerTypeName;
@ApiModelProperty("分配时库存数量(仅展示)")
private BigDecimal inventoryQuantity;
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("分配库区id")
@Excel(name = "分配库区id")
private Long storageSectionId;
@ApiModelProperty("分配库区编码")
@Excel(name = "分配库区编码")
private String storageCode;
@ApiModelProperty("分配库区名称")
@Excel(name = "分配库区名称")
private String storageName;
@ApiModelProperty("分配库位id")
@Excel(name = "分配库位id")
private Long storageLocationId;
@ApiModelProperty("分配库位编码")
@Excel(name = "分配库位编码")
private String storageLocationCode;
@ApiModelProperty("分配库位名称")
@Excel(name = "分配库位名称")
private String storageLocationName;
@ApiModelProperty("层级深度,从一级开始递增")
private Integer level;
@ApiModelProperty("父级唯一Id")
private Long parentUniqueId;
@ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改")
@Excel(name = "是否允许修改: 1-是 2-否")
private Integer allowModify;
@ApiModelProperty("是否生成拣货单: 1-是 2-否")
@Excel(name = "是否生成拣货单: 1-是 2-否")
private Integer genPickingOrder;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
@ApiModelProperty("物料明细子集")
private List<ReservationOutMaterialDetailDO> children;
// @ApiModelProperty("序列号")
// private List<ReservationOutMaterialDetailSerialNumberDO> materialDetailSerialNumberList;
@ApiModelProperty("出单号集合")
@Excel(name = "出单号集合")
private List<String> outOrderNumberList;
@ApiModelProperty("取消分配数量")
@Excel(name = "取消分配数量")
private BigDecimal cancelAllocationQuantity;
@ApiModelProperty("订单物料明细id")
private List<Long> materialDetailIds;
@ApiModelProperty("作业数量(例如:分配数量 拣货数量 复核数量)")
@Excel(name = "作业数量(例如:分配数量 拣货数量 复核数量)")
private BigDecimal actualQuantity;
/**
* 商品名称
*/
@ApiModelProperty("商品名称")
@Excel(name = "商品名称")
private String commodityName;
/**
* 商品编码
*/
@ApiModelProperty("商品编码")
@Excel(name = "商品编码")
private String commodityNo;
/**
* 料号
*/
@ApiModelProperty("料号")
@Excel(name = "料号")
private String materialNo;
/**
* 规格型号
*/
@ApiModelProperty("规格型号")
@Excel(name = "规格型号")
private String specificationModel;
/**
* 商品SKU码
*/
@ApiModelProperty("商品SKU码")
@Excel(name = "商品SKU码")
private String skucode;
/**
* Invoice No
*/
@ApiModelProperty("Invoice No")
@Excel(name = "Invoice No")
private String invoiceNo;
/**
* 升
*/
@ApiModelProperty("")
@Excel(name = "")
private String liter;
/**
* 尺寸
*/
@ApiModelProperty("尺寸")
@Excel(name = "尺寸")
private String size;
/**
* 申报单位
*/
@ApiModelProperty("申报单位")
@Excel(name = "申报单位")
private String declareUnit;
/**
* Batch Ref NOs
*/
@ApiModelProperty("Batch Ref NOs")
@Excel(name = "Batch Ref NOs")
private String batchRefNo;
/**
* Sheet Ref NOs
*/
@ApiModelProperty("Sheet Ref NOs")
@Excel(name = "Sheet Ref NOs")
private String sheetRefNo;
/**
* 原产国
*/
@ApiModelProperty("原产国")
@Excel(name = "原产国")
private String countryOfOrigin;
/**
* 箱号/卡板号
*/
@ApiModelProperty("箱号/卡板号")
@Excel(name = "箱号/卡板号")
private String boxPalletNo;
/**
* 币制
*/
@ApiModelProperty("币制")
@Excel(name = "币制")
private String currency;
/**
* 申报数量
*/
@ApiModelProperty("申报数量")
@Excel(name = "申报数量")
private BigDecimal declareQuantity;
/**
* 箱数
*/
@ApiModelProperty("箱数")
@Excel(name = "箱数")
private BigDecimal caseCount;
/**
* 件数
*/
@ApiModelProperty("件数")
@Excel(name = "件数")
private BigDecimal pieceCount;
/**
* 出库数量
*/
@ApiModelProperty("出库数量")
@Excel(name = "出库数量")
private BigDecimal outboundQuantity;
/**
* 总净重(KG)
*/
@ApiModelProperty("总净重(KG)")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
/**
* 总毛重(KG)
*/
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
/**
* 总体积(CBM)
*/
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
/**
* 总面积(SQM)
*/
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
/**
* 总价
*/
@ApiModelProperty("总价")
@Excel(name = "总价")
private BigDecimal totalAmount;
/**
* 单位
*/
@ApiModelProperty("单位")
@Excel(name = "单位")
private String unit;
@ApiModelProperty("复核总净重(KG)")
@Excel(name = "复核总净重(KG)")
private BigDecimal checkNetWeight;
@ApiModelProperty("复核总毛重(KG)")
@Excel(name = "复核总毛重(KG)")
private BigDecimal checkGrossWeight;
@ApiModelProperty("复核总体积(CBM)")
@Excel(name = "复核总体积(CBM)")
private BigDecimal checkVolume;
@ApiModelProperty("复核总面积(SQM)")
@Excel(name = "复核总面积(SQM)")
private BigDecimal checkArea;
@ApiModelProperty("是否已分配")
@Excel(name = "是否已分配")
private String isAllocated;
@ApiModelProperty("合同收费")
@Excel(name = "合同收费")
private BigDecimal contractFee;
@ApiModelProperty("每月仓租")
@Excel(name = "每月仓租")
private BigDecimal monthlyWarehouseFee;
@ApiModelProperty("半月仓租")
@Excel(name = "半月仓租")
private BigDecimal halfMonthWhFee;
@ApiModelProperty("折扣(%)")
@Excel(name = "折扣(%)")
private BigDecimal discountRate;
@ApiModelProperty("单体积(CBM)")
@Excel(name = "单体积(CBM)")
private BigDecimal singleVolume;
@ApiModelProperty("单毛重(KG)")
@Excel(name = "单毛重(KG)")
private BigDecimal singleGrossWeight;
@ApiModelProperty("lot编号")
@Excel(name = "lot编号")
private String lotNo;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("库存单位")
@Excel(name = "库存单位")
private String stockUnit;
@ApiModelProperty("库存数量")
@Excel(name = "库存数量")
private BigDecimal stockQuantity;
}
@@ -0,0 +1,465 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
//import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
//import com.mhd.wms.interfaces.dto.outMaterialDetailSerialNumber.OutMaterialDetailSerialNumberDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 物料明细对象 material_detail
*
* @author gen
* @date 2024-05-21
*/
@Data
public class ReservationOutMaterialDetailDTO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("订单物料明细id")
private Long materialDetailId;
@ApiModelProperty("业务唯一id")
@JsonSerialize(using = ToStringSerializer.class)
private Long uniqueId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("物料基础信息id")
@Excel(name = "物料基础信息id")
private Long materialBaseInfoId;
@ApiModelProperty("物料编码")
@Excel(name = "物料编码")
private String materialCode;
@ApiModelProperty("物料名称")
@Excel(name = "物料名称")
private String materialName;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("已分配数量")
@Excel(name = "已分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("作业数量(例如:分配数量 拣货数量 复核数量 取消数量)")
@Excel(name = "作业数量(例如:分配数量 拣货数量 复核数量 取消数量)")
private BigDecimal actualQuantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("包装规格id")
@Excel(name = "包装规格id")
private Long packId;
@ApiModelProperty("包装规格编码")
@Excel(name = "包装规格编码")
private String packCode;
@ApiModelProperty("包装规格名称")
@Excel(name = "包装规格名称")
private String packName;
@ApiModelProperty("包装详情id")
@Excel(name = "包装详情id")
private Long packDetailId;
@ApiModelProperty("单位代码:EA IP CS PL OT")
@Excel(name = "单位代码:EA IP CS PL OT")
private String unitCode;
@ApiModelProperty("单位名称")
@Excel(name = "单位名称")
private String unitName;
@ApiModelProperty("单位数量")
@Excel(name = "单位数量")
private BigDecimal unitNumber;
@ApiModelProperty("物料仓库控制信息id")
@Excel(name = "物料仓库控制信息id")
private Long materialWarehouseControlId;
@ApiModelProperty("是否序列号管理: 1-是 2-否")
@Excel(name = "是否序列号管理: 1-是 2-否")
private Integer serialNumberManage;
@ApiModelProperty("物料库存id")
@Excel(name = "物料库存id")
private Long materialInventoryId;
@ApiModelProperty("批次号")
@Excel(name = "批次号")
private String batchNumber;
@ApiModelProperty("物料状态编码")
@Excel(name = "物料状态编码")
private String materialStatusCode;
@ApiModelProperty("物料状态名称")
@Excel(name = "物料状态名称")
private String materialStatusName;
@ApiModelProperty("物料明细子集")
private List<ReservationOutMaterialDetailDO> children;
@ApiModelProperty("容器id")
@Excel(name = "容器id")
private Long containerId;
@ApiModelProperty("容器编码")
@Excel(name = "容器编码")
private String containerCode;
@ApiModelProperty("容器类型 数据字典")
@Excel(name = "容器类型 数据字典")
private String containerType;
@ApiModelProperty("容器类型名称 数据字典")
@Excel(name = "容器类型名称 数据字典")
private String containerTypeName;
@ApiModelProperty("库存数量(仅展示)")
private BigDecimal inventoryQuantity;
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("分配库区id")
@Excel(name = "分配库区id")
private Long storageSectionId;
@ApiModelProperty("分配库区编码")
@Excel(name = "分配库区编码")
private String storageCode;
@ApiModelProperty("分配库区名称")
@Excel(name = "分配库区名称")
private String storageName;
@ApiModelProperty("分配库位id")
@Excel(name = "分配库位id")
private Long storageLocationId;
@ApiModelProperty("分配库位编码")
@Excel(name = "分配库位编码")
private String storageLocationCode;
@ApiModelProperty("分配库位名称")
@Excel(name = "分配库位名称")
private String storageLocationName;
@ApiModelProperty("层级深度,从一级开始递增")
private Integer level;
@ApiModelProperty("父级唯一Id")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentUniqueId;
@ApiModelProperty("是否允许修改: 1-是 2-否 分配后 不再支持修改")
@Excel(name = "是否允许修改: 1-是 2-否")
private Integer allowModify;
@ApiModelProperty("是否生成拣货单: 1-是 2-否")
@Excel(name = "是否生成拣货单: 1-是 2-否")
private Integer genPickingOrder;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
@ApiModelProperty("物料明细子集")
private List<ReservationOutMaterialDetailDTO> materialDetailList;
// @ApiModelProperty("序列号")
// private List<OutMaterialDetailSerialNumberDTO> materialDetailSerialNumberList;
@ApiModelProperty("出单号集合")
@Excel(name = "出单号集合")
private List<String> outOrderNumberList;
@ApiModelProperty("取消分配数量")
@Excel(name = "取消分配数量")
private BigDecimal cancelAllocationQuantity;
/**
* 商品名称
*/
@ApiModelProperty("商品名称")
@Excel(name = "商品名称")
private String commodityName;
/**
* 商品编码
*/
@ApiModelProperty("商品编码")
@Excel(name = "商品编码")
private String commodityNo;
/**
* 料号
*/
@ApiModelProperty("料号")
@Excel(name = "料号")
private String materialNo;
/**
* 规格型号
*/
@ApiModelProperty("规格型号")
@Excel(name = "规格型号")
private String specificationModel;
/**
* 商品SKU码
*/
@ApiModelProperty("商品SKU码")
@Excel(name = "商品SKU码")
private String skucode;
/**
* Invoice No
*/
@ApiModelProperty("Invoice No")
@Excel(name = "Invoice No")
private String invoiceNo;
/**
* 升
*/
@ApiModelProperty("")
@Excel(name = "")
private String liter;
/**
* 尺寸
*/
@ApiModelProperty("尺寸")
@Excel(name = "尺寸")
private String size;
/**
* 申报单位
*/
@ApiModelProperty("申报单位")
@Excel(name = "申报单位")
private String declareUnit;
/**
* Batch Ref NOs
*/
@ApiModelProperty("Batch Ref NOs")
@Excel(name = "Batch Ref NOs")
private String batchRefNo;
/**
* Sheet Ref NOs
*/
@ApiModelProperty("Sheet Ref NOs")
@Excel(name = "Sheet Ref NOs")
private String sheetRefNo;
/**
* 原产国
*/
@ApiModelProperty("原产国")
@Excel(name = "原产国")
private String countryOfOrigin;
/**
* 箱号/卡板号
*/
@ApiModelProperty("箱号/卡板号")
@Excel(name = "箱号/卡板号")
private String boxPalletNo;
/**
* 币制
*/
@ApiModelProperty("币制")
@Excel(name = "币制")
private String currency;
/**
* 申报数量
*/
@ApiModelProperty("申报数量")
@Excel(name = "申报数量")
private BigDecimal declareQuantity;
/**
* 箱数
*/
@ApiModelProperty("箱数")
@Excel(name = "箱数")
private BigDecimal caseCount;
/**
* 件数
*/
@ApiModelProperty("件数")
@Excel(name = "件数")
private BigDecimal pieceCount;
/**
* 出库数量
*/
@ApiModelProperty("出库数量")
@Excel(name = "出库数量")
private BigDecimal outboundQuantity;
/**
* 总净重(KG)
*/
@ApiModelProperty("总净重(KG)")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
/**
* 总毛重(KG)
*/
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
/**
* 总体积(CBM)
*/
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
/**
* 总面积(SQM)
*/
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
/**
* 总价
*/
@ApiModelProperty("总价")
@Excel(name = "总价")
private BigDecimal totalAmount;
/**
* 单位
*/
@ApiModelProperty("单位")
@Excel(name = "单位")
private String unit;
@ApiModelProperty("复核总净重(KG)")
@Excel(name = "复核总净重(KG)")
private BigDecimal checkNetWeight;
@ApiModelProperty("复核总毛重(KG)")
@Excel(name = "复核总毛重(KG)")
private BigDecimal checkGrossWeight;
@ApiModelProperty("复核总体积(CBM)")
@Excel(name = "复核总体积(CBM)")
private BigDecimal checkVolume;
@ApiModelProperty("复核总面积(SQM)")
@Excel(name = "复核总面积(SQM)")
private BigDecimal checkArea;
@ApiModelProperty("合同收费")
@Excel(name = "合同收费")
private BigDecimal contractFee;
@ApiModelProperty("每月仓租")
@Excel(name = "每月仓租")
private BigDecimal monthlyWarehouseFee;
@ApiModelProperty("半月仓租")
@Excel(name = "半月仓租")
private BigDecimal halfMonthWhFee;
@ApiModelProperty("折扣(%)")
@Excel(name = "折扣(%)")
private BigDecimal discountRate;
@ApiModelProperty("单体积(CBM)")
@Excel(name = "单体积(CBM)")
private BigDecimal singleVolume;
@ApiModelProperty("单毛重(KG)")
@Excel(name = "单毛重(KG)")
private BigDecimal singleGrossWeight;
@ApiModelProperty("lot编号")
@Excel(name = "lot编号")
private String lotNo;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("库存单位")
@Excel(name = "库存单位")
private String stockUnit;
@ApiModelProperty("库存数量")
@Excel(name = "库存数量")
private BigDecimal stockQuantity;
}
@@ -0,0 +1,67 @@
package com.mhd.oms.domain.reservationOutMaterialDetail.service;
//import com.mhd.wms.domain.outMaterialDetail.repository.facade.IReservationOutMaterialDetailService;
//import com.mhd.wms.domain.outMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
//import com.mhd.wms.domain.outMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.facade.IReservationOutMaterialDetailService;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 物料明细
*
* @author gen
* @date 2024-05-21
*/
@Service
@Slf4j
public class ReservationOutMaterialDetailDomainService {
@Autowired
private IReservationOutMaterialDetailService outMaterialDetailService;
/**
* 分页查询物料明细列表
*/
public List<ReservationOutMaterialDetailPO> queryList(ReservationOutMaterialDetailDO outMaterialDetailDO) {
return outMaterialDetailService.queryList(outMaterialDetailDO);
}
/**
* 新增物料明细
*/
public Boolean insert(ReservationOutMaterialDetailDO outMaterialDetailDO) {
return outMaterialDetailService.insert(outMaterialDetailDO);
}
/**
* 修改物料明细
*/
public Boolean update(ReservationOutMaterialDetailDO outMaterialDetailDO) {
return outMaterialDetailService.update(outMaterialDetailDO);
}
/**
* 批量删除物料明细
*/
public Boolean delete(Long[] materialDetailIds) {
return outMaterialDetailService.delete(materialDetailIds);
}
/**
* 获取物料明细详细信息
*/
public ReservationOutMaterialDetailPO getInfo(Long materialDetailId)
{
return outMaterialDetailService.getInfo(materialDetailId);
}
}
@@ -352,4 +352,31 @@ public class ReservationStockInOrder extends BaseVOEntity {
@ApiModelProperty("订单状态")
@Excel(name = "订单状态")
private String orderStatus;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -26,6 +26,8 @@ public interface ReservationStockInOrderMapper extends BaseMapper<ReservationSto
public MaterialBaseInfoPO getinfo(@Param("id") Long id);
public List<MaterialBaseInfoPO> getMaterialBaseInfoList(@Param("id") String id);
public MaterialWarehouseControlPO getInfoByMaterialBaseInfoIds(@Param("id") Long id);
public MaterialGoodsRulePO getGoodsInfoByMaterialBaseInfoIds(@Param("id") Long id);
@@ -373,4 +373,29 @@ public class ReservationStockInOrderPO extends BaseVOEntity {
@ApiModelProperty("订单状态")
@Excel(name = "订单状态")
private String orderStatus;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -379,4 +379,29 @@ public class ReservationStockInOrderDO extends BaseVOEntity {
@ApiModelProperty("入库明细-物料编码,模糊匹配")
private String materialCode;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -376,4 +376,29 @@ public class ReservationStockInOrderDTO extends ReservationStockInOrderBaseDTO {
@ApiModelProperty("入库明细-物料编码,模糊匹配,与前端参数 materialCode 一致")
private String materialCode;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -253,6 +253,17 @@ public class ReservationStockInOrderApplicationService {
return stockInOrderDomainService.auditState(stockInOrderDO);
}
/**
* @description 下发入库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockInOrderDO
* @return Boolean
*/
public Boolean issueOrder(ReservationStockInOrderDO stockInOrderDO){
return stockInOrderDomainService.issueOrder(stockInOrderDO);
}
/**
* @description 取消入库单
* @author ZhouGY
@@ -10,6 +10,7 @@ import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.reservationInMaterialDetail.entity.ReservationInMaterialDetail;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.facade.IReservationInMaterialDetailService;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.po.ReservationInMaterialDetailPO;
import com.mhd.oms.domain.reservationInMaterialDetail.repository.todo.ReservationInMaterialDetailBaseDO;
@@ -23,7 +24,10 @@ import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialWarehous
import com.mhd.oms.domain.reservationStockInOrder.repository.po.ReservationStockInOrderPO;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.WmsServiceFeign;
import com.mhd.system.api.domain.InMaterialDetail;
import com.mhd.system.api.domain.PackDetailFeignPO;
import com.mhd.system.api.domain.StockInOrder;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
@@ -64,6 +68,8 @@ public class ReservationStockInOrderDomainService {
@Autowired
private SystemServiceFeign systemServiceFeign;
@Autowired
private WmsServiceFeign wmsServiceFeign;
@Autowired
private ReservationStockInOrderMapper reservationStockInOrderMapper;
// @Autowired
// private IReceiptMaterialDetailService receiptMaterialDetailService;
@@ -344,36 +350,66 @@ public class ReservationStockInOrderDomainService {
@Transactional(rollbackFor = Exception.class)
public Boolean auditState(ReservationStockInOrderDO stockInOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
//统计是否已经审核
int count = stockInOrderService.count(new QueryWrapper<ReservationStockInOrder>().lambda()
.eq(ReservationStockInOrder::getAuditStatus, 3)
.eq(ReservationStockInOrder::getDelFlag, 1)
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
if (count > 0){
throw new ServiceException("入库单已审核,请重新选择!");
}
//生成收货单
// if (stockInOrderDO.getAuditStatus() == 3){
// auditApprove(stockInOrderDO);
// }
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
return stockInOrderService.update(null, new UpdateWrapper<ReservationStockInOrder>().lambda()
.set(3 == stockInOrderDO.getAuditStatus(), ReservationStockInOrder::getStatus, 2)
.set(ReservationStockInOrder::getAuditStatus, stockInOrderDO.getAuditStatus())
.set(ReservationStockInOrder::getAuditRemark, stockInOrderDO.getAuditRemark())
.set(ReservationStockInOrder::getAuditBy, loginUser.getUserid())
.set(ReservationStockInOrder::getAuditByName, userRealName)
.set(ReservationStockInOrder::getAuditTime, new Date())
.set(ReservationStockInOrder::getReservationAuditId, loginUser.getUserid())
.set(ReservationStockInOrder::getReservationAuditName, userRealName)
.set(ReservationStockInOrder::getReservationAuditTime, new Date())
.set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid())
.set(ReservationStockInOrder::getUpdateByName, userRealName)
.set(ReservationStockInOrder::getUpdateTime, new Date())
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
}
/**
* @description 审核入库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockInOrderDO
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
public Boolean issueOrder(ReservationStockInOrderDO stockInOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
boolean update = stockInOrderService.update(null, new UpdateWrapper<ReservationStockInOrder>().lambda()
.set(ReservationStockInOrder::getIssueId, loginUser.getUserid())
.set(ReservationStockInOrder::getIssueName, userRealName)
.set(ReservationStockInOrder::getIssueTime, new Date())
.set(ReservationStockInOrder::getIssueStatus, 1)
.set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid())
.set(ReservationStockInOrder::getUpdateByName, userRealName)
.set(ReservationStockInOrder::getUpdateTime, new Date())
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
//todo下发推送到wms
List<Long> inOrderIds = stockInOrderDO.getInOrderIds();
for (Long inOrderId : inOrderIds) {
ReservationStockInOrder byId = stockInOrderService.getById(inOrderId);
StockInOrder stockInOrder = new StockInOrder();
BeanUtils.copyProperties(byId, stockInOrder);
wmsServiceFeign.omsInOrderAdd(stockInOrder);
String inOrderNumber = stockInOrder.getInOrderNumber();
List<ReservationInMaterialDetail> materialDetailList = materialDetailService.list(new QueryWrapper<ReservationInMaterialDetail>().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber));
List<InMaterialDetail> inMaterialDetailList = new ArrayList<>();
for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) {
InMaterialDetail inMaterialDetail = new InMaterialDetail();
BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail);
inMaterialDetailList.add(inMaterialDetail);
}
wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList);
}
return update;
}
/**
* @description 取消入库单
@@ -0,0 +1,423 @@
package com.mhd.oms.domain.reservationStockOutOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出库单对象 reservation_stock_out_order
*
* @author gen
* @date 2024-05-28
*/
@Data
public class ReservationStockOutOrder extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("出库单id")
@TableId(type = IdType.AUTO)
private Long outOrderId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核")
private Integer status;
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
@Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
private Integer auditStatus;
@ApiModelProperty("出库单审核备注")
@Excel(name = "出库单审核备注")
private String auditRemark;
@ApiModelProperty("出库单审核人")
@Excel(name = "出库单审核人")
private Long auditBy;
@ApiModelProperty("出库单审核人姓名")
@Excel(name = "出库单审核人姓名")
private String auditByName;
@ApiModelProperty("出库单审核时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date auditTime;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("出库单类型编码")
@Excel(name = "出库单类型编码")
private String orderTypeCode;
@ApiModelProperty("出库单类型名称")
@Excel(name = "出库单类型名称")
private String orderTypeName;
@ApiModelProperty("客户id")
@Excel(name = "客户id")
private Long customerId;
@ApiModelProperty("客户编码")
@Excel(name = "客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
@Excel(name = "客户名称")
private String customerName;
@ApiModelProperty("预计出货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
@Excel(name = "是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
@Excel(name = "是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("物料种数")
@Excel(name = "物料种数")
private Integer materialQuantity;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("已生成拣货单数量")
@Excel(name = "已生成拣货单分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("是否取消订单: 1-是 2-否")
@Excel(name = "是否取消订单: 1-是 2-否")
private Integer cancelOrder;
@ApiModelProperty("取消订单备注")
@Excel(name = "取消订单备注")
private String cancelRemark;
@ApiModelProperty("取消订单人")
@Excel(name = "取消订单人")
private Long cancelBy;
@ApiModelProperty("取消订单人姓名")
@Excel(name = "取消订单人姓名")
private String cancelByName;
@ApiModelProperty("取消订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date cancelTime;
@ApiModelProperty("是否关闭订单: 1-是 2-否")
@Excel(name = "是否关闭订单: 1-是 2-否")
private Integer closeOrder;
@ApiModelProperty("关闭订单备注")
@Excel(name = "关闭订单备注")
private String closeRemark;
@ApiModelProperty("关闭订单人")
@Excel(name = "关闭订单人")
private Long closeBy;
@ApiModelProperty("关闭订单人姓名")
@Excel(name = "关闭订单人姓名")
private String closeByName;
@ApiModelProperty("关闭订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date closeTime;
@ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核")
@Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核")
private Integer checkStatus;
@ApiModelProperty("复核任务是否下发: 1-是 2-否")
@Excel(name = "复核任务是否下发: 1-是 2-否")
private Integer checkTaskDistribution;
@ApiModelProperty("复核任务下发时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "复核任务下发时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date checkTaskDistributionTime;
@ApiModelProperty("复核作业人用户ID")
@Excel(name = "复核作业人用户ID")
private Long checkOperatorsBy;
@ApiModelProperty("复核作业人姓名")
@Excel(name = "复核作业人姓名")
private String checkOperatorsName;
@ApiModelProperty("调度单号")
@Excel(name = "调度单号")
private String mobilizeCode;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty("越库单id")
private Long overStockId;
@ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成")
@Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成")
private Integer overStockStatus;
@ApiModelProperty("越库类型:1-直接越库 2-分拨越库")
@Excel(name = "越库类型:1-直接越库 2-分拨越库")
private Long overStockType;
@ApiModelProperty("to")
@Excel(name = "to")
@TableField(value = "\"TO\"")
private String to;
@ApiModelProperty("联系人")
@Excel(name = "联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
@Excel(name = "车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号")
@Excel(name = "委托编号")
private String entrustNo;
@ApiModelProperty("Tel")
@Excel(name = "Tel")
private String tel;
@ApiModelProperty("司机签名")
@Excel(name = "司机签名")
private String driverSign;
@ApiModelProperty("Fax")
@Excel(name = "Fax")
private String fax;
@ApiModelProperty("申报地关区")
@Excel(name = "申报地关区")
private String declareCustoms;
@ApiModelProperty("生产商")
@Excel(name = "生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
@Excel(name = "报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
@Excel(name = "送货地址")
private String deliveryAddr;
@ApiModelProperty("进出境关别")
@Excel(name = "进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
@Excel(name = "起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("承运商")
@Excel(name = "承运商")
private String carrier;
@ApiModelProperty("承运商名称")
@Excel(name = "承运商名称")
private String carrierName;
@ApiModelProperty("柜号")
@Excel(name = "柜号")
private String containerNo;
@ApiModelProperty("")
@Excel(name = "")
private String containerNoName;
@ApiModelProperty("出仓日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("orderDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeCode;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeName;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeCode;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeName;
@ApiModelProperty("海关是否查验货物")
@Excel(name = "海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关")
@Excel(name = "是否需要报关")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输")
@Excel(name = "是否需要运输")
private String needTransportFlag;
@ApiModelProperty("app上传的图片")
private String pictureApp;
@ApiModelProperty("业务单号")
@Excel(name = "业务单号")
private String businessOrderNo;
@ApiModelProperty("业务类型")
@Excel(name = "业务类型")
private String businessType;
@ApiModelProperty("制单人")
@Excel(name = "制单人")
private String documentCreator;
@ApiModelProperty("制单人名称")
@Excel(name = "制单人名称")
private String documentCreatorName;
@ApiModelProperty("制单日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date documentDate;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -0,0 +1,44 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import java.util.List;
/**
* 出库单Service接口
*
* @author gen
* @date 2024-05-28
*/
public interface IReservationStockOutOrderService extends IService<ReservationStockOutOrder>
{
/**
* 分页查询出库单列表
*/
public List<ReservationStockOutOrderPO> queryList(ReservationStockOutOrderDO stockOutOrderDO);
/**
* 新增出库单
*/
public Boolean insert(ReservationStockOutOrderDO stockOutOrderDO);
/**
* 修改出库单
*/
public Boolean update(ReservationStockOutOrderDO stockOutOrderDO);
/**
* 批量删除出库单
*/
public Boolean delete(Long[] outOrderIds);
/**
* 查询出库单
*/
public ReservationStockOutOrderPO getInfo(Long outOrderId);
}
@@ -0,0 +1,27 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import com.mhd.oms.domain.reservationReservationStockOutOrder.entity.ReservationReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
//import com.mhd.wms.domain.stockOutOrder.entity.ReservationStockOutOrder;
//import com.mhd.wms.domain.stockOutOrder.repository.po.ReservationStockOutOrderPO;
//import com.mhd.wms.domain.stockOutOrder.repository.todo.ReservationStockOutOrderDO;
import java.util.List;
/**
* 出库单Mapper接口
*
* @author gen
* @date 2024-05-28
*/
public interface ReservationStockOutOrderMapper extends BaseMapper<ReservationStockOutOrder>
{
/**
* 查询出库单列表
*/
public List<ReservationStockOutOrderPO> queryList(ReservationStockOutOrderDO stockOutOrderDO);
}
@@ -0,0 +1,115 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.persistence;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.security.utils.SecurityUtils;
//import com.mhd.oms.domain.reservationReservationStockOutOrder.entity.ReservationReservationStockOutOrder;
//import com.mhd.oms.domain.reservationReservationStockOutOrder.repository.facade.IReservationReservationStockOutOrderService;
//import com.mhd.oms.domain.reservationReservationStockOutOrder.repository.mapper.ReservationReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.system.api.model.LoginUser;
//import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskTypeService;
//import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
//import com.mhd.wms.domain.stockOutOrder.entity.ReservationStockOutOrder;
//import com.mhd.wms.domain.stockOutOrder.repository.facade.IReservationStockOutOrderService;
//import com.mhd.wms.domain.stockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
//import com.mhd.wms.domain.stockOutOrder.repository.po.ReservationStockOutOrderPO;
//import com.mhd.wms.domain.stockOutOrder.repository.todo.ReservationStockOutOrderDO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 出库单Service业务层处理
*
* @author gen
* @date 2024-05-28
*/
@Service
public class ReservationStockOutOrderImpl extends ServiceImpl<ReservationStockOutOrderMapper, ReservationStockOutOrder> implements IReservationStockOutOrderService {
@Autowired
private ReservationStockOutOrderMapper reservationStockOutOrderMapper;
/**
* 查询出库单列表
*/
@Override
public List<ReservationStockOutOrderPO> queryList(ReservationStockOutOrderDO stockOutOrderDO)
{
return reservationStockOutOrderMapper.queryList(stockOutOrderDO);
}
/**
* 新增出库单
*/
@Override
public Boolean insert(ReservationStockOutOrderDO stockOutOrderDO) {
ReservationStockOutOrder stockOutOrder = new ReservationStockOutOrder();
BeanUtils.copyProperties(stockOutOrderDO,stockOutOrder);
return this.save(stockOutOrder);
}
/**
* 修改出库单
*/
@Override
public Boolean update(ReservationStockOutOrderDO stockOutOrderDO) {
ReservationStockOutOrder stockOutOrder = new ReservationStockOutOrder();
BeanUtils.copyProperties(stockOutOrderDO,stockOutOrder);
return this.updateById(stockOutOrder);
}
/**
* 批量删除出库单
*/
@Override
public Boolean delete(Long[] outOrderIds ) {
List<ReservationStockOutOrder> list = new ArrayList<>();
for (Long id : outOrderIds) {
ReservationStockOutOrder stockOutOrder = new ReservationStockOutOrder();
stockOutOrder.setOutOrderId(id);
stockOutOrder.setDelFlag(2);
list.add(stockOutOrder);
}
return this.updateBatchById(list);
}
/**
* 修改出库单
*/
@Override
public ReservationStockOutOrderPO getInfo(Long outOrderId) {
ReservationStockOutOrder stockOutOrder = this.getById(outOrderId);
ReservationStockOutOrderPO stockOutOrderPO = new ReservationStockOutOrderPO();
BeanUtils.copyProperties(stockOutOrder,stockOutOrderPO);
return stockOutOrderPO;
}
/**
* @description 更新订单任务下发状态
* @author ZhouGY
* @date 2024/8/1 13:56
* @param deliveTaskDO
* @return Boolean
*/
// @Override
// public Boolean handleDeliveTask(DeliveTaskDO deliveTaskDO) {
// LoginUser loginUser = SecurityUtils.getLoginUser();
// //标记收货单任务已下发
// return update(null, new UpdateWrapper<ReservationStockOutOrder>().lambda()
// .set(ReservationStockOutOrder::getCheckOperatorsBy, deliveTaskDO.getOperatorsBy())
// .set(ReservationStockOutOrder::getCheckOperatorsName, deliveTaskDO.getOperatorsName())
// .set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid())
// .set(ReservationStockOutOrder::getUpdateByName, loginUser.getUsername())
// .set(ReservationStockOutOrder::getUpdateTime, new Date())
// .eq(ReservationStockOutOrder::getOutOrderNumber, deliveTaskDO.getTrackingNumber()));
// }
}
@@ -0,0 +1,103 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.po;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author ZhouGY
* @title StockInOrderBasePO
* @description: TODO
* @date 2024/5/22 11:50
**/
@Data
public class ReservationStockOutOrderBasePO extends BaseVOEntity {
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("出库单类型编码")
@Excel(name = "出库单类型编码")
private String orderTypeCode;
@ApiModelProperty("出库单类型名称")
@Excel(name = "出库单类型名称")
private String orderTypeName;
@ApiModelProperty("客户id")
@Excel(name = "客户id")
private Long customerId;
@ApiModelProperty("客户编码")
@Excel(name = "客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
@Excel(name = "客户名称")
private String customerName;
@ApiModelProperty("预计出货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
@Excel(name = "是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
@Excel(name = "是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
}
@@ -0,0 +1,434 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.po;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
//import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO;
//import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
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;
import java.util.List;
/**
* 出库单对象 stock_out_order
*
* @author gen
* @date 2024-05-28
*/
@Data
@ApiModel(value = "出库单对象", description = "出库单响应对象")
public class ReservationStockOutOrderPO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("出库单id")
private Long outOrderId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
private Integer status;
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
@Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
private Integer auditStatus;
@ApiModelProperty("出库单审核备注")
@Excel(name = "出库单审核备注")
private String auditRemark;
@ApiModelProperty("出库单审核人")
@Excel(name = "出库单审核人")
private Long auditBy;
@ApiModelProperty("出库单审核人姓名")
@Excel(name = "出库单审核人姓名")
private String auditByName;
@ApiModelProperty("出库单审核时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date auditTime;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("出库单类型编码")
@Excel(name = "出库单类型编码")
private String orderTypeCode;
@ApiModelProperty("出库单类型名称")
@Excel(name = "出库单类型名称")
private String orderTypeName;
@ApiModelProperty("客户id")
@Excel(name = "客户id")
private Long customerId;
@ApiModelProperty("客户编码")
@Excel(name = "客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
@Excel(name = "客户名称")
private String customerName;
@ApiModelProperty("预计出货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
@Excel(name = "是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
@Excel(name = "是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("物料种数")
@Excel(name = "物料种数")
private Integer materialQuantity;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("已生成拣货单数量")
@Excel(name = "已生成拣货单分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("是否取消订单: 1-是 2-否")
@Excel(name = "是否取消订单: 1-是 2-否")
private Integer cancelOrder;
@ApiModelProperty("取消订单备注")
@Excel(name = "取消订单备注")
private String cancelRemark;
@ApiModelProperty("取消订单人")
@Excel(name = "取消订单人")
private Long cancelBy;
@ApiModelProperty("取消订单人姓名")
@Excel(name = "取消订单人姓名")
private String cancelByName;
@ApiModelProperty("取消订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date cancelTime;
@ApiModelProperty("是否关闭订单: 1-是 2-否")
@Excel(name = "是否关闭订单: 1-是 2-否")
private Integer closeOrder;
@ApiModelProperty("关闭订单备注")
@Excel(name = "关闭订单备注")
private String closeRemark;
@ApiModelProperty("关闭订单人")
@Excel(name = "关闭订单人")
private Long closeBy;
@ApiModelProperty("关闭订单人姓名")
@Excel(name = "关闭订单人姓名")
private String closeByName;
@ApiModelProperty("关闭订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date closeTime;
@ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核")
@Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核")
private Integer checkStatus;
@ApiModelProperty("复核任务是否下发: 1-是 2-否")
@Excel(name = "复核任务是否下发: 1-是 2-否")
private Integer checkTaskDistribution;
@ApiModelProperty("复核任务下发时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "复核任务下发时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date checkTaskDistributionTime;
@ApiModelProperty("复核作业人用户ID")
@Excel(name = "复核作业人用户ID")
private Long checkOperatorsBy;
@ApiModelProperty("复核作业人姓名")
@Excel(name = "复核作业人姓名")
private String checkOperatorsName;
@ApiModelProperty("调度单号")
@Excel(name = "调度单号")
private String mobilizeCode;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty("物料明细")
private List<ReservationOutMaterialDetailPO> materialDetailList;
//
// @ApiModelProperty("出库单复核统计")
// private ReservationOutMaterialCheckPO outMaterialCheckPO;
@ApiModelProperty("越库单id")
private Long overStockId;
@ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成")
@Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成")
private Integer overStockStatus;
@ApiModelProperty("越库类型:1-直接越库 2-分拨越库")
@Excel(name = "越库类型:1-直接越库 2-分拨越库")
private Long overStockType;
@ApiModelProperty("to")
@Excel(name = "to")
private String to;
@ApiModelProperty("联系人")
@Excel(name = "联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
@Excel(name = "车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号")
@Excel(name = "委托编号")
private String entrustNo;
@ApiModelProperty("Tel")
@Excel(name = "Tel")
private String tel;
@ApiModelProperty("司机签名")
@Excel(name = "司机签名")
private String driverSign;
@ApiModelProperty("Fax")
@Excel(name = "Fax")
private String fax;
@ApiModelProperty("申报地关区")
@Excel(name = "申报地关区")
private String declareCustoms;
@ApiModelProperty("生产商")
@Excel(name = "生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
@Excel(name = "报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
@Excel(name = "送货地址")
private String deliveryAddr;
@ApiModelProperty("进出境关别")
@Excel(name = "进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
@Excel(name = "起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("承运商")
@Excel(name = "承运商")
private String carrier;
@ApiModelProperty("柜号")
@Excel(name = "柜号")
private String containerNo;
@ApiModelProperty("")
@Excel(name = "")
private String containerNoName;
@ApiModelProperty("出仓日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("orderDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeCode;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeName;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeCode;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeName;
@ApiModelProperty("海关是否查验货物")
@Excel(name = "海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关")
@Excel(name = "是否需要报关")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输")
@Excel(name = "是否需要运输")
private String needTransportFlag;
@ApiModelProperty("出库交接图片,PDA出库交接时上传的照片,多张图片以逗号隔开")
private String pictureApp;
@ApiModelProperty("出库总数量")
private BigDecimal totalOutboundQuantity;
@ApiModelProperty("业务单号")
@Excel(name = "业务单号")
private String businessOrderNo;
@ApiModelProperty("业务类型")
@Excel(name = "业务类型")
private String businessType;
@ApiModelProperty("制单人")
@Excel(name = "制单人")
private String documentCreator;
@ApiModelProperty("制单人名称")
@Excel(name = "制单人名称")
private String documentCreatorName;
@ApiModelProperty("制单日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date documentDate;
@ApiModelProperty("承运商名称")
@Excel(name = "承运商名称")
private String carrierName;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -0,0 +1,73 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.todo;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author ZhouGY
* @title AllocationSowingWallDO
* @description: 播种分货
* @date 2024/6/5 14:29
**/
@Data
public class AllocationByOrderDO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("物料编码/物料条码/序列号")
@Excel(name = "物料编码/物料条码/序列号")
private String materialNumber;
@ApiModelProperty("是否单件扫描:1-是 2-否")
@Excel(name = "是否单件扫描:1-是 2-否")
private Integer singleScan;
@ApiModelProperty("数量EA")
@Excel(name = "数量EA")
private BigDecimal quantity;
@ApiModelProperty("集货仓库id")
@Excel(name = "集货仓库id")
private Long warehouseId;
@ApiModelProperty("集货仓库编码")
@Excel(name = "集货仓库编码")
private String warehouseCode;
@ApiModelProperty("集货仓库名称")
@Excel(name = "集货仓库名称")
private String warehouseName;
@ApiModelProperty("集货库区id")
@Excel(name = "集货库区id")
private Long storageSectionId;
@ApiModelProperty("集货库区编码")
@Excel(name = "集货库区编码")
private String storageCode;
@ApiModelProperty("集货库区名称")
@Excel(name = "集货库区名称")
private String storageName;
@ApiModelProperty("集货库位id")
@Excel(name = "集货库位id")
private Long storageLocationId;
@ApiModelProperty("集货库位编码")
@Excel(name = "集货库位编码")
private String storageLocationCode;
@ApiModelProperty("集货库位名称")
@Excel(name = "集货库位名称")
private String storageLocationName;
}
@@ -0,0 +1,109 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
//import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @author ZhouGY
* @title StockInOrderBasePO
* @description: TODO
* @date 2024/5/22 11:50
**/
@Data
public class ReservationStockOutOrderBaseDO extends BaseVOEntity {
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("入库单类型编码")
@Excel(name = "入库单类型编码")
private String orderTypeCode;
@ApiModelProperty("入库单类型名称")
@Excel(name = "入库单类型名称")
private String orderTypeName;
@ApiModelProperty("供应商id")
@Excel(name = "供应商id")
private Long supplierId;
@ApiModelProperty("供应商编码")
@Excel(name = "供应商编码")
private String supplierCode;
@ApiModelProperty("供应商名称")
@Excel(name = "供应商名称")
private String supplierName;
@ApiModelProperty("预计到货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计到货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接入库: 1-是 2-否")
@Excel(name = "是否直接入库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("物料明细")
private List<ReservationOutMaterialDetailDO> materialDetailList;
}
@@ -0,0 +1,103 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author ZhouGY
* @title StockInOrderBasePO
* @description: TODO
* @date 2024/5/22 11:50
**/
@Data
public class ReservationStockOutOrderBaseDTO extends BaseVOEntity {
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("入库单类型编码")
@Excel(name = "入库单类型编码")
private String orderTypeCode;
@ApiModelProperty("入库单类型名称")
@Excel(name = "入库单类型名称")
private String orderTypeName;
@ApiModelProperty("供应商id")
@Excel(name = "供应商id")
private Long supplierId;
@ApiModelProperty("供应商编码")
@Excel(name = "供应商编码")
private String supplierCode;
@ApiModelProperty("供应商名称")
@Excel(name = "供应商名称")
private String supplierName;
@ApiModelProperty("预计到货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计到货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接入库: 1-是 2-否")
@Excel(name = "是否直接入库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
}
@@ -0,0 +1,470 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
//import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 出库单对象 stock_out_order
*
* @author gen
* @date 2024-05-28
*/
@Data
public class ReservationStockOutOrderDO extends BaseVOEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("出库单id")
private Long outOrderId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
private Integer status;
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
@Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
private Integer auditStatus;
@ApiModelProperty("出库单审核备注")
@Excel(name = "出库单审核备注")
private String auditRemark;
@ApiModelProperty("出库单审核人")
@Excel(name = "出库单审核人")
private Long auditBy;
@ApiModelProperty("出库单审核人姓名")
@Excel(name = "出库单审核人姓名")
private String auditByName;
@ApiModelProperty("出库单审核时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date auditTime;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("出库单类型编码")
@Excel(name = "出库单类型编码")
private String orderTypeCode;
@ApiModelProperty("出库单类型名称")
@Excel(name = "出库单类型名称")
private String orderTypeName;
@ApiModelProperty("客户id")
@Excel(name = "客户id")
private Long customerId;
@ApiModelProperty("客户编码")
@Excel(name = "客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
@Excel(name = "客户名称")
private String customerName;
@ApiModelProperty("预计出货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
@Excel(name = "是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
@Excel(name = "是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("物料种数")
@Excel(name = "物料种数")
private Integer materialQuantity;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("已生成拣货单数量")
@Excel(name = "已生成拣货单分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("是否取消订单: 1-是 2-否")
@Excel(name = "是否取消订单: 1-是 2-否")
private Integer cancelOrder;
@ApiModelProperty("取消订单备注")
@Excel(name = "取消订单备注")
private String cancelRemark;
@ApiModelProperty("取消订单人")
@Excel(name = "取消订单人")
private Long cancelBy;
@ApiModelProperty("取消订单人姓名")
@Excel(name = "取消订单人姓名")
private String cancelByName;
@ApiModelProperty("取消订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date cancelTime;
@ApiModelProperty("是否关闭订单: 1-是 2-否")
@Excel(name = "是否关闭订单: 1-是 2-否")
private Integer closeOrder;
@ApiModelProperty("关闭订单备注")
@Excel(name = "关闭订单备注")
private String closeRemark;
@ApiModelProperty("关闭订单人")
@Excel(name = "关闭订单人")
private Long closeBy;
@ApiModelProperty("关闭订单人姓名")
@Excel(name = "关闭订单人姓名")
private String closeByName;
@ApiModelProperty("关闭订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date closeTime;
@ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核")
@Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核")
private Integer checkStatus;
@ApiModelProperty("复核任务是否下发: 1-是 2-否")
@Excel(name = "复核任务是否下发: 1-是 2-否")
private Integer checkTaskDistribution;
@ApiModelProperty("复核任务下发时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "复核任务下发时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date checkTaskDistributionTime;
@ApiModelProperty("复核作业人用户ID")
@Excel(name = "复核作业人用户ID")
private Long checkOperatorsBy;
@ApiModelProperty("复核作业人姓名")
@Excel(name = "复核作业人姓名")
private String checkOperatorsName;
@ApiModelProperty("调度单号")
@Excel(name = "调度单号")
private String mobilizeCode;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
@ApiModelProperty("出库单id集合")
private List<Long> outOrderIds;
@ApiModelProperty("物料明细")
private List<ReservationOutMaterialDetailDO> materialDetailList;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("序列号")
@Excel(name = "序列号")
private String serialNumber;
@ApiModelProperty("物料审核数量")
@Excel(name = "物料审核数量")
private BigDecimal actualQuantity;
@ApiModelProperty("波次类型编码")
private String waveOrderTypeCode;
@ApiModelProperty("出库状态大于某个状态")
private Integer gtStatus;
@ApiModelProperty("出库状态小于某个状态")
private Integer ltStatus;
@ApiModelProperty("大于复核状态: 1-未复核 2-复核中 3-已复核")
private Integer gtCheckStatus;
@ApiModelProperty("小于复核状态: 1-未复核 2-复核中 3-已复核")
private Integer ltCheckStatus;
@ApiModelProperty("PDA复核查询tab: 1-列表(待复核) 2-历史记录(已复核)")
private Integer tabType;
@ApiModelProperty("to")
@Excel(name = "to")
private String to;
@ApiModelProperty("联系人")
@Excel(name = "联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
@Excel(name = "车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号")
@Excel(name = "委托编号")
private String entrustNo;
@ApiModelProperty("Tel")
@Excel(name = "Tel")
private String tel;
@ApiModelProperty("司机签名")
@Excel(name = "司机签名")
private String driverSign;
@ApiModelProperty("Fax")
@Excel(name = "Fax")
private String fax;
@ApiModelProperty("申报地关区")
@Excel(name = "申报地关区")
private String declareCustoms;
@ApiModelProperty("生产商")
@Excel(name = "生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
@Excel(name = "报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
@Excel(name = "送货地址")
private String deliveryAddr;
@ApiModelProperty("进出境关别")
@Excel(name = "进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
@Excel(name = "起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("承运商")
@Excel(name = "承运商")
private String carrier;
@ApiModelProperty("柜号")
@Excel(name = "柜号")
private String containerNo;
@ApiModelProperty("")
@Excel(name = "")
private String containerNoName;
@ApiModelProperty("出仓日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("orderDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeCode;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeName;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeCode;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeName;
@ApiModelProperty("海关是否查验货物")
@Excel(name = "海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关")
@Excel(name = "是否需要报关")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输")
@Excel(name = "是否需要运输")
private String needTransportFlag;
@ApiModelProperty(name = "创建时间查询条件开始日期")
private String createTimeStart;
@ApiModelProperty(name = "创建时间查询条件结束日期")
private String createTimeEnd;
@ApiModelProperty(name = "审核时间查询条件开始日期")
private String auditTimeStart;
@ApiModelProperty(name = "审核时间查询条件结束日期")
private String auditTimeEnd;
@ApiModelProperty("出库明细-物料名称(商品名称),模糊匹配")
private String materialName;
@ApiModelProperty("出库明细-物料编码,模糊匹配")
private String materialCode;
@ApiModelProperty(name = "已分配数量总数量")
private BigDecimal alreadyAllocationQuantityAll;
@ApiModelProperty("业务单号")
@Excel(name = "业务单号")
private String businessOrderNo;
@ApiModelProperty("业务类型")
@Excel(name = "业务类型")
private String businessType;
@ApiModelProperty("制单人")
@Excel(name = "制单人")
private String documentCreator;
@ApiModelProperty("制单人名称")
@Excel(name = "制单人名称")
private String documentCreatorName;
@ApiModelProperty("制单日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date documentDate;
@ApiModelProperty("承运商名称")
@Excel(name = "承运商名称")
private String carrierName;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -0,0 +1,459 @@
package com.mhd.oms.domain.reservationStockOutOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
//import com.mhd.wms.interfaces.dto.outMaterialDetail.OutMaterialDetailDTO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 出库单对象 stock_out_order
*
* @author gen
* @date 2024-05-28
*/
@Data
public class ReservationStockOutOrderDTO extends ReservationStockOutOrderBaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("出库单id")
private Long outOrderId;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("通知单号")
@Excel(name = "通知单号")
private String noticeNumber;
@ApiModelProperty("出库单号")
@Excel(name = "出库单号")
private String outOrderNumber;
@ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
@Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭")
private Integer status;
@ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
@Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过")
private Integer auditStatus;
@ApiModelProperty("出库单审核备注")
@Excel(name = "出库单审核备注")
private String auditRemark;
@ApiModelProperty("出库单审核人")
@Excel(name = "出库单审核人")
private Long auditBy;
@ApiModelProperty("出库单审核人姓名")
@Excel(name = "出库单审核人姓名")
private String auditByName;
@ApiModelProperty("出库单审核时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "出库单审核时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date auditTime;
@ApiModelProperty("仓库id")
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@ApiModelProperty("仓库名称")
@Excel(name = "仓库名称")
private String warehouseName;
@ApiModelProperty("货主id")
@Excel(name = "货主id")
private Long shipperId;
@ApiModelProperty("货主编码")
@Excel(name = "货主编码")
private String shipperCode;
@ApiModelProperty("货主名称")
@Excel(name = "货主名称")
private String shipperName;
@ApiModelProperty("出库单类型编码")
@Excel(name = "出库单类型编码")
private String orderTypeCode;
@ApiModelProperty("出库单类型名称")
@Excel(name = "出库单类型名称")
private String orderTypeName;
@ApiModelProperty("客户id")
@Excel(name = "客户id")
private Long customerId;
@ApiModelProperty("客户编码")
@Excel(name = "客户编码")
private String customerCode;
@ApiModelProperty("客户名称")
@Excel(name = "客户名称")
private String customerName;
@ApiModelProperty("预计出货时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "预计出货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date expectTime;
@ApiModelProperty("供应链订单号")
@Excel(name = "供应链订单号")
private String supplyChainNumber;
@ApiModelProperty("优先级别编码")
@Excel(name = "优先级别编码")
private String priorityLevelCode;
@ApiModelProperty("优先级别名称")
@Excel(name = "优先级别名称")
private String priorityLevelName;
@ApiModelProperty("是否直接出库: 1-是 2-否")
@Excel(name = "是否直接出库: 1-是 2-否")
private Integer directWarehouse;
@ApiModelProperty("是否复核: 1-是 2-否")
@Excel(name = "是否复核: 1-是 2-否")
private Integer review;
@ApiModelProperty("附件url")
@Excel(name = "附件url")
private String annexUrl;
@ApiModelProperty("物料种数")
@Excel(name = "物料种数")
private Integer materialQuantity;
@ApiModelProperty("计划数量")
@Excel(name = "计划数量")
private BigDecimal quantity;
@ApiModelProperty("净重 单位:千克")
@Excel(name = "净重 单位:千克")
private BigDecimal weightLimit;
@ApiModelProperty("体积 单位:立方米")
@Excel(name = "体积 单位:立方米")
private BigDecimal volumeLimit;
@ApiModelProperty("分配数量")
@Excel(name = "分配数量")
private BigDecimal allocationQuantity;
@ApiModelProperty("已生成拣货单数量")
@Excel(name = "已生成拣货单分配数量")
private BigDecimal alreadyAllocationQuantity;
@ApiModelProperty("拣货数量")
@Excel(name = "拣货数量")
private BigDecimal pickingQuantity;
@ApiModelProperty("复核数量")
@Excel(name = "复核数量")
private BigDecimal checkQuantity;
@ApiModelProperty("是否取消订单: 1-是 2-否")
@Excel(name = "是否取消订单: 1-是 2-否")
private Integer cancelOrder;
@ApiModelProperty("取消订单备注")
@Excel(name = "取消订单备注")
private String cancelRemark;
@ApiModelProperty("取消订单人")
@Excel(name = "取消订单人")
private Long cancelBy;
@ApiModelProperty("取消订单人姓名")
@Excel(name = "取消订单人姓名")
private String cancelByName;
@ApiModelProperty("取消订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date cancelTime;
@ApiModelProperty("是否关闭订单: 1-是 2-否")
@Excel(name = "是否关闭订单: 1-是 2-否")
private Integer closeOrder;
@ApiModelProperty("关闭订单备注")
@Excel(name = "关闭订单备注")
private String closeRemark;
@ApiModelProperty("关闭订单人")
@Excel(name = "关闭订单人")
private Long closeBy;
@ApiModelProperty("关闭订单人姓名")
@Excel(name = "关闭订单人姓名")
private String closeByName;
@ApiModelProperty("关闭订单时间")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "关闭订单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date closeTime;
@ApiModelProperty("复核状态: 1-未复核 2-复核中 3-已复核")
@Excel(name = "复核状态: 1-未复核 2-复核中 3-已复核")
private Integer checkStatus;
@ApiModelProperty("复核任务是否下发: 1-是 2-否")
@Excel(name = "复核任务是否下发: 1-是 2-否")
private Integer checkTaskDistribution;
@ApiModelProperty("复核任务下发时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "复核任务下发时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date checkTaskDistributionTime;
@ApiModelProperty("复核作业人用户ID")
@Excel(name = "复核作业人用户ID")
@JsonAlias({"checkOperatorId", "operatorId"})
private Long checkOperatorsBy;
@ApiModelProperty("复核作业人姓名")
@Excel(name = "复核作业人姓名")
private String checkOperatorsName;
@ApiModelProperty("调度单号")
@Excel(name = "调度单号")
private String mobilizeCode;
@ApiModelProperty("备注")
@Excel(name = "备注")
private String remark;
@ApiModelProperty(name = "组织ID集合")
private List<Long> organizationIdList;
@ApiModelProperty(name = "权限菜单ID")
private Long permissionMenuId;
@ApiModelProperty("出库单id集合")
private List<Long> outOrderIds;
@ApiModelProperty("物料明细")
private List<ReservationOutMaterialDetailDTO> materialDetailList;
@ApiModelProperty("物料条形码")
@Excel(name = "物料条形码")
private String barCode;
@ApiModelProperty("物料审核数量")
@Excel(name = "物料审核数量")
private BigDecimal actualQuantity;
@ApiModelProperty("波次类型编码")
private String waveOrderTypeCode;
@ApiModelProperty("大于复核状态: 1-未复核 2-复核中 3-已复核")
private Integer gtCheckStatus;
@ApiModelProperty("小于复核状态: 1-未复核 2-复核中 3-已复核")
private Integer ltCheckStatus;
@ApiModelProperty("PDA复核查询tab: 1-列表(待复核) 2-历史记录(已复核)")
private Integer tabType;
@ApiModelProperty("to")
@Excel(name = "to")
private String to;
@ApiModelProperty("联系人")
@Excel(name = "联系人")
private String contactPerson;
@ApiModelProperty("车型及车牌")
@Excel(name = "车型及车牌")
private String vehicleModelPlate;
@ApiModelProperty("委托编号")
@Excel(name = "委托编号")
private String entrustNo;
@ApiModelProperty("Tel")
@Excel(name = "Tel")
private String tel;
@ApiModelProperty("司机签名")
@Excel(name = "司机签名")
private String driverSign;
@ApiModelProperty("Fax")
@Excel(name = "Fax")
private String fax;
@ApiModelProperty("申报地关区")
@Excel(name = "申报地关区")
private String declareCustoms;
@ApiModelProperty("生产商")
@Excel(name = "生产商")
private String manufacturer;
@ApiModelProperty("报关员姓名及联系方式")
@Excel(name = "报关员姓名及联系方式")
private String customsDeclarerInfo;
@ApiModelProperty("送货地址")
@Excel(name = "送货地址")
private String deliveryAddr;
@ApiModelProperty("进出境关别")
@Excel(name = "进出境关别")
private String entryExitCustoms;
@ApiModelProperty("起运/运抵国(地区)")
@Excel(name = "起运/运抵国(地区)")
private String departureArrivalCountry;
@ApiModelProperty("承运商")
@Excel(name = "承运商")
private String carrier;
@ApiModelProperty("柜号")
@Excel(name = "柜号")
private String containerNo;
@ApiModelProperty("")
@Excel(name = "")
private String containerNoName;
@ApiModelProperty("出仓日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date outboundDate;
@ApiModelProperty("完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date completeTime;
@ApiModelProperty("orderDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "orderDate", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date orderDate;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeCode;
@ApiModelProperty("运输方式")
@Excel(name = "运输方式")
private String transportModeName;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeCode;
@ApiModelProperty("监管方式")
@Excel(name = "监管方式")
private String supervisionModeName;
@ApiModelProperty("海关是否查验货物")
@Excel(name = "海关是否查验货物")
private String customsInspectionFlag;
@ApiModelProperty("是否需要报关")
@Excel(name = "是否需要报关")
private String needDeclareFlag;
@ApiModelProperty("是否需要运输")
@Excel(name = "是否需要运输")
private String needTransportFlag;
@ApiModelProperty(name = "创建时间查询条件开始日期")
private String createTimeStart;
@ApiModelProperty(name = "创建时间查询条件结束日期")
private String createTimeEnd;
@ApiModelProperty(name = "审核时间查询条件开始日期")
private String auditTimeStart;
@ApiModelProperty(name = "审核时间查询条件结束日期")
private String auditTimeEnd;
@ApiModelProperty("出库明细-物料名称(商品名称),模糊匹配,与前端参数 materialName 一致")
private String materialName;
@ApiModelProperty("出库明细-物料编码,模糊匹配,与前端参数 materialCode 一致")
private String materialCode;
@ApiModelProperty("出库交接图片,PDA出库交接时上传的照片,多张图片以逗号隔开")
private String pictureApp;
@ApiModelProperty("业务单号")
@Excel(name = "业务单号")
private String businessOrderNo;
@ApiModelProperty("业务类型")
@Excel(name = "业务类型")
private String businessType;
@ApiModelProperty("制单人")
@Excel(name = "制单人")
private String documentCreator;
@ApiModelProperty("制单人名称")
@Excel(name = "制单人名称")
private String documentCreatorName;
@ApiModelProperty("制单日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Excel(name = "制单日期", width = 30, dateFormat = "yyyy-MM-dd")
private Date documentDate;
@ApiModelProperty("承运商名称")
@Excel(name = "承运商名称")
private String carrierName;
@ApiModelProperty( "下发状态 0-无状态 1-未下发 2-已下发 ")
private Long issueStatus;
@ApiModelProperty("下发时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date issueTime;
@ApiModelProperty("下发人id")
private Long issueId;
@ApiModelProperty("下发人")
private String issueName;
@ApiModelProperty("预约审核人id")
private Long reservationAuditId;
@ApiModelProperty("预约审核人id")
private String reservationAuditName;
@ApiModelProperty("预约审核时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date reservationAuditTime;
}
@@ -0,0 +1,987 @@
package com.mhd.oms.domain.reservationStockOutOrder.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mhd.common.core.constant.SnowFlakeConstants;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.enums.DictCode;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.IgnoreNullUtil;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.utils.uuid.IdGenerator;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.reservationOutMaterialDetail.entity.ReservationOutMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.facade.IReservationOutMaterialDetailService;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.service.ReservationOutMaterialDetailDomainService;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.UserServiceFeign;
import com.mhd.system.api.domain.*;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.function.Function;
import java.util.stream.Collectors;
/**
* 出库单ApplicationService
*
* @author gen
* @date 2024-05-28
*/
@Service
@Slf4j
public class ReservationStockOutOrderApplicationService {
@Autowired
private ReservationStockOutOrderDomainService stockOutOrderDomainService;
// @Autowired
// private ReservationOutMaterialDetailDomainService outMaterialDetailDomainService;
// @Autowired
// private MaterialInventoryDomainService materialInventoryDomainService;
// @Autowired
// private MaterialInventoryMapper materialInventoryMapper;
@Autowired
private UserServiceFeign userServiceFeign;
@Autowired
private SystemServiceFeign systemServiceFeign;
@Autowired
private IdGenerator idGenerator;
@Autowired
private IReservationStockOutOrderService stockOutOrderService;
@Autowired
private IReservationOutMaterialDetailService outMaterialDetailService;
// @Autowired
// private IPickingMaterialDetailService pickingMaterialDetailService;
/**
* 分页查询出库单列表
*/
public List<ReservationStockOutOrderPO> queryList(ReservationStockOutOrderDO stockOutOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = stockOutOrderDO.getOrganizationId(); // 前端传递的 organizationId
// 数据权限根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 2827 可查全部组织数据其他组织只能查自己
if (userOrganizationId != null && userOrganizationId == 2827L) {
// 南光组织organizationId=2827可以查询所有组织的数据
// 如果前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
// 如果前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织使用前端传递的值进行过滤
stockOutOrderDO.setOrganizationId(frontendOrganizationId);
stockOutOrderDO.setTopOrganizationId(null); // 明确设置为 null避免使用 topOrganizationId 条件
} else {
// 前端没有传递 organizationId清空组织过滤条件查询所有组织的数据
stockOutOrderDO.setOrganizationId(null);
stockOutOrderDO.setTopOrganizationId(null);
}
} else {
// 其他组织设置organizationId只查询当前组织的数据
// 如果前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (frontendOrganizationId != null && userOrganizationId != null) {
// 前端传递了 organizationId验证是否与当前登录用户的组织ID一致
if (!frontendOrganizationId.equals(userOrganizationId)) {
// 前端传递了其他组织的 organizationId强制使用当前登录用户的组织ID防止越权查询
stockOutOrderDO.setOrganizationId(userOrganizationId);
}
// 如果前端传递的 organizationId 与当前登录用户的组织ID一致使用前端传递的值
} else {
// 前端没有传递 organizationId使用当前登录用户的组织ID
if (userOrganizationId != null) {
stockOutOrderDO.setOrganizationId(userOrganizationId);
}
}
// 只有当 organizationId null 才使用 topOrganizationId 作为查询条件
// 如果 organizationId 不为 null则优先使用 organizationId不使用 topOrganizationId
if (stockOutOrderDO.getOrganizationId() == null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
stockOutOrderDO.setTopOrganizationId(topOrganizationId);
}
} else {
// 对于非2827组织必须设置 topOrganizationId=2827
stockOutOrderDO.setTopOrganizationId(2827L);
}
}
}
// 库管角色过滤不展示已创建status=1的出库单
// 出库状态: 1-已创建 ...
if (loginUser != null) {
String targetRoleCode = "KGY-001";
boolean isKuGuan = false;
String roleCode = loginUser.getUserPo() != null ? loginUser.getUserPo().getRoleCode() : null;
if (StringUtils.isNotBlank(roleCode) && roleCode.contains(targetRoleCode)) {
isKuGuan = true;
}
if (!isKuGuan && loginUser.getRoleList() != null) {
isKuGuan = loginUser.getRoleList().stream()
.anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode));
}
if (!isKuGuan && loginUser.getRoles() != null) {
isKuGuan = loginUser.getRoles().stream()
.anyMatch(rc -> StringUtils.isNotBlank(rc) && rc.contains(targetRoleCode));
}
if (isKuGuan) {
Integer currentGtStatus = stockOutOrderDO.getGtStatus();
if (currentGtStatus == null || currentGtStatus < 1) {
stockOutOrderDO.setGtStatus(1); // status > 1
}
}
}
List<ReservationStockOutOrderPO> stockOutOrderPOS = stockOutOrderDomainService.queryList(stockOutOrderDO);
// for (ReservationStockOutOrderPO stockOutOrderPO : stockOutOrderPOS) {
// ReservationStockOutOrderPO stockOutOrderPO1 = stockOutOrderDomainService.getInfoChildren(stockOutOrderPO.getOutOrderId());
// List<ReservationOutMaterialDetailPO> materialDetailList = stockOutOrderPO1 != null ? stockOutOrderPO1.getMaterialDetailList() : null;
// if (materialDetailList == null) {
// materialDetailList = Collections.emptyList();
// }
// BigDecimal reduce = materialDetailList.stream().map(ReservationOutMaterialDetailPO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
// stockOutOrderPO.setTotalOutboundQuantity(reduce);
// stockOutOrderPO.setAllocationQuantity(stockOutOrderPO1 != null ? stockOutOrderPO1.getAllocationQuantity() : null);
// String outOrderNumber = stockOutOrderPO.getOutOrderNumber();
// // PDA复核物料总数量使用实际下发时的拣货完成数量picking_material_detail拣货多少显示多少
// // PDA端物料总数量取quantity字段复核总数量取checkQuantity字段需同时设置quantity和pickingQuantity
// BigDecimal actualPickingQty = pickingMaterialDetailService.sumPickingQuantityByOutOrderNumber(outOrderNumber);
// BigDecimal displayPickingQty = actualPickingQty.compareTo(BigDecimal.ZERO) > 0 ? actualPickingQty : (stockOutOrderPO1 != null ? stockOutOrderPO1.getPickingQuantity() : BigDecimal.ZERO);
// stockOutOrderPO.setPickingQuantity(displayPickingQty);
// stockOutOrderPO.setQuantity(displayPickingQty);
// // 物料种类优先从picking_material_detail统计为0时从out_material_detail按料号去重
// Integer materialTypeCount = pickingMaterialDetailService.countMaterialTypesByOutOrderNumber(outOrderNumber);
// if (materialTypeCount != null && materialTypeCount > 0) {
// stockOutOrderPO.setMaterialQuantity(materialTypeCount);
// } else {
// long count = materialDetailList.stream()
// .map(d -> d.getMaterialBaseInfoId() != null ? String.valueOf(d.getMaterialBaseInfoId()) : d.getMaterialCode())
// .filter(Objects::nonNull)
// .distinct()
// .count();
// stockOutOrderPO.setMaterialQuantity((int) count);
// }
// // 复核总数量从out_material_detail汇总check_quantity
// BigDecimal checkSum = materialDetailList.stream().map(ReservationOutMaterialDetailPO::getCheckQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
// stockOutOrderPO.setCheckQuantity(checkSum);
// }
return stockOutOrderPOS;
}
/**
* 新增出库单
*/
public Boolean insert(ReservationStockOutOrderDO stockOutOrderDO) {
//设置仓库
//setWarehouseInfo(stockOutOrderDO);
//设置货主信息
shipperParam(stockOutOrderDO);
//设置客户信息
customerParam(stockOutOrderDO);
stockOutOrderDO.setOrderTypeCode("pu_tong_chu_ku");
stockOutOrderDO.setOrderTypeName("普通出库");
//设置数据字典键值
//setDataDict(stockOutOrderDO);
return stockOutOrderDomainService.insert(stockOutOrderDO);
}
/**
* 修改出库单
*/
public Boolean update(ReservationStockOutOrderDO stockOutOrderDO) {
return stockOutOrderDomainService.update(stockOutOrderDO);
}
/**
* 修改出库单
*/
public Boolean close(ReservationStockOutOrderDO stockOutOrderDO) {
return stockOutOrderDomainService.close(stockOutOrderDO);
}
/**
* 批量删除出库单
*/
public boolean delete(Long[] outOrderIds) {
return stockOutOrderDomainService.delete(outOrderIds);
}
/**
* 获取出库单详细信息带批次属性
*/
public ReservationStockOutOrderPO getInfoChildren(Long outOrderId)
{
ReservationStockOutOrderPO stockOutOrderPO = stockOutOrderDomainService.getInfoChildren(outOrderId);
if (stockOutOrderPO == null || CollectionUtils.isEmpty(stockOutOrderPO.getMaterialDetailList())) {
return stockOutOrderPO;
}
List<ReservationOutMaterialDetailPO> detailList = stockOutOrderPO.getMaterialDetailList();
// 性能优化批量获取批次属性避免N+1查询问题
// 1. 收集所有唯一的materialBaseInfoId
Set<Long> materialBaseInfoIdSet = detailList.stream()
.map(ReservationOutMaterialDetailPO::getMaterialBaseInfoId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 2. 批量查询批次属性使用Map缓存避免重复查询相同的materialBaseInfoId
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
for (Long materialBaseInfoId : materialBaseInfoIdSet) {
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(
JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) {
// 过滤isDisplay=1的属性
List<BatchDetailFeignPO> filteredList = batchDetailFeignPOList.stream()
.filter(batchDetail -> batchDetail.getIsDisplay() != null && batchDetail.getIsDisplay() == 1)
.collect(Collectors.toList());
batchDetailMap.put(materialBaseInfoId, filteredList);
}
}
} catch (Exception e) {
log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
}
}
// 3. 为每个物料明细设置更多属性从物料明细表中获取值递归处理所有层级
//setMaterialMoreDetailListRecursively(detailList, batchDetailMap);
// 4. 为每个物料明细设置分配按钮显示类型递归处理所有层级
setAllocationButtonTypeRecursively(detailList);
// 5. 出库交接场景已出库/已复核过滤 pickingQuantity 0 的明细与交接详情一致
// if (stockOutOrderPO.getStatus() != null && (stockOutOrderPO.getStatus() == 9 || stockOutOrderPO.getStatus() == 12)) {
// filterMaterialDetailByPickingQuantity(detailList, stockOutOrderPO.getReview(), stockOutOrderPO.getOutOrderNumber());
// }
return stockOutOrderPO;
}
/**
* 出库交接场景递归过滤 pickingQuantity 0 的明细与交接详情一致
* @param detailList 物料明细树
* @param review 是否需要复核 1- 2-
* @param outOrderNumber 出库单号review=1 时用于 picking_material_detail 查询
*/
// private void filterMaterialDetailByPickingQuantity(List<ReservationOutMaterialDetailPO> detailList, Integer review, String outOrderNumber) {
// if (CollectionUtils.isEmpty(detailList)) {
// return;
// }
// for (int i = detailList.size() - 1; i >= 0; i--) {
// ReservationOutMaterialDetailPO d = detailList.get(i);
// List<ReservationOutMaterialDetailPO> children = d.getChildren();
// if (!CollectionUtils.isEmpty(children)) {
// filterMaterialDetailByPickingQuantity(children, review, outOrderNumber);
// }
// BigDecimal pickQty;
// if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) {
// PickingMaterialDetailPO pickingSummary = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(d.getUniqueId());
// pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO;
// } else {
// pickQty = d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO;
// }
// if (pickQty.compareTo(BigDecimal.ZERO) <= 0) {
// detailList.remove(i);
// } else if (Integer.valueOf(1).equals(review) && d.getUniqueId() != null) {
// // 需要复核时 picking_material_detail 的拣货数量覆盖展示保证已拣货数量正确
// d.setPickingQuantity(pickQty);
// }
// }
// }
/**
* 递归为出库物料明细设置更多属性
* 如果已分配库存materialInventoryId不为空则从库存表中获取批次属性值
* 否则从物料明细表中获取值
* @param outMaterialDetailPOList 出库物料明细列表
* @param batchDetailMap 批次属性Map
*/
// private void setMaterialMoreDetailListRecursively(List<ReservationOutMaterialDetailPO> outMaterialDetailPOList,
// Map<Long, List<BatchDetailFeignPO>> batchDetailMap) {
// if (CollectionUtils.isEmpty(outMaterialDetailPOList)) {
// return;
// }
//
// outMaterialDetailPOList.forEach(outMaterialDetailPO -> {
// Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId();
// Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId();
//
// // 创建新的materialMoreDetailList只包含isDisplay=1的属性
// List<MaterialMoreDetailPO> materialMoreDetailList = new ArrayList<>();
//
// // 创建batchDetailId到MaterialMoreDetailPO的映射用于快速查找已有的属性值
// Map<Long, MaterialMoreDetailPO> batchDetailIdToMaterialMoreDetailMap = new HashMap<>();
// List<MaterialMoreDetailPO> existingList = outMaterialDetailPO.getMaterialMoreDetailList();
// if (!CollectionUtils.isEmpty(existingList)) {
// for (MaterialMoreDetailPO existing : existingList) {
// if (existing.getBatchDetailId() != null) {
// batchDetailIdToMaterialMoreDetailMap.put(existing.getBatchDetailId(), existing);
// }
// }
// }
//
// // 如果已分配库存从库存表中获取批次属性值
// MaterialInventoryPO inventoryPO = null;
// if (materialInventoryId != null && materialInventoryId > 0) {
// try {
// inventoryPO = materialInventoryMapper.selectByIdWithBatchAttributes(materialInventoryId);
// log.info("从库存表获取批次属性,materialInventoryId={}", materialInventoryId);
// } catch (Exception e) {
// log.warn("从库存表获取批次属性失败,materialInventoryId={},错误:{}", materialInventoryId, e.getMessage());
// }
// }
//
// // 只保留isDisplay=1的批次属性从batchDetailMap中获取已经过滤过了
// if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) {
// List<BatchDetailFeignPO> batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId);
// // 用于跟踪已添加到列表中的batchDetailId
// Set<Long> addedBatchDetailIds = new HashSet<>();
//
// for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) {
// MaterialMoreDetailPO materialMoreDetailPO = batchDetailIdToMaterialMoreDetailMap.get(batchDetailFeignPO.getBatchDetailId());
//
// // 如果不存在创建新的
// if (materialMoreDetailPO == null) {
// materialMoreDetailPO = new MaterialMoreDetailPO();
// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
// materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId());
// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels());
// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl());
// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
// } else {
// // 如果已存在更新属性保留已有的attributeValue
// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels());
// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl());
// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
// }
//
// // 确保添加到列表中使用batchDetailId来避免重复
// Long batchDetailId = batchDetailFeignPO.getBatchDetailId();
// if (batchDetailId != null && !addedBatchDetailIds.contains(batchDetailId)) {
// materialMoreDetailList.add(materialMoreDetailPO);
// addedBatchDetailIds.add(batchDetailId);
// }
//
// // 根据fieldName或batchLabels获取对应的字段值
// String fieldValue = null;
// String usedFieldName = null;
//
// // 只有在已分配库存时才从库存表获取值并设置到attributeValue
// if (inventoryPO != null) {
// // 优先使用fieldName如果存在
// if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) {
// usedFieldName = batchDetailFeignPO.getFieldName();
// fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName);
// log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}",
// batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue);
// }
// // 如果fieldName为空尝试根据batchLabels映射到字段名
// else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) {
// String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels());
// if (StringUtils.isNotBlank(fieldNameByLabel)) {
// usedFieldName = fieldNameByLabel;
// fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName);
// log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}",
// batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(),
// usedFieldName, fieldValue);
// }
// }
//
// // 只有当获取到值时才更新attributeValue已分配库存时
// if (fieldValue != null) {
// materialMoreDetailPO.setAttributeValue(fieldValue);
// log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}",
// materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(),
// materialMoreDetailPO.getAttributeValue());
// }
// } else {
// // 未分配库存时attributeValue保持为空不设置值
// log.info("批次属性未分配库存,batchDetailId={}, batchLabels={}, attributeValue为空",
// materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels());
// }
// }
// }
// outMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList);
// log.info("出库物料明细 uniqueId={}, materialBaseInfoId={}, materialInventoryId={}, materialMoreDetailList大小={}",
// outMaterialDetailPO.getUniqueId(), outMaterialDetailPO.getMaterialBaseInfoId(),
// outMaterialDetailPO.getMaterialInventoryId(),
// materialMoreDetailList != null ? materialMoreDetailList.size() : 0);
//
// // 递归处理子集
// if (!CollectionUtils.isEmpty(outMaterialDetailPO.getChildren())) {
// setMaterialMoreDetailListRecursively(outMaterialDetailPO.getChildren(), batchDetailMap);
// }
// });
// }
/**
* 根据批次标签batchLabels映射到字段名
* @param batchLabel 批次标签
* @return 字段名如果找不到映射则返回null
*/
private String getFieldNameByBatchLabel(String batchLabel) {
if (StringUtils.isBlank(batchLabel)) {
return null;
}
// 批次标签到字段名的映射关系
Map<String, String> labelToFieldNameMap = new HashMap<>();
labelToFieldNameMap.put("Invoice No.", "invoiceNo");
labelToFieldNameMap.put("Invoice No", "invoiceNo");
labelToFieldNameMap.put("发票号", "invoiceNo");
labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo");
labelToFieldNameMap.put("Batch Ref NO", "batchRefNo");
labelToFieldNameMap.put("批次参考号", "batchRefNo");
labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo");
labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo");
labelToFieldNameMap.put("单据参考号", "sheetRefNo");
labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo");
labelToFieldNameMap.put("箱号", "boxPalletNo");
labelToFieldNameMap.put("卡板号", "boxPalletNo");
labelToFieldNameMap.put("申报数量", "declareQuantity");
labelToFieldNameMap.put("申报单位", "declareUnit");
labelToFieldNameMap.put("原产国", "countryOfOrigin");
labelToFieldNameMap.put("币制", "currency");
labelToFieldNameMap.put("单位", "unit");
labelToFieldNameMap.put("", "liter");
labelToFieldNameMap.put("尺寸", "size");
labelToFieldNameMap.put("箱数", "caseCount");
labelToFieldNameMap.put("件数", "pieceCount");
labelToFieldNameMap.put("出库数量", "outboundQuantity");
labelToFieldNameMap.put("总净重", "totalNetWeight");
labelToFieldNameMap.put("总毛重", "totalGrossWeight");
labelToFieldNameMap.put("总体积", "totalVolume");
labelToFieldNameMap.put("总面积", "totalArea");
labelToFieldNameMap.put("总价", "totalAmount");
// 精确匹配
String fieldName = labelToFieldNameMap.get(batchLabel.trim());
if (StringUtils.isNotBlank(fieldName)) {
return fieldName;
}
// 模糊匹配包含关系
for (Map.Entry<String, String> entry : labelToFieldNameMap.entrySet()) {
if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(batchLabel)) {
return entry.getValue();
}
}
// 如果找不到映射尝试将批次标签转换为驼峰命名简单处理
return convertLabelToFieldName(batchLabel);
}
/**
* 将批次标签转换为字段名驼峰命名
* @param label 批次标签
* @return 字段名
*/
private String convertLabelToFieldName(String label) {
if (StringUtils.isBlank(label)) {
return null;
}
// 移除特殊字符转换为小写用空格或特殊字符分割
String cleaned = label.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5\\s]", " ")
.trim()
.toLowerCase();
// 如果是中文无法自动转换返回null
if (cleaned.matches(".*[\\u4e00-\\u9fa5].*")) {
return null;
}
// 将空格分割的单词转换为驼峰命名
String[] words = cleaned.split("\\s+");
if (words.length == 0) {
return null;
}
StringBuilder fieldName = new StringBuilder(words[0]);
for (int i = 1; i < words.length; i++) {
if (words[i].length() > 0) {
fieldName.append(words[i].substring(0, 1).toUpperCase())
.append(words[i].substring(1));
}
}
return fieldName.toString();
}
/**
* 根据字段名从对象中获取字段值使用反射
* @param obj 对象
* @param fieldName 字段名
* @return 字段值转换为字符串
*/
private String getFieldValueByFieldName(Object obj, String fieldName) {
if (obj == null || StringUtils.isBlank(fieldName)) {
return null;
}
try {
// 兼容如果传的是下划线命名数据库列名风格先转成驼峰字段名再取
String normalizedFieldName = fieldName;
if (normalizedFieldName.contains("_")) {
normalizedFieldName = snakeToCamel(normalizedFieldName);
}
// 获取对象的Class
Class<?> clazz = obj.getClass();
// 尝试获取字段包括父类字段
Field field = null;
Class<?> currentClass = clazz;
while (currentClass != null && field == null) {
try {
field = currentClass.getDeclaredField(normalizedFieldName);
} catch (NoSuchFieldException e) {
currentClass = currentClass.getSuperclass();
}
}
if (field == null) {
log.warn("字段不存在:{}(normalized{}),对象类型:{}", fieldName, normalizedFieldName, clazz.getName());
return null;
}
// 设置可访问
field.setAccessible(true);
// 获取字段值
Object value = field.get(obj);
// 转换为字符串
if (value == null) {
log.info("字段 {} 的值为 null,对象类型:{}", normalizedFieldName, clazz.getName());
return null;
}
String result;
// 处理日期类型字段
if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
result = sdf.format((Date) value);
} else {
result = value.toString();
}
log.info("通过反射获取字段值成功,字段名:{}(原始:{}),值:{},对象类型:{}",
normalizedFieldName, fieldName, result, clazz.getName());
return result;
} catch (Exception e) {
log.warn("通过反射获取字段值失败,字段名:{},对象类型:{},错误:{}", fieldName, obj.getClass().getName(), e.getMessage());
return null;
}
}
private String snakeToCamel(String snake) {
if (StringUtils.isBlank(snake)) {
return null;
}
String s = snake.trim().toLowerCase();
StringBuilder sb = new StringBuilder();
boolean upperNext = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '_') {
upperNext = true;
continue;
}
if (upperNext) {
sb.append(Character.toUpperCase(c));
upperNext = false;
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
* 获取出库单详细信息PDA复核页面含批次属性净重毛重面积体积
*/
// public ReservationStockOutOrderPO getInfoByApp(Long outOrderId) {
// ReservationStockOutOrderPO stockOutOrderPO = stockOutOrderDomainService.getInfoByApp(outOrderId);
// enrichReservationStockOutOrderForPdaCheck(stockOutOrderPO);
// return stockOutOrderPO;
// }
/**
* 为PDA复核页面填充批次属性根据物料批次标签动态显示有值显示及净重毛重面积体积
*/
// private void enrichReservationStockOutOrderForPdaCheck(ReservationStockOutOrderPO stockOutOrderPO) {
// if (stockOutOrderPO == null || CollectionUtils.isEmpty(stockOutOrderPO.getMaterialDetailList())) {
// return;
// }
// List<ReservationOutMaterialDetailPO> detailList = stockOutOrderPO.getMaterialDetailList();
// Set<Long> materialBaseInfoIdSet = detailList.stream()
// .map(ReservationOutMaterialDetailPO::getMaterialBaseInfoId)
// .filter(Objects::nonNull)
// .collect(Collectors.toSet());
// Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
// for (Long materialBaseInfoId : materialBaseInfoIdSet) {
// try {
// AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
// if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
// List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(
// JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
// if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) {
// List<BatchDetailFeignPO> filteredList = batchDetailFeignPOList.stream()
// .filter(b -> b.getIsDisplay() != null && b.getIsDisplay() == 1)
// .collect(Collectors.toList());
// batchDetailMap.put(materialBaseInfoId, filteredList);
// }
// }
// } catch (Exception e) {
// log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
// }
// }
// setMaterialMoreDetailListRecursivelyForCheck(detailList, batchDetailMap);
// }
/**
* 递归为PDA复核物料明细设置批次属性有值显示优先从库存取否则从出库明细取
*/
// private void setMaterialMoreDetailListRecursivelyForCheck(List<ReservationOutMaterialDetailPO> outMaterialDetailPOList,
// Map<Long, List<BatchDetailFeignPO>> batchDetailMap) {
// if (CollectionUtils.isEmpty(outMaterialDetailPOList)) {
// return;
// }
// outMaterialDetailPOList.forEach(outMaterialDetailPO -> {
// Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId();
// Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId();
// List<MaterialMoreDetailPO> materialMoreDetailList = new ArrayList<>();
// MaterialInventoryPO inventoryPO = null;
// if (materialInventoryId != null && materialInventoryId > 0) {
// try {
// inventoryPO = materialInventoryMapper.selectByIdWithBatchAttributes(materialInventoryId);
// } catch (Exception e) {
// log.warn("从库存表获取批次属性失败,materialInventoryId={},错误:{}", materialInventoryId, e.getMessage());
// }
// }
// Object sourceObj = inventoryPO != null ? inventoryPO : outMaterialDetailPO;
// if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) {
// for (BatchDetailFeignPO batchDetailFeignPO : batchDetailMap.get(materialBaseInfoId)) {
// MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO();
// materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
// materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId());
// materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels());
// materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl());
// materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
// materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
// materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
// String fieldValue = null;
// if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) {
// fieldValue = getFieldValueByFieldName(sourceObj, batchDetailFeignPO.getFieldName());
// } else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) {
// String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels());
// if (StringUtils.isNotBlank(fieldNameByLabel)) {
// fieldValue = getFieldValueByFieldName(sourceObj, fieldNameByLabel);
// }
// }
// if (fieldValue != null) {
// materialMoreDetailPO.setAttributeValue(fieldValue);
// materialMoreDetailList.add(materialMoreDetailPO);
// }
// }
// }
// outMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList);
// if (!CollectionUtils.isEmpty(outMaterialDetailPO.getChildren())) {
// setMaterialMoreDetailListRecursivelyForCheck(outMaterialDetailPO.getChildren(), batchDetailMap);
// }
// });
// }
/**
* @description 审核出库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockOutOrderDO
* @return Boolean
*/
// public Boolean auditState(ReservationStockOutOrderDO stockOutOrderDO){
// return stockOutOrderDomainService.auditState(stockOutOrderDO);
// }
/**
* @description 审核入库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockInOrderDO
* @return Boolean
*/
public Boolean auditState(ReservationStockOutOrderDO stockOutOrderDO){
return stockOutOrderDomainService.auditState(stockOutOrderDO);
}
/**
* @description 下发入库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockInOrderDO
* @return Boolean
*/
public Boolean issueOrder(ReservationStockOutOrderDO stockOutOrderDO){
return stockOutOrderDomainService.issueOrder(stockOutOrderDO);
}
/**
* 获取出库单复核详细信息
*/
// public ReservationStockOutOrderPO getCheckInfo(ReservationStockOutOrderDO stockOutOrderDO) {
// return stockOutOrderDomainService.getCheckInfo(stockOutOrderDO);
// }
/**
* @description 设置仓库信息
* @author ZhouGY
* @date 2024/4/7 10:01
* @param stockOutOrderDO
*/
private void setWarehouseInfo(ReservationStockOutOrderDO stockOutOrderDO) {
if (stockOutOrderDO.getWarehouseId() == null) {
throw new ServiceException("仓库ID不能为空");
}
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockOutOrderDO.getWarehouseId());
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取仓库信息失败");
}
WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
stockOutOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode());
stockOutOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName());
}
/**
* @description 封装货主信息
* @author ZhouGY
* @date 2024/5/9 20:43
* @param stockOutOrderDO
*/
private void shipperParam(ReservationStockOutOrderDO stockOutOrderDO){
String customerName = stockOutOrderDO.getCustomerName();
if (customerName == null || !customerName.matches("\\d+")) {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
stockOutOrderDO.setShipperId(userPo.getUserId());
stockOutOrderDO.setShipperCode(userPo.getUserMemberCode());
stockOutOrderDO.setShipperName(userPo.getUserName());
} else {
AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName));
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取货主信息失败");
}
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
stockOutOrderDO.setShipperId(userPo.getUserId());
stockOutOrderDO.setShipperCode(userPo.getUserMemberCode());
stockOutOrderDO.setShipperName(userPo.getUserName());
}
}
/**
* @description 封装客户信息
* @author ZhouGY
* @date 2024/5/9 20:43
* @param stockOutOrderDO
*/
private void customerParam(ReservationStockOutOrderDO stockOutOrderDO){
String customerName = stockOutOrderDO.getCustomerName();
if (customerName == null || !customerName.matches("\\d+")) {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
stockOutOrderDO.setCustomerId(userPo.getUserId());
stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode());
stockOutOrderDO.setCustomerName(userPo.getUserName());
} else {
AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName));
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
stockOutOrderDO.setCustomerId(userPo.getUserId());
stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode());
stockOutOrderDO.setCustomerName(userPo.getUserName());
}
}
/**
* @description 设置数据字典键值
* @author ZhouGY
* @date 2024/4/7 14:33
* @param stockOutOrderDO
*/
private void setDataDict(ReservationStockOutOrderDO stockOutOrderDO){
//翻译单据类型
AjaxResult documentTypeResult = systemServiceFeign.selectListByDictType(DictCode.OUT_DOCUMENT_TYPE.getCode());
if (!"200".equals(String.valueOf(documentTypeResult.get("code")))) {
throw new ServiceException("单据类型数据字典不存在");
}
List<SysDictData> documentTypeDataList = JSON.parseArray(JSONUtil.toJsonStr(documentTypeResult.get("data")), SysDictData.class);
SysDictData documentTypeData = documentTypeDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockOutOrderDO.getOrderTypeCode())).findAny().orElse(null);
if (null == documentTypeData) {
throw new ServiceException("单据类型【" + stockOutOrderDO.getOrderTypeCode() + "】数据字典不存在 请联系管理员");
}
stockOutOrderDO.setOrderTypeName(documentTypeData.getDictLabel());
if (StringUtils.isNotBlank(stockOutOrderDO.getPriorityLevelCode())){
//翻译优先级别类型
AjaxResult priorityLevelResult = systemServiceFeign.selectListByDictType(DictCode.PRIORITY_LEVEL.getCode());
if (!"200".equals(String.valueOf(priorityLevelResult.get("code")))) {
throw new ServiceException("优先级别类型数据字典不存在");
}
List<SysDictData> priorityLevelDataList = JSON.parseArray(JSONUtil.toJsonStr(priorityLevelResult.get("data")), SysDictData.class);
SysDictData priorityLevelData = priorityLevelDataList.stream().filter(info -> ObjectUtil.equal(info.getDictValue(), stockOutOrderDO.getPriorityLevelCode())).findAny().orElse(null);
if (null == priorityLevelData) {
throw new ServiceException("优先级别类型【" + stockOutOrderDO.getPriorityLevelCode() + "】数据字典不存在 请联系管理员");
}
stockOutOrderDO.setPriorityLevelName(priorityLevelData.getDictLabel());
}
}
/**
* @description 设置上架库位信息
* @author ZhouGY
* @date 2024/5/23 14:03
* @param outMaterialDetailDO
*/
private void setStorageLocationInfo(ReservationOutMaterialDetailDO outMaterialDetailDO){
AjaxResult storageLocationResult = systemServiceFeign.getStorageLocationInfoByStorageLocationId(outMaterialDetailDO.getStorageLocationId());
if(!"200".equals(String.valueOf(storageLocationResult.get("code")))){
throw new ServiceException("获取上架库位信息失败");
}
StorageLocationFeignPO storageLocationFeignPO = JSON.parseObject(JSONObject.toJSONString(storageLocationResult.get("data")), StorageLocationFeignPO.class);
outMaterialDetailDO.setWarehouseId(storageLocationFeignPO.getWarehouseId());
outMaterialDetailDO.setWarehouseCode(storageLocationFeignPO.getWarehouseCode());
outMaterialDetailDO.setWarehouseName(storageLocationFeignPO.getWarehouseName());
outMaterialDetailDO.setStorageSectionId(storageLocationFeignPO.getStorageSectionId());
outMaterialDetailDO.setStorageCode(storageLocationFeignPO.getStorageCode());
outMaterialDetailDO.setStorageName(storageLocationFeignPO.getStorageName());
outMaterialDetailDO.setStorageLocationId(storageLocationFeignPO.getStorageLocationId());
outMaterialDetailDO.setStorageLocationCode(storageLocationFeignPO.getStorageLocationCode());
outMaterialDetailDO.setStorageLocationName(storageLocationFeignPO.getStorageLocationName());
}
/**
* @description 封装作业人员信息
* @author ZhouGY
* @date 2024/5/9 20:43
* @param stockOutOrderDO
*/
private void checkOperatorsParam(ReservationStockOutOrderDO stockOutOrderDO){
AjaxResult ajaxResult = userServiceFeign.getInfo(stockOutOrderDO.getCheckOperatorsBy());
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取作业人员信息失败");
}
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
stockOutOrderDO.setCheckOperatorsName(userPo.getUserName());
}
/**
* @description 设置库存信息
* @author ZhouGY
* @date 2024/7/19 20:17
* @param outMaterialDetailDO
*/
// private void setMaterialInventory(ReservationOutMaterialDetailDO outMaterialDetailDO){
// if (ObjectUtil.isNull(outMaterialDetailDO.getMaterialInventoryId()) || outMaterialDetailDO.getMaterialInventoryId() == 0){
// return;
// }
// MaterialInventoryPO materialInventoryPO = materialInventoryDomainService.getInfo(outMaterialDetailDO.getMaterialInventoryId());
// if (materialInventoryPO == null){
// throw new ServiceException("物料库存信息不存在");
// }
// outMaterialDetailDO.setBatchNumber(materialInventoryPO.getBatchNumber());
// outMaterialDetailDO.setMaterialStatusCode(materialInventoryPO.getMaterialStatusCode());
// outMaterialDetailDO.setMaterialStatusName(materialInventoryPO.getMaterialStatusName());
// outMaterialDetailDO.setContainerId(materialInventoryPO.getContainerId());
// outMaterialDetailDO.setContainerCode(materialInventoryPO.getContainerCode());
// outMaterialDetailDO.setContainerType(materialInventoryPO.getContainerType());
// outMaterialDetailDO.setContainerTypeName(materialInventoryPO.getContainerTypeName());
// // 库存数量仅用于前端展示
// outMaterialDetailDO.setInventoryQuantity(materialInventoryPO.getInventoryQuantity());
// }
/**
* 递归为出库物料明细设置分配按钮显示类型
* @param outMaterialDetailPOList 出库物料明细列表
*/
private void setAllocationButtonTypeRecursively(List<ReservationOutMaterialDetailPO> outMaterialDetailPOList) {
if (CollectionUtils.isEmpty(outMaterialDetailPOList)) {
return;
}
outMaterialDetailPOList.forEach(outMaterialDetailPO -> {
BigDecimal quantity = outMaterialDetailPO.getQuantity(); // 计划数量
BigDecimal alreadyAllocationQuantity = outMaterialDetailPO.getAlreadyAllocationQuantity(); // 已分配数量
// 判断按钮显示类型
// 已分配数量 = 0显示"库存分配"按钮类型1
// 已分配数量 = 计划数量显示"取消分配"按钮类型2
if (alreadyAllocationQuantity == null || alreadyAllocationQuantity.compareTo(BigDecimal.ZERO) == 0) {
// 已分配数量为0或null显示"库存分配"按钮
outMaterialDetailPO.setAllocationButtonType(1);
} else if (quantity != null && alreadyAllocationQuantity.compareTo(quantity) == 0) {
// 已分配数量等于计划数量显示"取消分配"按钮
outMaterialDetailPO.setAllocationButtonType(2);
} else {
// 其他情况已分配数量 > 0 < 计划数量不显示按钮或显示其他状态
outMaterialDetailPO.setAllocationButtonType(0);
}
// 递归处理子级
List<ReservationOutMaterialDetailPO> children = outMaterialDetailPO.getChildren();
if (!CollectionUtils.isEmpty(children)) {
setAllocationButtonTypeRecursively(children);
}
});
}
}
@@ -0,0 +1,113 @@
package com.mhd.oms.domain.reservationStockOutOrder.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException;
import com.mhd.common.core.exception.digitalLogisticsException.UserError;
import com.mhd.common.core.utils.IgnoreNullUtil;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDTO;
import com.mhd.system.api.model.LoginUser;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 出库单Assembler
*
* @author gen
* @date 2024-05-28
*/
@Component
public class ReservationStockOutOrderAssembler {
/**
* 转换实体
*/
public ReservationStockOutOrderDO toDO(ReservationStockOutOrderDTO stockOutOrderDTO) {
ReservationStockOutOrderDO stockOutOrderDO = new ReservationStockOutOrderDO();
// 拷贝
BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO, IgnoreNullUtil.getNullPropertyNames(stockOutOrderDTO));
// 确保查询条件字段被正确传递查询条件字段需要明确传递避免被IgnoreNullUtil忽略
stockOutOrderDO.setCreateTimeStart(stockOutOrderDTO.getCreateTimeStart());
stockOutOrderDO.setCreateTimeEnd(stockOutOrderDTO.getCreateTimeEnd());
stockOutOrderDO.setAuditTimeStart(stockOutOrderDTO.getAuditTimeStart());
stockOutOrderDO.setAuditTimeEnd(stockOutOrderDTO.getAuditTimeEnd());
stockOutOrderDO.setTabType(stockOutOrderDTO.getTabType());
// 列表筛选前端常传名称 (编码)展示串库内多为纯名称去掉末尾括号段再 LIKE
if (stockOutOrderDTO.getMaterialName() != null && !stockOutOrderDTO.getMaterialName().isEmpty()) {
String normalized = normalizeDetailMaterialNameForQuery(stockOutOrderDTO.getMaterialName());
stockOutOrderDO.setMaterialName(normalized.isEmpty()
? stockOutOrderDTO.getMaterialName().trim()
: normalized);
}
return stockOutOrderDO;
}
/**
* 转换实体
*/
public ReservationStockOutOrderDO toDOByEdit(ReservationStockOutOrderDTO stockOutOrderDTO) {
ReservationStockOutOrderDO stockOutOrderDO = JSONUtil.toBean(JSONUtil.toJsonStr(stockOutOrderDTO), ReservationStockOutOrderDO.class);
// 拷贝
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
// 获取登录人id
Long userId = loginUser.getUserid();
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
String userRealName = null;
if (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
&& !loginUser.getUserPo().getUserName().trim().isEmpty()) {
// 优先使用UserPo中的userName用户真实姓名
userRealName = loginUser.getUserPo().getUserName();
} else if (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) {
// 其次使用realname
userRealName = loginUser.getRealname();
} else {
// 最后使用username账号作为兜底
userRealName = loginUser.getUsername();
}
if(stockOutOrderDTO.getOutOrderId() != null){
stockOutOrderDO.setUpdateBy(userId);
stockOutOrderDO.setUpdateByName(userRealName);
stockOutOrderDO.setUpdateTime(new Date());
}else {
stockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
stockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
stockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
stockOutOrderDO.setCreateBy(userId);
stockOutOrderDO.setCreateByName(userRealName);
stockOutOrderDO.setCreateTime(new Date());
stockOutOrderDO.setUpdateBy(userId);
stockOutOrderDO.setUpdateByName(userRealName);
stockOutOrderDO.setUpdateTime(new Date());
stockOutOrderDO.setDelFlag(1);
}
return stockOutOrderDO;
}
/**
* 去掉物料展示名末尾的 (xxx) / xxx便于与库内 material_name 模糊匹配
*/
private static String normalizeDetailMaterialNameForQuery(String raw) {
if (raw == null) {
return null;
}
String s = raw.trim();
// 循环去掉末尾多组括号兼容名称 (编码)或重复后缀
String next;
do {
next = s.replaceFirst("[\\s\\u3000]*[(][^)]*[)]\\s*$", "").trim();
if (next.equals(s)) {
break;
}
s = next;
} while (!s.isEmpty());
return s;
}
}
@@ -0,0 +1,652 @@
package com.mhd.oms.domain.reservationStockOutOrder.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.OrderSequence;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.reservationInMaterialDetail.entity.ReservationInMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.entity.ReservationOutMaterialDetail;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.facade.IReservationOutMaterialDetailService;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.OutMaterialCheckPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.po.ReservationOutMaterialDetailPO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailBaseDO;
import com.mhd.oms.domain.reservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailDO;
//import com.mhd.oms.domain.reservationReservationOutMaterialDetail.repository.po.OutMaterialCheckPO;
//import com.mhd.oms.domain.reservationReservationOutMaterialDetail.repository.todo.ReservationOutMaterialDetailBaseDO;
import com.mhd.oms.domain.reservationStockInOrder.entity.ReservationStockInOrder;
import com.mhd.oms.domain.reservationStockInOrder.repository.facade.IReservationStockInOrderService;
import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper;
import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationStockOutOrderDO;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.WmsServiceFeign;
import com.mhd.system.api.domain.*;
import com.mhd.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 出库单
*
* @author gen
* @date 2024-05-28
*/
@Service
@Slf4j
public class ReservationStockOutOrderDomainService {
@Autowired
private IReservationStockOutOrderService stockOutOrderService;
@Autowired
private IReservationOutMaterialDetailService outMaterialDetailService;
@Autowired
private IReservationStockInOrderService reservationStockInOrderService;
// @Autowired
// private IHandoverTaskOrderService handoverTaskOrderService;
// @Autowired
// private IOutOrderAbnormalService outOrderAbnormalService;
// @Autowired
// private PickingOrderDomainService pickingOrderDomainService;
// @Autowired
// private ReplenishmentNoticeDomainService replenishmentNoticeDomainService;
// @Autowired
// private IMobilizeManageService iMobilizeManageService;
// @Autowired
// private IMobilizeManageDetailService iMobilizeManageDetailService;
// @Autowired
// private StockInOrderDomainService stockInOrderDomainService;
// @Autowired
// private IInventoryStandingDetailService inventoryStandingDetailService;
// @Autowired
// private IDeliveTaskService deliveTaskService;
// @Autowired
// private WaveOrderServiceFactory waveOrderServiceFactory;
// @Autowired
// private IMaterialBaseInfoService materialBaseInfoService;
@Autowired
private ReservationStockInOrderMapper reservationStockInOrderMapper;
// @Autowired
// private IMaterialWarehouseControlService materialWarehouseControlService;
// @Autowired
// private IMaterialInventoryService materialInventoryService;
@Resource
private SystemServiceFeign systemServiceFeign;
@Resource
private WmsServiceFeign wmsServiceFeign;
// @Autowired
// private PushSyncBmsDomainService pushSyncBmsDomainService;
// @Autowired
// private MaterialBaseInfoMapper materialBaseInfoMapper;
// @Autowired
// private MaterialInventoryMapper materialInventoryMapper;
// @Autowired
// private IPickingMaterialDetailService pickingMaterialDetailService;
/**
* 分页查询出库单列表
*/
public List<ReservationStockOutOrderPO> queryList(ReservationStockOutOrderDO stockOutOrderDO) {
return stockOutOrderService.queryList(stockOutOrderDO);
}
/**
* 新增出库单
*/
@Transactional(rollbackFor = Exception.class)
public Boolean insert(ReservationStockOutOrderDO stockOutOrderDO) {
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK"));
//统计总数量
BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getOutboundQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setQuantity(quantity);
// 复核下发状态默认为否2
if (stockOutOrderDO.getCheckTaskDistribution() == null) {
stockOutOrderDO.setCheckTaskDistribution(2);
}
stockOutOrderService.insert(stockOutOrderDO);
return outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList());
}
/**
* 批量新增出库单
*/
@Transactional(rollbackFor = Exception.class)
public Boolean batchInsert(List<ReservationStockOutOrderDO> stockOutOrderDOList) {
for (ReservationStockOutOrderDO stockOutOrderDO : stockOutOrderDOList){
if (StringUtils.isBlank(stockOutOrderDO.getOutOrderNumber())){
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK"));
}
//设置物料信息
setMaterialDetailInfo(stockOutOrderDO);
//统计种类
stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size());
//统计总数量
BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setQuantity(quantity);
//统计总重量
BigDecimal weightLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setWeightLimit(weightLimit);
//统计总体积
BigDecimal volumeLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setVolumeLimit(volumeLimit);
// 复核下发状态默认为否2
if (stockOutOrderDO.getCheckTaskDistribution() == null) {
stockOutOrderDO.setCheckTaskDistribution(2);
}
stockOutOrderService.insert(stockOutOrderDO);
outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList());
}
return true;
}
/**
* 修改出库单
*/
public Boolean update(ReservationStockOutOrderDO stockOutOrderDO) {
ReservationStockOutOrderPO stockInOrderPO = stockOutOrderService.getInfo(stockOutOrderDO.getOutOrderId());
if (stockInOrderPO == null){
throw new ServiceException("出库单信息不存在");
}
//设置物料信息
setMaterialDetailInfo(stockOutOrderDO);
//统计种类
stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size());
//统计总数量
BigDecimal quantity = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setQuantity(quantity);
//统计总重量
BigDecimal weightLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setWeightLimit(weightLimit);
//统计总体积
BigDecimal volumeLimit = stockOutOrderDO.getMaterialDetailList().stream().map(ReservationOutMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockOutOrderDO.setVolumeLimit(volumeLimit);
stockOutOrderService.update(stockOutOrderDO);
ReservationOutMaterialDetailBaseDO outMaterialDetailBaseDO = new ReservationOutMaterialDetailBaseDO();
BeanUtils.copyProperties(stockOutOrderDO, outMaterialDetailBaseDO);
outMaterialDetailBaseDO.setOutOrderNumber(stockInOrderPO.getOutOrderNumber());
return outMaterialDetailService.batchUpdate(stockOutOrderDO.getMaterialDetailList(), outMaterialDetailBaseDO);
}
public Boolean close(ReservationStockOutOrderDO stockOutOrderDO) {
ReservationStockOutOrderPO stockInOrderPO = stockOutOrderService.getInfo(stockOutOrderDO.getOutOrderId());
if (stockInOrderPO == null){
throw new ServiceException("出库单信息不存在");
}
if (stockInOrderPO.getStatus() != 1){
throw new ServiceException("只有已创建状态下能允许关闭出库单");
}
stockOutOrderDO.setStatus(11);
return stockOutOrderService.update(stockOutOrderDO);
}
/**
* @description 审核出库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
public Boolean auditState(ReservationStockOutOrderDO stockOutOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
return stockOutOrderService.update(null, new UpdateWrapper<ReservationStockOutOrder>().lambda()
.set(ReservationStockOutOrder::getReservationAuditId, loginUser.getUserid())
.set(ReservationStockOutOrder::getReservationAuditName, userRealName)
.set(ReservationStockOutOrder::getReservationAuditTime, new Date())
.set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid())
.set(ReservationStockOutOrder::getUpdateByName, userRealName)
.set(ReservationStockOutOrder::getUpdateTime, new Date())
.in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds()));
}
/**
* @description 审核出库单
* @author ZhouGY
* @date 2024/5/21 13:53
* @param stockOutOrderDO
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
public Boolean issueOrder(ReservationStockOutOrderDO stockOutOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
boolean update = stockOutOrderService.update(null, new UpdateWrapper<ReservationStockOutOrder>().lambda()
.set(ReservationStockOutOrder::getIssueId, loginUser.getUserid())
.set(ReservationStockOutOrder::getIssueName, userRealName)
.set(ReservationStockOutOrder::getIssueTime, new Date())
.set(ReservationStockOutOrder::getIssueStatus, 1)
.set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid())
.set(ReservationStockOutOrder::getUpdateByName, userRealName)
.set(ReservationStockOutOrder::getUpdateTime, new Date())
.in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds()));
//todo下发推送到wms
List<Long> inOrderIds = stockOutOrderDO.getOutOrderIds();
for (Long inOrderId : inOrderIds) {
ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId);
StockOutOrder stockOutOrder = new StockOutOrder();
BeanUtils.copyProperties(byId, stockOutOrder);
wmsServiceFeign.omsOutOrderAdd(stockOutOrder);
String inOrderNumber = stockOutOrder.getOutOrderNumber();
List<ReservationOutMaterialDetail> materialDetailList = outMaterialDetailService.list(new QueryWrapper<ReservationOutMaterialDetail>().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber));
List<OutMaterialDetail> outMaterialDetailList = new ArrayList<>();
for (ReservationOutMaterialDetail reservationOutMaterialDetail : materialDetailList) {
OutMaterialDetail outMaterialDetail = new OutMaterialDetail();
BeanUtils.copyProperties(reservationOutMaterialDetail, outMaterialDetail);
outMaterialDetailList.add(outMaterialDetail);
}
wmsServiceFeign.omsOutOrderAddDetail(outMaterialDetailList);
}
return update;
}
/**
* @description 修改出库单
* @author ZhouGY
* @date 2024/8/8 16:18
* @param stockOutOrderDb
* @param stockOutOrderPO
* @return Boolean
*/
// public Boolean updateReservationStockOutOrderByAllocation(ReservationStockOutOrder stockOutOrderDb, ReservationStockOutOrderPO stockOutOrderPO, Integer type) {
// LoginUser loginUser = SecurityUtils.getLoginUser();
// int status = judgeAllocationQuantityByManualAssign(stockOutOrderPO.getAllocationQuantity(), stockOutOrderDb.getQuantity(),type);
// BigDecimal allocationQuantity = stockOutOrderDb.getAllocationQuantity();
// BigDecimal alreadyAllocationQuantity = stockOutOrderDb.getAlreadyAllocationQuantity() != null
// ? stockOutOrderDb.getAlreadyAllocationQuantity()
// : BigDecimal.ZERO;
// if (type == 2){
// //取消分配stockOutOrderPO.getAllocationQuantity() stockOutOrderPO.getAlreadyAllocationQuantity() 都是要取消的数量
// //物料明细层面的验证已经在 batchCancelAssignUpdate 中完成这里直接使用即可
// BigDecimal cancelQuantity = stockOutOrderPO.getAllocationQuantity();
// stockOutOrderService.update(null,new UpdateWrapper<ReservationStockOutOrder>().lambda()
// .setSql("allocation_quantity = allocation_quantity - " + cancelQuantity)//取消分配减数量
// .eq(ReservationStockOutOrder::getOutOrderId, stockOutOrderDb.getOutOrderId())
// );
// BigDecimal cancelAlreadyAllocationQuantity = stockOutOrderPO.getAlreadyAllocationQuantity() != null
// ? stockOutOrderPO.getAlreadyAllocationQuantity()
// : BigDecimal.ZERO;
//
// // 取消分配减少已分配数量
// // 注意如果出库单的 alreadyAllocationQuantity 数据不一致可能为0使用 cancelAlreadyAllocationQuantity 作为参考
// // 但为了数据一致性我们仍然从当前值中减去取消的数量
// if (alreadyAllocationQuantity.compareTo(cancelAlreadyAllocationQuantity) < 0) {
// // 如果出库单的已分配数量小于要取消的数量说明数据不一致使用要取消的数量作为基准
// alreadyAllocationQuantity = cancelAlreadyAllocationQuantity;
// }
// alreadyAllocationQuantity = alreadyAllocationQuantity.subtract(cancelQuantity);
// // 确保不会变成负数
// if (alreadyAllocationQuantity.compareTo(BigDecimal.ZERO) < 0) {
// alreadyAllocationQuantity = BigDecimal.ZERO;
// }
// BigDecimal subtract = stockOutOrderPO.getAlreadyAllocationQuantity().subtract(alreadyAllocationQuantity);
// if (subtract.compareTo(BigDecimal.ZERO) == 0) {
// status = 2;
// } else {
// status = 3;
// }
//// status = judgeAllocationQuantityByManualAssign(stockOutOrderPO.getAllocationQuantity(), stockOutOrderPO.getAlreadyAllocationQuantity(),type);
//
// }else {
// allocationQuantity = stockOutOrderPO.getAllocationQuantity();//直接使用返回的分配数量
// alreadyAllocationQuantity = alreadyAllocationQuantity.add(stockOutOrderPO.getAlreadyAllocationQuantity() != null
// ? stockOutOrderPO.getAlreadyAllocationQuantity()
// : BigDecimal.ZERO);
// }
// LambdaUpdateWrapper<ReservationStockOutOrder> wrapper = new UpdateWrapper<ReservationStockOutOrder>().lambda()
// .set(ReservationStockOutOrder::getStatus, status)
// .set(ReservationStockOutOrder::getAlreadyAllocationQuantity, alreadyAllocationQuantity)
// .set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid())
// .set(ReservationStockOutOrder::getUpdateByName, loginUser.getUsername())
// .set(ReservationStockOutOrder::getUpdateTime, new Date())
// .eq(ReservationStockOutOrder::getOutOrderId, stockOutOrderDb.getOutOrderId());
// if (type != 2){
// wrapper.set(ReservationStockOutOrder::getAllocationQuantity, allocationQuantity);
// }
// return stockOutOrderService.update(null, wrapper);
// }
/**
* 批量删除出库单
*/
public Boolean delete(Long[] outOrderIds) {
return stockOutOrderService.delete(outOrderIds);
}
/**
* 获取出库单详细信息
*/
public ReservationStockOutOrderPO getInfo(Long outOrderId) {
return stockOutOrderService.getInfo(outOrderId);
}
/**
* 获取出库单详细信息
*/
public ReservationStockOutOrderPO getInfoChildren(Long outOrderId) {
ReservationStockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId);
ReservationOutMaterialDetailDO outMaterialDetailDO = new ReservationOutMaterialDetailDO();
outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
List<ReservationOutMaterialDetailPO> materialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO);
// for (ReservationOutMaterialDetailPO outMaterialDetailPO : materialDetailPOList) {
// String materialNo = outMaterialDetailPO.getMaterialNo();
// List<MaterialBaseInfoPO> materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper<MaterialBaseInfoPO>().lambda().eq(MaterialBaseInfoPO::getMaterialCode, materialNo));
// if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) {
// outMaterialDetailPO.setCommodityName(materialBaseInfos.get(0).getMaterialNamePO());
// outMaterialDetailPO.setMaterialCode(materialBaseInfos.get(0).getMaterialCodePO());
// outMaterialDetailPO.setMaterialName(materialBaseInfos.get(0).getMaterialNamePO());
// }
// }
stockOutOrderPO.setMaterialDetailList(materialDetailPOList);
return stockOutOrderPO;
}
/**
* 获取出库单详细信息PDA复核管理查询详情
* 复核场景下与PC端getCheckInfo保持一致返回拣货下发时的完整数据树形结构拣货汇总批次属性等
*/
// public ReservationStockOutOrderPO getInfoByApp(Long outOrderId) {
// ReservationStockOutOrder stockOutOrder = stockOutOrderService.getById(outOrderId);
// if (stockOutOrder == null) {
// throw new ServiceException("出库单不存在");
// }
// // 复核场景与PC端getCheckInfo保持一致返回拣货下发的完整数据含历史记录 status=9 已出库与列表详情一致
// if (stockOutOrder.getReview() != null && stockOutOrder.getReview() == 1
// && stockOutOrder.getStatus() != null && (stockOutOrder.getStatus() == 7 || stockOutOrder.getStatus() == 8 || stockOutOrder.getStatus() == 9)) {
// ReservationStockOutOrderDO stockOutOrderDO = new ReservationStockOutOrderDO();
// stockOutOrderDO.setOutOrderNumber(stockOutOrder.getOutOrderNumber());
// ReservationStockOutOrderPO stockOutOrderPO = getCheckInfo(stockOutOrderDO);
// // PDA端需扁平化树形结构与PC端展开后的展示条数一致父项+子项全部展开为独立行
// List<ReservationOutMaterialDetailPO> flattenedList = flattenMaterialDetailTree(stockOutOrderPO.getMaterialDetailList());
// stockOutOrderPO.setMaterialDetailList(flattenedList);
// if (stockOutOrderPO.getOutMaterialCheckPO() != null) {
// stockOutOrderPO.getOutMaterialCheckPO().setCount(flattenedList.size());
// }
// return stockOutOrderPO;
// }
// // 非复核场景保持原有逻辑
// ReservationStockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId);
// ReservationOutMaterialDetailDO outMaterialDetailDO = new ReservationOutMaterialDetailDO();
// outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
// List<ReservationOutMaterialDetailPO> materialDetailPOList = outMaterialDetailService.queryList(outMaterialDetailDO);
// materialDetailPOList.forEach(d -> {
// if (d.getWaitCheckQuantity() != null) d.setActualQuantity(d.getWaitCheckQuantity());
// });
// stockOutOrderPO.setMaterialDetailList(materialDetailPOList);
// return stockOutOrderPO;
// }
// @Autowired
// private IMaterialBarCodeService materialBarCodeService;
/**
* 获取出库单复核详细信息
*/
// public ReservationStockOutOrderPO getCheckInfo(ReservationStockOutOrderDO stockOutOrderDO) {
// String outOrderNumber = stockOutOrderDO.getOutOrderNumber();
// ReservationStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper<ReservationStockOutOrder>().lambda()
// .eq(ReservationStockOutOrder::getDelFlag, 1)
// .eq(ReservationStockOutOrder::getOutOrderNumber, stockOutOrderDO.getOutOrderNumber()));
// if (stockOutOrder == null){
// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】不存在");
// }
// if (stockOutOrder.getReview() != 1){
// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】不需要复核");
// }
// if (stockOutOrder.getStatus() != 7 && stockOutOrder.getStatus() != 8){
// throw new ServiceException("出库单【" + stockOutOrderDO.getOutOrderNumber() + "】状态不是拣货完成或复核中");
// }
// ReservationStockOutOrderPO stockOutOrderPO = new ReservationStockOutOrderPO();
// BeanUtils.copyProperties(stockOutOrder, stockOutOrderPO);
// ReservationOutMaterialDetailDO outMaterialDetailDO = new ReservationOutMaterialDetailDO();
// outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
// List<ReservationOutMaterialDetailPO> outMaterialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO);
// for (ReservationOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList) {//获取物料条形码
// List<MaterialBarCodePO> materialBarCodePOList = materialBarCodeService.getInfoByMaterialBaseInfoIds(outMaterialDetailPO.getMaterialBaseInfoId());
// if (materialBarCodePOList != null && !materialBarCodePOList.isEmpty()) {
// Map<Long, MaterialBarCodePO> collect = materialBarCodePOList.stream()
// .collect(Collectors.toMap(
// MaterialBarCodePO::getMaterialBaseInfoId,
// po -> po,
// (existing, replacement) -> existing
// ));
// MaterialBarCodePO materialBarCodePO = collect.get(outMaterialDetailPO.getMaterialBaseInfoId());
// if (materialBarCodePO != null && materialBarCodePO.getBarCode() != null) {
// outMaterialDetailPO.setBarCode(materialBarCodePO.getBarCode());
// }
// }
// }
// for (ReservationOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList) {
// outMaterialDetailPO.setMaterialCode(outMaterialDetailPO.getMaterialNo());
// outMaterialDetailPO.setMaterialName(outMaterialDetailPO.getCommodityName());
// Long uniqueId = outMaterialDetailPO.getUniqueId();
// PickingMaterialDetailPO pickingMaterialDetailPO = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(uniqueId);
// if (ObjectUtils.isNotEmpty(pickingMaterialDetailPO)) {
// outMaterialDetailPO.setTotalArea(pickingMaterialDetailPO.getTotalArea());
// outMaterialDetailPO.setTotalVolume(pickingMaterialDetailPO.getTotalVolume());
// outMaterialDetailPO.setTotalNetWeight(pickingMaterialDetailPO.getTotalNetWeight());
// outMaterialDetailPO.setTotalGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight());
// outMaterialDetailPO.setCheckArea(pickingMaterialDetailPO.getTotalArea());
// outMaterialDetailPO.setCheckVolume(pickingMaterialDetailPO.getTotalVolume());
// outMaterialDetailPO.setCheckNetWeight(pickingMaterialDetailPO.getTotalNetWeight());
// outMaterialDetailPO.setCheckGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight());
// // 拣货数量优先 picking_material_detail否则 out_material_detail
// BigDecimal pickQty = (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
// ? pickingMaterialDetailPO.getPickingQuantity() : outMaterialDetailPO.getPickingQuantity();
// BigDecimal checkQty = outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO;
// // 待复核数量 = 拣货数量 - 已复核数量复核提交后应减少
// BigDecimal waitQty = (pickQty != null ? pickQty : BigDecimal.ZERO).subtract(checkQty);
// if (waitQty.compareTo(BigDecimal.ZERO) < 0) {
// waitQty = BigDecimal.ZERO;
// }
// outMaterialDetailPO.setWaitCheckQuantity(waitQty);
// // quantity=PC下发时的拣货数量actualQuantity已复核则取checkQuantity否则取待复核数量
// if (pickQty != null) {
// outMaterialDetailPO.setQuantity(pickQty);
// }
// outMaterialDetailPO.setActualQuantity(checkQty.compareTo(BigDecimal.ZERO) > 0 ? checkQty : waitQty);
// }
// List<ReservationOutMaterialDetailPO> children = outMaterialDetailPO.getChildren();
// if (!CollectionUtils.isEmpty(children)) {
// for (ReservationOutMaterialDetailPO outMaterialDetailPOChild : children) {
// outMaterialDetailPOChild.setMaterialCode(outMaterialDetailPOChild.getMaterialNo());
// outMaterialDetailPOChild.setMaterialName(outMaterialDetailPOChild.getCommodityName());
// Long uniqueIdChild = outMaterialDetailPOChild.getUniqueId();
// PickingMaterialDetailPO pickingMaterialDetailPO1 = pickingMaterialDetailService.queryTotalsByOutNumberAndBaseId(uniqueIdChild);
// if (ObjectUtils.isNotEmpty(pickingMaterialDetailPO1)) {
// outMaterialDetailPOChild.setTotalArea(pickingMaterialDetailPO1.getTotalArea());
// outMaterialDetailPOChild.setTotalVolume(pickingMaterialDetailPO1.getTotalVolume());
// outMaterialDetailPOChild.setTotalNetWeight(pickingMaterialDetailPO1.getTotalNetWeight());
// outMaterialDetailPOChild.setTotalGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight());
// outMaterialDetailPOChild.setCheckArea(pickingMaterialDetailPO1.getTotalArea());
// outMaterialDetailPOChild.setCheckVolume(pickingMaterialDetailPO1.getTotalVolume());
// outMaterialDetailPOChild.setCheckNetWeight(pickingMaterialDetailPO1.getTotalNetWeight());
// outMaterialDetailPOChild.setCheckGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight());
// // 拣货数量优先 picking_material_detail否则 out_material_detail
// BigDecimal pickQtyChild = (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
// ? pickingMaterialDetailPO1.getPickingQuantity() : outMaterialDetailPOChild.getPickingQuantity();
// BigDecimal checkQtyChild = outMaterialDetailPOChild.getCheckQuantity() != null ? outMaterialDetailPOChild.getCheckQuantity() : BigDecimal.ZERO;
// // 待复核数量 = 拣货数量 - 已复核数量复核提交后应减少
// BigDecimal waitQtyChild = (pickQtyChild != null ? pickQtyChild : BigDecimal.ZERO).subtract(checkQtyChild);
// if (waitQtyChild.compareTo(BigDecimal.ZERO) < 0) {
// waitQtyChild = BigDecimal.ZERO;
// }
// outMaterialDetailPOChild.setWaitCheckQuantity(waitQtyChild);
// // quantity=PC下发时的拣货数量actualQuantity已复核则取checkQuantity否则取待复核数量
// if (pickQtyChild != null) {
// outMaterialDetailPOChild.setQuantity(pickQtyChild);
// }
// outMaterialDetailPOChild.setActualQuantity(checkQtyChild.compareTo(BigDecimal.ZERO) > 0 ? checkQtyChild : waitQtyChild);
// }
// }
// }
// }
// stockOutOrderPO.setMaterialDetailList(outMaterialDetailPOList);
// BigDecimal weightLimit = BigDecimal.ZERO;
// BigDecimal volumeLimit = BigDecimal.ZERO;
// BigDecimal wantNumber = BigDecimal.ZERO;
// BigDecimal alreadyNumber = BigDecimal.ZERO;
// for (ReservationOutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList){
// weightLimit = weightLimit.add(outMaterialDetailPO.getWeightLimit());
// volumeLimit = volumeLimit.add(outMaterialDetailPO.getVolumeLimit());
// // wantNumber=拣货数量总和alreadyNumber=已复核总和notHaveNumber=剩余待复核
// BigDecimal pickQty = (outMaterialDetailPO.getQuantity() != null ? outMaterialDetailPO.getQuantity() : outMaterialDetailPO.getPickingQuantity());
// wantNumber = wantNumber.add(pickQty != null ? pickQty : BigDecimal.ZERO);
// alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO);
// }
// OutMaterialCheckPO outMaterialCheckPO = new OutMaterialCheckPO();
// outMaterialCheckPO.setCount(outMaterialDetailPOList.size());
// outMaterialCheckPO.setWeightLimit(weightLimit);
// outMaterialCheckPO.setVolumeLimit(volumeLimit);
// outMaterialCheckPO.setAlreadyNumber(alreadyNumber);
// outMaterialCheckPO.setNotHaveNumber(wantNumber.subtract(alreadyNumber));
// stockOutOrderPO.setOutMaterialCheckPO(outMaterialCheckPO);
//
// List<ReservationOutMaterialDetailPO> materialDetailList = stockOutOrderPO.getMaterialDetailList();
// // 性能优化批量获取批次属性避免N+1查询问题
// // 1. 收集所有唯一的materialBaseInfoId
// Set<Long> materialBaseInfoIdSet = materialDetailList.stream()
// .map(ReservationOutMaterialDetailPO::getMaterialBaseInfoId)
// .filter(Objects::nonNull)
// .collect(Collectors.toSet());
//
// // 2. 批量查询批次属性使用Map缓存避免重复查询相同的materialBaseInfoId
// Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
// for (Long materialBaseInfoId : materialBaseInfoIdSet) {
// try {
// AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
// if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
// List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(
// JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
// if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) {
// // 过滤isDisplay=1的属性
// List<BatchDetailFeignPO> filteredList = batchDetailFeignPOList.stream()
// .filter(batchDetail -> batchDetail.getIsDisplay() != null && batchDetail.getIsDisplay() == 1)
// .collect(Collectors.toList());
// batchDetailMap.put(materialBaseInfoId, filteredList);
// }
// }
// } catch (Exception e) {
// log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
// }
// }
//
// // 3. 为每个物料明细设置更多属性从库存表中获取值
// setMaterialMoreDetailListFromInventory(materialDetailList, batchDetailMap);
// // 过滤无拣货数量的明细pickingQuantity waitCheckQuantity 任一 >= 1 则保留waitCheckQuantity 来自 picking_material_detail 已拣货数量
// materialDetailList.removeIf(detail -> {
// BigDecimal pickQty = detail.getPickingQuantity() != null ? detail.getPickingQuantity() : BigDecimal.ZERO;
// BigDecimal waitQty = detail.getWaitCheckQuantity() != null ? detail.getWaitCheckQuantity() : BigDecimal.ZERO;
// return pickQty.compareTo(BigDecimal.ONE) < 0 && waitQty.compareTo(BigDecimal.ONE) < 0;
// });
// stockOutOrderPO.setMaterialDetailList(materialDetailList);
// return stockOutOrderPO;
// }
/**
* 将物料明细树形结构扁平化PDA端展示与PC端条数一致父项+子项全部展开为独立行
*/
private List<ReservationOutMaterialDetailPO> flattenMaterialDetailTree(List<ReservationOutMaterialDetailPO> treeList) {
if (CollectionUtils.isEmpty(treeList)) {
return new ArrayList<>();
}
List<ReservationOutMaterialDetailPO> result = new ArrayList<>();
for (ReservationOutMaterialDetailPO item : treeList) {
result.add(item);
List<ReservationOutMaterialDetailPO> children = item.getChildren();
if (!CollectionUtils.isEmpty(children)) {
List<ReservationOutMaterialDetailPO> flattenedChildren = flattenMaterialDetailTree(children);
result.addAll(flattenedChildren);
item.setChildren(null);
}
}
return result;
}
/**
* @description 修改出库单数据
* @author ZhouGY
* @date 2024/7/19 22:52
* @param stockOutOrderPO
* @param stockOutOrderDb
* @param type 1-分配 2-取消分配
* @return Boolean
*/
@Transactional(rollbackFor = Exception.class)
public Boolean updateReservationStockOutOrder(ReservationStockOutOrderPO stockOutOrderPO, ReservationStockOutOrder stockOutOrderDb, Integer type){
LoginUser loginUser = SecurityUtils.getLoginUser();
ReservationStockOutOrder stockOutOrder = new ReservationStockOutOrder();
stockOutOrder.setOutOrderId(stockOutOrderDb.getOutOrderId());
stockOutOrder.setStatus(8);
stockOutOrder.setCheckStatus(2);
if (type == 1){
stockOutOrder.setCheckQuantity(stockOutOrderDb.getCheckQuantity().add(stockOutOrderPO.getCheckQuantity()));
}else {
stockOutOrder.setCheckQuantity(stockOutOrderDb.getCheckQuantity().subtract(stockOutOrderPO.getCheckQuantity()));
}
stockOutOrder.setUpdateBy(loginUser.getUserid());
stockOutOrder.setUpdateByName(loginUser.getUsername());
stockOutOrder.setUpdateTime(new Date());
return stockOutOrderService.updateById(stockOutOrder);
}
/**
* @description 设置物料信息
* @author ZhouGY
* @date 2024/5/23 14:03
* @param stockOutOrderDO
*/
private void setMaterialDetailInfo(ReservationStockOutOrderDO stockOutOrderDO){
List<ReservationOutMaterialDetailDO> outMaterialDetailDOList = stockOutOrderDO.getMaterialDetailList();
outMaterialDetailDOList.forEach(outMaterialDetailDO -> {
// Long materialBaseInfoId = outMaterialDetailDO.getMaterialBaseInfoId();
MaterialBaseInfoPO materialBaseInfoPO = reservationStockInOrderMapper.getinfo(outMaterialDetailDO.getMaterialBaseInfoId());
if (materialBaseInfoPO == null){
throw new ServiceException("物料基础信息不存在");
}
outMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode());
outMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName());
outMaterialDetailDO.setBarCode(materialBaseInfoPO.getBarCode());
outMaterialDetailDO.setPackId(materialBaseInfoPO.getPackId());
outMaterialDetailDO.setPackCode(materialBaseInfoPO.getPackCode());
outMaterialDetailDO.setPackName(materialBaseInfoPO.getPackName());
});
}
}
@@ -0,0 +1,63 @@
package com.mhd.oms.domain.sysTableConfig.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author: brb
* @description:
* @create: 2026-03-04 14:30
*/
@Data
@TableName("sys_table_config")
public class SysTableConfig extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long id;
/*
* 仓库id
* */
@ApiModelProperty("仓库ID")
@Excel(name = "仓库ID")
private Long warehouseId;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
@Excel(name = "组织ID", width = 15)
private Long organizationId;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
@Excel(name = "一级组织ID", width = 15)
private Long topOrganizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
@Excel(name = "组织名称", width = 15)
private String organizationName;
/**键*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String key;
/**值*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String value;
/**备注说明*/
@ApiModelProperty(value = "备注说明")
@Excel(name = "备注说明", width = 15)
private String remark;
/**明细值*/
@ApiModelProperty(value = "明细值")
@Excel(name = "明细值", width = 15)
private String detailValue;
/**物料添加方式*/
@ApiModelProperty(value = "物料添加方式")
@Excel(name = "物料添加方式", width = 15)
private String materialAddType;
}
@@ -0,0 +1,57 @@
package com.mhd.oms.domain.sysTableConfig.repository.facade;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.oms.domain.sysTableConfig.entity.SysTableConfig;
import com.mhd.oms.domain.sysTableConfig.repository.todo.SysTableConfigDTO;
import com.mhd.oms.domain.sysTableConfig.repository.vo.SysTableConfigVO;
import java.util.List;
public interface ISysTableConfigService extends IService<SysTableConfig> {
/**
* 分页查询配置列表
* @param page 分页对象
* @param sysTableConfigDTO 查询条件
* @return 配置列表
*/
Page<SysTableConfigVO> queryList(Page<SysTableConfigVO> page, SysTableConfigDTO sysTableConfigDTO);
/**
* 根据组织 ID 和键查询配置
* @param organizationId 组织 ID
* @param key 配置键
* @return 配置信息
*/
SysTableConfig getByOrgIdAndKey(Long organizationId, String key,Long warehouseId);
/**
* 根据组织 ID 查询所有配置
* @param organizationId 组织 ID
* @return 配置列表
*/
List<SysTableConfig> listByOrgId(Long organizationId,Long warehouseId);
/**
* 保存或更新配置根据组织 ID 和键判断是新增还是更新
* @param sysTableConfigDTO 配置信息
* @return 是否成功
*/
boolean saveOrUpdateConfig(SysTableConfigDTO sysTableConfigDTO);
/**
* 删除配置
* @param ids 主键 ID 列表
* @return 是否成功
*/
int delete(List<String> ids);
/**
* 根据组织 ID 删除所有配置
* @param organizationId 组织 ID
* @return 是否成功
*/
int deleteByOrgId(Long organizationId);
}
@@ -0,0 +1,47 @@
package com.mhd.oms.domain.sysTableConfig.repository.mapper;
import java.util.List;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mhd.oms.domain.sysTableConfig.entity.SysTableConfig;
import com.mhd.oms.domain.sysTableConfig.repository.vo.SysTableConfigVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 系统表配置全局表内容展示顺序
* @Author: Assistant
* @Date: 2026-03-04
* @Version: V1.0
*/
public interface SysTableConfigMapper extends BaseMapper<SysTableConfig> {
/**
* 根据组织 ID 和键查询配置
* @param organizationId 组织 ID
* @param key 配置键
* @return 配置信息
*/
@Select("SELECT * FROM sys_table_config WHERE organization_id = #{organizationId} AND key = #{key} and warehouse_id = #{warehouseId}")
SysTableConfig getByOrgIdAndKey(@Param("organizationId") Long organizationId, @Param("key") String key, @Param("warehouseId") Long warehouseId);
/**
* 根据组织 ID 查询所有配置
* @param organizationId 组织 ID
* @return 配置列表
*/
@Select("SELECT * FROM sys_table_config WHERE organization_id = #{organizationId} and warehouse_id = #{warehouseId} ORDER BY create_time DESC")
List<SysTableConfig> listByOrgId(@Param("organizationId") Long organizationId, @Param("warehouseId") Long warehouseId);
/**
* 分页查询配置列表
* @param page 分页对象
* @param organizationId 组织 ID
* @param key 配置键可选
* @return 配置列表
*/
List<SysTableConfigVO> queryList(Page<SysTableConfigVO> page,
@Param("organizationId") Long organizationId,
@Param("key") String key, @Param("warehouseId") Long warehouseId);
}
@@ -0,0 +1,149 @@
package com.mhd.oms.domain.sysTableConfig.repository.persistence;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.sysTableConfig.entity.SysTableConfig;
import com.mhd.oms.domain.sysTableConfig.repository.facade.ISysTableConfigService;
import com.mhd.oms.domain.sysTableConfig.repository.mapper.SysTableConfigMapper;
import com.mhd.oms.domain.sysTableConfig.repository.todo.SysTableConfigDTO;
import com.mhd.oms.domain.sysTableConfig.repository.vo.SysTableConfigVO;
import com.mhd.system.api.domain.WlhyLoginUser;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Service
public class SysTableConfigServiceImpl extends ServiceImpl<SysTableConfigMapper, SysTableConfig> implements ISysTableConfigService {
@Resource
private SysTableConfigMapper sysTableConfigMapper;
@Override
public Page<SysTableConfigVO> queryList(Page<SysTableConfigVO> page, SysTableConfigDTO sysTableConfigDTO) {
// 获取登录人信息可选用于自动填充组织 ID
try {
WlhyLoginUser loginUser = SecurityUtils.getLoginUser().getWlhyLoginUser();
if (loginUser != null && sysTableConfigDTO.getOrganizationId() == null) {
// 如果没有传入组织 ID可以选择不设置或者设置默认值
// 这里保持传入参数不变 Mapper 层处理 null
}
} catch (Exception e) {
e.printStackTrace();
}
List<SysTableConfigVO> list = sysTableConfigMapper.queryList(page,
sysTableConfigDTO.getOrganizationId() != null ? sysTableConfigDTO.getOrganizationId().longValue() : null,
sysTableConfigDTO.getKey(), sysTableConfigDTO.getWarehouseId());
return page.setRecords(list);
}
@Override
public SysTableConfig getByOrgIdAndKey(Long organizationId, String key,Long warehouseId) {
if (organizationId == null || StringUtils.isBlank(key)) {
throw new ServiceException("组织 ID 和键不能为空");
}
if (warehouseId == null) {
throw new ServiceException("仓库 ID 不能为空");
}
return sysTableConfigMapper.getByOrgIdAndKey(organizationId, key,warehouseId);
}
@Override
public List<SysTableConfig> listByOrgId(Long organizationId, Long warehouseId) {
if (organizationId == null) {
throw new ServiceException("组织 ID 不能为空");
}
if (warehouseId == null) {
throw new ServiceException("仓库 ID 不能为空");
}
return sysTableConfigMapper.listByOrgId(organizationId, warehouseId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveOrUpdateConfig(SysTableConfigDTO sysTableConfigDTO) {
if (sysTableConfigDTO.getOrganizationId() == null) {
throw new ServiceException("组织 ID 不能为空");
}
if (StringUtils.isBlank(sysTableConfigDTO.getKey())) {
throw new ServiceException("配置键不能为空");
}
if (StringUtils.isBlank(sysTableConfigDTO.getValue())) {
throw new ServiceException("配置值不能为空");
}
if (sysTableConfigDTO.getWarehouseId() == null) {
throw new ServiceException("仓库 ID 不能为空");
}
// 获取登录人信息
WlhyLoginUser loginUser = SecurityUtils.getLoginUser().getWlhyLoginUser();
String username = loginUser != null ? loginUser.getUsername() : "system";
// 判断是新增还是更新
SysTableConfig existingConfig = sysTableConfigMapper.getByOrgIdAndKey(
sysTableConfigDTO.getOrganizationId().longValue(),
sysTableConfigDTO.getKey(), sysTableConfigDTO.getWarehouseId());
if (existingConfig != null) {
// 更新
existingConfig.setValue(sysTableConfigDTO.getValue());
//existingConfig.setUpdateBy(username);
existingConfig.setUpdateTime(new Date());
existingConfig.setDetailValue(sysTableConfigDTO.getDetailValue());
existingConfig.setMaterialAddType(sysTableConfigDTO.getMaterialAddType());
if (StringUtils.isNotBlank(sysTableConfigDTO.getRemark())) {
existingConfig.setRemark(sysTableConfigDTO.getRemark());
}
return this.updateById(existingConfig);
} else {
// 新增
SysTableConfig newConfig = new SysTableConfig();
BeanUtils.copyProperties(sysTableConfigDTO, newConfig);
//newConfig.setCreateBy(username);
newConfig.setCreateTime(new Date());
//newConfig.setUpdateBy(username);
newConfig.setUpdateTime(new Date());
return this.save(newConfig);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public int delete(List<String> ids) {
if (ids == null || ids.isEmpty()) {
throw new ServiceException("删除的 ID 不能为空");
}
// 简单的日志记录不做复杂的权限验证
try {
WlhyLoginUser loginUser = SecurityUtils.getLoginUser().getWlhyLoginUser();
if (loginUser != null) {
}
} catch (Exception e) {
e.printStackTrace();
}
return this.removeByIds(ids) ? ids.size() : 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteByOrgId(Long organizationId) {
if (organizationId == null) {
throw new ServiceException("组织 ID 不能为空");
}
LambdaQueryWrapper<SysTableConfig> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysTableConfig::getOrganizationId, organizationId);
return this.remove(queryWrapper) ? 1 : 0;
}
}
@@ -0,0 +1,61 @@
package com.mhd.oms.domain.sysTableConfig.repository.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author: brb
* @description:
* @create: 2026-03-04 14:30
*/
@Data
public class SysTableConfigPO extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long id;
/*
* 仓库id
* */
@ApiModelProperty("仓库ID")
@Excel(name = "仓库ID")
private Long warehouseId;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
@Excel(name = "组织ID", width = 15)
private Long organizationId;
/**键*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String key;
/**值*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String value;
/**备注说明*/
@ApiModelProperty(value = "备注说明")
@Excel(name = "备注说明", width = 15)
private String remark;
/**明细值*/
@ApiModelProperty(value = "明细值")
@Excel(name = "明细值", width = 15)
private String detailValue;
/**物料添加方式*/
@ApiModelProperty(value = "物料添加方式")
@Excel(name = "物料添加方式", width = 15)
private String materialAddType;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
@Excel(name = "一级组织ID", width = 15)
private Long topOrganizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
@Excel(name = "组织名称", width = 15)
private String organizationName;
}
@@ -0,0 +1,62 @@
package com.mhd.oms.domain.sysTableConfig.repository.todo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author: brb
* @description:
* @create: 2026-03-04 14:30
*/
@Data
@TableName("sys_table_config")
public class SysTableConfigDTO extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long id;
/*
* 仓库id
* */
@ApiModelProperty("仓库ID")
@Excel(name = "仓库ID")
private Long warehouseId;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
@Excel(name = "组织ID", width = 15)
private Long organizationId;
/**键*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String key;
/**值*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String value;
/**备注说明*/
@ApiModelProperty(value = "备注说明")
@Excel(name = "备注说明", width = 15)
private String remark;
/**明细值*/
@ApiModelProperty(value = "明细值")
@Excel(name = "明细值", width = 15)
private String detailValue;
/**物料添加方式*/
@ApiModelProperty(value = "物料添加方式")
@Excel(name = "物料添加方式", width = 15)
private String materialAddType;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
@Excel(name = "一级组织ID", width = 15)
private Long topOrganizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
@Excel(name = "组织名称", width = 15)
private String organizationName;
}
@@ -0,0 +1,62 @@
package com.mhd.oms.domain.sysTableConfig.repository.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author: brb
* @description:
* @create: 2026-03-04 14:30
*/
@Data
@TableName("sys_table_config")
public class SysTableConfigVO extends BaseVOEntity {
@TableId(type = IdType.AUTO)
private Long id;
/*
* 仓库id
* */
@ApiModelProperty("仓库ID")
@Excel(name = "仓库ID")
private Long warehouseId;
/**组织ID*/
@ApiModelProperty(value = "组织ID")
@Excel(name = "组织ID", width = 15)
private Long organizationId;
/**键*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String key;
/**值*/
@ApiModelProperty(value = "")
@Excel(name = "", width = 15)
private String value;
/**备注说明*/
@ApiModelProperty(value = "备注说明")
@Excel(name = "备注说明", width = 15)
private String remark;
/**明细值*/
@ApiModelProperty(value = "明细值")
@Excel(name = "明细值", width = 15)
private String detailValue;
/**物料添加方式*/
@ApiModelProperty(value = "物料添加方式")
@Excel(name = "物料添加方式", width = 15)
private String materialAddType;
/**一级组织ID*/
@ApiModelProperty(value = "一级组织ID")
@Excel(name = "一级组织ID", width = 15)
private Long topOrganizationId;
/**组织名称*/
@ApiModelProperty(value = "组织名称")
@Excel(name = "组织名称", width = 15)
private String organizationName;
}