基金会员

This commit is contained in:
=
2026-07-23 10:40:17 +08:00
parent b45f194355
commit 4e9d55bfc0
15 changed files with 447 additions and 143 deletions
@@ -26,12 +26,7 @@ layout("/layouts/platform.html"){
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="isJoin" label="申请类型">
<template slot-scope="{row}">
<el-tag v-if="row.isJoin" size="small">加入</el-tag>
<el-tag v-else size="small" type="danger">退出</el-tag>
</template>
</el-table-column>
<el-table-column prop="aidFundMemberType" label="会员类别"></el-table-column>
<el-table-column prop="submitTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
@@ -1,66 +1,61 @@
const fundMemberInfo = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart" v-if="row && row.instanceId">点击查看流程图</el-link>
</div>
<el-descriptions :column="2" border>
<el-descriptions-item label="姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="会员类别">{{viewData.aidFundMemberType}}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{viewData.userState}}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{viewData.unionName}}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{viewData.birthday}}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{viewData.idCard}}</el-descriptions-item>
<el-descriptions-item label="参加工作时间">{{viewData.joinWorkTime}}</el-descriptions-item>
<el-descriptions-item label="退休时间">{{viewData.retireTime}}</el-descriptions-item>
<el-descriptions-item label="家庭住址">{{viewData.address}}</el-descriptions-item>
<el-descriptions-item label="手机电话">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="住宅号码">{{viewData.homePhone}}</el-descriptions-item>
<el-descriptions-item label="照片">
<img :src="viewData.avatar" alt="" style="width: 120px;height: 150px" v-if="viewData.avatar">
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="mt10">
<div class="process-title">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
}}({{task.ext.initiatorAccount}})
</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
template: /*language=HTML*/ [
'<div>',
' <div class="process-title">',
' 申请信息',
' <el-link type="primary" @click="openChart" v-if="row && row.instanceId">点击查看流程图</el-link>',
' </div>',
' <el-descriptions :column="2" border>',
' <el-descriptions-item label="姓名">{{ viewData.userName || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="工号">{{ viewData.loginName || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="出生年月">{{ viewData.birthday || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="性别">{{ viewData.sex || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="籍贯">{{ viewData.nativePlace || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="家庭住址">{{ viewData.address || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="健康状况">{{ viewData.healthStatus || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="学历">{{ viewData.education || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="联系电话">{{ viewData.mobile || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="入职时间">{{ viewData.joinWorkTime || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="身份证号码" :span="2">{{ viewData.idCard || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="会员类别">{{ viewData.aidFundMemberType || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="退休时间">{{ viewData.retireTime || \'-\' }}</el-descriptions-item>',
' <el-descriptions-item label="家庭主要成员" :span="2">',
' <el-table :data="viewData.families || []" border size="small">',
' <el-table-column label="序号" width="80" align="center">',
' <template slot-scope="scope">{{ scope.row.sequence || scope.$index + 1 }}</template>',
' </el-table-column>',
' <el-table-column prop="name" label="姓名" min-width="160"></el-table-column>',
' <el-table-column prop="age" label="年龄" width="120"></el-table-column>',
' <el-table-column prop="relation" label="与本人关系" min-width="180"></el-table-column>',
' </el-table>',
' </el-descriptions-item>',
' <el-descriptions-item label="备注" :span="2">{{ viewData.remark || \'-\' }}</el-descriptions-item>',
' </el-descriptions>',
'',
' <template v-for="task in doneTasks">',
' <div class="mt10">',
' <div class="process-title">{{ task.displayName }}</div>',
' <el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode">',
' <el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{ task.ext.initiatorAccount }})</el-descriptions-item>',
' <el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>',
' <el-descriptions-item label="办理结果">',
' <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>',
' </el-descriptions-item>',
' </el-descriptions>',
' <el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>',
' <el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{ task.taskFormData.loginName }})</el-descriptions-item>',
' <el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>',
' <el-descriptions-item label="办理结果">',
' <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>',
' </el-descriptions-item>',
' <el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion }}</el-descriptions-item>',
' </el-descriptions>',
' </div>',
' </template>',
' <slot></slot>',
' <snaker-chart ref="snakerChartRef"></snaker-chart>',
'</div>'
].join(''),
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data(){
@@ -17,12 +17,7 @@ layout("/layouts/platform.html"){
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="isJoin" label="申请类型">
<template slot-scope="{row}">
<el-tag v-if="row.isJoin" size="small">加入</el-tag>
<el-tag v-else size="small" type="danger">退出</el-tag>
</template>
</el-table-column>
<el-table-column prop="aidFundMemberType" label="会员类别"></el-table-column>
<el-table-column prop="submitTime" label="申请时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
@@ -34,7 +29,6 @@ layout("/layouts/platform.html"){
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="exportDocx(row.id)" size="mini" type="primary">导出</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)"
size="mini" type="primary">
编辑
@@ -42,9 +36,10 @@ layout("/layouts/platform.html"){
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<!-- v-if="row.taskKey === 'startTask' || !row.instanceId"-->
<el-button @click="onDelete(row.id)"
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)"
size="mini" type="danger">删除
</el-button>
<el-button @click="exportDocx(row.id)" size="mini" type="primary">导出</el-button>
</template>
</el-table-column>
</el-table>
@@ -37,12 +37,7 @@ layout("/layouts/platform.html"){
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="isJoin" label="申请类型">
<template slot-scope="{row}">
<el-tag v-if="row.isJoin" size="small">加入</el-tag>
<el-tag v-else size="small" type="danger">退出</el-tag>
</template>
</el-table-column>
<el-table-column prop="aidFundMemberType" label="会员类别"></el-table-column>
<el-table-column prop="submitTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
@@ -4,7 +4,8 @@ layout("/layouts/platform.html"){
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="基金会员入会申请" define_key="FUND_MEMBER"></snaker-start>
<snaker-start slot="header" label="基金会员入会申请" define_key="JJHY"></snaker-start>
<el-alert v-if="isFundMember" title="您已是基金会员,无需重复申请。" type="warning" :closable="false" show-icon class="mb20"></el-alert>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
@@ -43,8 +44,8 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="身份证号码" prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码"></el-input>
<el-form-item label="籍贯" prop="nativePlace">
<el-input v-model="formData.nativePlace" placeholder="请输入籍贯"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -56,16 +57,51 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="参加工作时间" prop="joinWorkTime">
<el-form-item label="健康状况" prop="healthStatus">
<el-input v-model="formData.healthStatus" maxlength="200" placeholder="请输入健康状况"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学历" prop="education">
<dict-select v-model="formData.education" placeholder="请选择学历" code="USER_EDUCATION" style="width: 100%"></dict-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="11"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入职时间" prop="joinWorkTime">
<el-date-picker
v-model="formData.joinWorkTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择参加工作时间"
placeholder="选择入职时间"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="身份证号码" prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="会员类别" prop="aidFundMemberType">
<dict-select v-model="formData.aidFundMemberType" placeholder="请选择会员类别"
code="USER_AID_FUND_MEMBER_TYPE" style="width: 100%"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="退休时间" prop="retireTime">
<el-date-picker
@@ -79,28 +115,54 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<!--
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="会员类别" prop="aidFundMemberType">
<dict-select v-model="formData.aidFundMemberType" placeholder="请选择会员类别"
code="USER_AID_FUND_MEMBER_TYPE" style="width: 100%"></dict-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入手机号码" maxlength="11"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="住宅号码" prop="homePhone">
<el-input v-model="formData.homePhone" placeholder="请输入住宅电话" maxlength="20"></el-input>
</el-form-item>
</el-col>
</el-row>
-->
<el-form-item label="家庭主要成员" prop="families" required>
<el-table :data="formData.families" border size="small">
<el-table-column label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.row.sequence }}
</template>
</el-table-column>
<el-table-column label="姓名" min-width="160">
<template slot-scope="scope">
<el-input v-model="scope.row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="年龄" width="160">
<template slot-scope="scope">
<el-input-number v-model="scope.row.age" :min="0" :max="150" :precision="0" controls-position="right" style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="与本人关系" min-width="180">
<template slot-scope="scope">
<el-input v-model="scope.row.relation" maxlength="50" placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column width="150" align="center">
<template slot="header">
<el-button type="primary" size="mini" @click="addFamily">添加成员</el-button>
</template>
<template slot-scope="scope">
<el-button type="danger" size="mini" icon="el-icon-delete" @click="removeFamily(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" :rows="3" maxlength="500" show-word-limit placeholder="请输入备注"></el-input>
</el-form-item>
<!--
<el-form-item label="照 片">
<file-upload
style="--upload-width: 150px;--upload-height:176px"
@@ -111,6 +173,7 @@ layout("/layouts/platform.html"){
upload_result_type="url"
></file-upload>
</el-form-item>
-->
<!-- <el-form-item>-->
<!-- <el-checkbox v-model="isAgree">-->
@@ -121,8 +184,8 @@ layout("/layouts/platform.html"){
</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" v-if="!taskId">提交申请</el-button>
<el-button type="primary" @click="onFinishTask" v-else>提交申请</el-button>
<el-button type="primary" @click="onSubmit" v-if="!taskId && !isFundMember">提交申请</el-button>
<el-button type="primary" @click="onFinishTask" v-if="taskId && !isFundMember">提交申请</el-button>
</el-row>
</el-card>
</div>
@@ -135,7 +198,14 @@ layout("/layouts/platform.html"){
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {},
isFundMember: false,
formData: {
families: [],
nativePlace: "",
education: "",
healthStatus: "",
remark: ""
},
formRules: {
userName: [{required: true, message: '请输入姓名', trigger: 'blur'}],
loginName: [{required: true, message: '请输入工资号', trigger: 'blur'}],
@@ -149,7 +219,10 @@ layout("/layouts/platform.html"){
}
],
address: [{required: true, message: '请输入家庭住址', trigger: 'blur'}],
joinWorkTime: [{required: true, message: '请选择参加工作时间', trigger: 'blur'}],
nativePlace: [{required: true, message: '请输入籍贯', trigger: 'blur'}],
healthStatus: [{required: true, message: '请输入健康状况', trigger: 'blur'}],
education: [{required: true, message: '请选择学历', trigger: 'change'}],
joinWorkTime: [{required: true, message: '请选择入职时间', trigger: 'blur'}],
retireTime: [{required: false, message: '请选择退休时间', trigger: 'blur'}],
aidFundMemberType: [{required: true, message: '请选择会员类别', trigger: 'change'}],
mobile: [{required: true, message: '请输入手机号码', trigger: 'blur'},
@@ -172,6 +245,63 @@ layout("/layouts/platform.html"){
}
},
methods: {
// 确保家庭成员字段始终为可响应式数组,兼容旧申请数据。
ensureFamilies() {
if (!Array.isArray(this.formData.families)) {
this.$set(this.formData, "families", [])
}
},
// 按当前行顺序重置家庭成员序号,避免删除成员后出现断号。
resetFamilySequence() {
this.ensureFamilies()
this.formData.families.forEach((family, index) => {
this.$set(family, "sequence", index + 1)
})
},
// 添加一名家庭成员并自动设置序号。
addFamily() {
this.ensureFamilies()
this.formData.families.push({
sequence: this.formData.families.length + 1,
name: "",
age: null,
relation: ""
})
},
// 删除指定家庭成员后重排序号。
removeFamily(index) {
this.ensureFamilies()
this.formData.families.splice(index, 1)
this.resetFamilySequence()
},
// 提交前校验家庭主要成员的必填信息。
validateFamilies() {
this.resetFamilySequence()
if (this.formData.families.length === 0) {
this.$message.error("请至少添加一名家庭主要成员")
return false
}
for (const family of this.formData.families) {
if (!family.name || !String(family.name).trim()) {
this.$message.error("请填写第" + family.sequence + "位家庭成员的姓名")
return false
}
if (family.age === null || family.age === undefined || family.age === "") {
this.$message.error("请填写第" + family.sequence + "位家庭成员的年龄")
return false
}
if (!family.relation || !String(family.relation).trim()) {
this.$message.error("请填写第" + family.sequence + "位家庭成员与本人的关系")
return false
}
}
return true
},
// 保存
// onSave() {
// this.$confirm("您确定保存吗?", "提示", {
@@ -192,6 +322,7 @@ layout("/layouts/platform.html"){
onSubmit() {
this.$refs.formRef.validate(valid => {
if (!valid) return
if (!this.validateFamilies()) return
// if (!this.isAgree) {
// this.$message.error("请先阅读并同意《南昌大学教职工医疗互助“爱心”基金管理办法》")
// return
@@ -214,19 +345,22 @@ layout("/layouts/platform.html"){
},
onFinishTask() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/fundMember/write/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/fundMember/mine')
}
this.$refs.formRef.validate(valid => {
if (!valid || !this.validateFamilies()) return
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/fundMember/write/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/fundMember/mine')
}
})
})
})
},
@@ -238,10 +372,11 @@ layout("/layouts/platform.html"){
this.$axios.post("/platform/fundMember/write/info", {id: this.bizId}).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.resetFamilySequence()
}
})
} else {
const {username, loginname, sex, birthday, mobile, union, userState, idCard} = this.$store.state.user
const {username, loginname, sex, birthday, mobile, union, userState, idCard, education} = this.$store.state.user
this.formData = {
userName: username,
loginName: loginname,
@@ -251,7 +386,12 @@ layout("/layouts/platform.html"){
unionId: union?.id,
unionName: union?.name,
userState: userState,
idCard: idCard
idCard: idCard,
nativePlace: "",
education: education || "",
healthStatus: "",
remark: "",
families: []
}
}
},
@@ -259,6 +399,11 @@ layout("/layouts/platform.html"){
},
created() {
this.init()
this.$axios.post('/platform/fundMember/write/memberStatus').then((res) => {
if (res.code === 0) {
this.$set(this, "isFundMember", Boolean(res.data))
}
})
if(!this.bizId){
this.$axios.post('/platform/fundMember/write/validateApply')
}