Browse Source

pms 日报 项目 列表 功能优化

zhangcl 1 tháng trước cách đây
mục cha
commit
b858798958

+ 2 - 1
src/locales/zh-CN.ts

@@ -265,7 +265,8 @@ export default {
     area: '项目区域',
     wellType: '井型',
     wellCategory: '井别',
-    technology: '施工工艺'
+    technology: '施工工艺',
+    unit: '工作量单位'
   },
   form: {
     input: '输入框',

+ 2 - 1
src/utils/dict.ts

@@ -283,5 +283,6 @@ export enum DICT_TYPE {
   PMS_PROJECT_AREA = 'rq_iot_project_area',  // 日报 项目管理 海外项目所属区域
   PMS_PROJECT_WELL_TYPE = 'rq_iot_project_well_type',  // 日报 项目管理 井型
   PMS_PROJECT_WELL_CATEGORY = 'rq_iot_project_well_category',  // 日报 项目管理 井别
-  PMS_PROJECT_TECHNOLOGY = 'rq_iot_project_technology'  // 日报 项目管理 施工工艺
+  PMS_PROJECT_TECHNOLOGY = 'rq_iot_project_technology',  // 日报 项目管理 施工工艺
+  PMS_PROJECT_WORKLOAD_UNIT = 'rq_iot_project_measure_unit'  // 日报 项目管理 工作量单位
 }

+ 78 - 12
src/views/pms/iotprojectinfo/IotProjectInfoDetail.vue

@@ -23,12 +23,12 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="合同名称">
-              <el-input v-model="formData.contractName" readonly />
+              <el-input v-model="formData.contractName" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="合同编号">
-              <el-input v-model="formData.contractCode" readonly />
+              <el-input v-model="formData.contractCode" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -36,12 +36,22 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="客户名称">
-              <el-input v-model="formData.manufactureName" readonly />
+              <el-input v-model="formData.manufactureName" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="结算方式">
+            <!-- <el-form-item label="结算方式">
               <el-input v-model="formData.payment" readonly />
+            </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>
@@ -49,12 +59,12 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="总数">
-              <el-input v-model="formData.workloadTotal" readonly />
+              <el-input v-model="formData.workloadTotal" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="已完成">
-              <el-input v-model="formData.workloadFinish" readonly />
+              <el-input v-model="formData.workloadFinish" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -66,7 +76,7 @@
                 v-model="formData.startTime"
                 type="date"
                 placeholder="选择开始时间"
-                readonly
+                disabled
               />
             </el-form-item>
           </el-col>
@@ -76,13 +86,13 @@
                 v-model="formData.endTime"
                 type="date"
                 placeholder="选择完成时间"
-                readonly
+                disabled
               />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item label="备注">
-          <el-input v-model="formData.remark" type="textarea" readonly />
+          <el-input v-model="formData.remark" type="textarea" disabled />
         </el-form-item>
       </el-form>
     </el-card>
@@ -97,13 +107,33 @@
 
       <el-table :data="taskList" v-loading="loading">
         <el-table-column label="井号" prop="wellName" />
-        <el-table-column label="井型/井别" prop="wellType" />
+        <el-table-column :label="t('project.wellType')" align="center" prop="wellType" min-width="70">
+          <template #default="scope">
+            <dict-tag :type="DICT_TYPE.PMS_PROJECT_WELL_TYPE" :value="scope.row.wellType" />
+          </template>
+        </el-table-column>
+        <el-table-column :label="t('project.wellCategory')" align="center" prop="wellCategory" min-width="70">
+          <template #default="scope">
+            <dict-tag :type="DICT_TYPE.PMS_PROJECT_WELL_CATEGORY" :value="scope.row.wellCategory" />
+          </template>
+        </el-table-column>
         <el-table-column label="施工地点" prop="location" />
-        <el-table-column label="施工工艺" prop="technique" />
+        <el-table-column :label="t('project.technology')" align="center" prop="technique" min-width="70">
+          <template #default="scope">
+            <dict-tag :type="DICT_TYPE.PMS_PROJECT_TECHNOLOGY" :value="scope.row.technique" />
+          </template>
+        </el-table-column>
         <el-table-column label="设计工作量" prop="workloadDesign" />
         <el-table-column label="施工队伍">
           <template #default="{ row }">
-            {{ getDeptNames(row.deptIds) }}
+            <el-tooltip
+              :content="getAllDeptNames(row.deptIds)"
+              placement="top"
+            >
+              <span class="dept-names">
+                {{ getBriefDeptNames(row.deptIds) }}
+              </span>
+            </el-tooltip>
           </template>
         </el-table-column>
         <el-table-column label="施工设备">
@@ -145,6 +175,7 @@ import { IotDeviceApi } from '@/api/pms/device'
 import * as UserApi from "@/api/system/user";
 import * as DeptApi from "@/api/system/dept";
 import { handleTree } from "@/utils/tree";
+import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
 
 /** 项目信息 详情 包含 项目下的任务列表 */
 defineOptions({ name: 'IotProjectInfoDetail' })
@@ -153,6 +184,7 @@ const { currentRoute, push } = useRouter();
 const { params } = useRoute();
 const loading = ref(false);
 const formLoading = ref(false);
+const { t } = useI18n() // 国际化
 
 // 项目基本信息
 const formData = ref({
@@ -223,6 +255,40 @@ const getAllDeviceNames = (deviceIds) => {
   return deviceNames.join(', ') || '无有效设备';
 };
 
+// 获取简略部门名称(用于表格显示)
+const getBriefDeptNames = (deptIds) => {
+  if (!deptIds || deptIds.length === 0) return '';
+
+  const names = [];
+  const findDept = (list, id) => {
+    for (const item of list) {
+      if (item.id === id) {
+        names.push(item.name);
+        return true;
+      }
+      if (item.children && findDept(item.children, id)) {
+        return true;
+      }
+    }
+    return false;
+  };
+
+  deptIds.forEach(id => findDept(deptList.value, id));
+
+  if (names.length === 0) return '';
+  if (names.length > 2) {
+    return `${names[0]}, ${names[1]}...`;
+  }
+
+  return names.join(', ');
+};
+
+// 获取所有部门名称(用于tooltip显示)
+const getAllDeptNames = (deptIds) => {
+  if (!deptIds || deptIds.length === 0) return '无施工队伍';
+  return getDeptNames(deptIds);
+};
+
 // 获取责任人名称
 const getResponsiblePersonNames = (responsiblePersonIds) => {
   if (!responsiblePersonIds || responsiblePersonIds.length === 0) return '';

+ 34 - 1
src/views/pms/iotprojecttask/IotProjectTaskForm.vue

@@ -177,7 +177,7 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="technique" label="施工工艺">
+          <el-table-column prop="technique" :label="t('project.technology')">
             <template #default="{ row }">
               <span v-if="!row.editing">{{ getTechniqueLabel(row.technique) }}</span>
               <div v-else>
@@ -203,6 +203,24 @@
               </div>
             </template>
           </el-table-column>
+
+          <el-table-column prop="workloadUnit" :label="t('project.unit')">
+            <template #default="{ row }">
+              <span v-if="!row.editing">{{ getWorkloadUnitLabel(row.workloadUnit) }}</span>
+              <div v-else>
+                <el-select v-model="row.editData.workloadUnit" placeholder="请选择工作量单位" clearable>
+                  <el-option
+                    v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WORKLOAD_UNIT)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+                <div v-if="row.errors.workloadUnit" class="error-message">{{ row.errors.workloadUnit }}</div>
+              </div>
+            </template>
+          </el-table-column>
+
           <el-table-column prop="deptIds" label="施工队伍" >
             <template #default="{ row }">
               <span v-if="!row.editing">
@@ -461,6 +479,7 @@ const formData = ref({
   contractCode: undefined,
   workloadTotal: undefined,
   workloadFinish: undefined,
+  workloadUnit: undefined,
   startTime: undefined,
   endTime: undefined,
   location: undefined,
@@ -591,6 +610,7 @@ const tableData = ref([
     location: '',
     technique: '',
     workloadDesign: '',
+    workloadUnit: '',
     deptIds: [],
     deviceIds: [],
     deviceCodes: '',
@@ -773,6 +793,13 @@ const getTechniqueLabel = (value) => {
   return option ? option.label : value
 }
 
+// 获取 工作量单位 标签的方法
+const getWorkloadUnitLabel = (value) => {
+  const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_WORKLOAD_UNIT)
+  const option = options.find(opt => opt.value === value)
+  return option ? option.label : value
+}
+
 /** 打开弹窗 */
 const open = async () => {
   resetForm()
@@ -963,6 +990,7 @@ const resetForm = () => {
     contractCode: undefined,
     workloadTotal: undefined,
     workloadFinish: undefined,
+    workloadUnit: undefined,
     startTime: undefined,
     endTime: undefined,
     location: undefined,
@@ -1036,6 +1064,7 @@ const addNewRow = () => {
     location: '',
     technique: '',
     workloadDesign: '',
+    workloadUnit: '',
     deptIds: [],
     deviceIds: [],
     deviceCodes: '',
@@ -1050,6 +1079,7 @@ const addNewRow = () => {
       location: '',
       technique: '',
       workloadDesign: '',
+      workloadUnit: '',
       deptIds: [],
       deviceIds: [],
       deviceCodes: '',
@@ -1077,6 +1107,7 @@ const editRow = (row) => {
     location: row.location,
     technique: row.technique,
     workloadDesign: row.workloadDesign,
+    workloadUnit: row.workloadUnit,
     deptIds: row.deptIds,
     deviceIds: row.deviceIds,
     deviceCodes: row.deviceCodes,
@@ -1160,6 +1191,7 @@ const saveRow = (row) => {
   row.location = row.editData.location;
   row.technique = row.editData.technique;
   row.workloadDesign = row.editData.workloadDesign;
+  row.workloadUnit = row.editData.workloadUnit;
   row.deptIds = row.editData.deptIds;
   row.deviceIds = row.editData.deviceIds;
   // row.deviceCodes = row.editData.deviceCodes;
@@ -1234,6 +1266,7 @@ const cancelEdit = (row) => {
     row.location = row.originalData.location;
     row.technique = row.originalData.technique;
     row.workloadDesign = row.originalData.workloadDesign;
+    row.workloadUnit = row.originalData.workloadUnit;
     row.deptIds = row.originalData.deptIds;
     row.deviceIds = row.originalData.deviceIds;
     row.deviceCodes = row.originalData.deviceCodes;

+ 2 - 1
src/views/pms/iotprojecttask/index.vue

@@ -58,6 +58,7 @@
       <el-form-item>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <!--
         <el-button
           type="primary"
           plain
@@ -65,7 +66,7 @@
           v-hasPermi="['rq:iot-project-task:create']"
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
-        </el-button>
+        </el-button> -->
         <el-button
           type="success"
           plain