自动化立体仓库 - WMS系统
zyx
2024-07-04 13c2be4774f4afbb34fa70be97c96802f07b15ff
#MES接口
7个文件已修改
2个文件已添加
309 ■■■■■ 已修改文件
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/MesOrderReportParam.java 53 ●●●●● 补丁 | 查看 | 原始文档 | 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/OpenServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocMast/locMast.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -308,7 +308,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);
@@ -317,6 +317,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/MesOrderReportParam.java
New file
@@ -0,0 +1,53 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class MesOrderReportParam {
    //编码
    private String code;
    //备注
    private String remark;
    private List<TransferOrderItem> transferOrderItems;
    @Data
    public static class TransferOrderItem{
        private List<InventoryDetail> inventoryDetails;
        //行备注 单据号
        private String remark;
        //接收仓位
        private String targetLocationCode;
        @Data
        public static class InventoryDetail{
            private Amount amount;
            private BizKey bizKey;
            //发出仓位
            private String locationCode;
            //物料编码
            private String materialCode;
            //质量状态
            private Integer qcStatus;
            //仓储状态
            private Integer storageStatus;
            @Data
            public static class Amount{
                //数量
                private Double amount;
                //单位编码
                private String unitCode;
                //单位名称 二选一
                private String unitName;
            }
            @Data
            public static class BizKey{
                //批次
                private String batchNo;
            }
        }
    }
}
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/OpenServiceImpl.java
@@ -15,8 +15,11 @@
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocDetlDto;
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 +62,10 @@
    private WrkDetlService wrkDetlService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private AgvLocMastService agvLocMastService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Override
    @Transactional
@@ -918,6 +925,37 @@
        return true;
    }
    @Override
    @Transactional
    @Synchronized
    public boolean checkAndAdjustLocDetl(CheckParam params) {
        //判断库位是否存在
        AgvLocMast agvLocMast = agvLocMastService.selectById(params.getLocNo());
        if(Cools.isEmpty(agvLocMast)){
            throw new CoolException("库位号不存在");
        }
        //删除旧库存
        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
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -1,14 +1,17 @@
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.MesOrderReportParam;
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,9 +20,7 @@
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
@@ -28,6 +29,17 @@
    @Value("${agvBasDev.maxWorkNum}")
    private int maxWrokNum;
    @Value("${mes.url}")
    private String url;
    @Value("${mes.orderReportPath}")
    private String orderReportPath;
    @Value("${mes.getTokenPath}")
    private String getTokenPath;
    @Value("${mes.appKey}")
    private String appKey;
    @Value("${mes.appSecret}")
    private String appSecret;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
@@ -51,6 +63,8 @@
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private AgvWorkService agvWorkService;
    @Autowired
    private ApiLogService apiLogService;
    @Transactional
    public ReturnT<String> completedPutWayWrk(AgvWrkMast agvWrkMast) {
@@ -65,6 +79,8 @@
                agvBasDevp = agvWrkMast.getSourceLocNo();
            }
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            //修改工作档状态为207.库存更新完成
            agvWrkMast.setWrkSts(207L);
@@ -222,6 +238,12 @@
                });
            }
            //上报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());
@@ -232,7 +254,12 @@
    @Transactional
    public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
        try{
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            Date now = new Date();
            int wrkNo = agvWrkMast.getWrkNo();
            String orderNo = getOrderNoByWrkNo(wrkNo);
@@ -308,6 +335,13 @@
                    orderService.checkComplete(o);
                });
            }
            //上报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());
@@ -318,6 +352,9 @@
    @Transactional
    public ReturnT<String> completedCarryWrk2(AgvWrkMast agvWrkMast) {
        try{
            //用于上报mes的工作档明细
            List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            int wrkNo = agvWrkMast.getWrkNo();
            String orderNo = getOrderNoByWrkNo(wrkNo);
            String agvBasDevp = "";
@@ -353,6 +390,11 @@
                    String o = map.get("orderNo").toString();
                    orderService.checkComplete(o);
                });
            }
            //上报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){
@@ -527,4 +569,113 @@
        return wrkMast;
    }
    private MesOrderReportParam generateMesParam(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
        if(Cools.isEmpty(agvWrkDetls)){
            return null;
        }
        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<>();
        //添加transferOrderItem属性
        MesOrderReportParam.TransferOrderItem transferOrderItem = new MesOrderReportParam.TransferOrderItem();
        transferOrderItem.setRemark(agvWrkDetls.get(0).getOrderNo());
        transferOrderItem.setTargetLocationCode(agvWrkMast.getLocNo());
        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();
            amount.setAmount(agvWrkDetl.getAnfme());
            amount.setUnitName(agvWrkDetl.getUnit());
            inventoryDetail.setAmount(amount);
            //添加bizKey属性
            MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey bizKey = new MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey();
            bizKey.setBatchNo(agvWrkDetl.getThreeCode());
            inventoryDetail.setBizKey(bizKey);
            //添加inventoryDetail属性
            inventoryDetail.setLocationCode(agvWrkMast.getSourceLocNo());
            inventoryDetail.setMaterialCode(agvWrkDetl.getMatnr());
            inventoryDetail.setQcStatus(1);
            inventoryDetail.setStorageStatus(1);
            inventoryDetails.add(inventoryDetail);
        }
        return param;
    }
    //获取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", url, 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 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());
            }
            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/resources/application.yml
@@ -90,9 +90,12 @@
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
  orderReportPath: /api/openapi/domain/web/v1/route/inventory/open/v2/transfer_order/ordinary/_execute
  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 ";}