ESignTemplateControllerBean.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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.ObjectUuidPK;
  6. import com.kingdee.bos.metadata.entity.FilterInfo;
  7. import com.kingdee.bos.metadata.entity.FilterItemCollection;
  8. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  9. import com.kingdee.bos.metadata.entity.SelectorItemCollection;
  10. import com.kingdee.bos.metadata.query.util.CompareType;
  11. import com.kingdee.bos.util.BOSUuid;
  12. import com.kingdee.eas.custom.esign.*;
  13. import com.kingdee.eas.custom.esign.bizEnum.ComponentTypeEnum;
  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.Time;
  25. import java.util.HashMap;
  26. import java.util.HashSet;
  27. import java.util.Map;
  28. import java.util.Set;
  29. public class ESignTemplateControllerBean extends AbstractESignTemplateControllerBean {
  30. private static Logger logger = Logger.getLogger(ESignTemplateControllerBean.class);
  31. //允许同步的控件类型
  32. private static final Set<Integer> ComponentTypeEnumSet = new HashSet<Integer>();
  33. static {
  34. ComponentTypeEnumSet.add(ComponentTypeEnum.SINGLELINETEXT_VALUE);
  35. ComponentTypeEnumSet.add(ComponentTypeEnum.NUMBER_VALUE);
  36. ComponentTypeEnumSet.add(ComponentTypeEnum.DATE_VALUE);
  37. ComponentTypeEnumSet.add(ComponentTypeEnum.MULTILINETEXT_VALUE);
  38. ComponentTypeEnumSet.add(ComponentTypeEnum.ID_CARD_NUMBER_VALUE);
  39. ComponentTypeEnumSet.add(ComponentTypeEnum.PHONE_NUMBER_VALUE);
  40. ComponentTypeEnumSet.add(ComponentTypeEnum.SIGN_AREA_VALUE);
  41. ComponentTypeEnumSet.add(ComponentTypeEnum.CHECKBOX_VALUE);
  42. ComponentTypeEnumSet.add(ComponentTypeEnum.RADIOBUTTON_VALUE);
  43. ComponentTypeEnumSet.add(ComponentTypeEnum.TICKBOX_VALUE);
  44. ComponentTypeEnumSet.add(ComponentTypeEnum.COMBOBOX_VALUE);
  45. ComponentTypeEnumSet.add(ComponentTypeEnum.DATESIGNATURE_VALUE);
  46. }
  47. @Override
  48. protected IObjectPK _save(Context ctx, IObjectValue model) throws BOSException, EASBizException {
  49. ESignTemplateInfo info = (ESignTemplateInfo) model;
  50. String eSignTemplateNum = info.getESignTemplateNum();
  51. if (StringUtils.isEmpty(eSignTemplateNum)) {
  52. throw new BOSException("e 签宝模板编码不能为空!");
  53. }
  54. BOSUuid id = info.getId();
  55. FilterInfo filter = new FilterInfo();
  56. FilterItemCollection filterItems = filter.getFilterItems();
  57. if (id != null) {
  58. filterItems.add(new FilterItemInfo("id", id.toString(), CompareType.NOTEQUALS));
  59. }
  60. filterItems.add(new FilterItemInfo("eSignTemplateNum", eSignTemplateNum));
  61. if (exists(ctx, filter)) {
  62. throw new BOSException(String.format("e 签宝模板编码[%s]已经存在!", eSignTemplateNum));
  63. }
  64. return super._save(ctx, model);
  65. }
  66. /**
  67. * 更新电子签名模板数据
  68. * 修复页面保存后 字段列表丢失bug
  69. *
  70. * @param ctx 系统上下文对象
  71. * @param pk 要更新的数据主键
  72. * @param model 要更新的数据
  73. * @throws BOSException 业务操作异常
  74. * @throws EASBizException EAS业务异常
  75. */
  76. @Override
  77. protected void _update(Context ctx, IObjectPK pk, IObjectValue model) throws BOSException, EASBizException {
  78. ESignTemplateInfo info = (ESignTemplateInfo) model;
  79. // 判断是否是同步操作,同步操作则不处理字段列表
  80. boolean isSyncAction = info.getBoolean("isSyncAction");
  81. if (!isSyncAction) {
  82. SelectorItemCollection sic = new SelectorItemCollection();
  83. sic.add("entrys.id");
  84. sic.add("entrys.fields.*");
  85. ESignTemplateInfo oldInfo = getESignTemplateInfo(ctx, pk, sic);
  86. ESignTemplateFileEntryCollection oldEntrys = oldInfo.getEntrys();
  87. Map<String, ESignTemplateFileEntryFieldCollection> entryFieldCollectionMap = new HashMap<String, ESignTemplateFileEntryFieldCollection>();
  88. for (int i = 0; i < oldEntrys.size(); i++) {
  89. ESignTemplateFileEntryInfo oldEntryInfo = oldEntrys.get(i);
  90. entryFieldCollectionMap.put(oldEntryInfo.getId().toString(), oldEntryInfo.getFields());
  91. }
  92. ESignTemplateFileEntryCollection entrys = info.getEntrys();
  93. for (int i = 0; i < entrys.size(); i++) {
  94. ESignTemplateFileEntryInfo entryInfo = entrys.get(i);
  95. if (entryInfo.getId() != null) {
  96. String entryId = entryInfo.getId().toString();
  97. ESignTemplateFileEntryFieldCollection fields = entryInfo.getFields();
  98. fields.clear();
  99. fields.addCollection(entryFieldCollectionMap.get(entryId));
  100. }
  101. }
  102. }
  103. super._update(ctx, pk, model);
  104. }
  105. /**
  106. * 删除电子签名模板数据
  107. *
  108. * @param ctx 系统上下文对象
  109. * @param pk 要删除数据的主键
  110. * @throws BOSException 业务操作异常
  111. * @throws EASBizException EAS业务异常
  112. */
  113. @Override
  114. protected void _delete(Context ctx, IObjectPK pk) throws BOSException, EASBizException {
  115. // 获取电子签名模板信息并检查状态
  116. ESignTemplateInfo info = getESignTemplateInfo(ctx, pk);
  117. BaseItemStateEnum state = info.getState();
  118. if (BaseItemStateEnum.ENABLE.equals(state)) {
  119. throw new BOSException("启用的数据,不允许删除!");
  120. }
  121. super._delete(ctx, pk);
  122. }
  123. /**
  124. * 同步模板字段
  125. *
  126. * @param ctx
  127. * @param billId
  128. * @throws BOSException
  129. * @throws EASBizException
  130. */
  131. @Override
  132. protected void _syncTemplateFields(Context ctx, String billId)
  133. throws BOSException, EASBizException {
  134. super._syncTemplateFields(ctx, billId);
  135. if (org.apache.commons.lang3.StringUtils.isBlank(billId)) {
  136. throw new EASBizException(EASBizException.CHECKBLANK, new Object[]{"单据id不能为空!"});
  137. }
  138. SelectorItemCollection sic = new SelectorItemCollection();
  139. sic.add("id");
  140. sic.add("entrys.*");
  141. sic.add("entrys.fields.*");
  142. ESignTemplateInfo info = getESignTemplateInfo(ctx, new ObjectUuidPK(billId), sic);
  143. ESignTemplateFileEntryCollection entrys = info.getEntrys();
  144. for (int i = 0; i < entrys.size(); i++) {
  145. ESignTemplateFileEntryInfo entryInfo = entrys.get(i);
  146. String eSignTemplateId = entryInfo.getESignTemplateId();
  147. try {
  148. ESignTemplateFileEntryFieldCollection fields = entryInfo.getFields();
  149. Map<String, ESignTemplateFileEntryFieldInfo> fieldMap = new HashMap<String, ESignTemplateFileEntryFieldInfo>();
  150. for (int j = 0; j < fields.size(); j++) {
  151. ESignTemplateFileEntryFieldInfo fieldInfo = fields.get(j);
  152. fieldMap.put(fieldInfo.getTemplateFieldId(), fieldInfo);
  153. }
  154. if (org.apache.commons.lang3.StringUtils.isNotBlank(eSignTemplateId)) {
  155. //throw new BOSException("e 签宝模板 id为空!");
  156. //1.调用接口获取模板字段
  157. EsignHttpResponse response = null;
  158. try {
  159. response = EsignHttpUtil.getDocTemplatesDetailById(ctx, eSignTemplateId);
  160. } catch (EsignException e) {
  161. e.printStackTrace();
  162. throw new BOSException("调用e签宝接口报错: " + e.getMessage());
  163. }
  164. String body = response.getBody();
  165. JSONObject jsonObject = JSONObject.parseObject(body);
  166. if (0 != jsonObject.getInteger("code")) {
  167. throw new BOSException(jsonObject.getString("message"));
  168. }
  169. JSONObject data = jsonObject.getJSONObject("data");
  170. //附件下载地址
  171. //String fileDownloadUrl = data.getString("fileDownloadUrl");
  172. JSONArray components = data.getJSONArray("components");
  173. //2.比较现有模板字段,如果新增字段则添加,删除字段就更新为失效
  174. for (int j = 0; j < components.size(); j++) {
  175. JSONObject component = components.getJSONObject(j);
  176. //控件类型
  177. Integer componentType = component.getInteger("componentType");
  178. if (!ComponentTypeEnumSet.contains(componentType)) {
  179. continue;
  180. }
  181. //组件id
  182. String componentId = component.getString("componentId");
  183. //组件编码(可以为空)
  184. String componentKey = component.getString("componentKey");
  185. //组件名称
  186. String componentName = component.getString("componentName");
  187. //是否必填
  188. boolean isRrequired = component.getBoolean("required");
  189. //组件排序,从1开始
  190. int componentOrder = component.getInteger("componentOrder");
  191. ESignTemplateFileEntryFieldInfo fieldInfo = fieldMap.get(componentId);
  192. if (fieldInfo != null) {
  193. fieldMap.remove(componentId);
  194. } else {
  195. fieldInfo = new ESignTemplateFileEntryFieldInfo();
  196. fieldInfo.setTemplateFieldId(componentId);
  197. fields.add(fieldInfo);
  198. }
  199. //修改字段名称
  200. fieldInfo.setTemplateFieldName(componentName);
  201. //修改字段排序
  202. fieldInfo.setSeq(componentOrder);
  203. //修改是否必填
  204. fieldInfo.setRequired(isRrequired);
  205. //组件编码
  206. fieldInfo.setTemplateFieldKey(componentKey);
  207. //控件类型
  208. fieldInfo.setComponentType(ComponentTypeEnum.getEnum(componentType));
  209. //控件数据格式
  210. JSONObject componentSpecialAttribute = component.getJSONObject("componentSpecialAttribute");
  211. fieldInfo.setDataFormat(componentSpecialAttribute.getString("dateFormat"));
  212. // JSONObject componentPosition = component.getJSONObject("componentPosition");
  213. // if (componentPosition != null) {
  214. // BigDecimal componentPositionX = componentPosition.getBigDecimal("componentPositionX");
  215. // BigDecimal componentPositionY = componentPosition.getBigDecimal("componentPositionY");
  216. // if (null != componentPositionX && null != componentPositionY) {
  217. // fieldInfo.setPositionX(componentPositionX);
  218. // fieldInfo.setPositionY(componentPositionY);
  219. // fieldInfo.setPageNum(componentPosition.getInteger("componentPageNum"));
  220. // fieldInfo.setPageRange(componentPosition.getString("componentPageRange"));
  221. // }
  222. // }
  223. }
  224. }
  225. if (!fieldMap.isEmpty()) {
  226. //已经失效的字段
  227. for (String componentId : fieldMap.keySet()) {
  228. fieldMap.get(componentId).setInvalid(true);
  229. }
  230. }
  231. entryInfo.setSyncStatus(SyncStatusEnum.SYNCED);
  232. entryInfo.setSyncResult("同步成功");
  233. } catch (BOSException e) {
  234. logger.error(e.getMessage(), e);
  235. entryInfo.setSyncStatus(SyncStatusEnum.SYNC_FAILED);
  236. entryInfo.setSyncResult(e.getMessage());
  237. // throw new RuntimeException(e);
  238. }
  239. entryInfo.setSyncTime(new Time(System.currentTimeMillis()));
  240. }
  241. //因为重写了更新方法,所以这里需要设置isSyncAction为true
  242. info.setBoolean("isSyncAction", true);
  243. update(ctx, new ObjectUuidPK(billId), info);
  244. //3.同步模板附件
  245. //syncTemplateAttachments(ctx, billId);
  246. }
  247. }