|
@@ -8,6 +8,7 @@
|
|
:inline="true"
|
|
:inline="true"
|
|
label-width="68px"
|
|
label-width="68px"
|
|
>
|
|
>
|
|
|
|
+ <!--
|
|
<el-form-item label="客户名称" prop="manufactureName">
|
|
<el-form-item label="客户名称" prop="manufactureName">
|
|
<el-input
|
|
<el-input
|
|
v-model="queryParams.manufactureName"
|
|
v-model="queryParams.manufactureName"
|
|
@@ -16,7 +17,7 @@
|
|
@keyup.enter="handleQuery"
|
|
@keyup.enter="handleQuery"
|
|
class="!w-240px"
|
|
class="!w-240px"
|
|
/>
|
|
/>
|
|
- </el-form-item>
|
|
|
|
|
|
+ </el-form-item> -->
|
|
<el-form-item label="合同名称" prop="contractName">
|
|
<el-form-item label="合同名称" prop="contractName">
|
|
<el-input
|
|
<el-input
|
|
v-model="queryParams.contractName"
|
|
v-model="queryParams.contractName"
|
|
@@ -88,8 +89,9 @@
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="合同编号" align="center" prop="contractCode" :width="columnWidths.contractCode" />
|
|
<el-table-column label="合同编号" align="center" prop="contractCode" :width="columnWidths.contractCode" />
|
|
|
|
+ <!--
|
|
<el-table-column label="总工作量" align="center" prop="workloadTotal" :width="columnWidths.workloadTotal" />
|
|
<el-table-column label="总工作量" align="center" prop="workloadTotal" :width="columnWidths.workloadTotal" />
|
|
- <el-table-column label="已完成工作量" align="center" prop="workloadFinish" :width="columnWidths.workloadFinish" />
|
|
|
|
|
|
+ <el-table-column label="已完成工作量" align="center" prop="workloadFinish" :width="columnWidths.workloadFinish" /> -->
|
|
<el-table-column
|
|
<el-table-column
|
|
label="合同开始时间"
|
|
label="合同开始时间"
|
|
align="center"
|
|
align="center"
|
|
@@ -195,7 +197,7 @@
|
|
<el-table-column label="施工地点" align="center" prop="location" />
|
|
<el-table-column label="施工地点" align="center" prop="location" />
|
|
<el-table-column :label="t('project.technology')" align="center" prop="technique" min-width="70">
|
|
<el-table-column :label="t('project.technology')" align="center" prop="technique" min-width="70">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
- <dict-tag :type="DICT_TYPE.PMS_PROJECT_TECHNOLOGY" :value="scope.row.technique" />
|
|
|
|
|
|
+ {{ getTechniqueLabel(scope.row) }}
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="设计工作量" align="center" prop="workloadDesign" />
|
|
<el-table-column label="设计工作量" align="center" prop="workloadDesign" />
|
|
@@ -292,9 +294,8 @@ import { dateFormatter,dateFormatter2 } from '@/utils/formatTime'
|
|
import download from '@/utils/download'
|
|
import download from '@/utils/download'
|
|
import { IotProjectInfoApi, IotProjectInfoVO } from '@/api/pms/iotprojectinfo'
|
|
import { IotProjectInfoApi, IotProjectInfoVO } from '@/api/pms/iotprojectinfo'
|
|
import {IotProjectTaskApi} from '@/api/pms/iotprojecttask'
|
|
import {IotProjectTaskApi} from '@/api/pms/iotprojecttask'
|
|
-import IotProjectInfoForm from './IotProjectInfoForm.vue'
|
|
|
|
import {useUserStore} from "@/store/modules/user";
|
|
import {useUserStore} from "@/store/modules/user";
|
|
-import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
|
|
|
|
|
|
+import {DICT_TYPE, getIntDictOptions, getDictLabel, getStrDictOptions} from "@/utils/dict";
|
|
import { IotDeviceApi } from '@/api/pms/device' // 引入设备API
|
|
import { IotDeviceApi } from '@/api/pms/device' // 引入设备API
|
|
import * as UserApi from "@/api/system/user"; // 引入用户API
|
|
import * as UserApi from "@/api/system/user"; // 引入用户API
|
|
import * as DeptApi from "@/api/system/dept"; // 引入部门API
|
|
import * as DeptApi from "@/api/system/dept"; // 引入部门API
|
|
@@ -318,7 +319,6 @@ const deptList = ref([]) // 部门列表
|
|
const deviceMap = ref({}) // 设备映射表
|
|
const deviceMap = ref({}) // 设备映射表
|
|
const responsiblePersonList = ref([]) // 责任人列表
|
|
const responsiblePersonList = ref([]) // 责任人列表
|
|
|
|
|
|
-const timelineData = ref<Array<{ timestamp: string; content: string }>>([]) // 时间线数据
|
|
|
|
const taskScheduleDictOptions = ref<any[]>([]) // 任务进度字典选项
|
|
const taskScheduleDictOptions = ref<any[]>([]) // 任务进度字典选项
|
|
const timelineDialogVisible = ref(false) // 控制时间线弹窗显示
|
|
const timelineDialogVisible = ref(false) // 控制时间线弹窗显示
|
|
const currentTaskRow = ref<any>(null) // 当前选中的任务行数据
|
|
const currentTaskRow = ref<any>(null) // 当前选中的任务行数据
|
|
@@ -327,6 +327,11 @@ const stepsData = ref<Array<{title: string, description?: string, status?: strin
|
|
const actualStepsData = ref<Array<{title: string, description?: string, status?: string}>>([]) // 实际步骤数据
|
|
const actualStepsData = ref<Array<{title: string, description?: string, status?: string}>>([]) // 实际步骤数据
|
|
const currentStepIndex = ref(0) // 当前步骤索引
|
|
const currentStepIndex = ref(0) // 当前步骤索引
|
|
|
|
|
|
|
|
+// 施工工艺字典选项映射表
|
|
|
|
+const technologyDictOptionsMap = ref<Record<number, any[]>>({});
|
|
|
|
+// 正在加载的deptId集合
|
|
|
|
+const loadingDeptIds = new Set<number>();
|
|
|
|
+
|
|
// 表格引用
|
|
// 表格引用
|
|
const tableRef = ref()
|
|
const tableRef = ref()
|
|
// 表格容器引用
|
|
// 表格容器引用
|
|
@@ -512,6 +517,47 @@ const resetQuery = () => {
|
|
handleQuery()
|
|
handleQuery()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 加载施工工艺数据字典选项
|
|
|
|
+const loadTechnologyDictOptions = async (deptId: number) => {
|
|
|
|
+ // 如果正在加载或已加载,直接返回
|
|
|
|
+ if (loadingDeptIds.has(deptId)) return;
|
|
|
|
+
|
|
|
|
+ loadingDeptIds.add(deptId);
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ // 获取数据字典标识符
|
|
|
|
+ const dictLabel = await getDictLabel(DICT_TYPE.PMS_PROJECT_TECHNOLOGY, deptId);
|
|
|
|
+
|
|
|
|
+ if (dictLabel) {
|
|
|
|
+ // 获取真正的数据字典选项
|
|
|
|
+ const dictOptions = getStrDictOptions(dictLabel);
|
|
|
|
+ technologyDictOptionsMap.value[deptId] = dictOptions;
|
|
|
|
+ } else {
|
|
|
|
+ // 如果没有获取到,设置为空数组
|
|
|
|
+ technologyDictOptionsMap.value[deptId] = [];
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error(`加载部门${deptId}的施工工艺数据字典失败:`, error);
|
|
|
|
+ technologyDictOptionsMap.value[deptId] = [];
|
|
|
|
+ } finally {
|
|
|
|
+ loadingDeptIds.delete(deptId);
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+// 获取施工工艺标签
|
|
|
|
+const getTechniqueLabel = (row: any) => {
|
|
|
|
+ const deptId = row.deptId;
|
|
|
|
+ const techniqueValue = row.technique;
|
|
|
|
+
|
|
|
|
+ if (!deptId || !technologyDictOptionsMap.value[deptId]) {
|
|
|
|
+ return techniqueValue; // 如果还没有加载到数据字典选项,显示原始值
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const options = technologyDictOptionsMap.value[deptId];
|
|
|
|
+ const option = options.find(opt => opt.value === techniqueValue);
|
|
|
|
+
|
|
|
|
+ return option ? option.label : techniqueValue;
|
|
|
|
+};
|
|
|
|
|
|
// 显示任务列表
|
|
// 显示任务列表
|
|
const showTaskList = async (project) => {
|
|
const showTaskList = async (project) => {
|
|
@@ -528,6 +574,8 @@ const showTaskList = async (project) => {
|
|
// 收集所有设备ID和责任人ID
|
|
// 收集所有设备ID和责任人ID
|
|
const allDeviceIds = new Set();
|
|
const allDeviceIds = new Set();
|
|
const allResponsiblePersonIds = new Set();
|
|
const allResponsiblePersonIds = new Set();
|
|
|
|
+ // 收集所有部门ID用于加载施工工艺字典
|
|
|
|
+ const allDeptIds = new Set();
|
|
|
|
|
|
taskList.value.forEach(item => {
|
|
taskList.value.forEach(item => {
|
|
if (item.deviceIds?.length) {
|
|
if (item.deviceIds?.length) {
|
|
@@ -536,6 +584,9 @@ const showTaskList = async (project) => {
|
|
if (item.responsiblePerson?.length) {
|
|
if (item.responsiblePerson?.length) {
|
|
item.responsiblePerson.forEach(id => allResponsiblePersonIds.add(id));
|
|
item.responsiblePerson.forEach(id => allResponsiblePersonIds.add(id));
|
|
}
|
|
}
|
|
|
|
+ if (item.deptId) {
|
|
|
|
+ allDeptIds.add(item.deptId);
|
|
|
|
+ }
|
|
});
|
|
});
|
|
|
|
|
|
// 批量获取设备信息
|
|
// 批量获取设备信息
|
|
@@ -559,6 +610,13 @@ const showTaskList = async (project) => {
|
|
});
|
|
});
|
|
responsiblePersonList.value = persons;
|
|
responsiblePersonList.value = persons;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 加载所有部门对应的施工工艺字典选项
|
|
|
|
+ allDeptIds.forEach(deptId => {
|
|
|
|
+ if (deptId && !technologyDictOptionsMap.value[deptId]) {
|
|
|
|
+ loadTechnologyDictOptions(deptId);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
} catch (error) {
|
|
} catch (error) {
|
|
console.error('加载任务列表失败:', error);
|
|
console.error('加载任务列表失败:', error);
|
|
message.error('加载任务列表失败');
|
|
message.error('加载任务列表失败');
|