会员升级

This commit is contained in:
Paidax
2025-10-21 17:24:21 +08:00
parent 5b44c75aaf
commit 2d7a74fd87
92 changed files with 6139 additions and 5194 deletions
@@ -26,6 +26,8 @@ public enum BpmProcessConstant {
MEMBER_SINGLE_APPLY("会员入会申请"),
MEMBER_CHANGE("会员变更申请"),
MEMBER_BRANCH_UNION_CHANGE("会员分工会变更"),
CLUB_JOIN("协会入会申请"),
@@ -1,12 +1,11 @@
package com.budwk.app.sys.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.constant.RoleConstant;
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.sys.models.Sys_union_group;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.services.SysUnionGroupService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,14 +13,18 @@ import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
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.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
@IocBean
@@ -81,10 +84,39 @@ public class SysUnionGroupController {
@At
@SaCheckPermission("sys.manager.union")
@ApiOperation("获取非工会小组组长人员")
public Result listUser(@Valid String unionId, String keyword) {
List<NutMap> list = sysUnionGroupService.listNotLeader(unionId, keyword);
public Result listUser(@Valid @Param("unionId") String unionId,
@Param("keyword") String keyword,
@Param("userIds") String[] userIds) {
List<NutMap> list = sysUnionGroupService.listNotLeader(unionId, keyword, Arrays.asList(userIds));
return Result.success(list);
}
@At
@SaCheckPermission("sys.manager.union")
@ApiOperation("获取组成单位")
public Result getUnits(String unionId, String groupId){
Sql sql = Sqls.create("""
SELECT
j.unitId
FROM
sys_union_group,
JSON_TABLE (unitIds, '$[*]' COLUMNS (unitId VARCHAR (50) PATH '$')) AS j
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("unionId", "=", unionId);
cnd.andEX("id", "!=", groupId);
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
List<String> list = sql.getList(String.class);
List<Sys_unit> unitList = dao.query(Sys_unit.class,
Cnd.where("unionId", "=", unionId)
.and("unitLevel", "=", 2)
.andEX("id", "not in", list));
return Result.success(unitList);
}
}
@@ -6,6 +6,8 @@ import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("sys_union_group")
@@ -23,6 +25,11 @@ public class Sys_union_group extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("绑定单位Id集合")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> unitIds;
@Comment("名称")
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@@ -33,10 +40,9 @@ public class Sys_union_group extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 10)
private String code;
@Comment("小组长")
@Column
@Comment("小组长")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String leader;
private List<String> leaders;
}
@@ -22,8 +22,9 @@ public interface SysUnionGroupService extends BaseService<Sys_union_group> {
* 查询非组长的成员
* @param unionId 分工会id
* @param keyword 关键字
* @param userIds 用户Id
*/
List<NutMap> listNotLeader(String unionId, String keyword);
List<NutMap> listNotLeader(String unionId, String keyword, List<String> userIds);
/**
* 分页查询
@@ -47,7 +47,7 @@ public class SysUnionGroupServiceImpl extends BaseServiceImpl<Sys_union_group> i
throw new BaseException("小组编码已存在");
}
dao().insert(group);
grantRole(group.getId(), group.getLeader());
grantRole(group.getId(), group.getLeaders());
}
@Override
@@ -59,7 +59,7 @@ public class SysUnionGroupServiceImpl extends BaseServiceImpl<Sys_union_group> i
throw new BaseException("小组编码已存在");
}
dao().updateIgnoreNull(group);
grantRole(group.getId(), group.getLeader());
grantRole(group.getId(), group.getLeaders());
}
@Override
@@ -72,14 +72,19 @@ public class SysUnionGroupServiceImpl extends BaseServiceImpl<Sys_union_group> i
}
@Override
public List<NutMap> listNotLeader(String unionId, String keyword) {
public List<NutMap> listNotLeader(String unionId, String keyword, List<String> userIds) {
Sql sql = Sqls.create("select id,loginname,username,unitName from vw_user $condition limit 0,10");
Cnd cnd = Cnd.NEW();
cnd.and("unionId", "=", unionId);
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", keyword);
seg.orLike("loginname", keyword);
cnd.and(seg);
if (StrUtil.isNotBlank(keyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", keyword);
seg.orLike("loginname", keyword);
cnd.and(seg);
} else {
cnd.and("id", "in", userIds);
}
sql.setCondition(cnd);
return listMap(sql);
}
@@ -88,12 +93,38 @@ public class SysUnionGroupServiceImpl extends BaseServiceImpl<Sys_union_group> i
public Pagination pageData(PageForm pageForm, String unionId) {
Sql sql = Sqls.create("""
SELECT
t1.*,
t2.username AS leaderUserName,
t2.mobile AS leaderMobile
t1.id,
t1.`code`,
t1.unionId,
t1.`name`,
t1.leaders,
t1.unitIds,
u_agg.unitInfos,
l_agg.leaderInfos
FROM
sys_union_group t1
LEFT JOIN sys_user t2 ON t2.id = t1.leader
LEFT JOIN (
SELECT
tg.id,
GROUP_CONCAT(u.NAME ORDER BY u.id) AS unitInfos
FROM
sys_union_group tg
JOIN JSON_TABLE (tg.unitIds, '$[*]' COLUMNS (unitId VARCHAR (50) PATH '$')) ju
JOIN sys_unit u ON u.id = ju.unitId
GROUP BY
tg.id
) u_agg ON u_agg.id = t1.id
LEFT JOIN (
SELECT
tg.id,
GROUP_CONCAT(CONCAT(u1.username, '(', u1.loginname, ')') ORDER BY u1.username) AS leaderInfos
FROM
sys_union_group tg
JOIN JSON_TABLE (tg.leaders, '$[*]' COLUMNS (userId VARCHAR (50) PATH '$')) jl
JOIN sys_user u1 ON u1.id = jl.userId
GROUP BY
tg.id
) l_agg ON l_agg.id = t1.id
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -124,16 +155,19 @@ public class SysUnionGroupServiceImpl extends BaseServiceImpl<Sys_union_group> i
* @param groupId 小组id
* @param groupLeader 组长id
*/
private void grantRole(String groupId, String groupLeader) {
private void grantRole(String groupId, List<String> groupLeader) {
// 小组长权限
Sys_role unionGroupRole = sysRoleService.getByCode(RoleConstant.BRANCH_UNION_GROUP_LEADER.name());
deleteUserRole(groupId, unionGroupRole.getId());
Sys_user_role userRole = new Sys_user_role();
userRole.setRoleId(unionGroupRole.getId());
userRole.setUnionGroupId(groupId);
userRole.setUserId(groupLeader);
dao().insert(userRole);
List<Sys_user_role> roleList = groupLeader.stream().map(v -> {
Sys_user_role userRole = new Sys_user_role();
userRole.setRoleId(unionGroupRole.getId());
userRole.setUnionGroupId(groupId);
userRole.setUserId(v);
return userRole;
}).toList();
dao().insert(roleList);
sysUserService.clearCache();
sysRoleService.clearCache();
@@ -17,6 +17,7 @@ import com.budwk.app.sys.models.*;
import com.budwk.app.sys.services.SysMenuService;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.base.Globals;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
@@ -387,7 +388,17 @@ public class SysUserServiceImpl extends BaseServiceImpl<Sys_user> implements Sys
StpUtil.login(user.getId());
StpUtil.checkLogin();
StpUtil.getSession(true).set("loginname", Strings.sNull(user.getLoginname())).set("username", Strings.sNull(user.getUsername())).set("unitId", Strings.sNull(user.getUnitId())).set("unitPath", Strings.sNull(user.getUnitPath())).set("unionId", ObjectUtil.isEmpty(user.getUnion()) ? "" : user.getUnion().getId());
// 查询一下视图,存储一些sys_user表中没有的字段
View_user viewUser = dao().fetch(View_user.class, Cnd.where("id", "=", user.getId()));
StpUtil.getSession(true)
.set("loginname", Strings.sNull(user.getLoginname()))
.set("username", Strings.sNull(user.getUsername()))
.set("unitId", Strings.sNull(user.getUnitId()))
.set("unitPath", Strings.sNull(user.getUnitPath()))
.set("unionId", ObjectUtil.isEmpty(user.getUnion()) ? "" : user.getUnion().getId())
.set("unionGroupId", Strings.sNull(viewUser.getUnionGroupId()))
.set("clubIds", Strings.sNull(viewUser.getClubIds()));
Sys_log sysLog = new Sys_log();
sysLog.setType("info");
sysLog.setTag("用户登陆");
@@ -177,4 +177,16 @@ public class View_user {
private Date memberJoinTime;
private Date memberLeaveTime;
@Column
private String unionGroupId;
@Column
private String unionGroupName;
@Column
private String clubIds;
@Column
private Boolean aidFundMember;
}
@@ -4,30 +4,67 @@ import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import org.nutz.lang.Strings;
import java.util.Arrays;
import java.util.List;
/**
* @author wizzer@qq.com
*/
public class SecurityUtil {
/**
* 获取当前用户ID
*/
public static String getUserId() {
return Strings.sNull(StpUtil.getLoginId(""));
}
/**
* 获取当前用户登录名
*/
public static String getUserLoginname() {
return Strings.sNull(getSession().get("loginname"));
}
/**
* 获取当前用户姓名
*/
public static String getUserUsername() {
return Strings.sNull(getSession().get("username"));
}
/**
* 获取当前用户单位ID
*/
public static String getUnitId() {
return Strings.sNull(getSession().get("unitId"));
}
/**
* 获取当前用户工会ID
*/
public static String getUnionId() {
return Strings.sNull(getSession().get("unionId"));
}
/**
* 获取当前用户工会小组ID
*/
public static String getUnionGroupId() {
return Strings.sNull(getSession().get("unionGroupId"));
}
/**
* 获取当前用户协会ID
*/
public static List<String> getClubIds() {
String clubIds = getSession().get("clubIds").toString();
return Arrays.stream(clubIds.split(",")).toList();
}
/**
* 获取当前用户Session
*/
public static SaSession getSession() {
return StpUtil.getSession(true);
}
@@ -194,7 +194,7 @@ public class BuildHomeAgencyController {
@SaCheckPermission("buildHome.agency")
@ApiOperation("获取非工会小组组长人员")
public Result listUser(@Valid String keyword) {
List<NutMap> list = sysUnionGroupService.listNotLeader(SecurityUtil.getUnionId(), keyword);
List<NutMap> list = sysUnionGroupService.listNotLeader(SecurityUtil.getUnionId(), keyword, null);
return Result.success(list);
}
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.staffmanage.member.constant;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -12,15 +13,40 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "MemberChangeType", name = "会员变更类型")
public enum MemberChangeType {
//变更类型
NEW("新入职"),
RESTORE("入会"),
WITHDRAWAL("退会"),
UNIT_CHANGE("单位异动"),
BASIC_CHANGE("基本信息异动");
NEW("NEW", "新入职"),
RESTORE("RESTORE", "入会"),
WITHDRAWAL("WITHDRAWAL", "退会"),
ON_DUTY("ON_DUTY", "在岗"),
POSTDOC("POSTDOC", "在站"),
NONE("NONE", ""),
OTHER("OTHER", "其他"),
QUIT("QUIT", "辞职"),
OUT_TRANSFER("OUT_TRANSFER", "调出"),
RETIRE("RETIRE", "退休"),
CONTRACT_END("CONTRACT_END", "合同到期"),
LEAVE("LEAVE", "离职"),
DISMISS("DISMISS", "辞退"),
DISCHARGE("DISCHARGE", "退站"),
EXPIRE("EXPIRE", "不保留编制"),
POST_EXIT("POST_EXIT", "出站"),
TERMINATE("TERMINATE", "解聘"),
REMOVE("REMOVE", "除名"),
RETIRE_DEATH("RETIRE_DEATH", "离休死亡"),
DEATH("DEATH", "死亡"),
POST_DEATH("POST_DEATH", "退休死亡"),
UNIT_CHANGE("UNIT_CHANGE", "单位异动"),
UNION_CHANGE("UNION_CHANGE", "工会关系异动"),
BASIC_CHANGE("BASIC_CHANGE", "基本信息异动");
private final String code;
private final String changeTypeName;
}
@@ -19,11 +19,10 @@ import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyBranchAuditPageForm;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberApplyVo;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -48,18 +47,16 @@ import java.util.Map;
* 会员入会申请分工会审核
*/
@IocBean
@At("/platform/member/apply/branchUnionAudit")
@Ok("json:full")
@At("/platform/member/apply/branchUnionAudit")
public class MemberApplyBranchUnionAuditController {
@Inject
private MemberApplyRecordService memberApplyRecordService;
@Inject
private MemberManageService memberManageService;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/branchunionaudit/index.html")
@@ -72,21 +69,17 @@ public class MemberApplyBranchUnionAuditController {
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
record.id,
vu.id AS userId,
vu.username,
vu.loginname,
record.changeType,
record.changeTypes,
record.changeOrigin,
record.applyDateTime,
record.unitId,
IFNULL(record.unionId, vu.unionid) AS unionId,
vu.unionname AS unionName,
IFNULL(record.unitName, vu.unitname) AS unitName,
IFNULL(record.userState, vu.userState) AS userState,
IFNULL(record.preparedBy, vu.preparedBy) AS preparedBy,
IFNULL(record.personType, vu.personType) AS personType,
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
@@ -100,17 +93,16 @@ public class MemberApplyBranchUnionAuditController {
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_apply_record record ON record.id = inst.processInstanceBusinessId
INNER JOIN member_apply_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN vw_user vu ON vu.id = record.userId
$condition
""");
Cnd cnd = Cnd.NEW();
MemberApplyPageForm.buildSearch(cnd, pageForm);
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",20);
cnd.and("nd.nodeCode","=",50);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
@@ -120,9 +112,9 @@ public class MemberApplyBranchUnionAuditController {
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_SINGLE_APPLY.name());
cnd.desc("task.createdOn");
cnd.groupBy("record.id");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberApplyVo> listPageVO = memberApplyRecordService.listPageVO(pageForm, sql, MemberApplyVo.class);
Pagination<MemberCommonVo> listPageVO = memberManageService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@@ -155,29 +147,6 @@ public class MemberApplyBranchUnionAuditController {
bpmService.revokeTask(taskId);
return Result.success();
}
/**
* 获取变更信息,审核
* @param recordId
* @return
*/
@At
@SaCheckPermission(value = {"member.apply.branchUnionAudit","member.apply.mine","member.apply.schoolUnionAudit"}, mode = SaMode.OR)
public Result findAuditChangeInfo(@Valid String recordId) {
Sys_user_history history = memberApplyRecordService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", recordId).or("id","=",recordId));
MemberApplyRecord record = memberApplyRecordService.dao().fetch(MemberApplyRecord.class, recordId);
if (ObjectUtil.isAllEmpty(history, record)) {
return Result.error("获取变更信息失败");
}
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_SINGLE_APPLY, recordId);
if (Lang.isNotEmpty(history)) {
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(history);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(record);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
}
@@ -10,6 +10,7 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_union_group;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.sys.views.View_user;
@@ -28,10 +29,13 @@ import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Stream;
@@ -101,17 +105,34 @@ public class MemberApplyController {
record.setChangeType(MemberChangeType.RESTORE.name());
record.setChangeTypes(List.of(MemberChangeType.RESTORE.name()));
dao.insertOrUpdate(record);
//设置分工会审核人
List<Sys_user> users = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_CHAIRMAN.name());
if (ObjectUtil.isEmpty(users)) {
return Result.error("您的分工会没有设置审核人,请联系校工会!");
}
List<Sys_user> operatorUsers = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_OPERATOR.name());
List<Sys_user> assignments = Stream.concat(users.stream(), operatorUsers.stream()).distinct().toList();
HashMap<String, Object> variables = new HashMap<>();
// 审核人工号集合
List<String> assignments = new ArrayList<>();
// 去查询申请人的单位有没有工会小组
Sys_union_group group = dao.fetch(Sys_union_group.class, Cnd.where(Sys_union_group::getUnionId, "=", SecurityUtil.getUnionId())
.and(new Static("JSON_CONTAINS(unitIds, '\"%s\"')".formatted(SecurityUtil.getUnitId()))));
if (Lang.isNotEmpty(group)) {
List<Sys_user> query = dao.query(Sys_user.class, Cnd.where("id", "in", group.getLeaders()));
assignments = query.stream().map(Sys_user::getLoginname).toList();
// 有小组,走工会小组审核
variables.put("processType", "unionGroup");
} else {
//设置分工会审核人
List<Sys_user> users = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_CHAIRMAN.name());
if (ObjectUtil.isEmpty(users)) {
return Result.error("您的分工会没有设置审核人,请联系校工会!");
}
List<Sys_user> operatorUsers = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_OPERATOR.name());
assignments = Stream.concat(users.stream(), operatorUsers.stream()).distinct().toList().stream().map(Sys_user::getLoginname).toList();
// 没有小组,走分工会审核
variables.put("processType", "branchUnion");
}
bpmservice.startSubmitProcessInstance(BpmProcessConstant.MEMBER_SINGLE_APPLY.name(),
"【会员入会申请】" + record.getUsername(), record.getId(), assignments.stream().map(Sys_user::getLoginname).toList(), null);
"【会员变更申请】" + record.getUsername(), record.getId(), assignments, variables);
return Result.success();
}
@@ -152,4 +173,15 @@ public class MemberApplyController {
return Result.success(dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())));
}
/**
* 获取当前登录用户信息,是用来判断当前用户是否是会员
* @return
*/
@At
@ApiOperation("获取当前登录用户信息")
@SaCheckPermission("member.apply.submit")
public Result getSelfUserInfo() {
return Result.success(dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())));
}
}
@@ -1,14 +1,11 @@
package com.budwk.app.zhgh.staffmanage.member.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
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.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
@@ -18,11 +15,12 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberApplyVo;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
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.aop.Aop;
@@ -34,7 +32,6 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
/**
@@ -46,11 +43,11 @@ import java.util.List;
public class MemberApplyMineController {
@Inject
private MemberApplyRecordService memberApplyRecordService;
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberManageService memberManageService;
private MemberCommonService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/mine/index.html")
@@ -64,21 +61,17 @@ public class MemberApplyMineController {
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
record.id,
vu.id AS userId,
vu.username,
vu.loginname,
record.changeType,
record.changeTypes,
record.changeOrigin,
record.applyDateTime,
record.unitId,
IFNULL(record.unionId, vu.unionid) AS unionId,
vu.unionname AS unionName,
IFNULL(record.unitName, vu.unitname) AS unitName,
IFNULL(record.userState, vu.userState) AS userState,
IFNULL(record.preparedBy, vu.preparedBy) AS preparedBy,
IFNULL(record.personType, vu.personType) AS personType,
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
@@ -95,31 +88,31 @@ public class MemberApplyMineController {
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40, 70 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
) AS nextTaskIsComplete,
( SELECT name FROM sys_union_group WHERE info.unitId = unitId ) AS groupName
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_apply_record record ON record.id = inst.processInstanceBusinessId
INNER JOIN member_apply_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN vw_user vu ON vu.id = record.userId
$condition
""");
Cnd cnd = Cnd.NEW();
MemberApplyPageForm.buildSearch(cnd, pageForm);
pageForm.buildSearch(cnd, "info.");
cnd.and("nd.nodeCode", "=", 10);
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_SINGLE_APPLY.name());
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.andEX("vu.unionId","=", SecurityUtil.getUnionId());
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("vu.id", "=", SecurityUtil.getUserId());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
cnd.desc("record.applyDateTime");
cnd.desc("info.applyDateTime");
sql.setCondition(cnd);
Pagination<MemberApplyVo> listPageVO = memberApplyRecordService.listPageVO(pageForm, sql, MemberApplyVo.class);
Pagination<MemberCommonVo> listPageVO = memberManageService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@@ -129,7 +122,7 @@ public class MemberApplyMineController {
@SaCheckPermission("member.apply.mine")
@SLog(tag = "会员管理-入会申请-我的申请记录", msg = "删除申请")
public Result delete(@Valid String id) {
memberApplyRecordService.delete(id);
dao.clear(MemberApplyRecord.class, Cnd.where("id", "=", id));
bpmService.deleteInstance(id);
return Result.success();
}
@@ -147,34 +140,19 @@ public class MemberApplyMineController {
/**
* 获取变更信息,审核
* @param recordId
* 获取审核信息
* @param id
* @return
*/
@At
@SaCheckPermission("member.apply.mine")
public Result findAuditChangeInfo(@Valid String recordId) {
MemberApplyRecord record = new MemberApplyRecord();
Cnd cnd = Cnd.NEW();
cnd.and(Cnd.exps("recordId", "=", recordId).or("id","=",recordId));
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("loginname", "=", SecurityUtil.getUserLoginname());
record = memberApplyRecordService.dao().fetch(MemberApplyRecord.class, Cnd.where("loginname", "=", SecurityUtil.getUserLoginname())
.and("id", "=", recordId));
} else {
record = memberApplyRecordService.dao().fetch(MemberApplyRecord.class, recordId);
}
Sys_user_history history = memberApplyRecordService.dao().fetch(Sys_user_history.class, cnd);
public Result findMemberApplyRecord(@Valid String id) {
MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, id);
NutMap nutMap = Lang.obj2nutmap(record);
if (ObjectUtil.isAllEmpty(history, record)) {
return Result.error("您暂无权限查询");
}
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_SINGLE_APPLY, recordId);
if (Lang.isNotEmpty(history)) {
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(history);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(record);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_SINGLE_APPLY, id);
nutMap.put("nodeTasks", nodeTasks);
return Result.success().addData(nutMap);
}
}
@@ -13,6 +13,7 @@ import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
@@ -20,11 +21,12 @@ import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberApplyVo;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
@@ -38,7 +40,6 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -46,18 +47,18 @@ import java.util.Map;
* 会员入会申请校工会审核
*/
@IocBean
@At("/platform/member/apply/schoolUnionAudit")
@Ok("json:full")
@At("/platform/member/apply/schoolUnionAudit")
public class MemberApplySchoolUnionAuditController {
@Inject
private MemberApplyRecordService memberApplyRecordService;
@Inject
private CommonService commonService;
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberManageService memberManageService;
private CommonService commonService;
@Inject
private MemberCommonService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/schoolunionaudit/index.html")
@@ -70,21 +71,17 @@ public class MemberApplySchoolUnionAuditController {
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
record.id,
vu.id AS userId,
vu.username,
vu.loginname,
record.changeType,
record.changeTypes,
record.changeOrigin,
record.applyDateTime,
record.unitId,
IFNULL(record.unionId, vu.unionid) AS unionId,
vu.unionname AS unionName,
IFNULL(record.unitName, vu.unitname) AS unitName,
IFNULL(record.userState, vu.userState) AS userState,
IFNULL(record.preparedBy, vu.preparedBy) AS preparedBy,
IFNULL(record.personType, vu.personType) AS personType,
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
@@ -98,17 +95,16 @@ public class MemberApplySchoolUnionAuditController {
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_apply_record record ON record.id = inst.processInstanceBusinessId
INNER JOIN member_apply_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN vw_user vu ON vu.id = record.userId
$condition
""");
Cnd cnd = Cnd.NEW();
MemberApplyPageForm.buildSearch(cnd, pageForm);
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",50);
cnd.and("nd.nodeCode","=",80);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
@@ -118,9 +114,9 @@ public class MemberApplySchoolUnionAuditController {
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_SINGLE_APPLY.name());
cnd.desc("task.createdOn");
// cnd.groupBy("record.id");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberApplyVo> listPageVO = memberApplyRecordService.listPageVO(pageForm, sql, MemberApplyVo.class);
Pagination<MemberCommonVo> listPageVO = memberManageService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@@ -133,8 +129,11 @@ public class MemberApplySchoolUnionAuditController {
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) {
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class, Cnd.where("id", "=", approvalParam.getProcessInstanceBusinessId()));
memberManageService.compareMemberChangeInfoAndUpdateUser(record);
MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, Cnd.where("id", "=", approvalParam.getProcessInstanceBusinessId()));
Sys_user sysUser = new Sys_user();
BeanUtil.copyProperties(record, sysUser);
sysUser.setId(record.getUserId());
dao.updateIgnoreNull(sysUser);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, null);
return Result.success();
@@ -150,29 +149,6 @@ public class MemberApplySchoolUnionAuditController {
bpmService.revokeTask(taskId);
return Result.success();
}
/**
* 获取变更信息,审核
* @param recordId
* @return
*/
@At
@SaCheckPermission(value = "member.apply.branchUnionAudit")
public Result findAuditChangeInfo(@Valid String recordId){
Sys_user_history history = memberApplyRecordService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", recordId).or("id","=",recordId));
MemberApplyRecord record = memberApplyRecordService.dao().fetch(MemberApplyRecord.class, recordId);
if (ObjectUtil.isAllEmpty(history, record)) {
return Result.error("获取变更信息失败");
}
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_SINGLE_APPLY, recordId);
if (Lang.isNotEmpty(history)) {
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(history);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(record);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
}
@@ -0,0 +1,164 @@
package com.budwk.app.zhgh.staffmanage.member.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_config;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberApplyPageForm;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberApplyUnionGroupAuditController
* @Date 2025/9/20 15:07
* @注释 入会工会小组审核
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/apply/unionGroupAudit")
public class MemberApplyUnionGroupAuditController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/apply/groupunionaudit/index.html")
@SaCheckPermission("member.apply.unionGroup.audit")
public void index() {
}
@At
@SaCheckPermission("member.change.unionGroup.audit")
public Result pageData(MemberApplyPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_apply_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",20);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_SINGLE_APPLY.name());
cnd.desc("task.createdOn");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberCommonVo> listPageVO = memberCommonService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会员变更工会小组审核")
@SaCheckPermission("member.change.unionGroup.audit")
@SLog(tag = "会员变更", msg = "工会小组审核")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
// 查询系统参数,看是否需要分工会审核
Sys_config config = dao.fetch(Sys_config.class, Cnd.where(Sys_config::getConfigKey, "=", "UnionGroupIsNeedBranchAudit"));
if ("true".equals(config.getConfigValue())) {
// 工会小组审核后,需要分工会审核
variables.put("groupAuditNext", "branch");
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN);
assignments.add(approvalLoginName);
} else {
// 工会小组审核后,不需要分工会审核,交由校工会审核
variables.put("groupAuditNext", "school");
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN);
assignments.add(approvalLoginName);
}
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@ApiOperation("工会小组审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.unionGroup.audit")
@SLog(tag = "会员变更", msg = "工会小组审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -1,113 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.branch;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberBranchUnionManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberBranchUnionAuditController
* @Date 2024/8/13 8:48
* @注释 分工会管理,分工会审核
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/branchUnion/audit")
public class MemberBranchUnionAuditController {
@Inject
private MemberBranchUnionManageService memberBranchUnionManageService;
@Inject
private MemberManageService memberManageService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/branch/audit/index.html")
@SaCheckPermission("member.branchUnion.audit")
public void index() {
}
@At
@SaCheckPermission("member.branchUnion.audit")
public Result pageData(MemberManagePageForm pageForm) {
Pagination pageData = memberBranchUnionManageService.getPageData(pageForm);
return Result.success(pageData);
}
@At
@ApiOperation("分工会审核")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.branchUnion.audit")
@SLog(tag = "会员管理-分工会管理", type = "memberBranchUnionManage", msg = "分工会审核")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), null, null);
return Result.success();
}
@At
@ApiOperation("分工会审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.branchUnion.audit")
@SLog(tag = "会员管理-分工会管理", type = "memberBranchUnionManage", msg = "分工会审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
/**
* 获取变更信息,审核
* @param recordId
* @return
*/
@At
@SaCheckPermission(value = {"member.branchUnion.audit", "member.schoolUnion.audit"}, mode = SaMode.OR)
public Result findAuditChangeInfo(String recordId) {
Sys_user_history history = memberBranchUnionManageService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", recordId).or("id","=",recordId));
MemberApplyRecord record = memberBranchUnionManageService.dao().fetch(MemberApplyRecord.class, recordId);
if (ObjectUtil.isAllEmpty(history, record)) {
return Result.error("获取变更信息失败");
}
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE, recordId);
if (Lang.isNotEmpty(history)) {
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(history);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(record);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
}
@@ -1,175 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.branch;
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.util.DesensitizedUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberStatisticsPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @version 1.0
* @Author zzr
* @nameMemberBranchUnionManageListController
* @Date 2024/8/12 14:06
* @注释 会员分工会管理
*/
@IocBean
@At("/platform/member/branchUnion/manage/list")
@Slf4j
@Ok("json")
public class MemberBranchUnionManageController {
@Inject
private MemberManageService memberManageService;
@Inject
private CommonService commonService;
@Inject
private BpmService bpmservice;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/branch/manage/index.html")
@SaCheckPermission("member.branchUnion.manage.list")
public void index() {
}
@At
@SaCheckPermission("member.branchUnion.manage.list")
@Ok("json:{dateFormat:'yyyy-MM-dd'}")
public Result pageData(MemberManagePageForm pageForm) {
Sql sql = memberManageService.getSql(pageForm, "branchUnion");
Pagination pagination = memberManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("member.branchUnion.manage.list")
@SLog(tag = "添加会员", type = "memberBranchManage", msg = "添加会员")
public Result addMember(@Valid MemberApplyRecord record) {
return null;
}
@At
@SaCheckPermission("member.branchUnion.manage.list")
public Result getChangeInfoByUserId(String userId) {
return Result.success(memberManageService.getMemberChangeInfoByUserId(userId));
}
@At
@SaCheckPermission("member.branchUnion.manage.list")
@Aop(TransAop.READ_COMMITTED)
@RepeatSubmit
@SLog(tag = "分工会管理-会员管理", type = "MemberBranchManageList", msg = "分工会普通变更")
public Result generalMemberChange(@Param("record") MemberApplyRecord record) {
try {
if (Objects.isNull(record)) {
return Result.error("数据获取失败");
}
Sys_user user = memberManageService.dao().fetch(Sys_user.class, Cnd.where("loginname", "=", record.getLoginname()));
record.setUserId(user.getId());
if ( record.getEdit() == null || !record.getEdit()) {
// 校验是否有变更的字段
List<NutMap> changeInfoList = memberManageService.compareMemberChangeInfo(record);
// 存储变更的类型
List<String> changeTypeList = memberManageService.compareMemberChangeType(changeInfoList, record);
// 有字段发生变更会走下面的方法,没有则会抛异常
record.setChangeTypes(changeTypeList);
record.setChangeOrigin(MemberChangeOrigin.BRANCH_UNION.name());
memberManageService.dao().insert(record);
} else {
record.setChangeOrigin(MemberChangeOrigin.BRANCH_UNION.name());
memberManageService.dao().updateIgnoreNull(record);
}
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_MEMBER_ADMIN);
if (StrUtil.isBlank(approvalLoginName)) {
throw new BaseException("校工会会员管理员未设置");
}
bpmservice.startSubmitProcessInstance(BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE.name(), "【会员分工会变更】" +record.getUsername(), record.getId(), List.of(approvalLoginName), null);
return Result.success();
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@At
@Ok("void")
@SaCheckPermission("member.branchUnion.manage.list")
public void doExport(MemberManagePageForm pageForm, HttpServletResponse response){
Sql sql = memberManageService.getSql(pageForm, "branchUnion");
List<NutMap> list = memberManageService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("会员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@SaCheckPermission("member.branchUnion.manage.list")
@SLog(tag = "分工会管理-会员管理", type = "MemberBranchManageList", msg = "修改会员福利手机号")
public Result changeWelfareMobile(String id,String welfareMobile){
memberManageService.dao().update(Sys_user.class, Chain.make("welfareMobile", welfareMobile),Cnd.where("id", "=", id));
return Result.success();
}
}
@@ -1,58 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.branch;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberBranchRecordController
* @Date 2024/8/13 16:25
* @注释 分工会 会员变更记录
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/branchUnion/record")
public class MemberBranchUnionRecordController {
@Inject
private MemberManageService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/branch/record/index.html")
@SaCheckPermission("member.branchUnion.record")
public void index() {
}
@At
@SaCheckPermission("member.branchUnion.record")
public Result pageData(MemberManagePageForm pageForm){
Pagination pagination = memberManageService.memberHistoryRecords(pageForm);
return Result.success(pagination);
}
@At
@SaCheckPermission("member.branchUnion.record")
public Result findAuditChangeInfo(@Valid String recordId) {
Sys_user_history history = memberManageService.dao().fetch(Sys_user_history.class, recordId);
List<NutMap> list = memberManageService.compareMemberChangeInfo(history);
return Result.success(list);
}
}
@@ -0,0 +1,155 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_union_group;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Stream;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeApplyController
* @Date 2025/9/16 16:03
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@ApiModel("会员变更申请")
@At("/platform/member/change/submit")
public class MemberChangeApplyController {
@Inject
private Dao dao;
@Inject
private BpmService bpmservice;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/submit/index.html")
@SaCheckPermission("member.change.submit")
public void index() {
}
@At
@ApiOperation("保存申请")
@SaCheckPermission("member.change.submit")
@SLog(tag = "会员变更申请", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") MemberChangeRecord memberChangeRecord) {
// 校验是否有变更
memberCommonService.validateChangeAndSetBasicData(memberChangeRecord);
dao.insertOrUpdate(memberChangeRecord);
bpmservice.startSaveProcessInstance(BpmProcessConstant.MEMBER_SINGLE_APPLY.name(),
"【会员变更申请】" + memberChangeRecord.getUsername(), memberChangeRecord.getId(), null);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.submit")
@SLog(tag = "会员变更申请", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") MemberChangeRecord memberChangeRecord){
// 校验是否有变更
memberCommonService.validateChangeAndSetBasicData(memberChangeRecord);
dao.insertOrUpdate(memberChangeRecord);
// 参数配置项
HashMap<String, Object> variables = new HashMap<>();
// 审核人工号集合
List<String> assignments = new ArrayList<>();
// 去查询申请人的单位有没有工会小组
Sys_union_group group = dao.fetch(Sys_union_group.class, Cnd.where(Sys_union_group::getUnionId, "=", SecurityUtil.getUnionId())
.and(new Static("JSON_CONTAINS(unitIds, '\"%s\"')".formatted(SecurityUtil.getUnitId()))));
if (Lang.isNotEmpty(group)) {
List<Sys_user> query = dao.query(Sys_user.class, Cnd.where("id", "in", group.getLeaders()));
assignments = query.stream().map(Sys_user::getLoginname).toList();
// 有小组,走工会小组审核
variables.put("processType", "unionGroup");
} else {
//设置分工会审核人
List<Sys_user> users = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_CHAIRMAN.name());
if (ObjectUtil.isEmpty(users)) {
return Result.error("您的分工会没有设置审核人,请联系校工会!");
}
List<Sys_user> operatorUsers = commonService.findUserInfoByRoleCode("unionId", SecurityUtil.getUnionId(), RoleConstant.BRANCH_UNION_OPERATOR.name());
assignments = Stream.concat(users.stream(), operatorUsers.stream()).distinct().toList().stream().map(Sys_user::getLoginname).toList();
// 没有小组,走分工会审核
variables.put("processType", "branchUnion");
}
bpmservice.startSubmitProcessInstance(BpmProcessConstant.MEMBER_CHANGE.name(),
"【会员变更申请】" + memberChangeRecord.getUsername(), memberChangeRecord.getId(), assignments, variables);
return Result.success();
}
@At
@ApiModelProperty("根据id查询变更记录")
@SaCheckPermission("member.change.submit")
public Result findChangeById(String id){
return Result.success().addData(dao.fetch(MemberChangeRecord.class, id));
}
/**
* 不知道有什么用,移过来的
* @param userId
* @return
*/
@At
@SaCheckPermission(value = {"member.change.unionGroup.audit", "member.change.branchUnion.audit", "member.change.schoolUnion.audit"}, mode = SaMode.OR)
public Result getUserByIdForMemberChange(String userId){
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId));
NutMap nutMap = Lang.obj2nutmap(user);
if (StrUtil.isNotBlank(user.getUnionId())) {
Sys_union union = dao.fetch(Sys_union.class, Cnd.where("id", "=", user.getUnionId()));
nutMap.put("union", union);
}
if (StrUtil.isNotBlank(user.getUnitId())) {
Sys_unit unit = dao.fetch(Sys_unit.class, Cnd.where("id", "=", user.getUnitId()));
nutMap.put("unit", unit);
}
return Result.success().addData(nutMap);
}
}
@@ -0,0 +1,152 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberBranchUnionAuditController
* @Date 2024/8/13 8:48
* @注释 分工会管理,分工会审核
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/change/branchUnion/audit")
public class MemberChangeBranchUnionAuditController {
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/branchunionaudit/index.html")
@SaCheckPermission("member.change.branchUnion.audit")
public void index() {
}
@At
@SaCheckPermission("member.change.branchUnion.audit")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_change_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",50);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_CHANGE.name());
cnd.desc("task.createdOn");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberCommonVo> listPageVO = memberCommonService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@At
@ApiOperation("分工会审核")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "会员变更", msg = "分工会审核")
@SaCheckPermission("member.change.branchUnion.audit")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN);
assignments.add(approvalLoginName);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@ApiOperation("分工会审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "会员变更", msg = "分工会审核撤回")
@SaCheckPermission("member.change.branchUnion.audit")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -1,61 +1,355 @@
//package com.budwk.app.zhgh.member.controller.change;
//
//import cn.dev33.satoken.annotation.SaCheckPermission;
//import com.budwk.app.base.annotation.SLog;
//import com.budwk.app.base.page.Pagination;
//import com.budwk.app.base.result.Result;
//import com.budwk.app.zhgh.member.models.MemberApplyRecord;
//import com.budwk.app.zhgh.member.param.MemberManagePageForm;
//import com.budwk.app.zhgh.member.service.MemberManageService;
//import lombok.extern.slf4j.Slf4j;
//import org.nutz.dao.sql.Sql;
//import org.nutz.ioc.loader.annotation.Inject;
//import org.nutz.ioc.loader.annotation.IocBean;
//import org.nutz.lang.util.NutMap;
//import org.nutz.mvc.annotation.At;
//import org.nutz.mvc.annotation.Ok;
//
//import javax.validation.Valid;
//
///**
// * @version 1.0
// * @Author zzr
// * @nameMemberChangeManageController
// * @Date 2024/8/6 8:39
// * @注释
// */
//@IocBean
//@Ok("json")
//@At("/platform/member/change/manage")
//@Slf4j
//public class MemberChangeManageController {
//
// @Inject
// private MemberManageService memberService;
//
// @At("")
// @Ok("beetl:/platform/zhgh/staffmanage/member/change/manage/index.html")
// @SaCheckPermission("member.branch.manage")
// public void index() {
// }
//
//
// @At
// @SaCheckPermission("member.branch.manage")
// public Result pageData(MemberManagePageForm pageForm) {
// Sql sql = memberService.getSql(pageForm,null);
// Pagination pagination = memberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
// return Result.success(pagination);
// }
//
//
// @At
// @SaCheckPermission("member.branch.manage")
// public Result getNumData(MemberManagePageForm pageForm) {
// NutMap map = memberService.getButtonNum(pageForm);
// return Result.success(map);
// }
//
//
//
//}
package com.budwk.app.zhgh.staffmanage.member.controller.change;
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.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_config;
import com.budwk.app.sys.models.Sys_union_group;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeManageController
* @Date 2025/9/16 16:04
* @注释
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/change/manage")
public class MemberChangeManageController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/manage/index.html")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public void index() {
}
@At
@ApiOperation("页面数据")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result pageData(MemberManagePageForm pageForm) {
Sql sql = memberCommonService.getSql(pageForm);
Pagination pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@RepeatSubmit
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "会员高级管理-会员变更", msg = "分工会/校工会会员管理员提交变更")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result doSubmitChange(@Param("record") MemberChangeRecord record, @Param("approvalRemark") String approvalRemark) {
// 检验是否有变更
if (Lang.isEmpty(record)) {
return Result.error("未获取到异动数据");
}
// 角色判断,还要考虑有没有工会小组
Sys_union_group group = dao.fetch(Sys_union_group.class, Cnd.where(Sys_union_group::getUnionId, "=", SecurityUtil.getUnionId())
.and(new Static("JSON_CONTAINS(unitIds, '\"%s\"')".formatted(SecurityUtil.getUnitId()))));
boolean schoolRoleBool = AuthUtil.hasRoleOr(RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), RoleConstant.SYSADMIN.name());
boolean branchRoleBool = AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name());
boolean branchGroupRoleBool = AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_GROUP_LEADER.name());
MemberChangeOrigin changeOrigin = schoolRoleBool ? MemberChangeOrigin.SCHOOL_UNION :
branchRoleBool ? MemberChangeOrigin.BRANCH_UNION :
branchGroupRoleBool ? MemberChangeOrigin.UNION_GROUP : null;
if (changeOrigin == null) {
throw new BaseException("您无此权限");
}
memberCommonService.validateChangeAndSetBasicData(record, changeOrigin);
dao.insertOrUpdate(record);
// 启动流程
HashMap<String, Object> processVariables = new HashMap<>();
processVariables.put("processType", branchGroupRoleBool ? "unionGroup" : "branchUnion");
bpmService.startSubmitProcessInstance(
BpmProcessConstant.MEMBER_CHANGE.name(),
"【会员变更】" + record.getUsername(),
record.getId(),
List.of(SecurityUtil.getUserLoginname()),
processVariables
);
// 自动审批逻辑:根据角色逐级通过
BpmProcessInstance instance = getProcessInstanceByBusinessId(record.getId());
if (instance == null) {
throw new BaseException("流程实例未找到,请检查流程启动是否成功");
}
// // 1. 工会小组审核通过(如果是由小组长发起);不能通过角色判断,如果是分工会申请并且这个人有工会小组;那没办法创建工会小组的审核
// if (branchGroupRoleBool) {
// completeLatestTask(instance, "工会小组审核通过", null, null);
// }
if (Lang.isNotEmpty(group)) {
Map<String, Object> vars = new HashMap<>();
// 查询系统参数,看是否需要分工会审核
Sys_config config = dao.fetch(Sys_config.class, Cnd.where(Sys_config::getConfigKey, "=", "UnionGroupIsNeedBranchAudit"));
if ("true".equals(config.getConfigValue())) {
vars.put("groupAuditNext", "branch");
} else {
vars.put("groupAuditNext", "school");
}
completeLatestTask(instance, "工会小组审核通过", null, vars);
// processVariables.put("")
}
// 2. 分工会审核通过(如果是分工会角色)
if (branchRoleBool || schoolRoleBool) {
completeLatestTask(instance, "分工会审核通过", null, null);
}
// 3. 校工会审核通过(如果是校工会或超管)
if (schoolRoleBool) {
// completeLatestTask 后 taskId 可能变化,所以重新查一次
BpmProcessInstance committeeInstance = getProcessInstanceByBusinessId(record.getId());
completeLatestTask(committeeInstance, "校工会审核通过",
vars -> memberCommonService.compareChangeInfoAndUpdateMember(record.getId()),
null);
}
return Result.success();
}
@At
@ApiOperation("获取该人员所有的变更信息")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result getAllChangeMemberInfo(String userId) {
List<NutMap> mapList = memberCommonService.getAllChangeInfo(userId);
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", userId));
NutMap map = Lang.obj2nutmap(user);
map.put("user", user);
map.put("allChangeInfo", mapList);
return Result.success(map);
}
private BpmProcessInstance getProcessInstanceByBusinessId(String businessId) {
return dao.fetch(BpmProcessInstance.class,
Cnd.where("processInstanceBusinessId", "=", businessId));
}
private BpmProcessTask getLatestTaskByInstanceId(String instanceId) {
return dao.fetch(BpmProcessTask.class,
Cnd.where(BpmProcessTask::getProcessInstanceId, "=", instanceId)
.desc(BpmProcessTask::getCreatedAt)
);
}
/**
* 完成指定流程实例的最新任务
*
* @param instance 流程实例
* @param opinion 审批意见
* @param postAction 成功后执行的动作(如更新会员数据)
*/
private void completeLatestTask(BpmProcessInstance instance, String opinion,
Consumer<Map<String, Object>> postAction,
Map<String, Object> var) {
BpmProcessTask task = getLatestTaskByInstanceId(instance.getId());
if (task == null) {
throw new BaseException("无法获取待处理任务");
}
BpmTaskApprovalParam param = new BpmTaskApprovalParam();
param.setProcessInstanceId(instance.getId());
param.setProcessInstanceBusinessId(instance.getProcessInstanceBusinessId());
param.setProcessInstanceTaskId(task.getId());
param.setBpmTaskApprovalType(BpmTaskApprovalTypeEnum.PASS.name());
param.setBpmTaskApprovalTypeEnum(BpmTaskApprovalTypeEnum.PASS);
param.setApprovalOpinion(opinion);
Map<String, Object> variables = BeanUtil.beanToMap(param);
variables.putAll(var);
// 执行完成任务
bpmService.completeTask(task.getId(), BpmTaskApprovalTypeEnum.PASS, variables, List.of(SecurityUtil.getUserLoginname()));
// 回调后置操作
if (postAction != null) {
postAction.accept(variables);
}
}
@At
@SLog(tag = "分工会管理-会员管理", type = "MemberBranchManageList", msg = "修改会员福利手机号")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public Result changeWelfareMobile(String id,String welfareMobile){
memberCommonService.dao().update(Sys_user.class, Chain.make("welfareMobile", welfareMobile),Cnd.where("id", "=", id));
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public void doExport(MemberManagePageForm pageForm, HttpServletResponse response){
Sql sql = memberCommonService.getSql(pageForm);
List<NutMap> list = memberCommonService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("会员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR)
public void doExportNotEqPhone(MemberManagePageForm pageForm, HttpServletResponse response){
Sql sql = Sqls.create("""
SELECT
u.id,
u.sex,
u.loginname,
u.username,
u.mobile,
u.welfareMobile,
u.unitId,
u.unitName,
u.unionId,
u.unionName,
DATE_FORMAT(u.birthday, '%Y-%m-%d ') as birthday,
u.manyUnit,
u.member,
u.userState,
u.preparedBy,
u.personType,
u.welfareMember,
u.isModelWorker,
u.wantJoinLoveMutualAidAssociation,
his.id hisId,
his.changeTypes,
his.changeTime
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(new Static("u.mobile != u.welfareMobile"));
MemberManagePageForm.buildSearch(cnd, pageForm);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
cnd.asc("u.unionId");
cnd.asc("u.unitId");
cnd.asc("u.id");
sql.setCondition(cnd);
List<NutMap> list = memberCommonService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("会员福利号码不一致名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,161 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
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.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeMineController
* @Date 2025/9/16 16:04
* @注释
*/
@IocBean
@Ok("json:full")
@ApiModel("会员变更申请查看")
@At("/platform/member/change/mine")
public class MemberChangeMineController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/mine/index.html")
@SaCheckPermission("member.change.mine")
public void index() {
}
@At
@SaCheckPermission("member.change.mine")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40, 70, 100 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete,
( SELECT name FROM sys_union_group WHERE info.unitId = unitId ) AS groupName
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_change_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
cnd.and("nd.nodeCode", "=", 10);
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_CHANGE.name());
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.andEX("info.unionId","=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
cnd.desc("info.applyDateTime");
sql.setCondition(cnd);
Pagination<MemberCommonVo> listPageVO = memberCommonService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@At
@ApiOperation("删除会员申请记录")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.mine")
@SLog(tag = "会员管理-变更申请-我的申请记录", msg = "删除申请")
public Result onDelete(@Valid String id) {
dao.clear(MemberChangeRecord.class, Cnd.where("id", "=", id));
bpmService.deleteInstance(id);
return Result.success();
}
@At
@ApiOperation("个人申请撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.mine")
@SLog(tag = "会员管理-变更申请-个人申请撤回", msg = "个人申请撤回")
public Result revokeApply(@Valid String id) {
bpmService.revokeApply(id);
return Result.success();
}
@At
@ApiOperation("根据id查询变更记录")
@SaCheckPermission(value = {"member.change.mine", "member.change.unionGroup.audit"}, mode = SaMode.OR)
public Result findMemberChangeRecord(@Valid String id){
MemberChangeRecord record = dao.fetch(MemberChangeRecord.class, id);
NutMap nutMap = Lang.obj2nutmap(record);
List<NutMap> changeInfos = memberCommonService.getChangeInfos(nutMap.getString("id"));
nutMap.put("changeInfos", changeInfos);
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_CHANGE, id);
nutMap.put("nodeTasks", nodeTasks);
return Result.success().addData(nutMap);
}
}
@@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -12,20 +12,20 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeRecordsController
* @Date 2024/8/8 8:40
* @注释
* @nameMemberChangeRecordController
* @Date 2025/9/16 16:04
* @version 1.0
* @注释 变更记录
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/change/record")
@Slf4j
public class MemberChangeRecordController {
@Inject
private MemberManageService memberService;
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/record/index.html")
@@ -33,10 +33,11 @@ public class MemberChangeRecordController {
public void index() {
}
@At
@SaCheckPermission("member.change.record")
public Result pageData(MemberManagePageForm pageForm) {
Pagination pagination = memberService.memberHistoryRecords(pageForm);
public Result pageData(MemberManagePageForm pageForm){
Pagination pagination = memberCommonService.memberHistoryRecords(pageForm);
return Result.success(pagination);
}
}
@@ -0,0 +1,150 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberSchoolUnionAuditController
* @Date 2024/8/13 8:49
* @注释
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/change/schoolUnion/audit")
public class MemberChangeSchoolUnionAuditController {
@Inject
private BpmService bpmService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/schoolunionaudit/index.html")
@SaCheckPermission("member.change.schoolUnion.audit")
public void index() {
}
@At
@SaCheckPermission("member.change.schoolUnion.audit")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_change_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",80);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_CHANGE.name());
cnd.desc("task.createdOn");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberCommonVo> listPageVO = memberCommonService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@At
@RepeatSubmit
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.schoolUnion.audit")
@SLog(tag = "会员管理-校工会管理", type = "memberSchoolUnionAudit", msg = "校工会会员审核")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) {
MemberChangeRecord record = memberCommonService.dao().fetch(MemberChangeRecord.class, Cnd.where("id", "=", approvalParam.getProcessInstanceBusinessId()));
if (StrUtil.isNotEmpty(approvalParam.getApprovalRemark())) {
memberCommonService.dao().update(MemberChangeRecord.class, Chain.make("remark", approvalParam.getApprovalRemark()), Cnd.where("id", "=", record.getId()));
}
memberCommonService.compareChangeInfoAndUpdateMember(record);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, null);
return Result.success();
}
@At
@ApiOperation("校工会审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.schoolUnion.audit")
@SLog(tag = "会员管理-校工会管理", type = "memberSchoolUnionAudit", msg = "校工会审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,164 @@
package com.budwk.app.zhgh.staffmanage.member.controller.change;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_config;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.member.vo.MemberCommonVo;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberUnionGroupAuditController
* @Date 2025/9/18 14:33
* @注释 工会小组审核
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/change/unionGroup/audit")
public class MemberChangeUnionGroupAuditController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/change/groupunionaudit/index.html")
@SaCheckPermission("member.change.unionGroup.audit")
public void index() {
}
@At
@SaCheckPermission("member.change.unionGroup.audit")
public Result pageData(MemberChangePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_change_record info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
pageForm.buildSearch(cnd, "info.");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",20);
if (pageForm.getAudit() != null) {
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_CHANGE.name());
cnd.desc("task.createdOn");
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<MemberCommonVo> listPageVO = memberCommonService.listPageVO(pageForm, sql, MemberCommonVo.class);
return Result.success(listPageVO);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会员变更工会小组审核")
@SaCheckPermission("member.change.unionGroup.audit")
@SLog(tag = "会员变更", msg = "工会小组审核")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
// 查询系统参数,看是否需要分工会审核
Sys_config config = dao.fetch(Sys_config.class, Cnd.where(Sys_config::getConfigKey, "=", "UnionGroupIsNeedBranchAudit"));
if ("true".equals(config.getConfigValue())) {
// 工会小组审核后,需要分工会审核
variables.put("groupAuditNext", "branch");
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN);
assignments.add(approvalLoginName);
} else {
// 工会小组审核后,不需要分工会审核,交由校工会审核
variables.put("groupAuditNext", "school");
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN);
assignments.add(approvalLoginName);
}
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@ApiOperation("工会小组审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.change.unionGroup.audit")
@SLog(tag = "会员变更", msg = "工会小组审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -1,91 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.modelworker;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberModelWorkerPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberModelWorkerService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberModelWorkerController
* @Date 2024/9/25 14:24
* @注释
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/modelWorker/manage")
public class MemberModelWorkerController {
@Inject
private MemberModelWorkerService memberModelWorkerService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/modelworker/manage/index.html")
@SaCheckPermission("member.modelWorker.manage")
public void index() {}
@At
@SaCheckPermission("member.modelWorker.manage")
public Result pageData(MemberModelWorkerPageForm pageForm) {
Sql sql = memberModelWorkerService.getSql(pageForm);
Pagination pagination = memberModelWorkerService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("member.modelWorker.manage")
public Result setModelWorker(String userId) {
if (StrUtil.isNotBlank(userId)) {
memberModelWorkerService.update(Chain.make("isModelWorker", true), Cnd.where("id", "=", userId));
return Result.success();
} else {
return Result.error();
}
}
/**
* 取消劳模身份
* @return
*/
@At
@SaCheckPermission(value = {"member.modelWorker.manage","member.branchUnion.manage.list","member.schoolUnion.manage.list"}, mode = SaMode.OR)
public Result cancelModelWorker(@Param("userIds") String[] userIds) {
List<String> list = Arrays.asList(userIds);
if (Lang.isNotEmpty(list)) {
memberModelWorkerService.update(Chain.make("isModelWorker", false), Cnd.where("id", "in", list));
return Result.success();
} else {
return Result.error();
}
}
@At
@Ok("void")
@SaCheckPermission("member.modelWorker.manage")
public void doExport(MemberModelWorkerPageForm pageForm, HttpServletResponse response){
memberModelWorkerService.doExport(pageForm, response);
}
}
@@ -1,128 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.school;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberSchoolUnionManageService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberSchoolUnionAuditController
* @Date 2024/8/13 8:49
* @注释
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/schoolUnion/audit")
public class MemberSchoolUnionAuditController {
@Inject
private BpmService bpmService;
@Inject
private MemberManageService memberManageService;
@Inject
private MemberSchoolUnionManageService memberSchoolUnionManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/school/audit/index.html")
@SaCheckPermission("member.schoolUnion.audit")
public void index() {
}
@At
@SaCheckPermission("member.schoolUnion.audit")
public Result pageData(MemberManagePageForm pageForm) {
Pagination pageData = memberSchoolUnionManageService.getPageData(pageForm);
return Result.success(pageData);
}
@At
@RepeatSubmit
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.schoolUnion.audit")
@SLog(tag = "会员管理-校工会管理", type = "memberSchoolUnionAudit", msg = "校工会会员审核")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) {
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class, Cnd.where("id", "=", approvalParam.getProcessInstanceBusinessId()));
if (StrUtil.isNotEmpty(approvalParam.getApprovalRemark())) {
memberManageService.dao().update(MemberApplyRecord.class, Chain.make("remark", approvalParam.getApprovalRemark()), Cnd.where("id", "=", record.getId()));
}
memberManageService.compareMemberChangeInfoAndUpdateUser(record);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, null);
return Result.success();
}
@At
@ApiOperation("校工会审核撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.schoolUnion.audit")
@SLog(tag = "会员管理-校工会管理", type = "memberSchoolUnionAudit", msg = "校工会审核撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
/**
* 获取变更信息,审核
* @param recordId
* @return
*/
@At
@SaCheckPermission(value = {"member.branchUnion.audit", "member.schoolUnion.audit"}, mode = SaMode.OR)
public Result findAuditChangeInfo(String recordId) {
Sys_user_history history = memberManageService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", recordId).or("id","=",recordId));
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class, recordId);
if (ObjectUtil.isAllEmpty(history, record)) {
return Result.error("获取变更信息失败");
}
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE, recordId);
if (Lang.isNotEmpty(history)) {
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(history);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
List<NutMap> nutMaps = memberManageService.compareMemberChangeInfo(record);
return Result.success(NutMap.NEW().addv("changeList", nutMaps).addv("nodeTasks", nodeTasks));
}
}
@@ -1,244 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.school;
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.bean.BeanUtil;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameMemberSchoolUnionManageController
* @Date 2024/8/12 14:06
* @注释 会员校工会管理
*/
@IocBean
@At("/platform/member/schoolUnion/manage/list")
@Slf4j
@Ok("json")
public class MemberSchoolUnionManageController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private MemberManageService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/school/manage/index.html")
@SaCheckPermission("member.schoolUnion.manage.list")
public void index() {
}
@At
@SaCheckPermission("member.schoolUnion.manage.list")
public Result pageData(MemberManagePageForm pageForm){
Sql sql = memberManageService.getSql(pageForm, "schoolUnion");
Pagination pagination = memberManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("member.schoolUnion.manage.list")
@SLog(tag = "添加会员", type = "memberBranchManage", msg = "添加会员")
public Result addMember(@Valid MemberApplyRecord record) {
return null;
}
@At
@SaCheckPermission("member.schoolUnion.manage.list")
public Result getChangeInfoByUserId(String userId) {
return Result.success(memberManageService.getMemberChangeInfoByUserId(userId));
}
@At
@RepeatSubmit
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.branchUnion.manage.list")
@SLog(tag = "校工会管理-会员管理", type = "MemberBranchManageList", msg = "校工会普通变更")
public Result generalMemberChange(@Param("record") MemberApplyRecord record, @Param("approvalRemark") String approvalRemark){
//校工会变更,直接更改
try {
// 校验是否有变更的字段
List<NutMap> changeInfoList = memberManageService.compareMemberChangeInfo(record);
if (Lang.isNotEmpty(changeInfoList)) {
// 存储变更的类型
List<String> changeTypeList = memberManageService.compareMemberChangeType(changeInfoList, record);
record.setChangeTypes(changeTypeList);
record.setChangeOrigin(MemberChangeOrigin.SCHOOL_UNION.name());
record.setRemark(approvalRemark);
memberManageService.insert(record);
// 开启流程,留痕
bpmService.startSubmitProcessInstance(BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE.name(),
"【会员分工会变更】" +record.getUsername(), record.getId(),
List.of(SecurityUtil.getUserLoginname()), null);
// 然后完成申请流程
BpmProcessInstance committeeInstance = dao.fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", record.getId()));
BpmProcessTask committeeTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", committeeInstance.getId())
.desc(BpmProcessTask::getCreatedAt));
BpmTaskApprovalParam committeeParam = new BpmTaskApprovalParam();
committeeParam.setProcessInstanceId(committeeInstance.getId());
committeeParam.setProcessInstanceBusinessId(record.getId());
committeeParam.setProcessInstanceTaskId(committeeTask.getId());
committeeParam.setBpmTaskApprovalType(BpmTaskApprovalTypeEnum.PASS.name());
committeeParam.setBpmTaskApprovalTypeEnum(BpmTaskApprovalTypeEnum.PASS);
committeeParam.setApprovalOpinion("校工会会审核通过");
bpmService.completeTask(committeeParam.getProcessInstanceTaskId(), committeeParam.getBpmTaskApprovalTypeEnum(), null, null);
// 更新用户信息
memberManageService.compareMemberChangeInfoAndUpdateUser(record);
}
return Result.success();
} catch (Exception e) {
e.printStackTrace();
return Result.error(e.getMessage());
}
}
@At
@Ok("void")
@SaCheckPermission("member.schoolUnion.manage.list")
public void doExport(MemberManagePageForm pageForm, HttpServletResponse response){
Sql sql = memberManageService.getSql(pageForm, "schoolUnion");
List<NutMap> list = memberManageService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("会员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@SaCheckPermission("member.schoolUnion.manage.list")
public void doExportNotEqPhone(MemberManagePageForm pageForm, HttpServletResponse response){
Sql sql = Sqls.create("""
SELECT
u.id,
u.sex,
u.loginname,
u.username,
u.mobile,
u.welfareMobile,
u.unitId,
u.unitName,
u.unionId,
u.unionName,
DATE_FORMAT(u.birthday, '%Y-%m-%d ') as birthday,
u.manyUnit,
u.member,
u.userState,
u.preparedBy,
u.personType,
u.welfareMember,
u.isModelWorker,
u.wantJoinLoveMutualAidAssociation,
his.id hisId,
his.changeTypes,
his.changeTime
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(new Static("u.mobile != u.welfareMobile"));
MemberManagePageForm.buildSearch(cnd, pageForm);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
cnd.asc("u.unionId");
cnd.asc("u.unitId");
cnd.asc("u.id");
sql.setCondition(cnd);
List<NutMap> list = memberManageService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
CommonDownloadUtil.download("会员福利号码不一致名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -1,56 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.controller.school;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberSchoolRecordController
* @Date 2024/8/13 16:27
* @注释 校工会 会员变更记录
*/
@Slf4j
@IocBean
@Ok("json")
@At("/platform/member/schoolUnion/record")
public class MemberSchoolUnionRecordController {
@Inject
private MemberManageService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/school/record/index.html")
@SaCheckPermission("member.schoolUnion.record")
public void index() {
}
@At
@SaCheckPermission("member.schoolUnion.record")
public Result pageData(MemberManagePageForm pageForm){
Pagination pagination = memberManageService.memberHistoryRecords(pageForm);
return Result.success(pagination);
}
@At
@SaCheckPermission("member.schoolUnion.record")
public Result findAuditChangeInfo(@Valid String recordId) {
Sys_user_history history = memberManageService.dao().fetch(Sys_user_history.class, recordId);
List<NutMap> list = memberManageService.compareMemberChangeInfo(history);
return Result.success(list);
}
}
@@ -1,4 +1,4 @@
package com.budwk.app.zhgh.staffmanage.member.controller.branch.verification;
package com.budwk.app.zhgh.staffmanage.member.controller.verification;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
@@ -12,20 +12,16 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_change_info;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationProject;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationUser;
import com.budwk.app.zhgh.staffmanage.member.models.MemberVerificationBranchUnionFeedback;
import com.budwk.app.zhgh.staffmanage.member.models.*;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberListVerificationPageForm;
import com.budwk.app.zhgh.staffmanage.member.param.MemberVerificationBranchUnionFeedbackParam;
import com.budwk.app.zhgh.staffmanage.member.param.MemberVerificationGetChangeParam;
import com.budwk.app.zhgh.staffmanage.member.service.MemberListVerificationService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -65,7 +61,7 @@ public class MemberBranchVerificationCheckController {
private MemberListVerificationService memberListVerificationService;
@Inject
private MemberManageService memberManageService;
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/branch/verification/check/index.html")
@@ -113,16 +109,15 @@ public class MemberBranchVerificationCheckController {
@ApiOperation("分工会 名单核对事项,单个人员变更")
@SaCheckPermission("member.branchUnion.verification.check")
@SLog(tag = "分工会管理-名单核对事项", type = "branchUnionVerification", msg = "分工会单个人员变更")
public Result doCheckMember(@Param("record") MemberApplyRecord record) {
public Result doCheckMember(@Param("record") MemberChangeRecord record) {
if (Objects.isNull(record)) {
return Result.error("数据获取失败");
}
Dao dao = memberManageService.dao();
// memberManageService.compareMemberChangeInfoAndUpdateUser(record);
Dao dao = memberCommonService.dao();
// 校验是否有变更的东西
memberManageService.compareMemberChangeInfo(record);
memberCommonService.compareChangeInfoAndUpdateMember(record);
record.setChangeOrigin(MemberChangeOrigin.BRANCH_UNION_VERIFICATION.name());
MemberApplyRecord applyRecord = dao.fetch(MemberApplyRecord.class, Cnd.where("userId", "=", record.getUserId())
MemberChangeRecord applyRecord = dao.fetch(MemberChangeRecord.class, Cnd.where("userId", "=", record.getUserId())
.and("verificationProjectId", "=", record.getVerificationProjectId()));
//查出当前核对事项是否有变更记录有则修改
if (Lang.isNotEmpty(applyRecord)) {
@@ -152,7 +147,7 @@ public class MemberBranchVerificationCheckController {
@SaCheckPermission("member.branchUnion.verification.check")
@SLog(tag = "分工会管理-名单核对事项", type = "branchUnionVerification", msg = "名单核对事项无误提交")
public Result correctSubmission(@Param("data") @Valid MemberVerificationBranchUnionFeedbackParam param) {
memberManageService.dao().update(MemberVerificationBranchUnionFeedback.class,
memberCommonService.dao().update(MemberVerificationBranchUnionFeedback.class,
Chain.make("isSubmit", true).add("status", "分工会无误提交")
.add("welfareJson", param.getWelfareJson()),
Cnd.where("verificationProjectId", "=", param.getVerificationProjectId())
@@ -189,7 +184,7 @@ public class MemberBranchVerificationCheckController {
@At
@SaCheckPermission("member.branchUnion.verification.check")
public Result validateSubmitButton(@Valid @Param("verificationProjectId") String verificationProjectId) {
MemberVerificationBranchUnionFeedback feedback = memberManageService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
MemberVerificationBranchUnionFeedback feedback = memberCommonService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
Cnd.where("verificationProjectId", "=", verificationProjectId).and("unionId", "=", SecurityUtil.getUnionId()));
boolean flag = feedback.getBranchUnionSubmitNum() == 0 || feedback.getBranchUnionSubmit();
@@ -240,15 +235,10 @@ public class MemberBranchVerificationCheckController {
@ApiOperation("分工会 名单核对事项,获取变更记录")
@SaCheckPermission("member.branchUnion.verification.check")
public Result getVerificationChangeInfo(@Valid @Param("data") MemberVerificationGetChangeParam param) {
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class,
MemberChangeRecord record = memberCommonService.dao().fetch(MemberChangeRecord.class,
Cnd.where("userId", "=", param.getUserId()).and("verificationProjectId", "=", param.getVerificationProjectId()));
if (Lang.isNotEmpty(record)) {
Sys_user_history history = memberManageService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", record.getId()).desc("changeTime"));
if (Lang.isNotEmpty(history)) {
return Result.success(memberManageService.compareMemberChangeInfo(history));
} else {
return Result.success(memberManageService.compareMemberChangeInfo(record));
}
return Result.success(memberCommonService.getChangeInfos(record));
}
return Result.error();
}
@@ -258,9 +248,9 @@ public class MemberBranchVerificationCheckController {
@ApiOperation("分工会 名单核对事项,查看反馈结果")
@SaCheckPermission(value = {"member.branchUnion.verification.check", "member.schoolUnion.verification.check"}, mode = SaMode.OR)
public Result getVerificationFeedback(String verificationProjectId, String unionId) {
MemberVerificationBranchUnionFeedback fetch = memberManageService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
MemberVerificationBranchUnionFeedback fetch = memberCommonService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
Cnd.where("verificationProjectId", "=", verificationProjectId).and("unionId", "=", unionId));
MemberListVerificationProject verificationProject = memberManageService.dao().fetch(MemberListVerificationProject.class, Cnd.where("id", "=", verificationProjectId));
MemberListVerificationProject verificationProject = memberCommonService.dao().fetch(MemberListVerificationProject.class, Cnd.where("id", "=", verificationProjectId));
NutMap nutMap = Lang.obj2nutmap(verificationProject);
nutMap.put("feedbackDate", DateUtil.format(DateUtil.date(fetch.getUpdatedAt()), "yyyy-MM-dd HH:mm:ss"));
nutMap.put("unionName", fetch.getUnionName());
@@ -1,4 +1,4 @@
package com.budwk.app.zhgh.staffmanage.member.controller.school.verification;
package com.budwk.app.zhgh.staffmanage.member.controller.verification;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
@@ -14,15 +14,11 @@ import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.zhgh.benefit.mode.BenefitUserTemp;
import com.budwk.app.zhgh.staffmanage.member.mode.MemberImportTemp;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationProject;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationUser;
import com.budwk.app.zhgh.staffmanage.member.models.MemberVerificationBranchUnionFeedback;
import com.budwk.app.zhgh.staffmanage.member.models.*;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberListVerificationPageForm;
import com.budwk.app.zhgh.staffmanage.member.param.MemberListVerificationParam;
import com.budwk.app.zhgh.staffmanage.member.param.MemberListVerificationProjectParam;
import com.budwk.app.zhgh.staffmanage.member.service.MemberListVerificationService;
import com.budwk.app.zhgh.welfare.mode.WelfareUserTemp;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
@@ -188,7 +184,7 @@ public class MemberListVerificationController {
public Result removeVerificationProject(String verificationProjectId) {
Dao dao = memberListVerificationService.dao();
dao.clear(MemberListVerificationProject.class, Cnd.where("id", "=", verificationProjectId));
dao.clear(MemberApplyRecord.class, Cnd.where("verificationProjectId", "=", verificationProjectId));
dao.clear(MemberChangeRecord.class, Cnd.where("verificationProjectId", "=", verificationProjectId));
dao.clear(MemberListVerificationUser.class, Cnd.where("verificationProjectId", "=", verificationProjectId));
dao.clear(MemberVerificationBranchUnionFeedback.class, Cnd.where("verificationProjectId", "=", verificationProjectId));
return Result.success();
@@ -1,4 +1,4 @@
package com.budwk.app.zhgh.staffmanage.member.controller.school.verification;
package com.budwk.app.zhgh.staffmanage.member.controller.verification;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
@@ -6,7 +6,6 @@ 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.bean.BeanUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.RepeatSubmit;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
@@ -16,16 +15,12 @@ import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_change_info;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationProject;
import com.budwk.app.zhgh.staffmanage.member.models.MemberListVerificationUser;
import com.budwk.app.zhgh.staffmanage.member.models.MemberVerificationBranchUnionFeedback;
import com.budwk.app.zhgh.staffmanage.member.models.*;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberListVerificationPageForm;
import com.budwk.app.zhgh.staffmanage.member.param.MemberSchoolVerificationSubmitParam;
import com.budwk.app.zhgh.staffmanage.member.param.MemberVerificationGetChangeParam;
import com.budwk.app.zhgh.staffmanage.member.service.MemberListVerificationService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
@@ -33,9 +28,7 @@ import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -68,7 +61,7 @@ public class MemberSchoolVerificationCheckController {
private MemberListVerificationService memberListVerificationService;
@Inject
private MemberManageService memberManageService;
private MemberCommonService memberCommonService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/member/school/verification/check/index.html")
@@ -96,15 +89,10 @@ public class MemberSchoolVerificationCheckController {
@At
@SaCheckPermission("member.schoolUnion.verification.check")
public Result getVerificationChangeInfo(@Valid @Param("data") MemberVerificationGetChangeParam param) {
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class,
MemberChangeRecord record = memberCommonService.dao().fetch(MemberChangeRecord.class,
Cnd.where("userId", "=", param.getUserId()).and("verificationProjectId", "=", param.getVerificationProjectId()));
if (Lang.isNotEmpty(record)) {
Sys_user_history history = memberManageService.dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", record.getId()).desc("changeTime"));
if (Lang.isNotEmpty(history)) {
return Result.success(memberManageService.compareMemberChangeInfo(history));
} else {
return Result.success(memberManageService.compareMemberChangeInfo(record));
}
return Result.success(memberCommonService.getChangeInfos(record));
}
return Result.success();
}
@@ -126,18 +114,18 @@ public class MemberSchoolVerificationCheckController {
Chain chain = Chain.make("schoolUnionChecked", true);
chain.add("verificationOption", param.getOption());
MemberApplyRecord record = memberManageService.dao().fetch(MemberApplyRecord.class,
MemberChangeRecord record = memberCommonService.dao().fetch(MemberChangeRecord.class,
Cnd.where("userId", "=", param.getUserId())
.and("verificationProjectId", "=", param.getVerificationProjectId()));
if (param.getFlag()) {
chain.add("currentState", 2);
memberManageService.compareMemberChangeInfoAndUpdateUser(record);
memberCommonService.compareChangeInfoAndUpdateMember(record);
} else {
chain.add("currentState", 1);
memberManageService.update(record);
memberCommonService.update(record);
}
memberManageService.dao().update(MemberListVerificationUser.class, chain,
memberCommonService.dao().update(MemberListVerificationUser.class, chain,
Cnd.where("userId", "=", param.getUserId()).and("verificationProjectId", "=", param.getVerificationProjectId()));
return Result.success();
}
@@ -148,19 +136,19 @@ public class MemberSchoolVerificationCheckController {
@SaCheckPermission("member.schoolUnion.verification.check")
@SLog(type = "member", tag = "名单核对事项", msg = "校工会提交")
public Result schoolVerificationSubmit(@Valid @Param("data") MemberSchoolVerificationSubmitParam param) {
MemberVerificationBranchUnionFeedback fetch = memberManageService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
MemberVerificationBranchUnionFeedback fetch = memberCommonService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
Cnd.where("verificationProjectId", "=", param.getVerificationProjectId())
.and("unionId", "=", param.getUnionId()));
fetch.setSchoolUnionSubmit(true);
fetch.setSchoolUnionSubmitNum(fetch.getSchoolUnionSubmitNum() + 1);
fetch.setStatus("待分工会重新提交");
// 更新反馈表的数据校工会提交置为true
memberManageService.dao().update(fetch);
memberCommonService.dao().update(fetch);
Cnd cnd = Cnd.NEW();
cnd.and("unionId", "=", param.getUnionId());
cnd.and("verificationProjectId", "=", param.getVerificationProjectId());
memberManageService.dao().update(MemberListVerificationUser.class,
memberCommonService.dao().update(MemberListVerificationUser.class,
Chain.make("branchUnionChecked", false).add("schoolUnionChecked", true),
cnd);
return Result.success();
@@ -179,7 +167,7 @@ public class MemberSchoolVerificationCheckController {
@SaCheckPermission("member.schoolUnion.verification.check")
public Result getChangeTypeUserPageData(MemberListVerificationPageForm pageForm) {
Sql sql = memberListVerificationService.getChangeTypeUserSql(pageForm);
Pagination pagination = memberManageService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
Pagination pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@@ -189,7 +177,7 @@ public class MemberSchoolVerificationCheckController {
@SaCheckPermission("member.schoolUnion.verification.check")
public void exportChangeTypeUserByUnionIdExcel(MemberListVerificationPageForm pageForm, HttpServletResponse response) {
Sql sql = memberListVerificationService.getChangeTypeUserSql(pageForm);
List<NutMap> list = memberManageService.listMap(sql);
List<NutMap> list = memberCommonService.listMap(sql);
List<ExcelExportEntity> excelExportEntities = memberListVerificationService.buildExportEntities();
NutMap nutMap = list.stream().findFirst().orElse(NutMap.NEW());
String labelName = "";
@@ -215,9 +203,9 @@ public class MemberSchoolVerificationCheckController {
@Ok("void")
@SaCheckPermission("member.schoolUnion.verification.check")
public void exportAllChangeTypeUserExcel(MemberListVerificationPageForm pageForm, HttpServletResponse response){
MemberListVerificationProject project = memberManageService.dao().fetch(MemberListVerificationProject.class, pageForm.getVerificationProjectId());
MemberListVerificationProject project = memberCommonService.dao().fetch(MemberListVerificationProject.class, pageForm.getVerificationProjectId());
Sql sql = memberListVerificationService.getChangeTypeUserSql(pageForm);
List<NutMap> list = memberManageService.listMap(sql);
List<NutMap> list = memberCommonService.listMap(sql);
List<ExcelExportEntity> excelExportEntities = memberListVerificationService.buildExportEntities();
String labelName = "";
switch (pageForm.getChangeType()) {
@@ -244,13 +232,13 @@ public class MemberSchoolVerificationCheckController {
@ApiOperation("校工会 名单核对事项,单个人员变更")
@SaCheckPermission("member.schoolUnion.verification.check")
@SLog(tag = "校工会管理-名单核对事项", type = "schoolUnionVerification", msg = "校工会单个人员变更")
public Result doCheckMember(@Param("record") MemberApplyRecord record){
public Result doCheckMember(@Param("record") MemberChangeRecord record){
if (Objects.isNull(record)) {
return Result.error("数据获取失败");
}
Dao dao = memberManageService.dao();
Dao dao = memberCommonService.dao();
record.setChangeOrigin(MemberChangeOrigin.SCHOOL_UNION_VERIFICATION.name());
MemberApplyRecord applyRecord = dao.fetch(MemberApplyRecord.class, Cnd.where("userId", "=", record.getUserId())
MemberChangeRecord applyRecord = dao.fetch(MemberChangeRecord.class, Cnd.where("userId", "=", record.getUserId())
.and("verificationProjectId", "=", record.getVerificationProjectId()));
// 如果之前有变更删除之前记录
if (Lang.isNotEmpty(applyRecord)) {
@@ -271,7 +259,7 @@ public class MemberSchoolVerificationCheckController {
.and("verificationProjectId", "=", record.getVerificationProjectId()));
dao.clear(Sys_user_history.class, Cnd.where("recordId", "=", record.getId()));
memberManageService.compareMemberChangeInfoAndUpdateUser(record);
memberCommonService.compareChangeInfoAndUpdateMember(record);
dao.update(MemberListVerificationUser.class,
Chain.make("schoolUnionChecked", true).add("currentState", 2),
@@ -289,13 +277,13 @@ public class MemberSchoolVerificationCheckController {
@SLog(tag = "校工会管理-名单核对事项", type = "schoolUnionVerification", msg = "退回分工会无误提交")
public Result doRollback(@Valid @Param("id") String id,
@Valid @Param("rollbackReason") String rollbackReason){
MemberVerificationBranchUnionFeedback feedback = memberManageService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
MemberVerificationBranchUnionFeedback feedback = memberCommonService.dao().fetch(MemberVerificationBranchUnionFeedback.class,
Cnd.where("id", "=", id));
feedback.setIsRollback(true);
feedback.setRollbackReason(rollbackReason);
feedback.setSchoolUnionSubmitNum(feedback.getSchoolUnionSubmitNum() + 1);
feedback.setStatus("校工会退回");
memberManageService.dao().update(feedback);
memberCommonService.dao().update(feedback);
return Result.success();
}
@@ -305,7 +293,7 @@ public class MemberSchoolVerificationCheckController {
@Ok("void")
@SaCheckPermission("member.schoolUnion.verification.check")
public void doExportByPageDataForExcel(MemberListVerificationPageForm pageForm, HttpServletResponse response){
MemberListVerificationProject project = memberManageService.dao().fetch(MemberListVerificationProject.class, pageForm.getVerificationProjectId());
MemberListVerificationProject project = memberCommonService.dao().fetch(MemberListVerificationProject.class, pageForm.getVerificationProjectId());
List<NutMap> mapList = memberListVerificationService.getSchoolListVerificationUnion(pageForm);
mapList.forEach(v-> {
v.put("branchUnionSubmit" ,v.getBoolean("branchUnionSubmit") ? "已提交" : "未提交");
@@ -242,6 +242,10 @@ public class MemberApplyRecord extends BaseModel {
@ColDefine(type = ColType.TEXT)
private String changeInfos;
@Column
@Comment("入会意愿")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isVoluntary;
@Column
@Comment("详细变更记录")
@@ -0,0 +1,255 @@
package com.budwk.app.zhgh.staffmanage.member.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangeRecord
* @Date 2025/9/16 14:12
* @注释
*/
@Data
@Accessors(chain = true)
@Table("member_change_record")
@EqualsAndHashCode(callSuper = true)
public class MemberChangeRecord extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("用户id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "用户不能为空")
@Size(max = 32)
private String userId;
@Column
@Comment("姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "姓名不能为空")
@Size(max = 100)
private String username;
@Column
@Comment("工号")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "工号不能为空")
@Size(max = 100)
private String loginname;
@Column
@Comment("单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "单位id不能为空")
@Size(max = 32)
private String unitId;
@Column
@Comment("变更单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Size(max = 32)
private String changeUnitId;
@Column
@Comment("单位名称")
@ColDefine(type = ColType.VARCHAR, width = 200)
@NotBlank(message = "单位名称不能为空")
@Size(max = 200)
private String unitName;
@Column
@Comment("工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "工会id不能为空")
@Size(max = 32)
private String unionId;
@Column
@Comment("工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "工会名称不能为空")
@Size(max = 50)
private String unionName;
@Column
@Comment("性别")
@ColDefine(type = ColType.VARCHAR, width = 10)
@NotBlank(message = "性别不能为空")
@Size(max = 10)
private String sex;
@Column
@Comment("证件号码")
@ColDefine(type = ColType.VARCHAR, width = 30)
@NotBlank(message = "证件号码不能为空")
@Size(max = 30)
private String idCard;
@Column
@Comment("民族")
@ColDefine(type = ColType.VARCHAR, width = 20)
@NotBlank(message = "民族不能为空")
@Size(max = 20)
private String nation;
@Column
@Comment("政治面貌")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "政治面貌不能为空")
@Size(max = 100)
private String political;
@Column
@Comment("学历")
@ColDefine(type = ColType.VARCHAR, width = 20)
@NotBlank(message = "学历不能为空")
@Size(max = 20)
private String education;
@Column
@Comment("党政职务")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "党政职务不能为空")
@Size(max = 50)
private String governmentPosition;
@Column
@Comment("在职状态")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "在职状态不能为空")
@Size(max = 50)
private String userState;
@Column
@Comment("人事编制")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "人事编制不能为空")
@Size(max = 50)
private String preparedBy;
@Column
@Comment("人员类别")
@ColDefine(type = ColType.VARCHAR, width = 50)
@NotBlank(message = "人员类别不能为空")
@Size(max = 50)
private String personType;
@Column
@Comment("手机号码")
@ColDefine(type = ColType.VARCHAR, width = 32)
@NotBlank(message = "手机号码不能为空")
@Size(max = 32)
private String mobile;
@Column
@Comment("电子邮箱")
@ColDefine(type = ColType.VARCHAR, width = 255)
@NotBlank(message = "电子邮箱不能为空")
@Size(max = 255)
private String email;
@Column
@Comment("是否愿意加入大病互助基金会")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
@NotNull(message = "愿意加入大病互助基金会不能为空")
private Boolean wantJoinLoveMutualAidAssociation;
@Column
@Comment("会员状态")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean member;
@Column
@Comment("福利会员状态")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean welfareMember;
@Column
@Comment("福利联系方式")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String welfareMobile;
@Column
@Comment("家庭主要成员及其工作单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> families;
@Column
@Comment("博士后进站时间")
@ColDefine(type = ColType.DATE)
private Date postDoctoralJoinDate;
@Column
@Comment("个人简况")
@ColDefine(type = ColType.VARCHAR, customType = "text")
@NotBlank(message = "个人简况不能为空")
private String personalData;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String notes;
@Column
@Comment("变更类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String changeType;
@Column
@Comment("变更类型集合")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> changeTypes;
@Column
@Comment("变更来源")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String changeOrigin;
@Column
@Comment("申请时间")
@ColDefine(type = ColType.DATETIME)
@PrevInsert(now = true)
private Date applyDateTime;
@Column
@Comment("福利享受截止日期")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String welfareStopDate;
@Column
@Comment("名单事项核对Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String verificationProjectId;
@Column
@Comment("详细变更记录")
@ColDefine(type = ColType.TEXT)
private String changeInfos;
@Column
@Comment("详细变更记录")
@ColDefine(type = ColType.TEXT)
private String remark;
private Boolean edit;
}
@@ -3,6 +3,7 @@ package com.budwk.app.zhgh.staffmanage.member.param.pageform;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@@ -19,30 +20,42 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
@EqualsAndHashCode(callSuper = true)
public class MemberApplyPageForm extends PageForm<MemberApplyRecord> {
// 工会id
@ApiModelProperty("工会id")
private String unionId;
// 单位id
@ApiModelProperty("单位id")
private String unitId;
// 在职状态
@ApiModelProperty("在职状态")
private String userState;
private String personType;
// 在职状态
@ApiModelProperty("编制类型")
private String preparedBy;
public static void buildSearch(Cnd cnd, MemberApplyPageForm pageForm) {
// 人员类型
@ApiModelProperty("人员类型")
private String personType;
public void buildSearch(Cnd cnd, String prefix){
if (cnd == null) {
cnd = Cnd.NEW();
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
if (StrUtil.isNotBlank(this.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("vu.loginname", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("vu.username", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.orLike(prefix + "username", this.getSearchKeyword());
seg.orLike(prefix + "loginname", this.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("vu.unionId","=",pageForm.getUnionId());
cnd.andEX("vu.unitId","=",pageForm.getUnitId());
cnd.andEX("vu.userState","=",pageForm.getUserState());
cnd.andEX("vu.personType","=",pageForm.getPersonType());
cnd.andEX("vu.preparedBy","=",pageForm.getPreparedBy());
cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "unitId", "=", this.getUnitId());
cnd.andEX(prefix + "userState", "=", this.getUserState());
cnd.andEX(prefix + "preparedBy", "=", this.getPreparedBy());
cnd.andEX(prefix + "personType", "=", this.getPersonType());
}
}
@@ -0,0 +1,62 @@
package com.budwk.app.zhgh.staffmanage.member.param.pageform;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
/**
* @version 1.0
* @Author zzr
* @nameMemberChangePageForm
* @Date 2025/9/16 16:31
* @注释
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MemberChangePageForm extends PageForm<MemberChangeRecord> {
// 工会id
@ApiModelProperty("工会id")
private String unionId;
// 单位id
@ApiModelProperty("单位id")
private String unitId;
// 在职状态
@ApiModelProperty("在职状态")
private String userState;
// 在职状态
@ApiModelProperty("编制类型")
private String preparedBy;
// 人员类型
@ApiModelProperty("人员类型")
private String personType;
public void buildSearch(Cnd cnd, String prefix){
if (cnd == null) {
cnd = Cnd.NEW();
}
if (StrUtil.isNotBlank(this.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike(prefix + "username", this.getSearchKeyword());
seg.orLike(prefix + "loginname", this.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "unitId", "=", this.getUnitId());
cnd.andEX(prefix + "userState", "=", this.getUserState());
cnd.andEX(prefix + "preparedBy", "=", this.getPreparedBy());
cnd.andEX(prefix + "personType", "=", this.getPersonType());
}
}
@@ -64,7 +64,13 @@ public class MemberManagePageForm extends PageForm {
cnd = Cnd.NEW();
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("u.unionId", "=", SecurityUtil.getUnionId());
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and("u.unionId", "=", SecurityUtil.getUnionId());
} else if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_GROUP_LEADER.name())) {
cnd.and("u.unionGroupId", "=", SecurityUtil.getUnionGroupId());
} else {
cnd.and("u.id", "=", SecurityUtil.getUserId());
}
} else {
cnd.andEX("u.unionId", "=", pageForm.getUnionId());
}
@@ -4,7 +4,10 @@ import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
@@ -20,14 +23,14 @@ import java.util.Set;
* @Date 2024/8/6 10:42
* @注释
*/
public interface MemberManageService extends BaseService<Sys_user> {
public interface MemberCommonService extends BaseService<Sys_user> {
/**
* 多条件查询Sql
* @param pageForm
* @return
*/
Sql getSql(MemberManagePageForm pageForm, String queryType);
Sql getSql(MemberManagePageForm pageForm);
/**
* 获取会员非会员变更未变更的人数
@@ -44,42 +47,45 @@ public interface MemberManageService extends BaseService<Sys_user> {
Pagination memberHistoryRecords(MemberManagePageForm pageForm);
/**
* 根据用户id获取会员变更信息时间线,所有的变更记录
* @param userId 用户id
* @return List<NutMap>
*/
List<NutMap> getMemberChangeInfoByUserId(String userId);
/**
* 会员变更信息对比
* @param current 当前数据
* @param previous 上一条数据
* 获取可变更字段
* @return
*/
List<NutMap> compareChange(Sys_user_history current, Sys_user_history previous, Set<String> allowChangeFieldNames, Map<String, String> dictMap);
List<NutMap> compareMemberChangeInfo(Sys_user_history history);
NutMap getDictAllowChangeFields();
/**
* 校验是否有变更
* @param record
*/
List<NutMap> compareMemberChangeInfo(MemberApplyRecord record);
/**
* 获取变更类型
* @param changeList 变更记录
* 获取变更详情
* @param recordId 变更记录id
* @return
*/
List<String> compareMemberChangeType(List<NutMap> changeList, MemberApplyRecord record);
List<NutMap> getChangeInfos(String recordId);
List<NutMap> getChangeInfos(MemberChangeRecord record);
/**
* 会员变更信息对比 并更新数据
* 比较有哪些变更类型
* @param record
* @param user
* @return
*/
List<String> compareChangeType(MemberChangeRecord record, View_user user);
/**
* 存储比较变更信息并更新会员信息
* @param recordId
*/
void compareChangeInfoAndUpdateMember(String recordId);
/**
* 存储比较变更信息并更新会员信息
* @param record
*/
void compareMemberChangeInfoAndUpdateUser(MemberApplyRecord record);
void compareChangeInfoAndUpdateMember(MemberChangeRecord record);
/**
* 获取会员的变更信息
* @param userId
* @return
*/
List<NutMap> getAllChangeInfo(String userId);
/**
* 比较两个对象并记录变更的字段工具
@@ -91,11 +97,16 @@ public interface MemberManageService extends BaseService<Sys_user> {
*/
void extractChange(NutMap newMap, NutMap sourceMap, String fieldName, Map<String, String> fieldsMap, List<NutMap> changeList);
/**
* 获取会员变更信息,memberApplyRecord表中名单核对事项人员与sys_user表中人员对比
* @param userId
* @param verificationProjectId
* @return
* 验证变更信息
* @param record
*/
List<NutMap> getLastTimeMemberChangeInfoByUserId(String userId, String verificationProjectId);
void validateChangeAndSetBasicData(MemberChangeRecord record);
/**
* 验证变更信息
* @param record
*/
void validateChangeAndSetBasicData(MemberChangeRecord record, MemberChangeOrigin origin);
}
@@ -1,22 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberModelWorkerPageForm;
import org.nutz.dao.sql.Sql;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @nameMemberModelWorkerService
* @Date 2024/9/25 17:01
* @注释
*/
public interface MemberModelWorkerService extends BaseService<Sys_user> {
Sql getSql(MemberModelWorkerPageForm pageForm);
void doExport(MemberModelWorkerPageForm pageForm, HttpServletResponse response);
}
@@ -32,21 +32,17 @@ public class MemberBranchUnionManageServiceImpl extends BaseServiceImpl<Sys_user
public Pagination getPageData(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
record.id,
record.userId,
record.username,
record.loginname,
record.changeType,
record.changeTypes,
record.changeOrigin,
record.applyDateTime,
record.unitId,
IFNULL(record.unionId, vu.unionid) AS unionId,
vu.unionname AS unionName,
IFNULL(record.unitName, vu.unitname) AS unitName,
IFNULL(record.userState, vu.userState) AS userState,
IFNULL(record.preparedBy, vu.preparedBy) AS preparedBy,
IFNULL(record.personType, vu.personType) AS personType,
info.id,
info.username,
info.loginname,
info.sex,
info.unitName,
info.unionName,
info.userState,
info.preparedBy,
info.personType,
info.changeTypes,
info.applyDateTime,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
@@ -61,16 +57,15 @@ public class MemberBranchUnionManageServiceImpl extends BaseServiceImpl<Sys_user
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN bpm_process_define define On inst.processDefineId = define.id
INNER JOIN member_apply_record record ON record.id = inst.processInstanceBusinessId
INNER JOIN member_change_record record ON record.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
LEFT JOIN vw_user vu ON vu.id = record.userId
$condition
""");
Cnd cnd = Cnd.NEW();
MemberManagePageForm.buildAuditSearch(cnd, pageForm);
cnd.and("nd.nodeCode", "=", 10);
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_BRANCH_UNION_CHANGE.name());
cnd.and("vu.unionId","=", SecurityUtil.getUnionId());
cnd.and("define.`code`", "=", BpmProcessConstant.MEMBER_CHANGE.name());
cnd.and("info.unionId","=", SecurityUtil.getUnionId());
cnd.desc("record.applyDateTime");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, MemberChangeAuditVo.class);
@@ -0,0 +1,487 @@
package com.budwk.app.zhgh.staffmanage.member.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.*;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.specialstaff.model.SpecialStaff;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameMemberServiceImpl
* @Date 2024/8/6 10:43
* @注释
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class MemberCommonServiceImpl extends BaseServiceImpl<Sys_user> implements MemberCommonService {
@Inject
private SysUserService sysUserService;
@Inject
private SysRoleService sysRoleService;
@Inject
private SysDictService sysDictService;
public MemberCommonServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getSql(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
u.id,
u.sex,
u.loginname,
u.username,
u.mobile,
u.unitId,
u.unitName,
u.unionId,
u.unionName,
u.birthday,
u.manyUnit,
u.member,
u.userState,
u.preparedBy,
u.personType,
u.welfareMember,
his.id hisId,
his.changeTypes,
his.changeTime
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
MemberManagePageForm.buildSearch(cnd, pageForm);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("u.unionId", "=", SecurityUtil.getUnionId());
}
cnd.asc("u.unionId");
cnd.asc("u.unitId");
cnd.asc("u.id");
sql.setCondition(cnd);
return sql;
}
@Override
public NutMap getButtonNum(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
(sum( CASE WHEN his.changeTypes IS NOT NULL THEN 1 ELSE 0 END )) as 'changeNum',
(sum( CASE WHEN his.changeTypes IS NULL THEN 1 ELSE 0 END )) as 'notChangeNum',
count(u.id) as 'userSumNum',
(sum( CASE WHEN u.member = 1 THEN 1 ELSE 0 END )) as 'memberNum',
(sum( CASE WHEN u.member != 1 THEN 1 ELSE 0 END )) as 'notMemberNum'
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
MemberManagePageForm.buildSearch(cnd,pageForm);
sql.setCondition(cnd);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
return (NutMap) Daos.query(dao(), sql.toString(), Sqls.callback.map());
}
@Override
public Pagination memberHistoryRecords(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
his.id,
his.changeTime,
his.loginname,
his.username,
his.mobile,
his.birthday,
his.userState,
his.preparedBy,
his.personType,
his.sex,
his.changeTypes,
his.changeOrigin,
his.changeReason,
his.remark,
gh.`name` AS unionName,
unit.`name` AS unitName,
u.id AS userId
FROM
`sys_user_history` his
LEFT JOIN sys_user u ON u.loginname = his.loginname
LEFT JOIN sys_unit unit ON unit.id = u.unitid
LEFT JOIN sys_union gh ON gh.id = unit.unionId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("gh.id", "=", pageForm.getUnionId());
cnd.andEX("his.unitId", "=", pageForm.getUnitId());
cnd.andEX("his.personType", "=", pageForm.getPersonType());
cnd.andEX("his.userState", "=", pageForm.getUserState());
if (StrUtil.isNotBlank(pageForm.getChangeType())){
cnd.and(new Static("JSON_CONTAINS(his.changeTypes, JSON_ARRAY('%s'), '$')".formatted(pageForm.getChangeType())));
}
if (Lang.isNotEmpty(pageForm.getChangeTypes())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String type : pageForm.getChangeTypes()) {
seg.or(new Static("JSON_CONTAINS(his.changeTypes, JSON_ARRAY('%s'), '$')".formatted(type)));
}
cnd.and(seg);
}
if (Lang.isNotEmpty(pageForm.getChangeOrigins())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
for (Integer c : pageForm.getChangeOrigins()) {
seg.orEquals("his.changeOrigin", c);
}
cnd.and(seg);
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("his.loginname", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("his.username", "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.desc("his.changeTime");
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.andEX("his.unionId", "=", SecurityUtil.getUnionId());
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public NutMap getDictAllowChangeFields() {
//获取可变更字段
List<Sys_dict> dictList = sysDictService.getSubListByCode("MEMBER_ALLOW_CHANGES_FIELD");
Set<String> allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet());
allowChangeFieldNames.add("member");
Map<String, String> dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
dictMap.put("member", "会员状态");
return NutMap.NEW().addv("allowChangeFieldNames", allowChangeFieldNames).addv("dictMap", dictMap);
}
@Override
public List<NutMap> getChangeInfos(String recordId) {
Sys_user_history history = dao().fetch(Sys_user_history.class, Cnd.where("recordId", "=", recordId));
if (Lang.isNotEmpty(history)) {
return history.getChangeInfos();
} else {
MemberChangeRecord record = dao().fetch(MemberChangeRecord.class, recordId);
return getChangeInfos(record);
}
}
@Override
public List<NutMap> getChangeInfos(MemberChangeRecord record) {
View_user info = dao().fetch(View_user.class, Cnd.where("id", "=", record.getUserId()));
NutMap map = getDictAllowChangeFields();
Set<String> allowChangeFieldNames = map.getAs("allowChangeFieldNames", Set.class);
Map<String, String> dictMap = map.getAs("dictMap", Map.class);
// 新数据
NutMap newMap = Lang.obj2nutmap(record);
// 原数据
NutMap sourceMap = Lang.obj2nutmap(info);
List<NutMap> changeList = new ArrayList<>();
for (String fieldName : allowChangeFieldNames) {
extractChange(newMap, sourceMap, fieldName, dictMap, changeList);
}
return changeList;
}
@Override
public List<String> compareChangeType(MemberChangeRecord record, View_user user) {
List<String> changeTypes = new ArrayList<>();
changeTypes.add(MemberChangeType.BASIC_CHANGE.name());
if (!ObjectUtil.equals(user.getUserState(), record.getUserState())) {
List<MemberChangeType> list = Arrays.stream(MemberChangeType.values())
.filter(v -> v.getChangeTypeName().equals(record.getUserState())).toList();
if (Lang.isNotEmpty(list)) {
changeTypes.add(list.get(0).name());
}
}
if (!ObjectUtil.equals(user.getMember() == 1, record.getMember())){
if (record.getMember()) {
changeTypes.add(MemberChangeType.RESTORE.name());
} else {
changeTypes.add(MemberChangeType.WITHDRAWAL.name());
}
}
if (!ObjectUtil.equals(user.getUnitId(), record.getUnitId())) {
changeTypes.add(MemberChangeType.UNIT_CHANGE.name());
}
if (!ObjectUtil.equals(user.getUnionId(), record.getUnionId())) {
changeTypes.add(MemberChangeType.UNION_CHANGE.name());
}
return changeTypes;
}
@Override
public void compareChangeInfoAndUpdateMember(String recordId) {
MemberChangeRecord record = dao().fetch(MemberChangeRecord.class, recordId);
compareChangeInfoAndUpdateMember(record);
}
@Override
public void compareChangeInfoAndUpdateMember(MemberChangeRecord record) {
List<NutMap> changeList = getChangeInfos(record);
// 如果有工会关系人员,这个user用来存储数据
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", record.getUserId()));
// 获取会员信息,用于存储变更记录
Sys_user info = dao().fetch(Sys_user.class, Cnd.where("id", "=", record.getUserId()));
String userId = info.getId();
Sys_user_history history = new Sys_user_history();
if (Lang.isNotEmpty(changeList)) {
BeanUtil.copyProperties(info, history);
}
if (Lang.isNotEmpty(history)) {
history.setRecordId(record.getId());
history.setChangeTime(DateUtil.date());
history.setChangeTypes(record.getChangeTypes());
history.setChangeOrigin(record.getChangeOrigin());
// 获取会员角色,加入或退出会员组别,写了之后用处不大,注释暂且保留,想优化就把下面注释打开
Sys_role role = sysRoleService.getByCode(RoleConstant.MEMBER);
// 加入会员
if (record.getMember()) {
// int activityCount = dao().count(ActivityUserScope.class, Cnd.where("userId", "=", userId).and("groupId", "=", 1));
// 如果没有会员角色,新增
int memberCount = dao().count(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", role.getId()));
// if (activityCount <= 0) {
// // 取消或加入会员组别
// if (record.getIsJoinActivityMemberScope() != null && record.getIsJoinActivityMemberScope()) {
// ActivityUserScope scope = new ActivityUserScope();
// scope.setUserId(userId);
// scope.setGroupId(1);
// scope.setGroupName("工会会员");
// dao().insert(scope);
// }
// }
if (memberCount <= 0) {
Sys_user_role userRole = new Sys_user_role();
userRole.setUserId(userId);
userRole.setRoleId(role.getId());
dao().insert(userRole);
}
// 杭医特有,其他学校请删除
record.setPreparedBy("会员");
} else {
// if (record.getIsExitActivityMemberScope() != null && record.getIsExitActivityMemberScope()) {
// dao().clear(ActivityUserScope.class, Cnd.where("userId", "=", userId).and("groupId", "=", 1));
// }
// 非会员取消会员角色
dao().clear(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", role.getId()));
// 杭医特有,其他学校请删除
record.setPreparedBy("教职工");
}
// 到此,表明审核通过,需要存储历史数据,并修改用户数据
BeanUtil.copyProperties(record, info);
info.setId(userId);
// 如果有单位变更,则需要记录单位关系
if (record.getChangeTypes().contains(MemberChangeType.UNIT_CHANGE.name())) {
info.setUnitId(record.getUnitId());
}
// 如果有工会关系变更,也需要记录变更了什么工会
history.setChangeInfos(changeList);
String changeInfos = changeList.stream().map(v -> {
return v.getString("fieldName") + "" + HtmlUtil.cleanHtmlTag(v.getString("sourceValue")) + "->" + HtmlUtil.cleanHtmlTag(v.getString("newValue"));
}).collect(Collectors.joining(""));
history.setChangeInfosStr(changeInfos);
dao().updateIgnoreNull(info);
dao().insert(history);
sysUserService.deleteCache(info.getId());
}
}
@Override
public List<NutMap> getAllChangeInfo(String userId) {
List<NutMap> resultMapList = new ArrayList<>();
Sql sql = Sqls.fetchString(Sqls.create("select loginname from sys_user where id = @id").setParam("id", userId).toString());
dao().execute(sql);
String loginName = sql.getString();
MemberChangeRecord record = dao().fetch(MemberChangeRecord.class, Cnd.where("userId", "=", userId).desc("applyDateTime"));
List<Sys_user_history> historyList = dao().query(Sys_user_history.class, Cnd.where("loginname", "=", loginName)
.and("changeInfos", "is not", null).desc("changeTime"));
List<String> recordList = historyList.stream().map(Sys_user_history::getRecordId).toList();
if (Lang.isNotEmpty(record) && !recordList.contains(record.getId())) {
NutMap map = NutMap.NEW();
List<NutMap> changeInfos = getChangeInfos(record.getId());
map.put("changeInfos", changeInfos);
map.put("timestamp", DateUtil.format(record.getApplyDateTime(), "yyyy-MM-dd HH:mm:ss"));
map.put("changeOriginName", MemberChangeOrigin.valueOf(MemberChangeOrigin.class, record.getChangeOrigin()).changeOriginName);
resultMapList.add(map);
}
for (Sys_user_history history : historyList) {
NutMap map = NutMap.NEW();
List<NutMap> changeInfos = history.getChangeInfos();
map.put("changeInfos", changeInfos);
map.put("timestamp", DateUtil.format(history.getChangeTime(), "yyyy-MM-dd HH:mm:ss"));
map.put("changeOriginName", MemberChangeOrigin.valueOf(MemberChangeOrigin.class, history.getChangeOrigin()).changeOriginName);
resultMapList.add(map);
}
return resultMapList;
}
/**
* 比较两个对象,并记录变更的字段工具
*
* @param newMap 新数据
* @param sourceMap 原数据
* @param fieldsMap 变更字段
* @param changeList 变更集合
*/
@Override
public void extractChange(NutMap newMap, NutMap sourceMap, String fieldName, Map<String, String> fieldsMap, List<NutMap> changeList) {
try {
Object currentValue = this.booleanVerification(newMap.get(fieldName));
Object previousValue = this.booleanVerification(sourceMap.get(fieldName));
if ("unitId".equals(fieldName)) {
currentValue = (newMap.get(fieldName) == null ? this.booleanVerification(newMap.get("unitId")) : currentValue);
previousValue = (sourceMap.get(fieldName) == null ? this.booleanVerification(sourceMap.get("unitId")) : previousValue);
}
if (!ObjectUtil.equals(currentValue, previousValue)) {
String name = fieldsMap.getOrDefault(fieldName, fieldName);
if ("unitId".equals(fieldName) || "unitid".equals(fieldName)) {
List<Sys_unit> unitList = dao().query(Sys_unit.class,
Cnd.where("id", "in", List.of(previousValue, currentValue)));
Object finalPreviousValue = previousValue;
previousValue = unitList.stream().filter(v -> v.getId().equals(String.valueOf(finalPreviousValue)))
.findFirst().orElse(new Sys_unit()).getName();
Object finalCurrentValue = currentValue;
currentValue = unitList.stream().filter(v -> v.getId().equals(String.valueOf(finalCurrentValue)))
.findFirst().orElse(new Sys_unit()).getName();
} else if ("families".equals(fieldName)) {
return;
}
changeList.add(NutMap.NEW()
.setv("field", fieldName)
.setv("fieldName", name)
.setv("sourceValue", previousValue)
.setv("newValue", currentValue));
}
} catch (Exception e) {
log.error("Error while extracting and comparing changes for field: {}", fieldName, e);
}
}
@Override
public void validateChangeAndSetBasicData(MemberChangeRecord record) {
// 不传递 MemberChangeOrigin 默认个人变更
validateChangeAndSetBasicData(record, MemberChangeOrigin.PERSONAL);
}
@Override
public void validateChangeAndSetBasicData(MemberChangeRecord record, MemberChangeOrigin origin) {
// 校验有没有发生变更
List<NutMap> changeInfos = getChangeInfos(record);
if (Lang.isEmpty(changeInfos)) {
throw new BaseException("未获取到异动数据");
}
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", record.getUserId()));
// 比较有哪些变更类型
List<String> changeTypes = compareChangeType(record, user);
record.setChangeTypes(changeTypes);
record.setUserId(user.getId());
// 变更来源
record.setChangeOrigin(origin != null ? origin.name() : MemberChangeOrigin.PERSONAL.name());
record.setApplyDateTime(DateUtil.date());
}
private String booleanVerification(Object value) {
// 检查是否为null或空字符串
if (ObjectUtil.isAllEmpty(value, "")) {
return "无数据";
}
// 处理布尔值
if (value instanceof Boolean) {
return ((Boolean) value) ? "" : "";
}
// 处理数值类型
if (value instanceof Number && List.of(0, 1).contains((Integer) value)) {
return ((Number) value).intValue() != 0 ? "" : "";
}
// 其他对象,返回其字符串表示
if (value instanceof Date) {
return DateUtil.format((Date) value, "yyyy-MM-dd");
}
return value.toString();
}
}
@@ -1,534 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.*;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameMemberServiceImpl
* @Date 2024/8/6 10:43
* @注释
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implements MemberManageService {
@Inject
private SysDictService sysDictService;
public MemberManageServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getSql(MemberManagePageForm pageForm, String queryType) {
Sql sql = Sqls.create("""
SELECT
u.id,
u.sex,
u.loginname,
u.username,
u.mobile,
u.welfareMobile,
u.unitId,
u.unitName,
u.unionId,
u.unionName,
DATE_FORMAT(u.birthday, '%Y-%m-%d ') as birthday,
u.manyUnit,
u.member,
u.userState,
u.preparedBy,
u.personType,
u.welfareMember,
u.isModelWorker,
u.wantJoinLoveMutualAidAssociation,
his.id hisId,
his.changeTypes,
his.changeTime
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
MemberManagePageForm.buildSearch(cnd, pageForm);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
if ("branchUnion".equals(queryType)) {
cnd.and("u.unionId", "=", SecurityUtil.getUnionId());
}
cnd.asc("u.unionId");
cnd.asc("u.unitId");
cnd.asc("u.id");
sql.setCondition(cnd);
return sql;
}
@Override
public NutMap getButtonNum(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
(sum( CASE WHEN his.changeTypes IS NOT NULL THEN 1 ELSE 0 END )) as 'changeNum',
(sum( CASE WHEN his.changeTypes IS NULL THEN 1 ELSE 0 END )) as 'notChangeNum',
count(u.id) as 'userSumNum',
(sum( CASE WHEN u.member = 1 THEN 1 ELSE 0 END )) as 'memberNum',
(sum( CASE WHEN u.member != 1 THEN 1 ELSE 0 END )) as 'notMemberNum'
FROM
vw_user u
LEFT JOIN sys_user_history his ON his.loginname = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
MemberManagePageForm.buildSearch(cnd,pageForm);
sql.setCondition(cnd);
cnd.desc("his.changeTime");
cnd.groupBy("u.id");
return (NutMap) Daos.query(dao(), sql.toString(), Sqls.callback.map());
}
@Override
public Pagination memberHistoryRecords(MemberManagePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
his.id,
his.changeTime,
his.loginname,
his.username,
his.mobile,
his.birthday,
his.userState,
his.preparedBy,
his.personType,
his.sex,
his.changeTypes,
his.changeOrigin,
his.changeReason,
his.remark,
gh.`name` AS unionName,
unit.`name` AS unitName,
u.id AS userId
FROM
`sys_user_history` his
LEFT JOIN sys_user u ON u.loginname = his.loginname
LEFT JOIN sys_unit unit ON unit.id = u.unitid
LEFT JOIN sys_union gh ON gh.id = unit.unionId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("gh.id", "=", pageForm.getUnionId());
cnd.andEX("his.unitId", "=", pageForm.getUnitId());
cnd.andEX("his.personType", "=", pageForm.getPersonType());
cnd.andEX("his.userState", "=", pageForm.getUserState());
if (StrUtil.isNotBlank(pageForm.getChangeType())){
cnd.and(new Static("JSON_CONTAINS(his.changeTypes, JSON_ARRAY('%s'), '$')".formatted(pageForm.getChangeType())));
}
if (Lang.isNotEmpty(pageForm.getChangeTypes())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
for (String type : pageForm.getChangeTypes()) {
seg.or(new Static("JSON_CONTAINS(his.changeTypes, JSON_ARRAY('%s'), '$')".formatted(type)));
}
cnd.and(seg);
}
if (Lang.isNotEmpty(pageForm.getChangeOrigins())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
for (Integer c : pageForm.getChangeOrigins()) {
seg.orEquals("his.changeOrigin", c);
}
cnd.and(seg);
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("his.loginname", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("his.username", "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy());
} else {
cnd.desc("his.changeTime");
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.andEX("his.unionId", "=", SecurityUtil.getUnionId());
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 根据用户id获取用户变更信息
*
* @param userId 用户id
* @return
*/
@Override
public List<NutMap> getMemberChangeInfoByUserId(String userId) {
Sys_user user = dao().fetch(Sys_user.class, userId);
Sys_user_history history = new Sys_user_history();
//获取当前用户信息
BeanUtil.copyProperties(user, history);
history.setChangeTime(new Date());
//获取用户变更信息
List<Sys_user_history> userHistories = dao().query(Sys_user_history.class, Cnd.where("loginname", "=", user.getLoginname()));
userHistories.add(history);
//按时间排序
CollectionUtil.sort(userHistories, Comparator.comparing(Sys_user_history::getChangeTime).reversed());
//获取允许变更的字段
List<Sys_dict> dictList = sysDictService.getSubListByCode("MEMBER_ALLOW_CHANGES_FIELD");
Set<String> allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet());
Map<String, String> dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
List<NutMap> resultList = new ArrayList<>();
for (int i = 1; i < userHistories.size(); i++) {
Sys_user_history current = userHistories.get(i);
Sys_user_history previous = userHistories.get(i - 1);
NutMap nutMap = compareAndRecordChange(current, previous, allowChangeFieldNames, dictMap);
resultList.add(nutMap);
}
return resultList;
}
/**
* 比较两个对象,并记录变更的字段
*
* @param current 当前数据
* @param previous 上一次的数据
* @param allowChangeFieldNames 允许变更的字段名
* @param dictMap 字典数据
* @return NutMap
*/
public NutMap compareAndRecordChange(Sys_user_history current, Sys_user_history previous, Set<String> allowChangeFieldNames, Map<String, String> dictMap) {
NutMap nutMap = NutMap.NEW();
if (StrUtil.isNotBlank(current.getChangeOrigin())) {
String title = MemberChangeOrigin.valueOf(MemberChangeOrigin.class , current.getChangeOrigin()).changeOriginName;
nutMap.put("title", title + "(" + DateUtil.format(current.getChangeTime(), "yyyy-MM-dd HH:mm:ss") + ")");
} else {
nutMap.put("title", DateUtil.format(current.getChangeTime(), "yyyy-MM-dd HH:mm:ss"));
}
nutMap.put("remark", current.getRemark());
nutMap.put("changeTime", DateUtil.format(current.getChangeTime(), "yyyy-MM-dd HH:mm:ss"));
List<NutMap> changeList = new ArrayList<>();
NutMap currentMap = Lang.obj2nutmap(current);
NutMap previousMap = Lang.obj2nutmap(previous);
for (String fieldName : allowChangeFieldNames) {
extractChange(currentMap, previousMap, fieldName, dictMap, changeList);
}
nutMap.put("changeList", changeList);
return nutMap;
}
/**
* 比较两个对象,并记录变更的字段
*
* @param current 当前数据
* @param previous 上一次的数据
* @param allowChangeFieldNames 允许变更的字段名
* @param dictMap 字典数据
* @return NutMap
*/
@Override
public List<NutMap> compareChange(Sys_user_history current, Sys_user_history previous, Set<String> allowChangeFieldNames, Map<String, String> dictMap) {
List<NutMap> changeList = new ArrayList<>();
NutMap currentMap = Lang.obj2nutmap(current);
NutMap previousMap = Lang.obj2nutmap(previous);
for (String fieldName : allowChangeFieldNames) {
extractChange(currentMap, previousMap, fieldName, dictMap, changeList);
}
return changeList;
}
/**
* 校验是否有变更
* @param
*/
@Override
public List<NutMap> compareMemberChangeInfo(Sys_user_history history) {
List<NutMap> infos = history.getChangeInfos();
if (ObjectUtil.isEmpty(infos)) {
throw new BaseException("获取变更记录失败");
}
return infos;
}
/**
* 校验是否有变更
* @param record
*/
@Override
public List<NutMap> compareMemberChangeInfo(MemberApplyRecord record) {
if (ObjectUtil.isEmpty(record) || ObjectUtil.isEmpty(record.getLoginname())) {
throw new BaseException("未获取到变更记录");
}
NutMap previousMap = NutMap.NEW();
View_user user = dao().fetch(View_user.class, Cnd.where("loginname", "=", record.getLoginname()));
previousMap = Lang.obj2nutmap(user);
//获取允许变更的字段
List<Sys_dict> dictList = sysDictService.getSubListByCode("MEMBER_ALLOW_CHANGES_FIELD");
Set<String> allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet());
Map<String, String> dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
List<NutMap> changeList = new ArrayList<>();
NutMap currentMap = Lang.obj2nutmap(record);
for (String fieldName : allowChangeFieldNames) {
extractChange(currentMap, previousMap, fieldName, dictMap, changeList);
}
if (Lang.isEmpty(changeList)) {
throw new BaseException("未获取到变更数据,请核对是否修改了数据");
}
return changeList;
}
@Override
public List<String> compareMemberChangeType(List<NutMap> changeList, MemberApplyRecord record) {
if (Lang.isEmpty(changeList)) {
return null;
}
List<String> changeTypes = new ArrayList<>();
// 有单位发生变化的记录数据
long unitChangeCount = changeList.stream().filter(item -> item != null && "unitId".equals(item.get("fieldName"))).count();
if (unitChangeCount > 0) {
// 有单位的变化,表明是单位变更
changeTypes.add(MemberChangeType.UNIT_CHANGE.name());
// 如果有非单位变更,表明是基本信息变更
long nonUnitChangeCount = changeList.size() - unitChangeCount;
if (nonUnitChangeCount > 0) {
changeTypes.add(MemberChangeType.BASIC_CHANGE.name());
}
} else {
// 没有单位的变化,表明是基本信息变更
changeTypes.add(MemberChangeType.BASIC_CHANGE.name());
}
// record中是否存在前端传递过来的变更状态,(入会/退会)
String changeType = record.getChangeType();
if (StrUtil.isNotBlank(changeType)) {
changeTypes.add(changeType);
}
return changeTypes;
}
/**
* 比较会员信息变更记录,并保存历史数据
*
* @param record 传递的记录
* @return
*/
@Aop(TransAop.READ_COMMITTED)
@Override
public void compareMemberChangeInfoAndUpdateUser(MemberApplyRecord record) {
List<NutMap> changeList = compareMemberChangeInfo(record);
View_user user = dao().fetch(View_user.class, Cnd.where("loginname", "=", record.getLoginname()));
Sys_user_history history = new Sys_user_history();
// 存储变更记录
if (ObjectUtil.isNotEmpty(changeList)) {
// 将当前的用户数据(user)记录成历史数据
BeanUtil.copyProperties(user, history);
if (Lang.isNotEmpty(record.getChangeTypes())) {
history.setChangeTypes(record.getChangeTypes());
} else {
List<String> changeTypes = this.compareMemberChangeType(changeList, record);
history.setChangeTypes(changeTypes);
}
}
if (ObjectUtil.isNotEmpty(history) && ObjectUtil.isNotEmpty(history.getLoginname())) {
Date nowDate = new Date();
history.setRecordId(record.getId());
history.setChangeTime(nowDate);
history.setUnionId(user.getUnionId());
history.setUnionName(user.getUnionName());
history.setChangeOrigin(StrUtil.isNotBlank(record.getChangeOrigin()) ? record.getChangeOrigin() : MemberChangeOrigin.SCHOOL_UNION.name());
history.setChangeReason(record.getNotes());
history.setRemark(record.getRemark());
// 到此,表明审核通过,需要存储历史数据,并修改用户数据
Chain chain = Chain.make("unitPath", null);
changeList.forEach(v -> {
if ("unitId".equals(v.getString("fieldName"))) {
chain.add(v.getString("fieldName"), record.getUnitId());
} else {
chain.add(v.getString("fieldName"), v.getString("newValue"));
}
});
chain.add("member", record.getMember());
chain.add("welfareMember", record.getWelfareMember());
Sys_role memberRole = dao().fetch(Sys_role.class, Cnd.where("`code`", "=", "MEMBER"));
dao().clear(Sys_user_role.class, Cnd.where("userId", "=", user.getId()).and("roleId","=", memberRole.getId()));
if (record.getMember()) {
Sys_user_role userRole = new Sys_user_role();
userRole.setRoleId(memberRole.getId());
userRole.setUserId(user.getId());
dao().insert(userRole);
}
AtomicBoolean isRetire = new AtomicBoolean(false);
String changeInfos = changeList.stream().map(v -> {
if ("userState".equals(v.getString("fieldName")) && "退休".equals(v.getString("newValue"))) {
isRetire.set(true);
chain.add("retireDate", DateUtil.date());
}
return "(变更字段:" + v.getString("name") + ",变更前:" + HtmlUtil.cleanHtmlTag(v.getString("value","")) + ",变更后:" + HtmlUtil.cleanHtmlTag(v.getString("newValue","")) + ")";
}).collect(Collectors.joining(""));
record.setChangeInfos(changeInfos);
history.setChangeInfos(changeList);
history.setChangeInfosStr(changeInfos);
dao().insert(history);
dao().update(Sys_user.class, chain, Cnd.where("loginname", "=", record.getLoginname()));
} else {
throw new BaseException("未获取到变更数据,请核对是否修改了数据");
}
}
@Override
public List<NutMap> getLastTimeMemberChangeInfoByUserId(String userId, String verificationProjectId) {
MemberApplyRecord record = dao().fetch(MemberApplyRecord.class, Cnd.where("userId", "=", userId)
.and("verificationProjectId","=",verificationProjectId));
if (ObjectUtil.isEmpty(record) || ObjectUtil.isEmpty(record.getLoginname())) {
throw new NullPointerException("数据获取失败");
}
View_user user = dao().fetch(View_user.class, Cnd.where("loginname", "=", record.getLoginname()));
//获取允许变更的字段
List<Sys_dict> dictList = sysDictService.getSubListByCode("MEMBER_ALLOW_CHANGES_FIELD");
Set<String> allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet());
Map<String, String> dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
List<NutMap> changeList = new ArrayList<>();
NutMap currentMap = Lang.obj2nutmap(record);
NutMap previousMap = Lang.obj2nutmap(user);
for (String fieldName : allowChangeFieldNames) {
extractChange(currentMap, previousMap, fieldName, dictMap, changeList);
}
return changeList;
}
/**
* 比较两个对象,并记录变更的字段工具
*
* @param current 当前数据
* @param previous 上一次的数据
* @param dictMap 字典数据
* @param changeList 变更集合
*/
@Override
public void extractChange(NutMap current, NutMap previous, String fieldName, Map<String, String> dictMap, List<NutMap> changeList) {
try {
Object currentValue = this.booleanVerification(current.get(fieldName));
Object previousValue = this.booleanVerification(previous.get(fieldName));
if (!ObjectUtil.equals(currentValue, previousValue)) {
String name = dictMap.getOrDefault(fieldName, fieldName);
if ("unitId".equals(fieldName)) {
List<Sys_unit> unitList = dao().query(Sys_unit.class, Cnd.where("id", "in", List.of(previousValue, currentValue)));
Object finalPreviousValue = previousValue;
previousValue = unitList.stream().filter(v->v.getId().equals(String.valueOf(finalPreviousValue))).findFirst().orElse(new Sys_unit()).getName();
Object finalCurrentValue = currentValue;
currentValue = unitList.stream().filter(v->v.getId().equals(String.valueOf(finalCurrentValue))).findFirst().orElse(new Sys_unit()).getName();
} else if ("families".equals(fieldName)) {
return;
}
changeList.add(NutMap.NEW()
.setv("fieldName", fieldName)
.setv("name", name)
.setv("value", previousValue)
.setv("newValue", currentValue));
}
} catch (Exception e) {
log.error("Error while extracting and comparing changes for field: {}", fieldName, e);
}
}
private String booleanVerification(Object value) {
// 检查是否为null或空字符串
if (ObjectUtil.isAllEmpty(value, "")) {
return "无数据";
}
// 处理布尔值
if (value instanceof Boolean) {
return ((Boolean) value) ? "" : "";
}
// 处理数值类型
if (value instanceof Number && List.of(0, 1).contains((Integer) value)) {
return ((Number) value).intValue() != 0 ? "" : "";
}
// 其他对象,返回其字符串表示
if (value instanceof Date) {
return DateUtil.format((Date) value, "yyyy-MM-dd");
}
return value.toString();
}
}
@@ -1,144 +0,0 @@
package com.budwk.app.zhgh.staffmanage.member.service.impl;
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.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberModelWorkerPageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberModelWorkerService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameMemberModelWorkerServiceImpl
* @Date 2024/9/25 17:29
* @注释
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class MemberModelWorkerServiceImpl extends BaseServiceImpl<Sys_user> implements MemberModelWorkerService {
public MemberModelWorkerServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getSql(MemberModelWorkerPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
id,
loginname,
username,
sex,
member,
welfareMember,
personType,
userState,
unionCode,
unionName,
unionId,
unitName,
unitCode,
unitId,
mobile,
birthday,
isModelWorker,
modelWorkerFiles
from
`vw_user`
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("isModelWorker","=",true);
if (!AuthUtil.hasRoleOr("SYSADMIN", "SCHOOL_UNION_ADMIN")) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.andEX("unionId", "=", pageForm.getUnionId());
}
cnd.andEX("unitId", "=", pageForm.getUnitId());
if (StrUtil.isAllNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", pageForm.getSearchKeyword());
seg.orLike("loginname", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("userState", "=", pageForm.getUserState());
cnd.andEX("personType", "=", pageForm.getPersonType());
if (StrUtil.isNotBlank(pageForm.getMemberState())) {
cnd.andEX("member", "=", "true".equals(pageForm.getMemberState()));
}
if (StrUtil.isNotBlank(pageForm.getWelfareMemberState())) {
cnd.andEX("welfareMember", "=", "true".equals(pageForm.getWelfareMemberState()));
}
sql.setCondition(cnd);
return sql;
}
@Override
public void doExport(MemberModelWorkerPageForm pageForm, HttpServletResponse response) {
Sql sql = getSql(pageForm);
List<NutMap> list = listMap(sql);
int size = list.size();
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("身份证号", "idCard", 30));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30));
exportEntities.add(new ExcelExportEntity("是否为正式会员", "member", 10));
exportEntities.add(new ExcelExportEntity("是否为福利会员", "welfareMember", 10));
exportEntities.add(new ExcelExportEntity("劳模材料", "modelWorkerFiles", 20));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
Sheet sheet = workbook.getSheetAt(0);
int linkColumnIndex = exportEntities.size();
CreationHelper helper = workbook.getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();
for (int rowIndex = 1; rowIndex <= size; rowIndex++) {
Row row = sheet.getRow(rowIndex);
Cell cell = row.createCell(linkColumnIndex);
}
// CommonDownloadUtil
}
}
@@ -16,7 +16,7 @@ import java.util.List;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MemberApplyVo extends BpmTaskApprovalVo {
public class MemberCommonVo extends BpmTaskApprovalVo {
private String id;
private String userId;
@@ -28,6 +28,7 @@ public class MemberApplyVo extends BpmTaskApprovalVo {
private String unionId;
private String changeUnionId;
private String unionName;
private String groupName;
private String sex;
private String idCard;
private String nation;
@@ -10,7 +10,7 @@ import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.sys.models.Sys_user_history;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
import com.budwk.app.zhgh.staffmanage.sourcechange.param.SourceChangePageForm;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -21,7 +21,6 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -48,7 +47,7 @@ public class SourceChangeManageController {
@Inject
private SysUserService sysUserService;
@Inject
private MemberManageService memberManageService;
private MemberCommonService memberManageService;
@At("")
@Ok("beetl:/platform/zhgh/staffmanage/sourcechange/manage/index.html")
@@ -118,7 +117,7 @@ public class SourceChangeManageController {
@ApiOperation("人员管理,人员全部变更信息查看")
@SaCheckPermission("staff.sourcechange.manage")
public Result getChangeInfoByUserId(String userId) {
return Result.success(memberManageService.getMemberChangeInfoByUserId(userId));
return Result.success(memberManageService.getAllChangeInfo(userId));
}
@At
@@ -133,7 +132,7 @@ public class SourceChangeManageController {
log.error("FIND_AUDIT_CHANGE_INFO BY BpmTaskApprovalRecordVo error:{}", e.getMessage());
}
List<NutMap> list = memberManageService.compareMemberChangeInfo(history);
List<NutMap> list = memberManageService.getChangeInfos(recordId);
return Result.success(NutMap.NEW().addv("changeList", list).addv("nodeTasks", nodeTasks).addv("remark", history.getRemark()));
}
}
@@ -81,5 +81,17 @@ const businessTool = {
return ""
}
})
},
getEnumOptions(name = null) {
return commonUtil
.axiosService()
.post("/open/common/dictEnumOptions", {name})
.then((resp) => {
if (resp.code === 0) {
return resp.data
} else {
return []
}
})
}
}
@@ -21,10 +21,10 @@ const branchUnionGroupManage = {
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
<el-table :data="tableData" border>
<el-table-column type="index" width="50" label="序号"></el-table-column>
<el-table-column prop="code" label="小组编码"></el-table-column>
<el-table-column prop="name" label="小组名称"></el-table-column>
<el-table-column prop="leaderUserName" label="组长姓名"></el-table-column>
<el-table-column prop="leaderMobile" label="组长电话"></el-table-column>
<el-table-column prop="code" label="小组编码" width="120px"></el-table-column>
<el-table-column prop="name" label="小组名称" width="200px"></el-table-column>
<el-table-column prop="leaderInfos" label="组长信息"></el-table-column>
<el-table-column prop="unitInfos" label="组成单位"></el-table-column>
<el-table-column label="操作" width="200px">
<template slot-scope="{row}">
<el-button type="primary" size="mini" @click="onEdit(row)">
@@ -38,7 +38,7 @@ const branchUnionGroupManage = {
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-dialog :title="formData.id ? '编辑' : '新增'" :visible.sync="dialogFormVisible" width="600px"
:close-on-click-modal="false">
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
@@ -49,11 +49,17 @@ const branchUnionGroupManage = {
<el-form-item label="小组名称" prop="name">
<el-input v-model="formData.name" placeholder="小组名称" maxlength="100"></el-input>
</el-form-item>
<el-form-item label="小组长" prop="leader">
<el-form-item label="组成单位" prop="unitIds">
<el-select clearable filterable placeholder="请选择组成单位" multiple
style="width: 100%" v-model="formData.unitIds">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</el-form-item>
<el-form-item label="小组长" prop="leaders">
<el-select
v-model="formData.leader"
v-model="formData.leaders"
filterable
remote
remote multiple
reserve-keyword
placeholder="请输入姓名查询"
:remote-method="getUserOptions"
@@ -88,22 +94,29 @@ const branchUnionGroupManage = {
rules: {
code: [{ required: true, message: "请输入小组编码", trigger: "blur" }],
name: [{ required: true, message: "请输入小组名称", trigger: "blur" }],
leader: [{ required: true, message: "请选择小组长", trigger: "change" }]
leaders: [{ required: true, message: "请选择小组长", trigger: "change" }],
unitIds: [{ required: true, message: "请选择组成单位", trigger: "change" }],
},
userOptions: []
userOptions: [],
units: [],
}
},
methods: {
openAdd() {
async openAdd() {
this.dialogFormVisible = true
await this.getUnits()
this.$nextTick(() => {
this.formData = {}
this.$refs.formRef.clearValidate()
})
},
onEdit(row) {
async onEdit(row) {
this.formData = { ...row }
this.formData.unitIds = JSON.parse(row.unitIds)
this.formData.leaders = JSON.parse(row.leaders)
await this.getUnits(row.id)
this.getUserOptions(null, this.formData.leaders)
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs.formRef.clearValidate()
@@ -115,7 +128,10 @@ const branchUnionGroupManage = {
if (valid) {
const { id } = this.formData
const url = "/platform/sys/unionGroup" + (id ? "/update" : "/insert")
$.post(url, { ...this.formData, unionId: this.union_id }).then((res) => {
const formData = clone(this.formData)
formData.unitIds = JSON.stringify(formData.unitIds)
formData.leaders = JSON.stringify(formData.leaders)
$.post(url, { ...formData, unionId: this.union_id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.dialogFormVisible = false
@@ -152,12 +168,25 @@ const branchUnionGroupManage = {
})
},
getUserOptions(keyword) {
$.get("/platform/sys/unionGroup/listUser", { keyword, unionId: this.union_id }).then((res) => {
getUserOptions(keyword, userIds = null) {
$.get("/platform/sys/unionGroup/listUser", {
keyword,
unionId: this.union_id,
userIds: JSON.stringify(userIds)
}).then((res) => {
if (res.code === 0) {
this.userOptions = res.data
}
})
},
async getUnits(val) {
const resp = await this.$axios.post("/platform/sys/unionGroup/getUnits", {
unionId: this.union_id,
groupId: val
})
if (resp.code === 0) {
this.units = resp.data
}
}
}
}
@@ -3,105 +3,71 @@ layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%" v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px" align="center">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
@@ -114,17 +80,15 @@ layout("/layouts/platform.html"){
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
@@ -135,32 +99,28 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
showApprovalForm: false
showApprovalForm: false,
formData: {},
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row.id)
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
this.$refs.infoRef.onOpen(row.id)
})
},
doApproval(approvalType) {
@@ -195,36 +155,15 @@ layout("/layouts/platform.html"){
})
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.initData()
this.pageData()
}
})
</script>
@@ -0,0 +1,85 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%" v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</template>
</search>
`,
store,
mixins: [initTableMixins],
data() {
return{
unions: [],
units: [],
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
userState: '',
personType: ''
}
}
},
methods: {
doSearch(){
this.$emit('search', this.pageForm)
},
async initData(){
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,127 @@
const INFO = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="申请信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ $moment(viewData.birthday).format("YYYY年MM月DD日") }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.userUnitName }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.userUnionName }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="聘用方式">{{ viewData.preparedBy }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<template v-if="viewData.loginname == $store.state.user.loginname">
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
</template>
<el-descriptions-item label="签字信息" :span="3" v-if="viewData.sign">
<el-image :src="viewData.sign"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="nodeTasks && nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return{
activeName: "basicInfo",
viewData: {},
nodeTasks: [],
}
},
methods: {
async onOpen(id){
const resp = await $.post('/platform/member/apply/mine/findMemberApplyRecord', {id})
if (resp.code === 0) {
this.viewData = resp.data
this.nodeTasks = resp.data.nodeTasks
if (this.viewData.families) {
this.viewData.families = JSON.parse(this.viewData.families)
} else {
this.viewData.families = []
}
}
}
}
}
@@ -0,0 +1,172 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px" align="center">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
showApprovalForm: false,
formData: {},
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row.id)
})
},
openApproval(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.infoRef.onOpen(row.id)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -3,113 +3,87 @@ layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%" v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</template>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-button size="small" type="primary" @click="$store.dispatch('pjaxRoute', '/platform/member/apply/submit')">申请入会</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openChangeView(row)" size="mini" type="primary">查看</el-button>
<el-button
v-if="[10,40,70].includes(row.processInstanceNodeCode)"
size="mini"
type="primary"
@click="$store.dispatch('pjaxRoute', '/platform/member/apply/submit?id='+row.id)"
>
编辑
</el-button>
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
<el-button v-if="[10].includes(row.processInstanceNodeCode)" size="mini" type="danger" @click="doDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-button size="small" type="primary" @click="$store.dispatch('pjaxRoute', '/platform/member/apply/submit')">申请入会</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button
v-if="[10,40,70].includes(row.processInstanceNodeCode)"
size="mini"
type="primary"
@click="$store.dispatch('pjaxRoute', '/platform/member/apply/submit?id='+row.id)"
>
编辑
</el-button>
<template v-if="row.groupName">
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
</template>
<template v-else>
<el-button
v-if="[50].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
</template>
<el-button v-if="[10].includes(row.processInstanceNodeCode)" size="mini" type="danger" @click="doDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
@@ -127,27 +101,18 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: []
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
"info": INFO,
'common-query': COMMON_QUERY,
},
methods: {
doDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/delete", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.id)
})
},
openRevoke(row) {
this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
@@ -160,47 +125,27 @@ layout("/layouts/platform.html"){
})
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
doDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/delete", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
debugger
this.initData()
this.pageData()
}
})
</script>
@@ -2,234 +2,170 @@
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%" v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<!--<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>-->
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="审核说明" prop="approvalRemark">
<el-input v-model="formData.approvalRemark" type="textarea" :rows="4" placeholder="请输入审核说明"></el-input>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px" align="center">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
showApprovalForm: false
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
created() {
this.initData()
}
})
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
showApprovalForm: false,
formData: {},
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row.id)
})
},
openApproval(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.infoRef.onOpen(row.id)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
@@ -6,6 +6,11 @@ layout("/layouts/platform.html"){
<h3 style="color: var(--color-primary)" slot="header">入会申请</h3>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">
<el-form-item prop="loginname">
<el-input v-model="formData.loginname" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input v-model="formData.username" readonly size="small"></el-input>
@@ -14,16 +19,11 @@ layout("/layouts/platform.html"){
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation" code="USER_NATION"></dict-select>
@@ -73,23 +73,28 @@ layout("/layouts/platform.html"){
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE" style="width: 100%"></dict-select>
<dict-select v-model="formData.userState" disabled code="USER_STATE" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="聘用方式">
<el-form-item prop="preparedBy">
<dict-select v-model="formData.preparedBy" code="PREPARED_BY" style="width: 100%"></dict-select>
<dict-select v-model="formData.preparedBy" disabled code="PREPARED_BY" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE" style="width: 100%"></dict-select>
<dict-select v-model="formData.personType" disabled code="PERSON_TYPE" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="32"></el-input>
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="11"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
@@ -97,7 +102,6 @@ layout("/layouts/platform.html"){
<el-input v-model="formData.email" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员及其工作单位" :span="3">
<el-form-item prop="families">
@@ -145,6 +149,23 @@ layout("/layouts/platform.html"){
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="入会意愿" :span="3">
<el-form-item prop="isVoluntary">
<el-checkbox size="medium" style="width: 95%; color: #F56C6C; display: flex; align-items: center;" v-model="formData.isVoluntary">
<div>
<span style="flex: 1; word-wrap: break-word; word-break: break-all; white-space: normal;">
我自愿申请加入学校工会,并委托学校按规定代为扣缴工会会员会费。
</span>
</div>
<div>
<span style="flex: 1; word-wrap: break-word; word-break: break-all; white-space: normal;">
我将严格遵守工会章程,认真执行工会决议,积极参与工会活动,主动融入“学校健康幸福家”建设,为营造温暖、和谐、奋进的校园氛围贡献力量,以实际行动助力学校各项事业发展。
</span>
</div>
</el-checkbox>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row v-if="!this.$store.state.user.member" justify="end" type="flex" class="mt10">
@@ -172,70 +193,75 @@ layout("/layouts/platform.html"){
formRules: {
username: [{ required: false, message: "必填", trigger: "change" }],
sex: [{ required: false, message: "必填", trigger: "change" }],
idCard: [
{ required: false, message: "身份证号不能为空", trigger: "blur" },
{
pattern: /(^\d{6}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}([0-9xX])$)/,
message: "身份证号格式不正确",
trigger: "blur"
}
]
isVoluntary: [{required: true, message: "必填", trigger: ["change", "blur"]}],
email: [
{
validator: (rule, value, callback) => {
if (!value) {
callback();
} else if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
callback();
} else {
callback(new Error("邮箱格式错误"));
}
},
trigger: ["change", "blur"]
}
],
idCard: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/.test(value)) {
// 18位身份证号码格式正确
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 15位身份证号码格式正确
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(18位)
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(15位)
callback();
} else {
// 格式错误,返回错误信息
callback(new Error("身份证号码格式错误"));
}
},
trigger: ["change", "blur"]
}
],
mobile: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1][345789][0-9]{9}$/.test(value)) {
// 手机号格式正确
callback();
} else if (/^\d+-\d+$/.test(value) && value.length <= 16) {
// 座机号格式正确
callback();
} else {
// 格式错误,返回错误信息
callback(new Error(value.includes('-') ? '座机号码格式错误' : '手机号码格式错误'));
}
},
trigger: ["change", "blur"]
}
]
}
}
},
methods: {
init() {
if (this.id) {
this.$axios.post(loc() + "/findApplyById", { id: this.id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
}
})
} else {
const {
id,
username,
loginname,
sex,
idCard,
nation,
political,
education,
governmentPosition,
mobile,
email,
wantJoinLoveMutualAidAssociation,
families,
personalData,
unit,
union
} = this.$store.state.user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "education", education)
this.$set(this.formData, "unitName", unit ? unit.name : null)
this.$set(this.formData, "unitId", unit ? unit.id : null)
this.$set(this.formData, "unionName", union ? union.name : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "governmentPosition", governmentPosition)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "wantJoinLoveMutualAidAssociation", wantJoinLoveMutualAidAssociation)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
},
doSave() {
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios.post(loc() + "/doSave", this.formData).then((res) => {
this.$axios.post("/platform/member/apply/submit/doSave", this.formData).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$store.dispatch("pjaxRoute", "/platform/member/apply/mine")
@@ -248,9 +274,7 @@ layout("/layouts/platform.html"){
this.$confirm("您确定要提交申请吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post(loc() + "/doSubmit", {
...this.formData
})
.post("/platform/member/apply/submit/doSubmit", this.formData)
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
@@ -259,7 +283,79 @@ layout("/layouts/platform.html"){
})
})
.catch()
}
},
async init() {
let user
const resp = await $.post('/platform/member/apply/submit/getSelfUserInfo')
if (resp.code === 0) {
if (!resp.data) {
user = this.$store.state.user
} else {
user = resp.data
}
} else {
user = this.$store.state.user
}
if (this.id) {
const res = await this.$axios.post("/platform/member/apply/submit/findApplyById", { id: this.id })
debugger
if (res.code === 0) {
this.formData = res.data
}
} else {
const {
id,
username,
loginname,
sex,
nation,
birthday,
political,
education,
academicDegree,
position,
unitId,
unitName,
unit,
unionId,
unionName,
union,
campus,
userState,
personType,
idCard,
mobile,
email,
families,
personalData
} = user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "birthday", birthday)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "position", position)
this.$set(this.formData, "education", education)
this.$set(this.formData, "academicDegree", academicDegree)
this.$set(this.formData, "campus", campus)
this.$set(this.formData, "userState", userState)
this.$set(this.formData, "personType", personType)
this.$set(this.formData, "unitName", unit ? unit.name : unitName)
this.$set(this.formData, "unitId", unit ? unit.id : unitId)
this.$set(this.formData, "unionName", union ? union.name : unionName)
this.$set(this.formData, "unionId", union ? union.id : unionId)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
},
},
async created() {
this.init()
@@ -1,118 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<member-audit-table ref="tableRef" @open-change-view="openChangeInfo" @open-edit="openEdit"
@open-approval="openApproval" @open-view="openView"></member-audit-table>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoViewRef"></member-audit-change-info>
<div v-if="showApprovalForm">
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
<template #edit>
<member-change :id="id" :url="url" :edit="true" ref="memberChangeRef" @submit-ready="changeSuccess"></member-change>
</template>
</guava>
</div>
<script>
<!--#include("../../common/audit/memberAuditTable.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/change/memberChange.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data: {
showApprovalForm: false,
id: '',
url: '',
},
components: {
"member-audit-table": MEMBER_AUDIT_TABLE,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO,
"member-info": MEMBER_INFO,
"member-change": MEMBER_CHANGE,
},
methods: {
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openApproval(data) {
this.$refs.guava.public(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.memberAuditChangeInfoViewRef.onOpen({recordId: data.id, userId: data.userId})
})
},
openChangeInfo(data){
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoViewRef.onOpen({recordId: data.id, userId: data.userId})
})
},
openView(userId){
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(userId)
})
},
doSearch() {
this.$refs.tableRef.doSearch()
},
changeSuccess() {
this.$refs.guava.index(() => {
this.doSearch()
})
},
openEdit(row) {
this.id = row.id
this.url = '/platform/member/branchUnion/manage/list/generalMemberChange'
this.$refs.guava.edit(() => {
this.$refs.memberChangeRef.init()
})
}
}
});
</script>
<!--#
}
#-->
@@ -1,102 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<member-manage-query ref="queryRef" @query-ready="onQueryReady"></member-manage-query>
<member-manage-table
ref="tableRef"
v-if="isQueryReady"
@refresh="tableReady"
@change-member="changeMember"
@view-member="viewMember"
@add-member="addMember"
@refresh-table="changeSuccess"
></member-manage-table>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #edit>
<member-apply :admin-operate="true"></member-apply>
</template>
<template #public>
<member-change :id="id" :url="url" ref="memberChangeRef" @submit-ready="changeSuccess"></member-change>
</template>
</guava>
</div>
<script>
<!--#include("../../common/manage/memberManageQuery.js"){}#-->
<!--#include("../../common/manage/memberManageTable.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/apply/memberApply.js"){}#-->
<!--#include("../../common/change/memberChange.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data: {
id: "",
username: "",
url: "",
isQueryReady: false,
hasShownMessage: false
},
components: {
"member-manage-query": MEMBER_MANAGE_QUERY,
"member-manage-table": MEMBER_MANAGE_TABLE,
"member-info": MEMBER_INFO,
"member-apply": MEMBER_APPLY,
"member-change": MEMBER_CHANGE
},
methods: {
changeMember(data) {
this.id = data.id
this.username = data.username
this.url = "/platform/member/branchUnion/manage/list/generalMemberChange"
this.$refs.guava.public(() => {
this.$refs.memberChangeRef.init()
})
},
viewMember(val) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(val)
})
},
addMember() {
this.$refs.guava.edit()
},
onQueryReady(pageForm) {
this.isQueryReady = true
this.$nextTick(() => {
if (this.$refs.tableRef) {
this.$refs.tableRef.pageData()
this.$refs.tableRef.pageForm = pageForm
}
})
},
tableReady(pageForm) {
this.$refs.queryRef.pageForm = pageForm
},
changeSuccess() {
this.$refs.guava.index()
this.$nextTick(() => {
this.$refs.tableRef.pageData()
})
if (this.hasShownMessage) return
// setTimeout(() => {
// this.$message.success('您已成功提交【'+ this.username +'】老师的变更,可前往分工会审核菜单查看审核记录');
// }, 1000);
this.hasShownMessage = true
}
},
created() {}
})
</script>
<!--#
}
#-->
@@ -1,51 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<member-record @open-view="openView" @open-change-info="openChangeInfo"></member-record>
</template>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/record/memberRecord.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
components: {
"member-record": MEMBER_RECORD,
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
},
data: {
userId: ''
},
methods: {
openChangeInfo(row) {
this.$refs.guava.public(() => {
this.$refs.memberAuditChangeInfoRef.onOpen({recordId: row.id, userId: row.userId})
})
},
openView(data) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(data)
})
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,180 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
showApprovalForm: false,
formData: {}
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row){
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openApproval(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.infoRef.onOpen(row)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
// const changeTypesList = JSON.parse(changeTypes)
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,83 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人事编制">
<dict-select v-model="pageForm.preparedBy" placeholder="人事编制" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
</search>
`,
mixins: [initTableMixins],
data() {
return{
unions: [],
units: [],
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
userState: '',
personType: ''
}
}
},
methods: {
doSearch(){
this.$emit('search', this.pageForm)
},
async initData(){
if (this.$auth.hasRoleOr("SYSADMIN, SCHOOL_UNION_ADMIN, SCHOOL_UNION_MEMBER_ADMIN")) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,175 @@
const INFO = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ viewData.birthday ?
$moment(viewData.birthday).format("YYYY年MM月DD日") : '暂无' }}
</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ?
$moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}
</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{
$moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}
</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员'
}}
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<template v-if="$store.state.user.loginname == viewData.loginname">
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center"
header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.personalData" class="text-left" v-html="viewData.personalData"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="变更信息" name="changeInfo" v-if="viewData.changeInfos">
<el-table :data="viewData.changeInfos" :size="tableSize" @sort-change="pageOrder" ref="table"
row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column prop="fieldName" label="变更字段" header-align="center" align="center"></el-table-column>
<el-table-column prop="sourceValue" label="原数据" header-align="center" align="center">
<template slot-scope="{row}">
<div v-html="row.sourceValue"></div>
</template>
</el-table-column>
<el-table-column prop="newValue" label="新数据" header-align="center" align="center">
<template slot-scope="{row}">
<div v-html="row.newValue"></div>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane v-if="nodeTasks && nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3" v-if="task.extVariable && task.extVariable.approvalSignature">
<el-image :src="task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
`,
store,
mixins: [initTableMixins],
data(){
return {
viewData: {
changeInfos: [],
remark: "",
},
nodeTasks: [],
row: null,
activeName: "basicInfo",
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.info()
},
// 获取申请信息
info() {
this.$axios.post("/platform/member/change/mine/findMemberChangeRecord", { id: this.row.id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
this.nodeTasks = res.data.nodeTasks
if (this.viewData.families) {
this.viewData.families = JSON.parse(this.viewData.families)
} else {
this.viewData.families = []
}
}
})
},
}
}
@@ -0,0 +1,117 @@
const MEMBER_ALL_CHANGE_INFO = {
template: /*language=HTML*/ `
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ $moment(viewData.birthday).format("YYYY年MM月DD日") }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? $moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ $moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<template v-if="viewData.welfareMember">
<el-descriptions-item label="福利号码">{{ viewData.welfareMobile }}</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="viewData.loginname == $store.state.user.loginname">
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="历史变更记录" name="changeInfo" v-if="viewData.allChangeInfo">
<el-timeline style="margin-top: 20px">
<el-timeline-item placement="top" v-for="(changeData, index) in viewData.allChangeInfo"
:key="index" :timestamp="changeData.timestamp">
<el-card>
<h5 style="color: #006DB9;font-weight: bolder;margin-bottom: 5px">{{ changeData.changeOriginName }}</h5>
<el-table :data="changeData.changeInfos" size="mini" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column prop="fieldName" label="变更字段" header-align="center" align="center"></el-table-column>
<el-table-column prop="sourceValue" label="原数据" header-align="center" align="center">
<template slot-scope="{row}">
<div v-html="row.sourceValue"></div>
</template>
</el-table-column>
<el-table-column prop="newValue" label="新数据" header-align="center" align="center">
<template slot-scope="{row}">
<div v-html="row.newValue"></div>
</template>
</el-table-column>
</el-table>
</el-card>
</el-timeline-item>
</el-timeline>
</el-tab-pane>
</el-tabs>
`,
store,
mixins: [initTableMixins],
data(){
return{
viewData: {},
activeName: "basicInfo"
}
},
methods:{
onOpen(userId){
this.$axios.post('/platform/member/change/manage/getAllChangeMemberInfo', {userId})
.then(resp => {
if (resp.code === 0) {
this.viewData = resp.data
} else {
this.$message.warning(resp.msg)
}
})
}
}
}
@@ -0,0 +1,421 @@
const MEMBER_CHANGE = {
template: /*language=HTML*/ `
<el-card shadow="never">
<div class="process-title">会员变更</div>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small" class="flow-task-form">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input :value="formData.username + '(' + formData.loginname + ')'" readonly
size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group :disabled="allowFields('sex')" v-model="formData.sex" size="small">
<el-radio border label="男性"></el-radio>
<el-radio border label="女性"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
:disabled="allowFields('nation')" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political"
:disabled="allowFields('political')" code="POLITICAL_STATUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
:disabled="allowFields('education')" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学位">
<el-form-item prop="academicDegree">
<dict-select style="width: 100%" placeholder="请选择学位" v-model="formData.academicDegree"
:disabled="allowFields('academicDegree')"
code="USER_ACADEMIC_DEGREE"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" :disabled="allowFields('idCard')"
placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" :disabled="allowFields('mobile')"
placeholder="请输入联系电话" maxlength="15"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" :disabled="allowFields('email')" placeholder="请输入电子邮箱"
maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
:disabled="allowFields('unitId')" @change="getUnionName"
v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" disabled placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择所属校区" v-model="formData.campus"
:disabled="allowFields('campus')" code="USER_CAMPUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
:disabled="allowFields('userState')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE"
:disabled="allowFields('personType')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="会员状态">
<el-form-item prop="member">
<el-radio-group v-model="formData.member" size="small">
<el-radio border :label="true">会员</el-radio>
<el-radio border :label="false">非会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态">
<el-form-item prop="welfareMember">
<el-radio-group v-model="formData.welfareMember" size="small">
<el-radio border :label="true">福利会员</el-radio>
<el-radio border :label="false">非福利会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.welfareMember">
<el-descriptions-item label="福利联系方式">
<el-form-item prop="welfareMember">
<el-input v-model="formData.welfareMobile" placeholder="请输入选择福利联系方式"
maxlength="11" show-word-limit></el-input>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="formData.loginname == $store.state.user.loginname">
<el-descriptions-item label="家庭主要成员" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50"
placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100"
placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100"
placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" :disabled="allowFields('families')"
@click="formData.families.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0 || allowFields('families')"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简历" :span="3">
<el-form-item prop="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
</el-descriptions>
</el-form>
<el-row justify="end" type="flex" class="mt10">
<el-button @click="$emit('do-back')" v-if="formData.id || !isShow" type="primary">返 回</el-button>
<template v-if="isShow">
<el-button @click="doSave" type="primary">保存变更</el-button>
</template>
<el-button @click="doSubmit" type="primary">提交变更</el-button>
</el-row>
</el-card>
`,
props: {
id: { type: String, default: '' },
},
mixins: [initTableMixins],
store,
data(){
return{
isShow: true,
user: {},
units: [],
unions: [],
// 允许变更的字段
allowChangeFields: [],
formData: {
families: [],
},
formRules: {
username: [{required: false, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
email: [
{
validator: (rule, value, callback) => {
if (!value) {
callback();
} else if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
callback();
} else {
callback(new Error("邮箱格式错误"));
}
},
trigger: ["change", "blur"]
}
],
idCard: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/.test(value)) {
// 18位身份证号码格式正确
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 15位身份证号码格式正确
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(18位)
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(15位)
callback();
} else {
// 格式错误,返回错误信息
callback(new Error("身份证号码格式错误"));
}
},
trigger: ["change", "blur"]
}
],
mobile: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1][345789][0-9]{9}$/.test(value)) {
// 手机号格式正确
callback();
} else if (/^\d+-\d+$/.test(value) && value.length <= 16) {
// 座机号格式正确
callback();
} else {
// 格式错误,返回错误信息
callback(new Error(value.includes('-') ? '座机号码格式错误' : '手机号码格式错误'));
}
},
trigger: ["change", "blur"]
}
]
},
welfareProjectList: []
}
},
methods: {
getUnionName(val){
const data = this.units.find(v => v.id === val)
this.$set(this.formData, 'unionName', data ? data.unionname : '')
},
allowFields(prop) {
return !this.allowChangeFields.map(v => v.code).includes(prop)
},
doSave(){
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
this.$emit('do-save', formData)
})
.catch()
},
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("提交后将进入审核流程,无法再进行编辑,您确定要提交申请吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
this.$emit('do-submit', formData)
})
.catch()
}
})
},
async onOpen(userId){
if (userId) {
this.isShow = false
await this.getUserById(userId)
} else {
this.isShow = true
this.user = this.$store.state.user
}
this.getFormDataValue(this.id)
this.allowChangeFields = await this.$businessTool.getDictOptions("MEMBER_ALLOW_CHANGES_FIELD")
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_MEMBER_ADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit()
this.unions = await this.$businessTool.listUnion()
} else {
this.units = await this.$businessTool.listUnit(this.user.union.id)
}
},
async getUserById(userId){
const resp = await $.post("/platform/member/change/submit/getUserByIdForMemberChange", { userId })
if (resp.code === 0) {
this.user = resp.data
}
},
getFormDataValue(id){
if (id) {
$.post("/platform/member/change/submit/findChangeById", { id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.formData.unionid = this.user.unionid
if (this.formData.families) {
this.formData.families = JSON.parse(this.formData.families)
} else {
this.formData.families = []
}
}
})
} else {
const {
id,
username,
loginname,
sex,
member,
welfareMember,
nation,
birthday,
political,
education,
academicDegree,
position,
unit,
union,
campus,
userState,
personType,
preparedBy,
idCard,
mobile,
welfareMobile,
email,
families,
personalData
} = this.user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "birthday", birthday)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "member", member === 1)
this.$set(this.formData, "welfareMember", welfareMember === 1)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "position", position)
this.$set(this.formData, "education", education)
this.$set(this.formData, "academicDegree", academicDegree)
this.$set(this.formData, "campus", campus)
this.$set(this.formData, "userState", userState)
this.$set(this.formData, "personType", personType)
this.$set(this.formData, "preparedBy", preparedBy)
this.$set(this.formData, "unitName", unit ? unit.name : null)
this.$set(this.formData, "unitId", unit ? unit.id : null)
this.$set(this.formData, "unionName", union ? union.name : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "welfareMobile", welfareMobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
}
},
created(){
// this.init()
},
style: /*language=CSS*/ `
.el-descriptions-item__label {
width: 15% !important;
}
`
}
@@ -0,0 +1,182 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
changeTypeData: [],
showApprovalForm: false,
formData: {},
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row){
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openApproval(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.infoRef.onOpen(row)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
// const changeTypesList = JSON.parse(changeTypes)
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
}
});
</script>
<!--#
}
#-->
@@ -68,7 +68,12 @@ layout("/layouts/platform.html"){
code="UserType"></dict-select>
</div>-->
<el-button @click="addMember" type="primary" size="small">新增会员</el-button>
<!-- <el-button @click="addMember" type="primary" size="small">新增会员</el-button>-->
<el-button type="primary" size="small" icon="el-icon-printer" @click="exportExcel">导出会员名单</el-button>
<el-button type="primary" size="small" icon="el-icon-printer" @click="exportNotEqPhoneExcel"
v-if="$auth.hasRoleOr('SYSADMIN,SCHOOL_UNION_ADMIN')">导出会员福利号码不一致名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
@@ -137,9 +142,14 @@ layout("/layouts/platform.html"){
</el-dropdown-item>
<el-dropdown-item
:command="{type:'change',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN'])">
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_GROUP_LEADER'])">
变更
</el-dropdown-item>
<el-dropdown-item
:command="{type:'changeWelfareMobile',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN'])">
修改福利号码
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
@@ -150,24 +160,53 @@ layout("/layouts/platform.html"){
</template>
<template #view>
<member-info :id="id"></member-info>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #edit>
<member-apply :admin-operate="true"></member-apply>
</template>
<template #public>
<member-change :id="id" :url="url" ref="memberChangeRef"></member-change>
<member-change ref="memberChangeRef" @do-back="$refs.guava.index()" @do-submit="doChangeSubmit"></member-change>
</template>
<template #edit>
<member-all-change ref="memberAllChangeRef"></member-all-change>
</template>
</guava>
<el-dialog title="修改福利号码" :visible.sync="changeWelfareMobileVisible" append-to-body width="30%">
<el-form :model="welfareFormData" label-width="80px">
<el-form-item label="姓名">
<el-input :value="welfareFormData.username" disabled></el-input>
</el-form-item>
<el-form-item label="工号">
<el-input :value="welfareFormData.loginname" disabled></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input :value="welfareFormData.mobile" disabled></el-input>
</el-form-item>
<el-form-item label="福利号码" prop="welfareMobile"
:rules="[
{required: true, message: '请输入福利号码', trigger: 'blur'},
{
pattern: /^1[3-9]\d{9}$/,
message: '请输入有效的手机号码',
trigger: 'blur'
}]">
<el-input v-model="welfareFormData.welfareMobile"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="changeWelfareMobileVisible = false">取消</el-button>
<el-button type="primary" @click="changeWelfareMobile">确定</el-button>
</div>
</el-dialog>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/apply/memberApply.js"){}#-->
<!--#include("../../common/change/memberChange.js"){}#-->
<!--#include("../common/memberChange.js"){}#-->
<!--#include("../common/memberAllChangeInfo.js"){}#-->
new Vue({
el: "#app",
@@ -213,9 +252,7 @@ layout("/layouts/platform.html"){
},
unions: [],
units: [],
changeType: {},
id: "",
url: "",
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名', sortable: true},
@@ -226,11 +263,14 @@ layout("/layouts/platform.html"){
{prop: 'unionName', label: '所属工会', sortable: true},
{prop: 'unitName', label: '所属单位', sortable: true},
],
changeWelfareMobileVisible: false,
welfareFormData: {}
},
components: {
"member-info": MEMBER_INFO,
"member-apply": MEMBER_APPLY,
"member-change": MEMBER_CHANGE,
"member-all-change": MEMBER_ALL_CHANGE_INFO,
},
methods: {
dropdownCommand(command) {
@@ -239,57 +279,108 @@ layout("/layouts/platform.html"){
this.openView(data.id)
} else if (type === 'change') {
this.openChange(data.id)
} else if (type === "changeWelfareMobile") {
this.welfareFormData = {
id: data.id,
username: data.username,
loginname: data.loginname,
mobile: data.mobile,
welfareMobile: data.welfareMobile
}
this.changeWelfareMobileVisible = true
}
},
changeWelfareMobile() {
this.$confirm("确定要将" + this.welfareFormData.username + "的福利号码修改为:" + this.welfareFormData.welfareMobile + "吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/member/change/manage/changeWelfareMobile", this.welfareFormData).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
this.changeWelfareMobileVisible = false
}
})
})
},
openChange(id) {
this.id = null
this.id = id
this.$refs.guava.public()
this.$nextTick(() => {
this.$refs.memberChangeRef.findOne(id)
this.$refs.guava.public(() => {
this.$refs.memberChangeRef.onOpen(id)
})
},
openView(id) {
this.id = null
this.id = id
this.$refs.guava.view()
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(id)
})
},
openUserChangeInfo(row) {
this.$refs.guava.edit(() => {
this.$refs.memberAllChangeRef.onOpen(row.id)
})
},
addMember() {
this.$refs.guava.edit()
},
openUserChangeInfo() {
},
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
return c.map(v => {
return this.changeType[v]
}).join(',')
}
return null
},
async doChangeSubmit(formData) {
const resp = await this.$axios.post('/platform/member/change/manage/doSubmitChange', {
record: JSON.stringify(formData),
approvalRemark: ""
})
if (resp.code === 0) {
this.pageData()
this.$message.success(resp.msg)
this.$refs.guava.index()
} else {
this.$message.error(resp.msg)
}
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
},
changeDateRangeChange(val) {
if (val && val.length > 0) {
this.pageForm.changeDateBefore = val[0]
this.pageForm.changeDateEnd = val[1]
}
},
/**
* 导出会员名单
*/
exportExcel() {
const pageForm = clone(this.pageForm)
this.$downLoad("/platform/member/change/manage/doExport", pageForm)
},
exportNotEqPhoneExcel(){
const pageForm = clone(this.pageForm)
this.$downLoad("/platform/member/change/manage/doExportNotEqPhone", pageForm)
},
async initData() {
const isAdmin = this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])
if (isAdmin) {
this.$businessTool.listUnion(this.pageForm.unionId).then(data => {
this.unions = data
})
this.unions = await this.$businessTool.listUnion(this.pageForm.unionId)
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then(data => {
this.unions = data
})
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
this.$businessTool.getDictOptions("MEMBER_CHANGE_TYPE").then(data => {
this.changeType = data
})
this.url = isAdmin ? "/platform/member/school/manage/generalMemberChange" : "/platform/member/branch/manage/generalMemberChange"
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
@@ -0,0 +1,175 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button
v-if="[10,40,70].includes(row.processInstanceNodeCode)"
size="mini"
type="primary"
@click="$store.dispatch('pjaxRoute', '/platform/member/change/submit?id='+row.id)"
>
编辑
</el-button>
<template v-if="row.groupName">
<el-button
v-if="[20].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
</template>
<template v-else>
<el-button
v-if="[50].includes(row.processInstanceNodeCode) && !row.nextTaskIsComplete"
size="mini"
type="danger"
@click="openRevoke(row)"
>
撤销
</el-button>
</template>
<el-button v-if="[10].includes(row.processInstanceNodeCode)" size="mini" type="danger" @click="doDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script>
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
]
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
doDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/delete", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openRevoke(row) {
this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
// const changeTypesList = JSON.parse(changeTypes)
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -5,105 +5,91 @@ layout("/layouts/platform.html"){
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="变更类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="变更列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label" :prop="column.prop"
:sortable="column.sortable" :width="column.width"
align="center" header-align="center" min-width="100px"
show-overflow-tooltip v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row.id)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="异动信息">
<el-table-column align="center" header-align="center" label="更新时间"
min-width="145px" prop="changeTime"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="异动类型"
prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<!--<span style="color: #0e78c5;cursor: pointer" @click="openUserChangeInfo(row)">
{{getChangeTypes(row.changeTypes)}}
</span>-->
</template>
</el-table-column>
</el-table-column>
<!--<el-table-column align="center" header-align="center" label="操作"
prop="userOnline"
width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>-->
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="变更列表" :app="this"></table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
@sort-change="pageOrder"
resizable
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='loginname'" scope="{row}">
<el-link type="primary" @click="openUserView(row)">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="异动信息" header-align="center">
<el-table-column label="更新时间" prop="changeTime" min-width="145px"
header-align="center"
sortable
align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column label="异动类型" prop="changeTypes" header-align="center"
width="150px"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{ getChangeTypes(row.changeTypes) }}
</span>
</template>
</el-table-column>
</el-table-column>
<!-- <el-table-column label="审核状态">-->
<!-- <template scope="{row}">-->
<!-- <vi-table-state v-if="row.stateId" :state="row"></vi-table-state>-->
<!-- <vi-table-state v-else :state="{stateColor:'#1890ff',stateName:'暂无'}"></vi-table-state>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px" fixed="right">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row.userId)">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-info :id="userId"></member-info>
</template>
<template #view>
<member-all-change ref="memberAllChangeRef"></member-all-change>
</template>
<template #edit>
<member-info ref="memberInfoRef"></member-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../common/memberAllChangeInfo.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el:'#app',
mixins: [initTableMixins],
components: {
"member-info": MEMBER_INFO,
'common-query': COMMON_QUERY,
"member-all-change": MEMBER_ALL_CHANGE_INFO,
},
data(){
return{
@@ -118,46 +104,43 @@ layout("/layouts/platform.html"){
{prop: 'unionName', label: '所属工会', sortable: true},
{prop: 'unitName', label: '所属单位', sortable: true},
],
unions: [],
units: []
changeTypeData: [],
}
},
methods:{
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
return this.userChangeTypeOptions.filter(v => c.includes(v.code)).map(v => v.description).join()
}
return null
},
openView(userId) {
this.id = userId
this.$refs.guava.view()
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion().then(data => {
this.unions = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then(data => {
this.unions = data
})
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then(data => {
this.units = data
})
}
}
openUserView(row){
this.$refs.guava.edit(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openView(row){
this.$refs.guava.view(() => {
this.$refs.memberAllChangeRef.onOpen(row.userId)
})
},
getChangeTypes(changeTypes){
if (!changeTypes) return null
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created(){
this.pageData()
this.initData()
async created(){
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
this.pageData()
}
})
</script>
@@ -0,0 +1,180 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220" align="center">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<!--<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>-->
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/info.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
showApprovalForm: false,
formData: {}
}
},
components: {
'info': INFO,
'common-query': COMMON_QUERY,
},
methods: {
openView(row){
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openApproval(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.infoRef.onOpen(row)
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
// const changeTypesList = JSON.parse(changeTypes)
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,421 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">会员变更申请</h3>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input :value="formData.username + '(' + formData.loginname + ')'" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group :disabled="allowFields('sex')" v-model="formData.sex" size="small">
<el-radio border label="男性"></el-radio>
<el-radio border label="女性"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
:disabled="allowFields('nation')" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political"
:disabled="allowFields('political')" code="POLITICAL_STATUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
:disabled="allowFields('education')" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学位">
<el-form-item prop="academicDegree">
<dict-select style="width: 100%" placeholder="请选择学位" v-model="formData.academicDegree"
:disabled="allowFields('academicDegree')" code="USER_ACADEMIC_DEGREE"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" :disabled="allowFields('idCard')" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" :disabled="allowFields('mobile')" placeholder="请输入联系电话" maxlength="15"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" :disabled="allowFields('email')" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
:disabled="allowFields('unitId')" @change="getUnionName"
v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" disabled placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择所属校区" v-model="formData.campus"
:disabled="allowFields('campus')" code="USER_CAMPUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
:disabled="allowFields('userState')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE"
:disabled="allowFields('personType')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="会员状态">
<el-form-item prop="member">
<el-radio-group v-model="formData.member" size="small">
<el-radio border :label="true">会员</el-radio>
<el-radio border :label="false">非会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态">
<el-form-item prop="welfareMember">
<el-radio-group v-model="formData.welfareMember" size="small">
<el-radio border :label="true">福利会员</el-radio>
<el-radio border :label="false">非福利会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.welfareMember">
<el-descriptions-item label="福利联系方式">
<el-form-item prop="welfareMember">
<el-input v-model="formData.welfareMobile" placeholder="请输入选择福利联系方式" maxlength="11" show-word-limit></el-input>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="formData.loginname == $store.state.user.loginname">
<el-descriptions-item label="家庭主要成员" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50"
placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100"
placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" :disabled="allowFields('families')"
@click="formData.families.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0 || allowFields('families')"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简历" :span="3">
<el-form-item prop="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
</el-descriptions>
</el-form>
<el-row type="flex" justify="end" class="mt20">
<el-button type="primary" plain @click="onSave">保存</el-button>
<el-button type="primary" @click="onSubmit">提交</el-button>
</el-row>
</el-card>
</div>
<script>
new Vue({
el: "#app",
store,
data() {
return {
bizId: GetQueryString("bizId"),
units: [],
unions: [],
// 允许变更的字段
allowChangeFields: [],
formData: {
families: [],
},
formRules: {
username: [{required: false, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
email: [
{
validator: (rule, value, callback) => {
if (!value) {
callback();
} else if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
callback();
} else {
callback(new Error("邮箱格式错误"));
}
},
trigger: ["change", "blur"]
}
],
idCard: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/.test(value)) {
// 18位身份证号码格式正确
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 15位身份证号码格式正确
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(18位)
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(15位)
callback();
} else {
// 格式错误,返回错误信息
callback(new Error("身份证号码格式错误"));
}
},
trigger: ["change", "blur"]
}
],
mobile: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1][345789][0-9]{9}$/.test(value)) {
// 手机号格式正确
callback();
} else if (/^\d+-\d+$/.test(value) && value.length <= 16) {
// 座机号格式正确
callback();
} else {
// 格式错误,返回错误信息
callback(new Error(value.includes('-') ? '座机号码格式错误' : '手机号码格式错误'));
}
},
trigger: ["change", "blur"]
}
]
},
}
},
methods: {
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/member/change/submit/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
this.$store.dispatch("pjaxRoute", "/platform/member/change/mine")
}
})
})
},
// 提交
onSubmit() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/member/change/submit/submit', {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
this.$store.dispatch("pjaxRoute", "/platform/member/change/mine")
}
})
})
},
// 获取表单工会名称
getUnionName(val){
const data = this.units.find(v => v.id === val)
this.$set(this.formData, 'unionName', data ? data.unionname : '')
},
// 获取表单可编辑的字段信息
allowFields(prop) {
return !this.allowChangeFields.map(v => v.code).includes(prop)
},
// 初始化表单数据
async init(userId){
if (userId) {
this.isShow = false
await this.getUserById(userId)
} else {
this.isShow = true
this.user = this.$store.state.user
}
this.getFormDataValue()
this.allowChangeFields = await this.$businessTool.getDictOptions("MEMBER_ALLOW_CHANGES_FIELD")
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_MEMBER_ADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit()
this.unions = await this.$businessTool.listUnion()
} else {
this.units = await this.$businessTool.listUnit(this.user.union.id)
}
},
// 获取根据userId获取用户信息
async getUserById(userId){
const resp = await this.$axios.post("/platform/member/change/apply/getUserByIdForMemberChange", { userId })
if (resp.code === 0) {
this.user = resp.data
}
},
getFormDataValue(){
if (this.bizId) {
this.$axios.post("/platform/member/change/apply/findChangeById", { id: this.bizId }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.formData.unionid = this.user.unionid
if (this.formData.families) {
this.formData.families = JSON.parse(this.formData.families)
} else {
this.formData.families = []
}
}
})
} else {
const {
id,
username,
loginname,
sex,
member,
welfareMember,
nation,
birthday,
political,
education,
academicDegree,
position,
unit,
union,
campus,
userState,
personType,
preparedBy,
idCard,
mobile,
email,
families,
personalData,
welfareMobile
} = this.user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "birthday", birthday)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "member", member === 1)
this.$set(this.formData, "welfareMember", welfareMember === 1)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "position", position)
this.$set(this.formData, "education", education)
this.$set(this.formData, "academicDegree", academicDegree)
this.$set(this.formData, "campus", campus)
this.$set(this.formData, "userState", userState)
this.$set(this.formData, "personType", personType)
this.$set(this.formData, "preparedBy", preparedBy)
this.$set(this.formData, "unitName", unit ? unit.name : null)
this.$set(this.formData, "unitId", unit ? unit.id : null)
this.$set(this.formData, "unionName", union ? union.name : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "mobile", welfareMobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
}
},
created() {
this.init()
}
})
</script>
<!--#
}
#-->
@@ -1,151 +1,150 @@
const MEMBER_APPLY = {
template: `
<!-- <flow-start @task_id="(val)=>{this.TASK_ID = val}" @business_id="(val)=>{this.id = val}">-->
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">入会申请</h3>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border>
<el-descriptions-item label="姓名">
<template v-if="adminOperate">
<el-form-item prop="userId">
<user-select v-model="formData.userId"
api="/platform/member/apply/submit/getApplyUserByUnionOperate"
api_input_key_name="keyWord"
placeholder="请输入工号或姓名进行查询"
:option_label_func="(item)=>{return item.userName + item.loginName + '(' + item.unitName + ')'}"
@change="findOne(formData.userId)"
style="width: 100%"></user-select>
</el-form-item>
</template>
<template v-else>
<el-form-item prop="userName">
<el-input :value="formData.userName" readonly size="small"></el-input>
</el-form-item>
</template>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label=""></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political" code="POLITICAL_STATUS"></dict-select>
<!-- <el-input v-model="formData.political" maxlength="100"></el-input>-->
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%" :disabled="isAdmin"
@change="getUnionName(formData.unitId)" v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
<!--<el-input v-model="formData.unitName" placeholder="请输入工作单位" readonly maxlength="100"></el-input>-->
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" placeholder="请输入职务" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="32"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="是否愿意加入重大疾病爱心互助会" :span="3">
<el-form-item prop="wantJoinLoveMutualAidAssociation">
<el-radio-group v-model="formData.wantJoinLoveMutualAidAssociation" size="small">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭主要成员及其工作单位" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50" placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100" placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" @click="formData.families.push({})">添加</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简况(简历、获奖情况、有何特长)" :span="3">
<el-form-item prop="personalData">
<el-input type="textarea" placeholder="请输入个人简况(简历、获奖情况、有何特长)" v-model="formData.personalData" clearable></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
</el-card>
`,
template: /*language=HTML*/ `
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">入会申请</h3>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border>
<el-descriptions-item label="姓名">
<template v-if="adminOperate">
<el-form-item prop="userId">
<user-select v-model="formData.userId"
api="/platform/member/apply/submit/getApplyUserByUnionOperate"
api_input_key_name="keyWord"
placeholder="请输入工号或姓名进行查询"
:option_label_func="(item)=>{return item.userName + item.loginName + '(' + item.unitName + ')'}"
@change="findOne(formData.userId)"
style="width: 100%"></user-select>
</el-form-item>
</template>
<template v-else>
<el-form-item prop="userName">
<el-input :value="formData.userName" readonly size="small"></el-input>
</el-form-item>
</template>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男性"></el-radio>
<el-radio border label="女性"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political" code="POLITICAL_STATUS"></dict-select>
<!-- <el-input v-model="formData.political" maxlength="100"></el-input>-->
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%" :disabled="isAdmin"
@change="getUnionName(formData.unitId)" v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
<!--<el-input v-model="formData.unitName" placeholder="请输入工作单位" readonly maxlength="100"></el-input>-->
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" placeholder="请输入职务" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="32"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="是否愿意加入重大疾病爱心互助会" :span="3">
<el-form-item prop="wantJoinLoveMutualAidAssociation">
<el-radio-group v-model="formData.wantJoinLoveMutualAidAssociation" size="small">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭主要成员及其工作单位" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50" placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100" placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" @click="formData.families.push({})">添加</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简况(简历、获奖情况、有何特长)" :span="3">
<el-form-item prop="personalData">
<el-input type="textarea" placeholder="请输入个人简况(简历、获奖情况、有何特长)" v-model="formData.personalData" clearable></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
</el-card>
`,
props: {
adminOperate: { type: Boolean, default: false },
id: { type: String },
@@ -1,163 +0,0 @@
const MEMBER_AUDIT_CHANGE_INFO = {
template:
/*language=HTML*/
`
<el-card shadow="never">
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息及变更信息" name="basicInfo">
<div>
<div class="process-title">
当前信息
</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休时间">{{ $moment(viewData.retireDate).format('YYYY-MM-DD') }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
</template>
<template>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="婚姻状况">{{ viewData.marriage || '' }}</el-descriptions-item>
<el-descriptions-item label="证件号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="是否会员">{{ viewData.member ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="是否福利会员">{{ viewData.welfareMember ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="所属工会、工作部门(学院)及职务" span="3">
<template slot="label">工作部门(学院)及岗位</template>
<div class="text-left">
{{ viewData.unionName + '-' + viewData.unitName + ( viewData.governmentPosition ? ( '('
+ viewData.governmentPosition + ')' ) : '' ) }}
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<div v-if="changeList && changeList.length > 0">
<div class="process-title">
{{ '变更记录' + (remark ? ('(变更/审核说明:' + remark + ')') : '') }}
</div>
<el-table ref="changeTable" :data="changeList" row-key="id" style="width: 100%" border>
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="变更字段" prop="name"></el-table-column>
<el-table-column label="原数据" prop="value">
<template slot-scope="scope">
<div v-html="scope.row.value"></div>
</template>
</el-table-column>
<el-table-column label="新数据" prop="newValue">
<template slot-scope="scope">
<div v-html="scope.row.newValue"></div>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane v-if="nodeTasks && nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-card>
`,
props: {
is_default_url: {
type: Boolean,
default: false
}
},
data() {
return {
activeName: "basicInfo",
changeList: [],
nodeTasks: [],
viewData: {},
remark: ""
}
},
methods: {
findAuditChangeInfo(recordId) {
if (!recordId) {
return
}
let url = loc() + "/findAuditChangeInfo"
if (this.is_default_url) {
url = "/platform/sourcechange/manage/findAuditChangeInfo"
}
this.$axios.post(url, { recordId: recordId }).then((res) => {
if (res.code === 0) {
this.changeList = res.data.changeList
this.nodeTasks = res.data.nodeTasks
this.remark = res.data.remark
}
})
},
findUserInfo(userId) {
if (!userId) {
return
}
this.$axios.post("/platform/member/apply/common/findOne", { id: userId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
onOpen(data) {
console.log(data)
this.findAuditChangeInfo(data.recordId)
this.$nextTick(() => {
this.findUserInfo(data.userId)
})
}
}
}
@@ -1,71 +0,0 @@
const MEMBER_AUDIT_RECORD = {
template: `
<div class="process-task-record">
<template v-if="approvalRecord.length > 0" v-for="item in approvalRecord">
<div v-if="item.taskName === '2a9632c6-710f-4d3b-89e4-86566238ce8e'" class="mb25">
<div class="process-title">
{{item.displayName}}
</div>
<el-descriptions :column="3" border :key="item.displayName + item.taskParentId">
<template v-for="task in item.processTaskVOList">
<el-descriptions-item label="姓名">{{task.taskActor?.actorUserName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{task.taskActor?.actorId}}</el-descriptions-item>
<el-descriptions-item label="填写时间">{{$moment(task.createdAt).format('YYYY-MM-DD HH:mm:ss')}}</el-descriptions-item>
</template>
</el-descriptions>
</div>
<div v-else>
<div class="process-title">
{{item.displayName}}
</div>
<el-descriptions :column="3" border :key="item.displayName + item.taskParentId">
<template v-for="task in item.processTaskVOList">
<el-descriptions-item label="姓名">{{task.taskActor?.actorUserName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{task.taskActor?.actorId}}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{task.finishTime ? task.finishTime : '暂无'}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{Object.keys(task.ext.submitTypeText).length !== 0 ? task.ext.submitTypeText : '暂无'}}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{task.ext.comment ? task.ext.comment : '暂无'}}</el-descriptions-item>
</template>
</el-descriptions>
</div>
</template>
<el-empty v-else description="暂无审核记录"></el-empty>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
props: {
id: {
type: String,
required: true
}
},
watch: {
id: {
handler: function (val) {
if (val) {
this.findOne()
}
},
immediate: true
}
},
data() {
return {
approvalRecord: []
}
},
methods: {
findOne() {
if (!this.id) {
return
}
this.$axios.post("/platform/wf/processCommon/approvalRecord", { businessNo: this.id }).then((res) => {
if (res.code === 0) {
this.approvalRecord = res.data
}
})
}
}
}
@@ -1,202 +0,0 @@
const MEMBER_AUDIT_TABLE = {
template: `
<div>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="人员类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="审核列表">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column v-for="column in tableColumns" :label="column.label"
:prop="column.prop" :key="column.prop"
:sortable="column.sortable" :width="column.width"
align="center" header-align="center" min-width="100px"
show-overflow-tooltip>
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row.userId)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="变更类型" prop="changeType" show-overflow-tooltip sortable>
<template slot-scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openChangeView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column header-align="center" label="变更时间" prop="applyDateTime" show-overflow-tooltip sortable>
<template slot-scope="{row}">
<span>{{ row.applyDateTime }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'
&& !(row.processInstanceNodeCode == 10 && row.changeOrigin == 'BRANCH_UNION')"
@click="openApproval(row)"
size="mini"
type="primary">
审核
</el-button>
<el-button v-if="(row.processInstanceTaskStatus==='ACTIVE' || row.processInstanceStatus==='RUNNING')
&& [10,40].includes(row.processInstanceNodeCode) && $auth.hasRole('BRANCH_UNION_CHAIRMAN')"
@click="openEdit(row)"
size="mini"
type="primary">
编辑
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete && row.processInstanceNodeCode != 50"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
changeTypeData: [],
auditChangeVisible: false,
userId: "",
recordId: ""
}
},
methods: {
// 审核
openApproval(row) {
this.$emit("open-approval", row)
},
// 退回
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openEdit(row) {
this.$emit("open-edit", row)
},
openUserChangeInfo(row) {
this.$emit("open-change-view", row)
},
getChangeTypes(changeTypes) {
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).name
})
.join(",")
}
return null
},
openView(userId) {
this.$emit("open-view", userId)
},
openChangeView(row) {
this.$emit("open-change-view", row)
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
async created() {
this.initData()
this.changeTypeData = await this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE")
}
}
@@ -1,368 +0,0 @@
const MEMBER_CHANGE = {
template: /*language=HTML*/ `
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">信息变更</h3>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input :value="formData.username" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group :disabled="allowFields('sex')" v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" :disabled="allowFields('idCard')" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" :disabled="allowFields('nation')" v-model="formData.nation" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" :disabled="allowFields('political')" v-model="formData.political" code="POLITICAL_STATUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" :disabled="allowFields('education')" v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
@change="getUnionName(formData.unitId)"
:disabled="allowFields('unitId')" v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" :disabled="allowFields('governmentPosition')" placeholder="请输入职务" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
style="width: 100%"
:disabled="allowFields('userState')"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="聘用方式">
<el-form-item prop="preparedBy">
<dict-select v-model="formData.preparedBy" code="PREPARED_BY" style="width: 100%"
:disabled="allowFields('preparedBy')"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE" style="width: 100%"
:disabled="allowFields('personType')"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="进站时间" v-show="formData.preparedBy === '博士后'">
<el-form-item prop="postDoctoralJoinDate">
<el-date-picker
v-model="formData.postDoctoralJoinDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" :disabled="allowFields('mobile')" placeholder="请输入联系电话" maxlength="32"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" :disabled="allowFields('email')" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="是否会员">
<el-form-item prop="member">
<span style="color: #0e9558" v-if="formData.member">是</span>
<span style="color: #ac2925" v-else>否</span>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="是否福利会员">-->
<!-- <el-form-item prop="welfareMember">-->
<!-- <span style="color: #0e9558" v-if="formData.welfareMember">是</span>-->
<!-- <span style="color: #ac2925" v-else>否</span>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<!--<el-descriptions-item label="是否重大疾病爱心互助会会员">
<el-form-item prop="wantJoinLoveMutualAidAssociation">
<span style="color: #0e9558" v-if="formData.wantJoinLoveMutualAidAssociation">是</span>
<span style="color: #ac2925" v-else>否</span>
</el-form-item>
</el-descriptions-item>-->
<el-descriptions-item label="变更类型" :span="3">
<el-form-item prop="changeType">
<el-radio-group v-model="formData.changeType">
<el-radio v-for="item in changeTypeOptions" border size="small"
@click.native.prevent="clickDataType(item.code)"
:key="item.id" :label="item.code">{{item.name}}</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.changeType">
<el-descriptions-item label="会员状态" :span="1.5">
<el-form-item prop="changeMember">
<el-radio-group v-model="formData.changeMember" size="mini">
<el-radio :label="true" border>{{ formData.member ? '保留' : '成为' }}会员</el-radio>
<el-radio :label="false" border>取消会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态" :span="1.5">
<el-form-item prop="changeWelfareMember">
<el-radio-group v-model="formData.changeWelfareMember" size="mini">
<el-radio :label="true" border>{{ formData.welfareMember ? '保留' : '成为' }}会员</el-radio>
<el-radio :label="false" border>取消会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.loginname == $store.state.user.loginname">
<el-descriptions-item label="家庭主要成员及其工作单位" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50" placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100" placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" :disabled="allowFields('families')"
@click="formData.families.push({})">添加</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0 || allowFields('families')"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简况(简历、获奖情况、有何特长)" :span="3">
<el-form-item prop="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="变更说明" :span="3">
<el-form-item prop="approvalRemark">
<el-input v-model="formData.approvalRemark" type="textarea" :rows="4" placeholder="请输入变更说明"></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row justify="end" type="flex" class="mt10">
<el-button v-if="showClose" @click="$emit('close')">关 闭</el-button>
<el-button @click="doSubmit" type="primary">提 交</el-button>
</el-row>
</el-card>
`,
props: {
id: { type: String, required: true },
url: { type: String, required: true },
edit: { type: Boolean, default: false },
showClose: { type: Boolean, default: false }
},
store,
data() {
return {
formDisabled: false,
formData: {
families: [],
changeMember: null,
changeWelfareMember: null,
changeWantJoinLoveMutualAidAssociation: null,
verificationProjectId: ""
},
formRules: {
username: [{ required: false, message: "必填", trigger: "change" }],
sex: [{ required: false, message: "必填", trigger: "change" }],
idCard: [
{ required: false, message: "身份证号不能为空", trigger: "blur" },
{
pattern: /(^\d{6}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}([0-9xX])$)/,
message: "身份证号格式不正确",
trigger: "blur"
}
],
nation: [{ required: false, message: "必填", trigger: "change" }],
political: [{ required: false, message: "必填", trigger: "change" }],
education: [{ required: false, message: "必填", trigger: "change" }],
unitName: [{ required: false, message: "必填", trigger: "change" }],
governmentPosition: [{ required: false, message: "必填", trigger: "change" }],
mobile: [
{ required: true, message: "手机号不能为空", trigger: "blur" },
{ pattern: /^1[3-9]\d{9}$/, message: "手机号格式不正确", trigger: "blur" }
],
email: [{ required: false, message: "必填", trigger: "change" }],
changeWantJoinLoveMutualAidAssociation: [{ required: false, message: "必填", trigger: "change" }],
personalData: [{ required: false, message: "必填", trigger: "change" }]
},
allowChangeFields: [],
units: [],
changeTypeOptions: []
}
},
methods: {
clickDataType(e) {
e === this.formData.changeType ? (this.formData.changeType = "") : (this.formData.changeType = e)
this.doSetMemberStatus(e)
},
doSetMemberStatus(name) {
this.$set(this.formData, "changeMember", name ? name === "RESTORE" : "")
this.$set(this.formData, "changeWelfareMember", name ? name === "RESTORE" : "")
this.$set(this.formData, "changeWantJoinLoveMutualAidAssociation", name ? name === "RESTORE" : "")
},
init() {
if (this.id) {
this.findOne(this.id, this.edit)
}
if (!this.allowChangeFields || this.allowChangeFields.length === 0) {
this.$businessTool.getDictOptions("MEMBER_ALLOW_CHANGES_FIELD").then((data) => {
this.allowChangeFields = data.map((v) => v.code)
})
}
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.$businessTool.getDictOptions("MEMBER_CHANGE_TYPE").then((data) => {
this.changeTypeOptions = data
})
},
assignmentFormData(data) {
const source = data
// 特定字段的默认值映射
const defaultValues = {
families: []
}
const setField = (key) => {
// 检查字段是否在 defaultValues 映射中,如果在,则使用其默认值,否则从 source 获取值
const value = defaultValues.hasOwnProperty(key) ? defaultValues[key] : source[key]
this.$set(this.formData, key, value)
}
// 遍历表单项并设置值
this.$refs.formRef.fields.forEach((formItem) => {
setField(formItem.prop)
})
this.$set(this.formData, "loginname", data.loginname)
this.$set(this.formData, "userId", data.id)
},
findOne(id, isEdit) {
this.$axios.post("/platform/member/apply/submit/findOne", { id: id, isEdit: isEdit }).then((res) => {
if (res.code === 0) {
this.assignmentFormData(res.data)
}
})
},
allowFields(prop) {
return !this.allowChangeFields.includes(prop)
},
getUnionName(unitId) {
const data = this.units.find((v) => v.id === unitId)
this.$set(this.formData, "unionName", data.unionName)
},
doSubmit() {
//是否确认提交?
this.$confirm("是否确认提交?提交后将进入审核流程,请仔细核对变更数据是否准确!", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.setSubmitUserMemberStatus()
if (this.edit) {
this.formData.edit = this.edit
this.formData.id = this.id
}
this.$axios
.post(this.url, {
record: JSON.stringify(this.formData),
approvalRemark: this.formData.approvalRemark
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("submit-ready", null)
}
})
})
},
setSubmitUserMemberStatus() {
if (this.formData.changeType) {
this.formData.member = this.formData.changeMember
this.formData.welfareMember = this.formData.changeWelfareMember
}
},
verificationInit(data) {
this.allowChangeFields = data.renewFields
this.$set(this.formData, "changeOrigin", data.changeOrigin)
this.$set(this.formData, "verificationProjectId", data.verificationProjectId)
this.init()
}
},
created() {}
}
@@ -1,112 +0,0 @@
const MEMBER_CHANGE_INFO = {
template: /*language=html*/ `
<el-card shadow="never">
<div>
<div class="process-title">
当前信息
</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休时间">{{ $moment(viewData.retireDate).format('YYYY-MM-DD') }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
</template>
<template>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="婚姻状况">{{ viewData.marriage || '' }}</el-descriptions-item>
<el-descriptions-item label="证件号码" span="2">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="是否会员">{{ viewData.member ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="是否福利会员">{{ viewData.welfareMember ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="所属工会、工作部门(学院)及职务" span="3">
<template slot="label">工作部门(学院)及岗位</template>
<div class="text-left">
{{ viewData.unionName + '-' + viewData.unitName + ( viewData.governmentPosition ? ( '(' + viewData.governmentPosition + ')' ) : '' ) }}
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<div style="margin-top: 20px">
<div class="process-title">
变更信息
</div>
<el-tabs tab-position="left" style="height: 300px;" v-model="activeName">
<el-tab-pane :key="item.changeTime" v-for="(item, index) in viewList"
:name="item.changeTime">
<span slot="label" style="display: flex; align-items: center;" v-html="formattedTitle(item.title)">
<i class="el-icon-date"></i>
</span>
<div style="padding: 0 30px;display: flex;justify-content: flex-start;align-content: center" v-if="item.remark">
<div>
<h5 style="color: var(--color-primary);font-weight: bolder">变更/审核说明:</h5>
</div>
<div style="margin-top: 5px">
<span>{{ item.remark }}</span>
</div>
</div>
<el-table v-if="item.changeList && item.changeList.length > 0" ref="changeTable" :data="item.changeList" row-key="id"
style="width: 95%;margin-left: 20px" border>
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="变更字段" prop="name"></el-table-column>
<el-table-column label="原数据" prop="newValue">
<template slot-scope="scope">
<div v-html="scope.row.newValue"></div>
</template>
</el-table-column>
<el-table-column label="新数据" prop="value">
<template slot-scope="scope">
<div v-html="scope.row.value"></div>
</template>
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="未获取到变更信息"></el-empty>
</el-tab-pane>
</el-tabs>
</div>
</el-card>
`,
data() {
return {
viewList: [],
activeName: "",
viewData: {}
}
},
methods: {
formattedTitle(title) {
const datePattern = /\(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\)/
return title.replace(datePattern, '<span style="display: block;">$&</span>')
},
onOpen(id, changeTime) {
if (!id) {
return
}
this.$axios.post(loc() + "/getChangeInfoByUserId", { userId: id }).then((res) => {
if (res.code === 0) {
this.viewList = res.data.sort((a, b) => new Date(b.title) - new Date(a.title))
this.activeName = changeTime || (this.viewList && this.viewList.length > 0 ? this.viewList[0].changeTime : "")
this.findUserInfo(id)
}
})
},
findUserInfo(id) {
this.$axios.post("/platform/member/apply/common/findOne", { id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
}
}
}
@@ -17,9 +17,9 @@
<el-descriptions-item label="入党时间">{{ viewData.joinPartyDate ? $moment(viewData.joinPartyDate).format('YYYY-MM-DD') : null }}</el-descriptions-item>
<el-descriptions-item label="来校时间">{{ viewData.arrivalAtSchoolDate ? $moment(viewData.arrivalAtSchoolDate).format('YYYY-MM-DD') : null}}</el-descriptions-item>
<el-descriptions-item label="身份类别">{{ viewData.identityType }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="聘用方式">{{ viewData.preparedBy }}</el-descriptions-item>
<el-descriptions-item label="教职工类别">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="预计离退休时间">{{ viewData.retireDate ?
$moment(viewData.retireDate).format('YYYY-MM-DD') : null }}
</el-descriptions-item>
@@ -1,136 +0,0 @@
const MEMBER_MANAGE_QUERY = {
template: `
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="性别">
<dict-select v-model="pageForm.sex" placeholder="性别" @change="doSearch"
code="USER_SEX"></dict-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch"
code="USER_PREPARED_BY_TYPE"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="USER_PERSON_TYPE"></dict-select>
</search-item>
<search-item label="更新日期">
<el-date-picker :picker-options="pickerOptions" @change="changeDateRangeChange"
align="right" end-placeholder="结束日期" format="yyyy-MM-dd"
range-separator="-" start-placeholder="开始日期" style="width: 100%"
type="datetimerange" v-model="pageForm.changeDateRange"
value-format="yyyy-MM-dd"></el-date-picker>
</search-item>
</search>
</el-card>
`,
mixins: [initTableMixins],
data() {
return {
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit("pick", [start, end])
}
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit("pick", [start, end])
}
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit("pick", [start, end])
}
}
]
},
pageForm: {
unionId: null,
unitId: null,
sex: null,
searchKeyword: null,
changed: 2,
isMember: 1,
isWelfareMember: null,
changeTypes: []
},
unions: [],
units: []
}
},
methods: {
changeDateRangeChange(val) {
if (val && val.length > 0) {
this.pageForm.changeDateBefore = val[0]
this.pageForm.changeDateEnd = val[1]
} else {
this.pageForm.changeDateBefore = null
this.pageForm.changeDateEnd = null
}
this.doSearch()
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.unions = await this.$businessTool.listUnion(this.pageForm.unionId)
this.units = await this.$businessTool.listUnit()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
// this.$businessTool.getDictOptions("MEMBER_CHANGE_TYPE").then((data) => {
// this.changeTypes = data
// })
this.doSearch()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
},
doSearch() {
this.$emit("query-ready", this.pageForm)
}
},
created() {
this.initData()
}
}
@@ -1,339 +0,0 @@
<!--#include("../change/memberChangeInfo.js"){}#-->
const MEMBER_MANAGE_TABLE = {
template: /*language=HTML*/ `
<div>
<el-card shadow="never" class="mt10">
<table-tool label="人员列表">
<span class="text-danger">会员:</span>
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.isMember">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="1">会员</el-radio-button>
<el-radio-button :label="0">非会员</el-radio-button>
</el-radio-group>
<!-- <span class="text-danger">福利会员:</span>-->
<!-- <el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.isWelfareMember">-->
<!-- <el-radio-button :label="null">全部</el-radio-button>-->
<!-- <el-radio-button :label="1">福利会员</el-radio-button>-->
<!-- <el-radio-button :label="0">非福利会员</el-radio-button>-->
<!-- </el-radio-group>-->
<span class="text-danger">人员异动:</span>
<el-radio-group @change="doSearch" class="mr5" size="small"
v-model="pageForm.changed">
<el-radio-button :label="2">全部</el-radio-button>
<el-radio-button :label="1">异动</el-radio-button>
<el-radio-button :label="0">未异动</el-radio-button>
</el-radio-group>
<!--<div v-if="pageForm.changed == '1'" class="div-enum">
<dict-select v-model="pageForm.USER_CHANGE_TYPE" placeholder="异动类型" @change="doSearch"
code="UserType"></dict-select>
</div>-->
<!--<el-button @click="addMember" type="primary" size="small">新增会员</el-button>-->
<el-button type="primary" size="small" icon="el-icon-printer" @click="exportExcel">导出会员名单
</el-button>
<el-button type="primary" size="small" icon="el-icon-printer" @click="exportNotEqPhoneExcel" v-if="$auth.hasRoleOr('SYSADMIN,SCHOOL_UNION_ADMIN')">导出会员福利号码不一致名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id"
style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label" :prop="column.prop"
:sortable="column.sortable" :width="column.width"
align="center" header-align="center" min-width="100px"
show-overflow-tooltip v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row.id)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="异动信息">
<el-table-column align="center" header-align="center" label="更新时间"
min-width="145px" prop="changeTime"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="异动类型"
prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openUserChangeInfo(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column v-if="$auth.hasRole('BRANCH_UNION_CHAIRMAN')" header-align="center"
label="审核状态"
prop="auditState">
</el-table-column>
<el-table-column align="center" header-align="center" label="会员" prop="member"
show-overflow-tooltip sortable>
<template scope="{row}">
<span class="text-success" v-if="row.member==1">
<i class="fa fa-circle ml5"></i> 是
</span>
<span class="text-danger" v-else>
<i class="fa fa-circle ml5"></i> 否
</span>
</template>
</el-table-column>
<!-- <el-table-column align="center" header-align="center" label="福利会员" prop="member"-->
<!-- show-overflow-tooltip sortable>-->
<!-- <template scope="{row}">-->
<!-- <span class="text-success" v-if="row.welfareMember==1">-->
<!-- <i class="fa fa-circle ml5"></i> 是-->
<!-- </span>-->
<!-- <span class="text-danger" v-else>-->
<!-- <i class="fa fa-circle ml5"></i> 否-->
<!-- </span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!--<el-table-column align="center" header-align="center" label="劳模" prop="member"
show-overflow-tooltip sortable>
<template scope="{row}">
<span class="text-success " v-if="row.isModelWorker==1">
<i class="fa fa-circle ml5"></i> 是
</span>
<span class="text-danger" v-else>
<i class="fa fa-circle ml5"></i> 否
</span>
</template>
</el-table-column>-->
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline"
width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item
:command="{type:'change',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN'])">
变更
</el-dropdown-item>
<el-dropdown-item
:command="{type:'changeWelfareMobile',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN'])">
修改福利号码
</el-dropdown-item>
<!--<el-dropdown-item
:command="{type:'setModelWorker',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN']) && !row.isModelWorker">
设为劳模
</el-dropdown-item>
<el-dropdown-item
:command="{type:'cancelModelWorker',data:row}"
v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','BRANCH_UNION_CHAIRMAN','BRANCH_UNION_CHAIRMAN']) && row.isModelWorker">
取消劳模
</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-dialog title="变更信息" :visible.sync="changeInfoVisible" width="70%">
<member-change-info ref="memberChangeInfoRef"></member-change-info>
</el-dialog>
<el-dialog title="修改福利号码" :visible.sync="changeWelfareMobileVisible" append-to-body width="30%">
<el-form :model="welfareFormData" label-width="80px">
<el-form-item label="姓名">
<el-input :value="welfareFormData.username" disabled></el-input>
</el-form-item>
<el-form-item label="工号">
<el-input :value="welfareFormData.loginname" disabled></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input :value="welfareFormData.mobile" disabled></el-input>
</el-form-item>
<el-form-item label="福利号码" prop="welfareMobile"
:rules="[
{required: true, message: '请输入福利号码', trigger: 'blur'},
{
pattern: /^1[3-9]\\d{9}$/,
message: '请输入有效的手机号码',
trigger: 'blur'
}]">
<el-input v-model="welfareFormData.welfareMobile"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="changeWelfareMobileVisible = false">取消</el-button>
<el-button type="primary" @click="changeWelfareMobile">确定</el-button>
</div>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
components: {
"member-change-info": MEMBER_CHANGE_INFO
},
data() {
return {
changeTypeData: [],
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true, width: "100px" },
{ prop: "birthday", label: "出生年月", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "postDoctoralJoinDate", label: "进站时间", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true }
],
changeInfoVisible: false,
userId: "",
pageForm: {
isMember: 1,
changed: 2
},
changeWelfareMobileVisible: false,
welfareFormData: {}
}
},
methods: {
dropdownCommand(command) {
const { type, data } = command
if (type === "view") {
this.openView(data.id)
} else if (type === "change") {
this.openChange(data)
} else if (type === "setModelWorker") {
this.setModelWorker(data.id)
} else if (type === "cancelModelWorker") {
this.cancelModelWorker(data.id)
} else if (type === "changeWelfareMobile") {
this.welfareFormData = {
id: data.id,
username: data.username,
loginname: data.loginname,
mobile: data.mobile,
welfareMobile: data.welfareMobile
}
this.changeWelfareMobileVisible = true
}
},
changeWelfareMobile() {
this.$confirm("确定要将" + this.welfareFormData.username + "的福利号码修改为:" + this.welfareFormData.welfareMobile + "吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/member/branchUnion/manage/list/changeWelfareMobile", this.welfareFormData).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("refresh-table")
this.changeWelfareMobileVisible = false
}
})
})
},
setModelWorker(userId) {
this.$confirm("确定要将此教工设置为劳模吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/member/modelWorker/manage/setModelWorker", { userId: userId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("refresh-table")
} else {
this.$message.error(res.msg)
}
})
})
},
cancelModelWorker(userId) {
this.$confirm("确定要取消此教工的劳模身份码?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/member/modelWorker/manage/cancelModelWorker", { userIds: JSON.stringify([userId]) })
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("refresh-table")
} else {
this.$message.error(res.msg)
}
})
})
},
openChange(data) {
this.$emit("change-member", { id: data.id, username: data.username })
},
openView(id) {
this.$emit("view-member", id)
},
addMember() {
this.$emit("add-member")
},
openUserChangeInfo(row) {
this.changeInfoVisible = true
this.$nextTick(() => {
this.$refs.memberChangeInfoRef.onOpen(row.id, null)
})
},
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
return c
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).name
})
.join(",")
}
return null
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
this.$emit("refresh", this.pageForm)
}
})
},
exportExcel() {
const pageForm = clone(this.pageForm)
this.$downLoad(loc() + "/doExport", pageForm)
},
exportNotEqPhoneExcel(){
const pageForm = clone(this.pageForm)
this.$downLoad(loc() + "/doExportNotEqPhone", pageForm)
}
},
created() {
this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE").then((res) => {
this.changeTypeData = res
})
}
}
@@ -1,143 +0,0 @@
const MEMBER_RECORD = {
template: `
<div>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="变更类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="变更列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label" :prop="column.prop"
:sortable="column.sortable" :width="column.width"
align="center" header-align="center" min-width="100px"
show-overflow-tooltip v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row.userId)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="异动信息">
<el-table-column align="center" header-align="center" label="更新时间"
min-width="145px" prop="changeTime"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="异动类型"
prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: var(--color-primary);cursor: pointer" @click="openUserChangeInfo(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
userId: "",
recordId: "",
tableColumns: [
{ prop: "loginname", label: "工号" },
{ prop: "username", label: "姓名" },
{ prop: "sex", label: "性别", sortable: true, width: "100px" },
{ prop: "birthday", label: "出生年月", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "remark", label: "变更说明", sortable: true }
],
unions: [],
units: [],
changeTypeData: [],
changeInfoVisible: false,
changeTime: ""
}
},
methods: {
openUserChangeInfo(row) {
this.$emit("open-change-info", row)
},
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
if (!c || c.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return c
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).name
})
.join(",")
}
return null
},
openView(userId) {
this.$emit("open-view", userId)
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.unions = await this.$businessTool.listUnion(this.pageForm.unionId)
this.units = await this.$businessTool.listUnit()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
this.pageData()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
created() {
this.pageData()
this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE").then((res) => {
this.changeTypeData = res
})
}
}
@@ -1,236 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="劳模列表">
<el-select v-model="pageForm.memberState" placeholder="会员筛选" clearable
style="width: 120px" @change="doSearch" class="mr10" size="small">
<el-option label="全部会员" value="all"></el-option>
<el-option label="会员" value="true"></el-option>
<el-option label="非会员" value="false"></el-option>
</el-select>
<el-select v-model="pageForm.welfareMemberState" placeholder="福利会员筛选" clearable
style="width: 120px" @change="doSearch" class="mr10" size="small">
<el-option label="全部福利会员" value="all"></el-option>
<el-option label="福利会员" value="true"></el-option>
<el-option label="非福利会员" value="false"></el-option>
</el-select>
<el-button size="small" @click="batchDelete" type="danger">
批量取消劳模
</el-button>
<!--<el-button size="small" @click="openImport" type="primary">
导入
</el-button>-->
<el-button size="small" @click="doExport" type="primary">
导出
</el-button>
</table-tool>
<el-table ref="table" :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
:size="tableSize" @selection-change="tableHandleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop==='member'" scope="{row}">
<span v-if="row.member==1" class="text-success ">
<i class="fa fa-circle ml5"></i>
</span>
<span v-else class="text-danger">
<i class="fa fa-circle ml5"></i>
</span>
</template>
<template v-else-if="column.prop==='welfareMember'" scope="{row}">
<span v-if="row.welfareMember==1" class="text-success ">
<i class="fa fa-circle ml5"></i>
</span>
<span v-else class="text-danger">
<i class="fa fa-circle ml5"></i>
</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="180px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row.id)">查看</el-button>
<el-button size="mini" type="danger" @click="doDelete(row.id)">取消劳模</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<member-info ref="memberInfoRef" :id="userId"></member-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data: {
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
threeUnitId: '',
unionGroupId: '',
personType: '',
userState: '',
memberState: '',
welfareMemberState: ''
},
unions: [],
units: [],
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系电话'},
{prop: 'personType', label: '人员类型'},
{prop: 'userState', label: '在职状态'},
{prop: 'unionName', label: '所属工会'},
{prop: 'unitName', label: '所属单位'},
{prop: 'member', label: '是否会员'},
{prop: 'welfareMember', label: '是否福利员'},
],
checkUsers: [],
userId: '',
},
components: {
"member-info": MEMBER_INFO,
},
methods: {
openView(userId) {
this.userId = userId
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.memberInfoRef.findOne()
})
},
openImport() {
},
doExport() {
this.$downLoad('/platform/member/modelWorker/manage/doExport', this.pageForm)
},
tableHandleSelectionChange(val) {
this.checkUsers = val;
},
batchDelete() {
if (!this.checkUsers.length) {
this.$message.warning("请先勾选需要取消劳模身份的数据!")
return
}
this.$confirm('您确定要取消这些教工的劳模身份吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const userIds = this.checkUsers.map(obj => obj.id);
this.$axios.post('/platform/member/modelWorker/manage/cancelModelWorker', {userIds: JSON.stringify(userIds)} )
.then((res) => {
if (res.code === 0) {
this.pageData()
this.$refs.table.clearSelection();
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
})
},
doDelete(userId) {
this.$confirm('您确定要取消该教工的劳模身份吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.checkUsers = []
this.checkUsers.push(userId)
this.$axios.post('/platform/member/modelWorker/manage/cancelModelWorker', {userIds: JSON.stringify(this.checkUsers)})
.then((res) => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
})
},
initData() {
const resp = this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"]) ? this.pageForm.unionId : this.$store.state.user.union.id
this.$businessTool.listUnion(resp).then(data => {
this.unions = data
})
this.pageData()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then(data => {
this.units = data
})
}
}
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -1,104 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<member-audit-table ref="tableRef" @open-change-view="openChangeInfo" @open-approval="openApproval"
@open-view="openView"></member-audit-table>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoViewRef"></member-audit-change-info>
<div v-if="showApprovalForm">
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="审核说明" prop="approvalRemark">
<el-input v-model="formData.approvalRemark" type="textarea" :rows="4" placeholder="请输入审核说明"></el-input>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../../common/audit/memberAuditTable.js"){}#-->
<!--#include("../../common/audit/memberAuditRecord.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data: {
showApprovalForm: false,
},
components: {
"member-audit-table": MEMBER_AUDIT_TABLE,
"member-audit-record": MEMBER_AUDIT_RECORD,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO,
"member-info": MEMBER_INFO,
},
methods: {
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openApproval(data) {
this.$refs.guava.public(() => {
this.showApprovalForm = true
this.formData = data.approvalParam
this.$refs.memberAuditChangeInfoViewRef.onOpen({recordId: data.id, userId: data.userId})
})
},
openView(userId){
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(userId)
})
},
openChangeInfo(data){
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoViewRef.onOpen({recordId: data.id, userId: data.userId})
})
},
doSearch() {
this.$refs.tableRef.doSearch()
},
}
});
</script>
<!--#
}
#-->
@@ -1,93 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<member-manage-query ref="queryRef" @query-ready="onQueryReady"></member-manage-query>
<member-manage-table ref="tableRef" v-if="isQueryReady" @refresh="tableReady" @change-member="changeMember"
@view-member="viewMember" @add-member="addMember" @refresh-table="changeSuccess"></member-manage-table>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #edit>
<member-apply :admin-operate="true"></member-apply>
</template>
<template #public>
<member-change :id="id" :url="url" ref="memberChangeRef"
@submit-ready="changeSuccess"></member-change>
</template>
</guava>
</div>
<script>
<!--#include("../../common/manage/memberManageQuery.js"){}#-->
<!--#include("../../common/manage/memberManageTable.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/apply/memberApply.js"){}#-->
<!--#include("../../common/change/memberChange.js"){}#-->
const vue = new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data: {
id: '',
url:'',
username: '',
isQueryReady: false,
hasShownMessage: false
},
components: {
"member-manage-query": MEMBER_MANAGE_QUERY,
"member-manage-table": MEMBER_MANAGE_TABLE,
"member-info": MEMBER_INFO,
"member-apply": MEMBER_APPLY,
"member-change": MEMBER_CHANGE,
},
methods: {
changeMember(data){
this.id = data.id
this.url = '/platform/member/schoolUnion/manage/list/generalMemberChange'
this.$refs.guava.public()
this.$nextTick(()=>{
this.$refs.memberChangeRef.init()
})
},
viewMember(val){
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(val)
})
},
addMember(){
this.$refs.guava.edit()
},
onQueryReady(pageForm) {
this.isQueryReady = true;
this.$nextTick(() => {
if (this.$refs.tableRef) {
this.$refs.tableRef.pageForm = pageForm
this.$refs.tableRef.pageData();
}
})
},
tableReady(pageForm){
this.$refs.queryRef.pageForm = pageForm
},
changeSuccess(){
this.$refs.guava.index(() => {
this.$refs.tableRef.pageData()
})
}
},
created() {
}
})
</script>
<!--#
}
#-->
@@ -1,51 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<member-record @open-view="openView" @open-change-info="openChangeInfo"></member-record>
</template>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef" is_default_url></member-audit-change-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/record/memberRecord.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
components: {
"member-record": MEMBER_RECORD,
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
},
data: {
userId: ''
},
methods: {
openChangeInfo(row) {
this.$refs.guava.public(() => {
this.$refs.memberAuditChangeInfoRef.onOpen({recordId: row.id, userId: row.userId})
})
},
openView(data) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(data)
})
}
}
})
</script>
<!--#
}
#-->
@@ -1,7 +1,240 @@
const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
template: /*language=HTML*/ `
<el-card shadow="never">
<search @search="doSearch">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">年&emsp;&emsp;度:</el-col>
<el-col class="query-row-content" :span="12">
<el-row style="margin-left: 3px">
<el-date-picker @change="doSearch()"
style="width: 85%"
:picker-options="pickerOptions"
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="选择年" :clearable="false">
</el-date-picker>
<el-link type="primary" style="margin-left: 10px"
:underline="false"
@click="setNowYear();doSearch()">
本年
</el-link>
</el-row>
</el-col>
<el-col class="query-row-title">姓名/工号:</el-col>
<el-col class="query-row-content" :span="12">
<el-row style="width: 92%">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</el-row>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>所属工会:</span>
<el-select placeholder="所属工会" v-model="pageForm.unionId"
clearable multiple style="margin-left: 33px;width: 80%"
@change="flushUnits();doSearch()"
@clear="flushUnits();doSearch()"
filterable>
<el-option v-for="item in unions" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>所属单位:</span>
<el-select placeholder="所属单位" v-model="pageForm.unitId"
clearable multiple style="margin-left: 33px;width: 80%" filterable>
<el-option v-for="item in units" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row class="query-row">
<el-col class="query-row-title">性别:</el-col>
<el-col class="query-row-content">
<el-tag
:effect="pageForm.sexTypes.includes(item.name)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagClick('sexTypes',item.name)"
style="margin-right: 10px;cursor: pointer"
v-for="item in sexTypeOptions">
{{ item.name }}
</el-tag>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row query-row-tag">
<el-col class="query-row-title">人员类型:</el-col>
<el-col class="query-row-content query-row-content-tag">
<el-tag
style="margin-right: 10px;cursor: pointer"
v-for="item in personTypeOptions"
:key="item.code"
:type="item.name"
:effect="pageForm.personTypes.includes(item.name)?'dark':'plain'"
@click="tagClick('personTypes',item.name)">
{{ item.name }}
</el-tag>
<el-link type="danger"
v-if="personTypeOptions.length&&pageForm.personTypes.length"
:underline="false"
@click="pageForm.personTypes=[];doSearch()">清空
</el-link>
<el-link :underline="false"
@click="pageForm.personTypes=personTypeOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row query-row-tag">
<el-col class="query-row-title">人事编制:</el-col>
<el-col class="query-row-content query-row-content-tag">
<el-tag
style="margin-right: 10px;cursor: pointer"
v-for="item in preparedByOptions"
:key="item.code"
:type="item.name"
:effect="pageForm.preparedBys.includes(item.name)?'dark':'plain'"
@click="tagClick('preparedBys',item.name)">
{{ item.name }}
</el-tag>
<el-link type="danger"
v-if="preparedByOptions.length&&pageForm.preparedBys.length"
:underline="false"
@click="pageForm.preparedBys=[];doSearch()">清空
</el-link>
<el-link :underline="false"
@click="pageForm.preparedBys=preparedByOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row query-row-tag">
<el-col class="query-row-title">在职状态:</el-col>
<el-col class="query-row-content query-row-content-tag">
<el-tag
style="margin-right: 10px;cursor: pointer"
v-for="item in userStateOptions"
:key="item.code"
:type="item.name"
:effect="pageForm.userStates.includes(item.name)?'dark':'plain'"
@click="tagClick('userStates',item.name)">
{{ item.name }}
</el-tag>
<el-link type="danger"
v-if="userStateOptions.length&&pageForm.userStates.length"
:underline="false"
@click="pageForm.userStates=[];doSearch()">清空
</el-link>
<el-link :underline="false"
@click="pageForm.userStates=userStateOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row class="query-row" type="flex" align="middle">
<el-col class="query-row-title">出生日期:</el-col>
<el-col class="query-row-content">
<el-date-picker
v-model="pageForm.startDate"
type="date"
@change="determineStartDate"
placeholder="选择开始日期">
</el-date-picker>
<el-date-picker
v-model="pageForm.endDate"
type="date"
@change="determineEndDate"
placeholder="选择结束日期">
</el-date-picker>
</el-col>
</el-row>
<el-row class="query-row" type="flex" align="middle">
<el-col class="query-row-title">入会日期:</el-col>
<el-col class="query-row-content">
<el-date-picker
v-model="pageForm.startJoinDate"
type="date"
@change="determineStartDate"
placeholder="选择开始日期">
</el-date-picker>
<el-date-picker
v-model="pageForm.endJoinDate"
type="date"
@change="determineEndDate"
placeholder="选择结束日期">
</el-date-picker>
</el-col>
</el-row>
<el-row class="query-row" type="flex" align="middle">
<el-col class="query-row-title">离会日期:</el-col>
<el-col class="query-row-content">
<el-date-picker
v-model="pageForm.startLeaveDate"
type="date"
@change="determineStartDate"
placeholder="选择开始日期">
</el-date-picker>
<el-date-picker
v-model="pageForm.endLeaveDate"
type="date"
@change="determineEndDate"
placeholder="选择结束日期">
</el-date-picker>
</el-col>
</el-row>
<el-row class="query-row" type="flex" align="middle">
<el-col class="query-row-title">年龄范围:</el-col>
<el-col class="query-row-content">
<el-row type="flex" style="align-items: center">
<el-col :span="15">
<el-slider
v-model="pageForm.age"
range
show-stops
:max="100">
</el-slider>
</el-col>
<el-col :span="9" class="pl20">
当前范围:{{ pageForm.age }}
</el-col>
</el-row>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">模糊查询:</el-col>
<el-col class="query-row-content">
<member-cnd @cnd="(v)=>pageForm={...pageForm,...v}"></member-cnd>
</el-col>
</el-row>
<el-row class="query-row" style="justify-content: end">
<el-checkbox v-model="pageForm.reverseSelection" label="是否反选" border
@change="doSearch"
class="reverseCheckBox"></el-checkbox>
<el-button type="danger" icon="el-icon-circle-close" @click="doReset">重置
</el-button>
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</el-row>
<!--<search @search="doSearch">
<search-item label="年度">
<el-date-picker @change="doSearch"
:picker-options="pickerOptions"
@@ -53,8 +286,8 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sexTypes" clearable multiple placeholder="性别">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
<el-option label="男"></el-option>
<el-option label="女"></el-option>
</el-select>
</search-item>
<search-item label="人员类型">
@@ -133,7 +366,7 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
</div>
</div>
</search-item>
</search>
</search>-->
<!-- <el-row type="flex" align="middle" class="query-row">-->
@@ -187,7 +420,6 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
personTypeOptions: [],
preparedByOptions: [],
userStateOptions: [],
memberStatusOptions: [],
unions: [],
units: [],
sexTypeOptions: [
@@ -224,6 +456,15 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
}
this.pageForm.endDate = this.pageForm.endDate.toLocaleDateString().replaceAll("/", "-")
},
determineStartDate() {
if (this.pageForm.endDate) {
if (Date.parse(this.pageForm.startDate) > Date.parse(this.pageForm.endDate)) {
this.pageForm.startDate = ""
this.$notify.warning("开始时间不能大于结束时间")
}
}
this.pageForm.startDate = this.pageForm.startDate.toLocaleDateString().replaceAll("/", "-")
},
tagClick(key, val) {
let idx = this.pageForm[key].indexOf(val)
if (idx !== -1) {
@@ -308,18 +549,15 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
this.$businessTool.getDictOptions("USER_STAFF_TYPE").then((data) => {
this.$businessTool.getDictOptions("USER_PERSON_TYPE").then((data) => {
this.personTypeOptions = data
})
this.$businessTool.getDictOptions("USER_EMPLOYMENT_TYPE").then((data) => {
this.$businessTool.getDictOptions("USER_PREPARED_BY_TYPE").then((data) => {
this.preparedByOptions = data
})
this.$businessTool.getDictOptions("USER_STATE").then((data) => {
this.userStateOptions = data
})
this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE").then((data) => {
this.memberStatusOptions = data
})
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
@@ -342,5 +580,54 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
created() {
this.initData()
this.doSearch()
}
},
style: /*language=CSS*/ `
.reverseCheckBox {
margin: 0 10px 0 0 !important;
}
.query-row {
min-height: 60px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.query-row > .query-title {
width: 100px;
max-width: 100px;
min-width: 100px;
overflow: hidden;
}
.query-row > .query-content {
min-width: 200px;
overflow: hidden;
}
.query-row > .query-content > .el-tag {
margin-bottom: 5px;
margin-top: 5px;
}
.query-row-tag {
padding: 10px 0;
}
.query-row-content-tag {
display: flex;
flex-wrap: wrap; /* 标签自动换行 */
align-items: center;
gap: 4px 6px; /* 横纵向间距 */
}
`
}