Bläddra i källkod

华高新增定时同步序列号主档接口

wzy 3 månader sedan
förälder
incheckning
c40929b0b2

+ 21 - 0
mjava-huagao/pom.xml

@@ -63,6 +63,27 @@
             <version>1.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>k3cloud</artifactId>
+            <version>8.0.6</version>
+            <scope>test</scope>
+        </dependency>
+        <!--金蝶-->
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>k3cloud</artifactId>
+            <version>8.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 18 - 0
mjava-huagao/src/main/java/com/malk/huagao/KdEntity/BillQuery.java

@@ -0,0 +1,18 @@
+package com.malk.huagao.KdEntity;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class BillQuery {
+    private String FormId;
+    private String FieldKeys;
+    private List<Map> FilterString;
+    private String OrderString;
+    private int TopRowCount;
+    private int StartRow;
+    private int Limit;
+    private String SubSystemId;
+}

+ 14 - 0
mjava-huagao/src/main/java/com/malk/huagao/KdEntity/View.java

@@ -0,0 +1,14 @@
+package com.malk.huagao.KdEntity;
+
+import lombok.Data;
+
+@Data
+public class View {
+    private int CreateOrgId;
+
+    private String Number;
+
+    private String Id;
+
+    private Boolean IsSortBySeq;
+}

+ 24 - 0
mjava-huagao/src/main/java/com/malk/huagao/config/KDWebApiConf.java

@@ -0,0 +1,24 @@
+package com.malk.huagao.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "kingdee")
+@Slf4j
+public class KDWebApiConf {
+
+    private String XKDApiAcctID;
+
+    private String XKDApiUserName;
+
+    private String XKDApiAppID;
+
+    private String XKDApiAppSec;
+
+    private String XKDApiServerUrl;
+
+}

+ 29 - 0
mjava-huagao/src/main/java/com/malk/huagao/config/KDWebApiConfig.java

@@ -0,0 +1,29 @@
+package com.malk.huagao.config;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class KDWebApiConfig {
+    private Properties properties = new Properties();
+
+    public KDWebApiConfig(String filePath) throws IOException {
+        try (FileInputStream input = new FileInputStream(filePath)) {
+            properties.load(input);
+        }
+    }
+
+    public String getProperty(String key) {
+        return properties.getProperty(key);
+    }
+
+    public static void main(String[] args) {
+        try {
+            KDWebApiConfig config = new KDWebApiConfig("mjava-huagao/src/main/resources/application-dev.yml");
+            System.out.println("AcctID: " + config.getProperty("X-KDApi-AcctID"));
+            // 打印其他属性...
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 18 - 0
mjava-huagao/src/main/java/com/malk/huagao/config/StartupRunner.java

@@ -0,0 +1,18 @@
+package com.malk.huagao.config;
+
+import com.malk.huagao.service.McProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StartupRunner implements ApplicationRunner {
+
+    @Autowired
+    private McProjectService mcProjectService;
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        mcProjectService.init();
+    }
+}

+ 27 - 0
mjava-huagao/src/main/java/com/malk/huagao/schedule/KdScheduleTask.java

@@ -0,0 +1,27 @@
+package com.malk.huagao.schedule;
+
+import com.malk.huagao.service.KdHuaGaoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class KdScheduleTask {
+    @Autowired
+    private KdHuaGaoService kdHuaGaoService;
+
+    //每周五 18:00定时同步序列号主档
+    @Scheduled(cron = "0 0 18 * * 5")
+    public void syncBDSerialMainFile(){
+        kdHuaGaoService.syncBDSerialMainFile();//
+    }
+}

+ 3 - 0
mjava-huagao/src/main/java/com/malk/huagao/schedule/ScheduleTask.java

@@ -10,6 +10,7 @@ import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Configuration;
@@ -94,6 +95,8 @@ public class ScheduleTask {
      */
     @Scheduled(cron = "0 0/5 * * * ?")
     public void sync() {
+        MDC.put("MDC_KEY_PID","1001");
+
         List<Map> list=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-0D560B9D8B64464C8C885FE20B7C7C95T4IA").pageSize(1)
                 .searchFieldJson(JSONObject.toJSONString(UtilMap.map("selectField_m8nud6t3","待处理"))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
         log.info("手动同步查询-结果,{}",list.size());

+ 6 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/KdHuaGaoService.java

@@ -0,0 +1,6 @@
+package com.malk.huagao.service;
+
+public interface KdHuaGaoService {
+    void syncBDSerialMainFile();
+
+}

+ 7 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/McProjectService.java

@@ -0,0 +1,7 @@
+package com.malk.huagao.service;
+
+public interface McProjectService {
+
+    void init();
+
+}

+ 9 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/HuaGaoServiceImpl.java

@@ -24,6 +24,7 @@ import com.malk.service.fxiaoke.FXKClient;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -65,6 +66,8 @@ public class HuaGaoServiceImpl implements HuaGaoService {
 
     @Override
     public void syncKqData(LocalDateTime startTime, LocalDateTime endTime) {
+        MDC.put("MDC_KEY_PID","1001");
+
         String stTime=UtilDateTime.formatLocal(startTime,UtilDateTime.DATE_TIME_PATTERN);
         String edTime=UtilDateTime.formatLocal(endTime,UtilDateTime.DATE_TIME_PATTERN);
         List<Map> list=ydService.queryAllFormData(YDParam.builder().formUuid("FORM-5061F7AE543B429C8241EC730A6F31653NNK").build());
@@ -122,6 +125,8 @@ public class HuaGaoServiceImpl implements HuaGaoService {
 
     @Override
     public void upsertNonProdPrice(Map map) {
+        MDC.put("MDC_KEY_PID","1001");
+
         String formInstId = UtilMap.getString(map, "formInstId");
 
         Map formData = ydClient.queryData(YDParam.builder()
@@ -159,6 +164,8 @@ public class HuaGaoServiceImpl implements HuaGaoService {
 
     @Override
     public void upsertWorkHoursPrice(Map map) {
+        MDC.put("MDC_KEY_PID","1001");
+
         String formInstId = UtilMap.getString(map, "formInstId");
 
         Map formData = ydClient.queryData(YDParam.builder()
@@ -187,6 +194,8 @@ public class HuaGaoServiceImpl implements HuaGaoService {
 
     @Override
     public void updateWorkHours(Map map1) {
+        MDC.put("MDC_KEY_PID","1001");
+
         String formInstId = UtilMap.getString(map1, "formInstId");
 
         Map processInstance = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), formInstId);

+ 215 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java

@@ -0,0 +1,215 @@
+package com.malk.huagao.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.huagao.KdEntity.BillQuery;
+import com.malk.huagao.KdEntity.View;
+import com.malk.huagao.config.KDWebApiConf;
+import com.malk.huagao.service.KdHuaGaoService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.temporal.WeekFields;
+import java.util.*;
+
+import static org.junit.Assert.fail;
+
+@Service
+public class KdHuaGaoServiceImpl implements KdHuaGaoService {
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private YDClient ydClient;
+
+    //在库状态
+    private static final Map<String,String> STOCK_STATUS = new HashMap<>();
+    static{
+        STOCK_STATUS.put("0","待入库");
+        STOCK_STATUS.put("1","在库");
+        STOCK_STATUS.put("2","待出库");
+        STOCK_STATUS.put("3","出库");
+        STOCK_STATUS.put("4","待售出");
+        STOCK_STATUS.put("5","售出");
+        STOCK_STATUS.put("6","待退料");
+        STOCK_STATUS.put("7","退料");
+    }
+
+    @Override
+    public void syncBDSerialMainFile() {
+        MDC.put("MDC_KEY_PID","1002");
+
+        try {
+            K3CloudApi client = new K3CloudApi(initIden());
+
+            int startRow = 0;
+            int limit = 2000;
+
+            BillQuery billQuery = new BillQuery();
+
+            billQuery.setLimit(limit);
+            billQuery.setFormId("BD_SerialMainFile");
+            billQuery.setFieldKeys("FNumber");
+            List<Map> filterString = new ArrayList<>();
+            //仓库等于成品仓 仓位等于默认仓位或样机仓位 在库状态等于待入库或在库
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockId.FName","67","成品仓","","","0"));//仓库名称等于XX
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","默认仓位","(","","1"));//仓位等于XX
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","样机仓位","",")","0"));//仓位等于XX
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","0","(","","1"));//在库状态等于XX
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","1","",")","0"));//在库状态等于XX
+
+            billQuery.setFilterString(filterString);
+
+            List<Map> result = new ArrayList<>();
+            List<Map> list = new ArrayList<>();
+
+            do {
+                billQuery.setStartRow(startRow);
+                String s = client.billQuery(JSONObject.toJSONString(billQuery));
+                result = (List<Map>)JSONObject.parse(s);
+                list.addAll(result);
+
+                startRow += limit;
+            }while (result.size() == limit);
+
+            for (Map map : list) {
+                String FNumber = UtilMap.getString(map,"FNumber");
+
+                //查找序列号主档具体信息
+                View view = new View();
+                view.setNumber(FNumber);
+                String resultJson = client.view("BD_SerialMainFile", JSONObject.toJSONString(view));
+                Gson gson = new Gson();
+                RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+                if (isTrue(repoRet)){
+                    Map formData = new HashMap();
+
+                    Map serialMainFileInfo = (Map) repoRet.getResult().getResult();
+
+                    formData.put("textField_mev1n46z",UtilMap.getString(serialMainFileInfo, "Number"));//序列号
+                    formData.put("textField_mev1n470",getNumber(UtilMap.getMap(serialMainFileInfo,"MaterialID")));//物料编码
+                    formData.put("textField_mev1n471",getMultiLanguageTextName(UtilMap.getMap(serialMainFileInfo,"MaterialID")));//物料名称
+                    formData.put("textField_mev1n472",getMultiLanguageTextSpecification(UtilMap.getMap(serialMainFileInfo,"MaterialID")));//规格型号
+                    formData.put("textField_mev1n477",getMultiLanguageTextName(UtilMap.getMap(UtilMap.getMap(serialMainFileInfo,"MaterialID"),"F_QUXZ_Assistant")));//所属系列
+                    double zkts = UtilMap.getDouble(serialMainFileInfo, "FZKTS") == 0.0 ? 1.0 : UtilMap.getDouble(serialMainFileInfo, "FZKTS");
+                    formData.put("numberField_mev1n478", zkts);//在库天数
+
+                    List<Map> bdSerialmasterorg = UtilMap.getList(serialMainFileInfo, "BD_SERIALMASTERORG");
+                    String stockStatus = STOCK_STATUS.get(UtilMap.getString(bdSerialmasterorg.get(0), "StockStatus"));
+                    formData.put("textField_mev1n476", stockStatus);//在库状态
+
+                    List<Map> bdSerialmasterother = UtilMap.getList(serialMainFileInfo, "BD_SERIALMASTEROTHER");
+                    formData.put("textField_mev1n473",getMultiLanguageTextName(UtilMap.getMap((bdSerialmasterother).get(0),"StockId")));//仓库
+                    formData.put("textField_mev1n474",getMultiLanguageTextName(UtilMap.getMap(UtilMap.getMap((bdSerialmasterother).get(0),"StockLocId"),"F100001")));//仓库
+                    formData.put("textField_mev1n475",getMultiLanguageTextName(UtilMap.getMap((bdSerialmasterother).get(0),"CustId")));//客户
+
+                    //在库天数分类
+                    int zktsfl = 1;
+                    if ("待入库".equals(stockStatus)){
+                        zktsfl = 1;
+                    }else {
+                        if (zkts <= 30){
+                            zktsfl = 2;
+                        }else if (zkts <= 60){
+                            zktsfl = 3;
+                        }else if (zkts <= 90){
+                            zktsfl = 4;
+                        }else {
+                            zktsfl = 5;
+                        }
+                    }
+                    formData.put("selectField_mf205zr0",zktsfl);
+
+                    // 获取当前日期
+                    LocalDate today = LocalDate.now();
+                    int year = today.getYear();//获取当前年份
+                    int month = today.getMonthValue();//当前月份
+                    WeekFields weekFields = WeekFields.of(Locale.getDefault());
+                    int weekOfMonth = today.get(weekFields.weekOfMonth());//当前日期是当月的第几周
+
+                    formData.put("numberField_mev270x6",year);
+                    formData.put("numberField_mev270x5",month);
+                    formData.put("textField_mev2ers5",weekOfMonth);
+
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-3B2E5C93D7E6494B9AD920B48A90159F7DZ4")
+                            .formDataJson(JSONObject.toJSONString(formData))
+                            .build(), YDConf.FORM_OPERATION.create);
+                }
+            }
+        }catch (Exception e){
+            fail(e.getMessage());
+        }
+
+    }
+
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+
+    private boolean isTrue(RepoRet repoRet){
+        Gson gson = new Gson();
+
+        if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
+            System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
+            return true;
+        } else {
+            fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
+            return false;
+        }
+    }
+
+    private String getMultiLanguageTextName(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+            List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
+            String value = UtilMap.getString(multiLanguageText.get(0),"Name");
+
+            return value;
+        }
+        return null;
+    }
+
+    private String getMultiLanguageTextSpecification(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+            List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
+            String value = UtilMap.getString(multiLanguageText.get(0),"Specification");
+
+            return value;
+        }
+        return null;
+    }
+
+    private String getNumber(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+
+            String value = UtilMap.getString(map,"Number");
+
+            return value;
+        }
+        return null;
+    }
+}

+ 26 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/McProjectServiceImpl.java

@@ -0,0 +1,26 @@
+package com.malk.huagao.service.impl;
+
+import com.malk.core.McProject;
+import com.malk.huagao.service.McProjectService;
+import com.malk.service.aliwork.YDClient;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class McProjectServiceImpl implements McProjectService {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Override
+    public void init() {
+        MDC.put("MDC_KEY_PID","1001");
+        McProject.addYida("1001",new String[] {"APP_BWPT6ET90UEE8IBEY9GJ","37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q"});//投入产出比看板
+        McProject.addYida("1002",new String[] {"APP_YONR16SZSUIZCKXJUNSY","TNA66KB1AEDXKQHQ8IJBG53BDW7Q27TM33HDMADI"});//数据分析看板
+        McProject.addYida("1003",new String[] {"APP_VQDMMWS6OR1VHL8VMFD3","XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2"});//华高CRM
+        log.info("项目加载完毕:1001,1002,1003");
+    }
+}

+ 20 - 0
mjava-huagao/src/main/resources/application-dev.yml

@@ -44,5 +44,25 @@ aliwork:
   appType: APP_BWPT6ET90UEE8IBEY9GJ
   systemToken: 37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q
 
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 626cda24137359
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: dingding
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 322503_566rSdHtylkb4+XoW1XoRdVGSqW85LOs
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 7eaf6845da0540e6b8f328541b36dff6
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://113.45.187.194:81/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+
 
 

+ 19 - 1
mjava-huagao/src/main/resources/application-prod.yml

@@ -44,4 +44,22 @@ aliwork:
   appType: APP_BWPT6ET90UEE8IBEY9GJ
   systemToken: 37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q
 
-
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 626cda24137359
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: dingding
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 322503_566rSdHtylkb4+XoW1XoRdVGSqW85LOs
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 7eaf6845da0540e6b8f328541b36dff6
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://113.45.187.194:81/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120

+ 85 - 0
mjava-huagao/src/test/java/com/malk/huagao/KdTest.java

@@ -0,0 +1,85 @@
+package com.malk.huagao;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.huagao.KdEntity.BillQuery;
+import com.malk.huagao.config.KDWebApiConf;
+import com.malk.huagao.service.KdHuaGaoService;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class KdTest {
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private KdHuaGaoService kdHuaGaoService;
+
+    @Test
+    public void test() throws Exception {
+        K3CloudApi client = new K3CloudApi(initIden());
+
+        List<Map> result = new ArrayList<>();
+        List<Map> list = new ArrayList<>();
+
+        int startRow = 0;
+        int limit = 2000;
+
+        BillQuery billQuery = new BillQuery();
+        billQuery.setFormId("BD_SerialMainFile");
+        billQuery.setFieldKeys("FNumber");
+        List<Map> filterString = new ArrayList<>();
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockId.FName","67","成品仓","","","0"));//仓库名称等于XX
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","默认仓位","(","","1"));//仓位等于XX
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockLocId.FF100001.FName","67","样机仓位","",")","0"));//仓位等于XX
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","0","(","","1"));//在库状态等于XX
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FStockStatus","29","1","",")","0"));//在库状态等于XX
+
+        billQuery.setFilterString(filterString);
+        billQuery.setLimit(limit);
+        billQuery.setStartRow(startRow);
+
+        do {
+            billQuery.setStartRow(startRow);
+            String s = client.billQuery(JSONObject.toJSONString(billQuery));
+            result = (List<Map>)JSONObject.parse(s);
+            list.addAll(result);
+
+            startRow += limit;
+        }while (result.size() == limit);
+
+        System.out.println("111");
+    }
+
+    @Test
+    public void test2() {
+        kdHuaGaoService.syncBDSerialMainFile();
+    }
+
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+}