ESignTemplateControllerBean.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.kingdee.eas.custom.esign.app;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.kingdee.bos.dao.IObjectValue;
  5. import com.kingdee.bos.dao.ormapping.CanNotDeleteException;
  6. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  7. import com.kingdee.bos.metadata.entity.FilterInfo;
  8. import com.kingdee.bos.metadata.entity.FilterItemCollection;
  9. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  10. import com.kingdee.bos.metadata.entity.SelectorItemCollection;
  11. import com.kingdee.bos.metadata.query.util.CompareType;
  12. import com.kingdee.bos.util.BOSUuid;
  13. import com.kingdee.eas.custom.esign.*;
  14. import com.kingdee.eas.custom.esign.bizEnum.SyncStatusEnum;
  15. import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpResponse;
  16. import com.kingdee.eas.custom.esign.tsign.hz.exception.EsignException;
  17. import com.kingdee.eas.custom.esign.util.EsignHttpUtil;
  18. import com.kingdee.shr.base.syssetting.BaseItemStateEnum;
  19. import com.kingdee.util.StringUtils;
  20. import org.apache.log4j.Logger;
  21. import com.kingdee.bos.*;
  22. import com.kingdee.bos.dao.IObjectPK;
  23. import com.kingdee.eas.common.EASBizException;
  24. import java.sql.Connection;
  25. import java.sql.Time;
  26. import java.util.HashMap;
  27. import java.util.Map;
  28. public class ESignTemplateControllerBean extends AbstractESignTemplateControllerBean {
  29. private static Logger logger = Logger.getLogger(ESignTemplateControllerBean.class);
  30. @Override
  31. protected IObjectPK _save(Context ctx, IObjectValue model) throws BOSException, EASBizException {
  32. ESignTemplateInfo info = (ESignTemplateInfo) model;
  33. String eSignTemplateNum = info.getESignTemplateNum();
  34. if (StringUtils.isEmpty(eSignTemplateNum)) {
  35. throw new BOSException("e 签宝模板编码不能为空!");
  36. }
  37. BOSUuid id = info.getId();
  38. FilterInfo filter = new FilterInfo();
  39. FilterItemCollection filterItems = filter.getFilterItems();
  40. if (id != null) {
  41. filterItems.add(new FilterItemInfo("id", id.toString(), CompareType.NOTEQUALS));
  42. }
  43. filterItems.add(new FilterItemInfo("eSignTemplateNum", eSignTemplateNum));
  44. if (exists(ctx, filter)) {
  45. throw new BOSException(String.format("e 签宝模板编码[%s]已经存在!", eSignTemplateNum));
  46. }
  47. return super._save(ctx, model);
  48. }
  49. /**
  50. * 检查电子签名模板是否可以删除
  51. *
  52. * @param ctx 业务上下文对象
  53. * @param pk 电子签名模板主键
  54. * @param cn 数据库连接对象
  55. * @throws CanNotDeleteException 当数据处于启用状态时抛出此异常,表示不允许删除
  56. */
  57. @Override
  58. protected void _canDelete(Context ctx, IObjectPK pk, Connection cn) throws CanNotDeleteException {
  59. super._canDelete(ctx, pk, cn);
  60. try {
  61. // 获取电子签名模板信息并检查状态
  62. ESignTemplateInfo info = getESignTemplateInfo(ctx, pk);
  63. BaseItemStateEnum state = info.getState();
  64. if (BaseItemStateEnum.ENABLE.equals(state)) {
  65. throw new CanNotDeleteException("启用的数据,不允许删除!");
  66. }
  67. } catch (BOSException e) {
  68. logger.error(e.getMessage(), e);
  69. throw new CanNotDeleteException(e);
  70. } catch (EASBizException e) {
  71. logger.error(e.getMessage(), e);
  72. throw new CanNotDeleteException(e);
  73. }
  74. }
  75. /**
  76. * 同步模板字段
  77. *
  78. * @param ctx
  79. * @param billId
  80. * @throws BOSException
  81. * @throws EASBizException
  82. */
  83. @Override
  84. protected void _syncTemplateFields(Context ctx, String billId)
  85. throws BOSException, EASBizException {
  86. super._syncTemplateFields(ctx, billId);
  87. if (org.apache.commons.lang3.StringUtils.isBlank(billId)) {
  88. throw new EASBizException(EASBizException.CHECKBLANK, new Object[]{"单据id不能为空!"});
  89. }
  90. SelectorItemCollection sic = new SelectorItemCollection();
  91. sic.add("entrys.*");
  92. sic.add("entrys.fields.*");
  93. ESignTemplateInfo info = getESignTemplateInfo(ctx, new ObjectUuidPK(billId), sic);
  94. ESignTemplateFileEntryCollection entrys = info.getEntrys();
  95. for (int i = 0; i < entrys.size(); i++) {
  96. ESignTemplateFileEntryInfo entryInfo = entrys.get(i);
  97. String eSignTemplateId = entryInfo.getESignTemplateId();
  98. try {
  99. ESignTemplateFileEntryFieldCollection fields = entryInfo.getFields();
  100. Map<String, ESignTemplateFileEntryFieldInfo> fieldMap = new HashMap<String, ESignTemplateFileEntryFieldInfo>();
  101. for (int j = 0; j < fields.size(); j++) {
  102. ESignTemplateFileEntryFieldInfo fieldInfo = fields.get(j);
  103. fieldMap.put(fieldInfo.getTemplateFieldId(), fieldInfo);
  104. }
  105. if (org.apache.commons.lang3.StringUtils.isNotBlank(eSignTemplateId)) {
  106. //throw new BOSException("e 签宝模板 id为空!");
  107. //1.调用接口获取模板字段
  108. EsignHttpResponse response = null;
  109. try {
  110. response = EsignHttpUtil.getDocTemplatesDetailById(eSignTemplateId);
  111. } catch (EsignException e) {
  112. e.printStackTrace();
  113. throw new BOSException("调用e签宝接口报错: " + e.getMessage());
  114. }
  115. String body = response.getBody();
  116. JSONObject jsonObject = JSONObject.parseObject(body);
  117. if (0 != jsonObject.getInteger("code")) {
  118. throw new BOSException(jsonObject.getString("message"));
  119. }
  120. JSONObject data = jsonObject.getJSONObject("data");
  121. //附件下载地址
  122. String fileDownloadUrl = data.getString("fileDownloadUrl");
  123. JSONArray components = data.getJSONArray("components");
  124. //2.比较现有模板字段,如果新增字段则添加,删除字段就更新为失效
  125. for (int j = 0; j < components.size(); j++) {
  126. JSONObject component = components.getJSONObject(j);
  127. //组件id
  128. String componentId = component.getString("componentId");
  129. //组件编码(可以为空)
  130. String componentKey = component.getString("componentKey");
  131. //组件名称
  132. String componentName = component.getString("componentName");
  133. //是否必填
  134. boolean isRrequired = component.getBoolean("required");
  135. //组件排序,从1开始
  136. int componentOrder = component.getInteger("componentOrder");
  137. ESignTemplateFileEntryFieldInfo fieldInfo = fieldMap.get(componentId);
  138. if (fieldInfo != null) {
  139. fieldMap.remove(componentId);
  140. } else {
  141. fieldInfo = new ESignTemplateFileEntryFieldInfo();
  142. fieldInfo.setTemplateFieldId(componentId);
  143. fields.add(fieldInfo);
  144. }
  145. //修改字段名称
  146. fieldInfo.setTemplateFieldName(componentName);
  147. //修改字段排序
  148. fieldInfo.setSeq(componentOrder);
  149. //修改是否必填
  150. fieldInfo.setRequired(isRrequired);
  151. //组件编码
  152. fieldInfo.setTemplateFieldKey(componentKey);
  153. }
  154. }
  155. if (!fieldMap.isEmpty()) {
  156. //已经失效的字段
  157. for (String componentId : fieldMap.keySet()) {
  158. fieldMap.get(componentId).setInvalid(true);
  159. }
  160. }
  161. entryInfo.setSyncStatus(SyncStatusEnum.SYNCED);
  162. entryInfo.setSyncResult("同步成功");
  163. } catch (BOSException e) {
  164. logger.error(e.getMessage(), e);
  165. entryInfo.setSyncStatus(SyncStatusEnum.SYNC_FAILED);
  166. entryInfo.setSyncResult(e.getMessage());
  167. // throw new RuntimeException(e);
  168. }
  169. entryInfo.setSyncTime(new Time(System.currentTimeMillis()));
  170. }
  171. //更新
  172. update(ctx, new ObjectUuidPK(billId), info);
  173. //3.同步模板附件
  174. //syncTemplateAttachments(ctx, billId);
  175. }
  176. }