package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.MatUtils; import com.zy.asrs.utils.MathUtils; import com.zy.asrs.utils.OrderInAndOutUtil; import com.zy.common.model.DetlDto; import com.zy.nc.entity.NccSaleDbddWms; import com.zy.nc.entity.NccSaleXsfhmxWms; import lombok.extern.slf4j.Slf4j; 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.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * 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 OrderDetlPakoutService orderDetlPakoutService; @Autowired private WrkDetlService wrkDetlService; @Autowired private WrkMastService wrkMastService; @Autowired private InventoryCheckOrderDetlService inventoryCheckOrderDetlService; @Autowired private DocTypeService docTypeService; @Autowired private ReportToThirdService reportToThirdService; @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(MathUtils.subtract(orderDetl.getAnfme(), orderDetl.getQty())); orderDetl.setQty(0D); orderDetlService.updateById(orderDetl); } // 修改订单状态 99.再次作业 ===>> 1.待作业 if (!orderService.updateSettle(order.getId(), 1L, null)) { throw new CoolException("服务器内部错误,请联系管理员"); } return SUCCESS; } @Transactional public ReturnT startOrderIssued(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } List orderDetls = orderDetlService.selectByOrderId(order.getId()); 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()); dto.setOrderNo(detail.getOrderNo()); 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(MathUtils.add(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(MathUtils.add(orderDetl.getAnfme(), detail.getAnfme())); Double weight = MatUtils.calcWeight(orderDetl.getMatnr(), orderDetl.getAnfme()); orderDetl.setWeight(weight); } else { list.add(dto); orderDetlList.add(detail); } } for (OrderDetl orderDetl : orderDetlList) { orderDetl.setWorkQty(0D); OrderInAndOutUtil.insertOrderDetl(order.getPakinPakoutStatus$(), order, orderDetl); } // 修改订单状态 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; } if (docType.getDocName().equals("销售发货") || docType.getDocName().equals("集团内部调拨")) { return SUCCESS; } Order orderSou = orderService.selectByNo(order.getOrderNo()); if (orderSou == null) { return FAIL.setMsg(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 = MathUtils.subtract(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 checkXSFH(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } if (!docType.getDocName().equals("销售发货")) { return SUCCESS; } Order orderSou = orderService.selectByNo(order.getOrderNo()); if (orderSou == null) { return FAIL.setMsg("订单不存在,请联系管理员"); } if (!orderSou.getSettle().equals(2L)) { return FAIL.setMsg("订单状态不正确,请联系管理员"); } List orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId()); boolean complete = true; // for (OrderDetl orderDetl : orderDetls) { // if (orderDetl.getAnfme() > orderDetl.getQty()) { // complete = false; // break; // } // } if (complete) { List old = orderDetlService.selectByOrderId(orderSou.getId()); if (!orderDetlService.delete(new EntityWrapper().eq("order_no", order.getOrderNo()))) { throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); } List wrkDetls = wrkDetlService.selectAndLogByOrderNo(order.getOrderNo()); for (WrkDetl wrkDetl : wrkDetls) { OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(wrkDetl); orderDetl.setQty(wrkDetl.getAnfme()); orderDetl.setOrderId(orderSou.getId()); orderDetl.setOrderNo(orderSou.getOrderNo()); orderDetl.setStatus(1); orderDetl.setCreateTime(orderSou.getCreateTime()); orderDetl.setCreateBy(orderSou.getCreateBy()); orderDetl.setUpdateTime(orderSou.getUpdateTime()); orderDetl.setUpdateBy(orderSou.getUpdateBy()); orderDetl.setId(null); //先按照批次匹配,再按照无批次号批次,因为销售发货,批次号可能带,有可能不携带,所以就会有问题;而且考虑到一条订单里如果相同物料,一条带批次,一条不带批次,情况 for (OrderDetl xxx : old) { if (xxx.beSimilar(wrkDetl)) { if(Cools.isEmpty(orderDetl.getRemark())) { orderDetl.setRemark(xxx.getRemark()); }else { NccSaleXsfhmxWms currentData = JSONObject.parseObject(orderDetl.getRemark(), NccSaleXsfhmxWms.class); if (currentData == null) { continue; } NccSaleXsfhmxWms nextData = JSONObject.parseObject(xxx.getRemark(), NccSaleXsfhmxWms.class); if (nextData == null) { continue; } BigDecimal currentFslDecimal = currentData.getNastnum(); BigDecimal nextFslDecimal = nextData.getNastnum(); if(currentFslDecimal.doubleValue() < nextFslDecimal.doubleValue()) { orderDetl.setRemark(xxx.getRemark()); } } } } if (Cools.isEmpty(orderDetl.getRemark())) { for (OrderDetl xxx : old) { if (xxx.beSimilarByWrkDetl(wrkDetl)) { if(Cools.isEmpty(orderDetl.getRemark())) { orderDetl.setRemark(xxx.getRemark()); }else { NccSaleXsfhmxWms currentData = JSONObject.parseObject(orderDetl.getRemark(), NccSaleXsfhmxWms.class); if (currentData == null) { continue; } NccSaleXsfhmxWms nextData = JSONObject.parseObject(xxx.getRemark(), NccSaleXsfhmxWms.class); if (nextData == null) { continue; } BigDecimal currentFslDecimal = currentData.getNastnum(); BigDecimal nextFslDecimal = nextData.getNastnum(); if(currentFslDecimal.doubleValue() < nextFslDecimal.doubleValue()) { orderDetl.setRemark(xxx.getRemark()); } } } } } if (!orderDetlService.insert(orderDetl)) { throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); } } // 修改订单状态 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 checkDBDD(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); if (null == docType) { return SUCCESS; } if (!docType.getDocName().equals("集团内部调拨")) { return SUCCESS; } Order orderSou = orderService.selectByNo(order.getOrderNo()); if (orderSou == null) { return FAIL.setMsg("订单不存在,请联系管理员"); } if (!orderSou.getSettle().equals(2L)) { return FAIL.setMsg("订单状态不正确,请联系管理员"); } List orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId()); boolean complete = true; // for (OrderDetl orderDetl : orderDetls) { // if (orderDetl.getAnfme() > orderDetl.getQty()) { // complete = false; // break; // } // } if (complete) { List old = orderDetlService.selectByOrderId(orderSou.getId()); if (!orderDetlService.delete(new EntityWrapper().eq("order_no", order.getOrderNo()))) { throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); } List wrkDetls = wrkDetlService.selectAndLogByOrderNo(order.getOrderNo()); for (WrkDetl wrkDetl : wrkDetls) { OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(wrkDetl); orderDetl.setQty(wrkDetl.getAnfme()); orderDetl.setOrderId(orderSou.getId()); orderDetl.setOrderNo(orderSou.getOrderNo()); orderDetl.setStatus(1); orderDetl.setCreateTime(orderSou.getCreateTime()); orderDetl.setCreateBy(orderSou.getCreateBy()); orderDetl.setUpdateTime(orderSou.getUpdateTime()); orderDetl.setUpdateBy(orderSou.getUpdateBy()); orderDetl.setId(null); //先按照批次匹配,再按照无批次号批次,因为销售发货,批次号可能带,有可能不携带,所以就会有问题;而且考虑到一条订单里如果相同物料,一条带批次,一条不带批次,情况 for (OrderDetl xxx : old) { if (xxx.beSimilar(wrkDetl)) { if(Cools.isEmpty(orderDetl.getRemark())) { orderDetl.setRemark(xxx.getRemark()); }else { NccSaleDbddWms currentData = JSONObject.parseObject(orderDetl.getRemark(), NccSaleDbddWms.class); if (currentData == null) { continue; } NccSaleDbddWms nextData = JSONObject.parseObject(xxx.getRemark(), NccSaleDbddWms.class); if (nextData == null) { continue; } BigDecimal currentFslDecimal = currentData.getFsl(); BigDecimal nextFslDecimal = nextData.getFsl(); if(currentFslDecimal.doubleValue() < nextFslDecimal.doubleValue()) { orderDetl.setRemark(xxx.getRemark()); } } } } if (Cools.isEmpty(orderDetl.getRemark())) { for (OrderDetl xxx : old) { if (xxx.beSimilarByWrkDetl(wrkDetl)) { if(Cools.isEmpty(orderDetl.getRemark())) { orderDetl.setRemark(xxx.getRemark()); }else { NccSaleDbddWms currentData = JSONObject.parseObject(orderDetl.getRemark(), NccSaleDbddWms.class); if (currentData == null) { continue; } NccSaleDbddWms nextData = JSONObject.parseObject(xxx.getRemark(), NccSaleDbddWms.class); if (nextData == null) { continue; } BigDecimal currentFslDecimal = currentData.getFsl(); BigDecimal nextFslDecimal = nextData.getFsl(); if(currentFslDecimal.doubleValue() < nextFslDecimal.doubleValue()) { orderDetl.setRemark(xxx.getRemark()); } } } } } if (!orderDetlService.insert(orderDetl)) { throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); } } // 修改订单状态 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; } List orderDetls = orderDetlService.selectByOrderId(order.getId()); try { reportToThirdService.report(order, orderDetls, docType); } catch (Exception e) { return FAIL; } return SUCCESS; } @Transactional public ReturnT reportCheck(InventoryCheckOrder checkOrder) { List checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper().eq("order_no", checkOrder.getOrderNo())); for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) { } return SUCCESS; } }