自动化立体仓库 - WMS系统
zhangchao
2024-10-23 2b3519929a06019633e04ee9abb0c6ef8bba358f
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();
@@ -78,11 +128,6 @@
                agvWrkMastLogService.save(agvWrkMast);
                //生成AGV工作明细历史档
                agvWrkDetlLogService.save(wrkNo);
            } else {
                if (!agvWrkMast.getSourceLocNo().substring(0,2).equals("DB")) {
                    agvWrkMast.setSourceLocNo("");
                }
                agvWrkMastService.updateById(agvWrkMast);
            }
            switch (agvWrkMast.getIoType()){
@@ -235,29 +280,50 @@
                //删除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)){
                //检查订单是否已完成
                orderService.checkComplete(orderNo);
                orderService.checkComplete(orderNo,agvWrkMast.getLocNo());
            }else{
                List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
                maps.forEach(map -> {
                    String o = map.get("orderNo").toString();
                    orderService.checkComplete(o);
                    orderService.checkComplete(o,agvWrkMast.getLocNo());
                });
            }
            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;
        //TODO
        //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);
@@ -298,7 +364,6 @@
                    wrkMast.setModiUser(9527L);
                    wrkMast.setModiTime(now);
                    wrkMast.setLogErrMemo("completedCarryWrk");
                    if (!agvWrkMastService.insertByIncrease(wrkMast)) {
                        throw new CoolException("保存工作档失败");
                    }
@@ -327,23 +392,33 @@
            agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
            if(!isJSON(orderNo)){
                //检查订单是否已完成
                orderService.checkComplete(orderNo);
                orderService.checkComplete(orderNo,agvWrkMast.getLocNo());
            }else{
                List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
                maps.forEach(map -> {
                    String o = map.get("orderNo").toString();
                    orderService.checkComplete(o);
                    orderService.checkComplete(o,agvWrkMast.getLocNo());
                });
            }
            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,19 +449,26 @@
            agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
            if(!isJSON(orderNo)){
                //检查订单是否已完成
                orderService.checkComplete(orderNo);
                orderService.checkComplete(orderNo,agvWrkMast.getLocNo());
            }else{
                List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
                maps.forEach(map -> {
                    String o = map.get("orderNo").toString();
                    orderService.checkComplete(o);
                    orderService.checkComplete(o,agvWrkMast.getLocNo());
                });
            }
            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
@@ -557,4 +639,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
            );
        }
    }
}