自动化立体仓库 - WMS系统
zyx
2024-07-11 6298f178c71f1eb95d4066ffe88d4becd6fc6bfc
#MES上报
7个文件已修改
208 ■■■■ 已修改文件
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/entity/param/MesOrderReportParam.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 1 ●●●● 补丁 | 查看 | 原始文档 | 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/entity/param/MesOrderReportParam.java
@@ -11,14 +11,34 @@
    //备注
    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 List<InventoryDetail> inventoryDetails;
        //行备注 单据号
        private String remark;
        //接收仓位
        private String targetLocationCode;
        private List<InventoryDetail> inventoryDetails;
        @Data
        public static class InventoryDetail{
@@ -32,6 +52,8 @@
            private Integer qcStatus;
            //仓储状态
            private Integer storageStatus;
            //版本号,默认为null
            private String version;
            @Data
            public static class Amount{
@@ -41,13 +63,24 @@
                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/service/impl/OpenServiceImpl.java
@@ -936,6 +936,18 @@
            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()));
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -72,7 +72,7 @@
            try{
                autoMoveHandler.start2(agvWrkMast);
            } catch (Exception e){
                log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
                //log.error("工作号"+agvWrkMast.getWrkNo()+"调拨出库,处理失败:===》异常原因:"+e.getMessage());
            }
        }
@@ -120,7 +120,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
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.beust.jcommander.internal.Lists;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
@@ -31,16 +32,29 @@
public class AgvWrkMastHandler extends AbstractHandler<String> {
    //入库类型数组
    private static final int[] IN_TYPE_ARRAY = new int[1];
    private static final List<Integer> IN_TYPE_LIST = new ArrayList<Integer>(){{
        add(1);
    }};
    //private static final int[] IN_TYPE_ARRAY = {1};
    //出库类型数组
    private static final int[] OUT_TYPE_ARRAY = new int[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 int[] MOVE_TYPE_ARRAY = new int[1];
    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}")
@@ -82,6 +96,9 @@
    @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();
@@ -92,9 +109,6 @@
            } else {
                agvBasDevp = agvWrkMast.getSourceLocNo();
            }
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            //修改工作档状态为207.库存更新完成
            agvWrkMast.setWrkSts(207L);
@@ -253,26 +267,28 @@
            }
            //上报mes
            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
            if(!Cools.isEmpty(param)){
                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
            }
//            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
//            if(!Cools.isEmpty(param)){
//                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
//            }
            return SUCCESS;
            //return SUCCESS;
        }catch (Exception e){
            log.error(""+e.getMessage());
        }
        return FAIL;
        reportMes(agvWrkMast,agvWrkDetlListOld);
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
        try{
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
        try{
            Date now = new Date();
            int wrkNo = agvWrkMast.getWrkNo();
@@ -351,24 +367,24 @@
            }
            //上报mes
            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
            if(!Cools.isEmpty(param)){
                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
            }
//            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> completedCarryWrk2(AgvWrkMast agvWrkMast) {
        try{
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
        try{
            int wrkNo = agvWrkMast.getWrkNo();
            String orderNo = getOrderNoByWrkNo(wrkNo);
            String agvBasDevp = "";
@@ -406,15 +422,17 @@
                });
            }
            //上报mes
            MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
            if(!Cools.isEmpty(param)){
                doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
            }
            return SUCCESS;
//            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
@@ -584,23 +602,21 @@
        return wrkMast;
    }
    private Object getReportParamByIoType(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
    private void reportMes(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        if(Cools.isEmpty(agvWrkDetls)){
            return null;
            return ;
        }
        //区分不同任务类型的上报方式
        if(Arrays.asList(IN_TYPE_ARRAY).contains(agvWrkMast.getIoType())){
        if(IN_TYPE_LIST.contains(agvWrkMast.getIoType())){
            reportMesPakinOrder(agvWrkMast,agvWrkDetls);
        }
        if(Arrays.asList(OUT_TYPE_ARRAY).contains(agvWrkMast.getIoType())){
        if(OUT_TYPE_List.contains(agvWrkMast.getIoType())){
            reportMesPakoutOrder(agvWrkMast,agvWrkDetls);
        }
        if(Arrays.asList(MOVE_TYPE_ARRAY).contains(agvWrkMast.getIoType())){
            return generateMesParam(agvWrkMast,agvWrkDetls);
        if(MOVE_TYPE_List.contains(agvWrkMast.getIoType())){
            generateMesParam(agvWrkMast,agvWrkDetls);
        }
        return null;
    }
    private void reportMesPakinOrder(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
@@ -609,10 +625,10 @@
            MesPakinReportParam mesPakinReportParam = new MesPakinReportParam();
            mesPakinReportParam.setInboundOrderCode(agvWrkDetl.getOrderNo());
            mesPakinReportParam.setBizType("0");
            mesPakinReportParam.setInventoryAttr(new MesPakinReportParam.InventoryAttr(agvWrkDetl.getThreeCode(),agvWrkDetl.getMatnr(),agvWrkMast.getLocNo()));
            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,orderReportPath,null,"127.0.0.1");
            doHttpRequest(mesPakinReportParam,getMesTokenInfo(),"上报mes入库信息",url,pakinReportPath,null,"127.0.0.1");
        }
    }
@@ -624,15 +640,15 @@
            AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
            mesPakoutReportParam.setWareHouseCode(agvLocMast.getPltType().toString());
            mesPakoutReportParam.setMaterialCode(agvWrkDetl.getMatnr());
            mesPakoutReportParam.setBatchNos(Arrays.asList(agvWrkDetl.getBatch()));
            mesPakoutReportParam.setBatchNos(Arrays.asList(agvWrkDetl.getThreeCode().trim()));
            mesPakoutReportParam.setAmount(new MesPakoutReportParam.Amount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null));
            doHttpRequest(mesPakoutReportParam,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1");
            doHttpRequest(mesPakoutReportParam,getMesTokenInfo(),"上报mes出库信息",url,pakoutReportPath,null,"127.0.0.1");
        }
    }
    private MesOrderReportParam generateMesParam(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
    private void generateMesParam(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        if(agvWrkMast.getIoType() == 53){
            String locNo = agvWrkMast.getLocNo();
@@ -644,10 +660,23 @@
        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);
@@ -656,13 +685,10 @@
        for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
            MesOrderReportParam.TransferOrderItem.InventoryDetail inventoryDetail = new MesOrderReportParam.TransferOrderItem.InventoryDetail();
            //添加amount属性
            MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount amount = new MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount();
            amount.setAmount(agvWrkDetl.getAnfme());
            amount.setUnitName(agvWrkDetl.getUnit());
            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();
            bizKey.setBatchNo(agvWrkDetl.getThreeCode());
            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());
@@ -670,9 +696,13 @@
            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);
        }
        return param;
        doHttpRequest(param,getMesTokenInfo(),"上报mes调拨信息",url,orderReportPath,null,"127.0.0.1");
    }
    //获取mes token信息
@@ -681,13 +711,31 @@
        param.put("appKey",appKey);
        param.put("appSecret",appSecret);
        JSONObject jsonObject = doHttpRequest(param,null, "获取MesToken", url, getTokenPath, null, "127.0.0.1");
        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){
@@ -706,10 +754,10 @@
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(Cools.isEmpty(jsonObject.get("code")) && Integer.parseInt(jsonObject.get("code").toString()) != 200){
            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();
@@ -736,4 +784,5 @@
        }
    }
}
src/main/resources/application.yml
@@ -95,6 +95,7 @@
  orderReportPath: /inventory/open/v2/transfer_order/ordinary/_execute
  pakinReportPath: /inventory/open/v2/inbound_order/execute/_inbound
  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