| | |
| | | <!-- |
| | | * @Date: 2024-04-09 20:19:46 |
| | | * @LastEditors: Sneed |
| | | * @LastEditTime: 2024-04-09 20:38:18 |
| | | * @LastEditTime: 2024-05-03 00:11:11 |
| | | * @FilePath: /belleson-frontend/Users/mache/Documents/demo/cps-web/src/views/console/base/Shiftsystem.vue |
| | | --> |
| | | <template> |
| | | <el-container> |
| | | <el-aside width="320px"> |
| | | <el-table :data="tableData" stripe style="width: 100%" @row-click="rowClick"> |
| | | <el-table-column prop="code" label="班制编号" /> |
| | | <scTable style="width: 100%;" ref="table" row-key="id" border :params="params" :apiObj="apiObj" stripe |
| | | :hideDo="true" paginationLayout="total, prev, pager, next" @dataChange="dataChange" |
| | | @row-click="rowClick" highlight-current-row> |
| | | <el-table-column prop="code" label="班制编号" width="100px" /> |
| | | <el-table-column prop="name" label="班制名称" /> |
| | | </el-table> |
| | | </scTable> |
| | | </el-aside> |
| | | <el-container> |
| | | 456 |
| | | <el-header> |
| | | <el-button style="margin-left: auto;" size="small" @click="table_add" type="primary" |
| | | icon="el-icon-plus"></el-button> |
| | | <el-button @click="table_edit" type="primary" size="small">编辑</el-button> |
| | | <el-button type="danger" plain icon="el-icon-delete" size="small" @click="del"></el-button> |
| | | </el-header> |
| | | <el-main> |
| | | <el-row> |
| | | <el-col :span="2"> |
| | | 班制编号 |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | {{ info.code }} |
| | | </el-col> |
| | | <el-col :span="2"> |
| | | 班制颜色 |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-color-picker size="small" v-model="info.colour" /> |
| | | </el-col> |
| | | <el-col :span="2"> |
| | | 开始-结束时间 |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | {{ dateFormat(info.startTime) }} - {{ dateFormat(info.endTime | dateFormat) }} |
| | | </el-col> |
| | | </el-row> |
| | | <el-row style="margin-top: 20px;"> |
| | | <el-timeline style="max-width: 600px"> |
| | | <el-timeline-item v-for="(activity, index) in activities" :key="index" |
| | | :timestamp="activity.time"> |
| | | {{ activity.title }} |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </el-row> |
| | | <el-row style="margin-top: 20px;"> |
| | | <scEcharts style="width:100%" height="300px" :option="dayCharts"> |
| | | </scEcharts> |
| | | </el-row> |
| | | </el-main> |
| | | </el-container> |
| | | <Dialog ref="dialog" :option="{ types, status, group }" :detail="detail" @success="success"></Dialog> |
| | | </el-container> |
| | | </template> |
| | | |
| | | <script> |
| | | import Dialog from './Dialog.vue' |
| | | import moment from 'moment'; |
| | | import scEcharts from '@/components/scEcharts'; |
| | | import * as echarts from 'echarts' |
| | | export default { |
| | | data () { |
| | | return { |
| | | tableData: [] |
| | | components: { |
| | | Dialog, |
| | | scEcharts |
| | | }, |
| | | computed: { |
| | | dateFormat: () => { |
| | | return value => { |
| | | if (isNaN(value)) return '' |
| | | let pre = '当日' |
| | | let add = value / (24 * 60) |
| | | if (add < 0) { |
| | | pre = '上日' |
| | | } else if (add >= 1) { |
| | | pre = '次日' |
| | | } |
| | | let base = moment().format('YYYY-MM-DD') + ' 00:00' |
| | | let current = moment(base).add(value, 'm') |
| | | return pre + moment(current).format('HH:mm'); |
| | | } |
| | | }, |
| | | activities() { |
| | | if (!this.info?.shiftDetailVOList?.length) return [] |
| | | return this.info.shiftDetailVOList.map(item => { |
| | | return { |
| | | title: `班次名称:${item.indexName}`, |
| | | time: `${this.dateFormat(item.shiftStartTime)}-${this.dateFormat(item.shiftEndTime)}` |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | dayCharts() { |
| | | let { data = [], categories = [], startTime, end } = this.getData1() |
| | | return { |
| | | title: { |
| | | text: '班制概览' |
| | | }, |
| | | tooltip: { |
| | | formatter: function (params) { |
| | | return params.name + ': ' + params.value[3]; |
| | | } |
| | | }, |
| | | legend: {}, |
| | | xAxis: { |
| | | min: startTime, |
| | | max: end, |
| | | scale: true, |
| | | interval: 2 * 60 * 60, |
| | | axisLabel: { |
| | | formatter: function (val, index) { |
| | | |
| | | let str = '' |
| | | let now = moment() |
| | | let current = now.format('YYYY-MM-DD') |
| | | let pre = now.subtract(1, 'd').format('YYYY-MM-DD') |
| | | let next = now.add(2, 'd').format('YYYY-MM-DD') |
| | | let nowDate = moment.unix(val).format('YYYY-MM-DD') |
| | | if (nowDate === current) { |
| | | str = '当日' |
| | | } else if (nowDate === pre) { |
| | | str = '上日' |
| | | } else if (nowDate === next) { |
| | | str = '次日' |
| | | } |
| | | return `${str}${moment.unix(val).format('HH:mm')}` |
| | | } |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'category', |
| | | data: categories |
| | | }, |
| | | series: [ |
| | | { |
| | | type: 'custom', |
| | | renderItem: (params, api) => { |
| | | var categoryIndex = api.value(0); |
| | | var start = api.coord([api.value(1), categoryIndex]); |
| | | var end = api.coord([api.value(2), categoryIndex]); |
| | | var height = api.size([0, 1])[1] * 0.6; |
| | | var rectShape = echarts.graphic.clipRectByRect( |
| | | { |
| | | x: start[0], |
| | | y: start[1] - height / 2, |
| | | width: end[0] - start[0], |
| | | height: height |
| | | }, |
| | | { |
| | | x: params.coordSys.x, |
| | | y: params.coordSys.y, |
| | | width: params.coordSys.width, |
| | | height: params.coordSys.height |
| | | } |
| | | ); |
| | | return ( |
| | | rectShape && { |
| | | type: 'rect', |
| | | transition: ['shape'], |
| | | shape: rectShape, |
| | | style: api.style() |
| | | } |
| | | ); |
| | | }, |
| | | itemStyle: { |
| | | opacity: 0.8 |
| | | }, |
| | | encode: { |
| | | x: [1, 2], |
| | | y: 0 |
| | | }, |
| | | data |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | }, |
| | | created () { |
| | | this.$API.calender.getShiftsystemList.post({params: {current:1,size: 15},data: { |
| | | code: "",name: "",statusList: [1] |
| | | }}).then(res => { |
| | | this.tableData = res?.data?.records || [] |
| | | let current = this.tableData?.[0] || '' |
| | | current.id && this.rowClick(current) |
| | | }) |
| | | data() { |
| | | return { |
| | | apiObj: this.$API.calender.getShiftsystemList, |
| | | params: { |
| | | statusList: [1], |
| | | code: '', |
| | | name: '' |
| | | }, |
| | | info: { |
| | | code: '' |
| | | }, |
| | | detail: { |
| | | |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.init() |
| | | }, |
| | | methods: { |
| | | rowClick(row) { |
| | | console.log(row) |
| | | this.$API.calender.getShiftsystemInfo.get({id: row.id}).then(res => { |
| | | console.log(res.data) |
| | | success() { |
| | | this.$refs.table.reload(this.params) |
| | | }, |
| | | init() { |
| | | this.$HTTP.get('/api/blade-system/param/detail?paramKey=system.shift.max').then(res => { |
| | | if (res.code === 200) { |
| | | this.detail = res.data |
| | | } |
| | | }) |
| | | }, |
| | | getData1() { |
| | | if (!this?.info?.shiftDetailVOList?.length) return { data: [], categories: [], startTime: 0 } |
| | | let categories = this.info.shiftDetailVOList.map(item => { |
| | | return item.indexName |
| | | }) |
| | | let base |
| | | this.info.shiftDetailVOList.forEach(item => { |
| | | !base && (base = item.shiftStartTime) |
| | | if (base > item.shiftStartTime) { |
| | | base = item.shiftStartTime |
| | | } |
| | | }) |
| | | let startTime = moment(moment().format('YYYY-MM-DD') + ' 00:00:00').add(base, 'm').unix() |
| | | let end = moment.unix(startTime).add(24, 'h').unix() |
| | | let data = []; |
| | | var types = [ |
| | | { name: 1, color: '#7b9ce1' }, |
| | | { name: 2, color: '#bd6d6c' }, |
| | | { name: 3, color: '#75d874' }, |
| | | { name: 4, color: '#e0bc78' }, |
| | | { name: 5, color: '#dc77dc' }, |
| | | { name: 6, color: '#72b362' } |
| | | ]; |
| | | this.info.shiftDetailVOList.forEach((item, index) => { |
| | | let desc = `${moment.unix(startTime + item.shiftStartTime * 60).format('HH:mm')} - ${moment.unix(startTime + item.shiftEndTime * 60).format('HH:mm')}` |
| | | data.push({ |
| | | name: item.indexName, |
| | | value: [index, startTime + item.shiftStartTime * 60, startTime + item.shiftEndTime * 60, desc], |
| | | itemStyle: { |
| | | normal: { |
| | | color: this.info.colour |
| | | } |
| | | } |
| | | }) |
| | | }) |
| | | return { data, categories, startTime, end } |
| | | }, |
| | | dataChange(res, tableData) { |
| | | let current = tableData?.[0] || {} |
| | | current.id && this.rowClick(current) |
| | | }, |
| | | rowClick(row) { |
| | | this.$API.calender.getShiftsystemInfo.get({ id: row.id }).then(res => { |
| | | this.info = res.data |
| | | }) |
| | | }, |
| | | table_add() { |
| | | this.$refs.dialog.open('add', { |
| | | |
| | | }) |
| | | }, |
| | | table_edit() { |
| | | this.$refs.dialog.open('edit', this.info) |
| | | }, |
| | | del() { |
| | | this.$confirm(`确定删除数据?`, '', { |
| | | type: 'warning' |
| | | }).then(() => { |
| | | this.$HTTP.delete(`/api/blade-cps/shift/${this.info.id}`).then(res => { |
| | | if (res.code === 200) { |
| | | this.$refs.table.reload(this.params) |
| | | } |
| | | }) |
| | | }).catch(() => { |
| | | |
| | | }) |
| | | |
| | | } |
| | | }, |
| | | } |