Bläddra i källkod

pms 瑞都日报 任务 添加多个工作量

zhangcl 2 veckor sedan
förälder
incheckning
bca24a3322
1 ändrade filer med 214 tillägg och 4 borttagningar
  1. 214 4
      src/views/pms/iotprojecttask/IotProjectTaskForm.vue

+ 214 - 4
src/views/pms/iotprojecttask/IotProjectTaskForm.vue

@@ -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>