parent
cf96e155b6
commit
d36d903a53
@ -0,0 +1,37 @@
|
|||||||
|
import _axios from '@/utils/_axios';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取手术接台平均时长(左下角)
|
||||||
|
*/
|
||||||
|
export const GetMonitorAverageReceptionTime = date => {
|
||||||
|
return _axios({
|
||||||
|
url: '/api/QualityMicroservice/Monitor/GetMonitorAverageReceptionTime',
|
||||||
|
params: {
|
||||||
|
date,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取手术时长列表(右边)
|
||||||
|
*/
|
||||||
|
export const GetMonitorRoomUsageRate = date => {
|
||||||
|
return _axios({
|
||||||
|
url: '/api/QualityMicroservice/Monitor/GetMonitorRoomUsageRate',
|
||||||
|
params: {
|
||||||
|
date,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取手术室列表
|
||||||
|
*/
|
||||||
|
export const GetRoomList = () => {
|
||||||
|
return _axios({
|
||||||
|
url: '/api/ScheduleMicroservice/dict_operationroom/querylist',
|
||||||
|
params: {
|
||||||
|
pageSize: 999,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,234 @@
|
|||||||
|
<template>
|
||||||
|
<div class="w-[116.94vh] h-[85.51vh] bgRightMidBox">
|
||||||
|
<section class="h-full" ref="echartsContainer"></section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isLoding: false,
|
||||||
|
chartOptions: {
|
||||||
|
grid: {
|
||||||
|
width: '86%',
|
||||||
|
height: '80%',
|
||||||
|
top: '14%',
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
name: '入手术室',
|
||||||
|
icon: 'rect',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#92CC76',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '开始手术',
|
||||||
|
icon: 'rect',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#EF6666',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '手术结束',
|
||||||
|
icon: 'rect',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#FAC858',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '出手术室',
|
||||||
|
icon: 'rect',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#5470C6',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
selectedMode: 'none',
|
||||||
|
top: "6%",
|
||||||
|
right: "4%",
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 14,
|
||||||
|
fontFamily: 'DIN-Bold,Microsoft YaHei',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'time',
|
||||||
|
position: 'top',
|
||||||
|
splitNumber: 24,
|
||||||
|
axisLabel: {
|
||||||
|
color: '#B7BDBF',
|
||||||
|
fontSize: 12,
|
||||||
|
margin: 16,
|
||||||
|
formatter: function (value) {
|
||||||
|
var date = new Date(value);
|
||||||
|
var hours = date.getHours();
|
||||||
|
var minutes = date.getMinutes();
|
||||||
|
if (hours === 0 && minutes === 0) {
|
||||||
|
return '00:00';
|
||||||
|
} else {
|
||||||
|
return (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: [],
|
||||||
|
axisLabel: {
|
||||||
|
color: '#B7BDBF',
|
||||||
|
fontSize: 12,
|
||||||
|
margin: 16,
|
||||||
|
fontFamily: 'DIN-Bold,Microsoft YaHei',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initData() {
|
||||||
|
// 创建一个数组来存储整点时间
|
||||||
|
const currentDate = dayjs().format('YYYY-MM-DD');
|
||||||
|
const hours = new Date().getHours();
|
||||||
|
const detailMin = dayjs().subtract(1, 'minute').format('HH:mm:00');
|
||||||
|
const sevenMinutesAgo = dayjs().subtract(8, 'minute').format('HH:mm:00');
|
||||||
|
this.chartOptions.xAxis.min = `${currentDate} 08:00:00`;
|
||||||
|
this.chartOptions.xAxis.max = `${dayjs().add(1, 'day').format('YYYY-MM-DD')} 07:00:00`;
|
||||||
|
// 手术间数量
|
||||||
|
const num = 20;
|
||||||
|
// 时间数组
|
||||||
|
const timeArr = [];
|
||||||
|
// 生成手术间
|
||||||
|
for (let index = num; index >= 1; index--) {
|
||||||
|
this.chartOptions.yAxis.data.push(`手术间${String(index).padStart(3, '0')}`);
|
||||||
|
const isUseArr = this.getUseTime();
|
||||||
|
for (let j = 1; j < isUseArr.length; j += 2) {
|
||||||
|
if (isUseArr[j] <= hours) {
|
||||||
|
timeArr.push({
|
||||||
|
startTime: `${currentDate} ${isUseArr[j - 1]}:00:00`,
|
||||||
|
endTime: `${currentDate} ${isUseArr[j]}:00:00`,
|
||||||
|
yValue: index - 1,
|
||||||
|
color: '#5470C6',
|
||||||
|
diff: dayjs(`${currentDate} ${isUseArr[j]}:00:00`).diff(dayjs(`${currentDate} ${isUseArr[j - 1]}:00:00`), 'minute'),
|
||||||
|
name: '出手术室',
|
||||||
|
});
|
||||||
|
} else if (isUseArr[j] > hours && isUseArr[j - 1] < hours) {
|
||||||
|
if (Math.random() > 0.5) {
|
||||||
|
timeArr.push({
|
||||||
|
startTime: `${currentDate} ${isUseArr[j - 1]}:00:00`,
|
||||||
|
endTime: `${currentDate} ${detailMin}`,
|
||||||
|
yValue: index - 1,
|
||||||
|
color: '#EF6666',
|
||||||
|
diff: dayjs(`${currentDate} ${detailMin}`).diff(dayjs(`${currentDate} ${isUseArr[j - 1]}:00:00`), 'minute'),
|
||||||
|
name: '开始手术',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
timeArr.push({
|
||||||
|
startTime: `${currentDate} ${isUseArr[j - 1]}:00:00`,
|
||||||
|
endTime: `${currentDate} ${detailMin}`,
|
||||||
|
yValue: index - 1,
|
||||||
|
color: '#FAC858',
|
||||||
|
diff: dayjs(`${currentDate} ${detailMin}`).diff(dayjs(`${currentDate} ${isUseArr[j - 1]}:00:00`), 'minute'),
|
||||||
|
name: '手术结束',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (isUseArr[j] > hours && isUseArr[j - 1] == hours) {
|
||||||
|
timeArr.push({
|
||||||
|
startTime: `${currentDate} ${sevenMinutesAgo}`,
|
||||||
|
endTime: `${currentDate} ${detailMin}`,
|
||||||
|
yValue: index - 1,
|
||||||
|
color: '#92CC76',
|
||||||
|
diff: '7',
|
||||||
|
name: '入手术室',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 生成series数据
|
||||||
|
console.log(timeArr);
|
||||||
|
this.chartOptions.series = this.seriesData(timeArr);
|
||||||
|
},
|
||||||
|
seriesData(data) {
|
||||||
|
const res = data.map(function (item) {
|
||||||
|
return {
|
||||||
|
type: 'custom',
|
||||||
|
name: item.name,
|
||||||
|
renderItem: function (params, api) {
|
||||||
|
var xStart = api.coord([item.startTime, item.yValue]);
|
||||||
|
var xEnd = api.coord([item.endTime, item.yValue]);
|
||||||
|
var textX = (xStart[0] + xEnd[0]) / 2;
|
||||||
|
var textY = xStart[1] - 20;
|
||||||
|
return {
|
||||||
|
type: 'group',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
shape: {
|
||||||
|
x1: xStart[0],
|
||||||
|
y1: xStart[1],
|
||||||
|
x2: xEnd[0],
|
||||||
|
y2: xEnd[1],
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
stroke: item.color,
|
||||||
|
lineWidth: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
position: [textX, textY],
|
||||||
|
style: {
|
||||||
|
text: `${item.diff} min`,
|
||||||
|
fill: '#B7BDBF',
|
||||||
|
textSize: '12px',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
data: [item],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
getUseTime() {
|
||||||
|
// 随机生成当天手术室的使用时间
|
||||||
|
function getRandomUniqueValues(min, max, count) {
|
||||||
|
const values = new Set();
|
||||||
|
while (values.size < count) {
|
||||||
|
values.add(Math.floor(Math.random() * (max - min + 1)) + min);
|
||||||
|
}
|
||||||
|
return Array.from(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
const numValues = Math.floor(Math.random() * 3) + 8;
|
||||||
|
const randomValues = getRandomUniqueValues(8, 24, numValues % 2 ? numValues + 1 : numValues);
|
||||||
|
return randomValues.sort((a, b) => {
|
||||||
|
return a - b;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
const chartContainer = this.$refs.echartsContainer;
|
||||||
|
const chart = echarts.init(chartContainer);
|
||||||
|
this.initData();
|
||||||
|
chart.setOption(this.chartOptions);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.bgRightMidBox {
|
||||||
|
background-image: url('@/assets/svg/Room/RightMid/Box.svg');
|
||||||
|
background-size: contain;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue