| | |
| | | package zy.cloud.wms.common.service; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.SnowflakeIdWorker; |
| | | import com.core.exception.CoolException; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import zy.cloud.wms.common.config.CodeCoolException; |
| | | import zy.cloud.wms.common.model.OrderStoDto; |
| | | import zy.cloud.wms.common.service.asrs.AsrsService; |
| | | import zy.cloud.wms.common.service.asrs.entity.Result; |
| | | import zy.cloud.wms.common.service.asrs.entity.Result1; |
| | | import zy.cloud.wms.common.utils.VersionUtils; |
| | | import zy.cloud.wms.manager.entity.*; |
| | | import zy.cloud.wms.manager.entity.param.StockTransferParam; |
| | | import zy.cloud.wms.manager.entity.result.PakoutVo; |
| | | import zy.cloud.wms.manager.service.CustOrderService; |
| | | import zy.cloud.wms.manager.service.LocDetlService; |
| | | import zy.cloud.wms.manager.service.MatService; |
| | | import zy.cloud.wms.manager.service.PakoutService; |
| | | import zy.cloud.wms.manager.service.PriorService; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * Created by vincent on 2021/3/1 |
| | |
| | | @Autowired |
| | | private PakoutService pakoutService; |
| | | @Autowired |
| | | private PriorService priorService; |
| | | private CustOrderService custOrderService; |
| | | @Autowired |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | @Autowired |
| | | private AsrsService asrsService; |
| | | |
| | | @Transactional |
| | | public List<StoPreTab> stockOutPreview(OrderStoDto dto) { |
| | | if (Cools.isEmpty(dto) || Cools.isEmpty(dto.getCustOrders())) { |
| | | throw new CoolException("数据异常,请联系管理员"); |
| | | } |
| | | List<StoPreTab> res = new ArrayList<>(); |
| | | // 检查库存是否足够 |
| | | List<StockTransferParam> transferParams = locDetlService.checkLocDetlCountOfRes(dto.getNumber()); |
| | | if (!Cools.isEmpty(transferParams)) { |
| | | // 查看立库库存 |
| | | Result result = asrsService.stockTransferPrew(transferParams); |
| | | if (result.getCode() == 500) { |
| | | throw new CodeCoolException("20001-" + String.valueOf(result.getData())); |
| | | } |
| | | if (result.getCode() == 200) { |
| | | res = (List<StoPreTab>) result.getData(); |
| | | } |
| | | } |
| | | |
| | | for (CustOrder custOrder : dto.getCustOrders()) { |
| | | // 判断物料是否存在 |
| | | Mat mat = matService.selectByMatnr(custOrder.getUserCode()); |
| | | if (null == mat) { |
| | | throw new CoolException(custOrder.getUserCode() + "物料尚未更新。" + custOrder.getNumber() +"单据因此中断!"); |
| | | } |
| | | // 查询存有当前物料的货位 |
| | | List<LocDetl> locDetls = locDetlService.findOfSort(mat.getMatnr()); |
| | | double issued = Optional.ofNullable(custOrder.getQty()).orElse(0.0D) ; |
| | | double anfme = issued; |
| | | for (LocDetl locDetl : locDetls) { |
| | | if (issued > 0) { |
| | | // 视图对象 |
| | | StoPreTab tab = new StoPreTab(); |
| | | tab.setTitle(mat.getMatnr() + "(" + mat.getMaktx() + ")"); |
| | | tab.setMatnr(mat.getMatnr()); |
| | | tab.setMaktx(mat.getMaktx()); |
| | | tab.setAnfme(anfme); |
| | | |
| | | tab.setLocNo(locDetl.getLocNo()); |
| | | tab.setNodeId(locDetl.getNodeId()); |
| | | tab.setTotal(locDetl.getAnfme()); |
| | | tab.setReduce(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued); |
| | | tab.setRemQty(tab.getTotal() - tab.getReduce()); |
| | | tab.setPrior(locDetlService.isPrior(locDetl.getNodeId(), mat.getMatnr())); |
| | | tab.setPrior$(tab.getPrior()?"✔":"×"); |
| | | tab.setType(1); |
| | | res.add(tab); |
| | | // 剩余待出数量递减 |
| | | issued = issued - locDetl.getAnfme(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | res.sort(new Comparator<StoPreTab>() { |
| | | @Override |
| | | public int compare(StoPreTab o1, StoPreTab o2) { |
| | | // return o1.getMatnr().length() - o2.getMatnr().length(); |
| | | return (int) (o1.getAnfme() - o2.getAnfme()); |
| | | } |
| | | }); |
| | | return res; |
| | | } |
| | | |
| | | @Transactional |
| | | public void stockOutProcess(OrderStoDto dto) { |
| | |
| | | return; |
| | | } |
| | | Date now = new Date(); |
| | | |
| | | /******************************* 立库拣货单 ********************************/ |
| | | // 检查库存是否足够 |
| | | List<StockTransferParam> transferParams = locDetlService.checkLocDetlCountOfRes(dto.getNumber()); |
| | | if (!Cools.isEmpty(transferParams)) { |
| | | // 查看立库库存 |
| | | Result1 result = asrsService.stockTransfer(transferParams); |
| | | if (result.getCode() == 500) { |
| | | if (Cools.isEmpty(result.getData())) { |
| | | throw new CodeCoolException(result.getMsg()); |
| | | } else { |
| | | throw new CodeCoolException("20001-" + result.getData()); |
| | | } |
| | | } |
| | | if (result.getCode() == 200) { |
| | | for (PakoutVo vo : result.getData()) { |
| | | // 判断物料是否存在 |
| | | Mat mat = matService.selectByMatnr(vo.getMatnr()); |
| | | if (null == mat) { |
| | | throw new CoolException(vo.getMatnr() + "物料尚未更新。" + dto.getNumber() +"单据因此中断!"); |
| | | } |
| | | Pakout pakout = new Pakout(); |
| | | pakout.setWrkSts(1L); |
| | | pakout.setAnfme(vo.getAnfme()); |
| | | pakout.setZpallet(vo.getZpallet()); |
| | | pakout.setLocNo(vo.getLocNo()); |
| | | pakout.setNodeId(-1L); |
| | | pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId())); |
| | | VersionUtils.setPakout(pakout, mat); |
| | | pakout.setDocId(getDocId(dto.getNumber())); // 单据类型 |
| | | pakout.setDocNum(dto.getNumber()); // 单据编号 |
| | | pakout.setCreateTime(now); |
| | | pakout.setUpdateTime(now); |
| | | pakout.setStatus(1); |
| | | if (!pakoutService.insert(pakout)) { |
| | | throw new CoolException("保存出库通知单失败"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /******************************* 平仓拣货单 ********************************/ |
| | | for (CustOrder custOrder : dto.getCustOrders()) { |
| | | // 判断物料是否存在 |
| | | Mat mat = matService.selectByMatnr(custOrder.getUserCode()); |
| | | if (null == mat) { |
| | | throw new CoolException(custOrder.getUserCode() + "物料尚未更新。" + custOrder.getNumber() +"单据因此中断!"); |
| | | } |
| | | // 根据推荐库位查找库存 |
| | | List<Prior> priors = priorService.selectList(new EntityWrapper<Prior>().eq("matnr", mat.getMatnr()).orderBy("prio")); |
| | | if (!Cools.isEmpty(priors)) { |
| | | for (Prior prior : priors) { |
| | | LocDetl locDetl = locDetlService.getLocDetl(prior.getNodeId(), prior.getMatnr()); |
| | | if (null != locDetl && locDetl.getAnfme() > 0) { |
| | | // 保存出库通知单 |
| | | Pakout pakout = new Pakout(); |
| | | pakout.setWrkSts(1L); |
| | | // pakout.setAnfme(); |
| | | pakout.setZpallet(locDetl.getZpallet()); |
| | | pakout.setLocNo(locDetl.getLocNo()); |
| | | pakout.setNodeId(locDetl.getNodeId()); |
| | | pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId())); |
| | | VersionUtils.setPakout(pakout, mat); |
| | | pakout.setCreateTime(now); |
| | | pakout.setUpdateTime(now); |
| | | pakout.setStatus(1); |
| | | if (!pakoutService.insert(pakout)) { |
| | | throw new CoolException("保存出库通知单失败"); |
| | | } |
| | | |
| | | // 查询存有当前物料的货位 |
| | | List<LocDetl> locDetls = locDetlService.findOfSort(mat.getMatnr()); |
| | | double issued = Optional.ofNullable(custOrder.getQty()).orElse(0.0D) ; |
| | | for (LocDetl locDetl : locDetls) { |
| | | if (issued > 0) { |
| | | // 保存出库通知单 |
| | | Pakout pakout = new Pakout(); |
| | | pakout.setWrkSts(1L); |
| | | pakout.setAnfme(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued); |
| | | pakout.setZpallet(locDetl.getZpallet()); |
| | | pakout.setLocNo(locDetl.getLocNo()); |
| | | pakout.setNodeId(locDetl.getNodeId()); |
| | | pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId())); |
| | | VersionUtils.setPakout(pakout, mat); |
| | | pakout.setDocId(getDocId(dto.getNumber())); // 单据类型 |
| | | pakout.setDocNum(custOrder.getNumber()); // 单据编号 |
| | | pakout.setCreateTime(now); |
| | | pakout.setUpdateTime(now); |
| | | pakout.setStatus(1); |
| | | if (!pakoutService.insert(pakout)) { |
| | | throw new CoolException("保存出库通知单失败"); |
| | | } |
| | | if (issued>=locDetl.getAnfme()) { |
| | | // // 删除库存明细 |
| | | // if (!locDetlService.removeStock(locDetl.getNodeId(), mat.getMatnr())) { |
| | | // throw new CoolException("删除库存明细失败"); |
| | | // } |
| | | } else { |
| | | // // 修改库存明细数量 |
| | | // if (!locDetlService.reduceStock(locDetl.getNodeId(), mat.getMatnr(), issued)) { |
| | | // throw new CoolException("修改库存明细数量失败"); |
| | | // } |
| | | } |
| | | // 剩余待出数量递减 |
| | | issued = issued - locDetl.getAnfme(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // 修改单据状态 |
| | | if (!custOrderService.updateStatus(custOrder.getNumber(), 2)) { |
| | | throw new CoolException("修改单据状态失败"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private Long getDocId(String number) { |
| | | if (number.startsWith("PR")) { |
| | | return 6L; |
| | | } |
| | | return 11L; |
| | | } |
| | | |
| | | } |