diff --git a/ruoyi-admin/src/main/resources/application-hs.yml b/ruoyi-admin/src/main/resources/application-hs.yml index 2b3426c..712e10b 100644 --- a/ruoyi-admin/src/main/resources/application-hs.yml +++ b/ruoyi-admin/src/main/resources/application-hs.yml @@ -6,10 +6,11 @@ spring: druid: # 主库数据源 master: - #url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + #url: jdbc:mysql://localhost:3307/kaohe?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://172.16.9.9:3306/kaohe?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: ruanfa + #password: hs123456 # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-kaohe/pom.xml b/ruoyi-kaohe/pom.xml index 04677b2..f024544 100644 --- a/ruoyi-kaohe/pom.xml +++ b/ruoyi-kaohe/pom.xml @@ -27,6 +27,11 @@ pinyin4j 2.5.0 + + org.json + json + 20210307 + \ No newline at end of file diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java index 16b7440..396679f 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhGatherController.java @@ -4,14 +4,15 @@ import java.math.BigDecimal; import java.util.*; import javax.servlet.http.HttpServletResponse; -import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; import com.ruoyi.kaohe.domain.KhKhrwResult; -import com.ruoyi.kaohe.domain.KhgatherParam; import com.ruoyi.kaohe.service.IKhKhrwResultService; import com.ruoyi.kaohe.service.IKhVoteEmpService; import com.ruoyi.kaohe.service.IKhVoteService; +import com.ruoyi.kaohe.util.JsonDeepMerge; import com.ruoyi.kaohe.util.PinYinUtil; +import org.json.JSONArray; +import org.json.JSONObject; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -54,141 +55,219 @@ public class KhGatherController extends BaseController { */ //@PreAuthorize("@ss.hasPermi('kaohe:gather:list')") @PostMapping("/generateSum") - public AjaxResult generateSum(@RequestBody String json) { + public AjaxResult generateSum(@RequestBody String json) throws JsonProcessingException { // 将String转换为JSONObject - JSONObject jsonObject = JSONObject.parseObject(json); + JSONObject jsonObject = new JSONObject(json); String hz_name = jsonObject.getString("title"); JSONArray datas = jsonObject.getJSONArray("data"); //拼接表头数据 - JSONArray header = new JSONArray();//存放表头及表格关联数据 + JSONArray header = new JSONArray();//存放表头的最终数据 //---------------------------------------------------------------------------------------------- //循环主标题下的每一个子节点 - Map nodes = parseJson(datas, hz_name); - JSONObject btKhdx = (JSONObject)nodes.get("btKhdx"); + Map nodes = parseJson(datas, hz_name, null); + //获取并拼接表头 + JSONObject btKhdx = (JSONObject) nodes.get("btKhdx"); JSONObject head = (JSONObject) nodes.get("head"); JSONArray oldchildren = head.getJSONArray("children"); JSONArray newChildren = new JSONArray(); - newChildren.add(btKhdx); + newChildren.put(btKhdx); for (Object oldchild : oldchildren) { - newChildren.add(oldchild); + newChildren.put(oldchild); } - head.put("children",newChildren); - header.add(head); - return AjaxResult.success(header); + head.put("children", newChildren); + header.put(head); + + //获取并整合数据 + JSONArray tabledata = new JSONArray((JSONArray) nodes.get("alldatas")); + JSONArray erjiTtitle_df = new JSONArray((JSONArray) nodes.get("title_df")); + tabledata.putAll(erjiTtitle_df); + //根据被考核对象名分组数据到map中 得到表格内容的最终数据 + JSONArray endTableData = JsonDeepMerge.mergeByKey(tabledata, "khdx"); + + KhGather gather = new KhGather(); + gather.setHzName(hz_name); + gather.setTableHeader(header.toString(2)); + gather.setTableData(endTableData.toString(2)); + khGatherService.insertKhGather(gather); + return AjaxResult.success(); } - //递归解析json - private Map parseJson(JSONArray datas, String titleP) { + /** + * 递归解析json + * + * @param datas + * @param titleP + * @param z_zb + * @return + */ + private Map parseJson(JSONArray datas, String titleP, BigDecimal z_zb) throws JsonProcessingException { + Map result = new HashMap<>(); - //父级表头 - JSONObject btKhdx = new JSONObject(); - JSONObject btTitle = new JSONObject(); - btTitle.put("name", PinYinUtil.getPinyinInitials(titleP)); + JSONArray endtTitle_df = new JSONArray();//存储标题占比时的得分 + JSONArray title_df = new JSONArray();//处理标题占比时的得分 + String pyTitle = PinYinUtil.getPinyinInitials(titleP);//父级表头 + JSONObject btKhdx = new JSONObject(true); //表头考核对象存储 + JSONObject btTitle = new JSONObject(true); + btTitle.put("name", pyTitle); btTitle.put("label", titleP); JSONArray btchildren = new JSONArray(); //--------------------------------------------------------------------- JSONArray bd = new JSONArray();//表数据拼接 - List alldatas = new ArrayList<>(); - + JSONArray alldatas = new JSONArray();//表格数据拼接 - - for (int i = 0; i < datas.size(); i++) { + //循环考核任务或标题 + for (int i = 0; i < datas.length(); i++) { JSONObject jobj = (JSONObject) datas.get(i); String type = jobj.getString("type"); String title = jobj.getString("title"); + String erjiPyTitle = PinYinUtil.getPinyinInitials(title); + BigDecimal zb = null; + if (jobj.has("zb")) { + zb = jobj.getBigDecimal("zb"); + } //如果有子集就遍历 if (type.equals("0")) { JSONArray data2 = jobj.getJSONArray("data"); - BigDecimal zb = jobj.getBigDecimal("zb"); - Map childmap = parseJson(data2,title); - JSONObject head= (JSONObject)childmap.get("head"); - btchildren.add(head); + //递归获取下一级数据 + Map childmap = parseJson(data2, title, zb); + JSONObject head = (JSONObject) childmap.get("head"); + JSONObject defen = new JSONObject(true); + defen.put("name", erjiPyTitle + "_df"); + defen.put("label", "得分"); + JSONObject zb1 = new JSONObject(true); + zb1.put("name", erjiPyTitle + "_zb"); + zb1.put("label", "占比"); + JSONObject zsfs = new JSONObject(true); + zsfs.put("name", erjiPyTitle + "_zsfs"); + zsfs.put("label", "折算分数"); + btchildren.put(head); + btchildren.put(defen); + btchildren.put(zb1); + btchildren.put(zsfs); + //-------------------------获取表格数据------------------------------ + JSONArray alldatas1 = (JSONArray) childmap.get("alldatas"); + JSONArray title_df1 = (JSONArray) childmap.get("title_df"); + /*if(title_df1==null){//代表它下面还是标题,没有数据 多级标题的 + BigDecimal erjidf = BigDecimal.ZERO; + JSONObject outsideTitle = new JSONObject(); + JSONObject newDf = new JSONObject(); + newDf.put(erjiPyTitle+"_df", erjidf); + if (z_zb != null) { //如果传递过来的标题占比不为null + BigDecimal erjizsfs = z_zb.multiply(erjidf); + newDf.put(erjiPyTitle + "_zb", z_zb); + newDf.put(erjiPyTitle + "_zsfs", erjizsfs); + } + outsideTitle.put(pyTitle,newDf); + title_df.put(outsideTitle); + }else{*/ + JSONArray title_df_cl = new JSONArray(JsonDeepMerge.jsonGroupSum(title_df1, "khdx", erjiPyTitle + "_df")); + //循环处理后的标题得分 加上层级及 占比、折算分数 + for (Object df : title_df_cl) { + JSONObject dfobj = (JSONObject) df; + BigDecimal erjidf = dfobj.getBigDecimal(erjiPyTitle + "_df"); + JSONObject newDf = new JSONObject(); + newDf.put(erjiPyTitle + "_df", erjidf); + if (zb != null) { //如果传递过来的标题占比不为null + BigDecimal erjizsfs = zb.multiply(erjidf); + newDf.put(erjiPyTitle + "_zb", zb); + newDf.put(erjiPyTitle + "_zsfs", erjizsfs); + } + dfobj.remove(erjiPyTitle + "_df");//删除原来的数据项 + dfobj.put(pyTitle, newDf);//删除原来的数据项 + df = dfobj; + } + title_df=title_df_cl; - } else if (type.equals("1")) { //引用占比考核任务 - Long pcId = jobj.getLong("id"); - BigDecimal zb = jobj.getBigDecimal("zb"); - KhKhrwResult khrwResult = new KhKhrwResult(); - khrwResult.setPcId(pcId); - //获取考核任务结果 - List khrw = khKhrwResultService.selectKhKhrwResultList(khrwResult); - if(khrw!=null&&khrw.size()>0){ - JSONArray tableHeader = JSONArray.parse(khrw.get(0).getTableHeader()); - JSONObject head1 = new JSONObject(); - JSONObject head2 = new JSONObject(); - btKhdx=tableHeader.getJSONObject(0);//下标0 单位/姓名 - head1=tableHeader.getJSONObject(1); //整体数据 - head2=tableHeader.getJSONObject(2);//得分 - btchildren.add(head1); - btchildren.add(head2); + //循环改变内部层级关系 + for (Object tabledatum : alldatas1) { + JSONObject obj = (JSONObject) tabledatum; + JSONObject yiji = new JSONObject(true); + yiji.put(erjiPyTitle, obj.get(erjiPyTitle)); + obj.remove(erjiPyTitle);//删除原来的数据项 + obj.put(pyTitle, yiji); + tabledatum = obj; } + alldatas.putAll(alldatas1); - //------------------------------------------------------------------------------------------ - JSONArray tabledata = JSONArray.parse(khrw.get(0).getTableData()); - alldatas.addAll(tabledata); - } else { //引用不占比考核任务 + } else { //引用考核任务 Long pcId = jobj.getLong("id"); + + String khrwName = jobj.getString("title"); + String pykhrwName = PinYinUtil.getPinyinInitials(khrwName); KhKhrwResult khrwResult = new KhKhrwResult(); khrwResult.setPcId(pcId); + //获取考核任务结果 List khrw = khKhrwResultService.selectKhKhrwResultList(khrwResult); - if(khrw!=null&&khrw.size()>0){ - JSONArray tableHeader = JSONArray.parse(khrw.get(0).getTableHeader()); - JSONObject head1 = new JSONObject(); - JSONObject head2 = new JSONObject(); - btKhdx=tableHeader.getJSONObject(0);//下标0 单位/姓名 - head1=tableHeader.getJSONObject(1); //整体数据 - head2=tableHeader.getJSONObject(2);//得分 - btchildren.add(head1); - btchildren.add(head2); - } + if (khrw != null && khrw.size() > 0) { + //----------组合表头数据--------- + JSONArray tableHeader = new JSONArray(khrw.get(0).getTableHeader()); + btKhdx = tableHeader.getJSONObject(0);//下标0 单位/姓名 + JSONObject head1 = tableHeader.getJSONObject(1); //整体数据 + JSONObject head2 = tableHeader.getJSONObject(2);//得分 + btchildren.put(head1); + btchildren.put(head2); + if (zb != null) { //当考核任务不占比时 + JSONObject head3 = new JSONObject(true); //占比 + head3.put("name", pykhrwName + "_zb"); + head3.put("label", "占比"); + JSONObject head4 = new JSONObject(true); //折算分数 + head4.put("name", pykhrwName + "_zsfs"); + head4.put("label", "折算分数"); + btchildren.put(head3); + btchildren.put(head4); + } - //------------------------------------------------------------------------------------------ - JSONArray tabledata = JSONArray.parse(khrw.get(0).getTableData()); - alldatas.addAll(tabledata); + //---------------组合表格数据------------------------------------------------ + JSONArray tabledata = new JSONArray(khrw.get(0).getTableData()); + String pinyinKhrw = PinYinUtil.getPinyinInitials(khrwName); + for (Object tabledatum : tabledata) { + JSONObject obj = (JSONObject) tabledatum; + JSONObject erji = new JSONObject(true); + erji.put(pinyinKhrw, obj.get(pinyinKhrw)); + erji.put(pinyinKhrw + "_df", obj.get(pinyinKhrw + "_df")); + if (zb != null) { //代表当前引用考核任务有占比 + BigDecimal zsfs = zb.multiply((BigDecimal) obj.get(pinyinKhrw + "_df")); + erji.put(pinyinKhrw + "_zb", zb); + erji.put(pinyinKhrw + "_zsfs", zsfs); + if (z_zb != null) {//代表上一级标题有占比 + JSONObject khdx = new JSONObject(); + khdx.put("khdx", obj.get("khdx"));//存储当前考核对象名称 + khdx.put(pyTitle + "_df", zsfs);//存储当前考核对象最后折算分数 + title_df.put(khdx); + } + } else { + if (z_zb != null) {//代表上一级标题有占比 + title_df.put(obj.getJSONObject("khdx"));// + JSONObject khdx = new JSONObject(); + khdx.put("khdx", obj.get("khdx"));//存储当前考核对象名称 + khdx.put(pyTitle + "_df", obj.get(pinyinKhrw + "_df"));///存储当前考核对象最后折算分数 + title_df.put(khdx); + } + } + obj.remove(pinyinKhrw);//删除原来的数据项 + obj.remove(pinyinKhrw + "_df");//删除原来的得分 + obj.put(pyTitle, erji); + tabledatum = obj; + } + alldatas.putAll(tabledata); + } } } - btTitle.put("children",btchildren); + + + btTitle.put("children", btchildren); result.put("head", btTitle); result.put("data", bd); + result.put("alldatas", alldatas); result.put("btKhdx", btKhdx); + result.put("title_df", title_df); return result; } - /*{ - "title": "教学单位领导班子考核总分", - "data": [ - { - "type": "0", - "title": "二级单位目标管理与绩效考核成绩", - "data": [ - { - "type": 1, - "title": "党建与行政目标任务", - "id": 1, - "zb": 0.1 - }, - { - "type": "1", - "title": "事业发展", - "id": 4, - "zb": 0.9 - } - ] - }, - { - "type": "1", - "title": "民主测评", - "id": 2, - "zb": 0.3 - }, - { - "type": "1", - "title": "创新", - "id": 5 - } - ] -}*/ - +/* + {"title":"教学单位领导班子考核总分","data":[{"zb":0.9,"type":"0","title":"二级单位目标管理与绩效考核成绩","data":[{"type":"1","title":"党建与行政目标任务","id":1,"zb":0.1},{"type":"1","title":"事业发展","id":6,"zb":0.9}]},{"type":"1","title":"民主测评","id":2,"zb":0.3},{"type":"2","title":"创新","id":7}]} +*/ /** * 查询生成汇总列表 diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java index 7c0f908..623c28c 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhKhrwResultController.java @@ -184,7 +184,7 @@ public class KhKhrwResultController extends BaseController { } pcdata.put("khdx", key); pcdata.put(pyPCtitle, votesDatas); - pcdata.put("df", sumScore); + pcdata.put(pyPCtitle+"_df", sumScore); endData.add(pcdata); if (index1 == 1) { @@ -194,7 +194,7 @@ public class KhKhrwResultController extends BaseController { children.add(tableColumn2); JSONObject tableColumn3 = new JSONObject(); - tableColumn3.put("name", "df"); + tableColumn3.put("name", pyPCtitle+"_df"); tableColumn3.put("label", "得分"); children.add(tableColumn3); //headerData.put("children", children); diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java index 1eefc81..f0fbe61 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java @@ -159,8 +159,10 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { optionB.multiply(b).add(optionC.multiply(c).add(optionD.multiply(d))) ).divide(voteEmp.getVoteNum()); voteEmp.setAvgScore(avgScore);//投票后计算平均分 - if (voteEmp.getPercentage() != null) { //计算最后得分 - voteEmp.setEndScore(avgScore.multiply(voteEmp.getPercentage())); + if (oldvoteEmp.getPercentage() != null) { //计算最后得分 + voteEmp.setEndScore(avgScore.multiply(oldvoteEmp.getPercentage())); + }else{ + voteEmp.setEndScore(avgScore); } } else if (typeid.equals(2L)) {//占比评分 BigDecimal sumScore = voteEmp.getScore().add(oldvoteEmp.getVoteScore()); diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java new file mode 100644 index 0000000..829506d --- /dev/null +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java @@ -0,0 +1,94 @@ +package com.ruoyi.kaohe.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.math.BigDecimal; +import java.util.*; + +public class JsonDeepMerge { + /** + * 深度合并json对象 + * @param target + * @param source + */ + private static void deepMerge(JSONObject target, JSONObject source) { + Iterator keys = source.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object sourceValue = source.get(key); + if (target.has(key)) { + Object targetValue = target.get(key); + if (sourceValue instanceof JSONObject && targetValue instanceof JSONObject) { + deepMerge((JSONObject) targetValue, (JSONObject) sourceValue); + } else if (!targetValue.equals(sourceValue)) { + target.put(key, sourceValue); + } + } else { + target.put(key, sourceValue); + } + } + } + + public static JSONArray mergeByKey(JSONArray array, String mergeKey) { + JSONArray result = new JSONArray(); + for (int i = 0; i < array.length(); i++) { + JSONObject current = array.getJSONObject(i); + String keyValue = current.getString(mergeKey); + boolean merged = false; + + for (int j = 0; j < result.length(); j++) { + JSONObject existing = result.getJSONObject(j); + if (existing.getString(mergeKey).equals(keyValue)) { + deepMerge(existing, current); + merged = true; + break; + } + } + + if (!merged) { + result.put(current); + } + } + return result; + } + public static void main(String[] args) { + String jsonStr = "[{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"ejdwmbglyjxkhcj\":{\"djyxzmbrw\":{\"khx1\":100,\"khx1_zb\":0.2,\"khx2\":0,\"khx2_zb\":0.1,\"khx3\":0,\"khx3_zb\":0.1,\"khx4\":0,\"khx4_zb\":0.1,\"khx5\":0,\"khx5_zb\":0.1,\"khx6\":0,\"khx6_zb\":0.1,\"khx7\":0,\"khx7_zb\":0.1,\"khx8\":0,\"khx8_zb\":0.1,\"khx9\":0,\"khx9_zb\":0.05,\"khx10\":97,\"khx10_zb\":0.1,\"khx11\":0,\"khx11_zb\":0.1},\"djyxzmbrw_df\":29.7,\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":2.97}}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"ejdwmbglyjxkhcj\":{\"syfz\":{\"khx1\":0,\"khx1_zb\":0.3,\"khx2\":0,\"khx2_zb\":0.3,\"khx3\":0,\"khx3_zb\":0.4},\"syfz_df\":0,\"syfz_zb\":0.9,\"syfz_zsfs\":0}}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"mzcp\":{\"khx1\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.3},\"khx2\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.3},\"khx3\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.4}},\"mzcp_df\":0,\"mzcp_zb\":0.3,\"mzcp_zsfs\":0}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"cx\":{\"khx1\":0},\"cx_df\":0}}]"; + JSONArray array = new JSONArray(jsonStr); + JSONArray merged = mergeByKey(array, "khdx"); + System.out.println(merged.toString(2)); + } + + public static String jsonGroupSum(JSONArray jsonInput,String groupKey,String sumKey) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + // 解析JSON数组为List + List> inputList = mapper.readValue(jsonInput.toString(2), List.class); + + // 使用Map按khdx分组并累加值 + Map sumMap = new HashMap<>(); + for (Map item : inputList) { + String khdx = (String) item.get(groupKey); + BigDecimal value=BigDecimal.ZERO; + if(item.get(sumKey)!=null){ //非空判断 + value = new BigDecimal(item.get(sumKey).toString()); + } + sumMap.merge(khdx, value, BigDecimal::add); + } + + // 转换为目标结构List + List> result = new ArrayList<>(); + sumMap.forEach((khdx, sum) -> { + Map entry = new HashMap<>(); + entry.put(groupKey, khdx); + entry.put(sumKey, sum); + result.add(entry); + }); + + // 输出结果JSON + String jsonOutput = mapper.writeValueAsString(result); + // System.out.println(jsonOutput); + return jsonOutput; + } +}