From d0767d8a71f25f875e6989be8434d8519fc71945 Mon Sep 17 00:00:00 2001
From: Zy <1448159279@qq.com>
Date: Wed, 22 Apr 2026 17:44:05 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B7=A1=E6=A3=80=E4=BB=BB=E5=8A=A1=E7=BC=96?=
=?UTF-8?q?=E8=BE=91=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env.development | 4 +-
src/api/system/InspectionTask/type.ts | 27 ++--
.../system/inspection/Overview/index.vue | 125 ++++++++++++------
.../inspection/Plan/addInspectionPlan.vue | 7 +-
.../system/inspection/Record/RecordMain.vue | 10 +-
src/views/system/inspection/Record/index.vue | 37 +++---
src/views/system/inspection/Task/addTask.vue | 20 +--
src/views/system/inspection/Task/index.vue | 2 -
8 files changed, 142 insertions(+), 90 deletions(-)
diff --git a/.env.development b/.env.development
index fc339fe..32502d1 100644
--- a/.env.development
+++ b/.env.development
@@ -9,9 +9,9 @@ VITE_APP_ENV = 'development'
# 开发环境
VITE_APP_BASE_API = '/dev-api'
# # 开发环境 接口代理地址
-# VITE_APP_PROXY_API = 'http://192.168.1.222:8080'
+VITE_APP_PROXY_API = 'http://192.168.1.222:8080'
# 开发环境 接口代理地址
-VITE_APP_PROXY_API = 'http://192.168.1.215:8080'
+# VITE_APP_PROXY_API = 'http://192.168.1.215:8080'
# 图片基础地址
VITE_IMG_URL = 'http://192.168.1.222:8080'
diff --git a/src/api/system/InspectionTask/type.ts b/src/api/system/InspectionTask/type.ts
index 0291f82..e1d29c8 100644
--- a/src/api/system/InspectionTask/type.ts
+++ b/src/api/system/InspectionTask/type.ts
@@ -12,17 +12,17 @@ export interface TaskVO {
/**
* 关联巡检计划ID
*/
- planId: string | number;
+ planId: string;
/**
* 巡检人员ID
*/
- inspectorId: string | number;
+ inspectorId: string;
/**
* 巡检路线ID
*/
- routeId: string | number;
+ routeId: string;
/**
* 起止日期
@@ -34,6 +34,15 @@ export interface TaskVO {
*/
status: string;
+ /** 巡检人员信息 */
+ inspectorInfo: {
+ 'userId': string;
+ 'userName': string;
+ 'nickName': string;
+ 'phonenumber': '';
+ 'avatar': string;
+ }[];
+
/**
* 备注
*/
@@ -59,17 +68,17 @@ export interface TaskForm extends BaseEntity {
/**
* 关联巡检计划ID
*/
- planId?: string | number;
+ planId?: string;
/**
* 巡检人员ID
*/
- inspectorId?: string | number;
+ inspectorId?: string;
/**
* 巡检路线ID
*/
- routeId?: string | number;
+ routeId?: string;
/**
* 起止日期
@@ -101,17 +110,17 @@ export interface TaskQuery extends PageQuery {
/**
* 关联巡检计划ID
*/
- planId?: string | number;
+ planId?: string;
/**
* 巡检人员ID
*/
- inspectorId?: string | number;
+ inspectorId?: string;
/**
* 巡检路线ID
*/
- routeId?: string | number;
+ routeId?: string;
/**
* 起止日期
diff --git a/src/views/system/inspection/Overview/index.vue b/src/views/system/inspection/Overview/index.vue
index d2abd07..cefb3bf 100644
--- a/src/views/system/inspection/Overview/index.vue
+++ b/src/views/system/inspection/Overview/index.vue
@@ -27,12 +27,10 @@
-
-
-
{{ item.name }}
-
{{ item.value }}
-
-
+
+
{{ item.name }}
+
{{ item.value }}
+
@@ -41,10 +39,10 @@
- 数据统计
+ 数据统计
-
-
+
+
-
+
+
-
-
-
+
+
+
+
+ {{ scope.row.completedTasks - scope.row.outCompletedTasks }}
+
+
-
+
([]);
const loading = ref(true);
const showSearch = ref(true);
-const total = ref(0);
+const total = ref(100);
const queryFormRef = ref();
+
+const pagerCount = document.body.clientWidth <= 1500 ? 1 : 7;
+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();
};
@@ -117,17 +125,17 @@ const list = ref([
{
name: '计划数量',
key: 'totalPlans',
- value: 20
+ value: 0
},
{
name: '任务数量',
- key: 'totalPlans',
- value: 200
+ key: 'totalTasks',
+ value: 0
},
{
name: '任务完成数量',
- key: 'UncompletedTasks',
- value: 40
+ key: 'completedTasks',
+ value: 0
},
{
name: ' 完成率',
@@ -137,13 +145,13 @@ const list = ref([
{
name: '未完成数量',
key: 'outUncompletedTasks',
- value: 40
+ value: 0
}
]);
// ! echarts =================================================================
-
const activeEchartsindex = ref('totalTasks');
+// echarts tabs
const ecartslist = ref([
{
name: '全部任务',
@@ -176,6 +184,8 @@ const ecartslist = ref([
offsetbottomColor: 'rgb(233, 233, 235)'
}
]);
+
+// echarts options
const options = computed(() => ({
grid: {
left: '1%',
@@ -186,14 +196,26 @@ const options = computed(() => ({
},
xAxis: { data: xAxislist.value },
yAxis: { type: 'value' as const },
- tooltip: { trigger: 'axis' as const },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ shadowStyle: {
+ color: '#f6f8fc',
+ opacity: 0.3
+ }
+ }
+ },
series: activeSeries.value // 动态系列
}));
//
const diffday = ref(0);
const activeSeries = ref();
const xAxislist = ref([]);
+
+// join Echarts Options object
function handleEcartsOptions(data, name, colorlist = ['#1a75ff', '#f2f9ff']) {
+ activeSeries.value = null;
const obj = {
data: data,
type: 'line' as const,
@@ -229,12 +251,13 @@ function handleEcartsOptions(data, name, colorlist = ['#1a75ff', '#f2f9ff']) {
activeSeries.value = obj;
}
+// echarts tabs switch
function handleEcartsData(row: (typeof ecartslist.value)[number]) {
+ activeEchartsindex.value = row.key;
if (row) {
xAxislist.value = [];
// 避免修改原数组,创建副本排序
const sortedList = [...itemList.value].sort((a, b) => new Date(a.statDate).getTime() - new Date(b.statDate).getTime());
- console.log(sortedList);
// 创建日期到值的映射,标准化日期格式(假设 statDate 为 '2024-04-16 00:00:00',截取前10位)
const dataMap = new Map();
sortedList.forEach((item) => {
@@ -243,22 +266,16 @@ function handleEcartsData(row: (typeof ecartslist.value)[number]) {
});
// 根据 x 轴日期生成数据数组
- console.log(diffday.value);
- 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);
+ console.log(xAxisDates, dataMap);
xAxislist.value = xAxisDates;
-
- console.log('xAxisDates:', xAxisDates); // 调试
- console.log('dataMap:', dataMap); // 调试
- console.log('arr:', arr); // 调试
-
- activeSeries.value = null;
- handleEcartsOptions(arr, row.name, [row.color, row.offsetbottomColor]);
+ handleEcartsOptions(arr, row.name, [row.color]);
}
}
+// 选择日期
function handleStateDate(val) {
- console.log(diffDays(val));
diffday.value = diffDays(val);
queryParams.value.statDate = `${formatDate(new Date(val), 'YYYY/MM/DD')}-${formatDate(new Date(), 'YYYY/MM/DD')}`;
getList();
@@ -266,10 +283,10 @@ function handleStateDate(val) {
// ! echarts =================================================================
const day = 1000 * 60 * 60 * 24;
+// search options
function handleQueryDay(val: number) {
const newday = new Date(); // 当前日期
const time = new Date(newday.getTime() - val * day); // 指定日期
- console.log(time, newday);
diffday.value = val; // 差值
diffday.value = getNaturalDayDiff(time, newday);
queryParams.value.statDate = formatDate(time, 'YYYY/MM/DD');
@@ -283,7 +300,22 @@ const getList = async () => {
loading.value = true;
const res = await listItem(queryParams.value);
itemList.value = res.rows;
- handleEcartsData(ecartslist.value[0]);
+
+ list.value.forEach((item) => {
+ item.value = 0;
+ });
+
+ 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;
+ });
+ if (!Number.isNaN(+list.value[2].value) && !Number.isNaN(+list.value[1].value)) {
+ list.value[3].value = Math.min((Number(list.value[2].value) / Number(list.value[1].value)) * 100, 100) + '%';
+ }
+
+ handleEcartsData(ecartslist.value.find((item) => item.key === activeEchartsindex.value));
total.value = res.total;
loading.value = false;
};
@@ -300,14 +332,17 @@ onMounted(() => {
}
.rightSearch {
+ font-size: 0.85rem;
div {
- width: 60px;
+ min-width: 60px;
+ margin-right: 10px;
}
i {
margin: 0 10px;
display: block;
padding: 5px 5px;
font-style: normal;
+ cursor: pointer;
&:hover {
color: #409eff;
}
@@ -315,13 +350,20 @@ onMounted(() => {
}
.overviewBox {
display: flex;
- flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
margin-top: 40px;
+ gap: 20px;
.overviewitem {
+ flex: 1;
min-width: 150px;
- padding: 5px -5px;
+ padding: 25px 15px;
+ width: 240px;
+ height: 112px;
+ border-radius: 10px;
+ background-color: rgba(255, 255, 255, 1);
+ box-shadow: 0px 2px 6px 0px rgba(26, 117, 255, 0.2);
+ border: 1px solid rgba(26, 117, 255, 0.2);
.overviewitem_name {
color: rgba(102, 102, 102, 1);
@@ -346,9 +388,11 @@ onMounted(() => {
line-height: 40px;
width: 100px;
text-align: center;
+ font-size: 0.75rem;
border: 1px solid rgba(220, 223, 230, 1);
color: rgba(16, 16, 16, 1);
border-left: none;
+ cursor: pointer;
&:first-of-type {
border-radius: 4px 0px 0px 0px;
border-left: 1px solid rgba(220, 223, 230, 1);
@@ -363,5 +407,8 @@ onMounted(() => {
}
}
}
+ .echartsbody {
+ max-height: 500px;
+ }
}
diff --git a/src/views/system/inspection/Plan/addInspectionPlan.vue b/src/views/system/inspection/Plan/addInspectionPlan.vue
index 01b0cfa..3883939 100644
--- a/src/views/system/inspection/Plan/addInspectionPlan.vue
+++ b/src/views/system/inspection/Plan/addInspectionPlan.vue
@@ -45,7 +45,7 @@
-
+
@@ -80,6 +80,10 @@ import { ref } from 'vue';
import AMapLoader from '@amap/amap-jsapi-loader';
import { addPlan, getPlan, updatePlan } from '@/api/system/InspectionPlan';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { com_inspection_remind_tiime } = toRefs(proxy?.useDict('com_inspection_remind_tiime'));
+
+com_inspection_remind_tiime;
const route = useRoute();
const router = useRouter();
@@ -127,6 +131,7 @@ const options = ref([
}
]);
// 提醒时间
+
const remindTimeoptions = ref([
{
value: 10,
diff --git a/src/views/system/inspection/Record/RecordMain.vue b/src/views/system/inspection/Record/RecordMain.vue
index ece4388..1a3ea19 100644
--- a/src/views/system/inspection/Record/RecordMain.vue
+++ b/src/views/system/inspection/Record/RecordMain.vue
@@ -29,11 +29,9 @@
执行状态 :
-
{{ form.statusLabel }}
-
-
-
创建人 :
-
{{ form.createByName }}
+
+
+
创建时间 :
@@ -68,7 +66,7 @@ import { getRecord } from '@/api/system/InspectionRecord';
import { RecordVO } from '@/api/system/InspectionRecord/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { com_pay_method } = toRefs
(proxy?.useDict('com_pay_method'));
+const { com_inspection_task_status } = toRefs(proxy?.useDict('com_inspection_task_status'));
const router = useRouter();
const route = useRoute();
diff --git a/src/views/system/inspection/Record/index.vue b/src/views/system/inspection/Record/index.vue
index 329b118..15abc42 100644
--- a/src/views/system/inspection/Record/index.vue
+++ b/src/views/system/inspection/Record/index.vue
@@ -6,7 +6,9 @@
-
+
+
+
-
- 临时跳转详情页
-
-
- 删除
-
@@ -59,7 +53,11 @@
{{ parseTime(scope.row.actualEndTime, '{y}-{m}-{d}') }}
-
+
+
+
+
+
@@ -78,6 +76,7 @@ import { listRecord, getRecord, delRecord, addRecord, updateRecord } from '@/api
import { RecordVO, RecordQuery, RecordForm } from '@/api/system/InspectionRecord/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { com_inspection_task_status } = toRefs(proxy?.useDict('com_inspection_task_status'));
const recordList = ref([]);
const buttonLoading = ref(false);
@@ -167,21 +166,15 @@ const handleSelectionChange = (selection: RecordVO[]) => {
};
const router = useRouter();
-/** 新增按钮操作 */
-const handleAdd = () => {
- router.push({
- path: '/Inspection/RecordMain'
- });
-};
/** 修改按钮操作 */
const handleUpdate = async (row?: RecordVO) => {
- reset();
- const _id = row?.id || ids.value[0];
- const res = await getRecord(_id);
- Object.assign(form.value, res.data);
- dialog.visible = true;
- dialog.title = '修改巡检记录主';
+ router.push({
+ path: '/Inspection/RecordMain',
+ query: {
+ id: row.id
+ }
+ });
};
/** 提交按钮 */
diff --git a/src/views/system/inspection/Task/addTask.vue b/src/views/system/inspection/Task/addTask.vue
index 1e27c10..da694e3 100644
--- a/src/views/system/inspection/Task/addTask.vue
+++ b/src/views/system/inspection/Task/addTask.vue
@@ -10,11 +10,11 @@
-
+