Create_by_fileOSFService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package com.kingdee.eas.custom.esign.osf;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.google.common.collect.Lists;
  6. import com.google.common.collect.Maps;
  7. import com.kingdee.bos.BOSException;
  8. import com.kingdee.bos.Context;
  9. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  10. import com.kingdee.eas.common.EASBizException;
  11. import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpResponse;
  12. import com.kingdee.eas.custom.esign.tsign.hz.exception.EsignException;
  13. import com.kingdee.eas.custom.esign.util.EsignConfig;
  14. import com.kingdee.eas.custom.esign.util.EsignHttpUtil;
  15. import org.apache.commons.lang3.StringUtils;
  16. import java.net.URISyntaxException;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Set;
  20. /**
  21. * description: Create_by_fileOSFService <br>
  22. * date: 28/11/2025 上午 9:46 <br>
  23. * author: lhbj <br>
  24. * version: 1.0 <br>
  25. */
  26. public class Create_by_fileOSFService implements IHRMsfService {
  27. public static void main(String[] args) {
  28. JSONObject jsonObject = JSON.parseObject("{\"tableName\":\"3-信息安全承诺书.pdf\",\"tableId\":\"4b19400154d1444e969bf69a6ce0c83c\",\"fields\":{\"49e2cabb3fff4e0090d580f7d4d6e0fc\":{\"name\":\"单行文本1\",\"dataType\":\"单行文本\",\"dataFormat\":\"undefined\",\"value\":\"大王大大\"},\"700825a785484185a6e3fd02e358792c\":{\"name\":\"工号\",\"dataType\":\"单行文本\",\"dataFormat\":\"undefined\",\"value\":\"1234534\"},\"a95f4a5d491d473cbba755a9bb84a04a\":{\"name\":\"日期1\",\"dataType\":\"Date\",\"dataFormat\":\"undefined\",\"value\":\"2024-12-03 00:00:00\"},\"35e09954d6aa41538bd27ffc42da59aa\":{\"name\":\"部门\",\"dataType\":\"String\",\"dataFormat\":\"undefined\",\"value\":\"HR产品处\"},\"df8743514be54648a1bc755cd51e315c\":{\"name\":\"多行文本1\",\"dataType\":\"String\",\"dataFormat\":\"undefined\",\"value\":\"4-1-3\"}}}");
  29. for (Map.Entry<String, Object> fileEntry : jsonObject.entrySet()) {
  30. JSONObject fieldObject = (JSONObject) fileEntry.getValue();
  31. }
  32. }
  33. @Override
  34. public Object process(Context context, Map<String, Object> map) throws EASBizException, BOSException {
  35. String mack = (String) map.get("mack");
  36. String data = (String) map.get("data");
  37. Map<String, Object> resul = Maps.newHashMap();
  38. try {
  39. JSONObject jsonObject = JSON.parseObject(data);
  40. if ("preview".equals(mack)) {
  41. EsignHttpResponse response = this.previewFile(context, jsonObject, "预览");
  42. if (response.getStatus() >= 200 && response.getStatus() < 300) {
  43. JSONObject body = JSON.parseObject(response.getBody());
  44. resul.putAll(body);
  45. } else {
  46. resul.put("code", response.getStatus());
  47. resul.put("message", "网络异常");
  48. resul.put("data", null);
  49. }
  50. } else {
  51. Map<String, Object> signMap = Maps.newHashMap();
  52. String sourceId = jsonObject.getString("sourceId");
  53. String signFlowTitle = jsonObject.getString("signFlowTitle");
  54. //文件
  55. JSONObject templateInfo = jsonObject.getJSONObject("templateInfo");
  56. //设置待签署文件信息
  57. List<Map<String, Object>> docs = this.addDocs(context, jsonObject, templateInfo);
  58. signMap.put("docs", docs);
  59. //签署流程配置项
  60. Map<String, Object> signFlowConfig = this.addSignFlowConfig(context, signFlowTitle, jsonObject);
  61. signMap.put("signFlowConfig", signFlowConfig);
  62. //签署方信息
  63. JSONObject signInfo = jsonObject.getJSONObject("signInfo");
  64. JSONArray signs = signInfo.getJSONArray("signers");
  65. List<Map<String, Object>> signers = this.addSigners(context, signs, docs, sourceId);
  66. signMap.put("signers", signers);
  67. //抄送方信息
  68. JSONArray copis = signInfo.getJSONArray("copiers");
  69. List<Map<String, Object>> copiers = this.addCopiers(context, copis);
  70. if (copiers.size() > 0) {
  71. signMap.put("copiers", copiers);
  72. }
  73. }
  74. } catch (EsignException | URISyntaxException e) {
  75. e.printStackTrace();
  76. }
  77. return resul;
  78. }
  79. /**
  80. * 设置待签署文件信息
  81. *
  82. * @param context
  83. * @param jsonObject
  84. * @param templateInfo
  85. * @return
  86. * @throws EsignException
  87. */
  88. public List<Map<String, Object>> addDocs(Context context, JSONObject jsonObject, JSONObject templateInfo) throws EsignException {
  89. //设置待签署文件信息
  90. Map<String, Object> resul = Maps.newHashMap();
  91. List<Map<String, Object>> docs = Lists.newArrayList();
  92. for (Map.Entry<String, Object> fileEntry : templateInfo.entrySet()) {
  93. JSONObject fieldObject = (JSONObject) fileEntry.getValue();
  94. String docTemplateId = jsonObject.getString("id");
  95. String fileName = jsonObject.getString("name");
  96. Object order = jsonObject.get("order");
  97. String sourceId = jsonObject.getString("sourceId");
  98. EsignHttpResponse response = this.previewFile(context, fieldObject, sourceId);
  99. if (response.getStatus() >= 200 && response.getStatus() < 300) {
  100. JSONObject body = JSON.parseObject(response.getBody());
  101. if ("0".equals(String.valueOf(body.get("code")))) {
  102. JSONObject file = body.getJSONObject("data");
  103. Map<String, Object> doc = Maps.newHashMap();
  104. doc.put("fileId", file.get("fileId"));
  105. doc.put("fileName", fileName);
  106. if (null != order) {
  107. doc.put("order", Integer.parseInt(String.valueOf(order)));
  108. }
  109. docs.add(doc);
  110. } else {
  111. //文件模板生成失败
  112. resul.putAll(body);
  113. throw new EsignException(JSON.toJSONString(resul));
  114. }
  115. } else {
  116. throw new EsignException("网络异常:" + JSON.toJSONString(response));
  117. }
  118. }
  119. return docs;
  120. }
  121. /**
  122. * 抄送方信息
  123. *
  124. * @param copis
  125. * @return
  126. */
  127. public List<Map<String, Object>> addCopiers(Context context, JSONArray copis) {
  128. List<Map<String, Object>> copiers = Lists.newArrayList();
  129. for (int i = 0; i < copis.size(); i++) {
  130. JSONObject cop = copis.getJSONObject(i);
  131. Map<String, Object> copierPsn = Maps.newHashMap();
  132. Map<String, Object> copierPsnInfo = Maps.newHashMap();
  133. copierPsnInfo.put("psnAccount", cop.getString("psnAccount"));
  134. copierPsn.put("copierPsnInfo", copierPsnInfo);
  135. copiers.add(copierPsn);
  136. }
  137. return copiers;
  138. }
  139. /**
  140. * @param context
  141. * @param orgSignerInfo
  142. * @param docs
  143. * @param sourceId
  144. * @return
  145. * @throws EsignException
  146. * @throws URISyntaxException
  147. */
  148. public Map<String, Object> addOrgSignerInfo(Context context, JSONObject orgSignerInfo, List<Map<String, Object>> docs, String sourceId) throws EsignException, URISyntaxException {
  149. Map<String, Object> resul = Maps.newHashMap();
  150. Map<String, Object> signMapInfo = Maps.newHashMap();
  151. Map<String, Object> orgPsnSignMap = Maps.newHashMap();
  152. String orgName = orgSignerInfo.getString("orgName");
  153. EsignHttpResponse response = EsignHttpUtil.getOrgIdentity_infoByOrgName(context, orgName);
  154. if (response.getStatus() >= 200 && response.getStatus() < 300) {
  155. JSONObject body = JSON.parseObject(response.getBody());
  156. if ("0".equals(String.valueOf(body.get("code")))) {
  157. JSONObject orgPsn = body.getJSONObject("data");
  158. String orgId = orgPsn.getString("orgId");
  159. orgName = orgPsn.getString("orgName");
  160. orgPsnSignMap.put("orgId", orgId);
  161. orgPsnSignMap.put("orgName", orgName);
  162. orgPsnSignMap.put("orgInfo", orgPsn.getJSONObject("orgInfo"));
  163. } else {
  164. //失败
  165. resul.putAll(body);
  166. throw new EsignException(JSON.toJSONString(resul));
  167. }
  168. } else {
  169. throw new EsignException("网络异常:" + JSON.toJSONString(response));
  170. }
  171. Integer signOrder = orgSignerInfo.getInteger("signOrder");
  172. //设置签署方的签署顺序
  173. if (null != signOrder) {
  174. Map<String, Object> signConfig = Maps.newHashMap();
  175. signConfig.put("signOrder", signOrder);
  176. signMapInfo.put("signConfig", signConfig);
  177. }
  178. signMapInfo.put("orgSignerInfo", orgPsnSignMap);
  179. //设置签署方的通知方式
  180. String noticeTypes = orgSignerInfo.getString("noticeTypes");
  181. Map<String, String> noticeConfig = Maps.newHashMap();
  182. if (StringUtils.isNotBlank(noticeTypes)) {
  183. noticeConfig.put("noticeTypes", noticeTypes);
  184. } else {
  185. noticeConfig.put("noticeTypes", "1,2");
  186. }
  187. signMapInfo.put("noticeConfig", noticeConfig);
  188. //签署区信息
  189. List<Map<String, Object>> signFields = Lists.newArrayList();
  190. for (Map<String, Object> doc : docs) {
  191. Map<String, Object> field = Maps.newHashMap();
  192. field.put("fileId", doc.get("fileId"));
  193. field.put("customBizNum", sourceId);
  194. field.put("signFieldType", 0);
  195. //签章区配置项(指定signFieldType为 0 - 签章区时,该参数为必传项)
  196. Map<String, Object> normalSignFieldConfig = Maps.newHashMap();
  197. normalSignFieldConfig.put("freeMode", true);
  198. field.put("normalSignFieldConfig", normalSignFieldConfig);
  199. signFields.add(field);
  200. }
  201. signMapInfo.put("signFields", signFields);
  202. return signMapInfo;
  203. }
  204. /**
  205. * @param context
  206. * @param psnSignerInfo
  207. * @param docs
  208. * @param sourceId
  209. * @return
  210. * @throws EsignException
  211. * @throws URISyntaxException
  212. */
  213. public Map<String, Object> addPsnSignerInfo(Context context, JSONObject psnSignerInfo, List<Map<String, Object>> docs, String sourceId) throws EsignException, URISyntaxException {
  214. Map<String, Object> resul = Maps.newHashMap();
  215. Map<String, Object> signMapInfo = Maps.newHashMap();
  216. Map<String, Object> orgPsnSignMap = Maps.newHashMap();
  217. //个人签署方信息
  218. String psnAccount = psnSignerInfo.getString("psnAccount");
  219. String psnName = psnSignerInfo.getString("psnName");
  220. Integer signOrder = psnSignerInfo.getInteger("signOrder");
  221. //设置签署方的签署顺序
  222. if (null != signOrder) {
  223. Map<String, Object> signConfig = Maps.newHashMap();
  224. signConfig.put("signOrder", signOrder);
  225. signMapInfo.put("signConfig", signConfig);
  226. }
  227. orgPsnSignMap.put("psnAccount", psnAccount);
  228. Map<String, String> psnInfo = Maps.newHashMap();
  229. psnInfo.put("psnName", psnName);
  230. orgPsnSignMap.put("psnInfo", psnInfo);
  231. //个人签署方信息
  232. signMapInfo.put("psnSignerInfo", orgPsnSignMap);
  233. //设置签署方的通知方式
  234. String noticeTypes = psnSignerInfo.getString("noticeTypes");
  235. Map<String, String> noticeConfig = Maps.newHashMap();
  236. if (StringUtils.isNotBlank(noticeTypes)) {
  237. noticeConfig.put("noticeTypes", noticeTypes);
  238. } else {
  239. noticeConfig.put("noticeTypes", "1,2");
  240. }
  241. signMapInfo.put("noticeConfig", noticeConfig);
  242. //签署区信息
  243. List<Map<String, Object>> signFields = Lists.newArrayList();
  244. for (Map<String, Object> doc : docs) {
  245. Map<String, Object> field = Maps.newHashMap();
  246. field.put("fileId", doc.get("fileId"));
  247. field.put("customBizNum", sourceId);
  248. field.put("signFieldType", 0);
  249. //签章区配置项(指定signFieldType为 0 - 签章区时,该参数为必传项)
  250. Map<String, Object> normalSignFieldConfig = Maps.newHashMap();
  251. normalSignFieldConfig.put("freeMode", true);
  252. field.put("normalSignFieldConfig", normalSignFieldConfig);
  253. signFields.add(field);
  254. }
  255. signMapInfo.put("signFields", signFields);
  256. return signMapInfo;
  257. }
  258. /**
  259. * 签署方信息
  260. *
  261. * @param context
  262. * @param signs
  263. * @param docs
  264. * @param sourceId
  265. * @return
  266. * @throws EsignException
  267. * @throws URISyntaxException
  268. */
  269. public List<Map<String, Object>> addSigners(Context context, JSONArray signs, List<Map<String, Object>> docs, String sourceId) throws EsignException, URISyntaxException {
  270. List<Map<String, Object>> signers = Lists.newArrayList();
  271. for (int i = 0; i < signs.size(); i++) {
  272. Map<String, Object> signMapInfo = Maps.newHashMap();
  273. JSONObject sign = signs.getJSONObject(i);
  274. Map<String, Object> orgPsnSignMap = Maps.newHashMap();
  275. JSONObject orgSignerInfo = sign.getJSONObject("orgSignerInfo");
  276. JSONObject psnSignerInfo = sign.getJSONObject("psnSignerInfo");
  277. //企业/机构签署方信息
  278. if (null != orgSignerInfo) {
  279. signMapInfo = addOrgSignerInfo(context, orgSignerInfo, docs, sourceId);
  280. } else {
  281. //个人签署方信息
  282. signMapInfo = addPsnSignerInfo(context, psnSignerInfo, docs, sourceId);
  283. }
  284. signers.add(signMapInfo);
  285. }
  286. return signers;
  287. }
  288. /**
  289. * 签署流程配置项
  290. *
  291. * @param context
  292. * @param signFlowTitle
  293. * @param jsonObject
  294. * @return
  295. */
  296. public Map<String, Object> addSignFlowConfig(Context context, String signFlowTitle, JSONObject jsonObject) {
  297. Map<String, Object> signFlowConfig = Maps.newHashMap();
  298. signFlowConfig.put("signFlowTitle", signFlowTitle);
  299. Boolean autoStart = jsonObject.getBoolean("autoStart");
  300. if (null != autoStart) {
  301. signFlowConfig.put("autoStart", autoStart);
  302. } else {
  303. signFlowConfig.put("autoStart", true);
  304. }
  305. Boolean autoFinish = jsonObject.getBoolean("autoFinish");
  306. if (null != autoFinish) {
  307. signFlowConfig.put("autoFinish", autoFinish);
  308. } else {
  309. signFlowConfig.put("autoFinish", true);
  310. }
  311. String notifyUrl = jsonObject.getString("notifyUrl");
  312. if (null != notifyUrl) {
  313. signFlowConfig.put("notifyUrl", notifyUrl);
  314. } else {
  315. notifyUrl = EsignConfig.getInstance().get("notifyUrl");
  316. signFlowConfig.put("notifyUrl", notifyUrl);
  317. }
  318. return signFlowConfig;
  319. }
  320. /**
  321. * {
  322. * "name": "信息安全承诺书.html",
  323. * "id": "c964cb6a67dd40f4a92d4f8e67462e17",
  324. * "fields": {
  325. * "5b5d7563808d457ea125b000ff2a8d1d": {
  326. * "name": "部门",
  327. * "dataType": "单行文本",
  328. * "value": null
  329. * },
  330. * "5fcd7b97621c4cd1a5f514e7f06cb0da": {
  331. * "name": "工号",
  332. * "dataType": "单行文本",
  333. * "value": null
  334. * }
  335. * }
  336. * {
  337. * "docTemplateId":"8726f6b***03a56d",
  338. * "fileName":"某公司的交易协议签署文件",
  339. * "components":[
  340. * {
  341. * "componentId":"59af7766***36ef41b",
  342. * "componentKey":"",
  343. * "componentValue":"这里是填充的文本"
  344. * },
  345. * {
  346. * "componentId":"7315e9af**72d2dac40",
  347. * "componentKey":"",
  348. * "componentValue":"2022/01/01"
  349. * }
  350. * ]
  351. * }
  352. *
  353. * @param jsonObject
  354. * @return
  355. */
  356. public EsignHttpResponse previewFile(Context context, JSONObject jsonObject, String sourceId) throws EsignException {
  357. String docTemplateId = jsonObject.getString("id");
  358. String fileName = jsonObject.getString("name");
  359. if (StringUtils.isBlank(docTemplateId)) {
  360. docTemplateId = jsonObject.getString("tableId");
  361. }
  362. if (StringUtils.isBlank(fileName)) {
  363. fileName = jsonObject.getString("tableName");
  364. }
  365. Map<String, Object> map = Maps.newHashMap();
  366. map.put("docTemplateId", docTemplateId);
  367. map.put("fileName", fileName);
  368. List<Map<String, Object>> components = Lists.newArrayList();
  369. JSONObject fields = jsonObject.getJSONObject("fields");
  370. for (Map.Entry<String, Object> field : fields.entrySet()) {
  371. Map<String, Object> component = Maps.newHashMap();
  372. component.put("componentId", field.getKey());
  373. JSONObject fieldInfo = (JSONObject) field.getValue();
  374. component.put("componentValue", fieldInfo.get("value"));
  375. components.add(component);
  376. }
  377. map.put("components", components);
  378. EsignHttpResponse response = EsignHttpUtil.createByDocTemplate(context, JSON.toJSONString(map), sourceId);
  379. //html 文件需要等待转换完成
  380. return response;
  381. }
  382. }