lfx 1 주 전
부모
커밋
c4aea59701

+ 84 - 0
mjava-heshu/pom.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk.heshu</groupId>
+    <artifactId>mjava-heshu</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>k3cloud</artifactId>
+            <version>8.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>heshu</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 17 - 0
mjava-heshu/src/main/java/com/malk/heshu/HeShuApplication.java

@@ -0,0 +1,17 @@
+package com.malk.heshu;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class HeShuApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(HeShuApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

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

@@ -0,0 +1,24 @@
+package com.malk.heshu.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;
+
+}

+ 34 - 0
mjava-heshu/src/main/java/com/malk/heshu/config/KDWebApiConfig.java

@@ -0,0 +1,34 @@
+package com.malk.heshu.config;
+
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+
+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-jinlun/src/main/resources/application-dev.yml");
+//            System.out.println("AcctID: " + config.getProperty("X-KDApi-AcctID"));
+//            // 打印其他属性...
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+
+
+}

+ 231 - 0
mjava-heshu/src/main/java/com/malk/heshu/controller/HeShuController.java

@@ -0,0 +1,231 @@
+package com.malk.heshu.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.heshu.entity.*;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import com.malk.heshu.config.KDWebApiConf;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.fail;
+
+@RestController
+@Slf4j
+public class HeShuController {
+
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+    @Autowired
+    private YDClient ydClient;
+
+    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;
+    }
+    @GetMapping("/test")
+    public McR test(){
+        return McR.success("111");
+    }
+
+    @PostMapping("/saveSupplier")
+    public McR saveSupplier(@RequestBody JSONObject params){
+        log.info("saveSupplier:{}",params);
+        if(PublicUtil.isNull(params,"fid")){
+            return McR.error("201","缺少参数!");
+        }
+        try {
+            Thread.sleep(500);// 休眠5s避免同时更新一条数据
+            Map formData= (Map) ydClient.queryData(YDParam.builder().formInstId(params.getString("fid")).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            if(formData==null){
+                return McR.error("201","未查询到数据!");
+            }
+            List<String> types=UtilMap.getList(formData,"checkboxField_mma72l0x");
+            String gysType;
+            if(types.contains("供应商")){
+                gysType="01";
+            }else {
+                gysType="03";
+            }
+            SupplierEntity supplierEntity = BeanUtil.toBean(formData, SupplierEntity.class);
+            SupplierEntity.FBaseInfo fBaseInfo = BeanUtil.toBean(formData, SupplierEntity.FBaseInfo.class);
+            SupplierEntity.FFinanceInfo fFinanceInfo = BeanUtil.toBean(formData, SupplierEntity.FFinanceInfo.class);
+            List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
+            List<SupplierEntity.FBankInfo> bkList=new ArrayList<>();
+            for(Map map:list){
+                SupplierEntity.FBankInfo  fBankInfo = BeanUtil.toBean(map, SupplierEntity.FBankInfo.class);
+                bkList.add(fBankInfo);
+            }
+            fBaseInfo.setFDeptId(new IdObject(UtilMap.getString(formData,"textField_mogukmdd")));// 业务部门
+            supplierEntity.setFBaseInfo(fBaseInfo);
+            supplierEntity.setFFinanceInfo(fFinanceInfo);
+            supplierEntity.setFBankInfo(bkList);
+            List<Map> list2=UtilMap.getList(formData,"tableField_mma72kx1");
+            List<SupplierEntity.FSupplierContact> lxrList=new ArrayList<>();
+            for(Map map:list2){
+                SupplierEntity.FSupplierContact  lxrInfo = BeanUtil.toBean(map, SupplierEntity.FSupplierContact.class);
+                lxrList.add(lxrInfo);
+            }
+            supplierEntity.setFSupplierContact(lxrList);
+            supplierEntity.setFGroup(new IdObject(gysType));
+            supplierEntity.setF_UNW_yida("https://garktl.aliwork.com/APP_QM42OEGLMNNGBLIJELJI/processDetail?formUuid=FORM-9C0EC03227CC49738447A27B4563779F0WLW&procInsId="+params.getString("fid"));
+            String operator=UtilMap.getString(formData,"radioField_mma72l0t");// 操作类型 客商准入  客商更新
+            if(operator.equals("客商更新")){
+                String fId=UtilMap.getString(formData,params.getString("textField_moi1ejl2"));
+                if(!PublicUtil.isNull(fId)){
+                    // 反审核
+                    unAudit("BD_Supplier",fId);
+                    supplierEntity.setFSupplierId(Integer.parseInt(fId));
+                }
+            }
+            return  saveToAudit("BD_Supplier",supplierEntity,params.getString("fid"),params.getString("key"),"selectField_mogukmd9","textareaField_mogukmdb","textField_moi1ejl2");
+        }catch (Exception e){
+            return McR.error("201",e.getMessage());
+        }
+    }
+
+    @PostMapping("/saveCust")
+    public McR saveCust(@RequestBody JSONObject params){
+        log.info("saveCust:{}",params);
+        if(PublicUtil.isNull(params,"fid")){
+            return McR.error("201","缺少参数!");
+        }
+        try {
+            Map formData= (Map) ydClient.queryData(YDParam.builder().formInstId(params.getString("fid")).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            if(formData==null){
+                return McR.error("201","未查询到数据!");
+            }
+            CustomerInfo customerInfo = BeanUtil.toBean(formData, CustomerInfo.class);
+            List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
+            List<CustomerInfo.CustBank> bkList=new ArrayList<>();
+            for(Map map:list){
+                CustomerInfo.CustBank  fBankInfo = BeanUtil.toBean(map, CustomerInfo.CustBank.class);
+                bkList.add(fBankInfo);
+            }
+            customerInfo.setFT_BD_CUSTBANK(bkList);
+            List<Map> list2=UtilMap.getList(formData,"tableField_mogukmdh");
+            List<CustomerInfo.CustContact> dzList=new ArrayList<>();
+            for(Map map:list2){
+                CustomerInfo.CustContact  custContact = BeanUtil.toBean(map, CustomerInfo.CustContact.class);
+                dzList.add(custContact);
+            }
+            customerInfo.setFT_BD_CUSTCONTACT(dzList);
+            customerInfo.setFSALDEPTID(new FNumber(UtilMap.getString(formData,"textField_mogukmdd")));// 业务部门
+            String custTypeValue=UtilMap.getString(formData,"radioField_mma72kxi");
+            String custType;
+            if(custTypeValue.equals("贸易商")){
+                custType="02";
+            }else if(custTypeValue.equals("工厂")){
+                custType="01";
+            }else {
+                custType="05";
+            }
+            customerInfo.setFGroup(new FNumber(custType));
+            String operator=UtilMap.getString(formData,"radioField_mma72l0t");// 操作类型 客商准入  客商更新
+            if(operator.equals("客商更新")){
+                String fId=UtilMap.getString(formData,"textField_moi1ejl1");
+                if(!PublicUtil.isNull(fId)){
+                    // 反审核
+                    unAudit("BD_Customer",fId);
+                    customerInfo.setFCUSTID(Integer.parseInt(fId));
+                }
+            }
+            return  saveToAudit("BD_Customer",customerInfo,params.getString("fid"),params.getString("key"),"selectField_mogukmd8","textareaField_mogukmda","textField_moi1ejl1");
+        }catch (Exception e){
+            return McR.error("201",e.getMessage());
+        }
+    }
+
+
+    private McR saveToAudit(String formid, Object object,String fid,String codeKey,String statusKey,String msgKey,String idKey) throws Exception {
+        JSONObject resultObj = new JSONObject();
+        K3CloudApi client = new K3CloudApi(initIden());
+        String result=client.save(formid,JSONObject.toJSONString(UtilMap.map("Model",object)));
+        resultObj.put("save",result);
+        Gson gson = new Gson();
+        RepoRet sRet = gson.fromJson(result, RepoRet.class);
+        if (sRet.isSuccessfully()) {
+            if(!PublicUtil.isNull(codeKey)){
+                // 回写信息
+                JSONObject reObj = JSONObject.parseObject(result,JSONObject.class);
+                Map updateMap=UtilMap.map(codeKey,reObj.getJSONObject("Result").getString("Number"));
+                updateMap.put(statusKey,"成功");
+                updateMap.put(idKey,reObj.getJSONObject("Result").getString("Id"));// ID 内码
+                ydClient.operateData(YDParam.builder().formInstId(fid).updateFormDataJson(
+                        JSONObject.toJSONString(updateMap)
+                ).build(), YDConf.FORM_OPERATION.update);
+            }
+            JsonObject jsonData = new JsonObject();
+            jsonData.addProperty("Ids", sRet.getResult().getId());
+            String result2=client.submit(formid, jsonData.toString());
+            resultObj.put("submit",result2);
+            RepoRet sRet2 = gson.fromJson(result, RepoRet.class);
+            if (sRet2.isSuccessfully()) {
+                JsonObject jsonData3 = new JsonObject();
+                jsonData3.addProperty("Ids", sRet2.getResult().getId());
+                String result3 = client.audit(formid, jsonData3.toString());
+                resultObj.put("audit",result3);
+                RepoRet repoRet3 = gson.fromJson(result3, RepoRet.class);
+                if (repoRet3.getResult().getResponseStatus().isIsSuccess()) {
+                    log.info("审批通过,新增完成");
+                    return McR.success(resultObj);
+//                    Map map=UtilMap.map("PkIds, TOrgIds",sRet.getResult().getId(),"1,105818,105822,127834,127835,127838,127843,127846,127847,127848,127850,127862,1370321,1325841,1327202,1646858");
+//                    String result4=client.allocate("formid",JSONObject.toJSONString(map));
+//                    resultObj.put("allocate",result4);
+//                    RepoRet repoRet4 = gson.fromJson(result4, RepoRet.class);
+//                    if (repoRet4.getResult().getResponseStatus().isIsSuccess()) {
+//                        log.info("分配完成");
+//                        return McR.success(resultObj);
+//                    }
+                }
+            }
+        }else {
+            log.info("保存失败:{}",result);
+            Map updateMap=UtilMap.map(statusKey,"失败");
+            updateMap.put(msgKey,result);
+            ydClient.operateData(YDParam.builder().formInstId(fid).updateFormDataJson(
+                    JSONObject.toJSONString(updateMap)
+            ).build(), YDConf.FORM_OPERATION.update);
+        }
+        return McR.error("203",JSONObject.toJSONString(resultObj));
+    }
+
+    private void unAudit(String formid,String fNumber) throws Exception {
+        K3CloudApi client = new K3CloudApi(initIden());
+        Gson gson = new Gson();
+        JsonObject jsonData = new JsonObject();
+        jsonData.addProperty("Ids", fNumber);
+        String result=client.unAudit(formid, jsonData.toString());
+        RepoRet sRet2 = gson.fromJson(result, RepoRet.class);
+        if (!sRet2.isSuccessfully()) {
+            log.info("反审核失败:{}",result);
+        }
+    }
+}

+ 18 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/BillQuery.java

@@ -0,0 +1,18 @@
+package com.malk.heshu.entity;
+
+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;
+}

+ 179 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/CustomerInfo.java

@@ -0,0 +1,179 @@
+package com.malk.heshu.entity;
+
+import cn.hutool.core.annotation.Alias;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * 客户信息实体类
+ */
+@Data
+public class CustomerInfo {
+    
+    private Integer FCUSTID;                // 主键-客户ID
+    private FNumber FCreateOrgId = new FNumber("000");      // 创建组织(必填)
+    private String FNumber;                 // 客户编码
+    private FNumber FUseOrgId = new FNumber("000");;         // 使用组织
+    @Alias("textField_mma6vp7o")
+    private String FName;                   // 客户名称(必填)
+    private String FShortName;              // 简称
+    private FNumber FCOUNTRY;          // 国家
+    private FNumber FPROVINCIAL;       // 地区
+    private String FADDRESS;                // 通讯地址
+    private String FZIP;                    // 邮政编码
+    private String FWEBSITE;                // 公司网址
+    private String FTEL;                    // 联系电话
+    private String FFAX;                    // 传真
+    private FNumber FCompanyClassify;  // 公司类别
+    private FNumber FCompanyNature;    // 公司性质
+    private FNumber FCompanyScale;     // 公司规模
+    private String FINVOICETITLE;           // 发票抬头
+    @Alias("textField_mma6vp85")
+    private String FTAXREGISTERCODE;        // 纳税登记号
+    @Alias("textField_mma72kwv")
+    private String FINVOICEBANKNAME;        // 开户银行
+    private String FINVOICETEL;             // 开票联系电话
+    @Alias("textField_mma72kww")
+    private String FINVOICEBANKACCOUNT;     // 银行账号
+    private String FINVOICEADDRESS;         // 开票通讯地址
+    private FNumber FSUPPLIERID;       // 对应供应商
+    private String FIsGroup;                // 集团客户
+    private String FIsDefPayer;             // 默认付款方
+    private FNumber FCustTypeId;       // 客户类别
+    private FNumber FGROUPCUSTID;      // 对应集团客户
+
+    @Alias("textField_mma72kww")
+    private FNumber FGroup;            // 客户分组
+    private FNumber FTRADINGCURRID;    // 结算币别(必填)
+    private FNumber FCorrespondOrgId;  // 对应组织
+    private String FDescription;            // 备注
+    private FNumber FSALDEPTID;        // 销售部门
+    private FNumber FSELLER;           // 销售员
+    private FNumber FSETTLETYPEID;     // 结算方式
+    private FNumber FRECCONDITIONID;   // 收款条件
+    private FNumber FDISCOUNTLISTID;   // 折扣表
+    private FNumber FPRICELISTID;      // 价目表
+    private Integer FTRANSLEADTIME;         // 运输提前期
+    private String FInvoiceType;            // 发票类型
+    private FNumber FTaxType;          // 税分类
+    private FNumber FRECEIVECURRID;    // 收款币别
+    private Integer FPriority;               // 客户优先级
+    private FNumber FTaxRate;          // 默认税率
+    private String FISCREDITCHECK;          // 启用信用管理
+    private String FIsTrade;                // 是否交易客户
+    private String F_JX_Combo;              // 是否信用客户(必填)
+    private String FUncheckExpectQty;       // 不校验可发量
+    @Alias("textField_mma6vp7v")
+    private String FLegalPerson;             // 法人代表
+    @Alias("numberField_mma6vp83")
+    private String FRegisterFund;           // 注册资本
+    @Alias("dateField_mma6vp7w")
+    private String FFoundDate;               // 创立日期
+    private String FDomains;                 // 行业
+    @Alias("textField_mma6vp85")
+    private String FSOCIALCRECODE;           // 统一社会信用代码
+    @Alias("textField_mma6vp7p")
+    private String FRegisterAddress;         // 注册地址
+    @Alias("textField_mogukmd2")
+    private String F_UNW_Remark_apv;           // 开票要求
+    private String F_UNW_Text_kpyx;          // 开票电子邮箱
+
+    private CustomerExt FT_BD_CUSTOMEREXT;   // 商务信息
+    private List<CustLocation> FT_BD_CUSTLOCATION;   // 联系人
+    private List<CustBank> FT_BD_CUSTBANK;           // 银行信息
+    private List<CustContact> FT_BD_CUSTCONTACT;     // 地址信息
+    private List<CustOrderOrg> FT_BD_CUSTORDERORG;   // 订货组织
+    private List<CustSubAccount> FT_BD_CUSTSUBACCOUNT; // 子账户信息
+
+
+    // 用户ID字段结构
+    @Data
+    public static class FUserIdField {
+        private String FUserID;
+    }
+    
+    // 商务信息扩展
+    @Data
+    public static class CustomerExt {
+        private Integer FEntryId;                // 主键
+        private String FEnableSL;                // 启用商联在线
+        private String FFreezeLimit;             // 冻结范围
+        private FUserIdField FFreezeOperator;    // 冻结人
+        private String FFreezeDate;              // 冻结日期
+        private FNumber FPROVINCE;          // 省份
+        private FNumber FCITY;              // 城市
+        private FNumber FDefaultConsiLoc;   // 默认收货地点
+        private FNumber FDefaultSettleLoc;  // 默认开票地点
+        private FNumber FDefaultPayerLoc;   // 默认付款地点
+        private FNumber FDefaultContact;    // 默认联系人
+        private Integer FMarginLevel;             // 保证金比例
+        private String FDebitCard;               // 结算卡
+        private FNumber FSettleId;          // 结算方
+        private FNumber FChargeId;          // 付款方
+        private String FALLOWJOINZHJ;             // 允许对接智慧订货
+        private FNumber FStarOrgId;         // 星辰组织
+    }
+    
+    // 联系人信息
+    @Data
+    public static class CustLocation {
+        private FNumber FContactId;         // 联系人编码
+        private String FIsDefaultConsigneeCT;    // 默认收货地址
+        private String FIsCopy;                  // 是否复制
+    }
+    
+    // 银行信息
+    @Data
+    public static class CustBank {
+        private Integer FENTRYID;                // 主键
+        private FNumber FCOUNTRY1;          // 开户国家
+        @Alias("textField_mma72kwy")
+        private String FBANKCODE;                // 银行账号
+        @Alias("textField_mogukmd1")
+        private String FACCOUNTNAME;             // 账户名称
+        private FNumber FBankTypeRec;       // 收款银行
+        private String FTextBankDetail;          // 网点名称
+        private FNumber FBankDetail;        // 银行网点
+        private String FOpenAddressRec;          // 开户行地址
+        @Alias("textField_mma72kwx")
+        private String FOPENBANKNAME;            // 开户银行
+        private String FCNAPS;                   // 联行号
+        private FNumber FCURRENCYID;        // 币别
+        private String FISDEFAULT1;              // 默认
+    }
+    
+    // 地址信息
+    @Data
+    public static class CustContact {
+        private Integer FENTRYID;                // 主键
+        private String FNUMBER1;                 // 交货地点编码
+        @Alias("textField_mogukmdi")
+        private String FNAME1;                   // 交货地点
+        private String FADDRESS1;                // 详细地址
+//        @Alias("textField_mogukmdf")
+        private String FTContact;               // 联系人
+        @Alias("textField_mogukmdg")
+        private String FMOBILE;                  // 移动电话
+        private Integer FTRANSLEADTIME1;         // 运输提前期
+        private String FIsDefaultConsignee;      // 默认收货地址
+        private String FIsDefaultSettle;         // 默认开票地址
+        private String FIsDefaultPayer;          // 默认付款地址
+        private String FIsUsed;                  // 启用
+    }
+    
+    // 订货组织
+    @Data
+    public static class CustOrderOrg {
+        private Integer FEntryID;                // 主键
+        private FNumber FOrderOrgId;        // 订货组织
+        private String FIsDefaultOrderOrg;       // 默认
+    }
+    
+    // 子账户信息
+    @Data
+    public static class CustSubAccount {
+        private Integer FEntryID;                // 主键
+        private String FSUBACCOUNTTYPE;          // 子账户类型
+        private String FSUBACCOUNT;              // 子账户号
+    }
+}

+ 40 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/FBillHead.java

@@ -0,0 +1,40 @@
+package com.malk.heshu.entity;
+
+import com.malk.utils.UtilMap;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class FBillHead extends Model{
+    private String FID;//实体主键
+    private String FDocumentStatus;//数据状态
+    private String FForbidStatus;//禁用状态
+    private String FName;//名称 (必填项)
+    private String FNumber;//编码
+    private String FDescription;//描述
+    private Map<String,String> FCreateOrgId;//创建组织 (必填项)
+    private Map<String,String> FUseOrgId;//使用组织 (必填项)
+    private String FCreatorId;//创建人
+    private String FModifierId;//修改人
+    private String FCreateDate;//创建日期
+    private String FModifyDate;//修改日期
+    private Map<String,String> F_ABC_Assistant;//项目类型 (必填项)
+    private String F_VPOX_Text;//CRM编号
+
+    public void setFCreateOrgId(String fCreateOrgId){
+        this.FCreateOrgId = UtilMap.map("FNumber",fCreateOrgId);
+    }
+    public void setFUseOrgId(String fUseOrgId){
+        this.FUseOrgId = UtilMap.map("FNumber",fUseOrgId);
+    }
+    public FBillHead(String FName,String FNumber,String type){
+        this.FUseOrgId = UtilMap.map("FNumber","100");
+        this.FCreateOrgId = UtilMap.map("FNumber","100");
+        this.FName=FName;
+        this.FNumber=FNumber;
+        this.F_ABC_Assistant = UtilMap.map("FNumber",type);
+    }
+    public FBillHead(){}
+}

+ 15 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/FNumber.java

@@ -0,0 +1,15 @@
+package com.malk.heshu.entity;
+
+import lombok.Data;
+
+@Data
+public class FNumber {
+    public FNumber() {
+    }
+
+    public FNumber(String FNumber) {
+        this.FNumber = FNumber;
+    }
+
+    private String FNumber;
+}

+ 18 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/IdObject.java

@@ -0,0 +1,18 @@
+package com.malk.heshu.entity;
+
+import lombok.Data;
+
+/**
+ * ID对象,用于存储带有编码或用户ID的对象
+ */
+@Data
+public class IdObject {
+    private String FNumber;      // 编码
+    private String FUserID;      // 用户ID
+    private String FNUMBER;      // 编码(大写形式)
+
+    public IdObject(String FNumber) {
+        this.FNumber = FNumber;
+    }
+    public IdObject(){};
+}

+ 7 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/Model.java

@@ -0,0 +1,7 @@
+package com.malk.heshu.entity;
+
+import lombok.Data;
+
+@Data
+public class Model {
+}

+ 215 - 0
mjava-heshu/src/main/java/com/malk/heshu/entity/SupplierEntity.java

@@ -0,0 +1,215 @@
+package com.malk.heshu.entity;
+
+import cn.hutool.core.annotation.Alias;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * 供应商实体类
+ */
+@Data
+public class SupplierEntity {
+
+    // 单据头字段
+    private Integer FSupplierId;           // 实体主键
+    private String FDocumentStatus;        // 数据状态
+    private String FForbidStatus;          // 禁用状态
+    @Alias("textField_mma6vp7o")
+    private String FName;                  // 名称(必填项)
+    private String FNumber;                // 编码
+    private String FDescription;           // 描述
+    private IdObject FCreateOrgId = new IdObject("000");         // 创建组织(必填项)
+    private IdObject FUseOrgId = new IdObject("000");            // 使用组织(必填项)
+    private IdObject FCreatorId;           // 创建人
+    private IdObject FModifierId;          // 修改人
+    private String FCreateDate;            // 创建日期
+    private String FModifyDate;            // 修改日期
+    private String FShortName;             // 简称
+    private IdObject FForbiderId;          // 禁用人
+    private String FForbidDate;            // 禁用日期
+    private String FAuditDate;             // 审核日期
+    private IdObject FAuditorId;            // 审核人
+    private IdObject FGroup;               // 供应商分组
+    private IdObject FCorrespondOrgId;      // 对应组织
+    private String FSYNCGYOWNERSTATUS;      // 同步货主状态(GY)
+    private String FRegNumber;              // 注册编码
+    private IdObject FGROUPSUPPLYID;        // 对应集团供应商
+    private String FISGROUP;                // 集团供应商
+    private String F_UNW_yida;              // 宜搭审批连接
+
+    public SupplierEntity() {}
+
+    // 基本信息
+    private FBaseInfo FBaseInfo;
+
+    // 商务信息
+    private FBusinessInfo FBusinessInfo;
+
+    // 财务信息
+    private FFinanceInfo FFinanceInfo;
+
+    // 银行信息
+    private List<FBankInfo> FBankInfo;
+
+    // 组织信息
+    private List<FLocationInfo> FLocationInfo;
+
+    // 联系人
+    private List<FSupplierContact> FSupplierContact;
+
+    /**
+     * 基本信息
+     */
+    @Data
+    public static class FBaseInfo {
+        private Integer FEntryId;                 // 实体主键
+        private IdObject FCountry;                // 国家
+        private IdObject FProvincial;             // 地区
+        private String FAddress;                  // 通讯地址
+        private String FZip;                      // 邮政编码
+        private IdObject FLanguage;               // 语言
+        private String FWebSite;                  // 公司网址
+        private IdObject FTrade;                  // 行业
+        @Alias("dateField_mma6vp7w")
+        private String FFoundDate;                // 创立日期
+        @Alias("textField_mma6vp7v")
+        private String FLegalPerson;              // 法人代表
+        @Alias("numberField_mma6vp83")
+        private Integer FRegisterFund;            // 注册资金(万元)
+        private String FRegisterCode;             // 工商登记号
+        @Alias("textField_mma6vp85")
+        private String FSOCIALCRECODE;            // 统一社会信用代码
+        private String FTendPermit;               // 生产经营许可证
+        @Alias("textField_mma6vp7p")
+        private String FRegisterAddress;          // 注册地址
+        private IdObject FDeptId;                 // 负责部门
+        private IdObject FStaffId;                // 负责人
+        private IdObject FSupplierClassify;       // 供应商分类
+        private String FSupplyClassify;           // 供应类别
+        private IdObject FSupplierGrade;          // 供应商等级
+        private IdObject FCompanyClassify;        // 公司类别
+        private IdObject FCompanyNature;          // 公司性质
+        private IdObject FCompanyScale;           // 公司规模
+        private String FStartDate;                // 生效日期
+        private String FEndDate;                  // 失效日期
+    }
+    
+    /**
+     * 商务信息
+     */
+    @Data
+    public static class FBusinessInfo {
+        private Integer FEntryId;                 // 实体主键
+        private IdObject FPurchaserGroupId;       // 采购组
+        private Integer FMinPOValue;              // 最小订单量
+        private String FNeedConfirm;              // 需要确认
+        private IdObject FParentSupplierId;       // 汇总公司
+        private String FBusinessStatus;           // 业务状态
+        private String FFreezeLimit;              // 冻结范围
+        private IdObject FSettleTypeId;           // 结算方式
+        private IdObject FPRICELISTID;            // 默认价目表
+        private Object FWipStockPlaceId;          // 默认WIP仓位
+        private IdObject FWipStockId;             // 默认WIP仓库
+        private IdObject FDiscountListId;         // 默认折扣表
+        private IdObject FProviderId;             // 供货方
+        private IdObject FFreezeOperator;         // 冻结人
+        private String FFreezeDate;               // 冻结日期
+        private IdObject FVmiStockId;             // VMI仓库
+        private String FVmiBusiness;              // VMI业务
+        private String FEnableSL;                 // 启用供应商协同
+        private Integer FDepositRatio;            // 保证金比例%
+        private String FDefaultContactId;         // 默认联系人
+    }
+    
+    /**
+     * 财务信息
+     */
+    @Data
+    public static class FFinanceInfo {
+        private Integer FEntryId;                 // 实体主键
+        private IdObject FPayCurrencyId;          // 结算币别(必填项)
+        private IdObject FCustomerId;             // 对应客户
+        private Integer FPayAdvanceAmount;        // 单次预付额度
+        @Alias("textField_mma6vp85")
+        private String FTaxRegisterCode;          // 税务登记号
+        private String FTendType;                 // 经营类型
+        private IdObject FTaxType;                // 税分类
+        private String FFinanceDesc;              // 描述
+        private IdObject FPayCondition;           // 付款条件
+        private String FInvoiceType;              // 发票类型
+        private IdObject FSettleId;               // 结算方
+        private IdObject FChargeId;               // 收款方
+        private IdObject FTaxRateId;              // 默认税率
+    }
+    
+    /**
+     * 银行信息
+     */
+    @Data
+    public static class FBankInfo {
+        private Integer FBankId;                  // 实体主键
+        private IdObject FBankCountry;            // 国家
+        @Alias("textField_mma72kwy")
+        private String FBankCode;                 // 银行账号
+        @Alias("textField_mogukmd1")
+        private String FBankHolder;               // 账户名称
+        private String FBankIsDefault;            // 默认
+        private String FBankDesc;                 // 描述
+        private IdObject FBankCurrencyId;         // 币别
+        @Alias("textField_mma72kwx")
+        private String FOpenBankName;             // 开户银行
+        private IdObject FBankTypeRec;            // 收款银行
+        private String FOpenAddressRec;           // 开户行地址
+        private String FCNAPS;                    // 联行号
+        private String FSwiftCode;                // SwiftCode
+        private String FTextBankDetail;           // 网点名称
+        private IdObject FBankDetail;             // 银行网点
+    }
+    
+    /**
+     * 组织信息(地点信息)
+     */
+    @Data
+    public static class FLocationInfo {
+        private Integer FLocationId;              // 实体主键
+        private Integer FTransportDays;           // 运输时间
+        private Integer FPlanDeliveryPeriod;      // 计划交货周期
+        private String FLocDesc;                  // 备注
+        private String FLocNumber;                // 地点编码
+        private String FLocName;                  // 地点名称(必填项)
+        private String FLocAddress;               // 通讯地址(必填项)
+        private String FLocIsUsed;                // 启用
+        private String FLocTel;                   // 电话
+        private String FLocMobile;                // 手机(必填项)
+        private String FLocFax;                   // 传真
+        private String FLocEMail;                 // 电子邮箱
+        private String FIsDefaultSupply;          // 默认供货地址
+        private String FIsDefaultSettle;          // 默认开票地址
+        private String FIsDefaultPayee;           // 默认收款地址
+        private String FLocContact;               // 联系人(旧)
+        private IdObject FLocNewContact;          // 联系人(必填项)
+    }
+    
+    /**
+     * 联系人信息
+     */
+    @Data
+    public static class FSupplierContact {
+        private Integer FContactId;               // 实体主键
+        @Alias("textField_mma72kx2")
+        private String FContact;                  // 联系人
+        private String FPost;                     // 职务
+        @Alias("textField_mma72kx3")
+        private String FTel;                      // 电话
+        private String FMobile;                   // 手机
+        private String FFax;                      // 传真
+        private String FEMail;                    // 电子邮箱
+        private String FIMCode;                   // 即时通讯
+        private String FContactIsDefault;         // 默认联系人
+        private String FContactDescription;       // 备注
+        private String FCommonContactId;          // 供应商联系人
+        private String FContactNumber;            // 编码
+        private String FConForbidStatus;          // 禁用状态
+        private String FGender;                   // 性别
+    }
+}

+ 54 - 0
mjava-heshu/src/main/java/com/malk/heshu/schedule/XiDingTask.java

@@ -0,0 +1,54 @@
+package com.malk.heshu.schedule;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import com.malk.heshu.config.KDWebApiConf;
+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;
+
+import java.util.*;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class XiDingTask {
+
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+
+    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;
+    }
+
+}

+ 45 - 0
mjava-heshu/src/main/resources/application-dev.yml

@@ -0,0 +1,45 @@
+server:
+  port: 9000
+  servlet:
+    context-path: /api/heshu
+
+enable:
+  scheduling: true
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/heshu/logs/
+  level:
+    com.malk.*: info
+
+# dingtalk
+dingtalk:
+  agentId: 4424860263
+  appKey: dingwrnq1nh8hoqvtqsr
+  appSecret: EUN7g-sskl5HmUPUhzWxoauTnjGJIHeLs-5W6SkcsH2W_fqGX2O0Hv94mNnVirgf
+  corpId: dingfafe4e9b1128aad035c2f4657eb6378f
+
+# aliwork
+aliwork:
+  appType: APP_QM42OEGLMNNGBLIJELJI
+  systemToken: ZDD66AA1PPG4HEBKPH0TSCZX72QX3O4ZGWFNMZKO
+
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 69b7650beaa43d
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 339218_S41q6zHu4mrb7YWI53TB0a9I1r4Y1rKL
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: fae9e4a1820f4e7c839eafebdfa0e4e5
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://124.70.8.12/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

+ 45 - 0
mjava-heshu/src/main/resources/application-prod.yml

@@ -0,0 +1,45 @@
+server:
+  port: 9000
+  servlet:
+    context-path: /api/heshu
+
+enable:
+  scheduling: true
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/heshu/logs/
+  level:
+    com.malk.*: info
+
+# dingtalk
+dingtalk:
+  agentId: 4424860263
+  appKey: dingwrnq1nh8hoqvtqsr
+  appSecret: EUN7g-sskl5HmUPUhzWxoauTnjGJIHeLs-5W6SkcsH2W_fqGX2O0Hv94mNnVirgf
+  corpId: dingfafe4e9b1128aad035c2f4657eb6378f
+
+# aliwork
+aliwork:
+  appType: APP_QM42OEGLMNNGBLIJELJI
+  systemToken: ZDD66AA1PPG4HEBKPH0TSCZX72QX3O4ZGWFNMZKO
+
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 6675a1bf6428ea
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 341950_01aJ5cupVqgaS+Ss6eWoT9WJ5L1W2plp
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 98d2869acbe8499c9c57d20a9ca6807a
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://124.70.8.12/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

+ 15 - 0
mjava-heshu/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

+ 61 - 0
mjava-heshu/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="d:\\jianhui_cloudpure\logs\"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 273 - 0
mjava-heshu/src/test/java/com/malk/heshu/JdTest.java

@@ -0,0 +1,273 @@
+package com.malk.heshu;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+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.PublicUtil;
+import com.malk.utils.UtilMap;
+import com.malk.heshu.config.KDWebApiConf;
+import com.malk.heshu.entity.*;
+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.*;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class JdTest {
+
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+
+    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;
+    }
+
+    @Test
+    public void saveCust() throws Exception {
+        JSONObject params=new JSONObject();
+        params.put("fid","7eeb3600-3450-46e9-b4e7-47ab4e0ad18e");
+        params.put("key","textField_mnhav84y");
+        try {
+            Map formData= (Map) ydClient.queryData(YDParam.builder().formInstId(params.getString("fid")).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            if(formData==null){
+                return ;
+            }
+            CustomerInfo customerInfo = BeanUtil.toBean(formData, CustomerInfo.class);
+            List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
+            List<CustomerInfo.CustBank> bkList=new ArrayList<>();
+            for(Map map:list){
+                CustomerInfo.CustBank  fBankInfo = BeanUtil.toBean(map, CustomerInfo.CustBank.class);
+                bkList.add(fBankInfo);
+            }
+            customerInfo.setFT_BD_CUSTBANK(bkList);
+            List<Map> list2=UtilMap.getList(formData,"tableField_mogukmdh");
+            List<CustomerInfo.CustContact> dzList=new ArrayList<>();
+            for(Map map:list2){
+                CustomerInfo.CustContact  custContact = BeanUtil.toBean(map, CustomerInfo.CustContact.class);
+                dzList.add(custContact);
+            }
+            customerInfo.setFT_BD_CUSTCONTACT(dzList);
+            customerInfo.setFSALDEPTID(new FNumber(UtilMap.getString(formData,"textField_mogukmdd")));// 业务部门
+            String custTypeValue=UtilMap.getString(formData,"radioField_mma72kxi");
+            String custType;
+            if(custTypeValue.equals("贸易商")){
+                custType="02";
+            }else if(custTypeValue.equals("工厂")){
+                custType="01";
+            }else {
+                custType="05";
+            }
+            customerInfo.setFGroup(new FNumber(custType));
+            String operator=UtilMap.getString(formData,"radioField_mma72l0t");// 操作类型 客商准入  客商更新
+            if(operator.equals("客商准入")){
+                String fId=UtilMap.getString(formData,"textField_moi1ejl1");
+                if(!PublicUtil.isNull(fId)){
+                    // 反审核
+                    unAudit("BD_Customer",fId);
+                    customerInfo.setFCUSTID(Integer.parseInt(fId));
+                }
+            }
+            McR mcr=saveToAudit("BD_Customer",customerInfo,params.getString("fid"),params.getString("key"),"selectField_mogukmd8","textareaField_mogukmda","textField_moi1ejl1");
+            System.out.println(JSONObject.toJSONString(mcr));
+        }catch (Exception e){
+        }
+    }
+
+    @Test
+    public void saveSupplier() throws Exception {
+        Map formData= (Map) ydClient.queryData(YDParam.builder().formInstId("a4fba63b-586c-43ee-9d34-daaeee2b19f1").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println(formData);
+        SupplierEntity supplierEntity = BeanUtil.toBean(formData, SupplierEntity.class);
+        SupplierEntity.FBaseInfo fBaseInfo = BeanUtil.toBean(formData, SupplierEntity.FBaseInfo.class);
+        List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
+        List<SupplierEntity.FBankInfo> bkList=new ArrayList<>();
+        for(Map map:list){
+            SupplierEntity.FBankInfo  fBankInfo = BeanUtil.toBean(map, SupplierEntity.FBankInfo.class);
+            bkList.add(fBankInfo);
+        }
+        supplierEntity.setFBaseInfo(fBaseInfo);
+        supplierEntity.setFBankInfo(bkList);
+        List<Map> list2=UtilMap.getList(formData,"tableField_mma72kx1");
+        List<SupplierEntity.FSupplierContact> lxrList=new ArrayList<>();
+        for(Map map:list2){
+            SupplierEntity.FSupplierContact  lxrInfo = BeanUtil.toBean(map, SupplierEntity.FSupplierContact.class);
+            lxrList.add(lxrInfo);
+        }
+        supplierEntity.setFSupplierContact(lxrList);
+        System.out.println(supplierEntity);
+//        System.out.println(saveToAudit("BD_Supplier",supplierEntity));
+    }
+
+    private McR saveToAudit(String formid, Object object,String fid,String codeKey,String statusKey,String msgKey,String idKey) throws Exception {
+        JSONObject resultObj = new JSONObject();
+        K3CloudApi client = new K3CloudApi(initIden());
+        String result=client.save(formid,JSONObject.toJSONString(UtilMap.map("Model",object)));
+        resultObj.put("save",result);
+        Gson gson = new Gson();
+        RepoRet sRet = gson.fromJson(result, RepoRet.class);
+        if (sRet.isSuccessfully()) {
+            if(!PublicUtil.isNull(codeKey)){
+                // 回写信息
+                JSONObject reObj = JSONObject.parseObject(result,JSONObject.class);
+                Map updateMap=UtilMap.map(codeKey,reObj.getJSONObject("Result").getString("Number"));
+                updateMap.put(statusKey,"成功");
+                updateMap.put(idKey,reObj.getJSONObject("Result").getString("Id"));// ID 内码
+                ydClient.operateData(YDParam.builder().formInstId(fid).updateFormDataJson(
+                        JSONObject.toJSONString(updateMap)
+                ).build(), YDConf.FORM_OPERATION.update);
+            }
+            JsonObject jsonData = new JsonObject();
+            jsonData.addProperty("Ids", sRet.getResult().getId());
+            String result2=client.submit(formid, jsonData.toString());
+            resultObj.put("submit",result2);
+            RepoRet sRet2 = gson.fromJson(result, RepoRet.class);
+            if (sRet2.isSuccessfully()) {
+                JsonObject jsonData3 = new JsonObject();
+                jsonData3.addProperty("Ids", sRet2.getResult().getId());
+                String result3 = client.audit(formid, jsonData3.toString());
+                resultObj.put("audit",result3);
+                RepoRet repoRet3 = gson.fromJson(result3, RepoRet.class);
+                if (repoRet3.getResult().getResponseStatus().isIsSuccess()) {
+                    log.info("审批通过,新增完成");
+                    return McR.success(resultObj);
+//                    Map map=UtilMap.map("PkIds, TOrgIds",sRet.getResult().getId(),"1,105818,105822,127834,127835,127838,127843,127846,127847,127848,127850,127862,1370321,1325841,1327202,1646858");
+//                    String result4=client.allocate("formid",JSONObject.toJSONString(map));
+//                    resultObj.put("allocate",result4);
+//                    RepoRet repoRet4 = gson.fromJson(result4, RepoRet.class);
+//                    if (repoRet4.getResult().getResponseStatus().isIsSuccess()) {
+//                        log.info("分配完成");
+//                        return McR.success(resultObj);
+//                    }
+                }
+            }
+        }else {
+            log.info("保存失败:{}",result);
+            Map updateMap=UtilMap.map(statusKey,"失败");
+            updateMap.put(msgKey,result);
+            ydClient.operateData(YDParam.builder().formInstId(fid).updateFormDataJson(
+                    JSONObject.toJSONString(updateMap)
+            ).build(), YDConf.FORM_OPERATION.update);
+        }
+        return McR.error("203",JSONObject.toJSONString(resultObj));
+    }
+
+    private void unAudit(String formid,String fNumber) throws Exception {
+        K3CloudApi client = new K3CloudApi(initIden());
+        Gson gson = new Gson();
+        JsonObject jsonData = new JsonObject();
+        jsonData.addProperty("Ids", fNumber);
+        String result=client.unAudit(formid, jsonData.toString());
+        RepoRet sRet2 = gson.fromJson(result, RepoRet.class);
+        if (!sRet2.isSuccessfully()) {
+            log.info("反审核失败:{}",result);
+        }
+    }
+
+    @Test
+    public void queryOrder(){
+        K3CloudApi client = new K3CloudApi(initIden());
+        try {
+            int startRow = 0;
+            int limit = 2000;
+            BillQuery billQuery = new BillQuery();
+            billQuery.setFormId("AR_RECEIVEBILL");
+            billQuery.setFieldKeys("FPAYUNIT.FName,FREALRECAMOUNTFOR,FDATE,FSETTLETYPEID,FSETTLETYPEID.FName,F_ABC_Base1,FRECACCOUNTNAME,FACCOUNTID.FNumber,FACCOUNTID.FName,FSALEERID.FName,F_ABC_Base,F_ABC_BaseProperty,FBPBILLNUMBER,FBPBILLPARAMOUNT,FBPBILLTYPE,FEXPIRY");
+//            billQuery.setFieldKeys("FBillNo,FBillTypeID.FName,FPAYUNITTYPE,FDate,FPAYUNIT.FName,FCURRENCYID.FName,FRECEIVEAMOUNTFOR_H,FREALRECAMOUNTFOR,FSALEERID.FName,FSETTLETYPEID,FSETTLETYPEID.FName,FPURPOSEID.FName,FACCOUNTID.FNumber,FACCOUNTID.FName,FRECTOTALAMOUNTFOR,FREALRECAMOUNTFOR_D,FCOMMENT");
+            List<Map> filterString = new ArrayList<>();
+            //审核日期为昨天至今天
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",4,"","","0"));//审核日期在今天之前N天以后
+//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-10-20 00:00:00","","","0"));//审核日期年=XX
+//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","35","","","0"));//物料编码等于XX
+            billQuery.setFilterString(filterString);
+            billQuery.setLimit(limit);
+            billQuery.setStartRow(startRow);
+            String result=client.billQuery(JSONObject.toJSONString(billQuery));
+            System.out.println(result);
+//            JSONArray jsonArray = JSONArray.parseArray(result);
+//            for(int i=0;i<jsonArray.size();i++){
+//                JSONObject jsonObject = jsonArray.getJSONObject(i);
+//                System.out.println(jsonObject);
+//                Receivebill rb= BeanUtil.toBean(jsonObject, Receivebill.class);
+//                if(!PublicUtil.isNull(rb.getAssociationFormField_lypey1wr())){
+//                    List<Map> data=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-8E4AA59DFB354F2D922826F47F70B31AZ8ES")
+//                            .searchCondition(JSONObject.toJSONString(Arrays.asList(YDConf.searchCondition_TextFiled("textField_lx05suvl",rb.getAssociationFormField_lypey1wr(),"eq"))))
+//                            .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+//                    if(data.size()>0){
+//                        System.out.println(data.get(0).get("formInstanceId"));
+//                        List<Map> kh=ydConf.associationForm("FORM-8E4AA59DFB354F2D922826F47F70B31AZ8ES", String.valueOf(data.get(0).get("formInstanceId")),rb.getAssociationFormField_lypey1wr(),"",false);
+//                        rb.setAssociationFormField_lypey1wr(JSONObject.toJSONString(kh));
+//                    }else{
+//                        rb.setAssociationFormField_lypey1wr("[]");
+//                    }
+//                }
+//                Map prodata=new HashMap();
+//                if(!PublicUtil.isNull(rb.getAssociationFormField_lsvmld22())){
+//                    List<Map> data=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-2E06211370FA43D3AEAAC0CF7636365491YX")
+//                            .searchCondition(JSONObject.toJSONString(Arrays.asList(YDConf.searchCondition_TextFiled("textField_m0c4utr2",rb.getAssociationFormField_lsvmld22(),"eq"))))
+//                            .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+//                    if(data.size()>0){
+//                        System.out.println(data.get(0).get("formInstanceId"));
+//                        Map formData= UtilMap.getMap(data.get(0),"formData");
+//                        List<Map> kh=ydConf.associationForm("FORM-2E06211370FA43D3AEAAC0CF7636365491YX", String.valueOf(data.get(0).get("formInstanceId")),UtilMap.getString(formData,"textField_m50ci9rk"),"",false);
+//                        rb.setAssociationFormField_lsvmld22(JSONObject.toJSONString(kh));
+//                        prodata.put("textField_lwgba84b",formData.get("textField_m0namazl"));
+//                        prodata.put("textField_lxvrmu61",formData.get("textField_m0namazj"));
+//                        prodata.put("textField_lypey1wx",formData.get("textField_m0c4utr2"));
+//                        prodata.put("textField_m1aft8ye",formData.get("textField_m6yurmat"));
+//                        prodata.put("numberField_lxu21h6c",formData.get("numberField_mdcwz9mr"));
+//                        prodata.put("numberField_lxu29mvg",formData.get("numberField_mdcwz9mv"));
+//                        prodata.put("numberField_lxu336sn",formData.get("numberField_m0gb97py"));
+//                    }else{
+//                        rb.setAssociationFormField_lsvmld22("[]");
+//                    }
+//                }
+//                prodata.putAll(JSONObject.parseObject(JSONObject.toJSONString(rb.toYiDa())));
+//                ydClient.operateData(YDParam.builder().formUuid("FORM-9BDAFB39320246EFACC176C9E33E51DC4N40")
+//                        .formDataJson(JSONObject.toJSONString(prodata)).build(), YDConf.FORM_OPERATION.start);
+//            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void queryOrder2(){
+    }
+
+
+
+
+
+}