8/13, dev
This commit is contained in:
@@ -46,7 +46,7 @@
|
||||
<div class="echartsbox flex h-full flex-col">
|
||||
<div class="echartsactions">
|
||||
<div
|
||||
@click="handleEcartsData(item)"
|
||||
@click="handleEchartsData(item)"
|
||||
:class="{ active: activeEchartsindex === item.key }"
|
||||
class="echartsactions_item"
|
||||
v-for="(item, index) in ecartslist"
|
||||
@@ -65,11 +65,7 @@
|
||||
<el-table v-loading="loading" border :data="itemList">
|
||||
<el-table-column fixed="left" label="日期" width="100" align="center" prop="statDate" />
|
||||
<el-table-column label="计划巡检任务" width="110" align="center" prop="totalPlans" />
|
||||
<el-table-column label="按时完成" align="center" prop="completedTasks">
|
||||
<template #default="scope">
|
||||
{{ scope.row.completedTasks - scope.row.outCompletedTasks }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="按时完成" align="center" prop="completedTasks" />
|
||||
<el-table-column label="超时完成" align="center" prop="outCompletedTasks" />
|
||||
<el-table-column label="超时未完成" width="110" align="center" prop="outUncompletedTasks" />
|
||||
<el-table-column label="进行中" align="center" prop="activeTask" />
|
||||
@@ -91,9 +87,10 @@
|
||||
|
||||
<script setup name="Item" lang="ts">
|
||||
import EchartsCompontent from '@/components/Echarts/index.vue';
|
||||
import { listItem, type Request } from '@/api/system/Inspection/index';
|
||||
import { getNaturalDayDiff, getLastNDays, diffDays, formatDate } from '@/utils/time';
|
||||
import { listItem, type Request } from '@/api/system/Inspection';
|
||||
import { diffDays, formatDate, getLastNDays, getNaturalDayDiff } from '@/utils/time';
|
||||
import { EChartsOption } from 'echarts';
|
||||
|
||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||
|
||||
const itemList = ref<any[]>([]);
|
||||
@@ -101,8 +98,6 @@ const loading = ref(true);
|
||||
const showSearch = ref(true);
|
||||
const total = ref(100);
|
||||
|
||||
const queryFormRef = ref<ElFormInstance>();
|
||||
|
||||
const layout = document.body.clientWidth <= 1500 ? 'total, sizes, prev, pager, next' : 'total, sizes, prev, pager, next,';
|
||||
const disabledDate = (time: Date) => {
|
||||
return time.getTime() > Date.now();
|
||||
@@ -207,14 +202,14 @@ const options = computed<EChartsOption>(() => ({
|
||||
series: activeSeries.value // 动态系列
|
||||
}));
|
||||
//
|
||||
const diffday = ref(0);
|
||||
const diffDay = ref(0);
|
||||
const activeSeries = ref();
|
||||
const xAxislist = ref([]);
|
||||
|
||||
// join Echarts Options object
|
||||
function handleEcartsOptions(data, name, colorlist = ['#1a75ff', '#f2f9ff']) {
|
||||
function handleEchartsOptions(data: number[], name: string, colorList: string[] = ['#1a75ff', '#f2f9ff']) {
|
||||
activeSeries.value = null;
|
||||
const obj = {
|
||||
activeSeries.value = {
|
||||
data: data,
|
||||
type: 'line' as const,
|
||||
smooth: true,
|
||||
@@ -226,31 +221,30 @@ function handleEcartsOptions(data, name, colorlist = ['#1a75ff', '#f2f9ff']) {
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1, // 从上到下渐变
|
||||
colorStops: colorlist.map((item, index) => {
|
||||
colorStops: colorList.map((item, index) => {
|
||||
return {
|
||||
offset: index / colorlist.length,
|
||||
offset: index / colorList.length,
|
||||
color: item
|
||||
};
|
||||
})
|
||||
}
|
||||
},
|
||||
lineStyle: {
|
||||
color: colorlist[0]
|
||||
color: colorList[0]
|
||||
},
|
||||
itemStyle: {
|
||||
color: colorlist[0]
|
||||
color: colorList[0]
|
||||
},
|
||||
label: {
|
||||
show: true,
|
||||
color: colorlist[0],
|
||||
color: colorList[0],
|
||||
position: 'top'
|
||||
}
|
||||
};
|
||||
activeSeries.value = obj;
|
||||
}
|
||||
|
||||
// echarts tabs switch
|
||||
function handleEcartsData(row: (typeof ecartslist.value)[number]) {
|
||||
function handleEchartsData(row: (typeof ecartslist.value)[number]) {
|
||||
activeEchartsindex.value = row.key;
|
||||
if (row) {
|
||||
xAxislist.value = [];
|
||||
@@ -264,16 +258,16 @@ function handleEcartsData(row: (typeof ecartslist.value)[number]) {
|
||||
});
|
||||
|
||||
// 根据 x 轴日期生成数据数组
|
||||
const xAxisDates = getLastNDays(diffday.value, undefined, 'YYYY/MM/DD'); // 确保格式为 ['2024-04-16', ...]
|
||||
const xAxisDates = getLastNDays(diffDay.value, undefined, 'YYYY/MM/DD'); // 确保格式为 ['2024-04-16', ...]
|
||||
const arr = xAxisDates.map((date) => dataMap.get(date) || 0);
|
||||
xAxislist.value = xAxisDates;
|
||||
handleEcartsOptions(arr, row.name, [row.color]);
|
||||
handleEchartsOptions(arr, row.name, [row.color]);
|
||||
}
|
||||
}
|
||||
|
||||
// 选择日期
|
||||
function handleStateDate(val) {
|
||||
diffday.value = diffDays(val);
|
||||
function handleStateDate(val: string) {
|
||||
diffDay.value = diffDays(val);
|
||||
queryParams.value.statDate = `${formatDate(new Date(val), 'YYYY/MM/DD')}-${formatDate(new Date(), 'YYYY/MM/DD')}`;
|
||||
getList();
|
||||
}
|
||||
@@ -282,10 +276,10 @@ function handleStateDate(val) {
|
||||
const day = 1000 * 60 * 60 * 24;
|
||||
// search options
|
||||
function handleQueryDay(val: number) {
|
||||
const newday = new Date(); // 当前日期
|
||||
const time = new Date(newday.getTime() - val * day); // 指定日期
|
||||
diffday.value = val; // 差值
|
||||
diffday.value = getNaturalDayDiff(time, newday);
|
||||
const newDay = new Date(); // 当前日期
|
||||
const time = new Date(newDay.getTime() - val * day); // 指定日期
|
||||
diffDay.value = val; // 差值
|
||||
diffDay.value = getNaturalDayDiff(time, newDay);
|
||||
queryParams.value.statDate = formatDate(time, 'YYYY/MM/DD');
|
||||
getList();
|
||||
}
|
||||
@@ -305,15 +299,16 @@ const getList = async () => {
|
||||
itemList.value.forEach((item) => {
|
||||
list.value[0].value += item.totalPlans ?? 0;
|
||||
list.value[1].value += item.totalTasks ?? 0;
|
||||
list.value[2].value += item.completedTasks ?? 0;
|
||||
list.value[4].value += item.outUncompletedTasks ?? 0;
|
||||
const num = item.outCompletedTasks + item.completedTasks || 0;
|
||||
list.value[2].value += num;
|
||||
});
|
||||
if (!Number.isNaN(+list.value[2].value) && !Number.isNaN(+list.value[1].value)) {
|
||||
const num = Number(list.value[2].value) / Number(list.value[1].value);
|
||||
list.value[3].value = Math.min((Number.isNaN(num) ? 0 : num) * 100, 100).toFixed(2) + '%';
|
||||
}
|
||||
|
||||
handleEcartsData(ecartslist.value.find((item) => item.key === activeEchartsindex.value));
|
||||
handleEchartsData(ecartslist.value.find((item) => item.key === activeEchartsindex.value));
|
||||
total.value = res.total;
|
||||
loading.value = false;
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<el-input maxlength="20" v-model.trim="form.planName" placeholder="请输入"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="任务时间">
|
||||
<el-form-item label="任务时间" prop="executeDay">
|
||||
<div class="flex flex-wrap">
|
||||
<div
|
||||
class="week-items"
|
||||
@@ -29,26 +29,26 @@
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务时间段">
|
||||
<el-form-item label="任务时间段" prop="taskTime">
|
||||
<div v-for="(_, index) in taskTime" :key="index" style="display: flex; align-items: center; margin-top: 10px">
|
||||
<el-time-picker
|
||||
v-model="taskTime[index]"
|
||||
@update:model-value="
|
||||
(val: string[]) => {
|
||||
const time = val.filter((t) => t[0] && t[1]);
|
||||
form.taskTime = `${time[0]}-${time[1]}`;
|
||||
}
|
||||
"
|
||||
is-range
|
||||
range-separator="到"
|
||||
start-placeholder="开始时间"
|
||||
format="HH:mm"
|
||||
value-format="HH:mm:00"
|
||||
value-format="HH:mm"
|
||||
end-placeholder="结束时间"
|
||||
style="width: 100%"
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="提醒时间">
|
||||
<el-select v-model="form.remindTime" placeholder="请选择" style="width: 100%">
|
||||
<el-option v-for="item in com_inspection_remind_tiime" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="计划路线" prop="routeIds">
|
||||
<el-select @change="handleChangeMap" v-model="form.routeIds" placeholder="请选择" style="width: 100%">
|
||||
<el-option v-for="item in playlist" :key="item.value" :label="item.routeName" :value="item.id" />
|
||||
@@ -75,9 +75,6 @@ import { Check } from '@element-plus/icons-vue';
|
||||
import MapWrapper from '@/components/Map/index.vue';
|
||||
import { LngLat } from '@/components/Map/type';
|
||||
|
||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||
const { com_inspection_remind_tiime } = toRefs<any>(proxy?.useDict('com_inspection_remind_tiime'));
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
@@ -94,6 +91,8 @@ const form = ref({
|
||||
const rules = ref({
|
||||
planName: [{ required: true, message: '请输入巡检计划名称', trigger: 'blur' }],
|
||||
inspectorIds: [{ required: true, message: '请选择巡检人员', trigger: 'blur' }],
|
||||
executeDay: [{ required: true, message: '请选择时间', trigger: 'blur' }],
|
||||
taskTime: [{ required: true, message: '请选择巡检时间段', trigger: 'blur' }],
|
||||
routeIds: [{ required: true, message: '请选择路线', trigger: 'blur' }]
|
||||
});
|
||||
// 初始化 taskTime,确保至少有一个时间段
|
||||
@@ -195,10 +194,6 @@ onMounted(() => {
|
||||
const formRef = ref();
|
||||
function submit() {
|
||||
// 将二维数组转换为字符串,例如 "09:00-11:00; 13:00-15:00"
|
||||
form.value.taskTime = taskTime.value
|
||||
.filter((t) => t[0] && t[1]) // 过滤掉未填写的
|
||||
.map((t) => `${t[0]}-${t[1]}`)
|
||||
.join('; ');
|
||||
|
||||
formRef.value?.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
|
||||
@@ -41,14 +41,14 @@
|
||||
<el-table-column label="计划巡检任务" align="center" prop="totalTasks" />
|
||||
<el-table-column label="按时完成" align="center" prop="completedTasks">
|
||||
<template #default="scope">
|
||||
{{ scope.row.completedTasks - scope.row.outCompletedTasks }}
|
||||
{{ scope.row.completedTasks }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="超时完成" align="center" prop="outCompletedTasks" />
|
||||
<el-table-column label="超时未完成" align="center" prop="outUncompletedTasks"></el-table-column>
|
||||
<el-table-column label="进行中" align="center" prop="activeTask" />
|
||||
<el-table-column label="未开始" align="center" prop="pendingTask" />
|
||||
<el-table-column label="完成率" align="center" prop="onTimeRateDisplay" />
|
||||
<el-table-column label="完成率" align="center" prop="completionRateDisplay" />
|
||||
</el-table>
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
</el-card>
|
||||
@@ -77,7 +77,7 @@ const data = reactive({
|
||||
|
||||
const checkdata = ref([]);
|
||||
const { queryParams } = toRefs(data);
|
||||
/** 查询巡检路线列表 */
|
||||
/** 查询巡检路线列表 ╬╬╬*/
|
||||
const getList = async () => {
|
||||
loading.value = true;
|
||||
list_statapi(queryParams.value)
|
||||
|
||||
Reference in New Issue
Block a user