自动化立体仓库 - WMS系统
pang.jiabao
2025-11-12 96f92ed5f6c0e3ac57214828e09b5aa4fa33270a
erp对接接口开发
9个文件已修改
1个文件已添加
259 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ErpReportDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderPakinParam.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakinSyncHandler.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakoutSyncHandler.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -73,12 +73,12 @@
    }
    @PostMapping("/order/matSync/default/v1")
//    @AppAuth(memo = "商品信息同步接口")
    @AppAuth(memo = "物料信息同步")
    public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey,
                                      @RequestBody(required = false) MatSyncParam param,
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
        if (Cools.isEmpty(param,param.getMatDetails())) {
            return R.parse(BaseRes.PARAM);
        }
        openService.syncMat(param);
@@ -106,6 +106,7 @@
     * 添加入库单
     */
    @PostMapping("/order/pakin/default/v1")
    @AppAuth(memo = "入库单据下发")
    public synchronized R pakinOrderCreate(@RequestHeader(required = false) String appkey,
                                           @RequestBody OpenOrderPakinParam param,
                                           HttpServletRequest request) {
@@ -120,6 +121,9 @@
            return R.error("单据类型[orderType]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        if (!param.getOptType().equals("delete") && Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.pakinOrderCreate(param);
@@ -141,7 +145,7 @@
     * 添加出库单
     */
    @PostMapping("/order/pakout/default/v1")
    @AppAuth(memo = "添加订单出库")
    @AppAuth(memo = "出库单据下发")
    public synchronized R pakoutOrderCreate(@RequestHeader(required = false) String appkey,
                                            @RequestBody OpenOrderPakoutParam param,
                                            HttpServletRequest request) {
@@ -158,6 +162,9 @@
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        if (!param.getOptType().equals("delete") && Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.pakoutOrderCreate(param);
        return R.ok();
    }
src/main/java/com/zy/asrs/entity/ErpReportDto.java
New file
@@ -0,0 +1,28 @@
package com.zy.asrs.entity;
import com.zy.common.model.DetlDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
 * @author pang.jiabao
 * @description 单据完成上报参数
 * @createDate 2025/11/12 10:55
 */
@Data
public class ErpReportDto {
    private String orderNo;
    private List<DetlDto> orderDetails;
    @Data
    @AllArgsConstructor
    public static class DetlDto {
        private String matnr;
        private Double anfme;
    }
}
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java
@@ -20,6 +20,13 @@
    @Data
    public static class MatParam {
        /**
         * 操作类型
         * add.新增,delete.删除,update.修改
         */
        private String optType;
        /**
         * 商品编号
         */
src/main/java/com/zy/asrs/entity/param/OpenOrderPakinParam.java
@@ -15,6 +15,9 @@
    private String orderType;
    // 操作类型 add.新增,delete.删除
    private String optType;
    private String orderTime;
    private List<DetlDto> orderDetails;
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java
@@ -17,6 +17,9 @@
    private String orderTime;
    // 操作类型 add.新增,delete.删除
    private String optType;
    private List<DetlDto> orderDetails;
    private String lgort;
src/main/java/com/zy/asrs/service/OpenService.java
@@ -19,7 +19,7 @@
    List<OpenOrderCompeteResult> pakinOrderComplete(OpenOrderCompleteParam param);
    /**
     * 添加入库单
     * 添加出库单
     */
    void pakoutOrderCreate(OpenOrderPakoutParam param);
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -56,11 +56,15 @@
    @Override
    @Transactional
    public void pakinOrderCreate(OpenOrderPakinParam param) {
        String orderNo = param.getOrderNo();
        String orderType = param.getOrderType();
        String optType = param.getOptType();
        OrderPakin order = orderPakinService.selectByNo(param.getOrderNo());
        if (optType.equals("add")) {
        if (!Cools.isEmpty(order)) {
            throw new CoolException(param.getOrderNo() + "单据已存在,请勿重复提交");
        }
        DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.TRUE);
            DocType docType = docTypeService.selectOrAdd(orderType, Boolean.TRUE);
        Date now = new Date();
        // 单据主档
        order = new OrderPakin(
@@ -93,9 +97,9 @@
                null,    // 物流单号
                1L,    // 订单状态
                1,    // 状态
                9527L,    // 添加人员
                    null,    // 添加人员
                now,    // 添加时间
                9527L,    // 修改人员
                    null,    // 修改人员
                now,    // 修改时间
                null  // 备注
        );
@@ -131,9 +135,9 @@
            orderDetl.setStandby3(detlDto.getStandby3());
            orderDetl.setOrderId(order.getId());
            orderDetl.setOrderNo(order.getOrderNo());
            orderDetl.setCreateBy(9527L);
                orderDetl.setCreateBy(null);
            orderDetl.setCreateTime(now);
            orderDetl.setUpdateBy(9527L);
                orderDetl.setUpdateBy(null);
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
@@ -141,6 +145,24 @@
            if (!orderDetlPakinService.insert(orderDetl)) {
                throw new CoolException("生成单据明细失败,请联系管理员");
            }
            }
        } else if (optType.equals("delete")) {
            if (Cools.isEmpty(order)) {
                throw new CoolException(orderNo + "单据不存在!");
            }
            // 订单状态
            Long settle = order.getSettle();
            if (settle == 1) {
                // 删除订单明细
                orderDetlPakinService.delete(new EntityWrapper<OrderDetlPakin>().eq("order_id", order.getId()));
                // 删除订单主表
                orderPakinService.delete(new EntityWrapper<OrderPakin>().eq("id", order.getId()));
            } else {
                throw new CoolException(orderNo + ":订单已处理,无法取消");
            }
        } else {
            throw new CoolException(orderNo + ",操作类型不存在:" + optType);
        }
    }
@@ -204,15 +226,19 @@
    @Override
    @Transactional
    public void pakoutOrderCreate(OpenOrderPakoutParam param) {
        String orderNo = param.getOrderNo();
        String optType = param.getOptType();
        String orderType = param.getOrderType();
        OrderPakout order = orderPakoutService.selectByNo(param.getOrderNo());
        // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据
        if (optType.equals("add")) {
        if (!Cools.isEmpty(order)) {
            if (order.getSettle() > 1L) {
                throw new CoolException(param.getOrderNo() + "正在出库,无法修改单据");
                    throw new CoolException(param.getOrderNo() + "订单已存在");
            }
            orderPakoutService.remove(order.getId());
        }
        DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE);
            DocType docType = docTypeService.selectOrAdd(orderType, Boolean.FALSE);
        Date now = new Date();
        // 单据主档
        order = new OrderPakout(
@@ -245,9 +271,9 @@
                null,    // 物流单号
                1L,    // 订单状态
                1,    // 状态
                9527L,    // 添加人员
                    null,    // 添加人员
                now,    // 添加时间
                9527L,    // 修改人员
                    null,    // 修改人员
                now,    // 修改时间
                null    // 备注
        );
@@ -285,9 +311,9 @@
            orderDetl.setStandby3(detlDto.getStandby3());
            orderDetl.setOrderId(order.getId());
            orderDetl.setOrderNo(order.getOrderNo());
            orderDetl.setCreateBy(9527L);
                orderDetl.setCreateBy(null);
            orderDetl.setCreateTime(now);
            orderDetl.setUpdateBy(9527L);
                orderDetl.setUpdateBy(null);
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
@@ -295,6 +321,23 @@
            if (!orderDetlPakoutService.insert(orderDetl)) {
                throw new CoolException("生成单据明细失败,请联系管理员");
            }
            }
        } else if (optType.equals("delete")) {
            if (Cools.isEmpty(order)) {
                throw new CoolException(orderNo + "单据不存在!");
            }
            // 订单状态
            Long settle = order.getSettle();
            if (settle == 1) {
                // 删除订单明细
                orderDetlPakoutService.delete(new EntityWrapper<OrderDetlPakout>().eq("order_id", order.getId()));
                // 删除订单主表
                orderPakoutService.delete(new EntityWrapper<OrderPakout>().eq("id", order.getId()));
            } else {
                throw new CoolException(orderNo + ":订单已处理,无法取消");
            }
        } else {
            throw new CoolException(orderNo + ",操作类型不存在:" + optType);
        }
    }
@@ -473,31 +516,31 @@
    @Override
    @Transactional
    public void syncMat(MatSyncParam param) {
        if (Cools.isEmpty(param.getMatDetails()) || param.getMatDetails().size() <= 0) {
            throw new CoolException("商品数据为空");
        }
        for (MatSyncParam.MatParam matParam : param.getMatDetails()) {
            if (Cools.isEmpty(matParam.getMatnr())) {
                throw new CoolException("商品编码不能为空");
            }
            Date now = new Date();
        for (MatSyncParam.MatParam matParam : param.getMatDetails()) {
            String logInfo = "optType:" + matParam.getOptType() + ",matnr:" + matParam.getMatnr() + ",maktx:" + matParam.getMaktx() + ",specs:" + matParam.getSpecs();
            if (Cools.isEmpty(matParam.getOptType(), matParam.getMatnr(), matParam.getMaktx())) {
                throw new CoolException("商品信息不能为空[" + logInfo + "]");
            }
            Mat mat = matService.selectByMatnr(matParam.getMatnr());
            if (mat == null) {
            switch (matParam.getOptType()) {
                case "add":
                    if (mat != null) {
                        throw new CoolException("商品信息已经存在[" + logInfo + "]");
                    }
                mat = new Mat();
                // 分类
                Long tagId;
                // 一级分类
                if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) {
                    Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2);
                    if (!Cools.isEmpty(matParam.getGroupName())) {
                        Tag priTag = tagService.selectByName(matParam.getGroupName(), 2);
                    if (priTag == null) {
                        Tag top = tagService.getTop();
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(top.getId());
                        priTag = new Tag(
                                null,    // 编号
                                matParam.getGroupCode(),    // 名称
                                    matParam.getGroupName(),    // 名称
                                top.getId(),    // 父级
                                top.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
@@ -520,64 +563,46 @@
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                    }
                    // 二级分类
                    Tag secTag = tagService.selectByName(matParam.getGroupName(), 3);
                    if (secTag == null) {
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(priTag.getId());
                        secTag = new Tag(
                                null,    // 编号
                                matParam.getGroupName(),    // 名称
                                priTag.getId(),    // 父级
                                priTag.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
                                nodeUtils.pathName.toString(),    // 关联路径名
                                0,    // 类型
                                null,    // 负责人
                                null,    // 图片
                                null,    // 简要描述
                                null,    // 数量
                                3,    // 等级
                                null,    // 排序
                                1,    // 状态
                                now,    // 添加时间
                                null,    // 添加人员
                                now,    // 修改时间
                                null,    // 修改人员
                                null    // 备注
                        );
                        if (tagMapper.insert(secTag) == 0) {
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                    }
                    tagId = secTag.getId();
                        tagId = priTag.getId();
                } else {
                    tagId = tagService.getTop().getId();
                }
                mat.sync(matParam);
//            mat.setMatnr(param.getMatnr());
//            mat.setMaktx(param.getMaktx());
//            mat.setSpecs(param.getSpecs());
//            mat.setModel(param.getModel());
                mat.setTagId(tagId);
                mat.setLocType(tagId);
                mat.setStatus(1);
                mat.setCreateTime(now);
                mat.setUpdateTime(now);
                if (!matService.insert(mat)) {
                    throw new CoolException("服务器内部错误,请联系管理员");
                        throw new CoolException("同步新物料错误[" + logInfo + "]");
                } else {
                    log.info("同步新物料[商品编号:{}]", mat.getMatnr());
                        log.info("同步新物料[{}]", logInfo);
                }
                    break;
                case "delete":
                    if (mat == null) {
                        throw new CoolException("商品信息不存在[" + logInfo + "]");
                    }
                    if (matService.delete(new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) {
                        log.info("删除物料[{}]", logInfo);
            } else {
                        throw new CoolException("删除已存在商品信息失败[" + logInfo + "]");
                    }
                    break;
                case "update":
                    if (mat == null) {
                        throw new CoolException("商品信息不存在[" + logInfo + "]");
                    }
                mat.sync(matParam);
                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                        throw new CoolException("更新已存在商品信息失败[" + logInfo + "]");
                    } else {
                        log.info("更新物料[:{}]", logInfo);
                    }
                    break;
                default:
                    throw new CoolException("商品信息操作类型不存在[" + logInfo + "]");
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -50,7 +50,7 @@
                    }
                } catch (Exception e) {
                    log.error(e.getMessage());
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                    log.error("单据[orderNo={}]上报erp异常", order.getOrderNo());
                }
            }
        }
@@ -69,7 +69,7 @@
                    }
                } catch (Exception e) {
                    log.error(e.getMessage());
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                    log.error("单据[orderNo={}]上报erp异常", order.getOrderNo());
                }
            }
        }
src/main/java/com/zy/asrs/task/handler/OrderPakinSyncHandler.java
@@ -5,10 +5,7 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.OrderDetlPakin;
import com.zy.asrs.entity.OrderPakin;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlPakinService;
@@ -23,6 +20,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -51,12 +49,14 @@
            return FAIL.setMsg("未找到对应的单据类型:" + order.getOrderNo());
        }
        MesPakinParam pakinParam = new MesPakinParam();
        ErpReportDto param = new ErpReportDto();
        param.setOrderDetails(new ArrayList<>());
        List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId());
        for (OrderDetlPakin orderDetl : orderDetls) {
            String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
            pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
            param.getOrderDetails().add(new ErpReportDto.DetlDto(orderDetl.getMatnr(),orderDetl.getQty()));
        }
        param.setOrderNo(order.getOrderNo());
        String response = "";
        boolean success = false;
        ReturnT<String> result = SUCCESS;
@@ -64,7 +64,7 @@
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.URI)
                    .setPath(MesConstant.PAKIN_PATH)
                    .setJson(JSON.toJSONString(pakinParam))
                    .setJson(JSON.toJSONString(param))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
@@ -73,7 +73,7 @@
                orderPakinService.updateSettle(order.getId(), 6L, null);
                success = true;
            } else {
                log.error("入库完成上报erp失败!url:{};request:{};response:{}", MesConstant.URI + MesConstant.PAKIN_PATH, JSON.toJSONString(pakinParam), response);
                log.error("入库完成上报erp失败!url:{};request:{};response:{}", MesConstant.URI + MesConstant.PAKIN_PATH, JSON.toJSONString(param), response);
                throw new CoolException("入库完成上报erp失败");
            }
        } catch (Exception e) {
@@ -87,7 +87,7 @@
                        MesConstant.URI + MesConstant.PAKIN_PATH,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(pakinParam),
                        JSON.toJSONString(param),
                        response,
                        success
                );
src/main/java/com/zy/asrs/task/handler/OrderPakoutSyncHandler.java
@@ -5,10 +5,7 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.OrderDetlPakout;
import com.zy.asrs.entity.OrderPakout;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlPakoutService;
@@ -23,6 +20,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -51,14 +49,14 @@
            return FAIL.setMsg("未找到对应的单据类型:" + order.getOrderNo());
        }
        MesPakoutParam pakoutParam = new MesPakoutParam();
        pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单"));
        pakoutParam.setOrderNo(order.getOrderNo());
        ErpReportDto param = new ErpReportDto();
        param.setOrderDetails(new ArrayList<>());
        List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectByOrderId(order.getId());
        for (OrderDetlPakout orderDetl : orderDetls) {
            String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
            pakoutParam.getList().add(new MesPakoutParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
            param.getOrderDetails().add(new ErpReportDto.DetlDto(orderDetl.getMatnr(),orderDetl.getQty()));
        }
        param.setOrderNo(order.getOrderNo());
        String response = "";
        boolean success = false;
        ReturnT<String> result = SUCCESS;
@@ -66,7 +64,7 @@
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.URI)
                    .setPath(MesConstant.PAKOUT_PATH)
                    .setJson(JSON.toJSONString(pakoutParam))
                    .setJson(JSON.toJSONString(param))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
@@ -75,7 +73,7 @@
                orderPakoutService.updateSettle(order.getId(), 6L, null);
                success = true;
            } else {
                log.error("出库完成上报erp失败!url:{};request:{};response:{}", MesConstant.URI + MesConstant.PAKOUT_PATH, JSON.toJSONString(pakoutParam), response);
                log.error("出库完成上报erp失败!url:{};request:{};response:{}", MesConstant.URI + MesConstant.PAKOUT_PATH, JSON.toJSONString(param), response);
                throw new CoolException("出库完成上报erp失败");
            }
        } catch (Exception e) {
@@ -89,7 +87,7 @@
                        MesConstant.URI + MesConstant.PAKOUT_PATH,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(pakoutParam),
                        JSON.toJSONString(param),
                        response,
                        success
                );