TimepieceSchemeBillEditHandlerEx.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. package com.kingdee.shr.compensation.web.handler.timepiece.bill;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.metadata.entity.EntityViewInfo;
  5. import com.kingdee.bos.metadata.entity.FilterInfo;
  6. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  7. import com.kingdee.bos.metadata.entity.SelectorItemCollection;
  8. import com.kingdee.bos.metadata.entity.SelectorItemInfo;
  9. import com.kingdee.bos.metadata.query.util.CompareType;
  10. import com.kingdee.eas.framework.CoreBaseInfo;
  11. import com.kingdee.eas.util.ToolUtils;
  12. import com.kingdee.shr.base.syssetting.context.SHRContext;
  13. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  14. import com.kingdee.shr.compensation.app.integrate.*;
  15. import com.kingdee.shr.compensation.app.utils.DateRange;
  16. import com.kingdee.shr.compensation.app.utils.SubmitShemeUtils;
  17. import com.kingdee.shr.compensation.exception.ExceptionHandle;
  18. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  19. import java.text.SimpleDateFormat;
  20. import java.util.ArrayList;
  21. import java.util.Date;
  22. import java.util.HashMap;
  23. import java.util.HashSet;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.Set;
  27. import javax.servlet.http.HttpServletRequest;
  28. import javax.servlet.http.HttpServletResponse;
  29. import org.apache.commons.lang3.ObjectUtils;
  30. import org.apache.commons.lang3.StringUtils;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.ui.ModelMap;
  34. /**
  35. * 提报单拓展
  36. * @author coyle
  37. * 20250520
  38. */
  39. public class TimepieceSchemeBillEditHandlerEx extends TimepieceSchemeBillEditHandler {
  40. private static Logger logger = LoggerFactory.getLogger(TimepieceSchemeBillEditHandlerEx.class);
  41. private static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
  42. //完成率
  43. // private static String COMRATE = "MQ005";
  44. // //岗位类型
  45. // private static String JOBTYPE = "MQ004";
  46. // //技能等级 SKILLLEVEL
  47. // private static String SKILLLEVEL = "MQ003";
  48. // //是否现场作业 On site
  49. // private static String ONSITE = "MQ007";
  50. // //班组任职 Team app
  51. // private static String TEAMAPP = "MQ007";
  52. // //工资序列 Salary seq
  53. // private static String SALARYSEQ = "MQ007";
  54. //
  55. // private static String[] ITEMNUMS = {COMRATE,JOBTYPE,SKILLLEVEL,ONSITE,TEAMAPP,SALARYSEQ};
  56. //
  57. // private static Map<String,String> FEILDS = new HashMap();
  58. // public TimepieceSchemeBillEditHandlerEx() throws BOSException {
  59. // Context ctx = SHRContext.getInstance().getContext();
  60. // CalSubmitItemCollection subColl = CalSubmitItemFactory.getLocalInstance(ctx)
  61. // .getCalSubmitItemCollection("SELECT ID,FieldSn,number where number in (" + ToolUtils.aryToStr(ITEMNUMS) + ")");
  62. // if (subColl != null && subColl.size() > 0) {
  63. // for (int i =0 ;i<subColl.size();i++) {
  64. // CalSubmitItemInfo itemInfo = subColl.get(i);
  65. // if (itemInfo != null) {
  66. // String columnName = "S" + itemInfo.getFieldSn();
  67. // FEILDS.put(itemInfo.getNumber() , columnName);
  68. // }
  69. // }
  70. // }
  71. // }
  72. protected void beforeSave(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
  73. throws SHRWebException {
  74. super.beforeSave(request, response, model);
  75. Context ctx = SHRContext.getInstance().getContext();
  76. BatchSubmitShemeBillInfo info = (BatchSubmitShemeBillInfo) model;
  77. BatchSubmitShemeBillEntryCollection entry = info.getEntry();
  78. String billId = "";
  79. if(ObjectUtils.allNotNull(info.getId())) {
  80. billId = info.getId().toString();
  81. }
  82. //拉取mes点检率数据
  83. exeDataOnDay( request,billId,entry);
  84. //先重置点检率标识
  85. SubmitShemeUtils.reductionInspectionRate( ctx, info);
  86. //更新点检率数据
  87. Set<String> checkbillIds = (Set<String> ) request.getAttribute("checkbillIds");
  88. SubmitShemeUtils.updateInspectionRate(ctx, info,checkbillIds);
  89. }
  90. /**
  91. * 数据处理
  92. * 校验对应的某一天已存在数据/mes数据获取等
  93. * @param billId
  94. * @param entrys
  95. * @throws SHRWebException
  96. */
  97. public void exeDataOnDay(HttpServletRequest request,String billId,BatchSubmitShemeBillEntryCollection entrys) throws SHRWebException {
  98. Context ctx = SHRContext.getInstance().getContext();
  99. Map<String, Set<String>> personDateMap = new HashMap<>();
  100. //
  101. HashSet<String> selectPerson = new HashSet();
  102. HashSet<String> selectDate = new HashSet();
  103. for (int i = 0; i < entrys.size(); i++) {
  104. BatchSubmitShemeBillEntryInfo entry = entrys.get(i);
  105. String personId = entry.getPerson().getId().toString();
  106. selectPerson.add(personId);
  107. Date effectDate = entry.getEffectDate();
  108. // 增加对 effectDate 为 null 的检查
  109. if (effectDate == null) {
  110. throw new IllegalArgumentException("分录中发生日期不能为空,请检查");
  111. }
  112. String formattedEffectDate = SDF.format(effectDate);
  113. selectDate.add(formattedEffectDate);
  114. // 使用 computeIfAbsent 减少冗余代码,并增加重复检查
  115. personDateMap.computeIfAbsent(personId, k -> new HashSet<>());
  116. if (!personDateMap.get(personId).add(formattedEffectDate)) {
  117. // 如果 add 方法返回 false,说明该日期已经存在,抛出异常
  118. throw new IllegalArgumentException("分录中" + entry.getPerson().getName() + ",有当日重复提报的数据,请检查");
  119. }
  120. }
  121. if (personDateMap.isEmpty()) {
  122. return;
  123. }
  124. // 找出最大日期与最小日期
  125. DateRange dateRange = SubmitShemeUtils.findMinMaxDate(selectDate);
  126. //校验重复
  127. verifiOneData(ctx, billId, selectPerson, dateRange, personDateMap);
  128. //校验完后进行mes数据填充;
  129. //获取mes数据
  130. HashMap<String, HashMap> mesData = SubmitShemeUtils.getMesData( ctx, selectPerson, dateRange);
  131. SubmitShemeUtils.setMesData( request, entrys, mesData);
  132. }
  133. /**
  134. * 校验当天是否有重复数据
  135. * @param ctx
  136. * @param billId
  137. * @param selectPerson
  138. * @param dateRange
  139. * @param personDateMap
  140. * @throws SHRWebException
  141. */
  142. public void verifiOneData(Context ctx ,String billId,HashSet<String> selectPerson,DateRange dateRange,Map<String, Set<String>> personDateMap) throws SHRWebException {
  143. HashMap<String,String> dataMap = new HashMap();
  144. try {
  145. IBatchSubmitShemeBillEntry entryIns = BatchSubmitShemeBillEntryFactory.getLocalInstance(ctx);
  146. FilterInfo filter = new FilterInfo();
  147. filter.getFilterItems().add(new FilterItemInfo("person", selectPerson, CompareType.INCLUDE));
  148. filter.getFilterItems().add(new FilterItemInfo("bill.id", billId , CompareType.NOTEQUALS ));
  149. filter.getFilterItems().add(new FilterItemInfo("effectDate", dateRange.getMaxDate() , CompareType.LESS_EQUALS));
  150. filter.getFilterItems().add(new FilterItemInfo("effectDate", dateRange.getMinDate() , CompareType.GREATER_EQUALS ));
  151. EntityViewInfo viewInfo = new EntityViewInfo();
  152. SelectorItemCollection selector = viewInfo.getSelector();
  153. selector.add(new SelectorItemInfo("person.id"));
  154. selector.add(new SelectorItemInfo("person.name"));
  155. selector.add(new SelectorItemInfo("bill.number"));
  156. selector.add(new SelectorItemInfo("effectDate"));
  157. viewInfo.setFilter(filter);
  158. BatchSubmitShemeBillEntryCollection entryCol = entryIns.getBatchSubmitShemeBillEntryCollection(viewInfo);
  159. for(int i = 0;i<entryCol.size();i++) {
  160. BatchSubmitShemeBillEntryInfo entryInfo = entryCol.get(i);
  161. Date effectDate = entryInfo.getEffectDate();
  162. String personId = entryInfo.getPerson().getId().toString();
  163. Set<String> pAndDate = personDateMap.get(personId);
  164. if(pAndDate.contains(SDF.format(effectDate))) {
  165. String personName = entryInfo.getPerson().getName().toString();
  166. BatchSubmitShemeBillInfo billInfo = entryInfo.getBill();
  167. String billNo = billInfo.getNumber();
  168. dataMap.put(personName, billNo);
  169. }
  170. }
  171. } catch (BOSException e) {
  172. e.printStackTrace();
  173. }
  174. //如果dataMap不为空则循环dataMap的数据组成字符串并抛出异常,"存在哪些人,单据编码为:****"
  175. if(!dataMap.isEmpty()) {
  176. String errorMsg = "存在以下当日重复提报人员,姓名与单据编码为:";
  177. for(String personName : dataMap.keySet()) {
  178. String billNo = dataMap.get(personName);
  179. errorMsg += personName + ":" + billNo + " ";
  180. }
  181. throw new SHRWebException(errorMsg);
  182. }
  183. }
  184. /**
  185. * handler校验,先不启用
  186. * @param request
  187. * @param response
  188. * @param modelMap
  189. * @throws SHRWebException
  190. */
  191. public void hasDataOnDayAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
  192. throws SHRWebException {
  193. Context ctx = SHRContext.getInstance().getContext();
  194. // 获取人员 //格式为[pseron1:2025-04-03,person2:2025-04-03],需要转为map
  195. String proposers = request.getParameter("proposers");
  196. if (proposers == null || proposers.isEmpty()) {
  197. return;
  198. }
  199. String[] personArr = proposers.split(",");
  200. HashSet<String> selectPerson = new HashSet();
  201. HashSet<String> selectData = new HashSet();
  202. Map<String, Set<String>> personDateMap = new HashMap<>();
  203. for (int i = 0; i< personArr.length;i++) {
  204. String personIds = personArr[i];
  205. String[] parts = personIds.split(":");
  206. if (parts.length == 2) {
  207. String personId = parts[0].trim();
  208. String date = parts[1].trim();
  209. selectPerson.add(personId);
  210. selectData.add(date);
  211. personDateMap.computeIfAbsent(personId, k -> new HashSet<>()).add(date);
  212. }
  213. }
  214. if (personDateMap.isEmpty()) {
  215. return;
  216. }
  217. HashMap<String,String> dataMap = new HashMap();
  218. // 找出最大日期与最小日期
  219. DateRange dateRange = SubmitShemeUtils.findMinMaxDate(selectData);
  220. IBatchSubmitShemeBillEntry entryIns;
  221. try {
  222. entryIns = BatchSubmitShemeBillEntryFactory.getLocalInstance(ctx);
  223. FilterInfo filter = new FilterInfo();
  224. filter.getFilterItems().add(new FilterItemInfo("proposer", selectPerson, CompareType.INCLUDE));
  225. filter.getFilterItems().add(new FilterItemInfo("effectDate", dateRange.getMaxDate() , CompareType.LESS_EQUALS));
  226. filter.getFilterItems().add(new FilterItemInfo("effectDate", dateRange.getMinDate() , CompareType.GREATER_EQUALS ));
  227. EntityViewInfo viewInfo = new EntityViewInfo();
  228. viewInfo.setFilter(filter);
  229. BatchSubmitShemeBillEntryCollection entryCol = entryIns.getBatchSubmitShemeBillEntryCollection(viewInfo);
  230. for(int i = 0;i<entryCol.size();i++) {
  231. BatchSubmitShemeBillEntryInfo entryInfo = entryCol.get(i);
  232. Date effectDate = entryInfo.getEffectDate();
  233. String personId = entryInfo.getPerson().getId().toString();
  234. Set<String> pAndDate = personDateMap.get(personId);
  235. if(pAndDate.contains(SDF.format(effectDate))) {
  236. String personName = entryInfo.getPerson().getName().toString();
  237. BatchSubmitShemeBillInfo billInfo = entryInfo.getBill();
  238. String billNo = billInfo.getNumber();
  239. dataMap.put(personName, billNo);
  240. }
  241. }
  242. } catch (BOSException e) {
  243. e.printStackTrace();
  244. }
  245. Map resultMap = new HashMap();
  246. JSONUtils.SUCCESS( resultMap );
  247. }
  248. protected void afterSave(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
  249. throws SHRWebException {
  250. super.afterSave(request, response, model);
  251. Context ctx = SHRContext.getInstance().getContext();
  252. BatchSubmitShemeBillInfo info = (BatchSubmitShemeBillInfo) model;
  253. BatchSubmitShemeBillEntryCollection entry = info.getEntry();
  254. }
  255. // public void getDataOnDay(String billId,BatchSubmitShemeBillEntryCollection entrys) throws SHRWebException {
  256. // Context ctx = SHRContext.getInstance().getContext();
  257. // Map<String, Set<String>> personDateMap = new HashMap<>();
  258. // //
  259. // HashSet<String> selectPerson = new HashSet();
  260. // HashSet<String> selectDate = new HashSet();
  261. // for (int i = 0; i < entrys.size(); i++) {
  262. // BatchSubmitShemeBillEntryInfo entry = entrys.get(i);
  263. // String personId = entry.getPerson().getId().toString();
  264. // selectPerson.add(personId);
  265. // Date effectDate = entry.getEffectDate();
  266. //
  267. // String formattedEffectDate = SDF.format(effectDate);
  268. // selectDate.add(formattedEffectDate);
  269. // // 使用 computeIfAbsent 减少冗余代码,并增加重复检查
  270. // personDateMap.computeIfAbsent(personId, k -> new HashSet<>());
  271. // if (!personDateMap.get(personId).add(formattedEffectDate)) {
  272. // // 如果 add 方法返回 false,说明该日期已经存在,抛出异常
  273. // throw new IllegalArgumentException("分录中" + entry.getPerson().getName() + ",有当日重复提报的数据,请检查");
  274. // }
  275. // }
  276. //
  277. // if (personDateMap.isEmpty()) {
  278. // return;
  279. // }
  280. // // 找出最大日期与最小日期
  281. // DateRange dateRange = findMinMaxDate(selectDate);
  282. // //校验重复
  283. // verifiOneData(ctx, billId, selectPerson, dateRange, personDateMap);
  284. // //获取mes数据
  285. // HashMap<String, HashMap> mesData = getMesData(ctx, selectPerson, dateRange);
  286. // setMesData(ctx, billId, entrys, mesData);
  287. // }
  288. public String saveAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
  289. throws SHRWebException {
  290. try {
  291. BatchSubmitShemeBillInfo model = (BatchSubmitShemeBillInfo) request.getAttribute("dynamic_model");
  292. this.doFieldPermFilterSave(request, model);
  293. this.doSave(request, response, model);
  294. this.afterSave(request, response, model);
  295. this.saveAttachment(request, response, model);
  296. Object responseData = this.generateResponseDataAfterSave(request, response, model);
  297. Map resultMap = new HashMap();
  298. resultMap.put("responseData", responseData);
  299. resultMap.put("assignedRowsCount", request.getAttribute("assignedRowsCount"));
  300. this.writeSuccessData(resultMap);
  301. } catch (Exception var6) {
  302. ExceptionHandle.handleException(var6);
  303. }
  304. return null;
  305. }
  306. /**
  307. * 获取点检率与标识字段的字段名称
  308. * @param request
  309. * @param response
  310. * @param modelMap
  311. */
  312. public String getFieldRemarkAction(HttpServletRequest request,
  313. HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  314. String checkNum = request.getParameter("checkNum");
  315. String booleanNum = request.getParameter("booleanNum");
  316. List<String> list = new ArrayList();
  317. if(checkNum!= null &&!checkNum.isEmpty()){
  318. list.add(checkNum);
  319. }
  320. if(booleanNum!= null &&!booleanNum.isEmpty()){
  321. list.add(booleanNum);
  322. }
  323. String str = ToolUtils.aryToStr(list, true);
  324. Context ctx = SHRContext.getInstance().getContext();
  325. try {
  326. CalSubmitItemCollection subColl = CalSubmitItemFactory.getLocalInstance(ctx)
  327. .getCalSubmitItemCollection("SELECT ID,FieldSn,number where number in ("+str+")");
  328. for(int i = 0;i<subColl.size();i++){
  329. CalSubmitItemInfo calSubmitItemInfo = subColl.get(i);
  330. int fieldSn = calSubmitItemInfo.getFieldSn();
  331. String number = calSubmitItemInfo.getNumber();
  332. String field = "S"+fieldSn ;
  333. if(StringUtils.equals(checkNum,number)) {
  334. modelMap.put("checkNum", field );
  335. }else if(StringUtils.equals(booleanNum,number)){
  336. modelMap.put("booleanNum", field );
  337. }
  338. }
  339. } catch (BOSException e) {
  340. throw new RuntimeException(e);
  341. }
  342. JSONUtils.writeJson(response, modelMap);
  343. return null;
  344. }
  345. }
  346. // /**
  347. // * 删除单据
  348. // */
  349. // @Override
  350. // public String deleteAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  351. // String returnStr = super.deleteAction(request, response, modelMap);
  352. // reductionAllInsRate(request);
  353. // return returnStr ;
  354. // }
  355. // /**
  356. // * 重置所有点检率
  357. // * @param request
  358. // * @throws SHRWebException
  359. // */
  360. // private void reductionAllInsRate (HttpServletRequest request) throws SHRWebException {
  361. // String billId = getBillId(request);
  362. // String[] ids = billId.split(",");
  363. // //ids转为list集合
  364. // List<String> idList = Arrays.asList(ids);
  365. //
  366. // Context ctx = SHRContext.getInstance().getContext();
  367. // FilterInfo filter = new FilterInfo();
  368. // filter.getFilterItems().add(new FilterItemInfo("id", ToolUtils.aryToStr(idList,false), CompareType.INCLUDE));
  369. // EntityViewInfo viewInfo = new EntityViewInfo( ) ;
  370. // viewInfo.setFilter(filter);
  371. // SelectorItemCollection selector = viewInfo.getSelector();
  372. // selector.add(new SelectorItemInfo("number"));
  373. // try {
  374. // IBatchSubmitShemeBill subIns = BatchSubmitShemeBillFactory.getLocalInstance(ctx);
  375. // BatchSubmitShemeBillCollection subCol = subIns.getBatchSubmitShemeBillCollection(viewInfo);
  376. // for(int i = 0;i<subCol.size();i++){
  377. // BatchSubmitShemeBillInfo subInfo = subCol.get(i);
  378. // SubmitShemeUtils.reductionInspectionRate(ctx, subInfo);
  379. // }
  380. // } catch (BOSException e) {
  381. // throw new RuntimeException(e);
  382. // }
  383. // }