自动化立体仓库 - WMS系统
#
zwl
2023-10-07 ffe47d904591be8cae513a75ac899dbf720a6e71
src/main/java/com/zy/asrs/task/handler/MesPakoutHandler.java
@@ -1,37 +1,223 @@
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.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.url}")
    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){
            if(!Cools.isEmpty(jsonObject.getString("data")) && jsonObject.getString("data").length()>2){
                JSONArray jsonArray = jsonObject.getJSONArray("data");
                List<JSONObject> jsonDataList = jsonArray.toJavaList(JSONObject.class);
                jsonDataList.forEach(data -> {
                    String orderNo = data.getString("orderNo");
                    Order o = insertOrder(data,orderNo);
                    insertOrUpdateOrderDetl(data, 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());
    }
}