package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.*; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; import com.zy.asrs.entity.result.*; import com.zy.asrs.enums.LocStsType; import com.zy.asrs.mapper.LocMastMapper; import com.zy.asrs.mapper.ManLocDetlMapper; import com.zy.asrs.service.*; import com.zy.asrs.utils.OrderInAndOutUtil; import com.zy.common.model.LocTypeDto; import com.zy.common.model.StartupDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** * 移动端服务核心类 * Created by vincent on 2020/6/28 */ @Slf4j @Service public class MobileServiceImpl implements MobileService { @Autowired private MatService matService; @Autowired private WaitPakinService waitPakinService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; @Autowired private WrkDetlService wrkDetlService; @Autowired private BasCrnpService basCrnpService; @Autowired private LocMastService locMastService; @Autowired private LocDetlService locDetlService; @Autowired private StaDescService staDescService; @Autowired private CommonService commonService; @Autowired private NodeService nodeService; @Autowired private ManLocDetlService manLocDetlService; @Autowired private ManLocDetlMapper manLocDetlMapper; @Resource private LocMastMapper locMastMapper; @Resource private DocTypeService docTypeService; @Resource private OrderDetlPakinService orderDetlPakinService; @Resource private OrderPakinService orderPakinService; @Resource private OrderPakoutService orderPakoutService; @Resource private OrderDetlPakoutService orderDetlPakoutService; @Autowired private LocCacheService locCacheService; @Autowired private TaskService taskService; @Autowired private TaskDetlService taskDetlService; @Autowired private BasStationService basStationService; @Override @Transactional public R WarehouseOutPickMergeV1(WarehouseOutPickMergeParam param, Long hostId, Long userId) { // 判断库位状态 LocMast locMast = locMastService.selectOne(new EntityWrapper().eq("loc_no", param.getLocNo())); if (Cools.isEmpty(locMast)) { return R.error("该库位不存在"); } if (!locMast.getLocSts().equals("P")) { return R.error("该库位状态为:" + locMast.getLocSts() + ",不满足拣料途中并板条件!!!"); } Date now = new Date(); // 创建入库工作主档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(commonService.getWorkNo(0)); wrkMast.setIoTime(now); wrkMast.setWrkSts(4L); // 工作状态:入库完成 wrkMast.setIoType(8); // 入出库状态:8.拣料途中并板 wrkMast.setIoPri(13D); // 优先级 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(1 + ""); wrkMast.setStaNo(1 + ""); wrkMast.setLocNo(param.getLocNo()); wrkMast.setBarcode(param.getBarcode()); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); wrkMast.setCtnType(0); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiTime(now); wrkMast.setAppeUser(userId); wrkMast.setModiUser(userId); wrkMastService.insert(wrkMast); for (OrderDetl orderDetl : param.getCombMats()) { Mat mat = matService.selectOne(new EntityWrapper().eq("matnr", orderDetl.getMatnr())); if (mat == null) { throw new CoolException("保存工作档失败,物料信息不存在:" + orderDetl.getMatnr()); } WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(mat); wrkDetl.setOrderNo(orderDetl.getOrderNo()); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.setIoTime(now); wrkDetl.setAnfme(orderDetl.getAnfme()); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setZpallet(wrkMast.getBarcode()); wrkDetl.setBatch(orderDetl.getBatch()); if (Cools.isEmpty(orderDetl.getBatch())) { wrkDetl.setBatch(""); } wrkDetl.setBoxType1(orderDetl.getBoxType1()); wrkDetl.setBoxType2(orderDetl.getBoxType2()); wrkDetl.setBoxType3(orderDetl.getBoxType3()); wrkDetl.setStandby1(orderDetl.getStandby1()); wrkDetl.setStandby2(orderDetl.getStandby2()); wrkDetl.setStandby3(orderDetl.getStandby3()); // 生成工作档明细 wrkDetlService.insert(wrkDetl); if (!Cools.isEmpty(orderDetl.getOrderNo())) { OrderPakin order = orderPakinService.selectByNo(orderDetl.getOrderNo()); if (Cools.isEmpty(order)) { continue; } OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3()); if (Cools.isEmpty(orderDetlPakin)) { continue; } if (orderDetlPakin.getAnfme() < (orderDetlPakin.getWorkQty() + orderDetl.getAnfme())) { throw new CoolException("并板数量出错,订单剩余出库数量小于已出库数量与将并板数量之和!!!"); } // 修改订单明细作业数量 if (!orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(), orderDetlPakin.getBrand(), orderDetlPakin.getStandby1(), orderDetlPakin.getStandby2(), orderDetlPakin.getStandby3(), orderDetlPakin.getBoxType1(), orderDetlPakin.getBoxType2(), orderDetlPakin.getBoxType3(), orderDetl.getAnfme())) { throw new CoolException("修改单据明细工作数量失败"); } if (order.getSettle() == 1) { orderPakinService.updateSettle(order.getId(), 2L, userId); } } } return R.ok(); } @Override @Transactional public R pickConfirm(PickConfirmParam param, Long userId) { LocMast locMast = locMastService.selectOne(new EntityWrapper() .eq("loc_no", param.getLocNo())); if (!locMast.getLocSts().equals("F")) { return R.error("库位状态不是在库"); } // 判断库位是否冻结 String sourceLocFrozen = locMastMapper.findFirstFrozenLocNo(Collections.singletonList(locMast.getLocNo())); if (sourceLocFrozen != null) { throw new CoolException(sourceLocFrozen + "库位已被冻结!"); } StaDesc staDesc = staDescService.selectOne(new EntityWrapper() .eq("type_no", 104) .eq("stn_no", param.getStaNo())); if (staDesc == null) { return R.error("站点不存在"); } OrderDetlPakin orderDetlPakin = null; // 检验传参是否和订单明细匹配 for (PickMatParam matParam : param.getList()) { orderDetlPakin = orderDetlPakinService.selectItem(matParam.getOrderNo(), matParam.getMatnr(), matParam.getBatch(), matParam.getBrand(), matParam.getStandby1(), matParam.getStandby2(), matParam.getStandby3(), matParam.getBoxType1(), matParam.getBoxType2(), matParam.getBoxType3()); if (orderDetlPakin == null) { return R.error("物料数据不存在"); } // 剩余可用数量 double count = orderDetlPakin.getAnfme() - orderDetlPakin.getWorkQty(); if (matParam.getCount() != count) { return R.error("物料数据已过期"); } if (matParam.getUseCount() > count) { return R.error("可用数量不足"); } } Date now = new Date(); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(104)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:101.生成出库 wrkMast.setIoType(104); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setSourceLocNo(param.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("Y"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeUser(userId); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); wrkMast.setCrnNo(staDesc.getCrnNo()); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + param.getLocNo()); } // 生成工作档明细 for (PickMatParam matParam : param.getList()) { Wrapper wrapper = new EntityWrapper<>(); wrapper.eq("status", 1); wrapper.eq("matnr", matParam.getMatnr()); Mat mat = matService.selectOne(wrapper); if (mat == null) { throw new CoolException("保存工作档失败,物料信息不存在:" + matParam.getMatnr()); } WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(mat); wrkDetl.setBatch(matParam.getBatch()); wrkDetl.setOrderNo(matParam.getOrderNo()); wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); wrkDetl.setAnfme(matParam.getUseCount()); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setZpallet(wrkMast.getBarcode()); if (Cools.isEmpty(matParam.getBatch())) { wrkDetl.setBatch(""); } if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } // 更新订单工作数量 orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), matParam.getMatnr(), matParam.getBatch(), matParam.getBrand(), matParam.getStandby1(), matParam.getStandby2(), matParam.getStandby3(), matParam.getBoxType1(), matParam.getBoxType2(), matParam.getBoxType3(), matParam.getUseCount()); // 更新工作档状态 orderPakinService.updateSettle(orderDetlPakin.getOrderId(), 2L, userId); } // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 locMast = locMastService.selectOne(new EntityWrapper().eq("loc_no", param.getLocNo())); if (locMast.getLocSts().equals("F")) { locMast.setLocSts("P"); locMast.setModiUser(userId); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("预约库位状态失败,库位号:" + param.getLocNo()); } } else { throw new CoolException(param.getLocNo() + "库位不是在库状态"); } return R.ok(); } @Override @Transactional public R WarehouseOutV1(CombParam combParam, Long hostId, Long userId) { // 判断库位状态 LocMast locMast = locMastService.selectOne(new EntityWrapper().eq("loc_no", combParam.getLocNo())); if (Cools.isEmpty(locMast)) { return R.error("该库位不存在"); } if (!locMast.getLocSts().equals("P")) { return R.error("该库位状态为:" + locMast.getLocSts() + ",不满足并板途中拣选条件!!!"); } // 查询库存数据 for (CombParam.CombMat combMat : combParam.getCombMats()) { List locDetlList = locDetlService.selectList(new EntityWrapper() .eq("loc_no", combParam.getLocNo()) .eq("matnr", combMat.getMatnr())); if (locDetlList.isEmpty()) { return R.error("未查询到库存数据"); } if (locDetlList.size() > 1) { return R.error("库存数据大于1条,为保证数据准确性,请用正常流程出库!!!"); } LocDetl locDetl = locDetlList.get(0); if (combMat.getAnfme() > locDetl.getAnfme()) { return R.error("拣选数量错误,超出库存数量"); } if (!Cools.isEmpty(combMat.getOrderNo())) { OrderPakout orderPakout = orderPakoutService.selectByNo(combMat.getOrderNo()); if (Cools.isEmpty(orderPakout)) { continue; } if (orderPakout.getSettle() == 1) { OrderInAndOutUtil.updateOrder(false, orderPakout.getId(), 2L, 9527L); } OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(orderPakout.getId(), combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(), combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3()); if (Cools.isEmpty(orderDetlPakout)) { continue; } if (orderDetlPakout.getAnfme() < (orderDetlPakout.getWorkQty() + combMat.getAnfme())) { throw new CoolException("拣选数量出错,订单剩余出库数量小于已出库数量与将拣选数量之和!!!"); } // 修改订单明细作业数量 if (!orderDetlPakoutService.increaseWorkQty(orderDetlPakout.getOrderId(), combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(), combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3(), combMat.getAnfme())) { throw new CoolException("修改单据明细工作数量失败"); } // // 修改订单明细完成数量 // if (!orderDetlPakoutService.increase(orderPakout.getId(),combMat.getMatnr(), // combMat.getBatch(), combMat.getBrand(), // combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), // combMat.getBoxType1(), combMat.getBoxType2(), // combMat.getBoxType3(),combMat.getAnfme())) { // throw new CoolException("修改单据明细完成数量失败"); // } // // 修改订单状态 作业中 ===>> 已完成 // orderPakoutService.checkComplete(combMat.getOrderNo()); } try { Date now = new Date(); // 创建入库工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(commonService.getWorkNo(2)); wrkMast.setIoTime(now); wrkMast.setWrkSts(14L); // 工作状态:出库完成 wrkMast.setIoType(108); // 入出库状态:出库,拣料入库 wrkMast.setIoPri(13D); // 优先级 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(1 + ""); wrkMast.setStaNo(1 + ""); wrkMast.setSourceLocNo(combParam.getLocNo()); wrkMast.setBarcode(combParam.getBarcode()); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); wrkMast.setCtnType(0); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiTime(now); wrkMast.setAppeUser(userId); wrkMast.setModiUser(userId); wrkMastService.insert(wrkMast); Mat mat = matService.selectOne(new EntityWrapper().eq("matnr", combMat.getMatnr())); if (mat == null) { throw new CoolException("保存工作档失败,物料信息不存在:" + combMat.getMatnr()); } WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(mat); wrkDetl.setOrderNo(combMat.getOrderNo()); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.setIoTime(now); wrkDetl.setAnfme(combMat.getAnfme()); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setZpallet(wrkMast.getBarcode()); wrkDetl.setBatch(combMat.getBatch()); if (Cools.isEmpty(combMat.getBatch())) { wrkDetl.setBatch(""); } wrkDetl.setBoxType1(combMat.getBoxType1()); wrkDetl.setBoxType2(combMat.getBoxType2()); wrkDetl.setBoxType3(combMat.getBoxType3()); wrkDetl.setStandby1(combMat.getStandby1()); wrkDetl.setStandby2(combMat.getStandby2()); wrkDetl.setStandby3(combMat.getStandby3()); // 生成工作档明细 wrkDetlService.insert(wrkDetl); System.out.println("正常"); } catch (Exception e) { throw new CoolException("操作数据异常:" + e.getMessage()); } } return R.ok("操作成功!"); } @Override public R orderOutListOrder(String barcode, Long userId) { ArrayList wrkMastArrayList = new ArrayList<>(); if (Cools.isEmpty(barcode) || barcode.isEmpty()) { List wrkMasts = wrkMastService.selectList(new EntityWrapper() .eq("wrk_sts", 14L) .eq("io_type", 104)); wrkMastArrayList.addAll(wrkMasts); List wrkMasts1 = wrkMastService.selectList(new EntityWrapper() .eq("wrk_sts", 14L) .eq("io_type", 107)); wrkMastArrayList.addAll(wrkMasts1); } else { List wrkMasts = wrkMastService.selectList(new EntityWrapper() .like("barcode", barcode) .eq("wrk_sts", 199L) .eq("io_type", 104)); wrkMastArrayList.addAll(wrkMasts); List wrkMasts1 = wrkMastService.selectList(new EntityWrapper() .like("barcode", barcode) .eq("wrk_sts", 199L) .eq("io_type", 107)); wrkMastArrayList.addAll(wrkMasts1); } return R.ok().add(wrkMastArrayList); } @Override public R orderOutListOrderPick(String barcode, Long userId) { ArrayList wrkMastArrayList = new ArrayList<>(); if (Cools.isEmpty(barcode) || barcode.isEmpty()) { List wrkMasts = wrkMastService.selectList(new EntityWrapper() .eq("wrk_sts", 199L) .eq("io_type", 103)); wrkMastArrayList.addAll(wrkMasts); List wrkMasts1 = wrkMastService.selectList(new EntityWrapper() .eq("wrk_sts", 199L) .eq("io_type", 107)); wrkMastArrayList.addAll(wrkMasts1); } else { List wrkMasts = wrkMastService.selectList(new EntityWrapper() .like("barcode", barcode) .eq("wrk_sts", 199L) .eq("io_type", 103)); wrkMastArrayList.addAll(wrkMasts); List wrkMasts1 = wrkMastService.selectList(new EntityWrapper() .like("barcode", barcode) .eq("wrk_sts", 199L) .eq("io_type", 107)); wrkMastArrayList.addAll(wrkMasts1); } return R.ok().add(wrkMastArrayList); } @Override public R pickMats(String matnr, String orderNo) { List docTypes = docTypeService.selectList(new EntityWrapper().like("pakin", "1")); ArrayList typeList = new ArrayList<>(); for (DocType docType : docTypes) { typeList.add(docType.getDocId()); } Wrapper wrapper = new EntityWrapper<>(); wrapper.eq("status", 1); wrapper.in("doc_type", typeList); List orders = orderService.selectList(wrapper); ArrayList orderIds = new ArrayList<>(); for (Order order : orders) { orderIds.add(order.getId()); } // 搜索明细 Wrapper wrapper1 = new EntityWrapper<>(); wrapper1.eq("status", 1); wrapper1.in("order_id", orderIds); wrapper1.orderBy("create_time", false); if (!Cools.isEmpty(matnr)) { wrapper1.like("matnr", matnr); } if (!Cools.isEmpty(orderNo)) { wrapper1.like("order_no", orderNo); } List list = orderDetlService.selectList(wrapper1); ArrayList maps = new ArrayList<>(); for (OrderDetl orderDetl : list) { // 剩余可用数量 double count = orderDetl.getAnfme() - orderDetl.getWorkQty(); if (count <= 0) { continue; } PickMatParam matParam = new PickMatParam(); matParam.setMatnr(orderDetl.getMatnr()); matParam.setBatch(orderDetl.getBatch()); matParam.setOrderNo(orderDetl.getOrderNo()); matParam.setOrderId(orderDetl.getOrderId()); matParam.setCount(count); matParam.setUseCount(count); maps.add(matParam); } return R.ok().add(maps); } // @Override // @Transactional(rollbackFor = Exception.class) // public void comb(CombParam param, Long userId) { // if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) { // throw new CoolException(BaseRes.PARAM); // } // if (param.getCombMats().size() < 1) { // throw new CoolException("请提取一个商品,或者刷新重新组托!"); // } // // 判断是否有相同条码的数据 // if (waitPakinService.selectCount(new EntityWrapper().eq("zpallet", param.getBarcode()) // .eq("io_status", "N")) > 0) { // throw new CoolException(param.getBarcode() + "数据正在进行入库"); // } // // if (Objects.isNull(param.getBarcode())) { // throw new CoolException("托盘码不能为空!!"); // } // // BasContainer container = basContainerService // .selectOne(new EntityWrapper().eq("barcode", param.getBarcode())); // if (Objects.isNull(container)) { // throw new CoolException("数据错误:容器码不存在!!"); // } // // if (param.getBarcode().length() != 8) { // // throw new CoolException("条码长度不是8位===>>" + param.getBarcode()); // // } // // if (Objects.isNull(param.getType())) { // param.setType("0"); // } // int countLoc = locDetlService.selectCount(new EntityWrapper().eq("zpallet", param.getBarcode())); // int countWrk = wrkDetlService.selectCount(new EntityWrapper().eq("zpallet", param.getBarcode())); // int countwait = waitPakinService.selectCount(new EntityWrapper() // .eq(!Objects.isNull(param.getType()), "type", param.getType()) // .eq("zpallet", param.getBarcode())); // if (countLoc > 0 || countWrk > 0 || countwait > 0) { // throw new CoolException("组托档/工作档/库存条码数据已存在===>>" + param.getBarcode()); // } // // Date now = new Date(); // // 无单组托 // if (Cools.isEmpty(param.getOrderNo())) { // // 生成入库通知档 // List detlDtos = new ArrayList<>(); // param.getCombMats().forEach(elem -> { // DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getBrand(), elem.getStandby1(), // elem.getStandby2(), elem.getStandby3(), // elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3(), elem.getAnfme(), // elem.getThreeCode()); // if (DetlDto.has(detlDtos, detlDto)) { // DetlDto one = DetlDto.findDto(detlDtos, detlDto); // assert one != null; // one.setAnfme(one.getAnfme() + detlDto.getAnfme()); // } else { // detlDtos.add(detlDto); // } // }); // // for (DetlDto detlDto : detlDtos) { // Mat mat = matService.selectByMatnr(detlDto.getMatnr()); // if (Cools.isEmpty(mat)) { // throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); // } // if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) { // throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty()); // } // WaitPakin waitPakin = new WaitPakin(); // BeanUtils.copyProperties(mat, waitPakin); // waitPakin.setBatch(detlDto.getBatch()); // waitPakin.setZpallet(param.getBarcode()); // waitPakin.setIoStatus("N"); // waitPakin.setAnfme(detlDto.getAnfme()); // waitPakin.setThreeCode(detlDto.getThreeCode()); // waitPakin.setStatus("Y"); // waitPakin.setSuppCode(detlDto.getStandby1()); // waitPakin.setStandby1(detlDto.getStandby1()); // waitPakin.setStandby2(detlDto.getStandby2()); // waitPakin.setStandby3(detlDto.getStandby3()); // waitPakin.setBoxType1(detlDto.getBoxType1()); // waitPakin.setBoxType2(detlDto.getBoxType2()); // waitPakin.setBoxType3(detlDto.getBoxType3()); // waitPakin.setAppeUser(userId); // waitPakin.setAppeTime(now); // waitPakin.setModiUser(userId); // waitPakin.setModiTime(now); // if (!waitPakinService.insert(waitPakin)) { // throw new CoolException("保存入库通知档失败"); // } // } // // 关联组托 // } else { // // Order order = orderService.selectByNo(param.getOrderNo()); // // 生成入库通知档 // List detlDtos = new ArrayList<>(); // param.getCombMats().forEach(elem -> { // Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE, elem.getOrderNo()); // if (Cools.isEmpty(order) || order.getSettle() > 2) { // throw new CoolException("单据编号已过期"); // } // // 订单明细数量校验 // // OrderDetl orderDetl = OrderInAndOutUtil.selectItem(Boolean.TRUE, // // order.getId(), elem.getMatnr(), elem.getBatch(), elem.getBrand(), // // elem.getStandby1(), elem.getStandby2(), elem.getStandby3(), // // elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3()); // OrderDetlPakin detls = orderDetlPakinService.selectOne(new EntityWrapper() // .eq("order_id", order.getId()) // .eq("matnr", elem.getMatnr())); // // if (Objects.isNull(detls)) { // throw new CoolException("数据错误:单据明细不存在!!"); // } // // if (elem.getAnfme() > detls.getEnableQty()) { // throw new CoolException(detls.getMatnr() + "入库数量不合规则"); // } // OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, order.getId(), elem.getMatnr(), elem.getBatch(), // elem.getBrand(), elem.getStandby1(), elem.getStandby2(), elem.getStandby3(), // elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3(), elem.getAnfme()); // DetlDto detlDto = new DetlDto(order.getOrderNo(), elem.getMatnr(), elem.getBatch(), elem.getBrand(), elem.getStandby1(), // elem.getStandby2(), elem.getStandby3(), // elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3(), elem.getAnfme(), // elem.getThreeCode()); // detlDto.setOrderId(order.getId()); // detlDto.setOrderNo(order.getOrderNo()); // if (DetlDto.hasOrder(detlDtos, detlDto)) { // DetlDto one = DetlDto.findDto(detlDtos, detlDto); // assert one != null; // one.setAnfme(one.getAnfme() + detlDto.getAnfme()); // } else { // detlDtos.add(detlDto); // } // }); // // Set matnrs = detlDtos.stream().map(DetlDto::getMatnr).collect(Collectors.toSet()); // List mats = matService.selectList(new EntityWrapper().in("matnr", matnrs)); // Set tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet()); // if (tagIds.size() > 1) { // throw new CoolException("组托物料类型不一致,只有相同的物料分类才可以组托!!"); // } // // // BasContainer container = basContainerService.selectOne(new // // EntityWrapper().eq("barcode", param.getBarcode())); // // if (Objects.isNull(container)) { // // throw new CoolException("数据错误:容器码不存在!!"); // // } // // if (container.getMixMax() < detlDtos.size()) { // // throw new CoolException("超出容器最大混装数量,当前容器最大数量为:" + container.getMixMax() + // // "!!"); // // } // // 还可以放入多少种物料 // // Integer suplus = container.getMixMax(); // for (DetlDto detlDto : detlDtos) { // Mat mat = matService.selectByMatnr(detlDto.getMatnr()); // if (Cools.isEmpty(mat)) { // throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); // } // // //最多可放数量 // // Double singleMax = mat.getUpQty() * suplus; // // if (singleMax.compareTo(detlDto.getAnfme()) < 0) { // // throw new CoolException("物料:" + detlDto.getMatnr() + "单次组托上限为:" + // // mat.getUpQty() + ",当前总量超出托盘装载上限!!"); // // } // // BigDecimal decimal = new BigDecimal(detlDto.getAnfme() / mat.getUpQty()); // // //当前物料需要占用料箱格数 // // Integer curr = decimal.setScale(0, RoundingMode.CEILING).intValue(); // // suplus = suplus - curr; // // if (suplus < 0) { // // throw new CoolException("物料:" + detlDto.getMatnr() + ", 超出当前托盘装载上限!!"); // // } // // WaitPakin waitPakin = new WaitPakin(); // BeanUtils.copyProperties(mat, waitPakin); // waitPakin.setOrderNo(detlDto.getOrderNo()); // 单据编号 // waitPakin.setType(param.getType()); // waitPakin.setOrderId(detlDto.getOrderId()); // waitPakin.setBatch(detlDto.getBatch()); // 序列码 // waitPakin.setZpallet(param.getBarcode()); // 托盘码 // waitPakin.setThreeCode(detlDto.getThreeCode()); // waitPakin.setSuppCode(detlDto.getStandby1()); // waitPakin.setStandby1(detlDto.getStandby1()); // waitPakin.setIoStatus("N"); // 入出状态 // waitPakin.setAnfme(detlDto.getAnfme()); // 数量 // waitPakin.setStatus("Y"); // 状态 // waitPakin.setAppeUser(userId); // waitPakin.setAppeTime(now); // waitPakin.setModiUser(userId); // waitPakin.setModiTime(now); // if (!waitPakinService.insert(waitPakin)) { // throw new CoolException("保存入库通知档失败"); // } // } // // Set stringSet = param.getCombMats().stream().map(CombParam.CombMat::getOrderNo) // .collect(Collectors.toSet()); // stringSet.forEach(orderNo -> { // Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE, orderNo); // OrderInAndOutUtil.updateOrder(Boolean.TRUE, order.getId(), 2L, userId); // }); // } // // } // 商品上架 @Override public void onSale(CombParam param) { Date now = new Date(); // 获取库位号 String locno = param.getLocNo(); Node node = nodeService.selectByUuid(locno); if (Cools.isEmpty(node)) { throw new CoolException(param.getLocNo() + ":库位不存在"); } // 获取商品列表 for (CombParam.CombMat combMat : param.getCombMats()) { Mat mat = matService.selectByMatnr(combMat.getMatnr()); if (Cools.isEmpty(mat)) { throw new CoolException(combMat.getMatnr() + ":商品档案不存在!"); } if (Cools.isEmpty(combMat.getAnfme()) || combMat.getAnfme() == 0) { throw new CoolException(combMat.getMatnr() + ":商品数量有误!"); } if (Cools.isEmpty(combMat.getBatch())) { // throw new CoolException(combMat.getMatnr() + ":商品批号有误!"); } ManLocDetl manLocDetl = new ManLocDetl(); manLocDetl.setLocNo(locno); manLocDetl.setNodeId(node.getId()); manLocDetl.setMaktx(mat.getMaktx()); manLocDetl.setMatnr(mat.getMatnr()); manLocDetl.setBatch(Cools.isEmpty(combMat.getBatch()) ? "" : combMat.getBatch()); manLocDetl.setAnfme(combMat.getAnfme()); manLocDetl.setModiTime(now); if (!manLocDetlService.insert(manLocDetl)) { throw new CoolException("商品上架失败!"); } } } // 商品下架 @Override public void offSale(OffSaleParam offSaleParam) { ManLocDetl manLocDetl = manLocDetlMapper.selectLocNo0(offSaleParam.getLocNo(), offSaleParam.getMatnr()); if (Cools.isEmpty(manLocDetl)) { throw new CoolException("无此商品!"); } double anfme = manLocDetl.getAnfme() - offSaleParam.getAnfme(); if (anfme < 0) { throw new CoolException("商品库存不足!"); } else if (anfme == 0) { manLocDetlMapper.deleteLocNo0(offSaleParam.getLocNo(), offSaleParam.getMatnr()); } manLocDetlMapper.updateAnfme0(anfme, manLocDetl.getNodeId()); } // 查找商品 @Override @Transactional public void adjust(MobileAdjustParam param, Long userId) { BasDevp basDevp = basDevpService.selectById(param.getStaNo()); if (null == basDevp || basDevp.getWrkNo() == null) { throw new CoolException(param.getStaNo() + "盘点站无效"); } if (!param.getWrkNo().equals(basDevp.getWrkNo())) { throw new CoolException(param.getStaNo() + "盘点站更新,请重新检索"); } WrkMast wrkMast = wrkMastService.selectById(param.getWrkNo()); if (wrkMast.getWrkSts() < 10) { throw new CoolException("盘点无效,任务已盘点再入库"); } Date now = new Date(); List wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); List list = param.getWrkDetls(); // 修改数量 Iterator iterator = wrkDetls.iterator(); while (iterator.hasNext()) { WrkDetl wrkDetl = iterator.next(); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { WrkDetl wrkDetl1 = iterator1.next(); if (wrkDetl1.getAnfme() == 0) { iterator1.remove(); } if (wrkDetl.getMatnr().equals(wrkDetl1.getMatnr()) && Cools.eq(wrkDetl.getBatch(), wrkDetl1.getBatch())) { if (!wrkDetl.getAnfme().equals(wrkDetl1.getAnfme())) { // todo 盘点记录、保存调整记录 // 修改明细 if (!wrkDetlService.updateAnfme(wrkDetl1.getAnfme(), wrkMast.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) { throw new CoolException(wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "批号修改数量失败"); } } iterator.remove(); iterator1.remove(); } } } // 删除明细 for (WrkDetl wrkDetl : wrkDetls) { // todo 盘点记录、保存调整记录 if (!wrkDetlService.updateAnfme(-1.0D, wrkMast.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) { throw new CoolException("删除" + wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "批号任务明细失败"); } } // 添加明细 for (WrkDetl wrkDetl : list) { if (wrkDetl.getAnfme() == 0.0D) { continue; } // todo 盘点记录、保存调整记录 String orderNo = wrkDetl.getOrderNo(); Mat mat = matService.selectByMatnr(wrkDetl.getMatnr()); wrkDetl.sync(mat); wrkDetl.setOrderNo(orderNo); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("添加" + wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "批号任务明细失败"); } } // 修改盘点任务主档状态 wrkMast.setFullPlt(wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()).size() != 0 ? "Y" : "N"); wrkMast.setModiTime(now); wrkMast.setModiUser(userId); if (!wrkMastService.updateById(wrkMast)) { throw new CoolException("修改盘点任务主档失败"); } } @Override @Transactional public void pakoutByOrder(JSONObject param, Long userId) { Integer staNo = param.containsKey("staNo") ? Integer.parseInt(param.get("staNo").toString()) : 0; String orderNo = param.containsKey("orderNo") ? param.get("orderNo").toString() : ""; BasDevp sta = basDevpService.checkSiteStatus(staNo); // 根据订单号生成出库任务工作档 Order order = OrderInAndOutUtil.selectByNo(Boolean.FALSE, orderNo); // Order order = orderService.selectOne(new // EntityWrapper().eq("order_no", orderNo)); if (order.getSettle() != 1 && order.getSettle() != 2) { throw new CoolException("该订单已处理"); } // List orderDetls = orderDetlService.selectList(new // EntityWrapper().eq("order_no", orderNo)); List orderDetls = OrderInAndOutUtil.selectByOrderId(Boolean.FALSE, order.getId()); Date now = new Date(); for (OrderDetl orderDetl : orderDetls) { // 查询所有库位状态为F的库位信息 List locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, null); if (locDetls.size() == 0) { throw new CoolException("库存中没有该物料"); } for (LocDetl locDetl : locDetls) { // 如果该库位出库路线所用的堆垛机out_enable不为Y,跳过该循环 LocMast locMast = locMastService.selectOne(new EntityWrapper() .eq("loc_no", locDetl.getLocNo())); if (Cools.isEmpty(locMast)) { continue; } BasCrnp crn_no = basCrnpService.selectOne(new EntityWrapper() .eq("crn_no", locMast.getCrnNo())); if (Cools.isEmpty(crn_no) || !crn_no.getOutEnable().equals("Y")) { continue; } // 可出库数量 = 订单数量 - 作业中数量 Double outQty = orderDetl.getAnfme() - orderDetl.getWorkQty(); if (outQty <= 0) { break; } // 判断入出库类型:101.全板出库 or 103.拣料出库 Double sumCount = locDetlService.getLocDetlSumQty(locDetl.getLocNo()); Double curOutQty = outQty >= locDetl.getAnfme() ? locDetl.getAnfme() : outQty; // 本次出库量 int ioType = sumCount <= curOutQty ? 101 : 103; stockOut(orderDetl, sta, locDetl, curOutQty, ioType, userId, now); order.setSettle(2L); order.setUpdateBy(userId); order.setUpdateTime(now); // if(!orderService.update(order, new EntityWrapper().eq("order_no", // orderNo))){ // throw new CoolException("更新订单状态失败"); // } OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(), order.getId(), 2L, userId); orderDetl.setWorkQty(orderDetl.getWorkQty() + curOutQty); orderDetl.setUpdateBy(userId); orderDetl.setUpdateTime(now); Wrapper wrapper = new EntityWrapper().eq("order_no", orderNo) .eq("matnr", orderDetl.getMatnr()); if (!Cools.isEmpty(orderDetl.getBatch())) { wrapper.eq("batch", orderDetl.getBatch()); } // if(!orderDetlService.update(orderDetl, wrapper)){ // throw new CoolException("更新订单明细失败"); // } OrderInAndOutUtil.updateOrderDetl(order.getPakinPakoutStatus$(), order, orderDetl); } } } @Override @Transactional public void stockOut(OrderDetl orderDetl, BasDevp staNo, LocDetl locDetl, Double curOutQty, Integer ioType, Long userId, Date now) { // 获取库位 LocMast locMast = locMastService.selectById(locDetl.getLocNo()); // 获取路径 Wrapper wrapper = new EntityWrapper() .eq("type_no", ioType) .eq("stn_no", staNo.getDevNo()) .eq("crn_no", locMast.getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { throw new CoolException("出库路径不存在"); } // 生成工作号 int workNo = commonService.getWorkNo(2); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setSourceLocNo(locDetl.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setAppeUser(userId); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); wrkMast.setBarcode(locMast.getBarcode()); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + locDetl.getLocNo()); } WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(locDetl); wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); wrkDetl.setAnfme(curOutQty); // 数量 wrkDetl.setOrderNo(orderDetl.getOrderNo()); wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 locMast = locMastService.selectById(locDetl.getLocNo()); if (locMast.getLocSts().equals("F")) { locMast.setLocSts(ioType == 101 ? "R" : "P"); locMast.setModiUser(userId); locMast.setModiTime(new Date()); if (!locMastService.updateById(locMast)) { throw new CoolException("预约库位状态失败,库位号:" + locDetl.getLocNo()); } } else { throw new CoolException(locDetl.getLocNo() + "库位不是在库状态"); } } /** * @author Ryan * @date 2025/9/22 * @description: 获取缓冲区库位信息 * @version 1.0 */ @Override public R getCacheLocs() { return R.ok().add(locCacheService.selectList(new EntityWrapper() .eq("frozen", 0) .ne("full_plt", "Y") .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type).orderAsc(Arrays.asList("row1")))); } /** * @author Ryan * @date 2025/9/24 * @description: 获取订单物料信息 * @version 1.0 */ @Override public R getMatsByQRcode(PakinMatsByQRParams params) { if (Objects.isNull(params)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(params.getOrderNo())) { throw new CoolException("单号不能为空!!"); } OrderPakin orderPakin = orderPakinService .selectOne(new EntityWrapper().eq("order_no", params.getOrderNo())); if (Objects.isNull(orderPakin)) { throw new CoolException("数据错误:单据不存在!!"); } List detlPakins = orderDetlPakinService.selectList(new EntityWrapper() .eq(!Cools.isEmpty(params.getMatnr()), "matnr", params.getMatnr()) .eq("order_id", orderPakin.getId())); if (Objects.isNull(detlPakins) || detlPakins.isEmpty()) { throw new CoolException("数据错误: 单据明细不存在!!"); } return R.ok().add(detlPakins); } /** * 缓存入库上架 * * @param param * @param userId * @author Ryan * @date 2025/12/9 15:05 */ @Override @Transactional(rollbackFor = Exception.class) public void combInPub(CompleteParam param, Long userId) { if (Objects.isNull(param.getBarcode())) { throw new CoolException("托盘码不能为空!!"); } if (Objects.isNull(param.getStation())) { throw new CoolException("站点不能为空!!"); } // // TODO 修改缓存站点状态及数据 // Task task = taskService.selectOne(new EntityWrapper() // .eq("wrk_sts", 14L) // .eq("barcode", param.getCarBarcode())); // if (Objects.isNull(task)) { // throw new CoolException("数据错误,任务不存在!!"); // } // List taskDetls = taskDetlService // .selectList(new EntityWrapper().eq("wrk_no", task.getWrkNo())); // if (Objects.isNull(taskDetls) || taskDetls.isEmpty()) { // throw new CoolException("数据错误,任务明细不存在!!"); // } // BasStation station = basStationService.selectOne(new EntityWrapper() // .eq("dev_no", param.getStation())); // if (Objects.isNull(station)) { // throw new CoolException("站点不存在!!"); // } // // station.setLocSts(LocStsType.LOC_STS_TYPE_O.type); // station.setBarcode(""); // if (!basStationService.updateById(station)) { // throw new CoolException("站点状态修改失败!"); // } // basStationDetlService.delete(new EntityWrapper().eq("dev_no", station.getDevNo())); // // 任务完成 // task.setWrkSts(15L); // // if (!taskService.updateById(task)) { // throw new CoolException("AGV任务完成失败!!"); // } List waitPakins = waitPakinService .selectList(new EntityWrapper().eq("zpallet", param.getBarcode())); if (Objects.isNull(waitPakins) || waitPakins.isEmpty()) { throw new CoolException("数据错误,组拖档已不存在!!"); } generateCrnInTask(waitPakins, param.getStation(), param.getLocType1(), userId); } /** * 生成堆垛机入库任务 * * @param station * @author Ryan * @date 2025/12/9 13:54 */ @Transactional(rollbackFor = Exception.class) public void generateCrnInTask(List waitPakins, String station, Short locType, Long userId) { Date now = new Date(); // StationRela rela = stationRelaService.selectOne(new EntityWrapper() // .eq("agv_sta", station.getDevNo()) // .orderAsc(Arrays.asList("crn_sta")) // .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY")); // // if (Objects.isNull(rela)) { // throw new CoolException("未绑定作业站点!!"); // } BasDevp sourceStaNo = basDevpService.checkSiteStatus(Integer.parseInt(station), true); sourceStaNo.setLocType1(locType); LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); WaitPakin pakin = waitPakins.stream().findFirst().get(); FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(pakin); WrkMast mast = wrkMastService.selectOne(new EntityWrapper().eq("barcode", pakin.getZpallet())); WrkMast wrkMast = new WrkMast(); if (!Objects.isNull(mast)) { if (mast.getIoType().equals(110) || mast.getIoType().equals(103) || mast.getIoType().equals(107)) { int ioType = mast.getIoType() - 50; mast.setIoType(ioType); mast.setWrkSts(2L); mast.setSourceStaNo(mast.getSourceStaNo()); mast.setStaNo(mast.getSourceStaNo()); mast.setLocNo(mast.getSourceLocNo()); boolean res = wrkMastService.updateById(mast); BeanUtils.copyProperties(mast, wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } // 更新源站点信息 sourceStaNo.setWrkNo(mast.getWrkNo()); sourceStaNo.setModiTime(now); if (!basDevpService.updateById(sourceStaNo)) { throw new CoolException("更新源站失败"); } // 更新目标库位状态 LocMast locMast = locMastService.selectById(mast.getLocNo()); if (locMast.getLocSts().equals("O")) { locMast.setLocSts("S"); // S.入库预约 locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("改变库位状态失败"); } } else { throw new CoolException(mast.getLocNo() + "目标库位已被占用"); } } else { throw new CoolException("托盘已存在任务档!!"); } } else { StartupDto dto = commonService.getLocNo(1, sourceStaNo.getDevNo(), findLocNoAttributeVo, locTypeDto); int workNo = dto.getWorkNo(); // 生成工作档 wrkMast.setWrkNo(workNo); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:生成入库ID wrkMast.setIoType(1); // 入出库状态:1.入库 wrkMast.setCrnNo(dto.getCrnNo()); wrkMast.setSourceStaNo(dto.getSourceStaNo() + ""); wrkMast.setStaNo(dto.getStaNo() + ""); wrkMast.setLocNo(dto.getLocNo()); wrkMast.setIoPri(13D); // 优先级 wrkMast.setBarcode(pakin.getZpallet()); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); wrkMast.setModiUser(userId); wrkMast.setAppeUser(userId); wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiTime(now); boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } // 更新源站点信息 sourceStaNo.setWrkNo(workNo); sourceStaNo.setModiTime(now); if (!basDevpService.updateById(sourceStaNo)) { throw new CoolException("更新源站失败"); } // 更新目标库位状态 LocMast locMast = locMastService.selectById(dto.getLocNo()); if (locMast.getLocSts().equals("O")) { locMast.setLocSts("S"); // S.入库预约 locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("改变库位状态失败"); } } else { throw new CoolException(dto.getLocNo() + "目标库位已被占用"); } // 更新入库通知档 ioStatus ===>> Y Wrapper wrapper = new EntityWrapper() .eq("zpallet", pakin.getZpallet()); WaitPakin setParam = new WaitPakin(); setParam.setLocNo(dto.getLocNo()); setParam.setIoStatus("Y"); setParam.setModiTime(now); if (!waitPakinService.update(setParam, wrapper)) { throw new CoolException("更新通知档失败"); } } // 生成工作档明细 waitPakins.forEach(waitPakin -> { WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(waitPakin); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.setIoTime(wrkMast.getIoTime()); double v = Math.round(waitPakin.getAnfme() * waitPakin.getVolume() * 100) / 100.0; wrkDetl.setAnfme(v); wrkDetl.setAppeTime(now); wrkDetl.setModiTime(now); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作明细失败"); } }); } // /** // * 生成立库出库任务 // * 台车过来默认是同一种物料类型 // * // * @param locCaches // * @author Ryan // * @date 2025/12/3 8:06 // */ // @Override // @Transactional(rollbackFor = Exception.class) // public void generateCRNOutTask(BasStation station, LocCache locCaches, Long userId) { // if (Objects.isNull(locCaches)) { // throw new CoolException("库位不能为空!!"); // } // // 获取缓存区信息 // BasAreas basAreas = basAreasService // .selectOne(new EntityWrapper().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_IN_CACHE.type)); // if (Objects.isNull(basAreas)) { // throw new CoolException("库区不存在!!"); // } // List locDetls = locDetlService.selectList(new EntityWrapper() // .eq("area_id", basAreas.getId()) // .eq("loc_no", locCaches.getLocNo())); // if (Objects.isNull(locDetls) || locDetls.isEmpty()) { // throw new CoolException("库存明细不存在!!"); // } // // // Set set = // // locDetls.stream().map(LocDetl::getMatnr).collect(Collectors.toSet()); // // List matList = matService.selectList(new // // EntityWrapper().in("matnr", set)); // // // // if (Objects.isNull(matList) || matList.isEmpty()) { // // throw new CoolException("物料库不存在该物料!!"); // // } // // Set longs = // // matList.stream().map(Mat::getTagId).collect(Collectors.toSet()); // // if (!longs.isEmpty() && longs.size() > 1) { // // throw new CoolException("物料类型不一致,请检查数据是否正确!!"); // // } // // // 获取立库区信息 // BasAreas one = basAreasService // .selectOne(new EntityWrapper().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_CRN.type)); // if (Objects.isNull(one)) { // throw new CoolException("数据错误:库区不存在!!"); // } // // List relas = stationRelaService // .selectList(new EntityWrapper().eq("agv_sta", station.getDevNo())); // if (Objects.isNull(relas) || relas.isEmpty()) { // throw new CoolException("站点未关联堆垛机作业站点!!"); // } // // Set crnStas = relas.stream().map(StationRela::getCrnSta).collect(Collectors.toSet()); // // List devps = basDevpService.selectList( // new EntityWrapper().in("dev_no", crnStas).eq("loading", CommonStation.COMMON_STATION_Y.type)); // if (Objects.isNull(devps) || devps.isEmpty()) { // throw new CoolException("无站点可用!"); // } // Collections.shuffle(devps); // BasDevp basDevp = devps.stream().findFirst().get(); // List locMasts = new ArrayList<>(); // Map> listMap = locDetls.stream().collect(Collectors.groupingBy(LocDetl::getMatnr)); // //获取查库存总数量 // AtomicReference totalOut = new AtomicReference<>(0.0); // listMap.forEach((matnr, detls) -> { // Map> supIds = detls.stream().collect(Collectors.groupingBy(LocDetl::getStandby1)); // supIds.forEach((supId, sups) -> { // // 根据supId(供应商)分类,得到需要存放的总空库存数量 // Double sum = sups.stream().mapToDouble(LocDetl::getAnfme).sum(); // AtomicReference itemed = new AtomicReference<>(0.0); // // 获取当前供应商+ 物料在库 // List detlList = locDetlService.selectList(new EntityWrapper() // .eq("matnr", matnr) // .eq("area_id", one.getId()) // .eq("standby1", supId).orderAsc(Arrays.asList("appe_time"))); // // TODO 判断是否有新库位,没有新库位,再找有空格的位置放 1. 判断当前物料是否有库存 2. 没有余料查询新库位 // if (!Objects.isNull(detlList) && !detlList.isEmpty()) { // Map> locMaps = detlList.stream() // .collect(Collectors.groupingBy(LocDetl::getLocNo)); // locMaps.forEach((locNo, adetls) -> { // LocMast locMast = locMastService.selectById(locNo); // if (Objects.isNull(locMast)) { // throw new CoolException("数据错误,库位信息不存在!!"); // } // BasContainer container = basContainerService // .selectOne(new EntityWrapper().eq("barcode", locMast.getBarcode())); // if (Objects.isNull(container)) { // throw new CoolException("数据错误,容器不存在!!"); // } // Set sets = adetls.stream().map(LocDetl::getMatnr).collect(Collectors.toSet()); // // 判断容器是否还可混放,及当前物料可放多少 // if (container.getMixMax() > sets.size()) { // //余下可混放种类 // long suplus = Math.round((container.getMixMax() - sets.size()) * 10000) / 10000; // Mat mats = matService.selectOne(new EntityWrapper().eq("matnr", matnr)); // if (Objects.isNull(mats)) { // throw new CoolException("物料不存在!!"); // } // //余下最大可放数量 // Double v = Math.round((mats.getUpQty() * suplus) * 10000) / 10000.0; // // 入库数量小于零且入库数量减去已计划出数量大于零() // if (sum.compareTo(v) <= 0 && sum.compareTo(itemed.get()) > 0) { // itemed.set(Math.round((itemed.get() + v) * 10000) / 10000.0); // // 可放下 // CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(adetls); // locMasts.add(crnTaskDetlDTO); // totalOut.set(Math.round((totalOut.get() + itemed.get()) * 10000) / 10000.0); // } // } // }); // } // }); // }); // // // 判断根据分拣出库后,还需要出多少托盘或料箱;如果余料大于0, 出新托盘或料箱 // if (totalOut.get().compareTo(0.0) > 0) { // generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station); // //TODO 细化区分,当前出库托盘是满足拣货数量 // } else { // LocMast locMast = locMastService.selectOne(new EntityWrapper() // // todo 根据物料种类,区分库区类型 // .eq("loc_sts", LocStsType.LOC_STS_TYPE_D.type) // .orderAsc(Arrays.asList("row1", "bay1", "lev1")) // .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY")); // // if (Objects.isNull(locMast)) { // throw new CoolException("未查询到可用的空板信息!!"); // } // // CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(locDetls); // locMasts.add(crnTaskDetlDTO); // // // 空板出库 // generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station); // } // } // /** // * 生成堆垛机出库任务 // * // * @param locMasts // * @param station // * @author Ryan // * @date 2025/12/6 14:44 // */ // @Transactional(rollbackFor = Exception.class) // public void generateTask(List locMasts, Integer ioType, BasDevp devp, Long userId, BasStation station) { // Date now = new Date(); // // for (CrnTaskDetlDTO crnTaskDetlDTO : locMasts) { // LocMast locMast = locMastService.selectOne(new EntityWrapper().eq("loc_no", crnTaskDetlDTO.getLocNo())); // if (Objects.isNull(ioType)) { // continue; // } // WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper().eq("source_loc_no", locMast.getLocNo())); // // 生成工作号 // int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // if (Cools.isEmpty(wrkMast1)){ // Integer outSta = devp.getDevNo(); // // 获取路径 // StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); // // // 生成工作档 // WrkMast wrkMast = new WrkMast(); // wrkMast.setWrkNo(workNo); // wrkMast.setIoTime(now); // wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID // wrkMast.setIoType(ioType); // 入出库类型 // wrkMast.setIoPri(13D); // 优先级:13 // wrkMast.setCrnNo(locMast.getCrnNo()); // wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 // wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 // wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 // //小松项目,缓存出库AGV站点,用于清空缓存区库存 // wrkMast.setPauseMk(station.getDevNo()); //// wrkMast.setAvgSta(station.getDevNo());; // wrkMast.setFullPlt("Y"); // 满板:Y // wrkMast.setPicking("N"); // 拣料 // wrkMast.setExitMk("N"); // 退出 // wrkMast.setEmptyMk("N"); // 空板 // wrkMast.setLinkMis("N"); // wrkMast.setBarcode(locMast.getBarcode()); // wrkMast.setAppeUser(userId); // 操作人员数据 // wrkMast.setAppeTime(now); // wrkMast.setModiUser(userId); // wrkMast.setModiTime(now); // if (!wrkMastService.insert(wrkMast)) { // throw new CoolException("保存工作档失败,出库库位号:" + locMast.getLocNo()); // } // }else { // workNo = wrkMast1.getWrkNo(); // } // // 生成工作档明细 // for (LocDetl detlDto : crnTaskDetlDTO.getLocDetlList()) { // WrkDetl wrkDetl = new WrkDetl(); // BeanUtils.copyProperties(detlDto, wrkDetl); // wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号 // wrkDetl.setWrkNo(workNo); // wrkDetl.setIoTime(now); // wrkDetl.setZpallet(null); // wrkDetl.setBarcode(null); // wrkDetl.setAppeTime(now); // wrkDetl.setAppeUser(userId); // wrkDetl.setModiTime(now); // wrkDetl.setModiUser(userId); // if (!wrkDetlService.insert(wrkDetl)) { // throw new CoolException("保存工作档明细失败"); // } // } // // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 // locMast = locMastService.selectById(locMast.getLocNo()); // if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_F.type) // || locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_D.type)) { // locMast.setLocSts(ioType == 101 ? "R" : "P"); // locMast.setModiUser(userId); // locMast.setModiTime(now); // if (!locMastService.updateById(locMast)) { // throw new CoolException("预约库位状态失败,库位号:" + locMast.getLocNo()); // } // } else { // throw new CoolException(locMast.getLocNo() + "库位不是在库状态"); // } // } // } /** * @author Ryan * @date 2025/9/25 * @description: 呼叫AGV生成出库任务 * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public void generateCacheOutTask(BasStation station, LocCache loc, Long userId) { // 获取工作号 int workNo = commonService.getWorkNo(WorkNoType.PICK.type); // 保存工作档 Task task = new Task(); task.setWrkNo(workNo) .setIoTime(new Date()) .setWrkSts(301L) // 工作状态:11.生成出库ID .setIoType(loc.getLocSts().equals("D") ? 110 : 101) // 入出库状态: 11.库格移载 .setTaskType("agv") .setIoPri(10D) .setFullPlt(loc.getLocSts().equals("D") ? "N" : "Y") // 满板:Y .setPicking("N") // 拣料 .setExitMk("N")// 退出 .setStaNo(station.getDevNo()) .setSourceLocNo(loc.getLocNo()) .setEmptyMk(loc.getLocSts().equals("D") ? "Y" : "N")// 空板 .setBarcode(loc.getBarcode())// 托盘码 .setLinkMis("N") .setAppeUser(userId) .setAppeTime(new Date()) .setModiUser(userId) .setModiTime(new Date()); if (!taskService.insert(task)) { throw new CoolException("保存工作档失败"); } List detls = locDetlService.selectList(new EntityWrapper() .eq("loc_no", loc.getLocNo())); if (!detls.isEmpty()) { List taskDetls = new ArrayList<>(); detls.forEach(pakin -> { TaskDetl wrkDetl = new TaskDetl(); BeanUtils.copyProperties(pakin, wrkDetl); wrkDetl.setWrkNo(workNo) .setIoTime(new Date()) .setOrderNo(pakin.getOrderNo()) .setAnfme(pakin.getAnfme()) .setZpallet(pakin.getZpallet()) .setBatch(pakin.getBatch()) .setMatnr(pakin.getMatnr()) .setMaktx(pakin.getMaktx()) .setThreeCode(pakin.getThreeCode()) .setAppeUser(userId) .setUnit(pakin.getUnit()) .setModel(pakin.getModel()) .setAppeTime(new Date()) .setModiUser(userId); // 保存工作档明细 if (!taskDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } }); } loc.setLocSts(LocStsType.LOC_STS_TYPE_R.type); loc.setModiUser(userId); loc.setModiTime(new Date()); if (!locCacheService.updateById(loc)) { throw new CoolException("更新库位状态信息!!"); } // 修改目标站点信息 if (station.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type)) { station.setLocSts(LocStsType.LOC_STS_TYPE_S.type); // S.入库预约 station.setModiTime(new Date()); station.setModiUser(userId); if (!basStationService.updateById(station)) { throw new CoolException("更新目标库位状态失败"); } } else { throw new CoolException("移转失败,目标库位状态:" + station.getLocSts()); } } /** * @author Ryan * @date 2025/9/22 * @description: 生成AGV搬运任务 * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public void generateAgvTask(String type, LocCache loc, String orgSite, String barcode, Long userId) { List tasks = taskService.selectList(new EntityWrapper().eq("barcode", barcode)); if (!tasks.isEmpty()) { throw new CoolException("托盘已在任务执行中.."); } // 获取工作号 int workNo = commonService.getWorkNo(WorkNoType.PICK.type); // 保存工作档 Task task = new Task(); task.setWrkNo(workNo) .setIoTime(new Date()) .setWrkSts(201L) // 工作状态:11.生成出库ID .setIoType(1) // 入出库状态: 11.库格移载 .setTaskType("agv") .setIoPri(10D) .setLocNo(loc.getLocNo()) // 目标库位 .setFullPlt("Y") // 满板:Y .setPicking("N") // 拣料 .setExitMk("N")// 退出 .setSourceStaNo(orgSite) .setEmptyMk(loc.getLocSts().equals("D") ? "Y" : "N")// 空板 .setBarcode(barcode)// 托盘码 .setLinkMis("N") .setAppeUser(userId) .setAppeTime(new Date()) .setModiUser(userId) .setModiTime(new Date()); if (!taskService.insert(task)) { throw new CoolException("保存工作档失败"); } if (!type.equals("agv_back")) { List pakins = waitPakinService.selectList(new EntityWrapper().eq("zpallet", barcode)); if (Objects.isNull(pakins) || pakins.isEmpty()) { throw new CoolException("组托信息不存在!!"); } for (WaitPakin pakin : pakins) { TaskDetl wrkDetl = new TaskDetl(); BeanUtils.copyProperties(pakin, wrkDetl); wrkDetl.setId(null).setWrkNo(workNo) .setIoTime(new Date()) .setOrderNo(pakin.getOrderNo()) .setAnfme(pakin.getAnfme()) .setZpallet(pakin.getZpallet()) .setBatch(pakin.getBatch()) .setMatnr(pakin.getMatnr()) .setMaktx(pakin.getMaktx()) .setAppeUser(userId) .setUnit(pakin.getUnit()) .setModel(pakin.getModel()) .setAppeTime(new Date()) .setModiUser(userId); if (!taskDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } } for (WaitPakin pakin : pakins) { pakin.setIoStatus("Y"); if (!waitPakinService.updateById(pakin)) { throw new CoolException("更新组托信息失败"); } } } // 修改目标库位状态 if (loc.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type)) { loc.setLocSts(LocStsType.LOC_STS_TYPE_S.type); // S.入库预约 loc.setModiTime(new Date()); loc.setModiUser(userId); if (!locCacheService.updateById(loc)) { throw new CoolException("更新目标库位状态失败"); } } else { throw new CoolException("移转失败,目标库位状态:" + loc.getLocSts$()); } // 修改目标站点信息 BasStation station = basStationService.selectOne(new EntityWrapper().eq("dev_no", orgSite)); if (Objects.isNull(station)) { throw new CoolException("站点不存在!!"); } if (station.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type) || station.getLocSts().equals(LocStsType.LOC_STS_TYPE_D.type)) { station.setLocSts("R"); // S.入库预约 station.setBarcode(barcode); station.setModiTime(new Date()); station.setModiUser(userId); if (!basStationService.updateById(station)) { throw new CoolException("更新目标库位状态失败"); } } else { throw new CoolException("移转失败,目标库位状态:" + station.getLocSts()); } } // public HIKResultDTO sendAgvTask(HIKApiDTO haiKangApiDTO, String path) { // HIKResultDTO result = new HIKResultDTO(); // // ForwardAGVTaskDTO forwardAGVTaskParam = new ForwardAGVTaskDTO(); // forwardAGVTaskParam.setReqCode(UUID.randomUUID().toString().replace("-", "")); // forwardAGVTaskParam.setClientCode("IWMS"); // forwardAGVTaskParam.setTaskTyp(haiKangApiDTO.getTaskType()); // forwardAGVTaskParam.setCtnrTyp(haiKangApiDTO.getCtnrType()); // forwardAGVTaskParam.setPriority(haiKangApiDTO.getPriority()); // List positionCodePathsList = new ArrayList<>(); // positionCodePathsList // .add(new ForwardAGVTaskDTO.PositionCodePaths(haiKangApiDTO.getOrg(), haiKangApiDTO.getOrgType())); // positionCodePathsList // .add(new ForwardAGVTaskDTO.PositionCodePaths(haiKangApiDTO.getTar(), haiKangApiDTO.getTarType())); // forwardAGVTaskParam.setPositionCodePath(positionCodePathsList); // // String body = JSON.toJSONString(forwardAGVTaskParam); // String response = ""; // try { // response = new HttpHandler.Builder() // .setUri(HIKApiConstant.AGV_IP) // .setPath(path) // .setJson(body) // .build() // .doPost(); // JSONObject jsonObject = JSON.parseObject(response); // if (jsonObject.getInteger("code").equals(0)) { // result.setSuccess(true); // } else { // result.setMessage(jsonObject.getString("message")); // log.error("发送agv任务失败!!!url:{};request:{};response:{}", HIKApiConstant.AGV_IP + path, body, response); // } // // {"code":"1","data":"","interrupt":false,"message":"重复提交","msgErrCode":"0x3a80D012","reqCode":"fa92b49481a44627ae4d80c1400f28f6"} // } catch (Exception e) { // result.setMessage(e.getMessage()); // log.error("发送agv任务异常", e); // } finally { // try { // // 保存接口日志 // apiLogService.save( // "发送agv任务", // HIKApiConstant.AGV_IP + path, // null, // "127.0.0.1", // body, // response, // result.isSuccess()); // } catch (Exception e) { // log.error("", e); // } // } // return result; // } // /** // * 呼叫AGV空台车返回 // * @author Ryan // * @date 2025/9/24 // * @param callAgvBackParam // * @return com.core.common.R // */ // @Override // @Transactional(rollbackFor = Exception.class) // public R agvCallback(AgvCallParams callAgvBackParam, Long userId) { // if (Objects.isNull(callAgvBackParam.getOrgSite())) { // return R.error("参数不能为空!!"); // } // // // 按当前查找库位顺序,查到一个后,不再往下查询 // LocCache locCache = findPriorityLocCache(); // // if (Objects.isNull(locCache)) { // return R.error("未查询到可用库位"); // } // // // 修改目标站点信息 // BasStation station = basStationService.selectOne(new EntityWrapper().eq("dev_no", callAgvBackParam.getOrgSite())); // if (Objects.isNull(station)) { // throw new CoolException("站点不存在!!"); // } // // try { // //空台车回库 // generateAgvTask("agv_back", locCache, callAgvBackParam.getOrgSite(), station.getBarcode(), userId); // } catch (Exception e) { // e.printStackTrace(); // return R.error(e.getMessage()); // } // // return R.ok(locCache); // } // /** // * 按优先级查找可用库位 // * 顺序:入库缓存区 -> SO区 -> EO区 // */ // private LocCache findPriorityLocCache() { // // 1. Try Inbound Cache Area // LocCache loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_IN_CACHE); // if (loc != null) return loc; // // // 2. Try SO Area // loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_SO); // if (loc != null) return loc; // // // 3. Try EO Area // loc = findAvailableLocByAreaType(LocAreaType.LOC_AREA_TYPE_EO); // return loc; // } // // /** // * 根据区域类型查找可用库位 // */ // private LocCache findAvailableLocByAreaType(LocAreaType areaType) { // BasAreas area = basAreasService.selectOne(new EntityWrapper().eq("whs_type_id", areaType.type)); // if (area == null) { // return null; // } // return locCacheService.selectOne(new EntityWrapper() // .eq("area_id", area.getId()) // .eq("frozen", 0) // .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type) // .orderAsc(Arrays.asList("loc_no")) // .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY")); // } }