自动化立体仓库 - WMS系统
zyx
2023-07-26 20e8b29ab26083c26b755d4c1087af2116d22262
agv 根据调试完善MES相关接口功能
8个文件已修改
332 ■■■■ 已修改文件
src/main/java/com/zy/asrs/task/MesMatSyncScheduler.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesMatSyncHandler.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesPakinHandler.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesPakoutHandler.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/MesSyncUtil.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/HttpHandler.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/MesMatSyncScheduler.java
@@ -19,7 +19,8 @@
    @Autowired
    MesMatSyncHandler handler;
    //@Scheduled(cron = "0/30 * * * * ?")
    @Scheduled(cron = "0/30 * * * * ?")
    //@Scheduled(cron = "0 0/2 * * * ?")
    private void execute() {
        ReturnT<String> result = null;
src/main/java/com/zy/asrs/task/handler/MesMatSyncHandler.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.MaterialInfo;
import com.zy.asrs.service.ApiLogService;
@@ -18,14 +19,17 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MesMatSyncHandler extends AbstractHandler<String> {
    @Value("${mes.mat-sync.url}")
    private String url;
    @Value("${mes.mat-sync.uri}")
    private String uri;
    @Value("${mes.mat-sync.path}")
    private String path;
@@ -39,8 +43,8 @@
    @Transactional
    public ReturnT<String> start() throws IOException {
        boolean success = true;
        log.info("url:" + url + path);
        JSONObject jsonObject = doGetJsonData();
        JSONObject jsonObject = doPostJsonData();
        log.info("MesMatSync jsonObject: " + jsonObject.toJSONString());
        int code = jsonObject.getInteger("code");
@@ -61,7 +65,7 @@
    private void saveApiLog(String response, boolean success) {
        apiLogService.save(
                "商品信息同步",
                url + path,
                uri + path,
                null,
                "127.0.0.1",
                null,
@@ -71,16 +75,24 @@
    }
    /*
    发起一个doGet请求
    发起一个请求来获取商品信息
     */
    private JSONObject doGetJsonData() throws IOException {
    private JSONObject doPostJsonData() throws IOException {
        Map<String, Object> requestParamMap = MesSyncUtil.getRequestParamMap();
        Mat mat = matService.selectOne(new EntityWrapper<Mat>().orderBy("update_time", false));
        //如果WMS中有mat信息,则获取最新的mat修改时间,然后获取该时间之后所有更新过的隔膜卷信息。如果没有mat信息,则获取所有隔膜卷信息
        if(!Cools.isEmpty(mat)){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            requestParamMap.put("time",sdf.format(mat.getUpdateTime()));
        }
        return JSON.parseObject( new HttpHandler.Builder()
                .setUri(url)
                .setUri(uri)
                .setPath(path)
                .setParams(MesSyncUtil.getRequestParamMap())
                .setParams(requestParamMap)
                .build()
                .doGet());
                .doPostWithParam());
    }
    /*
@@ -112,7 +124,7 @@
        //
        m.setCreateTime((data.getMdate()));
        //修改时间 -- 更新时间
        m.setUpdateTime(data.getMdate());
        m.setUpdateTime(new Date());
        //商品编码 -- 物料编码
        m.setMatnr(data.getItemCode());
        //商品名称 -- 物料名称
src/main/java/com/zy/asrs/task/handler/MesPakinHandler.java
@@ -27,12 +27,13 @@
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MesPakinHandler extends AbstractHandler<String> {
    @Value("${mes.pakin.url}")
    private String url;
    @Value("${mes.pakin.uri}")
    private String uri;
    @Value("${mes.pakin.path}")
    private String path;
@@ -55,10 +56,10 @@
    @Transactional
    public ReturnT<String> start() {
        boolean success = true;
        log.info("url:" + url + path);
        log.info("url:" + uri + path);
        JSONObject jsonObject = null;
        try {
            jsonObject = doGetJsonData();
            jsonObject = doPostJsonData();
        } catch (IOException e) {
            success = false;
            e.printStackTrace();
@@ -86,7 +87,7 @@
    private void saveApiLog(String response, boolean success){
        apiLogService.save(
                "生成入库单据",
                url + path,
                uri + path,
                null,
                "127.0.0.1",
                null,
@@ -96,15 +97,20 @@
    }
    /*
    发起一个doGet请求
    发起一个请求来获取未获取过的单据信息
     */
    private JSONObject doGetJsonData() throws IOException {
    private JSONObject doPostJsonData() throws IOException {
        Map<String, Object> requestParamMap = MesSyncUtil.getRequestParamMap();
        //获取未获取过的所有单据
        requestParamMap.put("type",0);
        return JSON.parseObject( new HttpHandler.Builder()
                .setUri(url)
                .setUri(uri)
                .setPath(path)
                .setParams(MesSyncUtil.getRequestParamMap())
                .setParams(requestParamMap)
                .build()
                .doGet());
                .doPostWithParam());
    }
    /*
@@ -164,8 +170,8 @@
        o.setOrderTime(jsonData.getString("orderTime"));
        //单据类型
        DocType docType = docTypeService.selectOrAdd(jsonData.getString("orderType"), Boolean.TRUE);
        //入库库房名称(立体库名称)
        jsonData.getString("storage");
        //物流名称 -- 入库库房名称(立体库名称)
        o.setShipName(jsonData.getString("storage"));
        o.setDocType(docType.getDocId());
        o.setCreateTime(new Date());
        o.setUpdateTime(new Date());
src/main/java/com/zy/asrs/task/handler/MesPakoutHandler.java
@@ -1,37 +1,215 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DiaphragmInfo;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.MesSyncUtil;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MesPakoutHandler extends AbstractHandler<String> {
    @Value("${mes.pakin.url}")
    private String url;
    @Value("${mes.pakout.uri}")
    private String uri;
    @Value("${mes.pakin.path}")
    @Value("${mes.pakout.path}")
    private String path;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private OrderDetlService orderDetlService;
    public ReturnT<String> start() throws IOException {
    @Transactional
    public ReturnT<String> start() {
        boolean success = true;
        log.info("url:" + uri + path);
        JSONObject jsonObject = null;
        try {
            jsonObject = doPostJsonData();
        } catch (IOException e) {
            success = false;
            e.printStackTrace();
        }
        int code = jsonObject.getInteger("code");
        if(code == 200){
            JSONObject jsonData = jsonObject.getJSONObject("data");
            String orderNo = jsonData.getString("orderNo");
            Order o = insertOrder(jsonData,orderNo);
            insertOrUpdateOrderDetl(jsonData, o);
        }else {
            success = false;
            log.error("请求mes接口响应错误,响应码为: " + code);
        }
        saveApiLog(jsonObject.toJSONString(),success);
        return SUCCESS;
    }
    /*
    保存日志
     */
    private void saveApiLog(String response, boolean success){
        apiLogService.save(
                "生成入库单据",
                uri + path,
                null,
                "127.0.0.1",
                null,
                response,
                success
        );
    }
    /*
    发起一个请求来获取未获取过的单据信息
     */
    private JSONObject doPostJsonData() throws IOException {
        Map<String, Object> requestParamMap = MesSyncUtil.getRequestParamMap();
        //获取未获取过的所有单据
        requestParamMap.put("type",0);
        return JSON.parseObject( new HttpHandler.Builder()
                .setUri(uri)
                .setPath(path)
                .setParams(requestParamMap)
                .build()
                .doPostWithParam());
    }
    /*
    新增order信息
     */
    private Order insertOrder(JSONObject jsonData, String orderNo){
        Order o = orderService.selectByNo(orderNo);
        if (!Cools.isEmpty(o)) {
            throw new CoolException(jsonData.getString("orderNo") + "单据已存在,请勿重复提交");
        }
        o = orderMapping(jsonData);
        if (!orderService.insert(o)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
        }
        return o;
    }
    /*
    根据orderNo、matnr、batch,新增或者更改orderDetl信息
     */
    private void insertOrUpdateOrderDetl(JSONObject jsonData, Order o){
        List<DiaphragmInfo> diaphragmInfoList =  JSONObject.parseArray(jsonData.getString("orderDetails"),DiaphragmInfo.class);
        diaphragmInfoList.forEach(d -> {
            EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
            wrapper.eq("order_no",o.getOrderNo()).eq("matnr",d.getItemCode()).eq("batch",d.getBatchNo());
            OrderDetl od = orderDetlService.selectOne(wrapper);
            if(od == null){
                od = new OrderDetl();
                od.setOrderNo(o.getOrderNo());
                od.setOrderId(o.getId());
                orderDetlMapping(d,od);
                orderDetlService.insert(od);
            }else {
                od.setQty(od.getQty() + d.getQuantity().doubleValue());
                od.setAnfme(od.getAnfme() + d.getAssQuantity().doubleValue());
                od.setUpdateTime(new Date());
                orderDetlService.updateById(od);
            }
        });
    }
    /*
    映射Order类和jsonData的字段
     */
    private Order orderMapping(JSONObject jsonData){
        Order o = new Order();
        o.setStatus(1);
        //设置订单状态 --- 初始化状态
        o.setSettle(0L);
        //uuid
        o.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        //单据编号
        o.setOrderNo(jsonData.getString("orderNo"));
        //单据时间
        o.setOrderTime(jsonData.getString("orderTime"));
        //单据类型
        DocType docType = docTypeService.selectOrAdd(jsonData.getString("orderType"), Boolean.TRUE);
        //物流名称 -- 入库库房名称(立体库名称)
        o.setShipName(jsonData.getString("storage"));
        o.setDocType(docType.getDocId());
        o.setCreateTime(new Date());
        o.setUpdateTime(new Date());
        return o;
    }
    /*
    映射OrderDetl与隔膜信息类的字段关系
     */
    private void orderDetlMapping(DiaphragmInfo d, OrderDetl od){
        //批号 -- 生产批号
        od.setBatch(d.getBatchNo());
        //商品编码 -- 物料编码
        od.setMatnr(d.getItemCode());
        //商品名称 -- 物料名称
        od.setMaktx(d.getItemName());
        //数量 -- 数量
        od.setAnfme(d.getQuantity() == null ? null : d.getQuantity().doubleValue());
        //完成数量 -- 辅数量
        od.setQty(d.getAssQuantity() == null ? null : d.getAssQuantity().doubleValue());
        //规格 -- 规格/型号
        od.setSpecs(d.getStd());
        //备注 -- 备注
        od.setMemo(d.getNote());
        //条形码 -- 条形码
        od.setQrCode(d.getBarCode());
        //颜色 -- 大卷位置
        od.setColor(d.getPosition());
        //型号 -- 小卷位置
        od.setModel(d.getPosition2());
        //品牌 -- 等级
        od.setBrand(d.getGrade());
        //收卷开始日期
        od.setStartDate(d.getStartDate());
        //收卷结束日期
        od.setEndDate(d.getEndDate());
        od.setCreateTime(new Date());
        od.setUpdateTime(new Date());
    }
}
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -45,14 +45,14 @@
    @Autowired
    private DocTypeService docTypeService;
    @Value("${mes.pakin-sync.url}")
    private String pakinUrl;
    @Value("${mes.pakin-sync.uri}")
    private String pakinUri;
    @Value("${mes.pakin-sync.path}")
    private String pakinPath;
    @Value("${mes.pakout-sync.url}")
    private String pakoutUrl;
    @Value("${mes.pakout-sync.uri}")
    private String pakoutUri;
    @Value("${mes.pakout-sync.path}")
    private String pakoutPath;
@@ -183,7 +183,7 @@
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(pakoutUrl)
                    .setUri(pakoutUri)
                    .setPath(pakoutPath)
                    .setJson(JSON.toJSONString(requestMap))
                    .build()
@@ -198,7 +198,7 @@
                // 保存接口日志
                apiLogService.save(
                        "成品库出库上报",
                        pakoutUrl + pakoutPath,
                        pakoutUri + pakoutPath,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(requestMap),
@@ -219,7 +219,7 @@
        try {
            response = new HttpHandler.Builder()
                    .setUri(pakinUrl)
                    .setUri(pakinUri)
                    .setPath(pakinPath)
                    .setJson(JSON.toJSONString(requestMap))
                    .build()
@@ -234,7 +234,7 @@
                // 保存接口日志
                apiLogService.save(
                        "成品库入库上报",
                        pakinUrl + pakinPath,
                        pakinUri + pakinPath,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(requestMap),
@@ -253,6 +253,7 @@
        requestMap.put("orderNo",order.getOrderNo());
        requestMap.put("orderTime",order.getOrderTime());
        requestMap.put("orderType",orderType);
        requestMap.put("storage",order.getShipName());
        List<DiaphragmInfo> diaphragmInfoList = orderDetls.stream().map(od -> {
            DiaphragmInfo diaphragmInfo = new DiaphragmInfo();
src/main/java/com/zy/asrs/utils/MesSyncUtil.java
@@ -1,5 +1,6 @@
package com.zy.asrs.utils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.DigestUtils;
import java.nio.charset.StandardCharsets;
@@ -9,13 +10,20 @@
public class MesSyncUtil {
    @Value("${mes.appkey}")
    private static String appkey;
    public static Map<String,Object> getRequestParamMap(){
        Date date = new Date();
        String ts = date.getTime() + "";
        String key = DigestUtils.md5DigestAsHex(("appkey" + ts).getBytes(StandardCharsets.UTF_8));
        String key = DigestUtils.md5DigestAsHex((appkey + ts).getBytes(StandardCharsets.UTF_8));
        Map<String,Object> requestParamMap = new HashMap<>();
        requestParamMap.put("ts",ts);
        requestParamMap.put("key",key);
        return requestParamMap;
    }
    public static void main(String[] args) {
        System.out.println(MesSyncUtil.getRequestParamMap());
    }
}
src/main/java/com/zy/common/utils/HttpHandler.java
@@ -56,6 +56,37 @@
    }
    /**
     * POST请求执行 并且url带参数请求
     * @return the HttpHandler response
     */
    public String doPostWithParam() throws IOException {
        Request request;
        Request.Builder headerBuilder = new Request.Builder();
        if (headers != null && headers.size()>0){
            for (Map.Entry<String, Object> entry : headers.entrySet()){
                headerBuilder.addHeader(entry.getKey(), String.valueOf(entry.getValue()));
            }
        }
        if (json == null || "".equals(json)){
            FormBody.Builder builder = new FormBody.Builder();
            FormBody body = builder.build();
            request = headerBuilder
                    .url(paramsToUrl(uri, path, params, https))
                    .post(body)
                    .build();
        } else {
            RequestBody body = RequestBody.create(MEDIA_TYPE, json);
            Request.Builder builder = headerBuilder.url((https?"https://":"http://")+uri+path);
            builder.header("Content-Type", "application/json;charset=UTF-8");
            request = builder.post(body).build();
        }
        Call call = getClient(timeout, timeUnit).newCall(request);
        Response response = call.execute();
        return response.body().string();
    }
    /**
     * POST请求执行
     * @return the HttpHandler response
     */
src/main/resources/application.yml
@@ -62,19 +62,20 @@
  limit: 5000
mes:
  appkey: SX3WMS20230725
  mat-sync:
    url: localhost:8080
    path: /test/getMat
    uri: http://fmis.huashijie.com.cn:8082
    path: /api/SX3WMS/Material
  pakin:
    url: localhost:8080
    path: /test/getOrder
    uri: http://fmis.huashijie.com.cn:8082
    path: /api/SX3WMS/StorageIn
  pakout:
    url: localhost:8080
    path: /test/getOrder
    uri: http://fmis.huashijie.com.cn:8082
    path: /api/SX3WMS/StorageInCheck
  pakin-sync:
    url: localhost:8080
    path: /test/syncOrderPakin
    uri: http://fmis.huashijie.com.cn:8082
    path: /api/SX3WMS/StorageOut
  pakout-sync:
    url: localhost:8080
    path: /test/syncOrderPakout
    uri: http://fmis.huashijie.com.cn:8082
    path: /api/SX3WMS/StorageOutCheck