MJYController.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. package com.malk.minjiaoyuan.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.malk.Util.UtilList;
  4. import com.malk.Util.UtilMap;
  5. import com.malk.Util.UtilServlet;
  6. import com.malk.Util.UtilString;
  7. import com.malk.minjiaoyuan.service.MJYService;
  8. import com.malk.server.aliwork.YDConf;
  9. import com.malk.server.aliwork.YDParam;
  10. import com.malk.server.common.McException;
  11. import com.malk.server.common.McR;
  12. import com.malk.service.aliwork.YDClient;
  13. import com.malk.service.aliwork.YDService;
  14. import lombok.Synchronized;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import org.springframework.web.bind.annotation.RequestBody;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import javax.servlet.http.HttpServletRequest;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. /**
  25. * 错误抛出与拦截详见CatchException
  26. */
  27. @Slf4j
  28. @RestController
  29. @RequestMapping("/minjiaoyuan")
  30. public class MJYController {
  31. @Autowired
  32. private YDConf ydConf;
  33. @Autowired
  34. private YDClient ydClient;
  35. @Autowired
  36. private MJYService mjyService;
  37. /**
  38. * 同步名额数据
  39. */
  40. @Synchronized
  41. @PostMapping("sync/quota")
  42. McR quotaSync(@RequestBody Map<String, String> data) {
  43. log.info("###### 同步名额数据 #####");
  44. // 参数合法校验
  45. McException.assertParamException_Null(data, "period");
  46. String period = data.get("period");
  47. // 是否重新计算
  48. YDParam ydParam = YDParam.builder()
  49. .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLLE")
  50. .pageSize(1)
  51. .searchCondition(JSON.toJSONString(UtilMap.map("selectField_lggd61a7", period)))
  52. .build();
  53. long totalCount = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_list).getTotalCount();
  54. McException.assertAccessException(totalCount > 0, period + "名额已计算, 若需重置请删除后台数据后重试");
  55. // 查询教师档案
  56. ydParam.setSearchCondition(null);
  57. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLAE");
  58. List<Map> teacherList = mjyService.queryAllBySync(ydParam);
  59. log.info("教师档案数据, {}", teacherList.size());
  60. // 学校档案去重
  61. List<Map> schoolList = new ArrayList<>();
  62. for (Map teacher : teacherList) {
  63. Map formData = (Map) teacher.get("formData");
  64. // 条件: 学校全称
  65. Optional matchData = schoolList.stream().filter(school -> formData.get("textField_lgeyihed").equals(school.get("textField_lgezb8r7"))).findAny();
  66. Map schoolMap;
  67. if (!matchData.isPresent()) {
  68. schoolMap = UtilMap.map("selectField_lggd61a7, radioField_lgf7zdi5", period, "未开始");
  69. schoolMap.put("textField_lgezb8r7", formData.get("textField_lgeyihed")); // 学校全称
  70. schoolMap.put("textField_lggdp94o", formData.get("textField_lgeyihe8")); // 学校简称
  71. schoolMap.put("selectField_lggdghio", formData.get("selectField_lggdghio")); // 所属学段
  72. schoolMap.put("numberField_lgf2au4s", 0); // 在编在岗人数
  73. schoolList.add(schoolMap);
  74. } else {
  75. schoolMap = (Map) matchData.get();
  76. }
  77. // prd: 档案教师计算比例都是在编在岗
  78. if (formData.get("radioField_lgezgr8l").equals("是")) {
  79. schoolMap.put("numberField_lgf2au4s", (int) schoolMap.get("numberField_lgf2au4s") + 1);
  80. }
  81. log.debug("教师档案处理, {}", formData);
  82. }
  83. log.info("学校档案数据, {}, {}", schoolList.size(), schoolList);
  84. // 学校名额计算
  85. for (Map schoolData : schoolList) {
  86. String schoolName = String.valueOf(schoolData.get("textField_lgezb8r7"));
  87. int numZBZG = Integer.valueOf(String.valueOf(schoolData.get("numberField_lgf2au4s")));
  88. // 骨干系列: prd 骨干比例拆分比例分项计算, 合计数不一定匹配, 因此不计算骨干系列名额
  89. int ratioGDXT = mjyService.getSchoolRatio(schoolName, "骨干系列");
  90. schoolData.put("numberField_lgf2au4t", ratioGDXT);
  91. // 学科带头人和骨干教师
  92. int ratioXDGG = mjyService.getSchoolRatio(schoolName, "学科带头人和骨干教师");
  93. schoolData.put("numberField_lgf2au51", ratioXDGG);
  94. schoolData.put("numberField_lgf2au52", Math.round(numZBZG * ratioXDGG / 100));
  95. // 骨干后备
  96. int numGGHB = Math.round(numZBZG * (ratioGDXT - ratioXDGG) / 100);
  97. schoolData.put("numberField_lghpgjyk", ratioGDXT - ratioXDGG);
  98. schoolData.put("numberField_lgf2au4z", numGGHB);
  99. // 写入学校档案
  100. log.info("学校名额计算, {}", schoolData);
  101. ydParam.setFormDataJson(JSON.toJSONString(schoolData));
  102. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLLE");
  103. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.create);
  104. }
  105. return McR.success(mjyService.matchQuery(schoolList));
  106. }
  107. /**
  108. * 查询学校名额
  109. */
  110. @PostMapping("query/quota")
  111. McR quotaQuery(@RequestBody Map<String, String> data) {
  112. McException.assertParamException_Null(data, "period");
  113. String period = data.get("period");
  114. YDParam ydParam = YDParam.builder()
  115. .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLLE")
  116. .searchCondition(JSON.toJSONString(UtilMap.map("selectField_lggd61a7", period)))
  117. .build();
  118. List<Map> schoolList = mjyService.queryAllBySync(ydParam);
  119. log.info("学校名额数据, {}", schoolList.size());
  120. List list = schoolList.stream().map(item -> (Map) item.get("formData")).collect(Collectors.toList());
  121. return McR.success(mjyService.matchQuery(list));
  122. }
  123. /**
  124. * 推送学校名额确认
  125. */
  126. @PostMapping("confirm/quota")
  127. McR quotaConfirm(HttpServletRequest request) {
  128. Map data = UtilServlet.getParamMap(request);
  129. McException.assertParamException_Null(data, "formInstanceId");
  130. YDParam ydParam = YDParam.builder()
  131. .formInstanceId(String.valueOf(data.get("formInstanceId")))
  132. .build();
  133. Map formData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
  134. List<Map> details = (List<Map>) formData.get("tableField_lgf41nj3");
  135. // 创建学校确认流程: src - cur, 发起流程 - 学校确认; 明细内: 全称, 简称, 在编在岗, 学带 + 骨干教师, 后备, 学校负责人
  136. Map<String, String> keyMap = UtilMap.map("selectField_lgf41nj4, selectField_lgi7oaqo, numberField_lgf2au4s, numberField_lgi7oaqq, numberField_lgi7oaqr, employeeField_lgf7ky0h",
  137. "selectField_lgf41nj4, selectField_lgi7oaqo, numberField_lgf2au4s, numberField_lgi7oaqq, numberField_lgi7oaqr, employeeField_lgf7m9s4");
  138. for (Map detail : details) {
  139. // 主表读取: 届别, 提交人
  140. Map formJson = UtilMap.map("selectField_lggd61a7, employeeField_lgf7ky0i", formData.get("selectField_lggd61a7"), formData.get("employeeField_lgf6dzrv_id"));
  141. for (String key : keyMap.keySet()) {
  142. if (key.contains("employeeField_")) {
  143. formJson.put(key, detail.get(keyMap.get(key) + "_id"));
  144. } else {
  145. formJson.put(key, detail.get(keyMap.get(key)));
  146. }
  147. }
  148. log.info("名额确认记录, {}, {}", formJson, detail);
  149. ydParam.setFormDataJson(JSON.toJSONString(formJson));
  150. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLYD");
  151. ydParam.setProcessCode("TPROC--G2666871DH3AGJ52BWGGY62N9HGV39Y1TRTGLL6");
  152. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.start);
  153. }
  154. return McR.success();
  155. }
  156. /**
  157. * 汇总学校复核数据
  158. */
  159. @Synchronized
  160. @PostMapping("approve/quota")
  161. McR quotaApprove(HttpServletRequest request) {
  162. Map data = UtilServlet.getParamMap(request);
  163. McException.assertParamException_Null(data, "formInstanceId");
  164. log.info("学校汇总, {}", data);
  165. // 查询教师申请数据
  166. YDParam ydParam = YDParam.builder()
  167. .formInstanceId(String.valueOf(data.get("formInstanceId")))
  168. .build();
  169. Map teacherData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
  170. // 匹配学校汇总数据: 届别 + 学校全称
  171. Map formData = UtilMap.map("selectField_lggd61a7, selectField_lgf41nj4", teacherData.get("selectField_lgs5yclt"), teacherData.get("textField_lgf4ppaw"));
  172. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLWD");
  173. ydParam.setSearchCondition(JSON.toJSONString(formData));
  174. List<Map> schoolApprove = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_list_all).getData();
  175. // 组装评审明细数据: 关联评选记录, 教师进修编号, 教师成员, 手机号, 评选类型, 行政职务
  176. formData.put("selectField_lgi7oaqo", teacherData.get("textField_lgib58q3")); // 学校简称
  177. formData.put("employeeField_lgf7ky0h", teacherData.get("employeeField_lgf7ky0h_id")); // 学校负责人
  178. formData.put("radioField_lggd61a8", "进行中"); // 届别评选状态
  179. List<Map> details = new ArrayList<>();
  180. if (UtilList.isNotEmpty(schoolApprove)) {
  181. Map recordData = schoolApprove.get(0);
  182. details = mjyService.getCollectData(String.valueOf(recordData.get("formInstanceId"))); // 全量申请数据
  183. // 成员组件 && 关联表单数据处理
  184. details.forEach(item -> {
  185. item.put("employeeField_lgialujd", item.get("employeeField_lgialujd_id"));
  186. item.put("associationFormField_lgiacs47", JSON.parse(String.valueOf(item.get("associationFormField_lgiacs47_id"))));
  187. });
  188. ydParam.setFormInstanceId(String.valueOf(recordData.get("formInstanceId")));
  189. }
  190. Map detail = UtilMap.map("textField_lgialujb, employeeField_lgialujd, numberField_lgeyihee, selectField_lgf4ppa6, textField_lgt9sb8f, textField_lhxaovhb", teacherData.get("textField_lgf4ppax"), teacherData.get("employeeField_lgf4ppa7_id"), teacherData.get("numberField_lgeyihee"), teacherData.get("selectField_lgf4ppa6"), teacherData.get("textField_lgt9sb8f"), teacherData.get("serialNumberField_lhxa769r"));
  191. detail.put("associationFormField_lgiacs47", Arrays.asList(UtilMap.map("appType, formUuid, instanceId, title, formType, subTitle", ydConf.getAppType(), "FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLVD", data.get("formInstanceId"), teacherData.get("textField_lgs8ej3g"), "receipt", teacherData.get("textField_lgf4ppax"))));
  192. details.add(detail);
  193. // prd 按照评选类型, 排序: 学带, 骨干, 特色, 后备
  194. Map sortRule = UtilMap.map("学科带头人, 骨干教师, 骨干后备, 特色骨干", 1, 2, 3, 4);
  195. details.forEach(item -> item.put("sort", sortRule.get(item.get("selectField_lgf4ppa6"))));
  196. Collections.sort(details, Comparator.comparingInt(o -> Integer.parseInt(String.valueOf(o.get("sort")))));
  197. formData.put("tableField_lgiacs44", details);
  198. log.info("学校汇总记录, {}", JSON.toJSONString(formData));
  199. ydParam.setFormDataJson(JSON.toJSONString(formData));
  200. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLWD");
  201. ydParam.setProcessCode("TPROC--G2666871DH3AGJ52BWGGY62N9HGV39Y1TRTGLN6");
  202. if (UtilList.isNotEmpty(schoolApprove)) {
  203. ydParam.setUpdateFormDataJson(ydParam.getFormDataJson());
  204. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  205. return McR.success();
  206. }
  207. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.start);
  208. return McR.success();
  209. }
  210. @Autowired
  211. private YDService ydService;
  212. /**
  213. * 学校申报区里, 名额校验
  214. */
  215. @PostMapping("validate/quota")
  216. McR quotaValidate(HttpServletRequest request) {
  217. Map data = UtilServlet.getParamMap(request);
  218. McException.assertParamException_Null(data, "formInstanceId");
  219. log.info("名额校验, {}", data);
  220. List usersZRMD = mjyService.getDirectList(); // 直入名单
  221. // 学校申报数据
  222. YDParam ydParam = YDParam.builder()
  223. .formInstanceId(String.valueOf(data.get("formInstanceId")))
  224. .build();
  225. Map approveData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
  226. List<Map> details = mjyService.getCollectData(String.valueOf(data.get("formInstanceId"))); // 全量教师申请数量
  227. // 匹配通过数据 & 未在直入名单 [进修编号]
  228. List arrStatus = (List) JSON.parse(String.valueOf(data.get("details_status")));
  229. List arrType = (List) JSON.parse(String.valueOf(data.get("details_type")));
  230. List arrPeerRatio = (List) JSON.parse(String.valueOf(data.get("details_peer_ratio")));
  231. List arrSort = (List) JSON.parse(String.valueOf(data.get("details_sort")));
  232. List<Map> approveList = new ArrayList();
  233. int appXKDTR = 0, appGGJS = 0, appGGHB = 0, appTSGG = 0, appZRMD = 0;
  234. for (int i = 0; i < arrStatus.size(); i++) {
  235. // prd 直入名单通过人员匹配, 不占用名额, 教师信息报区里
  236. if (usersZRMD.contains(details.get(i).get("textField_lgialujb"))) {
  237. details.get(i).put("isDirect", "直入名单");
  238. approveList.add(details.get(i));
  239. appZRMD++;
  240. log.info("直入名单, {}", details.get(i));
  241. } else if (arrStatus.get(i).equals("通过")) {
  242. if (arrType.get(i).equals("学科带头人")) appXKDTR += 1;
  243. if (arrType.get(i).equals("骨干教师")) appGGJS += 1;
  244. if (arrType.get(i).equals("骨干后备")) appGGHB += 1;
  245. if (arrType.get(i).equals("特色骨干")) appTSGG += 1;
  246. approveList.add(details.get(i));
  247. }
  248. // 存储前台填写数据
  249. details.get(i).put("textField_lgst1j31", arrPeerRatio.get(i));
  250. details.get(i).put("numberField_lh8monwb", arrSort.get(i));
  251. details.get(i).put("radioField_lgialujc", arrStatus.get(i));
  252. }
  253. log.info("申报数量, appXKDTR = {}, appGGJS = {}, appGGHB = {}, appTSGG = {}, appZRMD = {}", appXKDTR, appGGJS, appGGHB, appTSGG, appZRMD);
  254. // 学校名额信息: 届别 + 学校全称
  255. ydParam.setFormInstanceId(null);
  256. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLLE");
  257. ydParam.setSearchCondition(JSON.toJSONString(UtilMap.map("selectField_lggd61a7, textField_lgezb8r7", approveData.get("selectField_lggd61a7"), approveData.get("selectField_lgf41nj4"))));
  258. ydParam.setPageSize(1);
  259. ydParam.setPageSize(Integer.valueOf(10));
  260. // 学校查询输入框, 模糊会有重复情况, 兼容处理
  261. List<Map> formList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_list).getData();
  262. if (formList.size() > 1) {
  263. formList = formList.stream().filter(item -> ((Map) item.get("formData")).get("textField_lgezb8r7").equals(approveData.get("selectField_lgf41nj4"))).collect(Collectors.toList());
  264. }
  265. Map schoolData = (Map) (formList.get(0)).get("formData");
  266. int numXDGG = Integer.valueOf(String.valueOf(schoolData.get("numberField_lgf2au52")));
  267. int numGGHB = Integer.valueOf(String.valueOf(schoolData.get("numberField_lgf2au4z")));
  268. // 学带 + 骨干教师名额校验
  269. McException.assertAccessException((appXKDTR + appGGJS) > numXDGG, "申报名额校验未通过,请核查!");
  270. // 名额降级逻辑,骨干后备可以占骨干教师 + 学带名额 [prd 申报名额未用完或超标均不能上报]
  271. McException.assertAccessException((appGGHB + appXKDTR + appGGJS) != (numGGHB + numXDGG), "申报名额校验未通过,请核查!");
  272. // 更新申报信息: 进修编号, 评选类型, 同职比, 手机号 [排序]
  273. Map updateJson = UtilMap.map("numberField_lgstol7i, numberField_lgstol7k, numberField_lgstol7j, numberField_lgstol7l", appXKDTR, appGGJS, appGGHB, appTSGG);
  274. List<Map> appDetails = approveList.stream().map(item -> {
  275. Map row = UtilMap.map("textField_lgst1j33, selectField_lgst1j35, textField_lgst1j3g, numberField_lgst1j37", item.get("textField_lgialujb"), item.get("selectField_lgf4ppa6"), item.get("textField_lgst1j31"), item.get("numberField_lgeyihee"));
  276. row.put("textField_lgt59zeb", item.get("isDirect"));
  277. row.put("employeeField_lgst1j34", item.get("employeeField_lgialujd_id"));
  278. row.put("numberField_lh8monwb", item.get("numberField_lh8monwb")); // 未排序过前顺序
  279. row.put("associationFormField_lgst1j32", JSON.parse(String.valueOf(item.get("associationFormField_lgiacs47_id"))));
  280. return row;
  281. }).collect(Collectors.toList());
  282. Collections.sort(appDetails, Comparator.comparingInt(o -> Integer.parseInt(String.valueOf(o.get("numberField_lh8monwb")))));
  283. // 后置排序, 避免影响到客户填入数据 [先储存再排序]
  284. details.forEach(item -> {
  285. item.put("employeeField_lgialujd", item.get("employeeField_lgialujd_id"));
  286. item.put("associationFormField_lgiacs47", JSON.parse(String.valueOf(item.get("associationFormField_lgiacs47_id"))));
  287. });
  288. Collections.sort(details, Comparator.comparingInt(o -> Integer.parseInt(String.valueOf(o.get("numberField_lh8monwb")))));
  289. updateJson.put("tableField_lgst1j3e", appDetails);
  290. updateJson.put("tableField_lgiacs44", details); // 更新学校排序
  291. ydParam.setFormInstanceId(String.valueOf(data.get("formInstanceId")));
  292. ydParam.setUpdateFormDataJson(JSON.toJSONString(updateJson));
  293. // 操作数据 [异步] - 审批通过立即更新, 会无效
  294. ydService.operateData(ydParam, YDConf.FORM_OPERATION.update);
  295. log.info("更新申报信息, {}", appDetails);
  296. return McR.success();
  297. }
  298. // 宜搭审批页面弱校验提示框会被覆盖, 或另一个校验冲销. 添加记录, 第二次请求放行
  299. private Map checkMap = new HashMap();
  300. /**
  301. * 学校申报区里, 学校中层或校级副职干部, 弱校验
  302. */
  303. @PostMapping("check/quota")
  304. McR quotaCheck(HttpServletRequest request) {
  305. Map data = UtilServlet.getParamMap(request);
  306. McException.assertParamException_Null(data, "formInstanceId");
  307. log.info("名额验证, {}", data);
  308. List usersZRMD = mjyService.getDirectList(); // 直入名单
  309. // 学校申报数据
  310. YDParam ydParam = YDParam.builder()
  311. .formInstanceId(String.valueOf(data.get("formInstanceId")))
  312. .build();
  313. Map approveData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
  314. List<Map> details = (List<Map>) approveData.get("tableField_lgiacs44");
  315. // 匹配通过数据 & 未在直入名单 [进修编号]
  316. List arrStatus = (List) JSON.parse(String.valueOf(data.get("details_status")));
  317. List arrType = (List) JSON.parse(String.valueOf(data.get("details_type")));
  318. List<Map> approveList = new ArrayList();
  319. int appGGHB = 0;
  320. for (int i = 0; i < arrStatus.size(); i++) {
  321. // prd 直入名单通过人员匹配, 不占用名额, 教师信息报区里
  322. if (usersZRMD.contains(details.get(i).get("textField_lgialujb"))) {
  323. approveList.add(details.get(i));
  324. details.get(i).put("isDirect", "直入名单");
  325. log.info("直入名单, {}", details.get(i));
  326. } else if (arrStatus.get(i).equals("通过")) {
  327. approveList.add(details.get(i));
  328. if (arrType.get(i).equals("骨干后备")) appGGHB += 1;
  329. }
  330. }
  331. float numZCXF = approveList.stream().filter(item -> Arrays.asList("学校副职", "中层副职", "中层正职").contains(item.get("textField_lgt9sb8f"))).collect(Collectors.toList()).size();
  332. log.info("学校中层或校级副职干部, 弱校验, appGGHB = {}, nunZCXF = {}", appGGHB, numZCXF);
  333. // 学校名额信息: 届别 + 学校全称
  334. ydParam.setFormInstanceId(null);
  335. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLLE");
  336. ydParam.setSearchCondition(JSON.toJSONString(UtilMap.map("selectField_lggd61a7, textField_lgezb8r7", approveData.get("selectField_lggd61a7"), approveData.get("selectField_lgf41nj4"))));
  337. ydParam.setPageSize(1);
  338. Map schoolData = (Map) ((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_list).getData()).get(0).get("formData");
  339. // prd 学校中层或校级副职干部,每周兼课时数需达到教育局规定课时量,比例不超过学校申报骨干后备教师人选的20%。(学校教师人在编在岗数不满30人,比例不超过学校申报骨干后备教师人选的25%)
  340. float numZBZG = Integer.valueOf(String.valueOf(schoolData.get("numberField_lgf2au4s")));
  341. int ratio = numZBZG >= 30 ? 25 : 20;
  342. log.info("学校中层或校级副职干部, 弱校验, check = {}, ratio = {}", appGGHB / numZBZG, ratio / 100F);
  343. if (!checkMap.containsKey(data.get("formInstanceId"))) {
  344. checkMap.put(data.get("formInstanceId"), true);
  345. McException.assertAccessException((appGGHB / numZBZG) > (ratio / 100F), "学校中层或校级副职干部, 占比骨干后备超标准");
  346. }
  347. return McR.success();
  348. }
  349. /**
  350. * 是否直入名单
  351. */
  352. @PostMapping("direct/quota")
  353. McR directQuota(@RequestBody Map data) {
  354. log.info("是否直入名单", data);
  355. McException.assertParamException_Null(data, "code");
  356. List usersZRMD = mjyService.getDirectList(); // 直入名单
  357. return McR.success(UtilMap.map("isDirect", usersZRMD.contains(data.get("code"))));
  358. }
  359. /**
  360. * 退回卡片通知
  361. * 被学校退回:某某老师,您的骨干系列评选材料已被学校退回。
  362. * 被区级退回:某某老师,您的骨干系列评选材料已被区级退回;某某学校,您校某某老师的评选资料已被区级退回。
  363. */
  364. @PostMapping("notice/sendback")
  365. McR sendBackNotice(HttpServletRequest request) {
  366. Map data = UtilServlet.getParamMap(request);
  367. log.info("退回卡片通知, {}", data);
  368. McException.assertParamException_Null(data, "teachers, administrator, results, associations, createUserId, schoolName");
  369. List<String> teachers = (List<String>) JSON.parse(String.valueOf(data.get("teachers")));
  370. List<String> associations = (List<String>) JSON.parse(String.valueOf(data.get("associations")));
  371. List<String> results = (List<String>) JSON.parse(String.valueOf(data.get("results")));
  372. String createUserId = String.valueOf(data.get("createUserId"));
  373. String schoolName = String.valueOf(data.get("schoolName"));
  374. for (int i = 0; i < results.size(); i++) {
  375. String status = results.get(i);
  376. if (!Arrays.asList("不通过", "退回").contains(status)) {
  377. continue;
  378. }
  379. List<Map> associationForm = (List<Map>) JSON.parse(associations.get(i));
  380. String notice = associationForm.get(0).get("title") + "老师[" + associationForm.get(0).get("subTitle") + "]";
  381. Map formData = UtilMap.map("employeeField_lhgj6tc7, employeeField_lhgj6tc9, associationFormField_lgiacs47", JSON.parse(teachers.get(i)), data.get("administrator"), associationForm);
  382. if ("不通过".equals(status)) {
  383. notice += ", 您好: \n您的骨干系列评选材料已被学校退回。";
  384. }
  385. if ("退回".equals(status)) {
  386. notice += ", 您好: \n您的骨干系列评选材料已被区级退回。";
  387. // 通知学校
  388. String new_notice = schoolName + ", 管理员您好: \n您校" + associationForm.get(0).get("title") + "老师[" + associationForm.get(0).get("subTitle") + "]";
  389. new_notice += "的评选资料已被区级退回。";
  390. formData.put("textareaField_lhgj6tcu", new_notice);
  391. mjyService.triggerNotice("FORM-NC966W81139A3Y5QEEXT5AZ6BU7M3TB0C9LHLO", createUserId, formData);
  392. }
  393. // 通知老师
  394. formData.put("textareaField_lhgj6tcu", notice);
  395. mjyService.triggerNotice("FORM-NT766881D48AF5W78VL7L6VLZTAJ2TOE6JGHL92", createUserId, formData);
  396. }
  397. return McR.success();
  398. }
  399. /**
  400. * 评选信息变更
  401. */
  402. @PostMapping("update/details")
  403. McR updateDetails(HttpServletRequest request) {
  404. Map data = UtilServlet.getParamMap(request);
  405. McException.assertParamException_Null(data, "formInstanceId");
  406. log.info("信息变更, {}", data);
  407. YDParam ydParam = YDParam.builder()
  408. .formInstanceId(String.valueOf(data.get("formInstanceId")))
  409. .build();
  410. Map formData = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id).getFormData();
  411. List<Map> details = (List<Map>) formData.get("tableField_lgs5ycm5");
  412. List<Map> association = (List<Map>) JSON.parse(String.valueOf(data.get("associationComp")));
  413. ydParam.setFormInstanceId(String.valueOf(association.get(0).get("instanceId")));
  414. ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lgs5ycm5", details)));
  415. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  416. return McR.success();
  417. }
  418. /**
  419. * 学校管理员撤回
  420. */
  421. @Synchronized
  422. @PostMapping({"cancel/quota"})
  423. McR cancelQuota(@RequestBody Map data) {
  424. log.info("学校管理员撤回, {}", data);
  425. McException.assertParamException_Null(data, "serialNumber, teacherCode, schoolShort, period, formInstId");
  426. YDParam ydParam = YDParam.builder()
  427. .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGL7E")
  428. .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lftczqr5", data.get("teacherCode"))))
  429. .pageSize(1)
  430. .build();
  431. Map dataForm = ((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData()).get(0);
  432. Map formData = (Map) dataForm.get("formData");
  433. // 校验, 修改教师档案
  434. String result = String.valueOf(formData.get("radioField_lgfawf83"));
  435. McException.assertAccessException((!result.equals("内通过") && !result.equals("内拒绝")), "当前结果为" + (UtilString.isBlankCompatNull(result) ? "未开始" : result) + ", 不支持撤销!");
  436. ydParam.setFormInstanceId(dataForm.get("formInstanceId").toString());
  437. ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("radioField_lgfawf83", "")));
  438. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  439. // 修改教师档案
  440. ydParam.setFormInstanceId("");
  441. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLAE");
  442. ydParam.setSearchFieldJson(JSON.toJSONString(UtilMap.map("textField_lftczqr5", data.get("teacherCode"))));
  443. dataForm = ((List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData()).get(0);
  444. ydParam.setFormInstanceId(dataForm.get("formInstanceId").toString());
  445. ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("radioField_lhlbdk4w", "")));
  446. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  447. // 修改评选报名
  448. ydParam.setFormInstanceId(data.get("formInstId").toString());
  449. ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("textField_li0f7sah", "")));
  450. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  451. ydParam.setFormInstanceId("");
  452. // 删除评选汇总
  453. ydParam.setFormUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLWD");
  454. ydParam.setSearchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lgi7oaqo, selectField_lggd61a7", new Object[]{data.get("schoolShort"), data.get("period")})));
  455. String processInstanceId = ((List<String>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_process_id).getData()).get(0);
  456. List<Map> details = mjyService.getCollectData(processInstanceId);
  457. Optional optional = details.stream().filter(item -> item.get("textField_lhxaovhb").equals(data.get("serialNumber"))).findAny();
  458. if (optional.isPresent()) {
  459. details.remove(optional.get());
  460. ydParam.setFormInstanceId(processInstanceId);
  461. // 宜搭BUG: 若仅剩一条, 明细不支持删除, 只能删除主表
  462. if (details.isEmpty()) {
  463. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.delete);
  464. } else {
  465. details.forEach(item -> {
  466. item.put("employeeField_lgialujd", item.get("employeeField_lgialujd_id"));
  467. item.put("associationFormField_lgiacs47", JSON.parse(String.valueOf(item.get("associationFormField_lgiacs47_id"))));
  468. });
  469. ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lgiacs44", details)));
  470. ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update);
  471. }
  472. String notice = data.get("teacherName") + "老师[" + data.get("teacherCode") + "]";
  473. notice = notice + ", 您好: \n您的评选材料经过学校审核被撤销, 请按照要求重新提交评选材料。";
  474. dataForm = UtilMap.map("employeeField_lhgj6tc7, textField_lhlj3dgb, textareaField_lhgj6tcu", Arrays.asList(data.get("teacherCode")), data.get("teacherCode"), notice);
  475. mjyService.triggerNotice("FORM-F8666NB1MRZA2CT097OAE65SOFSV27SERG0ILB", String.valueOf(data.get("teacherCode")), dataForm);
  476. log.info("撤销成功, {}", optional.get());
  477. }
  478. return McR.success(details);
  479. }
  480. }