..
This commit is contained in:
+124
@@ -0,0 +1,124 @@
|
||||
package com.budwk.app.zhgh.democratic.proposal.controller.query;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.base.utils.TextSimilarityUtil;
|
||||
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.Sqls;
|
||||
import org.nutz.dao.sql.Sql;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@IocBean
|
||||
@At("/platform/proposal/query/plagiarismCheck")
|
||||
@Api(tags = "提案查重")
|
||||
@Ok("json:full")
|
||||
public class ProposalPlagiarismCheckController {
|
||||
|
||||
@Inject
|
||||
private ProposalCommonService proposalCommonService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/zhgh/democratic/proposal/query/plagiarismCheck/index.html")
|
||||
@SaCheckPermission("proposal.query.plagiarismCheck")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询
|
||||
*
|
||||
* @param keywords 关键字
|
||||
* @param sessionId 会话id
|
||||
* @param similarityThreshold 相似度阈值
|
||||
* @param typeId 类型id
|
||||
* @return
|
||||
*/
|
||||
@At
|
||||
@SaCheckPermission("proposal.query.plagiarismCheck")
|
||||
@ApiOperation(value = "查询")
|
||||
public Result query(String keywords, String sessionId, Integer similarityThreshold, @Param("matchScope") String[] matchScope, String typeId) {
|
||||
// 1. 获取所有提案数据
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
info.*,
|
||||
COUNT(p.consolidationIds) > 0 AS isConsolidation,
|
||||
type.NAME AS typeName,
|
||||
tcs.fullName AS sessionName,
|
||||
tcd.`name` AS delegationName,
|
||||
ins.id AS instanceId,
|
||||
ins.businessNo,
|
||||
ins.state instanceState,
|
||||
ins.variable instanceVariable,
|
||||
ins.processDefineId instanceProcessDefineId,
|
||||
t.displayName curTaskName,
|
||||
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
|
||||
caseTasks.variable ->> '$.tf_helpUnitNameStr' AS slaveUnitNames
|
||||
FROM
|
||||
proposal_info info
|
||||
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
|
||||
LEFT JOIN proposal_type type ON type.id = info.typeId
|
||||
LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId
|
||||
LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId
|
||||
LEFT JOIN teacher_congress_delegate tcde ON tcde.loginName = info.createUserLoginName
|
||||
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
|
||||
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id
|
||||
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id
|
||||
AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b'
|
||||
AND caseTasks.taskState = 20
|
||||
AND caseTasks.finishTime = latestTasks.finishTime
|
||||
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id
|
||||
AND t.taskState = 10
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.andEX("info.sessionId", "=", sessionId);
|
||||
cnd.andEX("info.typeId", "=", typeId);
|
||||
cnd.groupBy("info.id");
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> list = proposalCommonService.listMap(sql);
|
||||
|
||||
// 2. 进行查重分析
|
||||
List<NutMap> plagiarismResults = new ArrayList<>();
|
||||
|
||||
for (NutMap proposal : list) {
|
||||
// 计算相似度
|
||||
double similarity = TextSimilarityUtil.calculateProposalSimilarity(proposal, keywords, matchScope);
|
||||
System.out.println(similarity);
|
||||
|
||||
// 只返回相似度大于阈值的结果
|
||||
if (similarity >= similarityThreshold) {
|
||||
// 构建查重结果
|
||||
NutMap result = new NutMap();
|
||||
result.put("id", proposal.getString("id"));
|
||||
result.put("title", proposal.getString("name")); // 提案标题
|
||||
result.put("sessionName", proposal.getString("sessionName"));
|
||||
result.put("typeName", proposal.getString("typeName"));
|
||||
result.put("createUserName", proposal.getString("createUserName"));
|
||||
result.put("createTime", proposal.getString("createTime"));
|
||||
result.put("similarity", Math.round(similarity)); // 相似度百分比
|
||||
result.put("similarContent", TextSimilarityUtil.extractSimilarContent(proposal, keywords));
|
||||
result.put("delegationName", proposal.getString("delegationName"));
|
||||
result.put("unitName", proposal.getString("unitName"));
|
||||
|
||||
plagiarismResults.add(result);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 按相似度降序排序
|
||||
plagiarismResults.sort((a, b) -> Integer.compare(b.getInt("similarity"), a.getInt("similarity")));
|
||||
|
||||
return Result.success(plagiarismResults);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
package com.budwk.app.zhgh.democratic.proposal.controller.query;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.flow.entity.ProcessInstance;
|
||||
import com.budwk.app.flow.entity.ProcessTask;
|
||||
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
|
||||
import com.budwk.app.sys.models.Sys_dict;
|
||||
import com.budwk.app.sys.services.SysDictService;
|
||||
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
|
||||
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.Dao;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.json.Json;
|
||||
import org.nutz.lang.util.NutMap;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@IocBean
|
||||
@At("/platform/proposal/query/underTake/satisfaction")
|
||||
@Ok("json:full")
|
||||
@Api(tags = "提案承办单位满意度")
|
||||
public class ProposalUnderTakeSatisfactionController {
|
||||
|
||||
@Inject
|
||||
private Dao dao;
|
||||
@Inject
|
||||
private SysDictService sysDictService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/zhgh/democratic/proposal/query/underTakeSatisfaction/index.html")
|
||||
@SaCheckPermission("proposal.query.underTake.satisfaction")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
|
||||
@At
|
||||
@SaCheckPermission("proposal.query.underTake.satisfaction")
|
||||
public Result data(String sessionId){
|
||||
List<ProposalInfo> infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId));
|
||||
List<String> infoIds = infos.stream().map(v -> v.getId()).toList();
|
||||
List<ProcessInstance> instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds));
|
||||
List<Long> instIds = instances.stream().map(v -> v.getId()).toList();
|
||||
|
||||
// 立案任务记录
|
||||
List<ProcessTask> caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
|
||||
.and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
|
||||
.and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b"));
|
||||
|
||||
// 主办任务记录
|
||||
List<ProcessTask> masterUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
|
||||
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))
|
||||
.and(ProcessTask::getTaskName, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")));
|
||||
|
||||
// 协办任务记录
|
||||
List<ProcessTask> slaveUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
|
||||
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))
|
||||
.and(ProcessTask::getTaskName, "=", "c9a1586e-272b-41b8-b438-0be9f9e3781d"));
|
||||
|
||||
|
||||
// 所有承办单位任务记录
|
||||
List<ProcessTask> allUnitTasks = new ArrayList<>();
|
||||
allUnitTasks.addAll(masterUnitTasks);
|
||||
allUnitTasks.addAll(slaveUnitTasks);
|
||||
|
||||
|
||||
//该届次所有涉及到的承办单位
|
||||
List<String> underTakeIds = caseTasks.stream().map(v -> {
|
||||
NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
|
||||
String hostUnitId = variable.getString("tf_hostUnitId");
|
||||
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(hostUnitId);
|
||||
list.addAll(helpUnitIds);
|
||||
return list;
|
||||
})
|
||||
.flatMap(List::stream)
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
|
||||
List<ProposalUndertake> undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds));
|
||||
Map<String, ProposalUndertake> undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v));
|
||||
|
||||
List<NutMap> tableData = new ArrayList<>();
|
||||
|
||||
// 反馈评分
|
||||
List<Sys_dict> proposalFeedback = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
|
||||
|
||||
for (String underTakeId : underTakeIds) {
|
||||
NutMap tableRow = NutMap.NEW();
|
||||
tableRow.put("id", underTakeId);
|
||||
if (undertakeMap.get(underTakeId) == null) {
|
||||
continue;
|
||||
}
|
||||
tableRow.put("name", undertakeMap.get(underTakeId).getName());
|
||||
|
||||
//找出承办提案总数
|
||||
long sum = caseTasks.stream()
|
||||
.filter(v -> {
|
||||
NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
|
||||
if (variable == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String hostUnitId = variable.getString("tf_hostUnitId");
|
||||
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
|
||||
|
||||
boolean isHost = underTakeId != null && underTakeId.equals(hostUnitId);
|
||||
boolean isHelper = helpUnitIds != null && helpUnitIds.contains(underTakeId);
|
||||
|
||||
return isHost || isHelper;
|
||||
})
|
||||
.map(ProcessTask::getProcessInstanceId)
|
||||
.distinct()
|
||||
.count();
|
||||
|
||||
// 主办提案数量
|
||||
long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count();
|
||||
|
||||
// 协办提案数量
|
||||
long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count();
|
||||
|
||||
// 满意
|
||||
// allUnitTasks
|
||||
|
||||
}
|
||||
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user