yudao-dev/src/views/group/base/groupTeamScheduling/index.vue
2023-12-06 10:06:26 +08:00

478 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="groupTeamScheduling">
<div class="operationArea">
<el-form :inline="true" class="demo-form-inline">
<span class="blue-block"></span>
<el-form-item label="月份选择">
<el-date-picker
v-model="startDay"
type="month"
placeholder="选择月"
size="small"
:disabled="showSetting"
@change="selectMonth"
:clearable="false"
style="width: 120px">
</el-date-picker>
</el-form-item>
<el-form-item>
<span class="separateStyle" v-if="this.$auth.hasPermi('base:group-team-scheduling:set')"></span>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" v-if="this.$auth.hasPermi('base:group-team-scheduling:set')" :disabled="showSetting || settingBtnDis" @click="settingMsg">设置</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" v-show="showSetting && autoScheduling" @click="schedulingBtn">自动排班</el-button>
</el-form-item>
<el-form-item>
<span class="separateStyle" v-show="showSetting"></span>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" v-show="showSetting" @click="confirmSetting">确认</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" plain v-show="showSetting" @click="cancelSetting">取消</el-button>
</el-form-item>
<el-form-item label="请先选择查询的班组" class="rightItem">
<!-- <el-button type="primary" size="small" :disabled="jumpDisabled" @click="toOtherPage('1')">班组上下片查询</el-button> -->
<el-button type="primary" size="small" :disabled="jumpDisabled" @click="toOtherPage('2')">班组能源查询</el-button>
<el-button type="primary" size="small" :disabled="jumpDisabled" @click="toOtherPage('3')">班组检测查询</el-button>
</el-form-item>
</el-form>
</div>
<!-- 日历区域 -->
<div class="calenderArea">
<div style="font-size: 24px;font-weight: 500">{{ this.month }} {{ this.year }}</div>
<el-calendar v-model="startDay">
<!-- 这里使用的是 2.5 slot 语法,对于新项目请使用 2.6 slot 语法-->
<template
slot="dateCell"
slot-scope="{date, data}">
<div v-if="data.type === 'current-month'">
<!-- 日期 -->
<div class="dateStyle">
{{ Number(data.day.split('-')[2]) }}
</div>
<!-- 班次班组 -->
<!-- class有两个样式一个是类似class1还有个是选中红框显示 -->
<el-row :gutter="2" :class="'class' + (index+1) + (chooseTip === (item.startDay+item.classesId) ? ' team-active' : '')" v-for="(item, index) in list[Number(data.day.split('-')[2])]" :key='index'>
<el-col :span="12">
<div class="selectDiv">
<!-- 选择班组图标 -->
<div class="toggle-icon" v-show="showSetting && (new Date(data.day).valueOf() < new Date().valueOf() ? false: true)">
<svg-icon icon-class="toggle"/>
</div>
<!-- 不能选择班组 -->
<div class="toggle-icon-hide" v-show="!(showSetting && (new Date(data.day).valueOf() < new Date().valueOf() ? false: true))"></div>
<el-select v-model="item.teamId" size='small' :disabled="!showSetting || (new Date(data.day).valueOf() > new Date().valueOf() ? false: true)">
<el-option
v-for="i in teamList"
:key="i.id"
:label="i.name"
:value="i.id">
</el-option>
</el-select>
</div>
</el-col>
<el-col :span="12">
<el-button class="labelClass" @click="chooseTeam(item)">{{ item.classesName }}</el-button>
</el-col>
</el-row>
</div>
</template>
</el-calendar>
</div>
</div>
</template>
<script>
import { getPreset, createOrUpdateList, autoSet } from "@/api/base/groupTeamScheduling";
import { listEnabled } from "@/api/base/groupTeam";
import moment from 'moment';
export default {
name: "GroupTeamScheduling",
data() {
return {
startDay: '',// 查询参数
year: '',// 2023
month: '',// 九月
monthList: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
list: {},
teamList: [],// 班组下拉
showSetting: false,// 设置模式。自动排班,确认,取消按钮显示
settingBtnDis: false,
jumpDisabled: true,// 操作按钮控制
chooseObj: {}, //当前选中的数据,查询按钮用
chooseTip: '',// 当前选中数据的唯一值,显示红框
autoScheduling: false // 只有在当前日期后的月份才生效
};
},
created() {
this.startDay = new Date()
// 设置按钮是否置灰
this.settingBtn()
this.getTeamList()
this.toggleMonth()
this.getList()
},
methods: {
// 切换月份
selectMonth() {
if (this.startDay) {
this.settingBtn() // 设置按钮状态,需在getlist前面
this.toggleMonth()
this.getList()
this.clearChoose()
if ( moment(this.startDay).valueOf() > moment().endOf('month').valueOf()) {
this.autoScheduling = true
} else {
this.autoScheduling = false
}
}
},
// 获取班组列表
getTeamList() {
listEnabled().then(res => {
this.teamList = res.data || []
})
},
// 获取日历数据
getList() {
let year = moment(this.startDay).format('YYYY')
let month = moment(this.startDay).format('M')
getPreset({
year: year,
month: month
}).then(res => {
let obj = res.data || {}
if (obj) {
for (let item in obj) {
for (let i = 0; i < obj[item].length; i++) {
if (!obj[item][i].teamId) {
obj[item][i].teamId = ''
}
}
}
}
this.list = obj
}).catch(() => {
this.list = {}
this.settingBtnDis = true // 禁用设置按钮
})
},
// 设置
settingMsg() {
this.showSetting = !this.showSetting
this.clearChoose()
},
// 取消
cancelSetting() {
this.showSetting = !this.showSetting
this.getList() // 数据还原
},
// 确认
confirmSetting() {
let num = 0
// 当月数据的话,今天及今天之前的不传
if (moment(this.startDay).format('YYYY-MM') === moment().format('YYYY-MM')) {
num = Number(moment().format('DD'))
} else {
num = 0
}
// 下月数据全部都传
// 打平数据
let tempArr = Object.values(this.list)
let arr = []
for (let i = num; i < tempArr.length; i++) {
for (let j = 0; j < tempArr[i].length; j++) {
arr.push(tempArr[i][j])
}
}
createOrUpdateList(arr).then(res => {
if (res.code === 0) {
this.showSetting = !this.showSetting
this.$modal.msgSuccess("操作成功")
this.getList() // 数据更新
}
})
},
// 点击班次红框选中当前数据
chooseTeam(value) {
if (this.showSetting) {
this.$modal.msgWarning("当前处于设置模式")
return false
}
this.chooseObj = value
this.chooseTip = value.startDay + value.classesId // 匹配当前的样式
this.jumpDisabled = false //查询按钮不禁用
},
// 自动排班
schedulingBtn() {
let tempData = this.list
// 次月1号有值前端排班
if (this.list[1][0].teamId) {
let tempArr = Object.values(this.list)
let arr = []
let n = 0
for (let i = 0; i < tempArr.length; i++) {
if (n > 0) {
break;
}
for (let j = 0; j < tempArr[i].length; j++) {
if (tempArr[i][j].teamId) {
arr.push(tempArr[i][j].teamId)
} else {
n++
}
}
}
let tempNum = 0
for (let k = 0; k < tempArr.length; k++) {
for (let v = 0; v < tempArr[k].length; v++) {
let t = tempNum % arr.length
if (arr.length === 1) {
tempData[k+1][v].teamId = arr[0]
} else {
tempData[k+1][v].teamId = arr[t]
}
tempNum++
}
}
this.list = []
this.list = tempData
} else {
// 次月1号没有值,接口排班
// console.log(moment(this.startDay).format("YYYY-MM-DD"))
autoSet({
year: this.year,
month: moment(this.startDay).month() + 1
}).then(res => {
this.list = res.data || {}
})
}
},
// 设置按钮如果是上个月或者今天是本月最后一天,设置按钮置灰
settingBtn() {
let nowMonth = moment().startOf('month').valueOf()
let startMonth = moment(this.startDay).valueOf()
let nowDate = moment(new Date()).date()
let sumDate = moment().daysInMonth()
if (nowMonth > startMonth) { // 之前月
this.settingBtnDis = true
} else {
if (nowDate < sumDate) {
this.settingBtnDis = false
} else {
this.settingBtnDis = true
}
}
},
// 清除红框选中数据
clearChoose() {
this.chooseObj = {}
this.chooseTip = ""
this.jumpDisabled = true
},
// 切换月份显示
toggleMonth() {
this.year = moment(this.startDay).format("YYYY")
let month = Number(moment(this.startDay).format("MM"))
this.month = this.monthList[month - 1]
},
// 3个跳转按钮
toOtherPage(val) {
switch (val) {
case '1':
this.$router.push({
path: '/core/enhance/product-line-24h?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime,
})
break;
case '2': // 能源
this.$router.push({
path: '/energy/base/energy-quantity-realtime?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime
})
break;
default:
this.$router.push({
path: '/quality/base/quality-inspection-data/detection-information/statistical-data?startTime='+this.chooseObj.startTime+'&endTime='+this.chooseObj.endTime,
// name: 'QualityStatistics',
// params: { startTime: this.chooseObj.startTime, endTime: this.chooseObj.endTime }
})
}
}
}
}
</script>
<style lang='scss'>
.demo-form-inline {
.el-date-editor .el-range__icon {
font-size: 16px;
color: #0B58FF;
}
.el-input__prefix .el-icon-date {
font-size: 16px;
color: #0B58FF;
}
}
.groupTeamScheduling {
background-color: #F2F4F9;
.operationArea {
padding: 14px 10px 0 16px;
margin-bottom: 8px;
background-color: #fff;
border-radius: 8px;
.blue-block {
display: inline-block;
width: 4px;
height: 16px;
background-color: #0B58FF;
border-radius: 1px;
margin-right: 8px;
margin-top: 10px;
}
.separateStyle {
display: inline-block;
width: 1px;
height: 24px;
background: #E8E8E8;
vertical-align: middle;
}
.el-form-item {
margin-bottom: 10px;
}
.rightItem {
float: right;
}
}
// 日历
.calenderArea {
padding: 14px 10px 0 20px;
background-color: #fff;
border-radius: 8px;
.el-calendar__body {
padding: 10px 16px 16px 0;
}
.el-calendar__header {
display: none;
}
.el-calendar-table > thead {
height: 48px;
font-size: 20px;
font-weight: 500;
color: #000000;
background-color: rgba(242, 244, 249, 1);
}
.el-calendar-table__row {
height: 133px;
.prev, .next {
pointer-events: none;
}
.el-calendar-day {
padding: 0 10px;
height: 100%;
.dateStyle {
font-size: 20px;
font-weight: 500;
color: #000000;
text-align: right;
height: 32px;
line-height: 28px;
padding-right: 10px;
}
}
}
.team-active {// 选中班组
border:2px solid red
}
.class1, .class2, .class3 {
padding: 0;
font-weight: 600;
margin-bottom: 2px;
.selectDiv {
position: relative;
.toggle-icon {
position: absolute;
width: 26px;
height: 26px;
line-height: 26px;
font-size: 14px;
z-index: 1;
text-align: center;
}
.toggle-icon-hide {
position: absolute;
width: 2px;
height: 28px;
z-index: 1;
}
.el-input__suffix {
display: none;
}
.el-input--suffix .el-input__inner {
padding: 0 4px 0 28px;
}
.el-input--small .el-input__inner {
height: 28px;
border: none;
font-weight: 600;
}
}
.labelClass {
width: 100%;
height: 28px;
border: none;
padding: 0;
font-weight: 600;
text-align: center;
}
}
.class1 {
.selectDiv {
.toggle-icon, .toggle-icon-hide {
background-color: #FACE00;
}
.el-input--small .el-input__inner {
color: #E7A200;
background-color: #FFEFC0;
}
}
.labelClass {
color: #E7A200;
background-color: #FFEFC0;
}
}
.class2 {
.selectDiv {
.toggle-icon, .toggle-icon-hide {
background-color: #3984FF;
}
.el-input--small .el-input__inner {
color: #2D7BFF;
background-color: #BEEAFF;
}
}
.labelClass {
color: #2D7BFF;
background-color: #BEEAFF;
}
}
.class3 {
.selectDiv {
.toggle-icon, .toggle-icon-hide {
background-color: #37D97F;
}
.el-input--small .el-input__inner {
color: #129F51;
background-color: #E0FFEE;
}
}
.labelClass {
color: #129F51;
background-color: #E0FFEE;
}
}
}
}
</style>