Merge remote-tracking branch 'origin/main'

main
wanglei 5 months ago
commit a61f54f681

@ -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:
# 从数据源开关/默认关闭

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

@ -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<String, Object> nodes = parseJson(datas, hz_name);
JSONObject btKhdx = (JSONObject)nodes.get("btKhdx");
Map<String, Object> 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<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) throws JsonProcessingException {
Map<String, Object> 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<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);
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<String, Object> childmap = parseJson(data2,title);
JSONObject head= (JSONObject)childmap.get("head");
btchildren.add(head);
//递归获取下一级数据
Map<String, Object> 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;
//循环改变内部层级关系
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);
} else if (type.equals("1")) { //引用占比考核任务
} else { //引用考核任务
Long pcId = jobj.getLong("id");
BigDecimal zb = jobj.getBigDecimal("zb");
String khrwName = jobj.getString("title");
String pykhrwName = PinYinUtil.getPinyinInitials(khrwName);
KhKhrwResult khrwResult = new KhKhrwResult();
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 = JSONArray.parse(khrw.get(0).getTableData());
alldatas.addAll(tabledata);
} else { //引用不占比考核任务
Long pcId = jobj.getLong("id");
KhKhrwResult khrwResult = new KhKhrwResult();
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);
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;
}
btTitle.put("children",btchildren);
alldatas.putAll(tabledata);
}
}
}
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}]}
*/
/**
*

@ -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);

@ -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());

@ -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<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));
}
public static String jsonGroupSum(JSONArray jsonInput,String groupKey,String sumKey) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
// 解析JSON数组为List<Map>
List<Map<String, Object>> inputList = mapper.readValue(jsonInput.toString(2), List.class);
// 使用Map按khdx分组并累加值
Map<String, BigDecimal> sumMap = new HashMap<>();
for (Map<String, Object> 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<Map>
List<Map<String, Object>> result = new ArrayList<>();
sumMap.forEach((khdx, sum) -> {
Map<String, Object> 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;
}
}
Loading…
Cancel
Save