自动化立体仓库 - WMS系统
whycq
2024-09-20 efac58964167be8db7cc5e967051c104d741bac2
Merge branch 'phyzwms2' into phyzasrs-erp
1个文件已添加
22个文件已修改
201 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvOpenController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderDetlController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveCreateExecuteScheduler.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NotifyLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OverYearLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/PlcLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkLogScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveCreateExecuteHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/ScheduleConfig.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/DetlDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvWrkMast/wrkMast.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvWrkMastLog/wrkMastLog.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
@@ -235,6 +235,7 @@
        }
        agvWrkMast.setWrkSts(206L);
        agvWrkMast.setModiTime(new Date());
        agvWrkMastService.updateById(agvWrkMast);
        return R.ok("货架离场成功");
@@ -254,6 +255,7 @@
        }
        agvWrkMast.setWrkSts(208L);
        agvWrkMast.setModiTime(new Date());
        agvWrkMastService.updateById(agvWrkMast);
        return R.ok("货架离场成功");
src/main/java/com/zy/asrs/controller/AgvOpenController.java
@@ -28,6 +28,7 @@
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.EnumSet;
import java.util.Map;
@@ -182,6 +183,7 @@
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue());
                agvWrkMast.setWrkSts(206L);
            }
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.updateById(agvWrkMast);
        }
    },
@@ -193,6 +195,7 @@
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
            //修改AGV工作档的工作状态为203.任务开始
            agvWrkMast.setWrkSts(203L);
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.updateById(agvWrkMast);
        }
    },
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -583,6 +583,7 @@
    @Transactional
    public R formModify(@RequestBody OrderDomainParam param){
        Order order = orderService.selectById(param.getOrderId());
        int docType = param.getDocType().intValue();
        if (order == null || order.getStatus() == 0) {
            return R.error("订单不存在");
        }
@@ -606,7 +607,7 @@
        // 2.重组数据
        List<DetlDto> list = new ArrayList<>();
        for (OrderDetl orderDetl : param.getOrderDetlList()) {
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch());
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getAnfme(), orderDetl.getProcessSts());
            if (DetlDto.has(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getThreeCode(),orderDetl.getDeadTime());
                item.setAnfme(item.getAnfme() + orderDetl.getAnfme());
@@ -614,10 +615,20 @@
                    throw new CoolException("保存订单明细档失败");
                }
            } else {
                if (docType == 35 && orderDetl.getProcessSts() == 1) {
                    List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>()
                            .eq("matnr", orderDetl.getMatnr())
                            .eq("order_no", orderDetl.getOrderNo())
                            .eq("process_sts", 3));
                    for (AgvLocDetl agvLocDetl : agvLocDetls) {
                        agvLocDetl.setProcessSts(1);
                        agvLocDetlService.updateById(agvLocDetl);
                    }
                }
                list.add(dto);
                orderDetl.setOrderId(order.getId());
                orderDetl.setOrderNo(order.getOrderNo());
                orderDetl.setSource(param.getDocType().intValue());
                orderDetl.setSource(docType);
                orderDetl.setCreateBy(getUserId());
                orderDetl.setCreateTime(now);
                orderDetl.setUpdateBy(getUserId());
@@ -886,18 +897,18 @@
                proSts = 3;
            }
            String odNo = uuid;
            if(docType.getPakin() == 1){
                uuid += "_I";
                odNo += "_I";
            }else {
                uuid += "_O";
                odNo += "_O";
            }
            Order order = orderService.selectByNo(uuid);
            Order order = orderService.selectByNo(odNo);
            if (null == order) {
                order = new Order(
                        String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                        uuid,    // 订单编号
                        odNo,    // 订单编号
                        null,    // 单据日期
                        docType.getDocId(),    // 单据类型
                        null,    // 项目编号
@@ -935,6 +946,11 @@
                    throw new CoolException("生成单据主档失败,请重新导入!");
                }
            }else {
                //  有原订单在的情况
                DocType orderType = docTypeService.selectById(order.getDocType());
                if (!orderType.getDocName().equals(docName)) {
                    throw new CoolException("新订单:" + uuid + " 与系统内的订单号相同,单据类型不同。请确认新订单单据类型!");
                }
                order.setSettle(order.getSettle() == 1L ? 1L : 2L );
                orderService.updateById(order);
            }
@@ -961,13 +977,16 @@
                    throw new CoolException("生成单据明细失败,请重新导入!");
                }
            } else {
                if (anfme < 0)  {
                    throw new CoolException("订单数量不允许为负数!");
                }
                if(!orderDetlService.increaseAnfme(order.getId(), matnr, null, anfme,csocode,isocode)) {
                    throw new CoolException("生成单据明细失败,请重新导入!");
                }
            }
            // 生成调拨单
            if (docType.getDocId().intValue() == 32) {
                String dbUuid = "DB" + uuid;
                String dbUuid = "DB" + odNo;
                Order order2 = orderService.selectByNo(dbUuid);
                if (null == order2) {
                    order2 = new Order(
@@ -1045,7 +1064,7 @@
            // 工序为1:待加工 生成加工单
            if (proSts == 1) {
                if (docType.getDocId().intValue() == 32) {
                    String dbUuid = "JG" + uuid;
                    String dbUuid = "JG" + odNo;
                    Order order3 = orderService.selectByNo(dbUuid);
                    if (null == order3) {
                        order3 = new Order(
src/main/java/com/zy/asrs/controller/OrderDetlController.java
@@ -15,7 +15,9 @@
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.*;
import com.zy.common.web.BaseController;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StopWatch;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
@@ -149,12 +151,15 @@
    }
    @RequestMapping(value = "/orderDetl/pakout/list/authV3")
    @Synchronized
    @ManagerAuth
    public R pakoutList3(@RequestParam(defaultValue = "1")Integer curr,
                         @RequestParam(defaultValue = "10")Integer limit,
                         @RequestParam(required = false)String orderByField,
                         @RequestParam(required = false)String orderByType,
                         @RequestParam Map<String, Object> param){
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
@@ -168,14 +173,14 @@
                docIds.add(pakin.getDocId());
            }
        }
        wrapper.in("source",docIds);
        wrapper.ne("source",19);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
            Double sumAnfme = agvLocDetlService.getSumAnfme(record.getMatnr(), record.getThreeCode());
            record.setStock(sumAnfme == null ? 0 : sumAnfme);
        }
        stopWatch.stop();
        System.out.println(stopWatch.getTotalTimeSeconds());
        return R.ok(page);
    }
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -151,6 +151,7 @@
            } else {
                Double anfme = agvWrkDetl.getAnfme() + pick.getCount();
                agvWrkDetl.setAnfme(anfme);
                agvWrkDetl.setModiTime(new Date());
                agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("matnr",agvWrkDetl.getMatnr()).eq("three_code",agvWrkDetl.getThreeCode()).eq("supp_code",pick.getSuppCode()));
            }
@@ -178,6 +179,7 @@
        }
        if (agvLocDetls.size() == sameNumber) {
            agvWrkMast.setIoType(101);
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no", pickParams.getWrkNo()));
        }
@@ -515,7 +517,10 @@
        if (ioType == 12 && locMast.getFloor() == 1 && floor != 4 && agvLocMast.getFloor() != 1) {
            List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo()));
            for (AgvLocDetl agvLocDetl : agvLocDetls) {
                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("three_code", agvLocDetl.getThreeCode()).eq("matnr", agvLocDetl.getMatnr()).eq("order_no", "DB" + agvLocDetl.getOrderNo()));
                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("three_code", agvLocDetl.getThreeCode()).eq("matnr", agvLocDetl.getMatnr()).eq("source", 33));
                if (Cools.isEmpty(orderDetl)) {
                    throw new CoolException("当前物料的调拨单不存在!");
                }
                orderDetl.setQty(orderDetl.getQty() - agvLocDetl.getAnfme());
                if (!orderDetlService.updateById(orderDetl)) {
                    throw new CoolException("保存工作明细失败");
@@ -547,8 +552,28 @@
        if (!agvWrkMast.getBarcode().equals(param.getBarcode())) {
            throw new CoolException("当前货架码与任务不匹配");
        }
        if (!agvWrkMast.getWrkSts().equals(207L)) {
            throw new CoolException("工作状态不符合离场条件");
        if (!agvWrkMast.getWrkSts().equals(207L) && !agvWrkMast.getWrkSts().equals(205L)) {
            throw new CoolException("当前工作状态:" + agvWrkMast.getWrkSts$() +"不符合离场条件");
        }
        if (agvWrkMast.getWrkSts().equals(205L)) {
            // 库位 -- 接驳位 / 库位
            if (agvWrkMast.getLocNo().substring(0,2).equals("DB")) {
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue());
                // 接驳位 -- 库位
            } else {
                agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode(),agvWrkMast.getWhsType().shortValue());
            }
            // 接驳位 -- 库位
            if (agvWrkMast.getSourceLocNo().substring(0,2).equals("DB")) {
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","",(short)0);
                // 库位 -- 接驳位 / 库位
            } else {
                //修改源库位状态为O
                agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",agvWrkMast.getWhsType().shortValue(),"",(short)0);
                //更新目标库位明细 101.出库 删除源库位库存明细
                agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo()));
            }
        }
        //生成AGV工作历史档 + 生成AGV工作明细历史档
@@ -571,7 +596,7 @@
            }
        }
        // 更新站点状态
        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null);
//        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null);
        // 更新源库位状态
        agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"O","",agvWrkMast.getWhsType().shortValue());
@@ -640,6 +665,7 @@
        if (!agvWrkMast.getBarcode().equals(param.getBarcode())) {
            throw new CoolException("当前货架码与任务不匹配");
        }
        agvWrkMast.setModiTime(new Date());
        agvWrkMast.setWrkSts(213L);
        agvWrkMast.setSourceLocNo("");
        if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) {
@@ -668,6 +694,7 @@
            throw new CoolException("当前工作类型不能空架进场");
        }
        agvWrkMast.setWrkSts(214L);
        agvWrkMast.setModiTime(new Date());
        agvWrkMast.setSourceLocNo(param.getDevNo());
        if (!agvWrkMastService.update(agvWrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no",agvWrkMast.getWrkNo()))) {
            throw new CoolException("更新工作档失败");
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -284,6 +284,7 @@
            String locNo = agvWrkMast.getLocNo();
            agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
            agvWrkMast.setSourceLocNo(locNo);
            agvWrkMast.setModiTime(new Date());
            agvWrkMast.setIoTime(now);
            agvWrkMast.setLogErrMemo("createWaitPainWrkMastStart");
            agvWrkMastService.updateById(agvWrkMast);
@@ -1215,9 +1216,11 @@
        }
        if (wrkMast.getIoType() == 108) {
            wrkMast.setIoType(111);
            wrkMast.setModiTime(new Date());
            agvWrkMastService.update(wrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no", workNo));
        } else if(wrkMast.getIoType() == 111) {
            wrkMast.setIoType(108);
            wrkMast.setModiTime(new Date());
            agvWrkMastService.update(wrkMast,new EntityWrapper<AgvWrkMast>().eq("wrk_no", workNo));
        }
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -67,6 +67,7 @@
        //判断要修改的工作档状态是否合理,如果不合理则抛出异常
        checkWrkSts(agvWrkMast,wrkSts);
        agvWrkMast.setWrkSts(wrkSts);
        agvWrkMast.setModiTime(new Date());
        this.updateById(agvWrkMast);
    }
@@ -109,6 +110,7 @@
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLogErrMemo("startAllcationIn");
        agvWrkMast.setModiTime(new Date());
        agvWrkMastService.updateById(agvWrkMast);
        // 更目标库位
        locMast.setLocSts("S");
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -43,7 +43,7 @@
    /*
    定时处理AGV工作档中工作状态为205.工作完成 且 (1.入库 || 53,拣料入库 || 57.盘点入库 || 10.空板入库 || 11.单层移库 || 12.跨层移库 || 108.自动调拨 || 109.手动调拨)的数据
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void excutePutwayWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 205)
@@ -76,7 +76,7 @@
    /*
    定时处理AGV工作档中工作状态为206.出库完成 且 (101.出库 || 110.空板出库)
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void excuteCarryWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 206)
@@ -97,7 +97,7 @@
    /*
    定时处理AGV工作档中工作状态为206.出库完成 且 (101.出库 || 110.空板出库)
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void excuteCarryWrk2(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 208)
@@ -119,7 +119,7 @@
    putaway:上架
    定时处理AGV工作档中工作状态为201.生成入库任务ID 且(出库类型为 53.拣料再入库 || 1.入库 || 10.空板入库栽 || 57.盘点再入库)的数据
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void startPutwayWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                ,new EntityWrapper<AgvWrkMast>()
@@ -152,7 +152,7 @@
    putaway:上架
    定时处理AGV工作档中工作状态为201.生成入库任务ID 且(出库类型为 53.拣料再入库 || 1.入库 || 10.空板入库栽 || 57.盘点再入库)的数据
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void startAllcationIn(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                ,new EntityWrapper<AgvWrkMast>()
@@ -174,7 +174,7 @@
    carry:搬运,统指出库、移库、点到点搬运等
    定时处理AGV工作档中工作状态为21.生成出库任务 且(出库类型为 101.出库 || 103.拣料出库 || 11.库格移栽 || 110.空板出库 || 107.盘点出库)的数据
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void startCarryWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                ,new EntityWrapper<AgvWrkMast>()
@@ -241,7 +241,7 @@
    /*
    自动生成空板出库任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    public void autoEmptyOut(){
        boolean packageEmptyAutoOUt = Cools.eq("Y",Parameter.get().getPackageEmptyAutoOUt());
        boolean mateEmptyAutoOut = Cools.eq("Y",Parameter.get().getMateEmptyAutoOut());
src/main/java/com/zy/asrs/task/AutoMoveCreateExecuteScheduler.java
@@ -117,6 +117,7 @@
                WrkMastExecute wrkMastExecute = wrkMastExecuteService.selectOne(new EntityWrapper<WrkMastExecute>().eq("io_type", 121).eq("wrk_no", agvWrkMast.getWrkNo().longValue()));
                if (!Cools.isEmpty(wrkMastExecute) && wrkMastExecute.getWrkSts()==3L && wrkMastExecute.getNowPosition()==3){
                    agvWrkMast.setWrkSts(205L);//任务完成
                    agvWrkMast.setModiTime(new Date());
                    agvWrkMastService.updateById(agvWrkMast);
                    //生成agv_wrk_mast_execute任务历史档
                    wrkMastExecuteLogService.save(wrkMastExecute);
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -66,7 +66,7 @@
     * ioType 108.自动调拨
     * crnNo :2目标楼层
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    private synchronized void execute2(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
src/main/java/com/zy/asrs/task/NotifyLogScheduler.java
@@ -19,7 +19,7 @@
    @Autowired
    private NotifyLogHandler notifyLogHandler;
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    private void execute(){
        ReturnT<String> returnT = notifyLogHandler.start();
        if (!returnT.isSuccess()) {
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,9 +1,14 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.AgvLocDetlService;
import com.zy.asrs.service.ApiLogService;
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.OrderSyncHandler;
@@ -30,8 +35,14 @@
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Scheduled(cron = "0 0 1 * * ? ")
    public void clearApiLog(){
    public void clearApiLog() {
        try {
            apiLogService.clearWeekBefore();
        } catch (Exception e) {
@@ -40,12 +51,28 @@
    }
    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
    //@Async("orderThreadPool")
    public void completeAndReport() {
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orders = orderService.selectComplete();
            for (Order order : orders) {
                //如果是加工单则进行判断
                if (order.getDocType() == 33) {
                    //查询库存中是否存在该订单的物料信息,存在则不处理该订单
                    List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId());
                    Boolean flag = false;
                    for (OrderDetl orderDetl : orderDetlList) {
                        List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("matnr", orderDetl.getMatnr()).eq("three_code", orderDetl.getThreeCode()));
                        if (!Cools.isEmpty(agvLocDetls)) {
                            //只要有一项订单明细存在,则标识为true,跳过该订单
                            flag = true;
                        }
                    }
                    if (flag) {
                        continue;
                    }
                }
                ReturnT<String> result = orderSyncHandler.start(order);
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
@@ -58,7 +85,7 @@
    定时查询状态为2.作业中的单据,检查是否完成
     */
    @Scheduled(cron = "0 */1 * * * ? ")
    public void completeOrder(){
    public void completeOrder() {
        List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("settle", 2));
        orderList.forEach(order -> {
            orderService.checkComplete(order.getOrderNo());
src/main/java/com/zy/asrs/task/OverYearLogScheduler.java
@@ -19,7 +19,7 @@
    @Autowired
    private OverYearLogHandler overYearLogHandler;
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    private void execute(){
        ReturnT<String> returnT = overYearLogHandler.start();
        if (!returnT.isSuccess()) {
src/main/java/com/zy/asrs/task/PlcLogScheduler.java
@@ -19,7 +19,7 @@
    @Autowired
    private PlcLogHandler plcLogHandler;
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    private void execute(){
        ReturnT<String> returnT = plcLogHandler.start();
        if (!returnT.isSuccess()) {
src/main/java/com/zy/asrs/task/WorkLogScheduler.java
@@ -23,7 +23,7 @@
    @Autowired
    private WrkMastService wrkMastService;
    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/1 * * * * ? ")
    private void execute(){
        List<WrkMast> wrkMasts = wrkMastService.selectToBeHistoryData();
        if (wrkMasts.isEmpty()) {
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -116,6 +116,7 @@
            }
            agvWrkMast.setModiTime(new Date());
            //修改工作档状态为207.库存更新完成
            agvWrkMast.setWrkSts(207L);
            agvWrkMastService.updateById(agvWrkMast);
@@ -279,6 +280,13 @@
                //删除AGV工作明细档
                agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
            }
//            else {
//                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"O","",agvWrkMast.getWhsType().shortValue());
//                if (!agvWrkMast.getSourceLocNo().substring(0,2).equals("DB")) {
//                    agvWrkMast.setSourceLocNo("");
//                }
//                agvWrkMastService.updateById(agvWrkMast);
//            }
            if(!isJSON(orderNo)){
                //检查订单是否已完成
@@ -320,6 +328,7 @@
            String orderNo = getOrderNoByWrkNo(wrkNo);
            //修改工作档状态为207.库存更新完成
            agvWrkMast.setWrkSts(207L);
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.updateById(agvWrkMast);
            //修改源库位状态为O
            if (agvWrkMast.getIoType() == 110) {
@@ -420,6 +429,7 @@
            }
            //修改工作档状态为207.库存更新完成
            agvWrkMast.setWrkSts(207L);
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.updateById(agvWrkMast);
            //修改源库位状态为O
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","",null);
@@ -472,6 +482,7 @@
            }
            agvWrkMast.setWrkSts(202L);
            agvWrkMast.setModiTime(new Date());
            agvWrkMastService.updateById(agvWrkMast);
            if(agvWrkMast.getIoType() == 1){
                //修改AGV入库通知档状态入出状态为Y
@@ -537,6 +548,7 @@
            Map<String, Object> devNoMap = devNoMaps.get(0);
            if((int)devNoMap.get("num") < maxWrokNum){
                agvWrkMast.setLocNo(devNoMap.get("dev_no").toString());
                agvWrkMast.setModiTime(new Date());
                agvWrkMastService.updateById(agvWrkMast);
                log.info("after:" + devNoMap.toString()  +  ", wrkNo:" + agvWrkMast.getWrkNo() + ", locNo: " + agvWrkMast.getLocNo());
            }
src/main/java/com/zy/asrs/task/handler/AutoMoveCreateExecuteHandler.java
@@ -28,7 +28,7 @@
        try{
            if (wrkMastExecuteService.insert(wrkMastExecute)){
                agvWrkMast.setWrkSts(agvWrkMast.getWrkSts()+1);
                agvWrkMast.setAppeTime(new Date());
                agvWrkMast.setModiTime(new Date());
                agvWrkMastService.updateById(agvWrkMast);
            }
        }catch (Exception e){
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -198,6 +198,7 @@
            throw new CoolException("当前库位正在进行入库,进行下一次轮询");
        }
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setModiTime(new Date());
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMast.setLogErrMemo("start2-doAutoMove2");
        agvWrkMastService.updateById(agvWrkMast);
@@ -219,6 +220,7 @@
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMast.setLogErrMemo("start2-doAutoMove2");
        agvWrkMast.setModiTime(new Date());
        agvWrkMastService.updateById(agvWrkMast);
        //更新目标库位状态
        updateAgvLocMast(locMast,"S");
@@ -241,8 +243,10 @@
        }
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLocNo(devpNo.getDevNo());
        agvWrkMast.setModiTime(new Date());
        agvWrkMast.setLogErrMemo("start3-doHandMove2");
        agvWrkMastService.updateById(agvWrkMast);
        agvWrkMast.setModiTime(new Date());
        updateAgvBasDevp(devpNo,"S",null,agvWrkMast.getBarcode());
        return SUCCESS;
    }
src/main/java/com/zy/common/config/ScheduleConfig.java
New file
@@ -0,0 +1,18 @@
package com.zy.common.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(12));
    }
}
src/main/java/com/zy/common/model/DetlDto.java
@@ -46,6 +46,12 @@
        this.anfme = anfme;
    }
    public DetlDto(String matnr, Double anfme,Integer processSts) {
        this.matnr = matnr;
        this.anfme = anfme;
        this.processSts = processSts;
    }
    public DetlDto(String matnr, String batch) {
        this.matnr = matnr;
        this.batch = batch;
src/main/java/com/zy/common/web/WcsController.java
@@ -651,6 +651,7 @@
            if(!Cools.isEmpty(agvWrkMast) && agvWrkMast.getIoType() == 101){
                //将工作党状态改为货架离场
                agvWrkMast.setWrkSts(206L);
                agvWrkMast.setModiTime(new Date());
                agvWrkMastService.updateById(agvWrkMast);
//                //发送货架立场请求,完成工作档
//                List<AgvWrkMast> agvWrkMastList = new ArrayList<>();
src/main/webapp/static/js/agvWrkMast/wrkMast.js
@@ -21,7 +21,7 @@
        cols: [[
            {type: 'checkbox'}
            ,{field: 'wrkNo', align: 'center',title: '工作号',sort: true, width: 85}
            ,{field: 'ioTime$', align: 'center',title: '工作时间',sort: true, width: 160}
            ,{field: 'modiTime$', align: 'center',title: '工作时间',sort: true, width: 160}
            ,{field: 'wrkSts$', align: 'center',title: '工作状态'}
            ,{field: 'ioType$', align: 'center',title: '入出库类型'}
            ,{field: 'ioPri', align: 'center',title: '优先级',width: 80}
@@ -57,6 +57,7 @@
            // ,{field: 'crnStrTime$', align: 'center',title: '堆垛机启动时间'}
            // ,{field: 'crnEndTime$', align: 'center',title: '堆垛机停止时间'}
            // ,{field: 'refIotime$', align: 'center',title: '拣料时间'}
            ,{field: 'appeTime$', align: 'center',title: '开始时间', hide:false, width: 160}
            ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true}
            ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true, width: 160}
            // ,{field: 'memo', align: 'center',title: '备注'}
src/main/webapp/static/js/agvWrkMastLog/wrkMastLog.js
@@ -28,7 +28,7 @@
            ,{field: 'sourceLocNo', align: 'center',title: '源库位'}
            ,{field: 'locNo', align: 'center',title: '目标库位'}
            ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true}
            ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true}
            ,{field: 'appeTime$', align: 'center',title: '开始时间', hide:false}
            ,{field: 'barcode', align: 'center',title: '货架码'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80}
        ]],