OtherESignConfigDataService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. package com.kingdee.eas.custom.esign.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.kingdee.bos.BOSException;
  4. import com.kingdee.bos.Context;
  5. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  6. import com.kingdee.bos.metadata.entity.EntityViewInfo;
  7. import com.kingdee.bos.metadata.entity.FilterInfo;
  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.sql.ParserException;
  12. import com.kingdee.bos.util.BOSObjectType;
  13. import com.kingdee.bos.util.BOSUuid;
  14. import com.kingdee.eas.common.EASBizException;
  15. import com.kingdee.eas.custom.dataconfig.utils.SqlUtils;
  16. import com.kingdee.eas.custom.entryconfig.DataConfigInfo;
  17. import com.kingdee.eas.custom.entryconfig.DataConfigSelectFieldEntryCollection;
  18. import com.kingdee.eas.custom.entryconfig.DataConfigSelectFieldEntryInfo;
  19. import com.kingdee.eas.custom.esign.*;
  20. import com.kingdee.eas.custom.esign.bizEnum.ComponentTypeEnum;
  21. import com.kingdee.eas.custom.esign.utils.ESignFieldMappingUtils;
  22. import com.kingdee.eas.fi.arap.util.DBUtil;
  23. import com.kingdee.jdbc.rowset.IRowSet;
  24. import java.sql.SQLException;
  25. import java.text.SimpleDateFormat;
  26. import java.util.Map;
  27. public class OtherESignConfigDataService implements IHRMsfService {
  28. @Override
  29. public Object process(Context context, Map map) throws EASBizException, BOSException {
  30. // 从参数映射中获取"number"参数值,用于定位配置信息
  31. Object o = map.get("number");
  32. // 从参数映射中获取"filter"参数值,用于构建查询过滤条件
  33. Object id = map.get("id");
  34. // 若"number"参数为null,返回空字符串(无效请求)
  35. if (o == null) {
  36. return "";
  37. }
  38. // 将"number"参数转换为字符串类型
  39. String number = o.toString();
  40. // 将"filter"参数转换为字符串类型(若为null则转换为"null"字符串)
  41. String filter = id.toString();
  42. // 声明实体视图信息对象,用于查询时的字段映射配置
  43. EntityViewInfo entityViewInfo = null;
  44. try {
  45. // 调用方法获取实体视图信息,该视图包含查询所需的字段映射配置
  46. entityViewInfo = this.getEntityViewInfo(number);
  47. } catch (ParserException e) {
  48. // 解析异常时,封装为运行时异常抛出
  49. throw new RuntimeException(e);
  50. }
  51. // 通过字段映射工厂,根据实体视图信息查询对应的字段映射集合
  52. FieldMappingCollection fieldMappingCollection = FieldMappingFactory.
  53. getLocalInstance(context).getFieldMappingCollection(entityViewInfo);
  54. // 创建SQL工具类实例,用于SQL语句的构建辅助
  55. //SqlUtils sqlUtils = new SqlUtils();
  56. // 创建电子签字段映射工具类实例,用于字段映射的核心处理
  57. ESignFieldMappingUtils utils = new ESignFieldMappingUtils();
  58. // 获取字段映射集合中的第一个映射信息(默认取第一个配置项)
  59. FieldMappingInfo fieldMappingInfo = fieldMappingCollection.get(0);
  60. // 获取当前字段映射信息中的明细项集合(包含具体的字段映射关系)
  61. FieldMappingEntryCollection entrys = fieldMappingInfo.getEntrys();
  62. // 获取当前字段映射信息对应的数据源配置
  63. //DataConfigInfo dataSource = fieldMappingInfo.getDataSource();
  64. // 验证数据源配置是否有效(非空且编号存在)
  65. //if (dataSource != null && dataSource.getNumber() != null && !dataSource.getNumber().equals("")) {
  66. // 通过工具类从字段映射明细中获取电子签SQL所需的字段集合
  67. //DataConfigSelectFieldEntryCollection eSignSqlField = utils.getESignSqlField(entrys);
  68. // 创建字符串构建器,用于拼接SQL查询的字段部分
  69. //StringBuilder sqlField = new StringBuilder();
  70. // 调用SQL工具类,将电子签字段集合拼接为SQL的SELECT子句
  71. //sqlUtils.getSelectField(eSignSqlField, sqlField);
  72. // 获取数据源配置的编号
  73. //String number1 = dataSource.getNumber();
  74. // 获取当前字段映射信息对应的电子签模板信息
  75. ESignTemplateInfo eSignFile = fieldMappingInfo.getESignFile();
  76. // if (sqlField.toString().equals("")) {
  77. // JSONObject jsonObject = this.reassembleData(eSignFile, context);
  78. // return jsonObject;
  79. // }
  80. // 通过工具类根据数据源编号和上下文获取电子签基础查询SQL
  81. //String eSignSql = utils.getESignSql(number1, context);
  82. // 替换SQL中的{{filed}}占位符为实际拼接的查询字段
  83. //eSignSql = eSignSql.replace("{{filed}}",sqlField.toString());
  84. // 在SQL末尾添加过滤条件(换行分隔,便于阅读)
  85. //eSignSql += "\n"+filter;
  86. // 执行SQL查询并将结果封装为JSON对象(包含字段映射关系)
  87. String eSignTemplateNum = eSignFile.getESignTemplateNum();
  88. JSONObject data = this.getData(getSql(filter), context, entrys,eSignTemplateNum);
  89. // 重新组装电子签模板数据为JSON对象
  90. JSONObject jsonObject = this.reassembleData(eSignFile,eSignTemplateNum, context);
  91. // 合并查询数据与模板数据,返回合并后的JSON对象
  92. JSONObject newJSONObject = utils.mergeAgreements(data, jsonObject);
  93. return newJSONObject;
  94. // }
  95. // else {
  96. // // 若数据源无效,直接获取电子签模板信息
  97. // ESignTemplateInfo eSignFile = fieldMappingInfo.getESignFile();
  98. // // 重新组装模板数据并返回
  99. // JSONObject jsonObject = this.reassembleData(eSignFile, context);
  100. // return jsonObject;
  101. // }
  102. }
  103. public String getSql(String id) {
  104. StringBuilder sql = new StringBuilder();
  105. sql.append("SELECT").append("\n");
  106. sql.append("person.FNAME_L2 AS person_name , -- 人员姓名").append("\n");
  107. sql.append("elation.FEnterDate eDate , --入职日期").append("\n");
  108. sql.append("-- 1. 固定工资(税前)= 标准基本工资+综合工资+其他工资+加班工资").append("\n");
  109. sql.append("ISNULL(SUM(CASE WHEN sitem.FNUMBER IN ('TD01', 'T012', 'T013', 'TD02') THEN fas.FMoney ELSE 0 END), 0) AS fixed_salary ,").append("\n");
  110. sql.append("-- 2. 试用期固定工资(税前)= 标准基本工资+综合工资+其他工资+加班工资").append("\n");
  111. sql.append(" ISNULL(SUM(CASE WHEN sitem.FNUMBER IN ('TD01', 'T012', 'T013', 'TD02') THEN fas.FMoney ELSE 0 END), 0) AS prob_fixed_salary ,").append("\n");
  112. sql.append(" -- 3. 绩效奖金(税前)= 标准绩效奖金").append("\n");
  113. sql.append("ISNULL(SUM(CASE WHEN sitem.FNUMBER = 'TD04' THEN fas.FMoney ELSE 0 END), 0) AS perf_bonus ,").append("\n");
  114. sql.append("-- 4. 试用期绩效奖金(税前)= 试用期标准绩效奖金").append("\n");
  115. sql.append(" ISNULL(SUM(CASE WHEN sitem.FNUMBER = 'TD74' THEN fas.FMoney ELSE 0 END), 0) AS prob_perf_bonus ,").append("\n");
  116. sql.append("-- 5. 国内餐补 = 餐补补贴").append("\n");
  117. sql.append("ISNULL(SUM(CASE WHEN sitem.FNUMBER = 'T025' THEN fas.FMoney ELSE 0 END), 0) AS domestic_meal_subsidy ,").append("\n");
  118. sql.append(" -- 6. 艰苦补贴 = 艰苦补贴").append("\n");
  119. sql.append("ISNULL(SUM(CASE WHEN sitem.FNUMBER = 'T038' THEN fas.FMoney ELSE 0 END), 0) AS hardship_subsidy ,").append("\n");
  120. sql.append("-- 7. 社保公积金补贴 = 社保公积金补贴").append("\n");
  121. sql.append("ISNULL(SUM(CASE WHEN sitem.FNUMBER = 'TD101' THEN fas.FMoney ELSE 0 END), 0) AS social_fund").append("\n");
  122. sql.append("FROM").append("\n");
  123. sql.append("T_bd_Person person").append("\n");
  124. sql.append(" LEFT JOIN T_HR_EmpLaborRelation elation on person.fid = elation.FPersonID").append("\n");
  125. sql.append("LEFT JOIN").append("\n");
  126. sql.append("T_HR_SFixAdjustSalary fas ON person.FID = fas.FPersonID").append("\n");
  127. sql.append(" LEFT JOIN").append("\n");
  128. sql.append("T_HR_SCmpItem sitem ON fas.FCmpItemID = sitem.FID").append("\n");
  129. sql.append("WHERE").append("\n");
  130. sql.append("sitem.FNUMBER IN ('TD01', 'T012', 'T013', 'TD02', 'TD04', 'TD74', 'T025', 'T038', 'TD101')").append("\n");
  131. BOSUuid read = BOSUuid.read(id);
  132. BOSObjectType type = read.getType();
  133. System.out.println(type.toString());
  134. if (type.toString().equals("7BD37592")){//id类型为合同
  135. sql.append("and person.fid in (select FEmployeeID from T_HR_EmployeeContract where fid = '"+id+"')").append("\n");
  136. }else if (type.toString().equals("80EF7DED")){//id类型为员工
  137. sql.append("and person.fid = '"+id+"'").append("\n");
  138. }
  139. sql.append(" GROUP BY").append("\n");
  140. sql.append("person.FID, person.FNAME_L2 , elation.FEnterDate").append("\n");
  141. sql.append("ORDER BY").append("\n");
  142. sql.append("person.FNAME_L2").append("\n");
  143. return sql.toString();
  144. }
  145. /**
  146. * 执行SQL查询并将结果封装为JSON对象
  147. *
  148. * @param sql 要执行的查询SQL
  149. * @param context 上下文对象
  150. * @param entrys 字段映射明细集合
  151. * @return 封装后的JSON对象,包含电子签模板各字段信息
  152. */
  153. public JSONObject getData(String sql, Context context, FieldMappingEntryCollection entrys,String eSignTemplateNum) {
  154. // 创建JSON对象用于存储最终封装的数据
  155. JSONObject jsonObject = new JSONObject();
  156. try {
  157. // 执行SQL查询,获取结果集
  158. IRowSet iRowSet1 = DBUtil.executeQuery(context, sql);
  159. // 遍历结果集中的每一行数据
  160. while (iRowSet1.next()) {
  161. // 遍历每个字段映射明细项
  162. for (int i = 0; i < entrys.size(); i++) {
  163. // 获取当前索引对应的字段映射明细信息
  164. FieldMappingEntryInfo fieldMappingEntryInfo = entrys.get(i);
  165. // 获取明细项中关联的电子签模板字段信息
  166. ESignTemplateFileEntryFieldInfo eField = fieldMappingEntryInfo.getEField();
  167. // 判断该字段是否无效(已废弃)
  168. boolean invalid = eField.isInvalid();
  169. // 若字段无效,跳过当前循环(不处理)
  170. if (invalid) {
  171. continue;
  172. }
  173. // 获取明细项中关联的电子签模板明细信息
  174. ESignTemplateFileEntryInfo template = fieldMappingEntryInfo.getTemplate();
  175. // 获取电子签模板的ID
  176. String eSignTemplateId = template.getESignTemplateId();
  177. // 从JSON对象中获取该模板ID对应的子JSON对象
  178. JSONObject templateJSON = jsonObject.getJSONObject(eSignTemplateId);
  179. // 若模板对应的子JSON对象不存在,则创建并初始化(设置ID和名称)
  180. if (templateJSON == null) {
  181. templateJSON = new JSONObject();
  182. templateJSON.put("id", eSignTemplateId); // 设置模板ID
  183. templateJSON.put("name", template.getName()); // 设置模板名称
  184. templateJSON.put("eSignTemplateNum",eSignTemplateNum);
  185. jsonObject.put(eSignTemplateId, templateJSON); // 将模板信息存入主JSON对象
  186. }
  187. // 从模板子JSON对象中获取字段信息对应的子JSON对象
  188. JSONObject fields = templateJSON.getJSONObject("fields");
  189. // 若字段信息子JSON对象不存在,则创建并添加到模板子JSON中
  190. if (fields == null) {
  191. fields = new JSONObject();
  192. templateJSON.put("fields", fields);
  193. }
  194. // 获取电子签模板字段的ID
  195. String templateFieldId = eField.getTemplateFieldId();
  196. // 创建用于存储字段值信息的JSON对象
  197. JSONObject value = new JSONObject();
  198. value.put("name", eField.getTemplateFieldName()); // 设置字段名称
  199. // 获取明细项中关联的数据源字段信息
  200. //DataConfigSelectFieldEntryInfo dataSourceField = fieldMappingEntryInfo.getDataSourceField();
  201. // if (dataSourceField==null){
  202. // value.put("value","");
  203. // value.put("dataFormat", eField.getDataFormat());
  204. // }else {
  205. // 获取数据源字段的映射键(对应数据库列名)
  206. String name = fieldMappingEntryInfo.getEFieldMark();
  207. // 去除映射键中的双引号(处理可能的格式问题)
  208. //name = name.replace("\"", "");
  209. // 从结果集中获取该字段对应的值,并存入字段值JSON对象
  210. if (name != null && !name.equals("")) {
  211. Object object = null;
  212. try {
  213. object= iRowSet1.getObject(name);
  214. }catch (Exception e){
  215. object= null;
  216. }
  217. value.put("value",object);
  218. }
  219. // 设置字段的数据类型(取自数据源字段的类型别名)
  220. //value.put("dataType", dataSourceField.getDataType().getAlias());
  221. // if (dataSourceField.getDataType().getAlias().equals("Date")) {
  222. // Object object = iRowSet1.getObject(name);
  223. // if (object != null) {
  224. // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
  225. // value.put("value", simpleDateFormat.format(iRowSet1.getDate(name)));
  226. // }
  227. // value.put("dataFormat", eField.getDataFormat());
  228. // }
  229. //}
  230. if (eField.getComponentType().getValue() == 6 || eField.getComponentType().getValue() == 106) {
  231. value.put("positionX", eField.getPositionX());
  232. value.put("positionY", eField.getPositionY());
  233. value.put("pageNum", eField.getPageNum());
  234. }
  235. // 将字段值信息存入字段信息子JSON对象(以模板字段ID为键)
  236. fields.put(templateFieldId, value);
  237. }
  238. }
  239. } catch (BOSException e) {
  240. // BOS异常时,封装为运行时异常抛出
  241. throw new RuntimeException(e);
  242. } catch (SQLException e) {
  243. // SQL异常时,封装为运行时异常抛出
  244. throw new RuntimeException(e);
  245. }
  246. // 返回封装好的JSON对象
  247. return jsonObject;
  248. }
  249. /**
  250. * 构建查询字段映射信息的实体视图
  251. *
  252. * @param number 字段映射的编号,用于过滤
  253. * @return 构建好的实体视图信息
  254. * @throws ParserException 解析异常
  255. */
  256. public EntityViewInfo getEntityViewInfo(String number) throws ParserException {
  257. // 创建实体视图信息对象
  258. EntityViewInfo entityViewInfo = new EntityViewInfo();
  259. // 创建选择项集合,用于指定查询返回的字段
  260. SelectorItemCollection selectorItemCollection = new SelectorItemCollection();
  261. selectorItemCollection.add("*"); // 选择所有基础字段
  262. selectorItemCollection.add("eSignFile.*"); // 选择关联的电子签文件的所有字段
  263. selectorItemCollection.add("dataSource.*"); // 选择关联的数据源的所有字段
  264. selectorItemCollection.add("entrys.*"); // 选择关联的明细项的所有字段
  265. selectorItemCollection.add("entrys.eField.*"); // 选择明细项中电子签字段的所有字段
  266. selectorItemCollection.add("entrys.dataSourceField.*"); // 选择明细项中数据源字段的所有字段
  267. selectorItemCollection.add("entrys.template.*"); // 选择明细项中模板的所有字段
  268. // 为实体视图设置选择项(指定查询返回的字段集)
  269. entityViewInfo.setSelector(selectorItemCollection);
  270. // 创建过滤信息对象,用于设置查询条件
  271. FilterInfo filterInfo = new FilterInfo();
  272. // 添加过滤条件:字段映射的编号等于传入的number
  273. filterInfo.getFilterItems().add(new FilterItemInfo("number", number));
  274. // 为实体视图设置过滤条件
  275. entityViewInfo.setFilter(filterInfo);
  276. // 返回构建好的实体视图信息
  277. return entityViewInfo;
  278. }
  279. /**
  280. * 重新组装数据(当前未实现完整逻辑,仅基础框架)
  281. *
  282. * @param eSignFile 电子签模板信息
  283. * @param context 上下文对象
  284. * @return 重新组装后的JSON对象(数据可能为null)
  285. */
  286. public JSONObject reassembleData(ESignTemplateInfo eSignFile,String eSignTemplateNum, Context context) {
  287. // 获取电子签模板的ID
  288. BOSUuid id = eSignFile.getId();
  289. // 声明用于存储组装后数据的JSON对象
  290. JSONObject dataJSON;
  291. try {
  292. // 初始化数据JSON对象
  293. dataJSON = new JSONObject();
  294. // 创建实体视图信息对象
  295. EntityViewInfo entityViewInfo = new EntityViewInfo();
  296. // 创建选择项集合,指定查询返回的字段
  297. SelectorItemCollection selectorItemCollection = new SelectorItemCollection();
  298. selectorItemCollection.add("*"); // 选择所有基础字段
  299. selectorItemCollection.add("Parent1.*"); // 选择父级对象的所有字段
  300. // 为实体视图设置选择项
  301. entityViewInfo.setSelector(selectorItemCollection);
  302. // 创建过滤信息对象
  303. FilterInfo filterInfo = new FilterInfo();
  304. // 添加过滤条件:字段未失效(Invalid为false)
  305. filterInfo.getFilterItems().add(new FilterItemInfo("Invalid", 1, CompareType.NOTEQUALS));
  306. // 添加过滤条件:父级的父级ID等于电子签模板ID
  307. filterInfo.getFilterItems().add(new FilterItemInfo("Parent1.Parent.id", id));
  308. // 为实体视图设置过滤条件
  309. entityViewInfo.setFilter(filterInfo);
  310. // 根据实体视图查询电子签模板字段明细集合
  311. ESignTemplateFileEntryFieldCollection eFields = ESignTemplateFileEntryFieldFactory.
  312. getLocalInstance(context).getESignTemplateFileEntryFieldCollection(entityViewInfo);
  313. // 遍历字段明细集合
  314. for (int i = 0; i < eFields.size(); i++) {
  315. // 获取当前索引对应的电子签模板字段明细
  316. ESignTemplateFileEntryFieldInfo eFile = eFields.get(i);
  317. // 获取该字段明细的父级对象(模板明细)
  318. ESignTemplateFileEntryInfo parent1 = eFile.getParent1();
  319. // 获取电子签模板ID
  320. String eSignTemplateId = parent1.getESignTemplateId();
  321. // 获取电子签模板名称
  322. String name = parent1.getName();
  323. // 从数据JSON中获取模板ID对应的子JSON对象
  324. JSONObject signTemplate = dataJSON.getJSONObject(eSignTemplateId);
  325. // 若模板子JSON对象不存在,则创建并初始化
  326. if (signTemplate == null) {
  327. signTemplate = new JSONObject();
  328. signTemplate.put("name", name); // 设置模板名称
  329. signTemplate.put("id", eSignTemplateId); // 设置模板ID
  330. signTemplate.put("eSignTemplateNum",eSignTemplateNum);
  331. JSONObject fields = new JSONObject(); // 创建字段信息JSON对象
  332. signTemplate.put("fields", fields); // 将字段信息存入模板JSON
  333. dataJSON.put(eSignTemplateId, signTemplate);
  334. }
  335. // 从模板子JSON中获取字段信息JSON对象
  336. JSONObject fields = signTemplate.getJSONObject("fields");
  337. // 获取模板字段ID
  338. String templateFieldId = eFile.getTemplateFieldId();
  339. // 从字段信息JSON中获取该字段ID对应的子JSON对象
  340. JSONObject field = fields.getJSONObject(templateFieldId);
  341. // 若字段子JSON对象不存在,则创建并添加到字段信息JSON
  342. if (field == null) {
  343. field = new JSONObject();
  344. fields.put(templateFieldId, field);
  345. }
  346. // 获取模板字段名称
  347. String templateFieldName = eFile.getTemplateFieldName();
  348. // 设置字段名称到字段子JSON
  349. field.put("name", templateFieldName);
  350. // 获取字段组件类型
  351. ComponentTypeEnum componentType = eFile.getComponentType();
  352. // 设置字段数据类型(取自组件类型的别名)
  353. field.put("dataType", componentType.getAlias());
  354. field.put("dataFormat", eFile.getDataFormat());
  355. field.put("isRequired", eFile.isRequired());
  356. field.put("seq", eFile.getSeq());
  357. // 字段值暂设为null
  358. field.put("value", null);
  359. }
  360. } catch (BOSException e) {
  361. // BOS异常时,封装为运行时异常抛出
  362. throw new RuntimeException(e);
  363. }
  364. // 返回重新组装后的JSON对象
  365. return dataJSON;
  366. }
  367. }