SubmitShemeTemplateEditHandler.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. package com.kingdee.eas.custom.compensation.handler;
  2. import com.google.common.collect.Maps;
  3. import com.kingdee.bos.BOSException;
  4. import com.kingdee.bos.Context;
  5. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  6. import com.kingdee.bos.metadata.entity.LinkPropertyInfo;
  7. import com.kingdee.bos.metadata.entity.PropertyInfo;
  8. import com.kingdee.bos.util.BOSUuid;
  9. import com.kingdee.eas.base.attachment.AttachmentFactory;
  10. import com.kingdee.eas.base.attachment.AttachmentInfo;
  11. import com.kingdee.eas.base.attachment.IAttachment;
  12. import com.kingdee.eas.basedata.org.HROrgUnitInfo;
  13. import com.kingdee.eas.common.EASBizException;
  14. import com.kingdee.eas.custom.compensation.*;
  15. import com.kingdee.eas.custom.compensation.utils.TemplateUtil;
  16. import com.kingdee.eas.framework.CoreBaseInfo;
  17. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  18. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  19. import com.kingdee.shr.base.syssetting.util.MetaDataUtil;
  20. import com.kingdee.shr.base.syssetting.util.SelectItem;
  21. import com.kingdee.shr.base.syssetting.web.handler.EditHandler;
  22. import com.kingdee.shr.compensation.app.integrate.*;
  23. import com.kingdee.shr.ml.util.SHRServerResource;
  24. import org.apache.commons.lang3.StringUtils;
  25. import org.springframework.ui.ModelMap;
  26. import javax.servlet.http.HttpServletRequest;
  27. import javax.servlet.http.HttpServletResponse;
  28. import java.io.IOException;
  29. import java.util.*;
  30. /**
  31. * @Description 提报套打模板EditHandler
  32. * @Date 2025/9/15 17:24
  33. * @Created by heyuan
  34. */
  35. public class SubmitShemeTemplateEditHandler extends EditHandler {
  36. private static final Set hidenFields = new HashSet();
  37. private static final Map<String, String> approveFieldMap = new HashMap<>();
  38. private final String RESOURCECLASS = "com.kingdee.eas.custom.compensation.SubmitShemeTemplateResource";
  39. public SubmitShemeTemplateEditHandler() {
  40. super();
  41. hidenFields.add("id");
  42. hidenFields.add("tempId");
  43. hidenFields.add("entry");
  44. hidenFields.add("lastUpdateTime");
  45. hidenFields.add("lastUpdateUser");
  46. hidenFields.add("createTime");
  47. hidenFields.add("CU");
  48. hidenFields.add("creator");
  49. hidenFields.add("sourceBillId");
  50. hidenFields.add("hasEffected");
  51. hidenFields.add("isMultiEntry");
  52. hidenFields.add("hrOrgUnit");
  53. hidenFields.add("costType");
  54. hidenFields.add("datasource");
  55. hidenFields.add("isInner");
  56. hidenFields.add("isSsc");
  57. hidenFields.add("approveType");
  58. hidenFields.add("handler");
  59. hidenFields.add("auditor");
  60. hidenFields.add("sourceFunction");
  61. hidenFields.add("billSource");
  62. hidenFields.add("codingRuleHelper");
  63. //分录
  64. hidenFields.add("entry.bill");
  65. hidenFields.add("entry.id");
  66. hidenFields.add("entry.CU");
  67. hidenFields.add("entry.lastUpdateTime");
  68. hidenFields.add("entry.lastUpdateUser");
  69. hidenFields.add("entry.createTime");
  70. hidenFields.add("entry.creator");
  71. hidenFields.add("entry.useDefault");
  72. hidenFields.add("entry.ifsalaryshow");
  73. hidenFields.add("entry.dealStatus");
  74. hidenFields.add("entry.isCal");
  75. hidenFields.add("entry.description");
  76. hidenFields.add("entry.cmpEmpORelation");
  77. hidenFields.add("entry.transTime");
  78. hidenFields.add("entry.hrOrgUnit");
  79. hidenFields.add("entry.s81");
  80. hidenFields.add("entry.s66");
  81. hidenFields.add("entry.s76");
  82. hidenFields.add("entry.s70");
  83. hidenFields.add("entry.s69");
  84. hidenFields.add("entry.s68");
  85. hidenFields.add("entry.s67");
  86. hidenFields.add("entry.s62");
  87. hidenFields.add("entry.s61");
  88. hidenFields.add("entry.s65");
  89. hidenFields.add("entry.s64");
  90. hidenFields.add("entry.s63");
  91. hidenFields.add("entry.s75");
  92. hidenFields.add("entry.s74");
  93. hidenFields.add("entry.s73");
  94. hidenFields.add("entry.s72");
  95. hidenFields.add("entry.s20");
  96. hidenFields.add("entry.s79");
  97. hidenFields.add("entry.s77");
  98. hidenFields.add("entry.s80");
  99. hidenFields.add("entry.s71");
  100. hidenFields.add("entry.s78");
  101. hidenFields.add("entry.s73");
  102. hidenFields.add("entry.s73");
  103. hidenFields.add("entry.s73");
  104. hidenFields.add("entry.s73");
  105. approveFieldMap.put("approveHis.multiapprove.createtime", "审批时间");
  106. approveFieldMap.put("approveHis.personid.name", "审批人");
  107. approveFieldMap.put("approveHis.assigndetail.actdefname", "任务");
  108. approveFieldMap.put("approveHis.multiapprove.handleropinion", "处理策略");
  109. approveFieldMap.put("approveHis.multiapprove.opinion", "审批意见");
  110. }
  111. /**
  112. * 创建新模型后的处理方法
  113. *
  114. * @param request HTTP请求对象
  115. * @param response HTTP响应对象
  116. * @param coreBaseInfo 核心基础信息对象
  117. * @throws SHRWebException SHRWeb异常
  118. */
  119. @Override
  120. protected void afterCreateNewModel(
  121. HttpServletRequest request,
  122. HttpServletResponse response,
  123. CoreBaseInfo coreBaseInfo
  124. ) throws SHRWebException {
  125. super.afterCreateNewModel(request, response, coreBaseInfo);
  126. SubmitShemeTemplateInfo info = (SubmitShemeTemplateInfo) coreBaseInfo;
  127. HROrgUnitInfo hrOrgUnitInfo = new HROrgUnitInfo();
  128. hrOrgUnitInfo.setId(BOSUuid.read("00000000-0000-0000-0000-000000000000CCE7AED4"));
  129. info.setHrOrgUnit(hrOrgUnitInfo);
  130. }
  131. /**
  132. * 获取提报方案字段
  133. *
  134. * @param submitSchemeId 提报方案id
  135. * @return
  136. * @throws SHRWebException
  137. */
  138. public List<SelectItem> getSubmitSchemeIdFields(String submitSchemeId) throws SHRWebException {
  139. Context ctx = this.getContext();
  140. if (StringUtils.isBlank(submitSchemeId)) {
  141. throw new ShrWebBizException("提报方案id不能为空!</br> The reported proposal ID must not be blank!");
  142. }
  143. //获取提报方案字段
  144. boolean dynamicColmunRequired = true;
  145. Map<String, Object> params = Maps.newHashMap();
  146. params.put("datasource", 1);
  147. params.put("costTypeId", "");
  148. params.put("dynamicColmunRequired", dynamicColmunRequired);
  149. params.put("hrOrgUnitId", "");
  150. Map<String, PropertyInfo> properties = MetaDataUtil.getProperties(getContext(), new BatchSubmitShemeBill().getName());
  151. Map<String, PropertyInfo> entryInfoProperties = MetaDataUtil.getProperties(getContext(), new BatchSubmitShemeBillEntry().getName());
  152. List<SelectItem> list = new ArrayList();
  153. for (String name : properties.keySet()) {
  154. if (hidenFields.contains(name)) {
  155. continue;
  156. }
  157. PropertyInfo propertyInfo = properties.get(name);
  158. String alias = propertyInfo.getAlias();
  159. if (propertyInfo instanceof LinkPropertyInfo) {
  160. //连接属性
  161. SelectItem nameItem = new SelectItem();
  162. nameItem.setValue(name + ".name");
  163. setSelectAlias(ctx, nameItem, alias + ".Name", alias + ".名称");
  164. list.add(nameItem);
  165. //连接属性
  166. SelectItem numberItem = new SelectItem();
  167. numberItem.setValue(name + ".number");
  168. setSelectAlias(ctx, numberItem, alias + ".Code", alias + ".编码");
  169. list.add(numberItem);
  170. } else {
  171. SelectItem item = new SelectItem();
  172. item.setValue(name);
  173. item.setAlias(alias);
  174. list.add(item);
  175. }
  176. }
  177. //2.分录属性
  178. SelectItem snItem = new SelectItem();
  179. snItem.setValue("entry.SN");
  180. setSelectAlias(ctx, snItem, "Entry.SN", "分录.序号");
  181. list.add(snItem);
  182. for (String name : entryInfoProperties.keySet()) {
  183. PropertyInfo propertyInfo = entryInfoProperties.get(name);
  184. String entryPropertyName = "entry." + name;
  185. if (hidenFields.contains(entryPropertyName)) {
  186. continue;
  187. }
  188. if (propertyInfo instanceof LinkPropertyInfo) {
  189. //连接属性
  190. SelectItem nameItem = new SelectItem();
  191. nameItem.setValue(entryPropertyName + ".name");
  192. setSelectAlias(ctx, nameItem,
  193. "Entry." + propertyInfo.getAlias() + ".Name",
  194. "分录." + propertyInfo.getAlias() + ".名称");
  195. list.add(nameItem);
  196. SelectItem numberItem = new SelectItem();
  197. numberItem.setValue(entryPropertyName + ".number");
  198. setSelectAlias(ctx, numberItem,
  199. "Entry." + propertyInfo.getAlias() + ".Code",
  200. "分录." + propertyInfo.getAlias() + ".编码");
  201. list.add(numberItem);
  202. } else {
  203. SelectItem item = new SelectItem();
  204. item.setValue(entryPropertyName);
  205. setSelectAlias(ctx, item, "Entry." + propertyInfo.getAlias(), "分录." + propertyInfo.getAlias());
  206. list.add(item);
  207. }
  208. }
  209. //3.获取提报方案项
  210. CalSubmitSchemeItemCollection schemeItemCols;
  211. try {
  212. schemeItemCols = CalSubmitSchemeItemFactory.getLocalInstance(ctx).getCalSubmitSchemeItemCollection("select calSubmitItem.*,isRequired where calSubmitScheme = '" + submitSchemeId + "' and isShow = 1 and state = 1 order by sortSn asc");
  213. } catch (BOSException e) {
  214. throw new SHRWebException(e.getMessage(), e);
  215. }
  216. for (int i = 0; i < schemeItemCols.size(); ++i) {
  217. CalSubmitSchemeItemInfo calSchemeItem = schemeItemCols.get(i);
  218. CalSubmitItemInfo calItem = calSchemeItem.getCalSubmitItem();
  219. String alias = calItem.getName();
  220. String propName = "schemeItem.S" + calItem.getFieldSn();
  221. //多语言资源
  222. SelectItem item = new SelectItem();
  223. //连接属性
  224. item.setValue(propName);
  225. setSelectAlias(ctx, item, "Entry." + alias, "分录." + alias);
  226. list.add(item);
  227. }
  228. //4.获取审批人信息字段
  229. for (String name : approveFieldMap.keySet()) {
  230. SelectItem item = new SelectItem();
  231. String localName = SHRServerResource.getString(RESOURCECLASS, name, ctx);
  232. item.setValue(name);
  233. if (StringUtils.isNotBlank(localName) && !"Missing Resource".equalsIgnoreCase(localName)) {
  234. item.setAlias(localName);
  235. } else {
  236. item.setAlias("审批历史." + approveFieldMap.get(name));
  237. }
  238. list.add(item);
  239. }
  240. //返回数据
  241. return list;
  242. }
  243. private void setSelectAlias(Context ctx, SelectItem item, String enName, String cnName) {
  244. if (ctx.getLocale().getLanguage().equalsIgnoreCase("l1")) {
  245. item.setAlias(enName);
  246. } else {
  247. item.setAlias(cnName);
  248. }
  249. }
  250. /**
  251. * 创建新模型数据
  252. *
  253. * @param request
  254. * @param response
  255. * @param modelMap
  256. * @return
  257. * @throws SHRWebException
  258. */
  259. public void addEntryDataAction(
  260. HttpServletRequest request,
  261. HttpServletResponse response,
  262. ModelMap modelMap
  263. ) throws SHRWebException {
  264. //附件id
  265. String attachmentId = request.getParameter("attachmentId");
  266. //提报方案id
  267. String submitSchemeId = request.getParameter("submitSchemeId");
  268. if (StringUtils.isBlank(attachmentId)) {
  269. throw new ShrWebBizException("附件id不能为空!</br> Attachment ID cannot be empty!");
  270. }
  271. if (StringUtils.isBlank(submitSchemeId)) {
  272. throw new ShrWebBizException("提报方案id不能为空!</br> Submission Plan ID cannot be empty!");
  273. }
  274. Context ctx = this.getContext();
  275. try {
  276. IAttachment iAttachment = AttachmentFactory.getLocalInstance(ctx);
  277. //获取附件信息
  278. AttachmentInfo attachmentInfo = iAttachment.getAttachmentInfo(new ObjectUuidPK(attachmentId));
  279. byte[] file = attachmentInfo.getFile();
  280. if (file == null) {
  281. throw new ShrWebBizException("附件为空!</br> The attachment is empty!");
  282. }
  283. //提取模板字段
  284. Set<String> fields = TemplateUtil.extractVariablesFromWord(file);
  285. if (fields.isEmpty()) {
  286. throw new ShrWebBizException("未匹配到模板字段! </br> No template field matched!");
  287. }
  288. List<SubmitShemeTemplateEntryInfo> entryInfos = new ArrayList<SubmitShemeTemplateEntryInfo>();
  289. for (String field : fields) {
  290. //提报套打模板分录
  291. SubmitShemeTemplateEntryInfo entryInfo = new SubmitShemeTemplateEntryInfo();
  292. //必须创建id,不然表单页面表格因为没有id会报错
  293. entryInfo.setId(BOSUuid.create(entryInfo.getBOSType()));
  294. entryInfo.setTemplateField(field);
  295. entryInfos.add(entryInfo);
  296. }
  297. //获取提报方案字段
  298. List<SelectItem> submitSchemeIdFields = getSubmitSchemeIdFields(submitSchemeId);
  299. modelMap.put("submitSchemeFields", submitSchemeIdFields);
  300. modelMap.put("entryInfos", entryInfos);
  301. //返回数据
  302. this.writeSuccessData(modelMap);
  303. } catch (BOSException e) {
  304. throw new ShrWebBizException(e);
  305. } catch (EASBizException e) {
  306. throw new ShrWebBizException(e);
  307. } catch (IOException e) {
  308. throw new ShrWebBizException(e);
  309. }
  310. }
  311. /**
  312. *
  313. * @param request
  314. * @param response
  315. * @param model
  316. * @throws SHRWebException
  317. */
  318. @Override
  319. protected void beforeSave(
  320. HttpServletRequest request,
  321. HttpServletResponse response,
  322. CoreBaseInfo model
  323. ) throws SHRWebException {
  324. super.beforeSave(request, response, model);
  325. SubmitShemeTemplateInfo info = (SubmitShemeTemplateInfo) model;
  326. //提报方案
  327. SubmitShemeTemplateEntryCollection entry = info.getEntry();
  328. Set<String> billProperties = new HashSet<String>();
  329. Set<String> entryProperties = new HashSet<String>();
  330. Set<String> schemeItemProperties = new HashSet<String>();
  331. Set<String> selectItemCol = new HashSet<String>();
  332. for (int i = 0; i < entry.size(); i++) {
  333. SubmitShemeTemplateEntryInfo entryInfo = entry.get(i);
  334. String column = entryInfo.getColumn();
  335. if (StringUtils.isBlank(column)) {
  336. throw new ShrWebBizException("请选择字段!</br> Please select a field!");
  337. }
  338. if (column.contains("entry.")) {
  339. entryProperties.add(column);
  340. } else if (column.contains("schemeItem.")) {
  341. schemeItemProperties.add(column.substring("schemeItem.".length()));
  342. } else if (column.contains("approveHis.")) {
  343. continue;
  344. } else {
  345. billProperties.add(column);
  346. }
  347. }
  348. selectItemCol.addAll(billProperties);
  349. selectItemCol.addAll(entryProperties);
  350. info.setBillProperties(StringUtils.join(billProperties, ","));
  351. info.setEntryProperties(StringUtils.join(entryProperties, ","));
  352. info.setSelectItemCol(StringUtils.join(selectItemCol, ","));
  353. info.setSchemeItems(StringUtils.join(schemeItemProperties, ","));
  354. }
  355. /**
  356. * 初始化模型数据
  357. *
  358. * @param request
  359. * @param response
  360. * @param coreBaseInfo
  361. * @throws SHRWebException
  362. */
  363. @Override
  364. protected void afterInitModel(
  365. HttpServletRequest request,
  366. HttpServletResponse response,
  367. CoreBaseInfo coreBaseInfo
  368. ) throws SHRWebException {
  369. super.afterInitModel(request, response, coreBaseInfo);
  370. String operateStatus = (String) request.getAttribute("operateState");
  371. SubmitShemeTemplateInfo info = (SubmitShemeTemplateInfo) coreBaseInfo;
  372. CalSubmitSchemeInfo calSubmitScheme = info.getCalSubmitScheme();
  373. if (calSubmitScheme != null) {
  374. String submitSchemeId = calSubmitScheme.getId().toString();
  375. //当页面状态查看或编辑状态时,把自定义枚举字段的value改为枚举名称
  376. if ("view".equalsIgnoreCase(operateStatus) || "edit".equalsIgnoreCase(operateStatus)) {
  377. SubmitShemeTemplateEntryCollection entrys = info.getEntry();
  378. //获取提报方案字段
  379. List<SelectItem> submitSchemeFields = getSubmitSchemeIdFields(submitSchemeId);
  380. //当页面状态为编辑状态时,获取提报方案字段
  381. if ("edit".equalsIgnoreCase(operateStatus)) {
  382. Map initData = (Map) request.getAttribute("view_initData");
  383. initData.put("submitSchemeFields", submitSchemeFields);
  384. }
  385. for (int i = 0; i < entrys.size(); i++) {
  386. SubmitShemeTemplateEntryInfo submitShemeTemplateEntryInfo = entrys.get(i);
  387. String column = submitShemeTemplateEntryInfo.getColumn();
  388. submitSchemeFields.stream().filter(
  389. item -> item.getValue().equals(column)
  390. ).findFirst().ifPresent(
  391. item -> submitShemeTemplateEntryInfo.setColumn(item.getAlias()
  392. )
  393. );
  394. }
  395. }
  396. }
  397. }
  398. /**
  399. * 校验模型数据
  400. *
  401. * @param request
  402. * @param response
  403. * @param model
  404. * @throws SHRWebException
  405. */
  406. @Override
  407. protected void verifyModel(
  408. HttpServletRequest request,
  409. HttpServletResponse response,
  410. CoreBaseInfo model
  411. ) throws SHRWebException {
  412. super.verifyModel(request, response, model);
  413. SubmitShemeTemplateInfo info = (SubmitShemeTemplateInfo) model;
  414. //提报方案
  415. CalSubmitSchemeInfo calSubmitScheme = info.getCalSubmitScheme();
  416. if (calSubmitScheme == null) {
  417. throw new ShrWebBizException("提报方案不能为空! !</br> Submission Plan cannot be empty!");
  418. }
  419. SubmitShemeTemplateEntryCollection entrys = info.getEntry();
  420. if (entrys.isEmpty()) {
  421. throw new ShrWebBizException("分录字段不能为空! </br> The accounting entry field cannot be empty!");
  422. }
  423. }
  424. }