自动化立体仓库 - WMS系统
whycq
2024-09-04 41326b3129ae3e4ef7a45bc16dba64dc9dd27404
Merge branch 'phyzasrs' of http://47.97.1.152:5880/r/zy-asrs into phyzasrs-erp

 Conflicts:
 src/main/java/com/zy/asrs/controller/AgvLocMastController.java
 src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
 src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
 src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
 src/main/webapp/static/js/order/order.js
5个文件已添加
15个文件已修改
686 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvIoWorkController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWrkMastController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CheckParam.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/DetlDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocMast/locMast.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/order.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
@@ -121,7 +121,7 @@
            return null;
        }
        int floor =  Integer.parseInt(sourceLocNo.split("@")[1]);
        int floor =  Integer.parseInt(sourceLocNo.split("F")[1]);
        List<String> locNoList = agvLocMastService.queryGroupEmptyStock(floor);
src/main/java/com/zy/asrs/controller/AgvWrkMastController.java
@@ -54,7 +54,8 @@
        }else {
            wrapper.orderBy("io_time", false);
        }
        return R.ok(agvWrkMastService.selectPage(new Page<>(curr, limit), wrapper));
        Page<AgvWrkMast> agvWrkMastPage = agvWrkMastService.selectPage(new Page<>(curr, limit), wrapper);
        return R.ok(agvWrkMastPage);
    }
    @RequestMapping(value = "/wrkMast/list/auth/dbList")
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -110,7 +110,7 @@
            return R.parse(BaseRes.PARAM);
        }
        String docName = param.getChildren().get(0).getIQuantity() > 0 ? "银座采购入库单" : "银座采购退货单";
        String docName = !Cools.isEmpty(param.getOrderType()) ? param.getOrderType() : param.getChildren().get(0).getIQuantity() > 0 ? "银座采购入库单" : "银座采购退货单";
        boolean pakin = param.getChildren().get(0).getIQuantity() > 0 ? true : false;
        openService.syncOrder(param,pakin,docName);
@@ -119,6 +119,26 @@
    }
    /*
    盘点接口
     */
    @PostMapping("/check/default/v1")
    @AppAuth(memo = "库存盘点")
    public synchronized R checkLoc(@RequestHeader(required = false) String appkey,
                                     @RequestBody(required = true) CheckParam param,
                                     HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        openService.checkAndAdjustLocDetl(param);
        return R.ok("库存调整成功");
    }
    @PostMapping("/order/pakout/default/v1")
    @AppAuth(memo = "同步工单单据")
    public synchronized R orderPakout(@RequestHeader(required = false) String appkey,
src/main/java/com/zy/asrs/entity/param/CheckParam.java
New file
@@ -0,0 +1,13 @@
package com.zy.asrs.entity.param;
import com.zy.common.model.DetlDto;
import lombok.Data;
import java.util.List;
@Data
public class CheckParam {
    private String locNo;
    private String containerCode;
    private List<DetlDto> locDetls;
}
src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java
New file
@@ -0,0 +1,53 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * 采购入库上报参数
 */
@Data
public class MesBuyPakinReportParam {
    //采购订单编码
    private String code;
    private List<Iteam> iteam;
    @Data
    public static class Iteam{
        //物料编号
        private String materialCode;
        //批次号
        private String batchNo;
        //⼆维码
        private String qrCode;
        //采购订单⾏号
        private String lineNo;
        //⼊库数量
        private Double amount;
        //备注
        private String remark;
        //单位名称
        private String unit;
        //供应商编号
        private String supplierCode;
        //⼊库位置
        private String storageLocationCode;
        public Iteam(String materialCode, String batchNo, String qrCode, String lineNo, Double amount, String remark, String supplierCode, String storageLocationCode) {
            this.materialCode = materialCode;
            this.batchNo = batchNo;
            this.qrCode = qrCode;
            this.lineNo = lineNo;
            this.amount = amount;
            this.remark = remark;
            this.supplierCode = supplierCode;
            this.storageLocationCode = storageLocationCode;
        }
        public Iteam(){
        }
    }
}
src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java
New file
@@ -0,0 +1,89 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * MES调拨参数
 */
@Data
public class MesOrderReportParam {
    //编码
    private String code;
    //备注
    private String remark;
    private List<TransferOrderItem> transferOrderItems;
    private RecordCustomFieldBaseCO recordCustomFieldBaseCO;
    @Data
    public static class RecordCustomFieldBaseCO{
        private List<CustomField> customFields;
        @Data
        public static class CustomField{
            private String fieldCode;
            private String fieldValue;
            public CustomField(String fieldCode, String fieldValue) {
                this.fieldCode = fieldCode;
                this.fieldValue = fieldValue;
            }
        }
    }
    @Data
    public static class TransferOrderItem{
        //行备注 单据号
        private String remark;
        //接收仓位
        private String targetLocationCode;
        private List<InventoryDetail> inventoryDetails;
        @Data
        public static class InventoryDetail{
            private Amount amount;
            private BizKey bizKey;
            //发出仓位
            private String locationCode;
            //物料编码
            private String materialCode;
            //质量状态
            private Integer qcStatus;
            //仓储状态
            private Integer storageStatus;
            //版本号,默认为null
            private String version;
            @Data
            public static class Amount{
                //数量
                private Double amount;
                //单位编码
                private String unitCode;
                //单位名称 二选一
                private String unitName;
                public Amount(Double amount, String unitName, String unitCode) {
                    this.amount = amount;
                    this.unitCode = unitCode;
                    this.unitName = unitName;
                }
            }
            @Data
            public static class BizKey{
                //批次
                private String batchNo;
                public BizKey(String batchNo) {
                    this.batchNo = batchNo;
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java
New file
@@ -0,0 +1,41 @@
package com.zy.asrs.entity.param;
import lombok.Data;
/**
 * MES入库上报参数
 */
@Data
public class MesPakinReportParam {
    private String bizType;
    private String inboundOrderCode;
    private String remark;
    private InventoryAttr inventoryAttr;
    private NoQrCodeExecAmount noQrCodeExecAmount;
    @Data
    public static class InventoryAttr{
        private String batchNo;
        private String materialCode;
        private String storageLocationCode;
        public InventoryAttr(String batchNo,String materialCode,String storageLocationCode){
            this.batchNo = batchNo;
            this.materialCode = materialCode;
            this.storageLocationCode = storageLocationCode;
        }
    }
    @Data
    public static class NoQrCodeExecAmount{
        private Double amount;
        private String unitName;
        private String unitCode;
        public NoQrCodeExecAmount(Double amount, String unitName, String unitCode) {
            this.amount = amount;
            this.unitName = unitName;
            this.unitCode = unitCode;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java
New file
@@ -0,0 +1,39 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
/**
 * MES出库上报参数
 */
@Data
public class MesPakoutReportParam {
    //物料编码
    private String materialCode;
    //备注
    private String remark;
    //仓位编号
    private String storageCode;
    //仓库编号
    private String wareHouseCode;
    private List<String> batchNos;
    private Amount amount;
    @Data
    public static class Amount{
        private Double amount;
        //单位编号(编号和名称必填一个,两者不一致且都有效以编号为准)
        private String unitCode;
        //单位名称(编号和名称必填一个,两者不一致且都有效以编号为准)
        private String unitName;
        public Amount(Double amount, String unitName, String unitCode) {
            this.amount = amount;
            this.unitCode = unitCode;
            this.unitName = unitName;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java
@@ -12,8 +12,10 @@
    //入出库标记
    private Integer pakin;
    //单据类型
    private String orderType;
    //采购订单编号
    //订单编号
    private String cPOID;
    //供应商编码
    private String cVenCode;
@@ -88,10 +90,12 @@
    @Data
    public static class OrderDetl{
        //采购订单行号
        //订单行号
        private String ivouchrowno;
        //物料编码
        private String cInvCode;
        //批号
        private String batch;
        //需求时间
        private String dArriveDate;
        //需求数量
src/main/java/com/zy/asrs/service/OpenService.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
import com.zy.common.model.LocDetlDto;
import java.util.List;
@@ -78,4 +79,8 @@
     */
    boolean orderDelete(String orderNo);
    /*
    库存盘点
     */
    boolean checkAndAdjustLocDetl(CheckParam params);
}
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -390,7 +390,7 @@
        //生成移库工作档
        AgvWrkMast wrkMast = createWrkMast(11, 21L, sourceLocNo, targetLocNo, sourceLocDetl.getSuppCode(), now, userId,getContainerTypeByloc(sourceLocNo));
        //生成工作党明细
        createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId,sourceLocDetl.getThreeCode(),sourceLocDetl.getDeadTime(),sourceLocDetl.getProcessSts());
        createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId,sourceLocDetl.getThreeCode(),sourceLocDetl.getDeadTime());
        //修改目标库位状态
        updateAgvLocMast(targetLocMast,"S");
        //修改原库位状态
@@ -533,6 +533,7 @@
        updateAgvLocMast(agvLocMast,"S");
        return agvLocMast.getLocNo();
    }
    /*
    空板出库
     */
@@ -1055,6 +1056,7 @@
        wrkDetl.setAppeTime(now);
        wrkDetl.setModiUser(userId);
        wrkDetl.setModiTime(now);
        wrkDetl.setThreeCode(csocode);
        wrkDetl.setDeadTime(isoseq);
        if (!agvWrkDetlService.insert(wrkDetl)) {
@@ -1117,7 +1119,6 @@
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        wrkMast.setLogErrMemo("createWaitPainWrkMastStart");
        if (!agvWrkMastService.insertByIncrease(wrkMast)) {
            throw new CoolException("保存工作档失败");
        }
@@ -1228,4 +1229,4 @@
    }
}
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -16,7 +16,9 @@
import com.zy.asrs.utils.MatUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -59,6 +61,10 @@
    private WrkDetlService wrkDetlService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private AgvLocMastService agvLocMastService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Override
    @Transactional
@@ -129,6 +135,9 @@
            }
            OrderDetl orderDetl = new OrderDetl();
            orderDetl.sync(mat);
            if (!Cools.isEmpty(detlDto.getCFree1())){
                orderDetl.setSpecs(detlDto.getCFree1());
            }
            orderDetl.setBatch(detlDto.getBatch());
            orderDetl.setAnfme(detlDto.getAnfme());
            orderDetl.setOrderId(order.getId());
@@ -918,6 +927,49 @@
        return true;
    }
    @Override
    @Transactional
    @Synchronized
    public boolean checkAndAdjustLocDetl(CheckParam params) {
        //判断库位是否存在
        AgvLocMast agvLocMast = agvLocMastService.selectById(params.getLocNo());
        if(Cools.isEmpty(agvLocMast)){
            throw new CoolException("库位号不存在");
        }
        if(!Cools.eq("O",agvLocMast.getLocSts()) && !Cools.eq("F",agvLocMast.getLocSts())){
            throw new CoolException("当前库位正在作业中,无法盘点调整");
        }
        if(Cools.isEmpty(params.getLocDetls())){
            agvLocMast.setLocSts("O");
        }else {
            agvLocMast.setLocSts("F");
        }
        agvLocMastService.updateById(agvLocMast);
        //删除旧库存
        agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",params.getLocNo()));
        //新增盘点库存
        for (DetlDto detlDto : params.getLocDetls()){
            AgvLocDetl agvLocDetl = new AgvLocDetl();
            Mat mat = matService.selectByMatnr(detlDto.getMatnr());
            BeanUtils.copyProperties(mat,agvLocDetl);
            agvLocDetl.setLocNo(params.getLocNo());
            agvLocDetl.setSuppCode(params.getContainerCode());
            agvLocDetl.setAnfme(detlDto.getAnfme());
            agvLocDetl.setBatch(detlDto.getBatch());
            agvLocDetl.setThreeCode(detlDto.getCsocode());
            agvLocDetl.setDeadTime(detlDto.getIsoseq());
            agvLocDetlService.insert(agvLocDetl);
        }
        return true;
    }
    private Order orderMapping(OrderSyncParam param, Date now, boolean pakin, String docName){
        Order order = new Order();
        //uuid
@@ -930,6 +982,9 @@
        //单据日期
        order.setOrderTime(param.getDdate());
        //供应商编码
        order.setSalesman(param.getCVenCode());
        order.setMemo(param.getCMemo());
        //制单人
        order.setShipCode(param.getCPersonCode());
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -82,7 +82,7 @@
            try{
                autoMoveHandler.start2(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
@@ -130,7 +130,7 @@
            try{
                autoMoveHandler.start3(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -1,14 +1,20 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.MesBuyPakinReportParam;
import com.zy.asrs.entity.param.MesOrderReportParam;
import com.zy.asrs.entity.param.MesPakinReportParam;
import com.zy.asrs.entity.param.MesPakoutReportParam;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.utils.HttpHandler;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,17 +23,52 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AgvWrkMastHandler extends AbstractHandler<String> {
    //入库类型数组
    private static final List<Integer> IN_TYPE_LIST = new ArrayList<Integer>(){{
        add(1);
    }};
    //private static final int[] IN_TYPE_ARRAY = {1};
    //出库类型数组
    private static final List<Integer> OUT_TYPE_List = new ArrayList<Integer>(){{
//        add(101);
    }};
    //private static final int[] OUT_TYPE_ARRAY = {101};
    //移库类型数组
    private static final List<Integer> MOVE_TYPE_List = new ArrayList<Integer>(){{
        add(11);add(101); add(12); add(53); add(101); add(108); add(111); add(112);
    }};
    //private static final int[] MOVE_TYPE_ARRAY = {11,12};
    @Value("${agvBasDev.maxWorkNum}")
    private int maxWrokNum;
    @Value("${mes.url}")
    private String url;
    @Value("${mes.getTokenUrl}")
    private String getTokenUrl;
    @Value("${mes.orderReportPath}")
    private String orderReportPath;
    @Value("${mes.pakinReportPath}")
    private String pakinReportPath;
    @Value("${mes.buyPakinReportPath}")
    private String buyPakinReportPath;
    @Value("${mes.pakoutReportPath}")
    private String pakoutReportPath;
    @Value("${mes.getTokenPath}")
    private String getTokenPath;
    @Value("${mes.appKey}")
    private String appKey;
    @Value("${mes.appSecret}")
    private String appSecret;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
@@ -51,9 +92,18 @@
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private AgvWorkService agvWorkService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Transactional
    public ReturnT<String> completedPutWayWrk(AgvWrkMast agvWrkMast) {
        //用于上报mes的工作档明细
        List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
        try{
            int wrkNo = agvWrkMast.getWrkNo();
            String barcode = agvWrkMast.getBarcode();
@@ -241,17 +291,30 @@
                });
            }
            return SUCCESS;
            //上报mes
//            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
//            if(!Cools.isEmpty(param)){
//                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
//            }
            //return SUCCESS;
        }catch (Exception e){
            log.error(""+e.getMessage());
        }
        return FAIL;
        reportMes(agvWrkMast,agvWrkDetlListOld);
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
        //用于上报mes的工作档明细
        List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
        try{
            Date now = new Date();
            int wrkNo = agvWrkMast.getWrkNo();
            String orderNo = getOrderNoByWrkNo(wrkNo);
@@ -291,7 +354,6 @@
                    wrkMast.setModiUser(9527L);
                    wrkMast.setModiTime(now);
                    wrkMast.setLogErrMemo("completedCarryWrk");
                    if (!agvWrkMastService.insertByIncrease(wrkMast)) {
                        throw new CoolException("保存工作档失败");
                    }
@@ -328,15 +390,25 @@
                    orderService.checkComplete(o);
                });
            }
            return SUCCESS;
            //上报mes
//            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
//            if(!Cools.isEmpty(param)){
//                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
//            }
        }catch (Exception e){
            log.error(""+e.getMessage());
        }
        return FAIL;
        reportMes(agvWrkMast,agvWrkDetlListOld);
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> completedCarryWrk2(AgvWrkMast agvWrkMast) {
        //用于上报mes的工作档明细
        List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
        try{
            int wrkNo = agvWrkMast.getWrkNo();
            String orderNo = getOrderNoByWrkNo(wrkNo);
@@ -374,11 +446,18 @@
                    orderService.checkComplete(o);
                });
            }
            return SUCCESS;
            //上报mes
//            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
//            if(!Cools.isEmpty(param)){
//                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
//            }
//            reportMes(agvWrkMast,agvWrkDetlListOld);
//            return SUCCESS;
        }catch (Exception e){
            log.error(""+e.getMessage());
        }
        return FAIL;
        reportMes(agvWrkMast,agvWrkDetlListOld);
        return SUCCESS;
    }
    @Transactional
@@ -547,4 +626,219 @@
        return wrkMast;
    }
    private void reportMes(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        if(Cools.isEmpty(agvWrkDetls)){
            return ;
        }
        //区分不同任务类型的上报方式
        if(IN_TYPE_LIST.contains(agvWrkMast.getIoType())){
            reportMesPakinOrder(agvWrkMast,agvWrkDetls);
        }
        if(OUT_TYPE_List.contains(agvWrkMast.getIoType())){
            reportMesPakoutOrder(agvWrkMast,agvWrkDetls);
        }
        if(MOVE_TYPE_List.contains(agvWrkMast.getIoType())){
            generateMesParam(agvWrkMast,agvWrkDetls);
        }
    }
    private void reportMesPakinOrder(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
            //判断是否采购入库
            String orderNo = agvWrkDetl.getOrderNo();
            Order order = orderService.selectByNo(orderNo);
            DocType docType = docTypeService.selectById(order.getDocType());
            if (docType.getDocName().contains("采购")){
                OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(orderNo, agvWrkDetl.getMatnr(), agvWrkDetl.getThreeCode(), agvWrkDetl.getDeadTime());
                MesBuyPakinReportParam mesBuyPakinReportParam = new MesBuyPakinReportParam();
                List<MesBuyPakinReportParam.Iteam> iteams = new ArrayList<>();
                MesBuyPakinReportParam.Iteam iteam = new MesBuyPakinReportParam.Iteam();
                iteam.setMaterialCode(agvWrkDetl.getMatnr());
                iteam.setBatchNo(agvWrkDetl.getBatch());
                iteam.setAmount(agvWrkDetl.getAnfme());
                iteam.setStorageLocationCode(agvWrkMast.getLocNo());
                iteam.setLineNo(orderDetl.getItemNum());
                iteam.setSupplierCode(order.getSalesman());
                iteam.setUnit(agvWrkDetl.getUnit());
                iteams.add(iteam);
                mesBuyPakinReportParam.setCode(orderNo);
                mesBuyPakinReportParam.setIteam(iteams);
                doHttpRequest(mesBuyPakinReportParam,getMesTokenInfo(),"上报mes采购入库信息",url,buyPakinReportPath,null,"127.0.0.1");
            }else {
                MesPakinReportParam mesPakinReportParam = new MesPakinReportParam();
                mesPakinReportParam.setInboundOrderCode(agvWrkDetl.getOrderNo());
                mesPakinReportParam.setBizType("0");
                mesPakinReportParam.setInventoryAttr(new MesPakinReportParam.InventoryAttr(agvWrkDetl.getThreeCode().trim(),agvWrkDetl.getMatnr(),agvWrkMast.getLocNo()));
                mesPakinReportParam.setNoQrCodeExecAmount(new MesPakinReportParam.NoQrCodeExecAmount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null));
                doHttpRequest(mesPakinReportParam,getMesTokenInfo(),"上报mes入库信息",url,pakinReportPath,null,"127.0.0.1");
            }
        }
    }
    private void reportMesPakoutOrder(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
            MesPakoutReportParam mesPakoutReportParam = new MesPakoutReportParam();
            mesPakoutReportParam.setStorageCode(agvWrkMast.getLocNo());
            AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
            mesPakoutReportParam.setWareHouseCode(agvLocMast.getPltType().toString());
            mesPakoutReportParam.setMaterialCode(agvWrkDetl.getMatnr());
            mesPakoutReportParam.setBatchNos(Arrays.asList(agvWrkDetl.getThreeCode().trim()));
            mesPakoutReportParam.setAmount(new MesPakoutReportParam.Amount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null));
            doHttpRequest(mesPakoutReportParam,getMesTokenInfo(),"上报mes出库信息",url,pakoutReportPath,null,"127.0.0.1");
        }
    }
    private void generateMesParam(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        if(agvWrkMast.getIoType() == 53){
            String locNo = agvWrkMast.getLocNo();
            agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
            agvWrkMast.setSourceLocNo(locNo);
        }
        MesOrderReportParam param = new MesOrderReportParam();
        List<MesOrderReportParam.TransferOrderItem> transferOrderItems = new ArrayList<>();
        List<MesOrderReportParam.TransferOrderItem.InventoryDetail> inventoryDetails = new ArrayList<>();
        List<MesOrderReportParam.RecordCustomFieldBaseCO.CustomField> customFields = new ArrayList<>();
        MesOrderReportParam.RecordCustomFieldBaseCO recordCustomFieldBaseCO = new MesOrderReportParam.RecordCustomFieldBaseCO();
        recordCustomFieldBaseCO.setCustomFields(customFields);
        param.setRecordCustomFieldBaseCO(recordCustomFieldBaseCO);
        //添加transferOrderItem属性
        MesOrderReportParam.TransferOrderItem transferOrderItem = new MesOrderReportParam.TransferOrderItem();
        transferOrderItem.setRemark(agvWrkDetls.get(0).getOrderNo());
        //调拨
        if(agvWrkMast.getLocNo().contains("YZ")){
            transferOrderItem.setTargetLocationCode(agvWrkMast.getLocNo());
        }else {
            //出库默认仓位
            String floor = agvWrkMast.getLocNo().split("F")[1];
            transferOrderItem.setTargetLocationCode(getTargetLocationByFloor(floor));
        }
        transferOrderItems.add(transferOrderItem);
        transferOrderItem.setInventoryDetails(inventoryDetails);
        param.setTransferOrderItems(transferOrderItems);
        for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
            MesOrderReportParam.TransferOrderItem.InventoryDetail inventoryDetail = new MesOrderReportParam.TransferOrderItem.InventoryDetail();
            //添加amount属性
            MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount amount = new MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null);
            inventoryDetail.setAmount(amount);
            //添加bizKey属性
            MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey bizKey = new MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey(Cools.isEmpty(agvWrkDetl.getBatch()) ? "" : agvWrkDetl.getBatch().trim());
            inventoryDetail.setBizKey(bizKey);
            //添加inventoryDetail属性
            inventoryDetail.setLocationCode(agvWrkMast.getSourceLocNo());
            inventoryDetail.setMaterialCode(agvWrkDetl.getMatnr());
            inventoryDetail.setQcStatus(1);
            inventoryDetail.setStorageStatus(1);
            inventoryDetails.add(inventoryDetail);
            //添加销售订单号
            MesOrderReportParam.RecordCustomFieldBaseCO.CustomField customField = new MesOrderReportParam.RecordCustomFieldBaseCO.CustomField("workOrderCode__c",agvWrkDetl.getThreeCode().trim());
            customFields.add(customField);
        }
        doHttpRequest(param,getMesTokenInfo(),"上报mes调拨信息",url,orderReportPath,null,"127.0.0.1");
    }
    //获取mes token信息
    private Map<String,Object> getMesTokenInfo(){
        Map<String,String> param = new HashMap<>();
        param.put("appKey",appKey);
        param.put("appSecret",appSecret);
        JSONObject jsonObject = doHttpRequest(param,null, "获取MesToken", getTokenUrl, getTokenPath, null, "127.0.0.1");
        Map<String,Object> headParam = new HashMap<>();
        headParam.put("X-AUTH",JSON.parseObject(jsonObject.get("data").toString()).get("appAccessToken").toString());
        return headParam;
    }
    //根据楼层默认出库仓位
    private String getTargetLocationByFloor(String f){
        int floor = Integer.parseInt(f);
        if(floor == 1){
            return "WH-000";
        }
        if(floor == 2){
            return "WH-000";
        }
        if(floor == 3){
            return "WH-000";
        }
        return null;
    }
    private JSONObject doHttpRequest(Object requestParam,Map<String,Object> headParam, String namespace, String url, String path, String appkey, String ip){
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(path)
                    .setHeaders(headParam)
                    .setJson(JSONObject.toJSONString(requestParam))
                    .setHttps(true)
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(Cools.isEmpty(jsonObject.get("code")) || Integer.parseInt(jsonObject.get("code").toString()) != 200){
                throw new CoolException(jsonObject.get("dsc").toString());
            }
            success = true;
            return jsonObject;
//            String succeed = jsonObject.get("succeed").toString();
//
//            int code = Cools.eq("0",succeed) ? 0 : 1;
//            if(code != 200){
//                throw new CoolException(jsonObject.get("dsc").toString());
//            }
//            success = true;
        }catch (Exception e){
            log.error(e.getMessage());
            throw new CoolException(e.getMessage());
        }finally {
            apiLogService.save(
                    namespace,
                    url + path,
                    appkey,
                    ip,
                    JSON.toJSONString(JSONObject.toJSONString(requestParam)),
                    response,
                    success
            );
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -199,6 +199,7 @@
        }
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMast.setLogErrMemo("start2-doAutoMove2");
        agvWrkMastService.updateById(agvWrkMast);
        //更新目标库位状态
        updateAgvLocMast(locMast,"S");
@@ -310,6 +311,7 @@
        updateAgvBasDevp(devpNo,"S",agvLocMast.getLocType2(),agvLocMast.getBarcode());
        return SUCCESS;
    }
    public ReturnT<String> autoEmptyBack3(AgvWrkMast agvWrkMast) {
        Date now = new Date();
        AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo());
@@ -332,6 +334,7 @@
        updateAgvBasDevp(agvBasDevp,"R");
        return SUCCESS;
    }
    public ReturnT<String> autoEmptyBack2(AgvLocMast agvLocMast) {
        Date now = new Date();
        //查询工作档
src/main/java/com/zy/common/model/DetlDto.java
@@ -30,6 +30,8 @@
    //销售订单行号
    private String isoseq;
    private String cFree1;
    // 库位类型: 1、代包装成品,2、原材料,3、箱壳
    private Integer locType;
src/main/resources/application.yml
@@ -90,9 +90,16 @@
ERP:
  url: http://39.184.149.30:8877
  orderReportPath: /DBMS/U8/CM/add
MES:
  url: http://192.168.1.55:8010
  orderReportPath: /api/RdAudit
mes:
  url: https://v3-ali.blacklake.cn/api/openapi/domain/web/v1/route
  orderReportPath: /inventory/open/v2/transfer_order/ordinary/_execute
  pakinReportPath: /inventory/open/v2/inbound_order/execute/_inbound
  buyPakinReportPath: /schedule-for-yinzuo/open/yinzuo/inboundOrder
  pakoutReportPath: /inventory/open/v2/outbound_order/_outbound_by_suggest
  getTokenUrl: https://v3-ali.blacklake.cn
  getTokenPath: /api/openapi/domain/api/v1/access_token/_get_access_token
  appKey: cli_1712644281065780
  appSecret: 6710d24e31e64adc963d4c213b2c9b8e
agvBasDev:
  maxWorkNum: 1
src/main/webapp/static/js/agvLocMast/locMast.js
@@ -23,7 +23,6 @@
            ,{field: 'locNo', align: 'center',title: '库位号',sort:true}
            ,{field: 'locSts$', align: 'center',title: '库位状态',width:200}
            // ,{field: 'whsType$', align: 'center',title: '库位类型'}
            // ,{field: 'pltType', align: 'center',title: ''}
            // ,{field: 'ctnType', align: 'center',title: ''}
            // ,{field: 'locSts', align: 'center',title: ''}
            // ,{field: 'sheetNo', align: 'center',title: ''}
@@ -35,6 +34,7 @@
            ,{field: 'floor', align: 'center',title: '楼', sort:true}
            ,{field: 'barcode', align: 'center',title: '货架码', sort:true}
            ,{field: 'locType2', align: 'center',title: '货架类型', sort:true}
            ,{field: 'pltType', align: 'center',title: '仓位编码'}
            ,{field: 'fullPlt', align: 'center',title: '满板', templet:function(row){
                    var html = "<input value='fullPlt' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' disabled table-index='"+row.LAY_TABLE_INDEX+"'";
                    if(row.fullPlt === 'Y'){html += " checked ";}
src/main/webapp/static/js/order/order.js
@@ -62,7 +62,6 @@
            {field: 'tel', align: 'center',title: '仓库', hide: true},
            {field: 'operMemb', align: 'center',title: '出入库类别', hide: true},
            {field: 'salesman', align: 'center',title: '部门', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate', width: 180}
        ]],
        request: {
@@ -166,7 +165,9 @@
                            //{field: 'manu', title: '行号'},
                            {field: 'threeCode', title: '销售单号'},
                            {field: 'deadTime', title: '自由项'},
                            {field: 'processSts$', title: '工序'}
                            {field: 'processSts$', title: '工序'},
                            {field: 'specs', title: '规格'},
                            //{field: 'itemNum', title: '行唯一标识'}
                        ]],
                        request: {
                            pageName: 'curr',
@@ -192,7 +193,6 @@
            });
        }
    });
    // 显示表单弹窗
    function showEditModel(expTpe) {
@@ -306,7 +306,6 @@
                    },
                    size: ''
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/order/detl/all/auth?orderId=" + expTpe.id,
src/main/webapp/views/order/order.html
@@ -311,7 +311,7 @@
<script type="text/javascript" src="../../static/js/echarts/echarts.min.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/order/order.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/order/order.js?v=1" charset="utf-8"></script>
<script type="text/template" id="docTypeTpl">
    <option value="">选择类型</option>