ESignTemplateControllerBean.java 13 KB

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