EvaresultAuditBillEditHandlerEx.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. package com.kingdee.eas.hr.perf.handler;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.google.common.collect.Maps;
  7. import com.google.common.collect.Sets;
  8. import com.kingdee.bos.BOSException;
  9. import com.kingdee.bos.Context;
  10. import com.kingdee.bos.rabbitmq.guava.Lists;
  11. import com.kingdee.eas.common.EASBizException;
  12. import com.kingdee.eas.framework.CoreBaseInfo;
  13. import com.kingdee.eas.hr.perf.PerformProTeamCollection;
  14. import com.kingdee.eas.hr.perf.PerformProTeamFactory;
  15. import com.kingdee.eas.hr.perf.PersonPerformProCollection;
  16. import com.kingdee.eas.hr.perf.PersonPerformProFactory;
  17. import com.kingdee.eas.util.app.DbUtil;
  18. import com.kingdee.jdbc.rowset.IRowSet;
  19. import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
  20. import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
  21. import com.kingdee.shr.base.syssetting.context.SHRContext;
  22. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  23. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  24. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  25. import com.kingdee.shr.compensation.util.CmpStrUtil;
  26. import com.kingdee.shr.perfweb.app.base.evalplan.EvaResultSummaryAuditBillFactory;
  27. import com.kingdee.shr.perfweb.app.base.evalplan.IEvaResultSummaryAuditBill;
  28. import com.kingdee.shr.perfweb.app.exception.SHRPerfWebBizException;
  29. import com.kingdee.shr.perfweb.app.resource.SHRPerfWebResource;
  30. import com.kingdee.shr.perfweb.planexecute.handler.EvaresultAuditBillEditHandler;
  31. import com.kingdee.shr.perfweb.util.SHRPerfWebResourceUtil;
  32. import org.apache.commons.lang3.StringUtils;
  33. import org.slf4j.Logger;
  34. import org.slf4j.LoggerFactory;
  35. import org.springframework.ui.ModelMap;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.math.BigDecimal;
  39. import java.sql.SQLException;
  40. import java.util.*;
  41. /**
  42. * @BelongsProject: dataImpExp820
  43. * @BelongsPackage: com.kingdee.eas.hr.perf.handler
  44. * @Author: lhbj
  45. * @CreateTime: 2025-01-10 19:09
  46. * @Description: TODO
  47. * @Version: 1.0
  48. */
  49. public class EvaresultAuditBillEditHandlerEx extends EvaresultAuditBillEditHandler {
  50. private static Logger logger = LoggerFactory.getLogger(EvaresultAuditBillEditHandlerEx.class);
  51. /**
  52. [{"evaResult.pnumber":"0000381","evaResult.pname":"谭梓傲","evaResult.positionName":"物资岗","evaResult.evaObj.perfFile.adminOrgUnit.company.name":"湖南红太阳光电科技有限公司","evaResult.evaObj.perfFile.adminOrgUnit.department.name":"综合管理","evaResult.sumScore":"<span></span>","evaResult.gradeLevel":"","evaResult.auditSumScore":"<span value=\\"86\\">86.00</span>","evaResult.auditGradeLevel":"C","evaResult.auditReason":"<div class=\\"cell-height scrollbarthin\\">正态分布更新结果</div>","evaResult.reviseSumScore":"<span value=\\"86\\">86.00</span>","evaResult.reviseGradeLevel":"C","evaResult.reviseReason":"正态分布更新结果","id":"KQukJy27Skiy1rPPghjkJBdK16Q=","evaResult.id":"Ka7FkRQuTAaPlTaLvJSD3IESG3Q=","bill.id":"m85zTeeDSmaAU2QLbYWMUoZLdW4=","evaResult.evaObj.id":"gjX3giS2RKurkJVjPhnwa4GI54s=","reviseGradeLevelSelect":"[{\\"value\\":\\"S\\",\\"alias\\":\\"S\\"},{\\"value\\":\\"A\\",\\"alias\\":\\"A\\"},{\\"value\\":\\"B\\",\\"alias\\":\\"B\\"},{\\"value\\":\\"C\\",\\"alias\\":\\"C\\"},{\\"value\\":\\"D\\",\\"alias\\":\\"D\\"}]","levelScoreKVInfo":"{\\n \\"90.00~100.00\\": \\"S\\",\\n \\"80.00~90.00\\": \\"A\\",\\n \\"70.00~80.00\\": \\"B\\",\\n \\"60.00~70.00\\": \\"C\\",\\n \\"0.00~60.00\\": \\"D\\"\\n}","scoreLowLimit":"0","scoreUpLimit":"100","evaResult.period.id":"q6myAjHaQLK+wnczfdLCJEUaiOU=","evaResult.reviseFlag":"是","evaResult.auditFlag":"否"}]
  53. * @param request
  54. * @param response
  55. * @param modelMap
  56. * @throws SHRWebException
  57. */
  58. public void verifyBeforeSubmitAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  59. String entryData = request.getParameter("entryData");
  60. BatchMessageTipsHeader header = new BatchMessageTipsHeader();
  61. boolean isExists = true;
  62. if (!com.kingdee.util.StringUtils.isEmpty(entryData)) {
  63. String period = request.getParameter("period");
  64. String planId = request.getParameter("planId");
  65. String billId = request.getParameter("billId");
  66. String ids = request.getParameter("ids");
  67. List<String> rowList = Lists.newArrayList();
  68. for (String id : billId.split(",")) {
  69. rowList.add(id);
  70. }
  71. header=this.verifyToDep(request,response,modelMap);
  72. if(header.getFailureCount()<=0&&header.getSuccessCount()>0){
  73. header = this.beforeAuditEvaResutProject(ids,period,planId,entryData);
  74. }
  75. header.setBillId(billId.toString());
  76. }
  77. this.writeSuccessData(header);
  78. }
  79. protected static Set<String> getErrorIdsByBatchMessageTip(BatchMessageTipsHeader batchMessageTipsHeader) {
  80. Set<String> errorIds = new HashSet();
  81. Iterator var2 = batchMessageTipsHeader.getResult().iterator();
  82. while(var2.hasNext()) {
  83. BatchMessageTipsBody body = (BatchMessageTipsBody)var2.next();
  84. if (!body.isMuitTipsState()) {
  85. errorIds.add(body.getId());
  86. }
  87. }
  88. return errorIds;
  89. }
  90. protected static void addBatchMessageSuccessTips(Set<String> ids, String message, BatchMessageTipsHeader batchMessageTipsHeader) {
  91. Iterator var3 = ids.iterator();
  92. while(var3.hasNext()) {
  93. String id = (String)var3.next();
  94. BatchMessageTipsBody body = new BatchMessageTipsBody();
  95. body.setId(id);
  96. body.setMuitTipsState(Boolean.TRUE);
  97. body.setMuitTipsMessage(com.kingdee.util.StringUtils.isEmpty(message) ? SHRPerfWebResourceUtil.getRes(SHRPerfWebResource.OPERATESUCCESS, SHRContext.getInstance().getContext()) : message);
  98. batchMessageTipsHeader.addResult(body);
  99. }
  100. }
  101. public BatchMessageTipsHeader verifyToDep(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  102. String entryData = request.getParameter("entryData");
  103. BatchMessageTipsHeader header = new BatchMessageTipsHeader();
  104. boolean isExists = true;
  105. if (!com.kingdee.util.StringUtils.isEmpty(entryData)) {
  106. int success = 0;
  107. int fail = 0;
  108. StringBuilder ids = new StringBuilder();
  109. List<String> allIdList = new ArrayList<>();
  110. try {
  111. Context ctx = SHRContext.getInstance().getContext();
  112. //明细数据
  113. JSONArray entryList = JSON.parseArray(entryData);
  114. for(int i=0;i<entryList.size();i++) {
  115. JSONObject object = entryList.getJSONObject(i);
  116. BatchMessageTipsBody body = new BatchMessageTipsBody();
  117. String id =object.getString("id");
  118. boolean isSuccess=false;
  119. String msg="";
  120. String pnumber = object.getString("evaResult.pnumber");
  121. String pname = object.getString("evaResult.pname");
  122. String positionName = object.getString("evaResult.positionName");
  123. String evaResult = object.getString("evaResult.id");
  124. //修改后等级
  125. String auditGradeLevel = object.getString("evaResult.auditGradeLevel");
  126. body.setId(id);
  127. ids.append(id).append(",");
  128. allIdList.add(id);
  129. //获取跨部门协作绩效等级
  130. String sql = "select CFDEPGRADELEVEL from T_EVA_EvaResultSummary where fid = ?";
  131. IRowSet rs = DbUtil.executeQuery(ctx, sql, new String[]{evaResult});
  132. //当跨部门协作绩效等级为C、D等级的,当期员工绩效不得为高绩效(S、A等级)
  133. if (rs.next()){
  134. //跨部门协作绩效等级
  135. String depgradelevel = rs.getString("CFDEPGRADELEVEL");
  136. if(StringUtils.isNotBlank(depgradelevel)) {
  137. switch (depgradelevel) {
  138. case "S":
  139. ;
  140. case "A":
  141. ;
  142. case "B":
  143. isSuccess = true;
  144. msg = "校验通过";
  145. success += 1;
  146. break;
  147. case "C":
  148. case "D":
  149. if ("S".equals(auditGradeLevel) || "A".equals(auditGradeLevel)) {
  150. isSuccess = false;
  151. msg = "当跨部门协作绩效等级为C、D等级的,当期员工绩效不得为高绩效(S、A等级)";
  152. fail += 1;
  153. } else {
  154. isSuccess = true;
  155. msg = "校验通过";
  156. success += 1;
  157. }
  158. break;
  159. }
  160. }else {
  161. msg="没有当跨部门协作绩效等级,请先检查跨部门协作绩效等级";
  162. isSuccess=true;
  163. success+=1;
  164. }
  165. }else {
  166. msg="操作失败,数据异常";
  167. isSuccess=false;
  168. fail+=1;
  169. }
  170. body.setMuitTipsState(isSuccess);
  171. body.setMuitTipsMessage(msg);
  172. List<Object> messageListExt = new ArrayList<>();
  173. messageListExt.add(pnumber);
  174. messageListExt.add(pname);
  175. messageListExt.add(positionName);
  176. body.addMessageListExt(messageListExt);
  177. header.addResult(body);
  178. }
  179. } catch (BOSException | SQLException var7) {
  180. var7.printStackTrace();
  181. }
  182. ids.delete(ids.length()-1,ids.length());
  183. header.setBillId(ids.toString());
  184. header.setFailureCount(fail);
  185. header.setSuccessCount(success);
  186. }
  187. return (header);
  188. }
  189. protected static void addBatchMessageTip(String unvalidEvaObj, String message, BatchMessageTipsHeader batchMessageTipsHeader) {
  190. BatchMessageTipsBody body = new BatchMessageTipsBody();
  191. body.setId(unvalidEvaObj);
  192. body.setMuitTipsState(Boolean.FALSE);
  193. body.setMuitTipsMessage(message);
  194. batchMessageTipsHeader.addResult(body);
  195. batchMessageTipsHeader.setFailureCount(batchMessageTipsHeader.getFailureCount() + 1);
  196. }
  197. /**
  198. * 获取人员项目正态分布规则
  199. *
  200. * @param ctx
  201. * @param idList 非必填
  202. * @param batchMessage 非必填
  203. * @return
  204. * @throws BOSException
  205. * @throws SQLException
  206. */
  207. public Map<String, Map<String, BigDecimal>> getProjectPerformPro(Context ctx, List<String> idList, Map<String, String> batchMessage) throws BOSException, SQLException {
  208. //获取正态分布规则
  209. Map<String, Map<String, BigDecimal>> orgLevelMap = Maps.newHashMap();
  210. PerformProTeamCollection proCollection = PerformProTeamFactory.getLocalInstance(ctx).getPerformProTeamCollection(" where status=1 ");
  211. if (proCollection.size() == 1) {
  212. StringBuilder orgPerSql = new StringBuilder();
  213. orgPerSql.append(" select fp.fid,fpe.CFS,fpe.CFA,fpe.CFB,fpe.CFC,fpe.CFD,fpe.CFORGPERFORMTYPE ");
  214. orgPerSql.append(" from CT_PF_PerformProTeam fp ");
  215. orgPerSql.append(" left join CT_PF_PerformProTeamEntry fpe on fp.fid=fpe.FPARENTID ");
  216. orgPerSql.append(" where fp.CFSTATUS = 1 ");
  217. orgPerSql.append(" order by fp.FCREATETIME ");
  218. IRowSet rs = DbUtil.executeQuery(ctx, orgPerSql.toString());
  219. while (rs.next()) {
  220. Map<String, BigDecimal> objectMap = Maps.newHashMap();
  221. String type = rs.getString("CFORGPERFORMTYPE");
  222. objectMap.put("S", rs.getBigDecimal("CFS"));
  223. objectMap.put("A", rs.getBigDecimal("CFA"));
  224. objectMap.put("B", rs.getBigDecimal("CFB"));
  225. objectMap.put("C", rs.getBigDecimal("CFC"));
  226. objectMap.put("D", rs.getBigDecimal("CFD"));
  227. orgLevelMap.put(type, objectMap);
  228. }
  229. } else if (proCollection.size() > 1) {
  230. if (null != batchMessage && null != idList) {
  231. for (String key : idList) {
  232. batchMessage.put(key, "存在多个正态分布规则,请检查!");
  233. }
  234. }
  235. } else {
  236. if (null != batchMessage && null != idList) {
  237. for (String key : idList) {
  238. batchMessage.put(key, "不存在正态分布规则,请检查!");
  239. }
  240. }
  241. }
  242. return orgLevelMap;
  243. }
  244. /**
  245. * 获取人员组织正态分布规则
  246. *
  247. * @param ctx
  248. * @param idList 非必填
  249. * @param batchMessage 非必填
  250. * @return
  251. * @throws BOSException
  252. * @throws SQLException
  253. */
  254. public Map<String, Map<String, BigDecimal>> getPersonPerformPro(Context ctx, List<String> idList, Map<String, String> batchMessage) throws BOSException, SQLException {
  255. //获取正态分布规则
  256. Map<String, Map<String, BigDecimal>> orgLevelMap = Maps.newHashMap();
  257. PersonPerformProCollection proCollection = PersonPerformProFactory.getLocalInstance(ctx).getPersonPerformProCollection(" where state=1 ");
  258. if (proCollection.size() == 1) {
  259. StringBuilder orgPerSql = new StringBuilder();
  260. orgPerSql.append(" select fp.fid,fpe.CFS,fpe.CFA,fpe.CFB,fpe.CFC,fpe.CFD,fpe.CFORGPERFORMTYPE ");
  261. orgPerSql.append(" from CT_PF_PersonPerformPro fp ");
  262. orgPerSql.append(" left join CT_PF_PersonPerformProEntry fpe on fp.fid=fpe.FPARENTID ");
  263. orgPerSql.append(" where fp.CFSTATE = 1 ");
  264. orgPerSql.append(" order by fp.FCREATETIME ");
  265. IRowSet rs = DbUtil.executeQuery(ctx, orgPerSql.toString());
  266. while (rs.next()) {
  267. Map<String, BigDecimal> objectMap = Maps.newHashMap();
  268. String type = rs.getString("CFORGPERFORMTYPE");
  269. objectMap.put("S", rs.getBigDecimal("CFS"));
  270. objectMap.put("A", rs.getBigDecimal("CFA"));
  271. objectMap.put("B", rs.getBigDecimal("CFB"));
  272. objectMap.put("C", rs.getBigDecimal("CFC"));
  273. objectMap.put("D", rs.getBigDecimal("CFD"));
  274. orgLevelMap.put(type, objectMap);
  275. }
  276. } else if (proCollection.size() > 1) {
  277. if (null != batchMessage && null != idList) {
  278. for (String key : idList) {
  279. batchMessage.put(key, "存在多个正态分布规则,请检查!");
  280. }
  281. }
  282. } else {
  283. if (null != batchMessage && null != idList) {
  284. for (String key : idList) {
  285. batchMessage.put(key, "不存在正态分布规则,请检查!");
  286. }
  287. }
  288. }
  289. return orgLevelMap;
  290. }
  291. /**
  292. * 获取人员的等级组织分组
  293. *
  294. * @param ctx
  295. * @param entryList
  296. * @return
  297. * @throws BOSException
  298. * @throws SQLException
  299. */
  300. public Map<String, Map<String, Object>> getPersonLevelLensMap(Context ctx, JSONArray entryList) throws BOSException, SQLException {
  301. Map<String, Map<String, Object>> personLevelMap = Maps.newHashMap();
  302. Map<String, BigDecimal> revLevelMap = Maps.newHashMap();
  303. for(int i=0;i<entryList.size();i++) {
  304. JSONObject object = entryList.getJSONObject(i);
  305. String id =object.getString("id");
  306. String evaResult = object.getString("evaResult.id");
  307. //修改后等级
  308. String auditGradeLevel = object.getString("evaResult.auditGradeLevel");
  309. BigDecimal l = revLevelMap.get(auditGradeLevel);
  310. if(Objects.isNull(l)){
  311. l=BigDecimal.ZERO;
  312. }
  313. l=l.add(BigDecimal.ONE);
  314. revLevelMap.put(auditGradeLevel, l);
  315. }
  316. for(int i=0;i<entryList.size();i++) {
  317. JSONObject object = entryList.getJSONObject(i);
  318. String id =object.getString("id");
  319. String evaResult = object.getString("evaResult.id");
  320. //修改后等级
  321. String auditGradeLevel = object.getString("evaResult.auditGradeLevel");
  322. Map<String, Object> map = Maps.newHashMap();
  323. String key = auditGradeLevel;
  324. map.put("lens", revLevelMap.get(auditGradeLevel));
  325. map.put("id",id);
  326. map.put("evaResult",evaResult);
  327. map.put("revLevel",auditGradeLevel);
  328. personLevelMap.put(key, map);
  329. }
  330. return personLevelMap;
  331. }
  332. /**
  333. * 根据上季度的组织等级,校验当前周期,当前考核计划,所选员工的所属组织的员工绩效等级分布校验
  334. *
  335. * @throws SHRWebException
  336. */
  337. public BatchMessageTipsHeader beforeAuditEvaResutProject(String ids, String period, String planId, String entryData) throws SHRWebException {
  338. Context ctx = SHRContext.getInstance().getContext();
  339. BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
  340. if (ids == null) {
  341. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  342. }
  343. try {
  344. int fail = 0;
  345. List<String> idList = Lists.newArrayList();
  346. for (String id : ids.split(",")) {
  347. idList.add(id);
  348. }
  349. Set<String> idSet = Sets.newHashSet();
  350. idSet.addAll(idList);
  351. int success = idList.size();
  352. //明细数据
  353. JSONArray entryList = JSON.parseArray(entryData);
  354. StringBuilder planSql = new StringBuilder();
  355. planSql.append("select fid,CFPerobjectIdId from T_EVA_PerfPlan where fid=? and CFPerobjectIdId is not null ");
  356. IRowSet rs = DbUtil.executeQuery(ctx, planSql.toString(), new Object[]{planId});
  357. if (rs.next()) {
  358. String CFPerobjectIdId = rs.getString("CFPerobjectIdId");
  359. Map<String, String> batchMessage = this.beforeAuditProjectEvaResut(ctx, period, planId, idList,entryList);
  360. if (null != batchMessage && batchMessage.size() > 0) {
  361. for (Map.Entry<String, String> entry : batchMessage.entrySet()) {
  362. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  363. idSet.remove(entry.getKey());
  364. }
  365. }
  366. } else {
  367. Map<String, String> batchMessage = this.beforeAuditEvaResut(ctx, period, planId, idList,entryList);
  368. if (null != batchMessage && batchMessage.size() > 0) {
  369. for (Map.Entry<String, String> entry : batchMessage.entrySet()) {
  370. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  371. idSet.remove(entry.getKey());
  372. }
  373. }
  374. //addBatchMessageSuccessTips(idSet,"验证成功",batchMessageTipsHeader);
  375. }
  376. this.addBatchMessageSuccessTips(idSet,"验证成功",batchMessageTipsHeader);
  377. batchMessageTipsHeader.setSuccessCount(idList.size()-batchMessageTipsHeader.getFailureCount());
  378. } catch (Exception e) {
  379. e.printStackTrace();
  380. throw new ShrWebBizException(e);
  381. }
  382. batchMessageTipsHeader.setBillId(ids.toString());
  383. return batchMessageTipsHeader;
  384. }
  385. public BigDecimal getLens(String levelID, Map<String, Map<String, Object>> personLevelMap){
  386. Map<String, Object> personMap = personLevelMap.get(levelID);
  387. BigDecimal lens = BigDecimal.ZERO;
  388. if (null != personMap) {
  389. lens = (BigDecimal) personMap.get("lens");
  390. }
  391. return lens;
  392. }
  393. public Map<String, String> beforeAuditProjectEvaResut(Context ctx, String period, String planId, List<String> idList,JSONArray entryList ) throws BOSException, SQLException {
  394. Map<String, String> batchMessage = Maps.newHashMap();
  395. StringBuilder selParamId = new StringBuilder("''");
  396. for (int i = 0; i < idList.size(); i++) {
  397. selParamId.append(",?");
  398. }
  399. //获取正态分布规则
  400. Map<String, Map<String, BigDecimal>> personPerformMap = this.getProjectPerformPro(ctx, idList, batchMessage);
  401. if (null != personPerformMap && personPerformMap.size() > 0) {
  402. //获取组织分组人数
  403. //Map<String, Map<String, String>> orgLevelMap = this.getProjectLevelCountMap(ctx, period, planId,selParamId, idList);
  404. //获取人员等级分组
  405. Map<String, Map<String, Object>> personLevelMap = this.getPersonLevelLensMap(ctx,entryList);
  406. BigDecimal big100 = new BigDecimal(100);
  407. for(int i=0;i<entryList.size();i++) {
  408. JSONObject object = entryList.getJSONObject(i);
  409. String fid =object.getString("id");
  410. String evaResult = object.getString("evaResult.id");
  411. //修改后等级
  412. String auditGradeLevel = object.getString("evaResult.auditGradeLevel");
  413. String revLevel = auditGradeLevel;
  414. if (StrUtil.isBlank(auditGradeLevel)) {
  415. batchMessage.put(fid, "绩效等级为空,请维护");
  416. continue;
  417. }
  418. StringBuilder sel = new StringBuilder();
  419. sel.append(" select s1.fid,ppm.CFPROJECTNAME, pp.CFPerobjectIdId, s1.FPERIODID, s1.FEVAPLANID,");
  420. sel.append(" isnull(s1.FREVISEGRADELEVEL,s1.FGRADELEVEL) revLevel,s1.CFProjectLevel ");
  421. sel.append(" from T_EVA_EvaResultSummary s1 ");
  422. sel.append(" left join T_EVA_PerfPlan pp on pp.fid = s1.FEVAPLANID ");
  423. sel.append(" left join CT_PRO_ProjectManagement ppm on ppm.fid = pp.CFPerobjectIdId ");
  424. sel.append(" where s1.fid in ('");
  425. sel.append(evaResult);
  426. sel.append("') ");
  427. IRowSet rs = DbUtil.executeQuery(ctx, sel.toString(), idList.toArray());
  428. if (!rs.next()){
  429. batchMessage.put(fid, "绩效等级为空,请维护");
  430. continue;
  431. }
  432. String CFPROJECTNAME = rs.getString("CFPROJECTNAME");
  433. if (StrUtil.isBlank(revLevel)) {
  434. //String msg = String.format("%s绩效等级为空", CFPROJECTNAME);
  435. batchMessage.put(fid, "绩效等级为空,请维护");
  436. continue;
  437. }
  438. //项目绩效等级
  439. String projectLevel = rs.getString("CFProjectLevel");
  440. if (StrUtil.isBlank(projectLevel)) {
  441. String msg = String.format("%s项目绩效等级为空", CFPROJECTNAME);
  442. batchMessage.put(fid, msg);
  443. continue;
  444. }
  445. //该组织的组织绩效等级的正态分布
  446. Map<String, BigDecimal> personPerform = personPerformMap.get(projectLevel);
  447. if (null == personPerform) {
  448. String msg = String.format("没有找到%s项目绩效等级%s的正态分布规则", CFPROJECTNAME, projectLevel);
  449. batchMessage.put(fid, msg);
  450. continue;
  451. }
  452. //获取该组织下的人员总数
  453. //Map<String, String> orgMap = orgLevelMap.get(key);
  454. //获取该组织下的人员各个绩效等级分组汇总
  455. // String keyRevLevel = FADMINORGUNITID + FPERIODID + FEVAPLANID + revLevel;
  456. // Map<String, String> personMap = personLevelMap.get(keyRevLevel);
  457. Map<String, BigDecimal> leveList = Maps.newHashMap();
  458. //获取该组织下的人员总数
  459. //Map<String, String> orgMap = orgLevelMap.get(key);
  460. //获取等级D人数
  461. String keyRevLevelD = "D";
  462. BigDecimal dLens = this.getLens(keyRevLevelD,personLevelMap);
  463. leveList.put("D", dLens);
  464. //获取等级C人数
  465. String keyRevLevelC = "C";
  466. BigDecimal cLens = this.getLens(keyRevLevelC,personLevelMap);
  467. leveList.put("C", cLens);
  468. //获取等级B人数
  469. String keyRevLevelB = "B";
  470. BigDecimal bLens = this.getLens(keyRevLevelB,personLevelMap);
  471. leveList.put("B", bLens);
  472. //获取等级A人数
  473. String keyRevLevelA = "A";
  474. BigDecimal aLens = this.getLens(keyRevLevelA,personLevelMap);
  475. leveList.put("A", aLens);
  476. //获取等级S人数
  477. String keyRevLevelS = "S";
  478. BigDecimal sLens = this.getLens(keyRevLevelS,personLevelMap);
  479. leveList.put("S", sLens);
  480. //总人数
  481. BigDecimal alls = new BigDecimal(idList.size());
  482. //当前等级正态分布比例
  483. BigDecimal scale = personPerform.get(revLevel);
  484. //创建每个等级的人数列表
  485. Map<String, BigDecimal> bigsList = Maps.newHashMap();
  486. BigDecimal bigS = ((personPerform.get("S").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  487. bigsList.put("S", bigS);
  488. BigDecimal bigA = ((personPerform.get("A").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  489. bigsList.put("A", bigA);
  490. BigDecimal bigB = ((personPerform.get("B").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  491. bigsList.put("B", bigB);
  492. BigDecimal bigC = ((personPerform.get("C").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  493. bigsList.put("C", bigC);
  494. BigDecimal bigD = ((personPerform.get("D").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  495. bigsList.put("D", bigD);
  496. //已占用数
  497. BigDecimal lens = BigDecimal.ZERO;
  498. //进行额度加减
  499. BigDecimal personSize = BigDecimal.ZERO;
  500. BigDecimal personMaxSize = BigDecimal.ZERO;
  501. BigDecimal personMinSize = BigDecimal.ZERO;
  502. BigDecimal personMaxASize = BigDecimal.ZERO;
  503. BigDecimal personMaxSSize = BigDecimal.ZERO;
  504. BigDecimal personMinCSize = BigDecimal.ZERO;
  505. BigDecimal personMinDSize = BigDecimal.ZERO;
  506. BigDecimal personMinVSize = BigDecimal.ZERO;
  507. List<String> ldrs = Lists.newArrayList();
  508. Map<String,String> ldrcd = Maps.newHashMap();
  509. switch (auditGradeLevel) {
  510. case "A":
  511. personSize = personSize.add(bigA).subtract(aLens);
  512. lens = lens.add(aLens);
  513. if ("A".equals(auditGradeLevel)) {
  514. personMaxSize = personMaxSize.add((bigA));
  515. }
  516. else {
  517. personMaxSize = personMaxSize.add((bigA).subtract(aLens));
  518. }
  519. personMaxASize = new BigDecimal(personMaxSize.toPlainString());
  520. ldrs.add("A最多"+personMaxASize.toPlainString()+"人,");
  521. //bigsList.remove("A");
  522. case "S":
  523. personSize = personSize.add(bigS).subtract(sLens);
  524. lens = lens.add(sLens);
  525. if ("S".equals(auditGradeLevel)) {
  526. personMaxSize = personMaxSize.add((bigS));
  527. }
  528. else {
  529. personMaxSize = personMaxSize.add((bigS).subtract(sLens));
  530. }
  531. personMaxSSize = new BigDecimal(personMaxSize.toPlainString());
  532. ldrs.add("S最多"+personMaxSSize.toPlainString()+"人,");
  533. //bigsList.remove("S");
  534. case "B":
  535. case "C":
  536. personMinVSize=personMinVSize.add(bigC).subtract(cLens);
  537. if ("C".equals(revLevel)) {
  538. personMinSize = personMinSize.add((bigC));
  539. } else {
  540. personMinSize = personMinSize.add((bigC).subtract(cLens));
  541. }
  542. personMinCSize = new BigDecimal(bigC.toPlainString());
  543. //bigsList.remove("C");
  544. case "D":
  545. personMinVSize=personMinVSize.add(bigD).subtract(dLens);
  546. if ("D".equals(revLevel)) {
  547. personMinSize = personMinSize.add((bigD));
  548. } else {
  549. personMinSize = personMinSize.add((bigD).subtract(dLens));
  550. }
  551. personMinDSize = new BigDecimal(bigD.add(bigC).toPlainString());
  552. }
  553. switch (revLevel) {
  554. case "A":
  555. case "S":
  556. case "B":
  557. ldrcd.put("C", "C最少" + (personMinCSize.compareTo(BigDecimal.ZERO) > 0 ? personMinCSize.toPlainString() : '0') + "人或者D最少" + (personMinDSize.compareTo(BigDecimal.ZERO) > 0 ? personMinDSize.toPlainString() : "0") + "人,");
  558. break;
  559. case "C":
  560. ldrcd.put("C", "C最少" + (bigC.compareTo(BigDecimal.ZERO) > 0 ? bigC.toPlainString() : '0') + "人或者D最少" + (personMinDSize.compareTo(BigDecimal.ZERO) > 0 ? personMinDSize.toPlainString() : "0") + "人,");
  561. break;
  562. case "D":
  563. ldrcd.put("D", "D最少" + bigD + "人,");
  564. }
  565. String ld = "当前周期绩效等级为%l的人数为%maxs人,";
  566. if (personMinVSize.compareTo(BigDecimal.ZERO) > 0 || personSize.compareTo(BigDecimal.ZERO) < 0) {
  567. if(ldrs.size()>0) {
  568. String ldrstr = ldrs.get(0);
  569. ld += ldrstr;
  570. ld = ld.replace("%" + revLevel, (personMaxSize.compareTo(BigDecimal.ZERO) > 0 ? (personMaxSize) : BigDecimal.ZERO).toPlainString());
  571. }
  572. ld = ld.replace("%l", revLevel);
  573. ld = ld.replace("%maxs", (leveList.get(revLevel) == null ? BigDecimal.ZERO : leveList.get(revLevel)).toPlainString());
  574. for (Map.Entry<String,String> entry : ldrcd.entrySet()) {
  575. String eKey = entry.getKey();
  576. String ldr= entry.getValue();
  577. ld += ldr;
  578. }
  579. ld += "请修正后重新审核.";
  580. batchMessage.put(fid, ld);
  581. }
  582. }
  583. }
  584. return batchMessage;
  585. }
  586. /**
  587. * 结果直接审核、结果工作流审核,绩效等级分布比例校验人数由整个绩效考核计划的人数改为按选择的人数进行分布比例校验。
  588. *
  589. * @param ctx
  590. * @param period
  591. * @param planId
  592. * @param idList
  593. * @return
  594. * @throws BOSException
  595. * @throws SQLException
  596. */
  597. public Map<String, String> beforeAuditEvaResut(Context ctx, String period, String planId, List<String> idList,JSONArray entryList) throws BOSException, SQLException {
  598. Map<String, String> batchMessage = Maps.newHashMap();
  599. StringBuilder selParamId = new StringBuilder("''");
  600. for (int i = 0; i < idList.size(); i++) {
  601. selParamId.append(",?");
  602. }
  603. //获取正态分布规则
  604. Map<String, Map<String, BigDecimal>> personPerformMap = this.getPersonPerformPro(ctx, idList, batchMessage);
  605. if (null != personPerformMap && personPerformMap.size() > 0) {
  606. //获取组织分组人数
  607. //Map<String, Map<String, String>> orgLevelMap = this.getOrgLevelCountMap(ctx, period, planId);
  608. //获取人员等级分组
  609. Map<String, Map<String, Object>> personLevelMap = this.getPersonLevelLensMap(ctx, entryList);
  610. BigDecimal big100 = new BigDecimal(100);
  611. for(int i=0;i<entryList.size();i++) {
  612. JSONObject object = entryList.getJSONObject(i);
  613. String fid = object.getString("id");
  614. String evaResult = object.getString("evaResult.id");
  615. //修改后等级
  616. String auditGradeLevel = object.getString("evaResult.auditGradeLevel");
  617. if (StrUtil.isBlank(auditGradeLevel)) {
  618. batchMessage.put(fid, "绩效等级为空,请维护");
  619. continue;
  620. }
  621. StringBuilder sel = new StringBuilder();
  622. sel.append(" select ers.fid,ers.FADMINORGNAME, ");
  623. sel.append(" ers.FPERIODID, ers.FEVAPLANID,isnull(ers.FREVISEGRADELEVEL, ers.FGRADELEVEL) revLevel,ers.CFOrgLevel ");
  624. sel.append(" from T_EVA_EvaResultSummary ers where ers.fid = '");
  625. sel.append(evaResult);
  626. sel.append("' ");
  627. IRowSet rs = DbUtil.executeQuery(ctx, sel.toString());
  628. String orgLevel="";
  629. String FADMINORGNAME ="";
  630. //上季度组织绩效等级
  631. if (rs.next()){
  632. orgLevel = rs.getString("CFOrgLevel");
  633. FADMINORGNAME = rs.getString("FADMINORGNAME");
  634. if (StringUtils.isBlank(orgLevel)) {
  635. String msg = String.format("%s上季度组织绩效等级为空", FADMINORGNAME);
  636. batchMessage.put(fid, msg);
  637. continue;
  638. }
  639. }
  640. //该组织的组织绩效等级的正态分布
  641. Map<String, BigDecimal> personPerform = personPerformMap.get(orgLevel);
  642. if (null == personPerform) {
  643. String msg = String.format("没有找到%s上季度组织绩效等级%s的正态分布规则", FADMINORGNAME, orgLevel);
  644. batchMessage.put(fid, msg);
  645. continue;
  646. }
  647. //获取该组织下的人员总数
  648. //Map<String, String> orgMap = orgLevelMap.get(key);
  649. Map<String, BigDecimal> leveList = Maps.newHashMap();
  650. //获取等级D人数
  651. String keyRevLevelD = "D";
  652. BigDecimal dLens = this.getLens(keyRevLevelD,personLevelMap);
  653. leveList.put("D", dLens);
  654. //获取等级C人数
  655. String keyRevLevelC = "C";
  656. BigDecimal cLens = this.getLens(keyRevLevelC,personLevelMap);
  657. leveList.put("C", cLens);
  658. //获取等级B人数
  659. String keyRevLevelB = "B";
  660. BigDecimal bLens = this.getLens(keyRevLevelB,personLevelMap);
  661. leveList.put("B", bLens);
  662. //获取等级A人数
  663. String keyRevLevelA = "A";
  664. BigDecimal aLens = this.getLens(keyRevLevelA,personLevelMap);
  665. leveList.put("A", aLens);
  666. //获取等级S人数
  667. String keyRevLevelS = "S";
  668. BigDecimal sLens = this.getLens(keyRevLevelS,personLevelMap);
  669. leveList.put("S", sLens);
  670. System.out.println("leveList:"+leveList);
  671. //总人数
  672. BigDecimal alls = new BigDecimal(idList.size());
  673. //当前等级正态分布比例
  674. BigDecimal scale = personPerform.get(auditGradeLevel);
  675. //创建每个等级的人数列表
  676. Map<String, BigDecimal> bigsList = Maps.newHashMap();
  677. BigDecimal bigS = ((personPerform.get("S").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  678. bigsList.put("S", bigS);
  679. BigDecimal bigA = ((personPerform.get("A").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  680. bigsList.put("A", bigA);
  681. BigDecimal bigB = ((personPerform.get("B").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  682. bigsList.put("B", bigB);
  683. BigDecimal bigC = ((personPerform.get("C").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  684. bigsList.put("C", bigC);
  685. BigDecimal bigD = ((personPerform.get("D").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_HALF_UP));
  686. bigsList.put("D", bigD);
  687. System.out.println("bigsList:"+bigsList);
  688. //已占用数
  689. BigDecimal lens = BigDecimal.ZERO;
  690. //进行额度加减
  691. //if ("S".equals(revLevel) || "A".equals(revLevel)||"B".equals(revLevel) || "C".equals(revLevel) || "D".equals(revLevel)) {
  692. BigDecimal personSize = BigDecimal.ZERO;
  693. BigDecimal personMaxSize = BigDecimal.ZERO;
  694. BigDecimal personMinSize = BigDecimal.ZERO;
  695. BigDecimal personMaxASize = BigDecimal.ZERO;
  696. BigDecimal personMaxSSize = BigDecimal.ZERO;
  697. BigDecimal personMinCSize = BigDecimal.ZERO;
  698. BigDecimal personMinDSize = BigDecimal.ZERO;
  699. BigDecimal personMinVSize = BigDecimal.ZERO;
  700. List<String> ldrs = Lists.newArrayList();
  701. Map<String,String> ldrcd = Maps.newHashMap();
  702. switch (auditGradeLevel) {
  703. case "A":
  704. personSize = personSize.add(bigA).subtract(aLens);
  705. lens = lens.add(aLens);
  706. if ("A".equals(auditGradeLevel)) {
  707. personMaxSize = personMaxSize.add((bigA));
  708. }
  709. else {
  710. personMaxSize = personMaxSize.add((bigA).subtract(aLens));
  711. }
  712. personMaxASize = new BigDecimal(personMaxSize.toPlainString());
  713. ldrs.add("A最多"+personMaxASize.toPlainString()+"人,");
  714. //bigsList.remove("A");
  715. case "S":
  716. personSize = personSize.add(bigS).subtract(sLens);
  717. lens = lens.add(sLens);
  718. if ("S".equals(auditGradeLevel)) {
  719. personMaxSize = personMaxSize.add((bigS));
  720. }
  721. else {
  722. personMaxSize = personMaxSize.add((bigS).subtract(sLens));
  723. }
  724. personMaxSSize = new BigDecimal(personMaxSize.toPlainString());
  725. ldrs.add("S最多"+personMaxSSize.toPlainString()+"人,");
  726. //bigsList.remove("S");
  727. case "B":
  728. case "C":
  729. personMinVSize=personMinVSize.add(bigC).subtract(cLens);
  730. if ("C".equals(auditGradeLevel)) {
  731. personMinSize = personMinSize.add((bigC));
  732. } else {
  733. personMinSize = personMinSize.add((bigC).subtract(cLens));
  734. }
  735. personMinCSize = new BigDecimal(bigC.toPlainString());
  736. //bigsList.remove("C");
  737. case "D":
  738. personMinVSize=personMinVSize.add(bigD).subtract(dLens);
  739. if ("D".equals(auditGradeLevel)) {
  740. personMinSize = personMinSize.add((bigD));
  741. } else {
  742. personMinSize = personMinSize.add((bigD).subtract(dLens));
  743. }
  744. personMinDSize = new BigDecimal(bigD.add(bigC).toPlainString());
  745. }
  746. switch (auditGradeLevel) {
  747. case "A":
  748. case "S":
  749. case "B":
  750. ldrcd.put("C", "C最少" + (personMinCSize.compareTo(BigDecimal.ZERO) > 0 ? personMinCSize.toPlainString() : '0') + "人或者D最少" + (personMinDSize.compareTo(BigDecimal.ZERO) > 0 ? personMinDSize.toPlainString() : "0") + "人,");
  751. break;
  752. case "C":
  753. ldrcd.put("C", "C最少" + (bigC.compareTo(BigDecimal.ZERO) > 0 ? bigC.toPlainString() : '0') + "人或者D最少" + (personMinDSize.compareTo(BigDecimal.ZERO) > 0 ? personMinDSize.toPlainString() : "0") + "人,");
  754. break;
  755. case "D":
  756. ldrcd.put("D", "D最少" + bigD + "人,");
  757. }
  758. String ld = "当前周期绩效等级为%l的人数为%maxs人,";
  759. if (personMinVSize.compareTo(BigDecimal.ZERO) > 0 || personSize.compareTo(BigDecimal.ZERO) < 0) {
  760. if(ldrs.size()>0){
  761. String ldrstr = ldrs.get(0);
  762. ld += ldrstr;
  763. ld = ld.replace("%" + auditGradeLevel, (personMaxSize.compareTo(BigDecimal.ZERO) > 0 ? (personMaxSize) : BigDecimal.ZERO).toPlainString());
  764. }
  765. ld = ld.replace("%l", auditGradeLevel);
  766. ld = ld.replace("%maxs", (leveList.get(auditGradeLevel) == null ? BigDecimal.ZERO : leveList.get(auditGradeLevel)).toPlainString());
  767. for (Map.Entry<String,String> entry : ldrcd.entrySet()) {
  768. String eKey = entry.getKey();
  769. String ldr= entry.getValue();
  770. ld += ldr;
  771. }
  772. ld += "请修正后重新审核.";
  773. batchMessage.put(fid, ld);
  774. }
  775. }
  776. }
  777. return batchMessage;
  778. }
  779. protected void verifyModel(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model) throws SHRWebException {
  780. }
  781. }