YDConf.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package com.malk.server.aliwork;
  2. import com.alibaba.fastjson.JSON;
  3. import com.malk.utils.UtilMap;
  4. import com.malk.utils.UtilString;
  5. import lombok.Data;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.boot.context.properties.ConfigurationProperties;
  8. import org.springframework.stereotype.Component;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. import java.util.Map;
  13. @Data
  14. @Component
  15. @ConfigurationProperties(prefix = "aliwork")
  16. @Slf4j
  17. public class YDConf {
  18. private String appType;
  19. private String systemToken;
  20. /**
  21. * 一个切片数量上限
  22. */
  23. public static final Integer UPPER_LIMIT = 30000;
  24. /**
  25. * 一个分页数量上限
  26. */
  27. public static final Integer PAGE_SIZE_LIMIT = 100;
  28. /**
  29. * 子表详情接口的内联上限及分页大小;内联数量等于该值时需分页查询全量。
  30. */
  31. public static final Integer PAGE_SIZE_DETAILS = 50;
  32. /**
  33. * 宜搭开放平台 API 基础地址(新版)
  34. */
  35. public static final String BASE_V1 = "https://api.dingtalk.com/v1.0/yida";
  36. public static final String BASE_V2 = "https://api.dingtalk.com/v2.0/yida";
  37. /**
  38. * 接口访问账号 [不能触发待办与消息通知, 业务规则亦不能]
  39. * -
  40. * 非管理员账号只可以查询, 不检验权限
  41. * 操作数据需要管理员账号, 或宜搭平台
  42. */
  43. public static final String PUB_ACCOUNT = "yida_pub_account";
  44. ////////////////////////// 新版本API //////////////////////////
  45. /**
  46. * 查询表单
  47. */
  48. public enum FORM_QUERY {
  49. retrieve_list, // 全局查询, 不包含子表单
  50. retrieve_list_all, // 全局查询, 包含子表单
  51. multi_retrieve_id,
  52. retrieve_id, // 单个ID查询 todo 若秘钥不匹配, 返回空, 添加报错说明
  53. retrieve_search_process, // 流程列表
  54. retrieve_search_form, // 表单列表
  55. retrieve_search_process_id, // 流程列表
  56. retrieve_search_form_id, // 表单列表
  57. retrieve_details, // 子表数据[表单]
  58. retrieve_changed, // 变更记录
  59. retrieve_definition, // 表单定义
  60. retrieve_forms, // 表单列表
  61. retrieve_approval_record, // 审批记录
  62. }
  63. /**
  64. * 表单操作
  65. */
  66. public enum FORM_OPERATION {
  67. create,
  68. delete, // 传入为body, 文档为param
  69. update,
  70. // fixme: 不支持新增字段更新, 若有可先更新版本后执行 [无版本和更新json参数];
  71. // ppExt: start / create, noExecuteExpression 默认值是 true, 若需要触发配置消息通知, 设置为 false
  72. upsert, // insertOrUpdate
  73. upsert_v2, // 新版本 searchCondition 条件精准匹配
  74. multi_create, // 批量操作
  75. delete_batch, // 批量删除
  76. multi_update, // 批量更新
  77. start, // 发起流程
  78. batchSave, // 批量创建
  79. remarks, // 评论
  80. }
  81. /**
  82. * 关联表单处理
  83. *
  84. * @param formType: "receipt" 跳转为表单【若是流程,则权限体系会失效,但也会显示审批节点】; formType: "process" 为流程
  85. * @apiNote ppExt 接口更新, 传入jsonString或List都可以. 返回数据都是两层json解析, 组件 + _id格式
  86. */
  87. public List<Map> associationForm(String formUuid, String formInstanceId, String title, String subTitle, boolean isProcess) {
  88. return associationForm(appType, formUuid, formInstanceId, title, subTitle, isProcess);
  89. }
  90. // todo 部门ID写入需要是string集合\数组, 封装
  91. public static List<Map> associationForm(String appType, String formUuid, String formInstanceId, String title, String subTitle, boolean isProcess) {
  92. String formType = isProcess ? "process" : "receipt";
  93. return Arrays.asList(UtilMap.map("appType, formUuid, instanceId, title, subTitle, formType", appType, formUuid, formInstanceId, title, subTitle, formType));
  94. }
  95. /**
  96. * 读取关联表单: ppExt 两层解析后才是List, 若是赋值取值转一层, 宜搭也可进行写入
  97. * - 赋值说明 -
  98. * 若是同一个应用,appType与formUuid为空(不指定下formUuid可为错误,但appType只能为空),点击页面链接会自动匹配;
  99. * 若是跨应用实例,则不能通过导入,需要通过接口指定appType
  100. */
  101. public static List<Map> associationForm(String associations) {
  102. if (UtilString.isBlankCompatNull(associations)) {
  103. return new ArrayList<>();
  104. }
  105. return (List<Map>) JSON.parse(String.valueOf(JSON.parse(String.valueOf(associations))));
  106. }
  107. /**
  108. * 高级筛选: ppExt 通过表单\流程 search 宜搭目前下拉框也会被模糊匹配, 为避免事后过滤, 使用高级查询; 且高级查询支持同一个字段多条件
  109. */
  110. public static Map searchCondition_TextFiled(String compId, Object value, String operator) {
  111. return UtilMap.map("key, value, type, operator, componentName", compId, value, "TEXT", operator, "TextField");
  112. }
  113. // todo text组件是否可用于select
  114. public static Map searchCondition_processInstanceStatus(List status) {
  115. return UtilMap.map("key, value, type, operator, componentName", "processInstanceStatus", status, "ARRAY", "in", "SelectField");
  116. }
  117. /**
  118. * 组件格式化取值 [取值] todo 明细表递归, 循环传递入参
  119. */
  120. public static Object getDataByCompId(Map formData, String compId_cur) {
  121. if (compId_cur.contains("associationFormField_")) {
  122. // 服务注册 #{_yida_all_data} 直接组件Id
  123. if (!formData.containsKey(compId_cur)) {
  124. // 接口返回数据, 关联组件ID, 不会返回组件id字段
  125. compId_cur = compId_cur + "_id";
  126. }
  127. return JSON.parse(String.valueOf(formData.get(compId_cur)));
  128. } else if (compId_cur.contains("employeeField_")) {
  129. if (!formData.containsKey(compId_cur + "_id")) {
  130. // 服务注册 #{_yida_all_data} 返回JsonString userid 数组
  131. return JSON.parse(String.valueOf(formData.get(compId_cur)));
  132. } else {
  133. // 成员组件, 接口返回组件id返回为姓名, _id返回是userId
  134. return formData.get(compId_cur + "_id");
  135. }
  136. }
  137. return formData.get(compId_cur);
  138. }
  139. ////////////////////////// 老版本API //////////////////////////
  140. /**
  141. * 表单接口适用于流程: 查询和更新以及删除
  142. */
  143. private static String formatApiForm(String uri) {
  144. return "/yida_vpc/form/" + uri + ".json";
  145. }
  146. private static String formatApiProcess(String uri) {
  147. return "/yida_vpc/process/" + uri + ".json";
  148. }
  149. /**
  150. * 接口地址: 表单
  151. */
  152. public static final String API_FORM_CREATE = formatApiForm("saveFormData");
  153. public static final String API_FORM_DELETE = formatApiForm("deleteFormData");
  154. public static final String API_FORM_UPDATE = formatApiForm("updateFormData");
  155. public static final String API_FORM_DETAIL = formatApiForm("getFormDataById");
  156. public static final String API_FORM_QUERY_ID = formatApiForm("searchFormDataIds");
  157. public static final String API_FORM_QUERY_DATA = formatApiForm("searchFormDatas");
  158. public static final String API_FORM_DEFINITION = "/yida_vpc/formDesign/getFormComponentDefinationList.json";
  159. /**
  160. * 接口地址: 流程
  161. */
  162. public static final String API_PROCESS_CREATE = formatApiProcess("startInstance");
  163. public static final String API_PROCESS_DELETE = formatApiProcess("deleteInstance");
  164. public static final String API_PROCESS_UPDATE = formatApiProcess("updateInstance");
  165. public static final String API_PROCESS_DETAIL = formatApiProcess("getInstanceById");
  166. public static final String API_PROCESS_BATCH_DETAIL = formatApiProcess("getInstancesByIds");
  167. public static final String API_PROCESS_QUERY_ID = formatApiProcess("getInstanceIds");
  168. public static final String API_PROCESS_QUERY_DATA = formatApiProcess("getInstances");
  169. /**
  170. * 其它接口
  171. */
  172. public static final String API_OPEN_URL = "/yida_vpc/file/getOpenUrl.json";
  173. }