This commit is contained in:
server
2026-01-29 18:52:37 +08:00
parent f42432eca9
commit e97ab46b75
17 changed files with 128 additions and 52 deletions
@@ -84,7 +84,7 @@ public class SysDataUserUpdateController {
cnd.and(Cnd.likeEX("u.loginname", pageForm.getLoginName()));
cnd.andEX("u.unitId", "=", pageForm.getUnitId());
cnd.andEX("u.userState", "=", pageForm.getUserState());
cnd.andEX("u.;preparedBy", "=", pageForm.getPreparedBy());
cnd.andEX("u.preparedBy", "=", pageForm.getPreparedBy());
cnd.andEX("u.personType", "=", pageForm.getPersonType());
if (StrUtil.isAllNotBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
@@ -42,7 +42,7 @@ public class Sys_union_group extends BaseModel {
@Column
@Comment("小组长")
@ColDefine(type = ColType.VARCHAR, width = 32)
@ColDefine(type = ColType.VARCHAR)
private List<String> leaders;
}
@@ -3,7 +3,9 @@ package com.budwk.app.sys.services.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
@@ -34,6 +36,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@@ -114,7 +117,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
*/
private boolean checkMembershipEligibility(String userState, String preparedBy, Date postDoctoralJoinDate, Sys_user user) {
// 博士后单独判断:只要进站时间在两年内就是会员
if ("博士后".equals(preparedBy)) {
/*if ("博士后".equals(preparedBy)) {
Date twoYearsAgo = DateUtil.offset(DateUtil.date(), DateField.YEAR, -2).toJdkDate();
if (postDoctoralJoinDate != null) {
return postDoctoralJoinDate.after(twoYearsAgo);
@@ -123,6 +126,27 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
return user.getPostDoctoralJoinDate().after(twoYearsAgo);
}
return false;
}*/
// 2026-01-10 JyuHsin 修改博士后逻辑
// 如果是新进博士后,那么直接就不是会员,如果在库里已经是会员的,判断进站时间,如果超过2年就不是会员
if ("博士后".equals(preparedBy)) {
// 如果是新入职的,user参数传的是null,那么直接就不是会员
if(Lang.isEmpty(user)) {
return false;
}
boolean currentIsMember = user.getMember() != null && user.getMember();
if(!currentIsMember) {
return false;
}
// 如果已经是会员的,判断进站时间
if (user.getPostDoctoralJoinDate() != null) {
DateTime afterTwoYear = DateUtil.offset(user.getPostDoctoralJoinDate(), DateField.YEAR, 2);
DateTime today = DateUtil.date();
// 当前日期在进站时间推2年之后,意思就是进站时间超过了2年
return !today.isAfter(afterTwoYear);
}
return false;
}
// 其他人员需要判断在岗状态和聘用方式
@@ -165,7 +189,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
List<String> specialStaffUserLoginNames = dao.query(Sys_user.class, Cnd.where(Sys_user::getId, "in", specialStaffUserIds)).stream().map(Sys_user::getLoginname).toList();
// 找特殊人员在源数据中退休的
List<Sys_user_source> retireList = dao.query(Sys_user_source.class, Cnd.where(Sys_user_source::getPullTime, "=", updateParam.getPullTime()).and("userState", "=", "退").and(Sys_user_source::getLoginname, "in", specialStaffUserLoginNames));
List<String> usList = List.of("辞职", "退休", "调出", "", "退站", "其他", "出站", "死亡", "不保留编制", "退休死亡", "离休", "离职", "退", "合同到期", "解聘", "离休死亡", "开除公职", "合同终止", "解除合同", "开除", "除名", "内退");
List<Sys_user_source> retireList = dao.query(Sys_user_source.class, Cnd.where(Sys_user_source::getPullTime, "=", updateParam.getPullTime()).and("userState", "in", usList).and(Sys_user_source::getLoginname, "in", specialStaffUserLoginNames));
List<String> retireLoginNames = retireList.stream().map(Sys_user_source::getLoginname).distinct().toList();
List<String> list = specialStaffUserLoginNames.stream().filter(o -> !retireLoginNames.contains(o)).toList();
@@ -241,6 +266,12 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
if (StrUtil.isNotBlank(user.getIdCard())) {
u.setIdCard(null);
}
if (StrUtil.isNotBlank(user.getIdCard()) && user.getIdCard().length() == 18) {
DateTime birthDate = IdcardUtil.getBirthDate(user.getIdCard());
if (birthDate != null) {
u.setBirthday(birthDate);
}
}
// 检查会员资格
boolean shouldBeMember = checkMembershipEligibility(
@@ -130,7 +130,7 @@ public class MemberChangeManageController {
// 启动流程
HashMap<String, Object> processVariables = new HashMap<>();
processVariables.put("processType", branchGroupRoleBool ? "unionGroup" : "branchUnion");
processVariables.put("processType", Lang.isNotEmpty(group) ? "unionGroup" : "branchUnion");
bpmService.startSubmitProcessInstance(
BpmProcessConstant.MEMBER_CHANGE.name(),
@@ -159,14 +159,14 @@ public class MemberChangeManageController {
} else {
vars.put("groupAuditNext", "school");
}
completeLatestTask(instance, "工会小组审核通过", null, vars);
completeLatestTask(instance, "工会小组审核通过", BpmTaskApprovalTypeEnum.DYNAMIC, null, vars);
// processVariables.put("")
}
// 2. 分工会审核通过(如果是分工会角色)
if (branchRoleBool || schoolRoleBool) {
completeLatestTask(instance, "分工会审核通过", null, null);
completeLatestTask(instance, "分工会审核通过", BpmTaskApprovalTypeEnum.PASS, null, null);
}
// 3. 校工会审核通过(如果是校工会或超管)
@@ -174,6 +174,7 @@ public class MemberChangeManageController {
// completeLatestTask 后 taskId 可能变化,所以重新查一次
BpmProcessInstance committeeInstance = getProcessInstanceByBusinessId(record.getId());
completeLatestTask(committeeInstance, "校工会审核通过",
BpmTaskApprovalTypeEnum.PASS,
vars -> memberCommonService.compareChangeInfoAndUpdateMember(record.getId()),
null);
}
@@ -215,6 +216,7 @@ public class MemberChangeManageController {
* @param postAction 成功后执行的动作(如更新会员数据)
*/
private void completeLatestTask(BpmProcessInstance instance, String opinion,
BpmTaskApprovalTypeEnum typeEnum,
Consumer<Map<String, Object>> postAction,
Map<String, Object> var) {
BpmProcessTask task = getLatestTaskByInstanceId(instance.getId());
@@ -235,7 +237,7 @@ public class MemberChangeManageController {
variables.putAll(var);
}
// 执行完成任务
bpmService.completeTask(task.getId(), BpmTaskApprovalTypeEnum.PASS, variables, List.of(SecurityUtil.getUserLoginname()));
bpmService.completeTask(task.getId(), typeEnum, variables, List.of(SecurityUtil.getUserLoginname()));
// 回调后置操作
if (postAction != null) {
@@ -198,6 +198,10 @@ public class MemberChangeRecord extends BaseModel {
@Comment("博士后进站时间")
@ColDefine(type = ColType.DATE)
private Date postDoctoralJoinDate;
@Column
@Comment("出生年月")
@ColDefine(type = ColType.DATE)
private Date birthday;
@Column
@Comment("个人简况")
@@ -83,6 +83,7 @@ public class MemberCommonServiceImpl extends BaseServiceImpl<Sys_user> implement
u.idCardType,
u.idCard,
u.mobile,
u.welfareMember,
u.welfareMobile,
u.education,
u.academicDegree,
@@ -237,6 +237,8 @@ public class MemberInfoServiceImpl extends BaseServiceImpl<Sys_user> implements
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("身份证号", "idCard", 30));
exportEntities.add(new ExcelExportEntity("出生年月", "birthday", 30));
exportEntities.add(new ExcelExportEntity("进站时间", "postDoctoralJoinDate", 30));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
@@ -136,7 +136,7 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl<Sys_user> imple
u.loginname,
u.username,
u.sex,
u.birthday,
DATE_FORMAT(u.birthday, '%Y-%m-%d') as birthday,
u.political,
u.joinPartyDate,
u.nation,
@@ -86,8 +86,9 @@ public class WelfareListController {
@SaCheckPermission("welfare.list.mange")
@SLog(tag = "福利名单管理", msg = "管理员删除某个福利会员")
public Result delete(String projectId, String userId, String id) {
WelfareList oldWelfare = welfareListService.fetch(id);
welfareListService.delete(id);
welfareListService.dao().clear(WelfareUserSelection.class, Cnd.where("welfareId", "=", projectId).and("selectUserId", "=", userId));
welfareListService.dao().clear(WelfareUserSelection.class, Cnd.where("welfareId", "=", oldWelfare.getProjectId()).and("selectUserId", "=", oldWelfare.getUserId()));
return Result.success();
}
@@ -4,15 +4,19 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
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.web.commons.auth.utils.AuthUtil;
import com.budwk.app.zhgh.welfare.model.WelfareList;
import com.budwk.app.zhgh.welfare.model.WelfareProject;
import com.budwk.app.zhgh.welfare.model.WelfareUserSelection;
import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm;
import com.budwk.app.zhgh.welfare.service.WelfareListService;
import com.budwk.app.zhgh.welfare.service.WelfareSelectionSituationService;
import com.budwk.app.zhgh.welfare.service.WelfareStatisticsService;
import com.jogamp.common.util.SecurityUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -81,6 +85,12 @@ public class WelfareSelectionSituationController {
@SLog(type = "welfare", tag = "选择福利", msg = "代选福利")
@SaCheckPermission("welfare.selection.situation")
public Result confirmSelect(@Param("selections") WelfareUserSelection[] selections, String projectId, String userId) {
WelfareProject project = dao.fetch(WelfareProject.class, projectId);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if(project.getChoiceTimeEnd().getTime()<new Date().getTime()){
return Result.error("选择时间已结束暂时不能修改!");
}
}
int count = dao.count(WelfareList.class, Cnd.where(WelfareList::getProjectId, "=", projectId).and(WelfareList::getUserId, "=", userId));
if (count == 0) {
return Result.error("此用户没有选择的权限");
@@ -53,7 +53,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
t4.username AS userName,
t4.loginname AS loginName,
t4.sex,
t4.birthday
t4.birthday,
t4.welfareMobile
FROM
welfare_list t1
LEFT JOIN welfare_project_user_selection t2 ON t2.welfareId = t1.projectId AND t2.selectUserId = t1.userId
@@ -111,7 +112,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
GROUP_CONCAT(DISTINCT t2.receiveAddress) AS receiveAddress,
t4.username AS userName,
t4.loginname AS loginName,
t4.sex
t4.sex,
t4.welfareMobile
FROM
welfare_list t1
LEFT JOIN welfare_project_user_selection t2 ON t2.welfareId = t1.projectId AND t2.selectUserId = t1.userId
@@ -168,6 +170,7 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20));
entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20));
entities.add(new ExcelExportEntity("所选福利", "selectedOptions", 20));
entities.add(new ExcelExportEntity("福利号码", "welfareMobile", 20));
entities.add(new ExcelExportEntity("联系电话", "mobile", 20));
if(project.getProvideMode() == 3){
@@ -96,6 +96,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
List<NutMap> userSelections = listMap(sql2);
for (NutMap union : mapUnions) {
System.out.println(union.getString("name"));
// 福利人数
long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId", "").equals(union.getString("id"))).count();
union.put("teacherSum", teacherSum);
@@ -109,7 +110,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
// 各选项的选择人数
for (WelfareProjectSubjectOption option : welfareOptions) {
long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && StrUtil.isNotBlank(v.getString("selectOptionId")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count();
long count = userSelections.stream().filter(v -> v.getString("welfareUnionId", "").equals(union.getString("id")) && StrUtil.isNotBlank(v.getString("selectOptionId")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count();
union.put(option.getId(), count);
}
}
@@ -462,11 +463,11 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
for (NutMap union : mapUnions) {
// 福利人数
long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id"))).count();
long teacherSum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId","").equals(union.getString("id"))).count();
union.put("teacherSum", teacherSum);
// 已选人数
long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getBoolean("has_selected")).count();
long selectedNum = welfareSelectionList.stream().filter(v -> v.getString("welfareUnionId","").equals(union.getString("id")) && v.getBoolean("has_selected")).count();
union.put("selectedNum", selectedNum);
// 未选人数
@@ -474,7 +475,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
// 各选项的选择人数
for (WelfareProjectSubjectOption option : welfareOptions) {
long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count();
long count = userSelections.stream().filter(v -> v.getString("welfareUnionId","").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count();
union.put(option.getId(), count);
}
}
@@ -107,6 +107,16 @@ const MEMBER_CHANGE = {
:disabled="allowFields('preparedBy')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生年月" >
<el-form-item prop="birthday">
<el-date-picker
v-model="formData.birthday"
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="postDoctoralJoinDate">
<el-date-picker
@@ -246,35 +256,35 @@ const MEMBER_CHANGE = {
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 if (/^[A-Z]\d{6,9}$/.test(value)) {
// 香港身份证号码格式正确(8位)
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 if (/^[A-Z]\d{6,9}$/.test(value)) {
// // 香港身份证号码格式正确(8位)
// callback();
// } else {
// // 格式错误,返回错误信息
// callback(new Error("身份证号码格式错误"));
// }
// },
// trigger: ["change", "blur"]
// }
// ],
mobile: [
{
validator: (rule, value, callback) => {
@@ -111,8 +111,8 @@ const MEMBER_STATISTICS_COMPREHENSIVE_QUERY_FORM = {
</el-select>
</el-col>
<el-col :span="12">
<span>&emsp;&emsp;别:</span>
<el-select placeholder="别" v-model="pageForm.sexTypes"
<span>&emsp;&emsp;别:</span>
<el-select placeholder="别" v-model="pageForm.sexTypes"
clearable multiple style="margin-left: 33px;width: 80%"
@change="doSearch()"
@clear="doSearch()"
@@ -483,7 +483,7 @@ const optionSelect = {
})
.catch(() => {
this.isSubmitting = false
this.$message.error("网络错误,请重试")
// this.$message.error("网络错误,请重试")
})
})
},
@@ -144,7 +144,7 @@ layout("/layouts/platform.html"){
{ prop: "welfareUnionName", label: "所属工会", sortable: true },
{ prop: "welfareUnitName", label: "所属单位", sortable: true },
{ prop: "selectedOptions", label: "所选福利", sortable: true },
{ prop: "mobile", label: "联系电话", sortable: true }
{ prop: "welfareMobile", label: "福利号码", sortable: true }
],
optionSelectVisible: false
}
@@ -277,8 +277,8 @@ layout("/layouts/platform_h5.html"){
.welfare-tag {
position: absolute;
right: 8px;
top: 8px;
right: 41px;
top: -3px;
z-index: 2;
}
@@ -531,6 +531,17 @@ layout("/layouts/platform_h5.html"){
text-align: center;
margin-top: 6px;
}
.welfare-info-card .van-collapse-item__content {
padding: 0;
}
.welfare-info-card .welfare-cell-group .van-cell__title {
max-width: 70px;
}
.welfare-info-card .welfare-cell-group .van-cell {
padding: 8px 16px;
}
</style>
<div id="app" v-cloak>
@@ -582,7 +593,7 @@ layout("/layouts/platform_h5.html"){
</div>
<div class="welfare-cell-group">
<van-cell title="选择时间" :value="formatTimeRange(projectInfo.choiceTimeStart, projectInfo.choiceTimeEnd)"></van-cell>
<van-cell title="发放时间" :value="formatTimeRange(projectInfo.provideTimeStart, projectInfo.provideTimeEnd)"></van-cell>
<!--<van-cell title="发放时间" :value="formatTimeRange(projectInfo.provideTimeStart, projectInfo.provideTimeEnd)"></van-cell>-->
<van-cell title="发放地点" :value="projectInfo.provideAddress"></van-cell>
<!-- <van-cell title="发放方式" :value="getProvideModeName(projectInfo.provideMode)"></van-cell>-->
<!-- <van-cell title="签字方式" :value="getSignModeName(projectInfo.signMode)"></van-cell>-->