Files
dvcp_v2_webapp/packages/party/AppMeetingChinaunion/components/appThreeMeetingUser.vue
2022-12-01 09:35:20 +08:00

453 lines
20 KiB
Vue

<!--suppress ALL -->
<template>
<section class="appThreeMeetingUser init-list-table bg369">
<ai-title title="统计详情" isShowBack @onBackClick="$parent.goBack()" isShowBottomBorder></ai-title>
<div class="main-content">
<el-row class="searchBar border-radius2" type="flex" justify="space-between" :style="search.style" :gutter="2" style="border-bottom: 1px solid #eee;">
<el-col style="margin-bottom:6px">
<el-row :gutter="8" type="flex">
<section v-for="(item,i) in columns" :key="i">
<el-col v-if="item.type=='select'" :span="4">
<el-select size="small" v-model="search[item.prop]" :placeholder=" item.label" @change="$forceUpdate(),page.current=1,getAppThreeMeetingUser()" clearable>
<el-option v-for="(op,j) in dict.getDict(item.dict)" :key="j" :label="op.dictName"
:value="op.dictValue"/>
</el-select>
</el-col>
<el-col v-else-if="item.type=='time'" :span="8" type="flex">
<span class="dateTitle">{{item.label}}</span>
<el-date-picker size="small" v-model="search[item.prop]" placeholder="请选择" type="daterange"
:start-placeholder="item.prop+'开始时间'"
:end-placeholder="item.prop+'结束日期'"></el-date-picker>
</el-col>
<el-col v-else-if="item.type=='num'" :span="8" style="display: flex;" type="flex">
<span class="dateTitle">{{item.label}}</span>
<ai-range v-model="search[item.prop]" />
</el-col>
</section>
</el-row>
</el-col>
<el-col style="width: auto;display: flex;margin-bottom:6px">
<el-col>
<el-input size="small" v-model="search.meetingUserName" placeholder="姓名"
prefix-icon="iconfont iconSearch" clearable @keyup.enter.native="page.current=1,getAppThreeMeetingUser()"></el-input>
</el-col>
<el-button size="mini" type="primary" icon="iconfont iconSearch" style="margin-left:5px;"
@click="page.current=1,getAppThreeMeetingUser()">查询
</el-button>
<el-button size="mini" icon="el-icon-refresh-right" style="margin-left:5px;" @click="resetSearch">
重置
</el-button>
</el-col>
</el-row>
<el-table ref="multipleTable" :data="tableData" style="margin-top:16px;"
header-cell-class-name="table-header"
tooltip-effect="light" row-class-name="table-row" cell-class-name="table-cell" @selection-change="handleSelectionChange">
<el-table-column prop="meetingUserName" label="姓名" align="center">
<div slot-scope="{row}">{{row.meetingUserName || "-"}}</div>
</el-table-column>
<el-table-column prop="joinStatus" label="参会情况" align="center">
<div slot-scope="{row}"> {{dict.getLabel('joinStatus',row.joinStatus)||'-'}}</div>
</el-table-column>
<el-table-column prop="absence" label="请假原因">
<div slot-scope="{row}">{{row.absence || "-"}}</div>
</el-table-column>
<el-table-column prop="signMethod" label="签到方式" align="center">
<div slot-scope="{row}"> {{dict.getLabel('signMethod',row.signMethod)||'-'}}</div>
</el-table-column>
<el-table-column prop="signStatus" label="签到状态" align="center">
<div slot-scope="{row}"> {{dict.getLabel('signStatus',row.signStatus)||'-'}}</div>
</el-table-column>
<el-table-column prop="signTime" label="签到时间" align="center">
<div slot-scope="{row}">{{row.signTime || "-"}}</div>
</el-table-column>
<el-table-column prop="signUserName" label="代签人" align="center">
<div slot-scope="{row}">{{row.signUserName || "-"}}</div>
</el-table-column>
<el-table-column prop="operate" label="操作" width="240" align="center">
<div slot-scope="{row}">
<span class="iconfont iconqiandao icon-color89B" style="cursor: pointer;"
title="签到" @click="changeStatus(row, 0)" v-if="row.signMethod != 1"></span>
<span class="iconfont iconqingjia icon-color89B" style="cursor: pointer;"
title="请假" @click="changeStatus(row, 1)"></span>
<span class="iconfont iconRepulse icon-color89B" style="cursor: pointer;"
title="重置" v-if="meetingStatus != 4" @click="changeStatus(row, 2)"></span>
</div>
<!-- <el-radio-group slot-scope="{row}" v-model="row.operation" @change="changeStatus(row)">
<el-radio :label="0">签到</el-radio>
<el-radio :label="1">请假</el-radio>
<el-radio :label="2" v-if="meetingStatus != 4">重置</el-radio>
</el-radio-group> -->
</el-table-column>
<div slot="empty" class="no-data" style="height:160px;"></div>
</el-table>
<div class="pagination">
<el-pagination background
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
layout="total,prev, pager, next,sizes, jumper"
:total="page.total">
</el-pagination>
</div>
</div>
<el-dialog :visible.sync="leaveMask" title="请假" width="520px" class="mask label-110"
:close-on-click-modal="false"
:before-close="maskInit" @close="maskInit">
<div class="content input-240">
<el-form ref="leaveMask" :rules="rules" :model="leaveInfo" label-width="100px">
<el-form-item label="请假原因:" class="user" prop="leaveText">
<el-input type="textarea" :rows="3" v-model="leaveInfo.leaveText" placeholder="请输入请假原因"/>
</el-form-item>
</el-form>
</div>
<div class="operation">
<el-button class="delete-btn" @click="maskInit" mini>取消</el-button>
<el-button type="primary" @click="confirmMask('leaveMask')" mini>确认</el-button>
</div>
</el-dialog>
</section>
</template>
<script>
import {mapState} from "vuex";
export default {
name: "appThreeMeetingUser",
props: {
instance: Function,
dict: Object,
permissions: Function,
meetingId:String,
detail: Object,
meetingStatus: String
},
data() {
return {
activeName: 'first',
tableData: [],
columns: [
{
label: '编号',
prop: 'id',
type: '',
dict: ''
},
{
label: '会议编号',
prop: 'meetingId',
type: '',
dict: ''
},
{
label: '参会人员角色',
prop: 'meetingUserRole',
type: '',
dict: 'meetingUserRole'
},
{
label: '会议人员编号',
prop: 'meetingUserId',
type: '',
dict: ''
},
{
label: '会议人员姓名',
prop: 'meetingUserName',
type: '',
dict: ''
},
{
label: '参会情况',
prop: 'joinStatus',
type: 'select',
dict: 'joinStatus'
},
{
label: '签到状态',
prop: 'signStatus',
type: 'select',
dict: 'signStatus'
},
{
label: '签到方式',
prop: 'signMethod',
type: 'select',
dict: 'signMethod'
},
{
label: '请假原因',
prop: 'absence',
type: '',
dict: ''
},
{
label: '创建时间',
prop: 'createDate',
type: '',
dict: ''
},
{
label: '签到人',
prop: 'signUserId',
type: '',
dict: ''
},
{
label: '签到时间',
prop: 'signTime',
type: '',
dict: ''
},
{
label: '操作',
prop: 'operate',
type: '',
dict: ''
},
],
search: {
style: {},
meetingUserName: "",
meetingId:""
},
page: {
current: 1,
size: 10,
total: 0,
},
leaveMask: false,
leaveInfo: {
leaveText: ''
},
rules: {
leaveText: [{ required: true, message: '请输入请假原因', trigger: 'blur' }]
},
meetingInfo: {}, //点击操作的item
}
},
methods: {
confirmMask(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.signMeeting(0, 1, '', this.leaveInfo.leaveText, this.user.info.id, this.user.info.name, '', '请假成功')
} else {
return false;
}
});
},
maskInit() {
this.leaveMask = false
},
changeStatus(item, operation) {
this.meetingInfo = item
if(this.meetingStatus == 0) { //0未发布 1已发布 2已取消 3进行中 4已结束
this.$message({ message: '会议未发布,请发布后再操作', type: 'warning'});
return
}
if(item.meetingSignMethod == 1) { //签到方式为不签到
this.$message({ message: '签到方式选择为不签到,不可操作', type: 'warning'});
return
}
if(this.meetingStatus == 1) {
let d = new Date()
let time = item.meetingBefore
let beginTimestamp = new Date(time.replace(/\-/g, "\/"))
let newTimestamp = new Date(d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes())
if (newTimestamp < beginTimestamp) {
this.$message({ message: '未到签到时间,不可操作', type: 'warning'});
return
}
}
if(this.meetingStatus == 2) {
this.$message({ message: '会议已取消,不可操作', type: 'warning'});
return
}
// if(this.meetingStatus == 3) {
// let d = new Date()
// let time = item.meetingAfter
// let endTimestamp = new Date(time.replace(/\-/g, "\/"))
// let newTimestamp = new Date(d.getFullYear() + '/' + (d.getMonth() + 1) + '/' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes())
// if (endTimestamp > newTimestamp) { //代签
// this.operationStatus(operation)
// }
// }
if(!operation) { //0为签到
this.$confirm('确定签到吗?', '', {
type: 'info'
}).then(() => {
this.operationStatus(operation)
}).catch(() => {
return
});
}else {
this.operationStatus(operation)
}
},
operationStatus(status) {
if(status == 0) { //签到
let signTime = new Date().getFullYear() + '-' + this.isDate(new Date().getMonth() + 1) + '-' + this.isDate(new Date().getDate()) + ' ' + this.isDate(new Date().getHours()) + ':' + this.isDate(new Date().getMinutes()) + ':' + this.isDate(new Date().getSeconds())
this.signMeeting(1, 0, 1, '', this.user.info.id, this.user.info.name, signTime, '签到成功')
}
if(status == 1) { //请假
this.leaveMask = true
this.leaveInfo.leaveText = ''
}
if(status == 2) { //重置
this.$confirm(`确认将该成员签到状态重置吗?`, {type: 'warning'}).then(() => {
this.signMeeting('', '', '', '', '', '', '', '重置成功')
})
}
},
isDate(num) {
if(num < 10) {
num = '0' + num
}
return num
},
signMeeting(signStatus, joinStatus, signMethod, absence, signUserId, signUserName, signTime, succText) {
var params = {
signStatus,
joinStatus,
signMethod,
absence,
signUserId,
signUserName,
signTime,
id: this.meetingInfo.id,
meetingUserId: this.meetingInfo.meetingUserId,
meetingId: this.meetingInfo.meetingId
}
this.instance.post("/app/appthreemeetinguser/addOrUpdate", params).then(res => {
if(res.code==0){
this.maskInit()
this.$message.success(succText)
this.getAppThreeMeetingUser()
}
})
},
isPermit(params) {
return this.permissions ? this.permissions(params) : false
},
handleSelectionChange(){},
//分页
handleCurrentChange(val) {
this.page.current = val;
this.getAppThreeMeetingUser();
},
//分页
handleSizeChange(val){
this.page.size = val
this.page.current = 1
this.getAppThreeMeetingUser()
},
//重置
resetSearch() {
this.page.current = 1
this.page.size = 10
this.columns.map(c => {if(c.type) this.search[c.prop] = null})
Object.keys(this.search).forEach((e)=>{
this.search[e]=null;
})
this.getAppThreeMeetingUser()
},
//列表
getAppThreeMeetingUser() {
var meetingId = this.meetingId
this.instance.post("/app/appthreemeetinguser/list", null, {
params: {
...this.search,
...this.page,
meetingId
}
}).then(res => {
if(res.code==0){
this.tableData=res.data.records;
this.page.total=res.data.total;
this.tableData.map((item) => {
if(item.signStatus == 1) { //签到
item.operation = 0
}
if(item.joinStatus == 1) { //请假
item.operation = 1
}
return item
})
}
}
)
},
//请假,签到,取消代签
updateStatus(row,text){
var body = {};
if(text == '请假'){
body = {
id:row.id,
joinStatus:'1'
}
}
if(text == '签到'){
body = {
id:row.id,
signStatus:'1'
}
}
if(text == '取消代签'){
body = {
id:row.id,
signStatus:'0'
}
}
console.log(body)
this.$confirm(`是否${text}?`, {type: 'warning'}).then(() => {
this.instance.post("/app/appthreemeetinguser/addOrUpdate", body).then((res) => {
if(res.code ==0){
this.maskInit()
this.getAppThreeMeetingUser()
this.$message.success(`操作成功!`)
}
})
})
}
},
mounted() {
if (this.dict) this.dict.load(this.columns.map(e => e.type == 'select' ? e.dict : ''))
// console.log(this.detail)
this.resetSearch()
},
computed: {
...mapState(['user']),
}
}
</script>
<style scoped lang="scss">
.appThreeMeetingUser{
:deep( .el-radio){
margin-right: 16px!important;
}
:deep( .el-radio__label){
padding-left: 4px!important;
}
.operation {
overflow: hidden;
// position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 64px;
line-height: 64px;
display: flex;
align-items: center;
justify-content: center;
background-color: #f3f6f9;
box-shadow: inset 0 1px 0 0 #eeeeee;
}
:deep( .el-textarea){
width: 362px;
}
}
</style>