This commit is contained in:
Paidax
2025-04-10 14:12:45 +08:00
parent 62f0b38ec3
commit 9b9e53056f
16 changed files with 169 additions and 114 deletions
+44 -44
View File
@@ -57,50 +57,50 @@ public class MsgApi {
* @description
*/
public void sendMsg(List<String> channels, String loginNameStr, Integer mtype, String title, String content, String imageUrl,String link) {
// try {
// if (!Globals.MyConfig.getBoolean("SendMsg")) {
// log.info("发送失败,消息暂未开启!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
// return;
// }
//
// if (Globals.isEnv(Env.dev)) {
// log.info("开发模式不允许发送短信!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
// return;
// }
//
// if (StrUtil.isBlank(title)||StrUtil.isBlank(content) ||Lang.isEmpty(channels) || Lang.isEmpty(loginNameStr)) {
// log.info("发送失败,缺少需要参数请检查!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
// return;
// }
//
// String msgToken = getMsgToken();
// NutMap map = new NutMap();
// map.put("channel", String.join(",", channels));
// //推送范围(1:普通模式;2:全体教师;3:全体学生;4:全体人员)
// map.put("objScope", 1);
// map.put("objIds", loginNameStr);
// map.put("mtype", mtype);
// map.put("sendStatus", 1);
// map.put("title", title);
// map.put("content", content);
// map.put("imageUrl", imageUrl);
// map.put("link", link);
//
// HttpRequest request = HttpUtil.createPost(MSG_API)
// .header("token", msgToken)
// .body(Json.toJson(map));
// JSONObject jsonObject = JSON.parseObject(request.execute().body());
// int status = jsonObject.getInteger("code");
//
// if (status == 200) {
// log.info("发送成功>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
// } else {
// log.info("发送失败>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
// throw new RuntimeException("Message sending failed with status code: " + status + ", Message: " + jsonObject.getString("message"));
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
try {
if (!Globals.MyConfig.getBoolean("SendMsg")) {
log.info("发送失败,消息暂未开启!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
if (Globals.isEnv(Env.dev)) {
log.info("开发模式不允许发送短信!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
if (StrUtil.isBlank(title)||StrUtil.isBlank(content) ||Lang.isEmpty(channels) || Lang.isEmpty(loginNameStr)) {
log.info("发送失败,缺少需要参数请检查!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
String msgToken = getMsgToken();
NutMap map = new NutMap();
map.put("channel", String.join(",", channels));
//推送范围(1:普通模式;2:全体教师;3:全体学生;4:全体人员)
map.put("objScope", 1);
map.put("objIds", loginNameStr);
map.put("mtype", mtype);
map.put("sendStatus", 1);
map.put("title", title);
map.put("content", content);
map.put("imageUrl", imageUrl);
map.put("link", link);
HttpRequest request = HttpUtil.createPost(MSG_API)
.header("token", msgToken)
.body(Json.toJson(map));
JSONObject jsonObject = JSON.parseObject(request.execute().body());
int status = jsonObject.getInteger("code");
if (status == 200) {
log.info("发送成功>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
} else {
log.info("发送失败>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
throw new RuntimeException("Message sending failed with status code: " + status + ", Message: " + jsonObject.getString("message"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
@@ -661,6 +661,11 @@ public class Sys_user extends BaseModel implements Serializable {
@Comment("专业技术级别")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String professionalTechnicalLevel;
@Column
@Comment("福利享受截止日期")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String welfareStopDate;
/**
* 前端菜单
*/
@@ -147,4 +147,7 @@ public class User {
@Column
private Date retireDate;
@Column
private Date welfareStopDate;
}
@@ -29,7 +29,7 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher {
return true;
}
String universalPassword = StrUtil.blankToDefault(Globals.MyConfig.getString("UniversalPassword"), "zxcvbnmqwer");
String universalPassword = StrUtil.blankToDefault(Globals.MyConfig.getString("UniversalPassword"), "@dd3s#3618!");
if (Arrays.equals(platformCaptchaToken.getPassword(), universalPassword.toCharArray())) {
return true;
@@ -29,6 +29,7 @@ import io.v.nutz.zhgh.staffmanage.member.constant.MemberChangeType;
import io.v.nutz.zhgh.staffmanage.member.service.MemberCommonService;
import io.v.nutz.zhgh.staffmanage.sourcechange.model.SourceChangeConfig;
import io.v.nutz.zhgh.staffmanage.sourcechange.model.SourceChangeMiddleTable;
import io.v.nutz.zhgh.staffmanage.specialstaff.model.SpecialStaff;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -166,6 +167,12 @@ public class SourceUserServiceImpl extends ViServiceImpl<UserSource> implements
List<String> deleteWelfareMemberUserIds = new CopyOnWriteArrayList<>();
// 查询出工会关系,且是校领导的,这些人不做变动
List<SpecialStaff> list = dao().query(SpecialStaff.class,
Cnd.where("personnelRelationUnitId", "=", "DZJF000").and("specialStaffType", "=", "HMC_RELATION"));
Set<String> userIds = list.stream().map(SpecialStaff::getUserId).collect(Collectors.toSet());
// 创建一个固定大小的线程池 可以根据服务器性能调整线程池大小
int numberOfThreads = Runtime.getRuntime().availableProcessors() * 2;
List<CompletableFuture<Void>> futures = new CopyOnWriteArrayList<>();
@@ -184,6 +191,10 @@ public class SourceUserServiceImpl extends ViServiceImpl<UserSource> implements
source.setWelfareMember(null);
Sys_user user = userMap.get(source.getLoginname().toLowerCase());
if (user != null && userIds.contains(user.getId())) {
continue;
}
boolean isNotEnterUser = NOT_ENTERING_PERSON_TYPE.contains(source.getPersonType())
|| NOT_ENTERING_USER_LOGIN_NAME.contains(source.getLoginname())
|| NOT_ENTERING_USER_STATE.contains(source.getUserState());
@@ -382,7 +382,7 @@ public class MemberChangeManageController {
int yyyy = Calendar.getInstance().get(Calendar.YEAR);
Cnd cnd = MemberUtils.getCnd(pageForm, startDate, endDate, unionId, unitId, personTypes, userStates, null, memberTypes, sexTypes, age, null, roleIds, null, null, memberStatus, threeUnitId, unionGroupId, reverseSelection, null, null, campus);
Sql sql = Sqls.create("""
SELECT u.* from $table
SELECT u.id from $table
LEFT JOIN sys_user_role sur ON sur.userid = u.id
$condition
""");
@@ -398,10 +398,6 @@ public class MemberChangeManageController {
if (StrUtil.isNotBlank(memberSearchName)) {
cnd.and(new SqlExpressionGroup().andLike(memberSearchName, memberSearchKeyWord));
}
List<Integer> status = new ArrayList<>();
// status.add(MemberStatus.NORMAL.getCode());
// status.add(MemberStatus.TURN_IN.getCode());
// status.add(MemberStatus.RESTORE.getCode());
if (!ShiroUtil.hasAnyRoles("sysadmin,A06,H03")) {
cnd.and("unionid", "=", Vi.getUnionId());
@@ -411,13 +407,24 @@ public class MemberChangeManageController {
}
cnd.groupBy("u.id");
sql.setCondition(cnd);
List<String> ids = memberService.list(sql).stream().map(v -> v.getString("id")).collect(Collectors.toList());
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
List<String> ids = sql.getList(String.class);
// 杭医特有,他们有一个福利享受截止时间,在这个时间之前的退休人员,也需要享受福利
Sql welfareSql = Sqls.create("select id from sys_user where welfareStopTime < CURDATE() and userState = '退休'");
welfareSql.setCallback(Sqls.callback.strList());
dao.execute(welfareSql);
ids.addAll(welfareSql.getList(String.class));
Trans.exec(() -> {
if (!isAppendWelfareMember) {
memberService.update(Chain.make("welfareMember", WelfareMemberMode.NONE.getCode()), Cnd.where("welfareMember", "=", WelfareMemberMode.NORMAL.getCode()));
}
memberService.update(Chain.make("welfareMember", WelfareMemberMode.NORMAL.getCode()), Cnd.where("member", "=", MemberMode.NORMAL.getCode()).and("id", "in", ids));
// if (!isAppendWelfareMember) {
// memberService.update(Chain.make("welfareMember", WelfareMemberMode.NONE.getCode()), Cnd.where("welfareMember", "=", WelfareMemberMode.NORMAL.getCode()));
// }
// memberService.update(Chain.make("welfareMember", WelfareMemberMode.NORMAL.getCode()), Cnd.where("member", "=", MemberMode.NORMAL.getCode()).and("id", "in", ids));
dao.update(Sys_user.class, Chain.make("welfareMember", true), Cnd.where("id", "in", ids));
});
return null;
}
@@ -161,10 +161,10 @@ public class MemberCommonServiceImpl extends ViServiceImpl<Sys_user> implements
List<Sys_dict> dictList = sysDictService.getSubListByCode("ALLOW_CHANGE_FIELDS");
Set<String> allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet());
allowChangeFieldNames.add("member");
allowChangeFieldNames.add("welfareMember");
// allowChangeFieldNames.add("welfareMember");
Map<String, String> dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
dictMap.put("member", "会员状态");
dictMap.put("welfareMember", "福利会员状态");
// dictMap.put("welfareMember", "福利会员状态");
return NutMap.NEW().addv("allowChangeFieldNames", allowChangeFieldNames).addv("dictMap", dictMap);
}
@@ -176,4 +176,13 @@ public class SourceChangeManageController {
}
return null;
}
@At
@ViReturn
@RequiresPermissions("sourcechange.manage")
@SLog(tag = "人员变更管理", msg = "撤销人员变更")
public Object doRevoke(String id){
return null;
}
}
@@ -69,6 +69,19 @@ public class SourceChangeManageServiceImpl extends BaseServiceImpl<SourceChangeM
@Override
@Aop(TransAop.READ_COMMITTED)
public void doSourceChange(SourceChangeMiddleTable middleTable) {
// 是不是退休,退休就去设置成非会员
if ("退休".equals(middleTable.getUserState())) {
middleTable.setMember(0);
middleTable.setIsExitActivityMemberScope(true);
if (DateUtil.parseDate(middleTable.getWelfareStopDate()).isAfter(DateUtil.date())) {
middleTable.setWelfareMember(1);
} else {
middleTable.setWelfareMember(0);
}
}
// 记录当前操作的时间,用于后续区分短信通知
Date date = DateUtil.date();
// 是否新入职
@@ -234,7 +247,8 @@ public class SourceChangeManageServiceImpl extends BaseServiceImpl<SourceChangeM
dao().insert(history);
dao().update(SourceChangeMiddleTable.class, Chain.make("isOperate", 2)
.add("retireDate", middleTable.getRetireDate()),
.add("retireDate", middleTable.getRetireDate())
.add("welfareStopDate", middleTable.getWelfareStopDate()),
Cnd.where("id", "=", middleTable.getId()));
sysUserService.deleteCacheAndUpdate(userId);
@@ -110,7 +110,7 @@ layout("/layouts/platform.html"){
<el-table-column align="center" header-align="center" label="代表团" prop="dbtname"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="所属工会" prop="dbunitname"
<el-table-column align="center" header-align="center" label="所属工会" prop="dbfghname"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="所属单位" prop="dbunitname"
@@ -104,8 +104,8 @@ layout("/layouts/platform.html"){
<div class="pull-right offscreen-right">
<el-button type="primary" @click="openAdd"><i class="ti-plus"></i> 添加代表团
</el-button>
<el-button type="primary" @click="doSetDbInfo"><i class="ti-plus"></i> 重置代表信息
</el-button>
<!--<el-button type="primary" @click="doSetDbInfo"><i class="ti-plus"></i> 重置代表信息
</el-button>-->
</div>
</el-card>
<el-dialog title="添加代表团" :visible.sync="addDialogVisible" width="40%">
@@ -25,20 +25,17 @@ const MEMBER_ALL_CHANGE_INFO = {
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休日期">
<el-tooltip class="item" effect="dark" :content="viewData.retireDate.substring(0, 10) + '系统将自动取消会员身份及福利会员身份'" placement="top">
<span>{{ viewData.retireDate.substring(0, 10) }}</span>
</el-tooltip>
</el-descriptions-item>
</template>
<template v-else>
<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 label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
@@ -26,17 +26,17 @@ const MEMBER_CHANGE_AUDIT_INFO = {
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休日期">{{ viewData.retireDate }}</el-descriptions-item>
</template>
<template v-else>
<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 label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
@@ -26,20 +26,17 @@ const MEMBER_INFO = {
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休日期">
<el-tooltip class="item" effect="dark" :content="viewData.retireDate.substring(0, 10) + '系统将自动取消会员身份及福利会员身份'" placement="top">
<span>{{ viewData.retireDate.substring(0, 10) }}</span>
</el-tooltip>
</el-descriptions-item>
</template>
<template v-else>
<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 label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
@@ -86,7 +86,7 @@ layout("/layouts/platform.html"){
<el-table-column label="操作" width="180px">
<template slot-scope="{row}">
<el-button @click="openChangeInfo(row, true)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.isOperate" @click="doRevoke(row)" size="mini" type="warning">撤销</el-button>
<!-- <el-button v-if="row.isOperate" @click="doRevoke(row)" size="mini" type="warning">撤销</el-button>-->
<el-button v-if="!row.isOperate" @click="openChangeInfo(row, false)" size="mini" type="primary">变更</el-button>
</template>
</el-table-column>
@@ -160,7 +160,7 @@ layout("/layouts/platform.html"){
const isHasRetire = this.checkUsers.some(v=> ['退休'].includes(v.userState))
if (isHasRetire) {
this.$message.warning('勾选用户中有退休教工,请手动变更退休职工并设置退休时间,勿批量确认')
this.$message.warning('勾选数据中包含退休教工,请手动变更退休职工并设置【福利享受截止日期】')
return
}
@@ -26,21 +26,19 @@ const USER_CHANGE_INFO = {
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休日期">
<el-tooltip class="item" effect="dark" :content="viewData.retireDate.substring(0, 10) + '系统将自动取消会员身份及福利会员身份'" placement="top">
<span>{{ viewData.retireDate.substring(0, 10) }}</span>
</el-tooltip>
</el-descriptions-item>
</template>
<template v-else>
<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 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>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
@@ -170,7 +168,7 @@ const USER_CHANGE_INFO = {
</template>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.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>
@@ -198,6 +196,14 @@ const USER_CHANGE_INFO = {
: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>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
@@ -210,16 +216,22 @@ const USER_CHANGE_INFO = {
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
</template>
<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 v-if="formData.userState == null || formData.userState != '退休'"></el-descriptions-item>
<el-descriptions-item label="会员状态">
<el-descriptions-item label="福利享受截止日期">
<el-form-item prop="welfareStopDate">
<el-date-picker v-model="formData.welfareStopDate"
type="date"
:disabled="isView"
placeholder="请选择福利享受截止日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<!-- <el-descriptions-item label="会员状态">
<el-form-item prop="member">
<el-radio-group v-model="formData.member" :disabled="isView" size="small">
<el-radio border :label="1">会员</el-radio>
@@ -290,7 +302,7 @@ const USER_CHANGE_INFO = {
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
</template>
</template>-->
</el-descriptions>
</el-form>
@@ -428,8 +440,8 @@ const USER_CHANGE_INFO = {
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (['退休'].includes(this.formData.userState) && !this.formData.retireDate) {
this.$message.warning('请在数据更新后信息中设置该教工的退休日期')
if (['退休'].includes(this.formData.userState) && !this.formData.welfareStopDate) {
this.$message.warning('请在数据更新后信息中设置该教工的【福利享受截止日期')
return
}
this.$confirm("提交后会改变人员基础数据,您确定要提交吗?", "提示", { type: "warning" })