EvaResultSummaryManagerListHandlerExEx.java 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  1. package com.kingdee.eas.hr.perf.handler;
  2. import com.google.common.collect.Maps;
  3. import com.google.common.collect.Sets;
  4. import com.kingdee.bos.BOSException;
  5. import com.kingdee.bos.Context;
  6. import com.kingdee.bos.rabbitmq.guava.Lists;
  7. import com.kingdee.eas.custom.performanceScoring.handler.EvaResultSummaryManagerListHandlerEx;
  8. import com.kingdee.eas.hr.perf.PerformProTeamCollection;
  9. import com.kingdee.eas.hr.perf.PerformProTeamFactory;
  10. import com.kingdee.eas.hr.perf.PersonPerformProCollection;
  11. import com.kingdee.eas.hr.perf.PersonPerformProFactory;
  12. import com.kingdee.eas.util.app.DbUtil;
  13. import com.kingdee.jdbc.rowset.IRowSet;
  14. import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
  15. import com.kingdee.shr.base.syssetting.context.SHRContext;
  16. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  17. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  18. import com.kingdee.shr.perfweb.app.base.evalplan.EvalplanCycleTypeEnum;
  19. import com.kingdee.shr.perfweb.app.exception.SHRPerfWebBizException;
  20. import com.kingdee.util.StringUtils;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.ui.ModelMap;
  24. import javax.servlet.http.HttpServletRequest;
  25. import javax.servlet.http.HttpServletResponse;
  26. import java.math.BigDecimal;
  27. import java.sql.SQLException;
  28. import java.text.SimpleDateFormat;
  29. import java.time.LocalDate;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.*;
  32. public class EvaResultSummaryManagerListHandlerExEx extends EvaResultSummaryManagerListHandlerEx {
  33. private static final Logger logger = LoggerFactory.getLogger(EvaResultSummaryManagerListHandlerExEx.class);
  34. /**
  35. * 项目经理校验
  36. * @param request
  37. * @param response
  38. * @param modelMap
  39. */
  40. public void tempAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, SHRWebException {
  41. Context ctx = SHRContext.getInstance().getContext();
  42. List<String> idList = Lists.newArrayList();
  43. String ids = (String) this.getBillId(request);
  44. for (String id : ids.split(",")) {
  45. idList.add(id);
  46. }
  47. StringBuilder selParamId = new StringBuilder("''");
  48. for (int i = 0; i < idList.size(); i++) {
  49. selParamId.append(",?");
  50. }
  51. StringBuilder sql = new StringBuilder();
  52. sql.append(" select ers.fid,pp.FPSTARTDATE,ers.FADMINORGUNITID,ers.FADMINORGNAME,pp.FYEAR,pp.FTIMEPERIOD, ");
  53. sql.append(" pp.FCYCLETYPE,pp.FPENDDATE,pp.FPSTARTDATE,ppn.CFPEROBJECTIDID,ppm.CFPROJECTNAME,pmm.CFEMPLOYEEID ");
  54. sql.append(" from T_EVA_EvaResultSummary ers ");
  55. sql.append(" left join T_EVA_PerfPlan ppn on ers.FEVAPLANID=ppn.fid ");
  56. sql.append(" left join T_EVA_PerfPeriod pp on ers.FPERIODID=pp.fid ");
  57. sql.append(" left join CT_PRO_ProjectManagement ppm on ppn.CFPEROBJECTIDID=ppm.fid ");
  58. sql.append(" left join CT_PRO_MemberManagement pmm on ppm.fid=pmm.CFPROJECTMANAGEMENID and pmm.CFSTATE=1 ");
  59. sql.append(" and pmm.CFPTYPEID in( ");
  60. sql.append(" select fid from CT_PRO_ProjectType where FNUMBER='ProjectManager') ");
  61. sql.append(" and pmm.CFPROJECTROLEID in( ");
  62. sql.append(" select fid from CT_PRO_ProjectRole where FNUMBER ='HTY110') ");
  63. sql.append(" where ers.fid in (");
  64. sql.append(selParamId);
  65. sql.append(") ");
  66. sql.append(" and pmm.CFEMPLOYEEID=ers.fpersonid ");
  67. IRowSet rs = DbUtil.executeQuery(ctx, sql.toString(), idList.toArray());
  68. Map<String, String> map = Maps.newHashMap();
  69. map.put("ProjectManager",rs.size()>0?"1":"0");
  70. this.writeSuccessData(map);
  71. }
  72. @Override
  73. protected void setInitData(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, Map<String, Object> initData) throws SHRWebException {
  74. super.setInitData(request, response, modelMap, initData);
  75. Context ctx = SHRContext.getInstance().getContext();
  76. try {
  77. Map<String, Object> custom_params = (Map<String, Object>) initData.get("custom_params");
  78. String perfPlanId = (String) custom_params.get("perfPlanId");
  79. StringBuilder planSql = new StringBuilder();
  80. planSql.append(" select pp.fid,pp.CFPerobjectIdId,ppm.CFPROJECTNAME from T_EVA_PerfPlan pp ");
  81. planSql.append(" left join CT_PRO_ProjectManagement ppm on ppm.fid = pp.CFPerobjectIdId where pp.fid=? and pp.CFPerobjectIdId is not null");
  82. IRowSet rs = DbUtil.executeQuery(ctx, planSql.toString(), new Object[]{perfPlanId});
  83. if (rs.next()) {
  84. String perobjectId = rs.getString("CFPerobjectIdId");
  85. String projectName = rs.getString("CFPROJECTNAME");
  86. custom_params.put("projectName",projectName);
  87. custom_params.put("perobjectId",perobjectId);
  88. initData.put("perobjectId",perobjectId);
  89. initData.put("projectName",projectName);
  90. }else {
  91. custom_params.put("perobjectId","");
  92. custom_params.put("projectName","");
  93. initData.put("perobjectId","");
  94. initData.put("projectName","");
  95. }
  96. }catch (Exception e){
  97. e.printStackTrace();
  98. }
  99. }
  100. /**
  101. * 获取人员项目正态分布规则
  102. *
  103. * @param ctx
  104. * @param idList 非必填
  105. * @param batchMessage 非必填
  106. * @return
  107. * @throws BOSException
  108. * @throws SQLException
  109. */
  110. public Map<String, Map<String, BigDecimal>> getProjectPerformPro(Context ctx, List<String> idList, Map<String, String> batchMessage) throws BOSException, SQLException {
  111. //获取正态分布规则
  112. Map<String, Map<String, BigDecimal>> orgLevelMap = Maps.newHashMap();
  113. PerformProTeamCollection proCollection = PerformProTeamFactory.getLocalInstance(ctx).getPerformProTeamCollection(" where status=1 ");
  114. if (proCollection.size() == 1) {
  115. StringBuilder orgPerSql = new StringBuilder();
  116. orgPerSql.append(" select fp.fid,fpe.CFS,fpe.CFA,fpe.CFB,fpe.CFC,fpe.CFD,fpe.CFORGPERFORMTYPE ");
  117. orgPerSql.append(" from CT_PF_PerformProTeam fp ");
  118. orgPerSql.append(" left join CT_PF_PerformProTeamEntry fpe on fp.fid=fpe.FPARENTID ");
  119. orgPerSql.append(" where fp.CFSTATUS = 1 ");
  120. orgPerSql.append(" order by fp.FCREATETIME ");
  121. IRowSet rs = DbUtil.executeQuery(ctx, orgPerSql.toString());
  122. while (rs.next()) {
  123. Map<String, BigDecimal> objectMap = Maps.newHashMap();
  124. String type = rs.getString("CFORGPERFORMTYPE");
  125. objectMap.put("S", rs.getBigDecimal("CFS"));
  126. objectMap.put("A", rs.getBigDecimal("CFA"));
  127. objectMap.put("B", rs.getBigDecimal("CFB"));
  128. objectMap.put("C", rs.getBigDecimal("CFC"));
  129. objectMap.put("D", rs.getBigDecimal("CFD"));
  130. orgLevelMap.put(type, objectMap);
  131. }
  132. } else if (proCollection.size() > 1) {
  133. if (null != batchMessage && null != idList) {
  134. for (String key : idList) {
  135. batchMessage.put(key, "存在多个正态分布规则,请检查!");
  136. }
  137. }
  138. } else {
  139. if (null != batchMessage && null != idList) {
  140. for (String key : idList) {
  141. batchMessage.put(key, "不存在正态分布规则,请检查!");
  142. }
  143. }
  144. }
  145. return orgLevelMap;
  146. }
  147. /**
  148. * 获取项目分组人数
  149. *
  150. * @param ctx
  151. * @param period
  152. * @param planId
  153. * @return
  154. * @throws BOSException
  155. * @throws SQLException
  156. */
  157. public Map<String, Map<String, String>> getProjectLevelCountMap(Context ctx, String period, String planId) throws BOSException, SQLException {
  158. // StringBuilder paramSql = new StringBuilder("''");
  159. // for (int i = 0; i < idList.size(); i++) {
  160. // paramSql.append(",?");
  161. // }
  162. //获取组织分组人数
  163. StringBuilder orgSql = new StringBuilder();
  164. orgSql.append(" select pp.CFPerobjectIdId, ers.FPERIODID,ers.FEVAPLANID,count(*) alls from T_EVA_EvaResultSummary ers ");
  165. orgSql.append(" left join T_EVA_PerfPlan pp on pp.fid=ers.FEVAPLANID ");
  166. // orgSql.append(paramSql);
  167. // orgSql.append(" ) ");
  168. orgSql.append(" where FPERIODID=? and FEVAPLANID=? ");
  169. orgSql.append(" group by pp.CFPerobjectIdId, ers.FPERIODID, ers.FEVAPLANID ");
  170. IRowSet rs = DbUtil.executeQuery(ctx, orgSql.toString(), new String[]{period, planId});
  171. Map<String, Map<String, String>> orgLevelMap = Maps.newHashMap();
  172. while (rs.next()) {
  173. Map<String, String> map = Maps.newHashMap();
  174. String CFPerobjectIdId = rs.getString("CFPerobjectIdId");
  175. String FPERIODID = rs.getString("FPERIODID");
  176. String FEVAPLANID = rs.getString("FEVAPLANID");
  177. String key = CFPerobjectIdId + FPERIODID + FEVAPLANID;
  178. map.put("CFPerobjectIdId", CFPerobjectIdId);
  179. map.put("FPERIODID", FPERIODID);
  180. map.put("FEVAPLANID", FEVAPLANID);
  181. //当前周期,当前考核计划,当前组织下的总人数
  182. map.put("alls", rs.getString("alls"));
  183. orgLevelMap.put(key, map);
  184. }
  185. return orgLevelMap;
  186. }
  187. /**
  188. * 获取人员的等级项目分组
  189. *
  190. * @param ctx
  191. * @param period
  192. * @param planId
  193. * @return
  194. * @throws BOSException
  195. * @throws SQLException
  196. */
  197. public Map<String, Map<String, String>> getPersonProjectLevelLensMap(Context ctx, String period, String planId) throws BOSException, SQLException {
  198. Map<String, Map<String, String>> personLevelMap = Maps.newHashMap();
  199. StringBuilder orgLevelSql = new StringBuilder();
  200. orgLevelSql.append(" select count(*) lens,CFPerobjectIdId,FPERIODID,FEVAPLANID,revLevel from ( ");
  201. orgLevelSql.append(" select pp.CFPerobjectIdId,s1.FPERIODID,s1.FEVAPLANID,isnull(s1.FREVISEGRADELEVEL,s1.FGRADELEVEL) revLevel ");
  202. orgLevelSql.append(" from T_EVA_EvaResultSummary s1 ");
  203. orgLevelSql.append(" left join T_EVA_PerfPlan pp on pp.fid=s1.FEVAPLANID ");
  204. orgLevelSql.append(" where s1.FPERIODID=? and s1.FEVAPLANID=? ");
  205. orgLevelSql.append(" ) t ");
  206. orgLevelSql.append(" group by CFPerobjectIdId, FPERIODID,FEVAPLANID,revLevel ");
  207. IRowSet orgLevelRs = DbUtil.executeQuery(ctx, orgLevelSql.toString(), new String[]{period, planId});
  208. while (orgLevelRs.next()) {
  209. Map<String, String> map = Maps.newHashMap();
  210. String CFPerobjectIdId = orgLevelRs.getString("CFPerobjectIdId");
  211. String FPERIODID = orgLevelRs.getString("FPERIODID");
  212. String FEVAPLANID = orgLevelRs.getString("FEVAPLANID");
  213. String revLevel = orgLevelRs.getString("revLevel");
  214. String key = CFPerobjectIdId + FPERIODID + FEVAPLANID + revLevel;
  215. map.put("lens", orgLevelRs.getString("lens"));
  216. map.put("CFPerobjectIdId", CFPerobjectIdId);
  217. map.put("FPERIODID", FPERIODID);
  218. map.put("FEVAPLANID", FEVAPLANID);
  219. map.put("revLevel", orgLevelRs.getString("revLevel"));
  220. personLevelMap.put(key, map);
  221. }
  222. return personLevelMap;
  223. }
  224. public Map<String, String> beforeAuditProjectEvaResut(Context ctx, String period, String planId, List<String> idList) throws BOSException, SQLException {
  225. Map<String, String> batchMessage = Maps.newHashMap();
  226. StringBuilder selParamId = new StringBuilder("''");
  227. for (int i = 0; i < idList.size(); i++) {
  228. selParamId.append(",?");
  229. }
  230. //获取正态分布规则
  231. Map<String, Map<String, BigDecimal>> personPerformMap = this.getProjectPerformPro(ctx, idList, batchMessage);
  232. if (null != personPerformMap && personPerformMap.size() > 0) {
  233. //获取组织分组人数
  234. Map<String, Map<String, String>> orgLevelMap = this.getProjectLevelCountMap(ctx, period, planId);
  235. //获取人员等级分组
  236. Map<String, Map<String, String>> personLevelMap = this.getPersonProjectLevelLensMap(ctx, period, planId);
  237. StringBuilder sel = new StringBuilder();
  238. sel.append(" select s1.fid,ppm.CFPROJECTNAME, pp.CFPerobjectIdId, s1.FPERIODID, s1.FEVAPLANID,");
  239. sel.append(" isnull(s1.FREVISEGRADELEVEL,s1.FGRADELEVEL) revLevel,s1.CFProjectLevel ");
  240. sel.append(" from T_EVA_EvaResultSummary s1 ");
  241. sel.append(" left join T_EVA_PerfPlan pp on pp.fid = s1.FEVAPLANID ");
  242. sel.append(" left join CT_PRO_ProjectManagement ppm on ppm.fid = pp.CFPerobjectIdId ");
  243. sel.append(" where s1.fid in (");
  244. sel.append(selParamId);
  245. sel.append(") ");
  246. IRowSet rs = DbUtil.executeQuery(ctx, sel.toString(), idList.toArray());
  247. BigDecimal big100 = new BigDecimal(100);
  248. while (rs.next()) {
  249. String fid = rs.getString("fid");
  250. String CFPROJECTNAME = rs.getString("CFPROJECTNAME");
  251. String CFPerobjectIdId = rs.getString("CFPerobjectIdId");
  252. String FPERIODID = rs.getString("FPERIODID");
  253. String FEVAPLANID = rs.getString("FEVAPLANID");
  254. String revLevel = rs.getString("revLevel");
  255. String key = CFPerobjectIdId + FPERIODID + FEVAPLANID;
  256. //项目绩效等级
  257. String projectLevel = rs.getString("CFProjectLevel");
  258. if (null == projectLevel) {
  259. String msg = String.format("%s项目绩效等级为空", CFPROJECTNAME);
  260. batchMessage.put(fid, msg);
  261. continue;
  262. }
  263. //该组织的组织绩效等级的正态分布
  264. Map<String, BigDecimal> personPerform = personPerformMap.get(projectLevel);
  265. if (null == personPerform) {
  266. String msg = String.format("没有找到%s项目绩效等级%s的正态分布规则", CFPROJECTNAME, projectLevel);
  267. batchMessage.put(fid, msg);
  268. continue;
  269. }
  270. //获取该组织下的人员总数
  271. Map<String, String> orgMap = orgLevelMap.get(key);
  272. //获取该组织下的人员各个绩效等级分组汇总
  273. // String keyRevLevel = FADMINORGUNITID + FPERIODID + FEVAPLANID + revLevel;
  274. // Map<String, String> personMap = personLevelMap.get(keyRevLevel);
  275. //已占用数
  276. BigDecimal lens = BigDecimal.ZERO;
  277. //获取等级D人数
  278. String keyRevLevelD = CFPerobjectIdId + FPERIODID + FEVAPLANID + "D";
  279. Map<String, String> personMapD = personLevelMap.get(keyRevLevelD);
  280. BigDecimal dLens = BigDecimal.ZERO;
  281. if (null != personMapD) {
  282. dLens = new BigDecimal(personMapD.get("lens"));
  283. }
  284. //获取等级C人数
  285. String keyRevLevelC = CFPerobjectIdId + FPERIODID + FEVAPLANID + "C";
  286. Map<String, String> personMapC = personLevelMap.get(keyRevLevelC);
  287. BigDecimal cLens = BigDecimal.ZERO;
  288. if (null != personMapC) {
  289. cLens = new BigDecimal(personMapC.get("lens"));
  290. }
  291. //获取等级B人数
  292. String keyRevLevelB = CFPerobjectIdId + FPERIODID + FEVAPLANID + "B";
  293. Map<String, String> personMapB = personLevelMap.get(keyRevLevelB);
  294. BigDecimal bLens = BigDecimal.ZERO;
  295. if (null != personMapB) {
  296. bLens = new BigDecimal(personMapB.get("lens"));
  297. }
  298. //获取等级A人数
  299. String keyRevLevelA = CFPerobjectIdId + FPERIODID + FEVAPLANID + "A";
  300. Map<String, String> personMapA = personLevelMap.get(keyRevLevelA);
  301. BigDecimal aLens = BigDecimal.ZERO;
  302. if (null != personMapA) {
  303. aLens = new BigDecimal(personMapA.get("lens"));
  304. }
  305. //获取等级S人数
  306. String keyRevLevelS = CFPerobjectIdId + FPERIODID + FEVAPLANID + "S";
  307. Map<String, String> personMapS = personLevelMap.get(keyRevLevelS);
  308. BigDecimal sLens = BigDecimal.ZERO;
  309. if (null != personMapS) {
  310. sLens = new BigDecimal(personMapS.get("lens"));
  311. }
  312. //总人数
  313. BigDecimal alls = new BigDecimal(orgMap.get("alls"));
  314. //当前等级正态分布比例
  315. BigDecimal scale = personPerform.get(revLevel);
  316. //创建每个等级的人数列表
  317. Map<String, BigDecimal> bigsList = Maps.newHashMap();
  318. BigDecimal bigS = ((personPerform.get("S").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  319. bigsList.put("S", bigS);
  320. BigDecimal bigA = ((personPerform.get("A").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  321. bigsList.put("A", bigA);
  322. BigDecimal bigB = ((personPerform.get("B").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  323. bigsList.put("B", bigB);
  324. BigDecimal bigC = ((personPerform.get("C").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  325. bigsList.put("C", bigC);
  326. BigDecimal bigD = ((personPerform.get("D").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  327. bigsList.put("D", bigD);
  328. BigDecimal personSize = BigDecimal.ZERO;
  329. BigDecimal personMaxSize = BigDecimal.ZERO;
  330. List<String> ldrs = Lists.newArrayList();
  331. //进行额度加减
  332. switch (revLevel) {
  333. case "D":
  334. personSize = personSize.add(bigD).subtract(dLens);
  335. lens = lens.add(dLens);
  336. if(!"D".equals(revLevel)) {
  337. personMaxSize = personMaxSize.add((bigD));
  338. }else {
  339. personMaxSize = personMaxSize.add((bigD).subtract(dLens));
  340. }
  341. ldrs.add("D最多%D人,");
  342. bigsList.remove("D");
  343. case "C":
  344. personSize = personSize.add(bigC).subtract(cLens);
  345. lens = lens.add(cLens);
  346. if("C".equals(revLevel)) {
  347. personMaxSize = personMaxSize.add((bigC));
  348. }else {
  349. personMaxSize = personMaxSize.add((bigC).subtract(cLens));
  350. }
  351. ldrs.add("C最多%C人,");
  352. bigsList.remove("C");
  353. case "B":
  354. personSize = personSize.add(bigB).subtract(bLens);
  355. lens = lens.add(bLens);
  356. if("B".equals(revLevel)) {
  357. personMaxSize = personMaxSize.add((bigB));
  358. }else {
  359. personMaxSize = personMaxSize.add((bigB).subtract(bLens));
  360. }
  361. ldrs.add("B最多%B人,");
  362. bigsList.remove("B");
  363. case "A":
  364. personSize = personSize.add(bigA).subtract(aLens);
  365. lens = lens.add(aLens);
  366. if("A".equals(revLevel)) {
  367. personMaxSize = personMaxSize.add((bigA));
  368. }else {
  369. personMaxSize = personMaxSize.add((bigA).subtract(aLens));
  370. }
  371. ldrs.add("A最多%A人,");
  372. bigsList.remove("A");
  373. case "S":
  374. personSize = personSize.add(bigS).subtract(sLens);
  375. lens = lens.add(sLens);
  376. if("S".equals(revLevel)) {
  377. personMaxSize = personMaxSize.add(((bigS)));
  378. }else {
  379. personMaxSize = personMaxSize.add(((bigS).subtract(sLens)));
  380. }
  381. ldrs.add("S最多%S人,");
  382. bigsList.remove("S");
  383. }
  384. //String ld = "当前周期绩效等级为%l的人数为%maxs人,S最多%S人,A最多%A人,B最多%B人,C最多%C人,D最多%D人,请修正后重新审核.";
  385. String ld = "当前周期绩效等级为%l的人数为%maxs人,";
  386. if (personSize.compareTo(BigDecimal.ZERO) < 0) {
  387. String ldrstr = ldrs.get(0);
  388. // ldrs.remove(0);
  389. // for (String ldr : ldrs) {
  390. // ld = ld.replace(ldr,"");
  391. // }
  392. ld += ldrstr;
  393. ld = ld.replace("%l", revLevel);
  394. ld = ld.replace("%maxs", lens.toPlainString());
  395. ld = ld.replace("%" + revLevel, (personMaxSize.compareTo(BigDecimal.ZERO)>0?personMaxSize:BigDecimal.ZERO).toPlainString());
  396. // for(Map.Entry<String,BigDecimal> entry : bigsList.entrySet()){
  397. // BigDecimal bigv = entry.getValue();
  398. // String bigk = entry.getKey();
  399. // ld=ld.replace("%"+bigk,bigv.toPlainString());
  400. // }
  401. ld += "请修正后重新审核.";
  402. batchMessage.put(fid, ld);
  403. }
  404. }
  405. }
  406. return batchMessage;
  407. }
  408. /**
  409. * 获取人员组织正态分布规则
  410. *
  411. * @param ctx
  412. * @param idList 非必填
  413. * @param batchMessage 非必填
  414. * @return
  415. * @throws BOSException
  416. * @throws SQLException
  417. */
  418. public Map<String, Map<String, BigDecimal>> getPersonPerformPro(Context ctx, List<String> idList, Map<String, String> batchMessage) throws BOSException, SQLException {
  419. //获取正态分布规则
  420. Map<String, Map<String, BigDecimal>> orgLevelMap = Maps.newHashMap();
  421. PersonPerformProCollection proCollection = PersonPerformProFactory.getLocalInstance(ctx).getPersonPerformProCollection(" where state=1 ");
  422. if (proCollection.size() == 1) {
  423. StringBuilder orgPerSql = new StringBuilder();
  424. orgPerSql.append(" select fp.fid,fpe.CFS,fpe.CFA,fpe.CFB,fpe.CFC,fpe.CFD,fpe.CFORGPERFORMTYPE ");
  425. orgPerSql.append(" from CT_PF_PersonPerformPro fp ");
  426. orgPerSql.append(" left join CT_PF_PersonPerformProEntry fpe on fp.fid=fpe.FPARENTID ");
  427. orgPerSql.append(" where fp.CFSTATE = 1 ");
  428. orgPerSql.append(" order by fp.FCREATETIME ");
  429. IRowSet rs = DbUtil.executeQuery(ctx, orgPerSql.toString());
  430. while (rs.next()) {
  431. Map<String, BigDecimal> objectMap = Maps.newHashMap();
  432. String type = rs.getString("CFORGPERFORMTYPE");
  433. objectMap.put("S", rs.getBigDecimal("CFS"));
  434. objectMap.put("A", rs.getBigDecimal("CFA"));
  435. objectMap.put("B", rs.getBigDecimal("CFB"));
  436. objectMap.put("C", rs.getBigDecimal("CFC"));
  437. objectMap.put("D", rs.getBigDecimal("CFD"));
  438. orgLevelMap.put(type, objectMap);
  439. }
  440. } else if (proCollection.size() > 1) {
  441. if (null != batchMessage && null != idList) {
  442. for (String key : idList) {
  443. batchMessage.put(key, "存在多个正态分布规则,请检查!");
  444. }
  445. }
  446. } else {
  447. if (null != batchMessage && null != idList) {
  448. for (String key : idList) {
  449. batchMessage.put(key, "不存在正态分布规则,请检查!");
  450. }
  451. }
  452. }
  453. return orgLevelMap;
  454. }
  455. /**
  456. * 获取组织分组人数
  457. *
  458. * @param ctx
  459. * @param period
  460. * @param planId
  461. * @return
  462. * @throws BOSException
  463. * @throws SQLException
  464. */
  465. public Map<String, Map<String, String>> getOrgLevelCountMap(Context ctx, String period, String planId) throws BOSException, SQLException {
  466. // StringBuilder paramSql = new StringBuilder("''");
  467. // for (int i = 0; i < idList.size(); i++) {
  468. // paramSql.append(",?");
  469. // }
  470. //获取组织分组人数
  471. StringBuilder orgSql = new StringBuilder();
  472. orgSql.append(" select FADMINORGUNITID, FPERIODID,FEVAPLANID,count(*) alls from T_EVA_EvaResultSummary ");
  473. // orgSql.append("where fid in ( ");
  474. // orgSql.append(paramSql);
  475. // orgSql.append(" ) ");
  476. orgSql.append(" where FPERIODID=? and FEVAPLANID=? ");
  477. orgSql.append(" group by FADMINORGUNITID, FPERIODID, FEVAPLANID ");
  478. IRowSet rs = DbUtil.executeQuery(ctx, orgSql.toString(), new String[]{period, planId});
  479. Map<String, Map<String, String>> orgLevelMap = Maps.newHashMap();
  480. while (rs.next()) {
  481. Map<String, String> map = Maps.newHashMap();
  482. String FADMINORGUNITID = rs.getString("FADMINORGUNITID");
  483. String FPERIODID = rs.getString("FPERIODID");
  484. String FEVAPLANID = rs.getString("FEVAPLANID");
  485. String key = FADMINORGUNITID + FPERIODID + FEVAPLANID;
  486. map.put("FADMINORGUNITID", FADMINORGUNITID);
  487. map.put("FPERIODID", FPERIODID);
  488. map.put("FEVAPLANID", FEVAPLANID);
  489. //当前周期,当前考核计划,当前组织下的总人数
  490. map.put("alls", rs.getString("alls"));
  491. orgLevelMap.put(key, map);
  492. }
  493. return orgLevelMap;
  494. }
  495. /**
  496. * 获取人员的等级组织分组
  497. *
  498. * @param ctx
  499. * @param period
  500. * @param planId
  501. * @return
  502. * @throws BOSException
  503. * @throws SQLException
  504. */
  505. public Map<String, Map<String, String>> getPersonLevelLensMap(Context ctx, String period, String planId) throws BOSException, SQLException {
  506. Map<String, Map<String, String>> personLevelMap = Maps.newHashMap();
  507. StringBuilder orgLevelSql = new StringBuilder();
  508. orgLevelSql.append(" select count(*) lens,FADMINORGUNITID,FPERIODID,FEVAPLANID,revLevel from ( ");
  509. orgLevelSql.append(" select s1.FADMINORGUNITID,s1.FPERIODID,s1.FEVAPLANID,isnull(s1.FREVISEGRADELEVEL,s1.FGRADELEVEL) revLevel from T_EVA_EvaResultSummary s1 ");
  510. orgLevelSql.append(" where s1.FPERIODID=? and s1.FEVAPLANID=? ");
  511. orgLevelSql.append(" ) t ");
  512. orgLevelSql.append(" group by FADMINORGUNITID, FPERIODID,FEVAPLANID,revLevel ");
  513. IRowSet orgLevelRs = DbUtil.executeQuery(ctx, orgLevelSql.toString(), new String[]{period, planId});
  514. while (orgLevelRs.next()) {
  515. Map<String, String> map = Maps.newHashMap();
  516. String FADMINORGUNITID = orgLevelRs.getString("FADMINORGUNITID");
  517. String FPERIODID = orgLevelRs.getString("FPERIODID");
  518. String FEVAPLANID = orgLevelRs.getString("FEVAPLANID");
  519. String revLevel = orgLevelRs.getString("revLevel");
  520. String key = FADMINORGUNITID + FPERIODID + FEVAPLANID + revLevel;
  521. map.put("lens", orgLevelRs.getString("lens"));
  522. map.put("FADMINORGUNITID", FADMINORGUNITID);
  523. map.put("FPERIODID", FPERIODID);
  524. map.put("FEVAPLANID", FEVAPLANID);
  525. map.put("revLevel", orgLevelRs.getString("revLevel"));
  526. personLevelMap.put(key, map);
  527. }
  528. return personLevelMap;
  529. }
  530. /**
  531. * 根据上季度的组织等级,校验当前周期,当前考核计划,所选员工的所属组织的员工绩效等级分布校验
  532. *
  533. * @param request
  534. * @param response
  535. * @param modelMap
  536. * @param batchMessageTipsHeader
  537. * @throws SHRWebException
  538. */
  539. public void beforeAuditEvaResutAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, BatchMessageTipsHeader batchMessageTipsHeader) throws SHRWebException {
  540. Context ctx = SHRContext.getInstance().getContext();
  541. String ids = (String) request.getAttribute("billId");
  542. String period = (String) request.getParameter("period");
  543. String planId = (String) request.getParameter("planId");
  544. if (ids == null) {
  545. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  546. }
  547. try {
  548. List<String> idList = Lists.newArrayList();
  549. Set<String> idSet = Sets.newHashSet(idList);
  550. for (String id : ids.split(",")) {
  551. idList.add(id);
  552. }
  553. StringBuilder planSql = new StringBuilder();
  554. planSql.append("select fid,CFPerobjectIdId from T_EVA_PerfPlan where fid=? and CFPerobjectIdId is not null ");
  555. IRowSet rs = DbUtil.executeQuery(ctx, planSql.toString(), new Object[]{planId});
  556. if (rs.next()) {
  557. String CFPerobjectIdId = rs.getString("CFPerobjectIdId");
  558. Map<String, String> batchMessage = this.beforeAuditProjectEvaResut(ctx, period, planId, idList);
  559. if (null != batchMessage && batchMessage.size() > 0) {
  560. for (Map.Entry<String, String> entry : batchMessage.entrySet()) {
  561. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  562. idSet.remove(entry.getKey());
  563. }
  564. }
  565. } else {
  566. Map<String, String> batchMessage = this.beforeAuditEvaResut(ctx, period, planId, idList);
  567. if (null != batchMessage && batchMessage.size() > 0) {
  568. for (Map.Entry<String, String> entry : batchMessage.entrySet()) {
  569. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  570. idSet.remove(entry.getKey());
  571. }
  572. }
  573. //addBatchMessageSuccessTips(idSet,"验证成功",batchMessageTipsHeader);
  574. }
  575. this.setSuccessMessage("验证成功");
  576. } catch (Exception e) {
  577. e.printStackTrace();
  578. throw new ShrWebBizException(e);
  579. }
  580. }
  581. public Map<String, String> beforeAuditEvaResut(Context ctx, String period, String planId, List<String> idList) throws BOSException, SQLException {
  582. Map<String, String> batchMessage = Maps.newHashMap();
  583. StringBuilder selParamId = new StringBuilder("''");
  584. for (int i = 0; i < idList.size(); i++) {
  585. selParamId.append(",?");
  586. }
  587. //获取正态分布规则
  588. Map<String, Map<String, BigDecimal>> personPerformMap = this.getPersonPerformPro(ctx, idList, batchMessage);
  589. if (null != personPerformMap && personPerformMap.size() > 0) {
  590. //获取组织分组人数
  591. Map<String, Map<String, String>> orgLevelMap = this.getOrgLevelCountMap(ctx, period, planId);
  592. //获取人员等级分组
  593. Map<String, Map<String, String>> personLevelMap = this.getPersonLevelLensMap(ctx, period, planId);
  594. StringBuilder sel = new StringBuilder();
  595. sel.append("select fid,FADMINORGNAME, FADMINORGUNITID, FPERIODID, FEVAPLANID,isnull( FREVISEGRADELEVEL, FGRADELEVEL) revLevel,CFOrgLevel from T_EVA_EvaResultSummary where fid in (");
  596. sel.append(selParamId);
  597. sel.append(") ");
  598. IRowSet rs = DbUtil.executeQuery(ctx, sel.toString(), idList.toArray());
  599. BigDecimal big100 = new BigDecimal(100);
  600. while (rs.next()) {
  601. String fid = rs.getString("fid");
  602. String FADMINORGNAME = rs.getString("FADMINORGNAME");
  603. String FADMINORGUNITID = rs.getString("FADMINORGUNITID");
  604. String FPERIODID = rs.getString("FPERIODID");
  605. String FEVAPLANID = rs.getString("FEVAPLANID");
  606. String revLevel = rs.getString("revLevel");
  607. String key = FADMINORGUNITID + FPERIODID + FEVAPLANID;
  608. //上季度组织绩效等级
  609. String orgLevel = rs.getString("CFOrgLevel");
  610. if (null == orgLevel) {
  611. String msg = String.format("%s上季度组织绩效等级为空", FADMINORGNAME);
  612. batchMessage.put(fid, msg);
  613. continue;
  614. }
  615. //该组织的组织绩效等级的正态分布
  616. Map<String, BigDecimal> personPerform = personPerformMap.get(orgLevel);
  617. if (null == personPerform) {
  618. String msg = String.format("没有找到%s上季度组织绩效等级%s的正态分布规则", FADMINORGNAME, orgLevel);
  619. batchMessage.put(fid, msg);
  620. continue;
  621. }
  622. //获取该组织下的人员总数
  623. Map<String, String> orgMap = orgLevelMap.get(key);
  624. //获取该组织下的人员各个绩效等级分组汇总
  625. // String keyRevLevel = FADMINORGUNITID + FPERIODID + FEVAPLANID + revLevel;
  626. // Map<String, String> personMap = personLevelMap.get(keyRevLevel);
  627. //已占用数
  628. BigDecimal lens = BigDecimal.ZERO;
  629. //获取等级D人数
  630. String keyRevLevelD = FADMINORGUNITID + FPERIODID + FEVAPLANID + "D";
  631. Map<String, String> personMapD = personLevelMap.get(keyRevLevelD);
  632. BigDecimal dLens = BigDecimal.ZERO;
  633. if (null != personMapD) {
  634. dLens = new BigDecimal(personMapD.get("lens"));
  635. }
  636. //获取等级C人数
  637. String keyRevLevelC = FADMINORGUNITID + FPERIODID + FEVAPLANID + "C";
  638. Map<String, String> personMapC = personLevelMap.get(keyRevLevelC);
  639. BigDecimal cLens = BigDecimal.ZERO;
  640. if (null != personMapC) {
  641. cLens = new BigDecimal(personMapC.get("lens"));
  642. }
  643. //获取等级B人数
  644. String keyRevLevelB = FADMINORGUNITID + FPERIODID + FEVAPLANID + "B";
  645. Map<String, String> personMapB = personLevelMap.get(keyRevLevelB);
  646. BigDecimal bLens = BigDecimal.ZERO;
  647. if (null != personMapB) {
  648. bLens = new BigDecimal(personMapB.get("lens"));
  649. }
  650. //获取等级A人数
  651. String keyRevLevelA = FADMINORGUNITID + FPERIODID + FEVAPLANID + "A";
  652. Map<String, String> personMapA = personLevelMap.get(keyRevLevelA);
  653. BigDecimal aLens = BigDecimal.ZERO;
  654. if (null != personMapA) {
  655. aLens = new BigDecimal(personMapA.get("lens"));
  656. }
  657. //获取等级S人数
  658. String keyRevLevelS = FADMINORGUNITID + FPERIODID + FEVAPLANID + "S";
  659. Map<String, String> personMapS = personLevelMap.get(keyRevLevelS);
  660. BigDecimal sLens = BigDecimal.ZERO;
  661. if (null != personMapS) {
  662. sLens = new BigDecimal(personMapS.get("lens"));
  663. }
  664. //总人数
  665. BigDecimal alls = new BigDecimal(orgMap.get("alls"));
  666. //当前等级正态分布比例
  667. BigDecimal scale = personPerform.get(revLevel);
  668. //创建每个等级的人数列表
  669. Map<String, BigDecimal> bigsList = Maps.newHashMap();
  670. BigDecimal bigS = ((personPerform.get("S").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  671. bigsList.put("S", bigS);
  672. BigDecimal bigA = ((personPerform.get("A").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  673. bigsList.put("A", bigA);
  674. BigDecimal bigB = ((personPerform.get("B").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  675. bigsList.put("B", bigB);
  676. BigDecimal bigC = ((personPerform.get("C").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  677. bigsList.put("C", bigC);
  678. BigDecimal bigD = ((personPerform.get("D").divide(big100, BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP)).multiply(alls).setScale(0, BigDecimal.ROUND_UP));
  679. bigsList.put("D", bigD);
  680. BigDecimal personSize = BigDecimal.ZERO;
  681. BigDecimal personMaxSize = BigDecimal.ZERO;
  682. List<String> ldrs = Lists.newArrayList();
  683. //进行额度加减
  684. switch (revLevel) {
  685. case "D":
  686. personSize = personSize.add(bigD).subtract(dLens);
  687. lens = lens.add(dLens);
  688. if("D".equals(revLevel)) {
  689. personMaxSize = personMaxSize.add((bigD));
  690. }else {
  691. personMaxSize = personMaxSize.add((bigD).subtract(dLens));
  692. }
  693. ldrs.add("D最多%D人,");
  694. bigsList.remove("D");
  695. case "C":
  696. personSize = personSize.add(bigC).subtract(cLens);
  697. lens = lens.add(cLens);
  698. if("C".equals(revLevel)) {
  699. personMaxSize = personMaxSize.add((bigC) );
  700. }else {
  701. personMaxSize = personMaxSize.add((bigC).subtract(cLens));
  702. }
  703. ldrs.add("C最多%C人,");
  704. bigsList.remove("C");
  705. case "B":
  706. personSize = personSize.add(bigB).subtract(bLens);
  707. lens = lens.add(bLens);
  708. if("B".equals(revLevel)) {
  709. personMaxSize = personMaxSize.add((bigB) );
  710. }else {
  711. personMaxSize = personMaxSize.add((bigB).subtract(bLens));
  712. }
  713. ldrs.add("B最多%B人,");
  714. bigsList.remove("B");
  715. case "A":
  716. personSize = personSize.add(bigA).subtract(aLens);
  717. lens = lens.add(aLens);
  718. if( "A".equals(revLevel)) {
  719. personMaxSize = personMaxSize.add((bigA));
  720. }else {
  721. personMaxSize = personMaxSize.add((bigA).subtract(aLens));
  722. }
  723. ldrs.add("A最多%A人,");
  724. bigsList.remove("A");
  725. case "S":
  726. personSize = personSize.add(bigS).subtract(sLens);
  727. lens = lens.add(sLens);
  728. if("S".equals(revLevel)) {
  729. personMaxSize = personMaxSize.add((bigS));
  730. }else {
  731. personMaxSize = personMaxSize.add((bigS).subtract(sLens));
  732. }
  733. ldrs.add("S最多%S人,");
  734. bigsList.remove("S");
  735. }
  736. //String ld = "当前周期绩效等级为%l的人数为%maxs人,S最多%S人,A最多%A人,B最多%B人,C最多%C人,D最多%D人,请修正后重新审核.";
  737. String ld = "当前周期绩效等级为%l的人数为%maxs人,";
  738. if (personSize.compareTo(BigDecimal.ZERO) < 0) {
  739. String ldrstr = ldrs.get(0);
  740. // ldrs.remove(0);
  741. // for (String ldr : ldrs) {
  742. // ld = ld.replace(ldr,"");
  743. // }
  744. ld += ldrstr;
  745. ld = ld.replace("%l", revLevel);
  746. ld = ld.replace("%maxs", lens.toPlainString());
  747. ld = ld.replace("%" + revLevel, (personMaxSize.compareTo(BigDecimal.ZERO)>0?personMaxSize:BigDecimal.ZERO).toPlainString());
  748. // for(Map.Entry<String,BigDecimal> entry : bigsList.entrySet()){
  749. // BigDecimal bigv = entry.getValue();
  750. // String bigk = entry.getKey();
  751. // ld=ld.replace("%"+bigk,bigv.toPlainString());
  752. // }
  753. ld += "请修正后重新审核.";
  754. batchMessage.put(fid, ld);
  755. }
  756. }
  757. }
  758. return batchMessage;
  759. }
  760. @Override
  761. public void auditEvaResutAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, BatchMessageTipsHeader batchMessageTipsHeader) throws SHRWebException {
  762. super.auditEvaResutAction(request, response, modelMap, batchMessageTipsHeader);
  763. }
  764. /**
  765. * 获取上季度组织等级批量
  766. *
  767. * @description:
  768. * @author: lhbj
  769. * @date: 2025/1/10 18:18
  770. * @param: null
  771. * @return:null
  772. **/
  773. public void bindDep_OR_ProjectBatchAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, BatchMessageTipsHeader batchMessageTipsHeader) throws SHRWebException {
  774. Context ctx = SHRContext.getInstance().getContext();
  775. String ids = (String) request.getAttribute("billId");
  776. String period = (String) request.getParameter("period");
  777. String planId = (String) request.getParameter("planId");
  778. if (ids == null) {
  779. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  780. } else {
  781. try {
  782. StringBuilder planSql = new StringBuilder();
  783. planSql.append("select fid,CFPerobjectIdId from T_EVA_PerfPlan where fid=? and CFPerobjectIdId is not null ");
  784. IRowSet rs = DbUtil.executeQuery(ctx, planSql.toString(), new Object[]{planId});
  785. if (rs.next()) {
  786. this.bindProjectBatchAction(request, response, modelMap, batchMessageTipsHeader);
  787. } else {
  788. this.bindDepBatchAction(request, response, modelMap, batchMessageTipsHeader);
  789. }
  790. this.setSuccessMessage("验证成功");
  791. } catch (Exception e) {
  792. e.printStackTrace();
  793. throw new ShrWebBizException(e);
  794. }
  795. }
  796. }
  797. /**
  798. * 获取项目等级批量
  799. *
  800. * @description:
  801. * @author: lhbj
  802. * @date: 2025/1/10 18:18
  803. * @param: null
  804. * @return:null
  805. **/
  806. public void bindProjectBatchAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, BatchMessageTipsHeader batchMessageTipsHeader) throws SHRWebException {
  807. Context ctx = SHRContext.getInstance().getContext();
  808. String ids = (String) request.getAttribute("billId");
  809. if (ids == null) {
  810. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  811. } else {
  812. try {
  813. List<String> idList = Lists.newArrayList();
  814. for (String id : ids.split(",")) {
  815. idList.add(id);
  816. }
  817. Set<String> idSet = Sets.newHashSet(idList);
  818. Map<String, String> map = this.bindProject(ctx, ids);
  819. for (Map.Entry<String, String> entry : map.entrySet()) {
  820. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  821. idSet.remove(entry.getKey());
  822. }
  823. //addBatchMessageSuccessTips(idSet,"验证成功",batchMessageTipsHeader);
  824. this.setSuccessMessage("验证成功");
  825. } catch (Exception e) {
  826. e.printStackTrace();
  827. throw new ShrWebBizException(e);
  828. }
  829. }
  830. }
  831. /**
  832. * 绑定项目等级
  833. *
  834. * @param ctx
  835. * @param ids
  836. * @return
  837. * @throws Exception
  838. */
  839. public Map<String, String> bindProject(Context ctx, String ids) throws Exception {
  840. Map<String, String> batchMessage = Maps.newHashMap();
  841. List<String> idList = Lists.newArrayList();
  842. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  843. if (ids == null) {
  844. throw new Exception(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  845. } else {
  846. try {
  847. StringBuffer sql = new StringBuffer();
  848. sql.append(" select ers.fid,pp.FPSTARTDATE,ers.FADMINORGUNITID,ers.FADMINORGNAME,pp.FYEAR,pp.FTIMEPERIOD, ");
  849. sql.append(" pp.FCYCLETYPE,pp.FPENDDATE,pp.FPSTARTDATE,ppn.CFPEROBJECTIDID,ppm.CFPROJECTNAME,pmm.CFEMPLOYEEID ");
  850. sql.append(" from T_EVA_EvaResultSummary ers ");
  851. sql.append(" left join T_EVA_PerfPlan ppn on ers.FEVAPLANID=ppn.fid ");
  852. sql.append(" left join T_EVA_PerfPeriod pp on ers.FPERIODID=pp.fid ");
  853. sql.append(" left join CT_PRO_ProjectManagement ppm on ppn.CFPEROBJECTIDID=ppm.fid ");
  854. sql.append(" left join CT_PRO_MemberManagement pmm on ppm.fid=pmm.CFPROJECTMANAGEMENID and pmm.CFSTATE=1 ");
  855. sql.append(" and pmm.CFPTYPEID in( ");
  856. sql.append(" select fid from CT_PRO_ProjectType where FNUMBER='ProjectManager') ");
  857. sql.append(" and pmm.CFPROJECTROLEID in( ");
  858. sql.append(" select fid from CT_PRO_ProjectRole where FNUMBER ='HTY110') ");
  859. sql.append(" where pmm.CFEMPLOYEEID is not null and ers.fid in(''");
  860. for (String id : ids.split(",")) {
  861. idList.add(id);
  862. sql.append(",'").append(id).append("'");
  863. }
  864. sql.append(" ) ");
  865. IRowSet rsSql = DbUtil.executeQuery(ctx, sql.toString());
  866. List<String> sess = Lists.newArrayList();
  867. while (rsSql.next()) {
  868. String id = rsSql.getString("fid");
  869. String personid = rsSql.getString("CFEMPLOYEEID");
  870. String CFPROJECTNAME = rsSql.getString("CFPROJECTNAME");
  871. String perobjectid = rsSql.getString("CFPEROBJECTIDID");
  872. StringBuffer sqlPro = new StringBuffer();
  873. sqlPro.append(" select isnull(ers.FREVISEGRADELEVEL,ers.FGRADELEVEL) FGRADELEVEL,ers.fid from ");
  874. sqlPro.append(" T_EVA_EvaResultSummary ers ");
  875. sqlPro.append(" left join T_EVA_PerfPlan ppn on ers.FEVAPLANID=ppn.fid ");
  876. sqlPro.append(" left join T_EVA_PerfPeriod pp on ers.FPERIODID=pp.fid ");
  877. sqlPro.append(" where ers.FBILLSTATE='3' and ers.FPERSONID=? and ppn.CFPEROBJECTIDID=? ");
  878. sqlPro.append(" order by pp.FPENDDATE desc ");
  879. IRowSet rsPro = DbUtil.executeQuery(ctx, sqlPro.toString(), new String[]{personid, perobjectid});
  880. String FGRADELEVEL = "";
  881. if (rsPro.next()) {
  882. FGRADELEVEL = rsPro.getString("FGRADELEVEL");
  883. }
  884. if (StringUtils.isEmpty(FGRADELEVEL)) {
  885. batchMessage.put(id, "未找到当前" + CFPROJECTNAME + "项目匹配的绩效等级");
  886. } else {
  887. StringBuilder upd = new StringBuilder();
  888. upd.append("update T_EVA_EvaResultSummary set CFPROJECTLEVEL=? where fid=? ");
  889. DbUtil.execute(ctx, upd.toString(), new String[]{FGRADELEVEL, id});
  890. sess.add(id);
  891. }
  892. }
  893. } catch (Exception e) {
  894. e.printStackTrace();
  895. throw new Exception(e);
  896. }
  897. }
  898. return batchMessage;
  899. }
  900. /**
  901. * 获取上季度组织等级批量
  902. *
  903. * @description:
  904. * @author: lhbj
  905. * @date: 2025/1/10 18:18
  906. * @param: null
  907. * @return:null
  908. **/
  909. public void bindDepBatchAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap, BatchMessageTipsHeader batchMessageTipsHeader) throws SHRWebException {
  910. Context ctx = SHRContext.getInstance().getContext();
  911. String ids = (String) request.getAttribute("billId");
  912. if (ids == null) {
  913. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  914. } else {
  915. try {
  916. List<String> idList = Lists.newArrayList();
  917. for (String id : ids.split(",")) {
  918. idList.add(id);
  919. }
  920. Set<String> idSet = Sets.newHashSet(idList);
  921. Map<String, String> map = this.bindDep(ctx, ids);
  922. for (Map.Entry<String, String> entry : map.entrySet()) {
  923. addBatchMessageTip(entry.getKey(), entry.getValue(), batchMessageTipsHeader);
  924. idSet.remove(entry.getKey());
  925. }
  926. //addBatchMessageSuccessTips(idSet,"验证成功",batchMessageTipsHeader);
  927. this.setSuccessMessage("验证成功");
  928. } catch (Exception e) {
  929. e.printStackTrace();
  930. throw new ShrWebBizException(e);
  931. }
  932. }
  933. }
  934. /**
  935. * 绑定部门等级
  936. *
  937. * @param ctx
  938. * @param ids
  939. * @return
  940. * @throws Exception
  941. */
  942. public Map<String, String> bindDep(Context ctx, String ids) throws Exception {
  943. Map<String, String> batchMessage = Maps.newHashMap();
  944. List<String> idList = Lists.newArrayList();
  945. Map<String, String> id_orgIdMap = Maps.newHashMap();
  946. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  947. if (ids == null) {
  948. throw new Exception(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  949. } else {
  950. try {
  951. StringBuffer sql = new StringBuffer();
  952. sql.append(" select ers.fid,pp.FPSTARTDATE,ers.FADMINORGUNITID,ers.FADMINORGNAME,pp.FYEAR,pp.FTIMEPERIOD," +
  953. "pp.FCYCLETYPE,pp.FPENDDATE,pp.FPSTARTDATE from ");
  954. sql.append(" T_EVA_EvaResultSummary ers ");
  955. sql.append(" left join T_EVA_PerfPeriod pp on ers.FPERIODID=pp.fid ");
  956. sql.append(" where ers.fid in(''");
  957. for (String id : ids.split(",")) {
  958. idList.add(id);
  959. sql.append(",'").append(id).append("'");
  960. }
  961. sql.append(" ) ");
  962. LocalDate startDate = null;
  963. LocalDate endDate = null;
  964. EvalplanCycleTypeEnum cycleTypeEnum = null;
  965. IRowSet rsSql = DbUtil.executeQuery(ctx, sql.toString());
  966. boolean faist = true;
  967. while (rsSql.next()) {
  968. String id = rsSql.getString("fid");
  969. String orgId = rsSql.getString("FADMINORGUNITID");
  970. String orgName = rsSql.getString("FADMINORGNAME");
  971. if (faist) {
  972. faist = false;
  973. int FCYCLETYPE = rsSql.getInt("FCYCLETYPE");
  974. Date FPENDDATE = rsSql.getDate("FPENDDATE");
  975. Date FPSTARTDATE = rsSql.getDate("FPSTARTDATE");
  976. Map<String, Object> cycleMap = this.getCycletype(sf.format(FPSTARTDATE), sf.format(FPENDDATE), FCYCLETYPE);
  977. cycleTypeEnum = (EvalplanCycleTypeEnum) cycleMap.get("cycleType");
  978. endDate = (LocalDate) cycleMap.get("endDate");
  979. startDate = (LocalDate) cycleMap.get("startDate");
  980. }
  981. id_orgIdMap.put(id, orgId + "!" + orgName);
  982. }
  983. List<String> sess = Lists.newArrayList();
  984. //T_EVA_OrgEvaResultSummary
  985. Map<String, Map<String, String>> mapMap = this.getOrgEvaResultLevel(ctx, startDate, endDate, cycleTypeEnum);
  986. for (Map.Entry<String, String> ee : id_orgIdMap.entrySet()) {
  987. String[] orgs = ee.getValue().split("!");
  988. String orgId = orgs[0];
  989. String orgName = orgs[1];
  990. String id = ee.getKey();
  991. Map<String, String> orgLevelMap = mapMap.get(orgId);
  992. if (null == orgLevelMap) {
  993. batchMessage.put(id, "未找到当前" + orgName + "部门匹配的组织绩效等级");
  994. } else {
  995. String orgLevel = orgLevelMap.get("lastgradeLevel");
  996. StringBuilder upd = new StringBuilder();
  997. upd.append("update T_EVA_EvaResultSummary set CFOrgLevel=?,CFOrgLevelEveID=? where fid=? ");
  998. DbUtil.execute(ctx, upd.toString(), new String[]{orgLevel, orgId, id});
  999. sess.add(id);
  1000. }
  1001. }
  1002. } catch (Exception e) {
  1003. e.printStackTrace();
  1004. throw new Exception(e);
  1005. }
  1006. }
  1007. return batchMessage;
  1008. }
  1009. public Map<String, Object> getCycletype(String pstartdate, String penddate, int cycletype) {
  1010. Map<String, Object> map = Maps.newHashMap();
  1011. LocalDate startDate = LocalDate.parse(pstartdate, DateTimeFormatter.ISO_LOCAL_DATE);
  1012. LocalDate endDate = LocalDate.parse(penddate, DateTimeFormatter.ISO_LOCAL_DATE);
  1013. EvalplanCycleTypeEnum cycleTypeEnum = EvalplanCycleTypeEnum.getEnum(cycletype);
  1014. if (EvalplanCycleTypeEnum.FULL_YEAR_VALUE == cycletype) {
  1015. //周期为年度
  1016. endDate = endDate.plusYears(-1);
  1017. startDate = startDate.plusYears(-1);
  1018. cycleTypeEnum = EvalplanCycleTypeEnum.FULL_YEAR;
  1019. } else if (EvalplanCycleTypeEnum.HALF_YEAR_VALUE == cycletype) {
  1020. //周期为半年度
  1021. endDate = endDate.plusMonths(-6);
  1022. startDate = startDate.plusMonths(-6);
  1023. cycleTypeEnum = EvalplanCycleTypeEnum.HALF_YEAR;
  1024. } else if (EvalplanCycleTypeEnum.QUARTER_VALUE == cycletype) {
  1025. //获取为季度
  1026. endDate = endDate.plusMonths(-3);
  1027. startDate = startDate.plusMonths(-3);
  1028. cycleTypeEnum = EvalplanCycleTypeEnum.QUARTER;
  1029. } else if (EvalplanCycleTypeEnum.MONTHLY_VALUE == cycletype) {
  1030. //获取为季度
  1031. endDate = endDate.plusMonths(-1);
  1032. startDate = startDate.plusMonths(-1);
  1033. cycleTypeEnum = EvalplanCycleTypeEnum.MONTHLY;
  1034. }
  1035. map.put("cycleType", cycleTypeEnum);
  1036. map.put("endDate", endDate);
  1037. map.put("startDate", startDate);
  1038. return map;
  1039. }
  1040. /**
  1041. * 获取上季度组织等级
  1042. *
  1043. * @description:
  1044. * @author: lhbj
  1045. * @date: 2025/1/10 18:18
  1046. * @param: null
  1047. * @return:null
  1048. **/
  1049. public void bindDepAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  1050. Context ctx = SHRContext.getInstance().getContext();
  1051. String ids = this.getBillId(request);
  1052. if (ids == null) {
  1053. throw new ShrWebBizException(new SHRPerfWebBizException(SHRPerfWebBizException.SYSTEMERR));
  1054. } else {
  1055. try {
  1056. Map<String, String> map = this.bindDep(ctx, ids);
  1057. this.writeSuccessData(map);
  1058. } catch (Exception e) {
  1059. e.printStackTrace();
  1060. throw new ShrWebBizException(e);
  1061. }
  1062. }
  1063. }
  1064. protected Map<String, Map<String, String>> getOrgEvaResultLevel(Context ctx, LocalDate startDate, LocalDate endDate) throws BOSException, SQLException {
  1065. return this.getOrgEvaResultLevel(ctx, startDate, endDate, EvalplanCycleTypeEnum.QUARTER);
  1066. }
  1067. protected Map<String, Map<String, String>> getOrgEvaResultLevel(Context ctx, LocalDate startDate, LocalDate endDate, EvalplanCycleTypeEnum cycletype) throws BOSException, SQLException {
  1068. Map<String, Map<String, String>> mapMap = Maps.newHashMap();
  1069. StringBuffer selSql = new StringBuffer();
  1070. selSql.append(" select oers.fid oersId, oers.FADMINORGUNITID,oers.FLASTGRADELEVEL,(case when ppd.fid is null ");
  1071. selSql.append(" then (oers.FPERIODYEAR||'-01-'||'01')||'T'|| (oers.FPERIODYEAR||'-01-'||'01') ");
  1072. selSql.append(" else (to_char(ppd.FPSTARTDATE,'yyyy-MM-dd')||'T'||to_char(ppd.FPENDDATE,'yyyy-MM-dd')) end) PERIOD ");
  1073. selSql.append(" from T_EVA_OrgEvaResultSummary oers ");
  1074. selSql.append(" left join T_EVA_PerfPeriod ppd on ppd.fid = oers.FPERIODID ");
  1075. selSql.append(" where to_char(ppd.FPSTARTDATE,'yyyy-MM-dd') >= ? and to_char(ppd.FPENDDATE,'yyyy-MM-dd') <= ? ");
  1076. selSql.append(" and ppd.FCYCLETYPE = ? and ppd.FREFSTATUS = 100 and oers.FBILLSTATE='3' ");
  1077. String[] param = new String[]{startDate.format(DateTimeFormatter.ISO_LOCAL_DATE),
  1078. endDate.format(DateTimeFormatter.ISO_LOCAL_DATE), String.valueOf(cycletype.getValue())};
  1079. IRowSet rs = DbUtil.executeQuery(ctx, selSql.toString(), param);
  1080. int i = selSql.indexOf("?");
  1081. selSql.replace(i, i + 1, param[0]);
  1082. i = selSql.indexOf("?");
  1083. selSql.replace(i, i + 1, param[1]);
  1084. System.out.println(selSql);
  1085. while (rs.next()) {
  1086. Map<String, String> stringMap = Maps.newHashMap();
  1087. String orgId = rs.getString("FADMINORGUNITID");
  1088. String lastgradeLevel = rs.getString("FLASTGRADELEVEL");
  1089. String period = rs.getString("PERIOD");
  1090. stringMap.put("orgId", orgId);
  1091. stringMap.put("lastgradeLevel", lastgradeLevel);
  1092. stringMap.put("period", period);
  1093. mapMap.put(orgId, stringMap);
  1094. }
  1095. return mapMap;
  1096. }
  1097. public static void main(String[] args) {
  1098. List<String> idList = new ArrayList<>();
  1099. idList.add("W");
  1100. idList.add("A");
  1101. idList.add("C");
  1102. idList.add("B");
  1103. idList.add("D");
  1104. idList.add("S");
  1105. System.out.println(idList);
  1106. Collections.sort(idList);
  1107. System.out.println(idList);
  1108. BigDecimal personSize = BigDecimal.ZERO;
  1109. List<BigDecimal> bigsList = Lists.newArrayList();
  1110. BigDecimal bigD = BigDecimal.valueOf(1);
  1111. bigsList.add(bigD);
  1112. BigDecimal bigC = BigDecimal.valueOf(1);
  1113. bigsList.add(bigC);
  1114. BigDecimal bigB = BigDecimal.valueOf(1);
  1115. bigsList.add(bigB);
  1116. BigDecimal bigA = BigDecimal.valueOf(1);
  1117. bigsList.add(bigA);
  1118. BigDecimal bigS = BigDecimal.valueOf(1);
  1119. bigsList.add(bigS);
  1120. String ld = "S最多%s人,A最多%s人,B最多%s人,C最多%s人,D最多%s人,";
  1121. List<String> ldrs = Lists.newArrayList();
  1122. List<BigDecimal> bigs = Lists.newArrayList();
  1123. switch ("B") {
  1124. case "D":
  1125. personSize = personSize.add(bigD);
  1126. ldrs.add("D最多%s人,");
  1127. bigsList.remove(bigD);
  1128. case "C":
  1129. personSize = personSize.add(bigC);
  1130. ldrs.add("C最多%s人,");
  1131. bigsList.remove(bigC);
  1132. case "B":
  1133. personSize = personSize.add(bigB);
  1134. ldrs.add("B最多%s人,");
  1135. bigsList.remove(bigB);
  1136. case "A":
  1137. personSize = personSize.add(bigA);
  1138. ldrs.add("A最多%s人,");
  1139. bigsList.remove(bigA);
  1140. case "S":
  1141. personSize = personSize.add(bigS);
  1142. ldrs.add("S最多%s人,");
  1143. bigsList.remove(bigS);
  1144. }
  1145. System.out.println(personSize);
  1146. System.out.println(ldrs);
  1147. ldrs.remove(0);
  1148. for (String ldr : ldrs) {
  1149. ld = ld.replace(ldr, "");
  1150. }
  1151. System.out.println(ld);
  1152. System.out.println(bigs);
  1153. System.out.println(bigsList);
  1154. Map<String, Object> map = Maps.newHashMap();
  1155. String pstartdate = "2025-10-01";
  1156. String penddate = "2025-12-31";
  1157. int cycletype = 300;
  1158. LocalDate startDate = LocalDate.parse(pstartdate, DateTimeFormatter.ISO_LOCAL_DATE);
  1159. LocalDate endDate = LocalDate.parse(penddate, DateTimeFormatter.ISO_LOCAL_DATE);
  1160. EvalplanCycleTypeEnum cycleTypeEnum = EvalplanCycleTypeEnum.getEnum(cycletype);
  1161. if (EvalplanCycleTypeEnum.FULL_YEAR_VALUE == cycletype) {
  1162. //周期为年度
  1163. endDate = endDate.plusYears(-1);
  1164. startDate = startDate.plusYears(-1);
  1165. cycleTypeEnum = EvalplanCycleTypeEnum.FULL_YEAR;
  1166. } else if (EvalplanCycleTypeEnum.HALF_YEAR_VALUE == cycletype) {
  1167. //周期为半年度
  1168. endDate = endDate.plusMonths(-6);
  1169. startDate = startDate.plusMonths(-6);
  1170. cycleTypeEnum = EvalplanCycleTypeEnum.HALF_YEAR;
  1171. } else if (EvalplanCycleTypeEnum.QUARTER_VALUE == cycletype) {
  1172. //获取为季度
  1173. endDate = endDate.plusMonths(-3);
  1174. startDate = startDate.plusMonths(-3);
  1175. cycleTypeEnum = EvalplanCycleTypeEnum.QUARTER;
  1176. } else if (EvalplanCycleTypeEnum.MONTHLY_VALUE == cycletype) {
  1177. //获取为季度
  1178. endDate = endDate.plusMonths(-1);
  1179. startDate = startDate.plusMonths(-1);
  1180. cycleTypeEnum = EvalplanCycleTypeEnum.MONTHLY;
  1181. }
  1182. map.put("cycleType", cycleTypeEnum);
  1183. map.put("endDate", endDate);
  1184. map.put("startDate", startDate);
  1185. //System.out.println(map);
  1186. }
  1187. }