最总表表格数据组合

main
hshansha 5 months ago
parent e89e08d312
commit 5003eaadb2

@ -27,6 +27,11 @@
<artifactId>pinyin4j</artifactId> <artifactId>pinyin4j</artifactId>
<version>2.5.0</version> <version>2.5.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -2,16 +2,21 @@ package com.ruoyi.kaohe.controller;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson2.JSONArray; import com.ruoyi.common.core.domain.model.LoginUser;
import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.utils.LogUtils;
import com.ruoyi.kaohe.domain.KhKhrwResult; import com.ruoyi.kaohe.domain.KhKhrwResult;
import com.ruoyi.kaohe.domain.KhVoteEmp;
import com.ruoyi.kaohe.domain.KhgatherParam; import com.ruoyi.kaohe.domain.KhgatherParam;
import com.ruoyi.kaohe.service.IKhKhrwResultService; import com.ruoyi.kaohe.service.IKhKhrwResultService;
import com.ruoyi.kaohe.service.IKhVoteEmpService; import com.ruoyi.kaohe.service.IKhVoteEmpService;
import com.ruoyi.kaohe.service.IKhVoteService; import com.ruoyi.kaohe.service.IKhVoteService;
import com.ruoyi.kaohe.util.JsonDeepMerge;
import com.ruoyi.kaohe.util.PinYinUtil; import com.ruoyi.kaohe.util.PinYinUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -56,139 +61,180 @@ public class KhGatherController extends BaseController {
@PostMapping("/generateSum") @PostMapping("/generateSum")
public AjaxResult generateSum(@RequestBody String json) { public AjaxResult generateSum(@RequestBody String json) {
// 将String转换为JSONObject // 将String转换为JSONObject
JSONObject jsonObject = JSONObject.parseObject(json); JSONObject jsonObject = new JSONObject(json);
String hz_name = jsonObject.getString("title"); String hz_name = jsonObject.getString("title");
JSONArray datas = jsonObject.getJSONArray("data"); JSONArray datas = jsonObject.getJSONArray("data");
//拼接表头数据 //拼接表头数据
JSONArray header = new JSONArray();//存放表头及表格关联数据 JSONArray header = new JSONArray();//存放表头的最终数据
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
//循环主标题下的每一个子节点 //循环主标题下的每一个子节点
Map<String, Object> nodes = parseJson(datas, hz_name); Map<String, Object> nodes = parseJson(datas, hz_name,null);
JSONObject btKhdx = (JSONObject)nodes.get("btKhdx"); //获取并拼接表头
JSONObject btKhdx = (JSONObject) nodes.get("btKhdx");
JSONObject head = (JSONObject) nodes.get("head"); JSONObject head = (JSONObject) nodes.get("head");
JSONArray oldchildren = head.getJSONArray("children"); JSONArray oldchildren = head.getJSONArray("children");
JSONArray newChildren = new JSONArray(); JSONArray newChildren = new JSONArray();
newChildren.add(btKhdx); newChildren.put(btKhdx);
for (Object oldchild : oldchildren) { for (Object oldchild : oldchildren) {
newChildren.add(oldchild); newChildren.put(oldchild);
} }
head.put("children",newChildren); head.put("children", newChildren);
header.add(head); header.put(head);
return AjaxResult.success(header);
//获取并整合数据
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<String, Object> parseJson(JSONArray datas, String titleP) { * json
* @param datas
* @param titleP
* @param z_zb
* @return
*/
private Map<String, Object> parseJson(JSONArray datas, String titleP,BigDecimal z_zb) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
//父级表头 BigDecimal title_zsfs=BigDecimal.ZERO;
String pyTitle = PinYinUtil.getPinyinInitials(titleP);//父级表头
JSONObject btKhdx = new JSONObject(); JSONObject btKhdx = new JSONObject();
JSONObject btTitle = new JSONObject(); JSONObject btTitle = new JSONObject();
btTitle.put("name", PinYinUtil.getPinyinInitials(titleP)); btTitle.put("name", pyTitle);
btTitle.put("label", titleP); btTitle.put("label", titleP);
JSONArray btchildren = new JSONArray(); JSONArray btchildren = new JSONArray();
//--------------------------------------------------------------------- //---------------------------------------------------------------------
JSONArray bd = new JSONArray();//表数据拼接 JSONArray bd = new JSONArray();//表数据拼接
List<Object> 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); JSONObject jobj = (JSONObject) datas.get(i);
String type = jobj.getString("type"); String type = jobj.getString("type");
String title = jobj.getString("title"); 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")) { if (type.equals("0")) {
JSONArray data2 = jobj.getJSONArray("data"); JSONArray data2 = jobj.getJSONArray("data");
BigDecimal zb = jobj.getBigDecimal("zb"); //递归获取下一级数据
Map<String, Object> childmap = parseJson(data2,title); Map<String, Object> childmap = parseJson(data2, title,zb);
JSONObject head= (JSONObject)childmap.get("head"); JSONObject head = (JSONObject) childmap.get("head");
btchildren.add(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")) { //引用占比考核任务
}
alldatas.putAll(alldatas1);
} else { //引用考核任务
Long pcId = jobj.getLong("id"); Long pcId = jobj.getLong("id");
BigDecimal zb = jobj.getBigDecimal("zb");
String khrwName = jobj.getString("title");
String pykhrwName = PinYinUtil.getPinyinInitials(khrwName);
KhKhrwResult khrwResult = new KhKhrwResult(); KhKhrwResult khrwResult = new KhKhrwResult();
khrwResult.setPcId(pcId); khrwResult.setPcId(pcId);
//获取考核任务结果 //获取考核任务结果
List<KhKhrwResult> khrw = khKhrwResultService.selectKhKhrwResultList(khrwResult); List<KhKhrwResult> khrw = khKhrwResultService.selectKhKhrwResultList(khrwResult);
if(khrw!=null&&khrw.size()>0){ if (khrw != null && khrw.size() > 0) {
JSONArray tableHeader = JSONArray.parse(khrw.get(0).getTableHeader()); //----------组合表头数据---------
JSONObject head1 = new JSONObject(); JSONArray tableHeader = new JSONArray(khrw.get(0).getTableHeader());
JSONObject head2 = new JSONObject(); btKhdx = tableHeader.getJSONObject(0);//下标0 单位/姓名
btKhdx=tableHeader.getJSONObject(0);//下标0 单位/姓名 JSONObject head1 = tableHeader.getJSONObject(1); //整体数据
head1=tableHeader.getJSONObject(1); //整体数据 JSONObject head2 = tableHeader.getJSONObject(2);//得分
head2=tableHeader.getJSONObject(2);//得分 btchildren.put(head1);
btchildren.add(head1); btchildren.put(head2);
btchildren.add(head2); if (zb != null) { //当考核任务不占比时
} JSONObject head3 = new JSONObject(); //占比
head3.put("name", pykhrwName + "_zb");
//------------------------------------------------------------------------------------------ head3.put("label", "占比");
JSONArray tabledata = JSONArray.parse(khrw.get(0).getTableData()); JSONObject head4 = new JSONObject(); //折算分数
alldatas.addAll(tabledata); head4.put("name", pykhrwName + "_zsfs");
} else { //引用不占比考核任务 head4.put("label", "折算分数");
Long pcId = jobj.getLong("id"); btchildren.put(head3);
KhKhrwResult khrwResult = new KhKhrwResult(); btchildren.put(head4);
khrwResult.setPcId(pcId);
List<KhKhrwResult> 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);
} }
//---------------组合表格数据------------------------------------------------
//------------------------------------------------------------------------------------------ JSONArray tabledata = new JSONArray(khrw.get(0).getTableData());
JSONArray tabledata = JSONArray.parse(khrw.get(0).getTableData()); String pinyinKhrw = PinYinUtil.getPinyinInitials(khrwName);
alldatas.addAll(tabledata); 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;
} }
btTitle.put("children",btchildren); alldatas.putAll(tabledata);
}
}
}
btTitle.put("children", btchildren);
result.put("head", btTitle); result.put("head", btTitle);
result.put("data", bd); result.put("data", bd);
result.put("alldatas", alldatas);
result.put("btKhdx", btKhdx); result.put("btKhdx", btKhdx);
return result; return result;
} }
/*{ /*
"title": "教学单位领导班子考核总分", {"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}]}
"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
}
]
}*/
/** /**
* *

@ -184,7 +184,7 @@ public class KhKhrwResultController extends BaseController {
} }
pcdata.put("khdx", key); pcdata.put("khdx", key);
pcdata.put(pyPCtitle, votesDatas); pcdata.put(pyPCtitle, votesDatas);
pcdata.put("df", sumScore); pcdata.put(pyPCtitle+"_df", sumScore);
endData.add(pcdata); endData.add(pcdata);
if (index1 == 1) { if (index1 == 1) {
@ -194,7 +194,7 @@ public class KhKhrwResultController extends BaseController {
children.add(tableColumn2); children.add(tableColumn2);
JSONObject tableColumn3 = new JSONObject(); JSONObject tableColumn3 = new JSONObject();
tableColumn3.put("name", "df"); tableColumn3.put("name", pyPCtitle+"_df");
tableColumn3.put("label", "得分"); tableColumn3.put("label", "得分");
children.add(tableColumn3); children.add(tableColumn3);
//headerData.put("children", children); //headerData.put("children", children);

@ -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<String> 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));
}
}
Loading…
Cancel
Save