This commit is contained in:
2026-01-30 10:48:06 +08:00
parent 8bcf6e500e
commit 54d5c69892
14 changed files with 109 additions and 27 deletions
@@ -1,5 +1,6 @@
package com.budwk.app.flow.handler;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.core.Execution;
@@ -24,6 +25,10 @@ public class FlowUnitManagerHandler implements AssignmentHandler {
@Override
public List<String> assign(TaskModel model, Execution execution) {
String unitId = SecurityUtil.getUnitId();
String argsUnitId = execution.getArgs().getStr("argsUnitId");
if (StrUtil.isNotBlank(argsUnitId)){
unitId = argsUnitId;
}
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
Sys_role role = sysRoleService.getByCode(RoleConstant.UNIT_MANAGER);
@@ -42,7 +47,7 @@ public class FlowUnitManagerHandler implements AssignmentHandler {
@Override
public String getMessage() {
return "获取当前登录用户所在单位负责人";
return "获取当前登录用户所在单位负责人(如果argsUnitId存在则查询argsUnitId单位的单位负责人)";
}
public int getOrder() {
@@ -140,7 +140,7 @@ public class ExecutiveCommitteePushController {
ExecutiveCommitteeConfig config = dao.fetch(ExecutiveCommitteeConfig.class,
Cnd.where("teacherMeetId", "=", teacherMeetId));
/* if (ObjectUtil.isEmpty(config)) {
if (ObjectUtil.isEmpty(config)) {
return Result.error("请先配置基础信息");
}
if (config.getFirstStartTime().getTime() > System.currentTimeMillis()) {
@@ -148,7 +148,7 @@ public class ExecutiveCommitteePushController {
}
if (config.getFirstEndTime().getTime() < System.currentTimeMillis()) {
return Result.error("一次预选已结束");
}*/
}
int dbCount = dao.count(ExecutiveCommitteeOnePush.class,
Cnd.where("teacherMeetId", "=", teacherMeetId)
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller.material;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
@@ -76,7 +77,8 @@ public class GrassrootsCongressMaterialApprovalController {
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "zlsh");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller.meeting;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
@@ -76,7 +77,8 @@ public class GrassrootsCongressMeetingApprovalController {
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "8384aafd-3cdb-49ab-a11f-c5d145b1672c");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
@@ -66,6 +66,7 @@ public class ProposalSecondedController {
Sql sql = Sqls.create("""
SELECT
us.unionName,
us.unitId,
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
@@ -60,7 +60,7 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
}
// 获取负责人
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.UNIT_MANAGER);
List<Sys_user_role> sysUserRoles = dao.query(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sysRole.getId()).and(Sys_user_role::getUnderTakeId, "=", undertake.getId()));
List<String> selectUserIds = sysUserRoles.stream().map(Sys_user_role::getUserId).toList();
@@ -177,6 +177,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
info.code,
info.brief,
info.measures,
info.researchFindings,
info.createUserName,
DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime,
info.unitName,
@@ -199,6 +200,8 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
//处理下富文本
String brief = docData.getString("brief");
String measures = docData.getString("measures");
String researchFindings = docData.getString("researchFindings");
docData.put("researchFindings", sysOfficeTemplateUtil.convertRichTextToDocText(researchFindings));
docData.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
docData.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures));
@@ -218,8 +221,27 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
// 按任务节点分组
Map<String, List<ProcessTaskVO>> taskGroups = doneTaskVos.stream().collect(Collectors.groupingBy(ProcessTaskVO::getDisplayName));
docData.putAll(taskGroups);
Optional<List<ProcessTaskVO>> optionalList = taskGroups.entrySet().stream()
.filter(entry -> entry.getKey().contains("党委书记审核"))
.map(Map.Entry::getValue)
.findFirst();
if (optionalList.isPresent()) {
List<ProcessTaskVO> tasks = optionalList.get();
docData.put("auditName","党委书记审核");
taskGroups.put("auditInfo",tasks);
}else{
Optional<List<ProcessTaskVO>> optionalList2 = taskGroups.entrySet().stream()
.filter(entry -> entry.getKey().contains("单位负责人审核"))
.map(Map.Entry::getValue)
.findFirst();
List<ProcessTaskVO> tasks = optionalList2.get();
docData.put("auditName","单位负责人审核");
taskGroups.put("auditInfo",tasks);
}
docData.putAll(taskGroups);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
@@ -227,6 +249,7 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
Configure config = Configure.builder()
.bind("seconders", policy)
.bind("提案附议", policy)
.bind("researchFindings", htmlRenderPolicy)
.bind("brief", htmlRenderPolicy)
.bind("measures", htmlRenderPolicy)
.bind("taskFormData.tf_opinion", htmlRenderPolicy)
@@ -41,10 +41,7 @@ import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -193,8 +190,18 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
// 添加序号,去除富文本,获取附议人
for (int i = 0; i < list.size(); i++) {
list.get(i).put("index", i + 1);
list.get(i).put("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")));
list.get(i).put("measures", HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")));
if (StrUtil.isNotBlank(list.get(i).getString("researchFindings"))) {
list.get(i).put("researchFindings",
HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("researchFindings")))
.replaceAll("\\s+", " ")
.trim());
}
list.get(i).put("brief", HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")))
.replaceAll("\\s+", " ")
.trim());
list.get(i).put("measures", HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")))
.replaceAll("\\s+", " ")
.trim());
list.get(i).put("suggestUnits", list.get(i).getString("suggestUnits").replace("[", "").replace("]", ""));
@@ -211,11 +218,16 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
if (StrUtil.isNotBlank(variable.getString("variable"))) {
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
}
}
}
List<Map<String, Object>> safeList = list.stream().map(nutMap -> {
Map<String, Object> map = new HashMap<>(nutMap);
return map;
}).collect(Collectors.toList());
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("序号", "index", 10));
exportEntities.add(new ExcelExportEntity("提案编号", "code", 20));
@@ -235,7 +247,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
exportParams.setTitle(title);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, safeList);
CommonDownloadUtil.download(title + ".xlsx", workbook, response);
}
@@ -250,7 +262,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
List<NutMap> list = listMap(sql);
for (NutMap row : list) {
String content = HtmlUtil.cleanHtmlTag(StrUtil.blankToDefault(row.getString("masterUnderTakeReply"), ""));
String content = HtmlUtil.removeHtmlTag(StrUtil.blankToDefault(row.getString("masterUnderTakeReply"), ""));
row.put("masterUnderTakeReply", content);
}
@@ -421,6 +433,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
NutMap info = (NutMap) sql.getResult();
// 处理富文本内容
info.put("researchFindings", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("researchFindings")));
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief")));
info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("measures")));
@@ -478,6 +491,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
.bind("seconders", policy)
.bind("brief", htmlRenderPolicy)
.bind("measures", htmlRenderPolicy)
.bind("researchFindings", htmlRenderPolicy)
.build();
try {
@@ -541,6 +555,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
info.name,
info.code,
info.researchFindings,
info.suggestUnits,
info.brief,
info.measures,
info.createUserName,
@@ -573,8 +588,18 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
// 添加序号,去除富文本,获取附议人
for (int i = 0; i < list.size(); i++) {
list.get(i).put("index", i + 1);
list.get(i).put("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")));
list.get(i).put("measures", HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")));
if (StrUtil.isNotBlank(list.get(i).getString("researchFindings"))) {
list.get(i).put("researchFindings", HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("researchFindings")))
.replaceAll("\\s+", " ")
.trim());
}
list.get(i).put("brief", HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")))
.replaceAll("\\s+", " ")
.trim());
list.get(i).put("measures", HtmlUtil.unescape(HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")))
.replaceAll("\\s+", " ")
.trim());
list.get(i).put("suggestUnits", list.get(i).getString("suggestUnits").replace("[", "").replace("]", ""));
// 流程实例
// ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id")));
@@ -610,6 +635,11 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
row.put("instanceState", processInstanceStateMap.get(row.getString("instanceState")));
}
List<Map<String, Object>> safeList = list.stream().map(nutMap -> {
Map<String, Object> map = new HashMap<>(nutMap);
return map;
}).collect(Collectors.toList());
List<ExcelExportEntity> exportEntities = new ArrayList<>();
for (ExportTableColumns column : tableColumns) {
@@ -622,7 +652,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
exportParams.setTitle(title);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, safeList);
CommonDownloadUtil.download(title + ".xlsx", workbook, response);
}
}
@@ -33,6 +33,7 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -40,6 +41,7 @@ import org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@@ -285,6 +287,9 @@ public class TeacherCongressDelegationController {
}
if (type.equals("TEACHER_CONGRESS_VICE_DELEGATION_HEAD")){
List<Record> recordList = dao.query("sys_user_role", Cnd.where("tcSessionId", "=", sessionId).and("tcDelegationId", "=", delegationId).and("roleId", "=", role.getId()));
if (Lang.isEmpty(recordList)) {
return Result.success(new ArrayList<>());
}
List<String> userIdList = recordList.stream().map(record -> record.getString("userId")).toList();
String userIds = userIdList.stream()
.map(s -> "'" + s + "'") // 给每个元素加上单引号
@@ -307,7 +312,9 @@ public class TeacherCongressDelegationController {
}else{
Record record = dao.fetch("sys_user_role", Cnd.where("tcSessionId", "=", sessionId).and("tcDelegationId", "=", delegationId).and("roleId", "=", role.getId()));
String userId = Optional.ofNullable(record).map(r -> r.getString("userId")).orElse(null);
if (Lang.isEmpty(userId)) {
return Result.success(new NutMap());
}
Sql sql = Sqls.create("""
SELECT
u.id as userId,
@@ -338,7 +345,7 @@ public class TeacherCongressDelegationController {
* @param delegationId 代表团ID
* @param sessionId 届次ID
* @param userId 团长id
* @param viceUserId 副团长id
* @param viceUserIds 副团长id
* @param contactUserId 联络人
* @return
*/
@@ -1965,7 +1965,7 @@ layout("/layouts/v4/baseLayout.html"){
<div class="oa-notice-header-icon">
<i class="fa fa-users"></i>
</div>
<h2 class="oa-notice-header-title">基层动态</h2>
<h2 class="oa-notice-header-title">工会动态</h2>
</div>
</div>
<div class="oa-grassroots-content">
@@ -1988,8 +1988,8 @@ layout("/layouts/v4/baseLayout.html"){
<div class="oa-empty-state-icon">
<i class="fa fa-users"></i>
</div>
<div class="oa-empty-state-title">暂无基层动态</div>
<div class="oa-empty-state-desc">当前没有可用的基层动态内容</div>
<div class="oa-empty-state-title">暂无工会动态</div>
<div class="oa-empty-state-desc">当前没有可用的工会动态内容</div>
</div>
</div>
</div>
@@ -3,7 +3,7 @@ const jcdt = {
<div class="jcdt-wrapper">
<div class="jcdt-container">
<div class="jcdt-title">
<span>基层动态</span>
<span>工会动态</span>
</div>
<div class="jcdt-content">
<div class="jcdt-list">
@@ -148,6 +148,15 @@ layout("/layouts/platform.html"){
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template v-else-if="column.prop === 'researchFindings'" scope="{row}">
<span v-html="row.researchFindings"></span>
</template>
<template v-else-if="column.prop === 'brief'" scope="{row}">
<span v-html="row.brief"></span>
</template>
<template v-else-if="column.prop === 'measures'" scope="{row}">
<span v-html="row.measures"></span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" min-width="200px">
<template scope="{row}">
@@ -201,6 +210,7 @@ layout("/layouts/platform.html"){
{label: "立案结果", prop: "caseFilingResult"},
// {label: "立案类型", prop: "caseFilingType"},
{label: "是否并案", prop: "merge"},
{label: "调研情况", prop: "researchFindings", visible: false},
{label: "案由", prop: "brief", visible: false},
{label: "建议措施", prop: "measures", visible: false},
{label: "主办单位", prop: "masterUnitName"},
@@ -139,6 +139,7 @@ layout("/layouts/platform.html"){
processTaskId: row.taskId,
taskName: row.curTaskName,
type: type,
argsUnitId: row.unitId,
tf_opinion: "同意该提案"
}
this.$refs.proposalInfoRef.onOpen(row)
@@ -143,6 +143,7 @@ layout("/layouts/platform_h5.html"){
processTaskId: row.taskId,
taskName: row.curTaskName,
type: type,
argsUnitId: row.unitId,
tf_opinion: "同意该提案"
}
},