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..a998500 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 @@ -2,16 +2,21 @@ package com.ruoyi.kaohe.controller; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; -import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.LogUtils; import com.ruoyi.kaohe.domain.KhKhrwResult; +import com.ruoyi.kaohe.domain.KhVoteEmp; 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; @@ -56,139 +61,180 @@ public class KhGatherController extends BaseController { @PostMapping("/generateSum") public AjaxResult generateSum(@RequestBody String json) { // 将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")); + //根据被考核对象名分组数据到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) { Map result = new HashMap<>(); - //父级表头 + BigDecimal title_zsfs=BigDecimal.ZERO; + String pyTitle = PinYinUtil.getPinyinInitials(titleP);//父级表头 JSONObject btKhdx = new JSONObject(); JSONObject btTitle = new JSONObject(); - btTitle.put("name", PinYinUtil.getPinyinInitials(titleP)); + 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(); + defen.put("name", erjiPyTitle + "_df"); + defen.put("label", "得分"); + JSONObject zb1 = new JSONObject(); + zb1.put("name", erjiPyTitle + "_zb"); + zb1.put("label", "占比"); + JSONObject zsfs = new JSONObject(); + 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"); + //循环改变内部层级关系 + for (Object tabledatum : alldatas1) { + JSONObject obj = (JSONObject) tabledatum; + JSONObject yiji = new JSONObject(); + yiji.put(erjiPyTitle, obj.get(erjiPyTitle)); + + + + + yiji.put(erjiPyTitle + "_df", title_zsfs); + if (z_zb != null) { //如果传递过来的标题占比不为null + BigDecimal erjizsfs = z_zb.multiply(title_zsfs); + yiji.put(erjiPyTitle + "_zb", z_zb); + yiji.put(erjiPyTitle + "_zsfs", erjizsfs); + } + + + + + obj.remove(erjiPyTitle);//删除原来的数据项 + obj.put(pyTitle, yiji); + tabledatum = obj; + + + - } 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); } + 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(); //占比 + head3.put("name", pykhrwName + "_zb"); + head3.put("label", "占比"); + JSONObject head4 = new JSONObject(); //折算分数 + head4.put("name", pykhrwName + "_zsfs"); + head4.put("label", "折算分数"); + btchildren.put(head3); + btchildren.put(head4); + } + //---------------组合表格数据------------------------------------------------ + 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(); + 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); + } + obj.remove(pinyinKhrw);//删除原来的数据项 + obj.remove(pinyinKhrw + "_df");//删除原来的得分 + obj.put(pyTitle, erji); + tabledatum = obj; + } + alldatas.putAll(tabledata); } - - //------------------------------------------------------------------------------------------ - JSONArray tabledata = JSONArray.parse(khrw.get(0).getTableData()); - alldatas.addAll(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); 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/util/JsonDeepMerge.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java new file mode 100644 index 0000000..b30bc68 --- /dev/null +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/util/JsonDeepMerge.java @@ -0,0 +1,60 @@ +package com.ruoyi.kaohe.util; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.Iterator; + +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)); + } +}