自动化立体仓库 - WMS系统
dubin
1 天以前 322e78c971769c8417810ac0dc4cdad065d40d3f
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -1,19 +1,28 @@
package com.zy.asrs.task.handler;
import ch.qos.logback.core.pattern.color.MagentaCompositeConverter;
import cn.hutool.json.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.ErpReportParam;
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 com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@@ -38,6 +47,12 @@
    private WaitPakinLogService waitPakinLogService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Transactional
    public ReturnT<String> start(WrkMast wrkMast) {
@@ -59,15 +74,20 @@
            if (wrkMast.getWrkSts() == 5) {
                // 全板入库
                if (wrkMast.getIoType() == 1) {
                    // 入库完成上报ERP 按托盘上报
                    if (!reportInToErp(wrkMast)){
                        exceptionHandle("入库上报ERP失败", wrkMast.getWrkNo());
                        return FAIL;
                    }
                    // 入库通知单
                    if (!Cools.isEmpty(wrkMast.getBarcode())) {
                        // 保存入库通知档历史档
                        if (!waitPakinLogService.save(wrkMast.getBarcode())) {
                            exceptionHandle("保存入库通知档历史档[workNo={0}]失败", wrkMast.getWrkNo());
//                            exceptionHandle("保存入库通知档历史档[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                        // 删除入库通知档
                        if (!waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()))) {
                            exceptionHandle("删除入库通知档[workNo={0}]失败", wrkMast.getWrkNo());
//                            exceptionHandle("删除入库通知档[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                    }
//                    // 手动入库生成单据 【 上报三方平台 】
@@ -92,23 +112,50 @@
//                        exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo());
//                    }
//                }
                if (!reportOutToErp(wrkMast)){
                    exceptionHandle("出库上报ERP失败", wrkMast.getWrkNo());
                    return FAIL;
                }
            }
            // 保存工作主档历史档
            if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
//            if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
//                exceptionHandle("保存工作历史档[workNo={0}]失败", wrkMast.getWrkNo());
//            }
            Date now = new Date();
            WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkMast.getWrkNo()));
            WrkMastLog wrkMastLog = new WrkMastLog();
            wrkMastLog.sync(wrkMast1);
            wrkMastLog.setModiTime(now);
            wrkMastLog.setWrkSts(wrkMast1.getWrkSts().intValue());
            if (!wrkMastLogService.insert(wrkMastLog)){
                exceptionHandle("保存工作历史档[workNo={0}]失败", wrkMast.getWrkNo());
            }
            // 删除工作主档
            if (!wrkMastService.deleteById(wrkMast)) {
                exceptionHandle("删除工作主档[workNo={0}]失败", wrkMast.getWrkNo());
            }
            // 保存工作明细档历史档
            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
//                exceptionHandle("保存工作明细历史档[workNo={0}]失败", wrkMast.getWrkNo());
            }
            List<WrkDetl> wrkDetls1 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
            wrkDetls1.forEach( wrkDetl -> {
                WrkDetlLog wrkDetlLog = new WrkDetlLog();
                wrkDetlLog.sync(wrkDetl);
                wrkDetlLog.setModiTime(now);
                if (!wrkDetlLogService.insert(wrkDetlLog)){
                    exceptionHandle("保存工作明细历史档[workNo={0}]失败", wrkMast.getWrkNo());
                }
            });
//            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
////                exceptionHandle("保存工作明细历史档[workNo={0}]失败", wrkMast.getWrkNo());
//            }
            // 删除工作明细档
            if (!wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()))) {
//                exceptionHandle("删除工作明细档[workNo={0}]失败", wrkMast.getWrkNo());
                exceptionHandle("删除工作明细档[workNo={0}]失败", wrkMast.getWrkNo());
            }
        } catch (Exception e) {
            log.error("fail", e);
@@ -119,4 +166,135 @@
        return SUCCESS;
    }
    // 按托盘上报ERP
    @Transactional
    public boolean reportInToErp(WrkMast wrkMast) {
        if (Cools.isEmpty(wrkMast)){
            return false;
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
        if (Cools.isEmpty(wrkDetls)) {
            return false;
        }
        List<ErpReportParam> reportParams = new ArrayList<>();
        wrkDetls.forEach(wrkDetl -> {
            WaitPakin waitPakin = waitPakinService.selectOne(new EntityWrapper<WaitPakin>()
                    .eq("zpallet", wrkMast.getBarcode())
                    .eq("matnr", wrkDetl.getMatnr()));
            if (Cools.isEmpty(waitPakin)) {
                throw new CoolException("托盘码" + wrkMast.getBarcode() + "的组托数据" + wrkDetl.getMatnr() + "已不存在");
            }
            ErpReportParam erpReportParam = new ErpReportParam();
            erpReportParam.setBatch(waitPakin.getBatch()); // 批次
            erpReportParam.setQty(waitPakin.getAnfme().toString()); // 本次入/出数量
            erpReportParam.setLineId(""); // 行内码
            erpReportParam.setPlanNo(""); // 计划跟踪号
            erpReportParam.setOrderNo(waitPakin.getOrderNo()); // 订单编码
            erpReportParam.setWareHouseId(""); // 仓库编码
            erpReportParam.setLocId(wrkMast.getLocNo()); // 库位编码
            erpReportParam.setMatNr(waitPakin.getMatnr()); // 物料编码
            erpReportParam.setPalletId(waitPakin.getZpallet()); // 托盘号
            reportParams.add(erpReportParam);
        });
        R result = report(reportParams);
        if (result.get("code").equals("200")){
            return true;
        }
        return false;
    }
    // 按托盘上报ERP
    public boolean reportOutToErp(WrkMast wrkMast) {
        if (Cools.isEmpty(wrkMast)){
            return false;
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq(
                "wrk_no", wrkMast.getWrkNo()));
        if (Cools.isEmpty(wrkDetls)) {
            return false;
        }
        List<ErpReportParam> reportParams = new ArrayList<>();
        for (WrkDetl wrkDetl : wrkDetls) {
            // 工作档明细没有订单号 手动出库 不上报
            if (Cools.isEmpty(wrkDetl.getOrderNo())){
                return true;
            }
            ErpReportParam erpReportParam = new ErpReportParam();
            erpReportParam.setOrderNo(wrkDetl.getOrderNo());
            erpReportParam.setPlanNo("");
            erpReportParam.setLineId("");
            erpReportParam.setWareHouseId("");
            erpReportParam.setLocId(wrkMast.getSourceLocNo());
            erpReportParam.setMatNr(wrkDetl.getMatnr());
            erpReportParam.setQty(wrkDetl.getAnfme().toString());
            erpReportParam.setPalletId(wrkDetl.getZpallet());
            erpReportParam.setBatch(wrkDetl.getBatch());
            reportParams.add(erpReportParam);
        }
        R report = report(reportParams);
        if (report.get("code").equals("200")){
            return true;
        }
        return false;
    }
    // 调用ERP接口上报
    @Transactional
    public R report(List<ErpReportParam> reportParams) {
        Config url = configService.selectOne(new EntityWrapper<Config>()
                .eq("code", "erpurl"));
        if (Cools.isEmpty(url)) {
            throw new CoolException("配置参数异常,ERP地址异常");
        }
        Config path = configService.selectOne(new EntityWrapper<Config>()
                .eq("code", "erpreport"));
        if (Cools.isEmpty(path)) {
            throw new CoolException("配置参数异常,ERP上报路径异常");
        }
        log.info("WMS--->ERP上报参数:" + JSONObject.toJSONString(reportParams));
        if (Cools.isEmpty(reportParams)) {
            return R.error("参数为空");
        }
        String response = null;
        boolean flag = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url.getValue())
                    .setPath(path.getValue())
                    .setJson(JSONObject.toJSONString(reportParams))
                    .build()
                    .doPost();
            if (Cools.isEmpty(response)){
                return R.error("ERP接口无响应");
            }
            JSONObject jsonObject = JSONObject.parseObject(response);
            Integer code = jsonObject.getInteger("code");
            if (!Cools.isEmpty(jsonObject) && code == 200) {
                flag = true;
                return R.ok("WMS--->ERP上报成功");
            }else {
                String msg = jsonObject.getString("msg");
                return R.error(Cools.isEmpty(msg) ? "WMS--->ERP上报失败!!!" : msg);
            }
        }catch (Exception e) {
            log.error(e.getMessage(), e);
            return R.error(e.getMessage());
        }finally {
            // 保存日志
            apiLogService.save(
                    "WMS--->ERP入/出库结果上报",
                    url.getValue() + path.getValue(),
                    null,
                    url.getValue(),
                    JSONObject.toJSONString(reportParams),
                    response,
                    flag
            );
        }
    }
}