|
@@ -43,7 +43,9 @@ import com.ruoyi.ams.inv.service.IInvLotAttService;
|
|
|
import com.ruoyi.ams.inv.service.IInvLotLocIdService;
|
|
|
import com.ruoyi.base.constant.Constant;
|
|
|
import com.ruoyi.base.constant.type.BizEnum;
|
|
|
+import com.ruoyi.base.domain.BaseLocationInfo;
|
|
|
import com.ruoyi.base.domain.BaseSku;
|
|
|
+import com.ruoyi.base.service.IBaseLocationInfoService;
|
|
|
import com.ruoyi.base.service.IBaseSkuService;
|
|
|
import com.ruoyi.common.constant.Constants;
|
|
|
import com.ruoyi.common.constant.base.EnumUtils;
|
|
@@ -88,6 +90,8 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
private IInvLotLocIdService invLotLocIdService;
|
|
|
@Autowired
|
|
|
private IInvLotAttService invLotAttService;
|
|
|
+ @Autowired
|
|
|
+ private IBaseLocationInfoService baseLocationInfoService;
|
|
|
|
|
|
/**
|
|
|
* 根据单号和单据类型生成入库任务
|
|
@@ -121,17 +125,40 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
if (StringUtils.equals(docType, BizEnum.BionutritionExcelDocTitleEnum.PURCHASE_ORDER.getDocType())) {
|
|
|
this.addPurchaseReceiptDoc(bionutritionDocBaseDTO, docDetailsBaseDTO, asnAgvCallDTO);
|
|
|
}
|
|
|
- // 4.获取配置信息单据类型或物料类型对应流程id
|
|
|
+ // 4.生成agv呼叫对象
|
|
|
+ AgvCallDTO agvCallDTO = this.getASNAgvCallDTO(asnAgvCallDTO, bionutritionDocHeaderBaseDTO, docDetailsBaseDTO);
|
|
|
+ // 如果不叫车,只需生成库存,锁定库位
|
|
|
+ if (StringUtils.equals(asnAgvCallDTO.getIfCallCar(), Constant.IS_YES.N.name())) {
|
|
|
+ this.initInventoryWithOutCallCar(asnAgvCallDTO, agvCallDTO);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 5.获取配置信息单据类型或物料类型对应流程id
|
|
|
List<Long> flowIds = this.getFlowIdByDocTypeOrSkuType(docType, docDetailsBaseDTO.getSkuCode());
|
|
|
List<FlowConfigHeaderVO> flowConfigHeaderVOList = flowConfigHeaderService.selectFlowConfigHeaderByIds(flowIds);
|
|
|
Long flowId = flowConfigHeaderVOList.stream().filter(f -> StringUtils.equals(Constant.BUSINESS_TYPE.ASN.getValue(), f.getFlowType()))
|
|
|
.map(FlowConfigHeaderVO::getId)
|
|
|
.findFirst().orElse(null);
|
|
|
- // 5.生成agv呼叫对象,生成对应wcs任务
|
|
|
- AgvCallDTO agvCallDTO = this.getASNAgvCallDTO(asnAgvCallDTO, bionutritionDocHeaderBaseDTO, docDetailsBaseDTO, null);
|
|
|
+ // 6.生成对应wcs任务
|
|
|
businessService.agvCall(flowId, agvCallDTO);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 不呼叫车,直接生成库存
|
|
|
+ * @param asnAgvCallDTO
|
|
|
+ * @param agvCallDTO
|
|
|
+ */
|
|
|
+ private void initInventoryWithOutCallCar(AsnAgvCallDTO asnAgvCallDTO, AgvCallDTO agvCallDTO) {
|
|
|
+ BaseLocationInfo locationFrom = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(asnAgvCallDTO.getLocationFrom()));
|
|
|
+ Assert.isTrue(ObjectUtil.isNotEmpty(locationFrom), "未找到对应库位信息");
|
|
|
+ Assert.isTrue(StringUtils.equals(locationFrom.getStockStatus(), Constant.STOCK_STATUS.STOCK00.getValue()), "入库起始点位不是空闲状态");
|
|
|
+ // 初始化库存
|
|
|
+ // 删除起始点库存
|
|
|
+ invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
|
|
|
+ // 添加批次和库存信息
|
|
|
+ invLotLocIdService.initInv(locationFrom.getId().toString(), agvCallDTO);
|
|
|
+ baseLocationInfoService.updateLocationStockStatus(Long.parseLong(asnAgvCallDTO.getLocationFrom()), Constant.STOCK_STATUS.STOCK10.getValue());
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据明细行号筛选明细
|
|
|
* @param lineNo
|
|
@@ -229,12 +256,11 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
/*long qty = docDetailsBaseDTOList.stream().filter(item -> StringUtils.isNotBlank(item.getSkuQty()))
|
|
|
.mapToLong(item -> Long.parseLong(item.getSkuQty())).sum();*/
|
|
|
// 判断已搬运的数量加上当前搬运数量是否小于采购单对应明细的总数量
|
|
|
- long qty = StrUtil.isBlank(docDetailsBaseDTO.getTransferredQty()) ? 0 : Long.valueOf(docDetailsBaseDTO.getTransferredQty());
|
|
|
- long qtySupposed = Long.parseLong(docDetailsBaseDTO.getSkuQty());
|
|
|
- long qtyRemain = qtySupposed - qty;
|
|
|
- boolean ifLessEqualQty = qty <= qtySupposed;
|
|
|
+ BigDecimal qtyTransferred = StrUtil.isBlank(docDetailsBaseDTO.getTransferredQty()) ? BigDecimal.ZERO : new BigDecimal(docDetailsBaseDTO.getTransferredQty());
|
|
|
+ BigDecimal qtySupposed = new BigDecimal(docDetailsBaseDTO.getSkuQty());
|
|
|
+ BigDecimal qtyRemain = qtySupposed.subtract(qtyTransferred);
|
|
|
log.info("当前搬运数量{},剩余未搬运数量{}",asnAgvCallDTO.getQty(), qtyRemain);
|
|
|
- Assert.isTrue(ifLessEqualQty, "搬运数量超出范围,剩余数量为"+qtyRemain);
|
|
|
+ Assert.isTrue(NumberUtil.isLessOrEqual(qtyTransferred, qtySupposed), "搬运数量超出范围,剩余数量为"+qtyRemain);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -242,7 +268,7 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
* @param asnAgvCallDTO
|
|
|
* @return
|
|
|
*/
|
|
|
- private AgvCallDTO getASNAgvCallDTO(AsnAgvCallDTO asnAgvCallDTO, BionutritionDocHeaderBaseDTO docHeaderBaseDTO, BionutritionDocDetailsBaseDTO docDetailsBaseDTO, BigDecimal totalAmount) {
|
|
|
+ private AgvCallDTO getASNAgvCallDTO(AsnAgvCallDTO asnAgvCallDTO, BionutritionDocHeaderBaseDTO docHeaderBaseDTO, BionutritionDocDetailsBaseDTO docDetailsBaseDTO) {
|
|
|
DocLotattDTO docLotattDTO = ConvertUtils.sourceToTarget(docDetailsBaseDTO, DocLotattDTO.class);
|
|
|
// 根据物料编码查询物料信息
|
|
|
BaseSku baseSku = skuService.selectBaseSkuByCustomerId(Constants.DEFAULT_CUSTOMER_ID, asnAgvCallDTO.getSkuCode());
|
|
@@ -255,8 +281,8 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
agvCallItemDTO.setSku(asnAgvCallDTO.getSkuCode());
|
|
|
agvCallItemDTO.setQty(Double.valueOf(asnAgvCallDTO.getQty()));
|
|
|
// 计算一托盘总量
|
|
|
- if (ObjectUtil.isEmpty(totalAmount)) totalAmount = this.buildTotalAmount(baseSku, asnAgvCallDTO.getQty());
|
|
|
- agvCallItemDTO.setTotalAmount(totalAmount);
|
|
|
+// if (ObjectUtil.isEmpty(totalAmount)) totalAmount = this.buildTotalAmount(baseSku, asnAgvCallDTO.getQty());
|
|
|
+// agvCallItemDTO.setTotalAmount(totalAmount);
|
|
|
agvCallItemDTO.setLotattDTO(lotattDTO);
|
|
|
agvCallItemDTOList.add(agvCallItemDTO);
|
|
|
AgvCallDTO agvCallDTO = new AgvCallDTO();
|
|
@@ -406,7 +432,8 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
asnAgvCallDTO.setLineNo(asnDocDetailsBaseDTO.getDocLineNo());
|
|
|
asnAgvCallDTO.setDocType(asnDocHeaderBaseDTO.getDocType());
|
|
|
asnAgvCallDTO.setStatus(invLotAtt.getLotatt05());
|
|
|
- AgvCallDTO agvCallDTO = this.getASNAgvCallDTO(asnAgvCallDTO, asnDocHeaderBaseDTO, asnDocDetailsBaseDTO, returningInventoryDTO.getTotalAmount());
|
|
|
+ asnAgvCallDTO.setIfSample(invLotLocId.getIfSample());
|
|
|
+ AgvCallDTO agvCallDTO = this.getASNAgvCallDTO(asnAgvCallDTO, asnDocHeaderBaseDTO, asnDocDetailsBaseDTO);
|
|
|
// 6.生成搬运任务
|
|
|
List<Long> flowIds = this.getFlowIdByDocTypeOrSkuType(asnDocHeaderBaseDTO.getDocType(), asnDocDetailsBaseDTO.getSkuCode());
|
|
|
List<FlowConfigHeaderVO> flowConfigHeaderVOList = flowConfigHeaderService.selectFlowConfigHeaderByIds(flowIds);
|
|
@@ -423,7 +450,7 @@ public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
|
|
|
* @param totalAmount
|
|
|
* @return
|
|
|
*/
|
|
|
- private String getQtyBySpecs(String skuCode, BigDecimal totalAmount){
|
|
|
+ public String getQtyBySpecs(String skuCode, BigDecimal totalAmount){
|
|
|
Assert.isTrue(ObjectUtil.isNotEmpty(totalAmount),"请填写回库物料总量");
|
|
|
// 根据物料编码查询物料信息
|
|
|
BaseSku baseSku = skuService.selectBaseSkuByCustomerId("default", skuCode);
|