This commit is contained in:
2026-08-20 10:55:04 +08:00
parent c6609dcb0b
commit 34fe53caf9
14 changed files with 219 additions and 582 deletions
@@ -28,7 +28,7 @@ SELECT
1,
0,
'staff.sourcechange.pending',
'全量人员数据差异待人工确认记录',
'系统用户待确认和已确认人员记录',
source_menu.location + 1,
0,
'',
@@ -49,7 +49,7 @@ WHERE source_menu.permission = 'staff.sourcechange.manage'
FROM (SELECT id FROM sys_menu WHERE permission = 'staff.sourcechange.pending') existing_menu
);
-- 原先能够查看“变更记录”的角色默认拥有待确认人员记录权限,避免新页面上线后无人可见
-- 原先能够查看“变更记录”的角色默认拥有待确认人员记录权限。
INSERT INTO sys_role_menu (roleId, menuId)
SELECT source_role.roleId, pending_menu.id
FROM sys_role_menu source_role
@@ -1,18 +0,0 @@
-- 待确认人员人工确认备注字段。已有字段的环境重复执行不会改变表结构。
SET @pending_remark_column_count = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sys_user_history'
AND COLUMN_NAME = 'remark'
);
SET @pending_remark_ddl = IF(
@pending_remark_column_count = 0,
'ALTER TABLE sys_user_history ADD COLUMN remark TEXT NULL COMMENT ''备注'' AFTER changeReason',
'SELECT 1'
);
PREPARE pending_remark_stmt FROM @pending_remark_ddl;
EXECUTE pending_remark_stmt;
DEALLOCATE PREPARE pending_remark_stmt;
@@ -1,7 +1,7 @@
const MEMBER_CHANGE = {
template: /*language=HTML*/ `
<el-card shadow="never">
<snaker-start slot="header" label="会员变更" define_key="HYBG"></snaker-start>
<snaker-start v-if="showFlowHeader" slot="header" label="会员变更" define_key="HYBG"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-descriptions :column="3" border>
@@ -155,12 +155,12 @@ const MEMBER_CHANGE = {
style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员分类">
<el-form-item prop="aidFundMemberUserType">
<dict-select v-model="formData.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="人员分类">-->
<!-- <el-form-item prop="aidFundMemberUserType">-->
<!-- <dict-select v-model="formData.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"-->
<!-- style="width: 100%"></dict-select>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
@@ -288,6 +288,8 @@ const MEMBER_CHANGE = {
props: {
id: { type: String, default: '' },
showThreeUnit: { type: Boolean, default: false },
// 控制公共变更组件的标题及流程图入口,默认保留原会员变更页面样式。
showFlowHeader: { type: Boolean, default: true },
},
mixins: [initTableMixins],
store,
@@ -2,145 +2,116 @@
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入姓名工号"></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" clearable filterable placeholder="请选择所属工会"
style="width: 100%" @change="flushUnits" @clear="flushUnits">
<el-option v-for="item in unions" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" clearable filterable placeholder="请选择所属单位" style="width: 100%">
<el-option v-for="item in units" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" code="USER_STATE" clearable placeholder="请选择在职状态"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" code="USER_PERSON_TYPE" clearable placeholder="请选择人员类型"></dict-select>
</search-item>
<search-item label="变更来源">
<el-select v-model="pageForm.changeOrigin" clearable filterable placeholder="请选择变更来源" style="width: 100%">
<el-option v-for="item in changeOriginData" :key="item.name"
:label="item.changeOriginName" :value="item.name"></el-option>
</el-select>
</search-item>
<search-item label="变更日期">
<el-date-picker v-model="pageForm.changeDateRange" type="daterange" value-format="yyyy-MM-dd"
start-placeholder="开始日期" end-placeholder="结束日期" range-separator="-"
style="width: 100%" @change="changeDateRangeChange"></el-date-picker>
</search-item>
</search>
</el-card>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input clearable placeholder="请输入姓名或工号"
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 @change="doSearch" code="USER_PERSON_TYPE" placeholder="请选择人员类型"
v-model="pageForm.personType"></dict-select>
</search-item>
<search-item label="在职状态">
<dict-select @change="doSearch" code="USER_STATE" placeholder="请选择在职状态"
v-model="pageForm.userState"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="待确认人员记录"></table-tool>
<el-table ref="table" :data="tableData" :size="tableSize" row-key="id"
style="width: 100%" @sort-change="pageOrder">
<el-table-column type="index" label="序号" width="70" align="center" :index="indexMethod"></el-table-column>
<el-table-column prop="loginname" label="工号" min-width="110" sortable="custom" show-overflow-tooltip></el-table-column>
<el-table-column prop="username" label="姓名" min-width="100" sortable="custom" show-overflow-tooltip></el-table-column>
<el-table-column prop="sex" label="性别" width="80" align="center">
<template slot-scope="{row}">
<dict-tag code="USER_SEX" :value="row.sex"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="userState" label="在职状态" min-width="100">
<template slot-scope="{row}">
<dict-tag code="USER_STATE" :value="row.userState"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="personType" label="人员类型" min-width="110">
<template slot-scope="{row}">
<dict-tag code="USER_PERSON_TYPE" :value="row.personType"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="unionName" label="所属工会" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column prop="unitName" label="所属单位" min-width="160" show-overflow-tooltip></el-table-column>
<el-table-column prop="changeTime" label="待确认时间" width="170" sortable="custom"></el-table-column>
<el-table-column prop="changeOrigin" label="变更来源" min-width="120">
<template slot-scope="{row}">{{ getChangeOrigin(row.changeOrigin) }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="120" fixed="right" align="center">
<template slot-scope="{row}">
<el-button type="primary" size="mini" @click="openConfirm(row)">确认人员</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="待确认人员记录">
<el-radio-group @change="doSearch" size="small" v-model="pageForm.pendingConfirmStatus">
<el-radio-button :label="1">待确认</el-radio-button>
<el-radio-button :label="2">已确认</el-radio-button>
</el-radio-group>
</table-tool>
<el-dialog title="确认人员" :visible.sync="confirmVisible" width="520px" append-to-body
:close-on-click-modal="false" @closed="resetConfirmForm">
<el-form ref="confirmFormRef" :model="confirmForm" :rules="confirmRules" label-width="100px">
<el-form-item label="异动类型" prop="changeType">
<el-select v-model="confirmForm.changeType" filterable placeholder="请选择异动类型" style="width: 100%">
<el-option v-for="item in finalChangeTypeData" :key="item.code"
:label="item.changeTypeName" :value="item.code"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="confirmForm.remark" type="textarea" :rows="4" maxlength="1000"
show-word-limit placeholder="请输入备注"></el-input>
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="confirmVisible = false">取消</el-button>
<el-button type="primary" :loading="confirmLoading" @click="submitConfirm">确定</el-button>
<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" fixed="left"
header-align="center" label="序号" type="index" width="80"></el-table-column>
<el-table-column align="center" header-align="center" label="工号" min-width="120"
prop="loginname" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" min-width="100"
prop="username" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="性别" min-width="80"
prop="sex" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="所属工会" min-width="150"
prop="unionName" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="所属单位" min-width="180"
prop="unitName" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="人员类型" min-width="120"
prop="personType" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="在职状态" min-width="100"
prop="userState" show-overflow-tooltip sortable></el-table-column>
<el-table-column align="center" header-align="center" label="确认状态" min-width="100"
prop="pendingConfirmStatus">
<template slot-scope="{row}">
<el-tag type="warning" v-if="row.pendingConfirmStatus === 1">待确认</el-tag>
<el-tag type="success" v-else-if="row.pendingConfirmStatus === 2">已确认</el-tag>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="100">
<template slot-scope="{row}">
<el-button @click="openChange(row.id)" size="mini" type="primary">变更</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #public>
<member-change ref="memberChangeRef" :show-three-unit="true" :show-flow-header="false"
@do-back="closeChange" @do-submit="doSubmit"></member-change>
</template>
</el-dialog>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../member/change/common/memberChange.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"member-change": MEMBER_CHANGE
},
data() {
return {
pageForm: {
searchKeyword: "",
unionId: "",
unitId: "",
userState: "",
personType: "",
changeOrigin: "",
changeDateRange: [],
changeDateBefore: "",
changeDateEnd: ""
userState: "",
pendingConfirmStatus: 1
},
unions: [],
units: [],
changeOriginData: [],
changeTypeData: [],
confirmVisible: false,
confirmLoading: false,
confirmForm: {
id: "",
changeType: "",
remark: ""
},
confirmRules: {
changeType: [{required: true, message: "请选择异动类型", trigger: "change"}],
remark: [{max: 1000, message: "备注不能超过1000个字符", trigger: "blur"}]
}
}
},
computed: {
finalChangeTypeData() {
return this.changeTypeData.filter((item) => item.code !== "PENDING_CONFIRM")
units: []
}
},
methods: {
/** 分页加载待确认人员,查询参数沿用人员变更记录页面。 */
/** 分页查询待确认或已确认人员。 */
pageData() {
this.$axios.post("/platform/sourcechange/pending/pageData", this.pageForm).then((resp) => {
return $.post("/platform/sourcechange/pending/pageData", this.pageForm).then((resp) => {
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
@@ -149,81 +120,63 @@ layout("/layouts/platform.html"){
}
})
},
/** 工会变更时重新加载其下属单位,避免带入其他工会的单位条件。 */
/** 切换工会时重新加载属单位。 */
flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (!this.pageForm.unionId) {
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnit().then((data) => {
this.units = data
})
return
}
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
},
/** 打开人员变更组件并加载当前人员信息。 */
openChange(userId) {
this.$refs.guava.public(() => {
this.$refs.memberChangeRef.init(userId)
})
},
/** 将日期组件值转换成后台通用的起止日期参数。 */
changeDateRangeChange(value) {
this.pageForm.changeDateBefore = value && value.length ? value[0] : ""
this.pageForm.changeDateEnd = value && value.length ? value[1] : ""
/** 关闭变更页面并刷新列表。 */
closeChange() {
this.$refs.guava.index()
this.pageData()
},
/** 根据枚举数据展示变更来源名称。 */
getChangeOrigin(value) {
const option = this.changeOriginData.find((item) => item.name === value)
return option ? option.changeOriginName : value
/** 复用人员变更提交接口,成功后刷新待确认状态。 */
doSubmit(data) {
const loading = createLoading("正在提交中")
this.$axios.post("/platform/member/change/manage/doSubmitChange", data).then((resp) => {
loading.close()
if (resp.code === 0) {
this.$message.success(resp.msg)
this.closeChange()
} else {
this.$message.error(resp.msg)
}
}).catch(() => {
loading.close()
this.$message.error("提交失败,请稍后重试")
})
},
/** 打开确认弹窗并绑定当前待确认历史记录。 */
openConfirm(row) {
this.confirmForm.id = row.id
this.confirmForm.changeType = ""
this.confirmForm.remark = row.remark || ""
this.confirmVisible = true
},
/** 提交最终异动类型,成功后刷新列表使已确认人员立即移除。 */
submitConfirm() {
this.$refs.confirmFormRef.validate((valid) => {
if (!valid) return
this.confirmLoading = true
this.$axios.post("/platform/sourcechange/pending/confirm", {
data: JSON.stringify(this.confirmForm)
}).then((resp) => {
if (resp.code === 0) {
this.$message.success("人员确认成功")
this.confirmVisible = false
this.pageData()
} else {
this.$message.warning(resp.msg)
}
}).finally(() => {
this.confirmLoading = false
/** 初始化工会和单位查询选项。 */
initData() {
return Promise.all([
this.$businessTool.listUnion().then((data) => {
this.unions = data
}),
this.$businessTool.listUnit().then((data) => {
this.units = data
})
})
},
/** 关闭弹窗后清理表单校验状态及业务字段。 */
resetConfirmForm() {
this.confirmForm = {id: "", changeType: "", remark: ""}
if (this.$refs.confirmFormRef) {
this.$refs.confirmFormRef.clearValidate()
}
},
/** 加载当前登录人可用的组织及异动枚举数据。 */
initOptions() {
Promise.all([
this.$businessTool.listUnion(),
this.$businessTool.listUnit(),
this.$businessTool.getEnumOptions("MemberChangeType"),
this.$businessTool.getEnumOptions("MemberChangeOrigin")
]).then((result) => {
this.unions = result[0]
this.units = result[1]
this.changeTypeData = result[2]
this.changeOriginData = result[3]
this.pageData()
})
])
}
},
created() {
this.initOptions()
this.initData().then(() => {
this.pageData()
})
}
})
</script>