自动化立体仓库 - WMS系统
#
lty
4 天以前 878014fe71ae76d4bfbc885f1daab8921c60f6ac
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
@@ -36,6 +36,10 @@
    @Value("${erp.address.imPurinbillAdd}")
    private String imPurinbillAdd;
    @Value("${erp.address.imOtheroutbill}")
    private String imOtheroutbill;
    @Value("${erp.address.imOtherinbill}")
    private String imOtherinbill;
    @Autowired
    private OrderService orderService;
@@ -82,7 +86,8 @@
    private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, SimpleDateFormat sdf1, SimpleDateFormat sdf2) {
        List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",order.getOrderNo()));
        if(kingDeeUtilType == null){
        if (kingDeeUtilType == null || kingDeeUtilType.formId == null) {
            log.warn("kingDeeUtilType 为空,已跳过本次同步!");
            return null;
        }
        switch (kingDeeUtilType.formId) {
@@ -92,8 +97,9 @@
                JSONArray billentryArray = new JSONArray();  // 用于存储 billentry 对象
                String suppCode = null;  // 供应商
                String boxType2 = null;  // 货主/货源
                // 遍历订单详情
                Date now = new Date();
                for (OrderDetl orderDetl : orderDetlList) {
                    suppCode = orderDetl.getSuppCode();
                    boxType2 = orderDetl.getBoxType2();
@@ -101,8 +107,7 @@
                        continue;
                    }
//                    JSONArray idArr = new JSONArray();
//                    idArr.add(0L);   // ✅ 注意必须是 Long 类型的 0L
//                    Double reportNum = orderDetl.getQty() - orderDetl.getWorkQty();//上报数量减去已上报数量
//                    idArr.add(0L);
                    // 创建 billentry_lk 对象
                    JSONObject billentryLk = new JSONObject()
                            .fluentPut("id", 0L)
@@ -124,11 +129,9 @@
                            .fluentPut("qty", orderDetl.getQty())  // 数量
                            .fluentPut("material_number", orderDetl.getMatnr())  // 物料编号
                            .fluentPut("billentry_lk", billentryLkArray);
                    billentryArray.add(billentry);
//                    orderDetl.setWorkQty(orderDetl.getQty());
//                    orderDetlService.updateById(orderDetl);//将上报数覆盖到历史上
                }
                Date now = new Date();
                return new JSONObject()
                        .fluentPut("data", new JSONArray(Arrays.asList(
                                new JSONObject()
@@ -146,9 +149,73 @@
                                        .fluentPut("supplier_number", suppCode)  // 供应商编号
                                        .fluentPut("billentry", billentryArray)  // 将 billentry 数组添加到请求参数
                        )));
            case "STK_MISCELLANEOUS": // 其他入库单
                path = imOtherinbill;
                billentryArray = new JSONArray();
                for (OrderDetl orderDetl : orderDetlList) {
                    if (orderDetl.getQty() == 0) {
                        continue;
                    }
                    JSONObject billentry = new JSONObject()
                            .fluentPut("id", 0L)
                            .fluentPut("material_number", orderDetl.getMatnr())       // 物料编码
                            .fluentPut("qty", orderDetl.getQty())                    // 数量
                            .fluentPut("warehouse_number", "CK001")     // 仓库
                            .fluentPut("invstatus_number", "110")
                            .fluentPut("invtype_number", "110")
                            .fluentPut("outinvstatus_number", "110")
                            .fluentPut("outinvtype_number", "110")
                            .fluentPut("linetype_number", "010");
                    billentryArray.add(billentry);
                }
                Date nowMis = new Date();
                return new JSONObject()
                        .fluentPut("data", new JSONArray(Arrays.asList(
                                new JSONObject()
//                                        .fluentPut("id", 0L)
                                        .fluentPut("billno", order.getOrderNo())
//                                        .fluentPut("bookdate", sdf1.format(nowMis))
                                        .fluentPut("biztime", sdf1.format(nowMis))
                                        .fluentPut("biztype_number", "354")
                                        .fluentPut("billtype_number", "im_OtherInBill_STD_BT_S")
                                        .fluentPut("org_number", "BU-00001")
                                        .fluentPut("invscheme_number", "354")
                                        .fluentPut("billentry", billentryArray)
                        )));
            case "STK_MisDelivery": // 其他出库单
                path = imOtheroutbill;
                billentryArray = new JSONArray();
                Date nowOut = new Date();
                for (OrderDetl orderDetl : orderDetlList) {
                    if (orderDetl.getQty() == 0) {
                        continue;
                    }
                    JSONObject billentry = new JSONObject()
                            .fluentPut("id", 0L)
                            .fluentPut("material_number", orderDetl.getMatnr())       // 物料编码
                            .fluentPut("qty", orderDetl.getQty())                    // 数量
                            .fluentPut("warehouse_number", "CK001")     // 仓库
                            .fluentPut("invstatus_number", "110")
                            .fluentPut("invtype_number", "110")
                            .fluentPut("outinvstatus_number", "110")
                            .fluentPut("outinvtype_number", "110")
                            .fluentPut("linetype_number", "010");
                    billentryArray.add(billentry);
                }
                return new JSONObject()
                        .fluentPut("data", new JSONArray(Arrays.asList(
                                new JSONObject()
//                                        .fluentPut("id", 0L)
                                        .fluentPut("billno", order.getOrderNo())
//                                        .fluentPut("bookdate", sdf1.format(nowMis))
                                        .fluentPut("biztime", sdf1.format(nowOut))
                                        .fluentPut("biztype_number", "354")
                                        .fluentPut("billtype_number", "im_OtherInBill_STD_BT_S")
                                        .fluentPut("org_number", "BU-00001")
                                        .fluentPut("invscheme_number", "354")
                                        .fluentPut("billentry", billentryArray)
                        )));
            default:
                // 默认处理:可以抛出异常或返回空对象
                throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId);
        }
    }
@@ -157,11 +224,9 @@
    private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) {
        String response = "";
        boolean success = false;
        try {
            // 设置请求头
            HashMap<String, Object> headers = buildRequestHeaders(erpSecret);
            // 发送请求,将 JSONObject 转换为 String
            response = new HttpHandler.Builder()
                    .setHeaders(headers)
@@ -170,10 +235,8 @@
                    .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                    .build()
                    .doPost();
            // 解析响应
            JSONObject jsonResponse = JSON.parseObject(response);
            // 判断是否因为 token 过期 (errorCode = 401)
            if ("401".equals(jsonResponse.getString("errorCode"))) {
                log.error("认证失败,尝试重新获取 Token");
@@ -190,18 +253,15 @@
                        .build()
                        .doPost();
            }
            // 解析返回的响应
            JSONObject data = jsonResponse.getJSONObject("data");
            String errorCode = jsonResponse.getString("errorCode");
            boolean status = jsonResponse.getBooleanValue("status");
            // 检查接口调用的整体状态
            if ("0".equals(errorCode) && status) {
                // 获取成功与失败的数量
                int successCount = data.getInteger("successCount");
                int failCount = data.getInteger("failCount");
                if (failCount == 0) {
                    success = true;
                    log.info("接口调用成功,成功的操作数量: {}", successCount);
@@ -211,10 +271,12 @@
                        JSONObject resultItem = resultArray.getJSONObject(i);
                        String billNo = resultItem.getString("number");  // 获取返回的单据号
                        String billId = resultItem.getString("id");      // 获取返回的ID
                        order.setNumber(billId);
                        orderService.updateById(order);
                        log.info("订单号 {} 与返回的单据号匹配,设置订单 ID 为 {}", order.getOrderNo(), billId);
                        // 判断返回的单据号与订单号是否一致
                        if (billNo != null && billNo.equals(order.getOrderNo())) {
                            // 如果一致,设置订单的 number
                            order.setNumber(billId);
                            log.info("订单号 {} 与返回的单据号匹配,设置订单 ID 为 {}", order.getOrderNo(), billId);
                        }
                    }
                } else {
                    log.error("接口调用失败,失败的操作数量: {}", failCount);
@@ -242,7 +304,6 @@
            // 保存接口日志
            saveApiLog(add, response, success);
        }
        return success ? SUCCESS : FAIL;
    }
@@ -256,7 +317,7 @@
    private void saveApiLog(JSONObject add, String response, boolean success) {
        try {
            apiLogService.save(
                    "进仓通知单上报新增",
                    "入库上报新增",
                    URL + path,
                    null,
                    "127.0.0.1",