Compare commits
7
Commits
3a23146903
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5da96a8117 | ||
|
|
3c7e80c428 | ||
|
|
d2d3fe9a3f | ||
|
|
e9e6a4d4be | ||
|
|
726ae57b96 | ||
|
|
56fe0c2933 | ||
|
|
1b98a1a24f |
@@ -86,6 +86,7 @@ public class MainLauncher {
|
||||
ioc.get(GlobalMessageSendService.class);
|
||||
|
||||
AppIocUtil.setIoc(ioc);
|
||||
ioc.get(com.budwk.app.sys.services.impl.SysUserDailySyncService.class).register();
|
||||
}
|
||||
|
||||
public void init_auth() {
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.budwk.app.base.config;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import org.nutz.dao.Dao;
|
||||
import org.nutz.dao.impl.NutDao;
|
||||
import org.nutz.ioc.impl.PropertiesProxy;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
|
||||
/** 推送库独立连接池,仅供人员、单位中间表查询,不能代替系统默认 DAO。 */
|
||||
@IocBean(create = "init", depose = "close")
|
||||
public class UserSourceDatabase {
|
||||
@Inject
|
||||
private PropertiesProxy conf;
|
||||
private DruidDataSource dataSource;
|
||||
private Dao dao;
|
||||
|
||||
/** 根据 user-source.jdbc 配置初始化来源连接;连接按需建立,使用只读模式。 */
|
||||
public void init() {
|
||||
dataSource = new DruidDataSource();
|
||||
dataSource.setUrl(conf.get("user-source.jdbc.url"));
|
||||
dataSource.setUsername(conf.get("user-source.jdbc.username"));
|
||||
dataSource.setPassword(conf.get("user-source.jdbc.password"));
|
||||
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
|
||||
dataSource.setDefaultReadOnly(true);
|
||||
dataSource.setMaxActive(3);
|
||||
dataSource.setMaxWait(10000);
|
||||
dataSource.setValidationQuery("select 1");
|
||||
dataSource.setTestWhileIdle(true);
|
||||
dao = new NutDao(dataSource);
|
||||
}
|
||||
|
||||
/** 返回来源库 DAO;调用方只能查询中间表,业务写入继续使用默认 DAO。 */
|
||||
public Dao dao() {
|
||||
return dao;
|
||||
}
|
||||
|
||||
/** 应用退出时释放来源库连接。 */
|
||||
public void close() {
|
||||
if (dataSource != null) {
|
||||
dataSource.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,14 +26,15 @@ RoleConstant {
|
||||
SCHOOL_UNION_DC_ADMIN("校工会民主管理员"),
|
||||
SCHOOL_UNION_PROPOSAL_ADMIN("校工会提案管理员"),
|
||||
APPEAL_COMMITTEE_MEMBER("申诉处理委员会成员"),
|
||||
SCHOOL_UNION_CLUB_ADMIN("校工会协会管理员"),
|
||||
SCHOOL_UNION_CLUB_ADMIN("校工会俱乐部管理员"),
|
||||
SCHOOL_UNION_ACTIVITY_ADMIN("校工会活动管理员"),
|
||||
SCHOOL_UNION_ARTICLE_CLUB_ADMIN("校工会协会新闻审批管理员"),
|
||||
SCHOOL_UNION_ARTICLE_CLUB_ADMIN("校工会俱乐部新闻审批管理员"),
|
||||
SCHOOL_UNION_ARTICLE_FGH_ADMIN("校工会分工会新闻审批管理员"),
|
||||
SCHOOL_UNION_ARTICLE_ADMIN("校工会新闻审批管理员"),
|
||||
SCHOOL_OUTLAY_ADMIN("校工会经费管理员"),
|
||||
|
||||
BRANCH_UNION_ADMIN("分工会管理员"),
|
||||
BRANCH_UNION_CADRE("基层干部"),
|
||||
BRANCH_UNION_CHAIRMAN("分工会主席"),
|
||||
BRANCH_UNION_VICE_CHAIRMAN("分工会副主席"),
|
||||
BRANCH_UNION_OPERATOR("分工会操作员"),
|
||||
@@ -79,15 +80,15 @@ RoleConstant {
|
||||
SCHOOL_HOSPITAL_LEADER("校医院负责人"),
|
||||
|
||||
/*协会模块*/
|
||||
CLUB_MEMBER("协会会员"),
|
||||
CLUB_MANAGER("协会负责人"),
|
||||
CLUB_PRESIDENT("协会会长"),
|
||||
CLUB_VICE_PRESIDENT("协会副会长"),
|
||||
CLUB_SECRETARY("协会秘书长"),
|
||||
CLUB_VICE_SECRETARY("协会副秘书长"),
|
||||
CLUB_MEMBER("俱乐部会员"),
|
||||
CLUB_MANAGER("俱乐部负责人"),
|
||||
CLUB_PRESIDENT("俱乐部会长"),
|
||||
CLUB_VICE_PRESIDENT("俱乐部副会长"),
|
||||
CLUB_SECRETARY("俱乐部秘书长"),
|
||||
CLUB_VICE_SECRETARY("俱乐部副秘书长"),
|
||||
// SCHOOL_UNION_CLUB_ADMIN("校工会协会管理员"),
|
||||
CLUB_AUDIT_LEADER("协会分管领导"),
|
||||
CLUB_OPERATOR("协会操作员"),
|
||||
CLUB_AUDIT_LEADER("俱乐部分管领导"),
|
||||
CLUB_OPERATOR("俱乐部操作员"),
|
||||
|
||||
/*大病基金会员*/
|
||||
AID_FUND_MEMBER("大病基金会员"),
|
||||
@@ -101,7 +102,7 @@ RoleConstant {
|
||||
LEGAL_DOCTOR("法律顾问"),
|
||||
|
||||
UNION_REIMBURSEMENT_MANAGER("分工会报销负责人"),
|
||||
CLUB_REIMBURSEMENT_MANAGER("协会报销负责人"),
|
||||
CLUB_REIMBURSEMENT_MANAGER("俱乐部报销负责人"),
|
||||
SCHOOL_REIMBURSEMENT_MANAGER("校工会报销负责人"),
|
||||
|
||||
;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.budwk.app.base.event.role;
|
||||
|
||||
import org.nutz.mvc.Mvcs;
|
||||
import com.budwk.app.base.utils.AppIocUtil;
|
||||
import org.nutz.ioc.Ioc;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
@@ -11,10 +12,19 @@ import org.nutz.mvc.Mvcs;
|
||||
*/
|
||||
public class RoleEventPublisher {
|
||||
|
||||
/**
|
||||
* 同步发布角色变更,兼容 HTTP 请求与 Quartz 后台线程。
|
||||
* 无返回值;监听器异常继续向调用方抛出,使外层业务事务可以回滚。
|
||||
*
|
||||
* @param event 角色事件:roleCode 为角色编码,userIds 或 unitId 指定人员范围,
|
||||
* operationType 为 ADD_ROLE、REMOVE_ROLE 或 RENEW_ROLE
|
||||
*/
|
||||
public static void broadcast(RoleEventMsg event){
|
||||
String[] names = Mvcs.getIoc().getNamesByType(RoleEventListener.class);
|
||||
// 使用应用启动时保存的全局容器,避免后台线程依赖 HTTP 请求上下文。
|
||||
Ioc ioc = AppIocUtil.get();
|
||||
String[] names = ioc.getNamesByType(RoleEventListener.class);
|
||||
for (String name : names) {
|
||||
RoleEventListener listener = Mvcs.getIoc().get(RoleEventListener.class, name);
|
||||
RoleEventListener listener = ioc.get(RoleEventListener.class, name);
|
||||
listener.receive(event);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class FlowClubPresidentByArgsAssignmentHandler implements AssignmentHandl
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return "获取协会负责人(根据args中的clubId)";
|
||||
return "获取俱乐部负责人(根据args中的clubId)";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
package com.budwk.app.sys.controller;
|
||||
|
||||
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
||||
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
||||
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
||||
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.Dict;
|
||||
@@ -12,6 +16,7 @@ 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.result.Result;
|
||||
import com.budwk.app.base.utils.CommonDownloadUtil;
|
||||
import com.budwk.app.base.utils.PageUtil;
|
||||
import com.budwk.app.flow.constant.FlowConst;
|
||||
import com.budwk.app.flow.engine.FlowEngine;
|
||||
@@ -27,6 +32,7 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.nutz.aop.interceptor.ioc.TransAop;
|
||||
import org.nutz.dao.Chain;
|
||||
import org.nutz.dao.Cnd;
|
||||
@@ -44,6 +50,7 @@ import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@@ -357,26 +364,30 @@ public class SysUnionController {
|
||||
unionCadre.setIsJoin(true);
|
||||
dao.insert(unionCadre);
|
||||
|
||||
// 去走工作流
|
||||
boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name());
|
||||
Dict args = Dict.create();
|
||||
args.set("submit", isAdmin ? "admin" : "branch");
|
||||
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
|
||||
args.set(FlowConst.FORM_DATA, unionCadre);
|
||||
|
||||
ProcessInstance instance = flowEngine.startProcessInstanceByKey("JCGHWY", unionCadre.getId(), SecurityUtil.getUserId(), args);
|
||||
// 自动完成第一个申请任务
|
||||
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
|
||||
for (ProcessTask task : doingTaskList) {
|
||||
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
|
||||
}
|
||||
|
||||
boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(),
|
||||
RoleConstant.SCHOOL_UNION_CHAIRMAN.name());
|
||||
if (isAdmin) {
|
||||
// 如果是管理员,直接加角色
|
||||
sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", role.getId()).and("userId", "=", userId).and("unionId", "=", unionId));
|
||||
sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()).add("userId", userId).add("unionId", unionId));
|
||||
Sys_role cadreRole = sysRoleService.getByCode(RoleConstant.BRANCH_UNION_CADRE);
|
||||
sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", cadreRole.getId()).and("userId", "=", userId).and("unionId", "=", unionId));
|
||||
sysRoleService.insert("sys_user_role", Chain.make("roleId", cadreRole.getId()).add("userId", userId).add("unionId", unionId));
|
||||
sysRoleService.clearCache();
|
||||
sysUserService.clearCache();
|
||||
} else {
|
||||
// 分工会管理员添加干部时提交校工会审核。
|
||||
Dict args = Dict.create();
|
||||
args.set("submit", "branch");
|
||||
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
|
||||
args.set(FlowConst.FORM_DATA, unionCadre);
|
||||
|
||||
ProcessInstance instance = flowEngine.startProcessInstanceByKey("JCGHWY", unionCadre.getId(), SecurityUtil.getUserId(), args);
|
||||
// 自动完成第一个申请任务
|
||||
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
|
||||
for (ProcessTask task : doingTaskList) {
|
||||
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
|
||||
}
|
||||
}
|
||||
|
||||
return Result.success();
|
||||
@@ -385,11 +396,19 @@ public class SysUnionController {
|
||||
@At
|
||||
@ApiOperation("删除分工会人员角色")
|
||||
@SaCheckPermission("sys.manager.union.branchOfficer")
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public Result deleteBranchUnionUserRole(String userId, String roleCode, String unionId) {
|
||||
Sys_role role = sysRoleService.fetch(Cnd.where("code", "=", roleCode));
|
||||
if (Lang.isEmpty(role)) {
|
||||
throw new BaseException("无法找到{}对应编码的角色", roleCode);
|
||||
}
|
||||
Cnd unionCadreCnd = Cnd.where("userId", "=", userId)
|
||||
.and("unionId", "=", unionId).and("roleCode", "=", roleCode);
|
||||
List<Sys_union_cadre> unionCadres = dao.query(Sys_union_cadre.class, unionCadreCnd);
|
||||
// 删除干部申请时同步删除流程,避免审核列表残留空白待办。
|
||||
for (Sys_union_cadre unionCadre : unionCadres) {
|
||||
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(unionCadre.getId());
|
||||
}
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("roleId", "=", role.getId());
|
||||
if (StrUtil.isNotBlank(userId)) {
|
||||
@@ -401,8 +420,20 @@ public class SysUnionController {
|
||||
|
||||
sysRoleService.clear("sys_user_role", cnd);
|
||||
|
||||
dao.clear(Sys_union_cadre.class, Cnd.where("userId", "=", userId)
|
||||
.and("unionId", "=", unionId).and("roleCode", "=", roleCode));
|
||||
dao.clear(Sys_union_cadre.class, unionCadreCnd);
|
||||
|
||||
List<String> branchUnionRoleCodes = sysDictService.getSubListByCode("BRANCH_UNION_ROLES")
|
||||
.stream().map(Sys_dict::getCode).toList();
|
||||
List<String> branchUnionRoleIds = CollUtil.isEmpty(branchUnionRoleCodes) ? List.of() :
|
||||
sysRoleService.query(Cnd.where("code", "in", branchUnionRoleCodes))
|
||||
.stream().map(Sys_role::getId).toList();
|
||||
int branchUnionRoleCount = CollUtil.isEmpty(branchUnionRoleIds) ? 0 : dao.count(Sys_user_role.class,
|
||||
Cnd.where("userId", "=", userId).and("unionId", "=", unionId).and("roleId", "in", branchUnionRoleIds));
|
||||
if (branchUnionRoleCount == 0) {
|
||||
Sys_role cadreRole = sysRoleService.getByCode(RoleConstant.BRANCH_UNION_CADRE);
|
||||
sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", cadreRole.getId())
|
||||
.and("userId", "=", userId).and("unionId", "=", unionId));
|
||||
}
|
||||
|
||||
sysRoleService.clearCache();
|
||||
sysUserService.clearCache();
|
||||
@@ -470,6 +501,57 @@ public class SysUnionController {
|
||||
return Result.success(pagination.getList());
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
@ApiOperation("导出基层干部")
|
||||
@SaCheckPermission("sys.manager.union")
|
||||
public void exportCadre(HttpServletResponse response) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname AS loginName,
|
||||
u.username AS userName,
|
||||
IFNULL(MAX(branchUnion.`name`), '') AS unionName,
|
||||
u.mobile,
|
||||
GROUP_CONCAT(DISTINCT role.`name` ORDER BY role.sort ASC SEPARATOR '、') AS roleName
|
||||
FROM
|
||||
sys_role role
|
||||
INNER JOIN sys_user_role ur ON role.id = ur.roleId
|
||||
INNER JOIN sys_user u ON u.id = ur.userId
|
||||
LEFT JOIN vw_user currentUser ON currentUser.id = u.id
|
||||
LEFT JOIN sys_union branchUnion ON branchUnion.id = COALESCE(NULLIF(currentUser.unionId, ''), NULLIF(ur.unionId, ''))
|
||||
INNER JOIN sys_dict roleDict ON roleDict.`code` = role.`code`
|
||||
INNER JOIN sys_dict roleParent ON roleParent.id = roleDict.parentId
|
||||
AND roleParent.`code` = 'BRANCH_UNION_ROLES'
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
|
||||
cnd.and("COALESCE(NULLIF(currentUser.unionId, ''), NULLIF(ur.unionId, ''))", "=", SecurityUtil.getUnionId());
|
||||
}
|
||||
cnd.groupBy("ur.userId");
|
||||
cnd.asc("MIN(branchUnion.unionCode)");
|
||||
cnd.asc("u.loginname");
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> list = sysUnionService.listMap(sql);
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
list.get(i).put("no", i + 1);
|
||||
}
|
||||
|
||||
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
||||
exportEntities.add(new ExcelExportEntity("序号", "no", 10));
|
||||
exportEntities.add(new ExcelExportEntity("工号", "loginName", 20));
|
||||
exportEntities.add(new ExcelExportEntity("姓名", "userName", 20));
|
||||
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 30));
|
||||
exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20));
|
||||
exportEntities.add(new ExcelExportEntity("职务", "roleName", 30));
|
||||
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setSheetName("基层干部");
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
|
||||
CommonDownloadUtil.download("基层干部.xlsx", workbook, response);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 基层干部审核相关
|
||||
@@ -510,6 +592,7 @@ public class SysUnionController {
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("t.taskName", "=", "2978a74a-75c1-4f95-99f9-9c08c480f1b5");
|
||||
cnd.and("info.id", "is not", null);
|
||||
if (pageForm.getAudit()) {
|
||||
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(),
|
||||
ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.budwk.app.sys.interceptor;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.budwk.app.base.constant.RoleConstant;
|
||||
import com.budwk.app.flow.constant.FlowConst;
|
||||
import com.budwk.app.flow.engine.FlowInterceptor;
|
||||
import com.budwk.app.flow.engine.core.Execution;
|
||||
@@ -44,6 +45,13 @@ public class SysUnionSchoolAuditInterceptor implements FlowInterceptor {
|
||||
sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId())
|
||||
.add("userId", unionBean.getUserId()).add("unionId", unionBean.getUnionId()));
|
||||
|
||||
// 分工会干部统一增加基层干部角色,便于按干部身份集中管理。
|
||||
Sys_role cadreRole = sysRoleService.getByCode(RoleConstant.BRANCH_UNION_CADRE);
|
||||
sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", cadreRole.getId())
|
||||
.and("userId", "=", unionBean.getUserId()).and("unionId", "=", unionBean.getUnionId()));
|
||||
sysRoleService.insert("sys_user_role", Chain.make("roleId", cadreRole.getId())
|
||||
.add("userId", unionBean.getUserId()).add("unionId", unionBean.getUnionId()));
|
||||
|
||||
// 清除缓存
|
||||
sysRoleService.clearCache();
|
||||
sysUserService.clearCache();
|
||||
|
||||
@@ -41,6 +41,9 @@ import java.util.stream.Collectors;
|
||||
@IocBean(args = {"refer:dao"})
|
||||
public class SysDataUnitPullServiceImpl extends BaseServiceImpl<Sys_unit> implements SysDataUnitPullService {
|
||||
|
||||
@Inject
|
||||
private com.budwk.app.base.config.UserSourceDatabase userSourceDatabase;
|
||||
|
||||
@Inject
|
||||
private DataCenterProperties dcPro;
|
||||
|
||||
@@ -66,7 +69,7 @@ public class SysDataUnitPullServiceImpl extends BaseServiceImpl<Sys_unit> implem
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void updateUnits(List<String> unitIds) {
|
||||
// 中间表数据
|
||||
List<Record> unitMiddleList = dao().query("unit_middle", Cnd.NEW());
|
||||
List<Record> unitMiddleList = userSourceDatabase.dao().query("unit_middle", Cnd.NEW());
|
||||
List<Sys_unit> sysUnits = dao().query(Sys_unit.class, Cnd.NEW());
|
||||
Map<String, Sys_unit> unitMapById = sysUnits.stream()
|
||||
.filter(unit -> StrUtil.isNotBlank(unit.getId()))
|
||||
@@ -84,7 +87,14 @@ public class SysDataUnitPullServiceImpl extends BaseServiceImpl<Sys_unit> implem
|
||||
Map<String, String> api2db = Arrays.stream(Api2UnitFiledMap.values())
|
||||
.collect(Collectors.toMap(e -> e.apiField, e -> e.dbColumn));
|
||||
for (Record row : unitMiddleList) {
|
||||
JSONObject jsonRow = JSONUtil.parseObj(JSONUtil.toJsonStr(row));
|
||||
JSONObject jsonRow = new JSONObject();
|
||||
// 用映射中的原始键构建 JSON,避免 Record 转 JSON 后列名变小写导致取值失败。
|
||||
for (String key : api2db.keySet()) {
|
||||
jsonRow.set(key, row.get(key));
|
||||
}
|
||||
jsonRow.set("dwdm", row.get("dwdm"));
|
||||
jsonRow.set("dwdj", row.get("dwdj"));
|
||||
jsonRow.set("sjdwmcdm", row.get("sjdwmcdm"));
|
||||
String unitCode = getDataCenterField(jsonRow, "dwdm");
|
||||
String unitLevel = getDataCenterField(jsonRow, "dwdj");
|
||||
if (StrUtil.isBlank(unitCode)) {
|
||||
@@ -135,6 +145,7 @@ public class SysDataUnitPullServiceImpl extends BaseServiceImpl<Sys_unit> implem
|
||||
*
|
||||
* @param updateList 需要更新的单位数据
|
||||
*/
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
private void updateDataCenterUnitFields(List<Sys_unit> updateList) {
|
||||
for (Sys_unit unit : updateList) {
|
||||
Chain chain = Chain.make("unitcode", unit.getUnitcode());
|
||||
|
||||
+95
-110
@@ -2,7 +2,6 @@ package com.budwk.app.sys.services.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.date.DateField;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
@@ -13,6 +12,8 @@ import com.budwk.app.base.event.role.RoleEventPublisher;
|
||||
import com.budwk.app.base.event.user.UserChangeMsg;
|
||||
import com.budwk.app.base.event.user.UserChangePublisher;
|
||||
import com.budwk.app.base.utils.PwdUtil;
|
||||
import com.budwk.app.base.exception.BaseException;
|
||||
import com.budwk.app.base.utils.ConditionGroupUtil;
|
||||
import com.budwk.app.sys.annotation.DataCenterColumn;
|
||||
import com.budwk.app.sys.models.*;
|
||||
import com.budwk.app.sys.param.SysDataUserUpdateParam;
|
||||
@@ -128,7 +129,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
if (dataCenterUpdateFields == null) {
|
||||
dataCenterUpdateFields = getFieldMappings().stream()
|
||||
.map(mapping -> mapping.field.getName())
|
||||
.collect(Collectors.joining("|", "^(id|", ")$"));
|
||||
.collect(Collectors.joining("|", "^(id|member|", ")$"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -136,31 +137,16 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户是否符合会员条件
|
||||
*
|
||||
* @param userState 用户状态
|
||||
* @param preparedBy 编制类别
|
||||
* @param postDoctoralJoinDate 博士后进站时间
|
||||
* @return 是否符合会员条件
|
||||
* 判断本次来源记录是否可自动设为会员。
|
||||
* @param userState 在职状态,接受“在职”或“在岗”,忽略首尾空格
|
||||
* @param personType 人员类型,必须非空且不是“临时聘用人员”
|
||||
* @return true 表示授予会员资格;false 表示取消会员资格(包括状态或人员类型为空)
|
||||
*/
|
||||
private boolean checkMembershipEligibility(String userState, String preparedBy, Date postDoctoralJoinDate) {
|
||||
// 博士后单独判断:只要进站时间在两年内就是会员
|
||||
if ("博士后".equals(preparedBy)) {
|
||||
if (postDoctoralJoinDate != null) {
|
||||
Date twoYearsAgo = DateUtil.offset(DateUtil.date(), DateField.YEAR, -2).toJdkDate();
|
||||
return postDoctoralJoinDate.after(twoYearsAgo);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 其他人员需要判断在岗状态和聘用方式
|
||||
if (!"在岗".equals(userState)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 判断聘用方式
|
||||
Set<String> memberPreparedByTypes = new HashSet<>(Arrays.asList("新人事代理", "校聘合同制", "事业编制"));
|
||||
return memberPreparedByTypes.contains(preparedBy);
|
||||
private boolean checkMembershipEligibility(String userState, String personType) {
|
||||
String state = StrUtil.trimToNull(userState);
|
||||
String type = StrUtil.trimToNull(personType);
|
||||
return ("在职".equals(state) || "在岗".equals(state))
|
||||
&& type != null && !"临时聘用人员".equals(type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,6 +158,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
@Override
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public String update(SysDataUserUpdateParam updateParam) {
|
||||
if (updateParam == null || StrUtil.isBlank(updateParam.getPullTime())) {
|
||||
throw new BaseException("全量更新必须指定拉取批次");
|
||||
}
|
||||
long startTime = System.currentTimeMillis();
|
||||
log.info("开始全量更新用户数据");
|
||||
|
||||
@@ -179,6 +168,10 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
Sys_role publicRole = sysRoleService.getByCode(RoleConstant.PUBLIC);
|
||||
Sys_role memberRole = sysRoleService.getByCode(RoleConstant.MEMBER);
|
||||
|
||||
if (publicRole == null || memberRole == null) {
|
||||
throw new BaseException("公共角色或会员角色不存在,已停止全量更新");
|
||||
}
|
||||
|
||||
// 获取单位信息,后续判断单位变更
|
||||
List<Sys_unit> unitList = dao.query(Sys_unit.class, Cnd.where("unitTypeCode", "=", "1"));
|
||||
unitIdNameMap = unitList.stream().collect(Collectors.toMap(Sys_unit::getId, Sys_unit::getName));
|
||||
@@ -188,30 +181,59 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
|
||||
// 处理复杂条件
|
||||
if (updateParam.getConditionGroup() != null) {
|
||||
// cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup());
|
||||
cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup());
|
||||
}
|
||||
|
||||
List<Sys_user_source> sources = dao.query(Sys_user_source.class, cnd.groupBy("loginname"));
|
||||
List<Sys_user_source> sources = dao.query(Sys_user_source.class, cnd);
|
||||
if (sources.isEmpty() || sources.stream().anyMatch(v -> StrUtil.isBlank(v.getLoginname()) || StrUtil.isBlank(v.getUsername()))) {
|
||||
throw new BaseException("当前批次为空或包含空工号、空姓名,不能执行全量更新");
|
||||
}
|
||||
// 不使用 SELECT * GROUP BY,兼容 MySQL 严格模式;重复工号中止,避免随意覆盖。
|
||||
if (sources.stream().map(Sys_user::getLoginname).distinct().count() != sources.size()) {
|
||||
throw new BaseException("当前批次存在重复工号,已停止全量更新");
|
||||
}
|
||||
log.info("符合条件的数据源记录数: {}", sources.size());
|
||||
|
||||
// 查询系统用户
|
||||
List<Sys_user> sysUsers = dao.query(Sys_user.class, Cnd.NEW().groupBy("loginname"));
|
||||
Map<String, Sys_user> userMap = sysUsers.stream().collect(Collectors.toMap(Sys_user::getLoginname, sysUser -> sysUser));
|
||||
List<Sys_user> sysUsers = dao.query(Sys_user.class, Cnd.NEW());
|
||||
Map<String, Sys_user> userMap = new HashMap<>();
|
||||
for (Sys_user user : sysUsers) {
|
||||
if (StrUtil.isNotBlank(user.getLoginname()) && userMap.putIfAbsent(user.getLoginname(), user) != null) {
|
||||
throw new BaseException("系统存在重复工号,已停止全量更新");
|
||||
}
|
||||
}
|
||||
|
||||
// 准备数据集合
|
||||
List<Sys_user> needDoUpdateList = new CopyOnWriteArrayList<>();
|
||||
List<Sys_user> needInitUserList = new CopyOnWriteArrayList<>();
|
||||
List<Sys_user_history> histories = new CopyOnWriteArrayList<>();
|
||||
List<Sys_user> needDoUpdateList = new ArrayList<>();
|
||||
List<Sys_user> needInitUserList = new ArrayList<>();
|
||||
List<Sys_user_history> histories = new ArrayList<>();
|
||||
|
||||
int newMemberCount = 0;
|
||||
int withdrawnMemberCount = 0;
|
||||
List<String> nonMemberUserIds = new ArrayList<>();
|
||||
// 处理每条数据
|
||||
for (Sys_user_source source : sources) {
|
||||
Sys_user user = userMap.get(source.getLoginname());
|
||||
|
||||
// 创建只包含数据中心字段的用户对象,避免覆盖本地维护的会员、登录、积分等业务字段。
|
||||
// 仅更新数据中心字段和明确授权同步的会员标记,保留登录、积分等本地字段。
|
||||
Sys_user u = buildDataCenterUser(source);
|
||||
boolean eligible = checkMembershipEligibility(source.getUserState(), source.getPersonType());
|
||||
// 本批次人员严格按来源条件设置会员;不符合条件时同步撤销会员角色。
|
||||
u.setMember(eligible);
|
||||
if (eligible && (user == null || !Boolean.TRUE.equals(user.getMember()))) {
|
||||
newMemberCount++;
|
||||
}
|
||||
if (!eligible && user != null) {
|
||||
nonMemberUserIds.add(user.getId());
|
||||
if (Boolean.TRUE.equals(user.getMember())) {
|
||||
withdrawnMemberCount++;
|
||||
}
|
||||
}
|
||||
source.setMember(u.getMember());
|
||||
|
||||
if (user == null) {
|
||||
// 新增用户,初始化数据
|
||||
u.setId(R.UU32());
|
||||
String salt = R.UU32();
|
||||
u.setSalt(salt);
|
||||
u.setPassword(PwdUtil.getPassword(PwdUtil.generate(12), salt));
|
||||
@@ -235,58 +257,18 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
}
|
||||
}
|
||||
|
||||
// 使用CompletableFuture处理并行任务
|
||||
List<CompletableFuture<Void>> updateTasks = new ArrayList<>();
|
||||
|
||||
// 1. 新增用户 - 使用批量处理
|
||||
if (Lang.isNotEmpty(needInitUserList)) {
|
||||
CompletableFuture<Void> insertTask = CompletableFuture.runAsync(() -> {
|
||||
log.info("新增用户: {} 个", needInitUserList.size());
|
||||
// 分批处理,每批200条
|
||||
List<List<Sys_user>> batches = ListUtil.split(needInitUserList, 500);
|
||||
batches.forEach(batch -> {
|
||||
try {
|
||||
dao.fastInsert(batch);
|
||||
} catch (Exception e) {
|
||||
log.error("批量新增用户异常", e);
|
||||
}
|
||||
});
|
||||
}, executorService);
|
||||
updateTasks.add(insertTask);
|
||||
// 人员、角色、历史在当前事务线程同步写入,任一失败抛出异常并回滚。
|
||||
log.info("全量批次 {}:新增 {} 人,更新 {} 人,新设会员 {} 人,取消会员 {} 人", updateParam.getPullTime(),
|
||||
needInitUserList.size(), needDoUpdateList.size(), newMemberCount, withdrawnMemberCount);
|
||||
for (List<Sys_user> batch : ListUtil.split(needInitUserList, 500)) {
|
||||
dao.fastInsert(batch);
|
||||
}
|
||||
Dao extDao = Daos.ext(dao, FieldFilter.create(Sys_user.class, getDataCenterUpdateFields()));
|
||||
for (List<Sys_user> batch : ListUtil.split(needDoUpdateList, 500)) {
|
||||
extDao.updateIgnoreNull(batch);
|
||||
}
|
||||
|
||||
// 2. 更新现有用户 - 使用批量处理
|
||||
if (Lang.isNotEmpty(needDoUpdateList)) {
|
||||
CompletableFuture<Void> updateTask = CompletableFuture.runAsync(() -> {
|
||||
log.info("更新用户: {} 个", needDoUpdateList.size());
|
||||
// 分批处理,每批200条
|
||||
List<List<Sys_user>> batches = ListUtil.split(needDoUpdateList, 500);
|
||||
batches.forEach(batch -> {
|
||||
try {
|
||||
Dao extDao = Daos.ext(dao, FieldFilter.create(Sys_user.class, getDataCenterUpdateFields()));
|
||||
extDao.updateIgnoreNull(batch);
|
||||
} catch (Exception e) {
|
||||
log.error("批量更新用户异常", e);
|
||||
}
|
||||
});
|
||||
}, executorService);
|
||||
updateTasks.add(updateTask);
|
||||
}
|
||||
|
||||
// 等待用户数据更新完成
|
||||
try {
|
||||
// 设置超时时间,避免无限等待
|
||||
CompletableFuture.allOf(updateTasks.toArray(new CompletableFuture[0]))
|
||||
.get(5, TimeUnit.MINUTES);
|
||||
} catch (TimeoutException e) {
|
||||
log.warn("更新用户数据超时");
|
||||
return "更新超时,请检查数据处理情况";
|
||||
} catch (Exception e) {
|
||||
log.error("更新用户数据异常", e);
|
||||
return "更新失败: " + e.getMessage();
|
||||
}
|
||||
|
||||
// 3. 全量同步不变更会员状态,只按当前用户会员标记补齐基础角色。
|
||||
// 根据更新后的会员标记补齐基础角色,不移除其他已有权限。
|
||||
List<Sys_user> roleUsers = dao.query(Sys_user.class, Cnd.NEW());
|
||||
List<String> publicRoleUserIds = roleUsers.stream().map(Sys_user::getId).toList();
|
||||
List<String> memberRoleUserIds = roleUsers.stream()
|
||||
@@ -295,36 +277,37 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
.toList();
|
||||
int addPublicRoleCount = addMissingUserRole(publicRole.getId(), publicRoleUserIds, "公共角色");
|
||||
int addMemberRoleCount = addMissingUserRole(memberRole.getId(), memberRoleUserIds, "会员角色");
|
||||
// 仅删除本次来源中不符合条件人员的 MEMBER 关系,包括历史残留的会员角色。
|
||||
// 明确限制 roleId,公共角色和其他业务角色不受本次退会操作影响。
|
||||
int removedMemberRoleCount = 0;
|
||||
for (List<String> batch : ListUtil.split(nonMemberUserIds, 500)) {
|
||||
removedMemberRoleCount += dao.clear(Sys_user_role.class,
|
||||
Cnd.where(Sys_user_role::getRoleId, "=", memberRole.getId())
|
||||
.and(Sys_user_role::getUserId, "in", batch));
|
||||
}
|
||||
log.info("取消会员 {} 人,移除会员角色关系 {} 条", withdrawnMemberCount, removedMemberRoleCount);
|
||||
sysRoleService.clearCache();
|
||||
|
||||
// 4. 异步添加历史记录 - 不等待完成
|
||||
if (Lang.isNotEmpty(histories)) {
|
||||
executorService.execute(() -> {
|
||||
log.info("添加历史记录: {} 条", histories.size());
|
||||
// 分批处理历史记录
|
||||
List<List<Sys_user_history>> batches = ListUtil.split(histories, 500);
|
||||
batches.forEach(batch -> {
|
||||
try {
|
||||
dao.fastInsert(batch);
|
||||
} catch (Exception e) {
|
||||
log.error("批量添加历史记录异常", e);
|
||||
}
|
||||
});
|
||||
});
|
||||
// 历史记录必须随业务事务完成,不能在任务报告成功后异步写入。
|
||||
for (List<Sys_user_history> batch : ListUtil.split(histories, 500)) {
|
||||
dao.fastInsert(batch);
|
||||
}
|
||||
|
||||
// 5. 处理其他任务
|
||||
// 5.1 更新提案的校领导角色,发送订阅
|
||||
ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.where("delFlag", "=", false).desc("updatedAt"));
|
||||
for (String unitId : config.getSchoolLeaderUnitIds()) {
|
||||
RoleEventPublisher.broadcast(new RoleEventMsg(unitId, RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name(), RoleEventMsg.RENEW_ROLE));
|
||||
if (config != null && config.getSchoolLeaderUnitIds() != null) {
|
||||
for (String unitId : config.getSchoolLeaderUnitIds()) {
|
||||
RoleEventPublisher.broadcast(new RoleEventMsg(unitId, RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name(), RoleEventMsg.RENEW_ROLE));
|
||||
}
|
||||
}
|
||||
|
||||
long endTime = System.currentTimeMillis();
|
||||
log.info("全量更新用户数据完成,耗时: {} 毫秒", (endTime - startTime));
|
||||
|
||||
return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size()
|
||||
+ " 个, 补齐公共角色 " + addPublicRoleCount + " 个, 补齐会员角色 " + addMemberRoleCount + " 个";
|
||||
+ " 个, 新设会员 " + newMemberCount + " 个, 取消会员 " + withdrawnMemberCount
|
||||
+ " 个, 移除会员角色 " + removedMemberRoleCount + " 条, 补齐公共角色 " + addPublicRoleCount + " 个, 补齐会员角色 " + addMemberRoleCount + " 个";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -335,6 +318,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
* @param roleName 日志中的角色名称
|
||||
* @return 本次新增的角色关系数量
|
||||
*/
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
private int addMissingUserRole(String roleId, List<String> userIds, String roleName) {
|
||||
List<String> distinctUserIds = userIds.stream()
|
||||
.filter(Objects::nonNull)
|
||||
@@ -443,6 +427,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
* @param user 系统用户
|
||||
* @return 历史记录
|
||||
*/
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
private Sys_user_history createHistory(Sys_user_source source, Sys_user user) {
|
||||
List<String> changeTypes = new ArrayList<>();
|
||||
List<NutMap> changeList = new ArrayList<>();
|
||||
@@ -494,15 +479,15 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
|
||||
changeTypes.add(MemberChangeType.BASIC_CHANGE.name());
|
||||
}
|
||||
|
||||
// 特殊字段变更处理
|
||||
// 1. 会员状态变更
|
||||
// if (!ObjectUtil.equals(user.getMember(), source.getMember())) {
|
||||
// if (source.getMember()) {
|
||||
// changeTypes.add(MemberChangeType.RESTORE.name());
|
||||
// } else {
|
||||
// changeTypes.add(MemberChangeType.WITHDRAWAL.name());
|
||||
// }
|
||||
// }
|
||||
// 会员标记实际发生变化时记录入会或退会,重复同步不重复生成会员变更历史。
|
||||
boolean oldMember = Boolean.TRUE.equals(user.getMember());
|
||||
boolean newMember = Boolean.TRUE.equals(source.getMember());
|
||||
if (oldMember != newMember) {
|
||||
changeTypes.add(newMember ? MemberChangeType.RESTORE.name() : MemberChangeType.WITHDRAWAL.name());
|
||||
changeList.add(NutMap.NEW().addv("fieldName", "会员状态").addv("field", "member")
|
||||
.addv("sourceValue", oldMember ? "会员" : "非会员")
|
||||
.addv("newValue", newMember ? "会员" : "非会员"));
|
||||
}
|
||||
|
||||
// 2. 单位变更
|
||||
String oldUnitId = normalizeSecondLevelUnitId(user.getUnitId());
|
||||
|
||||
+35
-22
@@ -2,8 +2,6 @@ package com.budwk.app.sys.services.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.thread.AsyncUtil;
|
||||
import cn.hutool.core.thread.ThreadUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.base.constant.RoleConstant;
|
||||
import com.budwk.app.base.event.role.RoleEventMsg;
|
||||
@@ -15,10 +13,12 @@ import com.budwk.app.sys.param.SysDataUserUpdateParam;
|
||||
import com.budwk.app.sys.services.SysDataUserUpdateService;
|
||||
import com.budwk.app.sys.services.SysRoleService;
|
||||
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
|
||||
import org.nutz.aop.interceptor.ioc.TransAop;
|
||||
import org.nutz.ioc.aop.Aop;
|
||||
import com.budwk.app.base.exception.BaseException;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.Dao;
|
||||
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.random.R;
|
||||
@@ -27,7 +27,6 @@ import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.Calendar;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* 增量更新系统用户数据
|
||||
@@ -40,21 +39,38 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic
|
||||
@Inject
|
||||
private SysRoleService sysRoleService;
|
||||
|
||||
/**
|
||||
* 按 pullTime(yyyy-MM-dd HH:mm:ss)批次新增工号,conditionGroup 为可选筛选条件。
|
||||
* 返回新增人员、单位、会员数量的说明字符串;所有业务写入在同一事务线程执行。
|
||||
*/
|
||||
@Override
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public String update(SysDataUserUpdateParam updateParam) {
|
||||
// 基本SQL查询
|
||||
if (updateParam == null || StrUtil.isBlank(updateParam.getPullTime())) {
|
||||
throw new BaseException("拉取批次不能为空");
|
||||
}
|
||||
// 空工号不参与新增,系统中的空值也不能干扰 NOT IN 判断。
|
||||
Cnd cnd = Cnd.where("pullTime", "=", updateParam.getPullTime())
|
||||
.and("loginname", "NOT IN", Sqls.create("SELECT loginname FROM sys_user"));
|
||||
.and("loginname", "NOT IN", Sqls.create("SELECT loginname FROM sys_user WHERE loginname IS NOT NULL"));
|
||||
|
||||
// 处理复杂条件
|
||||
if (updateParam.getConditionGroup() != null) {
|
||||
cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup());
|
||||
}
|
||||
|
||||
cnd.groupBy("loginname");
|
||||
cnd.and("loginname", "IS NOT", null).and("loginname", "!=", "");
|
||||
|
||||
// 执行查询
|
||||
List<Sys_user_source> userSources = dao.query(Sys_user_source.class, cnd);
|
||||
List<Sys_user_source> userSources = new java.util.ArrayList<>(dao.query(Sys_user_source.class, cnd).stream()
|
||||
.collect(java.util.stream.Collectors.toMap(Sys_user_source::getLoginname,
|
||||
v -> v, (first, duplicate) -> first, java.util.LinkedHashMap::new)).values());
|
||||
if (userSources.isEmpty()) {
|
||||
return "增量更新成功,本次无新增人员。";
|
||||
}
|
||||
Sys_role publicRole = sysRoleService.getByCode(RoleConstant.PUBLIC);
|
||||
if (publicRole == null) {
|
||||
throw new BaseException("公共角色不存在,已停止新增人员");
|
||||
}
|
||||
|
||||
//加入到系统用户表
|
||||
List<Sys_user> sysUsers = BeanUtil.copyToList(userSources, Sys_user.class);
|
||||
@@ -98,11 +114,10 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic
|
||||
}
|
||||
|
||||
List<List<Sys_user>> splitSysUsers = ListUtil.split(sysUsers, 500);
|
||||
List<CompletableFuture<List<Sys_user>>> splitSysUsersFutures = splitSysUsers.stream().map(v -> CompletableFuture.supplyAsync(() -> dao.fastInsert(v))).toList();
|
||||
//等待任务全部完成
|
||||
AsyncUtil.waitAll(CompletableFuture.allOf(splitSysUsersFutures.toArray(new CompletableFuture[0])));
|
||||
|
||||
Sys_role publicRole = sysRoleService.getByCode(RoleConstant.PUBLIC);
|
||||
// 分批同步写入,避免异步线程脱离当前事务造成部分成功。
|
||||
for (List<Sys_user> batch : splitSysUsers) {
|
||||
dao.fastInsert(batch);
|
||||
}
|
||||
|
||||
//添加公共角色
|
||||
List<Sys_user_role> sysUserRoles = sysUsers.stream().map(user -> {
|
||||
@@ -111,13 +126,11 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic
|
||||
sysUserRole.setRoleId(publicRole.getId());
|
||||
return sysUserRole;
|
||||
}).toList();
|
||||
ThreadUtil.execAsync(() -> {
|
||||
dao.insert(sysUserRoles);
|
||||
});
|
||||
dao.insert(sysUserRoles);
|
||||
sysRoleService.clearCache();
|
||||
|
||||
//比较单位数据
|
||||
List<Sys_unit> sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitLevel, "=", 2));
|
||||
List<Sys_unit> sysUnits = dao.query(Sys_unit.class, Cnd.NEW());
|
||||
List<String> sysUnitIds = sysUnits.stream().map(Sys_unit::getId).toList();
|
||||
|
||||
//信息中心的数据 转为单位代码 ->单位名称 map
|
||||
@@ -139,17 +152,17 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic
|
||||
sysUnit.setUnitLevel(2);
|
||||
return sysUnit;
|
||||
}).toList();
|
||||
ThreadUtil.execAsync(() -> {
|
||||
dao.insert(insertUnits);
|
||||
});
|
||||
dao.insert(insertUnits);
|
||||
|
||||
// 计算设置为会员的人数
|
||||
long memberCount = sysUsers.stream().filter(Sys_user::getMember).count();
|
||||
|
||||
// 6.1 更新提案的校领导角色,发送订阅
|
||||
ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.where("delFlag", "=", false).desc("updatedAt"));
|
||||
for (String unitId : config.getSchoolLeaderUnitIds()) {
|
||||
RoleEventPublisher.broadcast(new RoleEventMsg(unitId, RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name(), RoleEventMsg.RENEW_ROLE));
|
||||
if (config != null && config.getSchoolLeaderUnitIds() != null) {
|
||||
for (String unitId : config.getSchoolLeaderUnitIds()) {
|
||||
RoleEventPublisher.broadcast(new RoleEventMsg(unitId, RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name(), RoleEventMsg.RENEW_ROLE));
|
||||
}
|
||||
}
|
||||
|
||||
return StrUtil.format("增量更新成功,本次更新新入职老师{}人,新增单位{}个,设置为会员{}人。", sysUsers.size(), insertUnits.size(), memberCount);
|
||||
|
||||
@@ -49,6 +49,9 @@ import java.util.stream.Collectors;
|
||||
@Slf4j
|
||||
public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source> implements SysDataUserPullService {
|
||||
|
||||
@Inject
|
||||
private com.budwk.app.base.config.UserSourceDatabase userSourceDatabase;
|
||||
|
||||
@Inject
|
||||
private SysDictService sysDictService;
|
||||
@Inject
|
||||
@@ -110,42 +113,43 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
|
||||
public Date pull() {
|
||||
try {
|
||||
// 中间表数据
|
||||
List<NutMap> userMiddleList = sysDataUnitPullService.listMap(Sqls.create("select * from user_middle"));
|
||||
List<Record> userMiddleList = userSourceDatabase.dao().query("user_middle", Cnd.NEW());
|
||||
|
||||
List<JSONObject> rawDataList = new ArrayList<>();
|
||||
if (!userMiddleList.isEmpty()) {
|
||||
// 先收集所有原始数据
|
||||
rawDataList = userMiddleList.stream().map(v -> JSONUtil.parseObj(JSONUtil.toJsonStr(v))).toList();
|
||||
log.info("数据拉取进度: {}/{}", rawDataList.size(), userMiddleList.size());
|
||||
} else {
|
||||
log.warn("当前未获取到数据");
|
||||
if (userMiddleList.isEmpty()) {
|
||||
throw new BaseException("来源人员中间表为空,本次同步已停止");
|
||||
}
|
||||
log.info("来源人员记录数:{}", userMiddleList.size());
|
||||
|
||||
Date nowDate = new Date();
|
||||
// 与 DATETIME 批次精度保持一致,后续增量更新只消费本次批次。
|
||||
Date nowDate = new Date(System.currentTimeMillis() / 1000 * 1000);
|
||||
|
||||
// 赋值
|
||||
List<Sys_user_source> latestSourceList = rawDataList.stream().map(raw -> {
|
||||
List<Sys_user_source> latestSourceList = userMiddleList.stream().map(raw -> {
|
||||
Sys_user_source sysUser = new Sys_user_source();
|
||||
|
||||
// 使用缓存的字段映射
|
||||
// Record.get 忽略列名大小写;禁止转成普通 JSON 后用大写键读取小写列。
|
||||
for (FieldMapping mapping : getFieldMappings()) {
|
||||
try {
|
||||
// 根据字段类型设置值
|
||||
if (mapping.field.getType() == String.class) {
|
||||
mapping.field.set(sysUser, raw.getStr(mapping.key));
|
||||
mapping.field.set(sysUser, StrUtil.trimToNull(raw.getString(mapping.key)));
|
||||
} else if (mapping.field.getType() == Date.class) {
|
||||
mapping.field.set(sysUser, raw.getDate(mapping.key));
|
||||
mapping.field.set(sysUser, cn.hutool.core.convert.Convert.toDate(raw.get(mapping.key)));
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
log.error("设置字段值失败: {}", mapping.field.getName(), e);
|
||||
throw new BaseException("来源字段映射失败:" + mapping.field.getName());
|
||||
}
|
||||
}
|
||||
|
||||
// 在写入批次前拦截映射异常,不能把空工号批次当成“无新增”成功返回。
|
||||
if (StrUtil.isBlank(sysUser.getLoginname()) || StrUtil.isBlank(sysUser.getUsername())) {
|
||||
throw new BaseException("来源人员工号或姓名为空,请检查 ZGH/XM 字段映射;本批次未写入");
|
||||
}
|
||||
sysUser.setPullTime(nowDate);
|
||||
return sysUser;
|
||||
}).toList();
|
||||
|
||||
log.info("用户数据初始化完成,等待插入,当前数据条数{}", latestSourceList.size());
|
||||
log.info("人员映射校验通过,批次:{},有效人数:{}", DateUtil.formatDateTime(nowDate), latestSourceList.size());
|
||||
// 插入到数据库
|
||||
dao().insert(latestSourceList);
|
||||
// 更新字典数据
|
||||
@@ -162,13 +166,38 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
|
||||
log.info("单位需要更新,正在同步更新");
|
||||
sysDataUnitPullService.updateUnits(unitIds);
|
||||
}
|
||||
// 新批次及关联数据写入成功后,在当前拉取事务内清理过期来源批次。
|
||||
retainLatestPullBatches();
|
||||
return nowDate;
|
||||
} catch (Exception e) {
|
||||
throw new BaseException("数据拉取失败,{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Async
|
||||
/**
|
||||
* 保留最近十个非空 pullTime 对应的完整批次,空时间记录无法归属批次,一并清理。
|
||||
* 无参数、无返回值;由 pull() 在现有事务内调用,清理失败会使本次拉取回滚。
|
||||
* 第十批时间作为严格小于的删除边界,避免误删该批次内的其他人员记录。
|
||||
*/
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
private void retainLatestPullBatches() {
|
||||
Sql sql = Sqls.create("SELECT DISTINCT pullTime FROM sys_user_source "
|
||||
+ "WHERE pullTime IS NOT NULL ORDER BY pullTime DESC LIMIT 1 OFFSET 9");
|
||||
sql.setCallback((conn, rs, sqlObject) -> rs.next() ? rs.getTimestamp("pullTime") : null);
|
||||
dao().execute(sql);
|
||||
Date oldestRetainedTime = sql.getObject(Date.class);
|
||||
|
||||
// 不足十批时没有时间边界,只删除空时间记录;严禁退化为无条件清表。
|
||||
Cnd expired = Cnd.where(Sys_user_source::getPullTime, "IS", null);
|
||||
if (oldestRetainedTime != null) {
|
||||
expired.or(Sys_user_source::getPullTime, "<", oldestRetainedTime);
|
||||
}
|
||||
int deletedRows = dao().clear(Sys_user_source.class, expired);
|
||||
log.info("来源批次清理:保留最近10批,最早保留时间:{},删除记录:{}条(随当前事务提交)",
|
||||
oldestRetainedTime == null ? "不足10批" : DateUtil.formatDateTime(oldestRetainedTime), deletedRows);
|
||||
}
|
||||
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
private void updateDict(List<Sys_user_source> userSources) {
|
||||
//判断是否要更新在职状态字典
|
||||
List<String> sourceUserStates = userSources.stream().map(Sys_user::getUserState).filter(StrUtil::isNotBlank).distinct().toList();
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
package com.budwk.app.sys.services.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.budwk.app.sys.enums.SysDataUpdateMode;
|
||||
import com.budwk.app.sys.models.Sys_task;
|
||||
import com.budwk.app.sys.param.SysDataUserUpdateParam;
|
||||
import com.budwk.app.sys.services.SysDataUserPullService;
|
||||
import com.budwk.app.sys.services.SysTaskService;
|
||||
import com.budwk.app.task.job.SysUserIncrRenewJob;
|
||||
import com.budwk.app.task.services.TaskPlatformService;
|
||||
import org.nutz.aop.interceptor.ioc.TransAop;
|
||||
import org.nutz.dao.Chain;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.ioc.aop.Aop;
|
||||
import org.nutz.ioc.impl.PropertiesProxy;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/** 每日人员同步的编排及任务登记,复用手动拉取与全量更新服务。 */
|
||||
@IocBean
|
||||
@Slf4j
|
||||
public class SysUserDailySyncService {
|
||||
@Inject private SysDataUserPullService sysDataUserPullService;
|
||||
@Inject("refer:sysDataUserAllUpdateServiceImpl")
|
||||
private SysDataUserAllUpdateServiceImpl sysDataUserAllUpdateService;
|
||||
@Inject private SysTaskService sysTaskService;
|
||||
@Inject private TaskPlatformService taskPlatformService;
|
||||
@Inject private PropertiesProxy conf;
|
||||
|
||||
/** 无参数;返回本批次新增统计。拉取失败时抛出异常,不消费历史批次。 */
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public String sync() {
|
||||
Date pullTime = sysDataUserPullService.pull();
|
||||
log.info("人员拉取完成,开始全量更新,批次:{}", DateUtil.formatDateTime(pullTime));
|
||||
SysDataUserUpdateParam param = new SysDataUserUpdateParam();
|
||||
param.setPullTime(DateUtil.formatDateTime(pullTime));
|
||||
param.setUpdateMode(SysDataUpdateMode.ALL.name());
|
||||
return sysDataUserAllUpdateService.update(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动时复用同执行类的真实任务 ID;旧增量任务只更新名称说明,保留页面设置的执行时间。
|
||||
* 重复的历史任务保留记录但禁用;后续重启保留页面设置的时间和禁用状态。
|
||||
*/
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void register() {
|
||||
if (!conf.getBoolean("user-source.sync.enabled", false)) {
|
||||
return;
|
||||
}
|
||||
String jobClass = SysUserIncrRenewJob.class.getName();
|
||||
List<Sys_task> tasks = sysTaskService.query(Cnd.where("jobClass", "=", jobClass)
|
||||
.asc("disabled").asc("createdAt").asc("id"));
|
||||
String name = "每日人员拉取及全量更新";
|
||||
String cron = conf.get("user-source.sync.cron", "0 0 17 * * ?");
|
||||
String note = "从推送库全量同步;按在职状态及人员类型同步会员身份和会员角色";
|
||||
Sys_task task;
|
||||
if (tasks.isEmpty()) {
|
||||
task = new Sys_task();
|
||||
task.setName(name);
|
||||
task.setJobClass(jobClass);
|
||||
task.setCron(cron);
|
||||
task.setNote(note);
|
||||
task.setData("{}");
|
||||
task.setDisabled(false);
|
||||
// Sys_task 插入时自动生成 UUID,必须使用返回的真实 ID 注册和记录执行结果。
|
||||
task = sysTaskService.insert(task);
|
||||
} else {
|
||||
task = tasks.get(0);
|
||||
if ("每日人员拉取及增量新增".equals(task.getName()) || name.equals(task.getName())) {
|
||||
task.setName(name);
|
||||
task.setNote(note);
|
||||
sysTaskService.update(Chain.make("name", name).add("note", note),
|
||||
Cnd.where("id", "=", task.getId()));
|
||||
}
|
||||
// 兼容旧版本重启生成的重复任务,不删除用户可追溯的任务记录。
|
||||
for (int i = 1; i < tasks.size(); i++) {
|
||||
Sys_task duplicate = tasks.get(i);
|
||||
sysTaskService.update(Chain.make("disabled", true), Cnd.where("id", "=", duplicate.getId()));
|
||||
if (taskPlatformService.isExist(duplicate.getId(), duplicate.getId())) {
|
||||
taskPlatformService.delete(duplicate.getId(), duplicate.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
String legacyId = "sys-user-daily-incr-sync";
|
||||
if (taskPlatformService.isExist(legacyId, legacyId)) {
|
||||
taskPlatformService.delete(legacyId, legacyId);
|
||||
}
|
||||
String id = task.getId();
|
||||
// 使用数据库保存的 Cron 重建调度;配置默认值只用于首次创建,不覆盖页面设置。
|
||||
if (taskPlatformService.isExist(id, id)) {
|
||||
taskPlatformService.delete(id, id);
|
||||
}
|
||||
if (!task.isDisabled()) {
|
||||
taskPlatformService.add(id, id, task.getJobClass(), task.getCron(), task.getNote(), task.getData());
|
||||
}
|
||||
log.info("人员全量同步任务就绪,任务ID:{},Cron:{},禁用:{},JVM时区:{}",
|
||||
id, task.getCron(), task.isDisabled(), java.util.TimeZone.getDefault().getID());
|
||||
}
|
||||
|
||||
/** taskId 为调度任务主键,result 为统计或失败说明;结果显示在系统任务列表。 */
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void recordResult(String taskId, String result) {
|
||||
sysTaskService.update(Chain.make("exeAt", System.currentTimeMillis() / 1000)
|
||||
.add("exeResult", result), Cnd.where("id", "=", taskId));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.budwk.app.task.job;
|
||||
|
||||
import com.budwk.app.sys.services.impl.SysUserDailySyncService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.quartz.*;
|
||||
|
||||
/** 每天拉取推送库并全量更新;保留原类名以兼容线上已有任务记录。 */
|
||||
@IocBean
|
||||
@Slf4j
|
||||
@DisallowConcurrentExecution
|
||||
public class SysUserIncrRenewJob implements Job {
|
||||
@Inject
|
||||
private SysUserDailySyncService sysUserDailySyncService;
|
||||
|
||||
/** Quartz 上下文提供任务 ID;失败交由调度器记录,不立即循环重试。 */
|
||||
@Override
|
||||
public void execute(JobExecutionContext context) throws JobExecutionException {
|
||||
String taskId = context.getJobDetail().getKey().getName();
|
||||
long startTime = System.currentTimeMillis();
|
||||
log.info("每日人员全量同步开始,任务ID:{}", taskId);
|
||||
try {
|
||||
String result = sysUserDailySyncService.sync();
|
||||
sysUserDailySyncService.recordResult(taskId, result);
|
||||
log.info("每日人员同步完成,任务ID:{},耗时:{}ms,{}", taskId, System.currentTimeMillis() - startTime, result);
|
||||
} catch (Exception e) {
|
||||
log.error("每日人员同步失败,任务ID:" + taskId, e);
|
||||
// 记录结果失败不能掩盖最初的同步异常。
|
||||
try {
|
||||
sysUserDailySyncService.recordResult(taskId, "人员同步失败,请检查来源连接、数据及应用日志。");
|
||||
} catch (Exception recordError) {
|
||||
log.error("同步失败结果写入失败,任务ID:" + taskId, recordError);
|
||||
}
|
||||
throw new JobExecutionException("每日人员同步失败", e, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -223,7 +223,8 @@ public class ActivityDeclareMineController {
|
||||
});
|
||||
|
||||
// 协会负责人审核
|
||||
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
|
||||
// 同时识别历史与新版节点名称,确保导出保留两种流程版本的负责人审批意见。
|
||||
doneTaskVos.stream().filter(task -> ("协会负责人审核".equals(task.getDisplayName()) || "俱乐部负责人审核".equals(task.getDisplayName())))
|
||||
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
|
||||
.ifPresent(v -> {
|
||||
Dict taskFormData = v.getTaskFormData();
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ public enum ActivityDeclareReimbursement {
|
||||
/**
|
||||
* 协会
|
||||
*/
|
||||
CLUB("协会活动");
|
||||
CLUB("俱乐部活动");
|
||||
|
||||
private final String typeName;
|
||||
}
|
||||
|
||||
+4
-4
@@ -110,7 +110,7 @@ public class ActivityReimbursementBoardController {
|
||||
|
||||
list.add(new NutMap() {{
|
||||
put("year", year);
|
||||
put("type", "社团活动");
|
||||
put("type", "俱乐部活动");
|
||||
put("num", activityReimbursementService.count(sql.setParam("type", "ACTIVITY_BUDGET_TYPE_THREE").setParam("year", year)));
|
||||
}});
|
||||
}
|
||||
@@ -145,7 +145,7 @@ public class ActivityReimbursementBoardController {
|
||||
put("num", activityReimbursementService.count(sql.setParam("type", "ACTIVITY_BUDGET_TYPE_TWO")));
|
||||
}});
|
||||
list.add(new NutMap() {{
|
||||
put("type", "社团活动");
|
||||
put("type", "俱乐部活动");
|
||||
put("num", activityReimbursementService.count(sql.setParam("type", "ACTIVITY_BUDGET_TYPE_THREE")));
|
||||
}});
|
||||
return Result.success(list);
|
||||
@@ -191,7 +191,7 @@ public class ActivityReimbursementBoardController {
|
||||
|
||||
list.add(new NutMap() {{
|
||||
put("year", year);
|
||||
put("type", "社团费用");
|
||||
put("type", "俱乐部费用");
|
||||
put("num", activityReimbursementService.list(sql.setParam("type", "ACTIVITY_BUDGET_TYPE_THREE").setParam("year", year)).get(0).getDouble("money"));
|
||||
}});
|
||||
}
|
||||
@@ -218,7 +218,7 @@ public class ActivityReimbursementBoardController {
|
||||
put("num", activityReimbursementService.count(unionSql));
|
||||
}});
|
||||
list.add(new NutMap() {{
|
||||
put("type", "社团费用");
|
||||
put("type", "俱乐部费用");
|
||||
put("num", activityReimbursementService.count(clubSql));
|
||||
}});
|
||||
return Result.success().addData(list);
|
||||
|
||||
+2
-1
@@ -325,7 +325,8 @@ public class ActivityReimbursementMineController {
|
||||
});
|
||||
|
||||
// 协会负责人审核
|
||||
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
|
||||
// 同时识别历史与新版节点名称,确保导出保留两种流程版本的负责人审批意见。
|
||||
doneTaskVos.stream().filter(task -> ("协会负责人审核".equals(task.getDisplayName()) || "俱乐部负责人审核".equals(task.getDisplayName())))
|
||||
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
|
||||
.ifPresent(v -> {
|
||||
Dict taskFormData = v.getTaskFormData();
|
||||
|
||||
+2
-2
@@ -123,7 +123,7 @@ public class ClubUserJoinApplyController {
|
||||
if (ObjectUtil.isNotEmpty(userApply) && StrUtil.isBlank(userApply.getId())) {
|
||||
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
|
||||
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
|
||||
return Result.error("您有该协会的申请记录尚未完成,请到我的申请里查看!");
|
||||
return Result.error("您有该俱乐部的申请记录尚未完成,请到我的申请里查看!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,7 +178,7 @@ public class ClubUserJoinApplyController {
|
||||
|
||||
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
|
||||
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
|
||||
return Result.error(99, "您有该协会的申请记录尚未完成,请到我的申请里查看!");
|
||||
return Result.error(99, "您有该俱乐部的申请记录尚未完成,请到我的申请里查看!");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
+5
-5
@@ -69,7 +69,7 @@ public class ClubExamineApplyController {
|
||||
@SaCheckLogin
|
||||
public Result getCount(String id, Integer year) {
|
||||
if(StrUtil.isBlank(id)) {
|
||||
return Result.error("协会信息为空,请核查");
|
||||
return Result.error("俱乐部信息为空,请核查");
|
||||
}
|
||||
if(year == null) {
|
||||
return Result.error("年份信息为空,请核查");
|
||||
@@ -94,7 +94,7 @@ public class ClubExamineApplyController {
|
||||
@SaCheckLogin
|
||||
public Result getClubUserNum(String clubId) {
|
||||
if(StrUtil.isBlank(clubId)) {
|
||||
return Result.error("协会信息为空,请核查");
|
||||
return Result.error("俱乐部信息为空,请核查");
|
||||
}
|
||||
List<NutMap> result = sysClubExamineService.getClubUserNum(clubId);
|
||||
return Result.success(result);
|
||||
@@ -104,7 +104,7 @@ public class ClubExamineApplyController {
|
||||
@SaCheckLogin
|
||||
public Result getJgUser(String clubId) {
|
||||
if(StrUtil.isBlank(clubId)) {
|
||||
return Result.error("协会信息为空,请核查");
|
||||
return Result.error("俱乐部信息为空,请核查");
|
||||
}
|
||||
List<NutMap> result = sysClubExamineService.getJgUser(clubId);
|
||||
return Result.success(result);
|
||||
@@ -114,7 +114,7 @@ public class ClubExamineApplyController {
|
||||
@SaCheckLogin
|
||||
public Result getClubMemberMoney(String clubId) {
|
||||
if(StrUtil.isBlank(clubId)) {
|
||||
return Result.error("协会信息为空,请核查");
|
||||
return Result.error("俱乐部信息为空,请核查");
|
||||
}
|
||||
int count = dao.count(ClubUser.class, Cnd.where("clubId", "=", clubId));
|
||||
SysClub club = dao.fetch(SysClub.class, clubId);
|
||||
@@ -134,7 +134,7 @@ public class ClubExamineApplyController {
|
||||
@SaCheckLogin
|
||||
public Result getLasYearSurplus(String clubId) {
|
||||
if(StrUtil.isBlank(clubId)) {
|
||||
return Result.error("协会信息为空,请核查");
|
||||
return Result.error("俱乐部信息为空,请核查");
|
||||
}
|
||||
SysClubExamineRegister register = dao.fetch(SysClubExamineRegister.class, Cnd.where("clubId", "=", clubId)
|
||||
.and("YEAR(registerDate)", "=", DateUtil.thisYear() - 1));
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ public class ClubExamineMineController {
|
||||
.bind("activityQk", activityQk).build();
|
||||
|
||||
try {
|
||||
String fileName = Globals.MyConfig.getString("AppName") + "教职工社团年度考核登记表";
|
||||
String fileName = Globals.MyConfig.getString("AppName") + "教职工俱乐部年度考核登记表";
|
||||
response.addHeader("Content-Type", "application/octet-stream");
|
||||
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
|
||||
XWPFTemplate.compile(officeTemplateUtil.getPath("club_examine_register"), config).render(map).writeAndClose(response.getOutputStream());
|
||||
|
||||
+19
-9
@@ -3,7 +3,11 @@ package com.budwk.app.zhgh.club.controller.infoManage;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
||||
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
||||
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
||||
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import com.budwk.app.base.annotation.SLog;
|
||||
import com.budwk.app.base.constant.RoleConstant;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
@@ -52,7 +56,6 @@ import org.nutz.mvc.upload.UploadAdaptor;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -277,7 +280,7 @@ public class ClubInfoManageController {
|
||||
int count = clubInfoManageService.dao().count(ClubUser.class, Cnd.where("clubId", "=", clubId)
|
||||
.and(new Static("JSON_CONTAINS(roleCode, '\"%s\"')".formatted(roleCode))));
|
||||
if (count > 0) {
|
||||
return Result.error((Objects.equals(roleCode, RoleConstant.CLUB_MANAGER.name()) ? "协会负责人" : "秘书长") + "只能有一位");
|
||||
return Result.error((Objects.equals(roleCode, RoleConstant.CLUB_MANAGER.name()) ? "俱乐部负责人" : "秘书长") + "只能有一位");
|
||||
}
|
||||
}
|
||||
Sys_role sysRole = sysRoleService.getByCode(roleCode);
|
||||
@@ -315,6 +318,7 @@ public class ClubInfoManageController {
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
@SaCheckPermission("club.infoManage.manage")
|
||||
@ApiOperation("导出登记表")
|
||||
public void exportRegistrationDoc(@Valid String clubId, HttpServletResponse response){
|
||||
@@ -325,11 +329,17 @@ public class ClubInfoManageController {
|
||||
@Ok("void")
|
||||
@SaCheckPermission("club.infoManage.manage")
|
||||
public void downloadUserImport(HttpServletResponse response) {
|
||||
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();){
|
||||
EasyExcel.write(byteArrayOutputStream, ClubUserImportVo.class)
|
||||
.sheet("协会会员导入模版")
|
||||
.doWrite(ArrayList::new);
|
||||
CommonDownloadUtil.download("协会会员导入模版.xlsx", byteArrayOutputStream.toByteArray() ,response);
|
||||
// 模板保留工号、姓名两列及一行表头,兼容原有从第2行开始的导入逻辑。
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
exportParams.setSheetName("俱乐部会员导入模版");
|
||||
exportParams.setAddIndex(false);
|
||||
List<ExcelExportEntity> columns = Arrays.asList(
|
||||
new ExcelExportEntity("工号", "loginname", 25),
|
||||
new ExcelExportEntity("姓名", "username", 25));
|
||||
try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, columns, Collections.emptyList())) {
|
||||
workbook.getSheetAt(0).getRow(0).setHeightInPoints(20);
|
||||
CommonDownloadUtil.download("俱乐部会员导入模版.xlsx", workbook, response);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -360,7 +370,7 @@ public class ClubInfoManageController {
|
||||
continue;
|
||||
}
|
||||
if (clubUsers.stream().anyMatch(s -> s.getUserId().equals(user.getId()))) {
|
||||
v.setErrorInfo("该用户已加入该协会");
|
||||
v.setErrorInfo("该用户已加入该俱乐部");
|
||||
errorInfos.add(v);
|
||||
continue;
|
||||
}
|
||||
|
||||
+1
-1
@@ -129,7 +129,7 @@ public class ClubRefreshReportController {
|
||||
List<String> idList = list.stream().map(SysClubRefresh::getId).toList();
|
||||
int count = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", idList).and(ProcessInstance::getState, "not in", List.of(ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.REJECT.getCode())));
|
||||
if (count > 0) {
|
||||
return Result.error("您有该协会的申请记录尚未完成,请核对!");
|
||||
return Result.error("您有该俱乐部的申请记录尚未完成,请核对!");
|
||||
}
|
||||
|
||||
SysClub club = clubInfoManageService.dao().fetch(SysClub.class, clubRefresh.getClubId());
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ public class ClubRuleUpdateController {
|
||||
List<String> idList = list.stream().map(SysClubRule::getId).toList();
|
||||
int count = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", idList).and(ProcessInstance::getState, "not in", List.of(ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.REJECT.getCode())));
|
||||
if (count > 0) {
|
||||
return Result.error("您有该协会的申请记录尚未完成,请核对!");
|
||||
return Result.error("您有该俱乐部的申请记录尚未完成,请核对!");
|
||||
}
|
||||
|
||||
SysClub club = clubInfoManageService.dao().fetch(SysClub.class, clubRule.getClubId());
|
||||
|
||||
+3
-3
@@ -268,9 +268,9 @@ public class ClubStatisticsController {
|
||||
List<NutMap> list = sysClubService.listMap(sql);
|
||||
|
||||
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
||||
exportEntities.add(new ExcelExportEntity("社团名称", "clubName", 20));
|
||||
exportEntities.add(new ExcelExportEntity("俱乐部名称", "clubName", 20));
|
||||
exportEntities.add(new ExcelExportEntity("编码", "clubCode", 20));
|
||||
exportEntities.add(new ExcelExportEntity("社团总人数", "total", 20));
|
||||
exportEntities.add(new ExcelExportEntity("俱乐部总人数", "total", 20));
|
||||
exportEntities.add(new ExcelExportEntity("在职人数", "work", 20));
|
||||
exportEntities.add(new ExcelExportEntity("退休人数", "retire", 20));
|
||||
exportEntities.add(new ExcelExportEntity("男", "man", 20));
|
||||
@@ -279,7 +279,7 @@ public class ClubStatisticsController {
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
|
||||
CommonDownloadUtil.download("协会统计表.xlsx", workbook, response);
|
||||
CommonDownloadUtil.download("俱乐部统计表.xlsx", workbook, response);
|
||||
}
|
||||
|
||||
@At
|
||||
|
||||
@@ -34,19 +34,19 @@ public class SysClub extends BaseModel {
|
||||
@Column
|
||||
@Comment("协会名称")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 100)
|
||||
@NotEmpty(message = "协会名称不能为空")
|
||||
@NotEmpty(message = "俱乐部名称不能为空")
|
||||
private String clubName;
|
||||
|
||||
@Column
|
||||
@Comment("协会编码")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 100)
|
||||
@NotEmpty(message = "协会编码不能为空")
|
||||
@NotEmpty(message = "俱乐部编码不能为空")
|
||||
private String clubCode;
|
||||
|
||||
@Column
|
||||
@Comment("协会类型")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 30)
|
||||
@NotEmpty(message = "协会类型不能为空")
|
||||
@NotEmpty(message = "俱乐部类型不能为空")
|
||||
private String clubType;
|
||||
|
||||
@Column
|
||||
|
||||
@@ -34,7 +34,7 @@ public class SysClubEvaluate extends BaseModel {
|
||||
@Column
|
||||
@Comment("协会id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@NotEmpty(message = "协会id不能为空")
|
||||
@NotEmpty(message = "俱乐部id不能为空")
|
||||
private String clubId;
|
||||
|
||||
@Column
|
||||
|
||||
@@ -31,7 +31,7 @@ public class SysClubSponsor extends BaseModel {
|
||||
@Column
|
||||
@Comment("协会id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@NotEmpty(message = "协会不能为空")
|
||||
@NotEmpty(message = "俱乐部不能为空")
|
||||
private String clubId;
|
||||
|
||||
@Column
|
||||
|
||||
+1
-1
@@ -317,7 +317,7 @@ public class SysClubInfoManageServiceImpl extends BaseServiceImpl<ClubCommonPage
|
||||
|
||||
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
|
||||
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("clubRegis"), config).render(docData).writeAndClose(byteArrayOutputStream);
|
||||
CommonDownloadUtil.download("教职工文体协会登记表(" + clubInfo.getString("clubName") + ").docx", byteArrayOutputStream.toByteArray(), response);
|
||||
CommonDownloadUtil.download("教职工文体俱乐部登记表(" + clubInfo.getString("clubName") + ").docx", byteArrayOutputStream.toByteArray(), response);
|
||||
} catch (IOException e) {
|
||||
log.error("协会登记表导出失败,id:{},错误信息:{}", clubId, e.getMessage());
|
||||
}
|
||||
|
||||
+1
-1
@@ -93,7 +93,7 @@ public class ArticleAnalysisController {
|
||||
// 获取参与协会数量
|
||||
long clubCount = articleService.count(Sqls.create("SELECT COUNT(distinct clubId) FROM article WHERE clubId IS NOT NULL"));
|
||||
list.add(ArticleAnalysisOverviewVO.builder()
|
||||
.label("参与协会")
|
||||
.label("参与俱乐部")
|
||||
.value(clubCount)
|
||||
.icon("el-icon-office-building")
|
||||
.bgColor("rgba(230, 162, 60, 0.1)")
|
||||
|
||||
+1
-1
@@ -140,7 +140,7 @@ public class ArticleFirstExamineController {
|
||||
} else if (result.equals("BACK_TO_CLUB")) {
|
||||
String branchClubApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.CLUB_MANAGER, Cnd.where(Sys_user_role::getClubId, "=", article.getClubId()));
|
||||
if (StrUtil.isBlank(branchClubApprovalLoginName)) {
|
||||
return Result.error("协会未配置审批人,请联系协会!");
|
||||
return Result.error("俱乐部未配置审批人,请联系俱乐部!");
|
||||
}
|
||||
assignments.add(branchClubApprovalLoginName);
|
||||
} else if (result.equals("PASS")) {
|
||||
|
||||
@@ -133,7 +133,7 @@ public class UnionCareDataCon {
|
||||
double totalBudgetMoney3 = mapList3.stream().mapToDouble(map -> map.getDouble("totalBudgetMoney")).sum();
|
||||
list.add(new HashMap<String, Object>() {{
|
||||
put("year", year);
|
||||
put("type", "协会经费");
|
||||
put("type", "俱乐部经费");
|
||||
put("value", totalBudgetMoney3);
|
||||
}});
|
||||
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ public class ActivityBudgetQueryStatisticsController {
|
||||
entities.add(new ExcelExportEntity("分工会", "unionName", 20));
|
||||
}else if (outlayManageSource.equals("ACTIVITY_BUDGET_TYPE_THREE")) {
|
||||
entities.add(new ExcelExportEntity("编码", "clubCode", 20));
|
||||
entities.add(new ExcelExportEntity("协会名称", "clubName", 20));
|
||||
entities.add(new ExcelExportEntity("俱乐部名称", "clubName", 20));
|
||||
}
|
||||
ExcelExportEntity draftCodeEntity = new ExcelExportEntity("预算金额", "totalBudgetMoney", 20);
|
||||
draftCodeEntity.setType(10);
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ public class ActivityBudgetTemp extends ExcelImportError {
|
||||
@ExcelProperty("审核意见")
|
||||
private String auditOpinion;
|
||||
|
||||
@ExcelProperty("申报单位(仅社团申报时可在下拉菜单中选择,其他类型不用填写)")
|
||||
@ExcelProperty("申报单位(仅俱乐部申报时可在下拉菜单中选择,其他类型不用填写)")
|
||||
private String helpUnitName;
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -137,7 +137,7 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl<SiteCugApply> imple
|
||||
ins.id AS instanceId,
|
||||
ins.processDefineId instanceProcessDefineId,
|
||||
CASE WHEN info.backOption LIKE 'YEARLY_BATCH:%' THEN 1 ELSE 0 END AS yearlyBatch,
|
||||
CASE WHEN info.reserveType = 'club' THEN '协会预约' ELSE '分工会预约' END AS reserveTypeName,
|
||||
CASE WHEN info.reserveType = 'club' THEN '俱乐部预约' ELSE '分工会预约' END AS reserveTypeName,
|
||||
CASE WHEN info.reserveType = 'club' THEN info.clubName ELSE info.applyUnionName END AS reserveTargetName,
|
||||
DATE_FORMAT(info.createdAt, '%Y-%m-%d %H:%i:%s') AS applyTime
|
||||
FROM
|
||||
@@ -298,7 +298,7 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl<SiteCugApply> imple
|
||||
}
|
||||
if (StrUtil.equals(apply.getReserveType(), "club")) {
|
||||
if (StrUtil.isBlank(apply.getClubId())) {
|
||||
return Map.of(false, "请选择协会");
|
||||
return Map.of(false, "请选择俱乐部");
|
||||
}
|
||||
// 协会预约直接复用项目现成能力;getMyManageClub() 对 SYSADMIN 已放开,因此超级管理员也能代任意协会预约
|
||||
List<SysClub> myManageClub = sysClubService.getMyManageClub();
|
||||
@@ -307,7 +307,7 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl<SiteCugApply> imple
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (club == null) {
|
||||
return Map.of(false, "所选协会不是您当前管理的协会");
|
||||
return Map.of(false, "所选俱乐部不是您当前管理的俱乐部");
|
||||
}
|
||||
apply.setClubName(club.getClubName());
|
||||
apply.setApplyUnionId("");
|
||||
|
||||
+1
-1
@@ -224,7 +224,7 @@ public class UnionReimburseApplyController {
|
||||
public Result getClubBudget(@Param("clubId") String clubId) {
|
||||
// 检查clubId参数是否为空
|
||||
if (StrUtil.isBlank(clubId)) {
|
||||
return Result.error("社团ID不能为空");
|
||||
return Result.error("俱乐部ID不能为空");
|
||||
}
|
||||
// 根据社团ID和年份查询特定社团的经费信息
|
||||
OutlayManageClub outlayManageClub = dao.fetch(OutlayManageClub.class,
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
-- 初始化“基层干部”角色,并修复误从角色管理页直接添加的历史分工会干部角色。
|
||||
-- 修复对象仅限:BRANCH_UNION_ROLES 的直接子角色、unionId 为空、且其他业务作用域均为空的 sys_user_role 记录。
|
||||
-- 人员当前所属分工会以 vw_user.unionId 为准;已有非空 unionId 的角色和已有干部档案均不改写。
|
||||
-- 历史修复不补建审核流程。
|
||||
|
||||
SET @now := CAST(UNIX_TIMESTAMP(NOW()) * 1000 AS UNSIGNED);
|
||||
|
||||
START TRANSACTION;
|
||||
|
||||
-- 一、初始化“基层干部”角色。
|
||||
INSERT INTO `sys_role`
|
||||
(`id`, `name`, `code`, `aliasName`, `disabled`, `unitid`, `note`, `sort`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
|
||||
SELECT
|
||||
'c1d5a6e7b8f94032a1b2c3d4e5f60718', '基层干部', 'BRANCH_UNION_CADRE', 'BranchUnionCadre',
|
||||
0, NULL, '分工会干部统一身份角色', 50, '', @now, '', @now, 0
|
||||
FROM DUAL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_role`
|
||||
WHERE `code` = 'BRANCH_UNION_CADRE'
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `tmp_role_manager_branch_cadre`;
|
||||
|
||||
-- 二、识别角色管理页直接添加的分工会干部角色。
|
||||
-- 角色管理页只写 roleId、userId,因此这里以 unionId 和其他业务作用域均为空作为历史数据识别条件。
|
||||
CREATE TEMPORARY TABLE `tmp_role_manager_branch_cadre` AS
|
||||
SELECT DISTINCT
|
||||
assigned_role.`roleId`,
|
||||
assigned_role.`userId`,
|
||||
business_role.`code` AS `roleCode`,
|
||||
user_info.`unionId`,
|
||||
branch_union.`name` AS `unionName`,
|
||||
user_info.`username`,
|
||||
user_info.`loginname`,
|
||||
user_info.`mobile`
|
||||
FROM `sys_user_role` assigned_role
|
||||
INNER JOIN `sys_role` business_role
|
||||
ON business_role.`id` = assigned_role.`roleId`
|
||||
INNER JOIN `sys_dict` branch_role_parent
|
||||
ON branch_role_parent.`code` = 'BRANCH_UNION_ROLES'
|
||||
INNER JOIN `sys_dict` branch_role_item
|
||||
ON branch_role_item.`parentId` = branch_role_parent.`id`
|
||||
AND branch_role_item.`code` = business_role.`code`
|
||||
INNER JOIN `vw_user` user_info
|
||||
ON user_info.`id` = assigned_role.`userId`
|
||||
INNER JOIN `sys_union` branch_union
|
||||
ON branch_union.`id` = user_info.`unionId`
|
||||
WHERE (assigned_role.`unionId` IS NULL OR assigned_role.`unionId` = '')
|
||||
AND (assigned_role.`unitId` IS NULL OR assigned_role.`unitId` = '')
|
||||
AND (assigned_role.`unionGroupId` IS NULL OR assigned_role.`unionGroupId` = '')
|
||||
AND (assigned_role.`tcDelegationId` IS NULL OR assigned_role.`tcDelegationId` = '')
|
||||
AND (assigned_role.`tcSessionId` IS NULL OR assigned_role.`tcSessionId` = '')
|
||||
AND (assigned_role.`wcDelegationId` IS NULL OR assigned_role.`wcDelegationId` = '')
|
||||
AND (assigned_role.`wcSessionId` IS NULL OR assigned_role.`wcSessionId` = '')
|
||||
AND (assigned_role.`clubId` IS NULL OR assigned_role.`clubId` = '')
|
||||
AND (assigned_role.`underTakeId` IS NULL OR assigned_role.`underTakeId` = '');
|
||||
|
||||
-- 将误从角色管理页添加的角色补成当前所属分工会的作用域角色。
|
||||
INSERT INTO `sys_user_role` (`roleId`, `userId`, `unionId`)
|
||||
SELECT
|
||||
repair.`roleId`, repair.`userId`, repair.`unionId`
|
||||
FROM `tmp_role_manager_branch_cadre` repair
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_user_role` existing_role
|
||||
WHERE existing_role.`roleId` = repair.`roleId`
|
||||
AND existing_role.`userId` = repair.`userId`
|
||||
AND existing_role.`unionId` = repair.`unionId`
|
||||
);
|
||||
|
||||
-- 确认分工会作用域角色存在后,删除同人员、同角色的原空作用域记录。
|
||||
DELETE global_role
|
||||
FROM `sys_user_role` global_role
|
||||
INNER JOIN `tmp_role_manager_branch_cadre` repair
|
||||
ON repair.`roleId` = global_role.`roleId`
|
||||
AND repair.`userId` = global_role.`userId`
|
||||
INNER JOIN `sys_user_role` scoped_role
|
||||
ON scoped_role.`roleId` = repair.`roleId`
|
||||
AND scoped_role.`userId` = repair.`userId`
|
||||
AND scoped_role.`unionId` = repair.`unionId`
|
||||
WHERE (global_role.`unionId` IS NULL OR global_role.`unionId` = '')
|
||||
AND (global_role.`unitId` IS NULL OR global_role.`unitId` = '')
|
||||
AND (global_role.`unionGroupId` IS NULL OR global_role.`unionGroupId` = '')
|
||||
AND (global_role.`tcDelegationId` IS NULL OR global_role.`tcDelegationId` = '')
|
||||
AND (global_role.`tcSessionId` IS NULL OR global_role.`tcSessionId` = '')
|
||||
AND (global_role.`wcDelegationId` IS NULL OR global_role.`wcDelegationId` = '')
|
||||
AND (global_role.`wcSessionId` IS NULL OR global_role.`wcSessionId` = '')
|
||||
AND (global_role.`clubId` IS NULL OR global_role.`clubId` = '')
|
||||
AND (global_role.`underTakeId` IS NULL OR global_role.`underTakeId` = '');
|
||||
|
||||
-- 角色管理页不会创建干部档案,为本次识别出的历史数据补建有效干部档案。
|
||||
INSERT INTO `sys_union_cadre`
|
||||
(`id`, `unionId`, `unionName`, `userId`, `userName`, `loginName`, `mobile`, `roleCode`, `applyDate`, `isJoin`,
|
||||
`createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
|
||||
SELECT
|
||||
LOWER(REPLACE(UUID(), '-', '')),
|
||||
repair.`unionId`,
|
||||
repair.`unionName`,
|
||||
repair.`userId`,
|
||||
repair.`username`,
|
||||
repair.`loginname`,
|
||||
repair.`mobile`,
|
||||
repair.`roleCode`,
|
||||
NOW(),
|
||||
1,
|
||||
'', @now, '', @now, 0
|
||||
FROM `tmp_role_manager_branch_cadre` repair
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_union_cadre` existing_cadre
|
||||
WHERE existing_cadre.`userId` = repair.`userId`
|
||||
AND existing_cadre.`unionId` = repair.`unionId`
|
||||
AND existing_cadre.`roleCode` = repair.`roleCode`
|
||||
AND (existing_cadre.`isJoin` = 1 OR existing_cadre.`isJoin` IS NULL)
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `tmp_valid_branch_cadre`;
|
||||
|
||||
-- 三、汇总当前分工会范围内已经生效的干部角色,用于初始化“基层干部”角色。
|
||||
CREATE TEMPORARY TABLE `tmp_valid_branch_cadre` AS
|
||||
SELECT DISTINCT
|
||||
assigned_role.`userId`,
|
||||
assigned_role.`unionId`
|
||||
FROM `sys_user_role` assigned_role
|
||||
INNER JOIN `sys_role` business_role
|
||||
ON business_role.`id` = assigned_role.`roleId`
|
||||
INNER JOIN `sys_dict` branch_role_parent
|
||||
ON branch_role_parent.`code` = 'BRANCH_UNION_ROLES'
|
||||
INNER JOIN `sys_dict` branch_role_item
|
||||
ON branch_role_item.`parentId` = branch_role_parent.`id`
|
||||
AND branch_role_item.`code` = business_role.`code`
|
||||
INNER JOIN `vw_user` user_info
|
||||
ON user_info.`id` = assigned_role.`userId`
|
||||
INNER JOIN `sys_union` branch_union
|
||||
ON branch_union.`id` = assigned_role.`unionId`
|
||||
WHERE assigned_role.`userId` IS NOT NULL
|
||||
AND assigned_role.`unionId` IS NOT NULL
|
||||
AND assigned_role.`unionId` <> ''
|
||||
AND assigned_role.`unionId` = user_info.`unionId`
|
||||
AND (assigned_role.`unitId` IS NULL OR assigned_role.`unitId` = '')
|
||||
AND (assigned_role.`unionGroupId` IS NULL OR assigned_role.`unionGroupId` = '')
|
||||
AND (assigned_role.`tcDelegationId` IS NULL OR assigned_role.`tcDelegationId` = '')
|
||||
AND (assigned_role.`tcSessionId` IS NULL OR assigned_role.`tcSessionId` = '')
|
||||
AND (assigned_role.`wcDelegationId` IS NULL OR assigned_role.`wcDelegationId` = '')
|
||||
AND (assigned_role.`wcSessionId` IS NULL OR assigned_role.`wcSessionId` = '')
|
||||
AND (assigned_role.`clubId` IS NULL OR assigned_role.`clubId` = '')
|
||||
AND (assigned_role.`underTakeId` IS NULL OR assigned_role.`underTakeId` = '');
|
||||
|
||||
-- 给现有有效分工会干部及本次修复的干部补充同分工会范围的“基层干部”角色。
|
||||
INSERT INTO `sys_user_role` (`roleId`, `userId`, `unionId`)
|
||||
SELECT
|
||||
cadre_role.`id`, valid_cadre.`userId`, valid_cadre.`unionId`
|
||||
FROM `tmp_valid_branch_cadre` valid_cadre
|
||||
INNER JOIN `sys_role` cadre_role
|
||||
ON cadre_role.`code` = 'BRANCH_UNION_CADRE'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_user_role` existing_cadre_role
|
||||
WHERE existing_cadre_role.`roleId` = cadre_role.`id`
|
||||
AND existing_cadre_role.`userId` = valid_cadre.`userId`
|
||||
AND existing_cadre_role.`unionId` = valid_cadre.`unionId`
|
||||
);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `tmp_valid_branch_cadre`;
|
||||
DROP TEMPORARY TABLE IF EXISTS `tmp_role_manager_branch_cadre`;
|
||||
|
||||
COMMIT;
|
||||
@@ -73,7 +73,17 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
</div>
|
||||
|
||||
<div class="" style="padding-bottom: 20px">
|
||||
<user></user>
|
||||
<!-- 用户资料只在 HTML 中由 Beetl 渲染,避免与 JS 模板字符串的插值语法冲突。 -->
|
||||
<user
|
||||
user-name="${@auth.getPrincipalProperty('username'),escape}"
|
||||
login-name="${@auth.getPrincipalProperty('loginname'),escape}"
|
||||
<!--#if(!isEmpty(@auth.getPrincipalProperty('unit'))){#-->
|
||||
unit-name="${@auth.getPrincipalProperty('unit').getName(),escape}"
|
||||
<!--#}#-->
|
||||
<!--#if(!isEmpty(@auth.getPrincipalProperty('union'))){#-->
|
||||
union-name="${@auth.getPrincipalProperty('union').getName(),escape}"
|
||||
<!--#}#-->
|
||||
></user>
|
||||
|
||||
<div class="home-grid">
|
||||
<div class="act-card">
|
||||
|
||||
@@ -6,14 +6,14 @@ const user = {
|
||||
<!-- 左侧:用户信息卡片 -->
|
||||
<div class="user-info-card">
|
||||
<div class="user-details">
|
||||
<div class="user-name">${@auth.getPrincipalProperty('username')}</div>
|
||||
<div class="user-name">{{ userName }}</div>
|
||||
|
||||
<div class="user-meta-grid">
|
||||
<div class="meta-row">
|
||||
<span class="meta-icon">🆔</span>
|
||||
<div>
|
||||
<span class="meta-label">工号</span>
|
||||
<span class="meta-value">${@auth.getPrincipalProperty('loginname')}</span>
|
||||
<span class="meta-value">{{ loginName }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -22,14 +22,7 @@ const user = {
|
||||
<div>
|
||||
<span class="meta-label">单位信息</span>
|
||||
<span class="meta-value">
|
||||
<!--#if(!isEmpty(@auth.getPrincipalProperty('unit'))){#-->
|
||||
${@auth.getPrincipalProperty('unit').getName()}
|
||||
<!--#}#-->
|
||||
(
|
||||
<!--#if(!isEmpty(@auth.getPrincipalProperty('union'))){#-->
|
||||
${@auth.getPrincipalProperty('union').getName()}
|
||||
<!--#}#-->
|
||||
)
|
||||
{{ unitName }} ({{ unionName }})
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -113,6 +106,13 @@ const user = {
|
||||
</div>
|
||||
</div>
|
||||
`,
|
||||
// 用户资料由首页经过 HTML 转义后传入;缺少单位或工会时使用空字符串。
|
||||
props: {
|
||||
userName: { type: String, default: '' },
|
||||
loginName: { type: String, default: '' },
|
||||
unitName: { type: String, default: '' },
|
||||
unionName: { type: String, default: '' }
|
||||
},
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
@@ -251,14 +251,19 @@ const user = {
|
||||
console.log('切换到:', tab.name);
|
||||
},
|
||||
// 处理任务
|
||||
async openView(task) {
|
||||
console.log(task)
|
||||
openView(task) {
|
||||
const {taskId, taskKey, taskState, instanceId, businessNo, formKey} = task
|
||||
if (!formKey) {
|
||||
this.$message.warning("当前流程没有配置地址")
|
||||
return
|
||||
}
|
||||
window.open(formKey + "?taskId=" + taskId + "bizId=" + businessNo + "taskKey=" + taskKey + "&tab=" + this.activeTab)
|
||||
// 保留节点地址已有参数,分别传递任务、业务记录和页签,避免参数粘连导致无法定位申请。
|
||||
const targetUrl = new URL(formKey, window.location.origin)
|
||||
if (taskId) targetUrl.searchParams.set("taskId", taskId)
|
||||
if (businessNo) targetUrl.searchParams.set("bizId", businessNo)
|
||||
if (taskKey) targetUrl.searchParams.set("taskKey", taskKey)
|
||||
targetUrl.searchParams.set("tab", this.activeTab)
|
||||
window.open(targetUrl.href)
|
||||
},
|
||||
getRoleNames() {
|
||||
$.post("/platform/sys/role/getRoleNames").then(res => {
|
||||
|
||||
@@ -6,7 +6,8 @@ const branchUnionManage = {
|
||||
<el-input placeholder="请输入分工会名称" clearable size="small" style="width: 300px" v-model="pageForm.searchKeyword"></el-input>
|
||||
|
||||
<el-button type="primary" class="ml5" size="small" icon="el-icon-search" @click="doSearch"></el-button>
|
||||
<el-button @click="openAudit" icon="el-icon-s-check" type="primary" style="margin-left: auto" size="small">基层干部审核</el-button>
|
||||
<el-button @click="exportCadre" icon="el-icon-download" type="primary" style="margin-left: auto" size="small">导出基层干部</el-button>
|
||||
<el-button @click="openAudit" icon="el-icon-s-check" type="primary" size="small">基层干部审核</el-button>
|
||||
<el-button @click="openAdd" icon="ti-plus" type="primary" size="small" v-if="$auth.hasPermission('sys.manager.union.add')">新建分工会</el-button>
|
||||
</el-row>
|
||||
</el-card>
|
||||
@@ -79,6 +80,10 @@ const branchUnionManage = {
|
||||
openAudit() {
|
||||
this.$emit('union-cadre')
|
||||
},
|
||||
// 导出基层干部
|
||||
exportCadre() {
|
||||
this.$downLoad("/platform/sys/union/exportCadre")
|
||||
},
|
||||
openAdd() {
|
||||
this.dialogFormVisible = true
|
||||
this.$nextTick(() => {
|
||||
|
||||
@@ -49,6 +49,7 @@ const branchUnionUserManage = {
|
||||
</el-form-item>
|
||||
<el-form-item prop="userId" label="人员">
|
||||
<user-select
|
||||
:key="union_id"
|
||||
v-model="formData.userId"
|
||||
style="width: 100%"
|
||||
api="/platform/sys/union/listUnion"
|
||||
@@ -86,6 +87,7 @@ const branchUnionUserManage = {
|
||||
},
|
||||
watch: {
|
||||
union_id(val) {
|
||||
this.$set(this.formData, "userId", "")
|
||||
this.doSearch()
|
||||
}
|
||||
},
|
||||
|
||||
@@ -60,9 +60,9 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" v-if="activity_type===40003">
|
||||
<el-form-item prop="clubId" label="活动所属协会">
|
||||
<el-form-item prop="clubId" label="活动所属俱乐部">
|
||||
<el-select v-model="formData.clubId" clearable filterable
|
||||
placeholder="请选择活动所属协会"
|
||||
placeholder="请选择活动所属俱乐部"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubOptions"
|
||||
@@ -652,7 +652,7 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
|
||||
return
|
||||
}
|
||||
if (!this.formData.clubId && this.activity_type === 40003) {
|
||||
this.$message.error("请选择活动所属协会")
|
||||
this.$message.error("请选择活动所属俱乐部")
|
||||
return
|
||||
}
|
||||
this.$confirm("您确定保存吗?", "提示", {
|
||||
|
||||
@@ -27,7 +27,7 @@ const ACTIVITY_CULTURE_INFO_ACTIVITY = {
|
||||
{{ viewData.activity_type === 40001 ? '校工会活动' : viewData.activity_type === 40002 ?
|
||||
'分工会活动'
|
||||
:
|
||||
'协会/社团活动' }}
|
||||
'俱乐部活动' }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="活动计划时间">-->
|
||||
<!-- {{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}-->
|
||||
|
||||
@@ -23,7 +23,7 @@ const singleSignUp = {
|
||||
<el-descriptions-item label="活动类型" :span="2">
|
||||
{{ viewData.activity_type === 40001 ? '校工会活动' : viewData.activity_type === 40002 ? '分工会活动'
|
||||
:
|
||||
'协会/社团活动' }}
|
||||
'俱乐部活动' }}
|
||||
</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="活动计划时间">-->
|
||||
<!-- {{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}-->
|
||||
|
||||
+3
-3
@@ -28,9 +28,9 @@
|
||||
</el-descriptions-item>
|
||||
|
||||
<template v-if="formData.activityType == 'CLUB'">
|
||||
<el-descriptions-item label="申请协会">
|
||||
<el-form-item prop="clubId" label="申请协会">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择协会"
|
||||
<el-descriptions-item label="申请俱乐部">
|
||||
<el-form-item prop="clubId" label="申请俱乐部">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择俱乐部"
|
||||
@change="setDeclareUnitName" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubList"
|
||||
|
||||
+6
-6
@@ -43,9 +43,9 @@ layout("/layouts/platform.html"){
|
||||
</el-descriptions-item>
|
||||
|
||||
<template v-if="formData.activityType == 'CLUB'">
|
||||
<el-descriptions-item label="申请协会">
|
||||
<el-form-item prop="clubId" label="申请协会">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择协会"
|
||||
<el-descriptions-item label="申请俱乐部">
|
||||
<el-form-item prop="clubId" label="申请俱乐部">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择俱乐部"
|
||||
@change="setDeclareUnitName" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubList"
|
||||
@@ -332,7 +332,7 @@ layout("/layouts/platform.html"){
|
||||
const club = this.clubList.find(v => v.id === val)
|
||||
this.$set(this.formData, "declareUnitName", club ? club.clubName : null)
|
||||
|
||||
// 清空当前预算选择,因为社团变更会影响可选的预算
|
||||
// 清空当前预算选择,因为俱乐部变更会影响可选的预算
|
||||
this.$set(this.formData, "deductionBudgetId", null)
|
||||
|
||||
// 获取新的预算数据
|
||||
@@ -346,7 +346,7 @@ layout("/layouts/platform.html"){
|
||||
this.$set(this.formData, "declareUnitName", this.$store.state.user.union.name)
|
||||
this.$set(this.formData, "unionId", this.$store.state.user.union.id)
|
||||
} else if (val === "CLUB") {
|
||||
// 当活动类型变为社团时,清空已选择的预算
|
||||
// 当活动类型变为俱乐部时,清空已选择的预算
|
||||
this.$set(this.formData, "deductionBudgetId", null)
|
||||
}
|
||||
|
||||
@@ -430,7 +430,7 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
async created() {
|
||||
this.init()
|
||||
//社团查询
|
||||
//俱乐部查询
|
||||
this.$businessTool.listCLubByRole().then((res) => (this.clubList = res))
|
||||
}
|
||||
})
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<el-descriptions-item label="活动类型">{{ getActivityTypeName(viewData.activityType) }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName + '(' + viewData.loginName + ')' }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请协会' : '申请单位'">{{ viewData.declareUnitName }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请俱乐部' : '申请单位'">{{ viewData.declareUnitName }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="联系方式">{{ viewData.mobile }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ viewData.applyTime }}</el-descriptions-item>
|
||||
|
||||
+1
-1
@@ -135,7 +135,7 @@ layout("/layouts/platform.html"){
|
||||
{ prop: "mobile", label: "联系方式"},
|
||||
{ prop: "activityName", label: "活动名称"},
|
||||
{ prop: "activityType", label: "活动类型"},
|
||||
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true },
|
||||
{ prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true },
|
||||
{ prop: "activityNumber", label: "活动人数", sortable: true },
|
||||
{ prop: "applyTime", label: "申报时间", sortable: true },
|
||||
{ prop: "curTaskName", label: "当前节点"},
|
||||
|
||||
+3
-3
@@ -19,8 +19,8 @@ layout("/layouts/platform.html"){
|
||||
<el-input placeholder="请输入申请人工号或姓名" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -122,7 +122,7 @@ layout("/layouts/platform.html"){
|
||||
{ prop: "mobile", label: "联系方式"},
|
||||
{ prop: "activityName", label: "活动名称"},
|
||||
{ prop: "activityType", label: "活动类型"},
|
||||
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true },
|
||||
{ prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true },
|
||||
{ prop: "activityNumber", label: "活动人数", sortable: true },
|
||||
{ prop: "applyTime", label: "申报时间", sortable: true },
|
||||
{ prop: "curTaskName", label: "当前节点"},
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ const INFO = {
|
||||
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName + '(' + viewData.loginName + ')' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请协会' : '申请单位'">{{
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请俱乐部' : '申请单位'">{{
|
||||
viewData.declareUnitName }}
|
||||
</el-descriptions-item>
|
||||
|
||||
|
||||
+3
-3
@@ -41,8 +41,8 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
|
||||
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN, CLUB_MANAGER')">
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -128,7 +128,7 @@ layout("/layouts/platform.html"){
|
||||
{ prop: "mobile", label: "联系方式"},
|
||||
{ prop: "activityName", label: "活动名称"},
|
||||
{ prop: "activityType", label: "活动类型"},
|
||||
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true },
|
||||
{ prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true },
|
||||
{ prop: "activityNumber", label: "活动人数", sortable: true },
|
||||
{ prop: "applyTime", label: "申报时间", sortable: true },
|
||||
{ prop: "taskName", label: "当前节点"},
|
||||
|
||||
+3
-3
@@ -30,8 +30,8 @@ layout("/layouts/platform.html"){
|
||||
v-for="item in unions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -142,7 +142,7 @@ layout("/layouts/platform.html"){
|
||||
{ prop: "mobile", label: "联系方式"},
|
||||
{ prop: "activityName", label: "活动名称"},
|
||||
{ prop: "activityType", label: "活动类型"},
|
||||
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true },
|
||||
{ prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true },
|
||||
{ prop: "activityNumber", label: "活动人数", sortable: true },
|
||||
{ prop: "applyTime", label: "申报时间", sortable: true },
|
||||
{ prop: "curTaskName", label: "当前节点"},
|
||||
|
||||
+3
-3
@@ -30,8 +30,8 @@ layout("/layouts/platform.html"){
|
||||
v-for="item in unions"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -142,7 +142,7 @@ layout("/layouts/platform.html"){
|
||||
{ prop: "mobile", label: "联系方式"},
|
||||
{ prop: "activityName", label: "活动名称"},
|
||||
{ prop: "activityType", label: "活动类型"},
|
||||
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true },
|
||||
{ prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true },
|
||||
{ prop: "activityNumber", label: "活动人数", sortable: true },
|
||||
{ prop: "applyTime", label: "申报时间", sortable: true },
|
||||
{ prop: "curTaskName", label: "当前节点"},
|
||||
|
||||
+3
-3
@@ -36,12 +36,12 @@ layout("/layouts/platform.html"){
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="所属协会"
|
||||
<el-descriptions-item label="所属俱乐部"
|
||||
v-if="['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
|
||||
<el-form-item label="所属协会" prop="clubId"
|
||||
<el-form-item label="所属俱乐部" prop="clubId"
|
||||
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
|
||||
<el-select
|
||||
placeholder="请选择协会"
|
||||
placeholder="请选择俱乐部"
|
||||
style="width: 100%;" v-model="formData.clubId"
|
||||
@change="clubIdChange">
|
||||
<el-option
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<el-descriptions-item label="活动类型">{{ getActivityTypeName(viewData.activityType) }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName + '(' + viewData.loginName + ')' }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请协会' : '申请单位'">{{ viewData.declareUnitName }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="viewData.activityType == 'CLUB' ? '申请俱乐部' : '申请单位'">{{ viewData.declareUnitName }}</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="联系方式">{{ viewData.mobile }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ viewData.applyTime }}</el-descriptions-item>
|
||||
|
||||
+6
-6
@@ -80,7 +80,7 @@ layout("/layouts/platform.html"){
|
||||
<div class="cut-off-line"></div>
|
||||
</el-col>
|
||||
<el-col :span="4" style="position: relative">
|
||||
<div class="top_title">协会活动总人数</div>
|
||||
<div class="top_title">俱乐部活动总人数</div>
|
||||
<div class="top_num">{{numData.clubSignNum?numData.clubSignNum:'0'}}</div>
|
||||
<div class="cut-off-line"></div>
|
||||
</el-col>-->
|
||||
@@ -99,7 +99,7 @@ layout("/layouts/platform.html"){
|
||||
<div class="cut-off-line"></div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div class="top_title">社团活动报销费用(元)
|
||||
<div class="top_title">俱乐部活动报销费用(元)
|
||||
</div>
|
||||
<div class="top_num">{{numData.clubActivityMoney?numData.clubActivityMoney:'0'}}</div>
|
||||
</el-col>
|
||||
@@ -217,7 +217,7 @@ layout("/layouts/platform.html"){
|
||||
</div>
|
||||
<el-col :span="24" style="padding: 0 20px"
|
||||
v-loading="all_club_loading">
|
||||
<div class="chartTitle" style="margin-bottom: 50px">{{allClubYear}}年社团报销费用及活动情况
|
||||
<div class="chartTitle" style="margin-bottom: 50px">{{allClubYear}}年俱乐部报销费用及活动情况
|
||||
<el-tooltip class="item" effect="dark" :content="'点击切换为' + clubTip " placement="top">
|
||||
<el-button type="text" icon="el-icon-sort" @click="doClubSwitch"></el-button>
|
||||
</el-tooltip>
|
||||
@@ -262,7 +262,7 @@ layout("/layouts/platform.html"){
|
||||
isUnionJf:true,
|
||||
|
||||
all_club_loading: false,
|
||||
clubTip:'协会活动数',
|
||||
clubTip:'俱乐部活动数',
|
||||
allClubYear: moment().format('YYYY'),
|
||||
isClubJf:true,
|
||||
}
|
||||
@@ -485,7 +485,7 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
async doClubSwitch(){
|
||||
this.isClubJf = !this.isClubJf
|
||||
this.clubTip = this.isClubJf ? '协会活动数' : '协会经费详情'
|
||||
this.clubTip = this.isClubJf ? '俱乐部活动数' : '俱乐部经费详情'
|
||||
await this.allClubActivityAndJf();
|
||||
},
|
||||
async allClubActivityAndJf(){
|
||||
@@ -533,7 +533,7 @@ layout("/layouts/platform.html"){
|
||||
"yAxis": {},
|
||||
meta: {
|
||||
clubName: {
|
||||
alias: '协会',
|
||||
alias: '俱乐部',
|
||||
},
|
||||
money: {
|
||||
alias: this.isClubJf?'金额':'活动数',
|
||||
|
||||
+1
-1
@@ -158,7 +158,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+3
-3
@@ -35,8 +35,8 @@ layout("/layouts/platform.html"){
|
||||
placeholder="请选择预算条目"></dict-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -149,7 +149,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ const INFO = {
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName + '(' + viewData.loginName + ')' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
:label="viewData.outlayManageSource == 'ACTIVITY_BUDGET_TYPE_THREE' ? '申请协会' : '申请单位'">
|
||||
:label="viewData.outlayManageSource == 'ACTIVITY_BUDGET_TYPE_THREE' ? '申请俱乐部' : '申请单位'">
|
||||
{{viewData.declareUnitName }}
|
||||
</el-descriptions-item>
|
||||
|
||||
|
||||
+3
-3
@@ -47,8 +47,8 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -162,7 +162,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+3
-3
@@ -42,8 +42,8 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
|
||||
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN, CLUB_MANAGER')">
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -136,7 +136,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "activityReimbursementMode", label: "报销模式"},
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "taskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+3
-3
@@ -47,8 +47,8 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -162,7 +162,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+3
-3
@@ -47,8 +47,8 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -163,7 +163,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
+3
-3
@@ -46,8 +46,8 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
|
||||
<search-item label="所属协会">
|
||||
<el-select clearable filterable placeholder="所属协会"
|
||||
<search-item label="所属俱乐部">
|
||||
<el-select clearable filterable placeholder="所属俱乐部"
|
||||
style="width: 100%;" v-model="pageForm.clubId">
|
||||
<el-option :label="item.clubName" :value="item.id"
|
||||
v-for="item in clubs"></el-option>
|
||||
@@ -167,7 +167,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: "outlayManageSource", label: "经费类型"},
|
||||
{prop: "budgetReimburseType", label: "预算条目"},
|
||||
{prop: "actualMoney", label: "报销金额(元)"},
|
||||
{prop: "declareUnitName", label: "申报单位/协会", sortable: true},
|
||||
{prop: "declareUnitName", label: "申报单位/俱乐部", sortable: true},
|
||||
{prop: "applyTime", label: "申报时间", sortable: true},
|
||||
{prop: "curTaskName", label: "当前节点"},
|
||||
{prop: "instanceState", label: "流程状态"}
|
||||
|
||||
@@ -7,7 +7,7 @@ const basicForm = {
|
||||
style="width: 100%">
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('SCHOOL_UNION_ADMIN')" label="校工会" value="40001"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('BRANCH_UNION_CHAIRMAN')" label="分工会" value="40002"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="协会/社团" value="40003"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="俱乐部" value="40003"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
@@ -24,8 +24,8 @@ const basicForm = {
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="formData.planType === '40003'" prop="tissueId" label="所属协会/社团">
|
||||
<el-select v-model="formData.tissueId" placeholder="请选择所属协会/社团" filterable clearable
|
||||
<el-form-item v-if="formData.planType === '40003'" prop="tissueId" label="所属俱乐部">
|
||||
<el-select v-model="formData.tissueId" placeholder="请选择所属俱乐部" filterable clearable
|
||||
@change="(val) => {formData.tissueName = clubList.find(o => o.id === formData.tissueId).clubName}"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
|
||||
@@ -41,8 +41,8 @@ layout("/layouts/platform.html"){
|
||||
</el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="协会/社团:">
|
||||
<el-select v-model="pageForm.tissueIdByClub" placeholder="请选择所属协会/社团" filterable clearable
|
||||
<search-item v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="俱乐部:">
|
||||
<el-select v-model="pageForm.tissueIdByClub" placeholder="请选择所属俱乐部" filterable clearable
|
||||
@change="doSearch" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubList"
|
||||
@@ -82,7 +82,7 @@ layout("/layouts/platform.html"){
|
||||
<template v-slot="{ row }" v-if="column.prop === 'planType'">
|
||||
<span v-if="row.planType === '40001'">校工会</span>
|
||||
<span v-if="row.planType === '40002'">分工会</span>
|
||||
<span v-if="row.planType === '40003'">协会/社团</span>
|
||||
<span v-if="row.planType === '40003'">俱乐部</span>
|
||||
</template>
|
||||
<template v-slot="{ row }" v-else-if="column.prop === 'tissueName'">
|
||||
{{ row.tissueName || '校工会' }}
|
||||
|
||||
@@ -3,7 +3,7 @@ const info = {
|
||||
<div>
|
||||
<el-descriptions :column="2" border class="table_fixed">
|
||||
<el-descriptions-item label="计划类型">
|
||||
{{ viewData.type == 40001 ? '校工会计划' : viewData.type == 40002 ? '分工会计划' : '协会/社团计划' }}
|
||||
{{ viewData.type == 40001 ? '校工会计划' : viewData.type == 40002 ? '分工会计划' : '俱乐部计划' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="计划名称">
|
||||
{{ viewData.planName }}
|
||||
|
||||
+3
-3
@@ -11,7 +11,7 @@ const basicForm = {
|
||||
style="width: 100%">
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('SCHOOL_UNION_ADMIN')" label="校工会" value="40001"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('BRANCH_UNION_CHAIRMAN')" label="分工会" value="40002"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="协会/社团" value="40003"></el-option>
|
||||
<el-option v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="俱乐部" value="40003"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="formData.summaryFrom === '40002'" prop="tissueId" label="所属工会">
|
||||
@@ -26,8 +26,8 @@ const basicForm = {
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="formData.summaryFrom === '40003'" prop="tissueId" label="所属协会/社团">
|
||||
<el-select v-model="formData.tissueId" placeholder="请选择所属协会/社团" filterable clearable
|
||||
<el-form-item v-if="formData.summaryFrom === '40003'" prop="tissueId" label="所属俱乐部">
|
||||
<el-select v-model="formData.tissueId" placeholder="请选择所属俱乐部" filterable clearable
|
||||
@change="(val) => {formData.tissueName = clubList.find(o => o.id === formData.tissueId).clubName}"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
|
||||
@@ -38,8 +38,8 @@ layout("/layouts/platform.html"){
|
||||
</el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="协会/社团:">
|
||||
<el-select v-model="pageForm.tissueIdByClub" placeholder="请选择所属协会/社团" filterable clearable
|
||||
<search-item v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('CLUB_MANAGER')" label="俱乐部:">
|
||||
<el-select v-model="pageForm.tissueIdByClub" placeholder="请选择所属俱乐部" filterable clearable
|
||||
@change="doSearch" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubList"
|
||||
@@ -79,7 +79,7 @@ layout("/layouts/platform.html"){
|
||||
<template v-slot="{ row }" v-if="column.prop === 'planType'">
|
||||
<span v-if="row.planType === '40001'">校工会</span>
|
||||
<span v-if="row.planType === '40002'">分工会</span>
|
||||
<span v-if="row.planType === '40003'">协会/社团</span>
|
||||
<span v-if="row.planType === '40003'">俱乐部</span>
|
||||
</template>
|
||||
<template v-slot="{ row }" v-else-if="column.prop === 'tissueName'">
|
||||
{{ row.tissueName || '校工会' }}
|
||||
|
||||
@@ -6,7 +6,7 @@ const info = {
|
||||
{{viewData.userName}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="上传类型">
|
||||
{{ viewData.summaryFrom == 40001 ? '校工会计划' : viewData.type == 40002 ? '分工会计划' : '协会/社团计划' }}
|
||||
{{ viewData.summaryFrom == 40001 ? '校工会计划' : viewData.type == 40002 ? '分工会计划' : '俱乐部计划' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="所属组织">
|
||||
{{ viewData.tissueName || '校工会' }}
|
||||
|
||||
@@ -18,12 +18,12 @@ let ACTIVITY_SPORTS_ADD_ACTIVITY = {
|
||||
<template v-if="is_sysadmin">
|
||||
<el-radio :label="40001" border>校级</el-radio>
|
||||
<el-radio :label="40002" border>分工会</el-radio>
|
||||
<el-radio :label="40003" border>社团或协会</el-radio>
|
||||
<el-radio :label="40003" border>俱乐部</el-radio>
|
||||
</template>
|
||||
<template v-if="!is_sysadmin">
|
||||
<el-radio :label="40001" border v-if="is_a06">校级</el-radio>
|
||||
<el-radio v-if="is_union" :label="40002" border>分工会</el-radio>
|
||||
<el-radio :label="40003" border v-if="is_club">社团或协会</el-radio>
|
||||
<el-radio :label="40003" border v-if="is_club">俱乐部</el-radio>
|
||||
</template>
|
||||
|
||||
</el-radio-group>
|
||||
@@ -179,8 +179,8 @@ let ACTIVITY_SPORTS_ADD_ACTIVITY = {
|
||||
</el-col>-->
|
||||
<el-col v-if="formData.activityLevel===40003||(formData.activityLevel===40001&&is_club)"
|
||||
:span="8">
|
||||
<el-form-item prop="belongClubId" label="活动所属协会">
|
||||
<el-select v-model="formData.belongClubId" placeholder="请选择活动所属协会" filterable clearable
|
||||
<el-form-item prop="belongClubId" label="活动所属俱乐部">
|
||||
<el-select v-model="formData.belongClubId" placeholder="请选择活动所属俱乐部" filterable clearable
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in clubOptions"
|
||||
|
||||
@@ -4,23 +4,23 @@ const REGISTER_INFO_COMPONENT = {
|
||||
<el-tabs tab-position="top" v-model="activeName">
|
||||
<el-tab-pane name="1" label="基础信息">
|
||||
<div class="process-title">
|
||||
协会信息
|
||||
俱乐部信息
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions :column="3" border class="table_fixed">
|
||||
<el-descriptions-item label="协会名称">
|
||||
<el-descriptions-item label="俱乐部名称">
|
||||
{{viewData.clubName}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="成立时间">
|
||||
{{ viewData.foundTime }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="协会编码">
|
||||
<el-descriptions-item label="俱乐部编码">
|
||||
{{viewData.clubCode}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="发起人">
|
||||
{{ viewData.sponsorName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="协会类型">
|
||||
<el-descriptions-item label="俱乐部类型">
|
||||
{{ viewData.typeName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">
|
||||
@@ -30,7 +30,7 @@ const REGISTER_INFO_COMPONENT = {
|
||||
{{viewData.due}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :span="4">
|
||||
<template slot="label">协会介绍</template>
|
||||
<template slot="label">俱乐部介绍</template>
|
||||
<div class="text-left" v-html="viewData.introduce"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :span="4">
|
||||
|
||||
@@ -7,7 +7,7 @@ const CLUB_ROLE_CONSTANT = {
|
||||
getRoleName(roleCode) {
|
||||
switch (roleCode) {
|
||||
case this.CLUB_MANAGER:
|
||||
return "协会负责人"
|
||||
return "俱乐部负责人"
|
||||
case this.CLUB_VICE_PRESIDENT:
|
||||
return "副会长"
|
||||
case this.CLUB_SECRETARY:
|
||||
@@ -15,7 +15,7 @@ const CLUB_ROLE_CONSTANT = {
|
||||
case this.CLUB_VICE_SECRETARY:
|
||||
return "副秘书长"
|
||||
case this.CLUB_MEMBER:
|
||||
return "协会会员"
|
||||
return "俱乐部会员"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ const clubUserJoin = {
|
||||
<el-descriptions-item label="学位" :span="2">
|
||||
{{viewData.academicDegree}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="同时参加其他协会情况" :span="3">
|
||||
<el-descriptions-item label="同时参加其他俱乐部情况" :span="3">
|
||||
{{viewData.sameTimeJoinOtherClubSituation}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="文化、体育方面的活动经历、获奖情况" :span="3">
|
||||
|
||||
@@ -7,7 +7,7 @@ layout("/layouts/platform.html"){
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<custom-card v-if="isCanApply">
|
||||
<snaker-start slot="header" label="年度优秀协会申报" define_key="XHPY"></snaker-start>
|
||||
<snaker-start slot="header" label="年度优秀俱乐部申报" define_key="XHPY"></snaker-start>
|
||||
|
||||
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" style="padding: 0 30px">
|
||||
<el-row :gutter="30">
|
||||
@@ -42,11 +42,11 @@ layout("/layouts/platform.html"){
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="协会名称" prop="clubId"
|
||||
:rules="{required: true, message: '请选择协会', trigger: 'blur'}">
|
||||
<el-form-item label="俱乐部名称" prop="clubId"
|
||||
:rules="{required: true, message: '请选择俱乐部', trigger: 'blur'}">
|
||||
<el-select
|
||||
v-model="formData.clubId"
|
||||
placeholder="请选择协会"
|
||||
placeholder="请选择俱乐部"
|
||||
filterable
|
||||
clearable
|
||||
style="width: 100%"
|
||||
@@ -192,7 +192,7 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
}
|
||||
},
|
||||
//获取当前登录用户管理的协会
|
||||
//获取当前登录用户管理的俱乐部
|
||||
async getMyClubAndYearAuditPass() {
|
||||
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
|
||||
year: new Date().getFullYear()
|
||||
@@ -207,7 +207,7 @@ layout("/layouts/platform.html"){
|
||||
const year = this.$moment().format("YYYY")
|
||||
// this.isCanApply = year % 2 === 0
|
||||
// if (this.isCanApply === false) {
|
||||
// this.$alert("当前年份(" + year + ")不能进行年度优秀协会申报", "温馨提示", {
|
||||
// this.$alert("当前年份(" + year + ")不能进行年度优秀俱乐部申报", "温馨提示", {
|
||||
// confirmButtonText: "确定"
|
||||
// })
|
||||
// }
|
||||
|
||||
@@ -16,8 +16,8 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -33,9 +33,9 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
|
||||
@@ -167,7 +167,7 @@ layout("/layouts/platform.html"){
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
//获取当前登录用户管理的协会并且年度审核通过的
|
||||
//获取当前登录用户管理的俱乐部并且年度审核通过的
|
||||
async getMyClubAndYearAuditPass() {
|
||||
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
|
||||
year: this.pageForm.year
|
||||
|
||||
@@ -6,9 +6,9 @@ const EVALUATE_INFO_COMPONENT = {
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="协会名称">{{viewData.clubName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="协会编码">{{viewData.clubCode}}</el-descriptions-item>
|
||||
<el-descriptions-item label="协会类型">{{viewData.typeName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部名称">{{viewData.clubName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部编码">{{viewData.clubCode}}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部类型">{{viewData.typeName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="成立时间">{{viewData.foundTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="申报年份">{{$moment(viewData.applyTime).format('YYYY')}}</el-descriptions-item>
|
||||
<el-descriptions-item label="申报时间">{{viewData.applyTime}}</el-descriptions-item>
|
||||
|
||||
@@ -17,8 +17,8 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -31,9 +31,9 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '' }}</span>
|
||||
@@ -137,7 +137,7 @@ layout("/layouts/platform.html"){
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
//获取当前登录用户管理的协会并且年度审核通过的
|
||||
//获取当前登录用户管理的俱乐部并且年度审核通过的
|
||||
async getMyClubAndYearAuditPass() {
|
||||
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
|
||||
year: this.pageForm.year
|
||||
|
||||
@@ -16,8 +16,8 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -33,9 +33,9 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '无' }}</span>
|
||||
@@ -174,7 +174,7 @@ layout("/layouts/platform.html"){
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
//获取当前登录用户管理的协会并且年度审核通过的
|
||||
//获取当前登录用户管理的俱乐部并且年度审核通过的
|
||||
async getMyClubAndYearAuditPass() {
|
||||
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
|
||||
year: this.pageForm.year
|
||||
|
||||
@@ -16,8 +16,8 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -33,9 +33,9 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '无' }}</span>
|
||||
@@ -174,7 +174,7 @@ layout("/layouts/platform.html"){
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
//获取当前登录用户管理的协会并且年度审核通过的
|
||||
//获取当前登录用户管理的俱乐部并且年度审核通过的
|
||||
async getMyClubAndYearAuditPass() {
|
||||
const resp = await this.$axios.post("/platform/club/evaluate/apply/getMyClubAndYearAuditPass", {
|
||||
year: this.pageForm.year
|
||||
|
||||
@@ -38,8 +38,8 @@ layout("/layouts/platform.html"){
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item prop="clubId" label="协会名称">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择所属协会" filterable
|
||||
<el-form-item prop="clubId" label="俱乐部名称">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择所属俱乐部" filterable
|
||||
clearable
|
||||
:disabled="formData.id !== '' && formData.id !== undefined"
|
||||
@change="changeClub"
|
||||
@@ -640,7 +640,7 @@ layout("/layouts/platform.html"){
|
||||
await this.getClubUserNum(this.formData.clubId)
|
||||
await this.getJgUser(this.formData.clubId)
|
||||
},
|
||||
//获取当前年度协会有没有登记
|
||||
//获取当前年度俱乐部有没有登记
|
||||
async getCount() {
|
||||
const resp = await this.$axios.post("/platform/club/examine/apply/getCount", {
|
||||
id: this.formData.clubId,
|
||||
|
||||
@@ -20,8 +20,8 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -38,7 +38,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table :data="tableData" :size="tableSize">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
|
||||
|
||||
@@ -8,7 +8,7 @@ const EXAMINE_INFO_COMPONENT = {
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions v-if="viewData" :column="3" border class="table_fixed">
|
||||
<el-descriptions-item label="协会名称">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部名称">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="成立时间">{{ viewData.foundTime }} </el-descriptions-item>
|
||||
<el-descriptions-item label="会费标准">{{ viewData.due }}</el-descriptions-item>
|
||||
<el-descriptions-item span="3">
|
||||
@@ -16,7 +16,7 @@ const EXAMINE_INFO_COMPONENT = {
|
||||
<file-preview :files="viewData.summaryFiles" complete_result></file-preview>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<!-- <div class="process-title">协会成员变化情况</div>-->
|
||||
<!-- <div class="process-title">俱乐部成员变化情况</div>-->
|
||||
<!-- <el-table :data="viewData.changeUserNum" max-height="300">-->
|
||||
<!-- <el-table-column label="序号" type="index" width="50"></el-table-column>-->
|
||||
<!-- <el-table-column label="教职工类别" prop="userState"></el-table-column>-->
|
||||
@@ -74,8 +74,8 @@ const EXAMINE_INFO_COMPONENT = {
|
||||
<!-- </el-table-column>-->
|
||||
<!-- </el-table>-->
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="4" label="协会成员">
|
||||
<div class="process-title">协会成员</div>
|
||||
<el-tab-pane name="4" label="俱乐部成员">
|
||||
<div class="process-title">俱乐部成员</div>
|
||||
<el-table :data="viewData.jgUser">
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="职务" prop="roleName"></el-table-column>
|
||||
|
||||
@@ -20,8 +20,8 @@ layout("/layouts/platform.html"){
|
||||
@change="doSearch"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -33,7 +33,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80"></el-table-column>
|
||||
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
|
||||
|
||||
@@ -19,8 +19,8 @@ layout("/layouts/platform.html"){
|
||||
@change="doSearch"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -37,7 +37,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
|
||||
|
||||
@@ -19,8 +19,8 @@ layout("/layouts/platform.html"){
|
||||
@change="doSearch"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
@@ -37,7 +37,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span>
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="变更用户" prop="changeUserName" sortable show-overflow-tooltip></el-table-column>
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="变更用户" prop="changeUserName" sortable show-overflow-tooltip></el-table-column>
|
||||
@@ -71,24 +71,24 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
<template #edit>
|
||||
<el-form :model="formData" ref="formRef" size="small" label-width="80px" :rules="formRules">
|
||||
<el-form-item label="协会名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" @change="clubChange" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<el-form-item label="俱乐部名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" @change="clubChange" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="协会成员" prop="userId">
|
||||
<el-select v-model="formData.userId" @change="userChange" placeholder="请选择协会成员" filterable clearable style="width: 100%">
|
||||
<el-form-item label="俱乐部成员" prop="userId">
|
||||
<el-select v-model="formData.userId" @change="userChange" placeholder="请选择俱乐部成员" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item,index in userList" :key="index" :label="item.userName" :value="item.userId"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份" prop="nowRoleCode">
|
||||
<el-checkbox-group v-model="formData.nowRoleCode">
|
||||
<el-checkbox label="CLUB_MANAGER">协会负责人</el-checkbox>
|
||||
<el-checkbox label="CLUB_VICE_PRESIDENT">协会副会长</el-checkbox>
|
||||
<el-checkbox label="CLUB_SECRETARY">协会秘书长</el-checkbox>
|
||||
<el-checkbox label="CLUB_VICE_SECRETARY">协会副秘书长</el-checkbox>
|
||||
<el-checkbox label="CLUB_OPERATOR">协会操作员</el-checkbox>
|
||||
<el-checkbox label="CLUB_MEMBER">协会会员</el-checkbox>
|
||||
<el-checkbox label="CLUB_MANAGER">俱乐部负责人</el-checkbox>
|
||||
<el-checkbox label="CLUB_VICE_PRESIDENT">俱乐部副会长</el-checkbox>
|
||||
<el-checkbox label="CLUB_SECRETARY">俱乐部秘书长</el-checkbox>
|
||||
<el-checkbox label="CLUB_VICE_SECRETARY">俱乐部副秘书长</el-checkbox>
|
||||
<el-checkbox label="CLUB_OPERATOR">俱乐部操作员</el-checkbox>
|
||||
<el-checkbox label="CLUB_MEMBER">俱乐部会员</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@@ -6,7 +6,7 @@ const clubManagerInfo = {
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="所属协会">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="所属俱乐部">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ viewData.creatTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="变更用户">{{ viewData.changeUserName }}</el-descriptions-item>
|
||||
|
||||
@@ -25,7 +25,7 @@ const CLUB_INFO_MANAGE_TEMPLATE = {
|
||||
</template>
|
||||
<el-radio-group @change="doSearch" style="margin-left: 10px" v-model="pageForm.radioType" size="small">
|
||||
<el-radio-button label="3">全部</el-radio-button>
|
||||
<el-radio-button label="2">协会成员</el-radio-button>
|
||||
<el-radio-button label="2">俱乐部成员</el-radio-button>
|
||||
<el-radio-button label="1">理事机构</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
@@ -91,7 +91,7 @@ const CLUB_INFO_MANAGE_TEMPLATE = {
|
||||
</el-form-item>
|
||||
<el-form-item label="身份" prop="roleCode">
|
||||
<el-radio-group v-model="formData.roleCode" size="medium">
|
||||
<el-radio v-if="!addMember" border label="CLUB_MANAGER">协会负责人</el-radio>
|
||||
<el-radio v-if="!addMember" border label="CLUB_MANAGER">俱乐部负责人</el-radio>
|
||||
<el-radio v-if="addMember" border label="CLUB_MEMBER">会员</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
@@ -124,10 +124,10 @@ const CLUB_INFO_MANAGE_TEMPLATE = {
|
||||
</el-form-item>
|
||||
<el-form-item prop="roleCode" label="身份">
|
||||
<el-checkbox-group v-model="roleCodeFormData.roleCode">
|
||||
<el-checkbox label="CLUB_OPERATOR">协会操作员</el-checkbox>
|
||||
<el-checkbox label="CLUB_REIMBURSEMENT_MANAGER">协会报销负责人</el-checkbox>
|
||||
<el-checkbox label="CLUB_MEMBER">协会会员</el-checkbox>
|
||||
<el-checkbox label="CLUB_MANAGER">协会负责人</el-checkbox>
|
||||
<el-checkbox label="CLUB_OPERATOR">俱乐部操作员</el-checkbox>
|
||||
<el-checkbox label="CLUB_REIMBURSEMENT_MANAGER">俱乐部报销负责人</el-checkbox>
|
||||
<el-checkbox label="CLUB_MEMBER">俱乐部会员</el-checkbox>
|
||||
<el-checkbox label="CLUB_MANAGER">俱乐部负责人</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@@ -3,11 +3,11 @@ const SCHOOL_CLUB_MANAGE_TEMPLATE = {
|
||||
<div>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -20,16 +20,16 @@ const SCHOOL_CLUB_MANAGE_TEMPLATE = {
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool label="协会列表">
|
||||
<table-tool label="俱乐部列表">
|
||||
<template>
|
||||
|
||||
</template>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" row-key="id">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="70"></el-table-column>
|
||||
<el-table-column label="协会编码" sortable prop="clubCode"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable></el-table-column>
|
||||
<el-table-column label="协会负责人" prop="clubLeader" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部编码" sortable prop="clubCode"></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable></el-table-column>
|
||||
<el-table-column label="俱乐部负责人" prop="clubLeader" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="当前人数" show-overflow-tooltip prop="currentNum"></el-table-column>
|
||||
<el-table-column label="成立时间" show-overflow-tooltip prop="foundTime"></el-table-column>
|
||||
<el-table-column label="状态" show-overflow-tooltip prop="dismiss">
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="当前节点" prop="taskName" show-overflow-tooltip></el-table-column>
|
||||
@@ -68,8 +68,8 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
<template #edit>
|
||||
<el-form :model="formData" ref="formRef" size="small" label-width="80px" :rules="formRules">
|
||||
<el-form-item label="协会名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<el-form-item label="俱乐部名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
@@ -6,7 +6,7 @@ const clubRefreshInfo = {
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="所属协会">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="所属俱乐部">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ viewData.creatTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="上一次换届报告" :span="3">
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="当前节点" prop="taskName" show-overflow-tooltip></el-table-column>
|
||||
@@ -68,12 +68,12 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
<template #edit>
|
||||
<el-form :model="formData" ref="formRef" size="small" label-width="80px" :rules="formRules">
|
||||
<el-form-item label="协会名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择协会" filterable clearable style="width: 100%">
|
||||
<el-form-item label="俱乐部名称" prop="clubId">
|
||||
<el-select v-model="formData.clubId" placeholder="请选择俱乐部" filterable clearable style="width: 100%">
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="协会章程" prop="files">
|
||||
<el-form-item label="俱乐部章程" prop="files">
|
||||
<file-upload
|
||||
:value.sync="formData.files"
|
||||
:upload_number="1"
|
||||
|
||||
@@ -6,14 +6,14 @@ const clubRuleInfo = {
|
||||
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
|
||||
</div>
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="所属协会">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="所属俱乐部">{{ viewData.clubName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请人">{{ viewData.userName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请时间">{{ viewData.creatTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="上一次协会章程" :span="3">
|
||||
<el-descriptions-item label="上一次俱乐部章程" :span="3">
|
||||
<file-preview v-if="viewData.lastFiles && viewData.lastFiles.length > 0" :files="viewData.lastFiles" complete_result></file-preview>
|
||||
<span v-else>暂无附件</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="协会章程" :span="3">
|
||||
<el-descriptions-item label="俱乐部章程" :span="3">
|
||||
<file-preview v-if="viewData.files && viewData.files.length > 0" :files="viewData.files" complete_result></file-preview>
|
||||
<span v-else>暂无附件</span>
|
||||
</el-descriptions-item>
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
|
||||
|
||||
@@ -17,11 +17,11 @@ layout("/layouts/platform.html"){
|
||||
value-format="yyyy"
|
||||
></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="协会名称">
|
||||
<search-item label="俱乐部名称">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -39,7 +39,7 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
|
||||
|
||||
@@ -4,14 +4,14 @@ layout("/layouts/platform.html"){
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<custom-card>
|
||||
<snaker-start slot="header" label="文体协会会员申请" define_key="XHRH"></snaker-start>
|
||||
<snaker-start slot="header" label="文体俱乐部会员申请" define_key="XHRH"></snaker-start>
|
||||
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=":"
|
||||
class="flow-task-form">
|
||||
<el-descriptions border class="descriptions-form">
|
||||
<el-descriptions-item label="协会" :span="3">
|
||||
<el-form-item prop="clubId" label="协会">
|
||||
<el-descriptions-item label="俱乐部" :span="3">
|
||||
<el-form-item prop="clubId" label="俱乐部">
|
||||
<el-select v-model="formData.clubId" filterable @change="checkApplyClub"
|
||||
placeholder="请选择协会">
|
||||
placeholder="请选择俱乐部">
|
||||
<el-option v-for="item in clubOptions" :label="item.clubName" :value="item.id"
|
||||
:key="item.id"></el-option>
|
||||
</el-select>
|
||||
@@ -78,12 +78,12 @@ layout("/layouts/platform.html"){
|
||||
<el-input :value="formData.academicDegree" readonly placeholder="读取信息中心数据"></el-input>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="同时参加其他协会情况" :span="3">
|
||||
<el-form-item prop="sameTimeJoinOtherClubSituation" label="同时参加其他协会情况">
|
||||
<el-descriptions-item label="同时参加其他俱乐部情况" :span="3">
|
||||
<el-form-item prop="sameTimeJoinOtherClubSituation" label="同时参加其他俱乐部情况">
|
||||
<el-input
|
||||
maxlength="500"
|
||||
v-model="formData.sameTimeJoinOtherClubSituation"
|
||||
placeholder="请填写同时参加其他协会情况"
|
||||
placeholder="请填写同时参加其他俱乐部情况"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 4, maxRows: 6}"
|
||||
></el-input>
|
||||
@@ -121,7 +121,7 @@ layout("/layouts/platform.html"){
|
||||
</el-form>
|
||||
<el-row class="mt20">
|
||||
<el-checkbox v-model="isAgree">
|
||||
注:本人已仔细阅读并愿意遵守所参加本校教职工文体协会的章程和规定,自愿加入所报名协会。
|
||||
注:本人已仔细阅读并愿意遵守所参加本校教职工文体俱乐部的章程和规定,自愿加入所报名俱乐部。
|
||||
</el-checkbox>
|
||||
</el-row>
|
||||
<template slot="footer">
|
||||
|
||||
@@ -46,7 +46,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column prop="sex" label="性别"></el-table-column>
|
||||
<el-table-column prop="unitName" label="单位" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="unionName" label="分工会" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="clubName" label="申请协会" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="clubName" label="申请俱乐部" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="mode" label="申请模式">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="mini" v-if="scope.row.mode" type="success">加入</el-tag>
|
||||
|
||||
@@ -18,11 +18,11 @@ layout("/layouts/platform.html"){
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="协会名称:">
|
||||
<search-item label="俱乐部名称:">
|
||||
<el-input
|
||||
@keyup.enter.native="doSearch"
|
||||
clearable
|
||||
placeholder="请输入协会名称"
|
||||
placeholder="请输入俱乐部名称"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
v-model="pageForm.clubName"
|
||||
@@ -32,18 +32,18 @@ layout("/layouts/platform.html"){
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool label="协会列表">
|
||||
<table-tool label="俱乐部列表">
|
||||
<el-radio-group v-model="hasJoin" @change="joinChange" size="small">
|
||||
<el-radio-button :label="false">{{'可加入协会' + noJoinCount + '(入会)'}}</el-radio-button>
|
||||
<el-radio-button :label="true">{{'已加入协会' + hasJoinCount + '(退会)'}}</el-radio-button>
|
||||
<el-radio-button :label="false">{{'可加入俱乐部' + noJoinCount + '(入会)'}}</el-radio-button>
|
||||
<el-radio-button :label="true">{{'已加入俱乐部' + hasJoinCount + '(退会)'}}</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" row-key="id" style="width: 100%">
|
||||
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
|
||||
<el-table-column label="协会编码" sortable prop="clubCode"></el-table-column>
|
||||
<el-table-column label="协会名称" prop="clubName" show-overflow-tooltip width="200px"></el-table-column>
|
||||
<el-table-column label="俱乐部编码" sortable prop="clubCode"></el-table-column>
|
||||
<el-table-column label="俱乐部名称" prop="clubName" show-overflow-tooltip width="200px"></el-table-column>
|
||||
<el-table-column label="成立时间" prop="foundTime"></el-table-column>
|
||||
<el-table-column label="协会负责人" prop="clubLeader" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="俱乐部负责人" prop="clubLeader" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="秘书长" prop="clubSecretary" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column sortable label="当前人数" show-overflow-tooltip prop="currentPeopleNum"></el-table-column>
|
||||
<el-table-column label="操作" width="250px">
|
||||
@@ -60,12 +60,12 @@ layout("/layouts/platform.html"){
|
||||
<template #view>
|
||||
<el-descriptions class="margin-top" title="" :column="2" border>
|
||||
<el-descriptions-item span="2">
|
||||
<template slot="label">协会名称</template>
|
||||
<template slot="label">俱乐部名称</template>
|
||||
<div v-html="viewData.clubName"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="成立时间">{{viewData.foundTime}}</el-descriptions-item>
|
||||
<el-descriptions-item label="协会编码">{{viewData.clubCode}}</el-descriptions-item>
|
||||
<el-descriptions-item label="协会类型">{{viewData.typeName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部编码">{{viewData.clubCode}}</el-descriptions-item>
|
||||
<el-descriptions-item label="俱乐部类型">{{viewData.typeName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="发起人">{{viewData.sponsorName}}</el-descriptions-item>
|
||||
<el-descriptions-item>
|
||||
<template slot="label">会费标准</template>
|
||||
@@ -76,15 +76,15 @@ layout("/layouts/platform.html"){
|
||||
{{viewData.currentPeopleNum}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item span="2">
|
||||
<template slot="label">协会介绍</template>
|
||||
<template slot="label">俱乐部介绍</template>
|
||||
<div class="text-left" v-html="viewData.introduce"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item span="2">
|
||||
<template slot="label">协会宗旨</template>
|
||||
<template slot="label">俱乐部宗旨</template>
|
||||
<div class="text-left" v-html="viewData.purpose"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item span="2">
|
||||
<template slot="label">协会章程</template>
|
||||
<template slot="label">俱乐部章程</template>
|
||||
<file-preview :files="viewData.rulesFile" complete_result></file-preview>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item span="2">
|
||||
|
||||
@@ -25,7 +25,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="loginName" label="工号"></el-table-column>
|
||||
<el-table-column prop="clubName" label="协会名称"></el-table-column>
|
||||
<el-table-column prop="clubName" label="俱乐部名称"></el-table-column>
|
||||
<el-table-column prop="mode" label="申请模式">
|
||||
<template v-slot="scope">
|
||||
<el-tag size="mini" v-if="scope.row.mode" type="success">加入</el-tag>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user