|
@@ -2,20 +2,40 @@ package com.ruoyi.ams.xuankuang.service;
|
|
|
|
|
|
import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
|
|
|
import com.ruoyi.ams.asn.domain.WmsDocAsnHeader;
|
|
|
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
|
|
|
+import com.ruoyi.ams.inv.domain.InvLotLocId;
|
|
|
+import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
|
|
|
+import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
|
|
|
+import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
|
|
|
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
|
|
|
import com.ruoyi.ams.order.domain.WmsDocOrderDetails;
|
|
|
import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
|
|
|
import com.ruoyi.ams.order.service.IWmsDocOrderDetailsService;
|
|
|
import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
|
|
|
+import com.ruoyi.ams.order.vo.StockOrderVO;
|
|
|
+import com.ruoyi.ams.task.domain.WcsTask;
|
|
|
import com.ruoyi.ams.xuankuang.domain.form.BillTaskForm;
|
|
|
+import com.ruoyi.ams.xuankuang.domain.form.OutTaskForm;
|
|
|
+import com.ruoyi.ams.xuankuang.domain.vo.WcsResponseVo;
|
|
|
import com.ruoyi.base.constant.Constant;
|
|
|
+import com.ruoyi.base.domain.BaseLocationInfo;
|
|
|
+import com.ruoyi.base.domain.BaseSku;
|
|
|
+import com.ruoyi.base.domain.vo.BaseLocationLotattVO;
|
|
|
+import com.ruoyi.base.service.IBaseLocationInfoService;
|
|
|
+import com.ruoyi.base.service.IBaseSkuService;
|
|
|
import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
+import com.ruoyi.common.utils.StringUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.bind.annotation.PathVariable;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+import static com.ruoyi.ams.xuankuang.service.BaseLocationInfoSubService.OUT_ZONES;
|
|
|
|
|
|
/**
|
|
|
* 出库业务
|
|
@@ -32,29 +52,214 @@ public class WmsDocOrderSubService {
|
|
|
private IWmsDocOrderHeaderService iWmsDocOrderHeaderService;
|
|
|
@Autowired
|
|
|
private IWmsDocOrderDetailsService iWmsDocOrderDetailsService;
|
|
|
+ @Autowired
|
|
|
+ private WcsTaskSubService wcsTaskSubService;
|
|
|
+ @Autowired
|
|
|
+ private IInvLotLocIdService invLotLocIdService;
|
|
|
+ @Autowired
|
|
|
+ InvLotLocIdMapper invLotLocIdMapper;
|
|
|
+ @Autowired
|
|
|
+ IBaseLocationInfoService baseLocationInfoService;
|
|
|
+ @Autowired
|
|
|
+ BaseLocationInfoSubService baseLocationInfoSubService;
|
|
|
+ @Autowired
|
|
|
+ private IBaseSkuService iBaseSkuService;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Transactional
|
|
|
public AjaxResult initOrderDetails(@PathVariable("orderNo") String orderNo) {
|
|
|
- List<WmsDocOrderDetails> list = iWmsDocOrderHeaderService.initOrderDetails(orderNo);
|
|
|
+ // 根据单号,和创建状态为00
|
|
|
+ WmsDocOrderDetails wmsDocOrderDetails = new WmsDocOrderDetails();
|
|
|
+ wmsDocOrderDetails.setOrderNo(orderNo);
|
|
|
+ wmsDocOrderDetails.setLineStatus(Constant.ASN_STS.STS00.getValue());
|
|
|
+ List<WmsDocOrderDetails> list = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsList(wmsDocOrderDetails);
|
|
|
+
|
|
|
+ // 查询出库单头
|
|
|
WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo);
|
|
|
- for (WmsDocOrderDetails details:list) {
|
|
|
- BillTaskForm billTaskForm = new BillTaskForm();
|
|
|
- billTaskForm.setDocNo(details.getOrderNo());
|
|
|
- billTaskForm.setTaskNo(details.getOrderLineNo().toString());
|
|
|
- if (details.getDesc2()==5){
|
|
|
- billTaskForm.setPackageType(2);
|
|
|
+
|
|
|
+ // 匹配库存
|
|
|
+ List<BaseLocationLotattVO> baseLocationLotattVOS = addConfirmAllocationAuto(orderNo);
|
|
|
+
|
|
|
+ //筛选库存
|
|
|
+ BaseLocationLotattVO baseLocationLotattVO = filterInv(baseLocationLotattVOS, orderNo);
|
|
|
+
|
|
|
+ boolean con = true;
|
|
|
+ for (WmsDocOrderDetails wmsDocOrderDetails1 : list){
|
|
|
+
|
|
|
+ BaseSku baseSku = iBaseSkuService.selectBaseSkuByCustomerId(Constant.CUSTOMER_ID, wmsDocOrderDetails1.getSku());
|
|
|
+
|
|
|
+ String pallentNo = baseLocationLotattVO.getLotattVO().getLotatt07();
|
|
|
+ String locationFrom = baseLocationLotattVO.getLocationNo();
|
|
|
+ String wcsNo = null;// todo 生成唯一标识wcsno
|
|
|
+
|
|
|
+ //Wcs x y z
|
|
|
+ String Y = baseLocationLotattVO.getRowNo();
|
|
|
+ String Z = baseLocationLotattVO.getShiftNo();
|
|
|
+ String X = baseLocationLotattVO.getRowIndex();
|
|
|
+ String sku = baseLocationLotattVO.getSku();
|
|
|
+
|
|
|
+ // 生成四向车出库任务
|
|
|
+ AjaxResult ajaxResult = wcsTaskSubService.addWcsOutTask(locationFrom, Constant.LOC_SORTATION_CACHE.toString(), orderNo, pallentNo, wcsNo);
|
|
|
+
|
|
|
+ //调用出库任务下发接口
|
|
|
+ OutTaskForm outTaskForm = new OutTaskForm();
|
|
|
+ String taskNo =ajaxResult.get("data").toString();
|
|
|
+ outTaskForm.setTaskNo(taskNo);
|
|
|
+ outTaskForm.setRow(Integer.parseInt(X));
|
|
|
+ outTaskForm.setCol(Integer.parseInt(Z));
|
|
|
+ outTaskForm.setFloor(Integer.parseInt(Y));
|
|
|
+
|
|
|
+ outTaskForm.setPackageType(Integer.valueOf(baseSku.getSkuType()));
|
|
|
+ outTaskForm.setMaterial(Integer.valueOf(baseSku.getDesc2()));
|
|
|
+
|
|
|
+ outTaskForm.setTotal(wmsDocOrderDetails1.getQtyOrderedEach().intValue());
|
|
|
+ outTaskForm.setDocNo(orderNo);
|
|
|
+ WmsToWcsApiService wmsToWcsApiService = new WmsToWcsApiService();
|
|
|
+ WcsResponseVo wcsResponseVo = wmsToWcsApiService.wmsOutTask(outTaskForm);
|
|
|
+ if (!wcsResponseVo.isSuccess()) {
|
|
|
+ con = false;
|
|
|
+ continue;
|
|
|
}
|
|
|
- billTaskForm.setType(Constant.ASN_TYP.getByValue(wmsDocOrderHeader.getOrderType()).getValue1());
|
|
|
- billTaskForm.setNum(details.getQtyOrdered().intValue());
|
|
|
-// billTaskForm.setDest(Constant.PRODUCTION_LINE_SITE.getByValue());
|
|
|
- billTaskForm.setMaterial(details.getDesc2());
|
|
|
-// WmsToWcsApiService wmsToWcsApiService = new WmsToWcsApiService();
|
|
|
-// wmsToWcsApiService.wmsBillTask(billTaskForm);
|
|
|
- }
|
|
|
- return AjaxResult.success("", list);
|
|
|
+ // 修改 明细行状态为10
|
|
|
+ wmsDocOrderDetails1.setLineStatus(Constant.ASN_STS.STS10.getValue());
|
|
|
+ iWmsDocOrderDetailsService.updateWmsDocOrderDetails(wmsDocOrderDetails1);
|
|
|
+ }
|
|
|
+ if (con == true) {
|
|
|
+ // 修改 单头10
|
|
|
+ wmsDocOrderHeader.setOrderStatus(Constant.ASN_STS.STS10.getValue());
|
|
|
+ iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader);
|
|
|
+ }
|
|
|
+ return AjaxResult.success("",list);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 匹配库存
|
|
|
+ * @param orderNo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<BaseLocationLotattVO> addConfirmAllocationAuto(String orderNo){
|
|
|
+ List<WmsDocOrderDetails> detailslist=null;
|
|
|
+ // 查询出库单头
|
|
|
+ WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo);
|
|
|
+ if (wmsDocOrderHeader != null){
|
|
|
+ if (wmsDocOrderHeader.getOrderStatus().equals(Constant.ORDER_STS.STS00.getValue())){
|
|
|
+ //根据出库单头查询出库单明细
|
|
|
+ detailslist = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsByOrderNo(orderNo);
|
|
|
+ if (detailslist.size()==0){
|
|
|
+ log.error("单据没有可匹配明细");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ log.error("只有新建单据才可分配");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ log.error("单号不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<InvLotLocId> list = new ArrayList<>();
|
|
|
|
|
|
+ String sku = null;
|
|
|
+ LotattDTO lotattDTO = new LotattDTO();
|
|
|
+ String orderBy = null;
|
|
|
+ List<String> outZones = OUT_ZONES;
|
|
|
|
|
|
+ //分配
|
|
|
+ for (WmsDocOrderDetails o: detailslist) {
|
|
|
+ sku = o.getSku();
|
|
|
+ BigDecimal qtyOrderedEach = o.getQtyOrderedEach();
|
|
|
+ orderBy = qtyOrderedEach.toString();
|
|
|
+ }
|
|
|
+ List<BaseLocationLotattVO> baseLocationLotattVOS = baseLocationInfoSubService.selectAllocatingInventoryAccordingConditionsOrderBy(outZones, lotattDTO, sku, orderBy);
|
|
|
+ if (baseLocationLotattVOS.size()==0){
|
|
|
+ log.info("仓库中无库存");
|
|
|
+ }
|
|
|
+ return baseLocationLotattVOS;
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 筛选库存
|
|
|
+ * @param baseLocationLotattVO
|
|
|
+ * @param orderNo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public synchronized BaseLocationLotattVO filterInv(List<BaseLocationLotattVO> baseLocationLotattVOS,String orderNo){
|
|
|
+ // 根据单号,和创建状态为00
|
|
|
+ WmsDocOrderDetails wmsDocOrderDetails = new WmsDocOrderDetails();
|
|
|
+ wmsDocOrderDetails.setOrderNo(orderNo);
|
|
|
+ wmsDocOrderDetails.setLineStatus(Constant.ASN_STS.STS00.getValue());
|
|
|
+ List<WmsDocOrderDetails> list = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsList(wmsDocOrderDetails);
|
|
|
|
|
|
+ BaseLocationLotattVO baseLocationLotattVO = new BaseLocationLotattVO();
|
|
|
+ for (BaseLocationLotattVO baseLocationLotattVO1:baseLocationLotattVOS) {
|
|
|
+ //库存数量
|
|
|
+ String sku = baseLocationLotattVO1.getSku();
|
|
|
+ Float qty = baseLocationLotattVO1.getQty();
|
|
|
+
|
|
|
+ for (WmsDocOrderDetails wmsDocOrderDetails1:list) {
|
|
|
+ //出库数量
|
|
|
+ String sku1 = wmsDocOrderDetails1.getSku();
|
|
|
+ BigDecimal qtyAllocatedEach = wmsDocOrderDetails1.getQtyOrderedEach();
|
|
|
+ if (sku.equals(sku1)){
|
|
|
+ int i = qty.compareTo(qtyAllocatedEach.floatValue());
|
|
|
+ if (i == 0){
|
|
|
+ baseLocationLotattVO=baseLocationLotattVO1;
|
|
|
+ return baseLocationLotattVO;
|
|
|
+ }else if (i > 0){
|
|
|
+ baseLocationLotattVO=baseLocationLotattVO1;
|
|
|
+ return baseLocationLotattVO;
|
|
|
+ }else {
|
|
|
+ BigDecimal qty1 = new BigDecimal(qty);
|
|
|
+ BigDecimal subtract = qtyAllocatedEach.subtract(qty1);
|
|
|
+ if (subtract.intValue()==0){
|
|
|
+ baseLocationLotattVO=baseLocationLotattVO1;
|
|
|
+ return baseLocationLotattVO;
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return baseLocationLotattVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* *//**
|
|
|
+ * 取消分配
|
|
|
+ *//*
|
|
|
+ public AjaxResult deAllocation(String orderNo) {
|
|
|
+ List<WmsDocOrderDetails> detailslist=null;
|
|
|
+ //出库单
|
|
|
+ WmsDocOrderHeader wmsDocOrderHeader = iWmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo);
|
|
|
+ List<WmsDocOrderDetails> list = null;//所有分配单
|
|
|
+ if (wmsDocOrderHeader != null){
|
|
|
+ if (wmsDocOrderHeader.getOrderStatus().equals(Constant.ORDER_STS.STS10) || wmsDocOrderHeader.getOrderStatus().equals(Constant.ORDER_STS.STS20)){
|
|
|
+ //根据出库单头查询出库单明细
|
|
|
+ detailslist = iWmsDocOrderDetailsService.selectWmsDocOrderDetailsByOrderNo(orderNo);
|
|
|
+ if (detailslist.size()==0){
|
|
|
+ return AjaxResult.success("单据没有可取消分配的明细");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return AjaxResult.error("只有已分配单据才可取消");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return AjaxResult.error("单号不存在");
|
|
|
+ }
|
|
|
+// // 修改库位状态 修改出库单状态
|
|
|
+ for (WmsDocOrderDetails details : detailslist) {
|
|
|
+// //修改分配库位状态
|
|
|
+ BaseLocationInfo baseLocationInfo = new BaseLocationInfo();
|
|
|
+ baseLocationInfo.setLocationNo(details.getLocation());
|
|
|
+ baseLocationInfo.setStockStatus(Constant.STOCK_STATUS.STOCK00.toString());
|
|
|
+ baseLocationInfoService.updateBaseLocationInfo(baseLocationInfo);
|
|
|
+ //修改出库单据状态
|
|
|
+ WmsDocOrderDetails wmsDocOrderDetails = new WmsDocOrderDetails();
|
|
|
+ wmsDocOrderDetails.setOrderNo(orderNo);
|
|
|
+ wmsDocOrderDetails.setLineStatus(Constant.ORDER_STS.STS10.toString());
|
|
|
+ iWmsDocOrderDetailsService.updateWmsDocOrderDetails(wmsDocOrderDetails);
|
|
|
+//
|
|
|
+ }
|
|
|
+ //修改出库单据状态
|
|
|
+ wmsDocOrderHeader.setOrderStatus(Constant.ORDER_STS.STS00.toString());
|
|
|
+ iWmsDocOrderHeaderService.updateWmsDocOrderHeader(wmsDocOrderHeader);
|
|
|
+ return AjaxResult.success("取消分配成功");
|
|
|
+ }*/
|
|
|
}
|