package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.CombParam; import com.zy.asrs.service.*; import com.zy.asrs.service.impl.MatServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.OrderInAndOutUtil; import com.zy.common.CodeRes; import com.zy.common.constant.MesConstant; import com.zy.common.model.DetlDto; import com.zy.common.model.MesPakinParam; import com.zy.common.model.MesPakoutParam; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * Created by vincent on 2020/7/7 */ @Slf4j @Service public class OrderSyncHandler extends AbstractHandler { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; @Autowired private MobileService mobileService; @Autowired private WaitPakinService waitPakinService; @Autowired private OrderPakinService orderPakinService; @Autowired private OrderDetlPakinService orderDetlPakinService; @Autowired private LocDetlService locDetlService; @Autowired private WrkDetlService wrkDetlService; @Autowired private MatService matService; @Transactional public ReturnT startOrderIssuedOnceMore(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } Order order1 = OrderInAndOutUtil.selectByNo(order.getPakinPakoutStatus$(), order.getOrderNo()); if (!Cools.isEmpty(order1)) { return FAIL.setMsg("请等待...订单执行档案正在转历史档案!!!"); } List orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId()); if (!Cools.isEmpty(orderDetls) || !orderDetls.isEmpty()) { return FAIL.setMsg("请等待...订单执行明细档案正在转历史档案!!!"); } // 单据明细档 List orderDetlList = orderDetlService.selectByOrderId(order.getId()); for (OrderDetl orderDetl : orderDetlList) { if (orderDetl.getQty().equals(0D)) { continue; } orderDetl.setWorkQty(orderDetl.getQty()); orderDetl.setAnfme(orderDetl.getAnfme() - orderDetl.getQty()); orderDetl.setQty(0D); orderDetlService.updateById(orderDetl); } // 修改订单状态 99.再次作业 ===>> 1.待作业 if (!orderService.updateSettle(order.getId(), 1L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } return SUCCESS; } /** * 上报单据转执行单据 * * @author Ryan * @date 2026/1/5 14:07 */ @Transactional public ReturnT startOrderIssued(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } List orderDetls = orderDetlService.selectByOrderId(order.getId()); //设置为单据执行中 order.setSettle(2L); OrderInAndOutUtil.insertOrder(order.getPakinPakoutStatus$(), order); // 单据明细档 List list = new ArrayList<>(); List orderDetlList = new ArrayList<>(); for (OrderDetl detail : orderDetls) { DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getBrand(), detail.getStandby1(), detail.getStandby2(), detail.getStandby3(), detail.getBoxType1(), detail.getBoxType2(), detail.getBoxType3(), detail.getAnfme()); if (DetlDto.has(list, dto)) { DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch(), dto.getBrand(), dto.getStandby1(), dto.getStandby2(), dto.getStandby3(), dto.getBoxType1(), dto.getBoxType2(), dto.getBoxType3()); assert detlDto != null; detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme()); OrderDetl orderDetl = OrderDetl.find(orderDetlList, dto.getMatnr(), dto.getBatch(), dto.getBrand(), dto.getStandby1(), dto.getStandby2(), dto.getStandby3(), dto.getBoxType1(), dto.getBoxType2(), dto.getBoxType3()); assert orderDetl != null; orderDetl.setAnfme(orderDetl.getAnfme() + detail.getAnfme()); } else { list.add(dto); orderDetlList.add(detail); } } for (OrderDetl orderDetl : orderDetlList) { orderDetl.setWorkQty(0D); OrderInAndOutUtil.insertOrderDetl(order.getPakinPakoutStatus$(), order, orderDetl); } OrderPakin pakinOrder = orderPakinService.selectOne(new EntityWrapper().eq("order_no", order.getOrderNo())); if (Objects.isNull(pakinOrder)) { return FAIL.setMsg("入库单据不存在!!!"); } //如果为入库单 PakinPakoutStatus = 1,单据生成完毕后,生成入库组托档。 if (pakinOrder.getPakinPakoutStatus().equals(1)) { List pakinOrderDetls = orderDetlPakinService.selectList(new EntityWrapper().eq("order_id", pakinOrder.getId())); if (!Objects.isNull(pakinOrderDetls) && !pakinOrderDetls.isEmpty()) { pakinOrderDetls.forEach(orderDetl -> { int countLoc = locDetlService.selectCount(new EntityWrapper().eq("zpallet",orderDetl.getBarcode())); int countWrk = wrkDetlService.selectCount(new EntityWrapper().eq("zpallet",orderDetl.getBarcode())); int coutPakin = waitPakinService.selectCount(new EntityWrapper().eq("zpallet", orderDetl.getBarcode())); if (countLoc > 0 || countWrk > 0 || coutPakin > 0) { throw new CoolException(CodeRes.EXIST_500); } WaitPakin waitPakin = new WaitPakin(); BeanUtils.copyProperties(orderDetl, waitPakin); Mat matnr = matService.selectOne(new EntityWrapper().eq("matnr", orderDetl.getMatnr())); if (Objects.isNull(matnr)) { throw new CoolException(orderDetl.getMatnr() + "商品档案不存在"); } if (!Objects.isNull(orderDetl.getBarcode()) && !orderDetl.getBarcode().isEmpty()) { waitPakin.setBarcode(orderDetl.getBarcode()); waitPakin.setZpallet(orderDetl.getBarcode()); } waitPakin.setOrderId(pakinOrder.getId()); waitPakin.setAnfme(orderDetl.getAnfme()); waitPakin.setOrderNo(pakinOrder.getOrderNo()); waitPakin.setIoStatus("N"); waitPakin.setStatus("Y"); waitPakin.setAppeTime(new Date()); waitPakin.setModiTime(new Date()); if (!waitPakinService.insert(waitPakin)) { throw new CoolException("组托档保存失败!!"); } }); } else { throw new CoolException("入库单据明细不存在!!!"); } } // 修改订单状态 1.未作业 ===>> 2.作业中 if (!orderService.updateSettle(order.getId(), 2L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } return SUCCESS; } @Transactional public ReturnT startOrderInAndOutUtil(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } Order orderSou = orderService.selectByNo(order.getOrderNo()); if (!orderSou.getSettle().equals(2L)) { return FAIL.setMsg("订单状态不正确,请联系管理员"); } List orderDetlList = orderDetlService.selectByOrderId(orderSou.getId()); List orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId()); for (OrderDetl orderDetlSou : orderDetlList) { for (OrderDetl orderDetl : orderDetls) { if (orderDetl.getQty().equals(0D)) { continue; } if (orderDetlSou.beSimilar(orderDetl)) { double v = orderDetlSou.getAnfme() - orderDetlSou.getQty(); if (v < orderDetl.getQty() || orderDetl.getQty().equals(v)) { orderDetlSou.setQty(orderDetlSou.getAnfme()); orderDetl.setQty(orderDetl.getQty() - v); break; } else { orderDetlSou.setQty(orderDetlSou.getQty() + orderDetl.getQty()); orderDetl.setQty(0D); } } } } for (OrderDetl orderDetlSou : orderDetlList) { orderDetlService.updateById(orderDetlSou); } // 修改订单状态 2.作业中 ===>> 4.待上报 if (!orderService.updateSettle(orderSou.getId(), 4L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } // 修改订单状态 4.完成 ===>> 6.结束 OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(), order.getId(), 6L, null); return SUCCESS; } @Transactional public ReturnT startOrderReport(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } long settle = 6L; List orderDetls = orderDetlService.selectByOrderId(order.getId()); // 入库完成上报 if (docType.getPakin() == 1) { MesPakinParam pakinParam = new MesPakinParam(); pakinParam.setPakinTime(DateUtils.convert(order.getUpdateTime())); pakinParam.setLgortFrom("5008"); pakinParam.setLgortTo("5006"); for (OrderDetl orderDetl : orderDetls) { if (!orderDetl.getQty().equals(orderDetl.getAnfme())) { settle = 99L;//二次生成单据 } String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch(); pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme())); } String response = ""; boolean success = false; try { // response = new HttpHandler.Builder() // .setUri(MesConstant.URL) // .setPath(MesConstant.PAKIN_URL) // .setJson(JSON.toJSONString(pakinParam)) // .build() // .doPost(); // JSONObject jsonObject = JSON.parseObject(response); // if (jsonObject.getInteger("code").equals(200)) { if (true) { success = true; // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), settle, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } else { log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response); throw new CoolException("上报mes系统失败"); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "成品库入库上报", MesConstant.URL + MesConstant.PAKIN_URL, null, "127.0.0.1", JSON.toJSONString(pakinParam), response, success ); } catch (Exception e) { log.error("", e); } } } // 出库完成上报 if (docType.getPakout() == 1) { MesPakoutParam pakoutParam = new MesPakoutParam(); pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单")); pakoutParam.setPakoutTime(DateUtils.convert(order.getUpdateTime())); pakoutParam.setLgortFrom("5006"); pakoutParam.setLgortTo("1111"); if (!pakoutParam.isTag()) { pakoutParam.setKunnr("C1000"); } pakoutParam.setOrderNo(order.getOrderNo()); for (OrderDetl orderDetl : orderDetls) { if (!orderDetl.getQty().equals(orderDetl.getAnfme())) { settle = 99L;//二次生成单据 } String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch(); pakoutParam.getList().add(new MesPakoutParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme())); } String response = ""; boolean success = false; try { // response = new HttpHandler.Builder() // .setUri(MesConstant.URL) // .setPath(MesConstant.PAKOUT_URL) // .setJson(JSON.toJSONString(pakoutParam)) // .build() // .doPost(); // JSONObject jsonObject = JSON.parseObject(response); // if (jsonObject.getInteger("code").equals(200)) { if (true) { success = true; // 修改订单状态 4.完成 ===>> 6.已上报 if (!orderService.updateSettle(order.getId(), settle, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } } else { log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKOUT_URL, JSON.toJSONString(pakoutParam), response); throw new CoolException("上报mes系统失败"); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "成品库出库上报", MesConstant.URL + MesConstant.PAKOUT_URL, null, "127.0.0.1", JSON.toJSONString(pakoutParam), response, success ); } catch (Exception e) { log.error("", e); } } } return SUCCESS; } }