first commit

This commit is contained in:
2026-08-26 14:25:17 +08:00
commit 06debfd1fc
10595 changed files with 1836924 additions and 0 deletions
@@ -0,0 +1,398 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.box {
width: 500px;
height: 100px;
margin: 150px auto 0;
}
.inp {
width: 300px !important;
margin-right: 20px;
}
</style>
<link href="${base!}/assets/platform/plugins/vue-cron/vcrontab.css" rel="stylesheet"/>
<script src="${base!}/assets/platform/plugins/vue-cron/vcrontab.umd.min.js"></script>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">祝福名称:</div>
<div class="search-item-option">
<el-input placeholder="请输入祝福名称" v-model="pageForm.blessingName" clearable>
<template slot="prepend">祝福名称</template>
</el-input>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="祝福列表">
<el-button icon="el-icon-s-promotion" type="primary" size="small"
@click="openAdd">新建祝福
</el-button>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
ref="table"
:size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop==='blessingMode'" scope="{row:{blessingMode}}">
{{blessingMode=='birthday'?'生日祝福':'其它祝福'}}
</template>
<template v-else-if="column.prop==='isSend'" scope="{row:{isSend}}">
{{isSend=='2'?'任务已完成':isSend=='1'?'进行中':'未开启'}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="300px">
<template scope="{row}">
<el-button type="primary" @click="openView(row)" size="mini">
查看
</el-button>
<el-button type="primary" @click="openEdit(row)" size="mini" :disabled="row.isSend!=0">
编辑
</el-button>
<el-button type="danger" @click="doDelete(row)" size="mini">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="120px"
style="width: 50%;margin: auto">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item prop="blessingName" label="祝福名称">
<el-input v-model="formData.blessingName" style="width: 100%"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="activityGroupId" label="发送范围">
<el-select v-model="formData.activityGroupId" placeholder="请选择发送范围" filterable
clearable
style="width: 100%">
<el-option v-for="item in activityGroupList"
:value="item.groupId"
:key="item.groupId"
:label="item.groupName"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="blessingMode" label="祝福模式">
<el-select v-model="formData.blessingMode" placeholder="请选择祝福模式" filterable clearable
style="width: 100%">
<el-option label="生日祝福" value="birthday"></el-option>
<el-option label="其它祝福" value="other"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="isSend" label="是否发送">
<el-switch
v-model="formData.isSend"
active-color="#13ce66"
active-value="1"
inactive-value="0"
inactive-color="#ff4949">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发送方式" prop="sendTypes">
<el-checkbox-group v-model="formData.sendTypes" size="medium">
<el-checkbox border label="msg">短信发送</el-checkbox>
<el-checkbox border label="WeChat">微信发送</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="日期和时间" prop="blessingCron">
<el-input v-for="a in cronExecuteDate" :value="a" readonly></el-input>
<!-- <el-input v-model="formData.blessingCron" placeholder class="inp" readonly></el-input>-->
<el-button type="primary" @click="showDialog">设置日期和时间</el-button>
<sapn style="color: red" v-if="cronExecuteDate.length>2">只展示最近五次执行时间</sapn>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="blessingContent" label="祝福内容">
<el-input v-model="formData.blessingContent" style="width: 100%"
type="textarea" rows="4"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-row style="float: right">
<el-button type="primary" @click="formData.id?doEdit():doAdd()">创建</el-button>
</el-row>
</el-form-item>
</el-form>
</template>
<template #view>
<el-form label-suffix="" label-width="140px" label-position="left" style="width: 50%;margin: auto">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="祝福名称">
<el-input readonly :value="viewData.blessingName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发送范围">
<el-input readonly :value="viewData.groupName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="祝福模式">
<el-input readonly
:value="viewData.blessingMode==='other'?'其它祝福':'生日祝福'"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否发送">
<el-input readonly
:value="viewData.isSend==='0'?'未开启':viewData.isSend==='1'?'进行中':'任务已完成'"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="最近五次执行时间">
<el-input readonly v-for="a in viewData.blessingDate" :value="a"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="祝福内容">
<el-input style="width: 100%" readonly :value="viewData.blessingContent" rows="4"
type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
</guava>
<el-dialog title="生成 cron" :visible.sync="showCron">
<vcron :expression="formData.blessingCron"
@hide="showCron=false"
@fill="crontabFill"
ref="cron"></vcron>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
"vcron": typeof vcrontab !== 'undefined' ? vcrontab.default || vcrontab : null
},
data() {
return {
cronExecuteDate: [],
viewData: {},
formData: {
sendTypes: [],
blessingCron: ''
},
pageForm: {
blessingName: ''
},
activityGroupList: [],
dialogVisible: false,
tableColumns: [
{prop: 'blessingName', label: '祝福名称'},
{prop: 'groupName', label: '发送范围'},
{prop: 'blessingMode', label: '祝福模式'},
{prop: 'sendTypesName', label: '发送方式',},
{prop: 'isSend', label: '是否发送',},
],
formRules: {
blessingName: [{required: true, message: '请填写祝福名称', trigger: ['blur', 'change']}],
activityGroupId: [{required: true, message: '请选择发送范围', trigger: ['blur', 'change']}],
blessingMode: [{required: true, message: '请选择祝福模式', trigger: ['blur', 'change']}],
sendTypes: [{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}],
blessingContent: [{required: true, message: '请填写祝福内容', trigger: ['blur', 'change']}],
},
showCron: false,
}
},
methods: {
async openView(row) {
const {data} = await $.post(loc() + '/findOne', {id: row.id})
this.viewData = row
this.viewData.blessingDate = data.blessingDate
this.$refs.guava.view()
},
async openEdit(row) {
const {data} = await $.post(loc() + '/findOne', {id: row.id})
this.$set(this, "formData", data)
this.$refs.guava.edit()
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async doDelete(row) {
const confirm = await this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const data = await $.post('/platform/blessing/applyList/doDelete', {id: row.id})
if (data.code == 0) {
this.$message.success(data.msg);
this.$refs.guava.index()
this.doSearch()
} else {
this.$message.error(data.msg);
}
}
},
async doEdit() {
this.$refs["addForm"].validate(async valid => {
if (valid) {
const confirm = await this.$confirm('确定要修改吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const data = await $.post(loc() + '/doEdit', {Blessing: JSON.stringify(this.formData)})
if (data.code == 0) {
this.$message.success(data.msg);
this.$refs.guava.index()
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
this.doSearch()
} else {
this.$message.error(data.msg);
}
}
}
})
},
doAdd() {
this.$refs["addForm"].validate(async valid => {
if (valid) {
const confirm = await this.$confirm('确定要创建吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const data = await $.post(loc() + '/doAdd', {Blessing: JSON.stringify(this.formData)})
if (data.code == 0) {
this.$message.success(data.msg);
window.location.reload();
} else {
this.$message.error(data.msg);
}
}
}
})
},
async getActivityGroup() {
const {data} = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = data
},
openAdd() {
this.$refs.guava.edit()
this.formData = {
sendTypes: [],
blessingCron: ''
}
},
crontabFill(value) {
this.$set(this.formData, 'blessingCron', value)
this.cronExecuteDate = this.$refs.cron.cronExecuteDate
},
showDialog() {
this.expression = this.input
this.showCron = true
},
pageData() {
this.tableLoading = true
$.post(loc() + "/pageData", this.pageForm, (data) => {
this.tableLoading = false
if (data.code == 0) {
data.data.list.forEach(v => {
if (v.sendTypes) {
const a = JSON.parse(v.sendTypes).map(z => {
if (z == "msg") {
return "短信"
} else {
return "微信"
}
})
v.sendTypesName = a.toString()
}
})
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
}
},
async created() {
await this.getActivityGroup()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,208 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.box {
width: 500px;
height: 100px;
margin: 150px auto 0;
}
.inp {
width: 300px !important;
margin-right: 20px;
}
</style>
<link href="${base!}/assets/platform/plugins/vue-cron/vcrontab.css" rel="stylesheet"/>
<script src="${base!}/assets/platform/plugins/vue-cron/vcrontab.umd.min.js"></script>
<div id="app" class="platform" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">祝福名称:</div>
<div class="search-item-option">
<el-input placeholder="请输入祝福名称" v-model="pageForm.blessingName" clearable>
<template slot="prepend">祝福名称</template>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
style="width: 100%"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable
@change="flushUnits" @clear="flushUnits"
filterable>
<el-option v-for="item in unions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%;"
clearable
filterable>
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">祝福时间:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.data"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
style="width: 100%">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="USER_PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="pageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex" :value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="用户列表" :app="this">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
ref="table"
:size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
"vcron": typeof vcrontab !== 'undefined' ? vcrontab.default || vcrontab : null
},
data() {
return {
pageForm: {
data: moment().format('YYYY-MM-DD'),
searchName: "username",
blessingName: ''
},
sexOptions: ['男', '女'],
unions: [],
units: [],
activityGroupList: [],
dialogVisible: false,
tableColumns: [
{prop: 'blessingName', label: '祝福名称'},
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'unitname', label: '所属单位', sortable: true},
{prop: 'birthday', label: '出生日期', sortable: true},
{prop: 'applyDate', label: '发送时间', sortable: true},
],
formRules: {},
showCron: false,
}
},
methods: {
async getActivityGroup() {
const {data} = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = data
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
async created() {
await this.getActivityGroup()
this.pageData()
this.unions = await this.$businessTool.listUnion()
this.flushUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,422 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="职工慰问" define_key="ZGWW"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-descriptions :column="3" border>
<el-descriptions-item label="申请人姓名">{{formData.applyUserName}}</el-descriptions-item>
<el-descriptions-item label="申请人工号">{{formData.applyLoginName}}</el-descriptions-item>
<el-descriptions-item label="申请人单位">{{formData.applyUnitName}}</el-descriptions-item>
<el-descriptions-item label="申请人工会">{{formData.applyUnionName}}</el-descriptions-item>
<el-descriptions-item label="慰问对象">
<el-form-item prop="helpUserId" label="慰问对象">
<el-select
style="width: 100%"
v-model="formData.helpUserId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查询"
:remote-method="createRemoteMethod(helpUserOptions)"
@change="helpUserChange">
<el-option
v-for="item in helpUserOptions"
:key="item.id"
:label="item.userName+''+item.loginName+''+''+item.unitName+''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="经办人">
<el-form-item prop="handlerUserId" label="经办人">
<el-select
style="width: 100%"
v-model="formData.handlerUserId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查询"
:remote-method="createRemoteMethod(handlerUserOptions)"
@change="handlerUserChange">
<el-option
v-for="item in handlerUserOptions"
:key="item.id"
:label="item.userName+''+item.loginName+''+''+item.unitName+''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>-->
<el-descriptions-item label="证明人">
<el-form-item prop="certifierUserId" label="证明人">
<el-select
style="width: 100%"
v-model="formData.certifierUserId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查询"
:remote-method="createRemoteMethod(certifierUserOptions)"
@change="certifierUserChange">
<el-option
v-for="item in certifierUserOptions"
:key="item.id"
:label="item.userName+''+item.loginName+''+''+item.unitName+''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问类型">
<el-form-item prop="type" label="慰问类型">
<el-select v-model="formData.type" @change="typeChange" style="width: 100%"
placeholder="请选择慰问类型">
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:disabled="!item.enable"
:label="item.name"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问金额">
<el-form-item prop="money" label="慰问金额">
<el-input style="width: 100%" v-model="formData.money"
controls-position="right"
:controls="false"
precision="2"
placeholder="选择慰问类型自动匹配金额"
:min="0"
:max="10000"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问时间">
<el-form-item label="慰问时间" prop="occurTime">
<el-date-picker
clearable
style="width: 100%"
v-model="formData.occurTime"
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="bankCardNumber" label="收款账户">
<el-input maxlength="20" v-model="formData.bankCardNumber" placeholder="请填写收款账户"
></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="户名">
<el-form-item prop="bankUserName" label="户名">
<el-input maxlength="20" v-model="formData.bankUserName"
placeholder="请填写户名"
></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="开户行" >
<el-form-item prop="bankOfDeposit" label="开户行">
<el-input maxlength="20" v-model="formData.bankOfDeposit"
placeholder="请填写开户行"
></el-input>
</el-form-item>
</el-descriptions-item>
<template v-if="['2'].includes(formData.typeCode)">
<el-descriptions-item label="入院时间">
<el-form-item label="入院时间" prop="hospitalizationTime">
<el-date-picker
clearable
style="width: 100%"
v-model="formData.hospitalizationTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择入院时间">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出院时间">
<el-form-item label="出院时间" prop="leaveHospitalTime">
<el-date-picker
clearable
style="width: 100%"
v-model="formData.leaveHospitalTime"
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="thisYearHospitalizationNum" label="当年第几次住院">
<el-input-number style="width: 100%" v-model="formData.thisYearHospitalizationNum"
placeholder="请输入当年第几次住院"
:min="0"
:max="10000"></el-input-number>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="申请事由" :span="3">
<el-form-item prop="remark" label="申请事由">
<el-input maxlength="500" v-model="formData.remark" placeholder="请填写申请事由"
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item :span="3" v-if="chooseType.isUploadFile === true">
<template slot="label">
附件
<el-tooltip class="item" effect="dark" :content="'上传附件说明:' + chooseType.uploadFileDesc"
placement="top-start"
v-if="chooseType.isUploadFile && chooseType.uploadFileDesc">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<el-form-item prop="files" label="附件">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="drag"
></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-form-item prop="signature" label="签字">
<pc-signature v-model="formData.signature"></pc-signature>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</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-row>
</el-card>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
store,
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {},
formRules: {
helpUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
payUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
type: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
way: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
money: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
occurTime: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
child: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
hospital: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
hospitalHouseNum: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
hospitalHouseBedNum: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
hospitalBy: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
deadImmediateFamily: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
remark: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
files: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
signature: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
handlerUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
certifierUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
bankCardNumber: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
bankUserName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
bankOfDeposit: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
thisYearHospitalizationNum: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
leaveHospitalTime: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
hospitalizationTime: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
},
chooseType: {},
payUserOptions: [],
helpUserOptions: [],
typeOptions: [],
handlerUserOptions: [],
certifierUserOptions: []
}
},
methods: {
createRemoteMethod(options) {
return (keyword) => {
this.selectQueryUser(keyword, options)
}
},
selectQueryUser(keyword, options) {
options.length = 0
this.$axios.post("/platform/condolence/apply/listUser", { keyword: keyword }).then((res) => {
if (res.code === 0) {
options.push(...res.data)
}
})
},
helpUserChange(val) {
const user = this.helpUserOptions.find(o => o.id === val)
if (user) {
const { userName, loginName, unitId, unitName, unionId, unionName } = user
this.$set(this.formData, "helpUserName", userName)
this.$set(this.formData, "helpLoginName", loginName)
this.$set(this.formData, "helpUnitId", unitId)
this.$set(this.formData, "helpUnitName", unitName)
this.$set(this.formData, "helpUnionId", unionId)
this.$set(this.formData, "helpUnionName", unionName)
}
},
handlerUserChange(val) {
const user = this.handlerUserOptions.find(o => o.id === val)
if (user) {
const { userName, loginName, unitId, unitName, unionId, unionName } = user
this.$set(this.formData, "handlerUserName", userName)
this.$set(this.formData, "handlerLoginName", loginName)
this.$set(this.formData, "handlerUnitId", unitId)
this.$set(this.formData, "handlerUnitName", unitName)
this.$set(this.formData, "handlerUnionId", unionId)
this.$set(this.formData, "handlerUnionName", unionName)
}
},
certifierUserChange(val) {
const user = this.certifierUserOptions.find(o => o.id === val)
if (user) {
const { userName, loginName, unitId, unitName, unionId, unionName } = user
this.$set(this.formData, "certifierUserName", userName)
this.$set(this.formData, "certifierLoginName", loginName)
this.$set(this.formData, "certifierUnitId", unitId)
this.$set(this.formData, "certifierUnitName", unitName)
this.$set(this.formData, "certifierUnionId", unionId)
this.$set(this.formData, "certifierUnionName", unionName)
}
},
payUserChange(val) {
const user = this.payUserOptions.find(o => o.id === val)
if (user) {
const { userName, loginName } = user
this.$set(this.formData, "payUserName", userName)
this.$set(this.formData, "payLoginName", loginName)
}
},
typeChange(id) {
this.chooseType = this.typeOptions.find(o => o.id === id)
if (this.chooseType) {
this.$set(this.formData, "money", this.chooseType.money)
this.$set(this.formData, "way", this.chooseType.way)
this.$set(this.formData, "typeCode", this.chooseType.code)
}
},
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/condolence/apply/save", { data: JSON.stringify(this.formData) }).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush("/platform/condolence/mine")
}
})
})
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/condolence/apply/submit", {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush("/platform/condolence/mine")
}
})
})
}
})
},
onFinishTask() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/condolence/apply/submitAgain", {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush("/platform/condolence/mine")
}
})
})
}
})
},
init() {
if (this.bizId) {
this.$axios.post("/platform/condolence/mine/info", { id: this.bizId }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.selectQueryUser(this.formData.helpLoginName, this.helpUserOptions)
this.selectQueryUser(this.formData.certifierLoginName, this.certifierUserOptions)
this.selectQueryUser(this.formData.handlerLoginName, this.handlerUserOptions)
this.chooseType = this.typeOptions.find(o => o.id === this.formData.type)
}
})
} else {
const { username, loginname, id, unit, union, mobile } = this.$store.state.user
this.formData = {
applyUserName: username,
applyLoginName: loginname,
applyUserId: id,
applyUnitId: unit?.id,
applyUnitName: unit?.name,
applyUnionId: union?.id,
applyUnionName: union?.name
}
}
},
queryCondolenceType() {
this.$axios.post("/platform/condolence/type/queryCondolenceType")
.then((resp) => {
this.typeOptions = resp.data
})
}
},
created() {
this.queryCondolenceType()
this.init()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,193 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="慰问类型">
<el-select v-model="pageForm.type" @change="doSearch" style="width: 100%"
placeholder="请选择慰问类型" filterable clearable>
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<condolence-info ref="condolenceInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</condolence-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"condolence-info": condolenceInfo
},
data() {
return {
pageForm: {
approval: false
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
{prop: 'typeName', label: '慰问类型'},
{prop: 'curTaskName', label: '当前节点'},
{prop: 'instanceState', label: '流程状态'},
],
formData: {},
showApprovalForm: false
}
},
methods: {
onView(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = false
this.$refs.condolenceInfoRef.onOpen(row)
})
},
onAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.condolenceInfoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
queryCondolenceType() {
this.$axios.post('/platform/condolence/type/queryCondolenceType')
.then((resp) => {
this.typeOptions = resp.data
})
},
},
created() {
this.queryCondolenceType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,125 @@
const condolenceInfo = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="申请人姓名">{{ viewData.applyUserName }}</el-descriptions-item>
<el-descriptions-item label="申请人工号">{{ viewData.applyLoginName }}</el-descriptions-item>
<el-descriptions-item label="申请人单位">{{ viewData.applyUnitName }}</el-descriptions-item>
<el-descriptions-item label="申请人工会">{{ viewData.applyUnionName }}</el-descriptions-item>
<el-descriptions-item label="慰问对象">{{ viewData.helpUserName }}</el-descriptions-item>
<!-- <el-descriptions-item label="经办人">{{ viewData.handlerUserName }}</el-descriptions-item>-->
<el-descriptions-item label="证明人">{{ viewData.certifierUserName }}</el-descriptions-item>
<el-descriptions-item label="慰问类型">{{ viewData.typeName }}</el-descriptions-item>
<el-descriptions-item label="慰问金额">{{ viewData.money }}</el-descriptions-item>
<el-descriptions-item label="慰问时间">{{ viewData.occurTime }}</el-descriptions-item>
<el-descriptions-item label="收款账户">{{ viewData.bankCardNumber }}</el-descriptions-item>
<el-descriptions-item label="户名">{{ viewData.bankUserName }}</el-descriptions-item>
<el-descriptions-item label="开户行">{{ viewData.bankOfDeposit }}</el-descriptions-item>
<template v-if="['2'].includes(viewData.typeCode)">
<el-descriptions-item label="入院时间">{{ viewData.hospitalizationTime }}</el-descriptions-item>
<el-descriptions-item label="出院时间">{{ viewData.leaveHospitalTime }}</el-descriptions-item>
<el-descriptions-item label="当年第几次住院">{{ viewData.thisYearHospitalizationNum }}
</el-descriptions-item>
</template>
<el-descriptions-item label="申请事由" :span="3">
<div style="white-space: pre-line">{{ viewData.remark }}</div>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview v-if="viewData.files && viewData.files.length > 0" :files="viewData.files"
complete_result></file-preview>
<span v-else>暂无附件</span>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image :src="viewData.signature"
v-if="viewData.signature"
class="signature-image"></el-image>
<span v-else>暂无签字</span>
</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>
`,
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
viewData: {},
doneTasks: [],
row: null
}
},
methods: {
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
this.getDoneTasks()
},
getInfo() {
this.$axios.post('/platform/condolence/mine/info', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
},
style: /*language=CSS*/ `
.el-descriptions-item__label {
width: 200px;
min-width: 200px;
max-width: 200px;
}
.el-tabs__header {
margin: 0;
}
`
}
@@ -0,0 +1,160 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="慰问类型">
<el-select v-model="pageForm.type" @change="doSearch" style="width: 100%"
placeholder="请选择慰问类型" filterable clearable>
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增申请
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)" size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<condolence-info ref="condolenceInfoRef"></condolence-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"condolence-info": condolenceInfo
},
data() {
return {
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
{prop: 'typeName', label: '慰问类型'},
{prop: 'taskName', label: '当前节点'},
{prop: 'instanceState', label: '流程状态'},
],
}
},
methods: {
onAdd() {
commonUtil.pjaxPush('/platform/condolence/apply')
},
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.condolenceInfoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/condolence/apply?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", { taskId: row.startTaskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/condolence/mine/delete", { id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
queryCondolenceType() {
this.$axios.post('/platform/condolence/type/queryCondolenceType')
.then((resp) => {
this.typeOptions = resp.data
})
},
},
created() {
this.queryCondolenceType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,162 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="慰问类型">
<el-select v-model="pageForm.type" @change="doSearch" style="width: 100%"
placeholder="请选择慰问类型" filterable clearable>
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
@change="doSearch" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch"
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 unitList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-button @click="onExport" icon="el-icon-s-promotion" type="primary" size="small">导出</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="180">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')" @click="onDelete(row.id)" size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<condolence-info ref="condolenceInfoRef"></condolence-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"condolence-info": condolenceInfo
},
data() {
return {
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
{prop: 'typeName', label: '慰问类型'},
{prop: 'taskName', label: '当前节点'},
{prop: 'instanceState', label: '流程状态'},
],
unionList: [],
unitList: [],
}
},
methods: {
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/condolence/mine/delete", { id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onExport() {
this.$downLoad(loc() + '/onExport', this.pageForm)
},
onView(row) {
this.$refs.guava.edit(()=>{
this.$refs.condolenceInfoRef.onOpen(row)
})
},
queryCondolenceType() {
this.$axios.post('/platform/condolence/type/queryCondolenceType')
.then((resp) => {
this.typeOptions = resp.data
})
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.queryCondolenceType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,218 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="慰问类型">
<el-select v-model="pageForm.type" @change="doSearch" style="width: 100%"
placeholder="请选择慰问类型" filterable clearable>
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
@change="doSearch" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch"
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 unitList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<condolence-info ref="condolenceInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</condolence-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"condolence-info": condolenceInfo
},
data() {
return {
pageForm: {
approval: false
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
{prop: 'typeName', label: '慰问类型'},
{prop: 'curTaskName', label: '当前节点'},
{prop: 'instanceState', label: '流程状态'},
],
unionList: [],
unitList: [],
formData: {},
showApprovalForm: false
}
},
methods: {
onView(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = false
this.$refs.condolenceInfoRef.onOpen(row)
})
},
onAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.condolenceInfoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
queryCondolenceType() {
this.$axios.post('/platform/condolence/type/queryCondolenceType')
.then((resp) => {
this.typeOptions = resp.data
})
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.queryCondolenceType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,218 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="慰问类型">
<el-select v-model="pageForm.type" @change="doSearch" style="width: 100%"
placeholder="请选择慰问类型" filterable clearable>
<el-option v-for="item in typeOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
@change="doSearch" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch"
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 unitList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<condolence-info ref="condolenceInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</condolence-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"condolence-info": condolenceInfo
},
data() {
return {
pageForm: {
approval: false
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
{prop: 'typeName', label: '慰问类型'},
{prop: 'curTaskName', label: '当前节点'},
{prop: 'instanceState', label: '流程状态'},
],
unionList: [],
unitList: [],
formData: {},
showApprovalForm: false
}
},
methods: {
onView(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = false
this.$refs.condolenceInfoRef.onOpen(row)
})
},
onAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.condolenceInfoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
queryCondolenceType() {
this.$axios.post('/platform/condolence/type/queryCondolenceType')
.then((resp) => {
this.typeOptions = resp.data
})
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.queryCondolenceType()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,99 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="类型编码" prop="code">
<el-input type="text" v-model="formData.code" maxlength="50"
placeholder="请填写类型编码"></el-input>
</el-form-item>
<el-form-item label="类型名称" prop="name">
<el-input type="text" v-model="formData.name" maxlength="50"
placeholder="请填写类型名称"></el-input>
</el-form-item>
<el-form-item label="慰问费用" prop="money">
<el-input-number style="width: 100%" v-model="formData.money"
placeholder="请填写慰问费用" controls-position="right" :controls="false"
precision="2"
:min="0"
:max="10000"></el-input-number>
</el-form-item>
<el-form-item label="慰问方式" prop="way">
<el-radio-group v-model="formData.way">
<el-radio-button label="慰问金 (A)" border>慰问金 (A)</el-radio-button>
<el-radio-button label="提货券 (B)" border>提货券 (B)</el-radio-button>
<el-radio-button label="慰问品 (C)" border>慰问品 (C)</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="是否启用" prop="enable">
<el-switch
v-model="formData.enable"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</el-form-item>
<!--<el-form-item label="上传会议纪要" prop="uploadMeetingRecord">
<el-radio-group v-model="formData.uploadMeetingRecord">
<el-radio-button :label="true">上传</el-radio-button>
<el-radio-button :label="false">不上传</el-radio-button>
</el-radio-group>
</el-form-item>-->
<!-- <el-form-item label="是否上传附件" prop="isUploadFile">-->
<!-- <el-radio-group v-model="formData.isUploadFile">-->
<!-- <el-radio-button :label="true">是</el-radio-button>-->
<!-- <el-radio-button :label="false">否</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="上传附件说明" prop="uploadFileDesc" v-if="formData.isUploadFile">
<el-input v-model="formData.uploadFileDesc" maxlength="50" clearable placeholder="请填写上传附件说明"></el-input>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
data() {
return {
formData: {},
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
money: [{required: true, message: '必填', trigger: ['blur', 'change']}],
way: [{required: true, message: '必填', trigger: ['blur', 'change']}],
code: [{required: true, message: '必填', trigger: ['blur', 'change']}],
isUploadFile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
}
},
methods: {
onOpen(row) {
if(row && row.id) {
this.formData = clone(row)
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/condolence/type/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
.el-input-number .el-input__inner {
text-align: left;
}
`
}
@@ -0,0 +1,148 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称/编码">
<el-input placeholder="请输入名称或编码" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="类型列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增类型
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'isUploadFile'">
<span v-if="row.isUploadFile" class="text-success"></span>
<span v-else class="text-danger"></span>
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'enable'">
<el-switch
@change="switchChange(row)"
v-model="row.enable"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
},
data() {
return {
tableColumns: [
{prop: 'code', label: '类型编码'},
{prop: 'name', label: '类型名称'},
{prop: 'money', label: '金额'},
{prop: 'way', label: '慰问方式'},
// {prop: 'isUploadFile', label: '是否上传附件'},
{prop: 'enable', label: '是否启用'},
],
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/condolence/type/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
switchChange(row) {
this.$axios.post("/platform/condolence/type/onSubmit", row).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,221 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="项目名称:">
<el-select placeholder="请选择项目名称"
v-model="pageForm.contributionName"
style="width: 100%;"
clearable @change="doSearch"
filterable>
<el-option v-for="item in contributionOptions"
:label="item.contributionName"
:key="item.contributionName"
:value="item.contributionName"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
@change="doSearch" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch"
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 unitList"></el-option>
</el-select>
</search-item>
<search-item label="捐助方式:">
<el-select placeholder="请选择捐助方式" v-model="pageForm.payMode" style="width: 100%;"
clearable @change="doSearch"
filterable>
<el-option label="微信" value="WeChat"></el-option>
<el-option label="支付宝" value="Alipay"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="捐助列表">
<el-button type="primary" size="small" @click="onExport">
<i class="el-icon-download"></i>
导出
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize"
row-key="id" show-summary :summary-method="getSummaries">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'payMode'">
{{ row.payMode === 'WeChat' ? '微信' : '支付宝' }}
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="捐助项目">
{{ viewData.contributionName }}
</el-descriptions-item>
<el-descriptions-item label="捐助人工号">
{{ viewData.loginName }}
</el-descriptions-item>
<el-descriptions-item label="姓名">
{{ viewData.userName }}
</el-descriptions-item>
<el-descriptions-item label="联系方式">
{{ viewData.mobile }}
</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.money || 0}}元
</el-descriptions-item>
<el-descriptions-item label="捐助方式">
{{ viewData.payMode === 'WeChat' ? '微信' : '支付宝' }}
</el-descriptions-item>
<el-descriptions-item label="捐助时间" :span="2">
{{ viewData.contributionTime }}
</el-descriptions-item>
<el-descriptions-item label="捐助凭证" :span="2">
<file-preview v-if="viewData.contributionFiles" complete_result :files="viewData.contributionFiles"></file-preview>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
},
data() {
return {
tableColumns: [
{prop: 'contributionName', label: '捐助项目'},
{prop: 'loginName', label: '捐助人工号'},
{prop: 'userName', label: '姓名'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unionName', label: '所属工会'},
{prop: 'unitName', label: '所属单位'},
{prop: 'money', label: '善款金额'},
{prop: 'payMode', label: '捐助方式'},
{prop: 'contributionTime', label: '捐助时间'},
],
contributionOptions: [],
unionList: [],
unitList: [],
viewData: {},
}
},
methods: {
getSummaries(param) {
const {columns, data} = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总额'
return
}
if (index !== 7) {
sums[index] = null
return
}
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return Math.floor((prev + curr) * 100) / 100
} else {
return prev
}
}, 0)
sums[index] += ' 元'
} else {
sums[index] = null
}
})
return sums
},
onView(row) {
this.$refs.guava.view(() => {
if(row.contributionFiles) {
row.contributionFiles = JSON.parse(row.contributionFiles)
}
this.viewData = clone(row)
})
},
onExport() {
this.$downLoad("/platform/contribution/detailed/doExport", this.pageForm)
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
queryContributionList() {
this.$axios.post('/platform/contribution/list/queryContributionList')
.then((resp) => {
this.contributionOptions = resp.data
})
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.queryContributionList()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,115 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="项目名称" prop="contributionName">
<el-input type="text" v-model="formData.contributionName" maxlength="50"
placeholder="请填写项目名称"></el-input>
</el-form-item>
<el-form-item label="所属捐助专题" prop="contributionTypeCode">
<el-select placeholder="所属捐助专题" v-model="formData.contributionTypeCode"
style="width: 100%;"
clearable
filterable>
<el-option v-for="item in contributionTypeList"
:label="item.typeName + '' + item.typeCode + ''"
:value="item.typeCode"></el-option>
</el-select>
</el-form-item>
<el-form-item label="捐助时间" prop="contributionTime">
<el-date-picker
style="width: 100%;"
v-model="formData.contributionTime"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="请选择开始日期"
end-placeholder="请选择结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="捐助模式" prop="contributionMode">
<el-radio-group v-model="formData.contributionMode">
<el-radio-button :label="1">水滴筹</el-radio-button>
<el-radio-button :label="2">一日捐</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="捐助链接" prop="contributionUrl"
v-if="formData.contributionMode === 1">
<el-input type="text" v-model="formData.contributionUrl" maxlength="50"
placeholder="请填写捐助链接"></el-input>
</el-form-item>
<el-form-item label="是否开启" prop="isContributionEnable">
<el-switch v-model="formData.isContributionEnable" active-color="#13ce66"
inactive-color="#ff4949"></el-switch>
</el-form-item>
<el-form-item label="项目介绍" prop="contributionIntroduce">
<text-editor v-model="formData.contributionIntroduce"></text-editor>
</el-form-item>
<el-form-item label="封面图" prop="contributionFiles">
<file-upload :value.sync="formData.contributionFiles" accept=".jpg,.jpeg,.png"
:upload_number="1" upload_result_category="interval"
complete_result upload_mode="drag"></file-upload>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
data() {
return {
formData: {},
formRules: {
contributionName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionIntroduce: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionFiles: [{required: true, message: '必填', trigger: ['blur', 'change']}],
isContributionEnable: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionTime: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionMode: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
contributionTypeList: [],
}
},
methods: {
onOpen(row) {
if(row && row.id) {
this.formData = clone(row)
this.$set(this.formData, 'contributionTime', [this.formData.contributionStartTime, this.formData.contributionEndTime])
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
this.$set(this.formData, 'contributionStartTime', this.formData.contributionTime[0])
this.$set(this.formData, 'contributionEndTime', this.formData.contributionTime[1])
const resp = await this.$axios.post("/platform/contribution/list/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
queryContributionType() {
this.$axios.post('/platform/contribution/type/queryContributionType')
.then((resp) => {
this.contributionTypeList = resp.data
})
},
},
created() {
this.queryContributionType()
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,154 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="项目名称:">
<el-input placeholder="请输入项目名称" clearable v-model="pageForm.contributionName"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="项目列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增项目
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'contributionTypeName'">
{{ row.typeName || '暂无' }}
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'isContributionEnable'">
<el-switch @change="switchChange(row)" v-model="row.isContributionEnable"
active-color="#13ce66"
inactive-color="#ff4949"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'contributionName', label: '项目名称'},
{prop: 'contributionTypeName', label: '所属专题'},
{prop: 'contributionCreationDate', label: '创建时间'},
{prop: 'isContributionEnable', label: '是否开启'}
],
}
},
methods: {
switchChange(row) {
this.$axios.post("/platform/contribution/list/onSubmit", row).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/contribution/list/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,45 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="项目名称">
{{ viewData.contributionName }}
</el-descriptions-item>
<el-descriptions-item label="所属捐助专题">
{{ viewData.typeName }}
</el-descriptions-item>
<el-descriptions-item label="捐助时间">
{{ viewData.contributionStartTime + ' 至 ' + viewData.contributionEndTime }}
</el-descriptions-item>
<el-descriptions-item label="捐助模式">
{{ viewData.contributionMode === 1 ? '水滴筹' : '一日捐' }}
</el-descriptions-item>
<el-descriptions-item label="捐助链接" :span="2">
{{ viewData.contributionUrl || '暂无' }}
</el-descriptions-item>
<el-descriptions-item label="项目介绍" :span="2">
<div v-html="viewData.contributionIntroduce"></div>
</el-descriptions-item>
<el-descriptions-item label="封面图" :span="2">
<img :src="viewData.contributionFiles"
style="height: 100px;width: auto" v-if="viewData.contributionFiles">
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone(row)
this.$set(this.formData, 'contributionTime', [this.formData.contributionStartTime, this.formData.contributionEndTime])
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,144 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="项目名称:">
<el-select placeholder="请选择项目名称"
v-model="pageForm.contributionId"
style="width: 100%;"
@change="doSearch"
filterable>
<el-option v-for="item in contributionOptions"
:label="item.contributionName"
:key="item.id"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
@change="doSearch" style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="捐助列表"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize"
row-key="id" show-summary :summary-method="getSummaries"
max-height="600">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
</el-card>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
},
data() {
return {
tableColumns: [
{prop: 'unionCode', label: '工会编码'},
{prop: 'name', label: '工会名称'},
{prop: 'contributionUserNum', label: '捐助人数'},
{prop: 'contributionNum', label: '捐助多少笔'},
{prop: 'money', label: '捐助总额(元)'},
],
contributionOptions: [],
unionList: [],
}
},
methods: {
getSummaries(param) {
const {columns, data} = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计'
return
}
if (![3, 4, 5].includes(index)) {
sums[index] = null
return
}
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return Math.floor((prev + curr) * 100) / 100
} else {
return prev
}
}, 0)
if (index === 3) {
sums[index] += ' 人'
} else if (index === 4) {
sums[index] += ' 笔'
} else {
sums[index] += ' 元'
}
} else {
sums[index] = null
}
})
return sums
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data
}
})
},
async queryContributionList() {
const resp = await this.$axios.post('/platform/contribution/list/queryContributionList')
this.contributionOptions = resp.data
if (this.contributionOptions && this.contributionOptions.length > 0) {
this.pageForm.contributionId = this.contributionOptions[0].id
}
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
await this.queryContributionList()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,69 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="专题编号" prop="typeCode">
<el-input type="text" v-model="formData.typeCode" maxlength="50"
placeholder="请填写专题编号"></el-input>
</el-form-item>
<el-form-item label="专题名称" prop="typeName">
<el-input type="text" v-model="formData.typeName" maxlength="50"
placeholder="请填写专题名称"></el-input>
</el-form-item>
<el-form-item label="专题介绍" prop="contributionTypeIntroduce">
<el-input type="textarea" v-model="formData.contributionTypeIntroduce" :rows="4"
placeholder="请填写专题介绍"></el-input>
</el-form-item>
<el-form-item label="封面图" prop="contributionTypeFiles">
<file-upload :value.sync="formData.contributionTypeFiles" accept=".jpg,.jpeg,.png"
:upload_number="1" upload_result_category="interval"
complete_result upload_mode="drag"></file-upload>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
data() {
return {
formData: {},
formRules: {
typeName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
typeCode: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionTypeIntroduce: [{required: true, message: '必填', trigger: ['blur', 'change']}],
contributionTypeFiles: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
}
},
methods: {
onOpen(row) {
if(row && row.id) {
this.formData = clone(row)
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/contribution/type/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,140 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称/编码">
<el-input placeholder="请输入名称或编码" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="专题列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增专题
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'createdAt'">
{{ $moment(row.createdAt).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'typeCode', label: '专题编号'},
{prop: 'typeName', label: '专题名称'},
{prop: 'createdAt', label: '创建时间'},
],
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/contribution/type/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,35 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="专题编号">
{{ viewData.typeCode }}
</el-descriptions-item>
<el-descriptions-item label="专题名称">
{{ viewData.typeName }}
</el-descriptions-item>
<el-descriptions-item label="专题介绍" :span="2">
{{ viewData.contributionTypeIntroduce }}
</el-descriptions-item>
<el-descriptions-item label="封面图" :span="2">
<img :src="viewData.contributionTypeFiles"
style="height: 100px;width: auto" v-if="viewData.contributionTypeFiles">
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone(row)
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,541 @@
<div id="difficult_help_apply">
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">
<el-form-item prop="proxyUserName">
<el-input readonly v-model="formData.proxyUserName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="填写人工号">
<el-form-item prop="proxyLoginName">
<el-input readonly v-model="formData.proxyLoginName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请模式">
<el-form-item prop="mode">
<el-select v-model="formData.mode" placeholder="申请模式"
@change="modeChange"
:disabled="formData.id" style="width: 100%">
<el-option label="本人申请" value="1"></el-option>
<el-option v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN, BRANCH_UNION_CHAIRMAN, BRANCH_UNION_OPERATOR')"
label="替他人申请" value="2"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="受补助人">
<template v-if="formData.mode == 2">
<el-select :remote-method="queryRecipients"
@change="userChange" clearable filterable
placeholder="输入工号或者姓名查找" remote
style="width: 100%" v-model="formData.userId">
<el-option :key="o.id"
:label="o.username+'('+o.loginname+')'"
:value="o.id"
v-for="o in subsidizedList"></el-option>
</el-select>
</template>
<template v-else>
<el-input readonly maxlength="100" type="text"
v-model="formData.userName"></el-input>
</template>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-select v-model="formData.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option v-for="item in ['男','女']" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生年月">
<el-form-item prop="birthday">
<el-date-picker
clearable
style="width: 100%"
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="unitName">
<el-input maxlength="50" clearable placeholder="所在单位"
readonly v-model="formData.unitName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input maxlength="50" clearable placeholder="所属工会"
readonly v-model="formData.unionName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务职称">
<el-form-item prop="officialCapacity">
<el-input maxlength="20" clearable placeholder="请填写职务职称"
v-model="formData.officialCapacity"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="手机号码">
<el-form-item prop="mobile">
<el-input maxlength="11" clearable placeholder="请填写手机号码"
v-model="formData.mobile" maxlength="11"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号" :span="2">
<el-form-item prop="idCard">
<el-input maxlength="20" clearable placeholder="请填写身份证号"
v-model="formData.idCard" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="本人月收入">
<el-form-item prop="monthlyIncome">
<el-input-number clearable
style="width: 100%"
v-model="formData.monthlyIncome"
:min="0"
:max="9999999"
placeholder="请填写本人月收入">
</el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="收款账户" :span="2">
<el-form-item prop="bankCardNum">
<el-input maxlength="20" clearable placeholder="请填写华夏银行工资卡号"
v-model="formData.bankCardNum"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="困难类型" :span="3">
<el-form-item prop="subsidyStandards">
<el-select v-model="formData.subsidyStandards" style="width: 100%">
<el-option v-for="(item,index) in subsidyStandards" :key="index" :label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请原因" :span="3">
<el-form-item prop="reason">
<el-input maxlength="500" :autosize="{ minRows: 5, maxRows: 10}"
placeholder="请简述申请原因"
clearable
show-word-limit
v-model="formData.reason"
type="textarea"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭成员经济收入" :span="3">
<el-form-item prop="familyList">
<el-table :data="formData.familyList" border max-height="500" size="mini" style="width: 100%">
<el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
<el-table-column prop="name" label="姓名">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.name'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.name" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="relation" label="年龄(岁)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.age'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.age" placeholder="请输入年龄" :min="1"
:max="100" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="relation" label="关系">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.relation'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.relation" placeholder="请输入关系" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="monthlyIncome" label="月收入(元)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.monthlyIncome'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.monthlyIncome" placeholder="请输入月收入"
:min="1" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px">
<template slot="header" slot-scope="scope">
<el-button @click="formData.familyList.push({})" icon="el-icon-plus" type="primary"
size="mini">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button :disabled="formData.familyList.length==1"
@click="formData.familyList.splice(scope.$index,1)"
size="mini"
icon="el-icon-delete"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<el-form-item prop="files">
<file-upload :value.sync="formData.files"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-form-item prop="sign">
<pc-signature v-model="formData.sign"></pc-signature>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @save-draft="handleSaveDraft"></snaker-flow-task-form-action>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#difficult_help_apply',
store,
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
formData: {
id: GetQueryString("businessId"),
mode: '1'
},
subsidyStandards: [
'患重大疾病(癌症)',
'本人家庭(仅指代本人及其配偶、子女共同组成的家庭)人均月收入低于1300元或本人配偶、子女患有重大疾病且自付医疗费用超过家庭年收入的80%',
'患精神类疾病',
'长期病休',
'其他特殊情况'
],
formRules: {
proxyUserName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
proxyLoginName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sex: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
monthlyIncome: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
idCard: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bankCardNum: [{required: true, message: '必填', trigger: ['blur', 'change']}],
officialCapacity: [{required: true, message: '必填', trigger: ['blur', 'change']}],
subsidyStandards: [{required: true, message: '必填', trigger: ['blur', 'change']}],
reason: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sign: [{required: true, message: '必填', trigger: ['blur', 'change']}]
},
// 替他人申请相关
subsidizedList: []
}
},
methods: {
// 查询受助人
queryRecipients(key) {
this.$axios.get("/platform/difficultHelp/apply/queryRecipients", {
key
}).then(res => {
if (res.code === 0) {
this.subsidizedList = res.data
}
})
},
// 提交
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
const result = this.isValidIdCard(this.formData.idCard)
if (result.status === 0) {
this.$message.warning(result.msg)
return
}
const bankRes = this.validateCard(this.formData.bankCardNum)
if (bankRes.status === 0) {
this.$message.warning(bankRes.msg)
return
}
if (!this.instanceId) {
this.handleApply(val)
} else {
this.handleReApply(val)
}
}
})
},
// 提交申请
handleApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post("/flow/common/startInstanceAndExecute", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
}
})
})
},
// 重新提交申请
handleReApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: val.taskId,
processInstanceId: val.instanceId,
submitType: val.submitType,
f_data: JSON.stringify(this.formData)
})
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
})
},
// 保存
handleSaveDraft(val) {
this.$confirm("您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/startInstance", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage(
{
type: "task-complete"
},
"*"
)
}
})
})
},
// 取消
handleCancel() {
},
findOne(id) {
this.$axios.post('/platform/difficultHelp/mine/findOne', { id }).then(res => {
if (res.code === 0) {
this.formData = res.data
}
})
},
async userChange() {
const user = this.subsidizedList.find(item => item.id === this.formData.userId)
if (user) {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unitId)
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'unionId', user.unionId)
this.$set(this.formData, 'unionName', user.unionName)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'mobile', user.mobile)
} else {
this.$set(this.formData, 'userId', null)
this.$set(this.formData, 'userName', null)
this.$set(this.formData, 'loginName', null)
this.$set(this.formData, 'sex', null)
this.$set(this.formData, 'unitId', null)
this.$set(this.formData, 'unitName', null)
this.$set(this.formData, 'unionId', null)
this.$set(this.formData, 'unionName', null)
this.$set(this.formData, 'birthday', null)
this.$set(this.formData, 'mobile', null)
}
},
// 申请模式
modeChange(val) {
const user = this.$store.state.user
if (val === "1") {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "1")
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unit.id)
this.$set(this.formData, 'unitName', user.unit.name)
this.$set(this.formData, 'unionId', user.union.id)
this.$set(this.formData, 'unionName', user.union.name)
this.$set(this.formData, 'monthlyIncome', null)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'homeAddress', user.homeAddress)
this.$set(this.formData, 'subsidyStandards', null)
this.$set(this.formData, 'reason', null)
this.$set(this.formData, 'remarks', null)
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
this.queryRecipients(user.loginname)
} else {
this.formData = {}
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "2")
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
}
},
/**
* 检验身份证号
* @param idCard
* @returns {{status: number, msg: string}}
*/
isValidIdCard(idCard) {
// 校验18位身份证号
const format18 = /^(((([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4})|(([9](([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2])))\d{3}))(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
// 校验15位身份证号
const format15 = /^\d{15}$/;
// 校验外国人永久居留身份证号
const format15Foreign = /^[a-zA-Z]{3}[0-9]{4}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{2}$/;
// 校验格式
if (!(format18.test(idCard) || format15.test(idCard) || format15Foreign.test(idCard))) {
return { status: 0, msg: '身份证号码格式不正确' };
}
// 校验出生日期
let year, month, day;
if (idCard.length === 18) {
year = idCard.substr(6, 4);
month = idCard.substr(10, 2);
day = idCard.substr(12, 2);
} else if (idCard.length === 15) {
year = '19' + idCard.substr(6, 2);
month = idCard.substr(8, 2);
day = idCard.substr(10, 2);
} else {
return { status: 0, msg: '身份证号码格式不正确' };
}
const date = new Date(year, month - 1, day);
if (date.getFullYear() !== parseInt(year, 10) || date.getMonth() + 1 !== parseInt(month, 10) || date.getDate() !== parseInt(day, 10)) {
return { status: 0, msg: '身份证出生日期不正确' };
}
// 校验18位身份证号的校验码
if (idCard.length === 18) {
const coefficients = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkCodeMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idCard.charAt(i), 10) * coefficients[i];
}
const checkCode = checkCodeMap[sum % 11];
if (checkCode.toUpperCase() !== idCard.charAt(17).toUpperCase()) {
return { status: 0, msg: '身份证校验码不正确' };
}
}
return { status: 1, msg: '校验通过' };
},
/**
* 校验银行卡号
* @param bankCardNum
* @returns {{status: number, msg: string}}
*/
validateCard(bankCardNum) {
// 移除所有空格
bankCardNum = bankCardNum.replace(/\s+/g, '');
// 检查格式
const cardRegex = /^\d{13,19}$/;
if (!cardRegex.test(bankCardNum)) {
return { status: 0, msg: "银行卡号格式不正确,请输入13到19位数字。" };
}
// 检查Luhn算法
if (!/^\d+$/.test(bankCardNum)) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
let sum = 0;
let shouldDouble = false;
for (let i = bankCardNum.length - 1; i >= 0; i--) {
let digit = parseInt(bankCardNum.charAt(i));
if (shouldDouble) {
digit *= 2;
if (digit > 9) {
digit -= 9;
}
}
sum += digit;
shouldDouble = !shouldDouble;
}
if ((sum % 10) !== 0) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
return { status: 200, msg: "卡号有效。" };
}
},
async created() {
if (this.businessId) {
this.findOne(this.businessId)
} else {
this.modeChange("1")
}
}
})
</script>
@@ -0,0 +1,635 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never" v-if="isShow">
<snaker-start slot="header" label="困难帮扶申请" define_key="KNBF"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">
<el-form-item prop="proxyUserName">
<el-input readonly v-model="formData.proxyUserName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请模式">
<el-form-item prop="mode">
<el-select v-model="formData.mode" placeholder="申请模式" @change="modeChange" style="width: 100%">
<el-option label="本人申请" value="1"></el-option>
<el-option v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN, BRANCH_UNION_CHAIRMAN, BRANCH_UNION_OPERATOR')"
label="替他人申请" value="2"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="填写人工号">
<el-form-item prop="proxyLoginName">
<el-input readonly v-model="formData.proxyLoginName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="受补助人">
<el-form-item prop="userName">
<template v-if="formData.mode == 2">
<el-select :remote-method="queryRecipients"
@change="userChange" clearable filterable
placeholder="输入工号或者姓名查找" remote
style="width: 100%" v-model="formData.userId">
<el-option :key="o.id"
:label="o.username+'('+o.loginname+')'"
:value="o.id"
v-for="o in subsidizedList"></el-option>
</el-select>
</template>
<template v-else>
<el-input readonly maxlength="100" type="text"
v-model="formData.userName"></el-input>
</template>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="受补助人工号">
<el-form-item prop="loginName">
<el-input readonly v-model="formData.loginName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号" :span="2">
<el-form-item prop="idCard">
<el-input maxlength="20" clearable placeholder="请填写身份证号"
v-model="formData.idCard" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-select v-model="formData.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option v-for="item in ['男','女']" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="position">
<el-input maxlength="20" clearable placeholder="请填写职务"
v-model="formData.position"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职称">
<el-form-item prop="officialCapacity">
<el-input maxlength="20" clearable placeholder="请填写职称"
v-model="formData.officialCapacity"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属单位">
<el-form-item prop="unitName">
<el-input maxlength="50" clearable placeholder="请填写所在单位"
readonly v-model="formData.unitName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="手机号码">
<el-form-item prop="mobile">
<el-input maxlength="11" clearable placeholder="请填写手机号码"
v-model="formData.mobile" maxlength="11"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭年总收入(万元)">
<el-form-item prop="homeIncome">
<el-input-number
v-model="formData.homeIncome"
:precision="2"
:min="0"
style="width: 100%"
placeholder="请填写总收入(万元)">
</el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭人数">
<el-form-item prop="homeNumber">
<el-input-number
v-model="formData.homeNumber"
:min="1"
:step="1"
style="width: 100%"
placeholder="请填写家庭人数">
</el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭住址" >
<el-form-item prop="homeAddress">
<el-input clearable
style="width: 100%"
v-model="formData.homeAddress"
placeholder="请填写家庭住址">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="开户行" >
<el-form-item prop="bankOfDeposit">
<el-input maxlength="30" clearable placeholder="请填写开户行"
v-model="formData.bankOfDeposit"></el-input>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="申请次数" >-->
<!-- <el-form-item prop="applyCount">-->
<!-- <el-input maxlength="20" clearable placeholder="请填写"-->
<!-- v-model="formData.applyCount"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="银行卡号" >
<el-form-item prop="bankCardNum">
<el-input maxlength="20" clearable placeholder="请填写银行卡号"
v-model="formData.bankCardNum"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="补助类型" >
<el-form-item prop="subsidy">
<search-item>
<dict-select v-model="formData.subsidy" code="DIFFICULT_SUBSIDY_TYPE" style="width: 100%" placeholder="请选择补助类型"></dict-select>
</search-item>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="困难类型" >
<el-form-item prop="subsidyStandards">
<search-item>
<dict-select v-model="formData.subsidyStandards" code="DIFFICULT_TYPE" style="width: 100%" placeholder="请选择困难类型"></dict-select>
</search-item>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="生活致困原因" :span="3">
<el-form-item prop="reason">
<el-input maxlength="500" :autosize="{ minRows: 5, maxRows: 10}"
placeholder="请简述生活致困原因"
clearable
show-word-limit
v-model="formData.reason"
type="textarea"></el-input>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="户名" >-->
<!-- <el-form-item prop="bankUserName">-->
<!-- <el-input maxlength="20" clearable placeholder="请填写户名"-->
<!-- v-model="formData.bankUserName"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="出生年月">-->
<!-- <el-form-item prop="birthday">-->
<!-- <el-date-picker-->
<!-- clearable-->
<!-- style="width: 100%"-->
<!-- 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="unionName">-->
<!-- <el-input maxlength="50" clearable placeholder="所属工会"-->
<!-- readonly v-model="formData.unionName"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="家庭主要成员(在一起生活的直系亲属)经济收入情况" :span="3">
<el-form-item prop="familyList">
<el-table :data="formData.familyList" border max-height="500" size="mini" style="width: 100%">
<el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
<el-table-column prop="relation" label="与本人关系">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.relation'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.relation" placeholder="请填写与本人关系" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.name'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.name" placeholder="请填写姓名" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="age" label="年龄(岁)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.age'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.age" placeholder="年龄" :min="1"
:max="100" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="homeUnit" label="工作单位">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.homeUnit'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.homeUnit" placeholder="请填写工作单位" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="yearIncome" label="年收入(元)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.yearIncome'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.yearIncome" placeholder="年收入"
:min="0" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="remarks" label="备注">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.remarks'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.remarks" placeholder="请填写备注" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px">
<template slot="header" slot-scope="scope">
<el-button @click="formData.familyList.push({})" icon="el-icon-plus" type="primary"
size="mini">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button @click="formData.familyList.splice(scope.$index,1)"
size="mini"
icon="el-icon-delete"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<el-form-item prop="files">
<file-upload :value.sync="formData.files"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-form-item prop="sign">
<pc-signature v-model="formData.sign"></pc-signature>
</el-form-item>
<el-form-item class="mt10">
<div style="color: red;">
{{ '本人承诺:本人及家庭成员未有购买价格超过15万元的机动车,也未有两套及以上商品房,特此承诺!' }}
</div>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</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-row>
</el-card>
<div v-else>
<el-card class="box-card" style="height: 92vh" shadow="never">
<el-result icon="warning" title="温馨提醒" subTitle="">
<template slot="extra">
<span v-if="blockMessage">{{blockMessage}}</span>
<span v-else>抱歉,当前时间不能申请,可申请时间为{{time}}。</span>
</template>
</el-result>
</el-card>
</div>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
isShow: false,
time: '',
blockMessage: '',
formData: {
id: GetQueryString("bizId"),
mode: '1',
applyCount: '1',
},
formRules: {
proxyUserName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
proxyLoginName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sex: [{required: true, message: '请填写性别', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写受补助人', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请填写所属单位', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请填写所属工会', trigger: ['blur', 'change']}],
homeAddress: [{required: true, message: '请填写家庭住址', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '请填写手机号码', trigger: ['blur', 'change']}],
idCard: [{required: true, message: '请填写身份证号', trigger: ['blur', 'change']}],
bankCardNum: [{required: true, message: '请填写收款账户卡号', trigger: ['blur', 'change']}],
bankUserName: [{required: true, message: '请填写户名', trigger: ['blur', 'change']}],
bankOfDeposit: [{required: true, message: '请填写开户行', trigger: ['blur', 'change']}],
position: [{required: true, message: '请填写职务', trigger: ['blur', 'change']}],
officialCapacity: [{required: true, message: '请填写职称', trigger: ['blur', 'change']}],
subsidyStandards: [{required: true, message: '请选择困难类型', trigger: ['blur', 'change']}],
reason: [{required: true, message: '请填写申请原因', trigger: ['blur', 'change']}],
sign: [{required: true, message: '请签字', trigger: ['blur', 'change']}]
},
// 替他人申请相关
subsidizedList: []
}
},
methods: {
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/difficultHelp/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
commonUtil.pjaxPush('/platform/difficultHelp/mine')
}
})
})
},
// 提交
async onSubmit() {
this.$refs.formRef.validate().then((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const result = this.isValidIdCard(this.formData.idCard)
if (result.status === 0) {
this.$message.warning(result.msg)
return
}
const bankRes = this.validateCard(this.formData.bankCardNum)
if (bankRes.status === 0) {
this.$message.warning(bankRes.msg)
return;
}
this.$axios.post('/platform/difficultHelp/apply/submit', {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/difficultHelp/mine')
}
})
})
}
})
},
async onFinishTask() {
this.$refs.formRef.validate().then((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const result = this.isValidIdCard(this.formData.idCard)
if (result.status === 0) {
this.$message.warning(result.msg)
return
}
const bankRes = this.validateCard(this.formData.bankCardNum)
if (bankRes.status === 0) {
this.$message.warning(bankRes.msg)
return;
}
this.$axios.post('/platform/difficultHelp/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/difficultHelp/mine')
}
})
})
}
})
},
// 查询受助人
queryRecipients(key) {
this.$axios.post("/platform/difficultHelp/apply/queryRecipients", {
key
}).then(res => {
if (res.code === 0) {
this.subsidizedList = res.data
}
})
},
findOne(id) {
this.$axios.post('/platform/difficultHelp/mine/findOne', { id }).then(res => {
if (res.code === 0) {
this.formData = res.data
this.queryRecipients(res.data.loginName)
}
})
},
async userChange() {
const user = this.subsidizedList.find(item => item.id === this.formData.userId)
if (user) {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unitId)
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'unionId', user.unionId)
this.$set(this.formData, 'unionName', user.unionName)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'idCard', user.idCard)
} else {
this.$set(this.formData, 'userId', null)
this.$set(this.formData, 'userName', null)
this.$set(this.formData, 'loginName', null)
this.$set(this.formData, 'sex', null)
this.$set(this.formData, 'unitId', null)
this.$set(this.formData, 'unitName', null)
this.$set(this.formData, 'unionId', null)
this.$set(this.formData, 'unionName', null)
this.$set(this.formData, 'birthday', null)
this.$set(this.formData, 'mobile', null)
}
},
// 申请模式
modeChange(val) {
const savedApplyCount = this.formData.applyCount;
const user = this.$store.state.user
if (val === "1") {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "1")
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unit.id)
this.$set(this.formData, 'unitName', user.unit.name)
this.$set(this.formData, 'unionId', user.union.id)
this.$set(this.formData, 'unionName', user.union.name)
this.$set(this.formData, 'yearIncome', null)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'idCard', user.idCard)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'homeAddress', user.homeAddress)
this.$set(this.formData, 'subsidyStandards', null)
this.$set(this.formData, 'reason', null)
this.$set(this.formData, 'remarks', null)
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
this.$set(this.formData, 'applyCount', savedApplyCount )
this.queryRecipients(user.loginname)
} else {
this.formData = {}
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "2")
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
this.$set(this.formData, 'applyCount',savedApplyCount )
}
},
/**
* 检验身份证号
* @param idCard
* @returns {{status: number, msg: string}}
*/
isValidIdCard(idCard) {
// 校验18位身份证号
const format18 = /^(((([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4})|(([9](([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2])))\d{3}))(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
// 校验15位身份证号
const format15 = /^\d{15}$/;
// 校验外国人永久居留身份证号
const format15Foreign = /^[a-zA-Z]{3}[0-9]{4}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{2}$/;
// 校验格式
if (!(format18.test(idCard) || format15.test(idCard) || format15Foreign.test(idCard))) {
return { status: 0, msg: '身份证号码格式不正确' };
}
// 校验出生日期
let year, month, day;
if (idCard.length === 18) {
year = idCard.substr(6, 4);
month = idCard.substr(10, 2);
day = idCard.substr(12, 2);
} else if (idCard.length === 15) {
year = '19' + idCard.substr(6, 2);
month = idCard.substr(8, 2);
day = idCard.substr(10, 2);
} else {
return { status: 0, msg: '身份证号码格式不正确' };
}
const date = new Date(year, month - 1, day);
if (date.getFullYear() !== parseInt(year, 10) || date.getMonth() + 1 !== parseInt(month, 10) || date.getDate() !== parseInt(day, 10)) {
return { status: 0, msg: '身份证出生日期不正确' };
}
// 校验18位身份证号的校验码
if (idCard.length === 18) {
const coefficients = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkCodeMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idCard.charAt(i), 10) * coefficients[i];
}
const checkCode = checkCodeMap[sum % 11];
if (checkCode.toUpperCase() !== idCard.charAt(17).toUpperCase()) {
return { status: 0, msg: '身份证校验码不正确' };
}
}
return { status: 1, msg: '校验通过' };
},
/**
* 校验银行卡号
* @param bankCardNum
* @returns {{status: number, msg: string}}
*/
validateCard(bankCardNum) {
// 移除所有空格
bankCardNum = bankCardNum.replace(/\s+/g, '');
// 检查格式
const cardRegex = /^\d{13,19}$/;
if (!cardRegex.test(bankCardNum)) {
return { status: 0, msg: "银行卡号格式不正确,请输入13到19位数字。" };
}
// 检查Luhn算法
if (!/^\d+$/.test(bankCardNum)) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
let sum = 0;
let shouldDouble = false;
for (let i = bankCardNum.length - 1; i >= 0; i--) {
let digit = parseInt(bankCardNum.charAt(i));
if (shouldDouble) {
digit *= 2;
if (digit > 9) {
digit -= 9;
}
}
sum += digit;
shouldDouble = !shouldDouble;
}
if ((sum % 10) !== 0) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
return { status: 200, msg: "卡号有效。" };
},
async getIsCanPlay() {
this.$axios.post('/platform/difficultHelp/apply/getIsCanPlay').then(res => {
if (res.code === 0) {
// 新增申请进入页面时,优先校验当前登录人本年度是否已经申请过,已申请则直接拦截新增。
if (!this.bizId && res.data.hasCurrentYearApply) {
this.isShow = false
this.$set(this, 'blockMessage', '抱歉,您本年度已申请困难帮扶,不能重复申请。')
} else {
this.isShow = res.data.result
this.$set(this, 'blockMessage', '')
}
this.$set(this, 'time', res.data.time);
if (res.data.applyCount !== null && res.data.applyCount !== undefined && res.data.applyCount !== 0) {
this.$set(this.formData, 'applyCount', res.data.applyCount)
}
}
})
}
},
async created() {
await this.getIsCanPlay();
if (this.bizId) {
this.findOne(this.bizId)
} else {
this.modeChange("1")
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,45 @@
<div id="difficult_help_branch_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#difficult_help_branch_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,312 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable 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 :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 :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审批列表">
<el-button type="primary" size="small" @click="allAudit" :disabled="pageForm.audit === 'true'">一键审核</el-button>
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
@selection-change="handleSelectionChange"
ref="table" row-key="id" style="width: 100%">
<el-table-column type="selection" width="45"></el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
audit: "false"
},
tableColumns: [
{ prop: "loginName", label: "受助人工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "proxyUserName", label: "申请人", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "mobile", label: "联系方式", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "applyCount", label: "申请次数", sortable: true },
{ prop: "taskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
unions: [],
units: [],
formData: {},
showApprovalForm: false,
selectData: []
}
},
components: {
'info': INFO,
},
computed: {
hasUnapprovedItems() {
return this.tableData.some(item => item.taskState === 10);
}
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
allAudit() {
if (this.pageForm.audit !== "false" || !this.tableData || this.tableData.length === 0) {
this.$message.warning('没有待审核的数据!');
return;
}
if (this.selectData.length === 0) {
this.$message.warning('请勾选待审核数据!');
return;
}
const message = '确定要一键审核这 ' + this.selectData.length + ' 条记录吗?';
this.$confirm(message, '批量审核确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.batchApprove(this.selectData);
}).catch(() => {
});
},
async batchApprove(items) {
const loading = this.$loading({
lock: true,
text: '正在批量审核...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
let successCount = 0;
let failCount = 0;
try {
for (let i = 0; i < items.length; i++) {
const item = items[i];
try {
await this.approveSingleItem(item);
successCount++;
} catch (error) {
failCount++;
}
}
loading.close();
if (failCount > 0) {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条,失败 ' + failCount + ' 条',
type: 'warning'
});
} else {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条',
type: 'success'
});
}
this.doSearch();
} catch (error) {
loading.close();
this.$message.error('批量审核过程中发生错误');
}
},
approveSingleItem(item) {
return new Promise((resolve, reject) => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: item.taskId,
tf_opinion: '审核通过',
submitType: 1
})
}).then((res) => {
if (res.code === 0) {
resolve(res);
} else {
reject(res);
}
}).catch((error) => {
reject(error);
});
});
},
openAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
handleSelectionChange: function (val) {
this.selectData = val
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,145 @@
const INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">{{ viewData.proxyUserName }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="填写人工号">{{ viewData.proxyLoginName }}</el-descriptions-item>
<!--\t\t<el-descriptions-item label="申请模式">{{ viewData.mode == 1 ? '本人申请' : '替他人申请' }}</el-descriptions-item>-->
<el-descriptions-item label="所属单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="家庭年总收入(万元)">{{ viewData.homeIncome }}</el-descriptions-item>
<el-descriptions-item label="家庭人数">{{ viewData.homeNumber }}</el-descriptions-item>
<el-descriptions-item label="职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="职称">{{ viewData.officialCapacity }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="受补助人">{{ viewData.userName + '(' + viewData.loginName + ')' }}
</el-descriptions-item>
<el-descriptions-item label="开户行">{{ viewData.bankOfDeposit }}</el-descriptions-item>
<el-descriptions-item label="银行卡号">{{ viewData.bankCardNum }}</el-descriptions-item>
<el-descriptions-item label="申请次数" >{{ 1 }}</el-descriptions-item>
<el-descriptions-item label="家庭住址" :span="2">{{ viewData.homeAddress }}</el-descriptions-item>
<el-descriptions-item label="家庭主要成员(在一起生活的直系亲属)经济收入情况" :span="3">
<el-table :data="viewData.familyList" border style="width: 92%">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column prop="relation" label="关系"></el-table-column>
<el-table-column label="姓名" prop="name"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="homeUnit" label="工作或学习单位"></el-table-column>
<el-table-column prop="yearIncome" label="年均收入"></el-table-column>
<el-table-column prop="remarks" label="备注"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="本人承诺" :span="3">
<div style="text-align: left; padding-left: 10px">
本人及家庭成员未有购买价格超过15万元的机动车,也未有两套及以上商品房,特此承诺!
</div>
<div style="text-align: right; padding-right: 80px; margin-top: 10px;">
<span>承诺人:{{ viewData.userName }}</span>
<span style="margin-left: 30px;">{{ $moment(viewData.applyTime).format('YYYY-MM-DD') }}</span>
</div>
</el-descriptions-item>
<el-descriptions-item label="生活致困原因" :span="3">{{ viewData.reason }}</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview v-if="viewData.files && viewData.files.length > 0" :files="viewData.files"
complete_result></file-preview>
<span v-else>暂无</span>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image v-if="viewData.sign"
:src="viewData.sign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel 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>
<template v-if="task.displayName == '校工会审核'">
<el-descriptions-item label="审批级别">{{ viewData.level }}</el-descriptions-item>
<el-descriptions-item label="审批金额">{{ '¥' + viewData.money }}</el-descriptions-item>
</template>
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {},
doneTasks: [],
row: null,
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.info()
this.getDoneTasks()
},
// 获取申请信息
info() {
this.$axios.post("/platform/difficultHelp/mine/findOne", { id: this.row.id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", { bizId: this.row.id }).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
},
}
@@ -0,0 +1,187 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable 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 :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 :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请记录">
<el-button size="small" type="primary" @click="onApply">帮扶申请</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<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 v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)" size="mini" type="primary">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button @click="doExportApply(row)" size="mini" type="primary">打印</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY")
},
tableColumns: [
{ prop: "loginName", label: "受助人工号", sortable: true, width: "125" },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "proxyUserName", label: "申请人", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "mobile", label: "联系方式", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "money", label: "实际帮扶金额", sortable: true, width: "135"},
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "applyCount", label: "申请次数", sortable: true },
{ prop: "taskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
unions: [],
units: []
}
},
components: {
"info": INFO
},
methods: {
onApply(){
commonUtil.pjaxPush('/platform/difficultHelp/apply')
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/difficultHelp/apply?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/difficultHelp/mine/onDelete", { id }).then((res) => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
doExportApply(row) {
this.$downLoad('/platform/difficultHelp/reading/doExportApply?id=' + row.id + '&print=true')
}
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,217 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable 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 :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 :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="数据列表">
<el-button type="primary" size="small" @click="importMoney">导入实际金额</el-button>
<el-button @click="exportYearPayRecord" size="small" icon="el-icon-download" type="primary">导出补助金额</el-button>
<el-button @click="exportAllApply" size="small" type="primary">导出申请表(压缩包)</el-button>
<el-button @click="exportSummaryXlsx" size="small" type="primary">导出汇总表(excel</el-button>
<el-button @click="exportSummaryDocx" size="small" type="primary">导出汇总表(word</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='taskName'">
<span>{{ row.instanceState == '20' ? '结束' : row.taskName }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="250px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="doExportApply(row)" size="mini" type="primary">导出</el-button>
<el-button v-if="$auth.hasRole('SYSADMIN')" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="人员导入" :visible.sync="importDialog" width="50%" :close-on-click-modal="false" :close-on-press-escape="false">
<file-import
ref="viewImport"
temp_url="/platform/difficultHelp/reading/downloadTemplate"
post_url="/platform/difficultHelp/reading/importMoney"
@flush="successImport"
></file-import>
</el-dialog>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
},
tableColumns: [
{ prop: "loginName", label: "受助人工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "proxyUserName", label: "申请人", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "mobile", label: "联系方式", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "applyCount", label: "申请次数", sortable: true },
{ prop: "money", label: "实际金额", sortable: true },
// { prop: "taskName", label: "当前节点" },
// { prop: "instanceState", label: "流程状态" }
],
unions: [],
units: [],
importDialog: false,
}
},
components: {
'info': INFO,
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime())
},
methods: {
importMoney() {
this.importDialog = true
},
successImport() {
this.importDialog = false
this.pageData()
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/difficultHelp/apply?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/difficultHelp/mine/onDelete", { id }).then((res) => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
exportYearPayRecord(){
this.$downLoad('/platform/difficultHelp/reading/exportYearPayRecord', this.pageForm)
},
exportAllApply() {
this.$downLoad('/platform/difficultHelp/reading/doExportAllApply', this.pageForm)
},
exportSummaryXlsx() {
const params = {...this.pageForm, flag: "xlsx"};
this.$downLoad('/platform/difficultHelp/reading/exportSummary', params)
},
exportSummaryDocx() {
const params = {...this.pageForm, flag: "docx"};
this.$downLoad('/platform/difficultHelp/reading/exportSummary', params)
},
doExportApply(row) {
this.$downLoad('/platform/difficultHelp/reading/doExportApply?id=' + row.id + '&print=false')
}
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,49 @@
<div id="difficult_help_school_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审核金额" prop="tf_money" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number placeholder="请输入金额" v-model="formData.tf_money"></el-input-number>
</el-form-item>
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#difficult_help_school_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_money: 0,
tf_opinion: "",
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,365 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable 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 :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 :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审批列表">
<el-button type="primary" size="small" @click="allAudit" :disabled="pageForm.audit === 'true'">一键审核</el-button>
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :reserve-selection="true" type="selection" width="55"></el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-dialog title="设置审核信息" :visible.sync="dialogVisible" width="30%" center>
<el-form :model="formData" ref="formData" label-width="100px">
<el-form-item label="级别" prop="level" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<dict-select v-model="formData.level" code="DIFFICULT_LEVEL" style="width: 100%" placeholder="请选择级别"></dict-select>
</el-form-item>
<el-form-item label="审核金额" prop="money" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number placeholder="请输入金额" v-model="formData.money" style="width: 100%" :precision="2" :min="0"></el-input-number>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="submitAudit">确 定</el-button>
</span>
</el-dialog>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="100px" label-suffix="">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="级别" prop="level" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<search-item>
<dict-select v-model="formData.level" code="DIFFICULT_LEVEL" style="width: 100%" placeholder="请选择级别"></dict-select>
</search-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核金额" prop="money" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number placeholder="请输入金额" v-model="formData.money" style="width: 100%" :precision="2"
:min="0" ></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
audit: "false"
},
tableColumns: [
{ prop: "loginName", label: "受助人工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "proxyUserName", label: "申请人", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "mobile", label: "联系方式", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "applyCount", label: "申请次数", sortable: true },
{ prop: "curTaskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
unions: [],
units: [],
formData: {
level: '',
money: 0,
tf_opinion: "",
},
showApprovalForm: false,
auditForm: {
level: '',
money: 0
},
dialogVisible: false
}
},
components: {
'info': INFO,
},
methods: {
openView(row){
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
allAudit() {
const selectedRows = this.$refs.table.selection;
if (selectedRows.length === 0) {
this.$message.warning('请至少选择一条记录进行审核!');
return;
}
this.dialogVisible = true;
},
submitAudit() {
this.$refs.formData.validate((valid) => {
if (valid) {
const selectedRows = this.$refs.table.selection;
const message = '确定要审核这 ' + selectedRows.length + ' 条记录吗?';
this.$confirm(message, '批量审核确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.batchApprove(selectedRows);
this.dialogVisible = false;
}).catch(() => {
});
} else {
this.$message.error('请填写完整的审核信息!');
}
});
},
async batchApprove(items) {
const loading = this.$loading({
lock: true,
text: '正在批量审核...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
let successCount = 0;
let failCount = 0;
try {
for (let i = 0; i < items.length; i++) {
const item = items[i];
try {
await this.approveSingleItem(item);
successCount++;
} catch (error) {
failCount++;
}
}
loading.close();
if (failCount > 0) {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条,失败 ' + failCount + ' 条',
type: 'warning'
});
} else {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条',
type: 'success'
});
}
this.doSearch();
} catch (error) {
loading.close();
this.$message.error('批量审核过程中发生错误');
}
},
approveSingleItem(item) {
return new Promise((resolve, reject) => {
this.$axios.post("/platform/difficultHelp/schoolUnionApproval/save", {
data: JSON.stringify({
...this.formData,
id: item.id
})
}).then((saveRes) => {
if (saveRes.code !== 0) {
throw new Error(saveRes.msg || '保存失败');
}
return this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: item.taskId,
tf_opinion: '审核通过',
submitType: 1,
})
});
}).then((taskRes) => {
if (taskRes.code === 0) {
resolve(taskRes);
} else {
throw new Error(taskRes.msg || '审批失败');
}
}).catch((error) => {
reject(error);
});
});
},
openAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName,
id: row.id
}
this.$refs.infoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/difficultHelp/schoolUnionApproval/save", {
data: JSON.stringify({
...this.formData,
})
}).then((saveRes) => {
if (saveRes.code === 0) {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((taskRes) => {
if (taskRes.code === 0) {
this.$message.success('操作成功');
this.$refs.guava.index();
this.doSearch();
}
});
}
});
}).catch(() => {
});
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,45 @@
<div id="difficult_help_branch_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#difficult_help_branch_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,305 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable 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 :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 :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审批列表">
<el-button type="primary" size="small" @click="allAudit" :disabled="pageForm.audit === 'true'">一键审核</el-button>
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" @selection-change="handleSelectionChange"
ref="table" row-key="id" style="width: 100%">
<el-table-column type="selection" width="45"></el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
audit: "false"
},
tableColumns: [
{ prop: "loginName", label: "受助人工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "proxyUserName", label: "申请人", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "mobile", label: "联系方式", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "applyCount", label: "申请次数", sortable: true },
{ prop: "curTaskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
unions: [],
units: [],
formData: {},
showApprovalForm: false,
selectData: [],
}
},
components: {
'info': INFO,
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
allAudit() {
if (this.pageForm.audit !== "false" || !this.tableData || this.tableData.length === 0) {
this.$message.warning('没有待审核的数据!');
return;
}
if (this.selectData.length === 0) {
this.$message.warning('请勾选待审核数据!');
return;
}
const message = '确定要一键审核这 ' + this.selectData.length + ' 条记录吗?';
this.$confirm(message, '批量审核确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.batchApprove(this.selectData);
}).catch(() => {
});
},
async batchApprove(items) {
const loading = this.$loading({
lock: true,
text: '正在批量审核...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
let successCount = 0;
let failCount = 0;
try {
for (let i = 0; i < items.length; i++) {
const item = items[i];
try {
await this.approveSingleItem(item);
successCount++;
} catch (error) {
failCount++;
}
}
loading.close();
if (failCount > 0) {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条,失败 ' + failCount + ' 条',
type: 'warning'
});
} else {
this.$message({
message: '批量审核完成:成功 ' + successCount + ' 条',
type: 'success'
});
}
this.doSearch();
} catch (error) {
loading.close();
this.$message.error('批量审核过程中发生错误');
}
},
approveSingleItem(item) {
return new Promise((resolve, reject) => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: item.taskId,
tf_opinion: '审核通过',
submitType: 1
})
}).then((res) => {
if (res.code === 0) {
resolve(res);
} else {
reject(res);
}
}).catch((error) => {
reject(error);
});
});
},
openAudit(row) {
this.$refs.guava.edit(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
handleSelectionChange: function (val) {
this.selectData = val
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,131 @@
<div id="difficult_help_view">
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">{{ viewData.proxyUserName }}</el-descriptions-item>
<el-descriptions-item label="填写人工号">{{ viewData.proxyLoginName }}</el-descriptions-item>
<el-descriptions-item label="申请模式">{{ viewData.mode == 1 ? '本人申请' : '替他人申请' }}</el-descriptions-item>
<el-descriptions-item label="受助人">{{ viewData.userName + '(' + viewData.loginName + ')' }}</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.unionName }}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="职务职称">{{ viewData.officialCapacity }}</el-descriptions-item>
<el-descriptions-item label="手机号码">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="身份证号" :span="2">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="月收入">{{ viewData.monthlyIncome }}</el-descriptions-item>
<el-descriptions-item label="收款账户" :span="2">{{ viewData.bankCardNum }}</el-descriptions-item>
<el-descriptions-item label="困难类型" :span="3">{{ viewData.subsidyStandards }}</el-descriptions-item>
<el-descriptions-item label="申请原因" :span="3">{{ viewData.reason }}</el-descriptions-item>
<el-descriptions-item label="家庭成员经济收入" :span="3">
<el-table :data="viewData.familyList" border style="width: 92%">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="姓名" prop="name"></el-table-column>
<el-table-column prop="relation" label="年龄(岁)"></el-table-column>
<el-table-column prop="relation" label="关系"></el-table-column>
<el-table-column prop="monthlyIncome" label="月收入(元)"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview v-if="viewData.files && viewData.files.length > 0" :files="viewData.files" complete_result></file-preview>
<span v-else>暂无</span>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image v-if="viewData.sign"
:src="viewData.sign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ 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>
<template v-if="task.taskFormData.tf_money">
<el-descriptions-item label="审批金额">{{ task.tf_money }}</el-descriptions-item>
</template>
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion }}</el-descriptions-item>
</el-descriptions>
</div>
</template>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#difficult_help_view",
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
viewData: {},
doneTasks: []
}
},
methods: {
info() {
this.$axios.post("/platform/difficultHelp/mine/findOne", { id: this.businessId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", { instanceId: this.instanceId }).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
}
},
created() {
this.info()
this.getDoneTasks()
}
})
</script>
<style>
.task-panel {
background: white;
border-radius: 4px;
overflow: hidden;
}
.task-panel-header {
background: rgb(250, 250, 250);
border: 1px solid rgb(228, 231, 237);
border-bottom: none;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.el-descriptions-item__label.is-bordered-label {
width: 15%;
}
</style>
@@ -0,0 +1,380 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="申请表单" define_key="DSZNFMTX"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-suffix="" label-width="170px">
<!-- 将表单项按两列重新排列 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="职工姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别" prop="sex">
<el-input v-model="formData.sex" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="出生年月" prop="birthday">
<el-input :value="formatDate(formData.birthday)" readonly ></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原工作单位" prop="unitName">
<el-input v-model="formData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="退休时间" prop="retireTime">
<el-date-picker type="date"
v-model="formData.retireTime"
placeholder="请选择"
clearable
style="width: 100%"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="爱人姓名" prop="loverName">
<el-input type="text" v-model="formData.loverName" placeholder="请输入爱人姓名"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="性别" prop="loverSex">
<el-select v-model="formData.loverSex" placeholder="请选择" style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作单位" prop="loverUnitName">
<el-input type="text" v-model="formData.loverUnitName"
placeholder="请输入工作单位"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="结婚日期" prop="marryTime">
<el-date-picker type="date"
v-model="formData.marryTime"
placeholder="请选择"
clearable
style="width: 100%"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="子女出生日" prop="childrenBirthday">
<el-date-picker type="date"
v-model="formData.childrenBirthday"
placeholder="请选择子女出生日"
clearable
style="width: 100%"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="领独生子女证日" prop="getCertificateTime">
<el-date-picker type="date"
v-model="formData.getCertificateTime"
placeholder="请选择"
clearable
style="width: 100%"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="办证机关" prop="office">
<el-input type="text" v-model="formData.office"
placeholder="请输入办证机关"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="独生子女光荣证号" prop="childrenGraceNumber">
<el-input type="text" v-model="formData.childrenGraceNumber"
placeholder="请输入独生子女光荣证号"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 以下项目保持单独一行 -->
<el-form-item prop="honorFiles" label="独生子女父母光荣证">
<file-upload :upload_number="5" :value.sync="formData.honorFiles"
upload_result_type="url"
upload_text="请上传独生子女父母光荣证"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
<el-form-item prop="retireFiles" label="退休证">
<file-upload :upload_number="5" :value.sync="formData.retireFiles"
upload_result_type="url"
upload_text="请上传退休证"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
<el-form-item prop="sign" label="签字">
<pc-signature v-model="formData.sign"></pc-signature>
</el-form-item>
<el-form-item prop="declarationAgreed">
<el-checkbox v-model="formData.declarationAgreed">
根据《河北省人口与计划生育条例》第四章第三十四条第四款"独生子女父母是国家工作人员、企事业单位员工的,退休时分别给予不低于三千元一次性奖励"的规定。<br/>
说明:1. 本人应如实填写各项情况。2. 申报时需持《独生子女父母光荣证》、《退休证》原件及其复印件各一份。
</el-checkbox>
</el-form-item>
</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-row>
</el-card>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
dicts: [],
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {},
formRules: {
userName: [{ required: true, message: '职工姓名不能为空', trigger: 'blur' }],
sex: [{ required: true, message: '性别不能为空', trigger: 'blur' }],
birthday: [{ required: true, message: '出生年月不能为空', trigger: 'blur' }],
unitName: [{ required: true, message: '原工作单位不能为空', trigger: 'blur' }],
retireTime: [{ required: true, message: '请选择退休时间', trigger: 'change' }],
loverName: [{ required: true, message: '请输入爱人姓名', trigger: 'blur' }],
loverSex: [{ required: true, message: '请选择爱人性别', trigger: 'change' }],
loverUnitName: [{ required: true, message: '请输入爱人工作单位', trigger: 'blur' }],
marryTime: [{ required: true, message: '请选择结婚日期', trigger: 'change' }],
childrenBirthday: [{ required: true, message: '请选择子女出生日', trigger: 'change' }],
getCertificateTime: [{ required: true, message: '请选择领独生子女证日', trigger: 'change' }],
childrenGraceNumber: [{ required: true, message: '请输入独生子女光荣证号', trigger: 'blur' }],
office: [{ required: true, message: '请输入办证机关', trigger: 'blur' }],
honorFiles: [{ required: true, message: '请上传独生子女父母光荣证', trigger: 'change' }],
retireFiles: [{ required: true, message: '请上传退休证', trigger: 'change' }],
//sign: [{ required: true, message: '请签字', trigger: 'change' }],
declarationAgreed: [{ required: true, message: '请勾选申报理由', trigger: 'change', type: 'enum', enum: [true] }]
},
}
},
methods: {
// 添加日期格式化方法
formatDate(date) {
if (!date) return '';
// 如果已经是 yyyy-MM-dd 格式,直接返回
if (typeof date === 'string' && /^\d{4}-\d{2}-\d{2}/.test(date)) {
// 如果包含时间,只取日期部分
if (date.length > 10) {
return date.substring(0, 10);
}
return date;
}
// 否则转换为 yyyy-MM-dd 格式
try {
const d = new Date(date);
if (isNaN(d.getTime())) {
return date;
}
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
} catch (e) {
return date;
}
},
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/dsznfmtx/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush('/platform/dsznfmtx/mine/index')
}
})
})
},
// 提交验证
validateBeforeSubmit() {
return new Promise((resolve) => {
this.$refs.formRef.validate((valid) => {
if (valid) {
resolve(true);
} else {
this.$message.error('请完善表单信息并勾选申报理由');
resolve(false);
}
});
});
},
// 添加检查用户状态的方法
async checkUserStatus() {
// 检查是否为退休人员
const isRetired = await this.checkRetirementStatus();
if (!isRetired) {
this.$message.warning('您不是退休人员,无法申请此项福利');
return false;
}
// 如果不是编辑状态,检查是否已申请过
if (!this.bizId) {
const isApplied = await this.checkUserApplication();
if (isApplied) {
this.$message.warning('您已经提交过申请,不能重复申请');
return false;
}
}
return true; // 返回 true 表示检查通过
},
// 添加检查是否为退休人员的方法
async checkRetirementStatus() {
try {
const resp = await this.$axios.post('/platform/dsznfmtx/apply/checkRetirementStatus');
// 如果返回code为0且data为true,表示用户是退休人员
if (resp.code === 0 && resp.data === true) {
return true;
}
return false;
} catch (error) {
console.error('检查退休状态失败:', error);
return false;
}
},
// 检查用户是否已申请过
async checkUserApplication() {
try {
const resp = await this.$axios.post('/platform/dsznfmtx/apply/checkUserApplied');
// 如果返回code为0且data为true,表示用户已申请过
if (resp.code === 0 && resp.data === true) {
return true;
}
return false;
} catch (error) {
console.error('检查用户申请状态失败:', error);
return false;
}
},
// 提交
async onSubmit() {
// 检查用户状态,如果检查失败则直接返回
const statusCheckPassed = await this.checkUserStatus();
if (!statusCheckPassed) return;
const isValid = await this.validateBeforeSubmit();
if (!isValid) return;
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/dsznfmtx/apply/submit', {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/dsznfmtx/mine/index')
}
})
})
},
// 再次提交
async onFinishTask() {
const isValid = await this.validateBeforeSubmit();
if (!isValid) return;
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/dsznfmtx/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/dsznfmtx/mine/index')
}
})
})
},
async findOne(id) {
const resp = await $.get('/platform/dsznfmtx/apply/findOne', {id})
if (resp.code === 0) {
return resp.data
}
},
init() {
if (this.bizId) {
this.findOne(this.bizId).then(async data => {
this.formData = data
console( data)
})
} else {
const {id, username, loginname, union, unit, sex, birthday} = this.$store.state.user
this.formData = {
userId: id,
userName: username,
loginName: loginname,
unitId: unit.id,
unitName: unit.name,
unionId: union.id,
unionName: union.name,
sex: sex,
birthday: birthday,
loverSex: sex === '男' ? '女' : '男'
}
}
}
},
created() {
this.init();
this.checkUserStatus();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,136 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button @click="onExport" icon="el-icon-s-promotion" type="primary" size="small">导出</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="retireTime" label="退休时间"></el-table-column>
<el-table-column prop="bonus" label="奖励金额"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="$auth.hasRole('SYSADMIN')" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<dsznfmtx-info ref="dsznfmtxInfoRef"></dsznfmtx-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"dsznfmtx-info": DSZNFMTX_INFO
},
data() {
return {
pageDataUrl: "/platform/dsznfmtx/collect/pageData",
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/dsznfmtx/mine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onExport() {
this.$downLoad('/platform/dsznfmtx/collect/onExport', this.pageForm)
},
},
created() {
this.pageData()
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
//单位查询
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,123 @@
const DSZNFMTX_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<table-tool label="人员信息"></table-tool>
<el-descriptions :column="3" border class="flow-task-form">
<el-descriptions-item label="职工姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{$moment(viewData.birthday).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="原工作单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="退休时间" >{{$moment(viewData.retireTime).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="爱人姓名">{{viewData.loverName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.loverSex}}</el-descriptions-item>
<el-descriptions-item label="工作单位" :span="2">{{viewData.loverUnitName}}</el-descriptions-item>
<el-descriptions-item label="结婚日期">{{$moment(viewData.marryTime).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="子女出生日">{{$moment(viewData.childrenBirthday).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="领独生子女证时间">{{$moment(viewData.getCertificateTime).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="独生子女光荣证号">{{viewData.childrenGraceNumber}}</el-descriptions-item>
<el-descriptions-item label="办证机关">{{viewData.office}}</el-descriptions-item>
<el-descriptions-item label="奖励金额">{{viewData.bonus}}</el-descriptions-item>
<el-descriptions-item :span="3" label="独生子女父母光荣证">
<file-preview :files="viewData.honorFiles" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item :span="3" label="退休证">
<file-preview :files="viewData.retireFiles" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image v-if="viewData.sign"
:src="viewData.sign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</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-item label="签字" :span="3" v-if="!task.ext.isFirstTaskNode">
<el-image :src="task.ext.tf_userSign"
v-if="task.ext.tf_userSign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
viewData: {},
doneTasks: [],
row: null
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/dsznfmtx/apply/findOne', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId,this.row.instanceId)
}
}
}
@@ -0,0 +1,120 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="retireTime" label="退休时间"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>·
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<dsznfmtx-info ref="dsznfmtxInfoRef"></dsznfmtx-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"dsznfmtx-info": DSZNFMTX_INFO
},
data() {
return {
pageDataUrl: "/platform/dsznfmtx/mine/pageData",
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/dsznfmtx/apply/index', {taskId: (row.startTaskId || ''), bizId: row.id})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/dsznfmtx/mine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,288 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="retireTime" label="退休时间"></el-table-column>
<el-table-column prop="bonus" label="奖励金额"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>·
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<dsznfmtx-info ref="dsznfmtxInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="tf_userSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</dsznfmtx-info>
</template>
</guava>
<el-dialog title="输入奖励金额" :visible.sync="bonusDialogVisible" width="400px">
<el-form label-width="80px">
<el-form-item label="奖励金额">
<el-input v-model="bonusFormData.bonus" placeholder="请输入奖励金额">
<template slot="append"></template>
</el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelBonusInput">取 消</el-button>
<el-button type="primary" @click="confirmBonusInput">确 定</el-button>
</div>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"dsznfmtx-info": DSZNFMTX_INFO
},
data() {
return {
pageDataUrl: "/platform/dsznfmtx/schoolAudit/pageData",
pageForm: {
approval: false
},
formData: {},
showApprovalForm: false,
unionOptions: [],
unitOptions: [],
userOptions: [],
// 奖励金额输入对话框相关数据
bonusDialogVisible: false,
bonusFormData: {
bonus: ''
},
currentRow: null,
currentSubmitType: null
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.view(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.currentRow = row;
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
// 显示奖励金额输入对话框
showBonusInputDialog(submitType) {
this.currentSubmitType = submitType;
this.bonusFormData.bonus = '';
this.bonusDialogVisible = true;
},
// 确认奖励金额输入并提交
confirmBonusInput() {
if (!this.bonusFormData.bonus) {
this.$message.warning('请输入奖励金额');
return;
}
// 验证金额格式
const bonusPattern = /^([0-9]*[.]{0,1}[0-9]{0,2})$/;
if (!bonusPattern.test(this.bonusFormData.bonus)) {
this.$message.warning('请输入有效的金额格式');
return;
}
this.bonusDialogVisible = false;
// 调用申请页面的保存方法来更新奖励金额
this.saveBonusAndApprove();
},
// 取消奖励金额输入
cancelBonusInput() {
this.bonusDialogVisible = false;
},
// 保存奖励金额并执行审批
// 保存奖励金额并执行审批
saveBonusAndApprove() {
// 先获取完整的申请数据
this.$axios.post('/platform/dsznfmtx/apply/findOne', {id: this.currentRow.id}).then(res => {
if (res.code === 0) {
// 获取完整的数据后,更新奖励金额
const fullData = res.data;
fullData.bonus = this.bonusFormData.bonus;
// 调用申请页面的保存方法,传递完整数据
this.$axios.post('/platform/dsznfmtx/apply/save', {data: JSON.stringify(fullData)}).then(saveRes => {
if (saveRes.code === 0) {
// 保存成功后执行审批操作
this.executeTaskAction(this.currentSubmitType);
} else {
this.$message.error(saveRes.msg || '保存奖励金额失败');
}
}).catch(error => {
this.$message.error('保存奖励金额失败');
console.error('保存奖励金额失败:', error);
});
} else {
this.$message.error(res.msg || '获取申请数据失败');
}
}).catch(error => {
this.$message.error('获取申请数据失败');
console.error('获取申请数据失败:', error);
});
},
handleTaskAction(val) {
// 如果是同意申请操作(val=1),需要先输入奖励金额
if (val === 1) {
this.showBonusInputDialog(val);
return;
}
// 其他操作直接执行
this.executeTaskAction(val);
},
// 执行任务操作
executeTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index();
this.$message.success(res.msg);
this.doSearch();
}
})
})
},
},
created() {
this.pageData()
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
//单位查询
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,210 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</template>
</search>
</el-card>
<el-card shadow="never">
<table-tool><el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="retireTime" label="退休时间"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>·
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<dsznfmtx-info ref="dsznfmtxInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="tf_userSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</dsznfmtx-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"dsznfmtx-info": DSZNFMTX_INFO
},
data() {
return {
pageDataUrl: "/platform/dsznfmtx/unionAudit/pageData",
pageForm: {
approval: false
},
formData: {},
showApprovalForm: false,
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.view(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.dsznfmtxInfoRef.onOpen(row)
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
},
created() {
this.pageData()
// 根据用户角色加载相应的工会和单位数据
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion().then((data) => {
this.unionOptions = data || []
})
this.$businessTool.listUnit().then((data) => {
this.unitOptions = data || []
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
const userUnionId = this.$store.state.user.union.id
this.$businessTool.listUnion(userUnionId).then((data) => {
this.unionOptions = data ? [data] : []
})
this.$businessTool.listUnit(userUnionId).then((data) => {
this.unitOptions = data || []
})
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,221 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-card shadow="never">
<el-form :model="formData" ref="formRef" label-width="130px">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item prop="activityName" label="活动名称"
:rules="[{required:true,message:'请输入活动名称',trigger:['change','blur']}]">
<el-input v-model="formData.activityName" placeholder="请输入活动名称"
maxlength="30"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="signUpTime" label="报名时间"
:rules="[{required:true,message:'请选择报名时间',trigger:['change','blur']}]">
<el-date-picker
style="width: 100%"
v-model="formData.signUpTime"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="linIds" label="活动线路"
:rules="[{required:true,message:'请选择活动线路',trigger:['change','blur']}]">
<el-select clearable filterable multiple style="width: 100%"
v-model="formData.linIds"
placeholder="请选择活动线路">
<el-option :key="item.id"
:label="item.lineName"
:value="item.id"
v-for="item in lineList"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="unionId" label="查找工会">
<el-select clearable filterable multiple style="width: 100%"
v-model="formData.unionId"
placeholder="请选择工会"
@change="onUnionChange">
<el-option :value="item.id"
:key="item.id"
:label="item.name"
v-for="item in unionOptions"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="unionQuotaAllocationList" label="工会名额分配">
<el-table :data="filteredUnionQuotaAllocationList" size="medium" height="70vh">
<el-table-column type="index" label="序号"></el-table-column>
<el-table-column label="工会名称" prop="unionName"></el-table-column>
<el-table-column label="会员人数" prop="memberNum"></el-table-column>
<el-table-column label="名额" prop="allocationNum">
<template slot="header">
<el-button size="mini" @click="clearUnionQuotaAllocation" type="primary">
清空分配名额
</el-button>
</template>
<template v-slot="{row}">
<el-input-number v-model="row.allocationNum" placeholder="请填写名额数"
:min="0"
style="width: 100%"
:max="row.memberNum"></el-input-number>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="activityContent" label="活动内容"
:rules="[{required:true,message:'活动内容',trigger:['change','blur']}]">
<text-editor v-model="formData.activityContent" key="activityContent"
placeholder="活动内容"></text-editor>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件上传" prop="files">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end" class="mt20">
<el-button type="primary" @click="onSubmit">提交</el-button>
</el-row>
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
lineList: [],
unionOptions: [],
allUnionQuotaAllocationList: [], // 保存所有工会名额分配数据
}
},
computed: {
// 计算属性:根据选择的工会过滤显示的名额分配列表
filteredUnionQuotaAllocationList() {
// 如果没有选择任何工会,显示所有工会
if (!this.formData.unionId || this.formData.unionId.length === 0) {
return this.allUnionQuotaAllocationList;
}
// 如果选择了工会,只显示选中的工会
return this.allUnionQuotaAllocationList.filter(item =>
this.formData.unionId.includes(item.unionId)
);
}
},
methods: {
getLineList() {
this.$axios.post("/platform/excellentRecuperation/activityList/listLineListByThisYear").then(res => {
if (res.code === 0) {
this.lineList = res.data
}
})
},
listUnion() {
this.$axios.post("/platform/excellentRecuperation/activityList/listUnion").then(res => {
if (res.code === 0) {
this.allUnionQuotaAllocationList = res.data; // 保存所有数据
// 如果formData.unionQuotaAllocationList存在,则更新对应数据
if (this.formData.unionQuotaAllocationList) {
this.updateUnionQuotaAllocationList();
}
}
})
},
// 更新名额分配列表数据
updateUnionQuotaAllocationList() {
this.allUnionQuotaAllocationList.forEach(item => {
const existingItem = this.formData.unionQuotaAllocationList.find(
formDataItem => formDataItem.unionId === item.unionId
);
if (existingItem) {
item.allocationNum = existingItem.allocationNum || 0;
}
});
},
// 工会选择变化时的处理
onUnionChange(selectedUnions) {
// 数据会自动根据计算属性更新显示
console.log("Selected unions:", selectedUnions);
},
clearUnionQuotaAllocation() {
this.$confirm("您确定要清空分配名额吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
// 清空所有名额分配
this.allUnionQuotaAllocationList.forEach(item => {
this.$set(item, 'allocationNum', 0);
});
})
},
onOpen(id) {
this.formData = {}
this.$refs.formRef.clearValidate()
this.getLineList()
this.listUnion(); // 始终加载所有工会数据
if (id) {
this.$axios.post("/platform/excellentRecuperation/activityList/findOne", {id}).then(res => {
if (res.code === 0) {
this.formData = res.data
this.$set(this.formData, "signUpTime", [res.data.signUpStartTime, res.data.signUpEndTIme])
// 更新名额分配数据
if (this.allUnionQuotaAllocationList.length > 0) {
this.updateUnionQuotaAllocationList();
}
}
})
}
},
onSubmit() {
this.$refs.formRef.validate(valid => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const formData = clone(this.formData)
formData.signUpStartTime = formData.signUpTime[0]
formData.signUpEndTIme = formData.signUpTime[1]
// 传递过滤后的名额分配列表
formData.unionQuotaAllocationList = this.filteredUnionQuotaAllocationList;
const resp = await this.$axios.post("/platform/excellentRecuperation/activityList/onSubmit", {
data: JSON.stringify(formData)
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
}
})
}
})
}
},
created() {
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
}
}
@@ -0,0 +1,124 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
format="yyyy"
style="width: 100%"
value-format="yyyy"
placeholder="请选择年度"
>
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="活动列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增活动
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="活动名称" prop="activityName"></el-table-column>
<el-table-column label="报名开始时间" prop="signUpStartTime"></el-table-column>
<el-table-column label="报名结束时间" prop="signUpEndTIme"></el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm:{
year: moment().format('YYYY'),
}
}
},
components: {
"basic-form": basicForm,
"info": info,
},
methods: {
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.id)
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row.id)
})
},
onDelete(row) {
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/excellentRecuperation/activityList/onDelete", {id: row.id}).then(res => {
if (res.code === 0) {
this.doSearch()
this.$message({
type: 'success',
message: '删除成功!'
});
}
})
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
refresh() {
this.doSearch()
this.$refs.guava.index()
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,43 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="活动名称">{{ viewData.activityName }}</el-descriptions-item>
<el-descriptions-item label="报名时间">{{ viewData.signUpStartTime }}至{{viewData.signUpEndTIme}}</el-descriptions-item>
<el-descriptions-item label="活动线路" :span="2">{{viewData.linNames}}</el-descriptions-item>
<el-descriptions-item label="工会名额分配" :span="2">
<el-table :data="viewData.unionQuotaAllocationList" size="medium" height="70vh">
<el-table-column type="index" label="序号"></el-table-column>
<el-table-column label="工会名称" prop="unionName"></el-table-column>
<el-table-column label="会员人数" prop="memberNum"></el-table-column>
<el-table-column label="名额" prop="allocationNum"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="活动内容" :span="2">
<div v-html="viewData.activityContent"></div>
</el-descriptions-item>
<el-descriptions-item label="附件上传" :span="2">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {}
}
},
methods: {
async onOpen(id) {
await this.findOne(id)
},
async findOne(id) {
this.$axios.post("/platform/excellentRecuperation/activityList/findOne", {id}).then(resp => {
if (resp.code === 0) {
this.viewData = resp.data
}
})
},
},
}
@@ -0,0 +1,128 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
format="yyyy"
style="width: 100%"
:clearable="false"
value-format="yyyy"
placeholder="请选择年度"
>
</el-date-picker>
</search-item>
<search-item label="活动:">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.activityId"
placeholder="请选择活动">
<el-option :key="item.id"
:label="item.activityName"
:value="item.id"
v-for="item in activityList"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="报名列表">
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="活动名称" prop="activityName"></el-table-column>
<el-table-column label="报名开始时间" prop="signUpStartTime"></el-table-column>
<el-table-column label="报名结束时间" prop="signUpEndTIme"></el-table-column>
<el-table-column label="所属工会" prop="unionName"></el-table-column>
<el-table-column label="分配名额数" prop="allocationNum"></el-table-column>
<!-- <el-table-column label="报名数(已审核通过数)">
<template v-slot="{ row }">
</template>
</el-table-column>-->
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onSignUp(row)" size="mini" type="primary"
v-if="$moment(row.signUpStartTime).valueOf() < $moment().valueOf()
&&
$moment(row.signUpEndTIme).valueOf() > $moment().valueOf()">报名</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
<template #edit>
<sign-up-form ref="signUpFormRef"></sign-up-form>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('info.js'){}#-->
<!--#include('signUpForm.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"info": info,
"sign-up-form": SIGN_UP_FORM,
},
data() {
return {
pageForm: {
year: moment().format('YYYY'),
},
activityList: []
}
},
methods: {
onSignUp(row){
this.$refs.guava.edit(() => {
const activity= this.activityList.find(item => item.id === row.activityId)
this.$refs.signUpFormRef.onOpen(row.activityId, row.unionId,activity)
})
},
onView(row){
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.activityId, row.unionId)
})
},
getActivityList() {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listActivityByYear", {year: this.pageForm.year}).then(res => {
if (res.code === 0) {
this.activityList = res.data
if (this.activityList.length > 0) {
this.$set(this.pageForm, 'activityId', this.activityList[0].id)
}
this.pageData()
}
})
}
},
async created() {
this.getActivityList()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,124 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="活动基础信息" name="one">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="活动名称">{{ viewData.activityName }}</el-descriptions-item>
<el-descriptions-item label="报名时间">{{ viewData.signUpStartTime
}}至{{viewData.signUpEndTIme}}
</el-descriptions-item>
<el-descriptions-item label="活动线路" :span="2">{{viewData.linNames}}</el-descriptions-item>
<el-descriptions-item label="工会名额分配" :span="2">
<el-table :data="viewData.unionQuotaAllocationList" size="medium" height="70vh">
<el-table-column type="index" label="序号"></el-table-column>
<el-table-column label="工会名称" prop="unionName"></el-table-column>
<el-table-column label="会员人数" prop="memberNum"></el-table-column>
<el-table-column label="名额" prop="allocationNum"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="活动内容" :span="2">
<div v-html="viewData.activityContent"></div>
</el-descriptions-item>
<el-descriptions-item label="附件上传" :span="2">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="报名信息" name="two">
<el-table :data="userTableData" :size="tableSize" height="70vh">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="报名线路" prop="lineName"></el-table-column>
<el-table-column prop="signUpTime" label="填报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-dialog
:close-on-click-modal="false"
:append-to-body="true"
:visible.sync="userDialogVisible"
title="详细信息查看"
width="40%"
>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">{{ userViewData.userName }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ userViewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="单位">{{ userViewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="工会">{{ userViewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="userViewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="userDialogVisible = false" type="primary">关 闭</el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
viewData: {},
activeName: "one",
userTableData: [],
activityId: "",
unionId: "",
userDialogVisible:false,
userViewData:{}
}
},
methods: {
openView(row) {
this.userViewData = row
this.userViewData.files = JSON.parse(row.files)
this.userDialogVisible = true
},
async onOpen(id, unionId) {
this.activityId = id
this.unionId = unionId
await this.findOne(id)
this.listQuotaAllocation()
},
async findOne(id) {
this.$axios.post("/platform/excellentRecuperation/activityList/findOne", {id}).then(resp => {
if (resp.code === 0) {
this.viewData = resp.data
}
})
},
listQuotaAllocation() {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listQuotaAllocation", {
activityId: this.activityId,
unionId: this.unionId
}).then(res => {
if (res.code === 0) {
this.userTableData = res.data
}
})
},
},
}
@@ -0,0 +1,335 @@
const SIGN_UP_FORM = {
template: /*language=HTML*/ `
<div>
<div class="process-title">报名信息</div>
<el-card shadow="never">
<el-form :model="formData" ref="formRef" label-width="130px">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item prop="lineId" label="活动线路"
:rules="[{required:true,message:'请选择活动线路',trigger:['change','blur']}]">
<el-select clearable filterable style="width: 100%"
v-model="formData.lineId"
placeholder="请选择活动线路">
<el-option :key="item.id"
:label="item.lineName"
:value="item.id"
v-for="item in lineList"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="userId" label="报名人员"
:rules="[{required:true,message:'请选择报名人员',trigger:['change','blur']}]">
<el-select
style="width: 100%"
v-model="formData.userId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入姓名或工号查询"
@change="userChange"
:remote-method="createRemoteMethod(userOptions)">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.userName+''+item.loginName+''+''+item.unitName+''+''+item.sex+''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="mobile" label="联系方式"
:rules="[{required:true,message:'请输入联系方式',trigger:['change','blur']}]">
<el-input maxlength="50" v-model="formData.mobile"
placeholder="请输入联系方式"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="idCard" label="身份证号"
:rules="[{required:true,message:'请输入身份证号',trigger:['change','blur']}]">
<el-input maxlength="50" v-model="formData.idCard"
placeholder="请输入身份证号"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件上传" prop="files"
:rules="[{required:true,message:'请上传附件',trigger:['change','blur']}]">
<file-upload
:value.sync="formData.files"
:upload_number="5"
upload_result_category="array"
complete_result
upload_mode="file"
></file-upload>
</el-form-item>
</el-col>
</el-row>
</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-row>
</el-card>
<div class="process-title">报名人员信息<span style="color:#ee0a24;">(如需修改或提交报名人员信息请点击编辑后提交)</span></div>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" height="70vh">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="报名线路" prop="lineName"></el-table-column>
<el-table-column prop="signUpTime" label="填报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary"
v-if="row.taskKey === 'startTask' || !row.instanceId">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
v-if="row.taskKey === 'startTask' || !row.instanceId">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog
:close-on-click-modal="false"
:append-to-body="true"
:visible.sync="userDialogVisible"
title="详细信息查看"
width="40%"
>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">{{ userViewData.userName }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ userViewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="单位">{{ userViewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="工会">{{ userViewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="userViewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="userDialogVisible = false" type="primary">关 闭</el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
bizId: "",
taskId: "",
activityId: "",
unionId: "",
lineList: [],
userOptions: [],
userViewData: {},
activityData: {},
userDialogVisible: false
}
},
methods: {
userChange(val) {
const user = this.userOptions.find(o => o.id === val)
if (user) {
const {userName, loginName, unitId, unitName, unionId, unionName, mobile, idCard} = user
this.$set(this.formData, "userName", userName)
this.$set(this.formData, "loginName", loginName)
this.$set(this.formData, "unitId", unitId)
this.$set(this.formData, "unitName", unitName)
this.$set(this.formData, "unionId", unionId)
this.$set(this.formData, "unionName", unionName)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "idCard", idCard)
} else {
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
}
},
async getSIgnUpUserList() {
const res = await this.$axios.post('/platform/excellentRecuperation/activitySignUp/getSIgnUpUserList', {
activityId: this.activityId,
unionId: this.unionId
})
if (res.code === 0) {
return res.data.length
} else {
return 0
}
},
onSave() {
this.getSIgnUpUserList().then(data => {
const union = this.activityData.unionQuotaAllocationList.find(v => v.unionId === this.unionId)
if (data >= union.allocationNum) {
this.$message.error("该活动已满")
return
} else {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("保存成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
}
})
}
})
},
onSubmit() {
this.$refs.formRef.validate(valid => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.getSIgnUpUserList().then(data => {
const union = this.activityData.unionQuotaAllocationList.find(v => v.unionId === this.unionId)
if (data >= union.allocationNum) {
this.$message.error("该活动已满")
return
} else {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/submit', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("提交成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
}
})
}
})
})
}
})
},
onFinishTask() {
this.$refs.formRef.validate(valid => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
})
}
})
},
listQuotaAllocation() {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listQuotaAllocation", {
activityId: this.activityId,
unionId: this.unionId
}).then(res => {
if (res.code === 0) {
this.tableData = res.data
}
})
},
openView(row) {
this.userViewData = row
this.userViewData.files = JSON.parse(row.files)
this.userDialogVisible = true
},
openEdit(row) {
const formData = clone(row)
this.bizId = formData.id
this.taskId = formData.startTaskId
formData.files = JSON.parse(formData.files)
this.formData = formData
this.selectQueryUser(this.formData.loginName, this.userOptions)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.listQuotaAllocation()
}
})
})
},
doDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/doDelete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.listQuotaAllocation()
}
})
})
},
createRemoteMethod(options) {
return (keyword) => {
this.selectQueryUser(keyword, options)
}
},
selectQueryUser(keyword, options) {
options.length = 0
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listUser", {
keyword: keyword,
unionId: this.unionId
}).then((res) => {
if (res.code === 0) {
options.push(...res.data)
}
})
},
getLineList(id) {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listLineByActivityId", {id}).then(res => {
if (res.code === 0) {
if (res.data.length === 1) {
this.$set(this.formData, "lineId", res.data[0].id)
}
this.$set(this.formData, "activityId", this.activityId)
this.lineList = res.data
}
})
},
onOpen(activityId, unionId, activity) {
this.activityId = activityId
this.unionId = unionId
this.activityData = activity
this.listQuotaAllocation()
this.getLineList(activityId)
},
}
}
@@ -0,0 +1,96 @@
const EXCELLENT_RECUPERATION_USER_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">{{ viewData.userName }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ viewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="身份证号">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="工会">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<template v-for="(task,index) in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ 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" :span="3">
{{
task.taskFormData.opinion
}}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
data() {
return {
viewData: {},
doneTasks: [],
row: null
}
},
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
methods: {
// 打开
onOpen(row) {
this.row = row
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/findUserSignUp', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId,this.row.instanceId)
}
}
}
@@ -0,0 +1,173 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="160px" label-position="left">
<el-row :gutter="20" class="">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="年度" prop="year">
<el-date-picker style="width: 100%"
@change="yearChange"
type="year"
placeholder="请选择年度"
v-model="formData.year"
value-format="yyyy"></el-date-picker>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="排序号" prop="serialNumber">
<el-input maxlength="50" v-model="formData.serialNumber"
placeholder="请输入排序号"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="线路名称" prop="lineName">
<el-input maxlength="50" v-model="formData.lineName"
placeholder="请输入线路名称"></el-input>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="旅行社名称" prop="travelAgencyId">
<el-select clearable filterable style="width: 100%" v-model="formData.travelAgencyId"
placeholder="请选择旅行社">
<el-option :key="item.id"
:label="item.travelAgencyName+'('+ item.year +'年)'"
:value="item.id"
v-for="item in localTravelList"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系人" prop="lineContact">
<el-input clearable max="50" v-model="formData.lineContact"
placeholder="请输入联系人"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :rules="[
{ required: false, message: '手机号码不能为空', trigger: 'blur' },
{ pattern: /^1[34578]\\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
]" label="联系方式" prop="lineContactPhone">
<el-input clearable v-model="formData.lineContactPhone"
placeholder="请输入联系方式"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="线路内容" prop="content">
<text-editor v-model="formData.content"></text-editor>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="是否启用" prop="isDisabled">
<el-switch
:active-value="true"
:inactive-value="false"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="formData.isDisabled">
</el-switch>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="移动端缩略图" prop="file">
<file-upload :value.sync="formData.file" accept=".jpg,.jpeg,.png"
:upload_number="1" upload_result_category="interval"
complete_result upload_mode="drag"></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
props: {
travelList: {
type: Array,
required: true
},
},
data() {
return {
localTravelList: [...this.travelList],
formData: {
isDisabled: true
},
formRules: {
serialNumber: [{required: true, message: '请输入排序号', trigger: ['change', 'blur']}],
lineName: [{required: true, message: '请输入线路名称', trigger: ['change', 'blur']}],
travelAgencyId: [{required: true, message: '请选择旅行社', trigger: ['change', 'blur']}],
year: [{required: true, message: '请选择年度', trigger: ['change', 'blur']}],
},
}
},
methods: {
async yearChange() {
this.$set(this.formData, 'travelAgencyId', null)
await this.selectTravelAgencyList()
},
async selectTravelAgencyList() {
const resp = await this.$axios.post('/platform/excellentRecuperation/travelAgency/selectTravelAgency', {year: this.formData.year})
this.localTravelList = resp.data
},
async onOpen(row) {
if (row && row.id) {
this.$axios.post(loc() + '/selectLineInfoById/' + row.id)
.then((resp) => {
const data = resp.data
data.year = data.year.toString()
this.formData = {...data}
})
} else {
await this.getNumber()
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/excellentRecuperation/line/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
async getEnumOptions(enumName) {
const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: enumName })
return resp.data
},
async getNumber() {
const resp = await this.$axios.post(loc() + '/getNo')
this.$set(this.formData, 'serialNumber', resp.data)
},
},
async created() {
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,234 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="开始年度">
<el-date-picker
v-model="pageForm.startYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 100%"
value-format="yyyy"
placeholder="请选择开始年度"
@change="handleChangeYear"
>
</el-date-picker>
</search-item>
<search-item label="结束年度">
<el-date-picker
v-model="pageForm.endYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 100%"
value-format="yyyy"
placeholder="请选择结束年度"
@change="handleChangeYear"
>
</el-date-picker>
</search-item>
<search-item label="旅行社">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.travelAgencyId"
@change="doSearch"
placeholder="请选择旅行社">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyList"
></el-option>
</el-select>
</search-item>
<search-item label="线路名称">
<el-input @keyup.enter.native="doSearch" clearable clearable
placeholder="请输入线路名称"
style="width: 100%"
v-model="pageForm.lineName">
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="线路列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增线路
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'isDisabled'">
<el-switch
:active-value="true"
:inactive-value="false"
@change="(val)=>{lineStatusChange(row.id)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isDisabled">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"
:travel-list="travelAgencyList"
></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
travelAgencyList: [],
unionOptions: [],
showImportDialog: false,
tableColumns: [
{label: '年度', prop: 'year', sortable: true},
{label: '线路名称', prop: 'lineName', sortable: true, width: '200'},
{label: '承担旅行社', prop: 'travelAgencyName', sortable: true},
{label: '创建人', prop: 'createUserName', sortable: true},
{label: '是否启用', prop: 'isDisabled', sortable: true}
],
}
},
methods: {
async lineStatusChange(id) {
const resp = await this.$axios.post(loc() + '/openClosedLine/' + id)
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
},
async getEnumOptions(enumName) {
const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: enumName })
return resp.data
},
async selectTravelAgencyList() {
const resp = await this.$axios.post('/platform/excellentRecuperation/travelAgency/selectTravelAgency', {year: this.formData.year})
this.travelAgencyList = resp.data
},
handleChangeYear(){
if (this.pageForm.startYear && this.pageForm.endYear){
if (this.pageForm.startYear > this.pageForm.endYear){
this.pageForm.endYear = '';
this.$message.error('起始年份需小于结束年份!');
}
}
},
async travelAgencyStatusChange(id) {
const resp = await $.post(loc() + '/openClosedLine/' + id)
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
},
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.id)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/excellentRecuperation/line/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
async initData() {
await this.selectTravelAgencyList()
this.signUpModeList = await this.getEnumOptions('RecuperationSignUpMode')
this.unionOptions = await this.$businessTool.listUnion()
}
},
async created() {
await this.initData()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,55 @@
const info = {
template: /*language=HTML*/ `
<div>
<div class="process-title">线路信息</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="年度">{{ viewData.year }}</el-descriptions-item>
<el-descriptions-item label="编号">{{ viewData.serialNumber }}</el-descriptions-item>
<el-descriptions-item label="线路名称">{{ viewData.lineName }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="线路内容" :span="2">
<div v-html="viewData.content"></div>
</el-descriptions-item>
</el-descriptions>
<div class="process-title">旅行社信息</div>
<el-descriptions :column="2" border class="viewTable">
<el-descriptions-item :span="2" label="旅行社名称">
{{ viewData.travelAgency.travelAgencyName }}
</el-descriptions-item>
<el-descriptions-item label="联系人">{{ viewData.travelAgency.contact }}</el-descriptions-item>
<el-descriptions-item label="电话">{{ viewData.travelAgency.contactMobileNumber }}
</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ viewData.travelAgency.email }}</el-descriptions-item>
<el-descriptions-item label="官网">
<a :href="viewData.travelAgency.officialWebsite" class="text-primary" target="_blank">
{{ viewData.travelAgency.officialWebsite }}
</a>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {
travelAgency:{}
},
//是否只看基本信息 因为出行时间针对每个分工会都不一样
showTravelTimePeriod: false
}
},
methods: {
async onOpen(lineId, usUnionId) {
await this.findOne(lineId, usUnionId)
},
async findOne(id, unionId) {
const resp = await this.$axios.get('/platform/excellentRecuperation/line/selectLineInfoById/' + id)
if (resp.code === 0) {
this.viewData = resp.data
}
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,226 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
format="yyyy"
style="width: 100%"
:clearable="false"
value-format="yyyy"
placeholder="请选择年度"
>
</el-date-picker>
</search-item>
<search-item label="活动:">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.activityId"
placeholder="请选择活动">
<el-option :key="item.id"
:label="item.activityName"
:value="item.id"
v-for="item in activityList"
></el-option>
</el-select>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" clearable style="width: 100%"
@change="flushUnits" @clear="flushUnits">
<el-option v-for="item in unionOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select placeholder="请选择所属单位" style="width: 100%" v-model="pageForm.unitId" clearable
filterable>
<el-option v-for="item in unitOptions" :label="item.name" :value="item.id"
:key="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="报名列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="所属工会" prop="unionName"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
<el-table-column label="报名线路" prop="lineName"></el-table-column>
<el-table-column prop="signUpTime" label="报名时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="300px">
<template v-slot="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<excellent-recuperation-user-info ref="userInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</excellent-recuperation-user-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"excellent-recuperation-user-info":EXCELLENT_RECUPERATION_USER_INFO
},
data() {
return {
pageDataUrl: "/platform/excellentRecuperation/schoolAudit/pageData",
pageForm: {
year: moment().format('YYYY'),
approval: false
},
activityList: [],
showApprovalForm: false,
unionOptions: [],
unitOptions: [],
}
},
methods: {
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.userInfo.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.userInfo.onOpen(row)
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
getActivityList() {
this.$axios.post("/platform/excellentRecuperation/schoolAudit/listActivityByYear", {year: this.pageForm.year}).then(res => {
if (res.code === 0) {
this.activityList = res.data
if (this.activityList.length > 0) {
this.$set(this.pageForm, 'activityId', this.activityList[0].id)
}
this.pageData()
}
})
}
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
this.getActivityList()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,163 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
format="yyyy"
style="width: 100%"
:clearable="false"
value-format="yyyy"
placeholder="请选择年度"
>
</el-date-picker>
</search-item>
<search-item label="活动">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.activityId"
placeholder="请选择活动">
<el-option :key="item.id"
:label="item.activityName"
:value="item.id"
v-for="item in activityList"
></el-option>
</el-select>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" clearable style="width: 100%"
@change="flushUnits" @clear="flushUnits">
<el-option v-for="item in unionOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select placeholder="请选择所属单位" style="width: 100%" v-model="pageForm.unitId" clearable
filterable>
<el-option v-for="item in unitOptions" :label="item.name" :value="item.id"
:key="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="报名列表">
<el-button @click="doExportExcel" size="mini" type="primary">导出汇总名单
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="所属工会" prop="unionName"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
<el-table-column label="报名线路" prop="lineName"></el-table-column>
<el-table-column prop="signUpTime" label="报名时间"></el-table-column>
<el-table-column fixed="right" label="操作" width="300px">
<template v-slot="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="doDelete(row)" size="mini" type="danger"
v-if="$auth.hasRoleOr(['SYSADMIN'])">删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<excellent-recuperation-user-info ref="userInfo"></excellent-recuperation-user-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"excellent-recuperation-user-info": EXCELLENT_RECUPERATION_USER_INFO
},
data() {
return {
pageDataUrl: "/platform/excellentRecuperation/summary/pageData",
pageForm: {
year: moment().format('YYYY'),
},
activityList: [],
unionOptions: [],
unitOptions: [],
}
},
methods: {
doDelete(row) {
this.$confirm("确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/excellentRecuperation/summary/doDelete", {id: row.id}).then((resp) => {
if (resp.code === 0) {
this.$message.success("删除成功")
this.doSearch()
}
})
})
},
doExportExcel() {
this.$downLoad("/platform/excellentRecuperation/summary/doExportExcel", {
data: JSON.stringify(this.pageForm)
})
},
openView(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.userInfo.onOpen(row)
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
getActivityList() {
this.$axios.post("/platform/excellentRecuperation/schoolAudit/listActivityByYear", {year: this.pageForm.year}).then(res => {
if (res.code === 0) {
this.activityList = res.data
if (this.activityList.length > 0) {
this.$set(this.pageForm, 'activityId', this.activityList[0].id)
}
this.pageData()
}
})
}
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
this.getActivityList()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,117 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="年度" prop="year">
<el-date-picker style="width: 100%"
type="year"
placeholder="请选择年度"
v-model="formData.year"
value-format="yyyy"></el-date-picker>
</el-form-item>
<el-form-item label="编号" prop="serialNumber">
<el-input maxlength="50" v-model="formData.serialNumber" placeholder="请输入编号"></el-input>
</el-form-item>
<el-form-item label="旅行社名称" prop="travelAgencyName">
<el-input maxlength="50" v-model="formData.travelAgencyName" placeholder="请输入旅行社名称"></el-input>
</el-form-item>
<el-form-item label="旅行社联系人" prop="contact">
<el-input maxlength="10" v-model="formData.contact" placeholder="请输入旅行社联系人"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="contactMobileNumber">
<el-input v-model="formData.contactMobileNumber" placeholder="请输入联系电话"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input maxlength="50" v-model="formData.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item label="官网" prop="officialWebsite">
<el-input maxlength="100" v-model="formData.officialWebsite" placeholder="请输入官网"></el-input>
</el-form-item>
<el-form-item label="备注" prop="note">
<el-input maxlength="100"
type="textarea"
placeholder="请输入备注"
v-model="formData.note"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="isDisabled">
<el-switch
:active-value="true"
:inactive-value="false"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="formData.isDisabled">
</el-switch>
</el-form-item>
<el-form-item label="移动端缩略图" prop="file">
<file-upload :value.sync="formData.file" accept=".jpg,.jpeg,.png"
:upload_number="1" upload_result_category="interval"
complete_result upload_mode="drag"></file-upload>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
data() {
return {
formData: {
isDisabled: true
},
formRules: {
serialNumber: [{required: true, message: '请输入编号', trigger: ['change', 'blur']}],
travelAgencyName: [{required: true, message: '请输入旅行社名称', trigger: ['change', 'blur']}],
contact: [{required: true, message: '请输入联系人姓名', trigger: ['change', 'blur']}],
contactMobileNumber: [
{required: true, message: '请输入联系人电话', trigger: 'blur',},
{
pattern: /^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/,
message: '请输入正确的联系人电话',
trigger: 'blur'
}
],
email: [
{required: false, message: '请输入邮箱地址', trigger: 'blur'},
{type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
],
officialWebsite: [
{required: false, message: '请输入官网地址', trigger: ['change', 'blur']},
{type: 'url', message: '请输入正确的官网地址', trigger: ['blur', 'change']}],
note: [{required: false, message: '请输入备注', trigger: ['change', 'blur']}],
year: [{required: true, message: '请选择年度', trigger: ['change', 'blur']}],
},
}
},
methods: {
onOpen(row) {
if(row && row.id) {
const cloneData = clone(row)
cloneData.year = cloneData.year.toString()
this.formData = {...cloneData}
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/excellentRecuperation/travelAgency/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,189 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
@change="doSearch"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="旅行社:">
<el-input placeholder="请输入旅行社查询" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="旅行社列表">
<el-button type="primary" size="small" @click="showImportDialog = true">
<i class="el-icon-upload2"></i>
导入旅行社
</el-button>
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增旅行社
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'isDisabled'">
<el-switch
:active-value="true"
:inactive-value="false"
@change="(val)=>{travelAgencyStatusChange(row.id)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isDisabled">
</el-switch>
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'officialWebsite'">
<a :href="row.officialWebsite" class="text-primary" target="_blank">
{{ row.officialWebsite }}
</a>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
<excel-import
ref="excelImportRef"
url="/platform/excellentRecuperation/travelAgency/travelAgencyImport"
template_url="/platform/excellentRecuperation/travelAgency/downloadTemplate"
:visible.sync="showImportDialog"
title="导入旅行社数据"
width="700px"
@import-success="doSearch"
:extra_params="{}"
></excel-import>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
showImportDialog: false,
tableColumns: [
{label: '年度', prop: 'year', sortable: true},
{label: '旅行社名称', prop: 'travelAgencyName', width: '200'},
{label: '旅行社编号', prop: 'serialNumber', sortable: true},
{label: '联系人', prop: 'contact'},
{label: '联系人手机', prop: 'contactMobileNumber'},
{label: '邮箱', prop: 'email'},
{label: '是否启用', prop: 'isDisabled'}
],
}
},
methods: {
async travelAgencyStatusChange(id) {
const resp = await $.post(loc() + '/openClosedTravelAgency/' + id)
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
},
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/excellentRecuperation/travelAgency/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,33 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="旅行社编号">{{viewData.serialNumber}}</el-descriptions-item>
<el-descriptions-item label="旅行社名称">{{viewData.travelAgencyName}}</el-descriptions-item>
<el-descriptions-item label="联系人">{{viewData.contact}}</el-descriptions-item>
<el-descriptions-item label="备注">{{viewData.contactMobileNumber}}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{viewData.email}}</el-descriptions-item>
<el-descriptions-item label="官网">
<a :href="viewData.officialWebsite" target="_blank">
{{viewData.officialWebsite}}
<span class="text-primary">立即访问</span>
</a>
</el-descriptions-item>
<el-descriptions-item :span="2" label="备注">{{viewData.note}}</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone(row)
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,127 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="名称">
<el-input v-model="pageForm.searchKeyword" placeholder="请输入名称" clearable></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button type="primary" @click="onAdd" size="small" icon="el-icon-plus">新增</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="title" label="标题"></el-table-column>
<el-table-column prop="isDeployed" label="是否启用">
<template slot-scope="{row}">
<el-tag size="mini" v-if="row.enable" type="success"></el-tag>
<el-tag size="mini" v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="250px">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="onEdit(row)">编辑</el-button>
<el-button type="danger" size="mini" @click="onDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog :title="formData.id ? '编辑' : '新增'" :visible.sync="dialogVisible" width="70%">
<el-form :model="formData" ref="formRef" label-width="120px">
<el-form-item label="标题" prop="title" :rules="{ required: true, message: '请输入标题', trigger: 'blur' }">
<el-input v-model="formData.title" placeholder="请输入标题"></el-input>
</el-form-item>
<el-form-item label="封面图" prop="cover"
:rules="{ required: true, message: '请上传封面图', trigger: 'blur' }">
<file-upload
:value.sync="formData.cover"
:upload_number="1"
upload_mode="image"
upload_result_category="interval"
upload_result_type="url"
></file-upload>
</el-form-item>
<el-form-item label="内容" prop="content"
:rules="{ required: true, message: '请输入内容', trigger: 'blur' }">
<text-editor v-model="formData.content"></text-editor>
</el-form-item>
<el-form-item label="可见人员" prop="groupId">
<permission-group :value.sync="formData.groupId"></permission-group>
</el-form-item>
<el-form-item label="外部链接" prop="link">
<el-input v-model="formData.link" placeholder="请输入外部链接" maxlength="255"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="enable">
<el-switch v-model="formData.enable"></el-switch>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="onSubmit">确定</el-button>
</template>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
dialogVisible: false,
formData: {}
}
},
methods: {
onAdd() {
this.formData = {}
this.dialogVisible = true
},
onEdit(row) {
this.dialogVisible = true
this.formData = {...row}
},
onDelete(row) {
this.$confirm("您确定删除吗?", "提示", {
type: "warning",
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(() => {
this.$axios.post("/platform/huimin/manage/delete", {id: row.id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onSubmit() {
this.$axios.post("/platform/huimin/manage/" + (this.formData.id ? "update" : "insert"), {data: JSON.stringify(this.formData)}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
this.dialogVisible = false
}
})
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,124 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-dialog :visible.sync="addDialogVisible"
width="50%" title="心理咨询预约"
:close-on-click-modal="false"
append-to-body>
<div class="left-span-label">预约时间段</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="开始时间">
{{ formData.startTime }}
</el-descriptions-item>
<el-descriptions-item label="结束时间">
{{ formData.endTime }}
</el-descriptions-item>
</el-descriptions>
<div class="left-span-label">咨询师信息</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">
{{ formData.doctorUserName }}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{ formData.doctorSex }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ formData.doctorUnitName }}
</el-descriptions-item>
<el-descriptions-item label="电话">
{{ formData.doctorMobile }}
</el-descriptions-item>
</el-descriptions>
<div class="left-span-label">预约人信息</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="姓名">
<el-input :value="$store.state.user.username" readonly></el-input>
</el-form-item>
<el-form-item label="工号">
<el-input :value="$store.state.user.loginname" readonly></el-input>
</el-form-item>
<el-form-item label="单位">
<el-input :value="$store.state.user.unit.name" readonly></el-input>
</el-form-item>
<el-form-item label="联系方式" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系方式"></el-input>
</el-form-item>
<el-form-item label="预约咨询方式" prop="askTypeValue">
<el-select
v-model="formData.askTypeValue"
filterable
style="width: 100%"
placeholder="请选择咨询方式">
<el-option v-for="item in askTypeOptions"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="预约备注" prop="remark">
<el-input type="textarea" :row="3" v-model="formData.remark"
placeholder="请输入预约备注事项"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="$emit('refresh'); addDialogVisible = false">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</span>
</el-dialog>
</div>
`,
dicts: ["LEGAL_ASK_TYPE"],
store,
data() {
return {
formData: {},
formRules: {
askTypeValue: [{required: true, message: '请选择咨询方式', trigger: ['change']}],
mobile: [{required: true, message: '请输入联系方式', trigger: ['change']}],
},
addDialogVisible: false,
askTypeOptions: [],
}
},
methods: {
onOpen(row) {
if(row.askType) {
row.askType = JSON.parse(row.askType)
this.askTypeOptions = this.dict.type.LEGAL_ASK_TYPE.filter(o => row.askType.includes(o.code))
}
this.formData = clone(row)
if(this.askTypeOptions.length > 0) {
this.$set(this.formData, 'askTypeValue', this.askTypeOptions[0].code)
}
this.$set(this.formData, 'mobile', this.$store.state.user.mobile)
this.addDialogVisible = true
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/legal/apply/submit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
this.addDialogVisible = false
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
created() {
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,209 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#calendar {
max-width: 1200px;
margin: 20px auto 0;
}
.fc-toolbar {
display: block !important;
visibility: unset !important;
}
.green {
color: #FFFFFF;
background-color: #369a5f;
border: 1px solid #257e4a;
}
.yellow {
color: #FFFFFF;
background-color: #f3b20f;
border: 1px solid #af7d00;
}
.red {
color: #FFFFFF;
background-color: #ea5454;
border: 1px solid #b11616;
}
.fc-time-grid-event.fc-short .fc-time:before {
content: none;
}
.fc-time-grid-event.fc-short .fc-time span {
display: block;
}
.fc-ltr .fc-time-grid .fc-event-container {
margin: 0;
}
.el-row--flex.is-justify-space-between {
justify-content: flex-start;
}
.fc-icon {
height: 1.5em;
line-height: 1.5em;
}
.fc-event .fc-content {
padding: 3px;
}
</style>
<div id="app" v-cloak>
<el-card shadow="never">
<div id="legal-calendar"></div>
</el-card>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
let calendar = null
const vue = new Vue({
el: "#app",
store,
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
},
data() {
return {
calendarHeight: 0,
events: [],
}
},
methods: {
refresh() {
calendar.fullCalendar('unselect')
this.queryAppointmentInfo()
},
initCalendar() {
const that = this
const today = this.$moment().format('YYYY-MM-DD')
if (calendar) return
calendar = $('#legal-calendar').fullCalendar({
header: { //设置日历头部信息,false,则不显示头部信息。包括left,center,right左中右三个位置
left: 'prev, next, today', //上一个、下一个、今天
center: 'title', //标题
right: 'month,agendaWeek,agendaDay,listMonth' //月、周、日、日程列表
},
locale: 'zh-cn', //?没用?
timeFormat: 'HH:mm', //日程事件的时间格式
buttonText: { //各按钮的显示文本信息
today: '今天',
month: '月',
agendaWeek: '周',
agendaDay: '日',
listMonth: '日程',
},
slotMinTime: '11:00:00',
monthNames: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], //月份全称
monthNamesShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], //月份简写
dayNames: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], //周全称
dayNamesShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], //周简写
noEventsMessage: "当月无数据", //listview视图下,无数据提示
allDayText: "全天", //自定义全天视图的名称
allDaySlot: false, //是否在周日历上方显示全天
allDayDefault: false, //是否为全天日程事件,显示这一天中所做的事情
slotDuration: "00:30:00", //一格时间槽代表多长时间,默认00:30:00(30分钟)
slotLabelFormat: "H(:mm)a", //日期视图左边那一列显示的每一格日期时间格式
slotLabelInterval: "00:30:00", //日期视图左边那一列多长间隔显示一条日期文字(默认跟着slotDuration走的,可自定义)
snapDuration: "00:30:00", //其实就是动态创建一个日程时,默认创建多长的时间块
firstDay: 1, //一周中显示的第一天是哪天,周日是0,周一是1,类推
hiddenDays: [], //隐藏一周中的某一天或某几天,数组形式,如隐藏周二和周五:[2,5],默认不隐藏,除非weekends设置为false。
weekends: true, //是否显示周六和周日,设为false则不显示周六和周日。默认值为true
weekMode: 'fixed', //月视图里显示周的模式,因每月周数不同月视图高度不定。fixed:固定显示6周高,日历高度保持不变liquid:不固定周数,高度随周数变化variable:不固定周数,但高度固定
weekNumbers: false, //是否在日历中显示周次(一年中的第几周),如果设置为true,则会在月视图的左侧、周视图和日视图的左上角显示周数。
weekNumberCalculation: 'iso', //周次的显示格式。
height: that.calendarHeight, //设置日历的高度,包括header日历头部,默认未设置,高度根据aspectRatio值自适应。
// contentHeight: 600, //设置日历主体内容的高度,不包括header部分,默认未设置,高度根据aspectRatio值自适应。
handleWindowResize: true, //是否随浏览器窗口大小变化而自动变化。
defaultView: 'agendaWeek', //初始化时默认视图,默认是月monthagendaWeek是周,agendaDay是当天
slotEventOverlap: false, //事件是否可以重叠覆盖
defaultDate: today, //默认显示那一天的日期视图getDates(true)2020-05-10
nowIndicator: false, //周/日视图中显示今天当前时间点(以红线标记),默认false不显示
eventLimit: 2, //数据条数太多时,限制显示条数(多余的以“+2more”格式显示),默认false不限制,支持输入数字设定固定的显示条数
eventLimitText: "更多", //当一块区域内容太多以"+2 more"格式显示时,这个more的名称自定义(应该与eventLimit: true一并用)
dayPopoverFormat: "YYYY年M月d日预约信息", //点开"+2 more"弹出的小窗口标题,与eventLimitClick可以结合用
render: (view) => { //method,绑定日历到id上。$('#id').fullCalendar('render');
},
viewRender: (view) => {
that.queryAppointmentInfo()
},
eventRender: (info) => {
},
//日历数据源
events: that.events,
//日程事件点击
eventClick: (event, jsEvent) => {
if (event.data.appointmentUser) return
if (new Date().getTime() > event.data.startTimeTs) return
this.$refs.basicFormRef.onOpen(clone(event.data))
},
selectable: false, //是否允许通过单击或拖动选择日历中的对象,包括天和时间
selectMirror: true, //镜像
lazyFetching: false, //是否启用懒加载技术--即只取当前条件下的视图数据,其它数据在切换时触发,默认true只取当前视图的,false是取全视图的
defaultTimedEventDuration: "00:30:00", //在Event Object中如果没有end参数时使用,如start=7:00pm,则该日程对象时间范围就是7:00~9:00
defaultAllDayEventDuration: {days: 1}, //默认1天是多长,(有的是采用工作时间模式,所以支持自定义)
});
},
//获取预约数据
async queryAppointmentInfo() {
if (!calendar) return
const view = calendar.fullCalendar('getView')
//这里取时间戳
const startTimeTs = view.start._i
const endTimeTs = view.end._i
const resp = await this.$axios.post('/platform/legal/appointmentSet/queryAppointmentInfo', {startTimeTs, endTimeTs})
let events = []
if (resp.code === 0) {
resp.data.forEach(v => {
let className = ''
let title = ''
if (new Date().getTime() > v.startTimeTs) {
className = 'gray'
title = '不可预约'
} else {
if (!v.appointmentUser) {
className = 'green'
title = '可预约'
} else if (v.appointmentUser === this.$store.state.user.id) {
className = 'blue'
title = '我已预约'
} else {
className = 'gray'
title = '不可预约'
}
}
events.push({
id: v.id,
title: title,
start: v.startTime,
end: v.endTime,
className: className,
data: v,
})
})
}
calendar.fullCalendar('removeEvents', () => true)
calendar.fullCalendar('addEventSource', events, true)
},
init() {
this.$nextTick(() => {
setTimeout(() => {
this.initCalendar()
this.queryAppointmentInfo()
}, 100)
})
},
},
mounted() {
this.calendarHeight = window.innerHeight - 160
},
async created() {
this.init()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,128 @@
const addForm = {
template: /*language=HTML*/ `
<div>
<el-dialog :visible.sync="addDialogVisible"
width="30%" title="新增预约时间段"
:close-on-click-modal="false"
append-to-body>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="80px" label-position="left">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
readonly
style="width: 100%"
v-model="formData.startTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="请选择日期时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
readonly
style="width: 100%"
v-model="formData.endTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="请选择日期时间">
</el-date-picker>
</el-form-item>
<el-form-item label="咨询师" prop="doctorUser">
<el-select
v-model="formData.doctorUser"
filterable
remote
style="width: 100%"
reserve-keyword
placeholder="请输入关键词"
:remote-method="queryDoctorUser">
<el-option
v-for="item in doctorUserList"
:key="item.id"
:label="item.mobile ? item.doctorUserName + '' + item.mobile + '' : item.doctorUserName + '(暂无手机号)'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="咨询方式" prop="askType">
<el-select
v-model="formData.askType"
filterable multiple
style="width: 100%"
placeholder="请选择咨询方式">
<el-option v-for="item in dict.type.LEGAL_ASK_TYPE"
:key="item.code"
:label="item.label"
:value="item.code"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="$emit('refresh'); addDialogVisible = false">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</span>
</el-dialog>
</div>
`,
store,
dicts:["LEGAL_ASK_TYPE"],
data() {
return {
addDialogVisible: false,
formData: {},
formRules: {
startTime: [{required: true, message: '请选择开始时间', trigger: ['change', 'blur']}],
endTime: [{required: true, message: '请选择结束时间', trigger: ['change', 'blur']}],
doctorUser: [{required: true, message: '请选择咨询师', trigger: ['change', 'blur']}],
askType: [{type: 'array', required: true, message: '请选择咨询方式', trigger: 'change'}],
},
doctorUserList: [],
}
},
methods: {
onOpen(row) {
this.formData = row
this.addDialogVisible = true
},
async queryDoctorUser(keyWord) {
const resp = await this.$axios.post(loc() + '/queryDoctorUser', {
keyWord,
startTimeTs: this.formData.startTimeTs,
endTimeTs: this.formData.endTimeTs,
})
this.doctorUserList = resp.data
},
onSubmit() {
if (Date.parse(this.formData.startTime) < new Date().getTime()) {
this.$message.warning('预约时间不能小于当前时间,请重新设置')
this.$emit('refresh')
this.addDialogVisible = false
return
}
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
this.formData.askType = JSON.stringify(this.formData.askType)
const resp = await this.$axios.post("/platform/legal/appointmentSet/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
this.addDialogVisible = false
} else {
this.$message.warning(resp.msg)
}
}).catch(() => {})
}
})
},
},
created() {
this.queryDoctorUser(null)
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,221 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#calendar {
max-width: 1200px;
margin: 20px auto 0;
}
.fc-toolbar {
display: block !important;
visibility: unset !important;
}
.green {
color: #FFFFFF;
background-color: #369a5f;
border: 1px solid #257e4a;
}
.yellow {
color: #FFFFFF;
background-color: #f3b20f;
border: 1px solid #af7d00;
}
.red {
color: #FFFFFF;
background-color: #ea5454;
border: 1px solid #b11616;
}
.fc-time-grid-event.fc-short .fc-time:before {
content: none;
}
.fc-time-grid-event.fc-short .fc-time span {
display: block;
}
.fc-ltr .fc-time-grid .fc-event-container {
margin: 0;
}
.el-row--flex.is-justify-space-between {
justify-content: flex-start;
}
.fc-icon {
height: 1.5em;
line-height: 1.5em;
}
.fc-event .fc-content {
padding: 3px;
}
</style>
<div id="app" v-cloak>
<el-card shadow="never">
<div id="legal-calendar"></div>
</el-card>
<add-form ref="addFormRef" @refresh="refresh"></add-form>
<info ref="infoRef" @refresh="refresh"></info>
</div>
<script nonce="${cspNonce!}">
<!--#include('addForm.js'){}#-->
<!--#include('info.js'){}#-->
let calendar = null
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"add-form": addForm,
"info": info,
},
data() {
return {
calendarHeight: 0,
events: [],
}
},
methods: {
refresh() {
calendar.fullCalendar('unselect')
this.queryAppointmentInfo()
},
initCalendar() {
const that = this
const today = this.$moment().format('YYYY-MM-DD')
if (calendar) return
calendar = $('#legal-calendar').fullCalendar({
header: { //设置日历头部信息,false,则不显示头部信息。包括left,center,right左中右三个位置
left: 'prev, next, today', //上一个、下一个、今天
center: 'title', //标题
right: 'month,agendaWeek,agendaDay,listMonth' //月、周、日、日程列表
},
locale: 'zh-cn', //?没用?
timeFormat: 'HH:mm', //日程事件的时间格式
buttonText: { //各按钮的显示文本信息
today: '今天',
month: '月',
agendaWeek: '周',
agendaDay: '日',
listMonth: '日程',
},
slotMinTime: '11:00:00',
monthNames: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], //月份全称
monthNamesShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], //月份简写
dayNames: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], //周全称
dayNamesShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], //周简写
noEventsMessage: "当月无数据", //listview视图下,无数据提示
allDayText: "全天", //自定义全天视图的名称
allDaySlot: false, //是否在周日历上方显示全天
allDayDefault: false, //是否为全天日程事件,显示这一天中所做的事情
slotDuration: "00:30:00", //一格时间槽代表多长时间,默认00:30:00(30分钟)
slotLabelFormat: "H(:mm)a", //日期视图左边那一列显示的每一格日期时间格式
slotLabelInterval: "00:30:00", //日期视图左边那一列多长间隔显示一条日期文字(默认跟着slotDuration走的,可自定义)
snapDuration: "00:30:00", //其实就是动态创建一个日程时,默认创建多长的时间块
firstDay: 1, //一周中显示的第一天是哪天,周日是0,周一是1,类推
hiddenDays: [], //隐藏一周中的某一天或某几天,数组形式,如隐藏周二和周五:[2,5],默认不隐藏,除非weekends设置为false。
weekends: true, //是否显示周六和周日,设为false则不显示周六和周日。默认值为true
weekMode: 'fixed', //月视图里显示周的模式,因每月周数不同月视图高度不定。fixed:固定显示6周高,日历高度保持不变liquid:不固定周数,高度随周数变化variable:不固定周数,但高度固定
weekNumbers: false, //是否在日历中显示周次(一年中的第几周),如果设置为true,则会在月视图的左侧、周视图和日视图的左上角显示周数。
weekNumberCalculation: 'iso', //周次的显示格式。
height: that.calendarHeight, //设置日历的高度,包括header日历头部,默认未设置,高度根据aspectRatio值自适应。
// contentHeight: 600, //设置日历主体内容的高度,不包括header部分,默认未设置,高度根据aspectRatio值自适应。
handleWindowResize: true, //是否随浏览器窗口大小变化而自动变化。
defaultView: 'agendaWeek', //初始化时默认视图,默认是月monthagendaWeek是周,agendaDay是当天
slotEventOverlap: false, //事件是否可以重叠覆盖
defaultDate: today, //默认显示那一天的日期视图getDates(true)2020-05-10
nowIndicator: false, //周/日视图中显示今天当前时间点(以红线标记),默认false不显示
eventLimit: 2, //数据条数太多时,限制显示条数(多余的以“+2more”格式显示),默认false不限制,支持输入数字设定固定的显示条数
eventLimitText: "更多", //当一块区域内容太多以"+2 more"格式显示时,这个more的名称自定义(应该与eventLimit: true一并用)
dayPopoverFormat: "YYYY年M月d日预约信息", //点开"+2 more"弹出的小窗口标题,与eventLimitClick可以结合用
render: (view) => { //method,绑定日历到id上。$('#id').fullCalendar('render');
},
viewRender: (view) => {
that.queryAppointmentInfo()
},
eventRender: (info) => {
},
//日历数据源
events: that.events,
//日程事件点击
eventClick: (event, jsEvent) => {
this.$refs.infoRef.onOpen(clone(event.data))
},
selectable: true, //是否允许通过单击或拖动选择日历中的对象,包括天和时间
unselectAuto: false, //当点击页面日历以外的位置时,是否自动取消当前的选中状态。
selectHelper: true, //当点击或拖动选择时间时,是否预先画出“日程区块”的样式显示默认加载的提示信息,该属性只在周/天视图里可用
selectMirror: true, //镜像
selectOverlap: false, //是否允许选择被事件占用的时间段,默认true可占用时间段
select: (start, end, allDay) => { //点击空白区域/选择区域内容触发
if (calendar.fullCalendar('getView').name === 'month') {
return
}
const startTime = $.fullCalendar.formatDate(start, "YYYY-MM-DD HH:mm:ss")
const endTime = $.fullCalendar.formatDate(end, "YYYY-MM-DD HH:mm:ss")
if (new Date().getTime() > Date.parse(endTime)) {
that.$message.warning('该时段不可设置')
calendar.fullCalendar('unselect');
return
}
const row = {
startTime: startTime,
endTime: endTime,
doctorUser: '',
askType: [],
}
this.$refs.addFormRef.onOpen(row)
},
lazyFetching: false, //是否启用懒加载技术--即只取当前条件下的视图数据,其它数据在切换时触发,默认true只取当前视图的,false是取全视图的
defaultTimedEventDuration: "00:30:00", //在Event Object中如果没有end参数时使用,如start=7:00pm,则该日程对象时间范围就是7:00~9:00
defaultAllDayEventDuration: {days: 1}, //默认1天是多长,(有的是采用工作时间模式,所以支持自定义)
});
},
//获取预约数据
async queryAppointmentInfo() {
if (!calendar) return
const view = calendar.fullCalendar('getView')
//这里取时间戳
const startTimeTs = this.$moment(this.$moment(view.start._i).format('YYYY-MM-DD') + ' 00:00:00').unix()
const endTimeTs = view.end._i
const resp = await this.$axios.post(loc() + '/queryAppointmentInfo', {startTimeTs, endTimeTs})
let events = []
if (resp.code === 0) {
resp.data.forEach(v => {
let className = ''
if (!v.appointmentUser) {
className = ''
} else if (v.appointmentUser && !v.doctorUser) {
className = 'red'
} else if (v.appointmentUser && v.doctorUser) {
className = 'green'
}
events.push({
id: v.id,
title: v.doctorUserName,
start: v.startTime,
end: v.endTime,
className: className,
data: v
})
this.events = events
})
}
calendar.fullCalendar('removeEvents', () => true)
calendar.fullCalendar('addEventSource', events, true)
},
init() {
this.$nextTick(() => {
this.initCalendar()
this.queryAppointmentInfo()
})
},
},
mounted() {
this.calendarHeight = window.innerHeight - 160
},
async created() {
this.init()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,165 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-dialog :visible.sync="infoDialogVisible"
width="50%" title="预约信息"
:close-on-click-modal="false"
append-to-body>
<div class="left-span-label">预约时间段</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="开始时间">
{{ formData.startTime }}
</el-descriptions-item>
<el-descriptions-item label="结束时间">
{{ formData.endTime }}
</el-descriptions-item>
</el-descriptions>
<div class="left-span-label">预约人信息</div>
<el-descriptions v-if="formData.appointmentUser" :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">
{{ formData.appointmentUserName }}
</el-descriptions-item>
<el-descriptions-item label="工号">
{{ formData.appointmentLoginName }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ formData.appointmentUnitName }}
</el-descriptions-item>
<el-descriptions-item label="联系方式">
{{ formData.appointmentMobile }}
</el-descriptions-item>
<el-descriptions-item label="预约咨询方式" :span="2">
<dict-tag :options="dict.type.LEGAL_ASK_TYPE"
:value="formData.askTypeValue"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="预约人备注" :span="2">
{{ formData.remark }}
</el-descriptions-item>
</el-descriptions>
<el-empty v-else description="暂无人预约"></el-empty>
<div class="left-span-label">咨询师信息</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="80px" label-position="left">
<el-form-item label="咨询师" prop="doctorUser">
<el-select
v-model="formData.doctorUser"
filterable
remote
style="width: 100%"
reserve-keyword
placeholder="请输入关键词"
:remote-method="queryDoctorUser">
<el-option
v-for="item in doctorUserList"
:key="item.id"
:label="item.mobile ? item.doctorUserName + '' + item.mobile + '' : item.doctorUserName + '(暂无手机号)'"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="咨询方式" prop="askType">
<el-select
v-model="formData.askType"
filterable multiple
style="width: 100%"
placeholder="请选择咨询方式">
<el-option v-for="item in dict.type.LEGAL_ASK_TYPE"
:key="item.code"
:label="item.label"
:value="item.code"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="$emit('refresh'); infoDialogVisible = false">取消</el-button>
<el-button @click="onDelete" type="danger">删除</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</span>
</el-dialog>
</div>
`,
dicts:["LEGAL_ASK_TYPE"],
data() {
return {
formData: {},
formRules: {
startTime: [{required: true, message: '请选择开始时间', trigger: ['change', 'blur']}],
endTime: [{required: true, message: '请选择结束时间', trigger: ['change', 'blur']}],
doctorUser: [{required: true, message: '请选择咨询师', trigger: ['change', 'blur']}],
askType: [{type: 'array', required: true, message: '请选择咨询方式', trigger: 'change'}],
},
infoDialogVisible: false,
doctorUserList: [],
}
},
methods: {
onOpen(row) {
if (row.doctorUser) {
this.doctorUserList = [{
id: row.doctorUser,
doctorUserName: row.doctorUserName,
mobile: row.doctorMobile,
}]
}
row.askType = row ? JSON.parse(row.askType) : []
this.formData = row
this.infoDialogVisible = true
},
onDelete() {
let msg = '您确定要删除吗?'
if (this.formData.appointmentUser) {
msg = "<span style='color: red'>该时间段已有预约人</span>,您确定要删除吗?"
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/legal/appointmentSet/onDelete', {id: this.formData.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
this.infoDialogVisible = false
}
}).catch(() => {})
},
onSubmit() {
let msg = ''
if (this.formData.appointmentUser) {
msg += "<span style='color: red'>该时间段已有预约人</span>"
}
msg += '这将清空预约人已选择的咨询方式,您确定要修改咨询方式吗?';
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm(msg, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
dangerouslyUseHTMLString: true,
type: "warning"
}).then(async () => {
this.formData.askType = JSON.stringify(this.formData.askType)
const resp = await this.$axios.post("/platform/legal/appointmentSet/onEdit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
this.infoDialogVisible = false
} else {
this.$message.warning(resp.msg)
}
}).catch(() => {})
}
})
},
async queryDoctorUser(keyWord) {
const resp = await this.$axios.post('/platform/legal/appointmentSet/queryDoctorUser', {
keyWord,
startTimeTs: this.formData.startTimeTs,
endTimeTs: this.formData.endTimeTs,
})
this.doctorUserList = resp.data
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,125 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="姓名" prop="userId">
<el-select
style="width: 100%"
v-model="formData.userId"
filterable
remote
:disabled="formData.id !== '' && formData.id !== null && formData.id !== undefined"
reserve-keyword
placeholder="请输入关键词"
:remote-method="selectQueryUser"
@change="selectUserChange"
>
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.userName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="性别" prop="sex">
<el-select v-model="formData.sex" placeholder="请选择性别" style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</el-form-item>
<el-form-item label="职称" prop="technicalTitle">
<el-input v-model="formData.technicalTitle" placeholder="请输入职称"></el-input>
</el-form-item>
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" placeholder="请输入单位"></el-input>
</el-form-item>
<el-form-item label="联系方式" prop="mobile">
<el-input v-model.trim="formData.mobile" placeholder="请输入联系方式"></el-input>
</el-form-item>
<el-form-item label="特长" prop="specialty">
<el-input type="textarea" :rows="3" v-model="formData.specialty" placeholder="请输入特长"></el-input>
</el-form-item>
<el-form-item label="简介" prop="introduce">
<el-input type="textarea" :rows="3" v-model="formData.introduce" placeholder="请输入简介"></el-input>
</el-form-item>
<el-form-item label="头像" prop="avatar">
<file-upload :value.sync="formData.avatar" accept=".jpg,.jpeg,.png"
:upload_number="1" upload_result_category="interval"
complete_result upload_mode="drag"></file-upload>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
store,
data() {
return {
formData: {},
formRules: {
userId: [{required: true, message: '请输入姓名', trigger: ['change', 'blur']}],
sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}],
jobTitle: [{required: true, message: '请输入职称', trigger: ['change', 'blur']}],
specialty: [{required: true, message: '请输入特长', trigger: ['change', 'blur']}],
introduce: [{required: true, message: '请输入简介', trigger: ['change', 'blur']}],
avatar: [{required: true, message: '请上传头像', trigger: ['change', 'blur']}],
},
userOptions: [],
}
},
methods: {
selectQueryUser(keyword) {
this.$axios.post("/platform/legal/doctorManage/listUser", { keyword: keyword }).then((res) => {
if (res.code === 0) {
this.userOptions = res.data
}
})
},
selectUserChange(val) {
if (val) {
const user = this.userOptions.find(v => v.id === val)
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'technicalTitle', user.technicalTitle)
}
},
onOpen(row) {
if(row && row.id) {
this.userOptions = [
{
id: row.userId,
userName: row.userName,
loginName: row.loginName
}
]
this.formData = clone(row)
}
},
onSubmit() {
this.$refs.formRef.validate(async (valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/legal/doctorManage/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,162 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" v-model="pageForm.searchKeyword" clearable @keyup.enter.native="doSearch"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="咨询师列表">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增咨询师
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" row-key="id">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'avatar'">
<el-popover
placement="top-start"
width="100"
trigger="hover">
<el-image
:src="row.avatar"
fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<el-image
slot="reference"
style="height: 30px;"
:src="row.avatar"
fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</el-popover>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'unitName', label: '单位'},
{prop: 'technicalTitle', label: '职称'},
{prop: 'mobile', label: '联系电话'},
{prop: 'avatar', label: '头像'}
],
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/legal/doctorManage/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,51 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">
{{viewData.userName}}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{viewData.sex}}
</el-descriptions-item>
<el-descriptions-item label="职称">
{{viewData.technicalTitle}}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{viewData.unitName}}
</el-descriptions-item>
<el-descriptions-item label="联系方式" :span="2">
{{viewData.mobile}}
</el-descriptions-item>
<el-descriptions-item label="特长" :span="2">
{{viewData.specialty}}
</el-descriptions-item>
<el-descriptions-item label="简介" :span="2">
{{viewData.introduce}}
</el-descriptions-item>
<el-descriptions-item label="头像" :span="2">
<img :src="viewData.avatar"
style="height: 100px;width: auto" v-if="viewData.avatar">
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone(row)
},
},
style: /*language=CSS*/ `
.el-descriptions-item__label {
width: 200px;
min-width: 200px;
max-width: 200px;
}
`
}
@@ -0,0 +1,122 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
@change="doSearch"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="预约记录"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'appointmentTime'">
{{ row.startTime + ' 至 ' + row.endTime }}
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="$moment().unix() < $moment(row.startTime).unix()"
@click="onDelete(row)" size="mini" type="danger">取消</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'appointmentTime', label: '预约时间', width: '350'},
{prop: 'appointmentUserName', label: '姓名'},
{prop: 'appointmentLoginName', label: '工号'},
{prop: 'appointmentUnitName', label: '单位'},
{prop: 'doctorUserName', label: '咨询师'},
],
}
},
methods: {
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/legal/list/delete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,70 @@
const info = {
template: /*language=HTML*/ `
<div>
<div class="left-span-label">预约时间段</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="开始时间">
{{ viewData.startTime }}
</el-descriptions-item>
<el-descriptions-item label="结束时间">
{{ viewData.endTime }}
</el-descriptions-item>
</el-descriptions>
<div class="left-span-label">预约人信息</div>
<el-descriptions v-if="viewData.userId" :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">
{{ viewData.appointmentUserName }}
</el-descriptions-item>
<el-descriptions-item label="工号">
{{ viewData.appointmentLoginName }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ viewData.appointmentUnitName }}
</el-descriptions-item>
<el-descriptions-item label="联系方式">
{{ viewData.appointmentMobile }}
</el-descriptions-item>
<el-descriptions-item label="预约咨询方式" :span="2">
<dict-tag :options="dict.type.LEGAL_ASK_TYPE"
:value="viewData.askTypeValue"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="预约人备注" :span="2">
{{ viewData.remark }}
</el-descriptions-item>
</el-descriptions>
<el-empty v-else description="暂无人预约"></el-empty>
<div class="left-span-label">咨询师信息</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">
{{ viewData.doctorUserName }}
</el-descriptions-item>
<el-descriptions-item label="工号">
{{ viewData.doctorUnitName }}
</el-descriptions-item>
<el-descriptions-item label="联系方式">
{{ viewData.doctorMobile }}
</el-descriptions-item>
<el-descriptions-item label="职称">
{{ viewData.doctorJobTitle }}
</el-descriptions-item>
<el-descriptions-item label="个人简介" :span="2">
{{ viewData.doctorIntroduce }}
</el-descriptions-item>
</el-descriptions>
</div>
`,
dicts:["LEGAL_ASK_TYPE"],
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone(row)
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,70 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item label="咨询人姓名">
<el-input :value="$store.state.user.username" readonly></el-input>
</el-form-item>
<el-form-item label="咨询人工号">
<el-input :value="$store.state.user.loginname" readonly></el-input>
</el-form-item>
<el-form-item label="咨询主题" prop="postTitle">
<el-input v-model="formData.postTitle" maxlength="20" placeholder="请简约填写咨询主题,不超过20个字"></el-input>
</el-form-item>
<el-form-item label="主要内容" prop="postContent">
<el-input type="textarea" rows="5" v-model="formData.postContent" maxlength="500"
placeholder="请输入内容"></el-input>
</el-form-item>
<el-form-item>
<div class="text-primary">
<i class="el-icon-warning"></i>
提示:不会发布您的个人隐私信息,您咨询的内容只有咨询师可查看并回复。
</div>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
store,
data() {
return {
formData: {},
formRules: {
postTitle: [{required: true, message: '请输入咨询主题', trigger: ['change', 'blur']}],
postContent: [{required: true, message: '请输入咨询内容', trigger: ['change', 'blur']}],
},
}
},
methods: {
onOpen(row) {
if(row && row.id) {
this.formData = clone(row)
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/legal/onlinePost/submit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,160 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
@change="doSearch"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="是否回复">
<el-select v-model="pageForm.isReply" style="width: 100%" @change="doSearch">
<el-option :value="null" label="全部"></el-option>
<el-option :value="true" label="已回复"></el-option>
<el-option :value="false" label="未回复"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="咨询记录">
<el-button type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
我要咨询
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" row-key="id">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'isReply'">
<el-tag type="success" v-if="row.isReply">已回复</el-tag>
<el-tag type="info" v-else>未回复</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="!row.isReply" @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'postTitle', label: '标题'},
{prop: 'postingTime', label: '咨询时间'},
{prop: 'isReply', label: '回复情况'}
],
pageForm: {
year: new Date().getFullYear() + '',
isReply: null,
},
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
const url = '/platform/legal/onlinePost/fetchOne'
this.$refs.infoRef.onOpen(row, url)
})
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/legal/onlinePost/delete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,73 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="咨询人">
{{ viewData.userName }}
</el-descriptions-item>
<el-descriptions-item label="咨询时间">
{{ viewData.postingTime }}
</el-descriptions-item>
<el-descriptions-item label="咨询主题" :span="2">
{{ viewData.postTitle }}
</el-descriptions-item>
<el-descriptions-item label="主要内容" :span="2">
{{ viewData.postContent }}
</el-descriptions-item>
<el-descriptions-item label="回复信息" :span="2">
<el-timeline v-if="viewData.replyList && viewData.replyList.length > 0">
<el-timeline-item
v-for="(item, index) in viewData.replyList"
:key="index"
size="large"
type="primary"
:timestamp="item.replyTime">
<div class="user-face">
<svg t="1639966214107" class="icon" viewBox="0 0 3208 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="6251" width="80" height="30">
<path d="M343.496334 367.185736m-225.049322 0a225.049322 225.049322 0 1 0 450.098644 0 225.049322 225.049322 0 1 0-450.098644 0Z"
fill="#FFFFFF" p-id="6252"></path>
<path d="M1879.043392 0H355.341035c-3.079622 0-20.846674 23.689402-23.689402 23.689402 14.687429 3.079622 23.689402-11.370913 33.638951 0C400.350899 58.512824 450.098644 99.49549 497.477449 94.757609h23.689402c37.903044 0 58.512824 5.685457 57.565248 41.693348a155.639373 155.639373 0 0 0 71.068207 118.447012 76.51677 76.51677 0 0 1 10.186443 6.869927 64.19828 64.19828 0 0 1 9.001973 93.573139 152.796645 152.796645 0 0 0-23.689403 134.318911 58.27593 58.27593 0 0 1 3.553411 12.555383A66.567221 66.567221 0 0 1 592.235058 578.495205a161.087936 161.087936 0 0 0-108.260569 87.650788 77.227452 77.227452 0 0 1-6.159244 12.555384c-14.924323 23.689402-19.42531 11.370913-47.378805 6.869926L426.409242 686.992667h9.001973l11.370913 23.689403h1432.261264C2071.164445 710.68207 2226.803818 562.149517 2226.803818 379.030437v-47.378804c0-183.11908-155.639373-331.651633-347.760426-331.651633z"
fill="#EDF5FE" p-id="6253"></path>
<path d="M688.650926 261.767896a74.147829 74.147829 0 0 0-9.949549-6.869927 156.586949 156.586949 0 0 1-67.514797-118.447012 65.619644 65.619644 0 0 0-63.961386-66.804114 61.355552 61.355552 0 0 0-13.266066 1.18447 154.218009 154.218009 0 0 1-126.975196-47.378805 65.145856 65.145856 0 0 0-36.718574-21.557356 21.320462 21.320462 0 0 0-12.318489 12.081595 324.544812 324.544812 0 0 0-58.039036 23.689403 334.020573 334.020573 0 0 1 58.27593-23.689403 21.79425 21.79425 0 0 1 12.555383-12.081595 64.19828 64.19828 0 0 0-54.722519 12.318489 78.88571 78.88571 0 0 0-10.423337 9.475761 154.691797 154.691797 0 0 1-126.975196 47.378805 65.619644 65.619644 0 0 0-76.51677 52.116685 61.355552 61.355552 0 0 0 0 13.266065 157.060737 157.060737 0 0 1-67.514797 118.447012 66.567221 66.567221 0 0 0-23.689402 90.967305 55.433201 55.433201 0 0 0 4.974775 9.475761 158.95589 158.95589 0 0 1 23.689402 134.555805 65.856538 65.856538 0 0 0 37.903044 85.281848 56.617672 56.617672 0 0 0 12.792277 3.553411 156.586949 156.586949 0 0 1 103.522688 87.650788 65.145856 65.145856 0 0 0 82.43912 40.982666 86.466318 86.466318 0 0 0 12.555383-5.92235 154.218009 154.218009 0 0 1 135.266488 0 66.567221 66.567221 0 0 0 22.268038 8.054397 64.672068 64.672068 0 0 0 66.330326-30.559329 59.934188 59.934188 0 0 0 5.685457-12.555384 156.586949 156.586949 0 0 1 103.522688-87.650788 66.330327 66.330327 0 0 0 54.248731-76.279876 58.27593 58.27593 0 0 0-3.55341-12.555383 158.482102 158.482102 0 0 1 23.689402-134.318911 66.330327 66.330327 0 0 0-7.580608-93.810033zM355.341035 564.281563v17.530158a129.107243 129.107243 0 0 0 99.258596 125.316938A129.107243 129.107243 0 0 1 355.341035 581.811721v-17.530158L194.016205 240.684328h81.017756L355.341035 416.933481V25.110766 416.933481l81.017756-176.486047h81.017756zM921.51775 298.249575a584.891343 584.891343 0 0 1-98.074125 96.415868l-20.60978-22.504932a501.978435 501.978435 0 0 0 94.757609-92.151776z m-86.703212-120.10527a415.275223 415.275223 0 0 1 71.068207 54.959414l-21.79425 21.320462a450.098644 450.098644 0 0 0-70.594419-55.433201z m295.643741 227.181369v154.691797h-29.848647v-20.846674h-218.890078v20.846674H852.818484v-154.691797z m-248.738725 104.944052h218.890078v-76.042981h-218.890078z m101.153748-275.507749a260.583426 260.583426 0 0 1-47.378804 62.303128l-19.188416-23.689402a225.996898 225.996898 0 0 0 60.171082-108.260569l30.559329 3.790305c-3.079622 11.607807-6.869927 23.689402-11.370913 36.718573H1160.780714v24.400085a351.55073 351.55073 0 0 1-41.930242 71.068207l-22.504932-18.003946a268.874716 268.874716 0 0 0 30.559329-47.378805h-68.462373c0 16.819476-2.36894 29.374859-3.553411 37.429256 18.003946 47.378805 61.118658 78.648816 129.581031 94.757609l-12.792277 29.137965c-65.619644-18.003946-108.023675-47.378805-127.448985-91.441093-20.372886 40.745772-62.540022 71.068207-126.264514 89.309047l-13.029171-27.716601c68.699267-18.003946 108.734357-48.800169 118.447011-92.151775a298.486469 298.486469 0 0 0 4.027199-38.85062zM1221.18869 299.197151h92.151775v189.515219c11.370913-9.949549 26.058343-23.689402 43.825394-41.693348l8.528185 32.454481A544.856253 544.856253 0 0 1 1286.334546 544.856253l-11.844701-27.242812a25.821449 25.821449 0 0 0 9.475761-18.951522v-170.089909h-62.776916z m51.169109-126.264514a502.926011 502.926011 0 0 1 71.068207 65.619644l-20.846674 21.320462a458.153041 458.153041 0 0 0-72.489571-66.093432z m170.089908 0a395.139231 395.139231 0 0 1-13.502959 42.640924h167.957863q0 231.445461-5.922351 288.53692a54.485625 54.485625 0 0 1-60.64487 53.301156l-40.508878-1.18447-7.343715-27.716601c23.689402 0 37.429256 1.658258 44.062289 1.658258 19.662204 0 31.033117-12.555383 34.586527-37.903044s4.500986-108.260569 5.448563-247.791148h-150.901493a310.33117 310.33117 0 0 1-56.617672 76.279875l-19.42531-23.689402a260.583426 260.583426 0 0 0 72.252677-129.581031z m-58.749717 121.526634h130.528607v195.200675h-130.528607z m29.848647 83.860484h71.068207v-58.749718h-71.068207z m71.068207 84.80806V402.71984h-71.068207v59.223505zM1741.881753 170.800591h29.848647v203.018178q-1.895152 126.975196-86.940107 185.961808l-23.689402-20.135992c52.827367-34.586527 79.359498-90.019729 80.307074-165.825816z m-75.095405 55.906989h29.848646V450.098644h-29.848646z m131.002394-40.508878H2037.2886v29.848647h-104.707158v52.353579h87.650788v208.940529c0 23.689402-10.660231 35.534103-32.217587 35.534103h-29.137965l-8.054397-29.848647 27.242813 1.658259c8.528185 0 12.792277-4.500986 12.792277-13.739854v-173.880213h-58.275929v260.583426h-30.085541v-260.583426h-58.27593v218.653184h-29.374859V268.400928h87.650789V216.047349h-104.707159z"
fill="#4492F4" p-id="6254"></path>
</svg>
<span>{{ item.userName }}</span>
</div>
<div>回复内容:{{ item.replyContent }}</div>
</el-timeline-item>
</el-timeline>
<span v-else>暂无人回复</span>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row, url) {
this.$axios.post(url, { id: row.id })
.then((resp) => {
this.viewData = resp.data
})
},
},
style: /*language=CSS*/ `
/deep/ .el-timeline-item {
padding-bottom: 20px;
}
/deep/ .el-timeline-item__wrapper {
padding-left: 28px;
top: -3px;
}
/deep/ .el-timeline-item__tail {
left: 4px;
}
/deep/ .user-face{
display: flex;
}
`
}
@@ -0,0 +1,69 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<div class="left-span-label">基本情况</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="咨询人">
{{ viewData.posterUserName }}
</el-descriptions-item>
<el-descriptions-item label="咨询时间">
{{ viewData.postingTime }}
</el-descriptions-item>
<el-descriptions-item label="咨询主题" :span="2">
{{ viewData.postTitle }}
</el-descriptions-item>
<el-descriptions-item label="主要内容" :span="2">
{{ viewData.postContent }}
</el-descriptions-item>
</el-descriptions>
<div class="left-span-label">我来回复</div>
<el-form-item label="回复内容" prop="replyContent">
<el-input type="textarea" rows="3" v-model="formData.replyContent" placeholder="请输入回复内容"></el-input>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
store,
data() {
return {
formData: {},
formRules: {
replyContent: [{required: true, message: '请输入回复内容', trigger: ['change', 'blur']}],
},
viewData: {},
}
},
methods: {
onOpen(row) {
this.viewData = clone({ ...row })
this.$set(this.formData, 'postId', row.id)
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/legal/onlineReply/submit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,132 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
@change="doSearch"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="是否回复">
<el-select v-model="pageForm.isReply" style="width: 100%" @change="doSearch">
<el-option :value="null" label="全部"></el-option>
<el-option :value="true" label="已回复"></el-option>
<el-option :value="false" label="未回复"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="咨询列表"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" row-key="id">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'replyCount'">
<el-tag type="success" v-if="row.replyCount > 0">已回复</el-tag>
<el-tag type="info" v-else>未回复</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onReply(row)" size="mini" type="primary">回复</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
<!--#include('../onlinePost/info.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
"info": info,
},
data() {
return {
tableColumns: [
{prop: 'posterUserName', label: '姓名'},
{prop: 'postTitle', label: '标题'},
{prop: 'postingTime', label: '咨询时间'},
{prop: 'replyCount', label: '回复情况'}
],
pageForm: {
year: new Date().getFullYear() + '',
isReply: null,
},
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
this.$refs.guava.view(() => {
const url = '/platform/legal/onlineReply/fetchOne'
this.$refs.infoRef.onOpen(row, url)
})
},
onReply(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,256 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.top-col {
background-color: white;
position: relative;
box-sizing: border-box;
padding: 20px;
width: calc((100% - (20px * 3)) / 4);
overflow: hidden;
color: #FFFFFF;
border-radius: 4px;
}
.top-col:hover {
transform: scale(1.01);
}
.top-col:not(:last-child), .center-col:not(:last-child) {
margin-right: 20px;
}
.col-title {
font-size: 14px;
margin-bottom: 10px;
color: #FFFFFF;
}
.top-col-member-number {
font-size: 30px;
color: #FFFFFF;
}
.top-col-chart {
height: 80px;
width: 100%;
position: relative;
}
.center-col {
background-color: white;
position: relative;
box-sizing: border-box;
padding: 20px;
}
.el-table__body-wrapper::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.el-table__body-wrapper {
scrollbar-width: none; /* firefox */
-ms-overflow-style: none; /* IE 10+ */
overflow-x: hidden;
overflow-y: auto;
}
@media screen and (max-width: 500px) {
.num-card {
flex-direction: column;
}
.num-card .top-col {
width: 100%;
margin-bottom: 10px;
}
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
@change="doSearch"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<el-row type="flex" class="num-card">
<el-col :span="6" class="top-col" style="background: rgb(248, 108, 107)">
<div class="col-title">总开放场次</div>
<div class="top-col-member-number">
{{numAreaMap?.total || 0}}
<span style="font-size: 14px">&ensp;</span>
</div>
</el-col>
<el-col :span="6" class="top-col" style="background: rgb(133, 149, 244)">
<div class="col-title">预约成功场次</div>
<div class="top-col-member-number">
{{numAreaMap?.successNum || 0}}
<span style="font-size: 14px">&ensp;</span>
</div>
</el-col>
<el-col :span="6" class="top-col" style="background: rgb(254, 187, 80)">
<div @click="tableIndex = 1; tableChange()">
<div class="col-title">咨询师人数</div>
<div class="top-col-member-number">
{{numAreaMap?.doctorCount || 0}}
<span style="font-size: 14px">&ensp;</span>
</div>
</div>
</el-col>
<el-col :span="6" class="top-col" style="background: #26A65B">
<div @click="tableIndex = 2; tableChange()">
<div class="col-title">总计服务教师人数</div>
<div class="top-col-member-number">
{{numAreaMap?.serviceTeacherCount || 0}}
<span style="font-size: 14px">&ensp;</span>
</div>
</div>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool :label="tableLabel"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize">
<el-table-column label="序号" type="index" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column v-if="tableIndex === 1" label="操作" width="100">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</guava>
<el-dialog :visible.sync="infoDialogVisible"
width="60%" title="服务教师列表"
:close-on-click-modal="false"
append-to-body>
<el-table :data="infoTableData">
<el-table-column label="序号" type="index" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in infoTableColumns"
>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button @click="infoDialogVisible = false" type="primary">确定</el-button>
</span>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
infoDialogVisible: false,
tableLabel: '按咨询师统计',
tableColumns: [],
infoTableColumns: [],
doctorTableColumns: [
{prop: 'doctorUserName', label: '咨询师'},
{prop: 'sex', label: '性别'},
{prop: 'jobTitle', label: '职称'},
{prop: 'serviceNum', label: '服务次数'},
],
teacherTableColumns: [
{prop: 'userName', label: '教师'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'},
{prop: 'startTime', label: '开始时间'},
{prop: 'endTime', label: '结束时间'},
{prop: 'doctorUserName', label: '咨询师'},
],
numAreaMap: {},
tableIndex: 1,
infoTableData: [],
}
},
methods: {
doSearch() {
this.queryCount()
this.tableChange()
},
onView(row) {
this.infoTableColumns = this.teacherTableColumns
this.$axios.post(loc() + "/pageData", {
year: this.pageForm.year,
tableIndex: 2,
doctorUser: row.userId
}).then((res) => {
if (res.code === 0) {
this.infoTableData = res.data
this.infoDialogVisible = true
}
})
},
tableChange() {
this.pageForm.tableIndex = this.tableIndex
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data
}
})
},
queryCount() {
this.$axios.post(loc() + "/queryCount", this.pageForm).then((res) => {
if (res.code === 0) {
this.numAreaMap = res.data
}
})
},
},
async created() {
this.tableColumns = this.doctorTableColumns
this.queryCount()
this.tableChange()
},
watch: {
tableIndex(val) {
this.tableColumns = val === 1 ? this.doctorTableColumns : this.teacherTableColumns
}
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,62 @@
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="110px" label-position="left">
<el-form-item prop="title" label="标题">
<el-input type="text" v-model="formData.title" maxlength="50"
placeholder="请填写标题"></el-input>
</el-form-item>
<el-form-item prop="url" label="链接">
<el-input type="text" v-model="formData.url" maxlength="50"
placeholder="请填写链接"></el-input>
</el-form-item>
<el-form-item prop="bz" label="备注">
<el-input type="textarea" v-model="formData.bz"
placeholder="请填写备注"></el-input>
</el-form-item>
</el-form>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="$emit('refresh')">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</div>
`,
data() {
return {
formData: {},
formRules: {
title: [{required: true, message: '必填', trigger: ['change', 'blur']}],
url: [{required: true, message: '必填', trigger: ['change', 'blur']}],
},
}
},
methods: {
onOpen(row) {
if (row && row.id) {
this.formData = clone(row)
}
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/legal/study/onSubmit", this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$emit('refresh')
} else {
this.$message.warning(resp.msg)
}
})
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,135 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="标题/链接:">
<el-input placeholder="请输入标题或链接" v-model="pageForm.searchKeyword" clearable @keyup.enter.native="doSearch"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="资料列表">
<el-button v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('SCHOOL_UNION_ADMIN')"
type="primary" size="small" @click="onAdd">
<i class="ti-plus"></i>
新增资料
</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" row-key="id">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{ row }" v-if="column.prop === 'url'">
<el-link type="primary" @click="onView(row)">{{ row.url }}</el-link>
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'createdAt'">
{{ $moment(row.createdAt).format('YYYY-MM-DD') }}
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<basic-form ref="basicFormRef" @refresh="refresh"></basic-form>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('basicForm.js'){}#-->
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
"basic-form": basicForm,
},
data() {
return {
tableColumns: [
{prop: 'title', label: '标题'},
{prop: 'url', label: '链接'},
{prop: 'username', label: '创建人'},
{prop: 'createdAt', label: '创建时间'},
],
}
},
methods: {
refresh() {
this.doSearch()
this.$refs.guava.index()
},
onView(row) {
window.open(row.url)
},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen()
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.basicFormRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$axios.post("/platform/legal/study/onDelete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,404 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="生育休假" define_key="SYXJ"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<table-tool label="人员信息"></table-tool>
<el-descriptions :column="2" border>
<el-descriptions-item label="职工姓名">{{formData.userName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{formData.sex}}</el-descriptions-item>
<el-descriptions-item label="民族">{{formData.nation}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{$moment(formData.birthday).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="工作单位" >{{formData.unitName}}</el-descriptions-item>
<el-descriptions-item label="电话" >{{formData.mobile}}</el-descriptions-item>
<el-descriptions-item label="爱人姓名">
<el-form-item label="爱人姓名" prop="loverName">
<el-input type="text" v-model="formData.loverName" placeholder="请输入爱人姓名"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item label="性别" prop="loverSex">
<el-select v-model="formData.loverSex" placeholder="请选择">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item label="民族" prop="loverNation">
<dict-select v-model="formData.loverNation" code="USER_NATION" style="width: 100%" placeholder="请选择民族">
</dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生年月" >
<el-form-item prop="loverBirthday">
<el-date-picker
v-model="formData.loverBirthday"
type="date"
placeholder="请选择出生年月"
style="width: 100%;"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位" span="2">
<el-form-item label="工作单位" prop="loverUnitName">
<el-input type="text" v-model="formData.loverUnitName"
placeholder="请输入工作单位"></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
<table-tool label="假期类别"></table-tool>
<el-descriptions :column="2" border>
<el-descriptions-item label="陪产假" v-if="isMale">
<el-form-item label="陪产假" prop="withLeave">
<el-input v-model="formData.withLeave" placeholder="请输入陪产天数"
type="number" :disabled="true"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="育儿假" v-if="isMale">
<el-form-item label="育儿假" prop="parentalLeave">
<el-input v-model="formData.parentalLeave" placeholder="请输入育儿假天数"
type="number" :disabled="true"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="产假" v-if="isFemale">
<el-form-item label="产假" prop="maternityLeave">
<el-input v-model="formData.maternityLeave" placeholder="请输入产假天数"
type="number" :disabled="true"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="延长假" v-if="isFemale">
<el-form-item label="延长假" prop="extendLeave">
<el-input v-model="formData.extendLeave" placeholder="请输入延长假天数"
type="number" :disabled="true"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="多胞胎" v-if="isFemale">
<el-form-item label="多胞胎" prop="birthsLeave">
<el-select v-model="formData.birthsLeave" placeholder="请选择多胞胎天数"
clearable style="width: 100%">
<el-option label="15" :value="15"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="难产假" v-if="isFemale">
<el-form-item label="难产假" prop="difficultLeave">
<el-select v-model="formData.difficultLeave" placeholder="请选择难产假天数"
clearable style="width: 100%">
<el-option label="15" :value="15"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="寒假">
<el-form-item label="寒假" prop="winterLeave">
<el-input v-model="formData.winterLeave" placeholder="请输入寒假天数"
type="number"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="暑假">
<el-form-item label="暑假" prop="summerLeave">
<el-input v-model="formData.summerLeave" placeholder="请输入暑假天数"
type="number"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="合计天数" span="2">{{formData.leaveDays}}
</el-descriptions-item>
<el-descriptions-item label="休假时间起">
<el-form-item label="休假时间起" prop="startTime">
<el-date-picker type="date"
v-model="formData.startTime"
placeholder="请选择"
clearable
style="width: 100%"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="休假时间止">
<el-form-item label="休假时间止" prop="endTime">
<el-date-picker type="date"
v-model="formData.endTime"
placeholder="请选择"
clearable
style="width: 100%"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="子女出生日">
<el-form-item label="子女出生日" prop="childrenBirthday">
<el-date-picker type="date"
v-model="formData.childrenBirthday"
placeholder="请选择子女出生日"
clearable
style="width: 100%"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</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-row>
</el-card>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {},
formRules: {
loverName: [{ required: true, message: '请输入爱人姓名', trigger: 'blur' }],
loverSex: [{ required: true, message: '请选择爱人性别', trigger: 'change' }],
loverNation: [{ required: true, message: '请选择爱人民族', trigger: 'change' }],
loverBirthday: [{ required: true, message: '请选择爱人出生年月', trigger: 'change' }],
loverUnitName: [{ required: true, message: '请输入爱人工作单位', trigger: 'blur' }],
startTime: [{ required: true, message: '请选择休假开始时间', trigger: 'change' }],
endTime: [{ required: true, message: '请选择休假结束时间', trigger: 'change' },
{validator: (rule, value, callback) => {
if (this.formData.startTime && value) {
const startDate = new Date(this.formData.startTime);
const endDate = new Date(value);
if (endDate < startDate) {
callback(new Error('休假结束时间不能早于开始时间'));
} else {
callback();
}
} else {
callback();
}
},
trigger: 'change'
}
],
childrenBirthday: [{ required: true, message: '请选择子女出生日期', trigger: 'change' }]
}
,
}
},
computed: {
// 计算合计天数
totalLeaveDays() {
const fields = [
'withLeave', 'parentalLeave', 'maternityLeave',
'extendLeave', 'birthsLeave', 'difficultLeave',
'winterLeave', 'summerLeave'
];
let total = 0;
fields.forEach(field => {
const value = this.formData[field];
if (value && !isNaN(value)) {
total += parseFloat(value);
}
});
return total;
},
// 是否为男
isMale() {
return this.formData.sex === '男';
},
// 是否为女
isFemale() {
return this.formData.sex === '女';
},
},
watch: {
totalLeaveDays(newVal) {
this.$set(this.formData, 'leaveDays', newVal);
// 当合计天数或开始时间变化时,自动计算结束时间
this.calculateEndTime();
},
'formData.startTime'() {
// 当开始时间变化时,自动计算结束时间
this.calculateEndTime();
},
// 监听性别变化,设置默认值
isMale(newVal) {
if (newVal) {
// 男默认设置
this.$set(this.formData, 'loverSex', '女');
this.$set(this.formData, 'withLeave', 15);
this.$set(this.formData, 'parentalLeave', 10);
}
},
isFemale(newVal) {
if (newVal) {
// 女默认设置
this.$set(this.formData, 'loverSex', '男');
this.$set(this.formData, 'maternityLeave', 98);
this.$set(this.formData, 'extendLeave', 60);
}
}
},
methods: {
// 计算休假时间止
calculateEndTime() {
// 如果是男,则不自动计算结束时间
if (this.isMale) {
return;
}
if (this.formData.startTime && this.formData.leaveDays) {
const startDate = new Date(this.formData.startTime);
if (!isNaN(startDate.getTime())) {
// 创建新的日期对象,避免修改原始日期
const endDate = new Date(startDate);
// 添加天数(leaveDays - 1,因为包含开始日期)
endDate.setDate(endDate.getDate() + this.formData.leaveDays - 1);
// 格式化为 yyyy-MM-dd
const year = endDate.getFullYear();
const month = String(endDate.getMonth() + 1).padStart(2, '0');
const day = String(endDate.getDate()).padStart(2, '0');
this.$set(this.formData, 'endTime', year + '-' + month + '-' + day);
}
}
},
// 保存
onSave() {
console.log(this.formData);
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/maternityLeave/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush('/platform/maternityLeave/mine/index')
}
})
})
},
// 提交验证
validateBeforeSubmit() {
return new Promise((resolve) => {
this.$refs.formRef.validate((valid) => {
if (valid) {
resolve(true);
} else {
this.$message.error('请完善必填信息');
resolve(false);
}
});
});
},
// 提交
async onSubmit() {
const isValid = await this.validateBeforeSubmit();
if (!isValid) return;
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/maternityLeave/apply/submit', {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/maternityLeave/mine/index')
}
})
})
},
// 再次提交
async onFinishTask() {
const isValid = await this.validateBeforeSubmit();
if (!isValid) return;
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/maternityLeave/apply/submitAgain', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/maternityLeave/mine/index')
}
})
})
},
async findOne(id) {
const resp = await $.get('/platform/maternityLeave/apply/findOne', {id})
if (resp.code === 0) {
return resp.data
}
},
init() {
if (this.bizId) {
this.findOne(this.bizId).then(async data => {
this.formData = data
})
} else {
const {id, username, loginname, union, unit, sex, nation, birthday,mobile} = this.$store.state.user
this.formData = {
userId: id,
userName: username,
loginName: loginname,
unitId: unit.id,
unitName: unit.name,
unionId: union.id,
unionName: union.name,
sex: sex,
nation: nation,
birthday: birthday,
mobile:mobile
}
// 根据性别设置默认值
if (this.isMale) {
// 男默认设置
this.$set(this.formData, 'loverSex', '女');
this.$set(this.formData, 'withLeave', 15);
this.$set(this.formData, 'parentalLeave', 10);
// 男默认产假和延长假为0,因为男不休产假
this.$set(this.formData, 'maternityLeave', 0);
this.$set(this.formData, 'extendLeave', 0);
} else if (this.isFemale) {
// 女默认设置
this.$set(this.formData, 'loverSex', '男');
this.$set(this.formData, 'maternityLeave', 98);
this.$set(this.formData, 'extendLeave', 60);
// 女默认陪产假和育儿假为0
this.$set(this.formData, 'withLeave', 0);
this.$set(this.formData, 'parentalLeave', 0);
}
}
}
},
created() {
this.init()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,135 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button @click="onExport" icon="el-icon-s-promotion" type="primary" size="small">导出</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="leaveDays" label="休假天数"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="$auth.hasRole('SYSADMIN')" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<maternity-leave-info ref="maternityLeaveInfoRef"></maternity-leave-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"maternity-leave-info": maternityLeaveInfo
},
data() {
return {
pageDataUrl: "/platform/maternityLeave/collect/pageData",
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/maternityLeave/mine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onExport() {
this.$downLoad('/platform/maternityLeave/collect/onExport', this.pageForm)
},
},
created() {
this.pageData()
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
//单位查询
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,137 @@
const maternityLeaveInfo = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<table-tool label="人员信息"></table-tool>
<el-descriptions :column="2" border class="flow-task-form">
<el-descriptions-item label="职工姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="民族">{{viewData.nation}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{$moment(viewData.birthday).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="电话">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="爱人姓名">{{viewData.loverName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.loverSex}}</el-descriptions-item>
<el-descriptions-item label="民族">{{viewData.loverNation}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{$moment(viewData.loverBirthday).format('YYYY-MM-DD')}}</el-descriptions-item> <el-descriptions-item label="单位" span="2">{{viewData.loverUnitName}}</el-descriptions-item>
</el-descriptions>
<table-tool label="假期类型"></table-tool>
<el-descriptions :column="2" border class="flow-task-form">
<el-descriptions-item label="陪产假" v-if="viewData.sex === '男'">
{{viewData.withLeave}}
</el-descriptions-item>
<el-descriptions-item label="育儿假" v-if="viewData.sex === '男'">
{{viewData.parentalLeave}}
</el-descriptions-item>
<el-descriptions-item label="产假" v-if="viewData.sex === '女'">
{{viewData.maternityLeave}}
</el-descriptions-item>
<el-descriptions-item label="延长假" v-if="viewData.sex === '女'">
{{viewData.extendLeave}}
</el-descriptions-item>
<el-descriptions-item label="多胞胎" v-if="viewData.sex === '女'">
{{viewData.birthsLeave}}
</el-descriptions-item>
<el-descriptions-item label="难产假" v-if="viewData.sex === '女'">
{{viewData.difficultLeave}}
</el-descriptions-item>
<el-descriptions-item label="寒假">{{viewData.winterLeave}}</el-descriptions-item>
<el-descriptions-item label="暑假">{{viewData.summerLeave}}</el-descriptions-item>
<el-descriptions-item label="合计" :span="2">{{viewData.leaveDays}}</el-descriptions-item>
<el-descriptions-item label="休假时间起">{{$moment(viewData.startTime).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="休假时间止">{{$moment(viewData.endTime).format('YYYY-MM-DD')}}</el-descriptions-item>
<el-descriptions-item label="子女出生日">{{$moment(viewData.childrenBirthday).format('YYYY-MM-DD')}}</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="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3" v-if="!task.ext.isFirstTaskNode">
<el-image :src="task.ext.tf_userSign"
v-if="task.ext.tf_userSign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
viewData: {},
doneTasks: [],
row: null
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/maternityLeave/apply/findOne', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId,this.row.instanceId)
}
}
}
@@ -0,0 +1,125 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="leaveDays" label="休假天数"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
<el-button @click="doExportApply(row)" size="mini" type="primary">申请表导出</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<maternity-leave-info ref="maternityLeaveInfoRef"></maternity-leave-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"maternity-leave-info": maternityLeaveInfo
},
data() {
return {
pageDataUrl: "/platform/maternityLeave/mine/pageData",
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
// 导出示例
doExportApply(row){
this.$downLoad('/platform/maternityLeave/mine/doExportApply?id=' + row.id)
},
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/maternityLeave/apply/index?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/maternityLeave/mine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,196 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="leaveDays" label="休假天数"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>·
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<maternity-leave-info ref="maternityLeaveInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="tf_userSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</maternity-leave-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"maternity-leave-info": maternityLeaveInfo
},
data() {
return {
pageDataUrl: "/platform/maternityLeave/schoolAudit/pageData",
pageForm: {
approval: false
},
formData: {},
showApprovalForm: false,
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.view(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
},
created() {
this.pageData()
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
//单位查询
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,211 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="请选择年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择所属工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择所属单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</template>
</search>
</el-card>
<el-card shadow="never">
<table-tool><el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<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="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="leaveDays" label="休假天数"></el-table-column>
<el-table-column prop="applyTime" label="申请时间"></el-table-column>
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>·
<el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<maternity-leave-info ref="maternityLeaveInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="tf_userSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</maternity-leave-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"maternity-leave-info": maternityLeaveInfo
},
data() {
return {
pageDataUrl: "/platform/maternityLeave/unionAudit/pageData",
pageForm: {
approval: false
},
formData: {},
showApprovalForm: false,
unionOptions: [],
unitOptions: [],
userOptions: [],
}
}
,
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.showApprovalForm = false;
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.view(()=>{
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.maternityLeaveInfoRef.onOpen(row)
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
},
created() {
this.pageData()
// 根据用户角色加载相应的工会和单位数据
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion().then((data) => {
this.unionOptions = data || []
})
this.$businessTool.listUnit().then((data) => {
this.unitOptions = data || []
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
const userUnionId = this.$store.state.user.union.id
this.$businessTool.listUnion(userUnionId).then((data) => {
this.unionOptions = data ? [data] : []
})
this.$businessTool.listUnit(userUnionId).then((data) => {
this.unitOptions = data || []
})
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,216 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<div style="max-width: 900px; margin: 0 auto;">
<custom-card>
<snaker-start slot="header" label="基金会员申请" define_key="JJHY"></snaker-start>
<el-card shadow="never">
<el-form :model="formData" :rules="formRules" label-suffix=""
label-width="120px"
ref="formRef">
<el-form-item label="姓&emsp;&emsp;名">
<el-input disabled placeholder="请输入内容"
v-model="formData.userName"></el-input>
</el-form-item>
<el-form-item label="工&emsp;&emsp;号">
<el-input disabled placeholder="请输入内容"
v-model="formData.loginName"></el-input>
</el-form-item>
<el-form-item label="申请时间" prop="applyTime">
<el-date-picker disabled
placeholder="选择日期"
style="width: 100%"
type="date"
v-model="formData.applyTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="联系方式" prop="mobile">
<el-input placeholder="请输入联系方式"
v-model="formData.mobile"></el-input>
</el-form-item>
<el-form-item label="身份证号" prop="idCard">
<el-input maxlength="18" placeholder="请输入身份证号"
v-model="formData.idCard"></el-input>
</el-form-item>
<el-form-item label="入校时间" prop="arrivalAtSchoolDate">
<el-input placeholder="请输入入校时间" v-model="formData.arrivalAtSchoolDate"
disabled></el-input>
</el-form-item>
<el-form-item label="基金会员类型" prop="aidFundMemberUserType">
<el-radio-group v-model="formData.aidFundMemberUserType">
<el-radio-button :label="item.code" v-for="item in dict.type.AIDFUND_MEMBER_USER_TYPE"
:key="item.code">
{{item.name}}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-alert :closable="false" type="error">
温馨提醒:入校时间关联会费缴纳金额,请确认是否正确,若有疑问请联系校工会!另外,务必按您的实际情况选择基金会员类型!
</el-alert>
<el-form-item label="" prop="isRead">
<div style="display: flex">
<el-checkbox v-model="formData.isRead" @change="isReadChange">
</el-checkbox>
<div style="cursor: pointer;" @click="isReadClick" class="ml5">
<div style="color: #1e88e5">
中国地质大学(武汉)教职工重大疾病互助基金管理办法
</div>
</div>
</div>
</el-form-item>
</el-form>
</el-card>
<template slot="footer">
<el-button type="primary" @click="openSubmit" :disabled="applyInfo.disabled">
<span>{{applyInfo.label}}</span>
</el-button>
</template>
<el-dialog :close-on-click-modal="false" title="温馨提醒" :visible.sync="dialogVisible"
width="40%">
<pay_record ref="payRecord"></pay_record>
<el-alert :closable="false" class="mt10" type="warning" v-if="!$store.state.user.aidFundMember">
本次入会,您需要缴费会费{{payMoney}}元,请详知。
</el-alert>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="dialogVisible=false">取消</el-button>
<el-button @click="onSubmit" type="primary">提交</el-button>
</el-row>
</el-dialog>
</custom-card>
</div>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/payRecord.js"){}#-->
new Vue({
el: '#app',
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE"],
mixins: [initTableMixins],
data() {
return {
formRules: {
mobile: [{required: true, message: "必填", trigger: ["blur", "change"]}],
idCard: [{required: true, message: "必填", trigger: ["blur", "change"]}],
aidFundMemberUserType: [{required: true, message: "必填", trigger: ["blur", "change"]}],
arrivalAtSchoolDate: [{required: true, message: "必填", trigger: ["blur", "change"]}],
},
aidFundMemberUserTypeOptions: [],
isReadChangeType: true,
applyInfo: {
disabled: true,
label: '申请加入'
},
dialogVisible: false,
payMoney: 0,
payRecordsDialogTitle: "",
payRecordList: []
}
},
components: {
'pay_record': PAY_RECORD,
},
methods: {
getPayMoney() {
this.$axios.post('/platform/medicalMutualAid/aidFund/apply/getPayMoney', {arrivalAtSchoolDate: this.formData.arrivalAtSchoolDate}).then(resp => {
if (resp.code === 0) {
this.payMoney = resp.data
}
})
},
isReadClick() {
this.isReadChangeType = false
this.$set(this.formData, 'isRead', true)
this.$commonUtil.previewFile({
suffix: "pdf",
downloadPath: "/platform/sys/file/download?id=orpgde84uggjmpflbob83tadan",
name: "中国地质大学(武汉)教职工重大疾病互助基金管理办法.pdf",
id: "orpgde84uggjmpflbob83tadan"
})
},
isReadChange() {
if (this.isReadChangeType) {
this.$set(this.formData, 'isRead', false)
this.$alert('请阅读《教职工重大疾病互助基金管理办法》的通知文件', '温馨提醒', {
confirmButtonText: '确定',
})
return
}
},
openSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (!this.formData.isRead) {
this.$alert('请阅读《教职工重大疾病互助基金管理办法》的通知', '温馨提醒', {
confirmButtonText: '确定',
})
return
}
this.getPayMoney()
this.dialogVisible = true
this.$nextTick(() => {
this.$refs.payRecord.getUserPayRecordList()
})
}
})
},
onSubmit() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/aidFund/apply/submit", {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.dialogVisible = false
commonUtil.pjaxPush("/platform/medicalMutualAid/aidFund/applyMine")
}
})
})
},
canApply() {
this.$axios.post('/platform/medicalMutualAid/aidFund/apply/canApply').then(resp => {
if (resp.code === 0) {
this.applyInfo = resp.data
}
})
},
initData() {
this.canApply()
this.$set(this.formData, "userName", this.$store.state.user.username)
this.$set(this.formData, "loginName", this.$store.state.user.loginname)
this.$set(this.formData, "mobile", this.$store.state.user.mobile)
this.$set(this.formData, "idCard", this.$store.state.user.idCard)
this.$set(this.formData, "aidFundMemberUserType", this.$store.state.user.aidFundMemberUserType)
if (this.$store.state.user.arrivalAtSchoolDate) {
this.$set(this.formData, "arrivalAtSchoolDate", this.$moment(this.$store.state.user.arrivalAtSchoolDate).format("YYYY-MM-DD"))
}
this.$set(this.formData, "applyTime", this.$moment(new Date()).format("YYYY-MM-DD"))
}
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,151 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请记录">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onFinishTask(row)"
size="mini" type="primary">
提交
</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)"
size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</el-card>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
year: this.$moment().format("YYYY")
},
tableColumns: [
{prop: "loginName", label: "工号", sortable: true},
{prop: "userName", label: "姓名", sortable: true},
{prop: "sex", label: "性别", sortable: true},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "mobile", label: "电话"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "申请日期"},
{prop: "taskName", label: "当前节点"},
{prop: "instanceState", label: "流程状态"}
],
}
},
methods: {
onFinishTask(row){
this.$confirm("您确定要重新提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/aidFund/applyMine/submitAgain", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要取消申请吗?取消后将不能撤回", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/aidFund/applyMine/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,175 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" code="AIDFUND_MEMBER_CHANGE_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='applyTime'">
<template v-if="row.applyTime">
{{$moment(row.applyTime).format('YYYY-MM-DD')}}
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onDelete(row)" :loading="formLoading" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/applyInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
},
tableColumns: [
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "变更时间"},
],
unionList: [],
unitList: [],
}
},
components: {
'info': APPLY_INFO,
},
methods: {
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("确定要删除【" + row.username + "】的变更记录吗?删除后将同步删除关联流程记录", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.formLoading = true
this.$axios.post(loc() + "/delete", {id: row.id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
}).finally(() => {
this.formLoading = false
})
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,92 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="会员分析">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
</el-card>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
unionId: '',
year: this.$moment().format("YYYY"),
},
unionList: [],
tableColumns: [
{prop: "unionName", label: "分工会"},
{prop: "YEAR_BEGIN", label: "年初数量"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_EIGTH", label: "会员退休(不变号)"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_ONE", label: "新增会员"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_FOUR", label: "自愿退出"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_FIVE", label: "会员去世"},
{prop: "currentAidFundMember", label: "当前数量"},
]
}
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,106 @@
<!--#include("payRecord.js"){}#-->
const AID_FUND_INFO = {
template: /*language=HTML*/
`
<div>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="用户信息" name="one">
<el-descriptions :column="3" border>
<el-descriptions-item label="申报人">{{viewData.username}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginname}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="入校时间">
{{$moment(viewData.arrivalAtSchoolDate).format('YYYY-MM-DD')}}
</el-descriptions-item>
<el-descriptions-item label="基金会员类型">
{{viewData.aidFundMemberUserType}}
</el-descriptions-item>
<el-descriptions-item label="起扣时间">
{{viewData.aidFundDeductTime}}
</el-descriptions-item>
<el-descriptions-item label="所在单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="所在工会">{{viewData.unionName}}</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="变更记录" name="two">
<el-table :data="changeRecordTableData" ref="table" row-key="id" style="width: 100%">
<el-table-column label="序号" type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='applyTime'">
<template v-if="row.applyTime">
{{$moment(row.applyTime).format('YYYY-MM-DD')}}
</template>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="缴费记录" name="three">
<pay_record ref="payRecord" :max-height="650"></pay_record>
</el-tab-pane>
</el-tabs>
`,
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
viewData: {},
changeRecordTableData: [],
activeName:"one",
tableColumns: [
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "变更时间"},
],
}
},
components: {
'pay_record': PAY_RECORD,
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.info()
this.findChangeRecordList()
this.$refs.payRecord.getUserPayRecordList(row.id)
},
// 获取申请信息
info() {
this.$axios.post("/platform/medicalMutualAid/aidFund/manage/findOne", {userId: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取申请信息
findChangeRecordList() {
this.$axios.post("/platform/medicalMutualAid/aidFund/manage/findChangeRecordList", {userId: this.row.id}).then((res) => {
if (res.code === 0) {
this.changeRecordTableData = res.data
}
})
},
}
}
@@ -0,0 +1,97 @@
const APPLY_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="申请人">{{viewData.username}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginname}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="基金会员类型">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="viewData.aidFundMemberUserType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="入校时间">{{$moment(viewData.arrivalAtSchoolDate).format('YYYY-MM-DD')}}
</el-descriptions-item>
<el-descriptions-item label="所在单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="所在工会">{{viewData.unionName}}</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel 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="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE", "PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {},
doneTasks: [],
row: null,
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.info()
this.getDoneTasks()
},
// 获取申请信息
info() {
this.$axios.post("/platform/medicalMutualAid/aidFund/apply/info", {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart() {
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
},
}
@@ -0,0 +1,75 @@
const PAY_RECORD = {
template: /*language=HTML*/
`
<div>
<el-table :data="payRecordList" row-key="id" style="width: 100%" :max-height="maxHeight" show-summary
:summary-method="getSummaries">
<el-table-column label="序号" type="index" width="80"></el-table-column>
<el-table-column label="缴费年份" prop="year"></el-table-column>
<el-table-column label="缴费金额" prop="money">
<template scope="{row:{money}}">
<el-tag>{{ money }}</el-tag>
</template>
</el-table-column>
<el-table-column label="是否扣款" prop="isPayed">
<template scope="{row:{isPayed}}">
<el-tag v-if="isPayed" type="success">已扣款</el-tag>
<el-tag v-else-if="!isPayed" type="info">未扣款</el-tag>
</template>
</el-table-column>
</el-table>
</div>
`,
props: {
maxHeight: {
type: String,
default: '300'
}
},
data() {
return {
payRecordList: [],
}
},
methods: {
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
const values = data.map(item => Number(item[column.property]));
if ([1, 3].includes(index)) {
sums[index] = '';
} else {
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += ' 元';
} else {
sums[index] = '';
}
}
});
return sums;
},
getUserPayRecordList(userId) {
this.$axios.post('/platform/medicalMutualAid/aidFund/apply/getUserPayRecordList', {userId}).then(resp => {
if (resp.code === 0) {
this.payRecordList = resp.data
}
})
},
}
}
@@ -0,0 +1,451 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" code="AIDFUND_MEMBER_CHANGE_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select @change="unionChange" clearable filterable style="width: 100%"
placeholder="请选择所属工会" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch" clearable filterable style="width: 100%"
placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请记录">
<el-button @click="openBatchAudit"
:disabled="pageForm.approval===true||pageForm.approval==='true'"
size="small"
type="primary">批量审核
</el-button>
<el-button @click="exportApplyRecord"
icon="el-icon-download"
size="small"
type="primary">导出
</el-button>
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.approval">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column
:reserve-selection="true"
type="selection"
width="55">
</el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='money'">
<template v-if="row.changeType==='AIDFUND_MEMBER_CHANGE_TYPE_ONE'">
<el-tag>{{row.money}}</el-tag>
</template>
<template v-else></template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-dialog
:visible.sync="batchAuditVisible"
title="批量审核"
width="40%">
<el-form :model="batchForm" :rules="batchFormRules" label-width="100px" ref="batchFormRef">
<el-form-item label="审核状态" prop="submitType">
<el-radio-group v-model="batchForm.submitType">
<el-radio-button :label="2">拒绝</el-radio-button>
<el-radio-button :label="1">通过</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="审核名单">
<el-table :data="batchAuditTableData" row-key="id" style="width: 100%" max-height="300">
<el-table-column label="姓名" prop="userName" min-width="100"></el-table-column>
<el-table-column label="工号" prop="loginName" min-width="120"></el-table-column>
<el-table-column label="单位" prop="unitName" min-width="140" show-overflow-tooltip></el-table-column>
<el-table-column label="入校时间" prop="arrivalAtSchoolDate" min-width="110"></el-table-column>
<el-table-column label="缴费金额" prop="money" min-width="100"></el-table-column>
</el-table>
</el-form-item>
<el-alert
:closable="false"
class="mb10"
title="批量通过时,将按人员当前入校时间自动提交;缺少入校时间的记录会审核失败。"
type="warning"
v-if="batchForm.submitType===1">
</el-alert>
<el-form-item label="审批意见" prop="tf_opinion">
<user-opinion-textarea v-model="batchForm.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="batchAuditVisible = false">取 消</el-button>
<el-button @click="submitBatchAudit" type="primary">提 交</el-button>
</span>
</el-dialog>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="100px" label-suffix="">
<el-form-item label="审核状态" prop="submitType"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.submitType">
<el-radio-button :label="2">拒绝</el-radio-button>
<el-radio-button :label="1">通过</el-radio-button>
</el-radio-group>
</el-form-item>
<el-row :gutter="20"
v-if="formData.submitType===1
&&formData.changeType==='AIDFUND_MEMBER_CHANGE_TYPE_ONE'">
<el-col :span="12">
<el-form-item label="入校时间" prop="arrivalAtSchoolDate"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-date-picker
:picker-options="pickerOptions"
@change="getPayMoney"
placeholder="选择日期"
type="date"
v-model="formData.arrivalAtSchoolDate"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="缴纳费用" prop="money">
<el-input readonly v-model="formData.money"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(formData.submitType)" size="small" type="primary">提交
</el-button>
<!--<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>-->
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/applyInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
approval: false
},
tableColumns: [
{prop: "loginName", label: "工号"},
{prop: "userName", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "money", label: "缴费金额"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "申请日期"},
{prop: "curTaskName", label: "当前节点"},
{prop: "instanceState", label: "流程状态"}
],
showApprovalForm: false,
batchAuditVisible: false,
batchAuditTableData: [],
batchForm: {
submitType: 1,
tf_opinion: ""
},
batchFormRules: {
submitType: [
{required: true, message: "必填", trigger: ["change", "blur"]}
],
tf_opinion: [
{required: true, message: "必填", trigger: ["change", "blur"]}
]
},
unionOptions: [],
unitOptions: [],
pickerOptions: {
disabledDate(date) {
return date.getTime() > new Date().getTime()
}
},
}
},
components: {
'info': APPLY_INFO,
},
methods: {
openBatchAudit() {
const selection = this.$refs.table.selection
if (!selection || selection.length === 0) {
this.$message.warning("请先勾选需要审核的记录")
return
}
this.$set(this, "batchForm", {
submitType: 1,
tf_opinion: ""
})
this.$set(this, "batchAuditTableData", selection.map(row => {
return {
id: row.id,
userName: row.userName,
loginName: row.loginName,
unitName: row.unitName,
arrivalAtSchoolDate: row.arrivalAtSchoolDate,
money: row.money
}
}))
this.$set(this, "batchAuditVisible", true)
this.$nextTick(() => {
if (this.$refs.batchFormRef) {
this.$refs.batchFormRef.clearValidate()
}
})
},
submitBatchAudit() {
const selection = this.$refs.table.selection
if (!selection || selection.length === 0) {
this.$message.warning("请先勾选需要审核的记录")
return
}
this.$refs.batchFormRef.validate((valid) => {
if (!valid) {
return
}
let message = "确定要审核这 " + selection.length + " 条记录吗?"
const joinCount = selection.filter(row => row.changeType === "AIDFUND_MEMBER_CHANGE_TYPE_ONE").length
if (this.batchForm.submitType === 1 && joinCount > 0) {
message = "确定要批量通过这 " + selection.length + " 条记录吗?其中有 " + joinCount + " 条加入基金记录将按当前人员入校时间自动审核。"
}
this.$confirm(message, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const ids = selection.map(row => row.id)
const loading = this.$loading({
lock: true,
text: "正在批量审核...",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
})
this.$axios.post("/platform/medicalMutualAid/aidFund/foundationAudit/batchExecuteTask", {
ids: JSON.stringify(ids),
data: JSON.stringify(this.batchForm)
}).then((res) => {
if (res.code === 0) {
const result = res.data || {}
const successCount = result.successCount || 0
const failCount = result.failCount || 0
const failMessages = result.failMessages || []
if (failCount > 0) {
let failText = failMessages.slice(0, 3).join("")
if (failMessages.length > 3) {
failText = failText + ";其余记录请查看列表后重试"
}
this.$message.warning("批量审核完成:成功 " + successCount + " 条,失败 " + failCount + " 条。" + failText)
} else {
this.$message.success("批量审核完成:成功 " + successCount + " 条")
}
this.$set(this, "batchAuditVisible", false)
this.doSearch()
this.$refs.table.clearSelection()
}
}).finally(() => {
loading.close()
})
})
})
},
exportApplyRecord() {
this.$downLoad("/platform/medicalMutualAid/aidFund/foundationAudit/exportApplyRecord", this.pageForm)
},
getPayMoney() {
this.$axios.post('/platform/medicalMutualAid/aidFund/foundationAudit/getPayMoney', {
arrivalAtSchoolDate: this.formData.arrivalAtSchoolDate,
userId: this.formData.userId
}).then(resp => {
if (resp.code === 0) {
this.$set(this.formData, 'money', resp.data)
}
})
},
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
id: row.id,
processTaskId: row.taskId,
taskName: row.curTaskName,
arrivalAtSchoolDate: row.arrivalAtSchoolDate,
userId: row.userId,
applyTime: row.applyTime,
changeType: row.changeType
}
this.$refs.infoRef.onOpen(row)
this.getPayMoney()
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/aidFund/foundationAudit/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
}), id: this.formData.id
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.pageData()
this.unitOptions = await this.$businessTool.listUnit()
this.unionOptions = await this.$businessTool.listUnion()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,144 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
:clearable="false"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-button @click="exportHistoryRecord"
size="small"
icon="el-icon-download"
type="primary">导出名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='aidFundMemberJoinTime'">
<template v-if="row.aidFundMemberJoinTime">
{{$moment(row.aidFundMemberJoinTime).format("YYYY-MM-DD")}}
</template>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
isPayed: null
},
tableColumns: [
{prop: "year", label: "年度"},
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberJoinTime", label: "加入时间"},
],
unionList: [],
unitList: [],
}
},
methods: {
exportHistoryRecord(){
this.$downLoad('/platform/medicalMutualAid/aidFund/historyRecord/exportHistoryRecord', this.pageForm)
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,498 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-tag :effect="pageForm.notPayedCurrentYear?'dark':'plain'"
@click="pageForm.notPayedCurrentYear=!pageForm.notPayedCurrentYear;doSearch();"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')" class="mr10">
当年未缴费【基金会员】名单
</el-tag>
<el-button @click="batchExit" size="small"
type="danger" v-if="pageForm.notPayedCurrentYear"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')">
批量设置为退会
</el-button>
<el-button @click="openBatchChangeType" size="small"
type="primary"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')">
批量变更
</el-button>
<el-button @click="exportMemberList" icon="el-icon-download" size="small" type="primary"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage')">
导出会员名单
</el-button>
<el-button @click="exportNewMember" icon="el-icon-download" size="small" type="primary"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.exportNewMember')" class="mr10">
导出{{new
Date().getFullYear()}}年新会员名单
</el-button>
<el-dropdown @command="dropdownCommand"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')" class="mr10">
<el-button size="small" type="primary">
备份会员名单<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{action:backupMember,value:year}"
v-for="year in yearOptions"
:key="year">
{{year}}年
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown @command="dropdownCommand"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')">
<el-button size="small" type="primary"
>
生成缴费名单<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{action:createPayList,value:year}"
v-for="year in payYearOptions"
:key="year">
{{year}}年
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberJoinTime'">
<template v-if="row.aidFundMemberJoinTime">
{{$moment(row.aidFundMemberJoinTime).format('YYYY-MM-DD')}}
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEditMemberType(row)" size="mini" type="primary">修改基金会员类型
</el-button>
<el-button @click="onEditChangeType(row)" size="mini" type="primary">变更
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<info ref="infoRef">
</info>
</template>
</guava>
<el-dialog
:visible.sync="aidFundMemberUserTypeVisible"
title="修改基金会员"
width="40%">
<el-form :model="formData" :rules="formRules" label-width="120px"
ref="form">
<el-form-item label="工号" prop="loginname">
<el-input
disabled
v-model="formData.loginname">
</el-input>
</el-form-item>
<el-form-item label="姓名" prop="username">
<el-input
disabled
v-model="formData.username">
</el-input>
</el-form-item>
<el-form-item label="基金会员类型" prop="aidFundMemberUserType">
<dict-select v-model="formData.aidFundMemberUserType" clearable code="AIDFUND_MEMBER_USER_TYPE"
placeholder="请选择基金会员类型"
style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="aidFundMemberUserTypeVisible = false">取 消</el-button>
<el-button @click="doEditAidFundMemberUserType" type="primary">提 交</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="batchChangeTypeVisible"
title="会员批量变更"
width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="form">
<el-form-item>
<el-table :data="changeTableData" ref="changeTable" row-key="id" style="width: 100%" max-height="300">
<el-table-column label="序号" type="index" width="60px"></el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="操作" fixed="right" width="100">
<template slot-scope="{row}">
<el-button @click="rowTableDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="变更类型" prop="changeType">
<dict-select v-model="formData.changeType" clearable code="AIDFUND_MEMBER_CHANGE_TYPE"
placeholder="请选择变更类型"
style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="batchChangeTypeVisible = false">取 消</el-button>
<el-button @click="doBatchChangeType" type="primary">提 交</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="changeTypeVisible"
title="会员变更"
width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="form">
<el-form-item label="工号" prop="loginname">
<el-input
disabled
v-model="formData.loginname">
</el-input>
</el-form-item>
<el-form-item label="姓名" prop="username">
<el-input
disabled
v-model="formData.username">
</el-input>
</el-form-item>
<el-form-item label="变更类型" prop="changeType">
<dict-select v-model="formData.changeType" clearable code="AIDFUND_MEMBER_CHANGE_TYPE"
placeholder="请选择变更类型"
style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="changeTypeVisible = false">取 消</el-button>
<el-button @click="doEditChangeType" type="primary">提 交</el-button>
</span>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/aidFundInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
notPayedCurrentYear: false
},
tableColumns: [
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "aidFundMemberJoinTime", label: "加入时间"},
],
showApprovalForm: false,
unionList: [],
unitList: [],
payYearOptions: [],
yearOptions: [],
aidFundMemberUserTypeVisible: false,
changeTypeVisible: false,
formRules: {
aidFundMemberUserType: [
{required: true, message: '请选择基金会员类型', trigger: 'change'}
],
changeType: [
{required: true, message: '请选择变更类型', trigger: 'change'}
]
},
batchChangeTypeVisible: false,
changeTableData: []
}
},
components: {
'info': AID_FUND_INFO,
},
methods: {
doBatchChangeType() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.$message.warning('请勾选需要变更的人员')
return
}
this.$refs.form.validate(valid => {
if (!valid) {
return
}
this.$confirm('确定要变更【' + selection.map(v => v.username) + '】吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const ids = selection.map(v => v.id)
this.$axios.post('/platform/medicalMutualAid/aidFund/manage/doBatchChangeType', {
ids: JSON.stringify(ids),
changeType: this.formData.changeType
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.table.clearSelection()
this.batchChangeTypeVisible = false
}
})
})
})
},
rowTableDelete(row) {
this.$confirm('确定要删除【' + row.username + '】吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$refs.table.toggleRowSelection(row, false)
})
},
openBatchChangeType() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.$message.warning('请勾选需要变更的人员')
return
}
this.changeTableData = selection
this.batchChangeTypeVisible = true
},
onEditChangeType(row) {
this.formData = clone(row)
this.changeTypeVisible = true
},
doEditChangeType() {
this.$confirm('确定要变更【' + this.formData.username + '】吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doEditChangeType", {
userId: this.formData.id,
changeType: this.formData.changeType
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.changeTypeVisible = false
}
})
})
},
doEditAidFundMemberUserType() {
this.$confirm('确定要修改【' + this.formData.username + '】的基金会员类型吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doEditAidFundMemberUserType", {
userId: this.formData.id,
aidFundMemberUserType: this.formData.aidFundMemberUserType
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.table.clearSelection()
this.aidFundMemberUserTypeVisible = false
}
})
})
},
onEditMemberType(row) {
this.formData = clone(row)
this.aidFundMemberUserTypeVisible = true
},
batchExit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.$message.warning('请勾选需要设置为退会的人员')
return
}
const ids = selection.map(v => v.id)
this.$confirm('请核实勾选人员的退会原因,您确定要将勾选的人员设置为未缴费吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/batchExit", {ids: JSON.stringify(ids)}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.table.clearSelection()
}
})
})
},
backupMember(year) {
this.$confirm('您确定要备份' + year + '年的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/backupMember", {year}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
}
}).finally(() => {
this.tableLoading = false
})
})
},
createPayList(year) {
let msg = "请确认是否生成缴费名单?"
if (year === new Date().getFullYear()) {
msg = "您生成的" + year + "年度的缴费名单,将有可能覆盖已缴费人员的信息!请确认是否生成?"
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true;
this.$axios.post(loc() + "/createPayList", {year}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
}
}).finally(() => {
this.tableLoading = false
})
})
},
exportNewMember() {
this.$downLoad(loc() + "/exportNewMember")
},
exportMemberList() {
this.$downLoad(loc() + "/exportMemberList", this.pageForm)
},
getYearOptions() {
let year = new Date().getFullYear();
let arr = []
for (let i = year; i >= year - 3; i--) {
arr.push(i)
}
this.yearOptions = arr
},
getPayYearOptions() {
let year = new Date().getFullYear() + 1;
let arr = []
for (let i = year; i >= year - 1; i--) {
arr.push(i)
}
this.payYearOptions = arr
},
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.getPayYearOptions()
this.getYearOptions()
this.pageData()
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,263 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
:clearable="false"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-radio-group @change="doSearch" size="small"
v-model="pageForm.isPayed">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="1">已缴费</el-radio-button>
<el-radio-button :label="0">未缴费</el-radio-button>
</el-radio-group>
<el-button @click="openImport"
size="small"
icon="el-icon-upload2"
type="primary">导入缴费记录
</el-button>
<el-button @click="exportPayRecord"
size="small"
icon="el-icon-download"
type="primary">导出名单
</el-button>
<el-button @click="exportYearPayRecord"
size="small"
icon="el-icon-download"
type="primary">导出会员缴费金额
</el-button>
<el-button @click="exportAnnualPayMemberList"
size="small"
icon="el-icon-download"
type="primary">导出年度缴费名单
</el-button>
<el-button :disabled="tableData.length==0" :loading="tableLoading" @click="clearPayRecord"
icon="el-icon-delete"
size="small"
type="danger">清空{{pageForm.year}}年缴费名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='isPayed'">
<template>
<el-tag type="success" v-if="row.isPayed">已缴费</el-tag>
<el-tag type="info" v-else>未缴费</el-tag>
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onPayed(row,1)" size="mini" type="primary" v-if="!row.isPayed">设置为已缴费
</el-button>
<el-button @click="onPayed(row,0)" size="mini" type="danger" v-if="row.isPayed">设置为未缴费
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<file-import
ref="viewImport"
temp_url="/platform/medicalMutualAid/aidFund/payRecord/downloadImportTemp"
post_url="/platform/medicalMutualAid/aidFund/payRecord/doImport"
@flush="pageData"
></file-import>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/aidFundInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
isPayed: null
},
tableColumns: [
{prop: "year", label: "年度"},
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "money", label: "缴费金额"},
{prop: "isPayed", label: "是否缴费"},
],
unionList: [],
unitList: [],
}
},
components: {
'info': AID_FUND_INFO,
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue"),
},
methods: {
onView(row) {
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen({"id": row.userId})
})
},
openImport() {
this.$refs.guava.edit(() => {
setTimeout(() => {
this.$refs.viewImport.resetImportData()
this.$refs.viewImport.importData.year = this.pageForm.year
}, 500)
})
},
exportYearPayRecord(){
this.$downLoad('/platform/medicalMutualAid/aidFund/payRecord/exportYearPayRecord', this.pageForm)
},
exportAnnualPayMemberList() {
this.$downLoad('/platform/medicalMutualAid/aidFund/payRecord/exportAnnualPayMemberList', this.pageForm)
},
exportPayRecord() {
this.$downLoad('/platform/medicalMutualAid/aidFund/payRecord/exportPayRecord', this.pageForm)
},
clearPayRecord() {
if (this.pageForm.year < (new Date().getFullYear()).toString()) {
this.notifyWarning("历史数据不能删除!")
return;
}
this.$confirm("确定将【" + this.pageForm.year + "】年基金会员的缴费名单清空吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/clearPayRecord", {
year: this.pageForm.year
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.tableLoading = false
})
})
},
onPayed(row, isPayed) {
this.$confirm("确定将【" + row.username + "】设置为" + (isPayed ? "已缴费" : "未缴费") + "吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/onPayed", {id: row.id, isPayed: isPayed}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.tableLoading = false
})
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,204 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" code="AIDFUND_MEMBER_CHANGE_TYPE"
style="width: 100%"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请记录">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.approval">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/applyInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
approval: false
},
tableColumns: [
{prop: "loginName", label: "工号"},
{prop: "userName", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "申请日期"},
{prop: "curTaskName", label: "当前节点"},
{prop: "instanceState", label: "流程状态"}
],
showApprovalForm: false
}
},
components: {
'info': APPLY_INFO,
},
methods: {
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,230 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" code="AIDFUND_MEMBER_CHANGE_TYPE"
style="width: 100%"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请记录">
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.approval">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
<el-button @click="notifyUnapprovedUnionChairman" :loading="formLoading" size="small" type="primary">
一键通知未审核工会
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<info ref="infoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/applyInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
approval: false
},
tableColumns: [
{prop: "loginName", label: "工号"},
{prop: "userName", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "申请日期"},
{prop: "curTaskName", label: "当前节点"},
{prop: "instanceState", label: "流程状态"}
],
showApprovalForm: false
}
},
components: {
'info': APPLY_INFO,
},
methods: {
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
notifyUnapprovedUnionChairman() {
this.$confirm("确定要通知未审核的分工会吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.formLoading = true
this.$axios.post(loc() + "/notifyUnapprovedUnionChairman", {
year: this.pageForm.year,
aidFundMemberUserType: this.pageForm.aidFundMemberUserType,
changeType: this.pageForm.changeType
}).then((res) => {
if (res.code === 0) {
const loginNames = res.data || []
this.$alert(loginNames.length ? loginNames.join("、") : "暂无需要发送通知的人员", "需要发送人的工号", {
confirmButtonText: "确定"
})
}
}).finally(() => {
this.formLoading = false
})
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,583 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.cost .el-form-item {
margin-bottom: 0 !important;
}
</style>
<div id="app" v-cloak>
<custom-card>
<snaker-start slot="header" label="医疗补助申请" define_key="YLBB">
<template slot="header-right-label">
<el-link type="primary" @click="tipsDialog=true" class="mr10">查看补助标准</el-link>
</template>
</snaker-start>
<el-form :model="formData" :rules="formRules" label-suffix=""
ref="formRef" class="flow-task-form">
<table-tool label="申请基础信息"></table-tool>
<el-descriptions :column="3" border>
<template>
<el-descriptions-item label="申请人姓名"
v-if="$auth.hasRole('SYSADMIN') || $auth.hasRole('SCHOOL_UNION_ADMIN')|| $auth.hasRole('RETIREMENT_WORKPLACE')">
<el-form-item prop="userId" label="申请人姓名">
<el-select
style="width: 100%"
v-model="formData.userId"
filterable
:clearable="false"
remote
reserve-keyword
placeholder="请输入姓名或工号查询"
:remote-method="createRemoteMethod"
@change="userChange">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.username+''+item.loginname+''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请人姓名" v-else>{{formData.userName}}</el-descriptions-item>
</template>
<el-descriptions-item label="性别">
<el-form-item label="性别">
<el-input readonly v-model="formData.sex"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="年龄">
<el-form-item label="年龄">
<el-input readonly v-model="formData.age"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所在单位">
<el-form-item label="所在单位">
<el-input readonly v-model="formData.unitName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号">
<el-form-item label="身份证号" prop="idCard">
<el-input clearable v-model="formData.idCard" placeholder="请输入身份证号"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="累计补助金额">
<el-form-item label="累计补助金额" prop="medicalSubsidyMoney">
<el-input readonly v-model="formData.medicalSubsidyMoney"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请次数">
<el-form-item label="申请次数">
<el-input readonly v-model="formData.applyNum"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭住址" :span="2">
<el-form-item label="家庭住址" prop="homeAddress">
<el-input placeholder="请填写家庭住址" v-model="formData.homeAddress"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item label="联系电话" prop="mobile">
<el-input placeholder="请填写联系电话" v-model="formData.mobile"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="上年总收入">
<el-form-item label="上年总收入" prop="familyIncome">
<el-input-number :min="0" placeholder="请填写上年总收入"
v-model="formData.familyIncome"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="报销类型">
<el-form-item label="报销类型" prop="subsidyType">
<el-radio-group v-model="formData.subsidyType">
<el-radio-button :label="i" v-for="i in subsidyTypeList" :key="i">
{{i}}
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="疾病种类" :span="3">
<el-form-item label="疾病种类" prop="diseaseId">
<el-select clearable placeholder="请选择疾病种类"
v-model="formData.diseaseId" filterable @change="diseaseIdChange">
<el-option
:key="i.id"
:label="i.diseaseName"
:value="i.id"
v-for="i in diseaseList">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="备注" :span="3">
<el-form-item label="备注" prop="note">
<el-input clearable maxlength="100" placeholder="请输入具体病情说明,不要超过100字"
rows="3" type="textarea" v-model="formData.note">
</el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<el-form-item label="附件" prop="files">
<file-upload :value.sync="formData.files"
upload_mode="drag"
:upload_number="50"
:upload_size="1024 * 1024 * 20"
upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
<table-tool label="住院记录"></table-tool>
<el-table :data="formData.costList" border show-summary class="cost">
<el-table-column label="序号" type="index" width="50px" fixed></el-table-column>
<el-table-column label="住院时间段" width="300">
<template v-slot="{row,$index}">
<el-form-item label-width="0"
label="住院时间段"
:prop="'costList.'+$index+'.visitTime'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-date-picker
style="width: 100%"
format="yyyy-MM-dd"
placeholder="选择住院时间段"
type="daterange"
v-model="row.visitTime"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="住院医院" width="200">
<template v-slot="{row,$index}">
<el-form-item label-width="0"
label="住院医院"
:prop="'costList.'+$index+'.visitHospital'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input placeholder="住院医院" v-model="row.visitHospital"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="住院医疗费总额(不含门诊)" width="180" prop="hospitalSumMoney">
<template v-slot="{row}">
<el-input-number placeholder="住院医疗费总额(不含门诊)"
:min="0"
controls-position="right" style="width: 100%"
v-model="row.hospitalSumMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="实际报销金额" width="180" prop="reimbursementMoney">
<template v-slot="{row}">
<el-input-number placeholder="实际报销金额"
:min="0"
controls-position="right" style="width: 100%"
v-model="row.reimbursementMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="(住院医疗)允许报销范围内个人承担部分金额"
width="180" prop="singleBearMoney">
<template v-slot="{row}">
<el-input-number :min="0" placeholder="个人承担部分金额"
controls-position="right" style="width: 100%"
v-model="row.singleBearMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="(住院医疗)自费部分金额" width="180" prop="personExpenseMoney">
<template v-slot="{row}">
<el-input-number placeholder="自费部分金额"
:min="0"
controls-position="right"
disabled style="width: 100%"
v-model="row.personExpenseMoney = calcPersonExpenseMoney(row)"></el-input-number>
</template>
</el-table-column>
<el-table-column label="重病门诊自费金额" width="180" prop="outpatientServiceMoney">
<template v-slot="{row}">
<el-input-number placeholder="门诊费"
:min="0"
:disabled="!formData.isMajorDiseases"
controls-position="right" style="width: 100%"
v-model="row.outpatientServiceMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="非住院肾衰竭治疗、靶向药" width="180" prop="bxyMoney">
<template v-slot="{row}">
<el-input-number placeholder="靶向药"
:min="0"
:disabled="!formData.isMajorDiseases"
controls-position="right" style="width: 100%"
v-model="row.bxyMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" fixed="right">
<template slot="header" slot-scope="scope">
<el-button type="primary" @click="formData.costList.push({
hospitalSumMoney:0,
reimbursementMoney:0,
singleBearMoney:0,
outpatientServiceMoney:0,
bxyMoney:0,
})" size="mini">增加
</el-button>
</template>
<template v-slot="scope">
<el-button @click="formData.costList.splice(scope.$index,1)" icon="el-icon-delete" size="mini"
type="danger">
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<template slot="footer">
<el-button type="primary" plain @click="onSave" :loading="formLoading">保存</el-button>
<el-button type="primary" @click="onSubmit" v-if="!taskId" :loading="formLoading">提交</el-button>
<el-button type="primary" @click="onFinishTask" v-else :loading="formLoading">提交</el-button>
</template>
</custom-card>
<el-dialog :visible.sync="tipsDialog" title="申请补助须知" top="50px" width="60%">
<p>
1.享受公费医疗的互助基金会员患本办法所列疾病,住院治疗期间发生的医疗费经校医院审核并报销后,个人承担费用(不含国家规定应该由个人支付的费用)年度累计超过
5000 元者,可申请并获得补助。
</p>
<p>
2.参加社会医疗保险的互助基金会员患本办法所列疾病,住院治疗期间发生的医疗费经社会医疗保险机构报销后,并经校医院审核,个人承担费用(不含国家规定应该由个人支付的费用)年度累计超过
5000 元者,可申请并获得补助。
</p>
<p>
3.互助基金会员患不属于本办法所列重大疾病目录中费用支出较大的疾病,经住院治疗、且经公费医疗或社会医疗保险报销后,单次住院个人承担费用(不含国家规定应该由个人支付的费用)超过
10000
元(年度不累计)者,也可申请并获得补助。
</p>
<ul class="list-group" style="max-height: 450px;overflow-y: scroll">
<li class="list-group-item" v-for="i in diseaseList">{{i.diseaseName}}</li>
</ul>
<el-row class="mt25" justify="center" type="flex">
<el-button @click="tipsDialog=false" type="primary">我已知晓</el-button>
</el-row>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
mixins: [initTableMixins],
data() {
return {
tipsDialog: false,
diseaseList: [],
userOptions: [],
subsidyTypeList: ['公费医疗', '社会保险'],
formRules: {
userId: [{required: true, message: '请选择用户', trigger: 'blur'}],
homeAddress: [{required: true, message: '请填写家庭住址', trigger: 'blur'}],
familyIncome: [{required: true, message: '请填写上年总收入', trigger: 'blur'}],
subsidyType: [{required: true, message: '请选择报销类型', trigger: 'blur'}],
diseaseId: [{required: true, message: '请选择疾病种类', trigger: 'blur'}],
mobile: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
files: [{required: true, message: '请上传附件', trigger: 'blur'}],
},
formData: {
costList: []
},
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
medicalSetting: {}
}
},
methods: {
getMedicalSetting() {
this.$axios.post("/platform/medicalMutualAid/medical/basicSetting/getSetting").then(res => {
if (res.code === 0) {
this.medicalSetting = res.data
}
})
},
// 获取累计补助金额
getMedicalSubsidyMoney(userId) {
this.$axios.post(loc() + "/getMedicalSubsidyMoney", {userId}).then(res => {
if (res.code === 0) {
if (res.data.medicalSubsidyMoney !== null) {
this.$set(this.formData, 'medicalSubsidyMoney', res.data.medicalSubsidyMoney + this.medicalSetting.loveMoney)
} else {
this.$set(this.formData, 'medicalSubsidyMoney', 0)
}
}
})
},
// 获取补助申请次数
getMedicalApplyNum(userId) {
this.$axios.post(loc() + "/getMedicalApplyNum", {userId}).then(res => {
if (res.code === 0) {
this.$set(this.formData, 'applyNum', res.data)
}
})
},
diseaseIdChange(val) {
const disease = this.diseaseList.find(i => i.id === val)
if (disease) {
this.$set(this.formData, 'isMajorDiseases', disease.isMajorDiseases)
} else {
this.$set(this.formData, 'isMajorDiseases', false)
}
},
// 计算每个表格中的自费部分金额
calcPersonExpenseMoney(row) {
// fix 2025-11-16 个人自费金额 计算需要减去靶向药
// const mz = isNaN(row.outpatientServiceMoney) ? 0 : row.outpatientServiceMoney
// const personExpenseMoney = (this.formData.majorDisease ? (mz + row.hospitalSumMoney) : row.hospitalSumMoney) - row.reimbursementMoney - row.singleBearMoney - row.bxyMoney
//自费部分金额=住院医疗费总额(不含门诊)-实际报销金额-个人承担部分金额 zhf 2025-11-17
const personExpenseMoney = row.hospitalSumMoney - row.reimbursementMoney - row.singleBearMoney
return isNaN(personExpenseMoney) ? 0 : personExpenseMoney < 0 ? 0 : personExpenseMoney.toFixed(2)
},
async userChange(val) {
const user = this.userOptions.find(u => u.id === val)
this.$set(this.formData, 'sex', user.sex)
if (user.birthday) {
this.$set(this.formData, 'age', this.$moment().diff(user.birthday, 'years'))
}
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'idCard', user.idCard)
this.$set(this.formData, 'homeAddress', user.homeAddress)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'userId', user.id)
this.getMedicalSubsidyMoney(this.formData.userId)
this.getMedicalApplyNum(this.formData.userId)
this.getIsAfootMedicalApply(this.formData.userId, null)
},
onSave() {
this.$confirm("保存后可在我的补助申请页面继续填写然后提交,是否保存?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.formLoading = true
//判断每个住院记录中是否有开始时间和结束时间
this.formData.costList.forEach(cost => {
if (cost.visitTime && cost.visitTime.length > 0) {
cost.visitStartTime = cost.visitTime[0]
cost.visitEndTime = cost.visitTime[1]
}
})
this.$axios.post("/platform/medicalMutualAid/medical/apply/save", {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
commonUtil.pjaxPush("/platform/medicalMutualAid/medical/mine")
}
}).finally(() => {
this.formLoading = false
})
})
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (this.formData.costList.length === 0) {
this.$message.error("请添加住院记录!")
return
}
if (!this.validateIsMajorDiseases()) {
this.$alert('您的个人承担部分金额达不到补助标准,无法申请!', '提示', {
confirmButtonText: '确定',
callback: action => {
}
});
return;
}
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/medical/apply/submit", {
data: JSON.stringify(this.formData)
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush("/platform/medicalMutualAid/medical/mine")
}
})
})
}
})
},
onFinishTask() {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (this.formData.costList.length === 0) {
this.$message.error("请添加住院记录!")
return
}
if (!this.validateIsMajorDiseases()) {
this.$alert('您的个人承担部分金额达不到补助标准,无法申请!', '提示', {
confirmButtonText: '确定',
callback: action => {
}
});
return;
}
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/medical/apply/submitAgain", {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush("/platform/medicalMutualAid/medical/mine")
}
})
})
}
})
},
// 判断个人承担部分金额有没有达到标准,true不能申请,false可以申请
validateIsMajorDiseases() {
let flag = true
if (this.formData.isMajorDiseases) {
const singleBearMoneyList = this.formData.costList.map(cost => cost.singleBearMoney)
const allSingleBearMoney = singleBearMoneyList.reduce((a, b) => {
return parseFloat(a) + parseFloat(b)
})
if (this.formData.subsidyType === '公费医疗' && allSingleBearMoney < this.medicalSetting.publicYearInDiseaseMoney) {
flag = false
} else if (this.formData.subsidyType === '社会保险' && allSingleBearMoney < this.medicalSetting.socialYearInDiseaseMoney) {
flag = false
}
if (this.formData.applyNum === 1) {
flag = true
}
} else {
if (this.formData.costList.some(v => v.singleBearMoney < this.medicalSetting.ordinaryOnceNotInDiseaseMoney)) {
flag = false
}
}
return flag
},
async createRemoteMethod(keyword) {
try {
const resp = await this.$axios.post(loc() + "/getSubsidyUser", {keyword})
if (resp.code === 0) {
this.userOptions = resp.data;
}
} catch (e) {
this.$message.error(e.msg)
}
},
getDiseaseList() {
this.$axios.post("/platform/medicalMutualAid/medical/apply/getDiseaseList").then(res => {
if (res.code === 0) {
this.diseaseList = res.data;
}
})
},
async init() {
this.getMedicalSetting()
if (this.bizId) {
this.getIsAfootMedicalApply(this.$store.state.user.id, this.bizId)
this.$axios.post("/platform/medicalMutualAid/medical/mine/info", {id: this.bizId}).then((res) => {
if (res.code === 0) {
res.data.costList.forEach(cost => {
if (cost.visitStartTime) {
cost.visitTime = [cost.visitStartTime, cost.visitEndTime]
}
})
this.createRemoteMethod(res.data.userId)
this.formData = res.data
this.diseaseIdChange(res.data.diseaseId)
}
})
} else {
await this.createRemoteMethod(this.$store.state.user.id)
this.$set(this.formData, 'sex', this.$store.state.user.sex)
this.$set(this.formData, 'userName', this.$store.state.user.username)
if (this.$store.state.user.birthday) {
this.$set(this.formData, 'age', this.$moment().diff(this.$store.state.user.birthday, 'years'))
}
this.$set(this.formData, 'unitName', this.$store.state.user.unit.name)
this.$set(this.formData, 'idCard', this.$store.state.user.idCard)
this.$set(this.formData, 'homeAddress', this.$store.state.user.homeAddress)
this.$set(this.formData, 'mobile', this.$store.state.user.mobile)
this.$set(this.formData, 'userId', this.$store.state.user.id)
this.getMedicalSubsidyMoney(this.formData.userId)
this.getMedicalApplyNum(this.formData.userId)
this.getIsAfootMedicalApply(this.$store.state.user.id, null)
}
},
// 查询是否有进行中的申请
getIsAfootMedicalApply(userId, id) {
this.$axios.post("/platform/medicalMutualAid/medical/apply/getIsAfootMedicalApply", {
userId,
id
}).then(res => {
if (res.code === 0) {
}
}).catch(e => {
this.formData = {}
this.$alert(e.msg, '温馨提示', {
confirmButtonText: '确定',
callback: action => {
commonUtil.pjaxPush("/platform/medicalMutualAid/medical/mine")
}
});
})
}
},
created() {
this.getDiseaseList()
this.init()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,134 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<div style="max-width: 900px; margin: 0 auto;">
<custom-card>
<el-form :model="formData" label-suffix="" ref="formRef" label-width="250px">
<el-form-item label="公费医疗年度补助标准(重疾)" prop="publicYearInDiseaseMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.publicYearInDiseaseMoney"></el-input-number>
</el-form-item>
<el-form-item label="社保年度补助标准(重疾)" prop="socialYearInDiseaseMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.socialYearInDiseaseMoney"></el-input-number>
</el-form-item>
<el-form-item label="单次补助标准(普疾)" prop="ordinaryOnceNotInDiseaseMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.ordinaryOnceNotInDiseaseMoney"></el-input-number>
</el-form-item>
<el-form-item label="爱心互助基金补助标准" prop="loveMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.loveMoney"></el-input-number>
</el-form-item>
<el-form-item label="补助比例" prop="subsidyRatio">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.subsidyRatio"></el-input-number>
</el-form-item>
<el-form-item label="每年补助限额(重疾)" prop="maxYearInDiseaseMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.maxYearInDiseaseMoney"></el-input-number>
</el-form-item>
<el-form-item label="每年补助限额(普疾)" prop="maxYearNotInDiseaseMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.maxYearNotInDiseaseMoney"></el-input-number>
</el-form-item>
<el-form-item label="共计补助限额" prop="previousYearMaxMoney">
<el-input-number :max="500000" :min="0" style="width: 100%"
v-model="formData.previousYearMaxMoney"></el-input-number>
</el-form-item>
<el-form-item label="超过共计补助限额后每年限额" prop="beyondMaxQuotaMoney">
<el-input-number :max="100000" :min="0" style="width: 100%"
v-model="formData.beyondMaxQuotaMoney"></el-input-number>
</el-form-item>
<el-form-item label="十年未申请首次补助比例增加" prop="tenYearNeverAddSubsidyRatio">
<el-input-number :max="100" :min="0" style="width: 100%"
v-model="formData.tenYearNeverAddSubsidyRatio"></el-input-number>
</el-form-item>
<el-form-item label="十五年未补助首次申请比例增加" prop="fifteenYearNeverAddSubsidyRatio">
<el-input-number :max="100" :min="0" style="width: 100%"
v-model="formData.fifteenYearNeverAddSubsidyRatio"></el-input-number>
</el-form-item>
</el-form>
<template slot="footer">
<el-button type="primary" @click="doSubmit">确定</el-button>
</template>
</custom-card>
</div>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {}
},
methods: {
doSubmit() {
this.$refs.formRef.validate(valid => {
if (valid) {
this.$axios.post(loc() + "/doSubmit", this.formData).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
this.initData()
}
})
}
})
},
initData() {
this.$axios.post(loc() + "/getSetting").then(res => {
if (res.code === 0) {
if (res.data == null) {
this.formData = {
publicYearInDiseaseMoney: 0,
socialYearInDiseaseMoney: 0,
ordinaryOnceNotInDiseaseMoney: 0,
loveMoney: 0,
subsidyRatio: 0,
maxYearInDiseaseMoney: 0,
maxYearNotInDiseaseMoney: 0,
previousYearMaxMoney: 0,
}
} else {
this.formData = res.data
}
}
})
}
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,352 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#calcSubsidyTable .el-button--text i {
font-size: 20px !important;
}
#calcSubsidyTable .el-col .symbol {
display: flex;
justify-content: center;
font-size: 30px;
}
</style>
<div id="app">
<custom-card>
<div id="calcSubsidyTable" v-loading="formLoading">
<div class="process-title">1.输入金额(元)</div>
<el-row :gutter="20">
<el-col :span="6">
<el-input placeholder="本年度收入累计总额" readonly v-model="inComeSum" style="width: 100%">
<template slot="prepend">本年度收入累计总额</template>
</el-input>
</el-col>
<el-col :span="1">
<span class="symbol">=</span>
</el-col>
<el-col :span="5">
<el-input readonly v-model.number="calcData.aidFundMoney">
<template slot="prepend">年度缴费总额</template>
</el-input>
</el-col>
<el-col :span="1">
<span class="symbol">+</span>
</el-col>
<el-col :span="5">
<el-input @blur="(e)=>{grantOrIntoChange('grants',e.target.value)}"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="calcData.schoolGrants">
<template slot="prepend">学校拨款金额</template>
</el-input>
</el-col>
<el-col :span="1">
<span class="symbol">+</span>
</el-col>
<el-col :span="5">
<el-input @blur="(e)=>{grantOrIntoChange('into',e.target.value)}"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="calcData.unionInto">
<template slot="prepend">工会转入</template>
</el-input>
</el-col>
</el-row>
<el-row :gutter="20" class="mt20">
<el-col :span="6">
<el-input readonly v-model="applyLoveSum">
<template slot="prepend">本年度申请费用总额</template>
</el-input>
</el-col>
<el-col :span="1">
<span class="symbol">=</span>
</el-col>
<el-col :span="5">
<el-input readonly v-model="calcData.applySum">
<template slot="prepend">申请金额合计</template>
</el-input>
</el-col>
<el-col :span="1">
<span class="symbol">+</span>
</el-col>
<el-col :span="5">
<el-input readonly v-model="calcData.loveSubsidyMoney">
<template slot="prepend">爱心补助合计</template>
</el-input>
</el-col>
</el-row>
<el-divider></el-divider>
<div class="process-title">2.预测收支占比</div>
<el-row :gutter="20">
<el-col :span="12">
<el-progress :percentage="payThanInCome" type="circle"
style="display: flex;justify-content: center;"></el-progress>
<div style="text-align: center;font-size: 17px;">
预测总额(ps:预测补助金额+爱心补助金额)/本年度收入累计总额
</div>
</el-col>
<el-col :span="12">
<div style="text-align: center;font-size: 17px;">
<div>
<span>本年度实际补助总金额:</span>
<span>{{parseFloat(tableSummaries[tableSummaries.length-1]) + calcData.loveSubsidyMoney}}元
</span>
</div>
<div>
<span>医疗补助合计:</span>
<span>{{tableSummaries[tableSummaries.length-1]}}元
</span>
</div>
<div>
<span>爱心补助合计:</span>
<span>{{calcData.loveSubsidyMoney}}元
</span>
</div>
<div>
<span>本年度结余:</span>
<span>{{inComeSum - (parseFloat(tableSummaries[tableSummaries.length-1]) +
calcData.loveSubsidyMoney)}}元
</span>
</div>
<div>
<span>累计结余:</span>
<span>{{inComeSum + calcData.balanceMoney -
(parseFloat(tableSummaries[tableSummaries.length-2]) + calcData.loveSubsidyMoney)}}元
</span>
</div>
</div>
</el-col>
</el-row>
<el-divider></el-divider>
<div class="process-title">3.测算补助金额</div>
<el-row :gutter="20">
<el-col>
<el-slider @change="getApplyData" show-input v-model="ratio"></el-slider>
</el-col>
</el-row>
<el-table :data="applyListData" ref="table" row-key="id" style="width: 100%"
:summary-method="getSummaries" show-summary>
<el-table-column type="index" width="50px" label="序号"
fixed="left"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:fixed="column.fixed"
:sortable="column.sortable"
show-overflow-tooltip
sortable
v-for="column in tableColumns"
>
<template v-if="column.prop==='isMajorDiseases'" v-slot="{row}">
<span :class="[row.isMajorDiseases?'text-danger':'text-info']">
<i class="fa fa-circle ml5"></i>
{{row.isMajorDiseases?'是':'否'}}{{row.applyNum}}
</span>
</template>
</el-table-column>
<el-table-column :label="'按'+ratio+'%补助金额'" fixed="right" min-width="150px"
prop="forecastSubsidyMoney"
show-overflow-tooltip sortable>
<template slot-scope="{row}">
<el-input oninput="value=value.replace(/[^\d]/g,'')"
v-model="row.forecastSubsidyMoney"></el-input>
</template>
</el-table-column>
<el-table-column label="以往累计补助金额" prop="medicalSubsidyMoney" fixed="right" show-overflow-tooltip
sortable
width="110px">
</el-table-column>
</el-table>
</div>
<template slot="footer">
<el-button type="primary" @click="doExport" :loading="formLoading">导出测算补助金额</el-button>
<el-button type="primary" @click="doHandle" :loading="formLoading">按{{ratio+'%'}}比例分配</el-button>
</template>
</custom-card>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
calcData: {
aidFundMoney: 0,
schoolGrants: 0,
balanceMoney: 0,
unionInto: 0,
applySum: 0,
ratio: 0
},
ratio: 60,
medicalSetting: {},
applyListData: [],
tableSummaries: [],
tableColumns: [
{prop: 'loginname', label: '工号', fixed: "left"},
{prop: 'username', label: '姓名', fixed: "left"},
{prop: 'unionName', label: '所属工会', width: "180"},
{prop: 'unitName', label: '所属单位', width: "180"},
{prop: 'diseaseName', label: '疾病种类', width: "180"},
{prop: 'isMajorDiseases', label: '重大疾病(次数)', width: "100"},
{prop: 'applyNum', label: '申请总次数'},
{prop: 'applyTime', label: '申请时间', width: "180"},
{prop: 'aidFundDeductTime', label: '起扣时间', width: "100"},
{prop: 'yearsSinceDeduct', label: '缴费年数', width: "100"},
{prop: 'hospitalSumMoney$', label: '住院医疗总额(不含门诊)', width: "120"},
{prop: 'reimbursementMoney$', label: '实际报销总额', width: "120"},
{prop: 'singleBearMoney$', label: '(住院医疗)允许报销范围内个人承担部分总额', width: "120"},
{prop: 'personExpenseMoney$', label: '(住院医疗)自费部分总额', width: "120"},
{prop: 'outpatientServiceMoney$', label: '重病门诊自费金额', width: "120"},
{prop: 'bxyMoney$', label: '非住院肾衰竭治疗、靶向药金额', width: "120"},
{prop: 'totalMoney', label: '合计金额', width: "120"},
{prop: 'loveSubsidyMoney', label: '爱心补助', width: "120"},
{prop: 'forecastSubsidyMoney', label: '当前补助金额', width: "120"},
],
}
},
computed: {
//申请费用总额
applyLoveSum() {
const {applySum, loveSubsidyMoney} = this.calcData
const applyLoveSum = applySum + loveSubsidyMoney
return isNaN(applyLoveSum) ? 0 : applyLoveSum.toFixed(2)
},
inComeSum() {
const {aidFundMoney, schoolGrants, balanceMoney, unionInto} = this.calcData
return aidFundMoney + schoolGrants + unionInto
},
//预测支出/总收入
payThanInCome() {
const loveMoney = parseFloat(this.tableSummaries.slice(15, 16)[0])
const bzMoney = parseFloat(this.tableSummaries.slice(-1)[0])
const num = parseFloat(bzMoney) + parseFloat(loveMoney);
const total = parseFloat(this.inComeSum);
if (isNaN(num) || isNaN(total)) {
return 0;
}
const progress = total <= 0 ? 0 : (Math.round(num / total * 10000) / 100.00)
return progress > 100 ? 100 : progress
},
},
methods: {
async grantOrIntoChange(key, val) {
if (val === '') {
if (key === 'grants') {
this.calcData.schoolGrants = 0
} else if (key === 'into') {
this.calcData.unionInto = 0
}
}
const resp = await this.$axios.post(loc() + '/setGrantsOrUnionInto', {keys: key, value: val})
},
getSummaries(param) {
const {columns, data} = param
const sums = []
columns.forEach((column, index) => {
const sumColumn = ['hospitalSumMoney$', 'reimbursementMoney$', 'singleBearMoney$', 'personExpenseMoney$'
, 'subsidyMoney', 'loveSubsidyMoney', 'outpatientServiceMoney$'
, 'totalMoney', 'loveSubsidyMoney', 'forecastSubsidyMoney']
if (sumColumn.includes(column.property)) {
const values = data.map(i => Number(i[column.property]))
if (values && values.length > 0) {
const everyColumnSum = values.reduce((a, b) => a + b)
sums[index] = isNaN(everyColumnSum) ? 0 : everyColumnSum.toFixed(2)
}
}
})
sums[0] = '合计'
this.tableSummaries = sums
return sums
},
doExport() {
this.$downLoad("/platform/medicalMutualAid/medical/calculateMoney/doExport", {
ratio: this.ratio})
},
doHandle() {
this.$confirm('确定要按此比例来补助吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/medical/calculateMoney/doHandle", {
data: JSON.stringify(this.applyListData),
ratio: this.ratio,
aidFund: this.calcData.aidFundMoney,
inComeSum: this.inComeSum,
loveSubsidyMoney: this.calcData.loveSubsidyMoney
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
this.getData()
this.getApplyData()
}
})
})
},
async getMedicalSetting() {
try {
const res = await this.$axios.post("/platform/medicalMutualAid/medical/basicSetting/getSetting")
if (res.code === 0) {
this.medicalSetting = res.data
}
} catch (e) {
this.$message.error(e.message)
}
},
getData() {
this.formLoading = true
this.$axios.post("/platform/medicalMutualAid/medical/calculateMoney/getData").then(res => {
if (res.code === 0) {
if (res.data.ratio) {
this.ratio = res.data.ratio
} else {
this.ratio = this.medicalSetting.subsidyRatio
}
this.calcData = res.data
this.getApplyData()
}
}).finally(()=>{
this.formLoading=false
})
},
getApplyData() {
this.$axios.post("/platform/medicalMutualAid/medical/calculateMoney/getApplyData", {ratio: this.ratio}).then(res => {
if (res.code === 0) {
this.applyListData = res.data
}
})
},
},
async created() {
await this.getMedicalSetting()
this.getData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,141 @@
const MEDICAL_INFO = {
template: /*language=HTML*/
`
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="申请人姓名">{{ viewData.userName }}{{viewData.loginName}}
</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="年龄">{{ viewData.age }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="身份证号">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="累计补助金额">{{ viewData.medicalSubsidyMoney }}</el-descriptions-item>
<el-descriptions-item label="起扣时间">{{ viewData.aidFundDeductTime }}</el-descriptions-item>
<el-descriptions-item label="所在单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="所在工会">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="疾病种类">{{ viewData.diseaseName }}</el-descriptions-item>
<el-descriptions-item label="重大疾病(次数)">
<span :class="[viewData.isMajorDiseases?'text-danger':'text-info']">
<i class="fa fa-circle ml5"></i>
{{viewData.isMajorDiseases?'是':'否'}}{{viewData.applyNum}}
</span>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="备注" :span="3">
<div style="white-space: pre-line">{{viewData.note}}</div>
</el-descriptions-item>
<el-descriptions-item label="住院记录" :span="3">
<el-table :data="viewData.costList" border show-summary>
<el-table-column label="序号" type="index" width="50px" fixed></el-table-column>
<el-table-column label="住院时间段" width="200">
<template v-slot="{row}">
{{row.visitStartTime}}至{{row.visitEndTime}}
</template>
</el-table-column>
<el-table-column label="住院医院" prop="visitHospital" width="250"></el-table-column>
<el-table-column label="住院医疗费总额(不含门诊)" prop="hospitalSumMoney"></el-table-column>
<el-table-column label="实际报销金额" prop="reimbursementMoney"></el-table-column>
<el-table-column label="(住院医疗)允许报销范围内个人承担部分金额"
prop="singleBearMoney"></el-table-column>
<el-table-column label="(住院医疗)自费部分金额" prop="personExpenseMoney"></el-table-column>
<el-table-column label="重病门诊自费金额" prop="outpatientServiceMoney"></el-table-column>
<el-table-column label="非住院肾衰竭治疗、靶向药" prop="bxyMoney"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview :files="viewData.files" complete_result></file-preview>
</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.taskName==='39916c1e-857d-407d-86c1-678ccf3011bc'"
:span="3">{{
task.taskFormData.diseaseDetailName }}
</el-descriptions-item>
<template v-if="task.taskName==='cd560356-cc70-48b5-8d99-ff9bd3505869'">
<el-descriptions-item label="预测补助金额" :span="3">
{{
task.taskFormData.tf_forecastSubsidyMoney }}
</el-descriptions-item>
<el-descriptions-item label="爱心基金(元)" :span="3">
{{
task.taskFormData.tf_loveSubsidyMoney }}
</el-descriptions-item>
</template>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode" :span="3">{{
task.taskFormData.opinion }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
viewData: {},
doneTasks: [],
row: null
}
},
methods: {
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
this.getDoneTasks()
},
getInfo() {
this.$axios.post('/platform/medicalMutualAid/medical/mine/info', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart() {
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
}
}
@@ -0,0 +1,111 @@
const MEDICAL_TABLE = {
template: /*language=HTML*/
`
<div>
<el-table :data="localTableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%"
:summary-method="getSummaries" :show-summary="showSummary">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"
fixed="left"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:fixed="column.fixed"
:sortable="column.sortable"
show-overflow-tooltip
sortable
v-for="column in tableColumns"
>
<template v-if="column.prop==='isMajorDiseases'" v-slot="{row}">
<span :class="[row.isMajorDiseases?'text-danger':'text-info']">
<i class="fa fa-circle ml5"></i>
{{row.isMajorDiseases?'是':'否'}}{{row.applyNum}}
</span>
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
<template v-slot="{ row }" v-else-if="column.prop === 'curTaskName'">
{{row.curTaskName?row.curTaskName:row.taskName}}
</template>
</el-table-column>
<slot name="operation"></slot>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</div>
`,
props: {
localTableData: {
type: Array,
default: []
},
showSummary: {
type: Boolean,
default: false
},
localPageForm:{
type: Object,
default: () => {
return {}
}
}
},
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'loginname', label: '工号', fixed: "left"},
{prop: 'username', label: '姓名', fixed: "left"},
{prop: 'unionName', label: '所属工会', width: "180"},
{prop: 'unitName', label: '所属单位', width: "180"},
{prop: 'diseaseName', label: '疾病种类', width: "180"},
{prop: 'isMajorDiseases', label: '重大疾病(次数)', width: "100"},
{prop: 'applyNum', label: '申请总次数'},
{prop: 'applyTime', label: '申请时间', width: "180"},
{prop: 'hospitalSumMoney$', label: '住院医疗总额(不含门诊)', width: "120"},
{prop: 'reimbursementMoney$', label: '实际报销总额', width: "120"},
{prop: 'singleBearMoney$', label: '(住院医疗)允许报销范围内个人承担部分总额', width: "120"},
{prop: 'personExpenseMoney$', label: '(住院医疗)自费部分总额', width: "120"},
{prop: 'outpatientServiceMoney$', label: '重病门诊自费金额', width: "120"},
{prop: 'bxyMoney$', label: '非住院肾衰竭治疗、靶向药金额', width: "120"},
{prop: 'totalMoney', label: '合计金额', width: "120"},
{prop: 'curTaskName', label: '当前节点', width: "120"},
{prop: 'instanceState', label: '流程状态'},
],
}
},
methods: {
getSummaries(param) {
const {columns, data} = param
const sums = []
columns.forEach((column, index) => {
const sumColumn = ['hospitalSumMoney$', 'reimbursementMoney$', 'singleBearMoney$', 'personExpenseMoney$', 'subsidyMoney', 'loveSubsidyMoney', 'outpatientServiceMoney$', 'totalMoney']
if (sumColumn.includes(column.property)) {
const values = data.map(i => Number(i[column.property]))
if (values && values.length > 0) {
const everyColumnSum = values.reduce((a, b) => a + b)
sums[index] = isNaN(everyColumnSum) ? 0 : everyColumnSum.toFixed(2)
}
}
})
sums[0] = '合计'
return sums
},
},
created() {
this.$emit('ready')
},
watch: {
"localPageForm": {
handler(val) {
this.pageForm = {...this.pageForm, ...val}
},
deep: true
},
}
}
@@ -0,0 +1,418 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.medical-dashboard {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 180px 1fr 1fr;
gap: 20px;
width: 100%;
min-height: calc(100vh - 126px);
box-sizing: border-box;
}
.dashboard-card {
background: #ffffff;
border-radius: 8px;
overflow: hidden;
display: flex;
flex-direction: column;
border: 1px solid #eef1f6;
}
.dashboard-title {
padding: 16px 20px 8px;
font-size: 16px;
font-weight: 600;
color: #333333;
border-bottom: 1px solid #f0f2f5;
flex-shrink: 0;
}
.overview-card {
padding: 20px;
box-sizing: border-box;
justify-content: space-between;
}
.overview-label {
font-size: 14px;
color: #7a7f87;
line-height: 1;
}
.overview-value {
font-size: 34px;
font-weight: 700;
color: #1f6f5f;
line-height: 1.2;
margin-top: 18px;
}
.overview-sub {
font-size: 13px;
color: #949aa3;
line-height: 1.6;
margin-top: auto;
}
.wide-panel {
grid-column: span 2;
min-height: 0;
}
.full-panel {
grid-column: 1 / -1;
min-height: 0;
}
.chart-panel {
min-height: 0;
}
.table-panel {
min-height: 0;
}
.panel-body {
flex: 1;
min-height: 0;
padding: 12px 16px 16px;
}
.chart-box {
width: 100%;
height: 100%;
min-height: 260px;
}
.money-text {
color: #cf6a32;
}
@media (max-width: 1400px) {
.medical-dashboard {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 180px) auto auto auto;
}
.wide-panel {
grid-column: span 2;
}
.full-panel {
grid-column: 1 / -1;
}
}
@media (max-width: 768px) {
.medical-dashboard {
grid-template-columns: 1fr;
grid-template-rows: repeat(4, 160px) auto auto auto;
gap: 15px;
}
.wide-panel {
grid-column: span 1;
}
.full-panel {
grid-column: span 1;
}
.overview-value {
font-size: 28px;
}
.chart-box {
min-height: 220px;
}
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<div class="medical-dashboard">
<div class="dashboard-card overview-card" v-loading="loading.overview">
<div class="overview-label">基金会员总数</div>
<div class="overview-value">{{ overview.fundMemberCount || 0 }}</div>
<div class="overview-sub">
本年度申请数:{{ overview.currentYearApplyCount || 0 }}
</div>
</div>
<div class="dashboard-card overview-card" v-loading="loading.overview">
<div class="overview-label">重疾 / 普疾申请数</div>
<div class="overview-value">{{ overview.majorDiseaseApplyCount || 0 }} / {{ overview.commonDiseaseApplyCount || 0 }}</div>
<div class="overview-sub">
统计口径:流程已办结
</div>
</div>
<div class="dashboard-card overview-card" v-loading="loading.overview">
<div class="overview-label">补助金额合计</div>
<div class="overview-value money-text">{{ formatMoney(overview.totalSubsidyMoney) }}</div>
<div class="overview-sub">
单位:元
</div>
</div>
<div class="dashboard-card overview-card" v-loading="loading.overview">
<div class="overview-label">爱心基金合计</div>
<div class="overview-value money-text">{{ formatMoney(overview.totalLoveSubsidyMoney) }}</div>
<div class="overview-sub">
单位:元
</div>
</div>
<div class="dashboard-card wide-panel table-panel">
<div class="dashboard-title">各工会医疗互助统计表</div>
<div class="panel-body" v-loading="loading.unionStat">
<el-table
:data="unionTableData"
:header-cell-style="{background:'#FAFAFA'}"
height="100%"
style="width: 100%">
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
<el-table-column prop="unionName" label="工会名称" min-width="180" show-overflow-tooltip></el-table-column>
<el-table-column prop="applyCount" label="申请数" width="100" align="center"></el-table-column>
<el-table-column label="补助金额" min-width="140" align="right">
<template slot-scope="{row}">
{{ formatMoney(row.subsidyMoney) }}
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="dashboard-card wide-panel chart-panel">
<div class="dashboard-title">在职状态分布</div>
<div class="panel-body" v-loading="loading.userStateStat">
<div id="userStateChart" class="chart-box"></div>
</div>
</div>
<div class="dashboard-card full-panel chart-panel">
<div class="dashboard-title">人员类型统计</div>
<div class="panel-body" v-loading="loading.personTypeStat">
<div id="personTypeChart" class="chart-box"></div>
</div>
</div>
<div class="dashboard-card full-panel">
<div class="dashboard-title">疾病类型统计</div>
<div class="panel-body" v-loading="loading.diseaseTypeStat">
<div id="diseaseTypeChart" class="chart-box"></div>
</div>
</div>
</div>
</guava>
</div>
<script nonce="${cspNonce!}">
const chartMap = {
userStateChart: null,
personTypeChart: null,
diseaseTypeChart: null
}
new Vue({
el: "#app",
data() {
return {
loading: {
overview: false,
unionStat: false,
userStateStat: false,
personTypeStat: false,
diseaseTypeStat: false
},
overview: {
fundMemberCount: 0,
currentYearApplyCount: 0,
majorDiseaseApplyCount: 0,
commonDiseaseApplyCount: 0,
totalSubsidyMoney: 0,
totalLoveSubsidyMoney: 0
},
unionTableData: [],
userStateData: [],
personTypeData: [],
diseaseTypeData: []
}
},
methods: {
formatMoney(value) {
if (value === null || value === undefined || value === "") {
return "0.00"
}
const num = Number(value)
if (isNaN(num)) {
return "0.00"
}
return num.toFixed(2)
},
getOverview() {
this.$set(this.loading, "overview", true)
this.$axios.post("/platform/medicalMutualAid/medical/dashboard/overview").then((res) => {
this.$set(this.loading, "overview", false)
if (res.code === 0) {
this.$set(this, "overview", res.data || {})
} else {
this.$message.warning(res.msg)
}
})
},
getUnionStat() {
this.$set(this.loading, "unionStat", true)
this.$axios.post("/platform/medicalMutualAid/medical/dashboard/unionStat").then((res) => {
this.$set(this.loading, "unionStat", false)
if (res.code === 0) {
const tableData = res.data && res.data.tableData ? res.data.tableData : []
this.$set(this, "unionTableData", tableData)
} else {
this.$message.warning(res.msg)
}
})
},
getUserStateStat() {
this.$set(this.loading, "userStateStat", true)
this.$axios.post("/platform/medicalMutualAid/medical/dashboard/userStateStat").then((res) => {
this.$set(this.loading, "userStateStat", false)
if (res.code === 0) {
this.$set(this, "userStateData", res.data || [])
this.renderUserStateChart()
} else {
this.$message.warning(res.msg)
}
})
},
getPersonTypeStat() {
this.$set(this.loading, "personTypeStat", true)
this.$axios.post("/platform/medicalMutualAid/medical/dashboard/personTypeStat").then((res) => {
this.$set(this.loading, "personTypeStat", false)
if (res.code === 0) {
this.$set(this, "personTypeData", res.data || [])
this.renderPersonTypeChart()
} else {
this.$message.warning(res.msg)
}
})
},
getDiseaseTypeStat() {
this.$set(this.loading, "diseaseTypeStat", true)
this.$axios.post("/platform/medicalMutualAid/medical/dashboard/diseaseTypeStat").then((res) => {
this.$set(this.loading, "diseaseTypeStat", false)
if (res.code === 0) {
this.$set(this, "diseaseTypeData", res.data || [])
this.renderDiseaseTypeChart()
} else {
this.$message.warning(res.msg)
}
})
},
renderUserStateChart() {
if (chartMap.userStateChart) {
chartMap.userStateChart.destroy()
}
chartMap.userStateChart = new G2Plot.Pie("userStateChart", {
data: this.userStateData,
angleField: "applyCount",
colorField: "name",
radius: 0.85,
label: {
type: "outer",
content: "{name} {percentage}"
},
legend: {
position: "bottom"
},
color: ["#1f6f5f", "#f59f45", "#5b8ff9", "#9270ca"]
})
chartMap.userStateChart.render()
},
renderPersonTypeChart() {
if (chartMap.personTypeChart) {
chartMap.personTypeChart.destroy()
}
chartMap.personTypeChart = new G2Plot.Column("personTypeChart", {
data: this.personTypeData,
autoFit: true,
xField: "name",
yField: "applyCount",
color: "#4e8f81",
columnStyle: {
radius: [6, 6, 0, 0]
},
label: {
position: "top",
style: {
fill: "#1f2d3d"
}
},
xAxis: {
label: {
autoHide: true,
autoRotate: false
}
},
meta: {
name: {
alias: "人员类型"
},
applyCount: {
alias: "申请数"
}
}
})
chartMap.personTypeChart.render()
},
renderDiseaseTypeChart() {
if (chartMap.diseaseTypeChart) {
chartMap.diseaseTypeChart.destroy()
}
chartMap.diseaseTypeChart = new G2Plot.Bar("diseaseTypeChart", {
data: this.diseaseTypeData,
autoFit: true,
xField: "applyCount",
yField: "name",
legend: false,
color: "#cf6a32",
barStyle: {
radius: [0, 6, 6, 0]
},
label: {
position: "right",
style: {
fill: "#1f2d3d"
}
},
meta: {
name: {
alias: "疾病类型"
},
applyCount: {
alias: "申请数"
}
}
})
chartMap.diseaseTypeChart.render()
},
initData() {
this.getOverview()
this.getUnionStat()
this.getUserStateStat()
this.getPersonTypeStat()
this.getDiseaseTypeStat()
}
},
mounted() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,121 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="疾病种类">
<el-input placeholder="请输入疾病种类" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="疾病种类">
<el-button @click="openAdd" size="small" type="primary">
新增疾病种类
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column label="编号" prop="diseaseCode"></el-table-column>
<el-table-column label="疾病种类" prop="diseaseName"></el-table-column>
<el-table-column label="是否重大疾病" prop="isMajorDiseases">
<template v-slot="{row}">
<el-tag v-if="row.isMajorDiseases" type="danger"></el-tag>
<el-tag v-else></el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="{row}">
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog :visible.sync="dialogVisible" title="新增" width="50%">
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-form-item label="疾病名称" prop="diseaseName">
<el-input maxlength="50" v-model="formData.diseaseName"></el-input>
</el-form-item>
<el-form-item label="编号" prop="diseaseCode">
<el-input max="128" v-model.number="formData.diseaseCode"></el-input>
</el-form-item>
<el-form-item label="是否重大疾病" prop="isMajorDiseases">
<el-radio-group v-model="formData.isMajorDiseases" size="small">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="dialogVisible=false">取消</el-button>
<el-button @click="doSubmit" class="ml10" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
dialogVisible: false,
rules: {
diseaseName: [{required: true, message: '请输入疾病名称', trigger: ['change', 'blur']}],
diseaseCode: [{required: true, message: '请输入疾病编号', trigger: ['change', 'blur']}]
},
}
},
methods: {
doDelete(id) {
this.$confirm('您确定要删除吗, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doDelete", {id: id}).then(resp => {
if (resp.code === 0) {
this.pageData()
}
})
})
},
openEdit(row) {
this.formData = clone(row)
this.dialogVisible = true
},
doSubmit() {
this.$refs.form.validate(valid => {
if (valid) {
this.$axios.post(loc() + "/doSubmit", this.formData).then(resp => {
if (resp.code === 0) {
this.dialogVisible = false
this.pageData()
}
})
}
})
},
openAdd() {
this.formData = {isMajorDiseases: true}
this.dialogVisible = true
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,360 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="疾病种类">
<el-select clearable placeholder="请选择疾病种类"
v-model="pageForm.diseaseId" filterable>
<el-option
:key="i.id"
:label="i.diseaseName"
:value="i.id"
v-for="i in diseaseList">
</el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" clearable filterable placeholder="请选择院级工会"
@change="getUnitList()">
<el-option v-for="item in unionList" :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="请选择单位">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-button type="primary" @click="doExport" size="small">导出</el-button>
<el-radio-group v-model="pageForm.isMajorDiseases" size="small" @change="doSearch">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">重疾</el-radio-button>
<el-radio-button :label="false">普通</el-radio-button>
</el-radio-group>
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<medical-table ref="table" :local-table-data="tableData" v-loading="tableLoading"
:local-page-form="pageForm" @ready="doSearch">
<template slot="operation">
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke||row.curTaskName==='结束'" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</template>
</medical-table>
</el-card>
<template #edit>
<medical-info ref="medicalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="150px" label-suffix=""
>
<el-table :data="costList" border show-summary class="cost">
<el-table-column label="序号" type="index" width="50px" fixed></el-table-column>
<el-table-column label="住院时间段" width="200">
<template v-slot="{row}">
{{row.visitStartTime}}至{{row.visitEndTime}}
</template>
</el-table-column>
<el-table-column label="住院医院" prop="visitHospital" width="250"></el-table-column>
<el-table-column label="住院医疗费总额(不含门诊)" width="180" prop="hospitalSumMoney">
<template v-slot="{row}">
<el-input-number placeholder="住院医疗费总额(不含门诊)"
:min="0"
controls-position="right" style="width: 100%"
@change="tableChangeMoney"
v-model="row.hospitalSumMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="实际报销金额" width="180" prop="reimbursementMoney">
<template v-slot="{row}">
<el-input-number placeholder="实际报销金额"
:min="0"
controls-position="right" style="width: 100%"
@change="tableChangeMoney"
v-model="row.reimbursementMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="(住院医疗)允许报销范围内个人承担部分金额"
width="180" prop="singleBearMoney">
<template v-slot="{row}">
<el-input-number :min="0" placeholder="个人承担部分金额"
controls-position="right" style="width: 100%"
@change="tableChangeMoney"
v-model="row.singleBearMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="(住院医疗)自费部分金额" width="180"
prop="personExpenseMoney"></el-table-column>
<el-table-column label="重病门诊自费金额" width="180" prop="outpatientServiceMoney">
<template v-slot="{row}">
<el-input-number placeholder="门诊费"
:min="0"
:disabled="!formData.tf_isMajorDiseases"
controls-position="right" style="width: 100%"
@change="tableChangeMoney"
v-model="row.outpatientServiceMoney"></el-input-number>
</template>
</el-table-column>
<el-table-column label="非住院肾衰竭治疗、靶向药" width="180" prop="bxyMoney">
<template v-slot="{row}">
<el-input-number placeholder="靶向药"
:min="0"
:disabled="!formData.tf_isMajorDiseases"
controls-position="right" style="width: 100%"
@change="tableChangeMoney"
v-model="row.bxyMoney"></el-input-number>
</template>
</el-table-column>
</el-table>
<div class="mt10">
<el-form-item label="疾病种类" prop="tf_diseaseId"
:rules="[{required:true,message:'请选择疾病种类',trigger:['change','blur']}]">
<el-select placeholder="请选择疾病种类" style="width: 50%"
v-model="formData.tf_diseaseId" filterable @change="diseaseIdChange">
<el-option
:key="i.id"
:label="i.diseaseName"
:value="i.id"
v-for="i in diseaseList">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="预测补助金额(元)" prop="tf_forecastSubsidyMoney">
<span slot="label">
预测补助金额(元)
<el-tooltip class="item" effect="dark"
content="计算公式:((住院医疗)允许报销范围内个人承担部分金额+(住院医疗)自费部分金额+重病门诊自费金额+非住院肾衰竭治疗、靶向药金额)* 补助比例"
placement="top-start">
<i class="el-icon-question"></i>
</el-tooltip>
</span>
<el-input-number v-model="formData.tf_forecastSubsidyMoney"
style="width: 50%"></el-input-number>
<el-button @click="calcMedicalMoney(formData.id,formData.tf_diseaseId)" type="primary">
重新计算金额
</el-button>
</el-form-item>
<el-form-item label="爱心基金(元)" prop="tf_loveSubsidyMoney">
<el-input-number :max="medicalSetting.loveMoney" :min="0" style="width: 50%"
v-model="formData.tf_loveSubsidyMoney"></el-input-number>
</el-form-item>
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</div>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
</el-row>
</div>
</medical-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/medicalTable.js'){}#-->
<!--#include('../common/medicalInfo.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
costList: [],
unionList: [],
unitList: [],
diseaseList: [],
showApprovalForm: false,
pageForm: {
approval: false,
isMajorDiseases: null,
year: new Date().getFullYear() + "",
},
medicalSetting: {}
}
},
components: {
"medical-table": MEDICAL_TABLE,
"medical-info": MEDICAL_INFO
},
methods: {
doExport() {
this.$downLoad("/platform/medicalMutualAid/medical/foundationAudit/doExport", this.pageForm)
},
// 修改表格里面的金额并修改数据库里的数据
tableChangeMoney() {
this.costList.forEach(cost => {
const personExpenseMoney = cost.hospitalSumMoney - cost.reimbursementMoney - cost.singleBearMoney
cost.personExpenseMoney = isNaN(personExpenseMoney) ? 0 : personExpenseMoney < 0 ? 0 : personExpenseMoney.toFixed(2)
})
this.$axios.post("/platform/medicalMutualAid/medical/foundationAudit/updateCost", {
data: JSON.stringify(this.costList)
}).then(res => {
if (res.code === 0) {
}
})
},
// 重新计算预测补助金额
calcMedicalMoney(id, diseaseId) {
this.$axios.post("/platform/medicalMutualAid/medical/foundationAudit/calcMedicalMoney", {
id, diseaseId
}).then(res => {
if (res.code === 0) {
this.$set(this.formData, 'tf_loveSubsidyMoney', res.data.loveSubsidyMoney)
this.$set(this.formData, 'tf_forecastSubsidyMoney', res.data.forecastSubsidyMoney)
}
})
},
diseaseIdChange(val) {
const disease = this.diseaseList.find(i => i.id === val)
this.$set(this.formData, "tf_diseaseName", disease.diseaseName)
this.$set(this.formData, "tf_isMajorDiseases", disease.isMajorDiseases)
},
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.medicalInfoRef.onOpen(row)
})
},
onAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
const disease = this.diseaseList.find(i => i.id === row.diseaseId)
this.formData = {
id: row.id,
tf_diseaseId: row.diseaseId,
tf_oldDiseaseId: row.diseaseId,
tf_oldDiseaseName: disease.diseaseName,
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.diseaseIdChange(row.diseaseId)
this.calcMedicalMoney(row.id, row.diseaseId)
this.$refs.medicalInfoRef.onOpen(row)
})
setTimeout(() => {
this.costList = this.$refs.medicalInfoRef.viewData.costList
}, 500)
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/medical/foundationAudit/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
getDiseaseList() {
this.$axios.post("/platform/medicalMutualAid/medical/apply/getDiseaseList").then(res => {
if (res.code === 0) {
this.diseaseList = res.data;
}
})
},
async getUnitList() {
this.unitList = await this.$businessTool.listUnit(this.pageForm.unionId)
},
getMedicalSetting() {
this.$axios.post("/platform/medicalMutualAid/medical/basicSetting/getSetting").then(res => {
if (res.code === 0) {
this.medicalSetting = res.data
}
})
},
},
async created() {
this.getMedicalSetting()
this.getDiseaseList()
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,139 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="疾病种类">
<el-select clearable placeholder="请选择疾病种类"
v-model="pageForm.diseaseId" filterable>
<el-option
:key="i.id"
:label="i.diseaseName"
:value="i.id"
v-for="i in diseaseList">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="我的申请">
</table-tool>
<medical-table ref="table" :local-table-data="tableData"
:show-summary='true' v-loading="tableLoading"
:local-page-form="pageForm" @ready="doSearch">
<template slot="operation">
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onEdit(row)"
size="mini" type="primary">编辑
</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
</el-button>
<el-button v-if="row.taskKey === 'startTask' || !row.instanceId" @click="onDelete(row.id)"
size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</template>
</medical-table>
</el-card>
<template #view>
<medical-info ref="medicalInfoRef"></medical-info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('../common/medicalTable.js'){}#-->
<!--#include('../common/medicalInfo.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
diseaseList: []
}
},
components: {
"medical-table": MEDICAL_TABLE,
"medical-info": MEDICAL_INFO
},
methods: {
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.medicalInfoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/medicalMutualAid/medical/apply?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", { taskId: row.startTaskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/medicalMutualAid/medical/mine/delete", { id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
getDiseaseList() {
this.$axios.post("/platform/medicalMutualAid/medical/apply/getDiseaseList").then(res => {
if (res.code === 0) {
this.diseaseList = res.data;
}
})
},
},
created() {
this.getDiseaseList()
this.pageData()
}
})
</script>
<!--#
}
#-->

Some files were not shown because too many files have changed in this diff Show More