first commit

This commit is contained in:
2026-09-09 09:14:28 +08:00
commit 5343198112
5199 changed files with 1052895 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,218 @@
<template>
<div>
<div class="pull-right offscreen-right mt5">
<el-button icon="el-icon-close" type="primary" size="small" :loading="submitLoading" plain
@click="joinMemberFamily">批量删除
</el-button>
</div>
<el-table :data="tableData" style="width: 100%;" row-key="id"
@sort-change="pageOrder" v-loading="tableLoading" :size="tableSize" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column :reserve-selection="true"
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod"
label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
<template scope="{row}" v-if="column.prop=='name'">
<span v-if="row.name">{{ row.name }}</span>
<span v-if="!row.name">暂无</span>
</template>
<template scope="{row}" v-else-if="column.prop=='identity'">
<el-tag v-if="row.identity.includes(1)" effect="light">运动员</el-tag>
<el-tag v-if="row.identity.includes(2)" type="success" effect="light">教练
</el-tag>
<el-tag v-if="row.identity.includes(3)" type="warning" effect="light">领队
</el-tag>
<el-tag v-if="row.identity.includes(4)" type="warning"
effect="light">处级领导
</el-tag>
<el-tag v-if="row.identity.includes(5)" type="warning" effect="light">替补
</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='divisionLevelLeadership'">
<span v-if="row.divisionLevelLeadership==true">是</span>
<span v-else>否</span>
</template>
<template scope="{row}" v-else-if="column.prop=='status'">
<span v-if="row.status==1">待审核</span>
<span v-if="row.status==2" style="color: #66BD3D">报名成功</span>
<span v-if="row.status==3" style="color: red">审核不通过</span>
</template>
<template scope="{row}" v-else-if="column.prop=='awardsMode'">
<span v-if="row.awardsMode==1">团体</span>
<span v-if="row.awardsMode==2">单项</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="150px">
<template scope="{row}">
<el-button type="danger" icon="el-icon-delete" circle plain
@click="doDelete(row)"></el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</div>
</template>
<script>
module.exports = {
props: {
event_list: {
type: Object,
default: {},
},
},
mixins: [initTableMixins],
data() {
return {
pageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
selection: [],
tableColumns: [
{prop: 'name', label: '所属小队'},
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '工号'},
{prop: 'mobile', label: '电话'},
{prop: 'sex', label: '性别'},
{prop: 'identity', label: '身份', sortable: true},
// {prop: 'divisionLevelLeadership', label: '是否处级领导', sortable: true},
{prop: 'status', label: '状态', sortable: true},
// {prop: 'awardsMode', label: '项目类型'},
{prop: 'allName', label: '报名项目'},
],
}
},
watch: {
event_list(val) {
this.pageForm.activityId = val.activityId
this.pageForm.eventId = val.eventId
this.applyPageData(val)
}
},
methods: {
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.applyPageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.applyPageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.applyPageData();
},
doDelete(row) {
const {id} = row
this.$confirm('确定要删除该报名人员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
this.$set(row, "loading", true)
const resp = await $.post(loc() + "/doDelete", {id: id});
if (resp.code === 0) {
this.applyPageData()
this.$emit('flush')
this.notifySuccess(resp.msg)
}else{
this.notifyError(resp.msg)
}
this.$set(row, "loading", false)
}
}
});
},
handleSelectionChange(val) {
this.selection = val;
},
applyPageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post(loc() + "/applyPageData", this.pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
joinMemberFamily() {
if (!this.selection.length) {
this.$notify({
title: '警告',
message: '请先勾选需要删除的用户!',
type: 'warning'
});
return
}
this.$confirm('是否将已勾选的人员删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.submitLoading = true
const resp = await $.post(loc() + "/joinMemberFamily", {applysId: JSON.stringify(this.selection.map(v => v.id))})
if (resp.code === 0) {
this.applyPageData()
this.$emit('flush')
this.notifySuccess(resp.msg)
}else{
this.notifyError(resp.msg)
}
this.submitLoading = false
})
},
},
async created() {
}
}
</script>
@@ -0,0 +1,519 @@
<template>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading" class="activity_view">
<el-tab-pane label="活动信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="24">
<vi-title title="基本信息"></vi-title>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="活动计划">
{{ viewData.plan | str }}
</el-form-item>
</el-col>-->
<el-col :span="8">
<el-form-item label="活动名称">
{{ viewData.name | str }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="活动地址">
{{ viewData.address | str }}
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="活动级别">
{{ activity.school.gameStyle[viewData.activityLevel] | str }}
</el-form-item>
</el-col>-->
<el-col :span="8">
<el-form-item label="报名日期">
{{ viewData.applyStartTime }} - {{ viewData.applyEndTime }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主办单位">
{{ viewData.unitSponsorName | str }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="协办单位">
{{ viewData.unitJointlyName | str }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="活动时间">
{{ viewData.startTime }} - {{ viewData.endTime }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="竞赛方式">
<span v-if="viewData.gameStyle===1">竞赛类</span>
<span v-if="viewData.gameStyle===2">非竞赛类</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="经费预算">
{{ viewData.funding | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报名方式">
<span>{{ viewData.applyWay.map(v => activity.school.applyWay[v]).join('、') }}</span>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="报名人员类型">
<span v-if="viewData.personType===1">会员</span>
<span v-if="viewData.personType===2">普通教职工</span>
</el-form-item>
</el-col>-->
<el-col :span="24">
<vi-title title="活动说明"></vi-title>
</el-col>
<template v-if="viewData.gameStyle===1&&!viewData.applyWay.includes(3)">
<el-col :span="24">
<el-form-item label="运动员资格 ">
<div v-html="viewData.athleteQualification"></div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="报名方法 ">
<div v-html="viewData.registrationMethod"></div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="竞赛方法 ">
<div v-html="viewData.competitionMethod"></div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="奖励方法 ">
<div v-html="viewData.rewardMethod"></div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="注意事项 ">
<div v-html="viewData.precautions"></div>
</el-form-item>
</el-col>
</template>
<template v-if="viewData.applyWay.includes(3)">
<el-col :span="24">
<el-form-item label="活动通知 ">
<div v-html="viewData.eventNotification"></div>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="项目信息" name="2" v-if="!viewData.applyWay.includes(3)">
<el-form style="margin-top: 20px">
<el-card class="box-card mb10" v-for="app in viewData.events" shadow="hover">
<div slot="header" class="clearfix">
<span>{{ app.allName }}</span>
<el-button style="float: right; padding: 3px 5px" @click="$set(app,'show',!app.show)"
type="text">{{ app.show ? '折叠' : '展开' }}
</el-button>
</div>
<transition name="el-fade-in-linear">
<div v-show="app.show" class="text item transition-box" style="padding: 20px 20px">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row>
<el-col :span="12">
<el-form-item label="比赛模式">
<span v-if="app.projectType==1">单项</span>
<span v-else-if="app.projectType==2">团体</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24" v-if="app.projectType==2">
<vi-title title="团体报名人数"></vi-title>
</el-col>
<!-- <el-col :span="8" v-if="app.projectType==2">
<el-form-item label="每队最少人数">
{{ app.restrictMinNum | money }} 人
</el-form-item>
</el-col>-->
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="每队最多人数">
{{
app.athletesMaxNum + app.leanderNum + app.coachNum + app.substituteNum | money
}} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2">
<el-form-item label="最多创建几队 ">
{{ app.restrictTotalTeam | money }} 队
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="运动员最多人数 ">
{{ app.athletesMaxNum | money }} 人
</el-form-item>
</el-col>
<!-- <el-col :span="8" v-if="app.projectType==2">
<el-form-item label="运动员最少人数 ">
{{ app.athletesMinNum | money }} 人
</el-form-item>
</el-col>-->
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="领队人数 ">
{{ app.leanderNum | money }} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="教练人数">
{{ app.coachNum | money }} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="副处长(级)以上最少人数">
{{ app.deputyDirectorNum | money }} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2">
<el-form-item label="男队人数 ">
{{ app.restrictBoyNum | money }} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2">
<el-form-item label="女队人数 ">
{{ app.restrictGirlNum | money }} 人
</el-form-item>
</el-col>
<el-col :span="8" v-if="app.projectType==2&&app.applyType==1">
<el-form-item label="替补人员最少人数 ">
{{ app.substituteNum | money }} 人
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</transition>
</el-card>
</el-form>
</el-tab-pane>
<el-tab-pane label="报名信息" name="3" v-if="viewData.applyWay.includes(2)">
<el-form style="margin-top: 20px">
<el-form-item label="分工会报名信息&emsp;" label-width="150px" class="view-header"
v-if="union_filter">
<el-select v-model="unionid" placeholder="分工会筛选" filterable clearable
style="width: 200px;float: right" size="small" @change="changeUnion"
@clear="changeUnion">
<el-option
v-for="item in unions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<el-card class="box-card mb10" v-for="app in viewData.apply" shadow="hover">
<div slot="header" class="clearfix">
<span>{{ isDisPlayCode ? '(' + app.unioncode + ')' : null }}{{
app.unionname
}}({{ app.num |money }} 人)</span>
<el-button style="float: right; padding: 3px 5px" @click="$set(app,'show',!app.show)"
type="text">{{ app.show ? '折叠' : '展开' }}
</el-button>
</div>
<transition name="el-fade-in-linear">
<div v-show="app.show" class="text item transition-box" style="padding: 20px 20px">
<el-timeline>
<el-timeline-item timestamp="领队信息" placement="top">
<el-card shadow="never">
<el-form label-suffix=":" label-position="right" label-width="80px"
style="margin-top: 30px">
<el-row gutter="20">
<el-col :span="4">
<el-form-item label="姓名">
{{ app.leader.username | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别">
{{ app.leader.sex | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="工号">
{{ app.leader.loginname | str }}
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="电话">
{{ app.leader.mobile | str }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位">
{{ app.leader.unitname | str }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="运动员信息" placement="top">
<el-table border stripe :data="app.apply" size="mini" :key="tableKey">
<el-table-column
type="index" label="序号" header-align="center" align="center" sortable
width="100">
</el-table-column>
<el-table-column
prop="team" header-align="center" align="center" sortable
label="所属队">
<template scope="{row}">
<span v-if="row.team">{{ row.team }}</span>
<span v-if="!row.team">单项比赛暂无小队</span>
</template>
</el-table-column>
<el-table-column
prop="username" header-align="center" align="center"
label="姓名">
</el-table-column>
<el-table-column
prop="loginname" header-align="center" align="center"
label="教工号">
</el-table-column>
<!-- <el-table-column
prop="division_level_leadership" header-align="center" align="center" sortable
label="是否处级领导">
<template scope="{row:{division_level_leadership}}">
<span v-if="division_level_leadership" class="text-primary">是</span>
<span v-else class="text-danger">否</span>
</template>
</el-table-column>-->
<el-table-column
prop="unitname" header-align="center" align="center" sortable
label="单位">
</el-table-column>
<el-table-column
prop="mobile" header-align="center" align="center"
label="电话">
</el-table-column>
<el-table-column
prop="sex" header-align="center" align="center" sortable
label="性别">
</el-table-column>
<el-table-column
prop="identity" header-align="center" align="center"
label="身份">
<template scope="{row}">
<el-tag v-if="row.identity.includes('4')" type="info"
effect="light">处级领导
</el-tag>
<el-tag v-if="row.identity.includes('3')" type="warning"
effect="light">领队
</el-tag>
<el-tag v-if="row.identity.includes('2')" type="success"
effect="light">教练
</el-tag>
<el-tag v-if="row.identity.includes('1')" effect="light">运动员
</el-tag>
<el-tag v-if="row.identity.includes('5')" type="danger"
effect="light">替补
</el-tag>
<el-tag v-if="row.identity.includes('6')" effect="info">团长
</el-tag>
<el-tag v-if="row.identity.includes('7')" type="warning"
effect="light">工作人员
</el-tag>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
</div>
</transition>
</el-card>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
props: {
union_filter: {
type: Boolean,
default: true,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
filters: {
money(val) {
return val ? val : 0
},
str(val) {
return val ? val : '暂无'
}
},
data() {
return {
activeName: "1",
viewData: {awardsMode: [], applyWay: [], combinationMethod: []},
rootData: {},
loading: true,
units: [],
unions: [],
unionid: '',
tableKey: '',
}
},
methods: {
changeUnion() {
if (this.unionid) {
this.viewData.apply = this.rootData.apply.filter(v => {
return v.id === this.unionid
})
} else {
this.viewData.apply = JSON.parse(JSON.stringify(this.rootData.apply))
}
this.tableKey = new Date().getTime()
},
hasPane(name) {
return this.panes.includes(name)
},
async getUnitName(arr) {
const clubs = await getClubs()
const unitClubs = this.units.concat(clubs)
let brr = []
arr.forEach(a => {
const unit = unitClubs.find(v => {
return v.id === a
})
if (unit) {
brr.push(unit.name)
}
})
return brr.join(",")
},
async getInfo(id) {
this.loading = true
const {data} = await $.get("/platform/activity/common/findOne", {id})
this.loading = false
if (data) {
data.unitSponsorName = await this.getUnitName(JSON.parse(data.unitSponsor))
data.unitJointly = JSON.parse(data.unitJointly)
data.unitJointlyName = await this.getUnitName(data.unitJointly)
data.applyWay = JSON.parse(data.applyWay)
if (!data.applyWay.includes(3) && data.events.length > 0) {
data.events.forEach(v => {
v.awardsMode = v.awardsMode
v.combinationMethod = v.combinationMethod
})
}
if (data.applyWay.includes(2)) {
data.apply.forEach(v => {
const leaders = v.apply.filter(x => {
return x.identity === 3
})
v.leader = {}
if (leaders.length) {
v.leader = leaders[0]
}
v.apply = v.apply.filter(x => {
return x.identity !== 3
})
})
data.apply.sort((a, b) => {
return b.num - a.num
})
if (data.apply.length === 1) {
data.apply[0].show = true
}
this.unions = data.apply.map(v => {
return {id: v.id, unionname: v.unionname}
})
}
this.rootData = clone(data)
this.viewData = data
this.tableKey = new Date().getTime()
} else {
this.viewData = {}
this.$message({message: "获取信息失败", type: 'error'});
}
}
},
async created() {
this.units = await getUnits(null)
}
}
</script>
<style>
.mb10 {
margin-bottom: 10px;
}
.activity_view .el-card__header {
padding: 10px 20px;
}
.activity_view .el-card__body {
padding: 0;
}
.activity_view .el-timeline {
padding-left: 0;
}
</style>
@@ -0,0 +1,98 @@
<template>
<!-- <div>
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="24">
<vi-title title="计划详情"></vi-title>
</el-col>
<el-col :span="12">
<el-form-item label="计划名称">
{{ viewData.name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预计时间">
{{ viewData.time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动项目">
{{ viewData.allName }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划类型">
{{ viewData.type == 1 ? '校活动计划' : viewData.type == 2 ? '分工会活动计划' : '协会(社团)计划' }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="计划内容 ">
<div v-html="viewData.content"></div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>-->
<div style="width: 80%; margin: 0 auto">
<vi-title title="计划详情"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="计划名称">
{{ viewData.name }}
</el-descriptions-item>
<el-descriptions-item label="预计时间">
{{ viewData.time }}
</el-descriptions-item>
<el-descriptions-item label="预算费用">
{{ viewData.money }}
</el-descriptions-item>
<el-descriptions-item label="计划类型">
{{ viewData.type == 40001 ? '校活动计划' : viewData.type == 40002 ? '分工会活动计划' : '协会(社团)计划' }}
</el-descriptions-item>
<el-descriptions-item label="计划内容" :span="2">
<div v-html="viewData.content"></div>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script>
module.exports = {
props: {
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
viewData: {},
loading: true,
tableKey: '',
}
},
methods: {
async getInfo(id) {
this.loading = true
const {data} = await $.get("/platform/activity/common/findOnePlan", {id})
this.loading = false
if (data) {
this.viewData = data
this.tableKey = new Date().getTime()
} else {
this.viewData = {}
this.$message({message: "获取信息失败", type: 'error'});
}
}
},
}
</script>
<style>
</style>
@@ -0,0 +1,362 @@
<template>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="活动基础信息" name="1">
<el-form label-suffix=":" style="padding: 20px 0" label-width="120px">
<el-form-item class="item-center">{{ viewData.name }}</el-form-item>
<el-row gutter="60">
<el-col :span="12">
<el-form-item label="联系人">
<span v-if="viewData.username">
{{ viewData.username }}
({{ viewData.loginname }})</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动编号">
{{ viewData.activityCode }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动项目类型">
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动类型">
{{ viewData.type === 1 ? '分工会活动' : viewData.type === 2 ? '协会社团活动' : '校工会活动' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动计划时间">
{{ viewData.startPlannedDate + ' - ' + viewData.endPlannedDate }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动时间">{{ viewData.startTime }} - {{
viewData.endTime
}}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.applyStartTime">
<el-form-item label="报名时间">{{ viewData.applyStartTime }} - {{
viewData.applyEndTime
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动人数">{{ viewData.peopleNum || '暂无' }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="活动内容">{{ viewData.activityContent }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="活动地点">{{ viewData.address }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报名方式">
<span v-if="viewData.signUpMethod===1">个人报名</span>
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
<span v-else-if="!viewData.signUpMethod">无需报名</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动提醒">
{{ viewData.xlFlag ? '提醒' : '不提醒' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否用于报名">
<span v-if="viewData.isEnrollSystem">活动报名</span>
<span v-else>活动管理</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.signUpMethod!=null">
<el-form-item label="报名人数限制">
<span v-if="viewData.userNumberLimit===1">总人数限制({{
viewData.totalUserNumberLimit
}}人)</span>
<span v-else-if="viewData.userNumberLimit===2">分工会人数限制</span>
<span v-else-if="!viewData.userNumberLimit">不限制</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="viewData.userNumberLimit===2">
<el-form-item label="分工会限制名额">
<el-table border stripe :data="viewData.unionUserNumberLimit" size="small"
height="500">
<el-table-column type="index" label="序号" header-align="center" align="center"
width="100">
</el-table-column>
<el-table-column label="分工会名称" prop="unionName"></el-table-column>
<el-table-column label="分工会人数" prop="unionNum"></el-table-column>
<el-table-column label="限制人数" prop="limitNum"></el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-if="viewData.type===1" label="所属工会">
{{ !viewData.unionname ? '暂无' : viewData.unionname }}
</el-form-item>
<el-form-item v-if="viewData.type===2" label="所属社团">
{{ !viewData.clubName ? '暂无' : viewData.clubName }}
</el-form-item>
<el-form-item v-if="viewData.type===3" label="所属组织">
校工会
</el-form-item>
</el-col>
<el-col :span="12" v-if="[1,2].includes(viewData.signUpMethod)">
<el-form-item label="是否需要签到">
{{ viewData.needSign ? '需要' : '不需要' }}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.signUpMethod!=null">
<el-form-item label="签到半径(m)" v-if="viewData.needSign">
{{ viewData.rangeMeter + '米' }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="封面图" prop="cover">
<img v-if="viewData.cover"
:src="FILE_DOMAIN + '/fileStreamPreview?id=' + viewData.cover"
class="avatar" style="height: 200px;width: auto">
</el-form-item>
</el-col>
<el-col :span="24" v-if="viewData.needSign">
<el-form-item prop="" label="活动签到点位">
<el-card shadow="never">
<div style="width: 100%;height: 500px" id="signMap"></div>
</el-card>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="活动费用" name="3" v-if="!viewData.isEnrollSystem">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0" label-width="80px">
<el-table border stripe :data="viewData.goods">
<el-table-column
type="index" label="序号" header-align="center" align="center" width="100">
</el-table-column>
<el-table-column
label="物品名称" header-align="center" align="center" prop="name">
</el-table-column>
<el-table-column
label="物品价格" header-align="center" align="center" prop="actualPrice">
</el-table-column>
</el-table>
<el-form-item label="发&emsp;&emsp;票">
<file-upload v-if="viewData.billFiles&&viewData.billFiles.length"
:files="viewData.billFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
<el-form-item label="照&emsp;&emsp;片">
<file-upload v-if="viewData.photoFiles&&viewData.photoFiles.length"
:files="viewData.photoFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
<el-form-item label="其&emsp;&emsp;他">
<file-upload v-if="viewData.otherFiles&&viewData.otherFiles.length"
:files="viewData.otherFiles" :view="true">
</file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="活动总结" name="4" v-if="!viewData.isEnrollSystem">
<el-form ref="form" label-width="120px">
<el-form-item prop="activitySummary" label="活动总结">
{{ viewData.activitySummary }}
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="审核信息" name="5" v-if="viewData.auditId">
<el-form ref="form" label-width="120px">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.audit.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.audit.auditTime }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见:">
{{ viewData.audit.auditOpinion }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
},
data() {
return {
userData: [],
viewData: {},
loading: true,
search: '',
tableKey: '',
activeName: '1',
userColumns: [],
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async doExport() {
window.open("/platform/activity/info/mange/doExportUser?id=" + this.viewData.id)
},
async userChange() {
if (this.search) {
const {data} = await $.get("/platform/activity/info/mange/searchTissueUser", {
id: this.viewData.id,
search: this.search
})
this.userData = data
}
},
async getInfo(id) {
this.userColumns = [{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'},
{prop: 'mobile', label: '联系方式'},
{prop: 'unitName', label: '所属单位'},
{prop: 'unionName', label: '所属工会'}]
this.loading = true
const {data} = await $.get("/platform/activity/info/mange/findOne", {id})
this.loading = false
if (data) {
if (data.needSign) {
this.userColumns.push({prop: 'isSign', label: '是否签到'})
this.userColumns.push({prop: 'signTime', label: '签到时间'})
}
data.billFiles = JSON.parse(data.billFiles)
data.photoFiles = JSON.parse(data.photoFiles)
data.otherFiles = JSON.parse(data.otherFiles)
this.userData = clone(data.tissuePersonList)
data.unionUserNumberLimit = JSON.parse(data.unionUserNumberLimit)
data.location = JSON.parse(data.location)
this.viewData = data
this.tableKey = new Date().getTime()
this.initMap()
this.activeName = this.handle ? "999" : "1"
} else {
this.viewData = {}
this.$notify.error({title: '错误', message: '获取信息失败'});
}
},
initMap() {
let marker = null
this.$nextTick(() => {
let map = new AMap.Map("signMap", {
resizeEnable: true,
center: [118.640081, 32.082496],
zoom: 16
});
if (this.viewData.location && Array.isArray(this.viewData.location)) {
const lng = parseFloat(this.viewData.location[0])
const lat = parseFloat(this.viewData.location[1])
marker = new AMap.Marker({
position: [lng, lat],
offset: new AMap.Pixel(-13, -30)
});
marker.setMap(map);
map.setZoomAndCenter(18, [lng, lat])
}
map.on('click', (e) => {
console.log(e)
if (marker) {
marker.setMap(null)
marker = null
}
marker = new AMap.Marker({
position: [e.lnglat.getLng(), e.lnglat.getLat()],
offset: new AMap.Pixel(-13, -30)
})
marker.setMap(map)
this.formData.location = []
this.formData.location.push(e.lnglat.getLng())
this.formData.location.push(e.lnglat.getLat())
});
})
}
},
}
</script>
<style>
.item-center {
text-align: center;
font-weight: 700;
margin-right: 110px;
}
.item-center .el-form-item__content {
font-size: 18px;
}
</style>
@@ -0,0 +1,152 @@
<template>
<el-table :data="tableData" style="width: 100%;height: 100%" stripe border
ref="MaleFemaleTab"
:header-cell-style="{background:'#FAFAFA'}" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" size="mini" fixed>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px" fixed></el-table-column>
<el-table-column label="分工会" prop="unionname" header-align="center"
align="center" fixed show-overflow-tooltip width="250px"></el-table-column>
<el-table-column label="甲组" header-align="center" v-if="tableColumns.length>0">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column label="乙组" header-align="center" v-if="tableColumns2.length>0">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns2"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column label="丙组" header-align="center" v-if="tableColumns3.length>0">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns3"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column label="丁组" header-align="center" v-if="tableColumns4.length>0">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns4"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column label="团体" header-align="center" v-if="tableColumns5.length>0">
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns5"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table-column>
<el-table-column label="总分" prop="totalScore" header-align="center"
align="center" show-overflow-tooltip fixed="right"></el-table-column>
<el-table-column align="center" header-align="center" type="index" show-overflow-tooltip label="名次"
width="80px" fixed="right"></el-table-column>
</el-table>
</template>
<script>
module.exports = {
props: {
Form: {
type: Object,
default: {},
}
},
mixins: [initTableMixins],
data() {
return {
tableData: [],
maxHeight: 0,
tableColumns2: [],
tableColumns3: [],
tableColumns4: [],
tableColumns5: []
}
},
mounted() {
/* const tabHeight = document.getElementById("app").clientHeight - (this.$refs.MaleFemaleTab.$el.offsetTop + 60)
this.$nextTick(()=>{
this.maxHeight = tabHeight
})*/
},
methods: {
async isMaleFemale() {
const loading = this.$loading({
lock: true,
text: '数据正在查询中,请稍后...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.tableColumns = []
this.tableColumns2 = []
this.tableColumns3 = []
this.tableColumns4 = []
this.tableColumns5 = []
this.tableData = []
const {data} = await $.get(loc() + "/isMaleFemale", this.Form)
data.eventList.forEach(v => {
if (v.baname == "甲组" || v.baname == "乙组" || v.baname == "丙组" || v.baname == "丁组") {
this.tableColumns.push({label: v.isMenWomen ? v.label.substr(4) : v.label.substr(2), prop: v.label})
} else {
this.tableColumns5.push({label: v.label, prop: v.label})
}
})
this.tableData = data.score.sort(this.compare("totalScore"))
if (this.Form.unionname) {
this.tableData = this.tableData.filter(v => v.unionname == this.Form.unionname)
}
loading.close();
},
compare(prop) {
return function (obj1, obj2) {
const val1 = obj1[prop];
const val2 = obj2[prop];
if (val1 > val2) {
return -1;
} else if (val1 < val2) {
return 1;
} else {
return 0;
}
}
}
},
}
</script>
@@ -0,0 +1,77 @@
<template>
<el-table :data="tableData" style="width: 100%;height: 100%" stripe border
ref="MaleFemaleTab"
:header-cell-style="{background:'#FAFAFA'}" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" size="mini" fixed >
<!--:max-height="maxHeight"-->
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px" fixed></el-table-column>
<el-table-column label="分工会" prop="unionname" header-align="center"
align="center" fixed show-overflow-tooltip></el-table-column>
<el-table-column label="总分" prop="totalScore" header-align="center"
align="center" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="名次"
width="80px" ></el-table-column>
</el-table>
</template>
<script>
module.exports = {
props: {
Form: {
type: Object,
default: {},
}
},
mixins: [initTableMixins],
data() {
return {
tableData: [],
maxHeight: 0
}
},
mounted() {
/*const tabHeight = document.getElementById("app").clientHeight - (this.$refs.MaleFemaleTab.$el.offsetTop + 60)
this.$nextTick(() => {
this.maxHeight = tabHeight
})*/
},
methods: {
async isScoreTopEight() {
const loading = this.$loading({
lock: true,
text: '数据正在查询中,请稍后...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.tableColumns = []
this.tableData = []
const {data} = await $.get(loc() + "/isScoreTopEight", this.Form)
const table = data.score.sort(this.compare("totalScore"))
this.tableData = table.slice(0, 8)
loading.close();
},
compare(prop) {
return function (obj1, obj2) {
const val1 = obj1[prop];
const val2 = obj2[prop];
if (val1 > val2) {
return -1;
} else if (val1 < val2) {
return 1;
} else {
return 0;
}
}
}
},
}
</script>
@@ -0,0 +1,93 @@
<template>
<div>
<!-- <el-table :data="tableData" style="width: 100%" stripe border
:header-cell-style="{background:'#FAFAFA'}" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" size="mini">
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="名次"
width="100px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip>
</el-table-column>
</el-table>-->
<table class="table table-bordered" style="table-layout: fixed;">
<thead>
<tr>
<th style="text-align: center!important;">项目</th>
<th style="text-align: center!important;" v-for="i in 8">第{{ i }}名</th>
</tr>
</thead>
<tbody>
<tr v-for="i in tableData">
<td align="center" width="20%">{{ i.label }}</td>
<td v-for="x in 8" align="center" width="10%">
{{ getTableTdContent(i.sss, x) }}
</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
module.exports = {
props: {
Form: {
type: Object,
default: {},
}
},
mixins: [initTableMixins],
data() {
return {
tableData: []
}
},
methods: {
getTableTdContent(d, i) {
return d.filter(v => {
if (v.ranking == i) {
return v.username
}
}).map(v => {
return v.username
}).toString()
},
async isTopEight() {
var loading = this.$loading({
lock: true,
text: '数据正在查询中,请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.tableColumns = []
this.tableData = []
const {data} = await $.get(loc() + "/isTopEight", this.Form)
data.eventList.map(v => {
v.sss = []
data.userList.map(x => {
if (v.label === x.allname) {
console.log(x)
v.sss.push(x)
}
})
})
this.tableData = data.eventList
loading.close();
},
},
}
</script>
@@ -0,0 +1,199 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane v-if="$.parseJSON(role) === true" label="当前场地使用情况" name="1">
<el-calendar v-model="reserve_time">
<template slot="dateCell" slot-scope="{date, data}">
<div class="div-Calendar">
<p :class="data.isSelected ? 'is-selected' : ''">
{{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '√' : '' }}
</p>
<div v-if="$.parseJSON(role) === true" v-for="item in viewData.site_info">
<div v-if="data.day.toString()==item.reserve_day"
:style="{backgroundColor:([0].includes(item.stateaudittype)?'#FAECD9':'#E0F4D9')}">
<el-row :gutter="20" style="line-height: 30px;margin-bottom: 10px;">
<el-col :span="4">
<el-button v-if="[0].includes(item.stateaudittype)" type="warning"
size="mini" circle>待
</el-button>
<el-button v-if="item.stateaudittype==3" type="success" size="mini" circle>通
</el-button>
</el-col>
<el-col :span="20" style="font-size: 10px">
<b>{{ item.reserve_person }}</b>:{{ item.start_time }}-{{ item.end_time }}
</el-col>
</el-row>
</div>
</div>
</div>
</template>
</el-calendar>
</el-tab-pane>
<el-tab-pane label="预约基本信息" name="2">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="预约人">{{ viewData.reserve_person }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{ viewData.reserve_person_unit }}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{ viewData.reserve_person_phone }}</el-descriptions-item>
<el-descriptions-item label="预约时间">
({{ viewData.concat_day }}) {{ viewData.start_time }} - {{ viewData.end_time }}
</el-descriptions-item>
<el-descriptions-item label="场地名称">{{ viewData.site_name }}</el-descriptions-item>
<el-descriptions-item label="预约状态">
<span v-if="[0].includes(viewData.stateaudittype)" style="color: #e6a23c">{{viewData.state_name}}</span>
<span v-if="viewData.stateaudittype==3" style="color: #67c23a">{{viewData.state_name}}</span>
<span v-if="viewData.stateaudittype==1" style="color: #f56c6c">{{viewData.state_name}}</span>
</el-descriptions-item>
<el-descriptions-item label="预约事由" :span="2">{{ viewData.reserve_cause }}</el-descriptions-item>
<el-descriptions-item label="反馈意见" :span="2" v-if="$.parseJSON(backOptionShow) == true">
{{ viewData.back_option }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="场地管理员批示信息" name="3" v-if="viewData.site_manager_id&&viewData.back_out_opinion">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="批示信息&emsp;" label-width="115px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="批示人员:">
{{ viewData.smusername }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="批示时间:">
{{ viewData.site_manager_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="批示意见:">
<div class="textarea-div">{{ viewData.back_out_opinion }}
</div>
</el-form-item>
</el-form>
</el-tab-pane>
<slot v-if="btn && (activeName == '1' || activeName == '2')" name="btn"></slot>
<el-tab-pane label="主席批示信息" name="4" v-if="viewData.chairman_review_person">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="批示信息&emsp;" label-width="115px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="批示人员:">
{{ viewData.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="批示时间:">
{{ viewData.chairman_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="批示意见:">
<div class="textarea-div">{{
viewData.chairman_review_opinion ? viewData.chairman_review_opinion : '暂无'
}}
</div>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
<el-tab-pane v-for="(item,index) in viewData.auditlisttable" :label="item.auditStateName.replace('待', '')"
:name="index + 5">
<el-descriptions class="margin-top" :column="3" border>
<el-descriptions-item label="审核人">{{ item.auditUserName }}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{ item.auditUserUnionName }}</el-descriptions-item>
<!--<el-descriptions-item label="审核所处状态">{{ item.auditStateName }}</el-descriptions-item>-->
<el-descriptions-item label="审核结果">{{ item.auditListName }}</el-descriptions-item>
<el-descriptions-item label="审核意见">
<div class="text-left">
{{ item.auditOption }}
</div>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
id: String,
btn: {
type: Boolean,
default: false
},
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
}
},
data() {
return {
activeName: '1',
loading: true,
viewData: {},
reserve_time: '',
role: false,
backOptionShow: false
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getSiteReserveInfo(id) {
const {data} = await $.get(base + "/platform/activity/site/reserve/findOne", {id})
return data
},
async openView(id) {
this.loading = true
this.$forceUpdate()
this.viewData = await this.getSiteReserveInfo(id)
if (this.viewData) {
this.activeName = this.role === true ? "1" : "2"
} else {
this.viewData = {}
this.$message.error("获取场地预约信息失败");
}
this.$forceUpdate()
this.loading = false
}
}
}
</script>
<style scoped>
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
@@ -0,0 +1,376 @@
<template>
<div class="activity-bx-info">
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="申请信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="申请人姓名">
{{ viewData.user_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请时间">
{{ viewData.apply_time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动时间">
{{ viewData.activity_time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动人数">
{{ viewData.activity_number }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报销金额">
{{ viewData.activity_money }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报销卡号">
{{ viewData.activity_card_number }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="活动地点">
{{ viewData.venue }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备&emsp;&emsp;注">
<div style="word-break: break-all" v-html="viewData.activity_content"></div>
</el-form-item>
</el-col>
</el-row>
<el-col :span="24">
<el-form-item label="购置物品及价格"></el-form-item>
</el-col>
<el-table :data="viewData.goods" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="物品名称" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品名称" v-model="row.name"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="price" label="物品价格" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品价格" v-model="row.price"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.us_s"
style="width: 300px; height: 100px"
:src="viewData.us_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<!-- <el-tab-pane label="附件" name="100">
<el-form label-position="top">
&lt;!&ndash; <el-form-item label="活动资料" v-if="viewData.activity_id">
<span v-if="!Object.keys(viewData.activity_files).length">暂无</span>
<div class="block">
<el-timeline>
<el-timeline-item v-for="(v,k) in viewData.activity_files" :timestamp="k" placement="top"
icon="el-icon-more"
type="primary">
<el-card v-for="file in v" style="margin-bottom: 20px;position: relative">
<div style="display: flex;flex-direction:row;">
<h4>{{ file.name }}&emsp;</h4>
<h4><span style="font-size: 14px;color: rgb(200,200,200)">{{ file.type }}</span></h4>
</div>
<div style="margin: 20px 0">
<file-upload :files="file.files"
:view="true"></file-upload>
</div>
<div style="text-align: right" class="text-primary">{{ file.user_name }}</div>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</el-form-item>&ndash;&gt;
<el-form-item label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>-->
<el-tab-pane label="基层工会核批信息" name="2" v-if="hasPane(2)&&viewData.division_chairman_name">
<el-form label-width="130px" style="padding: 20px 0">
<!--<el-form-item label="核批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.dc_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.division_chairman_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{
viewData.division_chairman_idea ? viewData.division_chairman_idea : '暂无'
}}
</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.dc_s"
style="width: 300px; height: 100px"
:src="viewData.dc_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会会计核批信息" name="3" v-if="hasPane(3)&&viewData.accounting_name">
<el-form label-width="130px" style="padding: 20px 0">
<!--<el-form-item label="核批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.a_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.accounting_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.accounting_idea ? viewData.accounting_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.a_s"
style="width: 300px; height: 100px"
:src="viewData.a_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会副主席审核信息" name="4" v-if="hasPane(4)&&viewData.confirm_trade_name">
<el-form label-width="130px" style="padding: 20px 0">
<!-- <el-form-item label="核批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ct_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.confirm_trade_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.confirm_trade_idea ? viewData.confirm_trade_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ct_s"
style="width: 300px; height: 100px"
:src="viewData.ct_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会主席审核信息" name="5" v-if="hasPane(5)&&viewData.union_chairman_name">
<el-form label-width="130px" style="padding: 20px 0">
<!--<el-form-item label="核批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ucc_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.union_chairman_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.union_chairman_idea ? viewData.union_chairman_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ucc_s"
style="width: 300px; height: 100px"
:src="viewData.ucc_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会出纳审核信息" name="6" v-if="hasPane(6)&&viewData.union_cashier_name">
<el-form label-width="130px" style="padding: 20px 0">
<!-- <el-form-item label="核批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>-->
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.uc_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.union_chairman_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.union_chairman_idea ? viewData.union_chairman_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.uc_s"
style="width: 300px; height: 100px"
:src="viewData.uc_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
activeName: "1",
viewData: {
goods: []
},
loading: true,
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getActInfo(id) {
this.loading = true
const {data, code, msg} = await $.get("/platform/jf/activity_bx/reimbursement/findOne", {id})
this.loading = false
if (data) {
this.viewData.files = []
this.activeName = this.handle ? "999" : "1"
this.viewData = data
this.viewData.files = JSON.parse(data.files)
this.viewData.goods = data.goods
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
}
}
</script>
<style>
.activity-bx-info .el-timeline {
padding-left: 0;
}
.sign_img {
max-width: 300px;
max-height: 100px;
}
</style>
@@ -0,0 +1,73 @@
<template>
<div>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-date-picker
v-model="page_form.year"
type="year"
value-format="yyyy" style="width: 150px"
placeholder="选择年" @change="$emit('search')">
</el-date-picker>
</div>
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="page_form.searchKeyword"
@keyup.enter.native="$emit('search')">
<el-select v-model="page_form.searchName" slot="prepend" placeholder="查询类型"
style="width: 120px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<slot name="column"></slot>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="$emit('search')"></el-button>
</div>
<!-- <div class="pull-right offscreen-right mt5" v-if="has_add">
<el-button icon="el-icon-edit" @click="$emit('openAdd')">申请活动报销</el-button>
</div>-->
<div class="pull-right offscreen-right mt5" v-if="has_sh">
<el-radio-group v-model="page_form.isAudit" @change="$emit('search')">
<el-radio-button :label="1">全部</el-radio-button>
<el-radio-button :label="2">已审核</el-radio-button>
<el-radio-button :label="3">未审核</el-radio-button>
</el-radio-group>
</div>
</el-row>
</div>
</template>
<script>
module.exports = {
props: {
page_form: '',
has_add: {
type: Boolean,
default: false
},
has_sh: {
type: Boolean,
default: false
},
has_type: {
type: Boolean,
default: false
},
},
data() {
return {}
},
watch: {},
methods: {},
async created() {
}
}
</script>
@@ -0,0 +1,151 @@
<template>
<el-tabs tab-position="top" v-model="clubInfo" v-loading="loading">
<el-tab-pane label="基础信息" name="1">
<vi-title title="基础信息"></vi-title>
<el-descriptions :column="3" border class="table_fixed">
<el-descriptions-item :span="3" label="社团名称">
{{viewData.name}}
</el-descriptions-item>
<el-descriptions-item label="社团编码">
{{viewData.code}}
</el-descriptions-item>
<el-descriptions-item label="社团类型">
{{viewData.typeName}}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{viewData.foundTime}}
</el-descriptions-item>
<el-descriptions-item label="申报年份">
{{moment(viewData.applyTime).format('YYYY')}}
</el-descriptions-item>
<el-descriptions-item label="申报时间">
{{viewData.applyTime}}
</el-descriptions-item>
<el-descriptions-item label="状态">
{{viewData.stateName}}
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">附件</template>
<file-upload v-if="viewData.files && viewData.files.length > 0"
:files="JSON.parse(viewData.files)"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">两年获得的集体荣誉称号</template>
<div class="text-left" v-html="viewData.evaluateName"></div>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">年度组织活动及完成情况</template>
<div class="text-left" v-html="viewData.yearActivity"></div>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="秘书长审核信息" name="2" v-if="hasPane(2) && viewData.mszAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.mszAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.mszAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.mszAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="会长审核信息" name="3" v-if="hasPane(3) && viewData.hzAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.hzAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.hzAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.hzAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="4" v-if="hasPane(5) && viewData.xghAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.xghAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.xghAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.xghAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
name: 'clubEvaluateInfo',
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: () => {return []}
},
},
data() {
return {
clubInfo: "1",
viewData: {},
loading: true,
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get('/platform/sys/club/clubEvaluateMine/findOne', {id})
this.loading = false
if (data) {
this.clubInfo = this.handle ? "999" : "1"
this.viewData = data
}
}
}
}
</script>
<style scoped>
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
@@ -0,0 +1,232 @@
<template>
<el-tabs tab-position="top" v-model="clubInfo" v-loading="loading">
<el-tab-pane label="基础信息" name="1">
<vi-title title="社团信息"></vi-title>
<el-descriptions :column="4" border class="table_fixed">
<el-descriptions-item label="社团名称">
{{viewData.name}}
</el-descriptions-item>
<el-descriptions-item label="申请时间">
{{viewData.create_time}}
</el-descriptions-item>
<el-descriptions-item label="社团编码">
{{viewData.code}}
</el-descriptions-item>
<el-descriptions-item label="发起人">
{{ viewData.sponsorName }}
</el-descriptions-item>
<el-descriptions-item label="社团类型">
{{ viewData.typeName }}
</el-descriptions-item>
<el-descriptions-item label="报名联系人">
{{ viewData.fzrName }}
</el-descriptions-item>
<el-descriptions-item label="所属单位">
{{ viewData.concatPersonUnitName }}
</el-descriptions-item>
<el-descriptions-item label="联系人电话">
{{ viewData.concatPersonMobile }}
</el-descriptions-item>
<el-descriptions-item label="联系人邮箱">
{{ viewData.concatPersonEmail }}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{ viewData.foundTime }}
</el-descriptions-item>
<el-descriptions-item label="会费标准">
{{viewData.dues_standard}}
</el-descriptions-item>
<el-descriptions-item label="状态">
{{viewData.stateName}}
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">社团介绍</template>
<div class="text-left" v-html="viewData.stjs"></div>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">社团宗旨</template>
<div class="text-left" v-html="viewData.stzz"></div>
</el-descriptions-item>
<!-- <el-descriptions-item span="2">-->
<!-- <template slot="label">QQ群二维码</template>-->
<!-- <file-upload v-if="viewData.QQGroupCode && viewData.QQGroupCode.length > 0"-->
<!-- :files="JSON.parse(viewData.QQGroupCode)"-->
<!-- :view="true"></file-upload>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item span="2">-->
<!-- <template slot="label">微信群二维码</template>-->
<!-- <file-upload v-if="viewData.wechatGroupCode && viewData.wechatGroupCode.length > 0"-->
<!-- :files="JSON.parse(viewData.wechatGroupCode)"-->
<!-- :view="true"></file-upload>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item span="2">
<template slot="label">申请成立报告</template>
<file-upload v-if="viewData.establishReport && viewData.establishReport.length > 0"
:files="JSON.parse(viewData.establishReport)"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">章程草案</template>
<file-upload v-if="viewData.rulesFile && viewData.rulesFile.length > 0"
:files="JSON.parse(viewData.rulesFile)"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">经费来源及管理办法</template>
<file-upload v-if="viewData.manageFile && viewData.manageFile.length > 0"
:files="JSON.parse(viewData.manageFile)"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">年度活动计划</template>
<file-upload v-if="viewData.yearPlanFile && viewData.yearPlanFile.length > 0"
:files="JSON.parse(viewData.yearPlanFile)"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="4">
<template slot="label">其他附件</template>
<file-upload v-if="viewData.files && viewData.files.length > 0"
:files="JSON.parse(viewData.files)"
:view="true"></file-upload>
</el-descriptions-item>
</el-descriptions>
<vi-title title="成员列表" style="margin-top: 20px"></vi-title>
<el-table :data="viewData.clubuser" size="small" border
:header-cell-style="{background:'#F5F5F5',color:'#606266'}">
<el-table-column label="人员身份" width="150px" prop="sf" header-align="center"
align="center">
<template slot-scope="scope">
<el-lable v-if="scope.row.sf === 1">会长</el-lable>
<el-lable v-if="scope.row.sf === 2">成员</el-lable>
<el-lable v-if="scope.row.sf === 3">副会长</el-lable>
<el-lable v-if="scope.row.sf === 4">秘书长</el-lable>
<el-lable v-if="scope.row.sf === 5">副秘书长</el-lable>
</template>
</el-table-column>
<el-table-column label="工号" width="150px" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" width="150px" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="性别" width="150px" prop="sex" header-align="center"
align="center"></el-table-column>
<el-table-column label="电话" width="150px" prop="mobile" header-align="center"
align="center"></el-table-column>
<el-table-column label="所属单位" prop="unitname" header-align="center" show-overflow-tooltip="true"
align="center"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="宣传与文体办公室审核信息" name="2" v-if="hasPane(2) && viewData.xtAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.xtAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.xtAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.xtAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="分管副主席审核信息" name="3" v-if="hasPane(3) && viewData.xldAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.xldAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.xldAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.xldAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会批复信息" name="4" v-if="hasPane(3) && viewData.xghAuditId">
<vi-title title="批复信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="批复人员">
{{ viewData.xghAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="批复时间">
{{ viewData.xghAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="成立时间">
{{ viewData.foundTime }}
</el-descriptions-item>
<el-descriptions-item label="批复附件">
<file-upload v-if="viewData.schoolReplyFile && viewData.schoolReplyFile.length > 0"
:files="JSON.parse(viewData.schoolReplyFile)"
:view="true"></file-upload>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
name: 'clubRegistInfo',
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: () => {return []}
},
},
data() {
return {
clubInfo: "1",
viewData: {},
loading: true,
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get('/platform/sys/club/clubMyApply/findOne', {id})
this.loading = false
if (data) {
this.clubInfo = this.handle ? "999" : "1"
this.viewData = data
}
}
}
}
</script>
<style scoped>
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
@@ -0,0 +1,216 @@
<template>
<el-tabs tab-position="top" v-model="clubInfo" v-loading="loading">
<el-tab-pane label="基础信息" name="1">
<vi-title title="基础信息"></vi-title>
<el-descriptions :column="3" border class="table_fixed">
<el-descriptions-item label="社团名称">
{{ viewData.register.clubName }}
</el-descriptions-item>
<el-descriptions-item label="成立时间">
{{ viewData.register.foundTime }}
</el-descriptions-item>
<el-descriptions-item label="会费标准">
{{ viewData.register.dues_standard }}
</el-descriptions-item>
<el-descriptions-item :span="3">
<template slot="label">年度活动情况</template>
<file-upload v-if="viewData.register.yearActivity && viewData.register.yearActivity.length > 0"
:files="viewData.register.yearActivity"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">工作计划</template>
<file-upload v-if="viewData.register.planFiles && viewData.register.planFiles.length > 0"
:files="viewData.register.planFiles"
:view="true"></file-upload>
</el-descriptions-item>
<el-descriptions-item span="3">
<template slot="label">工作总结</template>
<file-upload
v-if="viewData.register.summaryFiles && viewData.register.summaryFiles.length > 0"
:files="viewData.register.summaryFiles"
:view="true"></file-upload>
</el-descriptions-item>
</el-descriptions>
<vi-title title="社团成员变化情况" class="mt20"></vi-title>
<el-table :data="viewData.changeUserNum" max-height="300">
<el-table-column label="序号" type="index"
width="50"></el-table-column>
<el-table-column label="人员类型" prop="userState"></el-table-column>
<el-table-column label="年初人员" prop="yearFirstNum"></el-table-column>
<el-table-column label="年度增加" prop="yearAddNum"></el-table-column>
<el-table-column label="年度减少" prop="yearEditNum"></el-table-column>
<el-table-column label="年末人数" prop="thisYearNum"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="财务收支情况" name="2">
<vi-title title="明细" class="mt20"></vi-title>
<el-table :data="viewData.detaileds" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="日期" prop="date"></el-table-column>
<el-table-column label="项目内容" prop="nr"></el-table-column>
<el-table-column label="收入类型" prop="incomeType"></el-table-column>
<el-table-column label="年初余额" prop="qcMoney"></el-table-column>
<el-table-column label="收入" prop="income"></el-table-column>
<el-table-column label="支出" prop="expend"></el-table-column>
<el-table-column label="年度结余" prop="qmMoney"></el-table-column>
<el-table-column label="备注" prop="notes"></el-table-column>
</el-table>
<div class="mt20">
<vi-title title="统计"></vi-title>
<el-table :data="viewData.register.incomeCensus" max-height="300">
<el-table-column label="去年年度结余" prop="lasYearSurplus"></el-table-column>
<el-table-column label="会费收入" prop="income"></el-table-column>
<el-table-column label="校工会拨款" prop="allocate"></el-table-column>
<el-table-column label="社会赞助" prop="support"></el-table-column>
<el-table-column label="年度总支出" prop="totalExpend"></el-table-column>
<el-table-column label="年度结余" prop="surplus">
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane label="年末理事机构人员" name="3">
<vi-title title="年末理事机构人员"></vi-title>
<el-table :data="viewData.jgUser" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="职务" prop="roleName"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="所属部门" prop="unitname"></el-table-column>
<el-table-column label="联系电话" prop="mobile"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="秘书长审核信息" name="4" v-if="viewData.stAudit">
<vi-title title="秘书长审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.stAudit.username }}({{ viewData.stAudit.loginname }})
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.stAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.stAudit.auditOpinion }}
</el-descriptions-item>
<el-descriptions-item label="签&emsp;&emsp;字" :span="2">
<el-image v-if="viewData.stAudit.auditSign"
style="width: 300px; height: 100px"
:src="viewData.stAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="会长审核信息" name="5" v-if="viewData.hzAudit">
<vi-title title="会长审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.hzAudit.username }}({{ viewData.hzAudit.loginname }})
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.hzAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.hzAudit.auditOpinion }}
</el-descriptions-item>
<el-descriptions-item label="签&emsp;&emsp;字" :span="2">
<el-image v-if="viewData.hzAudit.auditSign"
style="width: 300px; height: 100px"
:src="viewData.hzAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="6" v-if="viewData.xghAudit">
<vi-title title="校工会审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.xghAudit.username }}({{ viewData.xghAudit.loginname }})
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.xghAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.xghAudit.auditOpinion }}
</el-descriptions-item>
<el-descriptions-item label="签&emsp;&emsp;字" :span="2">
<el-image v-if="viewData.xghAudit.auditSign"
style="width: 300px; height: 100px"
:src="viewData.xghAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
clubInfo: "1",
viewData: {register: {}},
loading: true,
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data} = await $.post("/platform/sys/club/examine/register/findOne", {id: id})
this.loading = false
if (data) {
this.viewData = data
const resp = await $.post("/platform/sys/club/examine/register/getClubUserNum", {
clubId: data.register.clubId
})
this.$set(this.viewData, "changeUserNum", resp.data)
const respUser = await $.post("/platform/sys/club/examine/register/getJgUser", {
clubId: data.register.clubId
})
this.$set(this.viewData, "jgUser", respUser.data)
this.clubInfo = this.handle ? "999" : "1"
}
}
}
}
</script>
@@ -0,0 +1,165 @@
<template>
<el-tabs tab-position="top" v-model="clubUserInfo" v-loading="loading">
<el-tab-pane label="基础信息" name="1">
<vi-title title="基础信息"></vi-title>
<el-descriptions :column="3" border class="table_fixed">
<el-descriptions-item label="姓名">
{{viewData.username}}
</el-descriptions-item>
<el-descriptions-item label="性别">
{{viewData.sex}}
</el-descriptions-item>
<el-descriptions-item label="出生年月">
{{moment(viewData.birthday).format('YYYY-MM-DD')}}
</el-descriptions-item>
<el-descriptions-item label="出生地">
{{viewData.birthPlace}}
</el-descriptions-item>
<el-descriptions-item label="文化程度">
{{viewData.education}}
</el-descriptions-item>
<el-descriptions-item label="爱好">
{{viewData.hobby}}
</el-descriptions-item>
<el-descriptions-item label="工作部门">
{{viewData.unitName}}
</el-descriptions-item>
<el-descriptions-item label="职务">
{{viewData.position}}
</el-descriptions-item>
<el-descriptions-item label="电话">
{{viewData.mobile}}
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
{{viewData.email}}
</el-descriptions-item>
<el-descriptions-item label="家庭住址">
{{viewData.homeAddress}}
</el-descriptions-item>
<el-descriptions-item label="QQ">
{{viewData.QQNumber}}
</el-descriptions-item>
<el-descriptions-item label="身高">
{{viewData.bodyHeight}}
</el-descriptions-item>
<el-descriptions-item label="体重">
{{viewData.bodyWeight}}
</el-descriptions-item>
<el-descriptions-item label="身体状况">
{{viewData.health}}
</el-descriptions-item>
<el-descriptions-item label="经常从事的运动">
{{viewData.sport}}
</el-descriptions-item>
<el-descriptions-item label="是否有过特殊病史">
{{viewData.medicalHistory === true ? '是' : '否'}}
</el-descriptions-item>
<el-descriptions-item label="是否愿意参加本协会的活动">
{{viewData.joinActivity === true ? '是' : '否'}}
</el-descriptions-item>
<el-descriptions-item span="3" label="特别需要说明的问题(身体或心理)">
<div class="text-left" v-html="viewData.otherThing"></div>
</el-descriptions-item>
<!-- <el-descriptions-item span="3" label="备注">-->
<!-- <div class="text-left" v-html="viewData.remark"></div>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item span="3">
<template slot="label">两寸登记照</template>
<div class="text-left">
<el-image
style="width: 100px; height: 120px"
:src="FILE_STREAM_PREVIEW_ADDRESS + '?id=' + viewData.photo"></el-image>
</div>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="社团审核信息" name="2" v-if="hasPane(2) && viewData.clubAuditId">
<vi-title title="审核信息"></vi-title>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">
{{ viewData.clubAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ viewData.clubAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="审核意见">
{{ viewData.clubAudit.auditOpinion }}
</el-descriptions-item>
<!-- <el-descriptions-item label="签字" :span="3">-->
<!-- <el-image v-if="viewData.clubAudit.auditSign"-->
<!-- :src="viewData.clubAudit.auditSign"-->
<!-- fit="contain"-->
<!-- style="width: 300px; height: 100px"></el-image>-->
<!-- <span v-else>暂无</span>-->
<!-- </el-descriptions-item>-->
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
name: 'clubUserApplyInfo',
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: () => {return []}
},
},
data() {
return {
clubUserInfo: "1",
viewData: {},
loading: true,
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get('/platform/sys/club/sq/findOne', {id})
this.loading = false
if (data) {
this.clubUserInfo = this.handle ? "999" : "1"
this.viewData = data
}
}
}
}
</script>
<style scoped>
.el-descriptions-item__cell {
text-align: center !important;
}
.table_fixed table{
table-layout: fixed;
}
</style>
@@ -0,0 +1,305 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="申请信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="经办人">
{{ viewData.manager_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="被慰问人">
{{ viewData.be_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="慰问类型">
{{ viewData.type_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="被慰方式">
{{ viewData.way }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="慰问金额">
{{ viewData.money }} 元
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请时间">
{{ viewData.apply_time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发生时间">
{{ viewData.occur_time }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="参加慰问人员">
{{ viewData.personnel }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备&emsp;&emsp;注">
{{ viewData.remark }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="购置物品及价格" v-if="viewData.way=='慰问品 (C)'"></el-form-item>
</el-col>
<el-table :data="viewData.goods" v-if="viewData.way=='慰问品 (C)'" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="物品名称" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品名称" v-model="row.name"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="price" label="物品价格" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="物品价格" v-model="row.price"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.manager_sign"
style="width: 300px; height: 100px"
:src="viewData.manager_sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="24">
<el-form-item prop="user_name" label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="分工会主席审核信息" name="2" v-if="hasPane(2)&&viewData.ucr">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ucr.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.ucr.time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.ucr.opinion ? viewData.ucr.opinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ucr.sign"
style="width: 300px; height: 100px"
:src="viewData.ucr.sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="会计审核信息" name="3" v-if="hasPane(3)&&viewData.fr">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.fr.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.fr.time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.fr.opinion ? viewData.fr.opinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.fr.sign"
style="width: 300px; height: 100px"
:src="viewData.fr.sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会副主席审核信息" name="4" v-if="hasPane(4)&&viewData.vcr">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.vcr.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.vcr.time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.vcr.opinion ? viewData.vcr.opinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.vcr.sign"
style="width: 300px; height: 100px"
:src="viewData.vcr.sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会常务副主席审核信息" name="5" v-if="hasPane(5)&&viewData.ecr">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ecr.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.ecr.time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.ecr.opinion ? viewData.ecr.opinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ecr.sign"
style="width: 300px; height: 100px"
:src="viewData.ecr.sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
filters: {
money(val) {
return val ? val : 0
}
},
data() {
return {
activeName: "1",
viewData: {},
loading: true,
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
watch: {},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get("/platform/fw/condolence/findOne", {id})
this.loading = false
if (data) {
this.activeName = this.handle ? "999" : "1"
condolence.toFormData(data)
this.viewData = data
this.viewData.goods = data.goods
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
},
created() {
}
}
</script>
<style>
.sign_img {
max-width: 300px;
max-height: 100px;
}
</style>
@@ -0,0 +1,70 @@
<template>
<div>
<van-cell class="cell-card">
<van-field readonly :value="viewData.manager_name" label="经办人" input-align="right"></van-field>
<van-field readonly :value="viewData.apply_time" label="申请时间" input-align="right"></van-field>
<van-field readonly :value="viewData.be_username" label="被慰问人"
input-align="right"></van-field>
<van-field readonly :value="viewData.bank_card" label="银行卡号" input-align="right"></van-field>
<van-field readonly name="type" :value="condolence.type[viewData.type]" label="慰问类型"
input-align="right"></van-field>
<van-field readonly name="way" :value="condolence.way[viewData.way]" label="慰问方式" input-align="right"></van-field>
<van-field readonly :value="viewData.money" type="number" label="慰问金额" input-align="right"></van-field>
<van-field readonly :value="viewData.personnel" label="参加慰问人员" input-align="right"></van-field>
<van-field readonly :value="viewData.remark" label="备&emsp;&emsp;注" input-align="right"
rows="2" maxlength="200" type="textarea" show-word-limit autosize></van-field>
<!-- <van-field label="附&emsp;&emsp;件">-->
<!-- <template #input>-->
<!-- <van-uploader disabled v-model="viewData.files"></van-uploader>-->
<!-- </template>-->
<!-- </van-field>-->
<van-field name="sign" label="签字">
<template #input>
<van-image width="200" height="100" :src="viewData.manager_sign" />
</template>
</van-field>
</van-cell>
</div>
</template>
<script>
module.exports = {
props: {
id: {
type: String,
default: ''
},
},
data() {
return {
viewData: {},
}
},
methods: {
async getInfo(id) {
const {data, code, msg} = await $.get("/platform/fw/condolence/findOne", {id})
if (data) {
condolence.toFormData(data)
this.viewData = data
} else {
this.viewData = {}
this.$toast.fail('获取信息失败');
}
},
},
async created() {
await this.getInfo(this.id)
}
}
</script>
@@ -0,0 +1,567 @@
<template>
<el-card class="box-card">
<div slot="header" class="clearfix">
<span style="color: #409EFF;font-size: 18px">填写申请信息</span>
</div>
<el-form :model="form" ref="addform" :rules="formRules" label-width="120px">
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="user_name" label="申请人姓名">
<el-input disabled v-model="form.sqrname == null ? form.sqr : form.sqrname" type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="apply_mode" label="申请模式">
<el-radio-group :disabled="form.id" v-model="form.apply_mode" @change="$emit('radio')" style="width: 100%"
>
<el-radio-button label="1" border>本人申请</el-radio-button>
<el-radio-button label="2" border>替他人申请</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="申请人工号">
<el-input disabled v-model="form.sqrloginname"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="bbzrusername" label="受补助人">
<el-select v-if="form.id==null" clearable
v-model="form.bbzrusername" filterable remote
placeholder="输入工号或者姓名查找" :remote-method="querySqr" @change="userChange" style="width: 100%">
<el-option v-for="o in subsidizedList"
:label="o.username+'('+o.loginname+')-'+o.unit_name" :value="o.id"
:key="o.id"></el-option>
</el-select>
<el-input maxlength="100" disabled v-else v-model="form.bbname"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="idcard" label="身份证号">
<el-input maxlength="50" placeholder="请输入身份证号" clearable
v-model="form.idcard"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-select v-model="form.sex" placeholder="请选择性别" clearable
:disabled="form.apply_mode==1" style="width: 100%">
<el-option v-for="item in ['男','女']" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="mz" label="民&emsp;&emsp;族">
<el-select v-model="form.mz" placeholder="请选择民族" filterable clearable style="width: 100%">
<el-option
v-for="item in mzOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="zc" label="职&emsp;&emsp;称">
<el-select v-model="form.zc" placeholder="请选择或输入职称" filterable clearable
style="width: 100%">
<el-option
v-for="item in zcOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="zw" label="职&emsp;&emsp;务">
<el-input maxlength="50" clearable placeholder="请填写职务" v-model="form.zw"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="zzmm" label="政治面貌">
<el-input maxlength="50" placeholder="请输入政治面貌" clearable v-model="form.zzmm"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="birthday" label="生&emsp;&emsp;日">
<el-date-picker
clearable
style="width: 100%"
v-model="form.birthday"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择生日">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="rsbz" label="人事编制">
<el-select v-model="form.rsbz" placeholder="请选择人事编制" clearable
style="width: 100%">
<el-option
v-for="item in bzOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="cjgzsj" label="参加工作时间">
<el-date-picker clearable
style="width: 100%"
v-model="form.cjgzsj"
type="month"
value-format="yyyy-MM"
placeholder="参加工作时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="ybzk" label="医保状况">
<el-select v-model="form.ybzk" placeholder="请选择医保状况" clearable style="width: 100%">
<el-option
v-for="item in ybOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="unitname" label="所在单位">
<el-input maxlength="50" clearable placeholder="所在单位" v-model="form.unitname"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="lxfs" label="手机号码">
<el-input maxlength="100" clearable placeholder="请填写手机号码" v-model="form.lxfs"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="补助类型" prop="sq_bzlx">
<el-select v-model="form.sq_bzlx" style="width: 100%">
<el-option v-for="(v,k) in subsidy" :label="v" :value="k"
:key="k"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="困难类型" prop="sq_knlx">
<el-select v-model="form.sq_knlx" clearable style="width: 100%">
<el-option v-for="(v,k) in sq_knlx" :key="k" :value="k"
:label="v"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="brnzsr" label="本人年收入" class="int_input">
<el-input-number clearable style="width: 100%" v-model="form.brnzsr" :min="0"
:max="9999999"
controls-position="right" placeholder="请填写年收入(元)">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="jtnzsr" label="家庭年收入" class="int_input">
<el-input-number clearable style="width: 100%" v-model="form.jtnzsr" :min="0"
:max="9999999"
controls-position="right" placeholder="请填写年收入(元)">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="jtrs" label="家庭人数" class="int_input">
<el-input-number clearable style="width: 100%" v-model="form.jtrs" :min="0" :max="99"
controls-position="right" placeholder="请填写家庭人数">
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="xzflx" label="现住房类型">
<el-select v-model="form.xzflx" placeholder="请选择住房类型" clearable style="width: 100%">
<el-option
v-for="item in fclxOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="jzmj" label="建筑面积" class="int_input">
<el-input-number clearable style="width: 100%" v-model="form.jzmj" :min="0"
:max="9999999"
controls-position="right" placeholder="请填写建筑面积(㎡)">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="hyzt" label="婚姻状况" class="int_input">
<el-select v-model="form.hyzt" placeholder="请选择婚姻状况" clearable style="width: 100%">
<el-option
v-for="item in hyzkOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="jtzz" label="目前住址">
<el-input maxlength="50" placeholder="请输入目前住址" clearable v-model="form.jtzz"
type="text"></el-input>
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="yhmc" label="发放补助银行">
<el-input maxlength="100" placeholder="请输入发放补助银行" clearable v-model="form.yhmc"
type="text"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="yhkh" label="银行卡号">
<el-input maxlength="30" placeholder="请输入银行卡号" clearable v-model="form.yhkh"
type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="zyzkyy" label="主要致困原因">
<el-checkbox-group
v-model="form.zyzkyy">
<el-checkbox v-for="item in zzyyOptions" :label="item" :key="item">{{ item }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item prop="zyzkyybz" label="备&emsp;&emsp;注">
<el-input maxlength="500" placeholder="请简述原因" clearable v-model="form.zyzkyybz"
type="textarea"></el-input>
</el-form-item>
<el-divider content-position="left" class="dia"><span style="color: #3ea1ec;">家庭房产</span></el-divider>
<el-form-item label-width="0">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="form.jtfc.push({})">
添加
</el-button>
<el-table :data="form.jtfc" border size="mini" style="width: 100%;height: 100%">
<el-table-column type="index" label="序号" align="center" header-align="center">
</el-table-column>
<el-table-column prop="fcly" label="房产来源" width="200px" align="center"
header-align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.fcly" placeholder="请选择房产来源" clearable>
<el-option
v-for="item in fclyOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="dz" label="地址" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入地址" maxlength="300" v-model="scope.row.dz"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="mj" label="面积" width="200px" align="center" header-align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.mj"
onKeypress="return (/[\d]/.test(String.fromCharCode(event.keyCode)))"
placeholder="请输入面积" type="number">
<template style="border: none;background-color: white;" slot="append">㎡
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" align="center" header-align="center">
<template slot-scope="scope">
<el-button type="danger" size="mini" icon="el-icon-delete" circle
:disabled="form.jtfc.length==0"
@click="form.jtfc.splice(scope.$index,1)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-divider content-position="left" class="dia"><span style="color: #3ea1ec;">家庭车产</span></el-divider>
<el-form-item label-width="0">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="form.jtcc.push({})">
添加
</el-button>
<el-table
:data="form.jtcc"
border
size="mini"
style="width: 100%">
<el-table-column type="index" label="序号" align="center" header-align="center">
</el-table-column>
<el-table-column prop="pp" label="品牌" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入品牌" maxlength="100" v-model="scope.row.pp"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="xh" label="型号" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入型号" maxlength="100" v-model="scope.row.xh"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="jg" label="价格" width="200px" align="center" header-align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.jg"
onKeypress="return (/[\d]/.test(String.fromCharCode(event.keyCode)))"
placeholder="请输入价格" type="number">
<template style="border: none;background-color: white;" slot="append">元
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" align="center" header-align="center">
<template slot-scope="scope">
<el-button type="danger" size="mini" icon="el-icon-delete" circle
:disabled="form.jtcc.length==0"
@click="form.jtcc.splice(scope.$index,1)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-divider content-position="left" class="dia"><span style="color: #3ea1ec;">主要家庭成员</span></el-divider>
<el-form-item label-width="0">
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="form.jtcys.push({})">
添加
</el-button>
<el-table
:data="form.jtcys"
border
size="mini"
style="width: 100%">
<el-table-column prop="xm" label="姓名" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入姓名" maxlength="100" v-model="scope.row.xm" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="gx" label="与本人关系" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入与本人关系" maxlength="30" v-model="scope.row.gx" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="nl" label="年龄" align="center" header-align="center">
<template slot-scope="scope">
<el-input-number clearable style="width: 100%" v-model="scope.row.nl" :min="0" :max="99"
controls-position="right" placeholder="请填写年龄">
</el-input-number>
</template>
</el-table-column>
<el-table-column prop="gzdw" label="工作单位" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入工作单位" maxlength="100" v-model="scope.row.gzdw"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="nsr" label="年收入(元)" align="center" header-align="center">
<template slot-scope="scope">
<el-input-number clearable style="width: 100%" v-model="scope.row.nsr" :min="0"
:max="9999999"
controls-position="right" placeholder="请填写年收入">
</el-input-number>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" align="center" header-align="center">
<template slot-scope="scope">
<el-button type="danger" size="mini" icon="el-icon-delete" circle
:disabled="form.jtcys.length==0"
@click="form.jtcys.splice(scope.$index,1)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-divider content-position="left" class="dia"><span style="color: #3ea1ec;">附&emsp;&emsp;件</span></el-divider>
<el-form-item prop="files" label-width="auto">
<file-upload :files.sync="form.files" card></file-upload>
</el-form-item>
<el-divider content-position="left" class="dia"><span
style="color: #3ea1ec;">签&emsp;&emsp;字</span></el-divider>
<el-form-item prop="sign" label-width="auto">
<sign :qz.sync="form.sqsign"></sign>
</el-form-item>
</el-form>
</el-card>
</template>
<script>
module.exports = {
props: {
form: {
type: Object,
default: {}
},
},
data() {
return {
formRules: {
bbzrusername: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
subsidizedList: [],
mzOptions: [
'汉族',
'蒙古族',
'回族',
'藏族',
'维吾尔族',
'苗族',
'彝族',
'壮族',
'布依族',
'朝鲜族',
'满族',
'侗族',
'瑶族',
'白族',
'土家族',
'哈尼族',
'哈萨克族',
'傣族',
'黎族',
'傈僳族',
'佤族',
'畲族',
'高山族',
'拉祜族',
'水族',
'东乡族',
'纳西族',
'景颇族',
'柯尔克孜族',
'土族',
'达翰尔族',
'么佬族',
'羌族',
'布朗族',
'撒拉族',
'毛南族',
'仡佬族',
'锡伯族',
'阿昌族',
'普米族',
'塔吉克族',
'怒族',
'乌孜别克族',
'俄罗斯族',
'鄂温克族',
'德昂族',
'保安族',
'裕固族',
'京族',
'塔塔尔族',
'独龙族',
'鄂伦春族',
'赫哲族',
'门巴族',
'珞巴族',
'基诺族',
],
ybOptions: ['统筹', '社保'],
zcOptions: ['教授', '副教授', '讲师', '助教', '其他'],
bzOptions: ['事业编制职工(正式职工)', '合同制职工', '人事代理职工', '集体职工', '流动编制职工', '非事业编制职工', '博士后进站人员', '劳务派遣人员', '聘用工(各二级单位聘用)'],
subsidy: {
1: "日常补助慰问",
2: "“元旦、春节”困难补助慰问"
},
sq_knlx: {
1: "会员因病住院",
2: "家庭重大意外事故",
3: "会员去世",
4: "重大疾病(癌症)",
5: "困难家庭",
6: "精神疾病",
7: "长期病休",
8: "其它"
},
fclxOptions: ['商品房', '福利房', '经济适用房', '限价房', '自建房'],
hyzkOptions: ['未婚', '已婚', '离异', '丧偶', '再婚'],
fclyOptions: ['购买', '接收赠与', '继承', '其他来源'],
zzyyOptions: ['本人大病', '供养直系亲属大病', '本人残疾', '家属残疾', '本人下岗失业', '家属下岗失业', '收入低', '自然灾害', '重大事故', '子女上学', '其他'],
}
},
components: {
'sign': httpVueLoader('/components/sign/sign.vue?v=2.0.0'),
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
async getUserData(userId) {
const {data} = await $.get("/platform/fw/condolence/apply/getUserData", {userId})
return data
},
async userChange() {
const userData = await this.getUserData(this.form.bbzrusername);
this.$set(this.form, 'sex', userData.sex)
this.$set(this.form, 'idcard', userData.idcard)
this.$set(this.form, 'yhkh', userData.bank_number)
this.$set(this.form, 'zzmm', userData.political)
this.$set(this.form, 'rsbz', userData.personType)
this.$set(this.form, 'mz', userData.nation)
this.$set(this.form, 'zw', userData.zw)
this.$set(this.form, 'birthday', userData.birthday)
this.$set(this.form, 'lxfs', userData.mobile)
this.$set(this.form, 'unitname', userData.name)
},
querySqr(key) {
$.post(base + '/platform/fw/difficulty/apply/querySqr', {key: key}).then(res => {
this.subsidizedList = res.data;
});
},
},
async created() {
}
}
</script>
@@ -0,0 +1,529 @@
<template>
<div class="difficulty-info">
<el-tabs tab-position="top" v-model="difficulty" v-loading="loading">
<el-tab-pane label="申请信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="user_name" label="申请人姓名">
{{ viewData.sqrname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="申请人工号">
{{ viewData.sqrloginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="补助人身份证号码">
{{ viewData.idcard }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="受补助人">
{{ viewData.bbname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_age" label="出生日期">
{{ viewData.bbbirthday }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="民&emsp;&emsp;族">
{{ viewData.mz }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="职&emsp;&emsp;称">
{{ viewData.zc }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="职&emsp;&emsp;务">
{{ viewData.zw }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="政治面貌">
{{ viewData.zzmm }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="人事编制">
{{ viewData.rsbz }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参加工作时间">
{{ viewData.cjgzsj }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="医保情况">
{{ viewData.ybzk }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在单位">
{{ viewData.bbunit }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在职状态">
{{ viewData.on_job ? '在职' : '退休' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ viewData.lxfs }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="补助类型">
{{ this.subsidy[viewData.sq_bzlx] }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="困难类型">
{{ this.sq_knlx[viewData.sq_knlx] }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主要致困原因">
{{ viewData.zyzkyy }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="本人年收入">
{{ viewData.brnzsr > 0 ? viewData.brnzsr : 0 }}元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="家庭年收入">
{{ viewData.jtnzsr > 0 ? viewData.jtnzsr : 0 }}元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="家庭人数">
{{ viewData.jtrs > 0 ? viewData.jtrs : 0 }}人
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="现住房类型">
{{ viewData.xzflx }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建筑面积">
{{ viewData.jzmj > 0 ? viewData.jzmj : 0 }}平方
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="婚姻状况">
{{ viewData.hyzt }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发放补助银行">
{{ viewData.yhkh }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发放补助银行卡号">
{{ viewData.yhmc }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="级别">
{{ viewData.jb }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="补助金额">
{{ viewData.xghbzje }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="目前住址">
{{ viewData.jtzz }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
{{ viewData.zyzkyybz }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="user_name" label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.sqsign"
style="width: 300px; height: 100px"
:src="viewData.sqsign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="家庭房产" name="2">
<el-table :data="viewData.jtfc" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="fcly" label="房产来源" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" v-model="row.fcly"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="dz" label="地址" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" v-model="row.dz"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="mj" label="面积" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" v-model="row.mj"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="家庭车产" name="3">
<el-table :data="viewData.jtcc" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="pp" label="品牌" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.pp"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="xh" label="型号" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.xh"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="jg" label="价格" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.jg"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="主要家庭成员" name="4">
<el-table :data="viewData.jtcys" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="xm" label="姓名" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" v-model="row.xm"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="gx" label="与本人关系" placeholder="暂无" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.gx"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="nl" label="年龄" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.nl"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="gzdw" label="工作单位" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.gzdw"
type="text"></el-input>
</template>
</el-table-column>
<el-table-column prop="nsr" label="年收入(元)" placeholder="暂无" align="center"
header-align="center">
<template slot-scope="{row}">
<el-input maxlength="50" placeholder="暂无" v-model="row.nsr"
type="text"></el-input>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="工会主席审核信息" name="5" v-if="hasPane(5)&&viewData.upa">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.upa.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.upa.auditTime }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.upa.auditOpinion ? viewData.upa.auditOpinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.upa.auditSign"
style="width: 300px; height: 100px"
:src="viewData.upa.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会经办人审核信息" name="6" v-if="hasPane(6)&&viewData.sma">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.sma.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.sma.auditTime }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.sma.auditOpinion ? viewData.sma.auditOpinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.sma.auditSign"
style="width: 300px; height: 100px"
:src="viewData.sma.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会副主席审核信息" name="7" v-if="hasPane(7)&&viewData.svca">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.svca.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.svca.auditTime }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.svca.auditOpinion ? viewData.svca.auditOpinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.svca.auditSign"
style="width: 300px; height: 100px"
:src="viewData.svca.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会常务副主席审核信息" name="8" v-if="hasPane(8)&&viewData.ssa">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ssa.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.ssa.auditTime }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.ssa.auditOpinion ? viewData.ssa.auditOpinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ssa.auditSign"
style="width: 300px; height: 100px"
:src="viewData.ssa.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会主席审核信息" name="9" v-if="hasPane(9)&&viewData.sua">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.sua.username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.sua.auditTime }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.sua.auditOpinion ? viewData.sua.auditOpinion : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.sua.auditSign"
style="width: 300px; height: 100px"
:src="viewData.sua.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
difficulty: "1",
viewData: {},
loading: true,
subsidy: {
1: "日常补助慰问",
2: "“元旦、春节”困难补助慰问"
},
sq_knlx: {
1: "会员因病住院",
2: "家庭重大意外事故",
3: "会员去世",
4: "重大疾病(癌症)",
5: "困难家庭",
6: "精神疾病",
7: "长期病休",
8: "其它"
},
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get("/platform/fw/difficulty/applylist/findOne", {id})
this.loading = false
if (data) {
this.viewData.files = []
this.difficulty = this.handle ? "999" : "1"
this.viewData = data
this.viewData.zyzkyy = JSON.parse(data.zyzkyy).join(",")
this.viewData.jtfc = JSON.parse(data.jtfc)
this.viewData.jtcc = JSON.parse(data.jtcc)
if (this.viewData.files.length > 0) {
this.viewData.files = JSON.parse(data.files)
}
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
}
}
</script>
<style>
.difficulty-info .el-timeline {
padding-left: 0;
}
.sign_img {
max-width: 300px;
max-height: 100px;
}
</style>
@@ -0,0 +1,246 @@
<template>
<div>
<el-table :data="records" style="width: 100%" row-key="id"
@expand-change="onExpand">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-form class="demo-table-expand" v-loading="row.loading"
label-position="right" label-suffix=":" label-width="120px">
<template v-if="row.info&&row.info.applyAudit">
<vi-title title="本人签字"></vi-title>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="row.info.applyAudit.data"
style="width: 300px; height: 100px"
:src="row.info.applyAudit.data"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</template>
<template v-if="row.info&&row.info.unionAudit">
<vi-title title="基层工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.unionAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.unionAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.unionAudit.auditTime |date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.unionAudit.auditOpinion }}</span>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="row.info.unionAudit.auditSign"
style="width: 300px; height: 100px"
:src="row.info.unionAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
<template v-if="row.info&&row.info.retirementAudit">
<vi-title title="离退休干部处审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.retirementAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.retirementAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.retirementAudit.auditTime |date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.retirementAudit.auditOpinion }}</span>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="row.info.retirementAudit.auditSign"
style="width: 300px; height: 100px"
:src="row.info.retirementAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
<template v-if="row.info&&row.info.fundAudit">
<vi-title title="校工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.fundAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.fundAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.fundAudit.auditTime|date }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.fundAudit.auditOpinion }}</span>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="row.info.fundAudit.auditSign"
style="width: 300px; height: 100px"
:src="row.info.fundAudit.auditSign"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号"
type="index"></el-table-column>
<el-table-column label="申请人" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="申请时间" prop="applyTime" header-align="center"
align="center">
<template scope="{row:{applyTime}}">
{{ applyTime|date }}
</template>
</el-table-column>
<el-table-column label="变更类型" prop="isJoin" header-align="center"
align="center">
<template scope="{row:{isJoin}}">
<el-tag type="success" v-if="isJoin">加入</el-tag>
<el-tag type="danger" v-else-if="!isJoin">退出</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" prop="stateId" header-align="center"
align="center">
<template scope="{row}">
<span :style="'color:'+row.stateColor">{{ row.stateName }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
module.exports = {
components: {},
props: {
records: {type: Array, default: []},
userid: {type: String, default: ""},
},
data() {
return {
loading: true,
}
},
filters: {
date(value) {
return value ? moment(value).format('YYYY-MM-DD') : ''
}
},
watch: {
userid(val) {
this.getAppRecords()
}
},
methods: {
async onExpand(row, expandedRows) {
if (!expandedRows.includes(row)) {
return
}
this.$set(row, "loading", true)
const resp = await $.get("/platform/aid/fund/common/findChangeApplyInfo", {id: row.id})
requestLaterFun(resp, (data) => {
this.$set(row, "info", data)
}, () => {
this.$set(row, "info", {})
}, () => {
this.$set(row, "loading", false)
})
},
async getAppRecords() {
this.loading = true
if (!this.userid && this.records.length) {
this.loading = false
return
} else if (!this.userid) {
this.records = []
this.loading = false
return
}
const resp = await $.get("/platform/aid/fund/common/appRecords", {userId: this.userid})
requestLaterFun(resp, (data) => {
this.records = data
}, () => {
this.$notify.error({
title: '错误',
message: '获取申请记录失败'
});
}, () => {
this.loading = false
})
},
},
}
</script>
<style>
.is-flex {
display: flex;
}
.is-flex .el-form-item {
width: 50%;
}
</style>
@@ -0,0 +1,95 @@
<template>
<div>
<el-table :data="records" style="width: 100%" row-key="id"
@expand-change="onExpand">
<el-table-column align="center" header-align="center" label="序号"
type="index"></el-table-column>
<el-table-column label="缴费年份" prop="year" header-align="center"
align="center"></el-table-column>
<el-table-column label="缴费金额" prop="money" header-align="center"
align="center">
<template scope="{row:{money}}">
<el-tag>{{ money }}</el-tag>
</template>
</el-table-column>
<el-table-column label="是否扣款" prop="payed" header-align="center"
align="center">
<template scope="{row:{payed}}">
<el-tag type="success" v-if="payed">已扣款</el-tag>
<el-tag type="info" v-else-if="!payed">未扣款</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
module.exports = {
components: {},
props: {
records: {type: Array, default: []},
userid: {type: String, default: ""},
},
data() {
return {
loading: true,
}
},
filters: {
date(value) {
return value ? moment(value).format('YYYY-MM-DD') : ''
}
},
watch: {
userid(val) {
this.getPayRecords()
}
},
methods: {
async onExpand(row, expandedRows) {
if (!expandedRows.includes(row)) {
return
}
},
async getPayRecords() {
this.loading = true
if (!this.userid && this.records.length) {
this.loading = false
return
} else if (!this.userid) {
this.records = []
this.loading = false
return
}
const resp = await $.get("/platform/aid/fund/common/getPayRecords", {userId: this.userid})
requestLaterFun(resp, (data) => {
this.records = data
}, () => {
this.$notify.error({
title: '错误',
message: '获取申请记录失败'
});
}, () => {
this.loading = false
})
}
}
}
</script>
<style>
.is-flex {
display: flex;
}
.is-flex .el-form-item {
width: 50%;
}
</style>
@@ -0,0 +1,136 @@
<template>
<el-card shadow="never">
<div class="search">
<slot name="before"></slot>
<div class="search-item" v-if="has_year">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
v-model="value.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年" @change="doSearch">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-option" style="width: 100%">
<el-input placeholder="请输入内容" clearable v-model="value.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="value.searchName" slot="prepend" style="width:100px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="value.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="value.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select v-model="value.union" style="width: 100%" filterable clearable
placeholder="请选择" @change="getUnits">
<el-option
v-for="item in unions"
:key="item.id"
: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 v-model="value.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<slot name="rear"></slot>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
</template>
<script>
module.exports = {
components: {
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
},
props: {
value: {type: Object},
has_year: {
type: Boolean,
default: false
},
},
model: {
prop: 'value',
event: 'search'
},
data() {
return {
searchMore: false,
units: [],
unions: [],
}
},
methods: {
doSearch() {
this.$emit("search", this.value)
},
async getUnits() {
this.$set(this.value, "unit", "")
this.units = await getUnits(this.value.union)
},
},
async created() {
this.getUnits()
this.unions = await getUnions()
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,132 @@
<template>
<div class="aidFund_view">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<vi-title title="基本资料"></vi-title>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="username" label="姓&emsp;&emsp;名">
{{ viewData.username }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="loginname" label="工&emsp;&emsp;号">
{{ viewData.loginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="出生日期">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="nation" label="民&emsp;&emsp;族">
{{ viewData.nation }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="position" label="职&emsp;&emsp;务">
{{ viewData.position }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="jobTitle" label="职&emsp;&emsp;称">
{{ viewData.jobTitle }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="political" label="政治面貌">
{{ viewData.political }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="mobile" label="联系方式">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="unitname" label="所在部门">
{{ viewData.unitname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="unionname" label="所在工会">
{{ viewData.unionname }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
userid: {
type: String,
default: ''
},
panes: {
type: Array,
default: []
},
},
data() {
return {
aidFundName: "1",
viewData: {},
loading: true,
}
},
watch: {
userid(val) {
this.getInfo()
}
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo() {
this.loading = true
const {data, code, msg} = await $.get("/platform/aid/fund/common/findOneUser", {userId:this.userid})
this.loading = false
if (data) {
this.aidFundName = this.handle ? "999" : "1"
this.viewData = data
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
},
}
</script>
<style>
.aidFund_view .el-timeline {
padding-left: 0;
}
</style>
@@ -0,0 +1,285 @@
<template>
<guava ref="guava">
<template name="el-zoom-in-center">
<div v-show="tabShow">
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<div>
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询"
style="width: 100px;">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="pageForm.jdhid" placeholder="请选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span></template>
</el-table-column>
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column sortable prop="sex" label="性别"></el-table-column>
<el-table-column prop="mobile" label="手机"></el-table-column>
<el-table-column sortable prop="dwname" label="单位"></el-table-column>
<el-table-column sortable prop="jdhallname" label="教代会"></el-table-column>
<el-table-column sortable prop="sf" label="身份">
<template slot-scope="{row}">
<span v-if="row.sf===1" class="text-primary">组员</span>
<span v-if="row.sf===2" class="text-primary">负责人</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-dropdown>
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="openView(row)">
查看
</el-dropdown-item>
<el-dropdown-item @click.native="doDelete(row.id, row.userid, row.jdhid)">
删除
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==1" @click.native="updateSf(row.id,1)"
class="text-primary">设置组员
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==2" @click.native="updateSf(row.id,2)"
class="text-primary">设置负责人
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
<el-dialog title="添加组员" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-row :gutter="40">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" @change="jdhChange" placeholder="选择教代会" style="width: 100%">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="cyuser" label="小组成员">
<el-select style="width: 100%"
v-model="formData.cyuser"
filterable
remote
multiple
reserve-keyword
placeholder="请输入用户工号或姓名关键字"
:remote-method="queryUser">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.loginname+' '+item.username+' '+item.dwname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<template #view>
<db-info :active="'1'" ref="DbInfo"></db-info>
</template>
</guava>
</template>
<script>
module.exports = {
data() {
return {
visible: false,
tabShow: true,
rules: {
jdhid: [{required: true, message: '请选择教代会', trigger: ['blur', 'change']}],
cyuser: [{required: true, message: '请搜索并选择用户', trigger: ['blur', 'change']}]
},
addDialogVisible: false,
roleDialogVisible: false,
tableData: [],
jdhList: [],
userList: [],
pageForm: {
searchName: "u.username",
...getPageForm(),
jdhid: '',
},
roleData: {jdh_cbldxz: {}, sys_user: {}, sys_unit: {}, jdh_jdhxx: {}},
formData: {
cyuser: [],
jdhid: ''
},
dbModal: false,
uid: ''
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'db-info': httpVueLoader('/components/jdh/dbinfo.vue')
},
methods: {
openView(row) {
const {userid} = row
this.$refs.DbInfo.openView(userid)
this.$refs.guava.view()
},
queryUser(query) {
if (this.formData.jdhid === '') {
this.$message.info('请先选择教代会')
return
}
if (query !== '') {
$.get(base + '/platform/jdh/zzjg/zxwyh/queryUser', {
keyword: query,
jdhid: this.formData.jdhid
}).then(res => {
this.userList = res.data.list
})
}
},
doDelete(id, userid, jdhid) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
$.post(base + '/platform/jdh/zzjg/cbldxz/doDelete', {
id: id,
userid: userid,
jdhid: jdhid
}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
jdhChange() {
this.userList = []
this.formData.cyuser = []
},
openAdd() {
this.formData = {cyuser: [], jdhid: this.pageForm.jdhid}
this.userList = []
this.addDialogVisible = true
},
doAdd() {
this.$refs["addForm"].validate(valid => {
if (valid) {
$.post(base + '/platform/jdh/zzjg/cbldxz/doAdd', {
jdhid: this.formData.jdhid,
userids: this.formData.cyuser
}).then(res => {
if (res.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
updateSf(id, sf) {
$.post(base + '/platform/jdh/zzjg/cbldxz/updateSf', {id: id, sf: sf}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post("/platform/jdh/zzjg/cbldxz/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm.jdhid = this.jdhList[0].id
}
this.pageData()
}
}
</script>
@@ -0,0 +1,213 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="会议信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-form-item style="text-align: center">
<span style="font-weight: 700;font-size: 16px">{{ viewData.meeting_name }}</span>
</el-form-item>
<el-row gutter="450">
<el-col :span="12">
<el-form-item label="所在单位">
{{ viewData.unit_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请时间">
{{ viewData.create_time }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="申请人">
{{ viewData.username }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="有无选举事项">
<i v-if="viewData.have_elect" class="fa fa-circle text-success ml5">&emsp13;有</i>
<i v-if="!viewData.have_elect" class="fa fa-circle text-danger ml5">&emsp13;无</i>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="审核状态">
<span :style="'color:'+viewData.color">{{ viewData.state_name }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="届&emsp;&emsp;次">
{{ viewData.jdhallname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="会议时间">
{{ viewData.meeting_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="上次大会时间">
{{ viewData.before_meeting_time }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="6">
<el-form-item label="正式代表">
{{ viewData.official_delegate }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其中教师">
{{ viewData.teacher_delegate }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="列席代表">
{{ viewData.attend_delegate }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="其中特邀">
{{ viewData.special_delegate }}
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="user_name" label="会议议题">
<span v-html="viewData.meeting_topic"></span>
</el-form-item>
<el-form-item prop="user_name" label="备&emsp;&emsp;注">
{{ viewData.remark }}
</el-form-item>
<el-form-item label="附&emsp;&emsp;件">
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="院级党委意见" name="2" v-if="viewData.party_committee_id">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header"></el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人:">
{{ viewData.party_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.party_committee_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
{{ viewData.party_committee_opinion }}
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会意见" name="3" v-if="viewData.school_union_id">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header"></el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人:">
{{ viewData.school_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.school_union_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
{{ viewData.school_union_opinion }}
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
id: String,
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
}
},
data() {
return {
activeName: '1',
loading: true,
viewData: {},
replyFiles: []
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getMeetingInfo(id) {
const {data} = await $.get(base + "/platform/jdh/level2/info/getMeetingInfo", {id})
return data
},
async openView(id) {
this.loading = true
this.viewData = await this.getMeetingInfo(id)
if (this.viewData) {
if (this.viewData.files) {
this.viewData.files = JSON.parse(this.viewData.files)
}
this.activeName = this.handle ? "999" : "1"
} else {
this.viewData = {}
this.$message.error("获取会议信息失败");
}
this.loading = false
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,74 @@
<template>
<div>
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入会议名称" clearable v-model="page.searchKeyword"
@keyup.enter.native="$emit('doSearch')">
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="page.unionId" filterable placeholder="请选择工会" @change="unionChange">
<el-option
v-for="item in unionOptions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="page.unitId" filterable placeholder="请选择单位">
<el-option
v-for="item in unitOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search" @click="$emit('search')"></el-button>
</div>
<div class="pull-right offscreen-right mt5" v-if="audit">
<el-radio-group v-model="page.isAudit" @change="$emit('search')">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</div>
</el-row>
</div>
</template>
<script>
module.exports = {
props: {
page: {
type: Object,
default: {}
},
audit: {
type: Boolean,
default: true
}
},
data() {
return {
unionOptions: [],
unitOptions: [],
}
},
methods: {
async unionChange(val) {
this.unitOptions = await getUnits(val)
}
},
async created() {
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,65 @@
<template>
<div>
<el-row class="el-table-container">
<el-table :data="table" style="width: 100%" row-key="id" @sort-change="(c)=>{$emit('page_order',c)}"
v-loading="loading">
<el-table-column align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{ scope.$index + (page.pageNumber - 1) * page.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column label="会议名称" prop="meeting_name" header-align="center" align="center"
width="300px"></el-table-column>
<el-table-column label="会议时间" prop="meeting_time" header-align="center" align="center">
<template scope="{row:{meeting_time}}">
{{moment(meeting_time).format('YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column label="届次" prop="jdhallname" header-align="center" align="center"></el-table-column>
<el-table-column label="申请人" prop="username" header-align="center" align="center"></el-table-column>
<!-- <el-table-column label="所属单位" prop="unit_name" header-align="center" align="center"></el-table-column>-->
<el-table-column label="正式代表人数" prop="official_delegate" header-align="center" align="center"></el-table-column>
<!-- <el-table-column label="教师代表人数" prop="teacher_delegate" header-align="center" align="center"></el-table-column>-->
<el-table-column label="列席代表人数" prop="attend_delegate" header-align="center" align="center"></el-table-column>
<el-table-column label="特邀代表人数" prop="special_delegate" header-align="center" align="center"></el-table-column>
<el-table-column label="有无选举事项" prop="have_elect" header-align="center" align="center">
<template scope="scope">
<i v-if="scope.row.have_elect" class="fa fa-circle text-success ml5">&emsp13;有</i>
<i v-if="!scope.row.have_elect" class="fa fa-circle text-danger ml5">&emsp13;无</i>
</template>
</el-table-column>
<el-table-column label="审核状态" prop="state_id" sortable header-align="center" align="center">
<template scope="scope">
<span :style="'color:'+scope.row.color">{{ scope.row.state_name }}</span>
</template>
</el-table-column>
<slot name="column"></slot>
</el-table>
</el-row>
</div>
</template>
<script>
module.exports = {
props: {
page: {
type: Object,
default: {}
},
table: {
type: Array,
default: []
},
loading: {
type: Boolean,
default: false
}
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,280 @@
<template>
<guava ref="guava">
<template name="el-zoom-in-center">
<div v-show="tabShow">
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<div>
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询"
style="width: 100px;">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="pageForm.jdhid" placeholder="请选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span></template>
</el-table-column>
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column sortable prop="sex" label="性别"></el-table-column>
<el-table-column prop="mobile" label="手机"></el-table-column>
<el-table-column sortable prop="dwname" label="单位"></el-table-column>
<el-table-column sortable prop="jdhallname" label="教代会"></el-table-column>
<el-table-column sortable prop="sf" label="身份">
<template slot-scope="{row}">
<span v-if="row.sf===1" class="text-primary">组员</span>
<span v-if="row.sf===2" class="text-primary">副组长</span>
<span v-if="row.sf===3" class="text-primary">组长</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-dropdown>
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="openView(row)">
查看
</el-dropdown-item>
<el-dropdown-item @click.native="doDelete(row.id,row.userid,row.jdhid)">
删除
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==3" @click.native="updateSf(row.id,3)"
class="text-primary">设置组长
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==2" @click.native="updateSf(row.id,2)"
class="text-primary">设置副组长
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==1" @click.native="updateSf(row.id,1)"
class="text-primary">设置组员
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
<el-dialog title="添加组员" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" @change="jdhChange" placeholder="选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="cyuser" label="小组成员">
<el-select
v-model="formData.cyuser"
filterable
remote
multiple
reserve-keyword
placeholder="请输入用户工号或姓名关键字"
:remote-method="queryUser">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.loginname+' '+item.username+' '+item.dwname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<template #view>
<db-info :active="'1'" ref="DbInfo"></db-info>
</template>
</guava>
</template>
<script>
module.exports = {
data() {
return {
tabShow: true,
rules: {
jdhid: [{required: true, message: '请选择教代会', trigger: ['blur', 'change']}],
cyuser: [{required: true, message: '请搜索并选择用户', trigger: ['blur', 'change']}]
},
addDialogVisible: false,
roleDialogVisible: false,
tableData: [],
jdhList: [],
userList: [],
pageForm: {
searchName: "u.username",
...getPageForm(),
jdhid: '',
},
roleData: {jdh_cbldxz: {}, sys_user: {}, sys_unit: {}, jdh_jdhxx: {}},
formData: {
cyuser: [],
jdhid: ''
},
dbModal: false,
uid: ''
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'db-info': httpVueLoader('/components/jdh/dbinfo.vue')
},
methods: {
openView(row) {
const {userid} = row
this.$refs.DbInfo.openView(userid)
this.$refs.guava.view()
},
queryUser(query) {
if (this.formData.jdhid === '') {
this.$message.info('请先选择教代会')
return
}
if (query !== '') {
$.get(base + '/platform/jdh/zzjg/zxwyh/queryUser', {
keyword: query,
jdhid: this.formData.jdhid
}).then(res => {
this.userList = res.data.list
})
}
},
doDelete(id, userid, jdhid) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
$.post(base + '/platform/jdh/zzjg/zgscxz/doDelete', {
id: id,
userid: userid,
jdhid: jdhid
}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
jdhChange() {
this.userList = []
this.formData.cyuser = []
},
openAdd() {
this.formData = {cyuser: [], jdhid: this.pageForm.jdhid}
this.userList = []
this.addDialogVisible = true
},
doAdd() {
this.$refs["addForm"].validate(valid => {
if (valid) {
$.post(base + '/platform/jdh/zzjg/zgscxz/doAdd', {
jdhid: this.formData.jdhid,
userids: this.formData.cyuser
}).then(res => {
if (res.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
updateSf(id, sf) {
$.post(base + '/platform/jdh/zzjg/zgscxz/updateSf', {id: id, sf: sf}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post("/platform/jdh/zzjg/zgscxz/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm.jdhid = this.jdhList[0].id
}
this.pageData()
}
}
</script>
@@ -0,0 +1,277 @@
<template>
<guava ref="guava">
<template name="el-zoom-in-center">
<div v-show="tabShow">
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<div>
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询"
style="width: 100px;">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="pageForm.jdhid" placeholder="请选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span></template>
</el-table-column>
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column sortable prop="sex" label="性别"></el-table-column>
<el-table-column prop="mobile" label="手机"></el-table-column>
<el-table-column sortable prop="dwname" label="单位"></el-table-column>
<el-table-column sortable prop="jdhallname" label="教代会"></el-table-column>
<el-table-column sortable prop="sf" label="身份">
<template slot-scope="{row}">
<span v-if="row.sf===1" class="text-primary">成员</span>
<span v-if="row.sf===2" class="text-primary">副秘书长</span>
<span v-if="row.sf===3" class="text-primary">秘书长</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-dropdown>
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="openView(row)">
查看
</el-dropdown-item>
<el-dropdown-item @click.native="doDelete(row.id)">
删除
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==1" @click.native="updateSf(row.id,1)"
class="text-primary">设置组员
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==2" @click.native="updateSf(row.id,2)"
class="text-primary">设置副秘书长
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==3" @click.native="updateSf(row.id,3)"
class="text-primary">设置秘书长
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
<el-dialog title="添加成员" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" @change="jdhChange" placeholder="选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="cyuser" label="主席团成员">
<el-select
v-model="formData.cyuser"
filterable
remote
multiple
value-key="id"
placeholder="请输入用户工号或姓名关键字"
:remote-method="queryUser">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.loginname+' '+item.username+' '+item.dwname"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<template #view>
<db-info :active="'1'" ref="DbInfo"></db-info>
</template>
</guava>
</template>
<script>
module.exports = {
data() {
return {
tabShow: true,
rules: {
jdhid: [{required: true, message: '请选择教代会', trigger: ['blur', 'change']}],
cyuser: [{required: true, message: '请搜索并选择用户', trigger: ['blur', 'change']}]
},
addDialogVisible: false,
roleDialogVisible: false,
tableData: [],
jdhList: [],
userList: [],
pageForm: {
searchName: "u.username",
...getPageForm(),
jdhid: '',
},
roleData: {jdh_cbldxz: {}, sys_user: {}, sys_unit: {}, jdh_jdhxx: {}},
formData: {
cyuser: [],
jdhid: ''
},
dbModal: false,
uid: ''
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'db-info': httpVueLoader('/components/jdh/dbinfo.vue')
},
methods: {
openView(row) {
const {userid} = row
this.$refs.DbInfo.openView(userid)
this.$refs.guava.view()
},
queryUser(query) {
if (this.formData.jdhid === '') {
this.$message.info('请先选择教代会')
return
}
if (query !== '') {
$.get(base + '/platform/jdh/zzjg/zxwyh/queryUser', {
keyword: query,
jdhid: this.formData.jdhid
}).then(res => {
this.userList = QC(this.formData.cyuser, res.data.list, 'id')
})
}
},
doDelete(id) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const res = await GET('/platform/jdh/zzjg/zxt/doDelete', {id: id})
console.log(res)
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
}
}
});
},
jdhChange() {
this.userList = []
this.formData.cyuser = []
},
openAdd() {
this.formData = {cyuser: [], jdhid: this.pageForm.jdhid}
this.userList = []
this.addDialogVisible = true
},
doAdd() {
this.$refs["addForm"].validate(valid => {
if (valid) {
$.post(base + '/platform/jdh/zzjg/zxt/doAdd', {
jdhid: this.formData.jdhid,
user: this.formData.cyuser
}).then(res => {
if (res.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
updateSf(id, sf) {
$.post(base + '/platform/jdh/zzjg/zxt/updateSf', {id: id, sf: sf}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post("/platform/jdh/zzjg/zxt/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm.jdhid = this.jdhList[0].id
}
this.pageData()
}
}
</script>
@@ -0,0 +1,146 @@
<template>
<div>
<el-tabs tab-position="top" v-model="active">
<el-tab-pane label="基本信息" name="1">
<el-form label-width="130px" style="padding: 20px 0">
<vi-title title="基本信息"></vi-title>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="姓名:">
{{ dbData.username }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别:">
{{ dbData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="年龄:">
{{ age }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="民族:">
{{ dbData.mz }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="文化程度:">
{{ dbData.xl }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="政治面貌:">
{{ dbData.zzmm }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="所在部门:">
{{ dbData.dwname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="职称:">
{{ dbData.zc }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="职务:">
{{ dbData.zw }}
</el-form-item>
</el-col>
</el-row>
<vi-title title="个人简历"></vi-title>
<div v-html="dbData.grjl"></div>
</el-form>
</el-tab-pane>
<el-tab-pane label="预选信息" name="2" v-if="dbData.rewards">
<el-form label-width="130px" style="padding: 20px 0">
<vi-title title="近几年奖惩情况"></vi-title>
<div v-html="dbData.rewards"></div>
<el-form-item label="附&emsp;&emsp;件" label-width="125px" class="view-header"></el-form-item>
<file-upload v-if="dbData.files&&dbData.files.length"
:files="dbData.files"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
data() {
return {
active: "1",
dbData: {}
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
async openView(id) {
const {data, code, msg} = await $.get("/platform/jdh/Common/findDbxx", {id})
if (code === 0) {
this.dbData = data
if (this.dbData.files) {
this.dbData.files = JSON.parse(data.files)
}
this.active = this.handle ? "999" : "1"
} else {
this.dbData = {}
this.$message.error("获取会议信息失败");
}
}
},
props: {
id: String,
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
}
},
computed: {
age() {
if (this.dbData.birthday) {
let y1 = parseInt(this.dbData.birthday.split('-')[0])
let y2 = parseInt(moment().format('YYYY'))
return (y2 - y1) + '岁'
}
return ''
}
},
}
</script>
<style>
td {
text-align: center;
}
</style>
@@ -0,0 +1,67 @@
<template>
<table class="tabInfo">
<tr>
<td class="title">会议名称</td>
<td class="content" colspan="3">{{data.hyname}}</td>
</tr>
<tr>
<td class="title">所属基层工会</td>
<td class="content">{{data.unionname}}</td>
<td class="title">申请状态</td>
<td class="content">
<span class="text-primary" v-if="data.shzt===1">待校工会审核</span>
<span class="text-danger" v-if="data.shzt===2">拒绝</span>
<span class="text-success" v-if="data.shzt===3">通过</span>
</td>
</tr>
<tr>
<td class="title">填表人</td>
<td class="content">{{data.tbrname}}</td>
</tr>
<tr>
<td class="title">会议时间</td>
<td class="content">{{data.hysj}}</td>
<td class="title">会议地点</td>
<td class="content">{{data.hydd}}</td>
</tr>
<tr>
<td class="title" colspan="4">指导思想</td>
</tr>
<tr>
<td class="content" colspan="4" style="text-align: left">
<div v-html="data.zdsx"></div>
</td>
</tr>
<tr>
<td class="title" colspan="4">会议议题</td>
</tr>
<tr>
<td class="content" colspan="4" style="text-align: left">
<div v-html="data.hyyt"></div>
</td>
</tr>
<tr>
<td class="title" colspan="4">会议进程</td>
</tr>
<tr>
<td class="content" colspan="4" style="text-align: left">
<div v-html="data.hyjc"></div>
</td>
</tr>
</table>
</template>
<script>
module.exports = {
props:{
data:{
type:Object,
required:true
}
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,74 @@
<template>
<el-row>
<el-table :data="data">
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope"><span>{{scope.$index+(pf.pageNumber - 1) * pf.pageSize + 1}} </span></template>
</el-table-column>
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="手机" prop="mobile"></el-table-column>
<el-table-column label="单位" >
<tempalate slot-scope="scope">
<span v-if="name==8">{{scope.row.dbunitname}}</span>
<span v-else>{{scope.row.dwname}}</span>
</tempalate>
</el-table-column>
<el-table-column label="身份">
<tempalate slot-scope="scope">
<span v-if="name==8">{{scope.row.rolename}}</span>
<span v-else>{{getSf(scope.row.sf)}}</span>
</tempalate>
</el-table-column>
</el-table>
</el-row>
</template>
<script>
module.exports = {
data(){
return{
tabname:this.name
}
},
props:{
data:{
type:Array,
default:()=>[]
},
name:{
type:Number
},
pf:{
type:Object,
default(){
return{
pageNumber:1,
pageSize:10,
totalCount:0,
}
}
}
},
computed:{
getSf(){
return (sf)=>{
if(this.name==2){
return sf==1?'组员':'负责人'
}else if(this.name==3){
return sf==1?'组员':sf==2?'副组长':sf==3?'组长':''
}else if(this.name==4){
return sf==1?'成员':sf==2?'副秘书长':sf==3?'秘书长':''
}else if(this.name==5){
return sf==1?'成员':sf==2?'副主任':sf==3?'主任':''
}
}
}
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,469 @@
<template>
<guava ref="guava">
<template name="el-zoom-in-center">
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" v-model="pageForm.wyhname" @keyup.enter.native="doSearch"></el-input>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="pageForm.jdhid" placeholder="请选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加委员会</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope"><span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column sortable prop="jdhallname" label="教代会"></el-table-column>
<el-table-column prop="wyhname" label="委员会名称"></el-table-column>
<el-table-column prop="zrmobile" label="主任及联系方式"></el-table-column>
<el-table-column prop="gzzz" label="工作职责" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-dropdown>
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="openView(row)">
查看
</el-dropdown-item>
<el-dropdown-item @click.native="openEdit(row)">
编辑
</el-dropdown-item>
<el-dropdown-item @click.native="doDelete(row)">
删除
</el-dropdown-item>
<el-dropdown-item @click.native="openEditUser(row)"
class="text-primary">成员管理
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
<el-dialog title="添加委员会" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="120px">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" @change="jdhChange" placeholder="选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="name" label="委员会名称">
<el-select v-model="formData.wyh" value-key="id">
<el-option v-for="i in wyhList" :label="i.name" :value="i" :key="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="gzzz" label="委员会工作职责">
<el-input type="textarea" rows="5" v-model.trim="formData.gzzz"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog :title="titleEdit" :visible.sync="editDialogVisible">
<el-form :model="formData" ref="editForm" :rules="rules" label-width="120px">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" disabled placeholder="选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="name" label="委员会名称">
<el-select v-model="formData.wyh" value-key="i.id" disabled>
<el-option v-for="i in wyhList" :label="i.name" :value="i" :key="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="gzzz" label="委员会工作职责">
<el-input type="textarea" rows="5" v-model.trim="formData.gzzz"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
<el-dialog :title="titleEditUser" :visible.sync="userDialogVisible" width="70%">
<el-row>
<div class="btn-group tool-button mt5">
<div>
<el-select
size="mini"
style="width: 400px"
v-model="userFormData.userid"
filterable
remote
placeholder="请输入工号或姓名关键字"
:remote-method="queryUser">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.username+' ('+item.loginname+')' + item.dwname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-button size="mini" type="primary" @click="addUser2Tab " icon="el-icon-circle-plus">添加成员</el-button>
</div>
</el-row>
<el-row style="margin-top: 15px">
<el-table :data="userTableData" height="300">
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
<el-table-column prop="mobile" label="手机号码"></el-table-column>
<el-table-column prop="dwname" label="所属单位"></el-table-column>
<el-table-column prop="sf" label="身份">
<template slot-scope="scope">
<span v-if="scope.row.sf===1" class="text-primary">成员</span>
<span v-if="scope.row.sf===2" class="text-primary">副主任</span>
<span v-if="scope.row.sf===3" class="text-primary">主任</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-dropdown placement="bottom">
<el-button type="primary" size="mini">
设置身份<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="scope.row.sf!==3" @click.native="updateSf(scope.row,3)">主任
</el-dropdown-item>
<el-dropdown-item v-if="scope.row.sf!==2" @click.native="updateSf(scope.row,2)">副主任
</el-dropdown-item>
<el-dropdown-item v-if="scope.row.sf!==1" @click.native="updateSf(scope.row,1)">成员
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button type="danger" size="mini" @click="doDeleteUser(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button type="danger" @click="userDialogVisible = false">关 闭</el-button>
</span>
</el-dialog>
<el-dialog title="详情" :visible.sync="viewDialogVisible">
<table class="tabInfo">
<tr>
<td class="title">委员会名称</td>
<td class="content">{{ viewData.wyhname }}</td>
</tr>
<tr>
<td class="title">所属教代会</td>
<td class="content">{{ viewData.jdhallname }}</td>
</tr>
<tr>
<td class="title">主任</td>
<td class="content">
<template v-for="u in viewData.userList">
<span class="mr5" v-if="u.sf===3">{{ u.username }}</span>
</template>
</td>
</tr>
<tr>
<td class="title">副主任</td>
<td class="content">
<template v-for="u in viewData.userList">
<span class="mr5" v-if="u.sf===2">{{ u.username }}</span>
</template>
</td>
</tr>
<tr>
<td class="title">成员</td>
<td class="content">
<template v-for="u in viewData.userList">
<span class="mr5" v-if="u.sf===1">{{ u.username }}</span>
</template>
</td>
</tr>
<tr>
<td class="title">委员会工作职责</td>
<td class="content">{{ viewData.gzzz }}</td>
</tr>
</table>
</el-dialog>
</template>
</guava>
</template>
<script>
module.exports = {
data() {
return {
titleEditUser: "",
titleEdit: "",
rules: {
jdhid: [{required: true, message: '请选择教代会', trigger: ['blur', 'change']}],
wyh: [{required: true, message: '请选择委员会', trigger: ['blur', 'change']}],
gzzz: [{required: true, message: '请输入委员会工作职责', trigger: ['blur', 'change']}]
},
addDialogVisible: false,
editDialogVisible: false,
roleDialogVisible: false,
tableData: [],
jdhList: [],
userList: [],
pageForm: {
searchName: "u.username",
...getPageForm(),
jdhid: '',
wyhname: '',
union_id: ""
},
roleData: {jdh_cbldxz: {}, sys_user: {}, sys_unit: {}, jdh_jdhxx: {}},
formData: {},
wyhList: [],
userList: [],
userDialogVisible: false,
userFormData: {},
userTableData: [],
viewDialogVisible: false,
viewData: {},
}
},
methods: {
queryKyWyhMc(jdhid) {
if (jdhid !== '') {
$.get(base + '/platform/jdh/zzjg/zmwyh/queryKyWyhMc', {jdhid: jdhid}).then(res => {
if (res.code === 0) {
this.wyhList = res.data
}
})
}
},
openEdit(obj) {
this.titleEdit = obj.wyhname + '编辑'
this.wyhList = [{id: obj.mcid, name: obj.wyhname}]
this.formData = {
id: obj.id,
wyh: {id: obj.mcid, name: obj.wyhname},
gzzz: obj.gzzz,
jdhid: obj.jdhid
}
this.editDialogVisible = true
},
doEdit() {
this.$refs["editForm"].validate(valid => {
if (valid) {
this.formData.name = this.formData.wyh.name
this.formData.mcid = this.formData.wyh.id
$.post(base + '/platform/jdh/zzjg/zmwyh/doEdit', this.formData).then(res => {
if (res.code === 0) {
this.editDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
doDelete(obj) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
$.post(base + '/platform/jdh/zzjg/zmwyh/doDelete', {id: obj.id, jdhid: obj.jdhid}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
jdhChange(jdhid) {
this.queryKyWyhMc(jdhid)
},
openAdd() {
this.formData = {
jdhid: this.jdhList.length > 0 ? this.jdhList[0].id : '',
name: '',
gzzz: ''
}
this.queryKyWyhMc(this.formData.jdhid)
this.addDialogVisible = true
},
doAdd() {
this.$refs["addForm"].validate(valid => {
if (valid) {
this.formData.name = this.formData.wyh.name
this.formData.mcid = this.formData.wyh.id
$.post(base + '/platform/jdh/zzjg/zmwyh/doAdd', this.formData).then(res => {
if (res.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
//用户管理
userData(wyhid) {
$.get(base + '/platform/jdh/zzjg/zmwyh/userData', {wyhid: wyhid}).then(res => {
if (res.code === 0) {
this.userTableData = res.data
}
})
},
openEditUser(obj) {
this.titleEditUser = obj.wyhname + "设置"
this.userFormData = {
userid: '',
wyhid: obj.id,
jdhid: obj.jdhid,
wyhmcid: obj.mcid
}
this.userData(obj.id)
this.userDialogVisible = true
},
queryUser(query) {
if (query !== '') {
$.get(base + '/platform/jdh/zzjg/zxwyh/queryUser', {
keyword: query,
jdhid: this.userFormData.jdhid
}).then(res => {
//this.userList = QC(this.users,res.data.list,'id')
this.userList = res.data.list
})
}
},
addUser2Tab() {
if (this.userFormData.userid === '') {
this.$message.info('请先选择用户!')
return
}
$.post(base + '/platform/jdh/zzjg/zmwyh/doAddUser', this.userFormData).then(res => {
if (res.code === 0) {
this.userFormData.userid = ''
this.userList = []
this.userData(this.userFormData.wyhid)
}
})
},
updateSf(obj, sf) {
$.post(base + '/platform/jdh/zzjg/zmwyh/updateSf',
{
userid: obj.id,
zmwyhid: obj.zmwyhid,
sf: sf
}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.userData(obj.zmwyhid)
this.pageData()
}
})
},
doDeleteUser(obj) {
obj.jdhid = this.userFormData.jdhid
$.post(base + '/platform/jdh/zzjg/zmwyh/doDeleteUser', obj).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.userData(obj.zmwyhid)
}
})
},
async openView(row) {
this.viewDialogVisible = true
const {data} = await GET('/platform/jdh/zzjg/zmwyh/userData', {wyhid: row.id})
this.$nextTick(() => {
this.viewData = row
this.viewData.userList = data
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post("/platform/jdh/zzjg/zmwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm.jdhid = this.jdhList[0].id
}
this.unionOptions = await getUnions()
this.pageData()
}
}
</script>
@@ -0,0 +1,280 @@
<template>
<guava ref="guava">
<template name="el-zoom-in-center">
<div v-show="tabShow">
<el-row class="header navbar bg-white shadow">
<div class="btn-group tool-button mt5">
<div>
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询"
style="width: 100px;">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="btn-group tool-button mt5">
<el-select clearable v-model="pageForm.jdhid" placeholder="请选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加成员</el-button>
</div>
</el-row>
<el-row class="el-table-container">
<el-table :data="tableData" @sort-change='pageOrder'>
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }} </span></template>
</el-table-column>
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column sortable prop="sex" label="性别"></el-table-column>
<el-table-column prop="mobile" label="手机"></el-table-column>
<el-table-column sortable prop="dwname" label="单位"></el-table-column>
<el-table-column sortable prop="jdhallname" label="教代会"></el-table-column>
<el-table-column sortable prop="sf" label="身份">
<template slot-scope="{row}">
<span v-if="row.sf===1" class="text-primary">成员</span>
<span v-if="row.sf===2" class="text-primary">副主任</span>
<span v-if="row.sf===3" class="text-primary">主任</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-dropdown>
<el-button size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="openView(row)">
查看
</el-dropdown-item>
<el-dropdown-item @click.native="doDelete(row.id)">
删除
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==3" @click.native="updateSf(row.id,3)"
class="text-primary">设置主任
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==2" @click.native="updateSf(row.id,2)"
class="text-primary">设置副主任
</el-dropdown-item>
<el-dropdown-item v-if="row.sf!==1" @click.native="updateSf(row.id,1)"
class="text-primary">设置成员
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-row>
<!--#include("/layouts/pagination.html"){}#-->
<el-dialog title="添加成员" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-form-item prop="jdhid" label="所属教代会">
<el-select v-model="formData.jdhid" @change="jdhChange" placeholder="选择教代会">
<el-option
v-for="item in jdhList"
:key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="cyuser" label="委员会成员">
<el-select
v-model="formData.cyuser"
filterable
remote
multiple
value-key="id"
placeholder="请输入用户工号或姓名关键字"
:remote-method="queryUser">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.loginname+' '+item.username+' '+item.dwname"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<template #view>
<db-info :active="'1'" ref="DbInfo"></db-info>
</template>
</guava>
</template>
<script>
module.exports = {
data() {
return {
tabShow: true,
rules: {
jdhid: [{required: true, message: '请选择教代会', trigger: ['blur', 'change']}],
cyuser: [{required: true, message: '请搜索并选择用户', trigger: ['blur', 'change']}]
},
addDialogVisible: false,
roleDialogVisible: false,
tableData: [],
jdhList: [],
userList: [],
pageForm: {
searchName: "u.username",
...getPageForm(),
jdhid: '',
},
roleData: {jdh_cbldxz: {}, sys_user: {}, sys_unit: {}, jdh_jdhxx: {}},
formData: {
cyuser: [],
jdhid: ''
},
dbModal: false,
uid: ''
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'db-info': httpVueLoader('/components/jdh/dbinfo.vue')
},
methods: {
openView(row) {
const {userid} = row
this.$refs.DbInfo.openView(userid)
this.$refs.guava.view()
},
queryUser(query) {
if (this.formData.jdhid === '') {
this.$message.info('请先选择教代会')
return
}
if (query !== '') {
$.get(base + '/platform/jdh/zzjg/zxwyh/queryUser', {
keyword: query,
jdhid: this.formData.jdhid
}).then(res => {
this.userList = QC(this.formData.cyuser, res.data.list, 'id')
})
}
},
doDelete(id) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
$.post(base + '/platform/jdh/zzjg/zxwyh/doDelete', {id: id}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
}).catch(() => {
})
},
jdhChange() {
this.userList = []
this.formData.cyuser = []
},
openAdd() {
this.formData = {cyuser: [], jdhid: this.pageForm.jdhid}
this.userList = []
this.addDialogVisible = true
},
doAdd() {
this.$refs["addForm"].validate(valid => {
if (valid) {
$.post(base + '/platform/jdh/zzjg/zxwyh/doAdd', {
jdhid: this.formData.jdhid,
user: this.formData.cyuser
}).then(res => {
if (res.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(res.msg)
}
})
}
})
},
updateSf(id, sf) {
$.post(base + '/platform/jdh/zzjg/zxwyh/updateSf', {id: id, sf: sf}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
this.tabLoading = true
$.post("/platform/jdh/zzjg/zxwyh/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
this.tabLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.jdhList = await getAllJdh()
if (this.jdhList.length > 0) {
this.pageForm.jdhid = this.jdhList[0].id
}
this.pageData()
}
}
</script>
@@ -0,0 +1,150 @@
<template>
<div>
<el-dialog title="自动计算得分" :visible.sync="show_modal" :close-on-click-modal="false">
<el-table :data="tableData" v-loading="loading" element-loading-text="智能查分中"
element-loading-spinner="el-icon-loading text-primary"
element-loading-background="rgba(0, 0, 0, 0.8)">
<el-table-column type="index"></el-table-column>
<el-table-column v-for="column in tableColumn"
:key="column.prop"
:label="column.label"
:prop="column.prop"
show-overflow-tooltip
header-align="center"
align="center">
</el-table-column>
</el-table>
<template #footer>
<el-button @click="closeCalcTable">取 消</el-button>
<el-button type="primary" @click="autoFillTab" :disabled="loading">自动计算填入</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {
relation_year: {
type: Object,
default: {}
},
show_modal: {
type: Boolean,
default: false
}
},
data() {
return {
loading: false,
tableData: [],
tableColumn: [],
proposalTableColumn: [
{label: '提案编号', prop: 'proposalCode'},
{label: '提案名称', prop: 'proposalName'},
{label: '提案人', prop: 'username'},
{label: '提案时间', prop: 'createTime'},
{label: '教代会届次', prop: 'jdhallname'}
],
secTeaMeetTableColumn: [
{label: '会议名称', prop: 'meeting_name'},
{label: '会议时间', prop: 'meeting_time'},
{label: '届次', prop: 'jdhallname'},
{label: '申请人', prop: 'username'},
],
ConTableColumn: [
{label: '被慰问/补助人', prop: 'be_username'},
{label: '被慰问/补助人', prop: 'be_loginname'},
{label: '申请时间', prop: 'apply_time'},
{label: '慰问/补助类型', prop: 'typename'},
{label: '类型', prop: 'querytype'},
],
PerformanceTableColumn: [
{label: '获奖活动', prop: 'activityName'},
{label: '获奖项目', prop: 'eventName'},
{label: '获奖名次', prop: 'ranking'},
{label: '获奖积分', prop: 'integral'},
{label: '参加人数', prop: 'numberOfPeople'},
]
}
},
watch: {
relation_year: {
async handler(v) {
switch (v.bz_relation_id) {
case 'proposal':
this.tableColumn = this.proposalTableColumn
break
case 'secteameet':
this.tableColumn = this.secTeaMeetTableColumn
break
case 'ConandDif':
this.tableColumn = this.ConTableColumn
break
case 'Performance':
this.tableColumn = this.PerformanceTableColumn
break
default:
this.tableColumn = []
}
this.tableData = []
this.loading = true
const res = await $.get('/platform/TradeUnionAssessmentCalcScore/CalcScore', v)
if (res.code === 0) {
setTimeout(() => {
this.loading = false
this.tableData = res.data == null ? [] : res.data
}, 1000)
}
},
immediate: false
}
},
methods: {
autoFillTab() {
// this.$emit('get_score_item_num', this.tableData.length)
this.$emit('get_table_data', this.tableData)
this.$emit('update:show_modal', false)
},
closeCalcTable() {
this.$emit('update:show_modal', false)
}
}
}
</script>
<style>
/**
修改el-dialog样式
*/
.el-dialog__wrapper {
overflow: unset;
}
.el-dialog {
margin-top: 5vh !important;
/*height: 90vh;*/
max-height: 90vh;
overflow: hidden;
}
.el-dialog .el-dialog__header {
height: 54px;
max-height: 54px;
}
/**
header + footer
(54 + 70) = 124px
*/
.el-dialog .el-dialog__body {
overflow-y: auto !important;
max-height: calc(90vh - 124px) !important;
}
.el-dialog .el-dialog__footer {
height: 70px;
max-height: 70px;
}
</style>
@@ -0,0 +1,326 @@
<template>
<el-form class="el_form" :model="data" ref="addForm" :rules="formRules" label-width="100px">
<el-form-item label-width="110px" class="fixedBox">
<el-button v-if="!is_view" size="small" style="float: right" icon="el-icon-plus" type="primary"
@click="data.nrs.push({bzs:[{}]})">
添加内容
</el-button>
</el-form-item>
<vi-title title="指标信息"></vi-title>
<el-row gutter="20">
<el-col :span="6">
<el-form-item prop="annual" label="年&emsp;&emsp;度">
<el-date-picker
style="width: 100%"
v-if="!is_view"
:picker-options="pickerOptions"
v-model="data.annual"
type="year"
value-format="yyyy"
placeholder="选择年度">
</el-date-picker>
<el-input v-else style="color: #F6F7FA;" disabled v-model="data.annual"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="assessment" label="考核名称">
<el-input maxlength="30" v-if="!is_view" v-model="data.assessment" placeholder="请填写考核名称"
type="text">
</el-input>
<el-input v-else style="color: #F6F7FA;" disabled v-model="data.assessment"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="assessment" label="">
<el-checkbox v-model="data.isEvaluationIndex">是否采用往年考核指标</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="zbId" label="" v-if="data.isEvaluationIndex">
<el-select v-model="data.zbId" placeholder="请选择指标" filterable clearable
style="width: 100%" @change="getByZbData">
<el-option
v-for="item in zbList"
:key="item.id"
:label="item.annual+item.assessment"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<vi-title title="考核内容"></vi-title>
<el-form-item label="" label-width="0" v-for="nr,idx in data.nrs">
<el-row type="flex" align="middle" justify="space-between">
<el-input v-model="nr.content" v-if="!is_view" maxlength="30" style="width: 50%" placeholder="请填写考核内容">
<template slot="prepend"><span v-model="nr.contentNumber">{{ nr.contentNumber = idx + 1 }}</span></template>
</el-input>
<span style="background-color: #F6F7FA;" v-else>{{ idx + 1 }}&nbsp;&nbsp;{{ nr.content }}</span>
<el-button v-if="!is_view" size="medium" :disabled="data.nrs.length<=1" type="danger"
@click="data.nrs.splice(idx,1)"
icon="el-icon-delete"></el-button>
</el-row>
<el-row style="margin-top: 20px">
<el-table :data="nr.bzs" style="width: 100%" border show-summary :summary-method="getSummaries" size="small">
<el-table-column align="center" header-align="center" label="序号" type="index" width="100px">
</el-table-column>
<el-table-column label="考核标准" prop="inspection" header-align="center" align="center">
<template scope="{row}">
<el-input v-if="!is_view" v-model="row.inspection" placeholder="请填写考核标准"></el-input>
<span v-else>{{ row.inspection }}</span>
</template>
</el-table-column>
<el-table-column label="单项分" prop="single_score" header-align="center" align="center" width="100px">
<template scope="{row}">
<el-input v-if="!is_view" v-model="row.single_score" placeholder="请填写单项分"></el-input>
<span v-else>{{ row.single_score }}</span>
</template>
</el-table-column>
<el-table-column label="标准分" prop="score" header-align="center" align="center" width="100px">
<template scope="{row}">
<el-input v-if="!is_view" v-model.number="row.score" maxlength="4" placeholder="请填写标准分"></el-input>
<span v-else>{{ row.score }}</span>
</template>
</el-table-column>
<el-table-column label="能否超过标准分" prop="beyond_highestscore" header-align="center" align="center" width="120px">
<template scope="{row}">
<el-switch
v-if="!is_view"
v-model="row.beyond_highestscore"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
<el-switch
v-else
disabled
v-model="row.beyond_highestscore">
</el-switch>
</template>
</el-table-column>
<el-table-column label="是否提供佐证材料" prop="isEvidence" header-align="center" align="center" width="120px">
<template scope="{row}">
<el-switch
v-if="!is_view"
v-model="row.isEvidence"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
<el-switch
v-else
disabled
v-model="row.isEvidence">
</el-switch>
</template>
</el-table-column>
<el-table-column label="关联模块" prop="associatedmodule" header-align="center" align="center" width="200px">
<template scope="{row}">
<el-input v-if="!is_view" v-model="row.associatedmodule" maxlength="10" placeholder="请填写关联模块"></el-input>
<span v-else>{{ row.associatedmodule }}</span>
</template>
</el-table-column>
<el-table-column label="关联标识" prop="bz_relation_id" header-align="center" align="center" width="100px">
<template scope="{row}">
<el-input v-if="!is_view" v-model="row.bz_relation_id" maxlength="20" placeholder="请填写关联标识,该标识唯一"></el-input>
<span v-else>{{ row.bz_relation_id }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="能否删除" prop="canDelete" header-align="center" align="center" width="100px">-->
<!-- <template scope="{row}">-->
<!-- <el-switch-->
<!-- v-if="!is_view"-->
<!-- :disabled="row.canDelete==false"-->
<!-- v-model="row.canDelete"-->
<!-- active-color="#13ce66"-->
<!-- inactive-color="#ff4949">-->
<!-- </el-switch>-->
<!-- <el-switch-->
<!-- v-else-->
<!-- :disabled="!row.canDelete && row.id"-->
<!-- v-model="row.canDelete">-->
<!-- </el-switch>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column v-if="!is_view" label="操作" header-align="center" align="center" width="100px">
<template scope="{row,$index}">
<el-button size="mini" :disabled="nr.bzs.length<=1 || (!row.canDelete && row.id)" type="danger" icon="el-icon-delete"
@click="nr.bzs.splice($index,1)"></el-button>
</template>
</el-table-column>
</el-table>
<el-button v-if="!is_view" type="primary" plain style="width: 100%" size="mini" icon="el-icon-plus"
@click="nr.bzs.push({})">
添加考核标准
</el-button>
<el-divider></el-divider>
</el-row>
</el-form-item>
</el-form>
</template>
<script>
const METHOD_NAME = "change"
module.exports = {
props: {
is_view: {
type: Boolean,
default: false
},
data: {
type: Object,
default: {
nrs: [{
bzs: [{}]
}],
}
}
},
watch: {
data: {
deep: true,
handler(val) {
this.$emit(METHOD_NAME, val)
}
}
},
data() {
return {
isEvaluationIndex: false,
zbList: [],
formRules: {
xxx: [{required: true, message: '请填写年度', trigger: ['blur', 'change']}],
},
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
relationData:[
{moduleName:'提案系统模块',id:'proposal'},
{moduleName:'二级教代会',id:'secteameet'},
{moduleName:'慰问/补助',id:'ConandDif'},
]
}
},
methods: {
async getByZbData() {
const {code, data, msg} = await $.get('/platform/ghkh/khzb/edit', {id: this.data.zbId})
this.$set(this.data, "nrs", data.nrs)
},
async getZbList() {
await $.get("/platform/ghkh/Xjkhzb/getZbList").then(res => {
this.zbList = res.data
})
},
async getKh() {
await $.get("/platform/ghkh/khph/getKh", {"annual": this.data.annual}).then(res => {
if (res.data.length != 0) {
this.kh = res.data
this.data.khid = this.kh[0].id
} else {
this.kh = []
this.pageForm.khid = ""
}
})
},
async khSearch() {
await this.getKh()
},
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '小计';
return;
} else if ([1,4,5,6,7].includes(index)) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += ' 分';
} else {
sums[index] = '';
}
});
return sums;
}
},
created() {
this.getZbList()
if (!this.data || !Object.keys(this.data).length) {
this.data = {
nrs: [{
bzs: [{}]
}],
}
}
}
}
</script>
<style>
.fixedBox {
position: fixed;
top: 200px;
right: 10px;
z-index: 100;
}
.el-divider {
background-color: #409EFF;
}
.el_form {
position: relative;
}
.el-input-group__prepend {
background-color: #419BF8;
color: white;
}
</style>
@@ -0,0 +1,67 @@
<template>
<el-form :model="data" ref="form" :rules="formRules" label-width="100px">
<el-form-item label="&emsp;" label-width="110px" class="view-header"></el-form-item>
<el-form-item prop="nr" label="考核内容">
<el-input disabled v-model="data.nr" type="text"></el-input>
</el-form-item>
<el-form-item prop="bz" label="考核标准">
<el-input disabled v-model="data.bz" type="text"></el-input>
</el-form-item>
<el-form-item prop="clnr" label="材料内容">
<el-input v-model="data.clnr" type="textarea" :autosize="{ minRows: 2, maxRows: 10}"
placeholder="" :disabled="is_view"></el-input>
</el-form-item>
<el-form-item label="&emsp;" label-width="110px" class="view-header"></el-form-item>
<el-form-item label="佐证材料">
<file-upload :files.sync="data.files" :view="is_view" card></file-upload>
</el-form-item>
</el-form>
</template>
<script>
const METHOD_NAME = "change"
module.exports = {
props: {
is_view: {
type: Boolean,
default: false
},
width: "200px",
data: {
type: Object,
default: {
files: ()=>[],
}
},
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue')
},
data() {
return {
formRules: {
xxx: [{required: true, message: '', trigger: ['blur', 'change']}]
}
}
},
methods: {},
watch:{
},
created() {
}
}
</script>
<style>
</style>
@@ -0,0 +1,657 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="申请信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0">
<el-row gutter="20" v-if="viewData.type==1">
<el-col :span="8">
<el-form-item prop="user_name" label="工&emsp;&emsp;号">
{{ viewData.loginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
{{ viewData.user_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_age" label="年龄(岁)">
{{ viewData.user_age }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部&emsp;&emsp;门">
{{ viewData.unit_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在职状态">
{{ viewData.on_job ? '在职' : '退休' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行名称">
{{ viewData.bank_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="银行账号">
{{ viewData.bank_account }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="疾病诊断">
{{ viewData.disease_diagnosis }}
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.typename">
<el-form-item label="疾病类型">
{{ viewData.typename }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入住医院">
{{ viewData.hospital }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="住院时间">
{{ viewData.hospital_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="住院天数">
{{ viewData.hospital_stay }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="本次住院医疗费总额">
{{ viewData.total_medical_expenses | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="统筹基金支付总额(医保支付)">
{{ viewData.overall_fund_payment | money }} 元
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="部分政策字符的个人支付">
{{ viewData.individual_pay | money }} 元
</el-form-item>
</el-col>-->
<!-- <el-col :span="8">
<el-form-item label="统筹段的个人比例自付部分">
{{ viewData.overall_individual_pay | money }} 元
</el-form-item>
</el-col>-->
<!-- <el-col :span="8">
<el-form-item label="起付线自付费(门槛费)">
{{ viewData.deductible | money }} 元
</el-form-item>
</el-col>-->
<!-- <el-col :span="8">
<el-form-item label="完全政策自付中内置材料和自费药费">
{{ viewData.materials | money }} 元
</el-form-item>
</el-col>-->
<el-col :span="8">
<el-form-item label="其他保险报销金额">
{{ viewData.insured_amount | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="个人实际支付金额">
{{ viewData.selfPayMoney | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票号码">
{{ viewData.invoice_num }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20" v-else-if="viewData.type==2">
<el-col :span="8">
<el-form-item prop="user_name" label="工&emsp;&emsp;号">
{{ viewData.loginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
{{ viewData.user_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_age" label="年龄(岁)">
{{ viewData.user_age }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部&emsp;&emsp;门">
{{ viewData.unit_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在职状态">
{{ viewData.on_job ? '在职' : '退休' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请时间">
{{ viewData.apply_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="疾病诊断">
{{ viewData.disease_diagnosis }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="住院医疗总费用">
{{ viewData.total_medical_expenses | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="统筹基金支付数">
{{ viewData.overall_fund_payment | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="学校医疗补助已补助金额">
{{ viewData.already_subsidized | money }} 元
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.type!=2">
<el-form-item label="发票号码">
{{ viewData.invoice_num }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20" v-else-if="viewData.type==3">
<el-col :span="8">
<el-form-item prop="user_name" label="工&emsp;&emsp;号">
{{ viewData.loginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_name" label="姓&emsp;&emsp;名">
{{ viewData.user_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="sex" label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="user_age" label="年龄(岁)">
{{ viewData.user_age }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部&emsp;&emsp;门">
{{ viewData.unit_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在职状态">
{{ viewData.on_job ? '在职' : '退休' }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请时间">
{{ viewData.apply_time }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="疾病诊断">
{{ viewData.disease_diagnosis }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行名称">
{{ viewData.bank_name }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="银行账号">
{{ viewData.bank_account }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="特殊门诊个人自付部分总额">
{{ viewData.special_clinic_self_pay | money }} 元
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发票号码">
{{ viewData.invoice_num }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="附件" name="100" v-if="viewData.type!=2">
<el-form>
<el-row>
<el-col :span="12">
<el-form-item label="发&emsp;&emsp;票">
<span class="text-danger">({{ viewData.invoice_num }})</span>
<file-upload v-if="viewData.files_invoice&&viewData.files_invoice.length"
:files="viewData.files_invoice"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="诊断书">
<file-upload v-if="viewData.files_medical_certificate&&viewData.files_medical_certificate.length"
:files="viewData.files_medical_certificate"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="医保结算单">
<file-upload v-if="viewData.files_medicare_settlement&&viewData.files_medicare_settlement.length"
:files="viewData.files_medicare_settlement"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出院小结">
<file-upload v-if="viewData.files_summary_discharge&&viewData.files_summary_discharge.length"
:files="viewData.files_summary_discharge"
:view="true"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="分工会主席审核信息" name="2" v-if="hasPane(2)&&viewData.unit_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ur_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.unit_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.unit_review_idea ? viewData.unit_review_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ur_s"
style="width: 300px; height: 100px"
:src="viewData.ur_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="离退休干部处审核信息" name="3" v-if="hasPane(3)&&viewData.retirement_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.retr_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.retirement_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.retirement_review_idea ? viewData.retirement_review_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ret_s"
style="width: 300px; height: 100px"
:src="viewData.ret_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="综合门诊部审核信息" name="4" v-if="hasPane(4)&&viewData.opc_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.or_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.opc_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{ viewData.opc_review_idea ? viewData.opc_review_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.or_s"
style="width: 300px; height: 100px"
:src="viewData.or_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="工会会计办理信息" name="5" v-if="viewData.type==2&&hasPane(5)&&viewData.accountant_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="办理信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="办理人员:">
{{ viewData.ar_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="办理时间:">
{{ viewData.accountant_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="补助金额:">
{{ viewData.total_grant | money }} 元
</el-form-item>
<el-form-item label="办理意见:">
<div class="textarea-div">{{
viewData.accountant_review_idea ? viewData.accountant_review_idea : '暂无'
}}
</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ar_s"
style="width: 300px; height: 100px"
:src="viewData.ar_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-else label="工会会计审核信息" name="6" v-if="viewData.type!=2&&hasPane(6)&&viewData.accountant_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.ar_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.accountant_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="补助金额:">
{{ viewData.total_grant | money }} 元
</el-form-item>
<el-form-item label="审核意见:">
<div class="textarea-div">{{
viewData.accountant_review_idea ? viewData.accountant_review_idea : '暂无'
}}
</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ar_s"
style="width: 300px; height: 100px"
:src="viewData.ar_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="工会副主席审核信息" name="7" v-if="hasPane(7)&&viewData.vice_chairman_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审核信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员:">
{{ viewData.vcr_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间:">
{{ viewData.vice_chairman_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见:">
<div class="textarea-div">{{
viewData.vice_chairman_review_idea ? viewData.vice_chairman_review_idea : '暂无'
}}
</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.vcr_s"
style="width: 300px; height: 100px"
:src="viewData.vcr_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="工会主席审批信息" name="8" v-if="hasPane(8)&&viewData.chairman_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="审批信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审批人员:">
{{ viewData.chr_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审批时间:">
{{ viewData.chairman_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审批意见:">
<div class="textarea-div">{{ viewData.chairman_review_idea ? viewData.chairman_review_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.cr_s"
style="width: 300px; height: 100px"
:src="viewData.cr_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="财务出纳信息" name="9" v-if="hasPane(9)&&viewData.cashier_reviewer">
<el-form label-width="130px" style="padding: 20px 0">
<el-form-item label="付款信息&emsp;" label-width="135px" class="view-header">
</el-form-item>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="付款人员:">
{{ viewData.car_username }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="付款时间:">
{{ viewData.cashier_review_time }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="意&emsp;&emsp;见:">
<div class="textarea-div">{{ viewData.cashier_review_idea ? viewData.cashier_review_idea : '暂无' }}</div>
</el-form-item>
<el-form-item label="签&emsp;&emsp;字:">
<el-image v-if="viewData.ca_s"
style="width: 300px; height: 100px"
:src="viewData.ca_s"
fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
filters: {
money(val) {
return val ? val : 0
}
},
data() {
return {
activeName: "1",
viewData: {},
loading: true,
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
watch: {},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get("/platform/fw/medicalAid/common/findOne", {id})
this.loading = false
if (data) {
this.activeName = this.handle ? "999" : "1"
medicalAid.toFormData(data)
if (data.hospital_time && data.hospital_time.length) {
data.hospital_time = data.hospital_time.join(" ~ ")
}
this.viewData = data
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
},
created() {
}
}
</script>
<style>
.sign_img {
max-width: 300px;
max-height: 100px;
}
</style>
@@ -0,0 +1,120 @@
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年&emsp;&emsp;度:</div>
<div class="search-item-option">
<el-date-picker
v-model="page_form.year"
type="year"
value-format="yyyy" style="width: 100%"
placeholder="选择年" @change="$emit('search')">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-option" style="width: 100%">
<el-input placeholder="请输入内容" clearable v-model="page_form.searchKeyword"
@keyup.enter.native="$emit('search')">
<el-select v-model="page_form.searchName" slot="prepend" placeholder="查询类型"
style="width: 100px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item" v-if="has_type">
<div class="search-item-label">补助类型:</div>
<div class="search-item-option">
<el-select v-model="page_form.type" style="width: 100%" placeholder="补助类型" clearable @change="$emit('search')"
@clear="$emit('search')">
<el-option
v-for="item in medicalAid.med_types"
:key="item.val"
:label="item.lab"
:value="item.val">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore&&has_union">
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="page_form.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="page_form.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>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="$emit('search')">搜索</el-button>
<more v-model="searchMore" v-if="has_union"></more>
</div>
</div>
</el-card>
</template>
<script>
module.exports = {
props: {
page_form: '',
has_add: {
type: Boolean,
default: false
},
has_type: {
type: Boolean,
default: false
},
has_union: {
type: Boolean,
default: true
},
dis_add: {
type: Boolean,
default: false
}
},
data() {
return {
unions: [],
units: [],
searchMore: false
}
},
watch: {},
methods: {
async flushUnits() {
this.$set(this.page_form, "unitId", "")
this.units = await getUnits(this.page_form.unionId)
}
},
async created() {
this.unions = await getUnions(null)
},
}
</script>
<style>
</style>
@@ -0,0 +1,272 @@
<template>
<div style="display: flex;align-items: center;justify-content: center">
<el-form :model="formData" ref="form" :rules="formRules" v-loading="loading" label-width="100px"
style="width: 1000px">
<vi-title title="申请变更"></vi-title>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="工&emsp;&emsp;号">
<el-input :value="formData.loginname" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓&emsp;&emsp;名">
<el-input :value="formData.username" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="所在单位">
<el-input :value="formData.unitname" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在工会">
<el-input :value="formData.unionname"
disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="变更时间">
<el-input :value="formData.auditTime" disabled></el-input>
</el-form-item>
<el-form-item prop="type" label="变更类型">
<dict-select v-model="formData.type" style="width: 100%" clearable placeholder="变更类型"
code="MemberChangeType" @change="typeChange"></dict-select>
</el-form-item>
<!--异动-->
<div v-if="formData.type==='1'">
<el-form-item prop="type" label="新&ensp;单&ensp;位">
<el-select v-model="formData.currentUnitId" style="width: 100%" filterable clearable
@change="unitChange"
placeholder="请选择单位">
<el-option
v-for="item in unitOptions"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="type" label="新&ensp;工&ensp;会">
<el-input :value="formData.currentUnionName" disabled placeholder=""></el-input>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="新科室" prop="currentThreeUnitId">
<el-select v-model="formData.currentThreeUnitId" clearable filterable
placeholder="请选择新科室"
@change="threeUnitChange"
style="width: 100%">
<el-option
v-for="item in threeUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工会小组">
<el-input :value="formData.currentUnionGroupName" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<div v-else-if="welfare_member&&['3','4','5','6','8'].includes(formData.type)">
<el-form-item prop="updateWelfareMember" label="是否同时取消享受福利" label-width="170px">
<el-switch
v-model="formData.updateWelfareMember"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
<span style="color: red">&emsp;&emsp;&emsp;温馨提醒:此操作将取消该教工正式会员资格</span>
</el-form-item>
</div>
<div v-else-if="welfare_member&&['2','7'].includes(formData.type)">
<el-form-item prop="updateWelfareMember" label="是否同时享受福利" label-width="170px">
<el-switch
v-model="formData.updateWelfareMember"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
<span style="color: red">&emsp;&emsp;&emsp;温馨提醒:此操作将该教工设为正式会员</span>
</el-form-item>
</div>
<el-form-item prop="remark" label="变化原因">
<el-input v-model="formData.remark" placeholder="变化原因" type="textarea" :rows="4"></el-input>
</el-form-item>
<el-row style="display: flex;justify-content:flex-end;">
<el-button @click="doSubmit" :loading="submitLoading" :disabled="disabled" type="primary">
提交
</el-button>
</el-row>
</el-form>
</div>
</template>
<script>
module.exports = {
components: {
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
},
props: {
userid: {type: String},
welfare_member: {type: Boolean, default: true},
},
data() {
return {
loading: true,
disabled: false,
submitLoading: false,
formData: {},
formRules: {
type: [{required: true, message: '必选', trigger: ['blur', 'change']}],
updateWelfareMember: [{required: true, message: '必选', trigger: ['blur', 'change']}],
currentUnitId: [{required: true, message: '必选', trigger: ['blur', 'change']}],
currentThreeUnitId: [{required: true, message: '请选择新三级单位', trigger: 'change'}]
},
unitOptions: [],
threeUnits: []
}
},
watch: {
userid(val) {
this.flush()
}
},
methods: {
typeChange() {
this.$set(this.formData, "updateWelfareMember", ['2', '3', '4', '5', '6', '7', '8'].includes(this.formData.type))
},
async doSubmit() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.submitLoading = true
this.$emit("submit", this.formData)
}
})
},
closeLoading() {
this.submitLoading = false
},
unitChange(v) {
// const unit = this.unitOptions.find(x => x.id === v)
// if (unit) {
// this.formData.currentUnionId = unit.unionid
// this.formData.currentUnionName = unit.unionname
// } else {
// this.formData.currentUnionId = ''
// this.formData.currentUnionName = ''
// }
this.$set(this.formData, 'currentThreeUnitId', null)
this.$set(this.formData, 'currentUnionGroupName', null)
this.threeUnits = []
if (v) {
this.getThreeUnits(v)
}
const unit = this.unitOptions.find(x => x.id === v)
if (unit) {
this.$set(this.formData, 'currentUnionId', unit.unionid)
this.$set(this.formData, 'currentUnionName', unit.unionname)
} else {
this.$set(this.formData, 'currentUnionId', null)
this.$set(this.formData, 'currentUnionName', null)
}
},
async getThreeUnits(val) {
this.threeUnits = await threeUnitsByUnionGroupOrUnitId(val, null)
},
async threeUnitChange(val) {
if (val) {
const threeUnit = this.threeUnits.find(v => v.id === val)
const groupName = threeUnit.groupname
this.$set(this.formData, 'currentUnionGroupName', groupName)
} else {
this.$set(this.formData, 'currentUnionGroupName', null)
}
},
async flush() {
this.loading = true
this.disabled = false
if (!this.userid) {
this.formData = {}
this.loading = false
this.disabled = true
return
}
const resp = await $.get("/platform/member/common/userInfo", {userId: this.userid})
if (resp.code === 0) {
if (this.$refs["form"])
this.$refs["form"].resetFields();
this.formData = {
userId: resp.data.id,
loginname: resp.data.loginname,
username: resp.data.username,
unitname: resp.data.unitname,
unionname: resp.data.unionname,
originUnitId: resp.data.unitid,
originThreeUnitId: resp.data.threeUnitId,
originUnionId: resp.data.unionid,
auditTime: moment().format('YYYY-MM-DD'),
notes: null
}
this.disabled = false
} else {
this.disabled = true
this.$notify.error({
title: '错误',
message: '获取用户信息失败'
});
}
this.loading = false
},
async getUnits() {
const resp = await $.post('/platform/member/change/mange/units')
if (resp.code === 0) {
this.unitOptions = resp.data
}
}
},
created() {
this.getUnits()
this.flush()
// getUnits(null).then(res => this.unitOptions = res)
}
}
</script>
<style>
.is-flex {
display: flex;
}
.is-flex .el-form-item {
width: 50%;
}
</style>
@@ -0,0 +1,235 @@
<template>
<div>
<el-table :data="records" style="width: 100%" row-key="id"
@expand-change="onExpand">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-form class="demo-table-expand" v-loading="row.loading"
label-position="right" label-suffix=":" label-width="120px">
<vi-title title="变更信息"></vi-title>
<el-form-item label="变更原因">
{{ row.remark }}
</el-form-item>
<!--异动-->
<template v-if="row.type==1">
<vi-title title="异动信息"></vi-title>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="原科室">
<span>{{ row.originThreeUnitName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="原单位">
<span>{{ row.originUnitName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="原工会">
<span>{{ row.originUnionName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="新科室">
<span>{{ row.currentThreeUnitName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="新单位">
<span>{{ row.currentUnitName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="新工会">
<span>{{ row.currentUnionName }}</span>
</el-form-item>
</el-col>
</el-row>
</template>
<template v-if="audit_info_union&&row.info.unionAudit">
<vi-title title="基层工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.unionAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.unionAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.unionAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.unionAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
<template v-if="audit_info_school&&row.info.schoolAudit">
<vi-title title="校工会审核信息"></vi-title>
<el-row :gutter="20" v-if="row.info&&row.info.schoolAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.schoolAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.schoolAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.schoolAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号"
type="index"></el-table-column>
<el-table-column label="申请人" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="申请时间" prop="applyTime" header-align="center"
align="center"></el-table-column>
<el-table-column label="申请方式" prop="type" header-align="center"
align="center">
<template scope="{row:{applyOrigin}}">
{{ changeOrigin[applyOrigin] }}
</template>
</el-table-column>
<el-table-column label="变更类型" prop="type" header-align="center"
align="center">
<template scope="{row:{type}}">
{{ changeType[type] }}
</template>
</el-table-column>
<el-table-column label="状态" prop="stateId" header-align="center"
align="center">
<template scope="{row}">
<span :style="'color:'+row.stateColor">{{ row.stateName }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
module.exports = {
components: {},
props: {
records: {type: Array, default: []},
userid: {type: String},
audit_info_union: {type: Boolean, default: true},
audit_info_school: {type: Boolean, default: true}
},
model: {
prop: 'records',
event: 'change'
},
data() {
return {
loading: true,
changeType: {},
changeOrigin: {},
}
},
watch: {
userid(val) {
this.getMemberChangeRecords()
}
},
methods: {
async onExpand(row, expandedRows) {
if (!expandedRows.includes(row)) {
return
}
this.$set(row, "loading", true)
const resp = await $.get("/platform/member/common/findChangeApplyInfo", {id: row.id})
this.$set(row, "loading", false)
if (resp.code === 0) {
this.$set(row, "info", resp.data)
} else {
this.$set(row, "info", {})
}
},
async getMemberChangeRecords() {
this.loading = true
if (!this.userid && this.records.length) {
this.loading = false
return
} else if (!this.userid) {
this.records = []
this.loading = false
return
}
const resp = await $.get("/platform/member/common/memberChangeRecords", {userId: this.userid})
this.loading = false
if (resp.code === 0) {
this.records = resp.data
} else {
this.$notify.error({
title: '错误',
message: '获取变更记录失败'
});
}
},
},
async created() {
await this.getMemberChangeRecords()
this.changeType = await member.getChangeType()
this.changeOrigin = await member.getChangeOrigin()
}
}
</script>
<style>
.is-flex {
display: flex;
}
.is-flex .el-form-item {
width: 50%;
}
</style>
@@ -0,0 +1,59 @@
/**
*Desc:
*Create by: jug
*Create time:2023/6/8/10:29
*/
<template>
<div>
<el-input v-model="cnd.memberSearchKeyWord" placeholder="请输入值" style="width: 100%">
<el-select v-model="cnd.memberSearchName" slot="prepend" placeholder="请选择字段" style="width: 120px">
<el-option
v-for="column in columnInfos"
:key="column.COLUMN_NAME"
:label="column.COLUMN_COMMENT"
:value="column.COLUMN_NAME">
</el-option>
</el-select>
</el-input>
</div>
</template>
<script>
module.exports = {
name: "MemberCnd",
props: {},
components: {'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),},
data() {
return {
columnInfos: [],
cnd: {}
}
},
watch: {
cnd: {
handler(val) {
this.$emit('cnd', val)
},
deep: true
}
},
methods: {
async getColumnInfo() {
const {data, msg, code} = await $.post('/platform/activity/basic/scope/getUserTableColumnInfo')
if (code !== 0) {
this.$notify.warning(msg)
return
}
this.columnInfos = data
}
},
created() {
this.getColumnInfo()
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,993 @@
<template>
<div>
<div v-if="!view">
<el-form :model="formData" ref="form" :rules="formRules" label-width="120px" v-loading="loading"
:disabled="!isAllowModify">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基本信息" :name="1">
<vi-title title="基本资料"></vi-title>
<el-form-item prop="loginname" label="工&emsp;&emsp;号">
<el-input v-model="formData.loginname" placeholder="工号"></el-input>
</el-form-item>
<div class="is-flex">
<el-form-item prop="unitid" label="所属单位">
<el-select placeholder="所属单位"
style="width: 100%"
filterable @change="unitChange"
v-model="formData.unitid">
<el-option v-for="unit in unitOptions" :key="unit.id" :value="unit.id" :label="unit.name"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="unionid" label="所属工会">
<el-input :value="formData.unionname" readonly></el-input>
</el-form-item>
</div>
<el-row :gutter="10" v-if="displayUnionGroup">
<el-col :xs="24" :lg="12">
<el-form-item label="所属三级单位" prop="deptId">
<el-select v-model="formData.threeUnitId"
filterable
placeholder="所属三级单位"
style="width: 100%"
@change="threeUnitChange">
<el-option
v-for="item in threeUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :lg="12">
<el-form-item label="工会小组">
<el-input :value="formData.unionGroupName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="is-flex">
<el-form-item prop="username" label="姓&emsp;&emsp;名">
<el-input v-model="formData.username" placeholder="姓名"></el-input>
</el-form-item>
<el-form-item prop="nameUsedBefore" label="曾&ensp;用&ensp;名">
<el-input maxlength="100" placeholder="曾用名"
v-model="formData.nameUsedBefore"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="birthday" label="出生日期">
<el-date-picker style="width: 100%" v-model="formData.birthday" format="yyyy-MM-dd"
value-format="yyyy-MM-dd" type="date" placeholder="出生日期"></el-date-picker>
</el-form-item>
<el-form-item prop="sex" label="性&emsp;&emsp;别">
<el-radio v-model="formData.sex" label="男" border size="small">男</el-radio>
<el-radio v-model="formData.sex" label="女" border size="small">女</el-radio>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="birthday" label="出生地点">
<el-input v-model="formData.birthPlace" placeholder="出生地点"></el-input>
</el-form-item>
<el-form-item label="婚&emsp;&emsp;否">
<el-radio-group v-model="formData.marriage" size="small">
<el-radio label="已婚" border></el-radio>
<el-radio label="未婚" border></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="education" label="学&emsp;&emsp;历">
<dict-select v-model="formData.education" style="width: 100%" placeholder="请选择学历"
code="Education"></dict-select>
</el-form-item>
<el-form-item prop="academicDegree" label="学&emsp;&emsp;位">
<dict-select v-model="formData.academicDegree" style="width: 100%" placeholder="请选择学位"
code="academicDegree"></dict-select>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="nationality" label="国&emsp;&emsp;籍">
<el-input v-model="formData.nationality" placeholder="国籍"></el-input>
</el-form-item>
<el-form-item prop="hometown" label="籍&emsp;&emsp;贯">
<el-input v-model="formData.hometown" placeholder="籍贯"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="nation" label="民&emsp;&emsp;族">
<el-select placeholder="民族" style="width: 100%" filterable v-model="formData.nation">
<el-option v-for="nation in nationOptions" :key="nation" :value="nation" :label="nation"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="political" label="政治面貌">
<el-input maxlength="100" placeholder="政治面貌" v-model="formData.political"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="jobTitle" label="职&emsp;&emsp;称">
<dict-select v-model="formData.jobTitle" style="width: 100%" placeholder="请选择职称"
code="JobTitle"></dict-select>
</el-form-item>
<el-form-item prop="wage" label="工&emsp;&emsp;资">
<el-input v-model="formData.wage" placeholder="工资"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="mobile" label="手&ensp;机&ensp;号">
<el-input maxlength="100" placeholder="手机号"
v-model="formData.mobile"></el-input>
</el-form-item>
<el-form-item prop="bank_number" label="银行账号">
<el-input maxlength="100" placeholder="银行账号"
v-model="formData.bank_number"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="userState" label="人员类型">
<dict-select v-model="formData.personType" style="width: 100%" placeholder="请选择人员类型"
code="UserType"></dict-select>
</el-form-item>
<el-form-item prop="userState" label="在职状态">
<dict-select v-model="formData.userState" style="width: 100%" placeholder="请选择在职状态"
code="UserState"></dict-select>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="idType" label="有效证件类型">
<dict-select
v-model="formData.idType"
placeholder="请选择有效证件类型"
style="width: 100%"
code="idType">
</dict-select>
</el-form-item>
<el-form-item prop="idType" label="证件有效日期">
<el-date-picker
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
v-model="formData.effectiveDate"
type="daterange"
range-separator="——"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="idcard" label="身份证号">
<el-input v-model="formData.idcard" placeholder="身份证号"></el-input>
</el-form-item>
<el-form-item prop="weChat" label="微&ensp;信&ensp;号">
<el-input v-model="formData.weChat" placeholder="微信号"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item label="兴趣爱好">
<el-input maxlength="255" placeholder="兴趣爱好" v-model="formData.hobby"></el-input>
</el-form-item>
<el-form-item prop="qqnum" label="QQ号">
<el-input maxlength="20" placeholder="QQ号" v-model="formData.qqnum"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="householdType" label="户籍类型">
<dict-select
v-model="formData.householdType"
placeholder="请选择户籍类型"
style="width: 100%"
code="householdType">
</dict-select>
</el-form-item>
<el-form-item prop="specialSkill" label="专&emsp;&emsp;长">
<el-input maxlength="100" placeholder="专长" v-model="formData.specialSkill"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="health" label="健康状况">
<dict-select
v-model="formData.health"
placeholder="请选择健康状况"
style="width: 100%"
code="health">
</dict-select>
</el-form-item>
<el-form-item prop="diseaseType" label="残疾类别">
<dict-select
v-model="formData.diseaseType"
placeholder="请选择残疾类别"
style="width: 100%"
code="diseaseType">
</dict-select>
</el-form-item>
</div>
<el-form-item label="疾病说明">
<el-input type="textarea" v-model="formData.diseaseDescription"
:autosize="{ minRows: 4}"></el-input>
</el-form-item>
<el-form-item label="照片上传">
<el-upload
:action="FILE_UPLOAD_ADDRESS"
list-type="picture-card"
:file-list="imageList"
:class="{disabled:uploadDisabled}"
:on-preview="handlePictureCardPreview"
:limit="1"
:on-remove="removeAvatarUpload"
:before-upload="beforeAvatarUpload"
:on-success="handleAvatarSuccess">
<i class="el-icon-plus"></i>
<div class="el-upload__tip" slot="tip" style="color: red">
*只能上传jpg/png文件,且不超过2MB的一寸电子照片
</div>
</el-upload>
</el-form-item>
<!-- </el-form>-->
</el-tab-pane>
<el-tab-pane label="工作信息" :name="2">
<!-- <el-form :model="formData" ref="form" :rules="formRules" label-width="140px" v-loading="loading">-->
<vi-title title="工作信息"></vi-title>
<div class="is-flex">
<el-form-item prop="isOutsiders" label="是否外来务工人员">
<el-radio-group v-model="formData.isOutsiders">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="schoolTime" label="参加工作日期">
<el-date-picker
style="width: 100%;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
v-model="formData.schoolTime"
type="date"
placeholder="选择参加工作日期">
</el-date-picker>
</el-form-item>
<el-form-item prop="position" label="录用职位">
<el-input maxlength="100" placeholder="录用职位" v-model="formData.position"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="majorCategory" label="所学专业类别">
<el-input maxlength="50" placeholder="所学专业类别" v-model="formData.majorCategory"></el-input>
</el-form-item>
<el-form-item prop="profession" label="从事专业">
<el-input v-model="formData.profession" placeholder="从事专业"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="laborContractType" label="劳动合同制用工形式">
<el-input v-model="formData.laborContractType" placeholder="劳动合同制用工形式"></el-input>
</el-form-item>
<el-form-item prop="occupationType" label="职业类别">
<el-input v-model="formData.occupationType" placeholder="职业类别"></el-input>
</el-form-item>
</div>
<el-form-item prop="notes" label="注&emsp;&emsp;释">
<el-input type="textarea" v-model="formData.notes" placeholder="注释"></el-input>
</el-form-item>
<el-form-item prop="vita" label="个人简历">
<div id="vitaEditor"></div>
</el-form-item>
<!-- </el-form>-->
</el-tab-pane>
<el-tab-pane label="会员信息" :name="3">
<!-- <el-form :model="formData" ref="form" :rules="formRules" label-width="160px" v-loading="loading">-->
<vi-title title="会员信息"></vi-title>
<div class="is-flex">
<el-form-item prop="memberJoinTime" label="入会日期">
<el-date-picker style="width: 100%" v-model="formData.memberJoinTime" format="yyyy-MM-dd"
value-format="yyyy-MM-dd" type="date" placeholder="入会日期"></el-date-picker>
</el-form-item>
<el-form-item prop="memberNumber" label="会&ensp;员&ensp;号">
<el-input v-model="formData.memberNumber" placeholder="会员号"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="awardWinning" label="工会特殊项标识">
<dict-select
v-model="formData.awardWinning"
placeholder="请选择工会特殊项标识"
style="width: 100%"
code="awardWinning">
</dict-select>
</el-form-item>
<el-form-item prop="membershipCardType" label="会员卡类型">
<el-input v-model="formData.membershipCardType" placeholder="会员卡类型"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="isLeader" label="是否工会干部">
<el-radio-group v-model="formData.isLeader">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="isPay" label="是否缴纳会费">
<el-radio-group v-model="formData.isPay">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="isPhysicaisCard" label="是否办理工会实体卡">
<el-radio-group v-model="formData.isPhysicaisCard">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="isCardActivated" label="工会实体卡是否激活">
<el-radio-group v-model="formData.isCardActivated">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="cardNum" label="工会实体卡卡号">
<el-input v-model="formData.cardNum" placeholder="工会实体卡卡号"></el-input>
</el-form-item>
<el-form-item prop="cardBankNum" label="工会实体卡银行卡号">
<el-input v-model="formData.cardBankNum" placeholder="工会实体卡银行卡卡号"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="electronicCardNumber" label="电子会员卡卡号">
<el-input v-model="formData.electronicCardNumber" placeholder="电子会员卡卡号"></el-input>
</el-form-item>
<el-form-item prop="electronicCardNumberTime" label="电子会员卡发放时间">
<el-date-picker
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
v-model="formData.electronicCardNumberTime"
type="date"
placeholder="选择日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
</div>
<!-- </el-form>-->
</el-tab-pane>
<el-tab-pane label="家庭及社会信息" :name="4">
<!-- <el-form :model="formData" ref="form" :rules="formRules" label-width="120px" v-loading="loading">-->
<vi-title title="家庭及社会信息"></vi-title>
<div class="is-flex">
<el-form-item prop="personalStatus" label="个人身份">
<el-input v-model="formData.personalStatus" placeholder="个人身份"></el-input>
</el-form-item>
<el-form-item prop="socialIdentity" label="社会身份">
<el-input v-model="formData.socialIdentity" placeholder="社会身份"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="otherIdentity" label="其他社会身份">
<el-input v-model="formData.otherIdentity" placeholder="其他社会身份"></el-input>
</el-form-item>
<el-form-item prop="employmentStatus" label="就业状况">
<el-input v-model="formData.employmentStatus" placeholder="就业状况"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="homePhone" label="住宅电话">
<el-input v-model="formData.homePhone" placeholder="住宅电话"></el-input>
</el-form-item>
<el-form-item prop="otherPhone" label="其他电话">
<el-input v-model="formData.otherPhone" placeholder="其他电话"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="homeAddress" label="家庭住址">
<el-input v-model="formData.homeAddress" placeholder="家庭住址"></el-input>
</el-form-item>
<el-form-item prop="mailingAddress" label="通信地址">
<el-input v-model="formData.mailingAddress" placeholder="通信地址"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="otherContactInformation" label="其他联系方式">
<el-input v-model="formData.otherContactInformation" placeholder="其他联系方式"></el-input>
</el-form-item>
<el-form-item prop="registeredResidence" label="户籍所在地">
<el-input v-model="formData.registeredResidence" placeholder="户籍所在地"></el-input>
</el-form-item>
</div>
<div class="is-flex">
<el-form-item prop="postalCode" label="邮政编码">
<el-input v-model="formData.postalCode" placeholder="邮政编码"></el-input>
</el-form-item>
<el-form-item prop="familyPopulation" label="家庭人口数">
<el-input v-model="formData.familyPopulation" placeholder="家庭人口数"></el-input>
</el-form-item>
</div>
<el-form-item label="家庭成员">
<span style="color: red">(已结婚填配偶信息,未结婚填父母信息)</span>
<el-button style="float: right;margin-bottom: 10px" icon="el-icon-plus" size="mini"
@click="formData.family.push({})"> 添加成员
</el-button>
<el-table
:data="formData.family"
border
size="mini"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入与本人关系" maxlength="30" v-model="scope.row.relation"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入姓名" maxlength="100" v-model="scope.row.name" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入单位" maxlength="100" v-model="scope.row.unit" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入备注" maxlength="100" v-model="scope.row.remark" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" align="center" header-align="center">
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete" circle
:disabled="formData.family.length===0"
@click="formData.family.splice(scope.$index,1)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<!-- </el-form>-->
</el-tab-pane>
</el-tabs>
</el-form>
<el-button v-if="has_bottom_btn" @click="save" :loading="submitLoading" type="primary" style="float: right">提交
</el-button>
</div>
<div v-else>
<el-form label-width="100px" v-loading="loading" label-position="left" label-suffix=":">
<el-row gutter="20">
<el-col :span="18">
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="姓&emsp;&emsp;名">
{{ formData.username }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工&emsp;&emsp;号">
{{ formData.loginname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性&emsp;&emsp;别">
{{ formData.sex }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="所在科室">
{{ formData.threeUnitName }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在单位">
{{ formData.unitname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在工会">
{{ formData.unionname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="政治面貌">
{{ formData.political }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item label="出生日期">
{{ formData.birthday }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="籍&emsp;&emsp;贯">
{{ formData.hometown }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="民&emsp;&emsp;族">
{{ formData.nation }}
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-image :src="APP_DOMAIN+FILE_STREAM_PREVIEW_ADDRESS + '?id=' +formData.avatar"
style="width: 180px;height: 180px;display: flex;justify-content: center;align-items: center;background-color: #f5f7fa">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline" style="font-size: 24px"></i>
</div>
</el-image>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="6">
<el-form-item label="兴趣爱好">
{{ formData.hobby }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="婚&emsp;&emsp;否">
{{ formData.marriage }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="学&emsp;&emsp;历">
{{ formData.education }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工&emsp;&emsp;资">
{{ formData.wage }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="6">
<el-form-item label="人事编制">
{{ formData.preparedBy }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="职&emsp;&emsp;务">
{{ formData.position }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="职&emsp;&emsp;称">
{{ formData.jobTitle }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="在职状态">
{{ formData.userState }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="6">
<el-form-item label="人员类型">
{{ formData.personType }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="手&ensp;机&ensp;号">
{{ formData.mobile }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="银行账号">
{{ formData.bank_number }}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="身份证号">
{{ formData.idcard }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="个人简历">
<div v-html="formData.vita"></div>
</el-form-item>
<el-form-item label="家庭成员">
<el-table
v-if="formData.family&&formData.family.length"
:data="formData.family"
size="mini" border :header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
let vitaEditor = null
module.exports = {
components: {
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.4'),
},
props: {
id: {type: String},
view: {type: Boolean, default: false},
edit_unit: {type: Boolean, default: false},
source: {type: String},
has_bottom_btn: {type: Boolean, default: true}
},
// model: {
// prop: 'value',
// event: 'change'
// },
data() {
return {
activeName: 1,
unionOptions: [],
unitOptions: [],
submitLoading: false,
imageList: [],
uploadDisabled: false,
loading: true,
disabled: false,
formData: {
family: [],
},
formRules: {
loginname: [{required: true, message: '必填', trigger: ['blur', 'change']}],
username: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unitid: [{required: true, message: '必填', trigger: ['blur', 'change']}],
threeUnitId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
nationOptions: nation,
threeUnits: [],
displayUnionGroup: false,
isAllowModify: false
}
},
watch: {
id() {
this.getUserInfo()
}
},
methods: {
async doOperating() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
const formData = clone(this.formData)
formData.password = 'dd3s@#2022'
formData.family = JSON.stringify(formData.family)
formData.source = this.source
if (formData.effectiveDate) {
formData.beginningDate = formData.effectiveDate[0]
formData.endDate = formData.effectiveDate[1]
}
const resp = await $.post(formData.id ? "/platform/sys/user/editDo" : "/platform/sys/user/addDo", formData)
if (resp.code === 0) {
this.$notify.success({
title: '成功',
message: resp.msg,
})
this.$emit("load")
} else {
this.$notify.warning({
title: '警告',
message: resp.msg,
})
}
}
}
)
},
async unitChange(v) {
const unit = this.unitOptions.find(x => x.id == v)
if (unit) {
this.formData.unionid = unit.unionid
this.formData.unionname = unit.unionname
} else {
this.formData.unionid = ''
this.formData.unionname = ''
}
this.$set(this.formData, 'threeUnitId', null)
this.$set(this.formData, 'unionGroupName', null)
this.threeUnits = await this.getThreeUnits(v)
},
async getThreeUnits(v) {
const threeUnits = await threeUnitsByUnionGroupOrUnitId(v, null)
return threeUnits
// debugger
// if(v){
// const threeUnit = this.threeUnits.find(v => v.id === val)
// console.log(threeUnit)
// }else{
// this.$set(this.formData, 'unionGroupName', null)
// }
// this.$set(this.formData, 'threeUnitId', null)
// this.threeUnits = await threeUnitsByUnionGroupOrUnitId(this.formData.unitId, null)
},
threeUnitChange(val) {
const threeUnit = this.threeUnits.find(v => v.id === val)
this.$set(this.formData, 'unionGroupName', threeUnit.groupname)
this.$set(this.formData, 'unionGroupId', threeUnit.uniongroupid)
},
async save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.submitLoading = true
const formData = clone(this.formData)
formData.family = JSON.stringify(formData.family)
formData.source = this.source
if (formData.effectiveDate) {
formData.beginningDate = formData.effectiveDate[0]
formData.endDate = formData.effectiveDate[1]
}
const resp = await $.post("/platform/member/common/saveUser", formData)
this.submitLoading = false
if (resp.code === 0) {
this.$notify.success({
title: '成功',
message: resp.msg,
})
this.$emit("save", resp.data)
} else {
this.$notify.warning({
title: '警告',
message: resp.msg,
})
}
}
})
},
load(data) {
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
if (data.avatar) {
this.imageList = [{
name: "_.jpg",
url: APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS + '?id=' + data.avatar,
status: "success"
}]
}
data.family = JSON.parse(data.family || '[]')
if (data.beginningDate && data.endDate) {
data.effectiveDate = [data.beginningDate, data.endDate]
}
this.formData = data
this.$nextTick(() => {
$("#vitaEditor").html("")
vitaEditor = new wangEditor("#vitaEditor")
vitaEditor.config.onchange = (html) => {
this.formData.vita = html
}
vitaEditor.create()
vitaEditor.txt.html(data.vita)
})
},
async getUserInfo() {
this.loading = true
this.disabled = false
this.imageList = []
if (!this.id) {
this.load({})
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnionUnits()
this.displayUnionGroup = await getConfigKey('SysUnionGroup') === 'true'
this.isAllowModify = await getConfigKey('MemberInfoModify') === 'true'
this.loading = false
return
}
const resp = await $.get("/platform/member/common/userInfo", {userId: this.id, source: this.source})
this.loading = false
if (resp.code === 0) {
const data = resp.data
this.unitOptions = await getUnits(data.unionid)
this.threeUnits = await this.getThreeUnits(data.unitid)
this.load(data)
} else {
this.$notify.error({
title: '错误',
message: '获取用户信息失败'
});
}
},
handlePictureCardPreview(file) {
/*showpic(file.url.replace(FILE_DOMAIN, ''))*/
let image = new Image()
image.src = file.url
let viewer = new Viewer(image)
viewer.show()
},
removeAvatarUpload(val) {
this.imageList = []
this.formData.avatar = null
},
beforeAvatarUpload(file) {
let isLt2M = file.size / 1024 / 1024 < 2;
let isJPG = file.type === 'image/jpeg';
let isPng = file.type === 'image/png';
if (!isJPG && !isPng) {
this.$message.error('上传头像图片只能是 JPG和PNG格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return (isJPG || isPng) && isLt2M;
},
handleAvatarSuccess: function (res, file) {
var self = this;
if (res.code == 0) {
const {data: {filepath}} = res
self.formData.avatar = filepath;
} else {
this.$notify.error({
title: '错误',
message: res.msg
});
}
},
},
async created() {
await this.getUserInfo()
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnionUnits()
this.displayUnionGroup = await getConfigKey('SysUnionGroup') === 'true'
this.isAllowModify = await getConfigKey('MemberInfoModify') === 'true'
}
}
</script>
<style>
.is-flex {
display: flex;
}
.is-flex .el-form-item {
width: 50%;
}
.el-picker-panel {
z-index: 9999999 !important;
}
</style>
@@ -0,0 +1,189 @@
<template>
<div style="padding-bottom: 20px;">
<van-form readonly input-align="right">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
基础信息
</div>
</div>
<van-cell-group>
<van-field readonly :value="viewData.username" label="姓名"></van-field>
<van-field readonly :value="viewData.loginname" label="工资号"></van-field>
<van-field readonly :value="viewData.unitname" label="单位"></van-field>
<van-field readonly :value="viewData.unionname" label="工会"></van-field>
</van-cell-group>
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
作品信息
</div>
</div>
<van-cell-group>
<van-field readonly name="type" :value="viewData.hdsbzpzt" label="作品主题"></van-field>
<van-field readonly name="type" :value="viewData.lname" label="活动类别"></van-field>
<van-field readonly name="type" :value="viewData.zname" label="作品类别"></van-field>
<van-field readonly :value="viewData.zpms" label="简介"
input-align="left"
style="flex-flow: column"
rows="2" maxlength="200" type="textarea" show-word-limit autosize></van-field>
<van-field label="照片" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">照&emsp;&emsp;片</div>
</template>
<template #input>
<vant-file-upload :files.sync="img2List" view :del="false"
v-if="img2List&&img2List.length>0"></vant-file-upload>
<span v-else>暂无</span>
</template>
</van-field>
<van-field label="视频" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">视&emsp;&emsp;频</div>
</template>
<template #input>
<template v-for="item in videoList" v-if="videoList.length>0">
<video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto"
width="640" height="264"
data-setup="{}" webkit-playsinline='true' playsinline='true' x-webkit-airplay='true'
x5-video-player-type='h5' x5-video-player-fullscreen='true' x5-video-ignore-metadata='true'>
<source :src="FILE_DOMAIN+item.filepath" type="video/mp4">
</video>
</template>
<div v-else style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有音频。
</div>
</template>
</van-field>
<van-field label="音频" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">音&emsp;&emsp;频</div>
</template>
<template #input>
<template v-for="item in videoList" v-if="audioList.length>0">
<audio id="amusic" preload="auto" controls style="width: 100%;outline: none;">
<source :src="FILE_DOMAIN+item.filepath"/>
</audio>
</template>
<div v-else style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有音频。
</div>
</template>
</van-field>
<van-field label="文档" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">文&emsp;&emsp;档</div>
</template>
<template #input>
<template v-for="(item,index) in docList" v-if="docList.length>0">
<div class="text-nowrap color-puple"
@click="previewFile(item.filepath,item.filename,docList,index,item.id)">
{{ item.filename }}
</div>
</template>
<div v-else style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有文档。
</div>
</template>
</van-field>
</van-cell-group>
</van-form>
<template v-if="handle">
<slot name="handle"></slot>
</template>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
id: {
type: String,
default: ''
},
},
data() {
return {
viewData: {},
videoList: [],
prevImgList: [],
img2List: [],
audioList: [],
docList: [],
imgtype: ['gif', 'jpg', 'png', 'jpeg'],
videotype: ['flv', 'swf', 'mkv', 'avi', 'rm', 'rmvb', 'wmv', 'mp4', 'mov', 'mpg', 'mpeg'],
doctype: ['doc', 'docx'],
audiotype: ['mp3', 'wma', 'flac', 'wav', 'm4a', 'amr', 'au'],
}
},
components: {
'vant-file-upload': httpVueLoader('/components/plugins/VantFileUpload.vue')
},
methods: {
async getInfo(id) {
const {data, code, msg} = await $.get("/platform/hd/wmhd/findOneById", {id})
const refs = await $.get("/mobile/cahd/list/findOne", {id})
if (refs) {
this.viewData = refs[0]
data.forEach(val => {
val.fjname = val.filename
val.fjurl = val.filepath
val.url = FILE_DOMAIN + val.filepath
let filetype = val.fjname.substring(val.fjname.lastIndexOf('.') + 1, val.fjname.length).toLowerCase();
if (this.videotype.indexOf(filetype) > -1) {
this.videoList.push(val);
} else if (this.imgtype.indexOf(filetype) > -1) {
this.prevImgList.push(FILE_DOMAIN + val.filepath)
this.img2List.push(val);
} else if (this.doctype.indexOf(filetype) > -1) {
this.docList.push(val);
} else if (this.audiotype.indexOf(filetype) > -1) {
this.audioList.push(val);
}
})
} else {
this.viewData = {}
this.$toast.fail('获取信息失败');
}
},
},
async created() {
}
}
</script>
<style>
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
</style>
@@ -0,0 +1,142 @@
<template>
<div style="padding-bottom: 20px;">
<van-form readonly input-align="right">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
基础信息
</div>
</div>
<van-cell-group>
<van-field readonly :value="viewData.username" label="姓名"></van-field>
<van-field readonly :value="viewData.sex" label="性别"></van-field>
<van-field readonly :value="viewData.birthday" label="出生年月"></van-field>
<van-field readonly :value="viewData.birthPlace" label="出生地"></van-field>
<van-field readonly :value="viewData.education" label="文化程度"></van-field>
<van-field readonly :value="viewData.hobby" label="爱好"></van-field>
<van-field readonly :value="viewData.unitName" label="工作部门"></van-field>
<van-field readonly :value="viewData.position" label="职务"></van-field>
<van-field readonly :value="viewData.mobile" label="电话"></van-field>
<van-field readonly :value="viewData.email" label="电子邮箱"></van-field>
<van-field readonly :value="viewData.homeAddress" label="家庭住址"></van-field>
<van-field readonly :value="viewData.QQNumber" label="QQ"></van-field>
<van-field readonly :value="viewData.bodyHeight" label="身高"></van-field>
<van-field readonly :value="viewData.bodyWeight" label="体重"></van-field>
<van-field readonly :value="viewData.health" label="身体状况"></van-field>
<van-field readonly :value="viewData.sport" label="经常从事的运动"></van-field>
<van-field readonly :value="viewData.medicalHistory ? '是' : '否'" label="是否有过特殊病史"></van-field>
<van-field readonly :value="viewData.joinActivity ? '是' : '否'" label="是否愿意参加本协会的活动"></van-field>
<van-field readonly :value="viewData.otherThing" label="特别需要说明的问题(身体或心理)"></van-field>
<!-- <van-field readonly :value="viewData.remark" label="备注"></van-field>-->
<!-- <van-field readonly :value="viewData.loginname" label="工号"></van-field>-->
<!-- <van-field readonly :value="viewData.unitName" label="工作部门"></van-field>-->
<!-- <van-field readonly :value="viewData.mobile" label="电话"></van-field>-->
<!-- <van-field readonly :value="viewData.QQNumber" label="QQ"></van-field>-->
<!-- <van-field readonly :value="viewData.hobby" label="爱好"></van-field>-->
<!-- <van-field readonly :value="viewData.sickness" label="是否患有运动限制类疾病"></van-field>-->
<!-- <van-field readonly :value="viewData.familyUserName" label="紧急联系人姓名"></van-field>-->
<!-- <van-field readonly :value="viewData.familyRelation" label="紧急联系人关系"></van-field>-->
<!-- <van-field readonly :value="viewData.familyMobile" label="紧急联系人电话"></van-field>-->
<!-- <van-field readonly :value="viewData.project" label="擅长项目"></van-field>-->
<!-- <van-field readonly :value="viewData.selfSkill" label="个人技能水平"></van-field>-->
<!-- <van-field readonly :value="viewData.playRole" label="期望在协会中扮演的角色"></van-field>-->
<!-- <van-field readonly :value="viewData.provideServices" label="是否愿意为协会提供志愿服务"></van-field>-->
<!-- <van-field readonly :value="viewData.joinManageWork" label="是否愿意参与协会的管理工作"></van-field>-->
<!-- <van-field readonly :value="viewData.giveHelp" label="是否愿意为协会的活动提供赞助或资源支持"></van-field>-->
</van-cell-group>
</van-form>
<!-- <template v-if="viewData.upa">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item&#45;&#45;select">
院级工会审核信息
</div>
</div>
<van-cell-group class="mt10">
<div style="padding-left: 16px">
<van-field label="审核人员" :value="viewData.upa.username" left-icon="contact" readonly></van-field>
<van-field label="审核时间" :value="viewData.upa.auditTime" left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o"
:value="viewData.upa.auditOpinion ? viewData.upa.auditOpinion : '暂无'"
readonly></van-field>
<van-field name="sign" label="签字">
<template #input>
<van-image width="200" height="100" :src="viewData.upa.auditSign"
v-if="viewData.upa.auditSign"></van-image>
<span v-else>暂无</span>
</template>
</van-field>
</div>
</van-cell-group>
</template>-->
<template v-if="handle">
<slot name="handle"></slot>
</template>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
id: {
type: String,
default: ''
},
},
data() {
return {
viewData: {},
}
},
components: {
},
methods: {
async getInfo(id) {
const {data, code, msg} = await $.get("/platform/sys/club/sq/findOne", {id})
if (data) {
this.viewData = data
} else {
this.viewData = {}
this.$toast.fail('获取信息失败');
}
},
},
async created() {
}
}
</script>
<style>
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
.van-field__label {
width: 60% !important;
}
.van-cell {
padding: 7px 16px !important;
}
</style>
@@ -0,0 +1,50 @@
<template>
<div class="card">
<div class="card-header" v-if="$slots.header">
<slot name="header"></slot>
</div>
<div class="card-body">
<slot></slot>
</div>
<div class="card-footer" v-if="$slots.footer">
<slot name="footer"></slot>
</div>
</div>
</template>
<script>
module.exports = {
name: "MCard"
}
</script>
<style scoped>
.card {
border: none;
border-radius: .5rem;
}
.card-header {
border-bottom:1px dashed rgba(0,0,0,.125);
font-size: 1.15rem;
}
.card-header:first-child {
border-radius: calc(.5rem - 1px) calc(.5rem - 1px) 0 0
}
.card-body>.van-cell{
padding: 5px 0;
}
.card-body{
padding-top: 0;
}
.card-header, .card-footer {
background-color: #FFFFFF;
}
</style>
@@ -0,0 +1,89 @@
<template>
<div class="loader"></div>
</template>
<script>
module.exports = {
name: "MLoading"
}
</script>
<style scoped>
.loader {
z-index: 10000;
position: relative;
width: 2.5em;
height: 2.5em;
transform: rotate(165deg);
}
.loader:before, .loader:after {
content: "";
position: absolute;
top: 50%;
left: 50%;
display: block;
width: 0.5em;
height: 0.5em;
border-radius: 0.25em;
transform: translate(-50%, -50%);
}
.loader:before {
animation: before 2s infinite;
}
.loader:after {
animation: after 2s infinite;
}
@keyframes before {
0% {
width: 0.5em;
box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75);
}
35% {
width: 2.5em;
box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75);
}
70% {
width: 0.5em;
box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75);
}
100% {
box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75);
}
}
@keyframes after {
0% {
height: 0.5em;
box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75);
}
35% {
height: 2.5em;
box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75);
}
70% {
height: 0.5em;
box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75);
}
100% {
box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75);
}
}
/**
* Attempt to center the whole thing!
*/
html,
body {
height: 100%;
}
.loader {
position: absolute;
top: calc(50% - 1.25em);
left: calc(50% - 1.25em);
}
</style>
@@ -0,0 +1,140 @@
<template>
<figure>
<div class="dot white"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</figure>
</template>
<script>
module.exports = {
name: "MTableLoading"
}
</script>
<style scoped>
body {
background: #222;
}
figure {
position: absolute;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 6.250em;
height: 6.250em;
animation: rotate 2.4s linear infinite;
}
.white {
top: 0;
bottom: 0;
left: 0;
right: 0;
background: white;
animation: flash 2.4s linear infinite;
opacity: 0;
}
.dot {
position: absolute;
margin: auto;
width: 2.4em;
height: 2.4em;
border-radius: 100%;
transition: all 1s ease;
}
.dot:nth-child(2) {
top: 0;
bottom: 0;
left: 0;
background: #FF4444;
animation: dotsY 2.4s linear infinite;
}
.dot:nth-child(3) {
left: 0;
right: 0;
top: 0;
background: #FFBB33;
animation: dotsX 2.4s linear infinite;
}
.dot:nth-child(4) {
top: 0;
bottom: 0;
right: 0;
background: #99CC00;
animation: dotsY 2.4s linear infinite;
}
.dot:nth-child(5) {
left: 0;
right: 0;
bottom: 0;
background: #33B5E5;
animation: dotsX 2.4s linear infinite;
}
@keyframes rotate {
0% {
transform: rotate(0);
}
10% {
width: 6.250em;
height: 6.250em;
}
66% {
width: 2.4em;
height: 2.4em;
}
100% {
transform: rotate(360deg);
width: 6.250em;
height: 6.250em;
}
}
@keyframes dotsY {
66% {
opacity: .1;
width: 2.4em;
}
77% {
opacity: 1;
width: 0;
}
}
@keyframes dotsX {
66% {
opacity: .1;
height: 2.4em;
}
77% {
opacity: 1;
height: 0;
}
}
@keyframes flash {
33% {
opacity: 0;
border-radius: 0%;
}
55% {
opacity: .6;
border-radius: 100%;
}
66% {
opacity: 0;
}
}
</style>
@@ -0,0 +1,186 @@
<style>
.field .van-field__error-message {
display: none;
}
</style>
<template>
<div>
<van-form @submit="onSubmit" ref="form">
<template v-for="column in dynamicData">
<!-- 文本、数值、时间 -->
<template v-if="['VARCHAR','TEXT','INT','DATE','DATETIME'].includes(column.columnType)">
<van-field
class="field"
v-model="column.columnValue"
:clickable="['SELECT'].includes(column.columnFormType)"
:label="column.columnName"
:name="column.columnCode"
:type="['INT'].includes(column.columnType) ? 'digit' : ''"
:placeholder="(['SELECT'].includes(column.columnFormType) ? '请选择' : '请填写') + column.columnName"
:readonly="['SELECT'].includes(column.columnFormType)"
:rules="[{ required: column.isRequired, message: (['SELECT'].includes(column.columnFormType) ? '请选择' : '请填写') + column.columnName }]"
:required="column.isRequired"
@click="selectFieldClick(column)"
></van-field>
<van-popup v-if="['SELECT'].includes(column.columnFormType)"
v-model="pickerStates[column.columnCode + 'Picker']"
position="bottom">
<template v-if="['DATETIME','DATE'].includes(column.columnType)">
<van-datetime-picker
:title="column.columnName"
:type="column.columnType.toLocaleLowerCase()"
:min-date="new Date(2008, 0, 1)"
:max-date="new Date(2017, 5, 30)"
show-toolbar
@cancel="pickerStates[column.columnCode + 'Picker'] = false; column.columnValue = ''"
@confirm="(time)=>{dateTimePickerConfirm(time,column)}"
/>
</template>
<template v-else>
<van-picker
:columns="column.selectValues"
:title="column.columnName"
show-toolbar
@cancel="pickerStates[column.columnCode + 'Picker'] = false; column.columnValue = ''"
@confirm="(value)=>{ordinaryPickerConfirm(value,column)}"
/>
</template>
</van-popup>
</template>
<!-- 单选框 -->
<template v-else-if="['BOOLEAN'].includes(column.columnType)">
</template>
<!-- 文件 -->
<template v-else-if="['JSON'].includes(column.columnType)">
<van-field :required="column.isRequired" :label="column.columnName"
:rules="[{ required: column.isRequired, message: '请上传' + column.columnName }]">
<template #input>
<!-- <van-uploader v-model="fileList" :after-read="(file)=>{fileAfterRead(file,column)}"
:max-count="column.fileNumber"/>-->
<vant_file_upload :files.sync="column.columnValue" :max="column.fileNumber"
:type="column.fileType"></vant_file_upload>
</template>
</van-field>
</template>
</template>
</van-form>
</div>
</template>
<!-- 请在van-form中引用 -->
<script>
module.exports = {
name: "TrainDynamicForm",
components: {
'vant_file_upload': httpVueLoader('/components/plugins/VantFileUpload.vue')
},
props: {
dynamicData: []
},
model: {
prop: 'dynamicData',
event: 'updateDynamicData'
},
watch: {
dynamicData: {
handler: function (newValue, oldValue) {
this.$emit('updateDynamicData', newValue)
},
deep: true
}
},
data() {
return {
//所有的picker状态
pickerStates: {},
fileList: []
}
},
methods: {
validForm() {
try {
this.$refs.form.validate().then(() => {
return true
}).catch(() => {
return false
})
} catch (e) {
return false
}
/*return new Promise(resolve => {
this.$refs.form.validate().then(() => {
resolve(true)
}).catch(() => {
resolve(false)
})
})*/
},
onSubmit() {
},
selectFieldClick(column) {
console.log(column)
this.$set(this.pickerStates, column.columnCode + 'Picker', true)
if (!['DATE', 'DATETIME'].includes(column.columnType)) {
//说明是普通的下拉框
// column.selectValues = ['1', '2', '3']
}
},
/**
* 时间picker确认
* @param time
* @param column
*/
dateTimePickerConfirm(time, column) {
if (column.columnType === 'DATE') {
column.columnValue = moment(time).format('YYYY-MM-DD')
} else if (column.columnType === 'DATETIME') {
column.columnValue = moment(time).format('YYYY-MM-DD HH:mm:ss')
} else {
//预留别的类型
column.columnValue = moment(time).format('YYYY-MM-DD HH:mm:ss')
}
this.pickerStates[column.columnCode + 'Picker'] = false
},
/**
* 普通picker确认
* @param value
* @param column
*/
ordinaryPickerConfirm(value, column) {
column.columnValue = value
this.pickerStates[column.columnCode + 'Picker'] = false
},
/**
* 文件读取
*/
fileAfterRead(file, column) {
console.log(file)
console.log(column)
}
},
created() {
// console.log(this.dynamicData)
// this.dynamicData.forEach(v => {
// if (v.columnFormType === 'SELECT') {
// v.columnPickerName = v.columnCode+'Picker'
// }
// })
// console.log(this.dynamicData)
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,214 @@
<template>
<div style="padding-bottom: 20px;">
<van-form readonly input-align="right">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
申请信息
</div>
</div>
<van-cell-group>
<van-field :value="viewData.loginname" label="工号" left-icon="contact"></van-field>
<van-field label="姓名" :value="viewData.username" left-icon="contact"></van-field>
<van-field label="性别" :value="viewData.sex" left-icon="ellipsis"></van-field>
<van-field label="民族" left-icon="bar-chart-o" :value="viewData.nation"></van-field>
<van-field label="学历" left-icon="coupon-o" :value="viewData.education"></van-field>
<van-field label="学位" left-icon="comment-o" :value="viewData.academicDegree"></van-field>
<van-field label="政治面貌" left-icon="label-o" :value="viewData.political"></van-field>
<van-field :value="viewData.personType" label="人员类型" left-icon="label-o"></van-field>
<van-field label="身份证" left-icon="idcard" :value="viewData.idcard"></van-field>
<van-field label="联系电话" left-icon="phone-o" :value="viewData.mobile"></van-field>
<van-field label="户口所在地" left-icon="wap-home-o"
:value="viewData.registeredResidence"></van-field>
<van-field label="现居住地" left-icon="home-o" :value="viewData.homeAddress"></van-field>
<van-field label="工作单位" left-icon="cluster-o" :value="viewData.unitname"></van-field>
<van-field label="职务" left-icon="debit-pay" :value="viewData.position"></van-field>
</van-cell-group>
</van-form>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div style="display: flex">
<div class="van-field__left-icon">
<i class="van-icon van-icon-notes-o"></i>
</div>
<div class="van-cell__title van-field__label">
<span>个人工作简历</span>
</div>
</div>
<van-divider></van-divider>
<van-field readonly>
<template #input>
<div v-html="viewData.position"></div>
</template>
</van-field>
</div>
</van-cell-group>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div style="display: flex">
<div class="van-field__left-icon">
<i class="van-icon van-icon-award-o"></i>
</div>
<div class="van-cell__title van-field__label">
<span>特长</span>
</div>
</div>
<van-divider></van-divider>
<van-field readonly>
<template #input>
<div v-html="viewData.specialSkill"></div>
</template>
</van-field>
</div>
</van-cell-group>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div class="van-cell__title van-field__label"
style="display: flex;justify-content: space-between">
<div style="display: flex;">
<div class="van-field__left-icon">
<i class="van-icon van-icon-friends-o"></i>
</div>
<div class="van-cell__title van-field__label" style="width: auto">
<span>家庭主要成员及联系方式</span>
</div>
</div>
</div>
<van-divider></van-divider>
<div v-if="family && family.length>0">
<div v-for="(o,i) in family" class="mt5">
<div style="font-weight: 700;display: flex;justify-content: space-between">
<span>成员{{ toChinesNum(i + 1) }}</span>
</div>
<van-form readonly input-align="right">
<van-field label="关系" :value="o.relation" left-icon="exchange"></van-field>
<van-field label="姓名" :value="o.name" left-icon="user-o"></van-field>
<van-field label="联系方式" :value="o.mobile" left-icon="phone-o"></van-field>
</van-form>
</div>
</div>
<div v-else style="height: 100px">
</div>
</div>
</van-cell-group>
<template v-if="unionAudit">
<div class="van-cell-group__title mt20">
<div class="van-sidebar-item van-sidebar-item--select">
分工会审核信息
</div>
</div>
<van-cell-group>
<van-field label="审&ensp;核&ensp;人" :value="unionAudit.username" left-icon="contact"
readonly></van-field>
<van-field label="审核时间" :value="moment(unionAudit.auditTime).format('YYYY-MM-DD')"
left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o" :value="unionAudit.auditOpinion"
readonly></van-field>
</van-cell-group>
</template>
<template v-if="schoolAudit">
<div class="van-cell-group__title mt20">
<div class="van-sidebar-item van-sidebar-item--select">
校工会审核信息
</div>
</div>
<van-cell-group>
<van-field label="审&ensp;核&ensp;人" :value="schoolAudit.username" left-icon="contact"
readonly></van-field>
<van-field label="审核时间" :value="moment(schoolAudit.auditTime).format('YYYY-MM-DD')"
left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o" :value="schoolAudit.auditOpinion"
readonly></van-field>
</van-cell-group>
</template>
<template v-if="handle">
<slot name="handle"></slot>
</template>
</div>
</template>
<script>
module.exports = {
data() {
return {
info: {},
viewData: {},
unionAudit: {},
schoolAudit: {},
family: []
}
},
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
user_id: String,
record_id: String
},
methods: {
async getAuditInfo(id) {
const {data} = await $.get('/platform/member/common/findChangeApplyInfo', {id: id})
if (data !== null) {
const {unionAudit, schoolAudit} = data
this.info = data
this.unionAudit = unionAudit
this.schoolAudit = schoolAudit
} else {
this.unionAudit = null
this.schoolAudit = null
}
},
async getUserInfo(id) {
const {data} = await $.get('/platform/member/common/userInfo', {userId: id})
this.viewData = data
this.family = JSON.parse(data.family)
}
}
}
</script>
<style>
.card_title {
margin: 5px 0 5px 16px;
}
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
</style>
@@ -0,0 +1,208 @@
<template>
<div style="padding-bottom: 20px;">
<van-form readonly input-align="right">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
申请信息
</div>
</div>
<van-cell-group>
<van-field :value="viewData.loginname" label="工号" left-icon="contact"></van-field>
<van-field label="姓名" :value="viewData.username" left-icon="contact"></van-field>
<van-field label="性别" :value="viewData.sex" left-icon="ellipsis"></van-field>
<van-field label="民族" left-icon="bar-chart-o" :value="viewData.nation"></van-field>
<van-field label="学历" left-icon="coupon-o" :value="viewData.education"></van-field>
<van-field label="学位" left-icon="comment-o" :value="viewData.academicDegree"></van-field>
<van-field label="政治面貌" left-icon="label-o" :value="viewData.political"></van-field>
<van-field :value="viewData.personType" label="人员类型" left-icon="label-o"></van-field>
<van-field label="身份证" left-icon="idcard" :value="viewData.idcard"></van-field>
<van-field label="联系电话" left-icon="phone-o" :value="viewData.mobile"></van-field>
<van-field label="户口所在地" left-icon="wap-home-o" :value="viewData.registeredResidence"></van-field>
<van-field label="现居住地" left-icon="home-o" :value="viewData.homeAddress"></van-field>
<van-field label="工作单位" left-icon="cluster-o" :value="viewData.unitname"></van-field>
<van-field label="职务" left-icon="debit-pay" :value="viewData.position"></van-field>
</van-cell-group>
</van-form>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div style="display: flex">
<div class="van-field__left-icon">
<i class="van-icon van-icon-notes-o"></i>
</div>
<div class="van-cell__title van-field__label">
<span>个人工作简历</span>
</div>
</div>
<van-divider></van-divider>
<van-field readonly>
<template #input>
<div v-html="viewData.position"></div>
</template>
</van-field>
</div>
</van-cell-group>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div style="display: flex">
<div class="van-field__left-icon">
<i class="van-icon van-icon-award-o"></i>
</div>
<div class="van-cell__title van-field__label">
<span>特长</span>
</div>
</div>
<van-divider></van-divider>
<van-field readonly>
<template #input>
<div v-html="viewData.specialSkill"></div>
</template>
</van-field>
</div>
</van-cell-group>
<van-cell-group class="mt10 up_down">
<div class="van-cell" style="flex-flow: column">
<div class="van-cell__title van-field__label" style="display: flex;justify-content: space-between">
<div style="display: flex;">
<div class="van-field__left-icon">
<i class="van-icon van-icon-friends-o"></i>
</div>
<div class="van-cell__title van-field__label" style="width: auto">
<span>家庭主要成员及联系方式</span>
</div>
</div>
</div>
<van-divider></van-divider>
<div v-if="family && family.length>0">
<div v-for="(o,i) in family" class="mt5">
<div style="font-weight: 700;display: flex;justify-content: space-between">
<span>成员{{ toChinesNum(i + 1) }}</span>
</div>
<van-form readonly input-align="right">
<van-field label="关系" :value="o.relation" left-icon="exchange"></van-field>
<van-field label="姓名" :value="o.name" left-icon="user-o"></van-field>
<van-field label="联系方式" :value="o.mobile" left-icon="phone-o"></van-field>
</van-form>
</div>
</div>
<div v-else style="height: 100px">
</div>
</div>
</van-cell-group>
<template v-if="unionAudit!=null">
<div class="van-cell-group__title mt20">
<div class="van-sidebar-item van-sidebar-item--select">
院级工会审核信息
</div>
</div>
<van-cell-group>
<van-field label="审&ensp;核&ensp;人" :value="unionAudit.username" left-icon="contact" readonly></van-field>
<van-field label="审核时间" :value="moment(unionAudit.auditTime).format('YYYY-MM-DD')" left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o" :value="unionAudit.auditOpinion" readonly></van-field>
</van-cell-group>
</template>
<template v-if="schoolAudit!=null">
<div class="van-cell-group__title mt20">
<div class="van-sidebar-item van-sidebar-item--select">
校工会审核信息
</div>
</div>
<van-cell-group>
<van-field label="审&ensp;核&ensp;人" :value="schoolAudit.username" left-icon="contact" readonly></van-field>
<van-field label="审核时间" :value="moment(schoolAudit.auditTime).format('YYYY-MM-DD')" left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o" :value="schoolAudit.auditOpinion" readonly></van-field>
</van-cell-group>
</template>
<template v-if="handle">
<slot name="handle"></slot>
</template>
</div>
</template>
<script>
module.exports = {
data() {
return {
viewData: {},
unionAudit: {},
schoolAudit: {},
family: []
}
},
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
user_id: String,
record_id: String
},
methods: {
// getDetailInfo(user_id, record_id) {
// this.getUserInfo(user_id)
// this.getAuditInfo(record_id)
// },
async getAuditInfo(id) {
const {data} = await $.get('/platform/member/common/findApplyInfo', {id: id})
if (data !== null) {
const {unionAudit, schoolAudit} = data
this.unionAudit = unionAudit
this.schoolAudit = schoolAudit
} else {
this.unionAudit = null
this.schoolAudit = null
}
},
async getUserInfo(id) {
const {data} = await $.get('/platform/member/common/userInfo', {userId: id})
this.viewData = data
this.family = JSON.parse(data.family)
}
}
}
</script>
<style>
.card_title {
margin: 5px 0 5px 16px;
}
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
</style>
@@ -0,0 +1,247 @@
<template>
<div style="padding-bottom: 20px;">
<van-form readonly input-align="right">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
基础信息
</div>
</div>
<van-cell-group>
<van-field readonly :value="viewData.username" label="姓名"></van-field>
<van-field readonly :value="viewData.loginname" label="工资号"></van-field>
<van-field readonly :value="viewData.dwname" label="单位"></van-field>
<van-field readonly :value="viewData.ghname" label="工会"></van-field>
</van-cell-group>
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
作品信息
</div>
</div>
<van-cell-group>
<van-field readonly name="type" :value="viewData.hdname" label="作品主题"></van-field>
<van-field readonly name="type" :value="viewData.hdlbname" label="活动类别"></van-field>
<van-field readonly name="type" :value="viewData.step_count" label="健步走步数"
v-if="viewData.step_count"></van-field>
<van-field readonly name="type" :value="viewData.zname" label="作品类别" v-if="viewData.zname"></van-field>
<van-field readonly :value="viewData.hdsbzpms" label="简介"
input-align="left"
style="flex-flow: column"
rows="2" maxlength="200" type="textarea" show-word-limit autosize></van-field>
<van-field label="照片" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">照&emsp;&emsp;片</div>
</template>
<template #input>
<vant-file-upload :files.sync="img2List" view :del="false"
v-if="img2List&&img2List.length>0"></vant-file-upload>
<div v-if="img2List.length===0" style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有照片。
</div>
</template>
</van-field>
<van-field label="视频" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">视&emsp;&emsp;频</div>
</template>
<template #input>
<div v-if="videoList.length>0">
<div v-for="item in videoList" class="mt10">
<video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto"
width="640" height="264"
data-setup="{}" webkit-playsinline='true' playsinline='true' x-webkit-airplay='true'
x5-video-player-type='h5' x5-video-player-fullscreen='true' x5-video-ignore-metadata='true'>
<source :src="item.url" type="video/mp4">
</video>
</div>
</div>
<div v-if="videoList.length===0" style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有视频。
</div>
</template>
</van-field>
<van-field label="音频" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">音&emsp;&emsp;频</div>
</template>
<template #input>
<div v-if="audioList&&audioList.length>0">
<div v-for="audio in audioList" class="mt10">
<audio id="amusic" preload="auto" controls>
<source :src="FILE_DOMAIN+audio.url"/>
</audio>
</div>
</div>
<div style="text-align: center;color: #c2bbbb;font-size: 10px;" v-if="audioList.length===0">
没有音频。
</div>
</template>
</van-field>
<van-field label="文档" style="flex-flow: column" input-align="left">
<template #label>
<div class="mb10">文&emsp;&emsp;档</div>
</template>
<template #input>
<div v-for="(item,index) in docList" v-if="docList&&docList.length>0">
<div class="text-nowrap color-puple"
@click="previewFile(item.filepath,item.filename,docList,index,item.id)">
{{ item.filename }}
</div>
</div>
<div v-if="docList.length===0" style="text-align: center;color: #c2bbbb;font-size: 10px;">
没有文档。
</div>
</template>
</van-field>
</van-cell-group>
<template v-if="viewData.union">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
分工会审核信息
</div>
</div>
<van-cell-group>
<van-field readonly name="type" :value="viewData.union.username" label="审核人"></van-field>
<van-field label="审核时间" :value="viewData.union.auditTime" left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o"
:value="viewData.union.auditOpinion ? viewData.union.auditOpinion : '暂无'"
readonly></van-field>
<van-field name="sign" label="签字">
<template #input>
<van-image width="200" height="100" :src="viewData.union.auditSign"
v-if="viewData.union.auditSign"></van-image>
<span v-else>暂无</span>
</template>
</van-field>
</van-cell-group>
</template>
<template v-if="viewData.school">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
校工会审核信息
</div>
</div>
<van-cell-group>
<van-field readonly name="type" :value="viewData.school.username" label="审核人"></van-field>
<van-field label="审核时间" :value="viewData.school.auditTime" left-icon="clock-o"
readonly></van-field>
<van-field label="审核意见" left-icon="chat-o"
:value="viewData.school.auditOpinion ? viewData.school.auditOpinion : '暂无'"
readonly></van-field>
<van-field name="sign" label="签字">
<template #input>
<van-image width="200" height="100" :src="viewData.school.auditSign"
v-if="viewData.school.auditSign"></van-image>
<span v-else>暂无</span>
</template>
</van-field>
</van-cell-group>
</template>
</van-form>
<template v-if="handle">
<slot name="handle"></slot>
</template>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
id: {
type: String,
default: ''
},
},
data() {
return {
viewData: {},
videoList: [],
prevImgList: [],
img2List: [],
audioList: [],
docList: [],
imgtype: ['gif', 'jpg', 'png', 'jpeg'],
videotype: ['flv', 'swf', 'mkv', 'avi', 'rm', 'rmvb', 'wmv', 'mp4', 'mov', 'mpg', 'mpeg'],
doctype: ['doc', 'docx'],
audiotype: ['mp3', 'wma', 'flac', 'wav', 'm4a', 'amr', 'au'],
}
},
components: {
'vant-file-upload': httpVueLoader('/components/plugins/VantFileUpload.vue')
},
methods: {
async getInfo(id) {
const {data, code, msg} = await $.get("/platform/hd/wmhd/findOneById", {id})
const refs = await $.get("/platform/hd/wmhd/findxxById", {id})
if (refs) {
this.viewData = refs.data
console.log(refs)
data.forEach(val => {
val.fjname = val.filename
val.fjurl = val.filepath
val.id = val.filepath
val.url = FILE_DOMAIN + '/fileStreamPreview?id=' + val.filepath
let filetype = val.fjname.substring(val.fjname.lastIndexOf('.') + 1, val.fjname.length).toLowerCase();
if (this.videotype.indexOf(filetype) > -1) {
this.videoList.push(val);
} else if (this.imgtype.indexOf(filetype) > -1) {
this.prevImgList.push(val.url)
this.img2List.push(val);
} else if (this.doctype.indexOf(filetype) > -1) {
this.docList.push(val);
} else if (this.audiotype.indexOf(filetype) > -1) {
this.audioList.push(val);
}
})
} else {
this.viewData = {}
this.$toast.fail('获取信息失败');
}
},
},
async created() {
}
}
</script>
<style>
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
</style>
@@ -0,0 +1,483 @@
<template>
<div>
<el-form ref="addform" :model="formData" label-width="120px">
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="活动名称" prop="title">
<el-input v-model="formData.title" :disabled="title_disabled" clearable placeholder="请输入活动名称"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <vi-title title="模式一"></vi-title>-->
<div style="letter-spacing: 1px;color: rgb(24, 103, 176);margin-left: 26px; font-weight: bolder">模式一</div>
<el-row>
<el-col :span="5">
<el-form-item label="发送对象" prop="type">
<el-radio v-model="formData.type" :disabled="hold" border label="system"
@change="ChangeType">系统角色
</el-radio>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属模块" prop="module">
<el-select v-model="formData.module" :disabled="hold" style="width: 100%" @change="getRoleListByMenuId">
<el-option
v-for="item in menuOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item
v-if="formData.module=='aca4d14498c145ceb5b24ed70776aae2'||formData.module=='733d7266652740a3aeac9da97ab5eeca'"
label="所属教代会"
prop="teacherMeetingId">
<el-select v-model="formData.teacherMeetingId" :disabled="hold" clearable
filterable
placeholder="所属教代会">
<el-option v-for="item in meetingOptions" :key="item.id"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发送角色" prop="roleIds">
<el-select v-model="formData.roleIds" :disabled="hold" clearable filterable multiple style="width: 100%"
@change="changeRole">
<el-option v-for="item in roleList" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <vi-title title="模式二"></vi-title>-->
<div style="letter-spacing: 1px;color: rgb(24, 103, 176);margin-left: 26px; font-weight: bolder">模式二</div>
<el-row>
<el-col :span="12">
<el-form-item label="发送对象" prop="activityGroupId">
<el-select v-model="formData.activityGroupId" :disabled="hold" clearable
placeholder="请在活动基础管理中设置人员范围" style="width: 100%" @change="getActivityUserData">
<el-option v-for="item in activityGroupList"
:label="item.groupName"
:value="item.groupId"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <vi-title title="模式三"></vi-title>-->
<div style="letter-spacing: 1px;color: rgb(24, 103, 176);margin-left: 26px; font-weight: bolder">模式三</div>
<el-row>
<el-col :span="12">
<el-form-item label="发送对象" prop="type">
<el-radio v-model="formData.type" :disabled="hold" border label="user" @change="ChangeType">
自定义人员
</el-radio>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<div v-if="formData.type=='system'" class="btn-group tool-button mt5">
<el-input v-model="pageForm1.searchKeyword" clearable placeholder="请输入内容"
style="width: 100%"
@keyup.enter.native="doSearch">
<el-select slot="prepend" v-model="pageForm1.searchName" placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div v-if="formData.type=='system'" class="btn-group tool-button mt5">
<el-button icon="el-icon-search" type="primary" @click="changeRole">搜索</el-button>
</div>
<div v-if="!hold" class="pull-right offscreen-right mt5">
<el-button v-if="formData.type=='user'" icon="el-icon-search" @click="openSelect">选择用户
</el-button>
<el-button icon="el-icon-delete" type="danger" @click="doDeleteUser">清空用户</el-button>
</div>
<el-table
:data="formData.users"
:default-sort="{prop: 'opAt', order: 'descending'}"
header-align="center"
max-height="400px"
style="width: 100%;margin-top: 10px;margin-bottom: 10px;overflow-y: auto;"
@selection-change="(val)=>{selections = val.map(v=>v.loginname)}">
<el-table-column label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (pageForm1.pageNumber - 1) * pageForm1.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column label="用户名" prop="loginName"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="手机" prop="mobile"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
<el-table-column label="院级工会" prop="unionName"></el-table-column>
<el-table-column v-if="formData.type=='user'&&!hold" align="center" fixed="right" header-align="center"
label="操作">
<template scope="{$index,row}">
<el-button size="mini" type="primary" @click="doDelete($index,row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row v-if="formData.type!='user'" class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
:current-page="pageForm1.pageNumber"
:page-size="pageForm1.pageSize"
:page-sizes="[5,10, 20, 30, 50]"
:total="pageForm1.totalCount"
layout="total, sizes, prev, pager, next"
@size-change=" pageSizeChange1 "
@current-change="pageNumberChange1">
</el-pagination>
</el-row>
</el-form-item>
<vi-title title="消息发送方式"></vi-title>
<el-form-item label="发送方式" prop="sendTypes">
<el-checkbox-group v-model="formData.sendTypes" size="medium">
<el-checkbox :disabled="hold" border label="msg">短信发送</el-checkbox>
<!-- <el-checkbox :disabled="hold" border label="WeChat">微信发送</el-checkbox>-->
</el-checkbox-group>
</el-form-item>
<el-form-item label="发送内容模板" prop="contentId">
<el-select v-model="formData.contentId" :disabled="hold" clearable
placeholder="请选择内容模板" style="width: 100%">
<el-option v-for="item in contentList"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="发送内容" prop="content">
<el-input
:disabled="hold"
v-model="formData.content"
:rows="6"
placeholder="请输入内容"
type="textarea">
</el-input>
</el-form-item>-->
</el-form>
<el-dialog
:append-to-body="true" :visible.sync="selectDialogVisible"
title="选择用户"
:close-on-click-modal="false" @closed="diaClosed"
width="65%">
<div class="btn-group tool-button mt5">
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入内容"
style="width: 100%"
@keyup.enter.native="doSearch">
<el-select slot="prepend" v-model="pageForm.searchName" placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button icon="el-icon-search" type="primary" @click="doSearch">搜索</el-button>
</div>
<el-table
:data="tableData"
:size="tableSize"
ref="table"
row-key="id"
:default-sort="{prop: 'opAt', order: 'descending'}"
header-align="center"
size="small"
style="width: 100%;margin-top: 10px;margin-bottom: 10px;overflow-y: auto"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="35" :reserve-selection="true"></el-table-column>
<el-table-column 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="用户名" prop="loginName"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="手机" prop="mobile"></el-table-column>
<el-table-column label="所属单位" prop="unitName"></el-table-column>
<el-table-column label="院级工会" prop="unionName"></el-table-column>
</el-table>
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:page-sizes="[5,10, 20, 30, 50]"
:total="pageForm.totalCount"
layout="total, sizes, prev, pager, next"
@size-change="pageSizeChange"
@current-change="pageNumberChange">
</el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="selectDialogVisible = false"> 取 消 </el-button>
<el-button type="primary" @click="addUser"> 确 定 </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
model: {
prop: 'formData',
event: 'change'
},
props: {
title_disabled: {
type: Boolean,
default: false,
},
notify_id: {
type: String,
default: "",
},
hold: {
type: Boolean,
default: false,
},
formData: {
type: Object,
default: () => {
}
}
},
data() {
return {
contentList: [
// {id: "3cddb3bd15974d91baf82b3c59d07abe", name: "XX老师,喜气卷地百花开,千福万福道贺来!祝您新婚快乐!——校工会"},
{id: "9e92d6f686974ce7b5055e0f3a98d4b4", name: "XX老师,悉知亲人离世,望节哀顺变。保重身体。—校工会"}
],
tableSize: '',
notifyId: "",
hold: false,
selectDialogVisible: false,
users: [],
selectUsers: [],
activityGroupList: [],
roleList: [],
meetingOptions: [],
menuOptions: [],
tableData: [],
// formData: {
// type: "",
// sendTypes: []
// },
pageForm1: {
groupId: "",
searchName: 'u.username',
pageNumber: 1,
pageSize: 5,
totalCount: 0,
},
pageForm: {
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
}
},
watch: {
formData(val) {
this.$emit('change', val);
}
},
methods: {
diaClosed() {
this.$refs.table.clearSelection()
this.selectUsers = [];
this.pageForm.searchKeyword = '';
},
handleSelectionChange(val) {
this.selectUsers = val;
},
async doDelete(index, row) {
try {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
this.formData.users.splice(index, 1)
}
} catch (e) {
console.log(e)
}
},
doDeleteUser() {
this.$set(this.formData, "users", [])
this.$forceUpdate();
},
addUser() {
this.formData.users = this.formData.users.concat(this.selectUsers)
this.selectDialogVisible = false;
},
pageSizeChange1(val) {
this.pageForm1.pageSize = val;
if (this.formData.roleIds.length > 0) {
this.changeRole();
} else if (this.formData.activityGroupId != "") {
this.getActivityUserData()
} else {
this.getUsersByTitleId(this.formData.id)
}
},
pageNumberChange1(val) {
this.pageForm1.pageNumber = val;
if (this.formData.roleIds.length > 0) {
this.changeRole();
} else if (this.formData.activityGroupId != "") {
this.getActivityUserData()
} else {
this.getUsersByTitleId(this.formData.id)
}
},
async ChangeType() {
this.$set(this.formData, "roleIds", [])
this.$set(this.formData, "module", "")
this.$set(this.formData, "teacherMeetingId", "")
this.$set(this.formData, "activityGroupId", "")
// this.$set(this.formData, "type", "")
this.$set(this.formData, "users", [])
},
async getRoleListByMenuId() {
const {data} = await $.post("/platform/msgNotify/send/getRoleListByMenuId", {menuId: this.formData.module})
this.roleList = data
if (!this.formData.id) {
this.$set(this.formData, "roleIds", [])
this.$set(this.formData, "users", [])
}
},
async getMenuOptions() {
const {data} = await $.get("/platform/sys/role/getMenuOptions")
this.menuOptions = data
if (!this.formData.id) {
this.$set(this.formData, "roleIds", [])
this.$set(this.formData, "users", [])
}
},
async changeRole() {
const data = await $.post("/platform/msgNotify/send/getUserByRoleId", {
roleIds: JSON.stringify(this.formData.roleIds),
module: this.formData.module,
teacherMeetingId: this.formData.teacherMeetingId,
pageSize: this.pageForm1.pageSize,
pageNumber: this.pageForm1.pageNumber,
searchName: this.pageForm1.searchName,
searchKeyword: this.pageForm1.searchKeyword
})
this.formData.users = data.data.list;
this.pageForm1.totalCount = data.data.totalCount;
},
async getActivityUserData() {
this.$set(this.formData, "roleIds", [])
this.$set(this.formData, "module", "")
this.$set(this.formData, "teacherMeetingId", "")
this.$set(this.formData, "type", "")
this.$set(this.formData, "users", [])
const pageForm = clone(this.pageForm1)
pageForm.groupId = this.formData.activityGroupId
const resp = await $.post('/platform/activity/basic/user/pageData', pageForm)
if (resp.code === 0) {
this.formData.users = resp.data.list
this.pageForm1.totalCount = resp.data.totalCount
}
},
async openSelect() {
this.pageData()
this.selectDialogVisible = true
},
doSearch() {
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
const pageForm = clone(this.pageForm)
pageForm.users = JSON.stringify(this.formData.users.map(v => v.id))
$.post('/platform/msgNotify/send/pageData', pageForm, (data) => {
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
async findOne(id) {
const {data} = await $.post("/platform/msgNotify/send/findOne", {id: id})
data.sendTypes = data.sendTypes
data.activityGroupId = data.activityGroupId ? parseInt(data.activityGroupId) : ""
this.formData = data
},
async getUsersByTitleId(id, type) {
const data = await $.post("/platform/msgNotify/send/getUsersByTitleId", {...this.pageForm1, id: id, type: type})
if (data.data.totalCount) {
this.$set(this.formData, "users", data.data.list)
} else {
this.$set(this.formData, "users", data.data)
}
this.pageForm1.totalCount = data.data.totalCount;
},
async getActivityGroup() {
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = resp.data
},
},
async created() {
this.meetingOptions = await proposal.getOpenMeeting()
await this.getActivityGroup()
await this.getMenuOptions()
// console.log(this.hold)
if (this.notify_id) {
await this.findOne(this.notify_id)
await this.getUsersByTitleId(this.notify_id, this.formData.type)
setTimeout(async () => {
await this.getRoleListByMenuId()
}, 100)
}
}
}
</script>
@@ -0,0 +1,138 @@
<template>
<el-dialog
title="高级查询构造器"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
width="50%">
<el-row type="flex">
<el-col style="display:flex;align-items: center;width: 200px">
<vi-title title="过滤条件匹配:" style="display:flex;align-items: center;margin-bottom: 0"></vi-title>
</el-col>
<el-col>
<enum-select v-model="value.method" value="name" :clearable="false" label="description" style="width: 300px"
enum="MatchMethod"></enum-select>
</el-col>
</el-row>
<el-row v-for="(cnd,idx) in value.conditions" gutter="20" style="margin-top: 20px" type="flex">
<el-col span="7">
<el-select v-model="cnd.field" placeholder="请选择字段" style="width: 100%" @change="(v)=>fieldChange(v,cnd)">
<el-option
v-for="item in fields"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-col>
<el-col span="4">
<enum-select v-model="cnd.operational" value="name" :clearable="false" label="description" style="width: 100%"
enum="ConditionalOperational"></enum-select>
</el-col>
<el-col span="9">
<el-select v-if="cnd.fieldObj&&cnd.fieldObj.type=='select'" v-model="cnd.value" placeholder="请选择值"
style="width: 100%"
clearable>
<el-option
v-for="item in cnd.fieldObj.options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-date-picker
v-else-if="cnd.fieldObj&&cnd.fieldObj.type=='date'"
v-model="cnd.value"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择日期" style="width: 100%">
</el-date-picker>
<el-input v-else v-model="cnd.value" clearable placeholder="请输入值" style="width: 100%"></el-input>
</el-col>
<el-col style="width: 180px">
<el-button icon="el-icon-plus" @click="value.conditions.splice(idx+1, 0, {})"></el-button>
<el-button icon="el-icon-minus" :disabled="value.conditions.length==1"
@click="value.conditions.splice(idx, 1)"></el-button>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSubmit">{{ submit_text }}</el-button>
</span>
</el-dialog>
</template>
<script>
module.exports = {
props: {
value: {
type: Object, default: {
method: "AND",
conditions: [{}],
}
},
fields: [],
submit_text: {type: String, default: '确 定'}
},
model: {
prop: 'value',
event: 'confirm'
},
components: {'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),},
data() {
return {
dialogVisible: false
}
},
watch: {
value: {
deep: true,
handler: function (value) {
if (value.conditions.length) {
value.conditions.map(v => {
const field = this.fields.find(x => x.value == v.field)
v.fieldObj = field
})
}
this.$emit("confirm", value)
}
}
},
methods: {
fieldChange(val, cnd) {
this.$set(cnd, "value", '')
this.$set(cnd, "fieldObj", this.fields.find(v => v.value == val))
},
doSubmit() {
this.dialogVisible = false
this.$emit("confirm", this.value)
},
flush() {
this.value = {
method: "AND",
conditions: [{}],
}
},
open(flush) {
if (flush || !this.value || !Object.keys(this.value)) {
this.flush()
}
this.dialogVisible = true
}
},
created() {
}
}
</script>
<style>
</style>
@@ -0,0 +1,86 @@
<template>
<el-select v-model="value" :placeholder="placeholder" @change="onChange" :clearable="clearable" :style="style"
:multiple="multiple"
:size="size">
<el-option
v-for="item in options"
:key="item[option_value]"
:label="item[option_label]"
:value="item[option_value]">
</el-option>
</el-select>
</template>
<script>
module.exports = {
props: {
value: {type: String},
code: {
type: String,
default: ""
},
option_value: {
type: String,
default: "code"
},
option_label: {
type: String,
default: "name"
},
style: {
type: String,
default: ""
},
size: {
type: String,
default: ""
},
placeholder: {
type: String,
default: "请选择"
},
clearable: {
type: Boolean,
default: true
},
multiple: {
type: Boolean,
default: false
},
},
model: {
prop: 'value',
event: 'change'
},
data() {
return {
options: []
}
},
watch: {
code(val) {
this.flushOptions()
}
},
methods: {
onChange(val) {
this.$emit("change", val)
},
async flushOptions() {
if (!this.code) {
this.options = []
return
}
this.options = await getDictOptions(this.code)
},
},
created() {
this.flushOptions()
}
}
</script>
<style>
</style>
@@ -0,0 +1,83 @@
<template>
<div>
<el-drawer
title="我是标题" size="78%"
:visible.sync="userScopeDialog"
:append-to-body="true"
:with-header="false">
<div style="padding: 0px 16px;" class="clearfix">
<el-button icon="el-icon-back" style="font-size: 16px" type="text"
@click="userScopeDialog = false">返回
</el-button>
</div>
<guava>
<el-tabs tab-position="top" v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="人员设置" name="1">
<template>
<user-scope ref="userScope" @group_change="group_change"
:group_id.sync="groupId"></user-scope>
</template>
</el-tab-pane>
<el-tab-pane label="人员调整" name="2">
<user-data-scope
@group_change="group_change"
ref="userDataScope"
></user-data-scope>
</el-tab-pane>
</el-tabs>
</guava>
</el-drawer>
</div>
</template>
<script>
module.exports = {
props: {},
model: {},
mixins: [initTableMixins],
data() {
return {
groupId: "",
userScopeDialog: false,
activeName: '1',
}
},
methods: {
handleClick() {
if (this.activeName === "2") {
this.$refs.userDataScope.getActivityGroup()
} else {
this.$refs.userScope.getActivityGroup()
}
},
group_change() {
this.$emit('group_change')
}
},
components: {
'user-data-scope': httpVueLoader('/components/plugins/UserDataScope.vue'),
'user-scope': httpVueLoader('/components/plugins/UserScope.vue'),
},
watch: {
'groupId': {
async handler(newVal) {
this.$emit("update:group_id", newVal)
},
},
},
mounted() {
},
}
</script>
@@ -0,0 +1,81 @@
<template>
<el-select v-model="model" :clearable="clearable" :multiple="multiple" :placeholder="placeholder" :size="size"
:style="style"
@change="onChange">
<el-option
v-for="item in options"
:key="item[value]"
:label="item[label]"
:value="item[value]">
</el-option>
</el-select>
</template>
<script>
module.exports = {
props: {
model: {type: String},
enum: {type: String},
value: {
type: String
},
label: {
type: String
},
style: {
type: String,
default: ""
},
size: {
type: String,
default: ""
},
placeholder: {
type: String,
default: "请选择"
},
clearable: {
type: Boolean,
default: true
},
multiple: {
type: Boolean,
default: false
},
},
model: {
prop: 'model',
event: 'change'
},
data() {
return {
options: []
}
},
watch: {
enum(val) {
this.flushOptions()
}
},
methods: {
onChange(val) {
this.$emit("change", val)
},
async flushOptions() {
if (!this.enum) {
this.options = []
return
}
this.options = await getEnumOptions(this.enum)
},
},
created() {
this.flushOptions()
}
}
</script>
<style>
</style>
@@ -0,0 +1,188 @@
<template>
<div>
<vi-title2 title="分段设置&emsp;&emsp;提示:如分工会人数在0-20人的,分配5个名额;21-50人,分配10个名额">
<template #func>
<el-button size="small" type="primary" @click="unionLimitQuickSetting">
应用分段设置
</el-button>
</template>
</vi-title2>
<el-row v-for="(item,index) in unionUserNumCalc" :gutter="20" class="mb5">
<el-col :span="7">
<el-input-number v-model="item.startNum" :precision="0" :step="1" :min="1" placeholder="请输入最小人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="7">
<el-input-number v-model="item.endNum" :precision="0" :step="1" :min="1" placeholder="请输入最大人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="6">
<el-input-number v-model="item.resultNum" :precision="0" :step="1" :min="1" placeholder="请输入限制人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="4" class="text-right">
<el-button icon="el-icon-plus" @click="unionUserNumCalc.push({})"></el-button>
<el-button icon="el-icon-minus" @click="unionUserNumCalc.splice(index,1)"
:disabled="unionUserNumCalc.length===1"></el-button>
</el-col>
</el-row>
<el-row class="mt10">
<div v-for="(item,index) in unionUserNumCalcTips" class="text-danger">
<span class="mr10">({{index+1}}).</span> {{item}}
</div>
</el-row>
<vi-title2 title="比例设置" class="mt20">
<template #func>
一键比例:
<el-input-number v-model="unionUserNumOneKeyRatio" :precision="0" :step="1" :min="0"
placeholder="请输入一键比例"
size="small"
:max="100"></el-input-number>
<el-button size="small" type="primary" @click="applyScaleSettings" class="ml5">应用比例设置</el-button>
</template>
</vi-title2>
<el-table :data="union_limit" max-height="500px">
<el-table-column prop="unionname" label="分工会"></el-table-column>
<el-table-column prop="teacherCount" label="人数"></el-table-column>
<el-table-column prop="ratio" label="比例(%)">
<template slot-scope="scope">
<el-input-number v-model="scope.row.ratio" @change="(val) => ratioChange(val, scope.$index)" :precision="0" :step="1" :min="0" :max="100"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="limitCount" label="分配人数">
<template scope="{row}">
<el-input-number v-model="row.limitCount" :precision="0" :step="1" :min="0"
:max="row.teacherCount" @change="calSummaryCount"></el-input-number>
</template>
</el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<div class="text-danger" style="width: 100%;font-size: 18px;display: flex;align-items: center;font-weight: bold">分配总人数:{{summaryCount}}人</div>
<el-button @click="clearUnionLimit" type="danger">清空当前已分配</el-button>
</el-row>
</div>
</template>
<script>
module.exports = {
props: {
union_limit: {
type: Object, default: []
},
user_scope: {
type: String, default: ''
}
},
model: {
},
data() {
return {
unionUserNumCalc: [{}],
summaryCount: 0,
unionUserNumOneKeyRatio: null,
}
},
watch: {
union_limit: {
deep: true,
handler: function (value) {
this.$emit("update:union_limit", value)
}
}
},
methods: {
async clearUnionLimit() {
const confirm = await this.$confirm('确定要清空分工会人数限制吗, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' === confirm) {
this.union_limit = []
this.summaryCount = 0
this.unionUserNumOneKeyRatio = null
this.unionUserNumCalc = [{}]
await this.initData()
}
},
unionLimitQuickSetting() {
this.unionUserNumCalc.forEach((v, i) => {
const startNum = v.startNum
const endNum = v.endNum
const resultNum = v.resultNum
if (startNum > endNum) {
this.$message.warning('第' + (i + 1) + '行设置错误')
} else {
this.union_limit.forEach(x => {
if (x.teacherCount >= startNum && x.teacherCount <= endNum) {
x.limitCount = resultNum
}
})
this.calSummaryCount()
}
})
},
calSummaryCount() {
const array = this.union_limit
if (array && array.length > 0) {
this.summaryCount = array.reduce((prev, curr) => {
const union_limit = Number(curr.limitCount);
if (!isNaN(union_limit)) {
return prev + curr.limitCount;
} else {
return prev;
}
}, 0)
}
},
//应用比例设置
applyScaleSettings() {
this.union_limit.forEach(v => {
v.ratio = this.unionUserNumOneKeyRatio
if (v.ratio) {
v.limitCount = parseFloat((v.teacherCount * v.ratio / 100).toFixed(0))
}
})
this.calSummaryCount()
},
ratioChange(val, index) {
const v = this.union_limit[index]
v.limitCount = parseFloat((v.teacherCount * v.ratio / 100).toFixed(0))
this.calSummaryCount()
},
async initData() {
if (!this.union_limit || this.union_limit.length === 0) {
const resp = await $.get('/platform/vi/common/getUnionLimit', {activityScopeId: this.user_scope})
if (resp.code === 0) {
this.$set(this, 'union_limit', resp.data)
}
}
this.calSummaryCount()
}
},
computed: {
unionUserNumCalcTips() {
return this.unionUserNumCalc.map(v => {
return (v.startNum ? v.startNum : '?') + '-' + (v.endNum ? v.endNum : '?') + '人的分工会,限报' + (v.resultNum ? v.resultNum : '?') + '人'
})
},
},
created() {
this.initData()
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,766 @@
<template>
<div v-if="view" class="viewFile">
<div v-for="(file,index) in files" class="viewFileItem" title="点击查看" @click="showSource(file)">
<template v-if="resolvingShowByFileName(file.filename) == 1">
<el-image
:src="APP_DOMAIN + '/file_server/fileStreamPreview?id=' + file.id"
fit="cover"
style="width: 100%; height: 100%;"></el-image>
<!-- <img class="show-img" :src="getFileItemShowIcon(file.filepath)" :alt="file.filename"/>-->
</template>
<template v-else>
<svg aria-hidden="true">
<use :xlink:href="APP_DOMAIN + '/file_server/fileStreamPreview?id=' + file.id"></use>
</svg>
</template>
<div :title="file.filename" class="viewFileName">{{ file.filename }}</div>
</div>
</div>
<el-upload
v-else-if="card"
:limit="max"
:action="FILE_UPLOAD_ADDRESS"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="onSuccess"
:file-list="fileList"
:on-exceed="handleExceed"
class="x100000"
drag
:on-preview="handlePreview"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
<el-upload
v-else
:limit="max"
:action="FILE_UPLOAD_ADDRESS"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="onSuccess"
:file-list="fileList"
:on-exceed="handleExceed"
:on-preview="handlePreview"
class="x100000"
multiple>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</template>
<script>
/**
* 文件类型解析
* @type {{isImg: wpUploadFileTypeResolve.isImg}}
*/
let fileTypeResolving = {
/**
* 是否是一张图片
*/
isImg: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /image\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isImgByName: function (fileItemName) {
let checkSuffixArray = ['jpg', 'png', 'jpeg', 'bmp', 'gif', 'webp', 'tif', 'svg', 'wmf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是视频
*/
isVideo: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /video\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isVideoByName: function (fileItemName) {
let checkSuffixArray = ['mp4', 'Ogg', 'webm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是音频
*/
isAudio: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /audio\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isAudioByName: function (fileItemName) {
let checkSuffixArray = ['mp3', 'ogg', 'wav'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是doc文件
*/
isDoc: function (fileItemName) {
let checkSuffixArray = ['doc', 'docx', 'dot', 'dotx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是excel文件
*/
isExcel: function (fileItemName) {
let checkSuffixArray = ['xls', 'xlsx', 'csv', 'xlt', 'xltx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是PPT文件
*/
isPPT: function (fileItemName) {
let checkSuffixArray = ['ppt', 'pptx', 'pot', 'potx', 'odp'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是Pdf文件
*/
isPdf: function (fileItemName) {
let checkSuffixArray = ['pdf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是压缩文件
* @param fileItem
* @returns {boolean}
*/
isZip: function (fileItemName) {
let checkSuffixArray = ['zip', '7z', 'war', 'tar', 'rar', 'jar', 'zipx', 'zix', 'zoo'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isWeb: function (fileItemName) {
let checkSuffixArray = ['html', 'htm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isTxt: function (fileItemName) {
let checkSuffixArray = ['txt'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isPsd: function (fileItemName) {
let checkSuffixArray = ['psd'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isCad: function (fileItemName) {
let checkSuffixArray = ['cad'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isIso: function (fileItemName) {
let checkSuffixArray = ['iso'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isExe: function (fileItemName) {
let checkSuffixArray = ['exe'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 根据文件类型来解析
* @param fileType 文件类型
* @param checkTypeModel 文件类型模型,如:image\/(\w)*
* @returns {boolean}
*/
resolvingByType: function (fileType, checkTypeModel) {
if (checkTypeModel.test(fileType)) {
return true;
}
return false;
},
/**
* 根据名字和名字后缀名来验证文件
* @param fileName 文件名
* @param checkSuffixArray 文件类型包含的后缀
*/
resolvingByName: function (fileName, checkSuffixArray) {
let suffixName = wpUploadFileTools.getSuffixNameByFileName(fileName);
// 名字是否有效
if (!wpUploadDataValid.isValidStr(suffixName)) {
// 无效直接返回false
return false;
}
suffixName = suffixName.trim();
suffixName = suffixName.toLowerCase();
if (checkSuffixArray.indexOf(suffixName) != -1) {
return true;
}
return false;
}
}
/**
* 文件工具
* @type {{}}
*/
let wpUploadFileTools = {
/**
* 获取文件显示模版
* @param fileItem
*/
wapFileItemShow: function (fileItem) {
return wpUploadFileTools.wapFileItemShowBase(fileItem, false);
},
/**
* 包装已上传的文件列表
*/
wapFileItemShowWithUpload(uploadFile) {
return wpUploadFileTools.wapFileItemShowBase(uploadFile, true);
},
/**
* 获取文件显示的基本操作
*/
wapFileItemShowBase(fileItem, isUploaded = false) {
let fileName = "";
let suffix = "";
let show = "";
let showIcon = "";
if (!isUploaded) {
fileName = fileItem.name;
suffix = wpUploadFileTools.getSuffixNameByFileName(fileName);
show = wpUploadFileTools.resolvingShow(fileItem);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem, false);
} else {
fileName = fileItem.name ? fileItem.name : wpUploadFileTools.resolvingUrlFileName(fileItem.url);
let fileNameGetOFuRL = wpUploadFileTools.resolvingUrlFileName(fileItem.url);
suffix = wpUploadFileTools.getSuffixNameByFileName(fileNameGetOFuRL);
show = wpUploadFileTools.resolvingShowByFileName(fileNameGetOFuRL);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem.url, true);
}
let fileItemShow = {
// 文件的id
id: wpUploadFileTools.uuid(),
// 文件对象
file: null,
// 文件的类型
type: null,
// 文件的大小
size: null,
// 文件的名字
name: fileName,
// 文件地址
url: null,
// 后缀
suffix: suffix,
// 显示的类型
show: show,
// 显示的图标或者图片地址
showIcon: showIcon,
// 显示进度条
processStatus: {
show: false,
width: 0,
isFail: false
},
// 文件来源,0选择文件上传,1回显文件
fileSource: 0,
// 状态0未上传,失败也会转到0,1正在上传,2已经上传
status: 0,
// 上传文件的描述
fileDes: null
}
if (!isUploaded) {
// 如果非选择文件下面三个属性为null
fileItemShow.file = fileItem;
fileItemShow.type = fileItem.type;
fileItemShow.size = fileItem.size;
} else {
// 文件描述
fileItemShow.status = 2;
fileItemShow.fileDes = fileItem;
fileItemShow.fileSource = 1;
fileItemShow.url = fileItem.url;
}
return fileItemShow;
},
/**
* 解析URL的文件名字
*/
resolvingUrlFileName: function (fileUrl) {
let index = fileUrl.lastIndexOf("/");
if (index <= 0) {
index = fileUrl.lastIndexOf("\\");
}
index = index + 1;
let fileName = fileUrl.substring(index, fileUrl.length);
return fileName;
},
/**
* 获取文件名后缀
* @param fileName 文件名全名
* */
getSuffixNameByFileName: function (fileName) {
let str = fileName;
let index = str.lastIndexOf(".");
if (index < 0) {
return "";
}
let pos = index + 1;
return str.substring(pos, str.length);
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShow: function (fileItem) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImg(fileItem)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideo(fileItem)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudio(fileItem)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItem.name)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItem.name)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItem.name)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItem.name)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItem.name)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItem.name)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItem.name)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItem.name)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItem.name)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItem.name)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItem.name)) {
showResult = 14;
}
return showResult
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName: function (fileItemName) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 生成UUID
* @returns {string}
*/
uuid: function () {
let str = wpUploadFileTools.uuidFull();
str = str.replace(/-/g, "");
return str;
},
uuidFull() {
let s = []
let hexDigits = "0123456789abcdef"
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = "4"
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
s[8] = s[13] = s[18] = s[23] = "-"
let uuid = s.join("")
return uuid
},
/**
* 禁止某个dom的某个事件
*/
disableObjEvent(domObj, eventName) {
domObj.addEventListener(eventName, function (e) {
e.preventDefault();
})
}
}
/**
* 数据验证工具
* @type {{isValid: wpUploadDataValid.isValid}}
*/
let wpUploadDataValid = {
isValid: function (obj) {
if (undefined === obj || null === obj) {
return false;
}
return true;
},
isValidStr: function (str) {
let isValidObj = wpUploadDataValid.isValid(str);
if (!isValidObj) {
return isValidObj;
}
str = str.trim();
if ("" == str || '' == str) {
return false;
}
return true;
},
isValidArray(array) {
if (null == array || array == undefined || array.length <= 0) {
return false;
}
return true;
}
}
module.exports = {
props: {
files: Array,
type: {
type: Array,
default: ['jpg', 'jpeg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'pdf']
},
max: {
type: Number,
default: 5
},
max_size: {
type: Number,
default: 20 * 1024 * 1024
},
view: {
type: Boolean,
default: false
},
card: {
type: Boolean,
default: false
},
del: {
type: Boolean,
default: true
}
},
data() {
return {
fileList: []
}
},
watch: {
files(val) {
this.updateFileList(val)
}
},
methods: {
/**
* 查看资源
*/
showSource(showItem) {
const show = this.resolvingShowByFileName(showItem.filename)
if (show == 1 || show == 2 || show == 3) {
const fileArray = this.files.filter(item => {
const show = this.resolvingShowByFileName(item.filename)
return show === 1 || show === 2 || show === 3
})
let index = 0
if(fileArray && fileArray.length > 0) {
const f = fileArray.findIndex(o => o.id === showItem.id)
index = f !== -1 ? f : 0
}
const vv = new Viewer($(".viewFile").clone()[0], {
url: 'src',
initialViewIndex: index,
hide:function(){ //在图片消失的时候销毁viewer
vv.destroy()
}
})
vv.show()
} else if (show == 4 || show == 5 || show == 7) {
preview(showItem.filename, showItem.id)
}
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName(fileItemName) {
// 默认0普通文件
let showResult = 0;
if (fileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (fileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (fileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (fileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (fileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (fileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (fileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (fileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (fileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (fileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (fileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (fileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (fileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (fileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 获取文件显示图标
* @param filePath
* @returns {string}
*/
getFileItemShowIcon(filePath) {
let showIcon = '';
switch (this.resolvingShowByFileName(filePath)) {
case 0:
showIcon = "#icon-yunpanlogo-3";
break;
// 图片
case 1:
showIcon = this.getImgShowIcon(filePath);
break;
// 视频
case 2:
showIcon = "#icon-yunpanlogo-6";
break;
// 音乐
case 3:
showIcon = "#icon-yunpanlogo-4";
break;
// doc
case 4:
showIcon = "#icon-yunpanlogo-2";
break;
// excel
case 5:
showIcon = "#icon-yunpanlogo-";
break;
// ppt
case 6:
showIcon = "#icon-yunpanlogo-1";
break;
// pdf
case 7:
showIcon = "#icon-yunpanlogo-12";
break;
// zip
case 8:
showIcon = "#icon-yasuobao";
break;
// web文件
case 9:
showIcon = "#icon-yunpanlogo-5";
break;
// txt文件
case 10:
showIcon = "#icon-yunpanlogo-7";
break;
// PSD
case 11:
showIcon = "#icon-yunpanlogo-10";
break;
// cad
case 12:
showIcon = "#icon-yunpanlogo-11";
break;
// ISO
case 13:
showIcon = "#icon-yunpanlogo-8";
break;
// 可执行
case 14:
showIcon = "#icon-yunpanlogo-9";
break;
// 普通文件
default:
showIcon = "#icon-yunpanlogo-3";
}
return showIcon;
},
/**
* 获取图片的显示图标
* @param fileItem
* @returns {string|*}
*/
getImgShowIcon(fileItem) {
return FILE_DOMAIN + fileItem;
},
updateFileList(val) {
if (!val || !val.length) {
this.fileList = []
return
}
this.fileList = val.map(v => {
return {data: v, uid: v.id, name: v.filename, status: 'success'}
})
},
change(fileList) {
this.$emit("update:files", fileList.map(v => v.data))
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 ${this.max} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
onSuccess(response, file, fileList) {
if (response.code === 0) {
const {data} = response
file.data = data
this.change(fileList)
} else {
this.$message.warning('文件上传失败')
}
},
beforeUpload(file) {
const type = this.type.includes(file.name.split('.')[1].toLowerCase());
const size = file.size < this.max_size;
if (!type) {
this.$message.warning(`上传文件只能是 ${this.type.map(v => v.toLowerCase()).join("/")} 格式!`);
}
if (!size) {
this.$message.warning(`上传文件大小不能超过 ${this.max_size / 1024 / 1024} MB!`);
}
return type && size;
},
async handleRemove(file, fileList) {
if (file.data) {
const {id} = file.data
if (this.del) {
const resp = await $.post(FILE_DELETE_ADDRESS, {id})
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
this.change(fileList)
}
},
handlePreview(file) {
if (file.data) {
const {filename, id} = file.data
preview(filename, id)
}
},
},
created() {
this.updateFileList(this.files)
}
}
</script>
<style>
.viewFileName {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 24px;
line-height: 24px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: 0 10px;
color: white;
background-color: rgb(160, 160, 160);
border-radius: 2px;
opacity: .95;
}
.viewFile {
position: relative;
display: flex;
width: 100%;
max-height: 256px;
flex-direction: row;
flex-wrap: wrap;
overflow-y: auto;
overflow-x: hidden;
}
.viewFileItem {
width: 118px;
height: 118px;
margin-right: 10px;
position: relative;
transition: all 500ms;
border-radius: 5px;
cursor: pointer;
margin-bottom: 10px;
}
.viewFileItem:hover {
background-color: rgb(230, 230, 230);
}
.viewFileItem img {
padding: 10px 10px;
}
.viewFileItem svg {
width: 100%;
height: 100%;
}
.x100000 .el-upload-dragger {
height: 120px;
width: 100%;
}
.x100000 .el-upload {
width: 100%;
text-align: left;
}
.el-upload-dragger .el-icon-upload {
font-size: 54px;
line-height: 0;
}
</style>
@@ -0,0 +1,180 @@
<template>
<div class="guava-main-content">
<transition-group appear mode="out-in" name="el-fade-in">
<!-- <transition name="el-fade-in-linear" appear mode="out-in">-->
<div v-show="v==='index'" key="index" class="transition-item">
<slot></slot>
</div>
<!-- </transition>-->
<el-card v-show="v==='edit'" key="edit" class="operation" shadow="never">
<template #header>
<el-row type="flex">
<el-col :span="12">
<el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="v='index'">返回</el-button>
</el-col>
<el-col :span="12" class="text-right">
<slot name="edit_func"></slot>
</el-col>
</el-row>
</template>
<div>
<slot name="edit"></slot>
</div>
</el-card>
<el-card v-show="v==='view'" key="view" class="operation" shadow="never">
<template #header>
<el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="v='index'">返回</el-button>
</template>
<slot name="view"></slot>
</el-card>
<el-card v-show="v==='public'" key="public" class="operation" shadow="never">
<div slot="header" class="clearfix">
<el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="back()">返回
</el-button>
</div>
<div>
<slot name="public"></slot>
</div>
</el-card>
</transition-group>
<!-- <transition name="el-fade-in-linear" appear mode="out-in">-->
<!-- <div v-show="v==='index'" class="transition-item" key="index">-->
<!-- <slot></slot>-->
<!-- </div>-->
<!-- </transition>-->
<!-- <transition name="el-fade-in-linear" appear mode="in-out">-->
<!-- <el-card v-show="v==='edit'" class="operation" shadow="never" key="edit">-->
<!-- <template #header>-->
<!-- <el-row type="flex">-->
<!-- <el-col :span="12">-->
<!-- <el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="v='index'">返回</el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="12" class="text-right">-->
<!-- <slot name="edit_func"></slot>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </template>-->
<!-- <div>-->
<!-- <slot name="edit"></slot>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </transition>-->
<!-- <el-card v-show="v==='view'" class="operation" shadow="never" key="view">-->
<!-- <template #header>-->
<!-- <el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="v='index'">返回</el-button>-->
<!-- </template>-->
<!-- <slot name="view"></slot>-->
<!-- </el-card>-->
<!-- <div v-show="v==='public'" class="transition-item transition-item2">-->
<!-- <el-card class="box-card v-box guava-card" shadow="never">-->
<!-- <div slot="header" class="clearfix">-->
<!-- <el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="back()">返回-->
<!-- </el-button>-->
<!-- </div>-->
<!-- <div>-->
<!-- <slot name="public"></slot>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </div>-->
</div>
</template>
<script>
module.exports = {
props: {
name: {
type: String,
default: "el-zoom-in-top"
},
value: {
type: String,
default: 'index'
}
},
data() {
return {
v: 'index',
}
},
watch: {
v(newValue, oldValue) {
this.$emit('vchange', {newValue, oldValue})
this.$emit('input', newValue)
}
},
methods: {
index() {
this.v = 'index'
},
edit() {
this.v = 'edit'
},
view() {
this.v = 'view'
},
public() {
this.v = 'public'
},
back() {
this.v = 'index'
}
},
created() {
}
}
</script>
<style>
.guava-main-content {
padding: 10px;
background-color: #f6f6f6;
min-height: 100%;
}
.el-card__header {
padding: 5px 20px !important;
}
.operation {
min-height: calc(100vh - 70px) !important;
display: flex;
flex-direction: column;
}
.operation .el-card__body {
flex: auto;
}
.el-tabs--border-card {
box-shadow: unset !important;
}
/*.v-enter-active, .v-leave-active {*/
/* transition: all 0.5s;*/
/*}*/
/*.v-enter, .v-leave-to {*/
/* opacity: 0;*/
/*}*/
/*.v-leave, .v-enter-to {*/
/* opacity: 1;*/
/*}*/
</style>
@@ -0,0 +1,242 @@
<template>
<div class="component-upload-image">
<el-upload
:style="{'--box-width': width + 'px', '--box-height': height + 'px'}"
multiple
:action="FILE_UPLOAD_ADDRESS"
list-type="picture-card"
:on-success="handleUploadSuccess"
:before-upload="handleBeforeUpload"
:limit="limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
ref="imageUpload"
:on-remove="handleDelete"
:file-list="fileList"
:on-preview="handlePictureCardPreview"
:class="{hidePic: this.fileList.length >= this.limit}"
>
<i class="el-icon-plus"></i>
</el-upload>
<!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b></template>
的文件
</div>
</div>
</template>
<script>
module.exports = {
name: "ImageUpload",
props: {
value: [String, Array],
// 图片数量限制
limit: {
type: Number,
default: 5,
},
// 大小限制(MB)
fileSize: {
type: Number,
default: 5,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["png", "jpg", "jpeg"],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true
},
height: {
type: Number,
default: 100
},
width: {
type: Number,
default: 100
}
},
data() {
return {
dialogImageUrl: "",
dialogVisible: false,
hideUpload: false,
fileList: []
}
},
watch: {
value: {
immediate: true,
deep: true,
handler(val) {
if (val) {
let fff = []
fff = Array.isArray(val) ? [...val] : [val]
this.fileList = fff.map(v => {
return {
name: v,
url: CREATE_PREVIEW_URL(v)
}
})
}
}
}
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
methods: {
// 上传前loading加载
handleBeforeUpload(file) {
let isImg = false;
if (this.fileType.length) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
isImg = this.fileType.some(type => {
if (file.type.indexOf(type) > -1) return true;
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
return false;
});
} else {
isImg = file.type.indexOf("image") > -1;
}
if (!isImg) {
this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
return false;
}
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
},
// 文件个数超出
handleExceed() {
this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);
},
// 上传成功回调
handleUploadSuccess(res, file) {
if (res.code === 0) {
if (this.limit === 1) {
this.$emit("input", res.data.filepath)
} else {
if (this.value && Array.isArray(this.value)) {
const v = [...this.value, res.data.filepath]
this.$emit("input", v)
} else {
this.$emit("input", [res.data.filepath])
}
}
} else {
this.$message.error(res.msg);
this.$refs.imageUpload.handleRemove(file);
}
},
// 删除图片
async handleDelete(file) {
const resp = await $.post(FILE_DELETE_ADDRESS, {id: file.name})
const findex = this.fileList.map(f => f.name).indexOf(file.name);
if (findex > -1) {
this.fileList.splice(findex, 1)
if (this.limit === 1) {
this.$emit("input", this.fileList.map(v => v.name).join('、'))
} else {
this.$emit("input", this.fileList.map(v => v.name))
}
}
/*if (resp.code === 0) {
this.$message.success(resp.msg)
const findex = this.fileList.map(f => f.name).indexOf(file.name);
if (findex > -1) {
this.fileList.splice(findex, 1)
if (this.limit === 1) {
this.$emit("input", this.fileList.map(v => v.name).join('、'))
} else {
this.$emit("input", this.fileList.map(v => v.name))
}
}
} else {
this.$message.warning(resp.msg)
}*/
},
// 上传失败
handleUploadError() {
this.$message.error("上传图片失败,请重试");
},
// 预览
handlePictureCardPreview(file) {
if (file.url) {
let image = new Image();
image.src = file.url
let viewer = new Viewer(image);
viewer.show();
} else {
viewImage(file.response.data.id)
}
}
}
}
</script>
<style scoped>
.component-upload-image .el-upload--picture-card {
width: var(--box-width, '100px') !important;
height: var(--box-height, '100px') !important;
display: flex;
align-items: center;
justify-content: center;
}
.el-upload--picture-card i {
font-size: 1em;
}
.el-upload-list--picture-card .el-upload-list__item {
width: var(--box-width, '100px');
height: var(--box-height, '100px');
}
.hidePic .el-upload--picture-card {
display: none !important;
}
.el-list-enter-active,
.el-list-leave-active {
transition: all 0s;
}
.el-list-enter, .el-list-leave-active {
opacity: 0;
transform: translateY(0);
}
.component-upload-image {
height: inherit;
}
.component-upload-image > div:nth-child(1) {
width: 100%;
height: 100%;
}
.el-upload__tip {
text-align: left;
}
</style>
@@ -0,0 +1,183 @@
<template>
<el-timeline>
<el-timeline-item timestamp="" placement="top">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 300px">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top" v-if="is_ghxzzz">
<el-col :span="12">
<el-select v-model="pageForm.threeUnitId" clearable filterable
placeholder="请选择新科室"
style="width: 100%">
<el-option
v-for="item in threeUnits2"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top">
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" ref="table" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in columns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width">
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
layout="total, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-timeline-item>
</el-timeline>
</template>
<script>
module.exports = {
props: {
value: {type: Array},
columns: {
type: Array,
default: [{
prop: 'loginname',
label: '工号',
}, {
prop: 'username',
label: '姓名',
}, {
prop: 'sex',
label: '性别',
}, {
prop: 'mobile',
label: '电话',
}, {
prop: 'threeUnitName',
label: '科室',
}, {
prop: 'unitname',
label: '单位',
}, {
prop: 'unionname',
label: '工会',
}]
},
union: {type: String},
is_ghxzzz: {type: Boolean},
page_size: {type: Number, default: 5},
sql_cnd: {
type: Array
}
},
model: {
prop: 'value',
event: 'change'
},
data() {
return {
unitMoveUnits: [],
threeUnits2: [],
tableData: [],
tableLoading: false,
selectUser: [],
pageForm: {
unionId: this.union,
sqlCnd: JSON.stringify(this.sql_cnd),
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: this.page_size,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
}
}
},
watch: {
value(val) {
}
},
methods: {
handleSelectionChange(val) {
this.selectUser = val
this.$emit("change", val.map(v => v.id))
},
doSearch() {
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
this.tableLoading = true
$.post("/platform/member/change/mange/userPageData", this.pageForm, (data) => {
this.tableLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
this.tableData.filter(v => this.value.includes(v.id) && !this.selectUser.some(x => x.id == v.id)).forEach(v => {
this.$refs.table.toggleRowSelection(v, true);
})
} else {
this.$message.error(data.msg);
}
}, "json");
},
async init() {
console.log(this.is_ghxzzz,this.sql_cnd)
this.doSearch()
this.selectUser = []
this.unitMoveUnits = await getUnits()
if (this.unitMoveUnits && this.unitMoveUnits.length > 0) {
this.pageForm.unitId = this.unitMoveUnits[0].id
this.threeUnits2 = await threeUnitsByUnionGroupOrUnitId(this.pageForm.unitId, null)
}
this.$refs.table.clearSelection();
},
},
created() {
}
}
</script>
<style>
</style>
@@ -0,0 +1,70 @@
<template>
<div>
<el-dialog
title="活动二维码"
:visible.sync="codeDialogVisible"
:close-on-click-modal="false"
width="40%">
<div style="width: 100%;">
<div id="qrcode" style="width: 70%;left: 0;right: 0;margin: auto"></div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="codeDialogVisible = false" type="primary">关 闭</el-button>
<!-- <el-button type="primary" @click="dwn('活动二维码')">下 载</el-button>-->
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {},
data() {
return {
codeDialogVisible: false,
}
},
methods: {
saveFile(data, filename) {
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
save_link.href = data;
save_link.download = filename;
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
},
/*下载二维码*/
dwn(name) {
var type = 'png';
var dataurl = $("canvas").get(0).toDataURL('image/png').replace("image/png", "image/octet-stream");
var filename = name + '_' + (new Date()).getTime() + '.' + type;
this.saveFile(dataurl, filename);
},
openCode(url) {
this.codeDialogVisible = true
this.$nextTick(() => {
$("#qrcode").html("")
$("#qrcode").qrcode({ //设置css
render: "canvas", //二维码的生成方式
width: $("#qrcode").width(), //生成二维码的宽度
height: $("#qrcode").width(), //生成二维码的高度
text: APP_DOMAIN + url,
correctLevel: 3 //容错级别,默认为2,最高为3,为了让用户扫码最快,容错级别应当设为最低
});
})
console.log(APP_DOMAIN + url)
},
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,502 @@
<template>
<div>
<el-card shadow="never">
<el-form ref="form" label-width="80px">
<el-card v-for="(s,idx) in subject" :key="s.id" class="item" shadow="hover">
<!-- <el-form-item :label="(s.subjectType==='radio'?'(单选)':'(多选)')+ (idx+1)+'.'" prop="subjectName">-->
<el-form-item label="" prop="subjectName">
<div class="s-title-wrap">
<el-row align="middle" style="width: 100%" type="flex">
<el-col :xl="20"
style="border: 1px dashed rgb(217, 217, 217);border-radius:6px;display: flex;align-items: center;">
<el-input v-model="s.subjectName" class="text-input"
data-type="subject"></el-input>
</el-col>
<el-col :xl="2" style="text-align: center"></el-col>
<el-col :xl="2" style="text-align: center">
<div class="option-delete">
<el-button circle
icon="el-icon-delete"
size="mini" type="danger"
@click="subject.splice(idx,1)"></el-button>
</div>
</el-col>
</el-row>
</div>
<div class="s-options-list" style="margin-top: 10px;">
<el-table :data="s.options" border>
<el-table-column
align="center"
header-align="center"
label="类型"
>
<template slot-scope="{row}">
<el-select v-model="row.optionType" placeholder="请选择"
@change="optionTypeChange(row)">
<el-option
v-for="item in typeOptions"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="福利名称"
>
<template slot-scope="{row}">
<div
style="border: 1px dashed rgb(217, 217, 217);border-radius:6px;display: flex;align-items: center;padding-left: 10px;">
<i v-if="s.subjectType==='radio'" class="fa fa-circle-o"
style="cursor: pointer"></i>
<i v-else-if="s.subjectType==='checkBox'" class="fa fa-square-o"
style="cursor: pointer"></i>
<template v-if="row.optionType==='套餐'">
<el-input v-model="row.optionName" autosize
class="text-input"
data-type="option"
></el-input>
</template>
<template v-if="row.optionType==='提货券'">
<el-select v-model="row.optionNameId" placeholder="请选择"
@change="optionNameIdChange(row)">
<el-option
v-for="item in shoppingTypeOptions"
:key="item.id"
:disabled="item.disabled"
:label="item.shoppingName"
:value="item.id">
</el-option>
</el-select>
</template>
</div>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="排序" width="120px">
<template slot-scope="{row}">
<div
style="border: 1px dashed rgb(217, 217, 217);border-radius:6px;display: flex;align-items: center;padding-left: 10px;">
<el-input v-model="row.optionSort" autosize
class="text-input"
data-type="option"
></el-input>
</div>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="图片"
width="200px"
>
<template slot-scope="{row,$index}">
<div @click="uploadClick(idx,$index)">
<el-upload :action="FILE_UPLOAD_ADDRESS" :on-success="onFileSuccess"
:show-file-list="false" class="avatar-uploader">
<div v-if="row.imgUrl" style="position: relative">
<img :src="FILE_STREAM_PREVIEW_ADDRESS+'?id='+row.imgUrl" class="avatar">
<div @click.stop="closePopover(row)">
<i class="el-icon-delete avatar-delete"></i>
</div>
</div>
<!-- <img :src="FILE_STREAM_PREVIEW_ADDRESS+'?id='+row.imgUrl" class="avatar">-->
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<!-- <el-popover
placement="top-start"
width="200"
>
<img :src="FILE_STREAM_PREVIEW_ADDRESS+'?id='+row.imgUrl" style="width: 100%;height: 150px">
<el-button size="mini" style="margin-top: 10px;width: 100%;" type="danger"
@click="closePopover(row)">
删除
</el-button>
<img v-if="row.imgUrl" slot="reference" :src="FILE_STREAM_PREVIEW_ADDRESS+'?id='+row.imgUrl"
style="width: 40px;height: 40px">
</el-popover>-->
</div>
</template>
</el-table-column>
<el-table-column align="center"
header-align="center"
label="说明"
width="100px">
<template slot-scope="scope">
<el-link type="primary"
@click="openDescRichText(scope.row.description,idx,scope.$index)">编辑说明
</el-link>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="默认值"
width="100px">
<template slot-scope="{row,$index}">
<el-checkbox v-model="row.isSystemDefault"
@change="(val,event)=>{systemDefaultChange(idx,$index,val)}"
></el-checkbox>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="没选系统自动分配"
width="200px">
<template slot-scope="{row,$index}">
<el-checkbox v-model="row.isDefaultOption"
@change="(val,event)=>{defaultOptionChange(idx,$index,val)}"
></el-checkbox>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="操作"
width="100px"
>
<template slot-scope="{row,$index}">
<div class="option-delete">
<el-button circle
icon="el-icon-delete"
size="mini" type="danger"
@click="deleteRow(s.options,row,$index)"></el-button>
</div>
</template>
</el-table-column>
</el-table>
<div class="s-operation">
<el-button size="small" type="primary"
@click="s.options.push({optionType:'套餐',optionNameId:'',optionName:'福利'+(s.options.length+1),optionSort:s.options.length+1,imgUrl:null})">
添加福利
</el-button>
</div>
</div>
</el-form-item>
</el-card>
</el-form>
<!-- <div class="text-center">-->
<!-- <el-button type="primary" size="small" @click="addSubject('radio')">添加单选题</el-button>-->
<!-- <el-button type="primary" size="small" @click="addSubject('checkBox')">添加多选题</el-button>-->
<!-- </div>-->
</el-card>
<el-dialog
:close-on-click-modal="false"
:visible.sync="richTextDialog"
title="编辑说明"
:append-to-body="true"
width="60%">
<div id="descRichText">
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="richTextDialog = false">取 消</el-button>
<el-button type="primary" @click="getRichText">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
let questionRichTextEditor = null
module.exports = {
components: {
vuedraggable: window.vuedraggable,
},
watch: {
subject(val) {
console.log(val)
}
},
props: {
subject: {
type: Array,
default: []
}
},
data() {
return {
typeOptions: ["套餐", "提货券"],
shoppingTypeOptions: null,
richTextDialog: false,
subjectIndex: 0,
optionIndex: 0,
imgPopover: false,
//题目列表
// subject: [
// {
// subjectName: '题目1',
// subjectType: 'radio',
// defaultOption: null,
// options: [
// {
// optionName: '选项1',
// imgUrl: '/r809h67mpsiulphfg1coehd5v3.jpg'
// },
// {
// optionName: '选项2',
// imgUrl: '/r809h67mpsiulphfg1coehd5v3.jpg'
// }
// ]
// }
// ],
idx: null,
oidx: null
}
},
methods: {
deleteRow(options, row, index) {
options.splice(index, 1)
const shoppingTypeOption = this.shoppingTypeOptions.find(v => v.id === row.optionNameId)
shoppingTypeOption.disabled = false
},
optionTypeChange(row) {
this.optionNameIdChange()
row.optionNameId = null
row.optionName = null
},
optionNameIdChange(row) {
if (row) {
row.optionName = this.shoppingTypeOptions.find(v => v.id === row.optionNameId).shoppingName
}
const optionNameIds = this.subject[0].options.map(v => v.optionNameId)
this.shoppingTypeOptions.forEach(v => {
v.disabled = optionNameIds.includes(v.id)
})
this.$forceUpdate()
},
addSubject(type) {
let subject = {
subjectName: '题目' + (this.subject.length + 1),
subjectType: type,
options: [
{optionName: '选项一', imgUrl: null},
{optionName: '选项一', imgUrl: null}
]
}
this.subject.push(subject)
},
onFileSuccess(response, file, fileList) {
const {data} = response
this.subject[this.idx].options[this.oidx].imgUrl = data.filepath
// this.$set()
this.$forceUpdate()
// this.subject[this.idx].options[this.oidx].optionName = data.filepath
},
uploadClick(idx, oidx) {
this.idx = idx
this.oidx = oidx
},
closePopover(o) {
const popovers = document.getElementsByClassName('el-popover')
for (let i = 0; i < popovers.length; i++) {
popovers[i].style.display = 'none'
}
o.imgUrl = null
},
defaultOptionChange(idx, oidx, val) {
const subject = this.subject[idx]
const {subjectType} = subject
if (val) {
// subject.options.forEach(v => v.isDefaultOption = false)
subject.options[oidx].isDefaultOption = true
}
},
systemDefaultChange(idx, oidx, val) {
console.log(2)
const subject = this.subject[idx]
const {subjectType} = subject
if (val) {
subject.options.forEach(v => v.isSystemDefault = false)
subject.options[oidx].isSystemDefault = true
}
},
validate(fn) {
const that = this
// return new Promise((resolve, reject) => {
// const s = that.formData.subject.some(v => {
// if (!v.subjectName) return true
// return v.options.some(x => {
// if (!x.optionName) return true
// })
// })
// if (s) reject(false)
// resolve(true)
// })
if (this._validate()) {
return false
}
return true
},
_validate() {
return this.subject.some(v => {
if (!v.subjectName) return true
return v.options.some(x => {
if (!x.optionName) return true
})
})
},
openDescRichText(richText, sIdx, oIdx) {
this.richTextDialog = true
this.subjectIndex = sIdx
this.optionIndex = oIdx
this.$nextTick(() => {
/*if (questionRichTextEditor == null) {
questionRichTextEditor = new wangEditor('#descRichText')
questionRichTextEditor.create()
}
console.log(richText)
questionRichTextEditor.txt.clear()
questionRichTextEditor.txt.html(richText)*/
$("#descRichText").html("")
questionRichTextEditor = new wangEditor("#descRichText")
questionRichTextEditor.config.onchange = (html) => {
richText = (html ? html : "")
}
questionRichTextEditor.config.uploadImgShowBase64 = true
questionRichTextEditor.create()
if (richText) {
questionRichTextEditor.txt.html(richText)
}
})
},
getRichText() {
// console.log(this.subject[this.subjectIndex]['options'][this.optionIndex])
this.subject[this.subjectIndex]['options'][this.optionIndex].description = questionRichTextEditor.txt.html()
this.richTextDialog = false
},
async getShoppingType() {
const resp = await $.get("/platform/shoppingType/apply/getShoppingType", {typeName: "商超"})
this.shoppingTypeOptions = resp.data
}
},
created() {
this.getShoppingType()
}
}
</script>
<style scoped>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
/* width: 40px;
height: 40px;*/
/*line-height: 40px;*/
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 14px;
color: #8c939d;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
}
.el-upload el-upload--text {
width: 100px;
height: 100px;
}
.avatar {
width: 100px;
height: 80px;
display: block;
}
/*被拖拽对象的样式*/
.item {
padding: 6px;
background-color: #FFF;
border: solid 1px #eee;
margin-bottom: 10px;
cursor: move;
}
.item:hover {
/*background-color: #f1f1f1;*/
cursor: move;
}
/*选中样式*/
.chosen {
border: solid 1px #3089dc !important;
}
.s-title-wrap {
display: flex;
width: 100%;
overflow: hidden;
word-break: break-word;
white-space: nowrap;
}
.s-operation {
display: flex;
flex-wrap: wrap;
justify-content: start;
padding: 5px 0;
}
.s-operation > span {
display: flex;
height: 22px;
cursor: pointer;
color: #2672ff;
align-items: center;
justify-content: center;
}
.option-delete {
width: 80px;
text-align: center;
}
.s-operation i {
margin-right: 10px;
}
.text-input > input, .text-input > textarea {
resize: none;
overflow: hidden;
/*border: 1px dashed rgb(217, 217, 217);*/
border: none;
}
.avatar-delete {
font-size: 20px;
color: red;
}
</style>
@@ -0,0 +1,142 @@
<template>
<div>
<el-dialog :visible.sync="sendDialogVisible" title="发送通知" width="45%" :close-on-click-modal="false" @closed="sendDialogClose">
<el-form ref="sendForm" :model="formData" label-width="80px">
<el-form-item label="发送对象" prop="activityGroupId" :rules="[{required: true, message: '请选择发送对象', trigger: ['blur', 'change']}]">
<el-select @change="groupChange" :disabled="group_id" placeholder="请选择活动组别" clearable style="width: 100%" v-model="formData.activityGroupId">
<el-option :label="item.groupName"
:value="item.groupId"
v-for="item in activityGroupList"></el-option>
</el-select>
</el-form-item>
<el-form-item label="发送方式" prop="sendTypes" :rules="[{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}]">
<el-checkbox-group v-model="formData.sendTypes" size="medium">
<el-checkbox border label="1">短信发送</el-checkbox>
<el-checkbox border label="4">微信发送</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="发送内容" prop="content" :rules="[{required: true, message: '请选择发送内容', trigger: ['blur', 'change']}]">
<el-input
v-model="formData.content"
:rows="6"
placeholder="请输入内容"
type="textarea">
</el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="sendDialogVisible = false">取 消</el-button>
<el-button :disabled="!this.formData.activityGroupId" type="primary" @click="doSend()">发 送</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {
group_id: {
type: String, default: ''
},
},
model: {
},
data() {
return {
sendDialogVisible: false,
activityGroupList: [],
formData: {
sendTypes: [],
activityGroupId: '',
content: '',
},
}
},
watch: {
},
methods: {
sendDialogClose() {
if(this.$refs['sendForm']) {
this.$refs['sendForm'].resetFields()
}
},
openDialog(groupId) {
if(!groupId) {
this.$notify.warning({title: '警告', message: '您选择的活动没有发送对象!'})
return
}
this.group_id = groupId
if(groupId) {
this.formData.activityGroupId = Number(groupId)
}
this.sendDialogVisible = true
},
groupChange(val) {
},
async doSend() {
const valid = await this.$refs['sendForm'].validate()
if (!valid) return
const group = this.activityGroupList.find(o => o.groupId === this.formData.activityGroupId)
const groupName = group !== undefined ? group.groupName : ''
const confirm = await this.$confirm('您确定要给【' + groupName + '】发送通知吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm) {
const loading = this.$loading({
lock: true,
text: '正在发送...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
this.formData.activityGroupId = this.group_id
this.formData.flag = this.group_id
const resp = await $.post('/platform/msgNotify/send/sendMsgByGroupId', {
msgNotify: JSON.stringify(this.formData),
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg})
this.sendDialogVisible = false
} else {
this.$notify.warning({title: '警告', message: resp.msg})
}
loading.close()
}
},
async getActivityGroup() {
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = resp.data
},
async initData() {
await this.getActivityGroup()
},
},
computed: {
},
created() {
this.initData()
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,144 @@
<template>
<div>
<wp-upload :key="key" :url="uploadUrl"
:file-list="hxfileList"
:max-file-number="maxnum"
:allow-files="allowfiles"
:upload-auto="true"
upload-file-param="file"
@on-delete="onDelete"
@docexcel-preview="docexcelPreview"
@on-upload-after="uploadAfter">
</wp-upload>
</div>
</template>
<script>
const METHOD_NAME = "change"
module.exports = {
props: {
filex: {
type: String
},
resfile: {
type: 'Object',
default: () => {
}
},
allowfiles: {
type: 'Array',
default: () => []
},
maxnum: {
type: [String, Number]
}
},
watch: {
filex: {
handler(val) {
if (val) {
this.hxfileList.push({url: val})
}
},
immediate: true
},
resfile(val) {
this.hxfileList = [{url: FILE_DOMAIN + val}]
this.key = Math.random()
},
},
data() {
return {
key: Math.random(),
uploadUrl: '/platform/Common/uploadFile',
fileList: [],
filePath: '',
hxfileList: []
}
},
methods: {
uploadAfter({data, fileId}) {
if (data && data.code === 0) {
//fileId 文件的唯一ID 组件生成
this.resfile = {...data.data, fileId}
this.$emit('update:resfile', this.resfile.filepath)
}
},
onDelete(file) {
if (file.status === 2) {
for (let index in this.resfile) {
if (this.resfile[index].fileId === file.id) {
$.post('/platform/Common/deleteFile', {filepath: this.resfile[index].filepath})
this.resfile.splice(index, 1)
}
}
}
},
docexcelPreview(id) {
//61行的fileId
for (let index in this.resfile) {
if (this.resfile[index].fileId === id) {
window.open('/platform/base/Common/preview?filepath=' + this.resfile[index].filepath + '&fileid=' + this.resfile[index].id)
}
}
},
handleChange(file, fileList) {
const delFile = () => {
for (let i = 0; i < fileList.length; i++) {
for (let i = 0; i < fileList.length; i++) {
if (file === fileList[i]) {
fileList.splice(i, 1);
}
}
}
if (this.size === 0) {
this.$message.warning("您选择的是空文件!");
delFile()
}
if (!uploadFileType.includes(file.name.split('.')[1])) {
this.$message.warning("文件格式不支持!");
delFile()
}
let formData = new FormData()
formData.append("file", file.raw, file.raw.name);
$.ajax({
url: "/platform/Common/uploadFile",
type: "post",
data: formData,
processData: false,
contentType: false,
success: (res) => {
const {code, data, msg} = res
if (code == 0) {
file.v = data
//this.$emit(METHOD_NAME, data)
this.$emit('update:' + METHOD_NAME, data)
}
},
error: res => {
const {code, data, msg} = res
this.$message.error(msg);
}
});
}
},
handleRemove(file, fileList) {
if (file.v) {
$.post('/platform/Common/deleteFile', {filepath: file.v.filepath})
for (let index in this.resfile) {
if (this.resfile[index].filepath === file.v.filepath) {
this.resfile.splice(index, 1)
}
}
}
},
}
}
</script>
<style>
</style>
@@ -0,0 +1,671 @@
<template>
<div>
<el-upload :key="key"
:action="FILE_UPLOAD_ADDRESS"
limit="1" :before-upload="beforeUpload"
list-type="picture-card" :file-list="fileList" :on-success="onSuccess">
<i slot="default" class="el-icon-plus"></i>
<div slot="file" slot-scope="{file}">
<template v-if="resolvingShowByFileName(file.data.filepath) == 1">
<el-image
style="width: 100px; height: 100px"
:src="getFileItemShowIcon(file.data.filepath)"
fit="cover"></el-image>
<!-- <img class="show-img" :src="getFileItemShowIcon(file.filepath)" :alt="file.filename"/>-->
</template>
<template v-else>
<svg aria-hidden="true" style="width: 100px; height: 100px">
<use :xlink:href="getFileItemShowIcon(file.data.filepath)"></use>
</svg>
</template>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="showSource(file.data)"
>
<i class="el-icon-zoom-in"></i>
</span>
<span
class="el-upload-list__item-delete"
@click="handleDownload(file)"
>
<i class="el-icon-download"></i>
</span>
<span
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete"></i>
</span>
</span>
</div>
</el-upload>
</div>
</template>
<script>
/**
* 文件类型解析
* @type {{isImg: wpUploadFileTypeResolve.isImg}}
*/
let fileTypeResolving = {
/**
* 是否是一张图片
*/
isImg: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /image\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isImgByName: function (fileItemName) {
let checkSuffixArray = ['jpg', 'png', 'jpeg', 'bmp', 'gif', 'webp', 'tif', 'svg', 'wmf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是视频
*/
isVideo: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /video\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isVideoByName: function (fileItemName) {
let checkSuffixArray = ['mp4', 'Ogg', 'webm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是音频
*/
isAudio: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /audio\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isAudioByName: function (fileItemName) {
let checkSuffixArray = ['mp3', 'ogg', 'wav'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是doc文件
*/
isDoc: function (fileItemName) {
let checkSuffixArray = ['doc', 'docx', 'dot', 'dotx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是excel文件
*/
isExcel: function (fileItemName) {
let checkSuffixArray = ['xls', 'xlsx', 'csv', 'xlt', 'xltx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是PPT文件
*/
isPPT: function (fileItemName) {
let checkSuffixArray = ['ppt', 'pptx', 'pot', 'potx', 'odp'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是Pdf文件
*/
isPdf: function (fileItemName) {
let checkSuffixArray = ['pdf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是压缩文件
* @param fileItem
* @returns {boolean}
*/
isZip: function (fileItemName) {
let checkSuffixArray = ['zip', '7z', 'war', 'tar', 'rar', 'jar', 'zipx', 'zix', 'zoo'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isWeb: function (fileItemName) {
let checkSuffixArray = ['html', 'htm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isTxt: function (fileItemName) {
let checkSuffixArray = ['txt'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isPsd: function (fileItemName) {
let checkSuffixArray = ['psd'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isCad: function (fileItemName) {
let checkSuffixArray = ['cad'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isIso: function (fileItemName) {
let checkSuffixArray = ['iso'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isExe: function (fileItemName) {
let checkSuffixArray = ['exe'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 根据文件类型来解析
* @param fileType 文件类型
* @param checkTypeModel 文件类型模型,如:image\/(\w)*
* @returns {boolean}
*/
resolvingByType: function (fileType, checkTypeModel) {
if (checkTypeModel.test(fileType)) {
return true;
}
return false;
},
/**
* 根据名字和名字后缀名来验证文件
* @param fileName 文件名
* @param checkSuffixArray 文件类型包含的后缀
*/
resolvingByName: function (fileName, checkSuffixArray) {
let suffixName = wpUploadFileTools.getSuffixNameByFileName(fileName);
// 名字是否有效
if (!wpUploadDataValid.isValidStr(suffixName)) {
// 无效直接返回false
return false;
}
suffixName = suffixName.trim();
suffixName = suffixName.toLowerCase();
if (checkSuffixArray.indexOf(suffixName) != -1) {
return true;
}
return false;
}
}
/**
* 文件工具
* @type {{}}
*/
let wpUploadFileTools = {
/**
* 获取文件显示模版
* @param fileItem
*/
wapFileItemShow: function (fileItem) {
return wpUploadFileTools.wapFileItemShowBase(fileItem, false);
},
/**
* 包装已上传的文件列表
*/
wapFileItemShowWithUpload(uploadFile) {
return wpUploadFileTools.wapFileItemShowBase(uploadFile, true);
},
/**
* 获取文件显示的基本操作
*/
wapFileItemShowBase(fileItem, isUploaded = false) {
let fileName = "";
let suffix = "";
let show = "";
let showIcon = "";
if (!isUploaded) {
fileName = fileItem.name;
suffix = wpUploadFileTools.getSuffixNameByFileName(fileName);
show = wpUploadFileTools.resolvingShow(fileItem);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem, false);
} else {
fileName = fileItem.name ? fileItem.name : wpUploadFileTools.resolvingUrlFileName(fileItem.url);
let fileNameGetOFuRL = wpUploadFileTools.resolvingUrlFileName(fileItem.url);
suffix = wpUploadFileTools.getSuffixNameByFileName(fileNameGetOFuRL);
show = wpUploadFileTools.resolvingShowByFileName(fileNameGetOFuRL);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem.url, true);
}
let fileItemShow = {
// 文件的id
id: wpUploadFileTools.uuid(),
// 文件对象
file: null,
// 文件的类型
type: null,
// 文件的大小
size: null,
// 文件的名字
name: fileName,
// 文件地址
url: null,
// 后缀
suffix: suffix,
// 显示的类型
show: show,
// 显示的图标或者图片地址
showIcon: showIcon,
// 显示进度条
processStatus: {
show: false,
width: 0,
isFail: false
},
// 文件来源,0选择文件上传,1回显文件
fileSource: 0,
// 状态0未上传,失败也会转到0,1正在上传,2已经上传
status: 0,
// 上传文件的描述
fileDes: null
}
if (!isUploaded) {
// 如果非选择文件下面三个属性为null
fileItemShow.file = fileItem;
fileItemShow.type = fileItem.type;
fileItemShow.size = fileItem.size;
} else {
// 文件描述
fileItemShow.status = 2;
fileItemShow.fileDes = fileItem;
fileItemShow.fileSource = 1;
fileItemShow.url = fileItem.url;
}
return fileItemShow;
},
/**
* 解析URL的文件名字
*/
resolvingUrlFileName: function (fileUrl) {
let index = fileUrl.lastIndexOf("/");
if (index <= 0) {
index = fileUrl.lastIndexOf("\\");
}
index = index + 1;
let fileName = fileUrl.substring(index, fileUrl.length);
return fileName;
},
/**
* 获取文件名后缀
* @param fileName 文件名全名
* */
getSuffixNameByFileName: function (fileName) {
let str = fileName;
let index = str.lastIndexOf(".");
if (index < 0) {
return "";
}
let pos = index + 1;
return str.substring(pos, str.length);
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShow: function (fileItem) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImg(fileItem)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideo(fileItem)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudio(fileItem)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItem.name)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItem.name)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItem.name)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItem.name)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItem.name)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItem.name)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItem.name)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItem.name)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItem.name)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItem.name)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItem.name)) {
showResult = 14;
}
return showResult
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName: function (fileItemName) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 生成UUID
* @returns {string}
*/
uuid: function () {
let str = wpUploadFileTools.uuidFull();
str = str.replace(/-/g, "");
return str;
},
uuidFull() {
let s = []
let hexDigits = "0123456789abcdef"
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = "4"
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
s[8] = s[13] = s[18] = s[23] = "-"
let uuid = s.join("")
return uuid
},
/**
* 禁止某个dom的某个事件
*/
disableObjEvent(domObj, eventName) {
domObj.addEventListener(eventName, function (e) {
e.preventDefault();
})
}
}
/**
* 数据验证工具
* @type {{isValid: wpUploadDataValid.isValid}}
*/
let wpUploadDataValid = {
isValid: function (obj) {
if (undefined === obj || null === obj) {
return false;
}
return true;
},
isValidStr: function (str) {
let isValidObj = wpUploadDataValid.isValid(str);
if (!isValidObj) {
return isValidObj;
}
str = str.trim();
if ("" == str || '' == str) {
return false;
}
return true;
},
isValidArray(array) {
if (null == array || array == undefined || array.length <= 0) {
return false;
}
return true;
}
}
module.exports = {
props: {
files: Array,
type: {
type: Array,
default: ['jpg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'pdf']
},
max_size: {
type: Number,
default: 5 * 1024 * 1024
},
view: {
type: Boolean,
default: false
}
},
watch: {
files(val) {
this.updateFileList(val)
this.key = Math.random()
}
},
data() {
return {
key: Math.random(),
dialogImageUrl: '',
dialogVisible: false,
fileList: []
}
},
methods: {
/**
* 查看资源
*/
showSource(showItem) {
const show = this.resolvingShowByFileName(showItem.filepath)
if (show == 1 || show == 2 || show == 3) {
dd3s.showpic(showItem.filepath)
} else if (show == 4 || show == 5) {
dd3s.preview(showItem.filepath, showItem.id)
}
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName(fileItemName) {
// 默认0普通文件
let showResult = 0;
if (fileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (fileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (fileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (fileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (fileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (fileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (fileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (fileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (fileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (fileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (fileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (fileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (fileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (fileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 获取文件显示图标
* @param filePath
* @returns {string}
*/
getFileItemShowIcon(filePath) {
let showIcon = '';
switch (this.resolvingShowByFileName(filePath)) {
case 0:
showIcon = "#icon-yunpanlogo-3";
break;
// 图片
case 1:
showIcon = this.getImgShowIcon(filePath);
break;
// 视频
case 2:
showIcon = "#icon-yunpanlogo-6";
break;
// 音乐
case 3:
showIcon = "#icon-yunpanlogo-4";
break;
// doc
case 4:
showIcon = "#icon-yunpanlogo-2";
break;
// excel
case 5:
showIcon = "#icon-yunpanlogo-";
break;
// ppt
case 6:
showIcon = "#icon-yunpanlogo-1";
break;
// pdf
case 7:
showIcon = "#icon-yunpanlogo-12";
break;
// zip
case 8:
showIcon = "#icon-yasuobao";
break;
// web文件
case 9:
showIcon = "#icon-yunpanlogo-5";
break;
// txt文件
case 10:
showIcon = "#icon-yunpanlogo-7";
break;
// PSD
case 11:
showIcon = "#icon-yunpanlogo-10";
break;
// cad
case 12:
showIcon = "#icon-yunpanlogo-11";
break;
// ISO
case 13:
showIcon = "#icon-yunpanlogo-8";
break;
// 可执行
case 14:
showIcon = "#icon-yunpanlogo-9";
break;
// 普通文件
default:
showIcon = "#icon-yunpanlogo-3";
}
return showIcon;
},
/**
* 获取图片的显示图标
* @param fileItem
* @returns {string|*}
*/
getImgShowIcon(fileItem) {
return FILE_DOMAIN + fileItem;
},
updateFileList(val) {
if (!val || !val.length) {
this.fileList = []
return
}
this.fileList = val.map(v => {
return {data: v, uid: v.id, name: v.filename, url: FILE_DOMAIN + v.filepath, status: 'success'}
})
},
change() {
this.$emit("update:files", this.fileList.map(v => v.data))
},
onSuccess(response, file, fileList) {
const {data} = response
file.data = data
this.fileList = fileList
this.change()
},
beforeUpload(file) {
const type = this.type.includes(file.name.split('.')[1].toLowerCase());
const size = file.size < this.max_size;
if (!type) {
this.$message.warning(`上传文件只能是 ${this.type.map(v => v.toUpperCase()).join("/")} 格式!`);
}
if (!size) {
this.$message.warning(`上传文件大小不能超过 ${this.max_size / 1024 / 1024} MB!`);
}
return type && size;
},
handleRemove(file) {
if (file.data) {
const {filename, filepath} = file.data
$.post(FILE_DELETE_ADDRESS, {filepath})
this.fileList.splice(this.fileList.findIndex(v => v == file), 1)
this.change()
}
},
handleDownload(file) {
const {filepath, filename} = file.data
if (filepath && filename) {
dd3s.download(filepath, filename)
}
}
},
created() {
this.updateFileList(this.files)
}
}
</script>
<style>
.el-upload--picture-card, .el-upload-list--picture-card .el-upload-list__item {
width: 100px;
height: 100px;
}
.el-upload--picture-card {
line-height: 110px;
}
.el-upload-list--picture-card .el-upload-list__item-actions span + span {
margin-left: 5px;
}
.el-upload-list--picture-card .el-upload-list__item-actions {
font-size: 16px;
}
</style>
@@ -0,0 +1,120 @@
<template>
<div class="v-tree-layout">
<div class="shrink" :style="'left:'+(showTree?'calc(20% - 15px)':'0')" @click="shrink">
<i v-if="!showTree" class="el-icon-arrow-right"></i>
<i v-else class="el-icon-arrow-left"></i>
</div>
<div class="v-tree-layout-left">
<slot name="tree"></slot>
</div>
<div class="v-tree-layout-right">
<slot></slot>
</div>
</div>
</template>
<script>
module.exports = {
props: {},
data() {
return {
showTree: true,
}
},
methods: {
shrink() {
if (this.showTree) {
$(".v-tree-layout-left").width(0)
$(".v-tree-layout-right").width('100%')
this.showTree = false
} else {
$(".v-tree-layout-left").width('20%')
$(".v-tree-layout-right").width('80%')
this.showTree = true
}
},
},
}
</script>
<style>
.shrink {
position: absolute;
height: 30px;
width: 30px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 15px;
background-color: white;
z-index: 99;
top: 0;
bottom: 0;
margin: auto;
box-shadow: 0 0 5px rgb(200, 200, 200);
cursor: pointer;
transition: all 500ms;
}
.shrink:hover {
box-shadow: 0 0 10px rgb(150, 150, 150);
}
.v-tree-layout-left::-webkit-scrollbar { /*滚动条整体样式*/
width: 4px; /*高宽分别对应横竖滚动条的尺寸*/
height: 10px;
}
.v-tree-layout-left::-webkit-scrollbar-thumb { /*滚动条里面小方块*/
border-radius: 10px;
background: #dcdcdc;
}
.v-tree-layout-left::-webkit-scrollbar-track { /*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px transparent;
border-radius: 10px;
background: transparent;
}
.v-tree-layout {
width: 100%;
height: 100%;
position: relative;
display: flex;
flex-direction: row;
}
.v-tree-layout-left {
width: 20%;
}
.v-tree-layout-left, .v-tree-layout-left .el-tree {
background-color: #FFFFFF;
}
.v-tree-layout-right {
width: 80%;
border-left: 1px solid rgb(240, 240, 240);
}
.v-tree-layout-left, .v-tree-layout-right {
height: 100%;
box-sizing: border-box;
overflow: auto;
transition: all 500ms;
position: relative;
}
</style>
@@ -0,0 +1,95 @@
/**
*Desc:
*Create by: jug
*Create time:2023/6/8/10:29
*/
<template>
<div style="margin: 10px 0">
<!-- <vi-title style="display:flex;align-items: center;margin:10px 0" title="过滤条件匹配:"></vi-title>-->
<enum-select v-model="matchMethod" :clearable="false" enum="MatchMethod" label="description"
style="width: 300px"
value="name"></enum-select>
<div v-for="(r,index) in rules" :key="r.name +index" style="margin: 5px 0">
<div style="display: flex;column-gap: 10px">
<el-select v-model="r.name" clearable filterable placeholder="请选择字段">
<el-option
v-for="column in columnInfos"
:key="column.COLUMN_NAME"
:label="column.COLUMN_COMMENT"
:value="column.COLUMN_NAME">
</el-option>
</el-select>
<el-select v-model="r.cnd" clearable filterable placeholder="请选择条件">
<el-option
v-for="column in cnds"
:key="column.value"
:label="column.description"
:value="column.value">
</el-option>
</el-select>
<div style="width: 300px">
<el-input v-model="r.value" placeholder="请输入值"></el-input>
</div>
<div class="start" style="display: flex;align-items: center;column-gap: 10px;">
<el-button type="danger" @click="rules.splice(index,1)">-</el-button>
</div>
</div>
</div>
<el-button size="small" type="primary" @click="rules.push({})">添加条件</el-button>
</div>
</template>
<script>
module.exports = {
name: "UserCnd",
props: {},
components: {'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),},
data() {
return {
columnInfos: [],
rules: [
{}
],
cnds: [
{value: "=", desc: "等于"},
{value: "!=", desc: "不等于"},
],
matchMethods: [],
matchMethod: "AND"
}
},
watch: {
matchMethod(val) {
this.$emit('cnd', {matchMethod: val, rules: this.rules})
},
rules(val) {
this.$emit('cnd', {matchMethod: this.matchMethod, rules: val})
}
},
methods: {
async getColumnInfo() {
const {data, msg, code} = await $.post('/platform/activity/basic/scope/getUserTableColumnInfo')
if (code !== 0) {
this.$notify.warning(msg)
return
}
this.columnInfos = data
}
},
created() {
this.getColumnInfo()
getEnumOptions('MatchMethod').then(res => this.matchMethods = res)
getEnumOptions('ConditionalOperational').then(res => this.cnds = res)
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,496 @@
<template>
<div>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">活动分组:</div>
<div class="search-item-option">
<el-select placeholder="活动分组" v-model="pageForm.groupId"
style="width: 100%;"
@change="doSearch();viewGroupName()"
filterable>
<el-option v-for="item in activityGroupList" :label="item.groupName"
:value="item.groupId"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
style="width: 100%"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item"
v-if="is_sysadmin||is_A06||is_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"
@change="doSearch"
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"
v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.activityUnionId"
style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<el-option v-for="item in ActivityUnions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item" v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.activityUnitId"
style="width: 100%;"
clearable="true"
@change="doSearch"
filterable="true">
<el-option v-for="item in ActivityUnits" :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">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
@change="doSearch"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
@change="doSearch"
code="UserState"></dict-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :label="currentGroupName" :app="this">
<template #label_end>
<!-- <span class="text-danger pl5">提醒:删除活动分组操作,请先选择某个活动分组后,再点击右边的删除按钮。</span>-->
</template>
<template #func>
<el-button v-if="is_sysadmin||is_A06"
type="primary" size="medium" icon="el-icon-printer" @click="dialogVisible = true">
导入XLSX查询
</el-button>
<el-button @click="doExportUser" icon="el-icon-printer"
size="medium" type="primary" :disabled="!pageForm.groupId">
导出活动分组人员xlsx
</el-button>
<el-button @click="doDelete(null,pageForm.groupId)"
type="danger"
size="medium" :disabled="tableData.length===0">
删除{{ currentGroupName }}
</el-button>
</template>
</table-tool>
<el-table ref="userTable" :data="tableData" stripe border :size="tableSize" @sort-change="pageOrder">
<el-table-column type="index" label="序号" width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100">
<template scope="{row}">
<el-button size="mini" type="danger" @click="doDelete(row.id,null)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[5,10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
<el-dialog title="人员导入" :visible.sync="dialogVisible" width="50%" :close-on-click-modal="false" append-to-body>
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type=""
@click="window.open('/platform/activity/basic/user/downloadImport')"
icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload"
style="width: 200px">选择文件
</el-button>
<div class="el-upload__tip" slot="tip" style="color: #F56C6C">
只能上传 xls/xlsx 文件
</div>
</el-upload>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="导入结果">
<el-card shadow="never">
<p>总记录数:{{ errorInfoData.totalCount }}</p>
<p>成功数:<span class="text-success">{{ errorInfoData.successCount }}</span></p>
<p>错误数:<span class="text-danger">{{ errorInfoData.errorCount }}</span></p>
<el-link @click="exportErrors" type="primary" v-if="errorInfoData.errorCount>0">下载错误记录
</el-link>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false" type="primary"
:disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="clearSearchCnd"
:loading="importLoading">清空查询条件</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">核对人员</el-button>
<el-button type="primary" @click="doImportSearch"
:loading="importLoading">查询人员</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {
group_id: {
type: String, default: ''
}
},
computed: {
is_H10() {
return this.roleData.is_H10
},
is_A06() {
return this.roleData.is_A06
},
is_H04() {
return this.roleData.is_H04
},
is_H02() {
return this.roleData.is_H02
},
is_H03() {
return this.roleData.is_H03
},
is_sysadmin() {
return this.roleData.is_sysadmin
},
unionid() {
return this.roleData.unionid
},
},
data() {
return {
activityGroupList: [],
ActivityUnions: [],
ActivityUnits: [],
unions: [],
units: [],
pageForm: {
unionId: "",
unitId: "",
searchName: "username",
personTypes: [],
userStates: [],
memberStatus: [],
year: moment().format('YYYY')
},
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true},
{prop: 'birthday', label: '出生年月'},
{prop: 'mobile', label: '联系电话'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'unionName', label: '所属工会', sortable: true},
{prop: 'activityUnionName', label: '活动工会', sortable: true},
{prop: 'groupName', label: '所属分组', sortable: true},
],
roleData: {},
currentGroupName: null,
errorInfoData: {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0,
},
dialogVisible: false,
importLoading: false,
importData: {
fileList: [],
},
successUserIdList: []
}
},
mixins: [initTableMixins],
components: {
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'file-import': httpVueLoader('/components/plugins/FileImport.vue')
},
methods: {
clearSearchCnd() {
this.importData = {
fileList: [],
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: [],
}
this.pageForm.userIds = []
this.successUserIdList = []
this.doSearch()
this.dialogVisible = false;
$.get('/platform/activity/basic/user/clearSearchCnd', {existsLoginNameRedisKey: this.pageForm.existsLoginNameRedisKey}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
},
doImportSearch() {
this.doSearch()
this.dialogVisible = false
},
exportErrors() {
const data = this.errorInfoData.errorList
// 创建工作簿
const workbook = XLSX.utils.book_new();
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(data);
// 将工作表添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
// 将工作簿转换为二进制对象
const excelBuffer = XLSX.write(workbook, {bookType: 'xlsx', type: 'array'});
// 将二进制对象转换为Blob对象
const blob = new Blob([excelBuffer], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
// 创建下载链接并设置相关属性
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '核对记录.xlsx';
// 模拟点击下载链接
document.body.appendChild(link);
link.click();
// 清理下载链接
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
},
doImport() {
if (this.importData.fileList.length === 0) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
data.append("groupId", this.pageForm.groupId)
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: "/platform/activity/basic/user/doImport",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
this.importLoading = false
if (data.code === 0) {
this.notifySuccess("核对成功")
this.errorInfoData = data.data
} else {
this.notifyWarning("核对失败")
}
this.errorInfoData = data.data
this.pageForm.existsLoginNameRedisKey = data.data.existsLoginNameRedisKey
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
},
viewGroupName() {
if (this.pageForm.groupId) {
const group = this.activityGroupList.find(v => v.groupId === this.pageForm.groupId)
this.currentGroupName = group.groupName + '人员'
return
}
this.currentGroupName = '全部人员'
},
doExportUser() {
window.open("/platform/activity/basic/user/doExportUser?groupId=" + this.pageForm.groupId)
},
doSearch2() {
this.getActivityGroup()
this.doSearch()
},
async doDelete(id, groupId) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
this.pageForm.id=id
this.pageForm.groupId=groupId
const resp = await $.post('/platform/activity/basic/user/doDelete', this.pageForm)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$set(this.pageForm, "groupId", null)
this.doSearch()
await this.getActivityGroup()
this.$emit('group_change')
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (this.is_A06 || this.is_sysadmin || this.is_H03) {
this.units = await getUnits(this.pageForm.unionId)
this.ActivityUnits = await getActivityUnits(this.pageForm.activityUnionId)
} else {
this.units = await getUnits(this.unionid)
}
},
async getActivityGroup() {
this.pageForm.groupId = ''
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = resp.data
if (resp.data && resp.data.length > 0) {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
}
await this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
async pageData() {
sublime.showLoadingbar()
const resp = await $.post('/platform/activity/basic/user/pageData', this.pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
}
sublime.closeLoadingbar()
},
async getRolesAndUnion() {
const {data} = await $.post("/platform/activity/basic/scope/getRolesAndUnion")
this.roleData = data
}
},
async created() {
this.unions = await getUnions(null)
this.ActivityUnions = await getActivityUnions()
await this.flushUnits()
await this.getActivityGroup()
this.viewGroupName()
await this.getRolesAndUnion()
}
}
</script>
@@ -0,0 +1,915 @@
<template>
<div>
<template>
<el-card shadow="never">
<el-row class="query-row">
<el-col class="query-title">姓名/工号:</el-col>
<el-select clearable
v-model="pageForm.userId" filterable remote collapse-tags
placeholder="输入工号或者姓名查找" :remote-method="queryUser" @change="doSearch"
style="width: 100%"
multiple>
<el-option v-for="o in userList"
:label="o.username+'('+o.loginname+')-'+o.unitname" :value="o.id"
:key="o.id"></el-option>
</el-select>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H02===true">
<el-col class="query-title hidden-xs-only">会员类型:</el-col>
<el-col class="query-content">
<el-tag
:effect="pageForm.memberTypes.includes(item.name)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagClick('memberTypes',item.name)"
style="margin-right: 10px;cursor: pointer"
v-for="item in memberTypeOptions">
{{ item.name }}
</el-tag>
</el-col>
</el-row>
<el-row class="query-row">
<el-col class="query-title hidden-xs-only">性别:</el-col>
<el-col class="query-content">
<el-tag
:effect="pageForm.sexTypes.includes(item.name)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagClick('sexTypes',item.name)"
style="margin-right: 10px;cursor: pointer"
v-for="item in sexTypeOptions">
{{ item.name }}
</el-tag>
</el-col>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true">
<el-col class="query-title">人员类型:</el-col>
<el-col class="query-content">
<el-tag
:effect="pageForm.personTypes.includes(item.name)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagClick('personTypes',item.name)"
style="margin-right: 10px;cursor: pointer"
v-for="item in personTypeOptions">
{{ item.name }}
</el-tag>
<el-link :underline="false" @click="pageForm.personTypes=[];doSearch()"
type="danger"
v-if="personTypeOptions.length&&pageForm.personTypes.length">清空
</el-link>
<el-link :underline="false"
@click="pageForm.personTypes=personTypeOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true">
<el-col class="query-title">在职状态:</el-col>
<el-col class="query-content">
<el-tag
:effect="pageForm.userStates.includes(item.name)?'dark':'plain'"
:key="item.code"
:type="item.name"
@click="tagClick('userStates',item.name)"
style="margin-right: 10px;cursor: pointer"
v-for="item in userStateOptions">
{{ item.name }}
</el-tag>
<el-link :underline="false" @click="pageForm.userStates=[];doSearch()"
type="danger"
v-if="userStateOptions.length&&pageForm.userStates.length">清空
</el-link>
<el-link :underline="false"
@click="pageForm.userStates=userStateOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true">
<el-col class="query-title">部门查询:</el-col>
<el-col class="query-content">
<el-row :gutter="20">
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select @change="flushUnits();doSearch()"
@clear="flushUnits();doSearch()"
:clearable="is_H10===true||is_A06===true||is_sysadmin===true"
filterable="true"
placeholder="所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select @change="doSearch" @clear="doSearch" clearable="true"
filterable="true"
placeholder="所属单位"
style="width: 100%"
v-model="pageForm.unitId">
<el-option :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<template v-if="is_H10===true||is_A06===true||is_sysadmin===true">
<!--<el-row class="query-row">
<el-col class="query-title">活动部门:</el-col>
<el-col class="query-content">
<el-row :gutter="20">
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select @change="flushUnits();doSearch()" @clear="flushUnits();doSearch()"
:clearable="is_A06===true||is_sysadmin===true"
filterable="true"
placeholder="所属工会" style="width: 100%"
v-model="pageForm.activityUnionId">
<el-option :label="item.unionname" :value="item.id"
v-for="item in activityUnions"></el-option>
</el-select>
</el-col>
<el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
<el-select @change="doSearch" @clear="doSearch" clearable="true"
filterable="true"
placeholder="所属单位"
style="width: 100%"
v-model="pageForm.activityUnitId">
<el-option :label="item.name" :value="item.id"
v-for="item in activityUnits"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>-->
<el-row class="query-row">
<el-col class="query-title">系统角色:</el-col>
<el-col class="query-content">
<el-row :gutter="20">
<el-col :span="6">
<el-select @change="getRoleListByMenuId" v-model="pageForm.module"
clearable
filterable
style="width: 100%" placeholder="请选择角色所属的系统">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in menuOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="6" v-if="relatedSessionMenus.includes(pageForm.module)">
<el-select filterable
placeholder="届次"
style="width: 100%"
:disabled="!relatedSessionMenus.includes(pageForm.module)"
v-model="pageForm.teacherMeetingId">
<el-option :key="item.id" :label="item.name"
:value="item.id"
v-for="item in meetingOptions">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select
@change="doSearch" clearable filterable
placeholder="请选择角色"
multiple
style="width: 100%"
v-model="pageForm.roleIds">
<el-option :label="item.name" :value="item.id"
v-for="item in roleList"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
</template>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H02===true">
<el-col class="query-title">协会:</el-col>
<el-col class="query-content">
<el-select v-model="pageForm.clubId" placeholder="请选择协会" @change="doSearch"
filterable
:clearable="is_H10===true||is_A06===true||is_sysadmin===true||(is_H04===true&&is_H02===true)"
style="width: 100%">
<el-option
v-for="item in clubOptions"
:key="item.stid"
:label="item.name"
:value="item.stid">
</el-option>
</el-select>
</el-col>
</el-row>
<el-row class="query-row">
<el-col class="query-title">活动组别:</el-col>
<el-col class="query-content">
<el-select @change="doSearch()" placeholder="请选择活动组别范围之外的人员" clearable
style="width: 100%" v-model="pageForm.activityGroupId">
<el-option :label="item.groupName"
:value="item.groupId"
v-for="item in activityGroupList2"></el-option>
</el-select>
</el-col>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true">
<el-col class="query-title">年龄范围:</el-col>
<el-col class="query-content">
<el-row type="flex" style="align-items: center">
<el-col :span="15">
<el-slider
v-model="pageForm.age"
range
show-stops
:max="100">
</el-slider>
</el-col>
<el-col :span="9" class="pl20">
当前范围:{{ pageForm.age }}
</el-col>
</el-row>
</el-col>
</el-row>
<el-row class="query-row"
v-if="is_H10===true||is_A06===true||is_sysadmin===true||is_H04===true">
<el-col class="query-title">条件匹配:</el-col>
<el-col class="query-content">
<user-cnd @cnd="(v)=>{this.$set(this.pageForm,'activityUserCnd',v)}"></user-cnd>
</el-col>
</el-row>
<el-row class="query-row" style="justify-content: end">
<el-checkbox v-model="pageForm.reverseSelection" label="是否反选" border
@change="doSearch"
class="reverseCheckBox"></el-checkbox>
<el-button type="danger" icon="el-icon-circle-close" @click="doReset">重置
</el-button>
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="筛选人员">
<template #func>
<el-button v-if="is_sysadmin||is_A06"
type="primary" size="medium" icon="el-icon-printer" @click="dialogVisible = true">
导入XLSX设置分组
</el-button>
<el-button @click="doExportUser"
size="medium"
type="primary" icon="el-icon-download">
导出查询人员
</el-button>
<el-button @click="setDialogVisible=true"
size="medium"
type="primary">
设置为活动人员
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" border
ref="userTable" stripe>
<el-table-column label="序号" type="index" width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
></el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
layout="total, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
<el-dialog :visible.sync="setDialogVisible" title="设置活动人员" width="45%" :append-to-body="true"
:close-on-click-modal="false">
<el-form :model="formData" :rules="rules" label-width="100px" ref="setForm">
<el-form-item label="添加方式" prop="setGroupType">
<el-radio-group size="small" v-model="formData.setGroupType">
<el-radio :label="1">添加至原有分组</el-radio>
<el-radio :label="2">添加到新分组</el-radio>
</el-radio-group>
</el-form-item>
<el-row v-if="formData.setGroupType===1">
<el-form-item label="原有分组" prop="setGroupId">
<el-radio-group size="small" v-model="formData.setGroupId">
<el-radio :disabled="item.groupId!=pageForm.activityGroupId" :label="item.groupId"
border v-for="item in activityGroupList">
{{ item.groupName }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-row v-if="formData.setGroupType===2">
<el-form-item label="新分组" prop="setGroupName">
<el-input placeholder="请输入新分组名称" v-model="formData.setGroupName"></el-input>
</el-form-item>
</el-row>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="setDialogVisible = false">取 消</el-button>
<el-button @click="doSetActivityUser" type="primary"
v-loading="settingLoading">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="人员导入" :visible.sync="dialogVisible" width="50%" :close-on-click-modal="false" append-to-body>
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type=""
@click="window.open('/platform/activity/basic/user/downloadImport')"
icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload"
style="width: 200px">选择文件
</el-button>
<div class="el-upload__tip" slot="tip" style="color: #F56C6C">
只能上传 xls/xlsx 文件
</div>
</el-upload>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="导入结果">
<el-card shadow="never">
<p>总记录数:{{ errorInfoData.totalCount }}</p>
<p>成功数:<span class="text-success">{{ errorInfoData.successCount }}</span></p>
<p>错误数:<span class="text-danger">{{ errorInfoData.errorCount }}</span></p>
<el-link @click="exportErrors" type="primary" v-if="errorInfoData.errorCount>0">下载错误记录
</el-link>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false" type="primary"
:disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="clearSearchCnd"
:loading="importLoading">清空查询条件</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">核对人员</el-button>
<el-button type="primary" @click="doImportSearch"
:loading="importLoading">查询人员</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {},
model: {},
mixins: [initTableMixins],
data() {
return {
userList: [],
clubOptions: [],
settingLoading: false,
setDialogVisible: false,
setGroupType: null,
setGroupId: null,
setGroupName: null,
personTypeOptions: [],
userStateOptions: [],
activityGroupList: [],
activityGroupList2: [],
memberTypeOptions: [{
code: 'unionMember',
name: '工会会员'
}, {
code: 'welfareMember',
name: '福利会员'
}, {
code: 'sickFundMember',
name: '基金会员'
}],
sexTypeOptions: [
{code: '男', name: '男'},
{code: '女', name: '女'}
],
pageForm: {
age: [0, 0],
unionId: '',
unitId: '',
clubId: '',
searchName: "u.username",
personTypes: [],
userStates: [],
memberStatus: [],
memberTypes: [],
sexTypes: [],
minAge: 0,
maxAge: 0,
year: moment().format('YYYY'),
module: '',
teacherMeetingId: '',
activityGroupId: '',
roleIds: [],
userId: [],
activityUserCnd: '',
reverseSelection: false
},
activityUnions: [],
unions: [],
units: [],
activityUnits: [],
menuOptions: [],
meetingOptions: [],
roleList: [],
tableHeight: '0px',
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'birthday', label: '出生年月', sortable: true},
{prop: 'age', label: '年龄', sortable: true},
{prop: 'mobile', label: '联系电话'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'unionName', label: '所属工会', sortable: true},
// {prop: 'activityUnionName', label: '活动工会', sortable: true},
],
rules: {
setGroupType: [{required: true, message: '请选择添加方式', trigger: ['blur', 'change']}],
setGroupId: [{required: true, message: '请选择分组', trigger: ['blur', 'change']}],
setGroupName: [{required: true, message: '请输入分组名称', trigger: ['blur', 'change']}]
},
relatedSessionMenus: ['aca4d14498c145ceb5b24ed70776aae2', '733d7266652740a3aeac9da97ab5eeca', 'fe2d0768e26d4a80beeb159306bb8d01'],
roleData: {},
dialogVisible: false,
importLoading: false,
importData: {
fileList: [],
},
errorInfoData: {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0,
},
}
},
computed: {
is_H10() {
return this.roleData.is_H10
},
is_A06() {
return this.roleData.is_A06
},
is_H04() {
return this.roleData.is_H04
},
is_H02() {
return this.roleData.is_H02
},
is_sysadmin() {
return this.roleData.is_sysadmin
},
unionid() {
return this.roleData.unionid
},
},
components: {
'user-cnd': httpVueLoader('/components/plugins/UserCnd.vue'),
},
methods: {
exportErrors() {
const data = this.errorInfoData.errorList
// 创建工作簿
const workbook = XLSX.utils.book_new();
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(data);
// 将工作表添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
// 将工作簿转换为二进制对象
const excelBuffer = XLSX.write(workbook, {bookType: 'xlsx', type: 'array'});
// 将二进制对象转换为Blob对象
const blob = new Blob([excelBuffer], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
// 创建下载链接并设置相关属性
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '核对记录.xlsx';
// 模拟点击下载链接
document.body.appendChild(link);
link.click();
// 清理下载链接
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
},
doImportSearch() {
this.doSearch()
this.dialogVisible = false
},
doImport() {
if (this.importData.fileList.length === 0) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: "/platform/activity/basic/scope/doImport",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
this.importLoading = false
if (data.code === 0) {
this.notifySuccess("核对成功")
this.errorInfoData = data.data
} else {
this.notifyWarning("核对失败")
}
this.errorInfoData = data.data
this.pageForm.existsLoginNameRedisKey = data.data.existsLoginNameRedisKey
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
},
clearSearchCnd() {
this.importData = {
fileList: [],
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: [],
}
this.pageForm.userIds = []
this.successUserIdList = []
this.doSearch()
this.dialogVisible = false;
$.get('/platform/activity/basic/scope/clearSearchCnd', {existsLoginNameRedisKey: this.pageForm.existsLoginNameRedisKey}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
},
doExportUser() {
const {
userId,
memberTypes,
sexTypes,
personTypes,
userStates,
unionId,
unitId,
teacherMeetingId,
roleIds,
clubId,
activityGroupId,
age,
reverseSelection,
activityUserCnd,
existsLoginNameRedisKey
} = this.pageForm
let props = {}
this.tableColumns.forEach(v => {
props[v.prop] = v.label
})
window.open("/platform/activity/basic/scope/doExportUser?userId=" + JSON.stringify(userId) +
"&props=" + JSON.stringify(props) +
"&memberTypes=" + JSON.stringify(memberTypes) +
"&sexTypes=" + JSON.stringify(sexTypes) +
"&personTypes=" + JSON.stringify(personTypes) +
"&userStates=" + JSON.stringify(userStates) +
"&roleIds=" + JSON.stringify(roleIds) +
"&age=" + JSON.stringify(age) +
"&activityUserCnd=" + (activityUserCnd ? JSON.stringify(activityUserCnd) : activityUserCnd) +
"&reverseSelection=" + reverseSelection +
"&clubId=" + clubId +
"&activityGroupId=" + activityGroupId +
"&teacherMeetingId=" + teacherMeetingId +
"&unionId=" + unionId +
"&unitId=" + unitId+
"&existsLoginNameRedisKey=" + existsLoginNameRedisKey
)
},
doReset() {
this.pageForm.userId = []
this.pageForm.memberTypes = []
this.pageForm.sexTypes = []
this.pageForm.personTypes = []
this.pageForm.userStates = []
this.pageForm.unionId = ''
this.pageForm.unitId = ''
this.pageForm.module = ''
this.pageForm.teacherMeetingId = ''
this.pageForm.roleIds = []
this.pageForm.clubId = ''
this.pageForm.activityGroupId = ''
this.pageForm.activityUserCnd = ''
this.pageForm.age = [0, 0]
this.pageForm.reverseSelection = false
this.doSearch()
},
async queryUser(val) {
this.userList = await searchUser(val)
},
tagClick(key, val) {
let idx = this.pageForm[key].indexOf(val)
if (idx !== -1) {
this.pageForm[key].splice(idx, 1)
} else {
this.pageForm[key].push(val)
}
this.doSearch()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (this.is_sysadmin || this.is_A06) {
this.units = await getUnits(this.pageForm.unionId)
this.activityUnits = await getActivityUnits(this.pageForm.activityUnionId)
} else {
this.units = await getUnits(this.unionid)
}
},
async pageData() {
sublime.showLoadingbar()
const pageForm = clone(this.pageForm)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
pageForm.sexTypes = JSON.stringify(pageForm.sexTypes)
pageForm.roleIds = JSON.stringify(pageForm.roleIds)
pageForm.userId = JSON.stringify(pageForm.userId)
pageForm.age = JSON.stringify(pageForm.age)
pageForm.activityUserCnd = pageForm.activityUserCnd ? JSON.stringify(pageForm.activityUserCnd) : pageForm.activityUserCnd
const resp = await $.post('/platform/activity/basic/scope/pageData', pageForm)
sublime.closeLoadingbar()
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.notifyWarning(resp.msg)
}
},
async doSetActivityUser() {
const valid = await this.$refs.setForm.validate()
if (!valid) {
return
}
if (this.tableData.length === 0) {
this.$message.warning('请先指定筛选条件!')
return
}
const confirm = await this.$confirm('是否将符合搜索条件的用户设为活动人员?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
this.settingLoading = true
const pageForm = clone(this.pageForm)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
pageForm.sexTypes = JSON.stringify(pageForm.sexTypes)
pageForm.roleIds = JSON.stringify(pageForm.roleIds)
pageForm.userId = JSON.stringify(pageForm.userId)
pageForm.age = JSON.stringify(pageForm.age)
pageForm.activityUserCnd = pageForm.activityUserCnd ? JSON.stringify(pageForm.activityUserCnd) : pageForm.activityUserCnd
Object.assign(pageForm, this.formData)
const resp = await $.post('/platform/activity/basic/scope/doSetActivityUser', pageForm)
if (resp.code === 0) {
this.setDialogVisible = false
// this.userScopeDialog = false
await this.getActivityGroup()
this.doSearch()
this.notifySuccess(resp.msg)
this.formData = {
setGroupType: null,
setGroupId: null,
setGroupName: null
}
} else {
this.notifyError(resp.msg)
}
this.settingLoading = false
this.$emit("update:group_id", resp.data)
this.$emit('group_change')
}
},
async getActivityGroup() {
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = resp.data
this.activityGroupList2 = []
resp.data.forEach(v => {
this.activityGroupList2.push({groupId: v.groupId, groupName: v.groupName + "范围之外人员"})
})
},
async getMenuOptions() {
const {data} = await $.get("/platform/sys/role/getMenuOptions")
this.menuOptions = data
},
async getRoleListByMenuId() {
if (['aca4d14498c145ceb5b24ed70776aae2', '733d7266652740a3aeac9da97ab5eeca'].includes(this.pageForm.module)) {
//教代会
let meets = await proposal.getOpenMeeting()
this.meetingOptions = meets.map(v => ({...v, name: v.jdhallname}))
} else if (['fe2d0768e26d4a80beeb159306bb8d01'].includes(this.pageForm.module)) {
//工代会
let meets = await getGdh(true)
this.meetingOptions = meets.map(v => ({...v, name: v.gdhAllName}))
}
this.pageForm.teacherMeetingId = ''
const {data} = await $.post("/platform/activity/basic/scope/getRoleListByMenuId", {menuId: this.pageForm.module})
this.roleList = data
},
async getRolesAndUnion() {
const {data} = await $.post("/platform/activity/basic/scope/getRolesAndUnion")
this.roleData = data
}
},
async created() {
await this.getRolesAndUnion()
this.clubOptions = await getClubsByRole()
if (((this.is_sysadmin || this.is_A06 || this.is_H02) === false) && this.is_H04 === true) {
this.unions = await getUnionList(this.unionid)
this.$set(this.pageForm, "unionId", this.unions[0].id)
} else {
this.unions = await getUnions(null)
this.activityUnions = await getActivityUnions()
}
if (this.is_H04 === false && this.is_H02 === true) {
if (this.clubOptions.length > 0) {
this.$set(this.pageForm, "clubId", this.clubOptions[0].stid)
}
}
await this.flushUnits()
await this.getActivityGroup()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
await this.getMenuOptions()
await this.pageData()
},
}
</script>
<style>
.query-row {
display: flex;
align-items: center;
padding: 6px 0;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row > .query-title {
width: 100px;
max-width: 100px;
min-width: 100px;
overflow: hidden;
}
.query-row > .query-content {
min-width: 200px;
overflow: hidden;
}
.query-row > .query-content > .el-tag {
margin-bottom: 5px;
margin-top: 5px;
}
@media screen and (max-width: 992px) {
.query-row:nth-child(4) .query-content .el-col:not(:last-child) {
margin-bottom: 5px;
}
.query-title {
display: none;
}
}
.header_card .el-card__body {
padding: 2px 20px;
}
.user_card .el-card__body {
padding: 2px 20px;
}
.user_card {
border: none !important;
}
.user_table {
max-height: 260px;
}
.user_table .el-table__cell {
padding: 0;
}
.el-pagination {
height: 40px;
}
.el-popover {
height: 250px;
}
.reverseCheckBox {
margin: 0 10px 0 0 !important;
}
</style>
@@ -0,0 +1,157 @@
<template>
<el-timeline>
<el-timeline-item timestamp="" placement="top">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 300px">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
<el-button type="primary" icon="el-icon-search" @click="doSearch"></el-button>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top">
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" ref="table" class="vi-table"
@selection-change="handleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in columns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width">
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
layout="total, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-timeline-item>
</el-timeline>
</template>
<script>
module.exports = {
props: {
value: {type: Array},
columns: {
type: Array,
default: [{
prop: 'loginname',
label: '工号',
}, {
prop: 'username',
label: '姓名',
}, {
prop: 'sex',
label: '性别',
}, {
prop: 'mobile',
label: '电话',
}, {
prop: 'unitname',
label: '单位',
}, {
prop: 'unionname',
label: '工会',
}]
},
union: {type: String},
page_size: {type: Number, default: 5},
sql_cnd: {
type: Array
}
},
model: {
prop: 'value',
event: 'change'
},
data() {
return {
tableData: [],
tableLoading: false,
selectUser: [],
pageForm: {
unionId: this.union,
sqlCnd: JSON.stringify(this.sql_cnd),
searchName: "username",
searchKeyword: "",
pageNumber: 1,
pageSize: this.page_size,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
}
}
},
watch: {
value(val) {
}
},
methods: {
handleSelectionChange(val) {
this.selectUser = val
this.$emit("change", val.map(v => v.id))
},
doSearch() {
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {
this.tableLoading = true
$.post("/platform/common/user/userPageData", this.pageForm, (data) => {
this.tableLoading = false
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
this.tableData.filter(v => this.value.includes(v.id) && !this.selectUser.some(x => x.id == v.id)).forEach(v => {
this.$refs.table.toggleRowSelection(v, true);
})
} else {
this.$message.error(data.msg);
}
}, "json");
},
init() {
this.doSearch()
this.selectUser = []
this.$refs.table.clearSelection();
},
},
created() {
}
}
</script>
<style>
</style>
@@ -0,0 +1,664 @@
<template>
<van-uploader v-model="fileList" multiple
:after-read="afterRead"
@delete="doDelete"
:max-count="max"
:show-upload="!view"
:deletable="!view"
:max-size="max_size"
@oversize="onOversize"
@click-preview="clickPreview"
:before-read="beforeRead"
>
</van-uploader>
</template>
<script>
/**
* 文件类型解析
* @type {{isImg: wpUploadFileTypeResolve.isImg}}
*/
let fileTypeResolving = {
/**
* 是否是一张图片
*/
isImg: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /image\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isImgByName: function (fileItemName) {
let checkSuffixArray = ['jpg', 'png', 'jpeg', 'bmp', 'gif', 'webp', 'tif', 'svg', 'wmf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是视频
*/
isVideo: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /video\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isVideoByName: function (fileItemName) {
let checkSuffixArray = ['mp4', 'Ogg', 'webm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是音频
*/
isAudio: function (fileItem) {
return fileTypeResolving.resolvingByType(fileItem.type, /audio\/(\w)*/)
},
/**
* 通过后缀验证图片
*/
isAudioByName: function (fileItemName) {
let checkSuffixArray = ['mp3', 'ogg', 'wav'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray)
},
/**
* 是否是doc文件
*/
isDoc: function (fileItemName) {
let checkSuffixArray = ['doc', 'docx', 'dot', 'dotx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是excel文件
*/
isExcel: function (fileItemName) {
let checkSuffixArray = ['xls', 'xlsx', 'csv', 'xlt', 'xltx'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是PPT文件
*/
isPPT: function (fileItemName) {
let checkSuffixArray = ['ppt', 'pptx', 'pot', 'potx', 'odp'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是Pdf文件
*/
isPdf: function (fileItemName) {
let checkSuffixArray = ['pdf'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 是否是压缩文件
* @param fileItem
* @returns {boolean}
*/
isZip: function (fileItemName) {
let checkSuffixArray = ['zip', '7z', 'war', 'tar', 'rar', 'jar', 'zipx', 'zix', 'zoo'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isWeb: function (fileItemName) {
let checkSuffixArray = ['html', 'htm'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isTxt: function (fileItemName) {
let checkSuffixArray = ['txt'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isPsd: function (fileItemName) {
let checkSuffixArray = ['psd'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isCad: function (fileItemName) {
let checkSuffixArray = ['cad'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isIso: function (fileItemName) {
let checkSuffixArray = ['iso'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
isExe: function (fileItemName) {
let checkSuffixArray = ['exe'];
return fileTypeResolving.resolvingByName(fileItemName, checkSuffixArray);
},
/**
* 根据文件类型来解析
* @param fileType 文件类型
* @param checkTypeModel 文件类型模型,如:image\/(\w)*
* @returns {boolean}
*/
resolvingByType: function (fileType, checkTypeModel) {
if (checkTypeModel.test(fileType)) {
return true;
}
return false;
},
/**
* 根据名字和名字后缀名来验证文件
* @param fileName 文件名
* @param checkSuffixArray 文件类型包含的后缀
*/
resolvingByName: function (fileName, checkSuffixArray) {
let suffixName = wpUploadFileTools.getSuffixNameByFileName(fileName);
// 名字是否有效
if (!wpUploadDataValid.isValidStr(suffixName)) {
// 无效直接返回false
return false;
}
suffixName = suffixName.trim();
suffixName = suffixName.toLowerCase();
if (checkSuffixArray.indexOf(suffixName) != -1) {
return true;
}
return false;
}
}
/**
* 文件工具
* @type {{}}
*/
let wpUploadFileTools = {
/**
* 获取文件显示模版
* @param fileItem
*/
wapFileItemShow: function (fileItem) {
return wpUploadFileTools.wapFileItemShowBase(fileItem, false);
},
/**
* 包装已上传的文件列表
*/
wapFileItemShowWithUpload(uploadFile) {
return wpUploadFileTools.wapFileItemShowBase(uploadFile, true);
},
/**
* 获取文件显示的基本操作
*/
wapFileItemShowBase(fileItem, isUploaded = false) {
let fileName = "";
let suffix = "";
let show = "";
let showIcon = "";
if (!isUploaded) {
fileName = fileItem.name;
suffix = wpUploadFileTools.getSuffixNameByFileName(fileName);
show = wpUploadFileTools.resolvingShow(fileItem);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem, false);
} else {
fileName = fileItem.name ? fileItem.name : wpUploadFileTools.resolvingUrlFileName(fileItem.url);
let fileNameGetOFuRL = wpUploadFileTools.resolvingUrlFileName(fileItem.url);
suffix = wpUploadFileTools.getSuffixNameByFileName(fileNameGetOFuRL);
show = wpUploadFileTools.resolvingShowByFileName(fileNameGetOFuRL);
showIcon = wpUploadFileShowResolving.getFileItemShowIcon(show, fileItem.url, true);
}
let fileItemShow = {
// 文件的id
id: wpUploadFileTools.uuid(),
// 文件对象
file: null,
// 文件的类型
type: null,
// 文件的大小
size: null,
// 文件的名字
name: fileName,
// 文件地址
url: null,
// 后缀
suffix: suffix,
// 显示的类型
show: show,
// 显示的图标或者图片地址
showIcon: showIcon,
// 显示进度条
processStatus: {
show: false,
width: 0,
isFail: false
},
// 文件来源,0选择文件上传,1回显文件
fileSource: 0,
// 状态0未上传,失败也会转到0,1正在上传,2已经上传
status: 0,
// 上传文件的描述
fileDes: null
}
if (!isUploaded) {
// 如果非选择文件下面三个属性为null
fileItemShow.file = fileItem;
fileItemShow.type = fileItem.type;
fileItemShow.size = fileItem.size;
} else {
// 文件描述
fileItemShow.status = 2;
fileItemShow.fileDes = fileItem;
fileItemShow.fileSource = 1;
fileItemShow.url = fileItem.url;
}
return fileItemShow;
},
/**
* 解析URL的文件名字
*/
resolvingUrlFileName: function (fileUrl) {
let index = fileUrl.lastIndexOf("/");
if (index <= 0) {
index = fileUrl.lastIndexOf("\\");
}
index = index + 1;
let fileName = fileUrl.substring(index, fileUrl.length);
return fileName;
},
/**
* 获取文件名后缀
* @param fileName 文件名全名
* */
getSuffixNameByFileName: function (fileName) {
let str = fileName;
let index = str.lastIndexOf(".");
if (index < 0) {
return "";
}
let pos = index + 1;
return str.substring(pos, str.length);
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShow: function (fileItem) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImg(fileItem)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideo(fileItem)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudio(fileItem)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItem.name)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItem.name)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItem.name)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItem.name)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItem.name)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItem.name)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItem.name)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItem.name)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItem.name)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItem.name)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItem.name)) {
showResult = 14;
}
return showResult
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName: function (fileItemName) {
// 默认0普通文件
let showResult = 0;
if (wpUploadFileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (wpUploadFileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (wpUploadFileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (wpUploadFileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (wpUploadFileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (wpUploadFileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (wpUploadFileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (wpUploadFileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (wpUploadFileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (wpUploadFileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (wpUploadFileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (wpUploadFileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (wpUploadFileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (wpUploadFileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 生成UUID
* @returns {string}
*/
uuid: function () {
let str = wpUploadFileTools.uuidFull();
str = str.replace(/-/g, "");
return str;
},
uuidFull() {
let s = []
let hexDigits = "0123456789abcdef"
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
}
s[14] = "4"
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
s[8] = s[13] = s[18] = s[23] = "-"
let uuid = s.join("")
return uuid
},
/**
* 禁止某个dom的某个事件
*/
disableObjEvent(domObj, eventName) {
domObj.addEventListener(eventName, function (e) {
e.preventDefault();
})
}
}
/**
* 数据验证工具
* @type {{isValid: wpUploadDataValid.isValid}}
*/
let wpUploadDataValid = {
isValid: function (obj) {
if (undefined === obj || null === obj) {
return false;
}
return true;
},
isValidStr: function (str) {
let isValidObj = wpUploadDataValid.isValid(str);
if (!isValidObj) {
return isValidObj;
}
str = str.trim();
if ("" == str || '' == str) {
return false;
}
return true;
},
isValidArray(array) {
if (null == array || array == undefined || array.length <= 0) {
return false;
}
return true;
}
}
module.exports = {
props: {
files: Array,
type: {
type: Array,
default: ['jpg', 'jpeg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'pdf']
},
max: {
type: Number,
default: 10
},
max_size: {
type: Number,
default: 100 * 1024 * 1024
},
view: {
type: Boolean,
default: false
},
del: {
type: Boolean,
default: true
}
},
data() {
return {
fileList: []
}
},
watch: {
files(val) {
this.updateFileList(val)
}
},
methods: {
// 返回布尔值
beforeRead(file) {
const type = this.type.includes(file.name.split('.')[1].toLowerCase());
if (!type) {
this.$toast(`上传文件只能是 ${this.type.map(v => v.toLowerCase()).join("/")} 格式!`);
return false;
}
return true;
},
getAccept() {
return this.type.map(v => '.' + v).join(",")
},
onOversize() {
this.$toast(`上传文件大小不能超过 ${this.max_size / 1024 / 1024} MB!`);
},
/**
* 查看资源
*/
showSource(showItem) {
const show = this.resolvingShowByFileName(showItem.filepath)
if (show == 1 || show == 2 || show == 3) {
$('.viewFile').viewer({
url: 'src',
});
} else if (show == 4 || show == 5 || show == 7) {
preview(showItem.filepath, showItem.id)
}
},
/**
* 解析显示类型
* @param fileItem 文件
* @returns {number}
*/
resolvingShowByFileName(fileItemName) {
// 默认0普通文件
let showResult = 0;
if (fileTypeResolving.isImgByName(fileItemName)) {
showResult = 1;
} else if (fileTypeResolving.isVideoByName(fileItemName)) {
showResult = 2;
} else if (fileTypeResolving.isAudioByName(fileItemName)) {
showResult = 3;
} else if (fileTypeResolving.isDoc(fileItemName)) {
showResult = 4;
} else if (fileTypeResolving.isExcel(fileItemName)) {
showResult = 5;
} else if (fileTypeResolving.isPPT(fileItemName)) {
showResult = 6;
} else if (fileTypeResolving.isPdf(fileItemName)) {
showResult = 7;
} else if (fileTypeResolving.isZip(fileItemName)) {
showResult = 8;
} else if (fileTypeResolving.isWeb(fileItemName)) {
showResult = 9;
} else if (fileTypeResolving.isTxt(fileItemName)) {
showResult = 10;
} else if (fileTypeResolving.isPsd(fileItemName)) {
showResult = 11;
} else if (fileTypeResolving.isCad(fileItemName)) {
showResult = 12;
} else if (fileTypeResolving.isIso(fileItemName)) {
showResult = 13;
} else if (fileTypeResolving.isExe(fileItemName)) {
showResult = 14;
}
return showResult
},
/**
* 获取文件显示图标
* @param filePath
* @returns {string}
*/
getFileItemShowIcon(filePath) {
let showIcon = '';
switch (this.resolvingShowByFileName(filePath)) {
case 0:
showIcon = "#icon-yunpanlogo-3";
break;
// 图片
case 1:
showIcon = this.getImgShowIcon(filePath);
break;
// 视频
case 2:
showIcon = "#icon-yunpanlogo-6";
break;
// 音乐
case 3:
showIcon = "#icon-yunpanlogo-4";
break;
// doc
case 4:
showIcon = "#icon-yunpanlogo-2";
break;
// excel
case 5:
showIcon = "#icon-yunpanlogo-";
break;
// ppt
case 6:
showIcon = "#icon-yunpanlogo-1";
break;
// pdf
case 7:
showIcon = "#icon-yunpanlogo-12";
break;
// zip
case 8:
showIcon = "#icon-yasuobao";
break;
// web文件
case 9:
showIcon = "#icon-yunpanlogo-5";
break;
// txt文件
case 10:
showIcon = "#icon-yunpanlogo-7";
break;
// PSD
case 11:
showIcon = "#icon-yunpanlogo-10";
break;
// cad
case 12:
showIcon = "#icon-yunpanlogo-11";
break;
// ISO
case 13:
showIcon = "#icon-yunpanlogo-8";
break;
// 可执行
case 14:
showIcon = "#icon-yunpanlogo-9";
break;
// 普通文件
default:
showIcon = "#icon-yunpanlogo-3";
}
return showIcon;
},
/**
* 获取图片的显示图标
* @param fileItem
* @returns {string|*}
*/
getImgShowIcon(fileItem) {
return FILE_DOMAIN + fileItem;
},
change(fileList) {
this.$emit("update:files", fileList.map(v => v.data))
},
afterRead(file) {
file.status = 'uploading';
file.message = '上传中...';
let formData = new FormData();
formData.append("file", file.file, file.file.name);
$.ajax({
url: "/platform/Common/uploadFile",
type: "post",
data: formData,
processData: false,
contentType: false,
success: (res) => {
const {code, data} = res
if (code === 0) {
file.status = 'success';
file.data = data
this.change(this.fileList)
}
},
error: (err) => {
file.status = 'failed';
file.message = '上传失败';
}
});
},
doDelete(file) {
if (file.data) {
const {filename, filepath} = file.data
if (this.del) {
$.post(FILE_DELETE_ADDRESS, {filepath})
}
this.change(this.fileList)
}
},
clickPreview(file) {
const {filepath, id} = file.data
const show = this.resolvingShowByFileName(filepath)
if (show == 4 || show == 5 || show == 7) {
preview(filepath, id)
}
},
updateFileList(val) {
if (!val || !val.length) {
this.fileList = []
return
}
this.fileList = val.map(v => {
let url = ''
if (this.resolvingShowByFileName(v.filepath) == 1) {
url = FILE_DOMAIN + v.filepath
}
return {data: v, url, file: {name: v.filename}, status: 'success'}
})
},
},
created() {
this.updateFileList(this.files)
}
}
</script>
<style>
</style>
@@ -0,0 +1,47 @@
class SysDictData {
constructor(dict) {
this.dict = dict
}
async init(dictNames) {
const ps = [];
dictNames.forEach((name) => {
Vue.set(this.dict.type, name, null)
ps.push(
getDictOptions(name).then((res) => {
const dictValue = res.map(v => {
return {
text: v.name,
label: v.name,
value: v.code,
raw: v
}
})
this.dict.type[name] = Object.freeze(dictValue)
})
)
})
await Promise.all(ps)
}
}
window.dictData = {}
window.dictData.install = function (Vue) {
Vue.mixin({
data() {
if (this.$options.dicts instanceof Array && this.$options.dicts.length > 0) {
return {dict: {type: {}}};
} else {
return {}
}
},
created() {
if (this.$options.dicts instanceof Array && this.$options.dicts.length > 0) {
new SysDictData(this.dict).init(this.$options.dicts);
}
}
})
}
if (window.Vue) {
Vue.use(window.dictData)
}
@@ -0,0 +1,58 @@
/**
*Desc:
*Create by: jug
*Create time:2023/7/28/9:55
*/
<template>
<div>
<template v-for="(item, index) in options">
<template v-if="values.includes(item.value)">
<span
v-if="item.raw.listClass == 'default' || item.raw.listClass == ''"
:key="item.value"
:index="index"
:class="item.raw.cssClass"
>{{ item.label }}</span
>
<van-tag
v-else
:disable-transitions="true"
:key="item.value"
:index="index"
:type="item.raw.listClass == 'primary' ? '' : item.raw.listClass"
:class="item.raw.cssClass"
>
{{ item.label }}
</van-tag>
</template>
</template>
</div>
</template>
<script>
module.exports = {
name: "DictTag",
props: {
options: {
type: Array,
default: null,
},
value: [Number, String, Array],
},
computed: {
values() {
if (this.value !== null && typeof this.value !== 'undefined') {
return Array.isArray(this.value) ? this.value : [String(this.value)];
} else {
return [];
}
},
},
}
</script>
<style scoped>
.el-tag + .el-tag {
margin-left: 10px;
}
</style>
@@ -0,0 +1,230 @@
/**
*Desc:
*Create by: jug
*Create time:2024/1/24/16:40
*/
<template>
<div>
<div ref="editorDom"></div>
<input type="file" style="display: none;">
</div>
</template>
<script src="/assets/platform/plugins/jquery/jquery-1.11.1.min.js"></script>
<script>
const {$, BtnMenu, DropListMenu, PanelMenu, DropList, Panel, Tooltip} = wangEditor
class AlertMenu extends BtnMenu {
constructor(editor) {
const $elem = wangEditor.$(
`<div class="w-e-menu" data-title="上传word">
word
</div>`
)
super($elem, editor)
}
clickHandler() {
const _this = this
const inputFileElement = document.querySelector('#'+this.editor.textElemId).parentElement.parentElement.nextElementSibling
inputFileElement.click()
inputFileElement.addEventListener('change', function () {
const file = this.files[0];
const fileName = file.name
if (!fileName.toLowerCase().endsWith('.doc') && !fileName.toLowerCase().endsWith('.docx')) {
alert('请上传doc或者docx的文件')
_this.clearInputFile()
return
}
const formData = new FormData()
formData.append('file', file, file.name)
axios.post('/file_server/word2Html', formData, {}).then(response => {
console.log(response.data)
if (response.data.code === 0) {
_this.editor.txt.html(response.data.data)
} else {
alert(response.data.msg + ',上传word失败,请联系管理员!')
_this.clearInputFile()
}
}).catch(error => {
console.log(error)
_this.clearInputFile()
alert('上传word失败,请联系管理员!')
});
});
}
clearInputFile() {
const obj = document.getElementById('fileInput');
obj.outerHTML = obj.outerHTML
}
tryChangeActive() {
this.active()
}
}
wangEditor.registerMenu('alertMenuKey', AlertMenu)
module.exports = {
name: "textEditor",
props: {
// 定义值属性,用于接收父组件传递的值
value: {
type: String,
default: ''
},
height: {
type: Number,
default: 300
},
menus: {
type: Array,
default: () => {
return [
'head',//标题
'bold',//加粗
'fontSize',//字号
'fontName',//字体
'italic',//斜体
'underline',//下划线
'strikeThrough',//删除线
'indent',//缩进
'lineHeight',//行高
'foreColor',//文字颜色
'backColor',//背景颜色
//'link',//链接
'list',//序列
'todo',//待办
'justify',//对齐
'quote',//引用
// 'emoticon',//表情
'image',
//'video',
'table',
//'code',
'splitLine',//分割线
'undo',
'redo',
]
}
}
},
data() {
return {
editor: null
}
},
mounted() {
this.initEditor()
},
watch: {
value: {
handler: function (newValue) {
this.$nextTick(() => {
this.editor.txt.html(newValue);
// this.editor.config.focus = true
})
// const _this = this
// const waitUntilEditorNotNull = () => {
// if (_this.editor != null) {
// _this.editor.txt.html(newValue);
// } else {
// setTimeout(waitUntilEditorNotNull, 100); // 每隔100毫秒检查一次
// }
// }
// waitUntilEditorNotNull();
},
immediate: true
}
},
methods: {
initEditor() {
let _this = this
this.editor = new wangEditor(this.$refs.editorDom)
// this.editor.config.focus = false // 取消光标自动定位
//内容change回调
this.editor.config.onchange = function (newHtml) {
let content = _this.editor.txt.html()
let text = _this.editor.txt.text()
// 对于一键格式化后的内容,空内容可能会出现<p></br></p>标签,此处进行判断
// if (_this.isEmptyEditor()) {
// content = ''
// }
const newContent = content.replaceAll('<img', '<image');
_this.$emit('input', newContent)
_this.$emit('catchData', newContent, text)
}
//配置图片上传
this.editor.config.customUploadImg = function (resultFiles, insertImgFn) {
// resultFiles 是 input 中选中的文件列表
// insertImgFn 是获取图片 url 后,插入到编辑器的方法
Promise.all(_this.uploadFiles(resultFiles)).then(res => {
res.forEach(v => {
if (v.code === 0) {
insertImgFn(APP_DOMAIN + CREATE_PREVIEW_URL(v.data.filepath))
} else {
ELEMENT.message.warning('图片上传失败')
}
})
})
}
//粘贴过滤
this.editor.config.pasteFilterStyle = false
//高度
this.editor.config.height = this.height
//菜单
this.editor.config.menus = this.menus
this.editor.create()
},
isEmptyEditor() {
const children = this.editor.$textElem.children()
for (let i = 0; i < children.elems.length; i++) {
const node = children.elems[i]
if (node && node.nodeType === Node.TEXT_NODE && node.textContent.trim().length !== '') {
return false
}
if (node && node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() === 'p' && node.innerText.trim() !== '') {
return false
}
}
return true
},
uploadFiles(resultFiles) {
return resultFiles.map(async file => {
const formData = new FormData()
formData.append('file', file, file.name)
formData.append("folderPath", "/wangEditorImg/")
return jQuery.ajax({
url: '/file_server/uploadFile',
type: 'post',
data: formData,
processData: false,
contentType: false
})
})
}
},
created() {
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,568 @@
<template>
<el-tabs v-model="activeName" v-loading="loading" tab-position="top">
<el-tab-pane label="提案基础信息" name="1">
<el-descriptions border>
<el-descriptions-item label="提案名称" span="3">
<div style="font-weight:bold;">
{{ viewData.proposalName }}
</div>
</el-descriptions-item>
<el-descriptions-item label="提案编号">{{ viewData.proposalCode }}</el-descriptions-item>
<el-descriptions-item label="提案人">{{
viewData.createUserName + '-' + viewData.loginname
}}
</el-descriptions-item>
<el-descriptions-item label="提案时间">{{ viewData.createTime }}</el-descriptions-item>
<el-descriptions-item label="教代会届次"> {{ viewData.meetingName || '暂无' }}</el-descriptions-item>
<el-descriptions-item label="提案人工会">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item :label="viewData.mannerCode!=='W03'?'代表团名称':'委员会名称'">
{{ viewData.mannerCode !== 'W03' ? viewData.delegationName : viewData.committeeName }}
</el-descriptions-item>
<el-descriptions-item label="提案类型">{{ viewData.typeName }}</el-descriptions-item>
<!-- <el-descriptions-item label="提案方式" >{{ viewData.mannerName }}</el-descriptions-item>-->
<el-descriptions-item label="建议落实部门" span="2">{{ viewData.implementUnitName }}</el-descriptions-item>
<el-descriptions-item label="案由" span="3">
<div class="text-left" v-html="viewData.brief"></div>
</el-descriptions-item>
<el-descriptions-item label="建议措施" span="3">
<div class="text-left" v-html="viewData.measures"></div>
</el-descriptions-item>
<el-descriptions-item label="签&emsp;&emsp;字" span="3">
<el-image v-if="viewData.createUserSign" :src="viewData.createUserSign" class="item-sign"
fit="contain"></el-image>
<span v-else>无</span>
</el-descriptions-item>
</el-descriptions>
<file-upload v-if="viewData.files&&viewData.files.length"
:files="viewData.files" view></file-upload>
<slot name="seconded"></slot>
</el-tab-pane>
<el-tab-pane v-if="viewData.seconded" label="附议信息" name="2">
<el-table :data="viewData.seconded" border>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="单位" prop="unitname"></el-table-column>
<el-table-column label="邀请时间" prop="inviteTime"></el-table-column>
<el-table-column label="附议时间" prop="secondedTime"></el-table-column>
<el-table-column label="附议结果" prop="isAgree">
<template slot-scope="{row}">
<template v-if="row.isAgree==null">
<span class="text-muted">未附议</span>
</template>
<template v-else>
<span v-if="row.isAgree" class="text-success">同意</span>
<span v-else class="text-danger">拒绝</span>
</template>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="附议人签字" prop="signData">
<template slot-scope="{row}">
<el-image v-if="row.signData" :src="row.signData" class="item-sign" fit="contain"></el-image>
<span v-else>暂无</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane v-if="viewData.delegationAudit&&viewData.delegationAudit.length>0" label="团长审核" name="3">
<el-descriptions border>
<template v-for="(o,i) in viewData.delegationAudit">
<el-descriptions-item label="审核人">{{ o.username + '-' + o.loginName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{ o.flag ? '通过' : '退回' }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="团长签字" span="3">
<template>
<image v-if="o.auditSign" :src="o.auditSign " class="item-sign" fit="contain"></image>
<span v-else>暂无</span>
</template>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.membersOpinions&&viewData.membersOpinions.length>0" label="委员会成员意见" name="4">
<template v-for="item in viewData.membersOpinions">
<vi-title title="委员会成员意见"></vi-title>
<el-form class="item-form" label-position="left" label-suffix=":" label-width="80px">
<el-row gutter="60">
<el-col :span="18">
<el-form-item label="审核人">{{ item.username }}({{ item.loginName }})</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审核时间">{{ item.auditTime }}</el-form-item>
</el-col>
</el-row>
<el-form-item label="立案意见">{{ item.dictName }}</el-form-item>
<el-form-item label="审核意见">{{ item.opinion }}</el-form-item>
<el-form-item v-if="item.auditSign" label="签&emsp;&emsp;字">
<el-image :src="item.auditSign" class="item-sign" fit="contain"></el-image>
<span v-else>暂无</span>
</el-form-item>
</el-form>
</template>
</el-tab-pane>
<el-tab-pane v-if="viewData.caseAudit" label="提案委员会立案" name="5">
<el-descriptions border>
<el-descriptions-item label="审核人">
{{ viewData.caseAudit.username + '-' + viewData.caseAudit.loginName }}
</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{ viewData.resultName }}
{{ viewData.determineTypeCode ? '(' + viewData.laLevelName + ')' : '' }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.caseAudit.auditTime }}</el-descriptions-item>
<el-descriptions-item v-if="hostUnit!=''" label="承办单位" span="3">
{{ hostUnit }}(主办),
{{ helpUnit }}(协办)
</el-descriptions-item>
<el-descriptions-item v-if="viewData.resultCode!=='notGive'" label="承办单位" span="3">
<template v-for="(item,index) in viewData.undertake">
{{ item.unitName }}
({{ item.undertakeType === 1 ? '主办' : '协办' }})
{{ index + 1 === viewData.undertake.length ? '' : '、' }}
</template>
</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">{{ viewData.caseAudit.opinion }}</el-descriptions-item>
<el-descriptions-item label="签字" span="3">
<el-image v-if="viewData.caseAudit.auditSign"
:src="viewData.caseAudit.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.underTakeFirstOpinion&&viewData.underTakeFirstOpinion.length>0" label="承办单位初步意见"
name="6">
<el-descriptions border>
<template v-for="(o,i) in viewData.underTakeFirstOpinion">
<el-descriptions-item label="承办单位">{{ o.underTakeName }}</el-descriptions-item>
<el-descriptions-item label="时间">{{ o.opionTime }}</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{ o.canTake ? '可以承办' : '无法承办' }}
</el-descriptions-item>
<el-descriptions-item label="意见" span="3">{{ o.opinion }}</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<!--是否开启执委会建议环节-->
<template v-if="proposal.enableState.some(v=>v.stateCode===310)">
<el-tab-pane v-if="viewData.executorReadOpinion && viewData.executorReadOpinion.length>0" label="执委会审核" name="7">
<template v-if="viewData.executorReadOpinion && viewData.executorReadOpinion.length>0">
<el-descriptions :column="3" border>
<template v-for="(o,i) in viewData.executorReadOpinion">
<el-descriptions-item label="审核人">{{ o.username }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ o.auditTime }}</el-descriptions-item>
<el-descriptions-item label="建议立案结果">{{ o.dictName }}</el-descriptions-item>
<el-descriptions-item label="审核意见" span="4">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="执委会签字" span="4">
<el-image v-if="o.auditSign"
:src="o.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template v-else>
null~
</template>
</el-tab-pane>
</template>
<!--是否开启校领导建议环节-->
<template v-if="proposal.enableState.some(v=>v.stateCode===320)">
<el-tab-pane v-if="viewData.branchLeaderOpinion && viewData.branchLeaderOpinion.length>0" label="分管校领导审批立案"
name="8">
<template v-if="viewData.branchLeaderOpinion && viewData.branchLeaderOpinion.length>0">
<el-descriptions :column="2" border class="wrap-table">
<template v-for="(o,i) in viewData.branchLeaderOpinion">
<el-descriptions-item label="审批人">{{ o.username }}</el-descriptions-item>
<el-descriptions-item label="审批时间">{{ o.auditTime }}</el-descriptions-item>
<!-- <el-descriptions-item label="建议立案结果">{{ o.dictName }}</el-descriptions-item>-->
<el-descriptions-item label="审批意见" span="4">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="分管校领导签字" span="4">
<el-image v-if="o.auditSign"
:src="o.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template v-else>
null~
</template>
</el-tab-pane>
</template>
<!--是否开启书记、校长建议环节-->
<template v-if="proposal.enableState.some(v=>v.stateCode===330)">
<el-tab-pane v-if="viewData.secretaryOpinion && viewData.secretaryOpinion.length>0" label="校长、书记审阅"
name="9">
<template v-if="viewData.secretaryOpinion && viewData.secretaryOpinion.length>0">
<el-descriptions :column="2" border>
<template v-for="(o,i) in viewData.secretaryOpinion">
<el-descriptions-item label="审阅人">{{ o.username }}</el-descriptions-item>
<el-descriptions-item label="审阅时间">{{ o.auditTime }}</el-descriptions-item>
<!-- <el-descriptions-item label="建议立案结果">{{ o.dictName }}</el-descriptions-item>-->
<el-descriptions-item label="审阅意见" span="4">{{ o.opinion }}</el-descriptions-item>
<el-descriptions-item label="校长、书记签字" span="4">
<el-image v-if="o.auditSign"
:src="o.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</template>
<template v-else>
null~
</template>
</el-tab-pane>
</template>
<el-tab-pane v-if="viewData.caseUnitAudit" label="委员会确认承办单位" name="10">
<el-descriptions border>
<el-descriptions-item label="审核人">
{{ viewData.caseUnitAudit.username + '-' + viewData.caseUnitAudit.loginName }}
</el-descriptions-item>
<el-descriptions-item label="审核结果">{{ viewData.resultName }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.caseUnitAudit.auditTime }}</el-descriptions-item>
<el-descriptions-item v-if="viewData.resultCode!=='notGive'" label="承办单位" span="3">
<template v-for="(item,index) in viewData.undertake">
{{ item.unitName }}
({{ item.undertakeType === 1 ? '主办' : '协办' }})
{{ index + 1 === viewData.undertake.length ? '' : '、' }}
</template>
</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">{{ viewData.caseUnitAudit.opinion }}</el-descriptions-item>
<el-descriptions-item label="签字" span="3">
<el-image v-if="viewData.caseUnitAudit.auditSign"
:src="viewData.caseUnitAudit.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.replyInfo && viewData.replyInfo.length>0 && viewData.replyInfo.some(v=>v.isReply)"
label="承办单位答复"
name="11">
<el-descriptions border class="wrap-table-4" column="5">
<template v-for="(o,i) in viewData.replyInfo.filter(v=>v.isReply)">
<el-descriptions-item label="承办单位">{{
o.unitName
}}({{ o.undertakeType === 1 ? '主办' : '协办' }})
</el-descriptions-item>
<el-descriptions-item label="答复人">{{ o.dfrUserName }}</el-descriptions-item>
<el-descriptions-item label="答复时间">{{ o.replyTime }}</el-descriptions-item>
<el-descriptions-item label="答复次数">{{ o.replyNumber }}</el-descriptions-item>
<el-descriptions-item label="落实情况">{{ o.implementState }}</el-descriptions-item>
<el-descriptions-item label="答复内容" span="5">
<div class="text-left" v-html="o.replyContent"></div>
</el-descriptions-item>
<el-descriptions-item label="承办单位签字" span="5">
<el-image v-if="o.replySignData"
:src="o.replySignData"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
<el-descriptions-item label="附件" span="5">
<file-upload v-if="JSON.parse(o.replyFiles)&&JSON.parse(o.replyFiles).length"
:files="JSON.parse(o.replyFiles)" :view="true"></file-upload>
<span v-else>无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.replyInfo && viewData.replyInfo.some(v=>v.isLeaderAudit)" label="分管校领导审批" name="12">
<el-descriptions border column="4">
<template v-for="(o,i) in viewData.replyInfo.filter(v=>v.isLeaderAudit)">
<el-descriptions-item label="承办单位">{{ o.unitName }}</el-descriptions-item>
<el-descriptions-item label="校领导">{{ o.xldUserName }}</el-descriptions-item>
<el-descriptions-item label="审批时间">{{ o.leaderCheckTime }}</el-descriptions-item>
<el-descriptions-item label="审批次数">{{ o.leaderCheckNumber }}</el-descriptions-item>
<el-descriptions-item label="审批内容" span="4">
<div class="text-left">
{{ o.leaderCheckOpinion }}
</div>
</el-descriptions-item>
<el-descriptions-item label="分管校领导签字" span="4">
<el-image v-if="o.leaderSignData"
:src="o.leaderSignData"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.feedback&&viewData.feedback.length>0" label="反馈评分信息" name="13">
<el-descriptions border column="4">
<template v-for="(o,i) in viewData.feedback">
<el-descriptions-item label="反馈人">{{ o.username }}({{ o.loginname }})</el-descriptions-item>
<el-descriptions-item label="反馈时间">{{ o.feedbackTime }}</el-descriptions-item>
<el-descriptions-item label="反馈次数">{{ o.feedbackNumber }}</el-descriptions-item>
<el-descriptions-item label="反馈结果">{{ o.feedbackResult }}</el-descriptions-item>
<el-descriptions-item label="反馈意见" span="4">
<div class="text-left" v-html="o.feedbackOpinion"></div>
</el-descriptions-item>
<el-descriptions-item label="反馈人签字" span="4">
<el-image v-if="o.scoreSign"
:src="o.scoreSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.caseCheckAuditId && viewData.caseCheckAudit.length>0" label="提案委员会复核" name="14">
<el-descriptions border>
<template v-for="i in viewData.caseCheckAudit">
<el-descriptions-item label="审核人">
{{ i.username + '-' + i.loginname }}
</el-descriptions-item>
<el-descriptions-item label="审核结果">{{ i.flag ? '不需要二次答复' : '需要二次答复' }}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ i.auditTime }}</el-descriptions-item>
<el-descriptions-item label="审核意见" span="3">
<div class="text-left">
{{ i.opinion }}
</div>
</el-descriptions-item>
<el-descriptions-item label="提案委员会签字" span="4">
<el-image v-if="i.auditSign"
:src="i.auditSign"
fit="contain"
style="width: 300px; height: 100px"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</template>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script>
module.exports = {
props: {
id: String,
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
}
},
data() {
return {
hostUnit: '',
helpUnit: [],
unitOptions: [],
activeName: '1',
activeCollapse: '',
loading: true,
viewData: {},
config: {}
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async openView(id) {
this.loading = true
this.viewData = await proposal.getProposalInfo(id)
console.log(this.viewData)
if (!this.viewData) {
this.$notify.error({title: '失败', message: '获取提案信息失败'});
return
}
const {files, feedback, caseAudit, resultCode} = this.viewData
this.helpUnit = []
if (caseAudit != null && resultCode !== "notGive") {
// const other = JSON.parse(caseAudit.other)
// this.hostUnit = this.unitOptions.find(v => v.id === other.hostUnit).unitName
// if (other.helpUnit && other.helpUnit.length > 0) {
// other.helpUnit.forEach((v, i) => {
// const helpUnit = this.unitOptions.find(z => other.helpUnit[i] === z.id).unitName
// this.helpUnit.push(helpUnit)
// })
// this.helpUnit = this.helpUnit.join('、')
// }
}
if (files) {
this.viewData.files = JSON.parse(files)
}
if (feedback) {
this.viewData.feedback.map(v => {
v.files = JSON.parse(v.files)
})
}
this.activeName = this.handle ? "999" : "1"
this.loading = false
}
},
async created() {
this.config = await proposal.getProposalConfig()
this.unitOptions = await proposal.getProposalUndertake()
}
}
</script>
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
.item-center {
text-align: center;
font-weight: 700;
margin-right: 110px;
}
.item-center .el-form-item__content {
font-size: 18px;
}
.item-sign {
width: 200px;
height: 130px;
}
.item-form {
padding: 0 25px;
}
.el-collapse-item__wrap {
padding: 10px 10px;
}
.el-collapse-item__header {
border-bottom: 1px solid #eee;
font-weight: 700;
}
.item-number {
color: red;
font-weight: 600
}
.el-collapse-item__header {
position: relative;
}
.el-collapse-item__arrow {
color: #1582dc;
font-weight: 800 !important;
}
/*.el-tabs__header{*/
/* background-image: url(https://my.njucm.edu.cn/assets/17289587176453.jpg);*/
/* background-size: cover;*/
/* background-color: rgba(87,99,189,1);*/
/* background-repeat: no-repeat;*/
/* background-position: 50% 50%;*/
/* height: 60px;*/
/* !*border-top-left-radius: 4px;*!*/
/* !*border-top-right-radius: 4px;*!*/
/* !*border-bottom-left-radius: 4px;*!*/
/* !*border-bottom-right-radius: 4px;*!*/
/*}*/
/*.el-tabs__item{*/
/* height: 60px;*/
/* line-height: 60px;*/
/* font-size: 16px;*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__item:hover{*/
/* font-size: 16px;*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__item.is-active{*/
/* color: #FFFFFF;*/
/*}*/
/*.el-tabs__active-bar{*/
/* background-color:orangered;*/
/* height: 4px;*/
/* bottom: 2px;*/
/*}*/
.wrap-table tbody:nth-child(3n+3):after {
content: '';
display: block;
height: 15px;
}
.wrap-table-4 tbody:nth-child(4n+4):after {
content: '';
display: block;
height: 15px;
}
</style>
@@ -0,0 +1,184 @@
<template>
<el-card shadow="never" style="position:relative;">
<div class="d-search-item btn-group tool-button">
<el-input v-model="page.searchKeyword" clearable placeholder="请输入内容"
@keyup.enter.native="$emit('doSearch')">
<el-select slot="prepend" v-model="page.searchName" placeholder="查询类型"
style="width: 110px;">
<el-option label="提案名称" value="proposalName"></el-option>
<el-option label="编号" value="proposalCode"></el-option>
</el-select>
</el-input>
</div>
<div class="d-search-item btn-group tool-button">
<el-input v-model="page.createUser" clearable placeholder="请输入提案人的姓名或工号"
@keyup.enter.native="$emit('doSearch')">
</el-input>
</div>
<div class="d-search-item btn-group tool-button">
<el-select v-model="page.meetingId" clearable filterable placeholder="根据教代会查询" @change="meetingChange">
<el-option
v-for="item in allJdhOptions"
:label="item.jdhallname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="d-search-item btn-group tool-button">
<el-select v-model="page.delegationId" clearable filterable placeholder="所属代表团" @change="delegationChange">
<el-option v-for="item in delegationOptions" :key="item.id" :label="item.dbtname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="mt10">
<div class="d-search-item btn-group tool-button">
<el-select v-model="page.unionId" clearable filterable placeholder="请选择工会" @change="unionChange">
<el-option
v-for="item in unionOptions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="d-search-item btn-group tool-button">
<el-select v-model="page.unitId" clearable filterable placeholder="请选择单位">
<el-option
v-for="item in unitOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div v-if="has_seconded" class="d-search-item btn-group tool-button">
<el-select v-model="page.resultCode" clearable filterable placeholder="请选择立案结果">
<el-option
v-for="item in resultOptions"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button" style="margin-left: 10px">
<el-button icon="el-icon-search" type="primary" @click="$emit('search')"></el-button>
</div>
</div>
<div style="position: absolute;right: 20px;top: 20px;">
<template v-if="has_add">
<el-button class="ml5" icon="el-icon-upload2" plain type="primary"
@click="$emit('import')">导入提案
</el-button>
</template>
<template v-if="has_add">
<el-button icon="el-icon-plus" type="primary" @click="$emit('add')">新建提案</el-button>
</template>
<template v-if="audit">
<el-radio-group v-model="page.isAudit" @change="$emit('search')">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已{{ title }}</el-radio-button>
<el-radio-button :label="false">未{{ title }}</el-radio-button>
</el-radio-group>
</template>
<slot name="column"></slot>
</div>
</el-card>
</template>
<script>
module.exports = {
props: {
page: {
type: Object,
default: {}
},
has_add: {
type: Boolean,
default: false
},
has_seconded: {
type: Boolean,
default: true
},
audit: {
type: String,
default: true
},
title: {
type: String,
default: '审核'
},
},
data() {
return {
allJdhOptions: [],
delegationOptions: [],
unionOptions: [],
unitOptions: [],
resultOptions: []
}
},
methods: {
async meetingChange(val) {
this.page.delegationId = null
this.delegationOptions = await proposal.getDelegation(val)
},
async delegationChange(val) {
this.unionOptions = await getUnions(val)
},
async unionChange(val) {
this.unitOptions = await getUnits(val)
}
},
async mounted() {
this.resultOptions = await proposal.getDictByCode("proposal_result")
this.allJdhOptions = await proposal.getOpenMeeting()
this.page.meetingId = this.allJdhOptions.length > 0 ? this.allJdhOptions[0].id : null
this.delegationOptions = await proposal.getDelegation(this.page.meetingId)
this.unionOptions = await getUnions(null)
this.unitOptions = await getUnits(null)
this.$emit('finished', null)
},
async created() {
// this.resultOptions = await getDictByCode("proposal_result")
// this.allJdhOptions = await proposal.getOpenMeeting()
// this.page.meetingId = this.allJdhOptions.length > 0 ? this.allJdhOptions[0].id : null
// this.delegationOptions = await proposal.getDelegation(this.page.meetingId)
// this.unionOptions = await getUnions(null)
// this.unitOptions = await getUnits(null)
}
}
</script>
<style scoped>
.el-select {
width: 100%;
}
.navbar {
line-height: 3;
}
.btn-group {
width: 20%;
}
.d-search-item {
margin-right: 10px;
}
.search-op {
position: absolute;
top: 0;
right: 10px;
}
</style>
@@ -0,0 +1,64 @@
<template>
<el-card class="mt20" shadow="never">
<slot name="operation"></slot>
<el-table v-loading="loading" :data="data" :row-key="rowkeyFunc" align="center" header-align="center"
@sort-change="(c)=>{$emit('order',c)}" @selection-change="(s)=>{$emit('selection',s)}">
<el-table-column v-if="selection" type="selection" width="55"></el-table-column>
<el-table-column align="center" header-align="center" label="序号" type="index" width="80">
<template scope="scope">
<span>{{ scope.$index + (page.pageNumber - 1) * page.pageSize + 1 }} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="草案编号" prop="oldProposalCode" sortable
width="120"></el-table-column>
<el-table-column align="center" header-align="center" label="提案编号" prop="proposalCode" sortable
width="120"></el-table-column>
<el-table-column align="center" header-align="center" label="提案名称" prop="proposalName" width="300px">
<template scope="{row}">
<el-link type="primary" @click="$emit('view',row)">{{ row.proposalName }}</el-link>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="提案人" prop="username"></el-table-column>
<!-- <el-table-column label="提案时间" prop="createTime" align="center" header-align="center" sortable></el-table-column>-->
<el-table-column align="center" header-align="center" label="提案类型" prop="typeName" sortable></el-table-column>
<el-table-column align="center" header-align="center" label="届次" prop="meetingName"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="所属代表团" prop="delegationName"
sortable></el-table-column>
<el-table-column align="center" header-align="center" label="提案状态" prop="stateName" sortable></el-table-column>
<slot name="column"></slot>
</el-table>
<slot name="pagination"></slot>
</el-card>
</template>
<script>
module.exports = {
props: {
page: '',
data: {
type: Array,
default: []
},
loading: {
type: Boolean,
default: false
},
selection: {
type: Boolean,
default: false
}
},
methods: {
rowkeyFunc(row) {
return new Date().getTime()
}
}
}
</script>
@@ -0,0 +1,368 @@
<template>
<div>
<template name="提案基本信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
提案基本信息
</div>
</div>
<van-cell-group>
<van-collapse v-model="secondedActiveNames" :border="false" accordion>
<van-collapse-item name="1">
<template #title>
<div>【提案】{{ viewData.proposalName }}
<van-icon name="question-o"/>
</div>
</template>
<van-cell :value="viewData.proposalCode" title="提案编号"></van-cell>
<van-cell title="提案时间">{{ viewData.createTime }}</van-cell>
<van-cell title="教代会届次">{{ viewData.meetingName }}</van-cell>
<van-cell title="代表工会">{{ viewData.unionName }}</van-cell>
<van-cell title="代表团名称">{{ viewData.delegationName }}</van-cell>
<van-cell title="提案类型">{{ viewData.typeName }}</van-cell>
<van-cell title="提案方式">{{ viewData.mannerName }}</van-cell>
<van-cell title="立案结果">{{ viewData.resultName ? viewData.resultName : '暂无' }}</van-cell>
<van-cell title="建议落实部门">{{ viewData.implementUnitName || '暂无' }}</van-cell>
<van-cell title="提案状态"><span :style="'color:'+viewData.stateColor">{{ viewData.stateName }}</span>
</van-cell>
</van-collapse-item>
<van-cell title="提案人">
{{ viewData.createUserName }}({{ viewData.loginname }})
</van-cell>
<van-collapse-item v-if="viewData.undertake&&viewData.undertake.length>0" name="3" title="承办单位">
<span v-if="!viewData.undertake">暂未分配</span>
<van-cell v-for="(item,index) in viewData.undertake" v-else
:title="item.undertakeType === 1 ? '主办' : '协办'">
{{ item.unitName }}
</van-cell>
</van-collapse-item>
<van-collapse-item name="4" title="案&emsp;&emsp;由">
<span v-html="viewData.brief"></span>
</van-collapse-item>
<van-collapse-item name="5" title="建议措施">
<span v-html="viewData.measures"></span>
</van-collapse-item>
</van-collapse>
<van-cell title="附件">
<div v-for="(obj,index) in viewData.files" class="text-nowrap color-puple"
@click="previewFile(obj.filepath,obj.filename,viewData.files,index)">
{{ obj.filename }}
</div>
</van-cell>
</van-cell-group>
</template>
<template v-if="viewData.seconded" name="附议信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
附议信息
</div>
</div>
<van-collapse v-model="secondedNames" :border="false">
<van-collapse-item name="1" title="附&emsp14;&emsp14;议&emsp14;&emsp14;人">
<van-cell v-for="(item,index) in viewData.seconded"
:value="item.isAgree === true ? '同意' : item.isAgree === false ? '拒绝' : '未附议'">
<template #title>
<span>{{ item.username }}({{ item.unitname }})</span>
</template>
</van-cell>
</van-collapse-item>
</van-collapse>
</template>
<template v-if="viewData.delegationAudit&&viewData.delegationAudit.length>0" name="团长审核信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
团长审核信息
</div>
</div>
<van-cell-group v-for="(item,index) in viewData.delegationAudit" class="info">
<van-cell title="审核时间">{{ item.auditTime }}</van-cell>
<van-cell title="审核结果">{{ item.flag ? '通过' : '退回' }}</van-cell>
<van-cell title="审核意见">{{ item.opinion }}</van-cell>
</van-cell-group>
</template>
<template v-if="viewData.secretaryAudit&&viewData.secretaryAudit.length>0" name="提案委员会立案信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
提案委员会立案信息
</div>
</div>
<van-cell-group v-for="item in viewData.secretaryAudit" class="info">
<van-cell title="审核时间">{{ item.auditTime }}</van-cell>
<van-cell title="立案编号">{{ viewData.caseCode }}</van-cell>
<van-cell title="审核结果">{{ viewData.resultName }}</van-cell>
<van-cell v-if="!viewData.undertake" title="承办单位">暂未分配</van-cell>
<van-collapse v-else v-model="undertakeActiveNames">
<van-collapse-item name="1" title="承办单位">
<van-cell v-for="(item,index) in viewData.undertake"
:title="item.undertakeType === 1 ? '主办' : '协办'">
{{ item.unitName }}
</van-cell>
</van-collapse-item>
</van-collapse>
<van-cell title="审核意见">{{ item.opinion }}</van-cell>
</van-cell-group>
</template>
<template v-if="viewData.caseAudit" name="确认承办单位">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
确认承办单位
</div>
</div>
<van-cell-group class="info">
<van-cell title="审核时间">{{ viewData.caseAudit.auditTime }}</van-cell>
<van-cell title="立案结果">{{ viewData.resultName }}</van-cell>
<van-collapse v-model="undertakeActiveNames">
<van-collapse-item name="2" title="承办单位">
<span v-if="!viewData.undertake">暂未分配</span>
<van-cell v-for="(item,index) in viewData.undertake" v-else
:title="item.undertakeType === 1 ? '主办' : '协办'">
{{ item.unitName }}
</van-cell>
</van-collapse-item>
</van-collapse>
<van-cell title="审核意见">{{ viewData.caseAudit.opinion }}</van-cell>
</van-cell-group>
</template>
<template v-if="viewData.makeLeader" name="分管校领导批示信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
分管校领导批示信息
</div>
</div>
<van-cell-group class="info">
<van-collapse v-model="undertakeActiveNames">
<van-collapse-item v-for="(v,k) in viewData.makeLeader" name="3">
<!--({{ v[0].undertakeType === 1 ? '主办' : '协办' }}) -->
<template #title>
{{ v[0].unitName }}
</template>
<template v-for="item in v">
<van-cell title="批示时间"> {{ item.auditTime }}</van-cell>
<van-cell title="批示意见"> {{ item.opinion }}</van-cell>
</template>
</van-collapse-item>
</van-collapse>
</van-cell-group>
</template>
<template v-if="viewData.replyInfo && viewData.replyInfo.length>0 && viewData.replyInfo.some(v=>v.isReply)"
name="承办单位答复">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
承办单位答复信息
</div>
</div>
<van-cell-group class="info">
<van-collapse v-model="undertakeActiveNames">
<van-collapse-item v-for="item in viewData.replyInfo" :name="item.unitName">
<template #title>
{{ item.unitName }}
</template>
<van-cell title="答复时间"> {{ item.replyTime }}</van-cell>
<van-cell title="落实情况"> {{ item.implementState }}</van-cell>
<van-cell title="答复信息">
<span v-html="item.replyContent"></span>
</van-cell>
<van-panel>
<template #header>
<div class="van-cell van-panel__header">
<div class="van-cell__title">
附件
</div>
</div>
</template>
<div style="padding: 5px 16px">
<upload v-if="item.replyFiles&&item.replyFiles.length>0" :del="false" :files.sync="item.files"
view></upload>
<span v-else>暂无</span>
</div>
</van-panel>
</van-collapse-item>
</van-collapse>
</van-cell-group>
</template>
<template v-if="viewData.feedback&&viewData.feedback.length>0" name="反馈评分信息">
<div class="van-cell-group__title">
<div class="van-sidebar-item van-sidebar-item--select">
反馈评分信息
</div>
</div>
<van-cell-group class="info">
<template v-for="item in viewData.feedback">
<van-cell title="反馈时间">{{ item.feedbackTime }}</van-cell>
<van-cell title="反馈结果">{{ item.feedbackResult }}</van-cell>
<van-cell title="反馈意见"><span v-html="item.feedbackOpinion"></span></van-cell>
<van-panel>
<template #header>
<div class="van-cell van-panel__header">
<div class="van-cell__title">
附件
</div>
</div>
</template>
<div style="padding: 5px 16px">
<upload :del="false" :files.sync="item.files" view></upload>
</div>
</van-panel>
</template>
</van-cell-group>
</template>
<template v-if="handle">
<div id="wechat_proposal_handle">
<slot name="handle"></slot>
</div>
</template>
</div>
</template>
<script>
function removeHTMLTag(str) {
str = str.replace(/<\/?[^>]*>/g, ''); //去除HTML tag
str = str.replace(/[ | ]*\n/g, '\n'); //去除行尾空白
str = str.replace(/\n[\s| | ]*\r/g, '\n'); //去除多余空行
str = str.replace(/&nbsp;/ig, '');//去掉&nbsp;
return str;
}
module.exports = {
data() {
return {
activeName: 1,
secondedActiveNames: '4',
secondedNames: [],
undertakeActiveNames: [],
briefActiveNames: [],
viewData: {},
}
},
props: {
handle: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '审核'
},
proposal_id: String
// pid:String
},
mounted() {
},
components: {
'upload': httpVueLoader('/components/plugins/VantFileUpload.vue'),
},
methods: {
async openView(id) {
this.viewData = await proposal.getProposalInfo(id)
if (this.viewData.files) {
this.viewData.files = JSON.parse(this.viewData.files)
}
if (this.viewData.replyInfo) {
const keys = Object.keys(this.viewData.replyInfo)
keys.map(k => {
if (this.viewData.replyInfo[k].replyFiles != null) {
this.viewData.replyInfo[k].replyFiles = JSON.parse(this.viewData.replyInfo[k].replyFiles)
}
})
if (this.viewData.feedback && this.viewData.feedback.length > 0) {
this.viewData.feedback.map(v => {
v.files = JSON.parse(v.files)
})
}
}
this.activeName = this.handle ? "999" : "1"
},
previewFile(filepath, filename, fileList, index) {
const doctype = ['doc', 'docx', 'xls', 'xlsx'];
const pictype = ['jpg', 'png', 'gif', 'jpeg'];
let filetype = filepath.substring(filepath.lastIndexOf('.') + 1, filepath.length);
if (doctype.indexOf(filetype) > -1) {
const pdfpath = 'https://' + window.location.hostname + '/assets/platform/plugins/pdf/web/viewer.html?file=' +
encodeURIComponent("/platform/base/Common/preview?filepath=" + filepath + "&filename=" + filename);
window.open(pdfpath);
} else if (pictype.indexOf(filetype) > -1) {
let ele = document.createElement("div");
fileList.forEach(v => {
let fp = v.filepath.substring(v.filepath.lastIndexOf('.') + 1, v.filepath.length);
if (pictype.indexOf(fp) > -1) {
const image = new Image();
const src = FILE_DOMAIN + v.filepath
image.src = src
image.alt = v.filename
ele.appendChild(image);
}
})
const viewer = new Viewer(ele, {
title: function (img, obj) {
return img.getAttribute("alt");
}
});
viewer.show();
} else {
alert('该文件不支持在手机端预览')
}
}
},
watch: {
'handle'(val) {
if (val === true) {
this.$nextTick(() => {
window.scrollTo(0, document.getElementById('wechat_proposal_handle').offsetTop)
})
}
}
},
async created() {
await this.openView(this.proposal_id)
if (this.handle) {
window.scrollTo(0, document.getElementById('wechat_proposal_handle').offsetTop)
}
}
}
</script>
<style>
.van-cell__value {
color: #323233 !important;
}
.van-cell-group__title {
padding-left: 0 !important;
}
.van-sidebar-item {
font-size: 16px !important;
text-indent: 4px !important;
}
.van-sidebar-item--select::before {
left: 5px !important;
}
</style>
@@ -0,0 +1,123 @@
<template>
<div>
<template v-if="questionType===3">
<el-radio-group v-model="shopRadio">
<el-radio-button label="人员表"></el-radio-button>
<el-radio-button label="清单表"></el-radio-button>
</el-radio-group>
<el-table :data="shopDataMap.person" v-show="shopRadio === '人员表'">
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column prop="unitname" label="所属单位"></el-table-column>
<el-table-column prop="unionname" label="所属工会"></el-table-column>
<el-table-column prop="totalNumber" label="选购总数"></el-table-column>
<el-table-column prop="totalPrice" label="总金额"></el-table-column>
<el-table-column prop="signerUserName" label="签收人姓名"></el-table-column>
<el-table-column prop="signerPhone" label="联系方式"></el-table-column>
<el-table-column prop="signerAddress" label="收货地址"></el-table-column>
</el-table>
<el-table :data="shopDataMap.list" v-show="shopRadio === '清单表'">
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column prop="commodityName" label="商品名称"></el-table-column>
<el-table-column prop="price" label="商品单价"></el-table-column>
<el-table-column prop="number" label="选购数量"></el-table-column>
</el-table>
</template>
<template v-if="questionType===2">
<el-table :data="personnelData" row-key="id" ref="table">
<el-table-column type="index" width="50"></el-table-column>
<el-table-column prop="username" label="姓名"></el-table-column>
<el-table-column prop="loginname" label="工号"></el-table-column>
<el-table-column prop="unitname" label="所属单位"></el-table-column>
<el-table-column prop="unionname" label="所属工会"></el-table-column>
<el-table-column prop="fraction" label="分值"></el-table-column>
</el-table>
</template>
<template v-if="questionType===4">
<div>
<!-- <el-radio-group v-model="cakeForm.isSelected" @change="getCakeData">-->
<!-- <el-radio-button :label="true">已选择</el-radio-button>-->
<!-- <el-radio-button :label="false">未选择</el-radio-button>-->
<!-- </el-radio-group>-->
<el-button type="primary"
class="pull-right"
icon="el-icon-printer"
@click="doExportCakeUser">导出领取人员表
</el-button>
<!-- <el-divider></el-divider>-->
</div>
<el-table :data="cakeData" row-key="id" ref="table">
<el-table-column type="index" width="50"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="wtxt" label="所选物品"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
</el-table>
</template>
</div>
</template>
<script>
module.exports = {
name: "questionDetail",
data() {
return {
questionType: null,
shopRadio: '人员表',
shopDataMap: {
person: [],
list: []
},
personnelData: [],
cakeData: [],
unionId: null,
questionId: null,
cakeForm: {
isSelected: true
}
}
},
methods: {
async openView(questionId, questionList, unionId) {
this.questionId = questionId
const question = questionList.find(v => v.qid === questionId)
const questionType = question.qlx
this.questionType = questionType
this.unionId = unionId
switch (questionType) {
case 3:
const shopData = await $.get('/platform/question/intentionalChoice/shopDetail', {questionId, unionId})
this.shopDataMap.person = shopData[0].data
this.shopDataMap.list = shopData[1].data
break
case 2:
const answerData = await $.get(loc() + "/getAnswerData", {questionId, unionId})
this.personnelData = answerData.data
break
case 4:
// const cakeData = await $.get('/platform/zgfw/question/stats/cakeDataByUnionId', {questionId, unionId})
const cakeData = await $.get('/platform/question/cake/cakeUserData', {questionId, unionId})
this.cakeData = cakeData.data
break
}
},
doExportCakeUser() {
window.location.href =
'/platform/question/cake/doExportCakeUser?questionId=' + this.questionId + '&ghId=' + this.unionId + '&isSelected=true'
}
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,368 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading" class="ml25">
<el-tab-pane label="申请信息" name="1">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0" class="ml25">
<el-row gutter="60">
<el-col :span="12">
<el-form-item label="经办人">
{{ viewData.userName }}({{ viewData.loginName }})
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
{{ viewData.mobile }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报销类别">
{{ viewData.reimbursementItemSort === 'fy' ? '费用报销' : '领款凭证' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报销项目">
{{ viewData.reimbursementItemName }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="支付方式">
{{ viewData.paymentMethodName }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="户名">
{{ viewData.bankUserName }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账号">
{{ viewData.bankCardNumber }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户行">
{{ viewData.bankOfDeposit }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60" v-if="viewData.reimbursementItemId==='fyww'||viewData.reimbursementItemId==='zfww'">
<el-col :span="12">
<el-form-item label="慰问对象">
{{ viewData.be_username }}({{ viewData.be_loginname }})
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性&emsp;&emsp;别">
{{ viewData.sex }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生&emsp;&emsp;日">
{{ viewData.birthday }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号">
{{ viewData.idCard }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
{{ viewData.conMobile }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="慰问类型">
{{ viewData.typeName }}
</el-form-item>
</el-col>
<template v-if="viewData.typeCode === 'D'">
<el-col :span="12">
<el-form-item label="住院病由">
{{ viewData.hospital_by }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="住院时间">
{{ viewData.starting_time }}-{{ viewData.end_time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入住医院">
{{ viewData.the_hospital }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当年次数">
{{ viewData.hospital_yearNum }}
</el-form-item>
</el-col>
</template>
<el-col :span="12">
<el-form-item label="慰问金额">
{{ viewData.money }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件张数">
{{ viewData.files_num }}
</el-form-item>
</el-col>
<template v-if="viewData.typeCode==='E'">
<el-col :span="12">
<el-form-item label="去逝时间">
{{ viewData.dead_time }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="与被慰问人关系">
{{ viewData.dead_gx }}
</el-form-item>
</el-col>
</template>
<template v-if="viewData.typeCode==='A'">
<el-col :span="12">
<el-form-item label="结婚时间">
{{ viewData.marry_time }}
</el-form-item>
</el-col>
</template>
<template v-if="viewData.typeCode==='B'">
<el-col :span="12">
<el-form-item label="生育时间">
{{ viewData.birth_time }}
</el-form-item>
</el-col>
</template>
<el-col :span="12">
<el-form-item label="慰问时间">
{{ viewData.occur_time }}
</el-form-item>
</el-col>
</el-row>
<el-row v-else gutter="60">
<el-col :span="12">
<el-form-item label="活动名称">
{{ viewData.activity_name }}
</el-form-item>
</el-col>
<el-col v-if="viewData.reimbursementItemId=='fyhd'" :span="12">
<el-form-item label="活动类型">
{{ viewData.activity_type === 1 ? '分工会活动' : viewData.activity_type === 2 ? '校工会活动' : '协会(社团)活动' }}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.activity_number">
<el-form-item label="活动人数">
{{ viewData.activity_number }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动地点">
{{ viewData.venue }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报销金额">
{{ viewData.money }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动时间">
{{ viewData.activity_time }}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewData.reimbursementItemId=='fyhd'">
<el-form-item label="附件张数">
{{ viewData.files_num }}
</el-form-item>
</el-col>
</el-row>
<el-row gutter="60">
<!-- <el-col :span="12">-->
<!-- <el-form-item label="支付内容">-->
<!-- {{ viewData.cause }}-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="备注">
{{ viewData.remark }}
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="">
<el-table :data="viewData.goods" border size="mini" style="width: 100%">
<el-table-column sortable type="index" width="100" label="序号"
align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="摘要" align="center"
header-align="center">
<template slot-scope="{row}">
{{ row.name }}
</template>
</el-table-column>
<el-table-column prop="price" label="金额" align="center"
header-align="center">
<template slot-scope="{row}">
{{ row.price }}
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="files">
<file-upload view :files.sync="viewData.files"
v-if="viewData.files&&viewData.files.length>0"></file-upload>
<span v-else>暂无</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="审核信息" name="2" v-if="viewData.accountingAuditId">
<el-form label-suffix=":" label-position="left" style="padding: 20px 0" class="ml25">
<el-col :span="12">
<el-form-item label="审核人">
{{ viewData.accounting.username }}({{ viewData.accounting.loginname }})
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
{{ viewData.accounting.auditTime }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核意见">
{{ viewData.accounting.auditOpinion ? viewData.accounting.auditOpinion : '暂无' }}
</el-form-item>
</el-col>
</el-form>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
activeName: "1",
viewData: {},
loading: true,
}
},
components: {
'file-upload': httpVueLoader('/components/plugins/FileUpload.vue'),
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
async getInfo(id) {
this.loading = true
const {data, code, msg} = await $.get("/activity/reimbursement/list/findOne", {id})
this.loading = false
if (data) {
this.activeName = this.handle ? "999" : "1"
condolence.toFormData(data)
this.viewData = data
console.log(this.viewData)
} else {
this.viewData = {}
this.$message({
message: "获取信息失败",
type: 'error'
});
}
},
}
}
</script>
<style>
.item-form {
padding: 0 25px;
}
</style>
@@ -0,0 +1,28 @@
<template>
<div>
<div class="btn-group tool-button mt5">
<el-select v-model="unionid" placeholder="基层工会">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
</template>
<script>
module.exports = {
data(){
return{
unionList:[]
}
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,192 @@
<template>
<div class="signature-wrap">
<canvas id="canvas"></canvas>
<div class="action-buttons">
<button @click="clear" class="action-button-danger" type="button">清空</button>
<button @click="undo" class="action-button-warning" type="button">撤销</button>
<button @click="save" class="action-button-primary" type="button">确定</button>
</div>
</div>
</template>
<script>
// function a() {
// // 检查当前屏幕方向
// if (window.orientation === 0 || window.orientation === 180) {
// // 竖屏状态
// console.log("竖屏状态")
// alert("当前不支持竖屏,请将设备调整为横屏!")
// } else {
// // 横屏状态,执行禁止旋转的操作
// alert("当前不支持横屏,请将设备调整为竖屏!")
// // 可以在这里使内容固定在竖屏方向
// const innerWidth = window.innerWidth
// const innerHeight = window.innerHeight
// alert(innerHeight)
// alert(innerWidth)
// }
// }
//
// window.addEventListener("orientationchange", a)
// a()
let signature = null
module.exports = {
name: "sysSignature",
data() {
return {
content: null,
initialized: false
}
},
methods: {
clear() {
signature.clear()
},
undo() {
signature.undo()
},
rotate() {
signature.getRotateCanvas(90)
},
save() {
if (signature.isEmpty()) {
alert("请签字后再保存")
return
}
// const png = signature.getPNG()
//旋转一下 横过来
const rotateCanvas = signature.getRotateCanvas(-90)
this.$emit("save", rotateCanvas.toDataURL())
},
initSignature() {
if (this.initialized) return;
const canvas = document.getElementById("canvas");
if (!canvas) return;
// 检查 canvas 是否已有有效尺寸
const rect = canvas.getBoundingClientRect();
if (rect.width <= 0 || rect.height <= 0) {
// 尺寸无效,稍后重试
setTimeout(() => this.initSignature(), 50);
return;
}
const padding = 30;
const width = window.innerWidth - padding;
const height = window.innerHeight - padding;
// 设置 CSS 尺寸
canvas.style.width = `${width}px`;
canvas.style.height = `${height}px`;
// 高清绘制
const dpr = window.devicePixelRatio || 1;
canvas.width = width * dpr;
canvas.height = height * dpr;
// 销毁旧实例(防止重复)
if (signature) {
signature.clear();
}
signature = new SmoothSignature(canvas, {
width: width,
height: height,
scale: dpr,
minWidth: 4,
maxWidth: 10,
color: "#000000"
});
this.initialized = true;
}
},
mounted() {
// 延迟初始化,确保 DOM 渲染完成
this.$nextTick(() => {
this.initSignature();
});
},
beforeDestroy() {
signature = null;
this.initialized = false;
}
}
</script>
<style scoped>
.signature-wrap {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 15px;
background: #ffffff;
}
.signature-wrap .action {
width: 50px;
display: flex;
justify-content: center;
align-items: center;
}
.signature-wrap .action-buttons {
white-space: nowrap;
transform: rotate(90deg);
display: flex;
column-gap: 10px;
position: fixed;
bottom: 0px;
left: 60px;
transform: rotate(90deg);
display: flex;
flex-direction: column;
row-gap: 20px;
}
.action-buttons button {
color: #ffffff;
position: relative;
display: inline-block;
box-sizing: border-box;
height: auto;
padding: 3px 12px;
margin: 0;
font-size: 15px;
line-height: 1.4;
text-align: center;
border-radius: 4px;
cursor: pointer;
transition: opacity 0.15s ease;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.action-button-primary {
background-color: #1677ff;
border: 1px solid #1677ff;
}
.action-button-danger {
background-color: #ff3141;
border: 1px solid #ff3141;
}
.action-button-warning {
background-color: #ff8f1f;
border: 1px solid #ff8f1f;
}
.signature-wrap canvas {
flex: 1;
border-radius: 10px;
border: 2px dashed #ccc;
}
</style>
@@ -0,0 +1,136 @@
<template>
<div class="h5-signature">
<div v-if="!showSignaturePanel" class="main-panel">
<slot v-if="$slots.default"></slot>
<template v-else>
<van-button @click="openSignature" class="open-button" size="middle" plain native-type="button">打开签字板</van-button>
<van-image :src="signatureContent">
<template v-slot:error>请点击下方打开签字板按钮进行签字</template>
</van-image>
</template>
</div>
<van-popup v-model="showSignaturePanel" :style="{ height: '100vh', width: '100vw', display: 'flex', 'align-items': 'center' }">
<signature v-if="showSignaturePanel" @save="save"></signature>
</van-popup>
</div>
</template>
<script>
module.exports = {
name: "h5",
components: {
signature: httpVueLoader("/components/sign/index.vue?v=" + new Date().getTime())
},
props: {
value: {
type: String,
default: ""
}
},
watch: {
value: {
handler(val) {
if (!val) {
this.signatureContent = val
return
}
if (val.startsWith("/signature/getSignData?") || val.startsWith('data:image/png;')) {
this.signatureContent = val
} else {
this.signatureContent = '/signature/getSignData?path=' + val
}
},
immediate: true
}
},
data() {
return {
signatureContent: null,
showSignaturePanel: false
}
},
methods: {
openSignature() {
this.showSignaturePanel = true
},
save(signature) {
$.post("/mobile/common/signing/update", {sign: signature})
.then((res) => {
if (res.code === 0) {
this.$toast.success("保存成功")
this.showSignaturePanel = false
this.getMySign()
} else {
this.$toast.fail("保存失败")
}
})
},
base64ToFile(base64Data, filename) {
// 将base64的数据部分提取出来
const parts = base64Data.split(";base64,")
const contentType = parts[0].split(":")[1]
const raw = window.atob(parts[1])
const rawLength = raw.length
const uInt8Array = new Uint8Array(rawLength)
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i)
}
// 使用Blob对象创建File对象
const blob = new Blob([uInt8Array], { type: contentType })
blob.lastModifiedDate = new Date()
blob.name = filename
return new File([blob], filename, { type: contentType })
},
async getMySign() {
const data = await $.get("/mobile/common/signing/getMySign")
if (data) {
if (data.startsWith("/signature/getSignData?") || data.startsWith('data:image/png;')) {
this.signatureContent = data
} else {
this.signatureContent = '/signature/getSignData?path=' + data
}
this.$emit("input", data)
}
}
},
async created() {
await this.getMySign()
},
}
</script>
<style>
.h5-signature {
width: 100%;
}
.main-panel {
position: relative;
flex-direction: column-reverse;
display: flex;
row-gap: 10px;
}
.main-panel .van-image {
min-height: 150px;
display: block;
width: 90%;
margin: 0 auto;
background: white;
border-radius: 8px;
}
.main-panel .open-button {
margin: 0 auto;
width: 90%;
height: 36px;
border-radius: 12px;
color: white;
background: rgb(33, 109, 179);
border-color: rgb(33, 109, 179);
font-size: 14px;
}
</style>
@@ -0,0 +1,211 @@
<template>
<el-card class="box-card" shadow="never">
<div class="signature-body">
<el-collapse-transition>
<div v-show="showQrCode" class="qr-code-div">
<el-link type="primary" :underline="false">{{ scan_title }}</el-link>
<QrCode v-if="postAddress" :options="{ width: 126 }" :value="postAddress"></QrCode>
</div>
</el-collapse-transition>
<el-image fit="contain" v-show="!showQrCode" v-loading="loading"
style="height: 100px;width: 100%" :src="imageUrl">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<el-link type="danger" style="font-size: 12px;margin-top: 20px" @click="refresh();clear()"
icon="el-icon-edit"
v-show="!showQrCode">重签
</el-link>
</div>
</el-card>
</template>
<script>
window.signatureInterval = null
module.exports = {
name: "Signature",
props: {
scan_title: {
type: String,
default: '请使用【手机钉钉】扫描二维码进行签字'
},
prefix: {
type: String,
default: 'DEFAULT'
},
qz: {
type: String,
default: ''
},
value: {
type: String,
default: ''
},
is_value_base64: {
type: Boolean,
default: true
}
},
model: {
prop: 'qz',
event: 'change'
},
data() {
return {
showQrCode: false,
loading: true,
postAddress: '',
imageUrl: '',
}
},
methods: {
refresh() {
this.qz = ''
},
getImageUrl(data) {
if (!data) {
return
}
if (data.startsWith("/signature/getSignData?") || data.startsWith('data:image/png;')) {
this.imageUrl = data
} else {
this.imageUrl = '/signature/getSignData?path=' + data
}
localStorage.setItem("signature", data)
localStorage.setItem("signatureWelfare", data)
clearInterval(signatureInterval)
},
startRequest() {
this.imageUrl = ''
clearInterval(signatureInterval)
const ts = new Date().getTime() + (Math.floor(Math.random() * (1000 - 1 + 1)) + 1).toString()
console.log(ts)
this.postAddress = location.protocol + '//' + location.host + '/signature?id=' + ts
// this.postAddress = 'https://zhgh.hmc.edu.cn/signature?id=' + ts
this.showQrCode = true
console.log(this.postAddress)
window.signatureInterval = setInterval(() => {
$.get("/signature/getBase64?id=" + ts).then(res => {
if (res != null) {
this.$emit("change", res)
this.$emit("update:qz", res)
console.log(res)
this.getImageUrl(res)
this.qz = res
this.loading = false
this.save()
clearInterval(signatureInterval)
}
})
}, 1000 * 3)
},
async save() {
if (this.is_value_base64) {
localStorage.setItem("signature", this.qz)
} else {
return localStorage.setItem("signatureWelfare", this.qz)
}
},
clear() {
if (this.is_value_base64) {
localStorage.removeItem("signature")
} else {
localStorage.removeItem("signatureWelfare")
}
},
getSignature() {
if (this.is_value_base64) {
return localStorage.getItem("signature")
} else {
return localStorage.getItem("signatureWelfare")
}
},
async getMySign() {
setTimeout(() => {
if (this.qz) {
this.getImageUrl(this.qz)
} else {
$.get("/mobile/common/signing/getMySign").then(data => {
if (data) {
this.getImageUrl(data)
this.$emit("change", data)
this.$emit("update:qz", data)
this.qz = data
}
})
}
}, 500)
}
},
created() {
this.getMySign()
},
watch: {
'qz': {
handler(s) {
this.loading = !s
if (!s) {
const qz = this.getSignature()
if (!qz) {
this.$emit("change", '')
this.$emit("update:qz", '')
this.startRequest()
} else {
this.qz = qz
this.$emit("change", qz)
this.$emit("update:qz", qz)
}
} else {
this.qz = s
this.showQrCode = false
}
},
immediate: true
}
}
}
</script>
<style scoped>
.el-card__body {
position: relative !important;
}
.signature-body {
width: 100%;
height: 100%;
min-height: 160px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.qr-code-div {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
z-index: 999;
}
</style>
@@ -0,0 +1,272 @@
<template>
<div>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
style="width: 120px;">
<el-option label="角色" value="role.name"></el-option>
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search"
@click="pageData"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加
</el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-row class="el-table-container">
<el-table
:data="tableData"
size="medium"
header-align="center"
v-loading="tableLoading"
style="width: 100%"
>
<el-table-column
prop="rolename"
label="角色"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="username"
label="姓名"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="loginname"
label="工号"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="mobile"
label="联系方式"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="userOnline"
label="操作"
header-align="center"
align="center"
width="150">
<template scope="{row}">
<el-popconfirm
title="确定要删除吗?"
@confirm="doDelete(row)"
>
<el-button slot="reference" size="mini" :loading="row.delLoading" type="danger" icon="el-icon-delete">
</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</el-row>
</el-card>
<el-dialog
title="添加"
:visible.sync="addDialogVisible" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="80px">
<el-form-item prop="roleCode" label="角色">
<el-select v-model="formData.roleCode"
placeholder="角色" filterable
style="width: 100%">
<el-option
v-for="item in roleOptions"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="userId" label="人员">
<el-select
style="width: 100%"
v-model="formData.userId"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="(k)=>{userRemoteMethod(k)}"
:loading="userLoading">
<el-option
v-for="i in userOptions"
:key="i.id"
:label="i.username+'('+i.loginname+')'"
:value="i.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false" :disabled="submitLoading">取 消</el-button>
<el-button type="primary" :loading="submitLoading" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
name: "UnionCadreange",
props: {
union: String,
},
data() {
return {
pageForm: {
searchName: 'role.name'
},
tableLoading: false,
tableData: [],
roleOptions: [],
addDialogVisible: false,
userLoading: false,
userOptions: [],
formData: {},
formRules: {
roleCode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
userId: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
submitLoading: false
}
},
watch: {
union(val) {
this.pageForm = {
searchName: 'role.name'
}
this.userOptions = []
this.pageData()
}
},
methods: {
doSearch(){
this.pageData();
},
openAdd() {
this.formData = {};
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields();
this.addDialogVisible = true;
},
async doAdd() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.formData.type = 1
this.formData.unionid = this.union
this.submitLoading = true
const {code} = await $.post(loc() + '/changeSchoolUnionRole', this.formData)
if (code == 0) {
this.pageData()
this.addDialogVisible = false;
}
this.$notify({
title: code == 0 ? '成功' : '失败',
type: code == 0 ? 'success' : 'error'
});
this.submitLoading = false
}
})
},
async doDelete(row) {
const {id, roleid} = row
this.$set(row, "delLoading", true)
const {code} = await $.post(loc() + '/changeSchoolUnionRole', {
unionid: this.union,
roleId: roleid,
userId: id,
type: 2
})
if (code == 0) {
this.pageData()
}
this.$notify({
title: code == 0 ? '成功' : '失败',
type: code == 0 ? 'success' : 'error'
});
this.$set(row, "delLoading", false)
},
async userRemoteMethod(query) {
if (!query) {
this.userOptions = []
return
}
this.userLoading = true
const users = await searchUser(query, this.union)
this.userOptions = users
this.userLoading = false
},
async pageData() {
this.tableLoading = true
this.pageForm.unionid = this.union
const {code, data} = await $.get('/platform/sys/union/mange/schoolUnionRoles', this.pageForm)
if (code == 0) {
this.tableData = data
} else {
this.tableData = []
}
this.tableLoading = false
},
},
async created() {
this.pageData()
if (this.union) {
this.roleOptions = await getDictOptions("GrassrootsCadres")
} else {
this.roleOptions = await getDictOptions("SchoolRoles")
}
},
}
</script>
<style scoped>
</style>
@@ -0,0 +1,135 @@
<template>
<div>
<el-card shadow="never" class="mt10">
<table-tool label="基层干部" :app="this">
<template #func>
<el-button size="small" @click="audit(true)" :disabled="!multipleSelection.length" type="primary"
icon="el-icon-check">通过
</el-button>
<el-button size="small" @click="audit(false)" :disabled="!multipleSelection.length" type="danger"
icon="el-icon-check">拒绝
</el-button>
</template>
</table-tool>
<el-table ref="table" :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table" height="70vh"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop==='workersCongressSession'" scope="{row:{workersCongressSession}}">
第{{ workersCongressSession }}届
</template>
<template v-else-if="column.prop==='joining'" scope="{row:{joining}}">
<span v-if="joining" class="text-info">加入</span>
<span v-else class="text-danger">退出</span>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</div>
</template>
<script>
module.exports = {
mixins: [initTableMixins],
props: {
key: {
type: Number,
default: 0
}
},
data() {
return {
tableColumns: [
{prop: 'username', label: '姓名'},
{prop: 'loginname', label: '工号'},
{prop: 'unionname', label: '所属工会'},
{prop: 'mobile', label: '联系方式'},
{prop: 'rolename', label: '职务'},
{prop: 'workersCongressSession', label: '届次'},
{prop: 'joining', label: '申请类型'},
],
multipleSelection: [],
}
},
methods: {
handleSelectionChange(val) {
this.multipleSelection = val;
},
audit(pass) {
this.$confirm('是否确认提交?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const ids = JSON.stringify(this.multipleSelection.map(v => v.id))
const resp = await $.post("/platform/union/cadre/audit", {ids, pass})
if (resp.code === 0) {
this.pageData()
this.$refs.table.clearSelection();
this.notifySuccess(resp.msg)
}else{
this.notifyError(resp.msg)
}
})
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post("/platform/union/cadre/audit/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
},
watch: {
key(val) {
this.doSearch()
}
},
created() {
this.doSearch()
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,338 @@
<template>
<div>
<el-card shadow="never">
<div class="btn-group tool-button mt5">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
style="width: 120px;">
<el-option label="届次" value="uc.workersCongressSession"></el-option>
<el-option label="分工" value="role.name"></el-option>
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-button type="primary" icon="el-icon-search"
@click="doSearch"></el-button>
</div>
<div class="pull-right offscreen-right mt5">
<el-button size="medium" @click="openAdd"><i class="ti-plus"></i> 添加
</el-button>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table
:data="tableData"
size="medium"
header-align="center"
v-loading="tableLoading"
style="width: 100%"
height="580"
@sort-change="pageOrder"
>
<el-table-column
prop="username"
label="姓名"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="loginname"
label="工号"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="mobile"
label="联系方式"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
sortable
prop="rolename"
label="分工"
header-align="center"
align="center" show-overflow-tooltip
>
</el-table-column>
<el-table-column
sortable
prop="workersCongressSession"
label="届次"
header-align="center"
align="center" show-overflow-tooltip
>
<template scope="{row:{workersCongressSession}}">
第{{ workersCongressSession }}届
</template>
</el-table-column>
<el-table-column
prop="state"
label="状态"
header-align="center"
align="center" show-overflow-tooltip
>
<template scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
</el-table-column>
<el-table-column
prop="userOnline"
label="操作"
header-align="center"
align="center"
width="150">
<template scope="{row}">
<el-popconfirm
title="确定要移除吗?"
@confirm="doDelete(row)"
>
<el-button slot="reference" :disabled="!row.can" size="mini" :loading="row.delLoading" type="danger"
icon="el-icon-delete">
</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-card>
<el-dialog
title="添加"
:visible.sync="addDialogVisible" width="40%">
<el-form :model="formData" ref="addForm" :rules="formRules" label-width="80px">
<el-form-item prop="workersCongressSession" label="届次">
<dict-select v-model="formData.workersCongressSession" style="width: 100%"
placeholder="届次"
code="jc"></dict-select>
</el-form-item>
<el-form-item prop="roleCode" label="分工">
<el-select v-model="formData.roleCode"
placeholder="分工" filterable
style="width: 100%">
<el-option
v-for="item in roleOptions"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="userId" label="人员">
<el-select
style="width: 100%"
v-model="formData.userId"
filterable
remote
reserve-keyword
placeholder="请输入姓名或工号查找"
:remote-method="(k)=>{userRemoteMethod(k)}"
:loading="userLoading">
<el-option
v-for="i in userOptions"
:key="i.id"
:label="i.username+'('+i.loginname+')'"
:value="i.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false" :disabled="submitLoading">取 消</el-button>
<el-button type="primary" :loading="submitLoading" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
module.exports = {
name: "UnionCadreange",
components: {
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0')
},
props: {
union: String,
},
data() {
return {
pageForm: {
searchName: 'uc.workersCongressSession',
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
tableLoading: false,
tableData: [],
roleOptions: [],
addDialogVisible: false,
userLoading: false,
userOptions: [],
formData: {},
formRules: {
workersCongressSession: [{required: true, message: '必选', trigger: ['blur', 'change']}],
roleCode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
userId: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
submitLoading: false
}
},
watch: {
union(val) {
this.pageForm = {
searchName: 'uc.workersCongressSession',
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
}
this.userOptions = []
this.pageData()
}
},
methods: {
openAdd() {
this.formData = {};
if (this.$refs["addForm"]) this.$refs["addForm"].resetFields();
this.addDialogVisible = true;
},
async doAdd() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.formData.type = 1
this.formData.unionId = this.union
this.submitLoading = true
const {code, msg} = await $.post('/platform/union/cadre/createCadre', this.formData)
if (code === 0) {
this.doSearch()
this.addDialogVisible = false;
}
this.$notify({
title: code === 0 ? '成功' : '失败',
type: code === 0 ? 'success' : 'error',
message: msg,
});
this.submitLoading = false
}
})
},
async doDelete(row) {
const {id} = row
this.$set(row, "delLoading", true)
const {code} = await $.post('/platform/union/cadre/removeCadre', {id})
if (code === 0) {
this.pageData()
}
this.$notify({
title: code === 0 ? '成功' : '失败',
type: code === 0 ? 'success' : 'error'
});
this.$set(row, "delLoading", false)
},
async userRemoteMethod(query) {
if (!query) {
this.userOptions = []
return
}
this.userLoading = true
const users = await searchUser(query, this.union)
this.userOptions = users
this.userLoading = false
},
async pageData() {
this.tableLoading = true
this.pageForm.unionid = this.union
const resp = await $.get('/platform/union/cadre/pageData', this.pageForm)
this.tableLoading = false
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.tableData = []
}
},
doSearch() {
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData();
},
},
async created() {
this.doSearch()
this.roleOptions = await getDictOptions("GrassrootsCadres")
},
}
</script>
<style scoped>
</style>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,149 @@
<template>
<div>
<transition name="el-zoom-in-center">
<div style="padding: 10px" v-show="smm.status==='detail'">
<el-button icon="el-icon-back" type="text" @click="changeStatus" style="font-size: 18px">返回</el-button>
<el-tabs v-model="smm.activeName">
<el-tab-pane label="申请信息" name="1">
<el-card>
<table class="table table-bordered">
<tr>
<td width="20%">申请人</td>
<td>{{viewData.sqrusername}}</td>
<td width="20%">慰问对象</td>
<td>{{viewData.wwrusername}}</td>
</tr>
<tr>
<td>慰问部门</td>
<td>{{viewData.wwbm}}</td>
<td>职称</td>
<td>{{viewData.wwuserzc}}</td>
</tr>
<tr>
<td>拟慰问时间</td>
<td>{{viewData.planwwsj}}</td>
<td>申请金额</td>
<td>{{viewData.wwsqje}}</td>
</tr>
<tr>
<td>申请事由</td>
<td colspan="3">
<div class="text-left">
{{viewData.wwsqsy}}
</div>
</td>
</tr>
<tr>
<td>申请人签字</td>
<td colspan="3">
<div>
<el-image style="width: 200px;height:auto" :src="viewData.sqrqz"/>
</div>
</td>
</tr>
</table>
</el-card>
</el-tab-pane>
<el-tab-pane label="基层工会审核" name="2" v-if="viewData.status>1">
<el-card>
<el-form label-position="right" label-width="100px">
<el-form-item label="审核人">
<div>{{viewData.fghshrname}}</div>
</el-form-item>
<el-form-item label="审核时间">
<div>{{viewData.fghshsj}}</div>
</el-form-item>
<el-form-item label="审核结果">
<div>{{[2,3,5].includes(viewData.status)?'通过':'不通过'}}</div>
</el-form-item>
<el-form-item label="审核意见">
<div style="word-wrap: break-word!important">{{viewData.fghshyj}}</div>
</el-form-item>
<el-form-item label="签字">
<el-image style="width: 200px;height:auto" :src="viewData.fghqz"/>
</el-form-item>
</el-form>
</el-card>
</el-tab-pane>
<el-tab-pane label="校工会审核" name="3" v-if="viewData.status>3">
<el-card>
<el-form label-position="right" label-width="100px">
<el-form-item label="审核人">
<div>{{viewData.xghshrname}}</div>
</el-form-item>
<el-form-item label="审核时间">
<div>{{viewData.xghshsj}}</div>
</el-form-item>
<el-form-item label="审核结果">
<div>{{[2,3,5].includes(viewData.status)?'通过':'不通过'}}</div>
</el-form-item>
<el-form-item label="审核意见">
<div style="word-wrap: break-word!important">{{viewData.xghshyj}}</div>
</el-form-item>
<el-form-item label="签字">
<el-image style="width: 200px;height:auto" :src="viewData.xghqz"/>
</el-form-item>
</el-form>
</el-card>
</el-tab-pane>
<slot name="handle">
</slot>
</el-tabs>
</div>
</transition>
</div>
</template>
<script>
module.exports = {
props: {
smm: {
type: 'Object',
default: () => {
return {
status: 'table',
id: '',
data: {},
activeName: '',
}
}
}
},
data() {
return {
viewData: {
sqrusername:""
}
}
},
methods: {
changeStatus() {
this.smm = {status: 'table', id: ''}
this.$emit('update:smm', this.smm)
},
},
watch: {
smm(o) {
if(o.status==='detail'){
this.viewData = o.data
}
}
}
}
</script>
<style scoped>
.el-card{
margin: 10px;
}
.el-tab-pane {
height: 100%;
overflow-y: auto;
}
td{
text-align: center!important;
vertical-align: middle!important;
}
</style>