Zimo 1 день назад
Родитель
Сommit
7a0d0ff1b6

+ 6 - 1
src/api/pms/iotrydailyreport/index.ts

@@ -121,7 +121,12 @@ export const IotRyDailyReportApi = {
     return await request.download({ url: `/pms/iot-ry-daily-report/export-excel`, params })
     return await request.download({ url: `/pms/iot-ry-daily-report/export-excel`, params })
   },
   },
 
 
-  approvalIotRyDailyReport: async (data: { id: number; auditStatus: 20 | 30; opinion: string }) => {
+  approvalIotRyDailyReport: async (data: {
+    id: number
+    auditStatus: 20 | 30
+    opinion: string
+    constructionBrief?: string
+  }) => {
     return await request.put({ url: `/pms/iot-ry-daily-report/approval`, data })
     return await request.put({ url: `/pms/iot-ry-daily-report/approval`, data })
   },
   },
   exportIotRyDailyReportWell: async (params) => {
   exportIotRyDailyReportWell: async (params) => {

+ 59 - 2
src/views/pms/iotrddailyreport/index.vue

@@ -3,7 +3,7 @@ import { IotRdDailyReportApi } from '@/api/pms/iotrddailyreport'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useUserStore } from '@/store/modules/user'
 import { useUserStore } from '@/store/modules/user'
 import { DICT_TYPE, getDictOptions } from '@/utils/dict'
 import { DICT_TYPE, getDictOptions } from '@/utils/dict'
-import { rangeShortcuts } from '@/utils/formatTime'
+import { formatT, rangeShortcuts } from '@/utils/formatTime'
 import { useDebounceFn } from '@vueuse/core'
 import { useDebounceFn } from '@vueuse/core'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
 import download from '@/utils/download'
 import download from '@/utils/download'
@@ -300,7 +300,64 @@ function handleOpenForm(id: number, type: 'edit' | 'detail' | 'approval' | 'time
                   />
                   />
                 </template>
                 </template>
               </zm-table-column>
               </zm-table-column>
-              <zm-table-column prop="productionStatus" label="当日生产动态" />
+              <zm-table-column
+                prop="reportDetails"
+                label="当日生产动态"
+                width="300"
+                :show-overflow-tooltip="false"
+              >
+                <template #default="{ row }">
+                  <div class="flex flex-col gap-2 py-2">
+                    <div
+                      v-for="(item, index) in row.reportDetails"
+                      :key="index"
+                      class="group flex flex-col gap-1.5 p-2 rounded-md bg-gray-200/80 hover:bg-blue-100 transition-colors"
+                    >
+                      <div class="flex items-center gap-x-3 text-12px text-gray-500">
+                        <div class="flex items-center">
+                          <div class="i-carbon-calendar mr-1 opacity-70"></div>
+                          <span class="font-mono">{{
+                            dayjs(row.createTime).format('YYYY-MM-DD')
+                          }}</span>
+                        </div>
+
+                        <div
+                          class="flex items-center bg-gray-200/50 px-2 py-0.5 rounded text-gray-600"
+                        >
+                          <span>{{ formatT(item.startTime) }}</span>
+                          <span class="mx-1 opacity-50">-</span>
+                          <span>{{ formatT(item.endTime) }}</span>
+                        </div>
+
+                        <div class="ml-auto flex items-center gap-1">
+                          <span class="text-gray-400">时长</span>
+                          <span class="text-blue-600 font-bold tracking-tighter"
+                            >{{ item.duration }}<small class="font-normal ml-0.5">H</small></span
+                          >
+                        </div>
+                      </div>
+
+                      <div class="flex items-start items-center min-w-0 p-1.5 rounded-sm">
+                        <span class="flex-shrink-0 text-12px font-bold text-gray-400 mr-2">
+                          施工详情
+                        </span>
+                        <el-tooltip
+                          effect="dark"
+                          :content="item.constructionDetail"
+                          placement="top"
+                          popper-class="max-w-100"
+                        >
+                          <span
+                            class="text-gray-700 truncate cursor-help group-hover:text-blue-600 transition-colors"
+                          >
+                            {{ item.constructionDetail || '-' }}
+                          </span>
+                        </el-tooltip>
+                      </div>
+                    </div>
+                  </div>
+                </template>
+              </zm-table-column>
               <zm-table-column prop="nextPlan" label="下步工作计划" />
               <zm-table-column prop="nextPlan" label="下步工作计划" />
               <zm-table-column label="当日">
               <zm-table-column label="当日">
                 <zm-table-column prop="cumulativeWorkingWell" label="施工井" />
                 <zm-table-column prop="cumulativeWorkingWell" label="施工井" />

+ 16 - 4
src/views/pms/iotrddailyreport/rd-form.vue

@@ -160,7 +160,12 @@ const rules = ref<FormRules<Form>>({
   nextPlan: [{ required: true, message: '请输入下计划', trigger: 'change' }],
   nextPlan: [{ required: true, message: '请输入下计划', trigger: 'change' }],
   reportDetails: [{ required: true, message: '请填写生产动态', type: 'array' }],
   reportDetails: [{ required: true, message: '请填写生产动态', type: 'array' }],
   constructionBrief: [
   constructionBrief: [
-    { required: true, message: '请填写施工简报', type: 'string', trigger: ['blur', 'change'] }
+    {
+      required: formType.value === 'time',
+      message: '请填写施工简报',
+      type: 'string',
+      trigger: ['blur', 'change']
+    }
   ]
   ]
 })
 })
 
 
@@ -390,7 +395,7 @@ const submitForm = useDebounceFn(async function submitForm() {
           {} as Record<string, number>
           {} as Record<string, number>
         ),
         ),
         otherNptReason: copyForm[pid].otherNptReason || '',
         otherNptReason: copyForm[pid].otherNptReason || '',
-        nonProduct: data.value.auditStatus === 20 ? 'Y' : ''
+        nonProduct: formType.value === 'time' ? 'Y' : ''
       }
       }
 
 
       responseData.push(platformData)
       responseData.push(platformData)
@@ -479,6 +484,14 @@ const formDisabled = computed(() => (key?: string) => {
   }
   }
 
 
   if (formType.value === 'edit') {
   if (formType.value === 'edit') {
+    if (
+      NON_PROD_FIELDS.some((field) => field.key === key) ||
+      key === 'constructionBrief' ||
+      key === 'otherNptReason'
+    ) {
+      return true
+    }
+
     return data.value.status !== 0
     return data.value.status !== 0
   }
   }
 
 
@@ -1186,9 +1199,8 @@ const inContent = async (attachment) => {
                         placeholder="输入施工详情"
                         placeholder="输入施工详情"
                         type="textarea"
                         type="textarea"
                         :autosize="{ minRows: 1 }"
                         :autosize="{ minRows: 1 }"
-                        resize="none"
                         show-word-limit
                         show-word-limit
-                        :maxlength="1000"
+                        :maxlength="2000"
                         class="w-full!"
                         class="w-full!"
                       />
                       />
                     </el-form-item>
                     </el-form-item>

+ 21 - 11
src/views/pms/iotrydailyreport/ry-form.vue

@@ -7,6 +7,7 @@ import { computed, reactive, ref, watch, nextTick } from 'vue'
 import { Delete, Plus } from '@element-plus/icons-vue'
 import { Delete, Plus } from '@element-plus/icons-vue'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
 import { calculateDuration, formatT } from '@/utils/formatTime'
 import { calculateDuration, formatT } from '@/utils/formatTime'
+import { useDebounceFn } from '@vueuse/core'
 
 
 interface Props {
 interface Props {
   visible: boolean
   visible: boolean
@@ -392,7 +393,8 @@ const handleAudit = async (auditStatus: 20 | 30) => {
     await IotRyDailyReportApi.approvalIotRyDailyReport({
     await IotRyDailyReportApi.approvalIotRyDailyReport({
       id: form.value.id!,
       id: form.value.id!,
       auditStatus,
       auditStatus,
-      opinion: form.value.opinion!
+      opinion: form.value.opinion!,
+      constructionBrief: form.value.constructionBrief
     })
     })
     message.success(auditStatus === 20 ? '通过成功' : '拒绝成功')
     message.success(auditStatus === 20 ? '通过成功' : '拒绝成功')
     emits('update:visible', false)
     emits('update:visible', false)
@@ -417,6 +419,12 @@ const orange = computed(() => {
   if (Math.abs(total - 24) > 0.01) return true
   if (Math.abs(total - 24) > 0.01) return true
   return false
   return false
 })
 })
+
+const inputCurrentDepth = useDebounceFn(function inputCurrentDepth(val: any, index: number) {
+  if (form.value.reportDetails && index === form.value.reportDetails.length - 1) {
+    form.value.currentDepth = val
+  }
+}, 300)
 </script>
 </script>
 
 
 <template>
 <template>
@@ -673,7 +681,7 @@ const orange = computed(() => {
                 "
                 "
               />
               />
 
 
-              <ZmTableColumn :width="160" label="开始时间" prop="startTime">
+              <ZmTableColumn :width="130" label="开始时间" prop="startTime">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
@@ -698,7 +706,7 @@ const orange = computed(() => {
                   </el-form-item>
                   </el-form-item>
                 </template>
                 </template>
               </ZmTableColumn>
               </ZmTableColumn>
-              <ZmTableColumn :width="160" label="结束时间" prop="endTime">
+              <ZmTableColumn :width="130" label="结束时间" prop="endTime">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
@@ -725,7 +733,7 @@ const orange = computed(() => {
               </ZmTableColumn>
               </ZmTableColumn>
               <ZmTableColumn :width="80" label="时长(H)" prop="duration" />
               <ZmTableColumn :width="80" label="时长(H)" prop="duration" />
 
 
-              <ZmTableColumn label="工况" min-width="120">
+              <ZmTableColumn label="工况" min-width="140">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
@@ -737,7 +745,6 @@ const orange = computed(() => {
                       v-model="row.currentOperation"
                       v-model="row.currentOperation"
                       type="textarea"
                       type="textarea"
                       :autosize="{ minRows: 1 }"
                       :autosize="{ minRows: 1 }"
-                      resize="none"
                       show-word-limit
                       show-word-limit
                       :maxlength="1000"
                       :maxlength="1000"
                       placeholder="请输入工况"
                       placeholder="请输入工况"
@@ -752,11 +759,14 @@ const orange = computed(() => {
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
                     :prop="`reportDetails.${$index}.currentDepth`"
                     :prop="`reportDetails.${$index}.currentDepth`"
-                    :rules="{
-                      required: true,
-                      message: '请输入结束井深',
-                      trigger: ['blur']
-                    }"
+                    :rules="[
+                      {
+                        required: true,
+                        message: '请输入结束井深',
+                        trigger: ['blur']
+                      },
+                      { validator: validateLastCurrentDepth, trigger: ['change', 'blur'] }
+                    ]"
                     class="mb-0!"
                     class="mb-0!"
                   >
                   >
                     <el-input-number
                     <el-input-number
@@ -767,6 +777,7 @@ const orange = computed(() => {
                       align="left"
                       align="left"
                       placeholder="请输入结束井深"
                       placeholder="请输入结束井深"
                       :disabled="isMainFieldDisabled"
                       :disabled="isMainFieldDisabled"
+                      @input="(val) => inputCurrentDepth(val, $index)"
                     >
                     >
                       <template #suffix> m </template>
                       <template #suffix> m </template>
                     </el-input-number>
                     </el-input-number>
@@ -786,7 +797,6 @@ const orange = computed(() => {
                       v-model="row.constructionDetail"
                       v-model="row.constructionDetail"
                       type="textarea"
                       type="textarea"
                       :autosize="{ minRows: 1 }"
                       :autosize="{ minRows: 1 }"
-                      resize="none"
                       show-word-limit
                       show-word-limit
                       :maxlength="1000"
                       :maxlength="1000"
                       placeholder="请输入详细描述"
                       placeholder="请输入详细描述"

+ 78 - 1
src/views/pms/iotrydailyreport/ry-table.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
 <script setup lang="ts">
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { DICT_TYPE, realValue } from '@/utils/dict'
 import { DICT_TYPE, realValue } from '@/utils/dict'
+import { formatT } from '@/utils/formatTime'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
 
 
 const { t } = useI18n()
 const { t } = useI18n()
@@ -243,7 +244,83 @@ function handleCurrentChange(val: number) {
             <zm-table-column label="井斜(°)" prop="wellInclination" />
             <zm-table-column label="井斜(°)" prop="wellInclination" />
             <zm-table-column label="方位(°)" prop="azimuth" />
             <zm-table-column label="方位(°)" prop="azimuth" />
             <zm-table-column label="设计井身结构" prop="designWellStruct" />
             <zm-table-column label="设计井身结构" prop="designWellStruct" />
-            <zm-table-column prop="productionStatus" label="生产动态" />
+            <zm-table-column
+              prop="reportDetails"
+              label="生产动态"
+              width="500"
+              :show-overflow-tooltip="false"
+            >
+              <template #default="{ row }">
+                <div class="flex flex-col gap-1 py-1">
+                  <div
+                    v-for="(item, index) in row.reportDetails"
+                    :key="index"
+                    class="group flex flex-col gap-1 p-2 rounded-md bg-gray-200/80 hover:bg-blue-100 transition-colors"
+                  >
+                    <div class="flex items-center text-12px text-gray-500">
+                      <div class="flex items-center w-100px flex-shrink-0">
+                        <div class="i-carbon-calendar mr-1 opacity-70"></div>
+                        <span class="font-mono">{{
+                          dayjs(row.createTime).format('YYYY-MM-DD')
+                        }}</span>
+                      </div>
+
+                      <div class="flex items-center flex-1 min-w-0 px-2 ml-1">
+                        <span class="text-gray-400 mr-1 flex-shrink-0">工况:</span>
+                        <el-tooltip
+                          :content="item.currentOperation"
+                          placement="top"
+                          :disabled="!item.currentOperation"
+                          popper-class="max-w-100"
+                        >
+                          <span class="truncate text-gray-700 font-600">{{
+                            item.currentOperation || '-'
+                          }}</span>
+                        </el-tooltip>
+                      </div>
+
+                      <div class="flex items-center justify-end w-120px flex-shrink-0 ml-auto">
+                        <span class="text-gray-400 mr-1">结束井深:</span>
+                        <span class="font-bold text-blue-600 font-mono">{{
+                          item.currentDepth
+                        }}</span>
+                        <span class="ml-0.5 text-10px">m</span>
+                      </div>
+                    </div>
+
+                    <div class="flex items-center text-12px gap-x-3">
+                      <div class="flex items-center w-100px flex-shrink-0 text-gray-400 italic">
+                        <span>{{ formatT(item.startTime) }}-{{ formatT(item.endTime) }}</span>
+                      </div>
+
+                      <div class="flex items-center flex-1 min-w-0">
+                        <span class="text-gray-400 mr-2 font-bold flex-shrink-0">详情:</span>
+                        <el-tooltip
+                          effect="dark"
+                          :content="item.constructionDetail"
+                          placement="top"
+                          popper-class="max-w-100"
+                        >
+                          <span
+                            class="truncate text-gray-600 cursor-help group-hover:text-blue-700 transition-colors"
+                          >
+                            {{ item.constructionDetail || '-' }}
+                          </span>
+                        </el-tooltip>
+                      </div>
+
+                      <div class="w-60px flex-shrink-0 text-right">
+                        <span
+                          class="px-1.5 py-0.5 rounded bg-gray-100 group-hover:bg-blue-100 text-gray-500 group-hover:text-blue-600 transition-colors"
+                        >
+                          {{ item.duration }}H
+                        </span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </zm-table-column>
             <zm-table-column prop="contractName" label="项目" />
             <zm-table-column prop="contractName" label="项目" />
             <zm-table-column prop="drillingWorkingTime" label="进尺工作时间(H)" />
             <zm-table-column prop="drillingWorkingTime" label="进尺工作时间(H)" />
             <zm-table-column prop="otherProductionTime" label="其它生产时间(H)" />
             <zm-table-column prop="otherProductionTime" label="其它生产时间(H)" />

+ 5 - 4
src/views/pms/iotrydailyreport/ry-xj-form.vue

@@ -376,7 +376,8 @@ const handleAudit = async (auditStatus: 20 | 30) => {
     await IotRyDailyReportApi.approvalIotRyDailyReport({
     await IotRyDailyReportApi.approvalIotRyDailyReport({
       id: form.value.id!,
       id: form.value.id!,
       auditStatus,
       auditStatus,
-      opinion: form.value.opinion!
+      opinion: form.value.opinion!,
+      constructionBrief: form.value.constructionBrief
     })
     })
     message.success(auditStatus === 20 ? '通过成功' : '拒绝成功')
     message.success(auditStatus === 20 ? '通过成功' : '拒绝成功')
     emits('update:visible', false)
     emits('update:visible', false)
@@ -645,7 +646,7 @@ const orange = computed(() => {
                 "
                 "
               />
               />
 
 
-              <ZmTableColumn :width="160" label="开始时间" prop="startTime">
+              <ZmTableColumn :width="130" label="开始时间" prop="startTime">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
@@ -670,7 +671,7 @@ const orange = computed(() => {
                   </el-form-item>
                   </el-form-item>
                 </template>
                 </template>
               </ZmTableColumn>
               </ZmTableColumn>
-              <ZmTableColumn :width="160" label="结束时间" prop="endTime">
+              <ZmTableColumn :width="130" label="结束时间" prop="endTime">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"
@@ -697,7 +698,7 @@ const orange = computed(() => {
               </ZmTableColumn>
               </ZmTableColumn>
               <ZmTableColumn :width="80" label="时长(H)" prop="duration" />
               <ZmTableColumn :width="80" label="时长(H)" prop="duration" />
 
 
-              <ZmTableColumn label="工况" min-width="120">
+              <ZmTableColumn label="工况" min-width="140">
                 <template #default="{ row, $index }">
                 <template #default="{ row, $index }">
                   <el-form-item
                   <el-form-item
                     v-if="$index >= 0"
                     v-if="$index >= 0"

+ 78 - 1
src/views/pms/iotrydailyreport/ry-xj-table.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
 <script setup lang="ts">
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { DICT_TYPE, realValue } from '@/utils/dict'
 import { DICT_TYPE, realValue } from '@/utils/dict'
+import { formatT } from '@/utils/formatTime'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
 import { TableColumnCtx } from 'element-plus'
 import { TableColumnCtx } from 'element-plus'
 
 
@@ -304,7 +305,83 @@ function handleCurrentChange(val: number) {
               <zm-table-column prop="otherNptTime" label="其它非生产时间" />
               <zm-table-column prop="otherNptTime" label="其它非生产时间" />
             </zm-table-column>
             </zm-table-column>
             <zm-table-column prop="otherNptReason" label="其他非生产时间原因" />
             <zm-table-column prop="otherNptReason" label="其他非生产时间原因" />
-            <zm-table-column prop="productionStatus" label="生产动态" />
+            <zm-table-column
+              prop="reportDetails"
+              label="生产动态"
+              width="500"
+              :show-overflow-tooltip="false"
+            >
+              <template #default="{ row }">
+                <div class="flex flex-col gap-1 py-1">
+                  <div
+                    v-for="(item, index) in row.reportDetails"
+                    :key="index"
+                    class="group flex flex-col gap-1 p-2 rounded-md bg-gray-200/80 hover:bg-blue-100 transition-colors"
+                  >
+                    <div class="flex items-center text-12px text-gray-500">
+                      <div class="flex items-center w-100px flex-shrink-0">
+                        <div class="i-carbon-calendar mr-1 opacity-70"></div>
+                        <span class="font-mono">{{
+                          dayjs(row.createTime).format('YYYY-MM-DD')
+                        }}</span>
+                      </div>
+
+                      <div class="flex items-center flex-1 min-w-0 px-2 ml-1">
+                        <span class="text-gray-400 mr-1 flex-shrink-0">工况:</span>
+                        <el-tooltip
+                          :content="item.currentOperation"
+                          placement="top"
+                          :disabled="!item.currentOperation"
+                          popper-class="max-w-100"
+                        >
+                          <span class="truncate text-gray-700 font-600">{{
+                            item.currentOperation || '-'
+                          }}</span>
+                        </el-tooltip>
+                      </div>
+
+                      <!-- <div class="flex items-center justify-end w-120px flex-shrink-0 ml-auto">
+                        <span class="text-gray-400 mr-1">结束井深:</span>
+                        <span class="font-bold text-blue-600 font-mono">{{
+                          item.currentDepth
+                        }}</span>
+                        <span class="ml-0.5 text-10px">m</span>
+                      </div> -->
+                    </div>
+
+                    <div class="flex items-center text-12px gap-x-3">
+                      <div class="flex items-center w-100px flex-shrink-0 text-gray-400 italic">
+                        <span>{{ formatT(item.startTime) }}-{{ formatT(item.endTime) }}</span>
+                      </div>
+
+                      <div class="flex items-center flex-1 min-w-0">
+                        <span class="text-gray-400 mr-2 font-bold flex-shrink-0">详情:</span>
+                        <el-tooltip
+                          effect="dark"
+                          :content="item.constructionDetail"
+                          placement="top"
+                          popper-class="max-w-100"
+                        >
+                          <span
+                            class="truncate text-gray-600 cursor-help group-hover:text-blue-700 transition-colors"
+                          >
+                            {{ item.constructionDetail || '-' }}
+                          </span>
+                        </el-tooltip>
+                      </div>
+
+                      <div class="w-60px flex-shrink-0 text-right">
+                        <span
+                          class="px-1.5 py-0.5 rounded bg-gray-100 group-hover:bg-blue-100 text-gray-500 group-hover:text-blue-600 transition-colors"
+                        >
+                          {{ item.duration }}H
+                        </span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </zm-table-column>
             <zm-table-column prop="contractName" label="项目" />
             <zm-table-column prop="contractName" label="项目" />
             <zm-table-column prop="totalStaffNum" label="全员数量" />
             <zm-table-column prop="totalStaffNum" label="全员数量" />
             <zm-table-column
             <zm-table-column