TimepieceSchemeBillEditHandlerEx.java 15 KB

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