453 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			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{
 | |
|     ::v-deep .el-radio{
 | |
|         margin-right: 16px!important;
 | |
|     }
 | |
|     ::v-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;
 | |
|     }
 | |
|     ::v-deep .el-textarea{
 | |
|         width: 362px;
 | |
|     }
 | |
| }
 | |
| </style>
 |