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.jarBinary files differ
src/main/resources/lib/kingdee-xw-openapi-1.0.0-jar-with-dependencies.jarBinary 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,