package zy.cloud.wms.common.service; import com.core.common.Cools; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import lombok.extern.slf4j.Slf4j; 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.MatnrDto; 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.LocDetlService; import zy.cloud.wms.manager.service.MatService; import zy.cloud.wms.manager.service.OrderService; import zy.cloud.wms.manager.service.PakoutService; import java.util.*; /** * Created by vincent on 2021/3/1 */ @Slf4j @Service("mainService") public class MainService { @Autowired private MatService matService; @Autowired private LocDetlService locDetlService; @Autowired private PakoutService pakoutService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private OrderService orderService; @Autowired private AsrsService asrsService; @Transactional public List stockOutPreview(OrderStoDto orderStoDto) { if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) { throw new CoolException("数据异常,请联系管理员"); } List res = new ArrayList<>(); // 检查库存是否足够 List transferParams = locDetlService.checkLocDetlCountOfRes(orderStoDto.getDtos()); if (!Cools.isEmpty(transferParams)) { // 查看立库库存 Result result = asrsService.stockTransferPrew(transferParams); if (result.getCode() == 500) { throw new CodeCoolException("20001-" + String.valueOf(result.getMsg())); } if (result.getCode() == 200) { res = (List) result.getData(); } } for (MatnrDto matnrDto : orderStoDto.getDtos()) { // 判断物料是否存在 Mat mat = matService.selectByMatnr(matnrDto.getMatnr()); if (null == mat) { throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!"); } // 查询存有当前物料的货位 List locDetls = locDetlService.findOfSort(mat.getMatnr()); double issued = Optional.ofNullable(matnrDto.getCount()).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() { @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 orderStoDto) { if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) { return; } Order order = orderService.selectByOrderNo(orderStoDto.getOrderNo()); if (order == null) { throw new CoolException(orderStoDto.getOrderNo() + "单据不存在"); } Date now = new Date(); // 检查库存是否足够 List transferParams = locDetlService.checkLocDetlCountOfRes(orderStoDto.getDtos()); if (!Cools.isEmpty(transferParams)) { // 查看立库库存 Result1 result = asrsService.stockTransfer(transferParams); if (result.getCode() == 500) { if (Cools.isEmpty(result.getData())) { throw new CoolException(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() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!"); } 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(order.getDocType()); // 单据类型 pakout.setDocNum(order.getOrderNo()); // 单据编号 pakout.setCreateTime(now); pakout.setUpdateTime(now); pakout.setStatus(1); if (!pakoutService.insert(pakout)) { throw new CoolException("保存出库通知单失败"); } } } } for (MatnrDto matnrDto : orderStoDto.getDtos()) { // 判断物料是否存在 Mat mat = matService.selectByMatnr(matnrDto.getMatnr()); if (null == mat) { throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + matnrDto.getCount() +"单据因此中断!"); } // 查询存有当前物料的货位 List locDetls = locDetlService.findOfSort(mat.getMatnr()); double issued = Optional.ofNullable(matnrDto.getCount()).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(order.getDocType()); // 单据类型 pakout.setDocNum(order.getOrderNo()); // 单据编号 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 (!orderService.updateSettle(orderStoDto.getOrderNo(), 2L)) { throw new CoolException("修改单据状态失败"); } } } }