自动化立体仓库 - WMS系统
#
zjj
2025-09-02 598c9d63f68a8c92b264328c88c1cb4ef25af044
#
10个文件已添加
5个文件已修改
17个文件已删除
2536 ■■■■■ 已修改文件
pom.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/InboundOrderScheduler.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/LoginAuthenticationScheduler.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/ReviewOrderSyncScheduler.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/SaveOrderSyncScheduler.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/SubmitOrderSyncScheduler.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java 290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/LoginAuthenticationHandler.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/ReviewOrderSyncHandler.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/SubmitOrderSyncHandler.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/properties/SystemProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/entity/param/InFormIdParam.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/entity/param/LoginParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/enums/KingDeeUtilType.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/timer/LoginAuthenticationScheduler.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/timer/handler/LoginAuthenticationHandler.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/utils/KingDeeUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/erp/kingdee/utils/PostMesDataUtils.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/controller/KingdeeContorller.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/entity/AcctDto.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/entity/GatewayDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/entity/ReqParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/entity/ResDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/entity/ResParam.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/utils/K3ApiUtil.java 502 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/kingdee/utils/KingDeeUtils.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/apigwclient-0.1.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/kingdee-xw-openapi-1.0.0-jar-with-dependencies.jar 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/erpReceiving/erpReceiving.html 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -121,6 +121,20 @@
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>
        <dependency>
            <groupId>apigwclient</groupId>
            <artifactId>apigwclient</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/apigwclient-0.1.5.jar</systemPath>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>kingdee-xw-openapi</groupId>-->
<!--            <artifactId>kingdee-xw-openapi</artifactId>-->
<!--            <version>1.0.0</version>-->
<!--            <scope>system</scope>-->
<!--            <systemPath>${project.basedir}/src/main/resources/lib/kingdee-xw-openapi-1.0.0-jar-with-dependencies.jar</systemPath>-->
<!--        </dependency>-->
    </dependencies>
    <build>
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -8,6 +8,7 @@
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.MobileAdjustResult;
@@ -17,6 +18,7 @@
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.common.web.BaseController;
import com.zy.kingdee.utils.K3ApiUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -594,47 +596,53 @@
    @RequestMapping("/ddd/ddd")
    @ManagerAuth()
    public R ddd() {
        int w = 99999;
        for (int i = 17; i <= 37; i++) {
        for (int j = 8;j<=14;j++){
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 1));
            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 2));
            LocMast locMast3 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 3));
//            LocMast locMast4 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", 26).eq("bay1", i).eq("lev1", 1));
            if (locMast.getGro1() == 999){
                continue;
            }
//            locMast.setGro1(w);
//            locMast.setGro1(locMast.getGro1()+1000);
            locMast2.setGro1(locMast.getGro1()+1000);
            locMast3.setGro1(locMast.getGro1()+2000);
//            locMast4.setGro1(w);
//            locMastService.updateById(locMast);
            locMastService.updateById(locMast2);
            locMastService.updateById(locMast3);
//            locMastService.updateById(locMast4);
            w++;
        }
        }
//        for (int i = 17; i <=37; i++) {
//            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 3).eq("lev1", 1));
//            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 8).eq("lev1", 1));
//            LocMast locMast3 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 13).eq("lev1", 1));
////            LocMast locMast4 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 12).eq("lev1", 1));
//            if (!Cools.isEmpty(locMast)) {
//                locMast.setGro1(w);
//                locMastService.updateById(locMast);
//        int w = 99999;
//        for (int i = 17; i <= 37; i++) {
//        for (int j = 8;j<=14;j++){
//            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 1));
//            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 2));
//            LocMast locMast3 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", j).eq("lev1", 3));
////            LocMast locMast4 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", 26).eq("bay1", i).eq("lev1", 1));
//            if (locMast.getGro1() == 999){
//                continue;
//            }
//
//            locMast2.setGro1(w);
//            locMast3.setGro1(w);
////            locMast.setGro1(w);
////            locMast.setGro1(locMast.getGro1()+1000);
//            locMast2.setGro1(locMast.getGro1()+1000);
//            locMast3.setGro1(locMast.getGro1()+2000);
////            locMast4.setGro1(w);
//
////            locMastService.updateById(locMast);
//            locMastService.updateById(locMast2);
//            locMastService.updateById(locMast3);
////            locMastService.updateById(locMast4);
////            w++;
//            w++;
//        }
//        }
////        for (int i = 17; i <=37; i++) {
////            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 3).eq("lev1", 1));
////            LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 8).eq("lev1", 1));
////            LocMast locMast3 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 13).eq("lev1", 1));
//////            LocMast locMast4 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("row1", i).eq("bay1", 12).eq("lev1", 1));
////            if (!Cools.isEmpty(locMast)) {
////                locMast.setGro1(w);
////                locMastService.updateById(locMast);
////            }
////
////            locMast2.setGro1(w);
////            locMast3.setGro1(w);
//////            locMast4.setGro1(w);
////
////            locMastService.updateById(locMast2);
////            locMastService.updateById(locMast3);
//////            locMastService.updateById(locMast4);
//////            w++;
////        }
        return R.ok();
    }
src/main/java/com/zy/asrs/task/kingdee/InboundOrderScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/LoginAuthenticationScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/ReviewOrderSyncScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/SaveOrderSyncScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/SubmitOrderSyncScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/handler/LoginAuthenticationHandler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/handler/ReviewOrderSyncHandler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
File was deleted
src/main/java/com/zy/asrs/task/kingdee/handler/SubmitOrderSyncHandler.java
File was deleted
src/main/java/com/zy/common/properties/SystemProperties.java
@@ -64,7 +64,7 @@
    // 生成激活码
    public static void main(String[] args) {
        String timeStr = "2021-08-01 17:48:35";
        String timeStr = "2026-08-12 08:00:00";
        Date exprTime = DateUtils.convert(timeStr);
        String code = AesUtils.encrypt(DateUtils.convert(exprTime, DateUtils.yyyyMMddHHmmss), SystemProperties.SALT);
        System.out.println("激活码:"+code);
src/main/java/com/zy/erp/kingdee/entity/param/InFormIdParam.java
File was deleted
src/main/java/com/zy/erp/kingdee/entity/param/LoginParam.java
File was deleted
src/main/java/com/zy/erp/kingdee/enums/KingDeeUtilType.java
File was deleted
src/main/java/com/zy/erp/kingdee/timer/LoginAuthenticationScheduler.java
File was deleted
src/main/java/com/zy/erp/kingdee/timer/handler/LoginAuthenticationHandler.java
File was deleted
src/main/java/com/zy/erp/kingdee/utils/KingDeeUtil.java
File was deleted
src/main/java/com/zy/erp/kingdee/utils/PostMesDataUtils.java
File was deleted
src/main/java/com/zy/kingdee/controller/KingdeeContorller.java
New file
@@ -0,0 +1,114 @@
package com.zy.kingdee.controller;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.common.constant.ApiInterfaceConstant;
import com.zy.common.utils.HttpHandler;
import com.zy.kingdee.entity.ResDto;
import com.zy.kingdee.utils.K3ApiUtil;
import com.zy.kingdee.utils.KingDeeUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.internal.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController
@RequestMapping("kingdee")
@Slf4j
public class KingdeeContorller {
    @RequestMapping("/get/manufacturingorder/list")
    @ManagerAuth()
    public R getManufacturingorderList(@RequestParam(defaultValue = "1")Integer curr,
                                       @RequestParam(defaultValue = "10")Integer limit,
                                       @RequestParam(required = false)String orderByField,
                                       @RequestParam(required = false)String orderByType,
                                       @RequestParam(required = false)String condition,
                                       @RequestParam Map<String, Object> param) {
        if (null == K3ApiUtil.TokenRes){
            K3ApiUtil.init();
        }
        Map<String, String> map = new LinkedHashMap<>();
        map.put("access_token", K3ApiUtil.TokenRes.getAccessToken());
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("CurrentPage",curr);
        jsonMap.put("ItemsOfPage",limit);
        jsonMap.put("AccountDB","002");
        OffsetDateTime  time = OffsetDateTime.parse(param.get("time").toString());
        HashMap<Object, Object> map1 = new HashMap<>();
        String s = String.valueOf(time.toLocalDate());
        map1.put("Property","FPlanCommitDate");
        map1.put("Type","Desc");
        jsonMap.put("OrderBy",map1);
//        map.put("CurrentPage",1);
//        map.put("ItemsOfPage",10);
        String resStr = HttpRequest.post("api.kingdee.com" + "/koas/app007107/api/manufacturingorder/list" + K3ApiUtil.getMapStr(map))
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "TEST" + K3ApiUtil.getNonce(12))
                .header("KIS-TraceID", "TEST")
                .header("KIS-Ver", "1.0")
                .header("KIS-AuthData", K3ApiUtil.gatewayDto.getData().getAuthData())
                .header("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce")
                .header("X-GW-Router-Addr", K3ApiUtil.gatewayDto.getData().getGwRouterAddr())
                .contentType("application/json")
                .body(JSON.toJSONString(jsonMap))
                .execute()
                .body();
        JSONObject parseObject = JSON.parseObject(resStr);
        if (parseObject.get("errcode").hashCode() != 0) {
            throw new CoolException(parseObject.get("description").toString());
        }
//        Map<String, Object> headers = new HashMap<>();
//
//        headers.put("KIS-Timestamp",Long.toString(System.currentTimeMillis() / 1000L));
//        headers.put("KIS-State","TEST" + K3ApiUtil.getNonce(12));
//        headers.put("KIS-TraceID","TEST");
//        headers.put("KIS-Ver","1.0");
//        headers.put("KIS-AuthData",K3ApiUtil.kingDeeRes.getAppToken());
//
//        headers.put("X-GW-Router-Addr",K3ApiUtil.kingDeeRes.getDomain());
//        headers.put("Content-Type", "application/json;charset=utf-8");
//
//
//        try {
//            String response = new HttpHandler.Builder()
//                    .setUri("api.kingdee.com")
//                    .setPath("/koas/app007107/api/manufacturingorder/list")
//                    .setHeaders(headers)
//                    .setParams(map)
//                    .setJson(JSON.toJSONString(jsonMap))
//                    .build()
//                    .doPost();
//        }catch (Exception e){
//
//        }
        return R.ok(parseObject.get("data"));
    }
}
src/main/java/com/zy/kingdee/entity/AcctDto.java
New file
@@ -0,0 +1,59 @@
package com.zy.kingdee.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class AcctDto {
    private Integer errcode;
    private String description;
    private DataDTO data;
    @NoArgsConstructor
    @Data
    public static class DataDTO {
        private String uid;
        private List<OrglistDTO> orglist;
        @NoArgsConstructor
        @Data
        public static class OrglistDTO {
            private String tid;
            private String eid;
            private String orgname;
            private List<ProdinstlistDTO> prodinstlist;
            @NoArgsConstructor
            @Data
            public static class ProdinstlistDTO {
                private String pid;
                private String productname;
                private String productid;
                private String prodinstname;
                private String productshortname;
                private String onlineStatus;
                private Integer cloudmod;
                private Integer acctloginnum;
                private String expire;
                private String recent;
                private String openMobappStatus;
                private List<AccountlistDTO> accountlist;
                @NoArgsConstructor
                @Data
                public static class AccountlistDTO {
                    private String acctnumber;
                    private String acctname;
                    private String userid;
                    private String encid;
                    private String acctusername;
                    private String mobile;
                    private String isdemo;
                }
            }
        }
    }
}
src/main/java/com/zy/kingdee/entity/GatewayDto.java
New file
@@ -0,0 +1,28 @@
package com.zy.kingdee.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class GatewayDto {
    private Integer errcode;
    private String description;
    private DataDTO data;
    @NoArgsConstructor
    @Data
    public static class DataDTO {
        private String gateway;
        private String authData;
        private String gwRouterAddr;
        private ExtendDataDTO extendData;
        @NoArgsConstructor
        @Data
        public static class ExtendDataDTO {
            private String refreshAuthDataToken;
            private Integer refreshAuthDataTokenExpireIn;
        }
    }
}
src/main/java/com/zy/kingdee/entity/ReqParam.java
New file
@@ -0,0 +1,19 @@
package com.zy.kingdee.entity;
import lombok.Data;
@Data
public class ReqParam {
    private String msg;
    private String timeStamp;
    private String nonce;
    private String sign;
   public static ReqParam init(String timeStamp,String nonce){
       ReqParam reqParam = new ReqParam();
       reqParam.setTimeStamp(timeStamp);
       reqParam.setNonce(nonce);
       return reqParam;
   }
}
src/main/java/com/zy/kingdee/entity/ResDto.java
New file
@@ -0,0 +1,14 @@
package com.zy.kingdee.entity;
import lombok.Data;
import java.util.List;
@Data
public class ResDto {
    private Integer code;
    private String msg;
    private Integer errcode;
    private String description;
    private List<ResParam> data;
}
src/main/java/com/zy/kingdee/entity/ResParam.java
New file
@@ -0,0 +1,63 @@
package com.zy.kingdee.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class ResParam {
    private Long id;
    private String appKey;
    private String appSecret;
    private String oldAppSecret;
    private Integer status;
    private String accessToken;
    private String appToken;
    private String authCode;
    private String sessionId;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date expires;
    private String userNumber;
    private String serviceId;
    private String clientId;
    private String externalNumber;
    private String outerInstanceId;
    private String agreementCompanyName;
    private String agreementAuthProductType;
    private String agreementAdministratorName;
    private String agreementAdministratorAccountNumber;
    private String tenantId;
    private String accountId;
    private String uid;
    private Long tid;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date createTime;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date openTime;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date secretUpdateTime;
    private Boolean isBrand;
    private String brandSupplierId;
    private String groupName;
    private String accountName;
    private String domain;
    private String instanceId;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    private Date instanceExpiresTime;
    private Boolean isRetainData;
    private String trialOrderId;
    private Boolean isEncryptSensitiveData;
    private String ebxServiceId;
    private String ebxAccountId;
}
src/main/java/com/zy/kingdee/utils/K3ApiUtil.java
New file
@@ -0,0 +1,502 @@
package com.zy.kingdee.utils;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.smecloud.apigw.client.ApigwClient;
import com.smecloud.apigw.codec.GwURLEncoder;
import com.smecloud.apigw.constant.HttpMethod;
import com.smecloud.apigw.exception.ApiException;
import com.smecloud.apigw.model.ApiRequest;
import com.smecloud.apigw.model.ApigwConfig;
import com.smecloud.apigw.util.CommontUtil;
import com.smecloud.apigw.util.SHAUtil;
import com.zy.kingdee.entity.*;
import lombok.SneakyThrows;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.*;
import java.util.stream.Collectors;
public class K3ApiUtil {
    private static final String clientId = "320285";
    private static final String clientSecret = "bd29825057688ef40b1154057961a13b";
    private static final String HOST = "api.kingdee.com";
    private static final String instanceId = "436582290097836032";
    private static final String appKey = "KidEvrK8";
    private static final String[] DEFAULT_SIGNHEADERS = new String[]{"X-Api-Nonce", "X-Api-TimeStamp"};
    public static ResParam TokenRes = null;
    public static ResParam userRes = null;
    public static String authCode = null;
    public static String sessionId = null;
    public static AcctDto acctDto = null;
    public static GatewayDto gatewayDto = null;
    /**
     * 获取Nonce
     *
     * @param len
     * @return
     */
    public static String getNonce(int len) {
        StringBuilder rs = new StringBuilder();
        for (int i = 0; i < len; ++i) {
            rs.append(new SecureRandom().nextInt(10));
        }
        return rs.toString();
    }
    /**
     * 获取url转码格式
     *
     * @param path
     * @return
     */
    private static String getPathEncode(String path) {
        try {
            return GwURLEncoder.encode(path, StandardCharsets.UTF_8.toString());
        } catch (Exception var3) {
            Exception e = var3;
            throw new ApiException(e);
        }
    }
    /**
     * 获取拼接参数转码格式
     *
     * @param querys
     * @return
     */
    private static String getQueryEncode(Map<String, String> querys) {
        try {
            if (CommontUtil.isEmpty(querys)) {
                return "";
            } else {
                List<String> list = new ArrayList(querys.size());
                Iterator var3 = querys.entrySet().iterator();
                while (var3.hasNext()) {
                    Map.Entry<String, String> entry = (Map.Entry) var3.next();
                    String key = GwURLEncoder.encode((String) entry.getKey(), StandardCharsets.UTF_8.toString());
                    String value = URLEncoder.encode((String) entry.getValue(), StandardCharsets.UTF_8.toString());
                    list.add(key + "=" + value);
                }
                Collections.sort(list);
                String rawQueryString = String.join("&", list);
                String[] queryStrings = rawQueryString.split("&");
                list.clear();
                String[] var16 = queryStrings;
                int var17 = queryStrings.length;
                for (int var7 = 0; var7 < var17; ++var7) {
                    String param = var16[var7];
                    int index = param.indexOf("=");
                    if (index >= 1) {
                        String key = GwURLEncoder.encode(param.substring(0, index), StandardCharsets.UTF_8.toString());
                        String value = GwURLEncoder.encode(param.substring(index + 1), StandardCharsets.UTF_8.toString());
                        list.add(key + "=" + value);
                    }
                }
                return String.join("&", list);
            }
        } catch (Exception var12) {
            Exception e = var12;
            throw new ApiException(e);
        }
    }
    /**
     * 获取加密签名
     *
     * @param method
     * @param path
     * @param query
     * @param signatureHeaders
     * @param headers
     * @return
     */
    private static String getSign(String method, String path, String query, String[] signatureHeaders, Map<String, String> headers) {
        StringBuilder b = new StringBuilder();
        b.append(method);
        b.append("\n");
        b.append(path);
        b.append("\n");
        b.append(query);
        b.append("\n");
        String[] var7 = signatureHeaders;
        int var8 = signatureHeaders.length;
        for (int var9 = 0; var9 < var8; ++var9) {
            String x = var7[var9];
            b.append(x.toLowerCase());
            b.append(":");
            b.append((String) headers.get(x));
            b.append("\n");
        }
        String s = SHAUtil.SHA256HMAC(b.toString(), clientSecret);
        return s != null ? Base64.getEncoder().encodeToString(s.getBytes()) : "";
    }
    /**
     * 获取加密后结果
     *
     * @return
     */
    public static String getSecretStr(String key, String secret) {
        String s = SHAUtil.SHA256HMAC(key, secret);
        return s != null ? Base64.getEncoder().encodeToString(s.getBytes()) : "";
    }
    public static String getMapStr(Map<String, String> map) {
        if (map == null) {
            return "";
        }
        StringBuilder b = new StringBuilder("?");
        String str = map.keySet().stream().map(key ->
        {
            try {
                return GwURLEncoder.encode(key, StandardCharsets.UTF_8.toString()) + "=" + GwURLEncoder.encode(map.get(key), StandardCharsets.UTF_8.toString());
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }).collect(Collectors.joining("&"));
        b.append(str);
        return b.toString();
    }
    /**
     * 初始化网关
     *
     * @return
     */
    private static ApigwConfig initConfig() {
        ApigwConfig config = new ApigwConfig();
        //设置client_id
        config.setClientID(clientId);
        //设置client_secret
        config.setClientSecret(clientSecret);
        ApigwClient apigwClient = ApigwClient.getInstance();
        //初始化API网关客户端
        apigwClient.init(config);
        return config;
    }
    /**
     * 获取签名
     *
     * @param method
     * @param url
     * @param querys
     * @return
     */
    public static ReqParam getSignature(HttpMethod method, String url, Map<String, String> querys) {
        //初始化API网关客户端
        ApigwConfig config = initConfig();
        ApiRequest request = new ApiRequest(method, HOST, url);
        request.setQuerys(querys);
        request.setBodyJson(JSONObject.toJSONString("").getBytes());
        //初始回参
        ReqParam res = ReqParam.init(Long.toString(System.currentTimeMillis()), getNonce(10));
        request.addHeader("X-Api-ClientID", config.getClientID());
        request.addHeader("X-Api-Auth-Version", "2.0");
        request.addHeader("X-Api-TimeStamp", res.getTimeStamp());
        request.addHeader("X-Api-Nonce", res.getNonce());
        request.addHeader("X-Api-SignHeaders", String.join(",", DEFAULT_SIGNHEADERS));
        String sign = getSign(request.getMethod().getValue(), getPathEncode(request.getPath()), getQueryEncode(request.getQuerys()), DEFAULT_SIGNHEADERS, request.getHeaders());
        request.setSignature(sign);
        request.addHeader("X-Api-Signature", sign);
        res.setSign(sign);
        return res;
    }
    /**
     * 获取验证
     *
     * @return
     */
    @SneakyThrows
    public static ResParam getAuthorize() {
        String url = "/jdyconnector/app_management/push_app_authorize";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("outerInstanceId", instanceId);
        String pathParamStr = getMapStr(map);
        //获取接口参数
        ReqParam req = K3ApiUtil.getSignature(HttpMethod.POST_BODY, url, map);
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("X-Api-ClientID", clientId)
                .header("X-Api-Auth-Version", "2.0")
                .header("X-Api-TimeStamp", req.getTimeStamp())
                .header("X-Api-Nonce", req.getNonce())
                .header("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce")
                .header("X-Api-Signature", req.getSign())
                .execute()
                .body();
        ResDto res = JSONObject.parseObject(resStr, ResDto.class);
        if (res.getCode() != 200) {
            throw new RuntimeException(res.getMsg());
        }
//        System.out.println("testGetAuth():" + resStr);
        userRes = res.getData().get(0);
        return res.getData().get(0);
    }
    /**
     * 获取验证
     *
     * @return
     */
    @SneakyThrows
    public static ResParam getToken() {
        //获取授权
        ResParam authorizeRes = getAuthorize();
        String url = "/jdyconnector/app_management/kingdee_auth_token";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("app_key", authorizeRes.getAppKey());
        String secretStr = getSecretStr(authorizeRes.getAppKey(), authorizeRes.getAppSecret());
        map.put("app_signature", secretStr);
        String pathParamStr = getMapStr(map);
        //获取接口参数
        ReqParam req = K3ApiUtil.getSignature(HttpMethod.GET, url, map);
        String resStr = HttpRequest.get(HOST + url + pathParamStr)
                .header("X-Api-ClientID", clientId)
                .header("X-Api-Auth-Version", "2.0")
                .header("X-Api-TimeStamp", req.getTimeStamp())
                .header("X-Api-Nonce", req.getNonce())
                .header("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce")
                .header("X-Api-Signature", req.getSign())
                .execute()
                .body();
        ResDto res = JSONObject.parseObject(resStr, ResDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
        ResParam resParam = res.getData().get(0);
        resParam.setDomain(authorizeRes.getDomain());
//        System.out.println("testGetToken():" + resStr);
        TokenRes = resParam;
        return resParam;
    }
    @SneakyThrows
    public static String getAuthCode() {
        String url = "/koas/user/auth_code";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("access_token", TokenRes.getAccessToken());
        String pathParamStr = getMapStr(map);
        //body
        //请求
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "vfun" + getNonce(12))
                .header("KIS-TraceID", "vfun10086")
                .header("KIS-Ver", "1.0")
                .contentType("application/json")
                .execute()
                .body();
        ResDto res = JSONObject.parseObject(resStr, ResDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
    //        System.out.println("testSendMsg():" + resStr);
        authCode = res.getData().get(0).getAuthCode();
        return res.getData().get(0).getAuthCode();
    }
    @SneakyThrows
    public static String getSessionId() {
        String url = "/koas/user/auth_code_login_access_token";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("client_id", clientId);
        map.put("client_secret",clientSecret);
        String pathParamStr = getMapStr(map);
        //body
        HashMap<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("auth_code",authCode);
        //请求
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "WMS" + getNonce(12))
                .header("KIS-TraceID", "WMS")
                .header("KIS-Ver", "1.0")
                .contentType("application/json")
                .body(JSON.toJSONString(bodyMap))
                .execute()
                .body();
        ResDto res = JSONObject.parseObject(resStr, ResDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
        sessionId = res.getData().get(0).getSessionId();
        return res.getData().get(0).getSessionId();
    }
    @SneakyThrows
    public static AcctDto getAcctNumber() {
        String url = "/koas/user/account";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("access_token", TokenRes.getAccessToken());
        String pathParamStr = getMapStr(map);
        //body
        HashMap<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("session_id",sessionId);
        //请求
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "WMS" + getNonce(12))
                .header("KIS-TraceID", "WMS")
                .header("KIS-Ver", "1.0")
                .contentType("application/json")
                .body(JSON.toJSONString(bodyMap))
                .execute()
                .body();
        AcctDto res = JSONObject.parseObject(resStr, AcctDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
        acctDto = res;
        return res;
    }
    @SneakyThrows
    public static String getIcrmId() {
        String url = "/koas/user/account_applist";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("access_token", TokenRes.getAccessToken());
        String pathParamStr = getMapStr(map);
        //body
        HashMap<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("session_id",sessionId);
        bodyMap.put("client_id", clientId);
        bodyMap.put("acctnumber",acctDto.getData().getOrglist().get(0).getProdinstlist().get(0).getAccountlist().get(0).getAcctnumber());
        //请求
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "wmss" + getNonce(12))
                .header("KIS-TraceID", "wmss")
                .header("KIS-Ver", "1.0")
                .contentType("application/json")
                .body(JSON.toJSONString(bodyMap))
                .execute()
                .body();
        ResDto res = JSONObject.parseObject(resStr, ResDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
        return "";
    }
    @SneakyThrows
    public static String getServiceGateway() {
        String url = "/koas/user/get_service_gateway";
        //URL ?拼接字段
        Map<String, String> map = new LinkedHashMap<>();
        map.put("access_token", TokenRes.getAccessToken());
        String pathParamStr = getMapStr(map);
        //body
        HashMap<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("session_id",sessionId);
        bodyMap.put("pid", acctDto.getData().getOrglist().get(0).getProdinstlist().get(0).getPid());
        bodyMap.put("acctnumber",acctDto.getData().getOrglist().get(0).getProdinstlist().get(0).getAccountlist().get(0).getAcctnumber());
        bodyMap.put("icrmid","2c9223b083cc0f130183e4c32be01544");
        //请求
        String resStr = HttpRequest.post(HOST + url + pathParamStr)
                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
                .header("KIS-State", "wmss" + getNonce(12))
                .header("KIS-TraceID", "wmss")
                .header("KIS-Ver", "1.0")
                .contentType("application/json")
                .body(JSON.toJSONString(bodyMap))
                .execute()
                .body();
        GatewayDto res = JSONObject.parseObject(resStr, GatewayDto.class);
        if (res.getErrcode() != 0) {
            throw new RuntimeException(res.getDescription());
        }
        gatewayDto = res;
        return "SUCCESS";
    }
    public static void init(){
        getToken();
        getAuthCode();
        getSessionId();
        getAcctNumber();
        getServiceGateway();
    }
    public static void main(String[] args) {
        getToken();
        getAuthCode();
        getSessionId();
        getAcctNumber();
        getServiceGateway();
//        getIcrmId();
    }
    /**
     * 单据审核接口
     * @param FClassTypeID 外购入库(1001), 销售出库(1021),采购申请(1070) ,销售订单(1081),产品入库(1002),调拨单(1041) ,生产领料单(1024),采购订单 (1071)
     * @param FInterID 单据ID
     * @return
     */
//    @SneakyThrows
//    @Deprecated
//    public static ResDto checkK3Vouch(Integer FClassTypeID, Integer FInterID) {
//        ResParam tokenRes = getToken();
//        String url = "/koas/APP007720/api/approve/submit";
//        //URL ?拼接字段
//        Map<String, String> map = new LinkedHashMap<>();
//        map.put("access_token", tokenRes.getAccessToken());
//        String pathParamStr = getMapStr(map);
//        //body
//        String bodyJson = VouchCheckDto.convertToQueryJson(FClassTypeID, FInterID);
//        //请求
//        String resStr = HttpRequest.post(HOST + url + pathParamStr)
//                .header("KIS-Timestamp", Long.toString(System.currentTimeMillis() / 1000L))
//                .header("KIS-State", "vfun" + getNonce(12))
//                .header("KIS-TraceID", "vfun10086")
//                .header("KIS-Ver", "1.0")
//                .header("KIS-AuthData", tokenRes.getAppToken())
//                .header("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce")
//                .header("X-GW-Router-Addr", tokenRes.getDomain())
//                .body(bodyJson)
//                .execute()
//                .body();
//        ResDto res = ObjUtil.parseObject(resStr, ResDto.class);
//        if (res.getErrcode() != 0) {
//            throw new RuntimeException(res.getDescription());
//        }
////        System.out.println("testSendMsg():" + resStr);
//        return res;
//    }
}
src/main/java/com/zy/kingdee/utils/KingDeeUtils.java
New file
@@ -0,0 +1,118 @@
package com.zy.kingdee.utils;
import com.smecloud.apigw.util.SHAUtil;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.TreeMap;
@Slf4j
public class KingDeeUtils {
    public static String generateSignature(String method,
                                           String path,
                                           Map<String, String> params,
                                           Map<String, String> headers,
                                           String appSecret) throws Exception {
        // 1. 处理请求方法(转大写)
        String processedMethod = method.toUpperCase();
        // 2. 处理路径(URL编码+大写)
        String processedPath = encodePath(path);
        // 3. 处理请求参数(双重URL编码+ASCII排序+大写)
        String processedParams = processParams(params);
        // 4. 处理请求头(提取特定参数)
        String nonce = headers.getOrDefault("x-api-nonce", "");
        String timestamp = headers.getOrDefault("x-api-timestamp", "");
        // 5. 构建签名原文
        String signSource = buildSignSource(processedMethod, processedPath, processedParams, nonce, timestamp);
        log.info("签名原文:\n"+signSource);
        // 6. 计算HMAC-SHA256签名
        return hmacSha256(appSecret, signSource);
    }
    private static String encodePath(String path) {
        try {
            // 只对路径部分进行URL编码(不包含协议/域名)
            String[] parts = path.split("://", 2);
            String toEncode = parts.length > 1 ? parts[1].substring(parts[1].indexOf('/')) : path;
            return URLEncoder.encode(toEncode, StandardCharsets.UTF_8.name()).toUpperCase();
        } catch (Exception e) {
            throw new RuntimeException("Path encoding failed", e);
        }
    }
    private static String processParams(Map<String, String> params) {
        if (params == null || params.isEmpty()) {
            return "";
        }
        // 按参数名ASCII升序排序
        TreeMap<String, String> sortedParams = new TreeMap<>(params);
        StringBuilder sb = new StringBuilder();
        try {
            for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
                if (sb.length() > 0) {
                    sb.append('&');
                }
                // 双重URL编码(每次编码后转大写)
                String key = doubleUrlEncode(entry.getKey());
                String value = doubleUrlEncode(entry.getValue());
                sb.append(key).append('=').append(value);
            }
        } catch (Exception e) {
            throw new RuntimeException("Parameter encoding failed", e);
        }
        return sb.toString();
    }
    private static String doubleUrlEncode(String s) throws Exception {
        if (s == null) return "";
        String firstEncode = URLEncoder.encode(s, StandardCharsets.UTF_8.name());
        return URLEncoder.encode(firstEncode, StandardCharsets.UTF_8.name());
    }
    private static String buildSignSource(String method,
                                          String path,
                                          String params,
                                          String nonce,
                                          String timestamp) {
        return method + "\n" +
                path + "\n" +
                params + "\n" +
                "x-api-nonce:" + nonce + "\n" +
                "x-api-timestamp:" + timestamp + "\n";  // 注意结尾的换行符
    }
    private static String hmacSha256(String secret, String message) throws Exception {
        Mac sha256 = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
        sha256.init(secretKey);
        byte[] hash = sha256.doFinal(message.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hash);
    }
    private static String hmacSha256_16(String secret, String message) throws Exception {
        String appSignature = SHAUtil.SHA256HMAC(message, secret);
        appSignature = Base64.getEncoder().encodeToString(appSignature.getBytes());
        return appSignature;
    }
    // 测试示例
    public static void main(String[] args) throws Exception {
        // 示例数据
        System.out.println("X-Api-Signature: " + hmacSha256_16("abc123","abc"));
    }
}
src/main/resources/application.yml
@@ -105,4 +105,8 @@
  url: ""
  taskCreatePath: ""
shuttleWcs:
  url: "10.0.100.140:8088/wcs"
  url: "10.0.100.140:8088/wcs"
kingdee:
  client_id: 320285
  client_secret: bd29825057688ef40b1154057961a13b
  app_key: KidEvrK8
src/main/resources/lib/apigwclient-0.1.5.jar
Binary files differ
src/main/resources/lib/kingdee-xw-openapi-1.0.0-jar-with-dependencies.jar
Binary files differ
src/main/webapp/views/erpReceiving/erpReceiving.html
@@ -14,9 +14,21 @@
    <div id="app">
        <el-card>
        <el-form :inline="true">
            <el-form-item label="开工日期">
                <el-date-picker
                        v-model="tableSearchParam.time"
                        type="date"
                        placeholder="选择日期"
                        :default-value="defaultTime"
                />
            </el-form-item>
            <el-form-item label="生产单号">
                <el-input v-model="tableSearchParam.produce_no" placeholder="请输入生产单号"></el-input>
            </el-form-item>
            <el-form-item label="车间">
                <el-input v-model="tableSearchParam.produce_no" placeholder="请输入生产单号"></el-input>
            </el-form-item>
            <el-form-item label="">
                <el-button type="primary" @click="page" circle >
                    <el-icon><Search /></el-icon>
@@ -42,27 +54,27 @@
            </el-table-column>
            <el-table-column type="index" width="50" >
            </el-table-column>
            <el-table-column prop="produceNo" label="生产单号" >
            <el-table-column prop="Head.FSourceBillNo" label="生产单号" >
            </el-table-column>
            <el-table-column prop="jobNo" label="任务单号">
            <el-table-column prop="Head.FBillNo" label="任务单号">
            </el-table-column>
            <el-table-column prop="matnr" label="物料编码">
            <el-table-column prop="Head.FItemID" label="物料编码">
            </el-table-column>
            <el-table-column prop="name" label="物料名称">
            <el-table-column prop="Head.FItemID" label="物料名称">
            </el-table-column>
            <el-table-column prop="specs" label="规格">
            <el-table-column prop="Head.FSourceBillNo" label="规格">
            </el-table-column>
            <el-table-column prop="workshop" label="车间">
            <el-table-column prop="Head.FWorkShop" label="车间">
            </el-table-column>
            <el-table-column prop="anfme" label="数量">
            <el-table-column prop="Head.Fauxqty" label="数量">
            </el-table-column>
            <el-table-column prop="startTime" label="计划开工时间">
            <el-table-column prop="Head.FPlanCommitDate" label="计划开工时间">
            </el-table-column>
            <el-table-column prop="endTime" label="计划完工时间">
            <el-table-column prop="Head.FPlanFinishDate" label="计划完工时间">
            </el-table-column>
            <el-table-column prop="sync" label="是否同步">
            <el-table-column prop="Head.FSourceBillNo" label="是否同步">
            </el-table-column>
            <el-table-column prop="matnrReturn" label="是否退料">
            <el-table-column prop="Head.FSourceBillNo" label="是否退料">
            </el-table-column>
        </el-table>
            <div style="margin-top: 10px">
@@ -91,13 +103,15 @@
        const app = createApp({
            setup() {
                const currentPage = ref(1)
                const pageSizes = ref([16, 30, 50, 100, 150, 200])
                const pageSize = ref(16)
                const pageSizes = ref([10, 20, 30, 50, 100, 200])
                const pageSize = ref(10)
                const pageTotal = ref(0)
                const tableSearchParam = ref({
                    produce_no: null
                    produce_no: null,
                    time: new Date()
                })
                const tableData = ref([])
                const defaultTime = ref(new Date())
                
                function page(){
                    let data = JSON.parse(JSON.stringify(tableSearchParam.value))
@@ -108,7 +122,7 @@
                        data.create_time = tableSearchParam.value.datetime[0] + " - " + tableSearchParam.value.datetime[1]
                    }
                    $.ajax({
                        url: baseUrl + "/erpReceiving/list/auth",
                        url: baseUrl + "/kingdee/get/manufacturingorder/list",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
@@ -118,12 +132,12 @@
                        method: 'GET',
                        success: function(res) {
                            if (res.code == 200) {
                                tableData.value = res.data.records
                                pageTotal.value = res.data.total
                                tableData.value = res.data.List
                                pageTotal.value = res.data.TotalItems
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                ElMessage({
                                ElementPlus.ElMessage({
                                    message: res.msg,
                                    type: 'error'
                                });
@@ -157,6 +171,7 @@
                    pageSize,
                    pageTotal,
                    tableSearchParam,
                    defaultTime,
                    page,
                    handleSizeChange,
                    handleCurrentChange,