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<String> { 
 | 
  
 | 
    @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<String> 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<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId()); 
 | 
        if (!Cools.isEmpty(orderDetls) || !orderDetls.isEmpty()) { 
 | 
            return FAIL.setMsg("请等待...订单执行明细档案正在转历史档案!!!"); 
 | 
        } 
 | 
  
 | 
        // 单据明细档 
 | 
        List<OrderDetl> 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<String> startOrderIssued(Order order) { 
 | 
        DocType docType = docTypeService.selectById(order.getDocType()); 
 | 
        if (null == docType) { 
 | 
            return SUCCESS; 
 | 
        } 
 | 
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId()); 
 | 
  
 | 
        OrderInAndOutUtil.insertOrder(order.getPakinPakoutStatus$(), order); 
 | 
        // 单据明细档 
 | 
        List<DetlDto> list = new ArrayList<>(); 
 | 
        List<OrderDetl> 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<String> 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<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(orderSou.getId()); 
 | 
  
 | 
        List<OrderDetl> 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<String> 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<OrderDetl> 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<OrderDetl> old = orderDetlService.selectByOrderId(orderSou.getId()); 
 | 
            if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()))) { 
 | 
                throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); 
 | 
            } 
 | 
            List<WrkDetl> 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<String> 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<OrderDetl> 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<OrderDetl> old = orderDetlService.selectByOrderId(orderSou.getId()); 
 | 
            if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()))) { 
 | 
                throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败"); 
 | 
            } 
 | 
            List<WrkDetl> 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<String> startOrderReport(Order order) { 
 | 
        DocType docType = docTypeService.selectById(order.getDocType()); 
 | 
        if (null == docType) { 
 | 
            return SUCCESS; 
 | 
        } 
 | 
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId()); 
 | 
        try { 
 | 
            reportToThirdService.report(order, orderDetls, docType); 
 | 
        } catch (Exception e) { 
 | 
            return FAIL; 
 | 
        } 
 | 
        return SUCCESS; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Transactional 
 | 
    public ReturnT<String> reportCheck(InventoryCheckOrder checkOrder) { 
 | 
        List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>().eq("order_no", checkOrder.getOrderNo())); 
 | 
        for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) { 
 | 
  
 | 
        } 
 | 
        return SUCCESS; 
 | 
    } 
 | 
} 
 |