This commit is contained in:
=
2026-08-21 13:53:38 +08:00
parent ed714a62a6
commit a2b5517469
23 changed files with 230 additions and 50 deletions
@@ -19,6 +19,9 @@ RoleConstant {
SCHOOL_UNION_ADMIN("校工会管理员"),
SCHOOL_UNION_CHAIRMAN("校工会主席"),
SCHOOL_UNION_VICE_CHAIRMAN("校工会副主席"),
SCHOOL_UNION_TREASURE("校工会财务委员"),
SCHOOL_UNION_CASHIER("校工会出纳"),
SCHOOL_UNION_ACCOUNTANT("校工会会计"),
SCHOOL_UNION_WELFARE_ADMIN("校工会福利管理员"),
SCHOOL_UNION_MEMBER_ADMIN("校工会会员管理员"),
SCHOOL_UNION_TC_ADMIN("校工会教代会管理员"),
@@ -29,6 +29,6 @@ public class FlowAssignUserHandler implements AssignmentHandler {
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 100;
}
}
@@ -50,6 +50,6 @@ public class FlowClubPresidentByArgsAssignmentHandler implements AssignmentHandl
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 510;
}
}
@@ -42,7 +42,7 @@ public class FlowFghzxAssignmentHandler implements AssignmentHandler {
@Override
public int getOrder() {
return 10;
return 400;
}
}
@@ -62,6 +62,6 @@ public class FlowGeneralDelegationByArgsAssignmentHandler implements AssignmentH
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 210;
}
}
@@ -56,6 +56,6 @@ public class FlowQualificationReviewGroupByArgsAssignmentHandler implements Assi
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 200;
}
}
@@ -47,6 +47,6 @@ public class FlowSchoolUnionAdminByArgsAssignmentHandler implements AssignmentHa
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 300;
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.flow.handler;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.engine.model.TaskModel;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import java.util.List;
/**
* 获取校工会财务委员角色下的用户,供流程设计器配置任务参与者。
*/
public class FlowSchoolUnionTreasureHandler implements AssignmentHandler {
/**
* 根据校工会财务委员角色查询流程任务参与者。
*
* @param model 流程任务模型
* @param execution 当前流程执行对象
* @return 校工会财务委员的用户 ID 列表
*/
@Override
public List<String> assign(TaskModel model, Execution execution) {
Dao dao = ServiceContext.find(Dao.class);
Sql sql = Sqls.create("""
SELECT
userRole.userId
FROM
`sys_user_role` userRole
LEFT JOIN sys_role role ON role.id = userRole.roleId
WHERE
role.`code` = @roleCode
GROUP BY
userRole.userId
""").setParam("roleCode", RoleConstant.SCHOOL_UNION_TREASURE.name());
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
return sql.getList(String.class);
}
/**
* 返回流程设计器参与者处理类下拉框的显示名称。
*
* @return 下拉框显示名称
*/
@Override
public String getMessage() {
return "获取校工会财务委员";
}
/**
* 使用参与者处理类的默认排序值。
*
* @return 默认排序值
*/
@Override
public int getOrder() {
return 330;
}
}
@@ -45,6 +45,6 @@ public class FlowSchoolUnionViceChairmanHandler implements AssignmentHandler {
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 320;
}
}
@@ -46,6 +46,6 @@ public class FlowUnionGroupLeadersByArgsAssignmentHandler implements AssignmentH
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 410;
}
}
@@ -64,6 +64,6 @@ public class FlowUnitPartySecretaryHandler implements AssignmentHandler {
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
return 220;
}
}
@@ -34,7 +34,10 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
/**
@@ -187,4 +190,20 @@ public class ClubRegistApplyController {
String s = String.format("%02d", count + 1);
return Result.success().addData(Convert.toStr(DateUtil.thisYear()) + s);
}
@At
@Ok("void")
@ApiOperation("下载协会申请成立报告模板")
@SaCheckPermission("club.register.apply")
public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
sysClubService.downloadApplyTemplate(request, response);
}
@At
@Ok("void")
@ApiOperation("下载协会章程草案模板")
@SaCheckPermission("club.register.apply")
public void downloadRulesTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
sysClubService.downloadRulesTemplate(request, response);
}
}
@@ -12,7 +12,10 @@ import io.swagger.models.auth.In;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
/**
@@ -35,6 +38,24 @@ public interface SysClubService extends BaseService<SysClub> {
SysClub doEdit(SysClub club, List<String> deleteIds, List<NutMap> managePerson);
/**
* 下载协会申请成立报告模板。
*
* @param request HTTP 请求,用于复用系统文件下载处理
* @param response HTTP 响应,用于输出模板文件
* @throws IOException 模板文件读取或输出失败
*/
void downloadApplyTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException;
/**
* 下载协会章程草案模板。
*
* @param request HTTP 请求,用于复用系统文件下载处理
* @param response HTTP 响应,用于输出模板文件
* @throws IOException 模板文件读取或输出失败
*/
void downloadRulesTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException;
Pagination<ClubRegisterPageVo> minePageData(@Valid ClubUserPageForm pageForm);
Pagination<ClubRegisterPageVo> schoolLeaderAuditPageData(@Valid ClubUserPageForm pageForm);
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
@@ -18,6 +19,8 @@ import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.models.Sys_office_template;
import com.budwk.app.sys.services.SysFileService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
@@ -38,6 +41,9 @@ import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -61,6 +67,8 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
private CommonService commonService;
@Inject
private BpmService bpmService;
@Inject
private SysFileService sysFileService;
@Override
public Pagination<ClubCommonPageVo> getAllClubWithPage(PageForm pageForm, Cnd cnd) {
@@ -108,6 +116,44 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
return clubRegisterVo;
}
@Override
public void downloadApplyTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
downloadClubTemplate("club_apply", "协会申请成立报告模板", request, response);
}
@Override
public void downloadRulesTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
downloadClubTemplate("club_rules", "协会章程草案模板", request, response);
}
/**
* 按固定模板代码下载协会模板,模板代码仅由服务内部指定,避免下载其他业务模板。
*/
private void downloadClubTemplate(String templateCode, String templateName,
HttpServletRequest request, HttpServletResponse response) throws IOException {
Sys_office_template officeTemplate = dao().fetch(Sys_office_template.class,
Cnd.where(Sys_office_template::getTemplateCode, "=", templateCode));
if (ObjectUtil.isNull(officeTemplate) || StrUtil.isBlank(officeTemplate.getTemplatePath())) {
throw new BaseException("{}不存在", templateName);
}
// 模板路径由系统文件上传接口生成,从查询参数中提取文件 ID 后复用统一下载逻辑。
String templatePath = officeTemplate.getTemplatePath();
int idStartIndex = templatePath.indexOf("id=");
if (idStartIndex < 0) {
throw new BaseException("{}路径无效", templateName);
}
String fileId = templatePath.substring(idStartIndex + 3);
int nextParamIndex = fileId.indexOf('&');
if (nextParamIndex >= 0) {
fileId = fileId.substring(0, nextParamIndex);
}
if (StrUtil.isBlank(fileId)) {
throw new BaseException("{}文件无效", templateName);
}
sysFileService.download(fileId, request, response);
}
@Override
public List<SysClub> getMyManageClub() {
@@ -247,7 +247,7 @@ public class CondolenceMineController {
docData.put("fgh", approval);
});
doneTaskVos.stream().filter(task -> "校工会会计审核".equals(task.getDisplayName()))
doneTaskVos.stream().filter(task -> "校工会财务审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
@@ -33,7 +33,7 @@ import java.util.List;
*/
@IocBean
@At("/platform/condolence/schoolPrincipalApproval")
@Api("职工慰问校工会会计审核")
@Api("职工慰问校工会财务审核")
@Ok("json:full")
public class CondolenceSchoolPrincipalApprovalController {
@@ -1,3 +1,9 @@
// 新建协会申请时使用的“协会介绍及宗旨”默认内容。
const CLUB_DEFAULT_INTRODUCE = '<p>扬州工业职业技术学院教职工<u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</u>社团是学校教职工根据共同的兴趣、爱好,以自愿参加、自愿组织、自我管理为原则成立的,具有固定章程的非盈利性校内群众性团体。</p>' +
'<p>社团必须坚持以习近平新时代中国特色社会主义思想为指导,坚持正确的政治方向,遵循社会主义核心价值观,不断增强政治性、先进性、群众性。严格遵守国家法律法规和学校各项规章制度。</p>' +
'<p>社团以建设文明校园、繁荣校园文化为宗旨,团结和引导广大教职工积极开展各种健康的文化、体育活动,丰富教职工业余生活,促进广大教职工思想道德素质、文化艺术素质和身体素质的协调发展。</p>' +
'<p>校工会负责社团的审批和管理,社团接受校工会的指导、管理和监督。</p>'
const CLUB_FORM_TEMPLATE = {
template: `
<div>
@@ -90,26 +96,32 @@ const CLUB_FORM_TEMPLATE = {
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="申请成立报告" prop="establishReport">
<file-upload
:value.sync="formData.establishReport"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
<div style="position: relative">
<file-upload
:value.sync="formData.establishReport"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
<el-button type="primary" plain size="small" style="position: absolute; left: 115px; top: 5px" @click="downloadApplyTemplate">下载模板</el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="章程草案" prop="rulesFile">
<file-upload
:value.sync="formData.rulesFile"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
<div style="position: relative">
<file-upload
:value.sync="formData.rulesFile"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
accept=".doc,.docx,.xls,.xlsx,.pdf"
></file-upload>
<el-button type="primary" plain size="small" style="position: absolute; left: 115px; top: 5px" @click="downloadRulesTemplate">下载模板</el-button>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -156,14 +168,17 @@ const CLUB_FORM_TEMPLATE = {
return {
formData: {
clubName: "",
clubType: ""
clubType: "",
introduce: CLUB_DEFAULT_INTRODUCE
},
formRules: {
clubName: [{ required: true, message: "请填写协会名称", trigger: ["blur", "change"] }],
clubCode: [{ required: false, message: "请填写协会编码", trigger: ["blur", "change"] }],
clubType: [{ required: true, message: "请选择协会类型", trigger: ["blur", "change"] }],
concatPerson: [{ required: true, message: "请选择协会联系人", trigger: ["blur", "change"] }],
foundTime: [{ required: true, message: "请选择成立时间", trigger: ["blur", "change"] }]
foundTime: [{ required: true, message: "请选择成立时间", trigger: ["blur", "change"] }],
establishReport: [{ required: true, message: "请上传申请成立报告", trigger: ["blur", "change"] }],
rulesFile: [{ required: true, message: "请上传章程草案", trigger: ["blur", "change"] }]
// establishReport: [{ required: true, message: "请上传申请成立报告", trigger: ["blur", "change"] }]
//rulesFile: [{ required: true, message: "请上传章程草案", trigger: ["blur", "change"] }],
//manageFile: [{ required: true, message: "请上传经费来源及管理办法", trigger: ["blur", "change"] }],
@@ -173,6 +188,14 @@ const CLUB_FORM_TEMPLATE = {
},
computed: {},
methods: {
// 下载已上传的协会申请成立报告模板。
downloadApplyTemplate() {
window.open("/platform/club/register/clubRegisterApply/downloadTemplate")
},
// 下载已上传的协会章程草案模板。
downloadRulesTemplate() {
window.open("/platform/club/register/clubRegisterApply/downloadRulesTemplate")
},
/*concatPersonChange(id) {
const user = this.$refs.userSelectRef.options.find((user) => user.id === id)
this.$set(this.formData, "concatPersonUnitName", user.unitName)
@@ -64,7 +64,7 @@ layout("/layouts/platform.html"){
nextStep() {
let valid = true
this.$refs.clubFormRef.$refs.form.validateField(
["clubName", "establishReport", "rulesFile", "manageFile", "yearPlanFile"],
["clubName", "establishReport", "rulesFile"],
(errMsg) => {
if (!errMsg) {
valid = false
@@ -20,7 +20,6 @@ const basicForm = {
<el-form-item label="慰问方式" prop="way">
<el-radio-group v-model="formData.way">
<el-radio-button label="慰问金 (A)" border>慰问金 (A)</el-radio-button>
<el-radio-button label="提货券 (B)" border>提货券 (B)</el-radio-button>
<el-radio-button label="慰问品 (C)" border>慰问品 (C)</el-radio-button>
</el-radio-group>
</el-form-item>
@@ -86,6 +86,7 @@ layout("/layouts/platform.html"){
{prop: 'money', label: '金额'},
{prop: 'way', label: '慰问方式'},
{prop: 'isUploadFile', label: '是否上传附件'},
{prop: 'uploadFileDesc', label: '附件说明'},
{prop: 'enable', label: '是否启用'},
],
}
@@ -367,7 +367,7 @@ layout("/layouts/platform_h5.html"){
</van-field>
</van-cell-group>
<van-cell v-if="false"-group title="签字" class="form-section">
<van-cell-group v-if="false" title="签字" class="form-section">
<van-field v-if="false" class="direction-column-field" name="signature" label="">
<template #input>
<h5-signature v-if="false" v-model="formData.signature" slot="input"></h5-signature>
@@ -562,10 +562,11 @@ layout("/layouts/platform_h5.html"){
},
async onSubmit() {
this.$refs.formRef.validate().then(() => {
if (!this.formData.signature){
this.$toast.fail("请填写签字")
return
}
// 签字功能当前已停用,暂不校验签字信息。
// if (!this.formData.signature){
// this.$toast.fail("请填写签字")
// return
// }
this.$dialog.confirm({
title: "提示",
message: "您确定要提交申请吗?"
@@ -584,10 +585,11 @@ layout("/layouts/platform_h5.html"){
},
async onFinishTask() {
this.$refs.formRef.validate().then(() => {
if (!this.formData.signature){
this.$toast.fail("请填写签字")
return
}
// 签字功能当前已停用,暂不校验签字信息。
// if (!this.formData.signature){
// this.$toast.fail("请填写签字")
// return
// }
this.$dialog.confirm({
title: "提示",
message: "您确定要提交申请吗?"
@@ -7,7 +7,7 @@ layout("/layouts/platform_h5.html"){
</style>
<div id="app">
<van-nav-bar title="校工会会计审核" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-nav-bar title="校工会财务审核" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
@@ -229,7 +229,7 @@ layout("/layouts/platform_h5.html"){
</van-field>
</van-cell-group>
<van-cell v-if="false"-group title="签字" class="form-section">
<van-cell-group v-if="false" title="签字" class="form-section">
<van-field v-if="false" class="more-text" name="sign" label="">
<template #input>
<h5-signature v-if="false" v-model="formData.sign" slot="input"></h5-signature>
@@ -348,10 +348,11 @@ layout("/layouts/platform_h5.html"){
// 提交
onSubmit() {
this.$refs.formRef.validate().then(() => {
if (!this.formData.sign){
this.$toast.fail("请填写签字")
return
}
// 签字功能当前已停用,暂不校验签字信息。
// if (!this.formData.sign){
// this.$toast.fail("请填写签字")
// return
// }
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
@@ -381,10 +382,11 @@ layout("/layouts/platform_h5.html"){
onFinishTask() {
this.$refs.formRef.validate().then(() => {
if (!this.formData.sign){
this.$toast.fail("请填写签字")
return
}
// 签字功能当前已停用,暂不校验签字信息。
// if (!this.formData.sign){
// this.$toast.fail("请填写签字")
// return
// }
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"