first commit

This commit is contained in:
2026-09-20 15:46:34 +08:00
parent 72fb5eae10
commit e558339dcc
3340 changed files with 671310 additions and 251 deletions
@@ -0,0 +1,683 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">关键字:</div>
<div class="search-item-option">
<el-input clearable maxlength="20" v-model.trim="pageForm.keyword"></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="审核列表">
<template #func>
<!--<el-radio-group @change="doSearch()" size="small" v-model="pageForm.auditState">
<el-radio-button label="0">全部</el-radio-button>
<el-radio-button label="1">已审核</el-radio-button>
<el-radio-button label="-1">未审核</el-radio-button>
</el-radio-group>-->
<el-button type="primary" size="small" class="ml10" @click="batchApply">批量申请
</el-button>
<el-button type="primary" size="small" class="ml10" @click="batchExportApplyPaper">批量导出个人申请表
</el-button>
<el-button type="primary" size="small" @click="exportSummary">导出汇总表</el-button>
<el-button type="primary" size="small" icon="el-icon-edit" @click="openUnitMove" class="ml5">
单位调整
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table"
align="center" header-align="center">
<el-table-column type="selection"></el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isMeetRequirements'">
<span class="text-success" v-if="row.isMeetRequirements">
符合
</span>
<span class="text-danger" v-else>
不符合
</span>
</template>
<template scope="{row}" v-else-if="column.prop==='isAccept'">
<span v-if="row.isAccept !== null"
:class="{'text-success': row.isAccept, 'text-danger': !row.isAccept}">
{{ row.isAccept ? '申请' : '放弃' }}
</span>
<span v-else class="text-info">无</span>
</template>
</el-table-column>
<el-table-column label="操作" width="350" fixed="right">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<!--<el-button :disabled="row.stateCode!=100" @click="openAudit(row.id)" size="mini" type="primary">
审核
</el-button>
<el-button :disabled="row.stateCode<300" @click="doRevoke(row.id)" size="mini" type="danger">
撤回
</el-button>-->
<el-button @click="exportApplyPaper(row.id)" size="mini" type="primary">导出</el-button>
<el-button :disabled="row.isAccept!=null || !row.isMeetRequirements || row.stateCode > 210"
@click="applySubsidy(row)" size="mini"
type="primary">申请
</el-button>
<el-button :disabled="!row.isMeetRequirements || row.stateCode >210 || row.isAccept==0"
@click="userHandler(row.id,row.isAccept,false)"
size="mini"
type="danger">放弃
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
<template #edit>
<sick-help-info ref="sickAudit">
<template #audit>
<el-tab-pane label="审核" name="999">
<vi-title title="基层工会审核"></vi-title>
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="1000"
placeholder="请填写您的意见"
rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<el-form-item label="基层工会签字" prop="auditSign">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="doAudit(false)" type="danger">拒绝</el-button>
<el-button @click="doAudit(true)" type="primary">通过</el-button>
</el-row>
</el-tab-pane>
</template>
</sick-help-info>
</template>
<el-dialog :close-on-click-modal="false" :visible.sync="applyDialog" title="申请补助" width="60%">
<el-form :model="formData" :rules="rules" label-width="auto" ref="form">
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="姓名" prop="userName">
<el-input :value="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="mini">
<el-radio label="男" border>男</el-radio>
<el-radio label="女" border>女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
style="width: 100%"
type="date"
v-model="formData.birthday"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="入会时间" prop="mutualGoldStartTime">
<el-date-picker
readonly
style="width: 100%"
type="year"
v-model="formData.mutualGoldStartTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="分工会" prop="unionId">
<el-select v-model="formData.unionId" clearable @change="formUnionIdChange"
style="width: 100%;">
<el-option v-for="item in unions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="工作单位" prop="unitName">
<!-- <el-input :value="formData.unitName"></el-input>-->
<el-select placeholder="所属单位" v-model="formData.unitName" style="width: 100%;"
clearable="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="家庭住址" prop="homeAddress">
<el-input v-model="formData.homeAddress"></el-input>
</el-form-item>
</el-row>
<el-form-item label="申请理由" prop="applyReason">
<el-input
:autosize="{ minRows: 3, maxRows: 5}"
autosize
placeholder="请输入申报补助理由(患何种疾病)"
type="textarea"
v-model="formData.applyReason">
</el-input>
</el-form-item>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="个人支付金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.selfPayMoney"></el-input-number>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="补助金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.subsidyMoney"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请人签字" prop="applyUserSign">
<sign :qz.sync="formData.applyUserSign"></sign>
</el-form-item>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="applyDialog=false">取消</el-button>
<el-button @click="doApply" type="primary">提交</el-button>
</el-row>
</el-form>
</el-dialog>
<el-drawer
title="单位调整"
:visible.sync="unitMoveVisibile"
:before-close="handleClose" size="1000px">
<el-row class="text-primary p20">
选择新单位
</el-row>
<el-row type="flex" :gutter="20" class="pl20 pr20">
<el-col :span="12">
<el-select placeholder="所属工会" v-model="unitMoveFormData.unionId" style="width: 100%;"
clearable="true"
@change="moveUnionsChange"
filterable="true">
<el-option v-for="item in unitMoveUnions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select v-model="unitMoveFormData.unitId" style="width: 100%" filterable clearable
@change="moveUnitChange"
placeholder="请选择单位">
<el-option
v-for="item in unitMoveUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row class="mt10">
<el-table :data="checkUsers" style="width: 100%;padding: 20px" class="vi-table"
border
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="loginName"
width="120"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="userName"
width="120"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unitName"
label="当前单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unionName"
label="当前工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新单位">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unitName}}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新分工会">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unionName}}</span>
</template>
</el-table-column>
</el-table>
</el-row>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="unitMoveVisibile = false">取 消</el-button>
<el-button type="primary" @click="doUnitMove">确定</el-button>
</span>
</el-drawer>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
pageForm: {
auditState: 0,
year: (new Date().getFullYear() - 1).toString(),
unionId: "",
unitId: "",
keyword: ""
},
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号', width: 100},
{prop: 'unionName', label: '分工会', sortable: true, width: 150},
{prop: 'unitName', label: '单位', sortable: true, width: 150},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '个人支付金额(元)', sortable: true, width: 150},
{prop: 'subsidyMoney', label: '补助金额(元)', sortable: true, width: 150},
{prop: 'subsidyMoney', label: '计算金额(元)', sortable: true, width: 150},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
// {prop: 'remarks', label: '备注'},
{prop: 'isMeetRequirements', label: '是否符合申请要求'},
{prop: 'isAccept', label: '是否申请补助'},
{prop: 'stateName', label: '审核状态', width: 120}
],
formData: {
/* username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
auditOpinion: '',
auditSign: '',
auditPass: true*/
},
/*rules: {
auditSign: [{required: true, message: '请签字', trigger: ['change', 'blur']}],
auditOpinion: [{required: true, message: '请输入审核意见', trigger: ['change', 'blur']}]
},*/
unions: [],
units: [],
// formData: {},
rules: {
applyUserSign: [{required: false, message: '请签字', trigger: ['change', 'blur']}],
applyReason: [{required: false, message: '请输入申请理由', trigger: ['change', 'blur']}],
sex: [{required: false, message: '请选择性别', trigger: ['change', 'blur']}],
birthday: [{required: false, message: '请输入出生年月', trigger: ['change', 'blur']}],
mutualGoldStartTime: [{
required: true,
message: '请输入参加大病医疗互助时间',
trigger: ['change', 'blur']
}],
unitName: [{required: false, message: '请输入工作单位', trigger: ['change', 'blur']}],
homeAddress: [{required: false, message: '请输入家庭住址', trigger: ['change', 'blur']}],
},
applyDialog: false,
unitMoveVisibile: false,
unitMoveUnions: [],
unitMoveUnits: [],
unitMoveFormData: {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
},
checkUsers: []
}
},
methods: {
async moveUnionsChange(val) {
if (val) {
this.unitMoveUnits = await getUnits(val)
this.$set(this.unitMoveFormData, 'unionName', this.unitMoveUnions.find(v => v.id === val).unionname)
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
} else {
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
this.$set(this.unitMoveFormData, 'unionName', '')
this.unitMoveUnits = []
}
},
moveUnitChange(val) {
if (val) {
this.$set(this.unitMoveFormData, 'unitName', this.unitMoveUnits.find(v => v.id === val).name)
} else {
this.$set(this.unitMoveFormData, 'unitName', '')
}
},
applySubsidy(row) {
this.formData = clone(row)
this.applyDialog = true
this.getApplyUserInfo(row.loginName)
},
async getApplyUserInfo(loginName) {
const resp = await $.get('/platform/sickHelp/mySubsidyRecord/getApplyUserInfo', {loginName})
if (resp.code === 0) {
const {
userName,
loginName,
unitName,
unionId,
sex,
homeAddress,
birthday,
mutualGoldStartTime
} = resp.data
this.$set(this.formData, 'userName', userName)
this.$set(this.formData, 'loginName', loginName)
this.$set(this.formData, 'unitName', unitName)
this.$set(this.formData, 'unionId', unionId)
this.$set(this.formData, 'sex', sex)
this.$set(this.formData, 'homeAddress', homeAddress)
this.$set(this.formData, 'birthday', birthday)
this.$set(this.formData, 'mutualGoldStartTime', mutualGoldStartTime)
}
},
async doApply() {
const valid = await this.$refs['form'].validate()
if (!valid) return
const resp = await $.post(loc() + '/doApply', this.formData)
if (resp.code === 0) {
this.applyDialog = false
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async userHandler(id, isAccept, userChoice) {
if (isAccept) return
const msg = '您确认要' + (userChoice ? '接受' : '放弃') + '该用户的补助申请吗?'
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post('/platform/sickHelp/mySubsidyRecord/acceptSubsidy', {
id,
isAccept: userChoice
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyError(resp.msg)
}
},
batchExportApplyPaper() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要导出的记录')
return
}
const ids = selections.map(v => v.id)
window.open(loc() + '/batchExportApplyPaper?ids=' + JSON.stringify(ids))
},
async batchApply() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要批量申请的记录')
return
}
const confirm = await this.$confirm('您确定要将勾选的记录申请补助吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const ids = selections.map(v => v.id)
const resp = await $.post(loc() + '/batchApply', {ids: JSON.stringify(ids)})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.$refs.table.clearSelection()
} else {
this.notifyWarning(resp.msg)
}
},
openUnitMove() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要调整的数据')
return
}
this.checkUsers = selections
this.unitMoveVisibile = true
this.unitMoveFormData = {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
}
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {
});
},
async doUnitMove() {
if (this.unitMoveFormData.unitId === '') {
this.notifyWarning('请选择新单位!')
return
}
const selections = this.$refs.table.selection
const params = {
unitId: this.unitMoveFormData.unitId,
loginName: selections.map(v => v.loginName)
}
const resp = await $.post('/platform/sickHelp/retireesAudit/userUnitMove', params)
if (resp.code === 0) {
this.pageData()
this.$refs.table.clearSelection()
this.unitMoveVisibile = false
this.notifySuccess(resp.msg)
}
},
exportSummary() {
const {year, unionId, unitId} = this.pageForm
if (!year) {
this.notifyWarning('请先选择年度')
return
}
window.open(loc() + '/exportSummary?year=' + year + '&unionId=' + unionId + '&unitId=' + unitId)
},
exportApplyPaper(id) {
window.open('/platform/sickHelp/mySubsidyRecord/exportApplyPaper?id=' + id)
},
/*async doAudit(flag) {
const valid = await this.$refs['form'].validate()
if (!valid) return
const r = flag ? '通过' : '拒绝';
const confirm = await this.$confirm('你确定要' + r + '吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
this.formData.auditPass = flag
const resp = await $.post(loc() + '/doAudit', this.formData)
if (resp.code === 0) {
this.$refs.guava.index()
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async doRevoke(id) {
const confirm = await this.$confirm('你确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doRevoke/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},*/
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async openAudit(id) {
this.$refs.guava.edit()
this.$refs.sickAudit.openAudit(id)
this.$set(this.formData, 'id', id)
this.$set(this.formData, 'auditOpinion', null)
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
async formUnionIdChange() {
this.$set(this.formData, "unitName", null)
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.formData.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
}
},
async created() {
this.pageData()
this.unions = await getUnions(null)
this.flushUnits()
this.unitMoveUnions = [...this.unions]
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,262 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号:</div>
<div class="search-item-option">
<el-input clearable maxlength="20" v-model.trim="pageForm.keyword"></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="审核列表">
<template #func>
<el-radio-group @change="doSearch()" size="small" v-model="pageForm.auditState">
<el-radio-button label="0">全部</el-radio-button>
<el-radio-button label="1">已审核</el-radio-button>
<el-radio-button label="-1">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column label="操作" width="250">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button :disabled="row.stateCode!=300" @click="openAudit(row.id)" size="mini" type="primary">
审核
</el-button>
<el-button :disabled="![400,500].includes(row.stateCode)"
@click="doRevoke(row.id,row.stateCode)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
<template #edit>
<sick-help-info ref="sickAudit">
<template #audit>
<el-tab-pane label="审核" name="999">
<vi-title title="校医院审核"></vi-title>
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="1000"
placeholder="请填写您的意见"
rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<el-form-item label="校医院签字" prop="auditSign">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="doAudit(false)" type="danger">拒绝</el-button>
<el-button @click="doAudit(true)" type="primary">通过</el-button>
</el-row>
</el-tab-pane>
</template>
</sick-help-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
pageForm: {
auditState: 0,
year: (new Date().getFullYear() - 1).toString()
},
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'unitName', label: '单位', sortable: true},
// {prop: 'unionName', label: '分工会', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '支付金额', sortable: true},
{prop: 'subsidyMoney', label: '补助金额', sortable: true},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
{prop: 'remarks', label: '备注'},
// {prop: 'isMeetRequirements', label: '是否符合申请要求'},
// {prop: 'isAccept', label: '是否接受补助'},
{prop: 'stateName', label: '审核状态'}
],
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
auditOpinion: '',
auditSign: '',
auditPass: true
},
rules: {
auditSign: [{required: true, message: '请签字', trigger: ['change', 'blur']}],
auditOpinion: [{required: true, message: '请输入审核意见', trigger: ['change', 'blur']}]
},
unions: [],
units: []
}
},
methods: {
async doAudit(flag) {
const valid = await this.$refs['form'].validate()
if (!valid) return
const r = flag ? '通过' : '拒绝';
const confirm = await this.$confirm('你确定要' + r + '吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
this.formData.auditPass = flag
const resp = await $.post(loc() + '/doAudit', this.formData)
if (resp.code === 0) {
this.$refs.guava.index()
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async doRevoke(id, stateCode) {
if (![400, 500].includes(stateCode)) return
const confirm = await this.$confirm('你确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doRevoke/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async openAudit(id) {
this.$refs.guava.edit()
this.$refs.sickAudit.openAudit(id)
this.$set(this.formData, 'id', id)
this.$set(this.formData, 'auditOpinion', null)
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData()
this.unions = await getUnions(null)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,646 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">关键字:</div>
<div class="search-item-option">
<el-input clearable maxlength="20" v-model.trim="pageForm.keyword"></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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="true"
filterable="true">
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="审核列表">
<template #func>
<!--<el-radio-group @change="doSearch()" size="small" v-model="pageForm.auditState">
<el-radio-button label="0">全部</el-radio-button>
<el-radio-button label="1">已审核</el-radio-button>
<el-radio-button label="-1">未审核</el-radio-button>
</el-radio-group>-->
<el-button type="primary" size="small" class="ml10" @click="batchApply">批量申请
</el-button>
<el-button type="primary" size="small" class="ml10" @click="batchExportApplyPaper">批量导出个人表
</el-button>
<el-button type="primary" size="small" @click="exportSummary">导出汇总表</el-button>
<el-button type="primary" size="small" icon="el-icon-edit" @click="openUnitMove" class="ml5">
单位调整
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table"
align="center" header-align="center">
<el-table-column type="selection"></el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isMeetRequirements'">
<span class="text-success" v-if="row.isMeetRequirements">
符合
</span>
<span class="text-danger" v-else>
不符合
</span>
</template>
<template scope="{row}" v-else-if="column.prop==='isAccept'">
<span v-if="row.isAccept !== null"
:class="{'text-success': row.isAccept, 'text-danger': !row.isAccept}">
{{ row.isAccept ? '申请' : '放弃' }}
</span>
<span v-else class="text-info">无</span>
</template>
</el-table-column>
<el-table-column label="操作" width="350">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<!--<el-button :disabled="row.stateCode!=100" @click="openAudit(row.id)" size="mini" type="primary">
审核
</el-button>
<el-button :disabled="row.stateCode<300" @click="doRevoke(row.id)" size="mini" type="danger">
撤回
</el-button>-->
<el-button @click="exportApplyPaper(row.id)" size="mini" type="primary">导出</el-button>
<el-button :disabled="row.isAccept!=null || !row.isMeetRequirements || row.stateCode > 210"
@click="applySubsidy(row)" size="mini"
type="primary">申请
</el-button>
<el-button :disabled="!row.isMeetRequirements || row.stateCode >210 || row.isAccept==0"
@click="userHandler(row.id,row.isAccept,false)"
size="mini"
type="danger">放弃
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
<template #edit>
<sick-help-info ref="sickAudit">
<template #audit>
<el-tab-pane label="审核" name="999">
<vi-title title="基层工会审核"></vi-title>
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="1000"
placeholder="请填写您的意见"
rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<el-form-item label="基层工会签字" prop="auditSign">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="doAudit(false)" type="danger">拒绝</el-button>
<el-button @click="doAudit(true)" type="primary">通过</el-button>
</el-row>
</el-tab-pane>
</template>
</sick-help-info>
</template>
<el-dialog :close-on-click-modal="false" :visible.sync="applyDialog" title="申请补助" width="60%">
<el-form :model="formData" :rules="rules" label-width="auto" ref="form">
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="姓名" prop="userName">
<el-input :value="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="mini">
<el-radio label="男" border>男</el-radio>
<el-radio label="女" border>女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
style="width: 100%"
type="date"
v-model="formData.birthday"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="入会时间" prop="mutualGoldStartTime">
<el-date-picker
readonly
style="width: 100%"
type="date"
v-model="formData.mutualGoldStartTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="工作单位" prop="unitName">
<el-input :value="formData.unitName"></el-input>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="家庭住址" prop="homeAddress">
<el-input v-model="formData.homeAddress"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请理由" prop="applyReason">
<el-input
:autosize="{ minRows: 3, maxRows: 5}"
autosize
placeholder="请输入申报补助理由(患何种疾病)"
type="textarea"
v-model="formData.applyReason">
</el-input>
</el-form-item>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="个人支付金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.selfPayMoney"></el-input-number>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="补助金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.subsidyMoney"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请人签字" prop="applyUserSign">
<sign :qz.sync="formData.applyUserSign"></sign>
</el-form-item>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="applyDialog=false">取消</el-button>
<el-button @click="doApply" type="primary">提交</el-button>
</el-row>
</el-form>
</el-dialog>
<el-drawer
title="单位调整"
:visible.sync="unitMoveVisibile"
:before-close="handleClose" size="1000px">
<el-row class="text-primary p20">
选择新单位
</el-row>
<el-row type="flex" :gutter="20" class="pl20 pr20">
<el-col :span="12">
<el-select placeholder="所属工会" v-model="unitMoveFormData.unionId" style="width: 100%;"
clearable="true"
@change="moveUnionsChange"
filterable="true">
<el-option v-for="item in unitMoveUnions" :label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select v-model="unitMoveFormData.unitId" style="width: 100%" filterable clearable
@change="moveUnitChange"
placeholder="请选择单位">
<el-option
v-for="item in unitMoveUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row class="mt10">
<el-table :data="checkUsers" style="width: 100%;padding: 20px" class="vi-table"
border
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="loginName"
width="120"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="userName"
width="120"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unitName"
label="当前单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unionName"
label="当前工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新单位">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unitName}}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新分工会">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unionName}}</span>
</template>
</el-table-column>
</el-table>
</el-row>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="unitMoveVisibile = false">取 消</el-button>
<el-button type="primary" @click="doUnitMove">确定</el-button>
</span>
</el-drawer>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
pageForm: {
auditState: 0,
year: (new Date().getFullYear() - 1).toString(),
unionId: "",
unitId: "",
keyword: ""
},
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'unitName', label: '单位', sortable: true},
// {prop: 'unionName', label: '分工会', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '支付金额', sortable: true},
{prop: 'subsidyMoney', label: '补助金额', sortable: true},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
{prop: 'isMeetRequirements', label: '是否符合申请要求'},
{prop: 'isAccept', label: '是否申请补助'},
{prop: 'stateName', label: '审核状态'}
],
formData: {
/*username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
auditOpinion: '',
auditSign: '',
auditPass: true*/
},
/*rules: {
auditSign: [{required: true, message: '请签字', trigger: ['change', 'blur']}],
auditOpinion: [{required: true, message: '请输入审核意见', trigger: ['change', 'blur']}]
},*/
unions: [],
units: [],
rules: {
applyUserSign: [{required: false, message: '请签字', trigger: ['change', 'blur']}],
applyReason: [{required: false, message: '请输入申请理由', trigger: ['change', 'blur']}],
sex: [{required: false, message: '请选择性别', trigger: ['change', 'blur']}],
birthday: [{required: false, message: '请输入出生年月', trigger: ['change', 'blur']}],
mutualGoldStartTime: [{
required: true,
message: '请输入参加大病医疗互助时间',
trigger: ['change', 'blur']
}],
unitName: [{required: true, message: '请输入工作单位', trigger: ['change', 'blur']}],
homeAddress: [{required: false, message: '请输入家庭住址', trigger: ['change', 'blur']}],
},
applyDialog: false,
unitMoveVisibile: false,
unitMoveUnions: [],
unitMoveUnits: [],
unitMoveFormData: {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
},
checkUsers: []
}
},
methods: {
async moveUnionsChange(val) {
if (val) {
this.unitMoveUnits = await getUnits(val)
this.$set(this.unitMoveFormData, 'unionName', this.unitMoveUnions.find(v => v.id === val).unionname)
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
} else {
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
this.$set(this.unitMoveFormData, 'unionName', '')
this.unitMoveUnits = []
}
},
moveUnitChange(val) {
if (val) {
this.$set(this.unitMoveFormData, 'unitName', this.unitMoveUnits.find(v => v.id === val).name)
} else {
this.$set(this.unitMoveFormData, 'unitName', '')
}
},
async applySubsidy(row) {
this.applyDialog = true
this.formData = clone(row)
await this.getApplyUserInfo(row.loginName)
},
async getApplyUserInfo(loginName) {
const resp = await $.get(loc() + '/getApplyUserInfo', {loginName})
if (resp.code === 0) {
const {userName, loginName, unitName, sex, homeAddress, birthday, mutualGoldStartTime} = resp.data
this.$set(this.formData, 'userName', userName)
this.$set(this.formData, 'loginName', loginName)
this.$set(this.formData, 'unitName', unitName)
this.$set(this.formData, 'sex', sex)
this.$set(this.formData, 'homeAddress', homeAddress)
this.$set(this.formData, 'birthday', birthday)
this.$set(this.formData, 'mutualGoldStartTime', mutualGoldStartTime)
}
},
async doApply() {
const valid = await this.$refs['form'].validate()
if (!valid) return
const resp = await $.post(loc() + '/doApply', this.formData)
if (resp.code === 0) {
this.applyDialog = false
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async userHandler(id, isAccept, userChoice) {
if (isAccept) return
const msg = '您确认要' + (userChoice ? '接受' : '放弃') + '该用户的补助申请吗?'
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post('/platform/sickHelp/mySubsidyRecord/acceptSubsidy', {
id,
isAccept: userChoice
})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyError(resp.msg)
}
},
batchExportApplyPaper() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要导出的数据')
return
}
const ids = selections.map(v => v.id)
window.open(loc() + '/batchExportApplyPaper?ids=' + JSON.stringify(ids))
},
async batchApply() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要批量申请的记录')
return
}
const confirm = await this.$confirm('您确定要将勾选的记录申请补助吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const ids = selections.map(v => v.id)
const resp = await $.post(loc() + '/batchApply', {ids: JSON.stringify(ids)})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
this.$refs.table.clearSelection()
} else {
this.notifyWarning(resp.msg)
}
},
openUnitMove() {
const selections = this.$refs.table.selection
if (selections.length === 0) {
this.notifyWarning('请先勾选需要调整的数据')
return
}
this.checkUsers = selections
this.unitMoveVisibile = true
this.unitMoveFormData = {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
}
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {
});
},
async doUnitMove() {
if (this.unitMoveFormData.unitId === '') {
this.notifyWarning('请选择新单位!')
return
}
const selections = this.$refs.table.selection
const params = {
unitId: this.unitMoveFormData.unitId,
loginName: selections.map(v => v.loginName)
}
const resp = await $.post(loc() + '/userUnitMove', params)
if (resp.code === 0) {
this.pageData()
this.$refs.table.clearSelection()
this.unitMoveVisibile = false
this.notifySuccess(resp.msg)
}
},
exportSummary() {
const {year, unionId, unitId} = this.pageForm
if (!year) {
this.notifyWarning('请先选择年度')
return
}
window.open(loc() + '/exportSummary?year=' + year + '&unionId=' + unionId + '&unitId=' + unitId)
},
exportApplyPaper(id) {
window.open('/platform/sickHelp/mySubsidyRecord/exportApplyPaper?id=' + id)
},
/*async doAudit(flag) {
const valid = await this.$refs['form'].validate()
if (!valid) return
const r = flag ? '通过' : '拒绝';
const confirm = await this.$confirm('你确定要' + r + '吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
this.formData.auditPass = flag
const resp = await $.post(loc() + '/doAudit', this.formData)
if (resp.code === 0) {
this.$refs.guava.index()
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async doRevoke(id) {
const confirm = await this.$confirm('你确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doRevoke/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},*/
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async openAudit(id) {
this.$refs.guava.edit()
this.$refs.sickAudit.openAudit(id)
this.$set(this.formData, 'id', id)
this.$set(this.formData, 'auditOpinion', null)
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.pageData()
this.unions = await getUnions(null)
this.flushUnits()
this.unitMoveUnions = [...this.unions]
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,334 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号:</div>
<div class="search-item-option">
<el-input clearable maxlength="20" v-model.trim="pageForm.keyword"></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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="true"
filterable="true">
<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-select clearable filterable style="width: 100%"
v-model="pageForm.isMember">
<el-option label="全部" :value="null"></el-option>
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="审核列表">
<template #func>
<el-button size="small" type="primary" class="mr5" @click="batchAudit">批量审核</el-button>
<el-button size="small" type="primary" class="mr5" @click="doExport">导出汇总表</el-button>
<el-radio-group @change="doSearch()" size="small" v-model="pageForm.auditState">
<el-radio-button label="0">全部</el-radio-button>
<el-radio-button label="1">已审核</el-radio-button>
<el-radio-button label="-1">未审核</el-radio-button>
</el-radio-group>
<el-radio-group @change="doSearch()" size="small" v-model="pageForm.isAccept" class="ml10">
<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>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
row-key="id"
ref="table"
align="center" header-align="center">
<el-table-column type="selection" reserve-selection
:selectable="(row)=>{return row.stateCode===500}"></el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isAccept'">
<span v-if="row.isAccept !== null"
:class="{'text-success': row.isAccept, 'text-danger': !row.isAccept}">
{{ row.isAccept ? '申请' : '放弃' }}
</span>
<span v-else class="text-info">无</span>
</template>
<template scope="{row}" v-else-if="column.prop==='stateName'">
<vi-table-state :state="row"></vi-table-state>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button :disabled="row.stateCode!=500" @click="openAudit(row.id)" size="mini" type="primary">
审核
</el-button>
<el-button :disabled="![600,700].includes(row.stateCode)"
@click="doRevoke(row.id,row.stateCode)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
<template #edit>
<sick-help-info ref="sickAudit">
<template #audit>
<el-tab-pane label="审核" name="999">
<vi-title title="校工会审核"></vi-title>
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input readonly v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="1000"
placeholder="请填写您的意见"
rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<el-form-item label="校工会签字" prop="auditSign">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<!-- <el-button @click="doAudit(false)" type="danger">拒绝</el-button>-->
<el-button @click="doAudit(true)" type="primary">通过</el-button>
</el-row>
</el-tab-pane>
</template>
</sick-help-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
pageForm: {
auditState: 0,
year: (new Date().getFullYear() - 1).toString(),
isMember: null,
isAccept: null
},
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'unitName', label: '单位', sortable: true},
// {prop: 'unionName', label: '分工会', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '个人支付金额(元)', sortable: true},
{prop: 'subsidyMoney', label: '补助金额(元)', sortable: true},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
// {prop: 'isMeetRequirements', label: '是否符合申请要求'},
// {prop: 'isAccept', label: '是否接受补助'},
{prop: 'isAccept', label: '是否申请补助'},
{prop: 'stateName', label: '审核状态'},
{prop: 'remarks', label: '备注'}
],
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginname: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
auditOpinion: '',
auditSign: '',
auditPass: true
},
rules: {
auditSign: [{required: false, message: '请签字', trigger: ['change', 'blur']}],
auditOpinion: [{required: true, message: '请输入审核意见', trigger: ['change', 'blur']}]
},
unions: [],
units: [],
selections: []
}
},
methods: {
async doAudit(flag) {
const valid = await this.$refs['form'].validate()
if (!valid) return
const r = flag ? '通过' : '拒绝';
const confirm = await this.$confirm('你确定要' + r + '吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
this.formData.auditPass = flag
const resp = await $.post(loc() + '/doAudit', this.formData)
if (resp.code === 0) {
this.$refs.guava.index()
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
async doRevoke(id, stateCode) {
if (![600, 700].includes(stateCode)) return
const confirm = await this.$confirm('你确定要撤回吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doRevoke/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async openAudit(id) {
this.$refs.guava.edit()
this.$refs.sickAudit.openAudit(id)
this.$set(this.formData, 'id', id)
this.$set(this.formData, 'auditOpinion', '同意')
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
doExport() {
const {year, auditState} = this.pageForm
if (!year) {
this.notifyWarning('请先选择年度')
return
}
window.open(loc() + '/doExport?year=' + year + '&auditState=' + auditState)
},
async batchAudit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.notifyWarning('请选择需要批量审核的记录')
return
}
const confirm = await this.$confirm('你确定要通过勾选的记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const ids = selection.map(v => v.id)
const resp = await $.post(loc() + '/batchAudit', {ids: JSON.stringify(ids)})
if (resp.code === 0) {
this.doSearch()
this.$refs.table.clearSelection()
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.pageData()
this.unions = await getUnions(null)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,276 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.sickCountCard {
cursor: pointer;
transition: all linear 0.5s;
line-height: 2;
border-radius: 6px;
display: flex;
justify-content: space-between;
padding: 20px;
min-width: 220px;
margin: 5px;
background-color: #0e78c5;
color: #FFFFFF;
}
.sickCountCard .info-label {
font-size: 20px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.sickCountCard .info-label::before {
content: '';
border-left: 3px solid #FFFFFF;
margin-right: 5px;
}
.sickCountCard .info-num {
font-size: 35px;
}
@media only screen and (max-width: 767px) {
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<div style="min-width: 500px">
<el-row :gutter="20" ref="sickCountDom" style="flex-wrap: wrap;" type="flex">
<el-col :lg="12" :md="12" :sm="24" :xl="6" :xs="24">
<div class="sickCountCard">
<div class="info-label">总补助次数</div>
<div class="info-num">{{sickCount.servedCount}}</div>
</div>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="6" :xs="24">
<div class="sickCountCard">
<div class="info-label">总补助教师人数</div>
<div class="info-num">{{sickCount.servedUserCount}}</div>
</div>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="6" :xs="24">
<div class="sickCountCard">
<div class="info-label">总补助金额</div>
<div class="info-num">{{sickCount.subsidyMoneySum}}</div>
</div>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="6" :xs="24">
<div class="sickCountCard">
<div class="info-label">当年补助金额</div>
<div class="info-num">{{sickCount.currentYearSubsidyMoneySum}}</div>
</div>
</el-col>
</el-row>
<el-row :gutter="20" :style="{height:chartRowHeight,position:'relative'}" class="mt20" id="chart-row">
<el-col :lg="12" :xs="24">
<el-card class="mb10" shadow="never">
<vi-title title="年度补助人数趋势"></vi-title>
<div :style="{height: chartHeight}" id="yearUser"></div>
</el-card>
</el-col>
<el-col :lg="12" :xs="24">
<el-card class="mb10" shadow="never">
<vi-title title="年度补助金额趋势"></vi-title>
<div :style="{height: chartHeight}" id="yearSubsidyMoney"></div>
</el-card>
</el-col>
</el-row>
</div>
</guava>
</div>
<script>
let yearUserChart, yearSubsidyMoneyChart = null
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
sickCount: {},
yearData: [],
chartRowHeight: null,
chartHeight: null
}
},
methods: {
async getSickCount() {
const resp = await $.get(loc() + '/getSickCountData')
this.sickCount = resp.data
},
async getYearCount() {
const resp = await $.get(loc() + '/getYearCountData')
this.yearData = resp.data
this.$nextTick(async () => {
await this.calcChartRowHeightHeight()
console.log('----')
this.renderYearUser()
this.renderYearSubsidyMoney()
})
},
renderYearUser() {
console.log('开始渲染')
const chartDom = document.getElementById('yearUser')
yearUserChart = echarts.init(chartDom)
const option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
xAxis: {
name: '年度',
type: 'category',
data: this.yearData.map(v => v.year)
},
yAxis: {
name: '补助人数(人)',
type: 'value'
},
series: [
{
data: this.yearData.map(v => v.userCount),
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.2)'
},
itemStyle: {
normal: {
label: {
formatter: '{c}' + '人',
show: true,
position: 'top',
textStyle: {
fontWeight: 'bolder',
fontSize: '15'
},
width: 30,
overflow: 'break'
}
}
}
}
],
dataZoom: [
{
type: "slider",
show: true,
xAxisIndex: [0],
startValue: new Date().getFullYear() - 5,
endValue: new Date().getFullYear(),
textStyle: {
color: "#ccd7d7"
}
},
],
}
yearUserChart.setOption(option)
},
renderYearSubsidyMoney() {
const chartDom = document.getElementById('yearSubsidyMoney')
yearSubsidyMoneyChart = echarts.init(chartDom)
const option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
xAxis: {
name: '年度',
type: 'category',
data: this.yearData.map(v => v.year)
},
yAxis: {
name: '补助金额(元)',
type: 'value'
},
series: [
{
data: this.yearData.map(v => v.subsidyMoneySum),
type: 'bar',
barWidth: 30,
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.2)'
},
itemStyle: {
normal: {
label: {
formatter: '{c}' + '元',
show: true,
position: 'top',
textStyle: {
fontWeight: 'bolder',
fontSize: '15'
},
width: 80,
overflow: 'break'
}
}
}
}
],
dataZoom: [
{
type: "slider",
show: true,
xAxisIndex: [0],
startValue: new Date().getFullYear() - 5,
endValue: new Date().getFullYear(),
textStyle: {
color: "#ccd7d7"
}
},
],
}
yearSubsidyMoneyChart.setOption(option)
},
calcChartRowHeightHeight() {
return new Promise(resolve => {
this.$nextTick(() => {
const top = document.getElementById('chart-row').getBoundingClientRect().top
this.chartRowHeight = (window.innerHeight - top - 10) + 'px'
this.chartHeight = (window.innerHeight - top - 10 - 20 - 20 - 50) + 'px'
console.log('高度获取完毕')
resolve()
})
})
},
onResize() {
window.onresize = async () => {
if (window.innerWidth < 1200) {
this.chartRowHeight = '720px'
this.chartHeight = '630px'
} else {
await this.calcChartRowHeightHeight()
}
yearUserChart.resize()
yearSubsidyMoneyChart.resize()
}
}
},
mounted() {
this.getSickCount()
this.getYearCount()
this.onResize()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,314 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.downLoadTemplate {
position: absolute;
right: 0;
top: 0;
}
.dividing-line {
display: flex;
justify-content: center;
position: relative;
margin: 10px 0;
}
.dividing-line::after {
content: '';
position: absolute;
border-bottom: 1px solid #ebeef5;
width: calc(100% + 40px);
bottom: 0;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never" style="position: relative">
<template #header>
<h3 style="color: rgb(24, 103, 176);">补助计算(excel批量导入)</h3>
</template>
<el-row justify="center" style="position: relative" type="flex">
<div class="downLoadTemplate">
<el-button @click="downLoadTemplate" size="small"
type="primary">
下载模板
</el-button>
</div>
<el-upload
:action="uploadUrl"
:auto-upload="true"
:file-list="files"
:limit="1"
:on-error="handleError"
:on-exceed="()=>{this.notifyWarning('只能上传一个文件')}"
:on-progress="handleProgress"
:on-remove="(f,fl)=>{fileList = fl;tableData=[];globalYear=null;}"
:on-success="handleSuccess"
accept=".xls,.xlsx"
drag
ref="excelUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</el-row>
<div class="dividing-line"></div>
<div class="mt20" id="excel-table-container">
<vi-title2 title="计算结果">
<template #func>
<el-button :disabled="tableData.length===0" @click="checkAgain" size="small" type="primary">
重新校验
</el-button>
<el-button :disabled="tableData.length===0" @click="doImport" size="small" type="primary">导入数据
</el-button>
</template>
</vi-title2>
<el-table :data="tableData" :summary-method="summaryMethod" max-height="887" ref="table"
show-summary
v-loading="tableLoading"
v-sticky="{top: 0,parent: '#app'}">
<el-table-column label="序号" type="index"></el-table-column>
<el-table-column label="校验" prop="validMsg" show-overflow-tooltip>
<template scope="{row}">
<span :class="row.valid?'text-success':'text-danger'">{{row.validMsg.join('、')}}</span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginName" width="150">
<!-- <template scope="{row}">-->
<!-- <el-input v-model="row.loginName" maxlength="10" size="small"></el-input>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="姓名" prop="userName" width="150">
<!-- <template scope="{row}">-->
<!-- <el-input v-model="row.userName" maxlength="10" size="small"></el-input>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip width="150">
<!-- <template scope="{row}">-->
<!-- <el-input v-model="row.unitName" maxlength="10" size="small"></el-input>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="医保四项之和金额(元)" prop="medicalFourTotalMoney"
width="200"></el-table-column>
<el-table-column label="两项自付之和金额(元)" prop="selfPayTotalMoney"
width="200"></el-table-column>
<el-table-column label="学校二次报销金额(元)" prop="schoolSecondSubsidyMoney"
width="200"></el-table-column>
<el-table-column label="个人支付金额(元)" prop="selfPayMoney" width="200"></el-table-column>
<el-table-column label="未补助年份" prop="noSubsidyYear" width="200"></el-table-column>
<el-table-column label="计算金额(元)" prop="noLimitSubsidyMoney" width="200"></el-table-column>
<el-table-column label="补助金额(元)" prop="subsidyMoney" width="200">
<!-- <template scope="{row}">-->
<!-- <el-input-number v-model="row.subsidyMoney" :min="0" :max="999999"-->
<!-- :precision="2" size="small" style="width: 100%"></el-input-number>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="年度" prop="year" width="100">
<!-- <template #header>-->
<!-- <div style="display: flex;align-items: center">-->
<!-- <div style="width: 50px">-->
<!-- 年度-->
<!-- </div>-->
<!-- <el-date-picker-->
<!-- v-model="globalYear"-->
<!-- @change="globalYearChange"-->
<!-- type="year"-->
<!-- placeholder="一键选择年度"-->
<!-- value-format="yyyy"-->
<!-- size="small"-->
<!-- style="width: calc(200px - 50px)">-->
<!-- </el-date-picker>-->
<!-- </div>-->
<!-- </template>-->
<!-- <template scope="{row}">-->
<!-- <el-date-picker-->
<!-- v-model="row.year"-->
<!-- type="year"-->
<!-- placeholder="选择年度"-->
<!-- value-format="yyyy"-->
<!-- size="small"-->
<!-- style="width: 100%">-->
<!-- </el-date-picker>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="上一次补助年度" prop="lastTimeSubsidyYear" width="150"></el-table-column>
<!-- <el-table-column label="自费金额补助比例" prop="selfPaySubsidyRatio" width="150">-->
<!-- <template scope="{row}">-->
<!-- {{row.selfPaySubsidyRatio * 1000 / 10 + '%'}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="额外补助比例" prop="otherSubsidyRatio" width="150">
<template scope="{row}">
{{row.otherSubsidyRatio * 1000 / 10 + '%'}}
</template>
</el-table-column>
<!-- <el-table-column label="总补助比例" prop="totalSubsidyRatio" width="150">-->
<!-- <template scope="{row}">-->
<!-- {{row.totalSubsidyRatio * 1000 / 10 + '%'}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="入会年限∕是否享受过补助" prop="subsidyDesc" width="200">-->
<!-- </el-table-column>-->
<el-table-column label="备注" prop="remarks">
<!-- <template scope="{row}">-->
<!-- <el-input v-model="formData.remarks" maxlength="20" size="small"></el-input>-->
<!-- </template>-->
</el-table-column>
</el-table>
<!-- <el-backtop target="#excel-table-container" :bottom="100"></el-backtop>-->
</div>
</el-card>
</guava>
</div>
<script>
</script>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
files: [],
globalYear: null,
uploadUrl: '/platform/sickHelp/import/readExcel',
tableHeight: null
}
},
methods: {
handleProgress() {
this.tableLoading = true
},
handleSuccess(resp) {
console.log('ok')
this.tableLoading = false
this.tableData = resp.data
},
handleError(err) {
console.log(err)
},
beforeUpload(file, files) {
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
const whiteList = ['xls', 'xlsx']
if (!whiteList.includes(fileSuffix)) {
this.files = []
this.$message.warning('上传文件只能是' + whiteList.join(',') + '格式')
return false
}
this.files = files
},
async checkAgain() {
this.tableLoading = true
const resp = await $.post('/platform/sickHelp/import/checkData', {sickHelps: JSON.stringify(this.tableData)})
console.log('ok....')
this.tableLoading = false
if (resp.code === 0) {
// resp.data.forEach(v => {
// v['year'] = v['year'] ? v['year'].toString() : null
// })
this.tableData = resp.data
} else {
this.notifyWarning(resp.msg)
}
},
async doImport() {
const hasErrorData = this.tableData.some(v => !v.valid)
if (hasErrorData) {
// this.notifyWarning('数据校验不合格,无法导入')
// return
}
const resp = await $.post('/platform/sickHelp/import/doImport', {sickHelps: JSON.stringify(this.tableData)})
if (resp.code === 0) {
this.tableData = []
this.globalYear = null
this.notifySuccess(resp.msg)
this.$refs.excelUpload.clearFiles()
}
},
globalYearChange(val) {
this.tableData.forEach(v => {
v['year'] = val
})
},
downLoadTemplate() {
window.open('/platform/sickHelp/import/downLoadTemplate')
},
summaryMethod(param) {
const {columns, data} = param
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计'
return
}
if (['selfPayMoney', 'subsidyMoney'].includes(column.property)) {
const values = data.map(item => Number(item[column.property]))
const sum = values.reduce((sum, value) => sum + value, 0)
sums[index] = sum.toFixed(2)
} else {
sums[index] = null
}
})
return sums
}
},
created() {
const mode = GetQueryString("mode")
if (mode && mode === 'ins') {
const loading = this.$loading({
lock: true,
text: '读取医保、二次报销数据中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post('/platform/sickHelp/import/convertIns').then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.tableLoading = false
this.tableData = res.data
} else {
this.$message.success(res.msg)
}
}).always(() => {
loading.close()
})
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,415 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.calcRow {
display: flex;
justify-content: center;
position: relative;
top: 20px;
padding: 20px 0;
}
.calcRow::before {
content: '';
position: absolute;
border-top: 1px solid #ebeef5;
width: calc(100% + 40px);
top: 0;
}
.calcRow button {
/*width: 10%;*/
}
.historySubsidy {
position: relative;
padding: 20px 0 0 0;
}
.historySubsidy::before {
content: '';
position: absolute;
border-top: 1px solid #ebeef5;
width: calc(100% + 40px);
top: 0;
}
.el-table__empty-block {
min-height: 240px !important;
background-size: unset !important;
}
.overflow-form-item .el-form-item__label {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dividing-line {
display: flex;
justify-content: center;
position: relative;
margin: 10px 0;
}
.dividing-line::after {
content: '';
position: absolute;
border-bottom: 1px solid #ebeef5;
width: calc(100% + 40px);
bottom: 0;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<template #header>
<h3 style="color: rgb(24, 103, 176);">{{cardTitle}}</h3>
</template>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="form">
<vi-title2 title="填写补助数据"></vi-title2>
<el-row>
<el-col :lg="8" :xs="24">
<el-form-item label="工号" prop="loginName">
<el-select :disabled="formDisabled"
:remote-method="searchUser"
@change="userChange"
clearable
filterable
placeholder="输入工号或者姓名查询"
remote
reserve-keyword
style="width: 100%"
v-model="formData.loginName">
<el-option
:key="item.loginName"
:label="item.userName+'('+item.loginName+')'"
:value="item.loginName"
v-for="item in userList"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="8" :xs="24">
<el-form-item label="姓名" prop="userName">
<el-input :disabled="!this.formData.id"
placeholder="输入工号之后自动显示"
v-model="formData.userName"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :xs="24">
<el-form-item label="单位" prop="unitName">
<el-input placeholder="输入工号之后自动显示"
v-model="formData.unitName"></el-input>
</el-form-item>
</el-col>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="8" :xs="24">
<el-form-item label="个人支付金额" prop="selfPayMoney">
<el-input-number :max="99999999.99" :min="3000.00"
:precision="2"
:step="1"
placeholder="请输入个人支付金额"
readonly
style="width: 100%"
v-model="formData.selfPayMoney"></el-input-number>
</el-form-item>
</el-col>
<el-col :lg="8" :xs="24">
<el-form-item label="申报年度" prop="year">
<el-date-picker
@change="applyYearChange"
:disabled="formDisabled"
:picker-options="pickerOptions"
placeholder="选择申报年度"
style="width: 100%"
type="year"
v-model="formData.year"
value-format="yyyy">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24" :xs="24">
<el-form-item label="备注" prop="remarks">
<el-input
:rows="3"
maxlength="50"
placeholder="可输入备注"
type="textarea"
v-model="formData.remarks">
</el-input>
</el-form-item>
</el-col>
</el-row>
<div class="dividing-line"></div>
<vi-title2 title="计算结果"></vi-title2>
<el-row :gutter="20">
<!-- <el-col :lg="8" :xs="24">-->
<!-- <el-form-item label="自费金额补助比例" prop="selfPaySubsidyRatio" class="overflow-form-item">-->
<!-- <template #label>-->
<!-- <el-tooltip effect="dark" content="自费金额补助比例" placement="top-start">-->
<!-- <span>自费金额补助比例</span>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- <el-input :value="selfPaySubsidyRatioPercent" readonly></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :lg="8" :xs="24">
<el-form-item label="额外补助比例" prop="otherSubsidyRatio">
<el-input :value="otherSubsidyRatioPercent" readonly></el-input>
</el-form-item>
</el-col>
<!-- <el-col :lg="8" :xs="24">-->
<!-- <el-form-item label="总补助比例" prop="totalSubsidyRatio">-->
<!-- <el-input :value="totalSubsidyRatioPercent" readonly></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-row>
<el-row :gutter="20">
<el-col :lg="8" :xs="24">
<el-form-item label="上一次补助年度" prop="lastTimeSubsidyYear">
<el-input readonly
v-model="formData.lastTimeSubsidyYear"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :xs="24">
<el-form-item class="overflow-form-item" label="入会年限∕是否享受过补助" prop="subsidyDesc">
<template #label>
<el-tooltip content="入会年限∕是否享受过补助" effect="dark" placement="top-start">
<span>入会年限∕是否享受过补助</span>
</el-tooltip>
</template>
<el-input readonly v-model="formData.subsidyDesc"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :xs="24">
<el-form-item label="补助金额" prop="subsidyMoney">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.subsidyMoney"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="historySubsidy">
<vi-title2 title="历史申请记录"></vi-title2>
<el-table :data="tableData" max-height="360">
<el-table-column label="年度" prop="year"></el-table-column>
<el-table-column label="个人支付金额" prop="selfPayMoney"></el-table-column>
<el-table-column label="个人支付金额补助比例" prop="selfPaySubsidyRatio">
<template scope="{row}">
{{row.selfPaySubsidyRatio ? row.selfPaySubsidyRatio * 1000 / 10 + '%' : null}}
</template>
</el-table-column>
<el-table-column label="额外补助比例" prop="otherSubsidyRatio">
<template scope="{row}">
{{row.otherSubsidyRatio!=null ? row.otherSubsidyRatio * 1000 / 10 + '%' : null}}
</template>
</el-table-column>
<el-table-column label="总补助比例" prop="totalSubsidyRatio">
<template scope="{row}">
{{row.totalSubsidyRatio ? row.totalSubsidyRatio * 1000 / 10 + '%' : null}}
</template>
</el-table-column>
<el-table-column label="补助金额" prop="subsidyMoney"></el-table-column>
<el-table-column label="上一次补助年度" prop="lastTimeSubsidyYear"></el-table-column>
<el-table-column label="备注" prop="remarks"></el-table-column>
<!-- <el-table-column label="是否接受补助" prop="isAccept">-->
<!-- <template scope="{row}">-->
<!-- <template v-if="row.isAccept!=null">-->
<!-- <span v-if="row.isAccept" class="text-success">-->
<!-- 接受-->
<!-- </span>-->
<!-- <span v-else class="text-danger">-->
<!-- 拒绝-->
<!-- </span>-->
<!-- </template>-->
<!-- <template v-else>-->
<!-- <span class="text-info">无</span>-->
<!-- </template>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</div>
<div class="calcRow">
<el-button v-if="formData.id" @click="sublime.jumpPagePjax('/platform/sickHelp/list')">返回补助台账
</el-button>
<el-button @click="calcSubsidy" type="primary">计算补助结果</el-button>
<el-button :disabled="!valid" @click="submitSubsidy" type="primary">提交补助结果</el-button>
</div>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
userList: [],
formData: {},
formRules: {
loginName: [{required: true, message: '请输入工号或者姓名查询用户', trigger: ['change', 'blur']}],
selfPayMoney: [{required: true, message: '请输入个人支付金额', trigger: ['change', 'blur']}],
year: [{required: true, message: '请选择申报年度', trigger: ['change', 'blur']}],
},
valid: false
}
},
computed: {
subsidyRatio() {
const subsidyRatio = this.formData.subsidyRatio
if (subsidyRatio) {
return subsidyRatio * 1000 / 10 + '%'
}
return null
},
pickerOptions() {
return {
disabledDate(time) {
return time.getTime() > Date.now()
}
}
},
selfPaySubsidyRatioPercent() {
if (this.formData.selfPaySubsidyRatio) {
return this.formData.selfPaySubsidyRatio * 1000 / 10 + '%'
}
return '0%'
},
otherSubsidyRatioPercent() {
if (this.formData.otherSubsidyRatio) {
return this.formData.otherSubsidyRatio * 1000 / 10 + '%'
}
return '0%'
},
totalSubsidyRatioPercent() {
if (this.formData.totalSubsidyRatio) {
return this.formData.totalSubsidyRatio * 1000 / 10 + '%'
}
return '0%'
},
cardTitle() {
return this.formData.id ? '编辑补助记录' : '新增补助记录'
},
formDisabled() {
return this.formData.id
}
},
methods: {
async calcSubsidy() {
try {
const valid = await this.$refs.form.validate()
if (!valid) return
const formData = clone(this.formData)
formData.selfPayMoney = formData.selfPayMoney.toFixed(2).toString()
const resp = await $.post('/platform/sickHelp/import/checkData', {sickHelps: JSON.stringify([formData])})
if (resp.code === 0) {
if (resp.data) {
const resp_data = resp.data[0]
if (resp_data.valid) {
this.valid = resp_data.valid
this.$set(this.formData, 'selfPaySubsidyRatio', resp_data.selfPaySubsidyRatio)
this.$set(this.formData, 'otherSubsidyRatio', resp_data.otherSubsidyRatio)
this.$set(this.formData, 'totalSubsidyRatio', resp_data.totalSubsidyRatio)
this.$set(this.formData, 'lastTimeSubsidyYear', resp_data.lastTimeSubsidyYear)
this.$set(this.formData, 'subsidyDesc', resp_data.subsidyDesc)
this.$set(this.formData, 'subsidyMoney', resp_data.subsidyMoney)
this.$set(this.formData, 'unitName', resp_data.unitName)
this.notifySuccess(resp_data.validMsg.join('、'))
} else {
this.notifyWarning(resp_data.validMsg.join('、'))
}
}
} else {
this.notifyWarning(resp.msg)
}
} catch (e) {
console.log(e)
}
},
async submitSubsidy() {
await this.calcSubsidy()
if (!this.valid) {
this.notifyWarning('数据校验不合格,无法提交')
return
}
const formData = clone(this.formData)
const resp = await $.post('/platform/sickHelp/import/doImport', {sickHelps: JSON.stringify([formData])})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.$refs.form.resetFields()
this.tableData = []
} else {
this.notifyError(resp.msg)
}
},
async searchUser(key) {
const resp = await $.post('/platform/sickHelp/import/searchUser/' + key)
this.userList = resp.data
},
async userChange(val) {
debugger
const user = this.userList.find(v => v.loginName === val)
this.$set(this.formData, 'userName', user.userName)
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'loginName', user.loginName)
await this.getHistoryApplyRecords(user.loginName, this.formData.year)
},
async getHistoryApplyRecords(loginName, year) {
const resp = await $.get('/platform/sickHelp/import/getHistorySubsidyByUser/' + loginName + '/' + year)
if (resp.code === 0) {
this.tableData = resp.data
}
},
applyYearChange() {
const {loginName, year} = this.formData
if (loginName && year) {
this.getHistoryApplyRecords(loginName, year)
}
},
async checkEdit() {
const id = GetQueryString("id")
if (!id) {
this.$set(this.formData, 'year', new Date().getFullYear() + '')
return
}
const resp = await $.get('/platform/sickHelp/import/findOne/' + id)
const loginName = resp.data.loginName
await this.searchUser(loginName)
resp.data.year = resp.data.year.toString()
this.formData = resp.data
await this.getHistoryApplyRecords(loginName, this.formData.year)
}
},
created() {
this.checkEdit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,475 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.downLoadTemplate {
position: absolute;
right: 0;
top: 0;
}
.dividing-line {
display: flex;
justify-content: center;
position: relative;
margin: 10px 0;
}
.dividing-line::after {
content: '';
position: absolute;
border-bottom: 1px solid #ebeef5;
width: calc(100% + 40px);
bottom: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">补助人:</div>
<div class="search-item-option">
<el-input clearable maxlength="10" placeholder="可输入补助人的工号或姓名进行查询"
v-model.trim="pageForm.subsidyUser"></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId" style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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 clearable filterable style="width: 100%"
v-model="pageForm.unitName">
<el-option :label="item.name"
:value="item.name"
v-for="item in units"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">是否会员:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.isMember">
<el-option label="全部" :value="null"></el-option>
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">是否符合:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.isMeetRequirements">
<el-option label="全部" :value="null"></el-option>
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</div>
</div>
<div class="search-item" v-if="pageForm.isMeetRequirements!==0">
<div class="search-item-label">是否接受:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.isAccept">
<el-option label="全部" :value="null"></el-option>
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="补助列表">
<template #func>
<el-button @click="oneKeyUpdateIsMeetRequirements" size="small" type="primary">一键设为符合申请
</el-button>
<el-button @click="oneKeyUpdateIsAccept" size="small" type="primary">一键设为接受补助
</el-button>
<el-button @click="importHistoryData" size="small" type="primary">导入历史数据</el-button>
<el-button @click="exportData" size="small" type="primary">导出补助汇总表</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80" fixed="left">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
:fixed="column.fixed"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='selfPaySubsidyRatio'">
{{row.selfPaySubsidyRatio * 1000 / 10 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='otherSubsidyRatio'">
{{row.otherSubsidyRatio * 1000 / 10 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='totalSubsidyRatio'">
{{row.totalSubsidyRatio * 1000 / 10 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isMeetRequirements'">
<el-switch
@change="(val)=>{isMeetRequirementsChange(row.id,val)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isMeetRequirements">
</el-switch>
</template>
<template scope="{row}" v-else-if="column.prop=='isAccept' ">
<el-switch
v-if="row.isMeetRequirements"
@change="(val)=>{isAcceptChange(row.id,val)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isAccept">
</el-switch>
</template>
<template scope="{row}" v-else-if="column.prop=='isMember'">
<span v-if="row.isMember==true" class="text-success">是</span>
<span v-if="row.isMember==false" class="text-danger">否</span>
<span v-if="row.isMember==null"></span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="200">
<template 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>
<template #public>
<el-row class="file-upload-container" justify="center" style="position: relative" type="flex">
<div class="downLoadTemplate">
<el-button @click="downLoadTemplate" size="small"
type="primary">
下载模板
</el-button>
</div>
<el-upload
:action="uploadUrl"
:auto-upload="true"
:file-list="files"
:limit="1"
:on-error="handleError"
:on-exceed="()=>{this.notifyWarning('只能上传一个文件')}"
:on-remove="(f,fl)=>{fileList = fl;excelTableData=[];}"
:on-success="handleSuccess"
accept=".xls,.xlsx"
drag
ref="excelUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</el-row>
<div class="dividing-line"></div>
<vi-title2 class="vi-title-top-border" title="excel数据">
<template #func>
<el-button @click="importData" class="importData" size="small" type="primary">导入数据</el-button>
</template>
</vi-title2>
<el-table :data="excelTableData" :size="tableSize"
@sort-change="pageOrder" header-align="center">
<el-table-column header-align="center" label="序号" type="index" width="80">
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='selfPaySubsidyRatio'">
{{row.selfPaySubsidyRatio * 1000 / 10 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='otherSubsidyRatio'">
{{row.otherSubsidyRatio * 1000 / 10 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='totalSubsidyRatio'">
{{row.totalSubsidyRatio * 1000 / 10 + '%'}}
</template>
</el-table-column>
</el-table>
<el-backtop :bottom="100" target="#app"></el-backtop>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'year', label: '年度', sortable: true, fixed: 'left'},
{prop: 'userName', label: '姓名', fixed: 'left'},
{prop: 'loginName', label: '工号', fixed: 'left', width: 120},
{prop: 'unionName', label: '分工会', sortable: true, width: 150},
{prop: 'unitName', label: '单位', sortable: true, width: 150},
{
prop: 'medicalFourTotalMoney',
label: '医保系统中个人自付、个人自理总金额(元)',
sortable: true,
width: 200
},
{prop: 'selfPayTotalMoney', label: '医保系统中个人自付金额(元)', sortable: true, width: 200},
{
prop: 'schoolSecondSubsidyMoney',
label: '学校补充医疗保险报销金额(元)',
sortable: true,
width: 200
},
{prop: 'selfPayMoney', label: '个人支付金额(元)', sortable: true, width: 170},
{prop: 'noLimitSubsidyMoney', label: '计算金额(元)', sortable: true, width: 150},
{prop: 'subsidyMoney', label: '补助金额(元)', sortable: true, width: 150},
{prop: 'noSubsidyYear', label: '未补助年份', sortable: true, width: 120},
{prop: 'isMember', label: '是否会员', sortable: true, width: 100},
// {prop: 'selfPaySubsidyRatio', label: '个人支付金额补助比例', sortable: true, width: 160},
// {prop: 'otherSubsidyRatio', label: '额外补助比例', sortable: true, width: 155},
// {prop: 'totalSubsidyRatio', label: '总补助比例', sortable: true, width: 155},
{prop: 'lastTimeSubsidyYear', label: '最近年度', sortable: true, width: 155},
// {prop: 'subsidyDesc', label: '入会年限∕是否享受过补助', width: 220},
{prop: 'isMeetRequirements', label: '是否符合申请要求', width: 220},
{prop: 'isAccept', label: '是否接受补助申请', width: 220}
],
pageForm: {
year: (new Date().getFullYear() - 1).toString(),
isMember: null,
unitName: '',
isMeetRequirements: null,
isAccept: null
},
unions: [],
units: [],
files: [],
uploadUrl: loc() + '/readExcelData',
excelTableData: []
}
},
methods: {
async importData() {
if (this.excelTableData.length === 0) {
this.notifyWarning('无数据')
return
}
const confirm = await this.$confirm('确定导入吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
const loading = this.$loading({
lock: true,
text: '导入中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/importHistoryData', {data: JSON.stringify(this.excelTableData)})
loading.close()
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.excelTableData = []
this.files = []
} else {
this.notifyWarning(resp.msg)
}
},
handleError(err) {
console.log(err)
},
handleSuccess(resp) {
if (resp.code === 0) {
this.excelTableData = resp.data
} else {
this.notifyWarning(resp.msg)
}
},
importHistoryData() {
this.$refs.guava.public()
},
downLoadTemplate() {
window.open(loc() + '/downLoadTemplate')
},
beforeUpload(file, files) {
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
const whiteList = ['xlsx']
if (!whiteList.includes(fileSuffix)) {
this.files = []
this.$message.warning('上传文件只能是' + whiteList.join(',') + '格式')
return false
}
this.files = files
},
async doDelete(id) {
const confirm = await this.$confirm('删除后补助数据可能会受到影响,您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doDelete/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
openEdit(row) {
sublime.jumpPagePjax('/platform/sickHelp/importByForm?id=' + row.id)
},
exportData() {
const {year, unitName, isMeetRequirements, isAccept} = this.pageForm
window.open(loc() + '/exportData?year=' + year + '&unitName=' + unitName + "&isMeetRequirements=" + isMeetRequirements + "&isAccept=" + isAccept)
},
async isMeetRequirementsChange(id, isMeetRequirements) {
const resp = await $.post(loc() + '/updateIsMeetRequirements', {id, isMeetRequirements})
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async isAcceptChange(id, isAccept) {
const resp = await $.post(loc() + '/updateIsAccept', {id, isAccept})
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async oneKeyUpdateIsMeetRequirements() {
const {year} = this.pageForm
if (!year) {
this.notifyWarning('请先选择年度')
return
}
const confirm = await this.$confirm('确认要将' + year + '的申请记录全部设为符合申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/oneKeyUpdateIsMeetRequirements', {year})
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async oneKeyUpdateIsAccept() {
const {year} = this.pageForm
if (!year) {
this.notifyWarning('请先选择年度')
return
}
const confirm = await this.$confirm('确认要将' + year + '的申请记录全部设为接受补助申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/oneKeyUpdateIsAccept', {year})
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
},
async created() {
this.flushUnits()
this.unions = await getUnions(null)
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,189 @@
const ecImport = {
template: /*language=HTML*/ `
<el-dialog :visible.sync="importVisible" title="导入学校二次报销金额数据" width="50%"
class="medical-import-dialog">
<div class="import-container">
<div class="template-download">
<el-button
type="primary"
icon="el-icon-download"
@click="downloadTemplate"
size="small">
下载导入模板
</el-button>
<span class="template-tip">请按照模板格式填写数据后上传</span>
</div>
<div class="text-center upload-area" v-loading="importLoading" element-loading-text="数据导入中">
<el-upload
class="mt10"
:action="uploadUrl"
:auto-upload="true"
:file-list="files"
:limit="1"
:on-exceed="()=>{this.notifyWarning('只能上传一个文件')}"
:on-progress="handleProgress"
:on-remove="(f,fl)=>{fileList = fl;}"
:on-success="handleSuccess"
accept=".xls,.xlsx"
drag
ref="excelUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</div>
<div class="import-results" v-if="importResult">
<el-card shadow="never" class="result-card">
<div slot="header" class="result-header">
<span>导入结果</span>
</div>
<div class="result-content">
<div class="result-item">
<span class="result-label">匹配成功数据数:</span>
<span class="result-value success">
{{ importResult.success || 0 }}
</span>
</div>
<div class="result-item">
<span class="result-label">匹配失败数据数:</span>
<span class="result-value warning">
{{ importResult.fail || 0 }}
<el-tooltip content="下载匹配失败数据" placement="top">
<i class="el-icon-download download-icon" @click="exportExcel('fail')"></i>
</el-tooltip>
</span>
</div>
</div>
</el-card>
</div>
</div>
</el-dialog>
`,
data() {
return {
files: [],
fileList: [],
uploadUrl: loc() + '/importEc',
importVisible: false,
importData: {},
importLoading: false,
importResult: {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
},
excelKeyMap: {
"userName": '姓名',
"loginName": '工号',
"ecbx": '学校二次报销金额'
}
}
},
methods: {
onOpen() {
this.importVisible = true
this.importResult = {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
}
},
handleSuccess(resp) {
this.importLoading = false
if (resp.code === 0) {
this.$message.success('导入成功')
this.importResult = resp.data
this.$emit('refresh', null)
} else {
this.$message.error('导入失败')
}
},
handleProgress() {
this.importLoading = true
},
beforeUpload(file, files) {
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
const whiteList = ['xlsx']
if (!whiteList.includes(fileSuffix)) {
this.files = []
this.$message.warning('上传文件只能是' + whiteList.join(',') + '格式')
return false
}
this.files = files
},
transformData(dataArray, excelKeyMap) {
if (!Array.isArray(dataArray) || dataArray.length === 0) {
return [];
}
return dataArray.map(v => {
let row = {};
const keys = Object.keys(excelKeyMap); // 缓存 keys 避免重复计算
keys.forEach(k1 => {
row[excelKeyMap[k1]] = v[k1];
});
return row;
});
},
exportExcel(type) {
let data = [];
if (type === 'total') {
if (!Array.isArray(this.importResult.totalData) || this.importResult.totalData.length === 0) {
this.$message.warning('没有数据可导出');
return;
}
data = this.transformData(this.importResult.totalData, this.excelKeyMap);
} else if (type === 'fail') {
if (!Array.isArray(this.importResult.failData) || this.importResult.failData.length === 0) {
this.$message.warning('没有数据可导出');
return;
}
data = this.transformData(this.importResult.failData, this.excelKeyMap);
}
const workName = type === 'total' ? '匹配成功数据' : '匹配失败数据';
const worksheetName = "Sheet1";
const fileName = workName + ".xlsx";
if (data.length === 0) {
this.$message.warning('没有数据可以生成工作表');
return;
}
const worksheet = XLSX.utils.json_to_sheet(data);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, worksheetName);
XLSX.writeFile(workbook, fileName);
},
downloadTemplate() {
// 创建一个空工作簿
const workbook = XLSX.utils.book_new();
// 创建示例数据
const templateData = [
{
"工号": "000001",
"姓名": "张三",
"学校二次报销金额": "10000.00"
}
];
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(templateData);
// 添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, "医保数据");
// 导出文件
XLSX.writeFile(workbook, "医保数据导入模板.xlsx");
}
}
};
@@ -0,0 +1,332 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.table-error-row {
color: #f00 !important;
}
.medical-import-dialog .import-container {
padding: 0 10px;
}
.medical-import-dialog .import-warnings {
margin-bottom: 20px;
}
.medical-import-dialog .warning-list {
margin: 8px 0 0 20px;
padding: 0;
line-height: 1.8;
}
.medical-import-dialog .warning-list li {
list-style-type: decimal;
}
.medical-import-dialog .warning-list .important {
color: #e6a23c;
font-weight: bold;
list-style-type: none;
margin-top: 8px;
}
.medical-import-dialog .upload-area {
padding: 20px;
border: 1px dashed #dcdfe6;
border-radius: 4px;
background-color: #f5f7fa;
}
.medical-import-dialog .upload-area:hover {
border-color: #c0c4cc;
}
.medical-import-dialog .import-results {
margin-top: 20px;
}
.medical-import-dialog .result-card {
border: none;
}
.medical-import-dialog .result-header {
font-weight: bold;
font-size: 16px;
}
.medical-import-dialog .result-content {
font-size: 14px;
}
.medical-import-dialog .result-item {
margin-bottom: 10px;
}
.medical-import-dialog .result-item:last-child {
margin-bottom: 0;
}
.medical-import-dialog .result-label {
color: #606266;
}
.medical-import-dialog .result-value {
font-weight: bold;
position: relative;
padding-right: 20px;
}
.medical-import-dialog .result-value.success {
color: #67c23a;
}
.medical-import-dialog .result-value.warning {
color: #e6a23c;
}
.medical-import-dialog .download-icon {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
color: #409EFF;
font-size: 16px;
margin-left: 5px;
}
.medical-import-dialog .download-icon:hover {
color: #66b1ff;
}
.medical-import-dialog .mb-10 {
margin-bottom: 10px;
}
.medical-import-dialog .mt10 {
margin-top: 10px;
}
.medical-import-dialog .template-download {
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
}
.medical-import-dialog .template-tip {
color: #909399;
font-size: 12px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">关键字:</div>
<div class="search-item-option">
<el-input clearable placeholder="可输入工号、姓名、身份证号查询"
v-model.trim="pageForm.searchKeyword"></el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">数据检查:</div>
<div class="search-item-option">
<el-select v-model="pageForm.dataCheck" clearable style="width: 100%" placeholder="请选择">
<el-option label="医保数据匹配失败记录" value="1"></el-option>
<el-option label="学习二次报销数据匹配失败记录" value="2"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="补助列表">
<template #func>
<el-button @click="$refs.insImportRef.onOpen()" size="small" type="primary">① 导入医保数据
</el-button>
<el-button @click="openEc" size="small" type="primary">② 导入学校二次报销数据
</el-button>
<el-button @click="exportXlsx" size="small" type="primary">导出汇总表</el-button>
<el-button @click="doCalculate" size="small" type="primary">计算补助数据</el-button>
</template>
</table-tool>
<el-table :data="tableData"
:size="tableSize"
@sort-change="pageOrder"
align="center"
header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80" fixed="left">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
:fixed="column.fixed"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column label="操作" align="center" header-align="center" fixed="right" width="200">
<template scope="scope">
<el-button @click="onEdit(scope.row)" size="mini" type="primary">编辑</el-button>
<el-button @click="onDelete(scope.row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<ins-import ref="insImportRef" @refresh="doSearch"></ins-import>
<ec-import ref="ecImportRef" @refresh="doSearch"></ec-import>
<ins-form ref="insFormRef" @refresh="doSearch"></ins-form>
</div>
<script>
<!--#include('insImport.js'){}#-->
<!--#include('insForm.js'){}#-->
<!--#include('ecImport.js'){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
"ins-import": insImport,
"ec-import": ecImport,
"ins-form": insForm
},
data() {
return {
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'idCard', label: '身份证号', width: 200},
{prop: 'zhzl', label: '账户自理'},
{prop: 'zhzf', label: '账户自付'},
{prop: 'xjzl', label: '现金自理'},
{prop: 'xjzf', label: '现金自付'},
{prop: 'sxzf', label: '个人自付、个人自理'},
{prop: 'lxzf', label: '个人自付'},
{prop: 'ecbx', label: '学校二次报销金额'},
{prop: 'calc', label: '补助计算金额'},
],
pageForm: {
year: (new Date().getFullYear() - 1).toString()
}
}
},
methods: {
openEc() {
$.post('/platform/sickHelp/medicalIns/checkIns').then(res => {
if (res.code === 0) {
this.$refs.ecImportRef.onOpen()
} else {
this.$message.error(res.msg)
}
})
},
onEdit(row) {
this.$refs.insFormRef.onOpen(row)
},
onDelete(id) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
$.post(loc() + '/delete', {id: id}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
})
},
async doCalculate() {
const {code, msg} = await $.post(loc() + '/checkIns')
if (code === 0) {
$.post(loc() + '/checkEc').then(res => {
if (res.code === 0) {
this.$confirm('计算补助金额将会自动过滤掉补助计算金额小于10000元的记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
sublime.jumpPagePjax('/platform/sickHelp/importByExcel?mode=ins')
}).catch(() => {
});
} else {
this.$message.error(res.msg)
}
})
} else {
this.$message.error(msg)
}
},
exportXlsx() {
const {year} = this.pageForm
if (!year) {
this.$message.error('请选择年份')
return
}
window.open(loc() + '/exportXlsx?year=' + year)
},
tableRowClassName({row, rowIndex}) {
if (!row.loginName || row.loginName === '' || row.loginName === undefined) {
return 'table-error-row'
}
// if (row.loginName && ( !row.ecbx || row.ecbx === '' || row.ecbx === undefined)) {
// return 'table-error-row'
// }
return '';
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,162 @@
const insForm = {
template: /*language=HTML*/ `
<el-dialog :title="title" :visible.sync="visible" :close-on-click-modal="false">
<el-form :model="form" :rules="rules" ref="form" label-width="150px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="工号" prop="loginName">
<el-select
v-model="form.loginName"
style="width: 100%"
@change="loginNameChange"
filterable
remote
reserve-keyword
placeholder="请输入关键词"
:remote-method="remoteMethod">
<el-option
v-for="item in userOptions"
:key="item.loginname"
:label="item.username+'-'+item.loginname"
:value="item.loginname">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名" prop="userName">
<el-input v-model="form.userName" maxlength="50" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="身份证号" prop="idCard">
<el-input v-model="form.idCard"></el-input>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="账户自理" prop="zhzl">
<el-input-number v-model="form.zhzl" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账户自付" prop="zhzf">
<el-input-number v-model="form.zhzf" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="现金自理" prop="xjzl">
<el-input-number v-model="form.xjzl" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="现金自付" prop="xjzf">
<el-input-number v-model="form.xjzf" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="两项自付之和" prop="lxzf">
<el-input-number v-model="form.lxzf" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="四项之和金额" prop="sxzf">
<el-input-number v-model="form.sxzf" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="学校二次报销金额" prop="ecbx">
<el-input-number v-model="form.ecbx" :precision="2" :step="0.1"></el-input-number>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="onSave">确定</el-button>
</div>
</el-dialog>
`,
data() {
return {
title: '新增',
visible: false,
form: {},
rules: {
loginName: [
{required: true, message: '请输入工号', trigger: 'blur'}
],
userName: [
{required: true, message: '请输入姓名', trigger: 'blur'}
],
idCard: [
{required: true, message: '请输入身份证号', trigger: 'blur'}
],
zhzl: [
{required: true, message: '请输入账户自理', trigger: 'blur'}
],
zhzf: [
{required: true, message: '请输入账户自付', trigger: 'blur'}
],
xjzl: [
{required: true, message: '请输入现金自理', trigger: 'blur'}
],
xjzf: [
{required: true, message: '请输入现金自付', trigger: 'blur'}
],
lxzf: [
{required: true, message: '请输入两项自付之和', trigger: 'blur'}
],
sxzf: [
{required: true, message: '请输入四项之和金额', trigger: 'blur'}
]
},
userOptions: {}
}
},
methods: {
onOpen(row = {}) {
this.visible = true
this.form = {...row}
},
remoteMethod(query) {
if (query) {
$.post('/platform/sickHelp/medicalIns/queryUser', {query}).then(res => {
if (res.code === 0) {
this.userOptions = res.data
}
})
}
},
loginNameChange(val) {
console.log(val)
const user = this.userOptions.find(v => v.loginname === val)
if (user) {
this.form.userName = user.username
}
},
onSave() {
this.$refs.form.validate(valid => {
if (valid) {
$.post('/platform/sickHelp/medicalIns/update', this.form).then(res => {
if (res.code === 0) {
this.visible = false
this.$message.success("保存成功")
this.$emit('refresh')
} else {
this.$message.error(res.msg)
}
})
}
})
}
}
};
@@ -0,0 +1,215 @@
const insImport = {
template: /*language=HTML*/ `
<el-dialog :visible.sync="importVisible" title="导入医保数据" width="50%" class="medical-import-dialog">
<div class="import-container">
<div class="template-download">
<el-button
type="primary"
icon="el-icon-download"
@click="downloadTemplate"
size="small">
下载导入模板
</el-button>
<span class="template-tip">请按照模板格式填写数据后上传,填写不完整将会导致数据解析错误</span>
</div>
<div class="import-warnings">
<el-alert type="warning" :closable="false" show-icon class="mb-10">
<ul class="warning-list">
<li>导入之前请确认大病互助会员库数据是最新且准确的</li>
<li>导入会先过滤掉四项之和小于10000的(达不到补助标准)</li>
<li>导入会过滤掉非会员数据</li>
<li>重新导入会自动更新或者新增</li>
</ul>
</el-alert>
</div>
<div class="text-center upload-area" v-loading="importLoading" element-loading-text="数据导入中">
<el-upload
class="mt10"
:action="uploadUrl"
:auto-upload="true"
:file-list="files"
:limit="1"
:on-exceed="()=>{this.$message.warning('只能上传一个文件')}"
:on-progress="handleProgress"
:on-remove="(f,fl)=>{fileList = fl;}"
:on-success="handleSuccess"
accept=".xls,.xlsx"
drag
ref="excelUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</div>
<div class="import-results" v-if="importResult">
<el-card shadow="never" class="result-card">
<div slot="header" class="result-header">
<span>导入结果</span>
</div>
<div class="result-content">
<div class="result-item">
<span class="result-label">人员总数据数:</span>
<span class="result-value">
{{ importResult.total || 0 }}
<el-tooltip content="下载完整数据" placement="top">
<i class="el-icon-download download-icon" @click="exportExcel('total')"></i>
</el-tooltip>
</span>
</div>
<div class="result-item">
<span class="result-label">匹配成功数据数:</span>
<span class="result-value success">
{{ importResult.success || 0 }}
</span>
</div>
<div class="result-item">
<span class="result-label">匹配失败数据数:</span>
<span class="result-value warning">
{{ importResult.fail || 0 }}
<el-tooltip content="下载匹配失败数据" placement="top">
<i class="el-icon-download download-icon" @click="exportExcel('fail')"></i>
</el-tooltip>
</span>
</div>
</div>
</el-card>
</div>
</el-dialog>
`,
data() {
return {
files: [],
fileList: [],
uploadUrl: loc() + '/importIns',
importVisible: false,
importData: {},
importLoading: false,
importResult: {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
},
excelKeyMap: {
"idCard": '身份证号',
"userName": '姓名',
"zhzl": '账户自理',
"zhzf": '账户自付',
"xjzl": '现金自理',
"xjzf": '现金自付',
"errMsg": '错误记录'
}
}
},
methods: {
onOpen() {
this.importVisible = true
this.importResult = {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
}
},
handleSuccess(resp) {
this.importLoading = false
if (resp.code === 0) {
this.$message.success('导入成功')
this.importResult = resp.data
this.$emit('refresh', null)
} else {
this.$message.error('导入失败')
}
},
handleProgress() {
this.importLoading = true
},
beforeUpload(file, files) {
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
const whiteList = ['xlsx']
if (!whiteList.includes(fileSuffix)) {
this.files = []
this.$message.warning('上传文件只能是' + whiteList.join(',') + '格式')
return false
}
this.files = files
},
transformData(dataArray, excelKeyMap) {
if (!Array.isArray(dataArray) || dataArray.length === 0) {
return [];
}
return dataArray.map(v => {
let row = {};
const keys = Object.keys(excelKeyMap); // 缓存 keys 避免重复计算
keys.forEach(k1 => {
row[excelKeyMap[k1]] = v[k1];
});
return row;
});
},
exportExcel(type) {
let data = [];
if (type === 'total') {
if (!Array.isArray(this.importResult.totalData) || this.importResult.totalData.length === 0) {
this.$message.warning('没有数据可导出');
return;
}
data = this.transformData(this.importResult.totalData, this.excelKeyMap);
} else if (type === 'fail') {
if (!Array.isArray(this.importResult.failData) || this.importResult.failData.length === 0) {
this.$message.warning('没有数据可导出');
return;
}
data = this.transformData(this.importResult.failData, this.excelKeyMap);
}
const workName = type === 'total' ? '总数据' : '匹配失败数据';
const worksheetName = "Sheet1";
const fileName = workName + ".xlsx";
if (data.length === 0) {
this.$message.warning('没有数据可以生成工作表');
return;
}
const worksheet = XLSX.utils.json_to_sheet(data);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, worksheetName);
XLSX.writeFile(workbook, fileName);
},
downloadTemplate() {
// 创建一个空工作簿
const workbook = XLSX.utils.book_new();
// 创建示例数据
const templateData = [
{
"人员姓名": "张三",
"身份证号": "1234567890",
"账户自理": "10000.00",
"账户自付": "10000.00",
"现金自理": "10000.00",
"现金自付": "10000.00"
}
];
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(templateData);
// 添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, "医保数据");
// 导出文件
XLSX.writeFile(workbook, "医保数据导入模板.xlsx");
}
}
};
@@ -0,0 +1,166 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.downLoadTemplate {
position: absolute;
right: 0;
top: 0;
}
.dividing-line {
display: flex;
justify-content: center;
position: relative;
margin: 10px 0;
}
.dividing-line::after {
content: '';
position: absolute;
border-bottom: 1px solid #ebeef5;
width: calc(100% + 40px);
bottom: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<template #header>
<h3 style="color: rgb(24, 103, 176);">重大疾病医疗互助会员数据导入</h3>
</template>
<el-row justify="center" style="position: relative" type="flex">
<div class="downLoadTemplate">
<el-button @click="downLoadTemplate" size="small"
type="primary">
下载模板
</el-button>
</div>
<el-upload
:action="uploadUrl"
:auto-upload="true"
:file-list="files"
:limit="1"
:on-error="handleError"
:on-exceed="()=>{this.notifyWarning('只能上传一个文件')}"
:on-remove="(f,fl)=>{fileList = fl;excelTableData=[];}"
:on-success="handleSuccess"
accept=".xls,.xlsx"
drag
ref="excelUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</el-row>
<div class="dividing-line"></div>
<vi-title2 title="excel数据">
<template #func>
<el-button @click="importData" size="small" type="primary">导入数据</el-button>
</template>
</vi-title2>
<el-table :data="excelTableData" :size="tableSize"
@sort-change="pageOrder"
header-align="center"
height="480" max-height="480">
<el-table-column header-align="center" label="序号" type="index" width="80">
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='tips'">
<span class="text-warning" v-if="row.id">
数据库已存在该用户信息
</span>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
excelTableData: [],
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'unitName', label: '单位'},
{prop: 'userState', label: '状态'},
{prop: 'mutualGoldStartTime', label: '入会时间'},
{prop: 'tips', label: '提示'},
],
files: [],
uploadUrl: loc() + '/readExcelData',
}
},
methods: {
handleError(err) {
console.log(err)
},
handleSuccess(resp) {
this.excelTableData = resp.data
},
downLoadTemplate() {
window.open(loc() + '/downLoadTemplate')
},
beforeUpload(file, files) {
const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
const whiteList = ['xlsx']
if (!whiteList.includes(fileSuffix)) {
this.files = []
this.$message.warning('上传文件只能是' + whiteList.join(',') + '格式')
return false
}
this.files = files
},
async importData() {
if (!this.excelTableData.length) {
this.notifyWarning('无数据')
return
}
const confirm = await this.$confirm('您确定导入吗,新数据将覆盖旧数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const loading = this.$loading({
lock: true,
text: '导入中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
const resp = await $.post(loc() + '/doImport', {data: JSON.stringify(this.excelTableData)})
loading.close()
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.excelTableData = []
this.files = []
} else {
this.notifyWarning(resp.msg)
}
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,338 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">入会时间:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择入会时间"
style="width: 100%"
type="year"
v-model="pageForm.mutualGoldStartTime"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">工号姓名:</div>
<div class="search-item-option">
<el-input clearable maxlength="10" placeholder="可输入会员的工号或姓名进行查询"
v-model.trim="pageForm.keyWord"></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="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<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="true"
filterable="true">
<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-input clearable maxlength="200" placeholder="可输入单位进行查询"-->
<!-- v-model.trim="pageForm.unitName"></el-input>-->
<!-- </div>-->
<!-- </div>-->
<div class="search-item">
<div class="search-item-label">状态:</div>
<div class="search-item-option">
<el-input clearable maxlength="200" placeholder="可输入状态进行查询"
v-model.trim="pageForm.userState"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="重大疾病医疗互助会员台账">
<template #func>
<el-radio-group v-model="pageForm.checkMode" size="small" @change="doSearch" class="mr10">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">姓名重复人员</el-radio-button>
<el-radio-button label="2">身份证号重复人员</el-radio-button>
</el-radio-group>
<el-button type="primary" size="small" icon="el-icon-plus" @click="openAdd">新增</el-button>
<el-button @click="exportAllMember" size="small" type="primary">导出全部会员信息
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder" header-align="center">
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='subsidyRatio'">
{{row.subsidyRatio * 100 + '%'}}
</template>
<template scope="{row}" v-else-if="column.prop=='isMember'">
<span v-if="row.isMember==true">是</span>
<span v-if="row.isMember==false">否</span>
<span v-if="row.isMember==null"></span>
</template>
<template scope="{row}" v-else-if="column.prop==='mutualGoldStartTime'">
<span v-if="row.mutualGoldStartTime">
{{moment(row.mutualGoldStartTime).format('YYYY-MM')}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template 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 :close-on-click-modal="false" :visible.sync="editDialogVisible" title="编辑">
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-form-item label="姓名" prop="userName">
<el-input maxlength="10" v-model.trim="formData.userName"></el-input>
</el-form-item>
<el-form-item label="工号" prop="loginName">
<el-input maxlength="10" v-model.trim="formData.loginName"></el-input>
</el-form-item>
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio-button label="男"></el-radio-button>
<el-radio-button label="女"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="单位" prop="unitId">
<el-select clearable filterable style="width: 100%"
v-model="formData.unitId">
<el-option :label="item.name"
:value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否会员" prop="isMember">
<el-radio-group v-model="formData.isMember" size="small">
<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="userState">
<!-- <el-select v-model="formData.userState">-->
<!-- <el-option v-for="item in units"-->
<!-- ></el-option>-->
<!-- </el-select>-->
<el-input maxlength="10" v-model.trim="formData.userState"></el-input>
</el-form-item>
<el-form-item label="入会时间" prop="mutualGoldStartTime">
<el-date-picker
:picker-options="pickerOptions"
placeholder="入会时间"
style="width: 100%"
type="month"
v-model="formData.mutualGoldStartTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" maxlength="100" type="textarea"></el-input>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="editDialogVisible=false">取消</el-button>
<el-button @click="doHandle" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{prop: 'userName', label: '姓名', sortable: true},
{prop: 'loginName', label: '工号', sortable: true},
{prop: 'sex', label: '性别', sortable: true},
{prop: 'unitName', label: '单位', sortable: true},
{prop: 'idcard', label: '身份证号', sortable: true},
{prop: 'isMember', label: '是否会员', sortable: true},
{prop: 'userState', label: '状态', sortable: true},
{prop: 'mutualGoldStartTime', label: '入会时间', sortable: true},
{prop: 'remark', label: '备注', sortable: true},
],
units: [],
rules: {
loginName: [{required: true, message: '请输入工号', trigger: ['change', 'blur']}],
userName: [{required: true, message: '请输入姓名', trigger: ['change', 'blur']}],
// sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}],
unitName: [{required: false, message: '请输入单位', trigger: ['change', 'blur']}],
unitId: [{required: true, message: '请选择单位', trigger: ['change', 'blur']}],
isMember: [{required: true, message: '请选择是否会员', trigger: ['change', 'blur']}],
userState: [{required: true, message: '请输入状态', trigger: ['change', 'blur']}],
mutualGoldStartTime: [{required: true, message: '请输入入会时间', trigger: ['change', 'blur']}],
},
editDialogVisible: false,
pageForm: {
unitName: '',
checkMode: ''
},
formData: {
userName: null,
loginName: null,
sex: null,
unitName: null,
unitId: null,
isMember: null,
userState: null,
mutualGoldStartTime: null
},
unions: [],
units: []
}
},
computed: {
pickerOptions() {
return {
disabledDate(time) {
return time.getTime() > Date.now()
}
}
}
},
methods: {
exportAllMember() {
const {mutualGoldStartTime, keyWord, unionId, unitId, userState, checkMode} = this.pageForm
let url = loc() + '/exportAllMember?'
const params = []
if (mutualGoldStartTime !== undefined && mutualGoldStartTime !== null) {
params.push('mutualGoldStartTime=' + mutualGoldStartTime)
}
if (keyWord) {
params.push('keyWord=' + encodeURIComponent(keyWord))
}
if (unionId) {
params.push('unionId=' + unionId)
}
if (unitId) {
params.push('unitId=' + unitId)
}
if (userState) {
params.push('userState=' + encodeURIComponent(userState))
}
if (checkMode !== undefined && checkMode !== null && checkMode !== '') {
params.push('checkMode=' + checkMode)
}
window.open(url + params.join('&'))
},
async doDelete(id) {
const confirm = await this.$confirm('删除后补助数据可能会受到影响,您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doDelete/' + id)
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
openEdit(row) {
this.editDialogVisible = true
this.$nextTick(() => {
this.formData = {...row}
this.formData.unitId = this.formData.unitId.toString()
console.log(this.formData)
})
},
async doHandle() {
const valid = await this.$refs.form.validate()
if (!valid) return
const url = this.formData.id ? '/doEdit' : '/doAdd'
const resp = await $.post(loc() + url, this.formData)
if (resp.code === 0) {
this.pageData()
this.editDialogVisible = false
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
openAdd() {
this.editDialogVisible = true
this.$nextTick(() => {
this.$refs.form.resetFields()
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = await getUnits(this.pageForm.unionId)
},
},
created() {
this.pageData()
getUnions(null).then(res => this.unions = res)
getUnits(null).then(res => this.units = res)
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,296 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="我的补助列表">
<template #func>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='isMeetRequirements'">
<span class="text-success" v-if="row.isMeetRequirements">
符合
</span>
<span class="text-danger" v-else>
不符合
</span>
</template>
<template scope="{row}" v-else-if="column.prop==='isAccept'">
<span v-if="row.isAccept !== null"
:class="{'text-success': row.isAccept, 'text-danger': !row.isAccept}">
{{ row.isAccept ? '申请' : '放弃' }}
</span>
<span v-else class="text-info">无</span>
</template>
</el-table-column>
<el-table-column label="操作" width="400">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button @click="exportApplyPaper(row.id)" size="mini" type="primary">导出</el-button>
<el-button :disabled="row.isAccept!=null || !row.isMeetRequirements || row.stateCode > 210"
@click="applySubsidy(row)" size="mini"
type="primary">申请
</el-button>
<el-button :disabled="!row.isMeetRequirements || row.stateCode > 210 || row.isAccept==0"
@click="userHandler(row.id,row.isAccept,false)"
size="mini"
type="danger">放弃
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
</guava>
<el-dialog :close-on-click-modal="false" :visible.sync="applyDialog" title="申请补助" width="60%">
<el-form :model="formData" :rules="rules" label-width="auto" ref="form">
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="姓名" prop="userName">
<el-input :value="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="mini">
<el-radio label="男" border>男</el-radio>
<el-radio label="女" border>女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
style="width: 100%"
type="date"
v-model="formData.birthday"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="参加大病医疗互助时间" prop="mutualGoldStartTime">
<el-date-picker
readonly
style="width: 100%"
type="year"
v-model="formData.mutualGoldStartTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="工作单位" prop="unitName">
<el-input :value="formData.unitName"></el-input>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="家庭住址" prop="homeAddress">
<el-input v-model="formData.homeAddress"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请理由" prop="applyReason">
<el-input
:autosize="{ minRows: 3, maxRows: 5}"
autosize
placeholder="请输入申报补助理由(患何种疾病)"
type="textarea"
v-model="formData.applyReason">
</el-input>
</el-form-item>
<el-row :gutter="10">
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="个人支付金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.selfPayMoney"></el-input-number>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24" :xl="12" :xs="24">
<el-form-item label="补助金额">
<el-input-number :max="99999999.99" :min="0" :precision="2"
readonly
style="width: 100%" v-model="formData.subsidyMoney"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请人签字" prop="applyUserSign">
<sign :qz.sync="formData.applyUserSign"></sign>
</el-form-item>
<el-row class="mt10" justify="end" type="flex">
<el-button @click="applyDialog=false">取消</el-button>
<el-button @click="doApply" type="primary">提交</el-button>
</el-row>
</el-form>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'unitName', label: '单位', sortable: true},
// {prop: 'unionName', label: '分工会', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '个人支付金额', sortable: true},
{prop: 'subsidyMoney', label: '补助金额', sortable: true},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
{prop: 'remarks', label: '备注'},
{prop: 'isMeetRequirements', label: '是否符合申请要求'},
{prop: 'isAccept', label: '是否接受补助'},
{prop: 'stateName', label: '审核状态'}
],
pageForm: {
year: null
},
formData: {},
rules: {
applyUserSign: [{required: true, message: '请签字', trigger: ['change', 'blur']}],
applyReason: [{required: true, message: '请输入申请理由', trigger: ['change', 'blur']}],
sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}],
birthday: [{required: true, message: '请输入出生年月', trigger: ['change', 'blur']}],
mutualGoldStartTime: [{required: true, message: '请输入参加大病医疗互助时间', trigger: ['change', 'blur']}],
unitName: [{required: true, message: '请输入工作单位', trigger: ['change', 'blur']}],
homeAddress: [{required: true, message: '请输入家庭住址', trigger: ['change', 'blur']}],
},
applyDialog: false
}
},
methods: {
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async userHandler(id, isAccept, userChoice) {
if (isAccept) return
const msg = '您确认要' + (userChoice ? '接受' : '放弃') + '该补助吗?'
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/acceptSubsidy', {id, isAccept: userChoice})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyError(resp.msg)
}
},
//申请补助
applySubsidy(row) {
this.formData = clone(row)
this.applyDialog = true
this.getApplyUserInfo(row.loginName)
},
async getApplyUserInfo(loginName) {
const resp = await $.get(loc() + '/getApplyUserInfo', {loginName})
if (resp.code === 0) {
const {userName, loginName, unitName, sex, homeAddress, birthday, mutualGoldStartTime} = resp.data
this.$set(this.formData, 'userName', userName)
this.$set(this.formData, 'loginName', loginName)
this.$set(this.formData, 'unitName', unitName)
this.$set(this.formData, 'sex', sex)
this.$set(this.formData, 'homeAddress', homeAddress)
this.$set(this.formData, 'birthday', birthday)
this.$set(this.formData, 'mutualGoldStartTime', mutualGoldStartTime)
}
},
async doApply() {
const valid = await this.$refs['form'].validate()
if (!valid) return
const resp = await $.post(loc() + '/doApply', this.formData)
if (resp.code === 0) {
this.applyDialog = false
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyWarning(resp.msg)
}
},
exportApplyPaper(id) {
window.open(loc() + '/exportApplyPaper?id=' + id)
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,219 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度查询:</div>
<div class="search-item-option" style="display: flex;column-gap: 10px">
<el-date-picker
placeholder="选择开始年度"
style="width: 50%"
type="year"
value-format="yyyy"
v-model="pageForm.startYear">
</el-date-picker>
<el-date-picker
placeholder="选择结束年度"
style="width: 50%"
type="year"
value-format="yyyy"
v-model="pageForm.endYear">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 80px;">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></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="true"
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}"
filterable="true">
<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="true"
filterable="true">
<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-radio-group @change="doSearch" v-model="pageForm.isAccept">
<el-radio-button :label="0">全部</el-radio-button>
<el-radio-button :label="1">申请</el-radio-button>
<el-radio-button :label="-1">放弃</el-radio-button>
</el-radio-group>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="补助汇总列表">
<template #func>
<el-button @click="exportSubsidiesAmountTable" size="small" type="primary">导出补助金额情况表
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center" header-align="center">
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isAccept'">
<span v-if="row.isAccept !== null"
:class="{'text-success': row.isAccept, 'text-danger': !row.isAccept}">
{{ row.isAccept ? '申请' : '放弃' }}
</span>
<span v-else class="text-info">无</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<sick-help-info ref="sickView"></sick-help-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'SickHelpInfo': httpVueLoader('/components/sickHelp/SickHelpInfo.vue'),
},
data() {
return {
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'unitName', label: '单位', sortable: true},
// {prop: 'unionName', label: '分工会', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'selfPayMoney', label: '个人支付金额(元)', sortable: true},
{prop: 'subsidyMoney', label: '补助金额(元)', sortable: true},
// {prop: 'subsidyRatio', label: '补助比例', sortable: true},
// {prop: 'isMeetRequirements', label: '是否符合申请要求'},
{prop: 'isAccept', label: '是否接受补助'},
{prop: 'stateName', label: '审核状态'},
// {prop: 'remarks', label: '备注'},
],
pageForm: {
startYear: (new Date().getFullYear() - 1).toString(),
endYear: (new Date().getFullYear()).toString(),
searchName: 'u.username',
isAccept: 1
},
unions: [],
units: [],
formData: {},
rules: {
applyUserSign: [{required: true, message: '请签字', trigger: ['change', 'blur']}],
applyReason: [{required: true, message: '请输入申请理由', trigger: ['change', 'blur']}],
sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}],
birthday: [{required: true, message: '请输入出生年月', trigger: ['change', 'blur']}],
mutualGoldStartTime: [{
required: true,
message: '请输入参加大病医疗互助时间',
trigger: ['change', 'blur']
}],
unitName: [{required: true, message: '请输入工作单位', trigger: ['change', 'blur']}],
homeAddress: [{required: true, message: '请输入家庭住址', trigger: ['change', 'blur']}],
},
applyDialog: false
}
},
methods: {
openView(id) {
this.$refs.guava.view()
this.$refs.sickView.openView(id)
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
exportSubsidiesAmountTable() {
const {startYear, endYear} = this.pageForm
if (!startYear && !endYear) {
this.notifyWarning('请先选择需要导出的年度')
return
}
window.open(loc() + '/exportSubsidiesAmountTable?startYear=' + startYear + '&endYear=' + endYear + '&isAccept=' + this.pageForm.isAccept)
}
},
async created() {
this.pageData()
this.unions = await getUnions()
this.flushUnits()
}
})
</script>
<!--#
}
#-->