| | |
| | | <template> |
| | | <div class="class-page"> |
| | | <div class="search"> |
| | | <div class="search_thing"> |
| | | <div class="search_label">选择时间:</div> |
| | | <div class="search_input"> |
| | | <el-date-picker |
| | | v-model="query.year" |
| | | type="year" |
| | | size="small" |
| | | placeholder="选择年" |
| | | style="width: 140px;" |
| | | :clearable="false"> |
| | | </el-date-picker> |
| | | <el-select |
| | | v-model="query.month" |
| | | clearable |
| | | placeholder="选择月" |
| | | style="width: 140px;margin-left: 16px;" |
| | | size="small"> |
| | | <el-option |
| | | v-for="item in monthOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | <el-input v-model="query.name" placeholder="请输入人员名称" size="small" style="width: 140px;margin: 0 16px;" clearable ></el-input> |
| | | <el-select v-model="query.addr" placeholder="请选择实验室" style="width: 140px;" size="small" clearable > |
| | | <el-option |
| | | v-for="item in labOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="padding-left: 30px;"> |
| | | <el-button size="small" @click="refresh()">重 置</el-button> |
| | | <el-button size="small" type="primary" @click="refreshTable()">查 询</el-button> |
| | | </div> |
| | | <div class="search_thing btns" style="padding-left: 30px;"> |
| | | <el-button size="small" type="primary">导 出</el-button> |
| | | <el-button size="small" type="primary" @click="handleScheduling">排 班</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="center"> |
| | | <div class="fixed-left"> |
| | | <div class="content-title" style="padding-left: 16px;box-sizing: border-box;"> |
| | | 人员名称 |
| | | </div> |
| | | <div class="content-user" :class="{hoverType:currentUserIndex==index}" v-for="(item,index) in userList" :key="'e'+index" v-on:mouseenter="onMouseEnter(index)" |
| | | v-on:mouseleave="currentUserIndex=null"> |
| | | <div class="user-pic">{{ item.name.charAt(0) }}</div> |
| | | <div class="user-info"> |
| | | <p style="font-size: 14px;color: #3A7BFA;line-height: 24px;">{{ item.name }} ({{ item.part }})</p> |
| | | <p style="color: #999999;font-size: 12px;transform: scale(0.8) translateX(-20px);white-space: nowrap;width: 150px;overflow-x: show;">早:{{ item.day0 }}, 中:{{ item.day1 }}, 夜:{{ item.day2 }}, 休:{{ item.day3 }}, 假:{{ item.day4 }}</p> |
| | | <p style="margin-top: 4px;"><span style="color: #999999;font-size: 12px;display: inline-block;transform: scale(0.8) translateX(-10px);">合计出勤: </span><span style="font-size: 16px; |
| | | color: #FF4902;">{{ item.day5 }}天</span></p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="scroll-right"> |
| | | <div class="content"> |
| | | <div class="content-title content-title-right" style="border-bottom: 0;"> |
| | | <div class="content-title-item" v-for="(item,index) in weeks" :key="'b'+index"> |
| | | <span class="month" v-if="item.day==1">{{ item.month }}</span> |
| | | <span class="day">{{ item.day }}</span> |
| | | <span class="week">{{ item.week }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="content-body" v-for="(item,index) in 5" :key="'c'+index" |
| | | :class="{hoverType:currentUserIndex==index}"v-on:mouseenter="onMouseEnter(index)" |
| | | v-on:mouseleave="currentUserIndex=null"> |
| | | <div class="content-body-item" v-for="(m,i) in workList" :key="'d'+i"> |
| | | <div class="work-box" :class="{type0:m.type=='早班',type1:m.type=='中班',type2:m.type=='夜班',}"> |
| | | <div class="work-box-left"> |
| | | <span>{{ m.type }}</span> |
| | | </div> |
| | | <el-dropdown trigger="click" placement="bottom" @command="e=>handleCommand(e,m)"> |
| | | <i class="el-icon-arrow-down el-icon--right" style="font-size: 20px;color: #fff;cursor: pointer;"></i> |
| | | <el-dropdown-menu slot="dropdown"> |
| | | <el-dropdown-item v-for="(n,j) in classType" :key="'h'+j" :command="n.value">{{ n.label }}</el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </el-dropdown> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-dialog title="排班" :visible.sync="schedulingVisible" width="400px"> |
| | | <div class="search_thing"> |
| | | <div class="search_label" style="width:90px">周次:</div> |
| | | <div class="search_input"> |
| | | <el-date-picker |
| | | v-model="schedulingQuery.week" |
| | | type="week" |
| | | format="yyyy 第 WW 周" |
| | | placeholder="选择周次" style="width: 203px;"> |
| | | </el-date-picker> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing"> |
| | | <div class="search_label" style="width:90px">人员名称:</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="schedulingQuery.person" placeholder="请选择" style="width: 100%;" multiple clearable > |
| | | <el-option |
| | | v-for="item in personList" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing"> |
| | | <div class="search_label" style="width:90px">班次:</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="schedulingQuery.person" placeholder="请选择" style="width: 100%;"> |
| | | <el-option |
| | | v-for="item in classType" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="schedulingVisible = false">取 消</el-button> |
| | | <el-button type="primary" @click="confirmScheduling" :loading="loading">确 定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data () { |
| | | return{ |
| | | currentYear:new Date().getFullYear(), |
| | | currentMonth:new Date().getMonth()+1, |
| | | query:{ |
| | | name:'', |
| | | addr:'', |
| | | year:'', |
| | | month:'' |
| | | }, |
| | | monthOptions:[ |
| | | { |
| | | value:'1', |
| | | label:'1月' |
| | | }, |
| | | { |
| | | value:'2', |
| | | label:'2月' |
| | | }, |
| | | { |
| | | value:'3', |
| | | label:'3月' |
| | | }, |
| | | { |
| | | value:'4', |
| | | label:'4月' |
| | | }, |
| | | { |
| | | value:'5', |
| | | label:'5月' |
| | | }, |
| | | { |
| | | value:'6', |
| | | label:'6月' |
| | | }, |
| | | { |
| | | value:'7', |
| | | label:'7月' |
| | | }, |
| | | { |
| | | value:'8', |
| | | label:'8月' |
| | | }, |
| | | { |
| | | value:'9', |
| | | label:'9月' |
| | | }, |
| | | { |
| | | value:'10', |
| | | label:'10月' |
| | | }, |
| | | { |
| | | value:'11', |
| | | label:'11月' |
| | | }, |
| | | { |
| | | value:'12', |
| | | label:'12月' |
| | | }, |
| | | ], |
| | | labOptions:[], |
| | | weeks:[ |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:1, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周二', |
| | | day:2, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周三', |
| | | day:3, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周四', |
| | | day:4, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周五', |
| | | day:5, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周六', |
| | | day:6, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周日', |
| | | day:7, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:8, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周二', |
| | | day:9, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周三', |
| | | day:10, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周四', |
| | | day:11, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周五', |
| | | day:12, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周六', |
| | | day:13, |
| | | },{ |
| | | month:'14周', |
| | | week:'周日', |
| | | day:14, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:15, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:16, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:17, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:18, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:19, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:20, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:21, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:22, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:23, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:24, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:25, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:26, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:27, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:28, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:29, |
| | | }, |
| | | { |
| | | month:'14周', |
| | | week:'周一', |
| | | day:30, |
| | | }, |
| | | ], |
| | | workList:[ |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'中班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'夜班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | { |
| | | type:'早班', |
| | | time:'8:00-16:00', |
| | | }, |
| | | ], |
| | | classType:[], |
| | | userList:[ |
| | | { |
| | | name:'李媛媛', |
| | | part:'材料', |
| | | day0:12,//早 |
| | | day1:12,//中 |
| | | day2:12,//夜 |
| | | day3:12,//休 |
| | | day4:12,//请假 |
| | | day5:12,//总计 |
| | | }, |
| | | { |
| | | name:'李媛媛', |
| | | part:'材料', |
| | | day0:12,//早 |
| | | day1:12,//中 |
| | | day2:12,//夜 |
| | | day3:12,//休 |
| | | day4:12,//请假 |
| | | day5:12,//总计 |
| | | }, |
| | | { |
| | | name:'李媛媛', |
| | | part:'材料', |
| | | day0:12,//早 |
| | | day1:12,//中 |
| | | day2:12,//夜 |
| | | day3:12,//休 |
| | | day4:12,//请假 |
| | | day5:12,//总计 |
| | | }, |
| | | { |
| | | name:'李媛媛', |
| | | part:'材料', |
| | | day0:12,//早 |
| | | day1:12,//中 |
| | | day2:12,//夜 |
| | | day3:12,//休 |
| | | day4:12,//请假 |
| | | day5:12,//总计 |
| | | }, |
| | | { |
| | | name:'李媛媛', |
| | | part:'材料', |
| | | day0:12,//早 |
| | | day1:12,//中 |
| | | day2:12,//夜 |
| | | day3:12,//休 |
| | | day4:12,//请假 |
| | | day5:12,//总计 |
| | | }, |
| | | ], |
| | | currentUserIndex:null, |
| | | schedulingVisible:false, |
| | | personList:[], |
| | | loading:false, |
| | | schedulingQuery:{ |
| | | week:'', |
| | | person:'' |
| | | } |
| | | } |
| | | }, |
| | | mounted(){ |
| | | this.selectEnumByCategory() |
| | | }, |
| | | methods: { |
| | | refresh(){}, |
| | | refreshTable(){}, |
| | | onMouseEnter(index){ |
| | | this.currentUserIndex = index |
| | | }, |
| | | handleScheduling(){ |
| | | this.schedulingVisible = true |
| | | }, |
| | | confirmScheduling(){}, |
| | | selectEnumByCategory() { |
| | | this.$axios.post(this.$api.enums.selectEnumByCategory, { |
| | | category: "班次类型" |
| | | }).then(res => { |
| | | this.classType = res.data |
| | | }) |
| | | }, |
| | | handleCommand(e,m){ |
| | | console.log(e,m) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .search { |
| | | height: 50px; |
| | | display: flex; |
| | | align-items: center; |
| | | position: relative; |
| | | } |
| | | |
| | | .search_thing { |
| | | display: flex; |
| | | align-items: center; |
| | | height: 50px; |
| | | } |
| | | |
| | | .search_label { |
| | | width: 70px; |
| | | font-size: 14px; |
| | | text-align: right; |
| | | } |
| | | .search_input{ |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .btns{ |
| | | position: absolute; |
| | | right: 16px; |
| | | top: 50%; |
| | | transform: translate(0,-50%); |
| | | } |
| | | .center { |
| | | width: 100%; |
| | | height: calc(100% - 40px ); |
| | | background-color: #fff; |
| | | position: relative; |
| | | overflow-y: auto; |
| | | } |
| | | .fixed-left { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | width: 220px; /* 左边区域宽度 */ |
| | | min-height: calc(100% - 10px); /* 视口高度 */ |
| | | background-color: #fff; |
| | | box-shadow: 2px -2px 5px rgba(51,51,51,0.12); /* 左边阴影 */ |
| | | } |
| | | |
| | | .scroll-right { |
| | | width: calc(100% - 220px); /* 减去左边区域宽度 */ |
| | | min-height: calc(100% - 10px); /* 视口高度 */ |
| | | margin-left: 220px; |
| | | overflow-x: scroll; |
| | | } |
| | | |
| | | .content { |
| | | min-height: calc(100% - 10px); /* 视口高度 */ |
| | | min-width: 2000px; |
| | | } |
| | | .content-title{ |
| | | height: 52px; |
| | | line-height: 52px; |
| | | border-bottom: 1px solid #EEEEEE; |
| | | } |
| | | .content-title-right{ |
| | | min-width: 2000px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .content-title-item{ |
| | | height: 100%; |
| | | width: 100px; |
| | | flex-shrink: 0; |
| | | border-bottom: 1px solid #EEEEEE; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | .content-title-item .month{ |
| | | font-size: 12px; |
| | | color: #3A7BFA; |
| | | box-sizing: border-box; |
| | | padding: 0 4px; |
| | | border-radius: 50%; |
| | | background: #D6E4FF; |
| | | line-height: 30px; |
| | | text-align: center; |
| | | margin-right: 6px; |
| | | } |
| | | .content-title-item .day{ |
| | | font-size: 16px; |
| | | color: #333333; |
| | | margin-right: 6px; |
| | | } |
| | | .content-title-item .week{ |
| | | font-size: 14px; |
| | | color: #999999; |
| | | } |
| | | .content-body{ |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .content-body-item{ |
| | | height: 80px; |
| | | width: 100px; |
| | | flex-shrink: 0; |
| | | box-sizing: border-box; |
| | | padding: 4px; |
| | | border-right: 1px solid #EEEEEE; |
| | | border-bottom: 1px solid #EEEEEE; |
| | | } |
| | | .work-box{ |
| | | width: 100%; |
| | | height: 100%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-around; |
| | | background: rgba(58,123,250,0.15); |
| | | border-radius: 8px 8px 8px 8px; |
| | | color: #3A7BFA; |
| | | font-size: 14px; |
| | | } |
| | | .work-box.type0{ |
| | | background: rgba(58,123,250,0.15); |
| | | color: #3A7BFA; |
| | | } |
| | | .work-box.type1{ |
| | | background: #E3DCFE; |
| | | color: #635998; |
| | | } |
| | | .work-box.type2{ |
| | | background: #FAE2CA; |
| | | color: #BC8D5E; |
| | | } |
| | | .work-box-left{ |
| | | display: flex; |
| | | justify-content: center; |
| | | flex-direction: column; |
| | | line-height: 24px; |
| | | } |
| | | .content-user{ |
| | | width: 100%; |
| | | height: 80px; |
| | | box-sizing: border-box; |
| | | border-bottom: 1px solid #EEEEEE; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .user-pic{ |
| | | width: 50px; |
| | | height: 50px; |
| | | border-radius: 50%; |
| | | background: #C0C4CC; |
| | | color: #fff; |
| | | font-size: 20px; |
| | | text-align: center; |
| | | line-height: 50px; |
| | | margin-left: 10px; |
| | | } |
| | | .user-info{ |
| | | flex: 1; |
| | | margin-left: 10px; |
| | | } |
| | | .hoverType{ |
| | | background: rgba(58,123,250,0.05); |
| | | } |
| | | </style> |