Merge remote-tracking branch 'origin/main'

This commit is contained in:
2026-05-07 09:43:47 +08:00
18 changed files with 127 additions and 0 deletions
@@ -12,6 +12,8 @@ import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.engine.FlowEngine;
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.MemberChangeRecord;
import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberChangePageForm;
import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService;
@@ -22,6 +24,7 @@ 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;
@@ -111,6 +114,12 @@ public class MemberChangeMineController {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
// Filter manual input records created by member info input
cnd.and(new Static(
"(info.changeOrigin <> '" + MemberChangeOrigin.HAND_MOVEMENT.name()
+ "' OR info.changeOrigin IS NULL OR info.changeType <> '" + MemberChangeType.NEW.name()
+ "' OR info.changeType IS NULL)"
));
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyDateTime");
} else {
@@ -46,6 +46,8 @@ import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@@ -298,6 +300,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
@Override
public void compareChangeInfoAndUpdateMember(MemberChangeRecord record) {
normalizeArrivalAtSchoolDate(record);
List<NutMap> changeList = getChangeInfos(record);
// 如果有工会关系人员,这个user用来存储数据
@@ -503,6 +506,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
@Override
public void validateChangeAndSetBasicData(MemberChangeRecord record, MemberChangeOrigin origin) {
normalizeArrivalAtSchoolDate(record);
// 校验有没有发生变更
List<NutMap> changeInfos = getChangeInfos(record);
if (Lang.isEmpty(changeInfos)) {
@@ -521,6 +525,39 @@ public class MemberManageServiceImpl extends BaseServiceImpl<Sys_user> implement
}
/**
* 统一规范变更记录中的到校日期,避免 Date 对象复制后以英文字符串形式参与比较或直接落库。
*/
private void normalizeArrivalAtSchoolDate(MemberChangeRecord record) {
if (record == null || StrUtil.isBlank(record.getArrivalAtSchoolDate())) {
return;
}
String arrivalAtSchoolDate = StrUtil.trim(record.getArrivalAtSchoolDate());
try {
Date parsedDate = parseArrivalAtSchoolDate(arrivalAtSchoolDate);
record.setArrivalAtSchoolDate(DateUtil.format(parsedDate, "yyyy-MM-dd"));
} catch (Exception e) {
throw new BaseException("到校日期格式不正确,请使用yyyy-MM-dd格式");
}
}
/**
* 兼容页面手工变更时从视图对象复制出的英文日期字符串。
*/
private Date parseArrivalAtSchoolDate(String arrivalAtSchoolDate) throws ParseException {
if (arrivalAtSchoolDate.matches("\\d{4}-\\d{2}-\\d{2}")) {
return DateUtil.parseDate(arrivalAtSchoolDate);
}
try {
return DateUtil.parse(arrivalAtSchoolDate);
} catch (Exception ignore) {
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
format.setLenient(false);
return format.parse(arrivalAtSchoolDate);
}
}
/**
* 验证申请或变更是否正在进行
* @param userId 用户id
@@ -48,6 +48,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -48,6 +48,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -48,6 +48,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -45,6 +45,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -45,6 +45,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -45,6 +45,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -46,6 +46,11 @@ layout("/layouts/platform.html"){
<el-table-column label="旧身份" prop="oldRoleName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="新身份" prop="nowRoleName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -43,6 +43,11 @@ layout("/layouts/platform.html"){
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -43,6 +43,11 @@ layout("/layouts/platform.html"){
<el-table-column label="申请人" prop="userName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="申请时间" prop="creatTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -62,6 +62,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column prop="applyDate" label="申请时间" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -55,6 +55,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column prop="applyDate" label="申请时间" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -51,6 +51,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="发起人" prop="sponsorName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -51,6 +51,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="发起人" prop="sponsorName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -51,6 +51,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="发起人" prop="sponsorName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -51,6 +51,11 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="发起人" prop="sponsorName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="审核时间" prop="finishTime" show-overflow-tooltip>
<template v-slot="{ row }">
<span>{{ row.finishTime ? $moment(row.finishTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
@@ -290,7 +290,13 @@ layout("/layouts/platform.html"){
},
search(pageForm) {
if (pageForm) {
// 当前页的在职状态、人员类型使用标签数组筛选,公共查询组件回传的是字符串,
// 这里保留当前页数组,避免选择人员属性后把标签筛选状态覆盖掉。
const currentUserStates = this.pageForm.userStates
const currentPersonTypes = this.pageForm.personTypes
this.pageForm = {...this.pageForm, ...pageForm}
this.$set(this.pageForm, "userStates", currentUserStates)
this.$set(this.pageForm, "personTypes", currentPersonTypes)
}
this.doSearch()
},