自动化立体仓库 - WMS系统
1
16 小时以前 9126e6315288e1ea50e74c70b099974522d6b172
Merge remote-tracking branch 'origin/jshdasrs' into jshdasrs
32个文件已修改
1079 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocDetlController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlPakinMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderPakinMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderPakoutMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlPakinService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderPakinService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderPakoutService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlPakinServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/ReviewOrderSyncScheduler.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/SaveOrderSyncScheduler.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/SubmitOrderSyncScheduler.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/ReviewOrderSyncHandler.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java 285 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/SubmitOrderSyncHandler.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/OrderInAndOutUtil.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/DetlDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enumUtils/OrderInAndOutType.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/enumUtils/OrderMethodVo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/enums/KingDeeUtilType.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlPakinMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderPakinMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderPakoutMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderPakin/order.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -296,26 +296,36 @@
                    .where("loc_no like '" + row + "%'");
        }
        List<LocDetl> list = locDetlService.selectList(wrapper);
        List<AbnormalLocDetlParam> result = new ArrayList<>();
        List<LocDetl> result = new ArrayList<>();
        Page<LocDetl> groupLocDetl = locDetlService.getStockStatis2(toPage(1, 10000, param, LocDetl.class));
        for (LocDetl locDetl : groupLocDetl.getRecords()) {
            AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam();
            Mat mat = matService.selectOne(new EntityWrapper<Mat>()
                    .eq("matnr", locDetl.getMatnr()));
            if (Cools.isEmpty(mat)) {
                continue;
            }
            if (!Cools.isEmpty(mat                                                                          .getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) {
                abnormalLocDetlParam.setStoreMax(mat.getStoreMax());
                abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate());
                abnormalLocDetlParam.setStoreMin(mat.getStoreMin());
                abnormalLocDetlParam.setAnfme(locDetl.getAnfme());
                abnormalLocDetlParam.setMaktx(mat.getMaktx());
                abnormalLocDetlParam.setMatnr(mat.getMatnr());
                abnormalLocDetlParam.setSpecs(mat.getSpecs());
                abnormalLocDetlParam.setBatch(locDetl.getBatch());
//        for (LocDetl locDetl : groupLocDetl.getRecords()) {
        for (LocDetl locDetl : list) {
//            AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam();
//            Mat mat = matService.selectOne(new EntityWrapper<Mat>()
//                    .eq("matnr", locDetl.getMatnr()));
//            if (Cools.isEmpty(mat)) {
//                continue;
//            }
//            if (!Cools.isEmpty(mat.getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) {
//                abnormalLocDetlParam.setStoreMax(mat.getStoreMax());
//                abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate());
//                abnormalLocDetlParam.setStoreMin(mat.getStoreMin());
//                abnormalLocDetlParam.setAnfme(locDetl.getAnfme());//数量
//                abnormalLocDetlParam.setMaktx(mat.getMaktx());//商品名称
//                abnormalLocDetlParam.setMatnr(mat.getMatnr());//商品编号
//                abnormalLocDetlParam.setSpecs(mat.getSpecs());
//                abnormalLocDetlParam.setBatch(locDetl.getBatch());
//                abnormalLocDetlParam.setLocNo(locDetl.getLocNo());//库位号
//                abnormalLocDetlParam.setZpallet(locDetl.getZpallet());//托盘条码
//                abnormalLocDetlParam.setBarcode(locDetl.getStandby2());//条码upc
//                abnormalLocDetlParam.setUnit(locDetl.getStandby1());//客户po
//                abnormalLocDetlParam.setSku(locDetl.getSku());//客户sku
//                abnormalLocDetlParam.setSupp(locDetl.getSupp());//供应商
//                abnormalLocDetlParam.setManu(locDetl.getBoxType1());//货主
//                abnormalLocDetlParam.setOrderNo(locDetl.getOrderNo());//采购单号
//                abnormalLocDetlParam.setMemo(locDetl.getMemo());//备注
//                abnormalLocDetlParam.setModiTime(locDetl.getModiTime());//修改时间
//                SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd");
//                Date maxDate = simple.parse(locDetl.getBatch());
//                long time = maxDate.getTime();
@@ -323,12 +333,12 @@
//                long time1 = now.getTime();
//                abnormalLocDetlParam.setNowTime((int) ((time1 - time) / (1000 * 60 * 60 * 24)));
                if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) {
                    result.add(abnormalLocDetlParam);
                } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) {
                    result.add(abnormalLocDetlParam);
                }
            }
//                if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) {
                    result.add(locDetl);
//                } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) {
//                    result.add(abnormalLocDetlParam);
//                }
//            }
        }
        return R.ok(exportSupport(result, fields));
    }
src/main/java/com/zy/asrs/mapper/OrderDetlPakinMapper.java
@@ -58,5 +58,6 @@
                        @Param("boxType3")String boxType3, @Param("workQty")Double workQty);
    List<OrderDetlPakin> selectOrderDetls(@Param("orderNo")String orderNo,@Param("sku")String sku,@Param("upc") String upc);
    List<OrderDetlPakin> selectOrderDetlsByOrderNo(@Param("orderNo")String orderNo);
}
src/main/java/com/zy/asrs/mapper/OrderMapper.java
@@ -18,7 +18,8 @@
    List<Order> selectComplete1();
    List<Order> selectComplete99();
    List<Order> selectComplete8();
    List<Order> selectComplete10();
    List<Order> selectComplete9();
    int addToLogTable(Order order);
    List<Order> selectorderNoL(@Param("orderNo")String orderNo);
src/main/java/com/zy/asrs/mapper/OrderPakinMapper.java
@@ -17,6 +17,8 @@
    List<OrderPakin> selectComplete();
    List<OrderPakin> selectComplete8();
    List<OrderPakin> selectComplete9();
    List<OrderPakin> selectComplete10();
    int addToLogTable(OrderPakin order);
src/main/java/com/zy/asrs/mapper/OrderPakoutMapper.java
@@ -16,7 +16,8 @@
    List<OrderPakout> selectComplete();
    List<OrderPakout> selectComplete8();
    List<OrderPakout> selectComplete9();
    List<OrderPakout> selectComplete10();
    int addToLogTable(OrderPakout order);
    List<OrderPakout> selectorderNoL(@Param("orderNo")String orderNo);
src/main/java/com/zy/asrs/service/OrderDetlPakinService.java
@@ -47,5 +47,6 @@
            , String boxType1, String boxType2, String boxType3, Double workQty);
    List<OrderDetlPakin> selectOrderDetls(OrderDetlByCode orderDetlByCode);
    List<OrderDetlPakin> selectOrderDetlsByOrderNo(String orderNo);
}
src/main/java/com/zy/asrs/service/OrderPakinService.java
@@ -27,6 +27,8 @@
    List<OrderPakin> selectComplete();
    List<OrderPakin> selectComplete8();
    List<OrderPakin> selectComplete9();
    List<OrderPakin> selectComplete10();
    boolean addToLogTable(OrderPakin order);
src/main/java/com/zy/asrs/service/OrderPakoutService.java
@@ -26,6 +26,8 @@
    List<OrderPakout> selectComplete();
    List<OrderPakout> selectComplete8();
    List<OrderPakout> selectComplete9();
    List<OrderPakout> selectComplete10();
    boolean addToLogTable(OrderPakout order);
src/main/java/com/zy/asrs/service/OrderService.java
@@ -28,6 +28,8 @@
    List<Order> selectComplete1();
    List<Order> selectComplete99();
    List<Order> selectComplete8();
    List<Order> selectComplete10();
    List<Order> selectComplete9();
    boolean addToLogTable(Order order);
src/main/java/com/zy/asrs/service/impl/OrderDetlPakinServiceImpl.java
@@ -107,4 +107,9 @@
        String sku = orderDetlByCode.getSku();
        return this.baseMapper.selectOrderDetls(orderNo,sku,upc);
    }
    @Override
    public List<OrderDetlPakin> selectOrderDetlsByOrderNo(String orderNo){
        return this.baseMapper.selectOrderDetlsByOrderNo(orderNo);
    }
}
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java
@@ -177,6 +177,17 @@
    public List<OrderPakin> selectComplete() {
        return this.baseMapper.selectComplete();
    }
    @Override
    public List<OrderPakin> selectComplete9() {
        return this.baseMapper.selectComplete9();
    }
    @Override
    public List<OrderPakin> selectComplete10() {
        return this.baseMapper.selectComplete10();
    }
    @Override
    public List<OrderPakin> selectComplete8() {
src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java
@@ -180,6 +180,14 @@
    public List<OrderPakout> selectComplete8() {
        return this.baseMapper.selectComplete8();
    }
    @Override
    public List<OrderPakout> selectComplete9() {
        return this.baseMapper.selectComplete8();
    }
    @Override
    public List<OrderPakout> selectComplete10() {
        return this.baseMapper.selectComplete8();
    }
    @Override
    public boolean addToLogTable(OrderPakout order) {
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -189,6 +189,14 @@
    public List<Order> selectComplete8() {
        return this.baseMapper.selectComplete8();
    }
    @Override
    public List<Order> selectComplete10() {
        return this.baseMapper.selectComplete10();
    }
    @Override
    public List<Order> selectComplete9() {
        return this.baseMapper.selectComplete9();
    }
    @Override
    public boolean addToLogTable(Order order) {
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -109,7 +109,7 @@
        }
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orders = orderService.selectComplete();
            List<Order> orders = orderService.selectComplete8();
            for (Order order : orders) {
                try {
                    ReturnT<String> result = orderSyncHandler.startOrderReport(order);
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -101,7 +101,7 @@
            if (detail.getAnfme().equals(0D)){
                continue;
            }
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(),
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(),
                    detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getStandby1(),dto.getStandby2(),dto.getStandby3(),dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
@@ -207,53 +207,29 @@
                String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
                pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getQty()));
            }
            String response = "";
            boolean success = false;
//
//            String response = "";
//            boolean success = false;
            try {
                if (pakinParam.getList().size()==0){
                    success = true;
                    // 修改订单状态 4.完成 ===>> 6.已上报
                    // 修改订单状态 8新增提交审核完成 ===>> 6.已上报
                    if (!orderService.updateSettle(order.getId(), settle, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                } else {
//                response = new HttpHandler.Builder()
//                        .setUri(MesConstant.URL)
//                        .setPath(MesConstant.PAKIN_URL)
//                        .setJson(JSON.toJSONString(pakinParam))
//                        .build()
//                        .doPost();
//                JSONObject jsonObject = JSON.parseObject(response);
//                if (jsonObject.getInteger("code").equals(200)) {
                    if (true) {
                        success = true;
                        // 修改订单状态 4.完成 ===>> 6.已上报
                    if (order.getSettle() == 8L) {
                        // 修改订单状态 8新增提交审核完成 ===>> 6.已上报
                        if (!orderService.updateSettle(order.getId(), settle, null)) {
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                    } else {
                        log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response);
                        throw new CoolException("上报mes系统失败");
                        log.error("8转6失败请查看流程中是否存在异常");
                        throw new CoolException("8转6失败");
                    }
                }
            } catch (Exception e) {
                log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "成品库入库上报",
                            MesConstant.URL + MesConstant.PAKIN_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(pakinParam),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
        // 出库完成上报
@@ -303,7 +279,7 @@
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "成品库出库上报",
                            "出库上报",
                            MesConstant.URL + MesConstant.PAKOUT_URL,
                            null,
                            "127.0.0.1",
src/main/java/com/zy/asrs/task/kingdee/ReviewOrderSyncScheduler.java
@@ -32,7 +32,7 @@
    @Value("${erp.switch.ReviewOrderSwitch}")
    private boolean ReviewOrderSwitch;
//    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
        if(!ReviewOrderSwitch){
@@ -40,8 +40,8 @@
        }
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            //        List<Order> orders = orderService.selectComplete();
            List<Order> orders = OrderInAndOutUtil.selectComplete(null);
//            List<Order> orders = OrderInAndOutUtil.selectComplete9(null);//查询9提交完成的
            List<Order> orders = orderService.selectComplete9();
            for (Order order : orders) {
                ReturnT<String> result = reviewOrderSyncHandler.start(order);
                if (!result.isSuccess()) {
src/main/java/com/zy/asrs/task/kingdee/SaveOrderSyncScheduler.java
@@ -4,6 +4,7 @@
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.kingdee.handler.SaveOrderSyncHandler;
import com.zy.asrs.task.kingdee.handler.SubmitOrderSyncHandler;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.entity.Parameter;
@@ -24,28 +25,28 @@
public class SaveOrderSyncScheduler {
    @Autowired
    private SubmitOrderSyncHandler submitOrderSyncHandler;
    private SaveOrderSyncHandler saveOrderSyncHandler;
    @Autowired
    private OrderService orderService;
    @Value("${erp.switch.ReviewOrderSwitch}")
    private boolean ReviewOrderSwitch;
//    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
        if (1==1) return;
        if(!ReviewOrderSwitch){
            return;
        }
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            //        List<Order> orders = orderService.selectComplete8();
            List<Order> orders = OrderInAndOutUtil.selectComplete8(null);
//            List<Order> orders = OrderInAndOutUtil.selectComplete(null);
            List<Order> orders = orderService.selectComplete();
            for (Order order : orders) {
                ReturnT<String> result = submitOrderSyncHandler.start(order);
                ReturnT<String> result = saveOrderSyncHandler.start(order);//4已完成
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]提交至erp失败", order.getOrderNo());
                    log.error("单据[orderNo={}]新增保存至erp失败", order.getOrderNo());
                }
            }
        }
src/main/java/com/zy/asrs/task/kingdee/SubmitOrderSyncScheduler.java
@@ -27,14 +27,14 @@
public class SubmitOrderSyncScheduler {
    @Autowired
    private SaveOrderSyncHandler saveOrderSyncHandler;
    private SubmitOrderSyncHandler submitOrderSyncHandler;
    @Autowired
    private OrderService orderService;
    @Value("${erp.switch.ReviewOrderSwitch}")
    private boolean ReviewOrderSwitch;
//    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
        if(!ReviewOrderSwitch){
@@ -42,10 +42,11 @@
        }
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            //        List<Order> orders = orderService.selectComplete8();
            List<Order> orders = OrderInAndOutUtil.selectComplete8(null);
//            List<Order> orders = OrderInAndOutUtil.selectComplete10(null); //查询10新增上报完成
            List<Order> orders = orderService.selectComplete10();
            for (Order order : orders) {
                ReturnT<String> result = saveOrderSyncHandler.start(order);
                ReturnT<String> result = submitOrderSyncHandler.start(order);
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]保存至erp失败", order.getOrderNo());
                }
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java
@@ -99,6 +99,9 @@
                docType = docTypeService.selectOrAdd(kingDeeUtilType.desc, kingDeeUtilType.pakIn.equals(1));
            }
            String FDocumentStatus=null;
            if (Arrays.asList("INR").contains(kingDeeUtilType.formId)) {
                continue;
            }
            //条件和需要获得的结果拼接
            JSONObject jsonObject = new JSONObject();
            String path = null;
@@ -131,7 +134,7 @@
//                    jsonObject.put("start_biztime", latestUpdateTime);//业务起始日期
                    jsonObject.put("start_biztime",  "2025-01-01 00:00:00");//业务起始日期
                    jsonObject.put("end_biztime", sdf1.format(now));//业务结束日期
                    jsonObject.put("billno", "CGSL-251126-000001");
                    jsonObject.put("billno", null);
                    jsonObject.put("billstatus", Arrays.asList("C"));//数据状态 [A:暂存, B:已提交, C:已审核]
                    jsonObject.put("start_auditdate", "2025-11-25 00:00:00");
                    jsonObject.put("end_auditdate", sdf1.format(now));
@@ -350,6 +353,7 @@
                            String billNo = jsonObjectNew.get("billno").toString();//单据编号
                            String owner = jsonObjectNew.get("org_name").toString();//货主名称
                            String ownerUuid = jsonObjectNew.get("org_number").toString();//erp货主编号
                            String orderId = jsonObjectNew.get("id").toString();
                            JSONObject detailParam = new JSONObject();
                            JSONObject dataObj = new JSONObject();
                            dataObj.put("billno", billNo);
@@ -391,7 +395,7 @@
                                                createTime.toString(),    // 单据日期
                                                docType.getDocId(),    // 单据类型
                                                null,    // 项目编号
                                                null,    //项目名称 客户PO号  暂时不知道字段是哪个
                                                orderId,    //收料单id
                                                null,    // 调拨项目编号
                                                null,    // 初始票据号
                                                null,    // 票据号
@@ -441,6 +445,9 @@
                                        String s2 = entry.getString("eap7_textfield5"); //条码UPC
                                        String memo = entry.getString("eap7_textfield6"); //备注(英文描述)
                                        String s1 = entry.getString("eap7_textfield7"); //客户PO
                                        String detlId = entry.getString("id"); //明细id
                                        Long seq = entry.getLong("seq"); //分录行号
//                                        String
                                        if(anfme == 0){
                                            callApiLogSaveOrder(order,kingDeeUtilType, "单据数量异常"+matnr, false);
                                            continue;
@@ -469,8 +476,10 @@
                                        if(locSupp != null){supp = locSupp.getOwner();}
                                        OrderDetl orderDetl = new OrderDetl();
                                        orderDetl.sync(mat);
                                        orderDetl.setThreeCode(detlId);//ERP明细id
                                        orderDetl.setLineNumber(seq);//分录行号
                                        orderDetl.setAnfme(anfme);//总箱数
                                        orderDetl.setErpAnfme(anfme);
                                        orderDetl.setErpAnfme(anfme);//erp数据
                                        orderDetl.setOrderId(order.getId());
                                        orderDetl.setOrderNo(order.getOrderNo());//表头单据
                                        orderDetl.setSupp(supp);//供应商名称(货源)
src/main/java/com/zy/asrs/task/kingdee/handler/ReviewOrderSyncHandler.java
@@ -5,10 +5,12 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.ErpSecret;
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.impl.ErpSecretServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -20,6 +22,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
@@ -33,9 +37,9 @@
    //端口
    private String URL;
    @Value("${erp.address.outaddressAudit}")
    @Value("${erp.address.imPurinbillBatchAudit}")
    //审核地址
    private String outaddressAudit;
    private String imPurinbillBatchAudit;
    @Autowired
    private OrderService orderService;
@@ -44,92 +48,154 @@
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private ErpSecretServiceImpl erpSecretService;
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    @Value("${erp.login.accountId}")
    private String accountId;
    @Value("${erp.login.xAcfwIdentity}")
    private String xAcfwIdentity;
    private String path;
    @Transactional
    public ReturnT<String> start(Order order) {
        //登录金蝶r
        ReturnT<String> start = loginAuthenticationHandler.start();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        // 获取 Token
        ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
        // 获取 DocType
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        if (docType == null) return SUCCESS;
        // 获取 KingDee 类型
        KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName());
        //条件拼接
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Numbers",order.getOrderNo());
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("data", jsonObject);
        jsonObject1.put("FormId",kingDeeUtilType.formId);
        String add = jsonObject1.toJSONString();
        //上报
        // 构建请求参数
        JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2);
        if (add == null) return FAIL.setMsg("请求参数构建失败");
        // 发送请求并处理响应
        return sendRequestAndProcessResponse(order, erpSecret, add);
    }
    private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType,
                                          SimpleDateFormat sdf1, SimpleDateFormat sdf2) {
        switch (kingDeeUtilType.formId) {
            case "PUR_RECEIVEBIll": // 进仓通知单提交
                path = imPurinbillBatchAudit;
                JSONArray idArray = new JSONArray();
                idArray.add(order.getNumber());
                JSONObject dataObj = new JSONObject();
                dataObj.fluentPut("id", idArray);
                return new JSONObject().fluentPut("data", dataObj);
            default:
                throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId);
        }
    }
    private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) {
        String response = "";
        boolean success = false;
        try {
            //获取Cookie值
            HashMap<String, Object> headers = new HashMap<>();
            headers.put("Cookie", start.getContent());
            // 设置请求头
            HashMap<String, Object> headers = buildRequestHeaders(erpSecret);
            // 发送请求,将 JSONObject 转换为 String
            response = new HttpHandler.Builder()
                    .setHeaders(headers)
                    .setUri(URL)
                    .setPath(outaddressAudit)
                    .setJson(add)
                    .setPath(path)
                    .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                    .build()
                    .doPost();
            JSONObject data = JSON.parseObject(response);
            Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess");
            String bool=IsSuccess.toString();
            //审核完成原订单4转8  8.审核完成
            if(bool.equals("true")){
                success = true;
                order.setSettle(8L);
//                orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo()));
                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 8L, null);
            // 解析响应
            JSONObject jsonResponse = JSON.parseObject(response);
            // 判断是否因为 token 过期 (errorCode = 401)
            if ("401".equals(jsonResponse.getString("errorCode"))) {
                log.error("认证失败,尝试重新获取 Token");
                loginAuthenticationHandler.start(); // 刷新 token
                // 重新获取新的 token
                erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token
                // 使用新的 token 重试请求
                headers.put("accesstoken", erpSecret.getAccessToken());
                response = new HttpHandler.Builder()
                        .setHeaders(headers)
                        .setUri(URL)
                        .setPath(path)
                        .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                        .build()
                        .doPost();
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "审核",
                        URL+ outaddressAudit,
                        null,
                        "127.0.0.1",
                        add,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
        return SUCCESS;
    }
    public static Object findValueByKey(JSONObject json, String key) {
        Set<String> keySet = json.keySet();
        for (String k : keySet) {
            Object v = json.get(k);
            if (k.equals(key)) {
                return v;
            } else if (v instanceof JSONArray) {
                int size = ((JSONArray) v).size();
                for (int i = 0; i <= size - 1; i++) {
                    Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
                    if (result != null){
                        return result;
            // 解析返回的响应
            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);
                } else {
                    log.error("接口调用失败,失败的操作数量: {}", failCount);
                    // 如果有失败的单据,遍历 result 数组查看失败的详细信息
                    JSONArray resultArray = data.getJSONArray("result");
                    for (int i = 0; i < resultArray.size(); i++) {
                        JSONObject resultItem = resultArray.getJSONObject(i);
                        if (!resultItem.getBoolean("billStatus")) {
                            // 单据处理失败,记录错误信息
                            String billNo = resultItem.getString("number");  // 获取返回的单据号
                            JSONArray errors = resultItem.getJSONArray("errors");  // 获取错误信息
                            // 打印单据号和错误信息
                            log.error("单据号: {}, 错误信息: {}", billNo, errors);
                        }
                    }
                }
            } else if (v instanceof JSONObject){
                Object result = findValueByKey((JSONObject) v, key);
                if (result != null){
                    return result;
                }
                order.setSettle(8L); // 更新状态为已上报审核 9->8
                orderService.updateById(order);
            } else {
                log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message"));
            }
        } catch (Exception e) {
            log.error("请求失败", e);
            return FAIL.setMsg(e.getMessage());
        } finally {
            // 保存接口日志
            saveApiLog(add, response, success);
        }
        return null;
        return success ? SUCCESS : FAIL;
    }
    private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) {
        HashMap<String, Object> headers = new HashMap<>();
        headers.put("accesstoken", erpSecret.getAccessToken());
        headers.put("x-acgw-identity", xAcfwIdentity);  // 自定义请求头
        return headers;
    }
    private void saveApiLog(JSONObject add, String response, boolean success) {
        try {
            apiLogService.save(
                    "单据上报审核",
                    URL + imPurinbillBatchAudit,
                    null,
                    "127.0.0.1",
                    add.toJSONString(),
                    response,
                    success
            );
        } catch (Exception e) {
            log.error("接口日志保存失败", e);
        }
    }
}
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
@@ -4,11 +4,13 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.impl.ErpSecretServiceImpl;
import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl;
import com.zy.asrs.service.impl.OrderDetlServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -20,8 +22,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.Set;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by Monkey D. Luffy on 2023.10.21
@@ -30,12 +32,10 @@
@Service
public class SaveOrderSyncHandler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    //端口
    private String URL;
    @Value("${erp.address.outaddressSave}")
    //审核地址
    private String outaddressSave;
    @Value("${erp.address.imPurinbillAdd}")
    private String imPurinbillAdd;
    @Autowired
    private OrderService orderService;
@@ -45,92 +45,227 @@
    private DocTypeService docTypeService;
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    @Autowired
    private ErpSecretServiceImpl erpSecretService;
    @Autowired
    private OrderDetlPakinServiceImpl orderDetlPakinService;
    @Autowired
    private OrderDetlServiceImpl orderDetlService;
    @Value("${erp.login.accountId}")
    private String accountId;
    @Value("${erp.login.xAcfwIdentity}")
    private String xAcfwIdentity;
    String path;
    @Transactional
    public ReturnT<String> start(Order order) {
        //登录金蝶r
        ReturnT<String> start = loginAuthenticationHandler.start();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        // 获取 Token
        ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
        // 获取 DocType
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        if (docType == null) return SUCCESS;
        // 获取 KingDee 类型
        KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName());
        //条件拼接
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Numbers",order.getOrderNo());
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("data", jsonObject);
        jsonObject1.put("FormId",kingDeeUtilType.correspondingFormId);
        String add = jsonObject1.toJSONString();
        //上报
        // 构建请求参数
        JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2);
        if (add == null) return FAIL.setMsg("请求参数构建失败");
        // 发送请求并处理响应
        return sendRequestAndProcessResponse(order, erpSecret, add);
    }
    private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, SimpleDateFormat sdf1, SimpleDateFormat sdf2) {
        List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",order.getOrderNo()));
        switch (kingDeeUtilType.formId) {
            case "PUR_RECEIVEBIll": // 进仓通知单
                path = imPurinbillAdd;
                JSONArray billentryLkArray = new JSONArray();
                JSONArray billentryArray = new JSONArray();  // 用于存储 billentry 对象
                String suppCode = null;  // 供应商
                String boxType2 = null;  // 货主/货源
                // 遍历订单详情
                for (OrderDetl orderDetl : orderDetlList) {
                    suppCode = orderDetl.getSuppCode();
                    boxType2 = orderDetl.getBoxType2();
                    if (orderDetl.getQty() == 0) {
                        continue;
                    }
                    // 创建 billentry_lk 对象
                    JSONObject billentryLk = new JSONObject()
                            .fluentPut("id", Long.parseLong(orderDetl.getThreeCode()))
                            .fluentPut("seq", orderDetl.getLineNumber())
                            .fluentPut("billentry_lk_stableid", 677270092232273922L)
                            .fluentPut("billentry_lk_sbillid", Long.parseLong(order.getItemName()))  // 主单ID
                            .fluentPut("billentry_lk_sid", Long.parseLong(orderDetl.getThreeCode()))  // 明细ID
                            .fluentPut("billentry_lk_baseqty_old", orderDetl.getErpAnfme())  // ERP数量
                            .fluentPut("billentry_lk_baseqty", orderDetl.getQty());  // 作业数量
                    billentryLkArray.add(billentryLk);
                    // 创建 billentry 对象,填充缺失的字段
                    JSONObject billentry = new JSONObject()
                            .fluentPut("id", Long.parseLong(orderDetl.getThreeCode()))
                            .fluentPut("warehouse_number", orderDetl.getManu())  // 仓库编号
                            .fluentPut("invstatus_number", "110")  // 库存状态
                            .fluentPut("invtype_number", "110")  // 库存类型
                            .fluentPut("outinvstatus_number", "110")
                            .fluentPut("linetype_number", "010")  // 行号类型
                            .fluentPut("qty", orderDetl.getQty())  // 数量
                            .fluentPut("material_number", orderDetl.getMatnr())  // 物料编号
                            .fluentPut("billentry_lk", billentryLkArray);  // 将 billentry_lk 添加到 billentry
                    billentryArray.add(billentry);
                }
                Date now = new Date();
                // 生成 INR 相关请求参数
                return new JSONObject()
                        .fluentPut("data", new JSONArray(Arrays.asList(
                                new JSONObject()
                                        .fluentPut("billno", order.getOrderNo())
                                        .fluentPut("trdbillno", UUID.randomUUID().toString().replace("-", ""))
                                        .fluentPut("billtype_number", "im_PurInBill_STD_BT_S")
                                        .fluentPut("biztime", sdf1.format(now))
                                        .fluentPut("exratedate", sdf1.format(now))
                                        .fluentPut("bizorg_number", boxType2)
                                        .fluentPut("biztype_number", "110")  // 货主/货源
                                        .fluentPut("org_number", boxType2)  // 货主/货源
                                        .fluentPut("paymode", "CREDIT")
                                        .fluentPut("invscheme_number", "110")
                                        .fluentPut("billtype_number", "im_PurInBill_STD_BT_S")
                                        .fluentPut("supplier_number", suppCode)  // 供应商编号
                                        .fluentPut("billno", order.getOrderNo())
                                        .fluentPut("billentry", billentryArray)  // 将 billentry 数组添加到请求参数
                        )));
            default:
                // 默认处理:可以抛出异常或返回空对象
                throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId);
        }
    }
    private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) {
        String response = "";
        boolean success = false;
        try {
            //获取Cookie值
            HashMap<String, Object> headers = new HashMap<>();
            headers.put("Cookie", start.getContent());
            // 设置请求头
            HashMap<String, Object> headers = buildRequestHeaders(erpSecret);
            // 发送请求,将 JSONObject 转换为 String
            response = new HttpHandler.Builder()
                    .setHeaders(headers)
                    .setUri(URL)
                    .setPath(outaddressSave)
                    .setJson(add)
                    .setPath(path)
                    .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                    .build()
                    .doPost();
            JSONObject data = JSON.parseObject(response);
            Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess");
            String bool=IsSuccess.toString();
            //保存完成原订单8转6
            if(bool.equals("true")){
                success = true;
                order.setSettle(6L);
//                orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo()));
                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null);
            // 解析响应
            JSONObject jsonResponse = JSON.parseObject(response);
            // 判断是否因为 token 过期 (errorCode = 401)
            if ("401".equals(jsonResponse.getString("errorCode"))) {
                log.error("认证失败,尝试重新获取 Token");
                loginAuthenticationHandler.start(); // 刷新 token
                // 重新获取新的 token
                erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token
                // 使用新的 token 重试请求
                headers.put("accesstoken", erpSecret.getAccessToken());
                response = new HttpHandler.Builder()
                        .setHeaders(headers)
                        .setUri(URL)
                        .setPath(path)
                        .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                        .build()
                        .doPost();
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "保存",
                        URL+ outaddressSave,
                        null,
                        "127.0.0.1",
                        add,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
        return SUCCESS;
    }
    public static Object findValueByKey(JSONObject json, String key) {
        Set<String> keySet = json.keySet();
        for (String k : keySet) {
            Object v = json.get(k);
            if (k.equals(key)) {
                return v;
            } else if (v instanceof JSONArray) {
                int size = ((JSONArray) v).size();
                for (int i = 0; i <= size - 1; i++) {
                    Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
                    if (result != null){
                        return result;
            // 解析返回的响应
            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);
                    // 获取返回的单据号和ID
                    JSONArray resultArray = data.getJSONArray("result");
                    for (int i = 0; i < resultArray.size(); i++) {
                        JSONObject resultItem = resultArray.getJSONObject(i);
                        String billNo = resultItem.getString("number");  // 获取返回的单据号
                        String billId = resultItem.getString("id");      // 获取返回的ID
                        // 判断返回的单据号与订单号是否一致
                        if (billNo != null && billNo.equals(order.getOrderNo())) {
                            // 如果一致,设置订单的 number
                            order.setNumber(billId);
                            log.info("订单号 {} 与返回的单据号匹配,设置订单 ID 为 {}", order.getOrderNo(), billId);
                        }
                    }
                } else {
                    log.error("接口调用失败,失败的操作数量: {}", failCount);
                    // 如果有失败的单据,遍历 result 数组查看失败的详细信息
                    JSONArray resultArray = data.getJSONArray("result");
                    for (int i = 0; i < resultArray.size(); i++) {
                        JSONObject resultItem = resultArray.getJSONObject(i);
                        if (!resultItem.getBoolean("billStatus")) {
                            // 单据处理失败,记录错误信息
                            String billNo = resultItem.getString("billno");
                            JSONArray errors = resultItem.getJSONArray("errors");
                            log.error("单据号: {}, 错误信息: {}", billNo, errors);
                        }
                    }
                }
            } else if (v instanceof JSONObject){
                Object result = findValueByKey((JSONObject) v, key);
                if (result != null){
                    return result;
                }
                order.setSettle(10L); // 更新状态为 "已上报"
                orderService.updateById(order);
            } else {
                log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message"));
            }
        } catch (Exception e) {
            log.error("请求失败", e);
            return FAIL.setMsg(e.getMessage());
        } finally {
            // 保存接口日志
            saveApiLog(add, response, success);
        }
        return null;
        return success ? SUCCESS : FAIL;
    }
    private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) {
        HashMap<String, Object> headers = new HashMap<>();
        headers.put("accesstoken", erpSecret.getAccessToken());
        headers.put("x-acgw-identity", xAcfwIdentity);  // 自定义请求头
        return headers;
    }
    private void saveApiLog(JSONObject add, String response, boolean success) {
        try {
            apiLogService.save(
                    "进仓通知单上报新增",
                    URL + path,
                    null,
                    "127.0.0.1",
                    add.toJSONString(),
                    response,
                    success
            );
        } catch (Exception e) {
            log.error("接口日志保存失败", e);
        }
    }
}
src/main/java/com/zy/asrs/task/kingdee/handler/SubmitOrderSyncHandler.java
@@ -5,10 +5,13 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.ErpSecret;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetlPakin;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.impl.ErpSecretServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -20,7 +23,10 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
@@ -30,106 +36,170 @@
@Service
public class SubmitOrderSyncHandler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    //端口
    private String URL;
    @Value("${erp.address.outaddressSubmit}")
    //审核地址
    private String outaddressSubmit;
    @Value("${erp.address.imPurinbillBatchSubmit}")
    private String imPurinbillBatchSubmit;
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    @Autowired
    private ErpSecretServiceImpl erpSecretService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    @Value("${erp.login.accountId}")
    private String accountId;
    @Value("${erp.login.xAcfwIdentity}")
    private String xAcfwIdentity;
    private String path;
    @Transactional
    public ReturnT<String> start(Order order) {
        //登录金蝶r
        ReturnT<String> start = loginAuthenticationHandler.start();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        // 获取 Token
        ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
        // 获取 DocType
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        if (docType == null) return SUCCESS;
        // 获取 KingDee 类型
        KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName());
        //条件拼接
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Numbers",order.getOrderNo());
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("data", jsonObject);
        jsonObject1.put("FormId",kingDeeUtilType.correspondingFormId);
        String add = jsonObject1.toJSONString();
        //上报
        // 构建请求参数
        JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2);
        if (add == null) return FAIL.setMsg("请求参数构建失败");
        // 发送请求并处理响应
        return sendRequestAndProcessResponse(order, erpSecret, add);
    }
    private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType,
                                          SimpleDateFormat sdf1, SimpleDateFormat sdf2) {
        switch (kingDeeUtilType.formId) {
            case "PUR_RECEIVEBIll": // 进仓通知单提交
                path = imPurinbillBatchSubmit;
                JSONArray idArray = new JSONArray();
                idArray.add(order.getNumber());
                JSONObject dataObj = new JSONObject();
                dataObj.fluentPut("id", idArray);
                return new JSONObject().fluentPut("data", dataObj);
            default:
                throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId);
        }
    }
    private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) {
        String response = "";
        boolean success = false;
        try {
            //获取Cookie值
            HashMap<String, Object> headers = new HashMap<>();
            headers.put("Cookie", start.getContent());
            // 设置请求头
            HashMap<String, Object> headers = buildRequestHeaders(erpSecret);
            // 发送请求,将 JSONObject 转换为 String
            response = new HttpHandler.Builder()
                    .setHeaders(headers)
                    .setUri(URL)
                    .setPath(outaddressSubmit)
                    .setJson(add)
                    .setPath(path)
                    .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                    .build()
                    .doPost();
            JSONObject data = JSON.parseObject(response);
            Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess");
            String bool=IsSuccess.toString();
            //审核完成原订单8转6
            if(bool.equals("true")){
                success = true;
                order.setSettle(6L);
//                orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo()));
                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null);
            // 解析响应
            JSONObject jsonResponse = JSON.parseObject(response);
            // 判断是否因为 token 过期 (errorCode = 401)
            if ("401".equals(jsonResponse.getString("errorCode"))) {
                log.error("认证失败,尝试重新获取 Token");
                loginAuthenticationHandler.start(); // 刷新 token
                // 重新获取新的 token
                erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 重新从数据库获取新的 token
                // 使用新的 token 重试请求
                headers.put("accesstoken", erpSecret.getAccessToken());
                response = new HttpHandler.Builder()
                        .setHeaders(headers)
                        .setUri(URL)
                        .setPath(path)
                        .setJson(add.toJSONString()) // 将 JSONObject 转换为 String
                        .build()
                        .doPost();
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "提交",
                        URL+ outaddressSubmit,
                        null,
                        "127.0.0.1",
                        add,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
        return SUCCESS;
    }
    public static Object findValueByKey(JSONObject json, String key) {
        Set<String> keySet = json.keySet();
        for (String k : keySet) {
            Object v = json.get(k);
            if (k.equals(key)) {
                return v;
            } else if (v instanceof JSONArray) {
                int size = ((JSONArray) v).size();
                for (int i = 0; i <= size - 1; i++) {
                    Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
                    if (result != null){
                        return result;
            // 解析返回的响应
            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);
                } else {
                    log.error("接口调用失败,失败的操作数量: {}", failCount);
                    // 如果有失败的单据,遍历 result 数组查看失败的详细信息
                    JSONArray resultArray = data.getJSONArray("result");
                    for (int i = 0; i < resultArray.size(); i++) {
                        JSONObject resultItem = resultArray.getJSONObject(i);
                        if (!resultItem.getBoolean("billStatus")) {
                            // 单据处理失败,记录错误信息
                            String billNo = resultItem.getString("number");  // 获取返回的单据号
                            JSONArray errors = resultItem.getJSONArray("errors");  // 获取错误信息
                            // 打印单据号和错误信息
                            log.error("单据号: {}, 错误信息: {}", billNo, errors);
                        }
                    }
                }
            } else if (v instanceof JSONObject){
                Object result = findValueByKey((JSONObject) v, key);
                if (result != null){
                    return result;
                }
                order.setSettle(9L); // 更新状态为已提交完成 10->9
                orderService.updateById(order);
            } else {
                log.error("接口调用失败,错误信息: {}", jsonResponse.getString("message"));
            }
        } catch (Exception e) {
            log.error("请求失败", e);
            return FAIL.setMsg(e.getMessage());
        } finally {
            // 保存接口日志
            saveApiLog(add, response, success);
        }
        return null;
        return success ? SUCCESS : FAIL;
    }
    private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) {
        HashMap<String, Object> headers = new HashMap<>();
        headers.put("accesstoken", erpSecret.getAccessToken());
        headers.put("x-acgw-identity", xAcfwIdentity);  // 自定义请求头
        return headers;
    }
    private void saveApiLog(JSONObject add, String response, boolean success) {
        try {
            apiLogService.save(
                    "单据上报提交",
                    URL + path,
                    null,
                    "127.0.0.1",
                    add.toJSONString(),
                    response,
                    success
            );
        } catch (Exception e) {
            log.error("接口日志保存失败", e);
        }
    }
}
src/main/java/com/zy/asrs/utils/OrderInAndOutUtil.java
@@ -104,6 +104,10 @@
                    return casual.getDeclaredMethod(OrderMethodVo.REMOVE.getCode(), Long.class);
                case SELECT_COMPLETE:
                    return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE.getCode());
                case SELECT_COMPLETE9:
                    return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE9.getCode());
                case SELECT_COMPLETE10:
                    return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE10.getCode());
                case SELECT_COMPLETE8:
                    return casual.getDeclaredMethod(OrderMethodVo.SELECT_COMPLETE8.getCode());
                case ADD_TO_LOG_TABLE_ORDER:
@@ -407,6 +411,64 @@
            throw new CoolException(e.getCause().getMessage());
        }
    }
    public static List<Order> selectComplete9(boolean sign){
        try{
            Object invoke = implement(OrderMethodVo.SELECT_COMPLETE9).invoke(getOrderInAndOutType(sign));
            if (Cools.isEmpty(invoke)){
                return new ArrayList<>();
            } else if (invoke instanceof List) {
                return (List<Order>) invoke;
            } else {
                throw new CoolException("Unexpected return type");
            }
        } catch (Exception e) {
            throw new CoolException(e.getCause().getMessage());
        }
    }
    public static List<Order> selectComplete9(String sign){
        try{
            Object invoke = implement(OrderMethodVo.SELECT_COMPLETE9).invoke(getOrderInAndOutType(sign));
            if (Cools.isEmpty(invoke)){
                return new ArrayList<>();
            } else if (invoke instanceof List) {
                return (List<Order>) invoke;
            } else {
                throw new CoolException("Unexpected return type");
            }
        } catch (Exception e) {
            throw new CoolException(e.getCause().getMessage());
        }
    }
    public static List<Order> selectComplete10(boolean sign){
        try{
            Object invoke = implement(OrderMethodVo.SELECT_COMPLETE10).invoke(getOrderInAndOutType(sign));
            if (Cools.isEmpty(invoke)){
                return new ArrayList<>();
            } else if (invoke instanceof List) {
                return (List<Order>) invoke;
            } else {
                throw new CoolException("Unexpected return type");
            }
        } catch (Exception e) {
            throw new CoolException(e.getCause().getMessage());
        }
    }
    public static List<Order> selectComplete10(String sign){
        try{
            Object invoke = implement(OrderMethodVo.SELECT_COMPLETE10).invoke(getOrderInAndOutType(sign));
            if (Cools.isEmpty(invoke)){
                return new ArrayList<>();
            } else if (invoke instanceof List) {
                return (List<Order>) invoke;
            } else {
                throw new CoolException("Unexpected return type");
            }
        } catch (Exception e) {
              throw new CoolException(e.getCause().getMessage());
        }
    }
    public static List<Order> selectComplete8(boolean sign){
        try{
src/main/java/com/zy/common/model/DetlDto.java
@@ -64,6 +64,7 @@
        this.boxType3 = boxType3;
    }
    public DetlDto(String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double anfme) {
        this.matnr = matnr;
        this.batch = batch;
src/main/java/com/zy/common/model/enumUtils/OrderInAndOutType.java
@@ -114,6 +114,17 @@
        }
        @Transactional
        public List<Order> selectComplete9() {
            List<OrderPakin> orderPakinList = orderPakinService.selectComplete9();
            return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList);
        }
        @Transactional
        public List<Order> selectComplete10() {
            List<OrderPakin> orderPakinList = orderPakinService.selectComplete10();
            return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList);
        }
        @Transactional
        public List<Order> selectComplete8() {
            List<OrderPakin> orderPakinList = orderPakinService.selectComplete8();
            return OrderTransFormationUtil.transformationOrderListPakin(orderPakinList);
@@ -280,6 +291,16 @@
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete8();
            return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList);
        }
        @Transactional
        public List<Order> selectComplete9() {
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete9();
            return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList);
        }
        @Transactional
        public List<Order> selectComplete10() {
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete10();
            return OrderTransFormationUtil.transformationOrderListPakout(orderPakoutList);
        }
        @Transactional
        public boolean addToLogTableOrder(Order order) {
@@ -436,6 +457,18 @@
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete8();
            return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList);
        }
        @Transactional
        public List<Order> selectComplete9() {
            List<OrderPakin> orderPakinList = orderPakinService.selectComplete9();
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete9();
            return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList);
        }
        @Transactional
        public List<Order> selectComplete10() {
            List<OrderPakin> orderPakinList = orderPakinService.selectComplete10();
            List<OrderPakout> orderPakoutList = orderPakoutService.selectComplete10();
            return OrderTransFormationUtil.transformationOrderList(orderPakinList,orderPakoutList);
        }
        @Transactional
        public boolean addToLogTableOrder(Order order) {
@@ -544,6 +577,8 @@
    public abstract List<Order> selectComplete();
    public abstract List<Order> selectComplete8();
    public abstract List<Order> selectComplete9();
    public abstract List<Order> selectComplete10();
    public abstract boolean addToLogTableOrder(Order order);
src/main/java/com/zy/common/model/enumUtils/OrderMethodVo.java
@@ -18,7 +18,8 @@
    UPDATE_ORDERDETL("updateOrderDetl"),
    REMOVE("remove"),
    SELECT_COMPLETE("selectComplete"),
    SELECT_COMPLETE10("selectComplete10"),
    SELECT_COMPLETE9("selectComplete9"),
    SELECT_COMPLETE8("selectComplete8"),
    ADD_TO_LOG_TABLE_ORDER("addToLogTableOrder"),
    SELECT_ORDER_NO_L("selectOrderNoL"),
src/main/java/com/zy/erp/kingdee/enums/KingDeeUtilType.java
@@ -1,11 +1,10 @@
package com.zy.erp.kingdee.enums;
public enum KingDeeUtilType {
    BD_MATERIAL(0, "物料档案","BD_MATERIAL","","","",1),
    BD_RRGANIZATION(2, "供应商","BD_RRGANIZATION","","","",1),
//    PUR_RECEIVEBIll(3, "收料单","PUR_RECEIVEBIll","","","",1),
    //    STK_InStock(1, "采购入库单","STK_InStock","FRealQty","","",1),
//    BD_MATERIAL(0, "物料档案","BD_MATERIAL","","","",1),
//    BD_RRGANIZATION(2, "供应商","BD_RRGANIZATION","","","",1),
    PUR_RECEIVEBIll(3, "收料单","PUR_RECEIVEBIll","","","",1),
//    INR(1, "进仓通知库单上报","INR","FRealQty","","",1),
//    PUR_MRB(2, "采购退料单","PUR_MRB","FRMREALQTY","","",1),
//    PRD_PickMtrl(3, "生产领料单","PRD_PickMtrl","FActualQty","","",1),
//    PRD_ReturnMtrl(4, "生产退料单","PRD_ReturnMtrl","FQty","","",1),
src/main/resources/mapper/OrderDetlPakinMapper.xml
@@ -255,4 +255,12 @@
        order by update_time
    </select>
    <select id="selectOrderDetlsByOrderNo" resultMap="BaseResultMap">
        SELECT *
        FROM man_order_detl_pakin
        where 1=1
          and order_no = #{orderNo}
        order by update_time
    </select>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -60,7 +60,24 @@
        from man_order
        where 1=1
        and settle = 4
        and status = 1
--         and settle = 97
         and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete10" resultMap="BaseResultMap">
        select top 5 *
        from man_order
        where 1=1
          and settle = 10
          and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete9" resultMap="BaseResultMap">
        select top 5 *
        from man_order
        where 1=1
          and settle = 9
          and status = 1
        order by create_time asc
    </select>
src/main/resources/mapper/OrderPakinMapper.xml
@@ -63,6 +63,22 @@
        and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete9" resultMap="BaseResultMap">
        select top 5 *
        from man_order_pakin
        where 1=1
          and settle = 9
          and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete10" resultMap="BaseResultMap">
        select top 5 *
        from man_order_pakin
        where 1=1
          and settle = 10
          and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete8" resultMap="BaseResultMap">
        select top 5 *
src/main/resources/mapper/OrderPakoutMapper.xml
@@ -63,6 +63,22 @@
        and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete9" resultMap="BaseResultMap">
        select top 5 *
        from man_order_pakout
        where 1=1
          and settle = 9
          and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete10" resultMap="BaseResultMap">
        select top 5 *
        from man_order_pakout
        where 1=1
          and settle = 10
          and status = 1
        order by create_time asc
    </select>
    <select id="selectComplete8" resultMap="BaseResultMap">
        select top 5 *
src/main/webapp/static/js/orderPakin/order.js
@@ -43,7 +43,7 @@
        cols: [[
            {type: 'numbers'},
            {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'itemName', align: 'center', title: '客户po',  minWidth: 160, width: 160},
            {field: 'itemName', align: 'center', title: 'ERPID',  minWidth: 160, width: 160},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160, width: 160},
            {field: 'cstmrName', align: 'center', title: '货主',  minWidth: 160, width: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},