yudao-dev/src/views/group/base/groupTeamScheduling/index.vue

471 lines
14 KiB
Vue
Raw Normal View History

2023-07-27 15:16:13 +08:00
<template>
2023-09-18 08:41:14 +08:00
<div class="groupTeamScheduling">
<div class="operationArea">
2023-09-08 16:01:54 +08:00
<el-form :inline="true" class="demo-form-inline">
2023-09-18 08:41:14 +08:00
<span class="blue-block"></span>
2023-09-08 16:01:54 +08:00
<el-form-item label="月份选择">
<el-date-picker
2023-09-18 08:41:14 +08:00
v-model="startDay"
2023-09-08 16:01:54 +08:00
type="month"
2023-09-18 08:41:14 +08:00
placeholder="选择月"
size="small"
:disabled="showSetting"
@change="selectMonth"
:clearable="false"
style="width: 120px">
2023-09-08 16:01:54 +08:00
</el-date-picker>
</el-form-item>
<el-form-item>
2023-09-18 08:41:14 +08:00
<span class="separateStyle"></span>
2023-07-27 15:16:13 +08:00
</el-form-item>
2023-09-08 16:01:54 +08:00
<el-form-item>
2023-09-18 08:41:14 +08:00
<el-button type="primary" size="small" :disabled="showSetting || settingBtnDis" @click="settingMsg">设置</el-button>
2023-07-27 15:16:13 +08:00
</el-form-item>
2023-09-08 16:01:54 +08:00
<el-form-item>
2023-09-18 08:41:14 +08:00
<el-button type="primary" size="small" v-show="showSetting && autoScheduling" @click="schedulingBtn">自动排班</el-button>
2023-07-27 15:16:13 +08:00
</el-form-item>
2023-09-08 16:01:54 +08:00
<el-form-item>
2023-09-18 08:41:14 +08:00
<span class="separateStyle" v-show="showSetting"></span>
2023-07-27 15:16:13 +08:00
</el-form-item>
2023-09-08 16:01:54 +08:00
<el-form-item>
2023-09-18 08:41:14 +08:00
<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>
2023-07-27 15:16:13 +08:00
</el-form-item>
</el-form>
2023-09-08 16:01:54 +08:00
</div>
2023-09-18 08:41:14 +08:00
<!-- 日历区域 -->
<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>
2023-09-18 14:49:03 +08:00
<el-select v-model="item.teamId" size='small' :disabled="!showSetting || (new Date(data.day).valueOf() > new Date().valueOf() ? false: true)">
2023-09-18 08:41:14 +08:00
<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>
2023-07-27 15:16:13 +08:00
</div>
</template>
<script>
2023-09-18 08:41:14 +08:00
import { getPreset, createOrUpdateList, autoSet } from "@/api/base/groupTeamScheduling";
import { listEnabled } from "@/api/base/groupTeam";
import moment from 'moment';
2023-07-27 15:16:13 +08:00
export default {
name: "GroupTeamScheduling",
data() {
return {
2023-09-18 08:41:14 +08:00
startDay: '',// 查询参数
year: '',// 2023
month: '',// 九月
monthList: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
2023-09-18 14:49:03 +08:00
list: {},
2023-09-18 08:41:14 +08:00
teamList: [],// 班组下拉
showSetting: false,// 设置模式。自动排班,确认,取消按钮显示
settingBtnDis: false,
jumpDisabled: true,// 操作按钮控制
chooseObj: {}, //当前选中的数据,查询按钮用
chooseTip: '',// 当前选中数据的唯一值,显示红框
autoScheduling: false // 只有在当前日期后的月份才生效
2023-07-27 15:16:13 +08:00
};
},
created() {
2023-09-18 08:41:14 +08:00
this.startDay = new Date()
// 设置按钮是否置灰
this.settingBtn()
this.getTeamList()
this.toggleMonth()
2023-09-08 16:01:54 +08:00
this.getList()
2023-07-27 15:16:13 +08:00
},
methods: {
2023-09-18 08:41:14 +08:00
// 切换月份
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 => {
2023-09-18 14:49:03 +08:00
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
2023-09-18 08:41:14 +08:00
}).catch(() => {
2023-09-18 14:49:03 +08:00
this.list = {}
2023-09-18 08:41:14 +08:00
this.settingBtnDis = true // 禁用设置按钮
})
},
// 设置
settingMsg() {
this.showSetting = !this.showSetting
this.clearChoose()
},
// 取消
cancelSetting() {
this.showSetting = !this.showSetting
this.getList() // 数据还原
},
// 确认
confirmSetting() {
2023-09-18 14:49:03 +08:00
let num = 0
// 当月数据的话,今天及今天之前的不传
if (moment(this.startDay).format('YYYY-MM') === moment().format('YYYY-MM')) {
num = Number(moment().format('DD'))
} else {
num = 0
}
// 下月数据全部都传
2023-09-18 08:41:14 +08:00
// 打平数据
let tempArr = Object.values(this.list)
let arr = []
2023-09-18 14:49:03 +08:00
for (let i = num; i < tempArr.length; i++) {
2023-09-18 08:41:14 +08:00
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
2023-09-18 14:49:03 +08:00
this.$modal.msgSuccess("操作成功")
2023-09-18 08:41:14 +08:00
this.getList() // 数据更新
}
2023-09-08 16:01:54 +08:00
})
2023-09-18 08:41:14 +08:00
},
// 点击班次红框选中当前数据
chooseTeam(value) {
if (this.showSetting) {
this.$modal.msgWarning("当前处于设置模式")
return false
}
this.chooseObj = value
this.chooseTip = value.startDay + value.classesId // 匹配当前的样式
this.jumpDisabled = false //查询按钮不禁用
},
// 自动排班
schedulingBtn() {
2023-09-18 14:49:03 +08:00
let tempData = this.list
2023-09-18 08:41:14 +08:00
// 次月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++
}
}
}
2023-09-18 14:49:03 +08:00
let tempNum = 0
2023-09-18 08:41:14 +08:00
for (let k = 0; k < tempArr.length; k++) {
for (let v = 0; v < tempArr[k].length; v++) {
2023-09-18 14:49:03 +08:00
let t = tempNum % arr.length
2023-09-18 08:41:14 +08:00
if (arr.length === 1) {
2023-09-18 14:49:03 +08:00
tempData[k+1][v].teamId = arr[0]
2023-09-18 08:41:14 +08:00
} else {
2023-09-18 14:49:03 +08:00
tempData[k+1][v].teamId = arr[t]
2023-09-18 08:41:14 +08:00
}
2023-09-18 14:49:03 +08:00
tempNum++
2023-09-18 08:41:14 +08:00
}
}
2023-09-18 14:49:03 +08:00
this.list = []
this.list = tempData
2023-09-18 08:41:14 +08:00
} else {
// 次月1号没有值,接口排班
2023-09-20 16:57:20 +08:00
// console.log(moment(this.startDay).format("YYYY-MM-DD"))
autoSet({
year: this.year,
month: moment(this.startDay).month() + 1
}).then(res => {
2023-09-18 14:49:03 +08:00
this.list = res.data || {}
2023-09-18 08:41:14 +08:00
})
}
},
// 设置按钮如果是上个月或者今天是本月最后一天,设置按钮置灰
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({
2023-09-18 14:49:03 +08:00
// path: '/core/monitoring/production-line-data',
name: 'ProductionLineData',
params: { startTime: this.chooseObj.startTime, endTime: this.chooseObj.endTime }
2023-09-18 08:41:14 +08:00
})
break;
2023-09-18 14:49:03 +08:00
case '2': // 能源
2023-09-18 08:41:14 +08:00
this.$router.push({
name: 'EnergyReportSearch',
2023-09-18 14:49:03 +08:00
params: { startTime: this.chooseObj.startTime, endTime: this.chooseObj.endTime }
2023-09-18 08:41:14 +08:00
})
break;
default:
this.$router.push({
2023-09-18 14:49:03 +08:00
// path: '/quality/monitoring/quality-statistics',
name: 'QualityStatistics',
params: { startTime: this.chooseObj.startTime, endTime: this.chooseObj.endTime }
2023-09-18 08:41:14 +08:00
})
}
}
2023-07-27 15:16:13 +08:00
}
}
</script>
2023-09-18 08:41:14 +08:00
<style lang='scss'>
.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>