|
|
@@ -236,12 +236,30 @@
|
|
|
<el-row>
|
|
|
<el-col :span="8">
|
|
|
<el-form-item label="设计工作量" prop="workloadDesign">
|
|
|
- <el-input v-model="currentTask.workloadDesign" placeholder="请输入设计工作量" :disabled="currentTask.platformWell === '1'"/>
|
|
|
+ <el-input
|
|
|
+ v-model="currentTask.workloadDesign"
|
|
|
+ placeholder="请输入设计工作量"
|
|
|
+ :disabled="currentTask.platformWell === '1'"
|
|
|
+ class="workload-input-with-button"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <el-tooltip content="添加多个设计工作量" placement="top">
|
|
|
+ <el-button
|
|
|
+ class="workload-add-btn"
|
|
|
+ @click="openWorkloadDialog"
|
|
|
+ :disabled="!currentTask.workloadUnit || currentTask.platformWell === '1'"
|
|
|
+ >
|
|
|
+ <!-- <el-icon><Plus /></el-icon> -->
|
|
|
+ <span class="btn-text">+</span>
|
|
|
+ </el-button>
|
|
|
+ </el-tooltip>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
<el-form-item :label="t('project.unit')" prop="workloadUnit">
|
|
|
- <el-select v-model="currentTask.workloadUnit" placeholder="请选择工作量单位" clearable>
|
|
|
+ <el-select v-model="currentTask.workloadUnit" placeholder="请选择工作量单位" clearable :disabled="currentTask.platformWell === '1'">
|
|
|
<el-option
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WORKLOAD_UNIT)"
|
|
|
:key="dict.value"
|
|
|
@@ -268,7 +286,7 @@
|
|
|
collapse-tags
|
|
|
collapse-tags-tooltip
|
|
|
:max-collapse-tags="1"
|
|
|
- class="department-tree-select"
|
|
|
+ class="department-tree-select single-line-tree-select"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -587,6 +605,71 @@
|
|
|
</span>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <!-- 工作量维护对话框 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="workloadDialogVisible"
|
|
|
+ title="设计工作量"
|
|
|
+ width="600px"
|
|
|
+ >
|
|
|
+ <el-table :data="workloadList" style="width: 100%">
|
|
|
+ <el-table-column prop="workloadUnit" label="工作量单位" width="200">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-select
|
|
|
+ v-model="workloadList[$index].workloadUnit"
|
|
|
+ placeholder="请选择工作量单位"
|
|
|
+ :disabled="$index === 0 && hasInitialWorkload"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WORKLOAD_UNIT)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ :disabled="getSelectedWorkloadUnits($index).includes(dict.value)"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="workloadDesign" label="工作量">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-input
|
|
|
+ v-model="workloadList[$index].workloadDesign"
|
|
|
+ placeholder="请输入工作量"
|
|
|
+ :disabled="$index === 0 && hasInitialWorkload"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="80">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ @click="removeWorkloadItem($index)"
|
|
|
+ :disabled="$index === 0 && hasInitialWorkload"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ size="small"
|
|
|
+ @click="addWorkloadItem"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ >
|
|
|
+ 添加一行
|
|
|
+ </el-button>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <span class="dialog-footer">
|
|
|
+ <el-button @click="workloadDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="confirmWorkloadSelection">确定</el-button>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
@@ -603,6 +686,8 @@ import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
|
|
|
import * as UserApi from "@/api/system/user";
|
|
|
import {IotProjectTaskAttrsApi, IotProjectTaskAttrsVO} from "@/api/pms/iotprojecttaskattrs";
|
|
|
import {DICT_TYPE, getIntDictOptions, getStrDictOptions, getDictLabel} from "@/utils/dict";
|
|
|
+// 在导入部分添加Plus图标
|
|
|
+// import { Plus } from '@element-plus/icons-vue'
|
|
|
|
|
|
const { query, params, name } = useRoute() // 查询参数
|
|
|
const id = params.id
|
|
|
@@ -673,6 +758,11 @@ const currentTechnologyDictLabel = ref(''); // 存储当前项目对应的施工
|
|
|
// 添加一个变量来保存平台井详情数据
|
|
|
const platformWellDetailsBackup = ref([]);
|
|
|
|
|
|
+// 工作量维护相关变量
|
|
|
+const workloadDialogVisible = ref(false);
|
|
|
+const workloadList = ref<any[]>([]);
|
|
|
+const hasInitialWorkload = ref(false);
|
|
|
+
|
|
|
/** 项目信息 表单 */
|
|
|
defineOptions({ name: 'IotProjectTaskInfo' })
|
|
|
|
|
|
@@ -887,7 +977,7 @@ const taskFormRules = computed(() => {
|
|
|
location: [{ required: true, message: '施工地点不能为空', trigger: 'blur' }],
|
|
|
technique: [{ required: true, message: '施工工艺不能为空', trigger: 'change' }],
|
|
|
workloadDesign: [{ required: currentTask.value.platformWell !== '1', message: '设计工作量不能为空', trigger: 'blur' }],
|
|
|
- workloadUnit: [{ required: true, message: '工作量单位不能为空', trigger: 'change' }],
|
|
|
+ workloadUnit: [{ required: currentTask.value.platformWell !== '1', message: '工作量单位不能为空', trigger: 'change' }],
|
|
|
deptIds: [{ required: true, message: '施工队伍不能为空', trigger: 'change' }],
|
|
|
deviceIds: [{ required: true, message: '施工设备不能为空', trigger: 'change' }],
|
|
|
responsiblePerson: [{ required: true, message: '责任人不能为空', trigger: 'change' }]
|
|
|
@@ -1040,6 +1130,71 @@ const openDeviceDialogForForm = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// 打开工作量维护对话框
|
|
|
+const openWorkloadDialog = () => {
|
|
|
+ // 重置列表
|
|
|
+ workloadList.value = [];
|
|
|
+ hasInitialWorkload.value = false;
|
|
|
+
|
|
|
+ // 如果表单中已有值,添加到首行
|
|
|
+ if (currentTask.value.workloadUnit && currentTask.value.workloadDesign) {
|
|
|
+ workloadList.value.push({
|
|
|
+ workloadUnit: currentTask.value.workloadUnit,
|
|
|
+ workloadDesign: currentTask.value.workloadDesign
|
|
|
+ });
|
|
|
+ hasInitialWorkload.value = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ workloadDialogVisible.value = true;
|
|
|
+};
|
|
|
+
|
|
|
+// 添加工作量项
|
|
|
+const addWorkloadItem = () => {
|
|
|
+ workloadList.value.push({
|
|
|
+ workloadUnit: '',
|
|
|
+ workloadDesign: ''
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 删除工作量项
|
|
|
+const removeWorkloadItem = (index: number) => {
|
|
|
+ workloadList.value.splice(index, 1);
|
|
|
+};
|
|
|
+
|
|
|
+// 确认工作量选择
|
|
|
+const confirmWorkloadSelection = () => {
|
|
|
+ // 验证数据
|
|
|
+ const invalidItems = workloadList.value.some(item =>
|
|
|
+ !item.workloadUnit || !item.workloadDesign
|
|
|
+ );
|
|
|
+
|
|
|
+ if (invalidItems) {
|
|
|
+ ElMessage.error('请完善所有工作量单位和工作量信息');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证工作量单位唯一性
|
|
|
+ const unitList = workloadList.value.map(item => item.workloadUnit).filter(Boolean);
|
|
|
+ const uniqueUnits = new Set(unitList);
|
|
|
+ if (unitList.length !== uniqueUnits.size) {
|
|
|
+ ElMessage.error('工作量单位不能重复,请选择不同的单位');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果有数据,设置第一个项到表单中(保持原有逻辑)
|
|
|
+ if (workloadList.value.length > 0) {
|
|
|
+ const firstItem = workloadList.value[0];
|
|
|
+ currentTask.value.workloadUnit = firstItem.workloadUnit;
|
|
|
+ currentTask.value.workloadDesign = firstItem.workloadDesign;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 这里可以根据需要将整个workloadList存储到currentTask中
|
|
|
+ // 例如:currentTask.value.workloadDesignList = [...workloadList.value];
|
|
|
+
|
|
|
+ workloadDialogVisible.value = false;
|
|
|
+ ElMessage.success('工作量信息已更新');
|
|
|
+};
|
|
|
+
|
|
|
// 处理穿梭框变化
|
|
|
const handleTransferChange = (value, direction, movedKeys) => {
|
|
|
// 可以添加额外的处理逻辑
|
|
|
@@ -1302,6 +1457,18 @@ const saveTask = async () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// 获取已选的工作量单位(排除当前行) ==========
|
|
|
+const getSelectedWorkloadUnits = (currentIndex) => {
|
|
|
+ if (!workloadList.value || workloadList.value.length === 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ // 过滤当前行 + 空值,收集已选的单位
|
|
|
+ return workloadList.value
|
|
|
+ .filter((_, index) => index !== currentIndex)
|
|
|
+ .map(item => item.workloadUnit)
|
|
|
+ .filter(unit => unit && unit.trim() !== '');
|
|
|
+};
|
|
|
+
|
|
|
// 删除当前任务
|
|
|
const deleteCurrentTask = () => {
|
|
|
if (!currentTask.value.id) return;
|
|
|
@@ -2238,4 +2405,47 @@ onMounted(async () => {
|
|
|
border-radius: 4px;
|
|
|
background-color: #fafafa;
|
|
|
}
|
|
|
+
|
|
|
+/* 按钮文字样式 - 红色字体 */
|
|
|
+:deep(.workload-add-btn .btn-text) {
|
|
|
+ color: #ff0000 !important;
|
|
|
+ font-weight: 900; /* 更粗的字体 */
|
|
|
+ font-size: 18px; /* 更大的字号 */
|
|
|
+ line-height: 1;
|
|
|
+}
|
|
|
+
|
|
|
+/* 设计工作量加号按钮 - 启用状态(深蓝色) */
|
|
|
+:deep(.workload-add-btn .el-icon) {
|
|
|
+ color: #ff0000 !important; /* Element Plus 主色调深蓝色,可替换为 #003366 等自定义深蓝色 */
|
|
|
+}
|
|
|
+
|
|
|
+/* 按钮禁用状态 */
|
|
|
+:deep(.workload-add-btn:disabled .btn-text) {
|
|
|
+ color: #c0c4cc !important;
|
|
|
+}
|
|
|
+
|
|
|
+/* 调整按钮整体样式,确保icon居中 */
|
|
|
+:deep(.workload-add-btn) {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ padding: 0 8px;
|
|
|
+ min-width: auto;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+/* 调整输入框append部分的宽度 */
|
|
|
+:deep(.workload-input-with-button .el-input-group__append) {
|
|
|
+ padding: 0;
|
|
|
+ width: 45px; /* 稍微增加宽度以容纳文字 */
|
|
|
+}
|
|
|
+
|
|
|
+/* 确保按钮在禁用状态下有正确的样式 */
|
|
|
+:deep(.workload-add-btn:disabled) {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ border-color: #e4e7ed;
|
|
|
+ cursor: not-allowed;
|
|
|
+}
|
|
|
+
|
|
|
</style>
|