瀏覽代碼

pms 瑞恒日报 非生产时间 24H 校验

zhangcl 3 周之前
父節點
當前提交
da1010026d

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

@@ -100,7 +100,7 @@
           </template>
         </el-table-column>
         <el-table-column label="施工地点" align="center" prop="location" :width="columnWidths.location" />
-        <!-- <el-table-column label="施工工艺" align="center" prop="technique" /> -->
+        <el-table-column label="施工队伍" align="center" prop="deptNames" :width="columnWidths.deptNames" />
         <el-table-column :label="t('project.technology')" align="center" prop="technique" :width="columnWidths.technique">
           <template #default="scope">
             <dict-tag :type="DICT_TYPE.PMS_PROJECT_TECHNOLOGY" :value="scope.row.technique" />
@@ -299,6 +299,7 @@ const columnWidths = ref({
   wellName: '100px',
   wellType: '100px',
   location: '120px',
+  deptNames: '120px',
   technique: '100px',
   workloadDesign: '100px',
   createTime: '150px',
@@ -545,6 +546,7 @@ const calculateColumnWidths = () => {
     return dict ? dict.label : '';
   });
   calculateColumnMinWidth('location', '施工地点', (row: any) => row.location);
+  calculateColumnMinWidth('deptNames', '施工队伍', (row: any) => row.deptNames);
   calculateColumnMinWidth('technique', t('project.technology'), (row: any) => {
     const dict = technologyDictOptions.value.find(d => d.value === row.technique);
     return dict ? dict.label : '';

+ 64 - 4
src/views/pms/iotrhdailyreport/IotRhDailyReportForm.vue

@@ -31,13 +31,22 @@
         <el-input v-model="formData.dailyWaterInjection" placeholder="请输入当日注水量(方)" />
       </el-form-item>
       <el-form-item label="当日注气时间(H)" prop="dailyInjectGasTime">
-        <el-input v-model="formData.dailyInjectGasTime" placeholder="请输入当日注气时间(H)" />
+        <el-input v-model="formData.dailyInjectGasTime"
+                  placeholder="请输入当日注气时间(H)"
+                  :class="{'red-text': isTimeSumInvalid}"
+                  @change="validateTimeSum" />
       </el-form-item>
       <el-form-item label="当日注水时间(H)" prop="dailyInjectWaterTime">
-        <el-input v-model="formData.dailyInjectWaterTime" placeholder="当日注水时间(H)" />
+        <el-input v-model="formData.dailyInjectWaterTime"
+                  placeholder="当日注水时间(H)"
+                  :class="{'red-text': isTimeSumInvalid}"
+                  @change="validateTimeSum" />
       </el-form-item>
       <el-form-item label="非生产时间(H)" prop="nonProductionTime">
-        <el-input v-model="formData.nonProductionTime" placeholder="" disabled/>
+        <el-input v-model="formData.nonProductionTime"
+                  placeholder="非生产时间(H)"
+                  :class="{'red-text': isTimeSumInvalid}"
+                  @change="validateTimeSum" />
       </el-form-item>
       <el-form-item label="非生产时间原因" prop="nptReason">
         <el-select v-model="formData.nptReason" placeholder="请选择" clearable disabled>
@@ -74,7 +83,7 @@
 <script setup lang="ts">
 import { IotRhDailyReportApi, IotRhDailyReportVO } from '@/api/pms/iotrhdailyreport'
 import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
-import { computed, ref, watch, nextTick } from 'vue'
+import { computed, ref, watch, nextTick, reactive } from 'vue'
 
 /** 瑞恒日报 表单 */
 defineOptions({ name: 'IotRhDailyReportForm' })
@@ -104,6 +113,8 @@ const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formType = ref('') // 表单的类型:create - 新增;update - 修改
 
+const isTimeSumInvalid = ref(false) // 时间总和的校验状态
+
 // 添加显示数据对象
 const displayData = ref({
   deptName: '',
@@ -143,7 +154,34 @@ const formData = ref({
   capacity: undefined
 })
 const formRules = reactive({
+  dailyInjectGasTime: [
+    { validator: validateTimeField, trigger: 'change' }
+  ],
+  dailyInjectWaterTime: [
+    { validator: validateTimeField, trigger: 'change' }
+  ],
+  nonProductionTime: [
+    { validator: validateTimeField, trigger: 'change' }
+  ]
 })
+
+// 时间字段校验器
+function validateTimeField(rule: any, value: any, callback: any) {
+  if (value === undefined || value === null || value === '') {
+    callback()
+    return
+  }
+
+  const numValue = Number(value)
+  if (isNaN(numValue)) {
+    callback(new Error('请输入有效的数字'))
+  } else if (numValue < 0) {
+    callback(new Error('时间不能为负数'))
+  } else {
+    callback()
+  }
+}
+
 const formRef = ref() // 表单 Ref
 
 // 计算运行时效的显示值和颜色
@@ -180,6 +218,18 @@ const calculateTransitTime = () => {
   }
 }
 
+// 验证三个时间字段的总和
+const validateTimeSum = () => {
+  const gasTime = Number(formData.value.dailyInjectGasTime) || 0
+  const waterTime = Number(formData.value.dailyInjectWaterTime) || 0
+  const nonProdTime = Number(formData.value.nonProductionTime) || 0
+
+  const total = gasTime + waterTime + nonProdTime
+  isTimeSumInvalid.value = total !== 24
+
+  return total === 24
+}
+
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
@@ -206,6 +256,8 @@ const open = async (type: string, id?: number) => {
         // 计算运行时效
         calculateTransitTime()
       }
+      // 验证时间总和
+      validateTimeSum()
     } finally {
       formLoading.value = false
     }
@@ -225,6 +277,12 @@ const submitForm = async () => {
     return
   }
 
+  // 检查时间总和
+  if (!validateTimeSum()) {
+    message.error('当日注气时间、注水时间和非生产时间之和必须等于24小时')
+    return
+  }
+
   // 提交请求
   formLoading.value = true
   try {
@@ -284,6 +342,8 @@ const resetForm = () => {
     taskName: ''
   }
 
+  isTimeSumInvalid.value = false
+
   formRef.value?.resetFields()
 }
 </script>

+ 28 - 1
src/views/pms/iotrhdailyreport/index.vue

@@ -292,7 +292,21 @@ const gasInjectionFormatter = (row: any, column: any, cellValue: any, index: num
   return (value / 10000).toFixed(2);
 };
 
-// 新增:单元格样式函数
+// 检查三个时间字段之和是否为24
+const checkTimeSumEquals24 = (row: any) => {
+  // 获取三个字段的值,转换为数字,如果为空则视为0
+  const gasTime = parseFloat(row.dailyInjectGasTime) || 0;
+  const waterTime = parseFloat(row.dailyInjectWaterTime) || 0;
+  const nonProdTime = parseFloat(row.nonProductionTime) || 0;
+
+  // 计算总和
+  const sum = gasTime + waterTime + nonProdTime;
+
+  // 返回是否等于24(允许一定的浮点数误差)
+  return Math.abs(sum - 24) < 0.01; // 使用0.01作为误差范围
+};
+
+// 单元格样式函数
 const cellStyle = ({ row, column, rowIndex, columnIndex }: { row: any; column: any; rowIndex: number; columnIndex: number }) => {
   // 只针对 transitTime 列进行处理
   if (column.property === 'transitTime') {
@@ -307,6 +321,19 @@ const cellStyle = ({ row, column, rowIndex, columnIndex }: { row: any; column: a
       };
     }
   }
+
+  // 处理三个时间字段:当日注气时间、当日注水时间、非生产时间
+  const timeFields = ['dailyInjectGasTime', 'dailyInjectWaterTime', 'nonProductionTime'];
+  if (timeFields.includes(column.property)) {
+    // 检查三个时间字段之和是否不等于24
+    if (!checkTimeSumEquals24(row)) {
+      return {
+        color: 'red',
+        fontWeight: 'bold'
+      };
+    }
+  }
+
   // 默认返回空对象,不应用特殊样式
   return {};
 };