自动化立体仓库 - WMS系统
优化定时任务,添加自动接单(未完成,逻辑还不清楚),调整环境配置
2个文件已添加
16个文件已修改
436 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvWarnController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderProdSyncParam.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoOrderScheduler.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ReportDataScheduler.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoOrderHandler.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWarnController.java
@@ -61,7 +61,7 @@
    @PostMapping("/service/rest/agvCallbackService/warnCallback")
    @AppAuth(memo = "AGV告警回调")
    public Object taskEventStaus(@RequestBody AgvWarnCallBackParam param, HttpServletRequest request) {
        log.info("AGV告警回调:{}", JSON.toJSONString(param));
        //og.info("AGV告警回调:{}", JSON.toJSONString(param));
        AppAuthUtil.auth("", param, request);
        List<AgvWarnBody> agvWarnBodies = param.getData();
        //  List<AgvWarnBody> agvWarnBodies = JSONArray.parseArray(data, AgvWarnBody.class);
@@ -69,7 +69,7 @@
        List<AgvWarn> agvWarns = new ArrayList<>();
        List<AgvWarn> updates = new ArrayList<>();
        for (AgvWarnBody body : agvWarnBodies) {
            List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().eq("robot_code", body.getRobotCode()).eq("begin_time", body.getBeginDate()).eq("warn_content", body.getWarnContent()));
            List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().eq("robot_code", body.getRobotCode()).eq("warn_content", body.getWarnContent()));
            if (Cools.isEmpty(agvWarnList)) {
                agvWarn = new AgvWarn();
                agvWarn.setBeginTime(body.getBeginDate());
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -302,6 +302,9 @@
    @TableField("report_qty")
    private Double reportQty;
    @TableField("dev_no")
    private String devNo;
    public OrderDetl() {}
    public OrderDetl(Long orderId, String orderNo, Double anfme, Double qty, String matnr, String maktx, String batch, String specs, String model, String color, String brand, String unit, Double price, String sku, Double units, String barcode, String origin, String manu, String manuDate, String itemNum, Double safeQty, Double weight, Double length, Double volume, String threeCode, String supp, String suppCode, Integer beBatch, String deadTime, Integer deadWarn, Integer source, Integer inspect, Integer danger, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo,Integer processSts) {
src/main/java/com/zy/asrs/entity/param/OrderProdSyncParam.java
@@ -15,6 +15,9 @@
    //单据类型
    private String orderType;
    //退料单单据编号
    private String backOrderNo;
    //订单编号
    private String cPOID;
@@ -80,7 +83,8 @@
        private String 操作单据;
        private String 操作类型;
        //站点编码
        private String devNo;
        //订单行号
        private String ivouchrowno;
        //物料编码
src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java
@@ -11,6 +11,8 @@
    private String 操作单据;
    private String 操作类型;
    //退料单单据编号
    private String backOrderNo;
    //入出库标记
    private Integer pakin;
@@ -46,6 +48,8 @@
    @Data
    public static class OrderDetl {
        //站点编码
        private String devNo;
        //订单行号
        private String ivouchrowno;
        //物料编码
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -53,4 +53,10 @@
    Integer getOrderDetlByDoctypeCount(Map<String, Object> map);
    List<String> getReportDetl(@Param("docType") Long docType);
    List<String> listAutoDetl(@Param("devNo") String devno);
}
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
@@ -109,6 +109,7 @@
        List<AgvLocDetl> agvLocDetls = this.selectList(wrapper);
        for (AgvLocDetl agvLocDetl : agvLocDetls) {
            //判断当前库位货物是否F在库
            AgvLocMast agvLocMast = agvLocMastService.selectById(agvLocDetl.getLocNo());
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -179,6 +179,7 @@
            // 更新订单
            OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", pick.getOrderNo()).eq("matnr", pick.getMatnr()).eq("three_code", pick.getThreeCode()));
            orderDetl.setQty(orderDetl.getQty() + pick.getCount());
            orderDetl.setUpdateTime(new Date());
            if (!orderDetlService.update(orderDetl, new EntityWrapper<OrderDetl>().eq("order_no", pick.getOrderNo()).eq("matnr", pick.getMatnr()).eq("three_code", pick.getThreeCode()))) {
                throw new CoolException("修改订单明细失败,请联系管理员" + pick.getOrderNo() + pick.getMatnr());
            }
@@ -353,6 +354,10 @@
        AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>().eq("dev_no", stationCode));
        if (agvBasDevp == null) {
            throw new CoolException(stationCode + "站点信息错误");
        }
        if (Cools.eq(agvBasDevp.getBarcode(), barcode)) {
            return;
        }
@@ -367,9 +372,7 @@
            throw new CoolException(barcode + "已经绑定在" + agvBasDevp.getDevNo() + "站点");
        }
        if (agvBasDevp == null) {
            throw new CoolException(stationCode + "站点信息错误");
        }
        if (!"O".equals(agvBasDevp.getLocSts())) {
            throw new CoolException(stationCode + "该站点货位状态非空");
        }
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -854,6 +854,12 @@
            throw new CoolException("单据参数为空或者单据详情为空,无法生成单据信息");
        }
        if ("银座生产退料申请单".equalsIgnoreCase(docName)) {
            if (Cools.isEmpty(param.getBackOrderNo())){
                throw new CoolException("退料单的退料编号backOrderNo不能为空");
            }
        }
        Order orderOld = null;
        if (!Cools.isEmpty(orderService.selectByNo(param.getCPOID()))) {
@@ -992,6 +998,7 @@
        order.setCreateTime(now);
        order.setUpdateBy(9999L);
        order.setUpdateTime(now);
        order.setSalesman(param.getBackOrderNo());
        order.setUpstreamcode(param.getUpstreamcode());
        //订单状态
        order.setSettle(1L);
@@ -1026,9 +1033,10 @@
        od.setAnfme(odParam.getIQuantity());
        //销售订单号
        od.setThreeCode(odParam.getCDefine22());
        od.setDevNo(odParam.getDevNo());
        //自由项
        if (!Cools.isEmpty(odParam.getBatch()) || !Cools.isEmpty(odParam.getBFree1())) {
            od.setBatch((Cools.isEmpty(odParam.getBatch()) ? "" : odParam.getBatch()) + "__" + (Cools.isEmpty(odParam.getBFree1()) ? "" : odParam.getBFree1()));
            od.setBrand((Cools.isEmpty(odParam.getBatch()) ? "" : odParam.getBatch()) + "__" + (Cools.isEmpty(odParam.getBFree1()) ? "" : odParam.getBFree1()));
        }
        od.setWeight(odParam.getINum());
        od.setVolume(odParam.getIinvexchrate());
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -25,6 +25,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -150,6 +152,7 @@
    }
    @Override
    @Transactional(isolation= Isolation.READ_COMMITTED)
    public void checkComplete2(String orderNo) {
        Order order = this.selectByNo(orderNo);
        if (Cools.isEmpty(order)) {
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java
@@ -8,7 +8,9 @@
import com.core.common.Cools;
import com.zy.asrs.entity.Agv;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.entity.AgvWarnLog;
import com.zy.asrs.mapper.AgvBasMapper;
import com.zy.asrs.service.AgvWarnLogService;
import com.zy.asrs.service.AgvWarnService;
import com.zy.asrs.task.handler.AgvWarnHandler;
import com.zy.common.utils.HttpHandler;
@@ -40,10 +42,26 @@
    private AgvWarnService agvWarnService;
    @Autowired
    private AgvWarnLogService agvWarnLogService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private AgvBasMapper agvBasMapper;
    /**
     *  删除告警日志
     */
    @Scheduled(cron = "0 0 1 * * ? ")
    private void delWarnLog() {
        String format = DateUtil.format(DateUtil.offsetMonth(new Date(), -1), "yyyy-MM-dd HH:mm:ss");
        List<AgvWarnLog> agvWarnList = agvWarnLogService.selectList(new EntityWrapper<AgvWarnLog>().le("modi_time", format));
        for (AgvWarnLog agvWarn : agvWarnList) {
            agvWarnLogService.deleteById(agvWarn);
        }
    }
    /**
     * 超过一分钟没更新的,删除
@@ -66,6 +84,7 @@
        Config url = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL"));
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>());
        StringBuffer buffer;
        HashMap<String, Object> sendData = new HashMap<>();
        for (AgvWarn agvWarn : agvWarnList) {
            Integer warnTime = getWarnTime(agvWarn.getTimes(), first.getValue(), second.getValue(), third.getValue());
            DateTime begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss");
@@ -76,23 +95,22 @@
                if (!Cools.isEmpty(agvWarn.getSourceLocNo())) {
                    buffer.append("从:[" + agvWarn.getSourceLocNo() + "]到[" + agvWarn.getLocNo() + "]\n");
                }
                buffer.append("开始时间:" + agvWarn.getBeginTime() + "\n");
                buffer.append("报警开始时间:" + agvWarn.getBeginTime() + "\n");
                buffer.append("当前时间:" + DateUtil.formatDateTime(new Date()) + "\n");
                int i = agvWarn.getTimes() + 1;
                buffer.append("第[" + i + "]次报警");
                //buffer.append("第[" + i + "]次报警");
                HashMap<String, Object> param = new HashMap<>();
                HashMap<String, Object> data = new HashMap<>();
                data.put("content", buffer.toString());
                param.put("msgtype", "text");
                param.put("text", data);
                log.info("发送报警信息:{}", JSON.toJSONString(param));
                //log.info("发送报警信息:{}", JSON.toJSONString(param));
                sendData.put(agvWarn.getRobotCode() + agvWarn.getWarnContent(), param);
            }
            for (HashMap.Entry<String, Object> entry : sendData.entrySet()) {
                String response = null;
                try {
                    response = new HttpHandler.Builder()
                            .setUri(url.getValue())
                            .setJson(JSON.toJSONString(param))
                            .setHttps(true)
                            .build()
                            .doPost();
                    response = new HttpHandler.Builder().setUri(url.getValue()).setJson(JSON.toJSONString(entry.getValue())).setHttps(true).build().doPost();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
@@ -106,6 +124,7 @@
                    log.error("发送失败,错误信息:{}", jsonObject.get("errmsg"));
                }
            }
        }
    }
@@ -119,9 +138,9 @@
            case 0:
                return Integer.parseInt(first);
            case 1:
                return Integer.parseInt(second);
                return Integer.parseInt(first) + Integer.parseInt(second);
            case 2:
                return Integer.parseInt(thrid);
                return Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid);
            default:
                return (times - 2) * Integer.parseInt(thrid) + Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid);
        }
src/main/java/com/zy/asrs/task/AutoOrderScheduler.java
New file
@@ -0,0 +1,76 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.Order;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.service.AgvBasDevpService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.AutoOrderHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * Created by vincent on 2020/7/7
 */
@Component
public class AutoOrderScheduler {
    private static final Logger log = LoggerFactory.getLogger(AutoOrderScheduler.class);
    @Autowired
    private OrderDetlMapper orderDetlMapper;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private AutoOrderHandler autoOrderHandler;
    public void execute() {
        Config auto = configService.selectOne(new EntityWrapper<Config>().eq("code", "AUTO_ORDER"));
        if (auto != null && "NO".equals(auto.getValue())) {
            return;
        }
        List<AgvBasDevp> agvBasDevps = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>().isNotNull("barcode").or().eq("barcode", ""));
        for (AgvBasDevp agvBasDevp : agvBasDevps) {
            List<String> listAutoDetl = orderDetlMapper.listAutoDetl(agvBasDevp.getDevNo());
            if (listAutoDetl != null && !listAutoDetl.isEmpty()) {
                for (String orderNo : listAutoDetl) {
                    Order order = orderService.selectByNo(orderNo);
                    if (order == null) {
                        continue;
                    }
                    ReturnT<String> start = autoOrderHandler.start(order);
                    if (start.getCode() == ReturnT.FAIL_CODE) {
                        log.error("自动接单失败,订单号:" + order.getOrderNo() + ",失败原因:" + start.getMsg());
                    } else {
                        log.info("自动接单成功,订单号:" + order.getOrderNo());
                        break;
                    }
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,11 +1,14 @@
package com.zy.asrs.task;
import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.OrderSyncHandler;
@@ -38,7 +41,14 @@
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderDetlMapper orderDetlMapper;
    @Autowired
    private DocTypeService docTypeService;
    private Integer page = 1;
    private Integer size = 100;
    @Scheduled(cron = "0 0 1 * * ? ")
    public void clearApiLog() {
@@ -53,6 +63,8 @@
    @Scheduled(fixedDelay = 600000)
    //@Async("orderThreadPool")
    public void completeAndReport() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orders = orderService.selectComplete();
@@ -79,6 +91,8 @@
                }
            }
        }
        stopWatch.stop();
        log.info("定时任务完成,耗时:{}ms", stopWatch.getTotalTimeMillis());
    }
    //@Scheduled(cron = "* 0/5 * * * ? ")
@@ -87,10 +101,12 @@
    //@Async("orderThreadPool")
    public synchronized void reportOrder() {
        DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", "银座采购入库单"));
        List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("doc_type", docType.getDocId()).in("settle", 2, 4));
        orderList.forEach(order -> {
            orderSyncHandler.timelyStart(order);
        });
        if (docType != null) {
            List<String> reportDetl = orderDetlMapper.getReportDetl(docType.getDocId());
            reportDetl.forEach(orderNo -> {
                orderSyncHandler.timelyStart(orderService.selectByNo(orderNo));
            });
        }
    }
@@ -98,12 +114,25 @@
    定时查询状态为2.作业中的单据,检查是否完成
     */
    //@Scheduled(cron = "0 */1 * * * ? ")
    @Scheduled(fixedDelay = 300000)
    @Scheduled(fixedDelay = 60000)
    public void completeOrder() {
        List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("settle", 2));
        orderList.forEach(order -> {
            orderService.checkComplete2(order.getOrderNo());
        });
        try {
            Page<Order> settle = orderService.selectPage(new Page<Order>(page, size), new EntityWrapper<Order>().eq("settle", 2));
            if (settle != null) {
                List<Order> orderList = settle.getRecords();
                if (orderList == null || orderList.isEmpty()) {
                    log.info("轮询完毕,{},{}", page, settle.getTotal());
                    page = 1;
                    return;
                }
                orderList.forEach(order -> {
                    orderService.checkComplete2(order.getOrderNo());
                });
            }
        } finally {
            page++;
        }
        log.info("分页查询完毕,{}", page);
    }
}
src/main/java/com/zy/asrs/task/ReportDataScheduler.java
@@ -121,12 +121,10 @@
    @Scheduled(fixedDelay = 1000 * 60 * 30)
    public void executeStock() {
        log.info("Stock定时任务开始执行");
//        if (!flag) {
//            return;
//        }
        if (!flag) {
            return;
        }
        Map<String, Object> mesTokenInfo = getMesTokenInfo();
        reportDataHandler.stock(mesTokenInfo);
        log.info("Stock定时任务结束执行");
    }
}
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -153,7 +153,7 @@
                if (pltType != null) {
                    agvWrkMast.setPltType(pltType);
                }
                log.info("工作号--{},仓库编码:{}", agvWrkMast.getWrkNo(), agvWrkMast.getPltType());
                //log.info("工作号--{},仓库编码:{}", agvWrkMast.getWrkNo(), agvWrkMast.getPltType());
            }
            agvWrkMast.setModiTime(new Date());
            //修改工作档状态为207.库存更新完成
src/main/java/com/zy/asrs/task/handler/AutoOrderHandler.java
New file
@@ -0,0 +1,111 @@
package com.zy.asrs.task.handler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.AgvLocDetlService;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.LocDto;
import com.zy.common.model.OrderDto;
import com.zy.common.model.TaskDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/7/7
 */
@Service
public class AutoOrderHandler extends AbstractHandler<String> {
    @Autowired
    private OrderService orderService;
    @Autowired
    private AgvLocMastService agvLocMastService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Transactional
    public ReturnT<String> start(Order order) {
//        double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
//        if (issued <= 0.0D) {
//            continue;
//        }
//
//
//        Double issued = orderDetl.getAnfme() - orderDetl.getQty();
//        //根据物料号和批次找到对应的库存,并且按照修改时间排序
//        Wrapper<AgvLocDetl> wrapper = new EntityWrapper<AgvLocDetl>().eq("matnr", orderDetl.getMatnr()).orderBy("modi_time");
//
//        wapperSetCondition(wrapper, "three_code", orderDetl.getThreeCode());
//        List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(wrapper);
//
//        for (AgvLocDetl agvLocDetl : agvLocDetls) {
//            //判断当前库位货物是否F在库
//            AgvLocMast agvLocMast = agvLocMastService.selectById(agvLocDetl.getLocNo());
//            if (!"F".equals(agvLocMast.getLocSts())) {
//                continue;
//            }
//            //当前库位的库存量
//            double anfme = agvLocDetl.getAnfme();
//            //int ioType = anfme > issued ? 101 : 103;
//            anfme = anfme > issued ? issued : anfme;
//            //用于显示工作明细档的订单号
//            String orderNoWrkDtel = Utils.getOrderNo(orderNo, anfme);
//            //更新订单数量
//            orderNo = Utils.orderMergeUpdate(orderNo, anfme);
//            LocDto locDto = new LocDto(agvLocDetl.getLocNo(), agvLocDetl.getMatnr(), agvLocDetl.getMaktx(), agvLocDetl.getBatch(), orderNoWrkDtel, anfme, agvLocDetl.getProcessSts());
//            locDto.setCsocode(csocode);
//            locDto.setIsoseq(isoseq);
//            locDto.setContainerCode(agvLocDetl.getSuppCode());
//            locDto.setProcessSts(agvLocDetl.getProcessSts());
//            //当前库位所处楼层
//            int floor = Integer.parseInt(agvLocDetl.getLocNo().split("F")[1]);
//            //locDto.setAgvStaNos(queryAgvStaNosByFloor(floor));
//            locDto.setAgvStaNos(agvBasDevpService.selectCacheShelvesStationCodeByLocType(agvLocMast.getLocType1(), floor));
//            locDtoList.add(locDto);
//
//            issued -= anfme;
//        }
//
//
//        // 订单预校验  ===>> 1.订单状态; 2.订单带出数量
//        List<OrderDto> orderDtos = orderPreVerification(locDtos);
//
//        List<TaskDto> taskDtos = new ArrayList<>();
//        List<TaskDto> agvTaskDtos = new ArrayList<>();
//        generateTaskDto(locDtos, taskDtos, agvTaskDtos);
//
//        //生成AGV出库任务
//        agvWorkService.stockOutWrkMast(agvTaskDtos, getUserId());
//
//        // 生成出库任务
//        taskDtos.stream().map(TaskDto::getLocNo).distinct().collect(Collectors.toList());
//        for (TaskDto taskDto : taskDtos) {
//            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
//            workService.stockOut(staNo, taskDto, getUserId());
//        }
        return SUCCESS;
    }
    private void wapperSetCondition(Wrapper wrapper, String column, String condition) {
        if (Cools.isEmpty(condition)) {
            wrapper.andNew().eq(column, "").or().isNull(column);
        } else {
            wrapper.andNew().eq(column, condition);
        }
    }
}
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -104,57 +104,59 @@
        if (!report) {
            return;
        }
        if (order == null) {
            return;
        }
        //List<String> docNames = new ArrayList<>(Arrays.asList("银座采购入库单"));
        //List<String> docNames = new ArrayList<>(Arrays.asList("银座采购入库单", "银座委外材料出库单", "银座生产材料出库单"));
        //if (docNames.contains(docType.getDocName())) {
            List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId());
            List<OrderDetl> report = new ArrayList<>();
            for (OrderDetl orderDetl : orderDetlList) {
                if (orderDetl.getQty() > 0 && orderDetl.getQty() > (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty())) {
                    report.add(orderDetl);
        List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId());
        List<OrderDetl> report = new ArrayList<>();
        for (OrderDetl orderDetl : orderDetlList) {
            if (orderDetl.getQty() > 0 && orderDetl.getQty() > (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty())) {
                report.add(orderDetl);
            }
        }
        if (Cools.isEmpty(order.getPltType())) {
            List<AgvWrkDetlLog> agvWrkDetlLogs = agvWrkDetlLogService.selectList(new EntityWrapper<AgvWrkDetlLog>().eq("order_no", order.getOrderNo()).orderBy("appe_time", false));
            if (!Cools.isEmpty(agvWrkDetlLogs)) {
                AgvWrkDetlLog agvWrkDetlLog = agvWrkDetlLogs.get(0);
                List<AgvWrkMastLog> agvWrkMastLogs = agvWrkMastLogService.selectList(new EntityWrapper<AgvWrkMastLog>().eq("wrk_no", agvWrkDetlLog.getWrkNo()).eq("io_type", 1).orderBy("appe_time", false));
                if (!Cools.isEmpty(agvWrkMastLogs)) {
                    AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMastLogs.get(0).getLocNo());
                    if (agvLocMast != null) {
                        log.info("补充逻辑生效:{}", order.getOrderNo());
                        order.setPltType(agvLocMast.getPltType());
                    }
                }
            }
            if (Cools.isEmpty(order.getPltType())) {
                List<AgvWrkDetlLog> agvWrkDetlLogs = agvWrkDetlLogService.selectList(new EntityWrapper<AgvWrkDetlLog>().eq("order_no", order.getOrderNo()).orderBy("appe_time", false));
                if (!Cools.isEmpty(agvWrkDetlLogs)) {
                    AgvWrkDetlLog agvWrkDetlLog = agvWrkDetlLogs.get(0);
                    List<AgvWrkMastLog> agvWrkMastLogs = agvWrkMastLogService.selectList(new EntityWrapper<AgvWrkMastLog>().eq("wrk_no", agvWrkDetlLog.getWrkNo()).eq("io_type", 1).orderBy("appe_time", false));
                    if (!Cools.isEmpty(agvWrkMastLogs)) {
                        AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMastLogs.get(0).getLocNo());
                        if (agvLocMast != null) {
                            log.info("补充逻辑生效:{}", order.getOrderNo());
                            order.setPltType(agvLocMast.getPltType());
                        }
                    }
                }
                if (Cools.isEmpty(order.getPltType())) {
                    return;
                return;
            }
        }
        if (Cools.isEmpty(order.getInTime())) {
            order.setInTime(DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmsssss_F));
        }
        if (!Cools.isEmpty(report)) {
            ReportErpParam param = new ReportErpParam();
            mappingParam(order, param);
            mappingParamChildren(report, param);
            log.info(JSON.toJSONString(param));
            int code = doHttpRequest(param, "单据审核", url, orderReportPath, null, "127.0.0.1");
            if (code == 0) {
                Date date = new Date();
                order.setInTime(DateUtils.convert(date, DateUtils.yyyyMMddHHmmsssss_F));
                orderService.updateById(order);
                for (OrderDetl orderDetl : report) {
                    log.info("{}单据审核上报了:{}", order.getOrderNo(), orderDetl.getQty() - (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty()));
                    orderDetl.setReportQty(orderDetl.getQty());
                    orderDetl.setUpdateTime(date);
                    orderDetlService.updateById(orderDetl);
                }
            }
            if (Cools.isEmpty(order.getInTime())) {
                order.setInTime(DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmsssss_F));
            }
            if (!Cools.isEmpty(report)) {
                ReportErpParam param = new ReportErpParam();
                mappingParam(order, param);
                mappingParamChildren(report, param);
                log.info(JSON.toJSONString(param));
                int code = doHttpRequest(param, "单据审核", url, orderReportPath, null, "127.0.0.1");
                if (code == 0) {
                    Date date = new Date();
                    order.setInTime(DateUtils.convert(date, DateUtils.yyyyMMddHHmmsssss_F));
                    orderService.updateById(order);
                    for (OrderDetl orderDetl : report) {
                        log.info("{}单据审核上报了:{}", order.getOrderNo(), orderDetl.getQty() - (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty()));
                        orderDetl.setReportQty(orderDetl.getQty());
                        orderDetl.setUpdateTime(date);
                        orderDetlService.updateById(orderDetl);
                    }
                }
           // }
            // }
        }
    }
@@ -187,7 +189,7 @@
            childInfo.setIrowno(orderDetl.getItemNum());
            childInfo.setCInvCode(orderDetl.getMatnr());
            childInfo.setIQuantity(orderDetl.getQty() - (orderDetl.getReportQty() == null ? 0D : orderDetl.getReportQty()) + "");
            String batch = orderDetl.getBatch();
            String batch = orderDetl.getBrand();
            if (Cools.isEmpty(batch)) {
                childInfo.setCBatch("");
                childInfo.setBFree1("");
src/main/resources/application.yml
@@ -1,4 +1,4 @@
spring:
  profiles:
    #dev loc prod
    active: prod
    active: loc
src/main/resources/mapper/OrderDetlMapper.xml
@@ -345,4 +345,21 @@
        <include refid="pakOutPageCondition"></include>
    </select>
    <select id="getReportDetl" resultMap="BaseResultMap">
        select DISTINCT o.order_no
        from man_order_detl d
                 join man_order o on d.id = d.order_id
        where o.doc_type = #{docType}
          and d.qty > d.report_qty
          and d.qty > 0
    </select>
    <select id="listAutoDetl" resultMap="BaseResultMap">
        select DISTINCT o.order_no
        from man_order_detl d
                 join man_order o on d.id = d.order_id
        where d.dev_no = #{devNo}
        order by d.create_time asc
    </select>
</mapper>