Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

lipenghui 2 settimane fa
parent
commit
30323942ab

+ 2 - 0
src/api/pms/iotrhdailyreport/index.ts

@@ -8,6 +8,7 @@ export interface IotRhDailyReportVO {
   taskId: number // 任务id
   projectClassification: string // 项目类别(钻井 修井 注氮 酸化压裂... )
   relocationDays: number // 搬迁安装天数
+  designInjection: number // 设计注气量
   transitTime: number // 运行时效
   dailyGasInjection: number // 当日注气量(万方)
   dailyWaterInjection: number // 当日注水量(方)
@@ -22,6 +23,7 @@ export interface IotRhDailyReportVO {
   nextPlan: string // 下步工作计划
   constructionStatus: number // 施工状态(动迁 准备 施工 完工)
   personnel: string // 人员情况
+  capacity: number  // 产能
   totalGasInjection: number // 累计注气量(万方)
   totalWaterInjection: number // 累计注水量(方)
   cumulativeCompletion: number // 累计完工井次

+ 72 - 0
src/api/pms/iotrydailyreport/index.ts

@@ -0,0 +1,72 @@
+import request from '@/config/axios'
+
+// 瑞鹰日报 VO
+export interface IotRyDailyReportVO {
+  id: number // 主键id
+  deptId: number // 施工队伍id
+  projectId: number // 项目id
+  taskId: number // 任务id
+  projectClassification: string // 项目类别(钻井 修井 注氮 酸化压裂... )
+  relocationDays: number // 搬迁安装天数(D)
+  lastestWellDoneTime: Date // 上井次完井时间
+  currentDepth: number // 当前井深(m)
+  dailyFootage: number // 日进尺(m)
+  monthlyFootage: number // 月进尺(m)
+  annualFootage: number // 年累计进尺(m)
+  dailyPowerUsage: number // 当日用电量(kWh)
+  monthlyPowerUsage: number // 当月用电量(kWh)
+  dailyFuel: number // 当日油耗(吨)
+  monthlyFuel: number // 当月油耗(吨)
+  nonProductionTime: number // 非生产时间(H)
+  nptReason: string // 非生产时间原因
+  constructionStartDate: Date // 施工开始日期
+  constructionEndDate: Date // 施工结束日期
+  productionStatus: string // 当日生产情况生产动态
+  nextPlan: string // 下步工作计划
+  rigStatus: number // 施工状态(动迁 准备 施工 完工)
+  personnel: string // 人员情况
+  mudDensity: number // 泥浆性能-密度(g/cm³)
+  mudViscosity: number // 泥浆性能-粘度(S)
+  lateralLength: number // 水平段长度(m) 适用于水平井
+  wellInclination: number // 井斜(°)
+  azimuth: number // 方位(°)
+  extProperty: string // 不同专业公司的扩展属性值
+  sort: number // 排序值
+  remark: string // 备注
+  status: number // 状态(0启用 1禁用)
+  processInstanceId: string // 流程实例id
+  auditStatus: number // 审批状态 未提交、审批中、审批通过、审批不通过、已取消
+}
+
+// 瑞鹰日报 API
+export const IotRyDailyReportApi = {
+  // 查询瑞鹰日报分页
+  getIotRyDailyReportPage: async (params: any) => {
+    return await request.get({ url: `/pms/iot-ry-daily-report/page`, params })
+  },
+
+  // 查询瑞鹰日报详情
+  getIotRyDailyReport: async (id: number) => {
+    return await request.get({ url: `/pms/iot-ry-daily-report/get?id=` + id })
+  },
+
+  // 新增瑞鹰日报
+  createIotRyDailyReport: async (data: IotRyDailyReportVO) => {
+    return await request.post({ url: `/pms/iot-ry-daily-report/create`, data })
+  },
+
+  // 修改瑞鹰日报
+  updateIotRyDailyReport: async (data: IotRyDailyReportVO) => {
+    return await request.put({ url: `/pms/iot-ry-daily-report/update`, data })
+  },
+
+  // 删除瑞鹰日报
+  deleteIotRyDailyReport: async (id: number) => {
+    return await request.delete({ url: `/pms/iot-ry-daily-report/delete?id=` + id })
+  },
+
+  // 导出瑞鹰日报 Excel
+  exportIotRyDailyReport: async (params) => {
+    return await request.download({ url: `/pms/iot-ry-daily-report/export-excel`, params })
+  },
+}

+ 6 - 6
src/locales/zh-CN.ts

@@ -95,7 +95,7 @@ export default {
     copySuccess: '复制成功',
     copyError: '复制失败',
     leftNode:'请选择左侧节点',
-    deptChoose:'请选择设备及设备目录'
+    deptChoose:'请选择设备及目录'
   },
   lock: {
     lockScreen: '锁定屏幕',
@@ -640,19 +640,19 @@ export default {
     assetOwner:'资产归属'
   },
   file:{
-    name:'名称',
-    nameHolder:'请输入名称',
+    name:'文件名称',
+    nameHolder:'请输入文件名称',
     search:'搜索',
     reset:'重置',
     upload:'文件上传',
-    fileType:'类型',
+    fileType:'文件类型',
     fileSize:'文件大小',
-    preview:'预览',
+    preview:'查看预览',
     operation:'操作',
     dow:'下载',
     check:'查看',
     device:'所属设备',
-    dept:'所属部门'
+    dept:'所在部门',
   },
   fileInfo:{
     fileDirectory:'文件目录',

+ 1 - 0
src/utils/dict.ts

@@ -273,6 +273,7 @@ export enum DICT_TYPE {
   PMS_MAIN_WORK_ORDER_TYPE = 'pms_main_work_order_type', // 保养工单类型
   PMS_MAIN_WORK_ORDER_RESULT = 'pms_main_work_order_result', // 保养工单状态
   RQ_IOT_ISCOLLECTION = 'rq_iot_isCollection',//是否数采
+  RQ_IOT_ISREPORT = 'rq_iot_isReport',//日报是否取值
   RQ_IOT_MODEL_TEMPLATE_ATTR = 'rq_iot_model_template_attr',
   RQ_IOT_MODEL_PLUS = "rq_iot_model_plus",
   RQ_IOT_SUM = 'rq_iot_isSum',//是否累计

+ 1 - 1
src/views/Login/Login.vue

@@ -55,7 +55,7 @@
             <!-- 手机登录 -->
 <!--            <MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
             <!-- 二维码登录 -->
-<!--            <QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
+            <QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
             <!-- 注册 -->
             <RegisterForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
             <!-- 三方登录 -->

+ 125 - 45
src/views/pms/iotopeationfill/index1.vue

@@ -7,18 +7,23 @@
         :key="index"
       >
         <template #label>
-<!--          <span  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
-          </span>-->
-          <span class="custom-label" v-if='item.isFill === 1' @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
+          <span
+            :class="['custom-label', { 'has-border': item.deviceName === '生产日报' }]"
+            v-if='item.isFill === 1'
+            @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)"
+          >
+            {{item.deviceCode}} ({{ item.deviceName }})
           </span>
-          <span class="custom-label1" v-else  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
+                  <span
+                    :class="['custom-label1', { 'has-border': item.deviceName === '生产日报' }]"
+                    v-else
+                    @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)"
+                  >
+            {{item.deviceCode}} ({{ item.deviceName }})
           </span>
         </template>
         <div class="form-wrapper">
-          <el-form label-width="120px">
+          <el-form label-width="120px" class="scrollable-form">
             <div style="margin-left: 24px">
               <el-form class="demo-form-inline" :inline="true">
                 <el-form-item :label="t('common.createTime')" class="custom-label1">
@@ -65,28 +70,37 @@
                 />
               </div>
                 <el-form-item :label='item.name' prop="deviceId"  label-position="top">
-                  <el-input
-                    v-if="fillStatus === '1'"
-                    v-model="item.fillContent"
-                    clearable
-                    style="width: 200px"
-                    disabled
-                  />
-<!--                  <el-input
-                    v-else
-                    v-model="item.fillContent"
-                    clearable
-                    style="width: 200px"
-                  />-->
-                  <el-input
-                    v-else
-                    v-model="item.fillContent"
-                    clearable
-                    style="width: 200px"
-                    :placeholder="item.type === 'double' ? t('operationFillForm.enterNumber') : t('operationFillForm.enterContent')"
-                    @input="handleInput(item)"
-                    :maxlength="item.type === 'double' ? calculateMaxLength(item) : undefined"
-                  />
+                    <el-input
+                      v-if="fillStatus === '1'"
+                      v-model="item.fillContent"
+                      clearable
+                      style="width: 200px"
+                      disabled
+                    />
+                    <el-input
+                      v-else-if="item.type === 'textarea'"
+                      v-model="item.fillContent"
+                      type="textarea"
+                      clearable
+                      style="width: 200px"
+                    />
+                    <el-select  v-model="item.fillContent" clearable v-else-if="item.type === 'enum' && item.description !== null" style="width: 200px" filterable>
+                      <el-option
+                        v-for="dict in getIntDictOptions(item.description)"
+                        :key="dict.label"
+                        :label="dict.label"
+                        :value="dict.value"
+                      />
+                    </el-select>
+                    <el-input
+                      v-else
+                      v-model="item.fillContent"
+                      clearable
+                      style="width: 200px"
+                      :placeholder="item.type === 'double' ? t('operationFillForm.enterNumber') : t('operationFillForm.enterContent')"
+                      @input="handleInput(item)"
+                      :maxlength="item.type === 'double' ? calculateMaxLength(item) : undefined"
+                    />
                 </el-form-item>
             </div>
             <el-form-item>
@@ -112,7 +126,7 @@ import { ElMessage } from 'element-plus'
 import moment from 'moment';
 import { format } from 'date-fns';
 import {cx} from "@fullcalendar/core/internal-common";
-
+import { DICT_TYPE, getIntDictOptions} from '@/utils/dict'
 
 /** 运行记录填报 列表 */
 defineOptions({ name: 'FillOrderInfo' })
@@ -287,11 +301,15 @@ const open = async (type: string, id?: number) => {
   alert(id)
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+let devName = "";
 const openFill = (deviceCategoryId?:number,deviceId?:number,deptId?:number,deviceName?:string,deviceCode?:string) =>{
   queryParams.deviceCategoryId = deviceCategoryId;
   queryParams.deptId = deptId;
   queryParams.deviceCode = deviceCode;
   queryParams.deviceName = deviceName;
+  if(queryParams.deviceName=='生产日报'){
+    devName = '生产日报';
+  }
   queryParams.deviceId = deviceId;
   getAttrList();
 }
@@ -306,9 +324,22 @@ const getAttrList = async () => {
     attrList.value = data[0].nonSumList;
     attrList1.value = data[0].sumList;
     attrList.value.forEach(function (item,index){
-
-      if(item.fillContent!=''){
-        item.fillContent = Number(item.fillContent).toFixed(2)
+      if(item.fillContent!=''&& item.fillContent !== null){
+        // 尝试将字符串转换为数字
+        const num = Number(item.fillContent);
+
+        // 检查是否是有效的数字
+        if (!isNaN(num)) {
+          // 检查是否包含小数
+          if (item.fillContent.includes('.')) {
+            // 保留两位小数
+            item.fillContent = Number(num.toFixed(2));
+          } else {
+            // 转换为整数
+            item.fillContent = Math.floor(num);
+          }
+        }
+        // 如果不是有效的数字,则保持原文本不变
       }
       item.deviceCode = queryParams.deviceCode;
       item.deptId = queryParams.deptId;
@@ -316,7 +347,6 @@ const getAttrList = async () => {
       item.deviceCategoryId = queryParams.deviceCategoryId;
       item.modelId = item.id;
     })
-    console.log(JSON.stringify(attrList.value))
     attrList1.value.forEach(function (item,index){
       item.deviceCode = queryParams.deviceCode;
       item.deptId = queryParams.deptId;
@@ -332,18 +362,22 @@ const getAttrList = async () => {
 /** 获取填写信息保存到后台*/
 const getFillInfo = async () => {
   try {
-    // 检查必填字段
-    const emptyFields = attrList.value.filter(item => {
-      // 只检查非disabled的字段
-      return !(item.isCollection===1||fillStatus === '1') &&
-        (item.fillContent === undefined || item.fillContent === '');
-    });
-
-    if (emptyFields.length > 0) {
-      ElMessage.error(t('operationFillForm.fill'));
-      return;
+
+    if(devName!='生产日报'){
+      // 检查必填字段
+      const emptyFields = attrList.value.filter(item => {
+        // 只检查非disabled的字段
+        return !(item.isCollection===1||fillStatus === '1') &&
+          (item.fillContent === undefined || item.fillContent === '');
+      });
+
+      if (emptyFields.length > 0) {
+        ElMessage.error(t('operationFillForm.fill'));
+        return;
+      }
     }
 
+
     attrList2.value = attrList.value.concat(attrList1.value)
 
     attrList2.value.forEach(function (item,index){
@@ -363,6 +397,7 @@ const getFillInfo = async () => {
 
   }
 }
+
 /**清空填写信息*/
 const deleteFillInfo = () =>{
   attrList.value.forEach(function (item, index){
@@ -406,6 +441,39 @@ onMounted(() => {
 })
 </script>
 <style scoped>
+
+.scrollable-form {
+  /* 设置最大高度,超过这个高度会出现滚动条 */
+  max-height: 500px; /* 根据你的需求调整 */
+  /* 超出部分显示垂直滚动条 */
+  overflow-y: auto;
+  /* 可选:添加内边距和边框美化 */
+  padding: 16px;
+  border: 1px solid #e5e7eb;
+  border-radius: 4px;
+}
+
+/* 可选:美化滚动条 */
+.scrollable-form::-webkit-scrollbar {
+  width: 6px;
+}
+
+.scrollable-form::-webkit-scrollbar-track {
+  background: #f1f1f1;
+  border-radius: 3px;
+}
+
+.scrollable-form::-webkit-scrollbar-thumb {
+  background: #c1c1c1;
+  border-radius: 3px;
+}
+
+.scrollable-form::-webkit-scrollbar-thumb:hover {
+  background: #a8a8a8;
+}
+
+
+
 .back-red{		/* 红色背景 */
   background-color: red;
 }
@@ -448,6 +516,12 @@ onMounted(() => {
   font-size: 17px;
   padding: 0 10px;
 }
+.has-border {
+  border: 2px solid #333; /* 加粗到2px,使用深灰色#333让边框更清晰 */
+  padding: 3px 8px; /* 适当增加内边距,避免文字太贴近边框 */
+  border-radius: 2px; /* 轻微圆角,可选 */
+  font-size: 20px;
+}
 ::v-deep .el-step__icon {
   background-color: #409eff;
   color: #fff;
@@ -505,4 +579,10 @@ onMounted(() => {
   flex: 1; /* 等宽分布 */
   min-width: 200px; /* 最小宽度防止挤压 */
 }
+/* 新增日报填报项的边框样式 */
+.report-border {
+  border: 2px solid #42b983; /* 使用Vue标志性的绿色边框 */
+  padding: 2px 4px;
+  border-radius: 4px;
+}
 </style>

+ 18 - 4
src/views/pms/iotopeationfill/plan/IotOperationPlan.vue

@@ -53,11 +53,25 @@
                 />
               </el-form-item>
             </el-col>
-            <el-col :span="24">
-              <el-form-item :label="t('form.remark')" prop="remark">
-                <el-input type="textarea" v-model="formData.remark" />
+            <el-col :span="12">
+              <el-form-item label="日报填报" prop="isReport">
+                <el-radio-group v-model="formData.isReport">
+                  <el-radio
+                    v-for="dict in getIntDictOptions(DICT_TYPE.RQ_IOT_ISCOLLECTION)"
+                    :key="dict.value"
+                    :value="dict.value"
+                  >
+                    {{ dict.label }}
+                  </el-radio>
+                </el-radio-group>
               </el-form-item>
             </el-col>
+
+              <el-col :span="12">
+                <el-form-item :label="t('form.remark')" prop="remark">
+                  <el-input type="textarea" v-model="formData.remark" />
+                </el-form-item>
+              </el-col>
           </el-row>
         </div>
       </el-form>
@@ -156,7 +170,7 @@ import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 import InspectItemList from '@/views/pms/inspect/route/InspectItemList.vue'
 import PlanDeviceList from '@/views/pms/iotopeationfill/plan/PlanDeviceList.vue'
 import { IotInspectRouteVO } from '@/api/pms/inspect/route'
-import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getStrDictOptions,getIntDictOptions } from '@/utils/dict'
 import { IotInspectPlanApi, IotInspectPlanVO } from '@/api/pms/inspect/plan'
 import RouteInspectItemDrawer from '@/views/pms/inspect/plan/RouteInspectItemDrawer.vue'
 import draggable from 'vuedraggable'

+ 6 - 6
src/views/pms/iotopeationfill/statistics.vue

@@ -66,7 +66,7 @@
             <span class="text-base font-medium text-gray-600">运行记录工单统计</span>
           </div>
         </template>
-        <el-row class="h-[220px]">
+        <el-row class="h-[220px]" style="display: flex; justify-content: space-around;">
           <el-col :span="4" class="flex flex-col items-center" @click="openFill(queryParams.deptId,4,queryParams.createTime)">
             <div ref="reportingChartRef" class="h-[160px] w-full"></div>
             <div class="text-center mt-2"  >
@@ -107,26 +107,26 @@
             <span class="text-base font-medium text-gray-600">运行记录设备统计</span>
           </div>
         </template>
-        <el-row class="h-[220px]">
-          <el-col :span="6" class="flex flex-col items-center" @click="openForm(queryParams.deptId,2,queryParams.createTime)">
+        <el-row class="h-[220px]" style="display: flex; justify-content: space-around;">
+          <el-col :span="4" class="flex flex-col items-center" @click="openForm(queryParams.deptId,2,queryParams.createTime)">
             <div ref="reportingChartRef1" class="h-[160px] w-full"></div>
             <div class="text-center mt-2"  >
               <span class="text-sm text-gray-600">总数</span>
             </div>
           </el-col>
-          <el-col :span="6" class="flex flex-col items-center" @click="openForm(queryParams.deptId,1,queryParams.createTime)">
+          <el-col :span="4" class="flex flex-col items-center" @click="openForm(queryParams.deptId,1,queryParams.createTime)">
             <div ref="dealFinishedChartRef1" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600">已填写</span>
             </div>
           </el-col>
-          <el-col :span="6" class="flex flex-col items-center" @click="openForm(queryParams.deptId,0,queryParams.createTime)">
+          <el-col :span="4" class="flex flex-col items-center" @click="openForm(queryParams.deptId,0,queryParams.createTime)">
             <div ref="transOrderChartRef1" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600">未填写</span>
             </div>
           </el-col>
-          <el-col :span="6" class="flex flex-col items-center" @click="openForm(queryParams.deptId,3,queryParams.createTime)">
+          <el-col :span="4" class="flex flex-col items-center" @click="openForm(queryParams.deptId,3,queryParams.createTime)">
             <div ref="ignoreChartRef1" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600">忽略</span>

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

@@ -878,7 +878,7 @@ const handleSelect = (item: any) => {
 
 .transfer-container {
   text-align: center;
-  padding: 20px 0;
+  padding: 0px 0;
 }
 
 /* 3. 直接调整 el-transfer 左右窗口的宽度 */
@@ -892,11 +892,15 @@ const handleSelect = (item: any) => {
 }
 
 :deep(.el-transfer-panel__item) {
+  display: flex !important;
+  align-items: center !important;
+  height: 32px !important;
+  line-height: 32px !important;
+  padding: 0 8px !important;
+  margin: 0 !important;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
-  max-width: 100%;
-  padding: 6px 6px;
 }
 
 .transfer-option-text {

+ 18 - 6
src/views/pms/iotprojecttask/IotProjectTaskForm.vue

@@ -1658,7 +1658,7 @@ onMounted(async () => {
 /* 1. 穿梭框父容器:居中 + 内边距 */
 .transfer-container {
   text-align: center;
-  padding: 0px 0; /* 上下内边距,避免紧贴对话框边缘 */
+  padding: 0px; /* 上下内边距,避免紧贴对话框边缘 */
 }
 
 /* 2. 穿梭框组件:控制宽度,避免过窄或过宽 */
@@ -1674,11 +1674,23 @@ onMounted(async () => {
 
 /* 3. 深度选择器:修改el-transfer选项样式(解决内容省略问题) */
 :deep(.el-transfer-panel__item) {
-  white-space: nowrap; /* 文本不换行,保证一行显示 */
-  overflow: hidden; /* 超出部分隐藏 */
-  text-overflow: ellipsis; /* 超出显示省略号 */
-  max-width: 100%; /* 确保文本不超出选项容器宽度 */
-  padding: 6px 6px; /* 适当增加内边距,优化点击体验 */
+  /* white-space: nowrap;  文本不换行,保证一行显示 */
+  /* overflow: hidden;  超出部分隐藏 */
+  /* text-overflow: ellipsis;  超出显示省略号 */
+  /* max-width: 100%;  确保文本不超出选项容器宽度 */
+  /* padding: 6px 6px;  适当增加内边距,优化点击体验 */
+}
+
+:deep(.el-transfer-panel__item) {
+  display: flex !important;
+  align-items: center !important;
+  height: 32px !important;
+  line-height: 32px !important;
+  padding: 0 8px !important;
+  margin: 0 !important;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
 }
 
 /* 4. 选项文本:确保继承父容器宽度,省略号正常生效 */

+ 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 : '';

+ 195 - 93
src/views/pms/iotrhdailyreport/IotRhDailyReportForm.vue

@@ -4,127 +4,74 @@
       ref="formRef"
       :model="formData"
       :rules="formRules"
-      label-width="100px"
+      label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="施工队伍id" prop="deptId">
-        <el-input v-model="formData.deptId" placeholder="请输入施工队伍id" />
+      <el-form-item label="施工队伍" prop="deptName">
+        <el-input v-model="displayData.deptName" placeholder="" disabled/>
       </el-form-item>
-      <el-form-item label="项目id" prop="projectId">
-        <el-input v-model="formData.projectId" placeholder="请输入项目id" />
+      <el-form-item label="项目" prop="contractName">
+        <el-input v-model="displayData.contractName" placeholder="" disabled/>
       </el-form-item>
-      <el-form-item label="任务id" prop="taskId">
-        <el-input v-model="formData.taskId" placeholder="请输入任务id" />
+      <el-form-item label="任务" prop="taskName">
+        <el-input v-model="displayData.taskName" placeholder="" disabled/>
       </el-form-item>
-      <el-form-item label="项目类别(钻井 修井 注氮 酸化压裂... )" prop="projectClassification">
-        <el-input v-model="formData.projectClassification" placeholder="请输入项目类别(钻井 修井 注氮 酸化压裂... )" />
-      </el-form-item>
-      <el-form-item label="搬迁安装天数" prop="relocationDays">
-        <el-input v-model="formData.relocationDays" placeholder="请输入搬迁安装天数" />
+      <el-form-item label="搬迁安装天数(D)" prop="relocationDays">
+        <el-input v-model="displayData.relocationDays" placeholder="" disabled/>
       </el-form-item>
       <el-form-item label="运行时效" prop="transitTime">
-        <el-date-picker
-          v-model="formData.transitTime"
-          type="date"
-          value-format="x"
-          placeholder="选择运行时效"
-        />
+        <el-input v-model="displayTransitTime" placeholder="" disabled
+                  :class="{'red-text': isTransitTimeOver}"
+                  id="transitTimeInput" />
       </el-form-item>
-      <el-form-item label="当日注气量(方)" prop="dailyGasInjection">
-        <el-input v-model="formData.dailyGasInjection" placeholder="请输入当日注气量(方)" />
+      <el-form-item label="当日注气量(方)" prop="dailyGasInjection">
+        <el-input v-model="formData.dailyGasInjection" placeholder="请输入当日注气量(方)" @change="calculateTransitTime"/>
       </el-form-item>
       <el-form-item label="当日注水量(方)" prop="dailyWaterInjection">
         <el-input v-model="formData.dailyWaterInjection" placeholder="请输入当日注水量(方)" />
       </el-form-item>
       <el-form-item label="当日注气时间(H)" prop="dailyInjectGasTime">
-        <el-date-picker
-          v-model="formData.dailyInjectGasTime"
-          type="date"
-          value-format="x"
-          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-date-picker
-          v-model="formData.dailyInjectWaterTime"
-          type="date"
-          value-format="x"
-          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-date-picker
-          v-model="formData.nonProductionTime"
-          type="date"
-          value-format="x"
-          placeholder="选择非生产时间(H)"
-        />
+        <el-input v-model="formData.nonProductionTime"
+                  placeholder="非生产时间(H)"
+                  :class="{'red-text': isTimeSumInvalid}"
+                  @change="validateTimeSum" />
       </el-form-item>
       <el-form-item label="非生产时间原因" prop="nptReason">
-        <el-input v-model="formData.nptReason" placeholder="请输入非生产时间原因" />
-      </el-form-item>
-      <el-form-item label="施工开始日期" prop="constructionStartDate">
-        <el-date-picker
-          v-model="formData.constructionStartDate"
-          type="date"
-          value-format="x"
-          placeholder="选择施工开始日期"
-        />
-      </el-form-item>
-      <el-form-item label="施工结束日期" prop="constructionEndDate">
-        <el-date-picker
-          v-model="formData.constructionEndDate"
-          type="date"
-          value-format="x"
-          placeholder="选择施工结束日期"
-        />
-      </el-form-item>
-      <el-form-item label="当日生产情况生产动态" prop="productionStatus">
-        <el-radio-group v-model="formData.productionStatus">
-          <el-radio value="1">请选择字典生成</el-radio>
-        </el-radio-group>
+        <el-select v-model="formData.nptReason" placeholder="请选择" clearable disabled>
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_NPT_REASON)"
+            :key="dict.id"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
       </el-form-item>
-      <el-form-item label="下步工作计划" prop="nextPlan">
-        <el-input v-model="formData.nextPlan" placeholder="请输入下步工作计划" />
-      </el-form-item>
-      <el-form-item label="施工状态(动迁 准备 施工 完工)" prop="constructionStatus">
-        <el-radio-group v-model="formData.constructionStatus">
-          <el-radio value="1">请选择字典生成</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="人员情况" prop="personnel">
-        <el-input v-model="formData.personnel" placeholder="请输入人员情况" />
+      <el-form-item label="生产动态" prop="productionStatus">
+        <el-input v-model="formData.productionStatus" placeholder="请输入生产动态" type="textarea"/>
       </el-form-item>
       <el-form-item label="累计注气量(万方)" prop="totalGasInjection">
-        <el-input v-model="formData.totalGasInjection" placeholder="请输入累计注气量(万方)" />
+        <el-input v-model="formData.totalGasInjection" placeholder="" disabled/>
       </el-form-item>
       <el-form-item label="累计注水量(方)" prop="totalWaterInjection">
-        <el-input v-model="formData.totalWaterInjection" placeholder="请输入累计注水量(方)" />
+        <el-input v-model="formData.totalWaterInjection" placeholder="请输入累计注水量(方)" disabled/>
       </el-form-item>
       <el-form-item label="累计完工井次" prop="cumulativeCompletion">
-        <el-input v-model="formData.cumulativeCompletion" placeholder="请输入累计完工井次" />
-      </el-form-item>
-      <el-form-item label="不同专业公司的扩展属性值" prop="extProperty">
-        <el-input v-model="formData.extProperty" placeholder="请输入不同专业公司的扩展属性值" />
-      </el-form-item>
-      <el-form-item label="排序值" prop="sort">
-        <el-input v-model="formData.sort" placeholder="请输入排序值" />
+        <el-input v-model="formData.cumulativeCompletion" placeholder="请输入累计完工井次" disabled/>
       </el-form-item>
       <el-form-item label="备注" prop="remark">
-        <el-input v-model="formData.remark" placeholder="请输入备注" />
-      </el-form-item>
-      <el-form-item label="状态(0启用 1禁用)" prop="status">
-        <el-radio-group v-model="formData.status">
-          <el-radio value="1">请选择字典生成</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="流程实例id" prop="processInstanceId">
-        <el-input v-model="formData.processInstanceId" placeholder="请输入流程实例id" />
-      </el-form-item>
-      <el-form-item label="审批状态 未提交、审批中、审批通过、审批不通过、已取消" prop="auditStatus">
-        <el-radio-group v-model="formData.auditStatus">
-          <el-radio value="1">请选择字典生成</el-radio>
-        </el-radio-group>
+        <el-input v-model="formData.remark" placeholder="请输入备注" type="textarea"/>
       </el-form-item>
     </el-form>
     <template #footer>
@@ -135,6 +82,8 @@
 </template>
 <script setup lang="ts">
 import { IotRhDailyReportApi, IotRhDailyReportVO } from '@/api/pms/iotrhdailyreport'
+import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
+import { computed, ref, watch, nextTick, reactive } from 'vue'
 
 /** 瑞恒日报 表单 */
 defineOptions({ name: 'IotRhDailyReportForm' })
@@ -142,10 +91,39 @@ defineOptions({ name: 'IotRhDailyReportForm' })
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
+// 添加 props 接收行数据
+const props = defineProps({
+  rowData: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+// 监听 props.rowData 的变化
+watch(() => props.rowData, (newVal) => {
+  if (newVal) {
+    displayData.value.deptName = newVal.deptName || ''
+    displayData.value.contractName = newVal.contractName || ''
+    displayData.value.taskName = newVal.taskName || ''
+    displayData.value.relocationDays = newVal.relocationDays || ''
+  }
+}, { immediate: true })
+
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formType = ref('') // 表单的类型:create - 新增;update - 修改
+
+const isTimeSumInvalid = ref(false) // 时间总和的校验状态
+
+// 添加显示数据对象
+const displayData = ref({
+  deptName: '',
+  contractName: '',
+  taskName: '',
+  relocationDays: ''
+})
+
 const formData = ref({
   id: undefined,
   deptId: undefined,
@@ -175,22 +153,114 @@ const formData = ref({
   status: undefined,
   processInstanceId: undefined,
   auditStatus: undefined,
+  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
 
+// 计算运行时效的显示值和颜色
+const displayTransitTime = computed(() => {
+  if (!formData.value.transitTime) return ''
+  return `${(formData.value.transitTime * 100).toFixed(2)}%`
+})
+
+const transitTimeColor = computed(() => {
+  console.log('当前运行时效的值是否大于1.2:' + (parseFloat(formData.value.transitTime) > 1.2))
+  return formData.value.transitTime && parseFloat(formData.value.transitTime) > 1.2 ? 'red' : ''
+})
+
+// 修改为返回布尔值的计算属性,便于在模板中使用class绑定
+const isTransitTimeOver = computed(() => {
+  const transitTime = Number(formData.value.transitTime)
+  console.log('运行时效值:', transitTime, '是否大于1.2:', transitTime > 1.2)
+  return transitTime > 1.2
+})
+
+// 计算运行时效的方法
+const calculateTransitTime = () => {
+  if (!formData.value.capacity) {
+    message.error('请维护增压机产能')
+    return
+  }
+
+  if (formData.value.dailyGasInjection) {
+    const dailyGas = parseFloat(formData.value.dailyGasInjection)
+    const capacity = parseFloat(formData.value.capacity)
+    formData.value.transitTime = dailyGas / capacity
+  } else {
+    formData.value.transitTime = 0
+  }
+}
+
+// 验证三个时间字段的总和
+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
   dialogTitle.value = t('action.' + type)
   formType.value = type
   resetForm()
+
+  // 设置显示数据
+  if (props.rowData) {
+    displayData.value.deptName = props.rowData.deptName || ''
+    displayData.value.contractName = props.rowData.contractName || ''
+    displayData.value.taskName = props.rowData.taskName || ''
+    displayData.value.relocationDays = props.rowData.relocationDays || ''
+  }
+
   // 修改时,设置数据
   if (id) {
     formLoading.value = true
     try {
       formData.value = await IotRhDailyReportApi.getIotRhDailyReport(id)
+      // 检查产能是否存在
+      if (!formData.value.capacity) {
+        message.error('请维护增压机产能')
+      } else {
+        // 计算运行时效
+        calculateTransitTime()
+      }
+      // 验证时间总和
+      validateTimeSum()
     } finally {
       formLoading.value = false
     }
@@ -203,6 +273,19 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
 const submitForm = async () => {
   // 校验表单
   await formRef.value.validate()
+
+  // 检查产能
+  if (!formData.value.capacity) {
+    message.error('请维护增压机产能')
+    return
+  }
+
+  // 检查时间总和
+  if (!validateTimeSum()) {
+    message.error('当日注气时间、注水时间和非生产时间之和必须等于24小时')
+    return
+  }
+
   // 提交请求
   formLoading.value = true
   try {
@@ -253,7 +336,26 @@ const resetForm = () => {
     status: undefined,
     processInstanceId: undefined,
     auditStatus: undefined,
+    capacity: undefined
   }
+
+  displayData.value = {
+    deptName: '',
+    contractName: '',
+    taskName: '',
+    relocationDays: ''
+  }
+
+  isTimeSumInvalid.value = false
+
   formRef.value?.resetFields()
 }
 </script>
+
+<style scoped>
+/* 添加红色文本样式,使用深度选择器覆盖Element UI的disabled状态样式 */
+:deep(.red-text .el-input__inner) {
+  color: red !important;
+  -webkit-text-fill-color: red !important;
+}
+</style>

+ 60 - 10
src/views/pms/iotrhdailyreport/index.vue

@@ -8,18 +8,18 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="项目" prop="projectId">
+      <el-form-item label="项目" prop="contractName">
         <el-input
-          v-model="queryParams.projectId"
+          v-model="queryParams.contractName"
           placeholder="请输入项目"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="任务" prop="taskId">
+      <el-form-item label="任务" prop="taskName">
         <el-input
-          v-model="queryParams.taskId"
+          v-model="queryParams.taskName"
           placeholder="请输入任务"
           clearable
           @keyup.enter="handleQuery"
@@ -83,6 +83,7 @@
           </template>
         </el-table-column>
         <el-table-column label="搬迁安装天数" align="center" prop="relocationDays" :width="columnWidths.relocationDays"/>
+        <el-table-column label="设计注气量(万方)" align="center" prop="designInjection" :width="columnWidths.designInjection"/>
         <el-table-column label="运行时效" align="center" prop="transitTime" :width="columnWidths.transitTime" :formatter="percentageFormatter"/>
         <el-table-column label="当日注气量(万方)" align="center" prop="dailyGasInjection"
                          :width="columnWidths.dailyGasInjection" :formatter="gasInjectionFormatter"/>
@@ -114,12 +115,13 @@
                          :width="columnWidths.totalGasInjection" :formatter="gasInjectionFormatter"/>
         <el-table-column label="累计注水量(方)" align="center" prop="totalWaterInjection" :width="columnWidths.totalWaterInjection"/>
         <el-table-column label="累计完工井次" align="center" prop="cumulativeCompletion" :width="columnWidths.cumulativeCompletion"/>
-        <el-table-column label="操作" align="center" :width="columnWidths.operation">
+        <el-table-column label="产能(万方)" align="center" prop="capacity" :width="columnWidths.capacity" :formatter="gasInjectionFormatter"/>
+        <el-table-column label="操作" align="center" :width="columnWidths.operation" fixed="right">
           <template #default="scope">
             <el-button
               link
               type="primary"
-              @click="openForm('update', scope.row.id)"
+              @click="openForm('update', scope.row.id, scope.row)"
               v-hasPermi="['pms:iot-rh-daily-report:update']"
             >
               编辑
@@ -146,7 +148,7 @@
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
-  <IotRhDailyReportForm ref="formRef" @success="getList" />
+  <IotRhDailyReportForm ref="formRef" @success="getList" :row-data="selectedRowData"/>
 </template>
 
 <script setup lang="ts">
@@ -163,6 +165,9 @@ defineOptions({ name: 'IotRhDailyReport' })
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
+// 添加 selectedRowData 响应式变量
+const selectedRowData = ref<Record<string, any> | null>(null)
+
 const loading = ref(true) // 列表的加载中
 const list = ref<IotRhDailyReportVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
@@ -170,7 +175,9 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   deptId: undefined,
+  contractName: undefined,
   projectId: undefined,
+  taskName: undefined,
   taskId: undefined,
   projectClassification: undefined,
   relocationDays: undefined,
@@ -215,6 +222,7 @@ const columnWidths = ref({
   taskName: '120px',
   constructionStatus: '110px',
   relocationDays: '120px',
+  designInjection: '120px',
   transitTime: '100px',
   dailyGasInjection: '150px',
   dailyWaterInjection: '150px',
@@ -228,6 +236,7 @@ const columnWidths = ref({
   totalGasInjection: '150px',
   totalWaterInjection: '150px',
   cumulativeCompletion: '150px',
+  capacity: '120px',
   createTime: '180px',
   operation: '120px'
 })
@@ -257,7 +266,7 @@ const percentageFormatter = (row: any, column: any, cellValue: any, index: numbe
 };
 
 // 可伸缩列配置
-const FLEXIBLE_COLUMNS = ['deptName', 'contractName', 'taskName', 'constructionStatus', 'relocationDays',
+const FLEXIBLE_COLUMNS = ['deptName', 'contractName', 'taskName', 'constructionStatus', 'relocationDays', 'designInjection',
   'transitTime', 'dailyGasInjection', 'dailyWaterInjection', 'dailyPowerUsage', 'dailyInjectGasTime',
   'dailyInjectWaterTime', 'nonProductionTime', 'nptReason', 'constructionStartDate',
   'constructionEndDate', 'totalGasInjection', 'totalWaterInjection',
@@ -287,7 +296,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') {
@@ -302,6 +325,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 {};
 };
@@ -363,6 +399,7 @@ const calculateColumnWidths = () => {
     return String(row.constructionStatus || '');
   });
   calculateColumnMinWidth('relocationDays', '搬迁安装天数', (row: any) => row.relocationDays);
+  calculateColumnMinWidth('designInjection', '设计注气量(万方)', (row: any) => row.designInjection);
   calculateColumnMinWidth('transitTime', '运行时效', (row: any) => row.transitTime);
   calculateColumnMinWidth('dailyGasInjection', '当日注气量(万方)', (row: any) => row.dailyGasInjection);
   calculateColumnMinWidth('dailyWaterInjection', '当日注水量(方)', (row: any) => row.dailyWaterInjection);
@@ -376,6 +413,7 @@ const calculateColumnWidths = () => {
   calculateColumnMinWidth('totalGasInjection', '累计注气量(万方)', (row: any) => row.totalGasInjection);
   calculateColumnMinWidth('totalWaterInjection', '累计注水量(方)', (row: any) => row.totalWaterInjection);
   calculateColumnMinWidth('cumulativeCompletion', '累计完工井次', (row: any) => row.cumulativeCompletion);
+  calculateColumnMinWidth('capacity', '产能(万方)', (row: any) => row.capacity);
   calculateColumnMinWidth('createTime', '创建时间', (row: any) => dateFormatter(null, null, row.createTime));
 
   // 操作列固定宽度
@@ -426,7 +464,19 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number) => {
+const openForm = (type: string, id?: number, row?: any) => {
+  // 保存当前行数据
+  if (row) {
+    selectedRowData.value = {
+      deptName: row.deptName,
+      contractName: row.contractName,
+      taskName: row.taskName,
+      relocationDays: row.relocationDays
+    }
+  } else {
+    selectedRowData.value = null
+  }
+
   formRef.value.open(type, id)
 }
 

+ 279 - 0
src/views/pms/iotrydailyreport/IotRyDailyReportForm.vue

@@ -0,0 +1,279 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="施工队伍id" prop="deptId">
+        <el-input v-model="formData.deptId" placeholder="请输入施工队伍id" />
+      </el-form-item>
+      <el-form-item label="项目id" prop="projectId">
+        <el-input v-model="formData.projectId" placeholder="请输入项目id" />
+      </el-form-item>
+      <el-form-item label="任务id" prop="taskId">
+        <el-input v-model="formData.taskId" placeholder="请输入任务id" />
+      </el-form-item>
+      <el-form-item label="项目类别(钻井 修井 注氮 酸化压裂... )" prop="projectClassification">
+        <el-input v-model="formData.projectClassification" placeholder="请输入项目类别(钻井 修井 注氮 酸化压裂... )" />
+      </el-form-item>
+      <el-form-item label="搬迁安装天数(D)" prop="relocationDays">
+        <el-input v-model="formData.relocationDays" placeholder="请输入搬迁安装天数(D)" />
+      </el-form-item>
+      <el-form-item label="上井次完井时间" prop="lastestWellDoneTime">
+        <el-date-picker
+          v-model="formData.lastestWellDoneTime"
+          type="date"
+          value-format="x"
+          placeholder="选择上井次完井时间"
+        />
+      </el-form-item>
+      <el-form-item label="当前井深(m)" prop="currentDepth">
+        <el-input v-model="formData.currentDepth" placeholder="请输入当前井深(m)" />
+      </el-form-item>
+      <el-form-item label="日进尺(m)" prop="dailyFootage">
+        <el-input v-model="formData.dailyFootage" placeholder="请输入日进尺(m)" />
+      </el-form-item>
+      <el-form-item label="月进尺(m)" prop="monthlyFootage">
+        <el-input v-model="formData.monthlyFootage" placeholder="请输入月进尺(m)" />
+      </el-form-item>
+      <el-form-item label="年累计进尺(m)" prop="annualFootage">
+        <el-input v-model="formData.annualFootage" placeholder="请输入年累计进尺(m)" />
+      </el-form-item>
+      <el-form-item label="当日用电量(kWh)" prop="dailyPowerUsage">
+        <el-input v-model="formData.dailyPowerUsage" placeholder="请输入当日用电量(kWh)" />
+      </el-form-item>
+      <el-form-item label="当月用电量(kWh)" prop="monthlyPowerUsage">
+        <el-input v-model="formData.monthlyPowerUsage" placeholder="请输入当月用电量(kWh)" />
+      </el-form-item>
+      <el-form-item label="当日油耗(吨)" prop="dailyFuel">
+        <el-input v-model="formData.dailyFuel" placeholder="请输入当日油耗(吨)" />
+      </el-form-item>
+      <el-form-item label="当月油耗(吨)" prop="monthlyFuel">
+        <el-input v-model="formData.monthlyFuel" placeholder="请输入当月油耗(吨)" />
+      </el-form-item>
+      <el-form-item label="非生产时间(H)" prop="nonProductionTime">
+        <el-date-picker
+          v-model="formData.nonProductionTime"
+          type="date"
+          value-format="x"
+          placeholder="选择非生产时间(H)"
+        />
+      </el-form-item>
+      <el-form-item label="非生产时间原因" prop="nptReason">
+        <el-input v-model="formData.nptReason" placeholder="请输入非生产时间原因" />
+      </el-form-item>
+      <el-form-item label="施工开始日期" prop="constructionStartDate">
+        <el-date-picker
+          v-model="formData.constructionStartDate"
+          type="date"
+          value-format="x"
+          placeholder="选择施工开始日期"
+        />
+      </el-form-item>
+      <el-form-item label="施工结束日期" prop="constructionEndDate">
+        <el-date-picker
+          v-model="formData.constructionEndDate"
+          type="date"
+          value-format="x"
+          placeholder="选择施工结束日期"
+        />
+      </el-form-item>
+      <el-form-item label="当日生产情况生产动态" prop="productionStatus">
+        <el-radio-group v-model="formData.productionStatus">
+          <el-radio value="1">请选择字典生成</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="下步工作计划" prop="nextPlan">
+        <el-input v-model="formData.nextPlan" placeholder="请输入下步工作计划" />
+      </el-form-item>
+      <el-form-item label="施工状态(动迁 准备 施工 完工)" prop="rigStatus">
+        <el-radio-group v-model="formData.rigStatus">
+          <el-radio value="1">请选择字典生成</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="人员情况" prop="personnel">
+        <el-input v-model="formData.personnel" placeholder="请输入人员情况" />
+      </el-form-item>
+      <el-form-item label="泥浆性能-密度(g/cm³)" prop="mudDensity">
+        <el-input v-model="formData.mudDensity" placeholder="请输入泥浆性能-密度(g/cm³)" />
+      </el-form-item>
+      <el-form-item label="泥浆性能-粘度(S)" prop="mudViscosity">
+        <el-input v-model="formData.mudViscosity" placeholder="请输入泥浆性能-粘度(S)" />
+      </el-form-item>
+      <el-form-item label="水平段长度(m) 适用于水平井" prop="lateralLength">
+        <el-input v-model="formData.lateralLength" placeholder="请输入水平段长度(m) 适用于水平井" />
+      </el-form-item>
+      <el-form-item label="井斜(°)" prop="wellInclination">
+        <el-input v-model="formData.wellInclination" placeholder="请输入井斜(°)" />
+      </el-form-item>
+      <el-form-item label="方位(°)" prop="azimuth">
+        <el-input v-model="formData.azimuth" placeholder="请输入方位(°)" />
+      </el-form-item>
+      <el-form-item label="不同专业公司的扩展属性值" prop="extProperty">
+        <el-input v-model="formData.extProperty" placeholder="请输入不同专业公司的扩展属性值" />
+      </el-form-item>
+      <el-form-item label="排序值" prop="sort">
+        <el-input v-model="formData.sort" placeholder="请输入排序值" />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input v-model="formData.remark" placeholder="请输入备注" />
+      </el-form-item>
+      <el-form-item label="状态(0启用 1禁用)" prop="status">
+        <el-radio-group v-model="formData.status">
+          <el-radio value="1">请选择字典生成</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="流程实例id" prop="processInstanceId">
+        <el-input v-model="formData.processInstanceId" placeholder="请输入流程实例id" />
+      </el-form-item>
+      <el-form-item label="审批状态 未提交、审批中、审批通过、审批不通过、已取消" prop="auditStatus">
+        <el-radio-group v-model="formData.auditStatus">
+          <el-radio value="1">请选择字典生成</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { IotRyDailyReportApi, IotRyDailyReportVO } from '@/api/pms/iotrydailyreport'
+
+/** 瑞鹰日报 表单 */
+defineOptions({ name: 'IotRyDailyReportForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  relocationDays: undefined,
+  lastestWellDoneTime: undefined,
+  currentDepth: undefined,
+  dailyFootage: undefined,
+  monthlyFootage: undefined,
+  annualFootage: undefined,
+  dailyPowerUsage: undefined,
+  monthlyPowerUsage: undefined,
+  dailyFuel: undefined,
+  monthlyFuel: undefined,
+  nonProductionTime: undefined,
+  nptReason: undefined,
+  constructionStartDate: undefined,
+  constructionEndDate: undefined,
+  productionStatus: undefined,
+  nextPlan: undefined,
+  rigStatus: undefined,
+  personnel: undefined,
+  mudDensity: undefined,
+  mudViscosity: undefined,
+  lateralLength: undefined,
+  wellInclination: undefined,
+  azimuth: undefined,
+  extProperty: undefined,
+  sort: undefined,
+  remark: undefined,
+  status: undefined,
+  processInstanceId: undefined,
+  auditStatus: undefined,
+})
+const formRules = reactive({
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await IotRyDailyReportApi.getIotRyDailyReport(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as IotRyDailyReportVO
+    if (formType.value === 'create') {
+      await IotRyDailyReportApi.createIotRyDailyReport(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await IotRyDailyReportApi.updateIotRyDailyReport(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    deptId: undefined,
+    projectId: undefined,
+    taskId: undefined,
+    projectClassification: undefined,
+    relocationDays: undefined,
+    lastestWellDoneTime: undefined,
+    currentDepth: undefined,
+    dailyFootage: undefined,
+    monthlyFootage: undefined,
+    annualFootage: undefined,
+    dailyPowerUsage: undefined,
+    monthlyPowerUsage: undefined,
+    dailyFuel: undefined,
+    monthlyFuel: undefined,
+    nonProductionTime: undefined,
+    nptReason: undefined,
+    constructionStartDate: undefined,
+    constructionEndDate: undefined,
+    productionStatus: undefined,
+    nextPlan: undefined,
+    rigStatus: undefined,
+    personnel: undefined,
+    mudDensity: undefined,
+    mudViscosity: undefined,
+    lateralLength: undefined,
+    wellInclination: undefined,
+    azimuth: undefined,
+    extProperty: undefined,
+    sort: undefined,
+    remark: undefined,
+    status: undefined,
+    processInstanceId: undefined,
+    auditStatus: undefined,
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 569 - 0
src/views/pms/iotrydailyreport/index.vue

@@ -0,0 +1,569 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="施工队伍id" prop="deptId">
+        <el-input
+          v-model="queryParams.deptId"
+          placeholder="请输入施工队伍id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="项目id" prop="projectId">
+        <el-input
+          v-model="queryParams.projectId"
+          placeholder="请输入项目id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="任务id" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入任务id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="项目类别(钻井 修井 注氮 酸化压裂... )" prop="projectClassification">
+        <el-input
+          v-model="queryParams.projectClassification"
+          placeholder="请输入项目类别(钻井 修井 注氮 酸化压裂... )"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="搬迁安装天数(D)" prop="relocationDays">
+        <el-input
+          v-model="queryParams.relocationDays"
+          placeholder="请输入搬迁安装天数(D)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="上井次完井时间" prop="lastestWellDoneTime">
+        <el-date-picker
+          v-model="queryParams.lastestWellDoneTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="当前井深(m)" prop="currentDepth">
+        <el-input
+          v-model="queryParams.currentDepth"
+          placeholder="请输入当前井深(m)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="日进尺(m)" prop="dailyFootage">
+        <el-input
+          v-model="queryParams.dailyFootage"
+          placeholder="请输入日进尺(m)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="月进尺(m)" prop="monthlyFootage">
+        <el-input
+          v-model="queryParams.monthlyFootage"
+          placeholder="请输入月进尺(m)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="年累计进尺(m)" prop="annualFootage">
+        <el-input
+          v-model="queryParams.annualFootage"
+          placeholder="请输入年累计进尺(m)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="当日用电量(kWh)" prop="dailyPowerUsage">
+        <el-input
+          v-model="queryParams.dailyPowerUsage"
+          placeholder="请输入当日用电量(kWh)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="当月用电量(kWh)" prop="monthlyPowerUsage">
+        <el-input
+          v-model="queryParams.monthlyPowerUsage"
+          placeholder="请输入当月用电量(kWh)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="当日油耗(吨)" prop="dailyFuel">
+        <el-input
+          v-model="queryParams.dailyFuel"
+          placeholder="请输入当日油耗(吨)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="当月油耗(吨)" prop="monthlyFuel">
+        <el-input
+          v-model="queryParams.monthlyFuel"
+          placeholder="请输入当月油耗(吨)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非生产时间(H)" prop="nonProductionTime">
+        <el-date-picker
+          v-model="queryParams.nonProductionTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="非生产时间原因" prop="nptReason">
+        <el-input
+          v-model="queryParams.nptReason"
+          placeholder="请输入非生产时间原因"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="施工开始日期" prop="constructionStartDate">
+        <el-date-picker
+          v-model="queryParams.constructionStartDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="施工结束日期" prop="constructionEndDate">
+        <el-date-picker
+          v-model="queryParams.constructionEndDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="当日生产情况生产动态" prop="productionStatus">
+        <el-select
+          v-model="queryParams.productionStatus"
+          placeholder="请选择当日生产情况生产动态"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="下步工作计划" prop="nextPlan">
+        <el-input
+          v-model="queryParams.nextPlan"
+          placeholder="请输入下步工作计划"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="施工状态(动迁 准备 施工 完工)" prop="rigStatus">
+        <el-select
+          v-model="queryParams.rigStatus"
+          placeholder="请选择施工状态(动迁 准备 施工 完工)"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="人员情况" prop="personnel">
+        <el-input
+          v-model="queryParams.personnel"
+          placeholder="请输入人员情况"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="泥浆性能-密度(g/cm³)" prop="mudDensity">
+        <el-input
+          v-model="queryParams.mudDensity"
+          placeholder="请输入泥浆性能-密度(g/cm³)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="泥浆性能-粘度(S)" prop="mudViscosity">
+        <el-input
+          v-model="queryParams.mudViscosity"
+          placeholder="请输入泥浆性能-粘度(S)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="水平段长度(m) 适用于水平井" prop="lateralLength">
+        <el-input
+          v-model="queryParams.lateralLength"
+          placeholder="请输入水平段长度(m) 适用于水平井"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="井斜(°)" prop="wellInclination">
+        <el-input
+          v-model="queryParams.wellInclination"
+          placeholder="请输入井斜(°)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="方位(°)" prop="azimuth">
+        <el-input
+          v-model="queryParams.azimuth"
+          placeholder="请输入方位(°)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="不同专业公司的扩展属性值" prop="extProperty">
+        <el-input
+          v-model="queryParams.extProperty"
+          placeholder="请输入不同专业公司的扩展属性值"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="排序值" prop="sort">
+        <el-input
+          v-model="queryParams.sort"
+          placeholder="请输入排序值"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input
+          v-model="queryParams.remark"
+          placeholder="请输入备注"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="状态(0启用 1禁用)" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择状态(0启用 1禁用)"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="流程实例id" prop="processInstanceId">
+        <el-input
+          v-model="queryParams.processInstanceId"
+          placeholder="请输入流程实例id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="审批状态 未提交、审批中、审批通过、审批不通过、已取消" prop="auditStatus">
+        <el-select
+          v-model="queryParams.auditStatus"
+          placeholder="请选择审批状态 未提交、审批中、审批通过、审批不通过、已取消"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <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
+          @click="openForm('create')"
+          v-hasPermi="['pms:iot-ry-daily-report:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['pms:iot-ry-daily-report:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="主键id" align="center" prop="id" />
+      <el-table-column label="施工队伍id" align="center" prop="deptId" />
+      <el-table-column label="项目id" align="center" prop="projectId" />
+      <el-table-column label="任务id" align="center" prop="taskId" />
+      <el-table-column label="项目类别(钻井 修井 注氮 酸化压裂... )" align="center" prop="projectClassification" />
+      <el-table-column label="搬迁安装天数(D)" align="center" prop="relocationDays" />
+      <el-table-column
+        label="上井次完井时间"
+        align="center"
+        prop="lastestWellDoneTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="当前井深(m)" align="center" prop="currentDepth" />
+      <el-table-column label="日进尺(m)" align="center" prop="dailyFootage" />
+      <el-table-column label="月进尺(m)" align="center" prop="monthlyFootage" />
+      <el-table-column label="年累计进尺(m)" align="center" prop="annualFootage" />
+      <el-table-column label="当日用电量(kWh)" align="center" prop="dailyPowerUsage" />
+      <el-table-column label="当月用电量(kWh)" align="center" prop="monthlyPowerUsage" />
+      <el-table-column label="当日油耗(吨)" align="center" prop="dailyFuel" />
+      <el-table-column label="当月油耗(吨)" align="center" prop="monthlyFuel" />
+      <el-table-column label="非生产时间(H)" align="center" prop="nonProductionTime" />
+      <el-table-column label="非生产时间原因" align="center" prop="nptReason" />
+      <el-table-column
+        label="施工开始日期"
+        align="center"
+        prop="constructionStartDate"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column
+        label="施工结束日期"
+        align="center"
+        prop="constructionEndDate"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="当日生产情况生产动态" align="center" prop="productionStatus" />
+      <el-table-column label="下步工作计划" align="center" prop="nextPlan" />
+      <el-table-column label="施工状态(动迁 准备 施工 完工)" align="center" prop="rigStatus" />
+      <el-table-column label="人员情况" align="center" prop="personnel" />
+      <el-table-column label="泥浆性能-密度(g/cm³)" align="center" prop="mudDensity" />
+      <el-table-column label="泥浆性能-粘度(S)" align="center" prop="mudViscosity" />
+      <el-table-column label="水平段长度(m) 适用于水平井" align="center" prop="lateralLength" />
+      <el-table-column label="井斜(°)" align="center" prop="wellInclination" />
+      <el-table-column label="方位(°)" align="center" prop="azimuth" />
+      <el-table-column label="不同专业公司的扩展属性值" align="center" prop="extProperty" />
+      <el-table-column label="排序值" align="center" prop="sort" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="状态(0启用 1禁用)" align="center" prop="status" />
+      <el-table-column label="流程实例id" align="center" prop="processInstanceId" />
+      <el-table-column label="审批状态 未提交、审批中、审批通过、审批不通过、已取消" align="center" prop="auditStatus" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['pms:iot-ry-daily-report:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['pms:iot-ry-daily-report:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <IotRyDailyReportForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotRyDailyReportApi, IotRyDailyReportVO } from '@/api/pms/iotrydailyreport'
+import IotRyDailyReportForm from './IotRyDailyReportForm.vue'
+
+/** 瑞鹰日报 列表 */
+defineOptions({ name: 'IotRyDailyReport' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<IotRyDailyReportVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  relocationDays: undefined,
+  lastestWellDoneTime: [],
+  currentDepth: undefined,
+  dailyFootage: undefined,
+  monthlyFootage: undefined,
+  annualFootage: undefined,
+  dailyPowerUsage: undefined,
+  monthlyPowerUsage: undefined,
+  dailyFuel: undefined,
+  monthlyFuel: undefined,
+  nonProductionTime: [],
+  nptReason: undefined,
+  constructionStartDate: [],
+  constructionEndDate: [],
+  productionStatus: undefined,
+  nextPlan: undefined,
+  rigStatus: undefined,
+  personnel: undefined,
+  mudDensity: undefined,
+  mudViscosity: undefined,
+  lateralLength: undefined,
+  wellInclination: undefined,
+  azimuth: undefined,
+  extProperty: undefined,
+  sort: undefined,
+  remark: undefined,
+  status: undefined,
+  processInstanceId: undefined,
+  auditStatus: undefined,
+  createTime: [],
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await IotRyDailyReportApi.getIotRyDailyReportPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await IotRyDailyReportApi.deleteIotRyDailyReport(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotRyDailyReportApi.exportIotRyDailyReport(queryParams)
+    download.excel(data, '瑞鹰日报.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 19 - 7
src/views/pms/modeltemplate/detail/attrsModel/AttrTemplateModelForm.vue

@@ -14,7 +14,19 @@
             <el-input v-model="formData.name" placeholder="请输入属性名称" />
           </el-form-item>
         </el-col>
-
+        <el-col :span="12">
+          <el-form-item label="日报取值" prop="dailyReport">
+            <el-radio-group v-model="formData.dailyReport">
+              <el-radio
+                v-for="dict in getIntDictOptions(DICT_TYPE.RQ_IOT_ISCOLLECTION)"
+                :key="dict.value"
+                :value="dict.value"
+              >
+                {{ dict.label }}
+              </el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
       </el-row>
       <el-row>
         <el-col :span="12">
@@ -48,7 +60,7 @@
       </el-row>
       <el-row>
         <el-col :span="12">
-          <el-form-item label="累加值" prop="defaultValue" v-if="formData.isSum === 1">
+          <el-form-item label="累加值" prop="defaultValue" v-show="formData.isSum === 1">
             <!--            <el-input v-model="formData.defaultValue" placeholder="请选择累加值" />-->
             <el-select v-model="formData.defaultValue" placeholder="请选择累加值" clearable>
               <el-option
@@ -60,9 +72,7 @@
               />
             </el-select>
           </el-form-item>
-          <el-form-item label="填写阈值" prop="threshold" v-else>
-            <el-input v-model="formData.threshold" placeholder="请输入阈值" type="number"/>
-          </el-form-item>
+
         </el-col>
         <el-col :span="12">
           <el-form-item label="是否累加" prop="sumId" v-show="formData.isSum === 1">
@@ -80,18 +90,20 @@
       </el-row>
       <el-row>
         <el-col :span="12">
-          <el-form-item label="标识符" prop="code" v-show="formData.isSum === 1">
+          <el-form-item label="标识符" prop="code" v-if="formData.isSum === 1">
             <el-radio-group v-model="formData.code">
               <el-radio
                 v-for="dict in getStrDictOptions(DICT_TYPE.RQ_IOT_MODEL_TEMPLATE_ATTR)"
                 :key="dict.value"
                 :value="dict.value"
-                @click="radioChange(dict.value)"
               >
                 {{ dict.label }}
               </el-radio>
             </el-radio-group>
           </el-form-item>
+          <el-form-item label="填写阈值" prop="threshold" v-else>
+            <el-input v-model="formData.threshold" placeholder="请输入阈值" type="number"/>
+          </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="物属性" prop="modelAttr">

+ 4 - 4
src/views/pms/modeltemplate/detail/attrsModel/AttrTemplateModelProperty.vue

@@ -23,12 +23,12 @@
       )
     "
     v-model="selectOptions.dataSpecs"
-  />
-  &lt;!&ndash; 枚举型配置 &ndash;&gt;
-  <ModelAttrModelNumberDataSpecs
+  />-->
+  <!-- 枚举型配置 -->
+  <ModelAttrModelEnumDataSpecs
     v-if="selectOptions.type === DataSpecsDataType.ENUM"
     v-model="selectOptions.dataSpecsList"
-  />-->
+  />
   <!-- 布尔型配置 -->
   <el-form-item v-if="selectOptions.type === DataSpecsDataType.BOOL" label="布尔值">
     <template v-for="(item, index) in selectOptions.dataSpecsList" :key="item.value">