Browse Source

pms 瑞都日报 代码初始化

zhangcl 20 hours ago
parent
commit
e2ef7e48b1

+ 77 - 0
src/api/pms/iotrddailyreport/index.ts

@@ -0,0 +1,77 @@
+import request from '@/config/axios'
+
+// 瑞都日报 VO
+export interface IotRdDailyReportVO {
+  id: number // 主键id
+  deptId: number // 施工队伍id
+  projectId: number // 项目id
+  taskId: number // 任务id
+  projectClassification: string // 项目类别(钻井 修井 注氮 酸化压裂... )
+  techniqueIds: string // 施工工艺([123,233])
+  deviceIds: string // 施工设备([123,233])
+  startTime: string // 时间节点-开始
+  endTime: string // 时间节点-结束
+  cumulativeWorkingWell: number // 累计施工井
+  cumulativeWorkingLayers: number // 累计施工层
+  dailyPumpTrips: number // 当日泵车台次
+  dailyToolsSand: number // 当日仪表/混砂
+  runCount: number // 趟数
+  bridgePlug: number // 桥塞
+  waterVolume: number // 水方量
+  hourCount: number // 时间H
+  dailyFuel: number // 当日油耗(吨)
+  dailyPowerUsage: number // 当日用电量(kWh)
+  productionTime: number // 生产时间(H)
+  nonProductionTime: number // 非生产时间(H)
+  rdNptReason: string // 非生产时间原因
+  constructionStartDate: Date // 施工开始日期
+  constructionEndDate: Date // 施工结束日期
+  productionStatus: string // 当日生产情况生产动态
+  externalRental: string // 外租情况(可能有附件)
+  nextPlan: string // 下步工作计划
+  rdStatus: string // 施工状态(动迁上井/动迁下井/施工准备/施工...)
+  malfunction: string // 故障情况
+  faultDowntime: number // 故障误工h
+  personnel: string // 人员情况
+  totalStaffNum: number // 全员数量
+  leaveStaffNum: number // 休假人员数量
+  extProperty: string // 不同专业公司的扩展属性值
+  sort: number // 排序值
+  remark: string // 备注
+  status: number // 状态(0启用 1禁用)
+  processInstanceId: string // 流程实例id
+  auditStatus: number // 审批状态 未提交、审批中、审批通过、审批不通过、已取消
+}
+
+// 瑞都日报 API
+export const IotRdDailyReportApi = {
+  // 查询瑞都日报分页
+  getIotRdDailyReportPage: async (params: any) => {
+    return await request.get({ url: `/pms/iot-rd-daily-report/page`, params })
+  },
+
+  // 查询瑞都日报详情
+  getIotRdDailyReport: async (id: number) => {
+    return await request.get({ url: `/pms/iot-rd-daily-report/get?id=` + id })
+  },
+
+  // 新增瑞都日报
+  createIotRdDailyReport: async (data: IotRdDailyReportVO) => {
+    return await request.post({ url: `/pms/iot-rd-daily-report/create`, data })
+  },
+
+  // 修改瑞都日报
+  updateIotRdDailyReport: async (data: IotRdDailyReportVO) => {
+    return await request.put({ url: `/pms/iot-rd-daily-report/update`, data })
+  },
+
+  // 删除瑞都日报
+  deleteIotRdDailyReport: async (id: number) => {
+    return await request.delete({ url: `/pms/iot-rd-daily-report/delete?id=` + id })
+  },
+
+  // 导出瑞都日报 Excel
+  exportIotRdDailyReport: async (params) => {
+    return await request.download({ url: `/pms/iot-rd-daily-report/export-excel`, params })
+  },
+}

+ 51 - 0
src/api/pms/iotrddailyreportitem/index.ts

@@ -0,0 +1,51 @@
+import request from '@/config/axios'
+
+// 瑞都日报 (工作量)明细 VO
+export interface IotRdDailyReportItemVO {
+  id: number // 主键id
+  reportId: number // 日报id
+  deptId: number // 施工队伍id
+  projectId: number // 项目id
+  taskId: number // 任务id
+  projectClassification: string // 项目类别(钻井 修井 注氮 酸化压裂... )
+  technique: string // 施工工艺
+  reportAttrIdentifier: string // 工作量属性标识符(bridgePlug waterVolume...)
+  reportAttrName: string // 工作量属性名称(泵车台次 仪表/混砂...)
+  reportAttrValue: number // 工作量属性值
+  sort: number // 排序值
+  remark: string // 备注
+  status: number // 状态(0启用 1禁用)
+}
+
+// 瑞都日报 (工作量)明细 API
+export const IotRdDailyReportItemApi = {
+  // 查询瑞都日报 (工作量)明细分页
+  getIotRdDailyReportItemPage: async (params: any) => {
+    return await request.get({ url: `/pms/iot-rd-daily-report-item/page`, params })
+  },
+
+  // 查询瑞都日报 (工作量)明细详情
+  getIotRdDailyReportItem: async (id: number) => {
+    return await request.get({ url: `/pms/iot-rd-daily-report-item/get?id=` + id })
+  },
+
+  // 新增瑞都日报 (工作量)明细
+  createIotRdDailyReportItem: async (data: IotRdDailyReportItemVO) => {
+    return await request.post({ url: `/pms/iot-rd-daily-report-item/create`, data })
+  },
+
+  // 修改瑞都日报 (工作量)明细
+  updateIotRdDailyReportItem: async (data: IotRdDailyReportItemVO) => {
+    return await request.put({ url: `/pms/iot-rd-daily-report-item/update`, data })
+  },
+
+  // 删除瑞都日报 (工作量)明细
+  deleteIotRdDailyReportItem: async (id: number) => {
+    return await request.delete({ url: `/pms/iot-rd-daily-report-item/delete?id=` + id })
+  },
+
+  // 导出瑞都日报 (工作量)明细 Excel
+  exportIotRdDailyReportItem: async (params) => {
+    return await request.download({ url: `/pms/iot-rd-daily-report-item/export-excel`, params })
+  },
+}

+ 2 - 0
src/locales/en.ts

@@ -271,6 +271,8 @@ export default {
     currentOperation: 'Current Operation',
     nextPlan: 'Next Plan',
     transitTime: 'Transit Time',
+    dailyReport: 'Daily Report',
+    fillReport: 'Fill Report'
   },
   form: {
     input: 'Input',

+ 2 - 0
src/locales/ru.ts

@@ -236,6 +236,8 @@ export default {
     currentOperation: '目前工序',
     nextPlan: '下步工序',
     transitTime: '运行时效',
+    dailyReport: '日报',
+    fillReport: '日报填报'
   },
   form: {
     input: '输入框',

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

@@ -274,6 +274,8 @@ export default {
     currentOperation: '目前工序',
     nextPlan: '下步工序',
     transitTime: '运行时效',
+    dailyReport: '日报',
+    fillReport: '日报填报'
   },
   form: {
     input: '输入框',

+ 39 - 0
src/router/modules/remaining.ts

@@ -936,6 +936,45 @@ const remainingRouter: AppRouteRecordRaw[] = [
     ]
   },
 
+  {
+    path: '/iotpms/rddailyreport',
+    component: Layout,
+    name: 'RDDailyReport',
+    meta: {
+      hidden: true,
+      keepAlive: true
+    },
+    children: [
+      {
+        path: 'dailyReport',
+        component: () => import('@/views/pms/iotrddailyreport/fillDailyReport.vue'),
+        name: 'FillDailyReport',
+        meta: {
+          keepAlive: true,
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:menu',
+          title: t('project.dailyReport'),
+          activeMenu: '/dailyReport/index'
+        }
+      },
+      {
+        path: 'dailyReport/fill/:id(\\d+)',
+        component: () => import('@/views/pms/iotrddailyreport/FillDailyReportForm.vue'),
+        name: 'FillDailyReportForm',
+        meta: {
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:add',
+          title: t('project.fillReport'),
+          activeMenu: '/dailyReport/fill'
+        }
+      }
+    ]
+  },
+
   {
     path: '/iotpms/maincalendar',
     component: Layout,

+ 3 - 1
src/utils/dict.ts

@@ -294,5 +294,7 @@ export enum DICT_TYPE {
   PMS_PROJECT_NPT_REASON = 'nptReason',    // 日报 非生产时间原因
   PMS_PROJECT_RY_NPT_REASON = 'ryNptReason',  // 瑞鹰日报 非生产时间原因
   PMS_PROJECT_WELL_CONTROL_LEVEL = 'rq_iot_well_control_level',  // 井控级别
-  PMS_PROJECT_casing_pipe_size = 'rq_iot_casing_pipe_size'  // 日报 套生段产管尺寸
+  PMS_PROJECT_RD_STATUS = 'rdStatus',                  // 瑞都 施工状态
+  PMS_PROJECT_CASING_PIPE_SIZE = 'rq_iot_casing_pipe_size',    // 日报 套生段产管尺寸
+  PMS_PROJECT_RD_TECHNOLOGY = 'rq_iot_project_technology_rd'   // 瑞都施工工艺
 }

+ 443 - 0
src/views/pms/iotrddailyreport/FillDailyReportForm.vue

@@ -0,0 +1,443 @@
+<template>
+  <ContentWrap v-loading="formLoading">
+    <!-- 第一部分:日报标题 -->
+    <div class="daily-report-title">
+      <h2>{{ dailyReportTitle }}</h2>
+    </div>
+
+    <!-- 第二部分:项目/任务信息 -->
+    <ContentWrap>
+      <el-form :model="dailyReportData" label-width="130px" style="margin-top: 1em">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="甲方:">
+              <span>{{ dailyReportData.manufactureName || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="合同号:">
+              <span>{{ dailyReportData.contractName || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="井号:">
+              <span>{{ dailyReportData.wellName || dailyReportData.taskName || '-' }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="施工队伍:">
+              <span>{{ dailyReportData.deptName || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="施工地点:">
+              <span>{{ dailyReportData.location || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="工艺:">
+              <span>{{ dailyReportData.techniqueNames || '-' }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="搬迁日期:">
+              <span>{{ formatDate(dailyReportData.dpDate) || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="开工日期:">
+              <span>{{ formatDate(dailyReportData.sgDate) || '-' }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="完工日期:">
+              <span>{{ formatDate(dailyReportData.wgDate) || '-' }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="施工周期D:">
+              <span>{{ constructionPeriod || 0 }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="停待时间D:">
+              <span>{{ dailyReportData.faultDowntime || 0 }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="带班干部:">
+              <span>{{ dailyReportData.responsiblePersonNames || '-' }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="设备配置:">
+              <span>{{ dailyReportData.deviceNames || '-' }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </ContentWrap>
+
+    <!-- 第三部分:日报填报表单 -->
+    <ContentWrap>
+      <el-form
+        ref="formRef"
+        :model="formData"
+        :rules="formRules"
+        v-loading="formLoading"
+        style="margin-top: 1em"
+        label-width="130px"
+      >
+        <!-- 第一行:时间节点、施工状态 -->
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="时间节点" prop="timeRange">
+              <el-time-picker
+                is-range
+                v-model="formData.timeRange"
+                range-separator="至"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                placeholder="选择时间范围"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="施工状态" prop="rdStatus">
+              <el-select v-model="formData.rdStatus" placeholder="请选择施工状态" style="width: 100%">
+                <el-option
+                  v-for="dict in rdStatusOptions"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 第二行:施工工艺 -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="施工工艺" prop="techniqueIds">
+              <el-select v-model="formData.techniqueIds" placeholder="请选择施工工艺" style="width: 100%" multiple>
+                <el-option
+                  v-for="dict in techniqueOptions"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 第三行:当日生产动态 -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="当日生产动态" prop="productionStatus">
+              <el-input
+                v-model="formData.productionStatus"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入当日生产动态"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 第四行:下步工作计划 -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="下步工作计划" prop="nextPlan">
+              <el-input
+                v-model="formData.nextPlan"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入下步工作计划"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 第五行:外租设备 -->
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="外租设备" prop="externalRental">
+              <el-input
+                v-model="formData.externalRental"
+                type="textarea"
+                :rows="3"
+                placeholder="请输入外租设备信息"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </ContentWrap>
+
+    <!-- 操作按钮 -->
+    <ContentWrap>
+      <el-form>
+        <el-form-item style="float: right">
+          <el-button @click="submitForm" type="primary" :disabled="formLoading">
+            {{ t('common.save') }}
+          </el-button>
+          <el-button @click="close">{{ t('common.cancel') }}</el-button>
+        </el-form-item>
+      </el-form>
+    </ContentWrap>
+  </ContentWrap>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted } from 'vue'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useMessage } from '@/hooks/web/useMessage'
+import { useTagsViewStore } from '@/store/modules/tagsView'
+import { useRouter, useRoute } from 'vue-router'
+import {DICT_TYPE, getDictLabel, getStrDictOptions} from '@/utils/dict'
+import { IotRdDailyReportApi } from '@/api/pms/iotrddailyreport'
+import * as DeptApi from '@/api/system/dept'
+import { useUserStore } from '@/store/modules/user'
+import dayjs from 'dayjs'
+
+const { t } = useI18n()
+const message = useMessage()
+const { delView } = useTagsViewStore()
+const { push, currentRoute } = useRouter()
+const { params } = useRoute()
+const userStore = useUserStore()
+
+/** 填报日报 表单 */
+defineOptions({ name: 'FillDailyReportForm' })
+
+const formLoading = ref(false)
+const formRef = ref()
+const id = params.id // 瑞都日报id
+
+// 日报数据
+const dailyReportData = ref<any>({})
+
+// 施工工艺相关变量
+const technologyOptions = ref<any[]>([])
+const loadingTechnologyOptions = ref(false)
+const currentTechnologyDictLabel = ref(''); // 存储当前项目对应的施工工艺字典类型
+
+// 表单数据
+const formData = ref({
+  id: undefined,
+  deptId: undefined,
+  companyId: undefined,
+  deptName: undefined,
+  constructionStartDate: undefined,
+  contractName: undefined,
+  projectDepartment: '',
+  costCenterId: undefined,
+  costCenter: '',
+  // 新增日报填报字段
+  timeRange: [ // 设置默认时间范围 8:00 - 8:00
+    dayjs().hour(8).minute(0).second(0).toDate(),
+    dayjs().hour(8).minute(0).second(0).toDate()
+  ],
+  startTime: undefined, // 开始时间
+  endTime: undefined, // 结束时间
+  rdStatus: '', // 施工状态
+  techniqueIds: [], // 施工工艺
+  productionStatus: '', // 当日生产动态
+  nextPlan: '', // 下步工作计划
+  externalRental: '' // 外租设备
+})
+
+// 表单验证规则
+const formRules = reactive({
+  timeRange: [{ required: true, message: '时间节点不能为空', trigger: 'change' }],
+  rdStatus: [{ required: true, message: '施工状态不能为空', trigger: 'change' }],
+  techniqueIds: [{ required: true, message: '施工工艺不能为空', trigger: 'change' }],
+  productionStatus: [{ required: true, message: '当日生产动态不能为空', trigger: 'blur' }]
+})
+
+// 下拉选项
+const rdStatusOptions = getStrDictOptions(DICT_TYPE.PMS_PROJECT_RD_STATUS)   // 施工状态
+const techniqueOptions = getStrDictOptions(DICT_TYPE.PMS_PROJECT_RD_TECHNOLOGY) // 瑞都施工工艺
+
+// 计算属性:日报标题
+const dailyReportTitle = computed(() => {
+  if (!dailyReportData.value.wellName || !dailyReportData.value.constructionStartDate) {
+    return '日报填报'
+  }
+  const dateStr = formatDate(dailyReportData.value.constructionStartDate)
+  return `${dailyReportData.value.wellName} - ${dateStr} 生产日报`
+})
+
+// 计算属性:施工周期
+const constructionPeriod = computed(() => {
+  const start = dailyReportData.value.constructionStartDate
+  const end = dailyReportData.value.constructionEndDate
+  if (!start || !end) return 0
+
+  const startDate = dayjs(start)
+  const endDate = dayjs(end)
+  return endDate.diff(startDate, 'day')
+})
+
+// 日期格式化函数
+const formatDate = (timestamp: number) => {
+  if (!timestamp) return ''
+  return dayjs(timestamp).format('YYYY-MM-DD')
+}
+
+const close = () => {
+  delView(unref(currentRoute))
+  push({ name: 'FillDailyReport', params: {} })
+}
+
+/** 提交表单 */
+const emit = defineEmits(['success'])
+const submitForm = async () => {
+  // 验证表单
+  try {
+    await formRef.value.validate()
+  } catch (error) {
+    return
+  }
+
+  // 处理时间范围数据
+  if (formData.value.timeRange && formData.value.timeRange.length === 2) {
+    // 将时间范围转换为 LocalTime 格式的字符串
+    const startDate = dayjs(formData.value.timeRange[0])
+    const endDate = dayjs(formData.value.timeRange[1])
+
+    // 格式化为 HH:mm:ss 字符串,后端会自动转换为 LocalTime
+    formData.value.startTime = startDate.format('HH:mm:ss')
+    formData.value.endTime = endDate.format('HH:mm:ss')
+  }
+
+  // 提交请求
+  formLoading.value = true
+  try {
+    // 调用更新接口
+    await IotRdDailyReportApi.updateIotRdDailyReport(formData.value)
+    message.success(t('common.updateSuccess'))
+    close()
+    // 发送操作成功的事件
+    emit('success')
+  } catch (error) {
+    console.error('提交失败:', error)
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formRef.value?.resetFields()
+}
+
+// 初始化表单数据
+const initFormData = (reportData: any) => {
+  formData.value = {
+    ...formData.value,
+    id: reportData.id,
+    deptId: reportData.deptId,
+    rdStatus: reportData.rdStatus || '',
+    techniqueIds: reportData.techniqueIds ? reportData.techniqueIds.map((id: number) => id.toString()) : [],
+    productionStatus: reportData.productionStatus || '',
+    nextPlan: reportData.nextPlan || '',
+    externalRental: reportData.externalRental || '',
+    startTime: reportData.startTime || undefined,
+    endTime: reportData.endTime || undefined,
+    companyId: reportData.companyId || ''
+  }
+
+  // 设置时间范围选择器
+  if (reportData.startTime && reportData.startTime[0] && reportData.endTime && reportData.endTime[0]) {
+    formData.value.timeRange = [
+      new Date(reportData.startTime[0]),
+      new Date(reportData.endTime[0])
+    ]
+  }
+
+}
+
+onMounted(async () => {
+  formLoading.value = true
+  try {
+    // 加载当前登录人所属部门
+    const deptId = userStore.getUser.deptId
+    const dept = await DeptApi.getDept(deptId)
+
+    // 查询瑞都日报详情
+    if (id) {
+      const response = await IotRdDailyReportApi.getIotRdDailyReport(id)
+      dailyReportData.value = response || {}
+      initFormData(dailyReportData.value)
+    }
+  } catch (error) {
+    console.error('初始化数据失败:', error)
+    message.error('数据加载失败')
+  } finally {
+    formLoading.value = false
+  }
+})
+</script>
+
+<style scoped>
+.daily-report-title {
+  text-align: center;
+  margin: 20px 0;
+  padding: 10px;
+  border-bottom: 2px solid #409eff;
+}
+
+.daily-report-title h2 {
+  margin: 0;
+  color: #303133;
+  font-size: 16px;
+  font-weight: bold;
+}
+
+.project-info-section {
+  margin: 20px 0;
+  padding: 20px;
+  background-color: #f8f9fa;
+  border-radius: 4px;
+  border: 1px solid #e9ecef;
+}
+
+.info-row {
+  padding: 12px 0;
+  border-bottom: 1px solid #e9ecef;
+}
+
+.info-row:last-child {
+  border-bottom: none;
+}
+
+.info-label {
+  font-weight: bold;
+  color: #495057;
+  margin-right: 8px;
+}
+
+.info-value {
+  color: #212529;
+}
+
+:deep(.el-textarea .el-textarea__inner) {
+  min-height: 80px;
+}
+</style>

+ 319 - 0
src/views/pms/iotrddailyreport/IotRdDailyReportForm.vue

@@ -0,0 +1,319 @@
+<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="施工工艺([123,233])" prop="techniqueIds">
+        <el-input v-model="formData.techniqueIds" placeholder="请输入施工工艺([123,233])" />
+      </el-form-item>
+      <el-form-item label="施工设备([123,233])" prop="deviceIds">
+        <el-input v-model="formData.deviceIds" placeholder="请输入施工设备([123,233])" />
+      </el-form-item>
+      <el-form-item label="时间节点-开始" prop="startTime">
+        <el-date-picker
+          v-model="formData.startTime"
+          type="date"
+          value-format="x"
+          placeholder="选择时间节点-开始"
+        />
+      </el-form-item>
+      <el-form-item label="时间节点-结束" prop="endTime">
+        <el-date-picker
+          v-model="formData.endTime"
+          type="date"
+          value-format="x"
+          placeholder="选择时间节点-结束"
+        />
+      </el-form-item>
+      <el-form-item label="累计施工井" prop="cumulativeWorkingWell">
+        <el-input v-model="formData.cumulativeWorkingWell" placeholder="请输入累计施工井" />
+      </el-form-item>
+      <el-form-item label="累计施工层" prop="cumulativeWorkingLayers">
+        <el-input v-model="formData.cumulativeWorkingLayers" placeholder="请输入累计施工层" />
+      </el-form-item>
+      <el-form-item label="当日泵车台次" prop="dailyPumpTrips">
+        <el-input v-model="formData.dailyPumpTrips" placeholder="请输入当日泵车台次" />
+      </el-form-item>
+      <el-form-item label="当日仪表/混砂" prop="dailyToolsSand">
+        <el-input v-model="formData.dailyToolsSand" placeholder="请输入当日仪表/混砂" />
+      </el-form-item>
+      <el-form-item label="趟数" prop="runCount">
+        <el-input v-model="formData.runCount" placeholder="请输入趟数" />
+      </el-form-item>
+      <el-form-item label="桥塞" prop="bridgePlug">
+        <el-input v-model="formData.bridgePlug" placeholder="请输入桥塞" />
+      </el-form-item>
+      <el-form-item label="水方量" prop="waterVolume">
+        <el-input v-model="formData.waterVolume" placeholder="请输入水方量" />
+      </el-form-item>
+      <el-form-item label="时间H" prop="hourCount">
+        <el-input v-model="formData.hourCount" placeholder="请输入时间H" />
+      </el-form-item>
+      <el-form-item label="当日油耗(吨)" prop="dailyFuel">
+        <el-input v-model="formData.dailyFuel" placeholder="请输入当日油耗(吨)" />
+      </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="生产时间(H)" prop="productionTime">
+        <el-date-picker
+          v-model="formData.productionTime"
+          type="date"
+          value-format="x"
+          placeholder="选择生产时间(H)"
+        />
+      </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="rdNptReason">
+        <el-input v-model="formData.rdNptReason" 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="externalRental">
+        <el-input v-model="formData.externalRental" placeholder="请输入外租情况(可能有附件)" />
+      </el-form-item>
+      <el-form-item label="下步工作计划" prop="nextPlan">
+        <el-input v-model="formData.nextPlan" placeholder="请输入下步工作计划" />
+      </el-form-item>
+      <el-form-item label="施工状态(动迁上井/动迁下井/施工准备/施工...)" prop="rdStatus">
+        <el-radio-group v-model="formData.rdStatus">
+          <el-radio value="1">请选择字典生成</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="故障情况" prop="malfunction">
+        <el-input v-model="formData.malfunction" placeholder="请输入故障情况" />
+      </el-form-item>
+      <el-form-item label="故障误工h" prop="faultDowntime">
+        <el-date-picker
+          v-model="formData.faultDowntime"
+          type="date"
+          value-format="x"
+          placeholder="选择故障误工h"
+        />
+      </el-form-item>
+      <el-form-item label="人员情况" prop="personnel">
+        <el-input v-model="formData.personnel" placeholder="请输入人员情况" />
+      </el-form-item>
+      <el-form-item label="全员数量" prop="totalStaffNum">
+        <el-input v-model="formData.totalStaffNum" placeholder="请输入全员数量" />
+      </el-form-item>
+      <el-form-item label="休假人员数量" prop="leaveStaffNum">
+        <el-input v-model="formData.leaveStaffNum" 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 { IotRdDailyReportApi, IotRdDailyReportVO } from '@/api/pms/iotrddailyreport'
+
+/** 瑞都日报 表单 */
+defineOptions({ name: 'IotRdDailyReportForm' })
+
+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,
+  techniqueIds: undefined,
+  deviceIds: undefined,
+  startTime: undefined,
+  endTime: undefined,
+  cumulativeWorkingWell: undefined,
+  cumulativeWorkingLayers: undefined,
+  dailyPumpTrips: undefined,
+  dailyToolsSand: undefined,
+  runCount: undefined,
+  bridgePlug: undefined,
+  waterVolume: undefined,
+  hourCount: undefined,
+  dailyFuel: undefined,
+  dailyPowerUsage: undefined,
+  productionTime: undefined,
+  nonProductionTime: undefined,
+  rdNptReason: undefined,
+  constructionStartDate: undefined,
+  constructionEndDate: undefined,
+  productionStatus: undefined,
+  externalRental: undefined,
+  nextPlan: undefined,
+  rdStatus: undefined,
+  malfunction: undefined,
+  faultDowntime: undefined,
+  personnel: undefined,
+  totalStaffNum: undefined,
+  leaveStaffNum: 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 IotRdDailyReportApi.getIotRdDailyReport(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 IotRdDailyReportVO
+    if (formType.value === 'create') {
+      await IotRdDailyReportApi.createIotRdDailyReport(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await IotRdDailyReportApi.updateIotRdDailyReport(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,
+    techniqueIds: undefined,
+    deviceIds: undefined,
+    startTime: undefined,
+    endTime: undefined,
+    cumulativeWorkingWell: undefined,
+    cumulativeWorkingLayers: undefined,
+    dailyPumpTrips: undefined,
+    dailyToolsSand: undefined,
+    runCount: undefined,
+    bridgePlug: undefined,
+    waterVolume: undefined,
+    hourCount: undefined,
+    dailyFuel: undefined,
+    dailyPowerUsage: undefined,
+    productionTime: undefined,
+    nonProductionTime: undefined,
+    rdNptReason: undefined,
+    constructionStartDate: undefined,
+    constructionEndDate: undefined,
+    productionStatus: undefined,
+    externalRental: undefined,
+    nextPlan: undefined,
+    rdStatus: undefined,
+    malfunction: undefined,
+    faultDowntime: undefined,
+    personnel: undefined,
+    totalStaffNum: undefined,
+    leaveStaffNum: undefined,
+    extProperty: undefined,
+    sort: undefined,
+    remark: undefined,
+    status: undefined,
+    processInstanceId: undefined,
+    auditStatus: undefined,
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 255 - 0
src/views/pms/iotrddailyreport/fillDailyReport.vue

@@ -0,0 +1,255 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="项目" prop="projectId">
+        <el-input
+          v-model="queryParams.projectId"
+          placeholder="请输入项目"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="任务" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入任务"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </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-rd-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-rd-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" v-if="false"/>
+      <el-table-column label="施工队伍" align="center" prop="deptName" />
+      <el-table-column label="项目" align="center" prop="projectId" />
+      <el-table-column label="任务" align="center" prop="taskId" />
+      <el-table-column label="责任人" align="center" prop="submitter" />
+      <el-table-column label="日报状态" align="center" prop="status" />
+      <!--
+      <el-table-column label="项目类别(钻井 修井 注氮 酸化压裂... )" align="center" prop="projectClassification" /> -->
+      <!--
+      <el-table-column label="时间节点-结束" align="center" prop="endTime" /> -->
+      <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="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('fill', scope.row.id)"
+            v-hasPermi="['pms:iot-rd-daily-report:update']"
+          >
+            填报
+          </el-button>
+          <el-button
+            link
+            type="success"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['pms:iot-rd-daily-report:query']"
+          >
+            查看
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改
+  <IotRdDailyReportForm ref="formRef" @success="getList" /> -->
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotRdDailyReportApi, IotRdDailyReportVO } from '@/api/pms/iotrddailyreport'
+import FillDailyReportForm from './FillDailyReportForm.vue'
+
+/** 瑞都日报 填报 列表 */
+defineOptions({ name: 'FillDailyReport' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+const { push } = useRouter() // 路由跳转
+const loading = ref(true) // 列表的加载中
+const list = ref<IotRdDailyReportVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  techniqueIds: undefined,
+  deviceIds: undefined,
+  startTime: [],
+  endTime: [],
+  cumulativeWorkingWell: undefined,
+  cumulativeWorkingLayers: undefined,
+  dailyPumpTrips: undefined,
+  dailyToolsSand: undefined,
+  runCount: undefined,
+  bridgePlug: undefined,
+  waterVolume: undefined,
+  hourCount: undefined,
+  dailyFuel: undefined,
+  dailyPowerUsage: undefined,
+  productionTime: [],
+  nonProductionTime: [],
+  rdNptReason: undefined,
+  constructionStartDate: [],
+  constructionEndDate: [],
+  productionStatus: undefined,
+  externalRental: undefined,
+  nextPlan: undefined,
+  rdStatus: undefined,
+  malfunction: undefined,
+  faultDowntime: [],
+  personnel: undefined,
+  totalStaffNum: undefined,
+  leaveStaffNum: 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 IotRdDailyReportApi.getIotRdDailyReportPage(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) => {
+  push({ name: 'FillDailyReportForm', params:{ id } })
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await IotRdDailyReportApi.deleteIotRdDailyReport(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotRdDailyReportApi.exportIotRdDailyReport(queryParams)
+    download.excel(data, '瑞都日报.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 270 - 0
src/views/pms/iotrddailyreport/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="项目" prop="projectId">
+        <el-input
+          v-model="queryParams.projectId"
+          placeholder="请输入项目"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="任务" prop="taskId">
+        <el-input
+          v-model="queryParams.taskId"
+          placeholder="请输入任务"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </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-rd-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-rd-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" v-if="false"/>
+      <el-table-column label="施工队伍" align="center" prop="deptName" />
+      <el-table-column label="项目" align="center" prop="projectId" />
+      <el-table-column label="任务" align="center" prop="taskId" />
+      <el-table-column label="时间节点" align="center" prop="timeRange" />
+      <el-table-column label="施工状态" align="center" prop="rdStatus" />
+      <!--
+      <el-table-column label="项目类别(钻井 修井 注氮 酸化压裂... )" align="center" prop="projectClassification" /> -->
+      <el-table-column label="施工工艺" align="center" prop="techniqueIds" />
+      <el-table-column label="施工设备" align="center" prop="deviceIds" />
+      <!--
+      <el-table-column label="时间节点-结束" align="center" prop="endTime" /> -->
+      <el-table-column label="累计施工井" align="center" prop="cumulativeWorkingWell" />
+      <el-table-column label="累计施工层" align="center" prop="cumulativeWorkingLayers" />
+      <el-table-column label="当日泵车台次" align="center" prop="dailyPumpTrips" />
+      <el-table-column label="当日仪表/混砂" align="center" prop="dailyToolsSand" />
+      <el-table-column label="趟数" align="center" prop="runCount" />
+      <el-table-column label="桥塞" align="center" prop="bridgePlug" />
+      <el-table-column label="水方量" align="center" prop="waterVolume" />
+      <el-table-column label="时间H" align="center" prop="hourCount" />
+      <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="externalRental" />
+      <el-table-column label="故障情况" align="center" prop="malfunction" />
+      <el-table-column label="故障误工H" align="center" prop="faultDowntime" />
+      <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-rd-daily-report:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['pms:iot-rd-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>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <IotRdDailyReportForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotRdDailyReportApi, IotRdDailyReportVO } from '@/api/pms/iotrddailyreport'
+import IotRdDailyReportForm from './IotRdDailyReportForm.vue'
+
+/** 瑞都日报 列表 */
+defineOptions({ name: 'IotRdDailyReport' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<IotRdDailyReportVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  techniqueIds: undefined,
+  deviceIds: undefined,
+  startTime: [],
+  endTime: [],
+  cumulativeWorkingWell: undefined,
+  cumulativeWorkingLayers: undefined,
+  dailyPumpTrips: undefined,
+  dailyToolsSand: undefined,
+  runCount: undefined,
+  bridgePlug: undefined,
+  waterVolume: undefined,
+  hourCount: undefined,
+  dailyFuel: undefined,
+  dailyPowerUsage: undefined,
+  productionTime: [],
+  nonProductionTime: [],
+  rdNptReason: undefined,
+  constructionStartDate: [],
+  constructionEndDate: [],
+  productionStatus: undefined,
+  externalRental: undefined,
+  nextPlan: undefined,
+  rdStatus: undefined,
+  malfunction: undefined,
+  faultDowntime: [],
+  personnel: undefined,
+  totalStaffNum: undefined,
+  leaveStaffNum: 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 IotRdDailyReportApi.getIotRdDailyReportPage(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 IotRdDailyReportApi.deleteIotRdDailyReport(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotRdDailyReportApi.exportIotRdDailyReport(queryParams)
+    download.excel(data, '瑞都日报.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 148 - 0
src/views/pms/iotrddailyreportitem/IotRdDailyReportItemForm.vue

@@ -0,0 +1,148 @@
+<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="reportId">
+        <el-input v-model="formData.reportId" placeholder="请输入日报id" />
+      </el-form-item>
+      <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="施工工艺" prop="technique">
+        <el-input v-model="formData.technique" placeholder="请输入施工工艺" />
+      </el-form-item>
+      <el-form-item label="工作量属性标识符(bridgePlug waterVolume...)" prop="reportAttrIdentifier">
+        <el-input v-model="formData.reportAttrIdentifier" placeholder="请输入工作量属性标识符(bridgePlug waterVolume...)" />
+      </el-form-item>
+      <el-form-item label="工作量属性名称(泵车台次 仪表/混砂...)" prop="reportAttrName">
+        <el-input v-model="formData.reportAttrName" placeholder="请输入工作量属性名称(泵车台次 仪表/混砂...)" />
+      </el-form-item>
+      <el-form-item label="工作量属性值" prop="reportAttrValue">
+        <el-input v-model="formData.reportAttrValue" 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>
+    <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 { IotRdDailyReportItemApi, IotRdDailyReportItemVO } from '@/api/pms/iotrddailyreportitem'
+
+/** 瑞都日报 (工作量)明细 表单 */
+defineOptions({ name: 'IotRdDailyReportItemForm' })
+
+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,
+  reportId: undefined,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  technique: undefined,
+  reportAttrIdentifier: undefined,
+  reportAttrName: undefined,
+  reportAttrValue: undefined,
+  sort: undefined,
+  remark: undefined,
+  status: 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 IotRdDailyReportItemApi.getIotRdDailyReportItem(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 IotRdDailyReportItemVO
+    if (formType.value === 'create') {
+      await IotRdDailyReportItemApi.createIotRdDailyReportItem(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await IotRdDailyReportItemApi.updateIotRdDailyReportItem(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    reportId: undefined,
+    deptId: undefined,
+    projectId: undefined,
+    taskId: undefined,
+    projectClassification: undefined,
+    technique: undefined,
+    reportAttrIdentifier: undefined,
+    reportAttrName: undefined,
+    reportAttrValue: undefined,
+    sort: undefined,
+    remark: undefined,
+    status: undefined,
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 309 - 0
src/views/pms/iotrddailyreportitem/index.vue

@@ -0,0 +1,309 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="日报id" prop="reportId">
+        <el-input
+          v-model="queryParams.reportId"
+          placeholder="请输入日报id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <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="施工工艺" prop="technique">
+        <el-input
+          v-model="queryParams.technique"
+          placeholder="请输入施工工艺"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工作量属性标识符(bridgePlug waterVolume...)" prop="reportAttrIdentifier">
+        <el-input
+          v-model="queryParams.reportAttrIdentifier"
+          placeholder="请输入工作量属性标识符(bridgePlug waterVolume...)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工作量属性名称(泵车台次 仪表/混砂...)" prop="reportAttrName">
+        <el-input
+          v-model="queryParams.reportAttrName"
+          placeholder="请输入工作量属性名称(泵车台次 仪表/混砂...)"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工作量属性值" prop="reportAttrValue">
+        <el-input
+          v-model="queryParams.reportAttrValue"
+          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="创建时间" 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-rd-daily-report-item:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['pms:iot-rd-daily-report-item: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="reportId" />
+      <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="施工工艺" align="center" prop="technique" />
+      <el-table-column label="工作量属性标识符(bridgePlug waterVolume...)" align="center" prop="reportAttrIdentifier" />
+      <el-table-column label="工作量属性名称(泵车台次 仪表/混砂...)" align="center" prop="reportAttrName" />
+      <el-table-column label="工作量属性值" align="center" prop="reportAttrValue" />
+      <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="创建时间"
+        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-rd-daily-report-item:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['pms:iot-rd-daily-report-item: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>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <IotRdDailyReportItemForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotRdDailyReportItemApi, IotRdDailyReportItemVO } from '@/api/pms/iotrddailyreportitem'
+import IotRdDailyReportItemForm from './IotRdDailyReportItemForm.vue'
+
+/** 瑞都日报 (工作量)明细 列表 */
+defineOptions({ name: 'IotRdDailyReportItem' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<IotRdDailyReportItemVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  reportId: undefined,
+  deptId: undefined,
+  projectId: undefined,
+  taskId: undefined,
+  projectClassification: undefined,
+  technique: undefined,
+  reportAttrIdentifier: undefined,
+  reportAttrName: undefined,
+  reportAttrValue: undefined,
+  sort: undefined,
+  remark: undefined,
+  status: undefined,
+  createTime: [],
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await IotRdDailyReportItemApi.getIotRdDailyReportItemPage(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 IotRdDailyReportItemApi.deleteIotRdDailyReportItem(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotRdDailyReportItemApi.exportIotRdDailyReportItem(queryParams)
+    download.excel(data, '瑞都日报 (工作量)明细.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>