ToB企服应用市场:ToB评测及商务社交产业平台

标题: 泛微e9 OA中通过Java SDK获取金蝶云星空中的表单数据 [打印本页]

作者: 慢吞云雾缓吐愁    时间: 前天 04:43
标题: 泛微e9 OA中通过Java SDK获取金蝶云星空中的表单数据
泛微e9 OA中通过Java SDK获取金蝶云星空中的表单数据

一、开发前准备

二、运行情况配置

你最好是先直接跑一下金蝶sdk中的那个demo,再去集成到OA中
首先必要编辑一下配置文件,将金蝶的第三方授权登陆的信息填写过来

上面的这些配置信息中的第一个,AcctID可以这样获取:

然后就是填写应用ID、密钥、用户名。这个LCID不用变,末了就把地点改成你公司的金蝶地点就可以了。必要留意的是这个配置文件必要放到项目标根目次下,在OA中则是将该文件放到ecology/classbean下才会见效。

在本地情况中必要把金蝶sdk加到lib中,在服务器上则是把这个金蝶的包放到ecology/WEB-INF/lib目次下

三、使用金蝶的SDK获取表单数据


3.1 票据查询案例解析

先看官网API使用案例:

使用这个api返回的值其实是数据而不是json,想要json的数据格式就用executeBillQueryJson这个方法,不过我感觉没必要,直接我下面的方式解析就可以:
  1.     @Test
  2.     public void getPAYORG() throws Exception {
  3.         HashMap<Integer, String> orgNameMap = new HashMap<>();
  4.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  5.         int limit = 10000;
  6.         // 从第0条数据开始读取
  7.         int startRow = 0;
  8.         while (true) {
  9.             JsonObject params = new JsonObject();
  10.             params.addProperty("FormId", "ORG_Organizations");
  11.             params.addProperty("FieldKeys", "FOrgID,FName");
  12.             params.addProperty("StartRow", startRow);
  13.             params.addProperty("Limit", limit);
  14.             params.addProperty("IsSortBySeq", false);
  15.             String jsonData = GSON.toJson(params);
  16.             // 调用接口获取一页数据
  17.             List<List<Object>> result = client.executeBillQuery(jsonData);
  18.             if (result == null || result.isEmpty()) {
  19.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  20.                 break;
  21.             }
  22.             for (List<Object> obj : result) {
  23.                 orgNameMap.put((Integer) obj.get(0), (String) obj.get(1));
  24.             }
  25.             startRow += result.size();
  26.         }
  27.         System.out.println(orgNameMap);
  28.     }
复制代码
假如你想查别的表就直接换一下params.addProperty(“FormId”, “ORG_Organizations”);当中表名就可以了,表名在api接口中都有。

这个比较麻烦的问题是你不知道你要的字段的字段名到底叫做什么?
解决的办法是去检察保存的api接口

大概是这个地方:


你就能获得大部分的字段名了,假如涉及到多张表的那种表单,有些字段你还是不知道,还可以这样:先去登陆体系,然后找到这张表单,再按照模板引出,这样表单的字段名也会出来。


但是还是有些字段你还是发现查不出来,你还可以通过view来先查询一条数据,这样它会返回给你该数据的所有字段的属性名和值,然后去确认这个字段叫做什么。
但是还是有些字段你还是查不出来,好比这种的情况:

像这种就去金蝶社区的帮助中心查询相干的情况。这样你就应该可以查询金蝶api中所有表单的值了。
3.2 view接口解析

先看官网案例:

只要在json中传入编码大概是id就可以返回对应数据了,你只要能区分什么是编码什么是Id就可以了。

API中的Number就是上图的编码,而Id是指这条数据的数据库id
四、获取金蝶应付单的现实案例

金蝶表单的数据同步可以写到OA的计划任务当中,至于计划任务具体的编写方式可以参考这个:
泛微二开文档
  1. package com.customization.suppy.cron;
  2. import com.customization.suppy.pojo.Appayable;
  3. import com.google.gson.*;
  4. import com.kingdee.bos.webapi.sdk.K3CloudApi;
  5. import org.junit.Test;
  6. import weaver.conn.RecordSet;
  7. import weaver.formmode.data.ModeDataIdUpdate;
  8. import weaver.formmode.setup.ModeRightInfo;
  9. import weaver.interfaces.schedule.BaseCronJob;
  10. import java.time.LocalDate;
  11. import java.time.LocalTime;
  12. import java.time.format.DateTimeFormatter;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. public class SyncAPPayableCron extends BaseCronJob {
  17.     K3CloudApi client = new K3CloudApi();
  18.     private static final Gson GSON = new Gson();
  19.     HashMap<Integer, String> supplierMap = new HashMap<>();
  20.     HashMap<Integer, String> unitNameMap = new HashMap<>();
  21.     HashMap<Integer, String> materialMap = new HashMap<>();
  22.     HashMap<Integer, String> orderMap = new HashMap<>();
  23.     /**
  24.      * 定时任务
  25.      */
  26.     @Override
  27.     public void execute() {
  28.         // SYN_PERSON_TABLE_NAME 建模表名
  29.         String SYN_PERSON_TABLE_NAME = "uf_AP_Payable";
  30.         // SYN_PERSON_FLOW_ID 模块id
  31.         int SYN_PERSON_FLOW_ID = 14;
  32.         RecordSet recordSet = new RecordSet();
  33.         try {
  34.             // 首先获取所有的数据
  35.             List<Appayable> apPayableList = getAPPayableList();
  36.             // 遍历list,通过FBillNo来判断
  37.             for (Appayable appayable : apPayableList) {
  38.                 if (appayable.getFBillNo().equals(" "))continue;
  39.                 String sql = "select id from uf_AP_Payable where FBillNo= '"+appayable.getFBillNo()+"';";
  40.                 recordSet.executeQuery(sql);
  41.                 if (recordSet.next()) {
  42.                     String mainid = recordSet.getString("id");
  43.                     // 代表是重复的数据,再查询明细表,将数据插入到明细表
  44.                     String sql_detail = "select id from uf_AP_Payable_dt1 where FMATERIALID='"+appayable.getFMATERIALID()+"'";
  45.                     recordSet.executeQuery(sql_detail);
  46.                     if (recordSet.next()) {
  47.                         // 代表此物料编码已经存在了,直接跳过该条数据
  48.                     } else {
  49.                         // 代表需要插入明细表
  50.                         String insertSql = "INSERT INTO uf_AP_Payable_dt1 (mainid, FBillNo, FMATERIALID, FMaterialDesc, FModel, FPRICEUNIT,FPriceQty,FTaxPrice,FALLAMOUNTFOR_D) " +
  51.                                 "VALUES (" + mainid + ", '" + appayable.getFOrderNumber() + "', '" + appayable.getFMATERIALID() + "','" + appayable.getFMaterialDesc() + "','" + appayable.getFModel() + "','" + appayable.getFPRICEUNIT() + "'," + appayable.getFPriceQty() + "," + appayable.getFTaxPrice() + "," + appayable.getFALLAMOUNTFOR_D() + ")";
  52.                         recordSet.executeUpdate(insertSql);
  53.                     }
  54.                 } else {
  55.                     // 新增建模表,然后直接将所有数据更新到建模表当中。
  56.                     // 获取现在的时间
  57.                     LocalDate currentDate = LocalDate.now();
  58.                     LocalTime currentTime = LocalTime.now();
  59.                     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH-mm-ss");
  60.                     String _currentTime = currentTime.format(formatter);
  61.                     // 通过代码创建一条建模数据
  62.                     int id = ModeDataIdUpdate.getInstance().getModeDataNewIdByUUID(SYN_PERSON_TABLE_NAME, SYN_PERSON_FLOW_ID, 1, 1, currentDate.toString(), _currentTime);
  63.                     ModeRightInfo ModeRightInfo = new ModeRightInfo();
  64.                     ModeRightInfo.setNewRight(true);
  65.                     // 新建的时候添加共享
  66.                     ModeRightInfo.editModeDataShare(1, SYN_PERSON_FLOW_ID, id);
  67.                     // 新建的时候添加文档共享
  68.                     ModeRightInfo.addDocShare(1, SYN_PERSON_FLOW_ID, id);
  69.                     // 调整主表数据
  70.                     String updateSql = "UPDATE uf_AP_Payable " +
  71.                             " SET FBillNo = '" + appayable.getFBillNo() + "', " +
  72.                             " FSUPPLIER = '" + appayable.getFSUPPLIER() + "', " +
  73.                             " FENDDATE_H = '" + appayable.getFENDDATE_H() + "', " +
  74.                             " FDATE = '" + appayable.getFDATE() + "', " +
  75.                             " FEntryTaxRate = " + appayable.getFEntryTaxRate() +
  76.                             " WHERE id = " + id;
  77.                     recordSet.executeUpdate(updateSql);
  78.                     // 调整明细表数据
  79.                     String insertSql = "INSERT INTO uf_AP_Payable_dt1 (mainid, FBillNo, FMATERIALID, FMaterialDesc, FModel, FPRICEUNIT,FPriceQty,FTaxPrice,FALLAMOUNTFOR_D) " +
  80.                             "VALUES (" + id + ", '" + appayable.getFOrderNumber() + "', '" + appayable.getFMATERIALID() + "','" + appayable.getFMaterialDesc() + "','" + appayable.getFModel() + "','" + appayable.getFPRICEUNIT() + "'," + appayable.getFPriceQty() + "," + appayable.getFTaxPrice() + "," + appayable.getFALLAMOUNTFOR_D() + ")";
  81.                     recordSet.executeUpdate(insertSql);
  82.                 }
  83.             }
  84.         } catch (Exception e) {
  85.             throw new RuntimeException(e);
  86.         }
  87.     }
  88.     /**
  89.      * 获取所有的供应商名称并且将其传入 supplierMap 当中
  90.      */
  91.     public void getAllSupplier() throws Exception {
  92.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  93.         int limit = 10000;
  94.         // 从第0条数据开始读取
  95.         int startRow = 0;
  96.         while (true) {
  97.             JsonObject params = new JsonObject();
  98.             params.addProperty("FormId", "BD_Supplier");
  99.             params.addProperty("FieldKeys", "FSUPPLIERID,FName");
  100.             params.addProperty("StartRow", startRow);
  101.             params.addProperty("Limit", limit);
  102.             params.addProperty("IsSortBySeq", false);
  103.             String jsonData = GSON.toJson(params);
  104.             // 调用接口获取一页数据
  105.             List<List<Object>> result = client.executeBillQuery(jsonData);
  106.             if (result == null || result.isEmpty()) {
  107.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  108.                 break;
  109.             }
  110.             for (List<Object> obj : result) {
  111.                 supplierMap.put((Integer) obj.get(0), (String) obj.get(1));
  112.             }
  113.             startRow += result.size();
  114.         }
  115.     }
  116.     /**
  117.      * 获取所有的计量单位并且存在 unitNameMap 当中
  118.      */
  119.     public void getAllUnitName() throws Exception {
  120.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  121.         int limit = 10000;
  122.         // 从第0条数据开始读取
  123.         int startRow = 0;
  124.         while (true) {
  125.             JsonObject params = new JsonObject();
  126.             params.addProperty("FormId", "BD_UNIT");
  127.             params.addProperty("FieldKeys", "FUNITID,FName");
  128.             params.addProperty("StartRow", startRow);
  129.             params.addProperty("Limit", limit);
  130.             params.addProperty("IsSortBySeq", false);
  131.             String jsonData = GSON.toJson(params);
  132.             // 调用接口获取一页数据
  133.             List<List<Object>> result = client.executeBillQuery(jsonData);
  134.             if (result == null || result.isEmpty()) {
  135.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  136.                 break;
  137.             }
  138.             for (List<Object> obj : result) {
  139.                 unitNameMap.put((Integer) obj.get(0), (String) obj.get(1));
  140.             }
  141.             startRow += result.size();
  142.         }
  143.     }
  144.     /**
  145.      * 获取所有的物料信息,然后将物料的id转成物料的编码
  146.      */
  147.     public void getAllMaterial() throws Exception {
  148.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  149.         int limit = 10000;
  150.         // 从第0条数据开始读取
  151.         int startRow = 0;
  152.         while (true) {
  153.             JsonObject params = new JsonObject();
  154.             params.addProperty("FormId", "BD_MATERIAL");
  155.             params.addProperty("FieldKeys", "FMATERIALID,FNumber");
  156.             params.addProperty("StartRow", startRow);
  157.             params.addProperty("Limit", limit);
  158.             params.addProperty("IsSortBySeq", false);
  159.             String jsonData = GSON.toJson(params);
  160.             // 调用接口获取一页数据
  161.             List<List<Object>> result = client.executeBillQuery(jsonData);
  162.             if (result == null || result.isEmpty()) {
  163.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  164.                 break;
  165.             }
  166.             for (List<Object> obj : result) {
  167.                 materialMap.put((Integer) obj.get(0), (String) obj.get(1));
  168.             }
  169.             startRow += result.size();
  170.         }
  171.     }
  172.     /**
  173.      * 存采购明细内码和采购订单号
  174.      */
  175.     public void getAllOrderNumber() throws Exception {
  176.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  177.         int limit = 10000;
  178.         // 从第0条数据开始读取
  179.         int startRow = 0;
  180.         while (true) {
  181.             JsonObject params = new JsonObject();
  182.             params.addProperty("FormId", "PUR_PurchaseOrder");
  183.             params.addProperty("FieldKeys", "FPOOrderEntry_FEntryID,FPURCHASEORDERNO");
  184.             params.addProperty("StartRow", startRow);
  185.             params.addProperty("Limit", limit);
  186.             params.addProperty("IsSortBySeq", false);
  187.             String jsonData = GSON.toJson(params);
  188.             // 调用接口获取一页数据
  189.             List<List<Object>> result = client.executeBillQuery(jsonData);
  190.             if (result == null || result.isEmpty()) {
  191.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  192.                 break;
  193.             }
  194.             for (List<Object> obj : result) {
  195.                 orderMap.put((Integer) obj.get(0), (String) obj.get(1));
  196.             }
  197.             startRow += result.size();
  198.         }
  199.     }
  200.     /**
  201.      * 获取金蝶中应付单的完整数据
  202.      */
  203.     public List<Appayable> getAPPayableList() throws Exception {
  204.         getAllSupplier();
  205.         getAllUnitName();
  206.         getAllMaterial();
  207.         getAllOrderNumber();
  208.         K3CloudApi client = new K3CloudApi();
  209.         Gson gson = new Gson();
  210.         ArrayList<Appayable> appayables = new ArrayList<>();
  211.         // 定义每页获取的数据条数,这里可根据接口最大允许值设置(例如10000)
  212.         int limit = 10000;
  213.         // 从第0条数据开始读取
  214.         int startRow = 0;
  215.         while (true) {
  216.             // 构建请求的 JSON 对象
  217.             JsonObject jsonObject = new JsonObject();
  218.             jsonObject.addProperty("FormId", "AP_Payable");
  219.             jsonObject.addProperty("FieldKeys", "FBillNo,FSUPPLIERID,FENDDATE_H,FDATE,FEntryTaxRate,FOrderEntryID,FMATERIALID,FMaterialDesc,FModel,FPRICEUNITID,FPriceQty,FTaxPrice,FALLAMOUNTFOR_D");
  220.             jsonObject.addProperty("FilterString", "");
  221.             jsonObject.addProperty("OrderString", "");
  222.             jsonObject.addProperty("TopRowCount", 0);
  223.             jsonObject.addProperty("StartRow", startRow);
  224.             jsonObject.addProperty("Limit", limit);
  225.             jsonObject.addProperty("SubSystemId", "");
  226.             String jsonData = gson.toJson(jsonObject);
  227.             // 调用接口获取一页数据
  228.             List<List<Object>> result = client.executeBillQuery(jsonData);
  229.             if (result == null || result.isEmpty()) {
  230.                 // 当返回结果为空时,说明所有数据已经读取完毕,退出循环
  231.                 break;
  232.             }
  233.             // 处理当前页数据
  234.             for (List<Object> obj : result) {
  235.                 Appayable appayable = new Appayable();
  236.                 // 注意:此处的类型转换需要与实际返回的数据类型相符
  237.                 appayable.setFBillNo((String) obj.get(0));
  238.                 appayable.setFSUPPLIER(supplierMap.get((Integer) obj.get(1)));
  239.                 appayable.setFENDDATE_H(((String) obj.get(2)).substring(0,10));
  240.                 appayable.setFDATE(((String) obj.get(3)).substring(0,10));
  241.                 appayable.setFEntryTaxRate((Double) obj.get(4));
  242.                 appayable.setFOrderNumber(orderMap.get((Integer)obj.get(5)));
  243.                 appayable.setFMATERIALID(materialMap.get((Integer) obj.get(6)));
  244.                 appayable.setFMaterialDesc((String) obj.get(7));
  245.                 appayable.setFModel((String) obj.get(8));
  246.                 appayable.setFPRICEUNIT(unitNameMap.get((Integer) obj.get(9)));
  247.                 appayable.setFPriceQty((Double) obj.get(10));
  248.                 appayable.setFTaxPrice((Double) obj.get(11));
  249.                 appayable.setFALLAMOUNTFOR_D((Double) obj.get(12));
  250.                 appayables.add(appayable);
  251.             }
  252.             // 累加已读取的行数,准备读取下一页
  253.             startRow += result.size();
  254.         }
  255.         return appayables;
  256.     }
  257. /*    @Test
  258.     public void test() throws Exception {
  259.         List<Appayable> apPayableList = getAPPayableList();
  260.         for (Appayable appayable : apPayableList) {
  261.             System.out.println(appayable);
  262.         }
  263.     }*/
  264. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4