Преглед изворни кода

pms 日报 项目 数据字典 下拉列表 类型的字段

zhangcl пре 1 месец
родитељ
комит
1371154591

+ 58 - 7
src/views/pms/iotprojectinfo/IotProjectInfoForm.vue

@@ -4,7 +4,7 @@
       ref="formRef"
       :model="formData"
       :rules="formRules"
-      label-width="100px"
+      label-width="120px"
       v-loading="formLoading"
     >
       <el-row>
@@ -20,8 +20,15 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="结算方式" prop="payment">
-            <el-input v-model="formData.payment" placeholder="请输入结算方式" />
+          <el-form-item :label="t('project.payment')" prop="payment">
+            <el-select v-model="formData.payment" placeholder="请选择" clearable>
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_SETTLEMENT)"
+                :key="dict.id"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -94,9 +101,16 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="责任人" prop="responsiblePerson">
-            <span v-if="selectedUserNames" class="user-names">
-              {{ selectedUserNames }}
-            </span>
+            <el-tooltip
+              v-if="selectedUserNames"
+              effect="dark"
+              placement="top"
+              :content="getFullSelectedUserNames()"
+            >
+              <span class="user-names">
+                {{ selectedUserNames }}
+              </span>
+            </el-tooltip>
             <el-button
               type="primary"
               size="small"
@@ -109,8 +123,35 @@
             <div v-if="!formData.deptId" class="el-form-item__error">请先选择所属公司</div>
           </el-form-item>
         </el-col>
+      </el-row>
 
+      <el-row>
+        <el-col :span="12">
+          <el-form-item :label="t('project.overseaFlag')" prop="payment">
+            <el-select v-model="formData.overseas" placeholder="请选择" clearable>
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.PMS_PROJECT_OVERSEA_FLAG)"
+                :key="dict.id"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item :label="t('project.area')" prop="payment">
+            <el-select v-model="formData.overseasArea" placeholder="请选择" clearable>
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_AREA)"
+                :key="dict.id"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
       </el-row>
+
       <el-row>
         <el-col :span="24">
           <el-form-item label="备注" prop="remark">
@@ -183,6 +224,7 @@ import {updateConfig} from "@/api/infra/config";
 import {useTagsViewStore} from "@/store/modules/tagsView";
 import * as UserApi from "@/api/system/user";
 import {UserVO} from "@/api/system/user";
+import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
 
 /** 项目信息 表单 */
 defineOptions({ name: 'IotProjectInfo' })
@@ -604,6 +646,14 @@ const saveRow = (row) => {
   row.editing = false;
 };
 
+// 生成Tooltip要显示的完整责任人名称字符串
+const getFullSelectedUserNames = () => {
+  if (!selectedUserList.value || selectedUserList.value.length === 0) {
+    return '';
+  }
+  return selectedUserList.value.map(user => user.nickname).join(', ');
+};
+
 // 保存所有更改
 const saveAll = () => {
   let allValid = true;
@@ -670,12 +720,13 @@ const deleteRow = (index) => {
 
 <style scoped>
 .user-names {
-  padding: 5px 10px;
+  padding: 0px 10px;
   border: 1px solid #dcdfe6;
   border-radius: 4px;
   background-color: #f5f7fa;
   display: inline-block;
   min-width: 200px;
+  max-height: 32px;
 }
 
 .transfer-container {

+ 6 - 1
src/views/pms/iotprojectinfo/index.vue

@@ -109,7 +109,11 @@
       </el-table-column>
 <!--      <el-table-column label="施工地点" align="center" prop="location" />
       <el-table-column label="施工工艺" align="center" prop="technique" />-->
-      <el-table-column label="结算方式" align="center" prop="payment" />
+      <el-table-column :label="t('project.payment')" align="center" prop="payment" min-width="90">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PMS_PROJECT_SETTLEMENT" :value="scope.row.payment" />
+        </template>
+      </el-table-column>
       <el-table-column
         label="创建时间"
         align="center"
@@ -164,6 +168,7 @@ import { IotProjectInfoApi, IotProjectInfoVO } from '@/api/pms/iotprojectinfo'
 import {IotProjectTaskApi} from '@/api/pms/iotprojecttask'
 import IotProjectInfoForm from './IotProjectInfoForm.vue'
 import {useUserStore} from "@/store/modules/user";
+import {DICT_TYPE} from "@/utils/dict";
 /** 项目信息 列表 */
 defineOptions({ name: 'iotProjectInfo' })
 

+ 150 - 15
src/views/pms/iotprojecttask/IotProjectTaskForm.vue

@@ -43,8 +43,18 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="结算方式" prop="payment" >
+          <!-- <el-form-item label="结算方式" prop="payment" >
             <el-input v-model="formData.payment" placeholder="请输入结算方式" disabled/>
+          </el-form-item> -->
+          <el-form-item :label="t('project.payment')" prop="payment">
+            <el-select v-model="formData.payment" placeholder="请选择" disabled>
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_SETTLEMENT)"
+                :key="dict.id"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -121,16 +131,42 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="wellType" label="井型/井别">
+          <!-- 修改井型/井别列 -->
+          <el-table-column prop="wellType" label="井型">
             <template #default="{ row }">
-              <span v-if="!row.editing">{{ row.wellType }}</span>
+              <span v-if="!row.editing">{{ getWellTypeLabel(row.wellType) }}</span>
               <div v-else>
-                <el-input v-model="row.editData.wellType" class="edit-input" placeholder="请输入井型/井别" />
+                <el-select v-model="row.editData.wellType" placeholder="请选择井型" clearable>
+                  <el-option
+                    v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_TYPE)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
                 <div v-if="row.errors.wellType" class="error-message">{{ row.errors.wellType }}</div>
               </div>
             </template>
           </el-table-column>
 
+          <!-- 新增井别列 -->
+          <el-table-column prop="wellCategory" label="井别">
+            <template #default="{ row }">
+              <span v-if="!row.editing">{{ getWellCategoryLabel(row.wellCategory) }}</span>
+              <div v-else>
+                <el-select v-model="row.editData.wellCategory" placeholder="请选择井别" clearable>
+                  <el-option
+                    v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_CATEGORY)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+                <div v-if="row.errors.wellCategory" class="error-message">{{ row.errors.wellCategory }}</div>
+              </div>
+            </template>
+          </el-table-column>
+
           <el-table-column prop="location" label="施工地点" >
             <template #default="{ row }">
               <span v-if="!row.editing">{{ row.location }}</span>
@@ -141,11 +177,18 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="technique" label="施工工艺" >
+          <el-table-column prop="technique" label="施工工艺">
             <template #default="{ row }">
-              <span v-if="!row.editing">{{ row.technique }}</span>
+              <span v-if="!row.editing">{{ getTechniqueLabel(row.technique) }}</span>
               <div v-else>
-                <el-input v-model="row.editData.technique" class="edit-input" placeholder="请输入施工工艺" />
+                <el-select v-model="row.editData.technique" placeholder="请选择施工工艺" clearable>
+                  <el-option
+                    v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_TECHNOLOGY)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
                 <div v-if="row.errors.technique" class="error-message">{{ row.errors.technique }}</div>
               </div>
             </template>
@@ -186,6 +229,7 @@
                   placeholder="请选择施工队伍"
                   clearable
                 />
+                <div v-if="row.errors.deptIds" class="error-message">{{ row.errors.deptIds }}</div>
               </div>
             </template>
           </el-table-column>
@@ -208,10 +252,7 @@
                 >
                   选择设备
                 </el-button>
-                <!--
-                <span v-if="row.editData.deviceCodes" style="margin-left: 8px;">
-                  {{ row.editData.deviceCodes }}
-                </span> -->
+                <div v-if="row.errors.deviceIds" class="error-message">{{ row.errors.deviceIds }}</div>
               </div>
               </el-tooltip>
             </template>
@@ -235,10 +276,7 @@
                   >
                     选择责任人
                   </el-button>
-                  <!--
-                  <span v-if="row.editData.responsiblePersonNames" style="margin-left: 8px;">
-                    {{ row.editData.responsiblePersonNames }}
-                  </span> -->
+                  <div v-if="row.errors.responsiblePerson" class="error-message">{{ row.errors.responsiblePerson }}</div>
                 </div>
               </el-tooltip>
             </template>
@@ -376,6 +414,7 @@ import {companyLevelChildrenDepts} from "@/api/system/dept";
 import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
 import * as UserApi from "@/api/system/user";
 import {UserVO} from "@/api/system/user";
+import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
 
 const { query, params, name } = useRoute() // 查询参数
 const id = params.id
@@ -548,6 +587,7 @@ const tableData = ref([
     deptId:'',
     wellName: '',
     wellType: '',
+    wellCategory: '',
     location: '',
     technique: '',
     workloadDesign: '',
@@ -712,6 +752,27 @@ const handleDeviceDialogClose = () => {
   deviceDialogVisible.value = false;
 };
 
+// 获取井型标签的方法
+const getWellTypeLabel = (value) => {
+  const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_TYPE)
+  const option = options.find(opt => opt.value === value)
+  return option ? option.label : value
+}
+
+// 获取井别标签的方法
+const getWellCategoryLabel = (value) => {
+  const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_CATEGORY)
+  const option = options.find(opt => opt.value === value)
+  return option ? option.label : value
+}
+
+// 获取施工工艺标签的方法
+const getTechniqueLabel = (value) => {
+  const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_TECHNOLOGY)
+  const option = options.find(opt => opt.value === value)
+  return option ? option.label : value
+}
+
 /** 打开弹窗 */
 const open = async () => {
   resetForm()
@@ -821,11 +882,52 @@ const autoSelectContract = async (projectId: string) => {
   });
 } */
 
+/** 校验所有行数据 */
+const validateAllRows = (): boolean => {
+  // 新增检查:判断任务列表是否为空
+  if (!tableData.value || tableData.value.length === 0) {
+    ElMessage.error('没有任务数据,无法保存');
+    return false;
+  }
+
+  let allValid = true;
+
+  tableData.value.forEach(row => {
+    // 对每一行进行校验
+    const rowValid = validateRow(row);
+    if (!rowValid) {
+      allValid = false;
+    }
+
+    // 如果是编辑中的行,需要额外检查编辑数据
+    if (row.editing) {
+      if (!row.editData.wellName || row.editData.wellName.trim() === '') {
+        row.errors.wellName = '井号不能为空';
+        allValid = false;
+      }
+
+      if (!row.editData.wellType || row.editData.wellType.trim() === '') {
+        row.errors.wellType = '井型不能为空';
+        allValid = false;
+      }
+    }
+  });
+
+  return allValid;
+};
+
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
   // 校验表单
   await formRef.value.validate()
+
+  // 校验所有行数据
+  if (!validateAllRows()) {
+    // ElMessage.error('请检查表格中的数据,部分必填项未填写或格式不正确');
+    return;
+  }
+
   // 提交请求
   formLoading.value = true
   try {
@@ -944,6 +1046,7 @@ const addNewRow = () => {
     editData: {
       wellName: '',
       wellType: '',
+      wellCategory: '',
       location: '',
       technique: '',
       workloadDesign: '',
@@ -970,6 +1073,7 @@ const editRow = (row) => {
     id: row.id,
     wellName: row.wellName,
     wellType: row.wellType,
+    wellCategory: row.wellCategory,
     location: row.location,
     technique: row.technique,
     workloadDesign: row.workloadDesign,
@@ -1001,6 +1105,35 @@ const validateRow = (row) => {
     valid = false;
   }
 
+  // 施工地点
+  if (!row.editData.location || row.editData.location.trim() === '') {
+    row.errors.location = '施工地点不能为空';
+    valid = false;
+  }
+
+  if (!row.editData.technique || row.editData.technique.trim() === '') {
+    row.errors.technique = '施工工艺不能为空';
+    valid = false;
+  }
+
+  // 施工队伍 (deptIds 是数组)
+  if (!row.editData.deptIds || row.editData.deptIds.length === 0) {
+    row.errors.deptIds = '施工队伍不能为空';
+    valid = false;
+  }
+
+  // 施工设备 (deviceIds 是数组)
+  if (!row.editData.deviceIds || row.editData.deviceIds.length === 0) {
+    row.errors.deviceIds = '施工设备不能为空';
+    valid = false;
+  }
+
+  // 责任人 (responsiblePerson 是数组)
+  if (!row.editData.responsiblePerson || row.editData.responsiblePerson.length === 0) {
+    row.errors.responsiblePerson = '责任人不能为空';
+    valid = false;
+  }
+
   return valid;
 };
 
@@ -1023,6 +1156,7 @@ const saveRow = (row) => {
   row.id = row.editData.id;
   row.wellName = row.editData.wellName;
   row.wellType = row.editData.wellType;
+  row.wellCategory = row.editData.wellCategory;
   row.location = row.editData.location;
   row.technique = row.editData.technique;
   row.workloadDesign = row.editData.workloadDesign;
@@ -1096,6 +1230,7 @@ const cancelEdit = (row) => {
     row.id = row.originalData.id;
     row.wellName = row.originalData.wellName;
     row.wellType = row.originalData.wellType;
+    row.wellCategory = row.originalData.wellCategory;
     row.location = row.originalData.location;
     row.technique = row.originalData.technique;
     row.workloadDesign = row.originalData.workloadDesign;

+ 13 - 3
src/views/pms/iotprojecttask/index.vue

@@ -91,9 +91,19 @@
       <el-table-column label="合同名称" align="center" prop="contractName" />
       <el-table-column label="合同编号" align="center" prop="contractCode" />
       <el-table-column label="井号" align="center" prop="wellName" />
-      <el-table-column label="井型/井别" align="center" prop="wellType" />
+      <!-- <el-table-column label="井型/井别" align="center" prop="wellType" /> -->
+      <el-table-column :label="t('project.wellType')" align="center" prop="wellType" min-width="90">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PMS_PROJECT_WELL_TYPE" :value="scope.row.wellType" />
+        </template>
+      </el-table-column>
       <el-table-column label="施工地点" align="center" prop="location" />
-      <el-table-column label="施工工艺" align="center" prop="technique" />
+      <!-- <el-table-column label="施工工艺" align="center" prop="technique" /> -->
+      <el-table-column :label="t('project.technology')" align="center" prop="technique" min-width="90">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PMS_PROJECT_TECHNOLOGY" :value="scope.row.technique" />
+        </template>
+      </el-table-column>
       <el-table-column label="设计工作量" align="center" prop="workloadDesign" />
       <el-table-column
         label="创建时间"
@@ -271,7 +281,7 @@ const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
 const { push } = useRouter() // 路由跳转
 
-const COMPLETED_STATUS = 5;
+const COMPLETED_STATUS = 6;
 
 // 计划相关状态
 const planDialogVisible = ref(false)