Zimo 22 цаг өмнө
parent
commit
45be6bdb03

+ 8 - 5
src/components/ZmTable/ZmTableColumn.vue

@@ -1,5 +1,5 @@
 <script lang="ts" setup generic="T">
-import type { TableColumnCtx } from 'element-plus'
+import { type TableColumnCtx } from 'element-plus'
 import { computed, useAttrs, inject, ref } from 'vue'
 import { Filter } from '@element-plus/icons-vue'
 import { SortOrder, TableContextKey } from './token'
@@ -10,6 +10,7 @@ interface Props extends /* @vue-ignore */ Partial<Omit<TableColumnCtx<T>, 'prop'
   zmFilterable?: boolean
   filterModelValue?: any
   realValue?: (value: any) => any
+  coverFormatter?: boolean
 }
 
 const emits = defineEmits(['update:filterModelValue'])
@@ -27,7 +28,8 @@ const tableContext = inject(TableContextKey, {
 const defaultOptions = ref<Partial<Props>>({
   align: 'center',
   resizable: true,
-  showOverflowTooltip: true
+  showOverflowTooltip: true,
+  coverFormatter: false
 })
 
 const bindProps = computed(() => {
@@ -42,7 +44,8 @@ const bindProps = computed(() => {
     ...props,
     prop: props.prop,
     align: resolvedAlign,
-    className: (props.className ?? '') + ' ' + props.prop
+    className: (props.className ?? '') + ' ' + props.prop,
+    formatter: props.coverFormatter ? props.realValue : props.formatter
   }
 })
 
@@ -108,7 +111,7 @@ const calculativeWidth = () => {
     .map((item) => props.realValue?.(item[props.prop]) || item[props.prop])
     .filter(Boolean)
 
-  let labelWidth = getTextWidth(bindProps.value.label || '') + 38
+  let labelWidth = getTextWidth(bindProps.value.label || '') + 34
 
   if (props.zmFilterable || props.zmSortable) {
     labelWidth += 8
@@ -118,7 +121,7 @@ const calculativeWidth = () => {
   if (props.zmSortable) labelWidth += 22
 
   const maxWidth = Math.min(
-    Math.max(...values.map((value) => getTextWidth(value) + 38), labelWidth),
+    Math.max(...values.map((value) => getTextWidth(value) + 34), labelWidth),
     360
   )
 

+ 26 - 10
src/components/ZmTable/index.vue

@@ -9,6 +9,7 @@ interface Props extends /* @vue-ignore */ Partial<Omit<TableProps<T>, 'data'>> {
   sortingFields?: SortField[]
   sortFn?: (prop: string, order: SortOrder | null) => void
   customClass?: boolean
+  showBorder?: boolean
 }
 
 const props = defineProps<Props>()
@@ -27,7 +28,11 @@ const defaultOptions: Partial<Props> = {
   highlightCurrentRow: true,
   showOverflowTooltip: true,
   scrollbarAlwaysOn: false,
-  customClass: false
+  showBorder: false,
+  customClass: false,
+  tooltipOptions: {
+    popperClass: 'max-w-180'
+  }
 }
 
 const bindProps = computed(() => {
@@ -90,7 +95,7 @@ defineExpose({
   <el-table
     ref="tableRef"
     v-loading="loading"
-    :class="{ 'zm-table': !customClass }"
+    :class="{ 'zm-table': !customClass, 'show-border': showBorder }"
     v-bind="bindProps"
     :data="data"
   >
@@ -122,7 +127,10 @@ defineExpose({
 
   .el-table__cell {
     height: 52px;
-    border: none !important;
+
+    &:last-child {
+      border: none !important;
+    }
   }
 
   .el-table__header {
@@ -133,11 +141,6 @@ defineExpose({
     .el-table__cell {
       background: var(--el-fill-color-light) !important;
 
-      .cell {
-        border-right: var(--el-table-border);
-        border-color: var(--el-table-header-text-color);
-      }
-
       &:last-child {
         .cell {
           border-right: none;
@@ -147,8 +150,6 @@ defineExpose({
   }
 
   .el-table__body-wrapper {
-    margin-top: 6px;
-
     .el-table__cell {
       &:last-child {
         border-top-right-radius: 8px;
@@ -161,6 +162,21 @@ defineExpose({
       }
     }
   }
+}
+
+.zm-table:not(.show-border) {
+  .el-table__cell {
+    border: none !important;
+  }
+
+  .el-table__header {
+    .el-table__cell {
+      .cell {
+        border-right: var(--el-table-border);
+        border-color: var(--el-table-header-text-color);
+      }
+    }
+  }
 
   .el-table__row {
     &:last-child {

+ 210 - 11
src/views/pms/iotrddailyreport/index.vue

@@ -2,11 +2,22 @@
 import { IotRdDailyReportApi } from '@/api/pms/iotrddailyreport'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useUserStore } from '@/store/modules/user'
+import { DICT_TYPE, getDictOptions } from '@/utils/dict'
 import { rangeShortcuts } from '@/utils/formatTime'
 import { useDebounceFn } from '@vueuse/core'
+import IotRdDailyReportForm from './IotRdDailyReportForm.vue'
+import dayjs from 'dayjs'
+import download from '@/utils/download'
+
+defineOptions({ name: 'IotRdDailyReport' })
 
 const { t } = useI18n()
 
+const router = useRouter()
+const route = useRoute()
+
+const message = useMessage()
+
 const id = useUserStore().getUser.deptId
 
 const deptId = id
@@ -20,6 +31,12 @@ interface Query {
   pageSize: number
 }
 
+const initQuery = {
+  pageNo: 1,
+  pageSize: 10,
+  deptId: route.query.deptId ? Number(route.query.deptId) : id
+}
+
 const query = ref<Query>({
   pageNo: 1,
   pageSize: 10,
@@ -121,13 +138,64 @@ watch(
   { immediate: true }
 )
 
-const openForm = (type: 'create' | 'detail') => {}
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
 
 const exportLoading = ref(false)
 
-async function handleExport() {}
+async function handleExport() {
+  try {
+    await message.exportConfirm()
+
+    exportLoading.value = true
+    const res = await IotRdDailyReportApi.exportIotRdDailyReportDetails(query.value)
+
+    download.excel(res, '瑞都日报明细.xlsx')
+  } finally {
+    exportLoading.value = false
+  }
+}
 
 const { ZmTable, ZmTableColumn } = useTableComponents<ListItem>()
+
+function formCreateTime(row: ListItem) {
+  return dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss')
+}
+
+function realValue(type: any, value: string) {
+  const option = getDictOptions(type).find((item) => item.value === value)
+  return option?.label || value
+}
+
+function handleDetail(id: number) {
+  try {
+    router.push({
+      name: 'FillDailyReportForm',
+      params: {
+        id: id.toString(),
+        mode: 'detail'
+      }
+    })
+  } catch (error) {
+    console.error('跳转详情页面失败:', error)
+  }
+}
+
+function handleApprove(id: number) {
+  try {
+    router.push({
+      name: 'FillDailyReportForm',
+      params: {
+        id: id.toString(),
+        mode: 'approval'
+      }
+    })
+  } catch (error) {
+    console.error('跳转审批页面失败:', error)
+  }
+}
 </script>
 
 <template>
@@ -135,13 +203,7 @@ const { ZmTable, ZmTableColumn } = useTableComponents<ListItem>()
     class="grid grid-cols-[15%_1fr] grid-rows-[62px_1fr] gap-4 h-[calc(100vh-20px-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height))]"
   >
     <div class="p-4 bg-white dark:bg-[#1d1e1f] shadow rounded-lg row-span-2">
-      <DeptTreeSelect
-        :top-id="156"
-        :deptId="deptId"
-        v-model="query.deptId"
-        :init-select="false"
-        :show-title="false"
-      />
+      <DeptTreeSelect :top-id="163" :deptId="deptId" v-model="query.deptId" :show-title="false" />
     </div>
     <el-form
       size="default"
@@ -207,12 +269,149 @@ const { ZmTable, ZmTableColumn } = useTableComponents<ListItem>()
               :width="width"
               :max-height="height"
               :height="height"
-            />
+              show-border
+            >
+              <zm-table-column
+                prop="createTime"
+                label="创建时间"
+                cover-formatter
+                :real-value="formCreateTime"
+              />
+              <zm-table-column prop="deptName" label="施工队伍" />
+              <zm-table-column prop="taskName" label="任务" />
+              <zm-table-column
+                prop="rdStatus"
+                :label="t('project.status')"
+                :real-value="
+                  (row: ListItem) => realValue(DICT_TYPE.PMS_PROJECT_RD_STATUS, row.rdStatus ?? '')
+                "
+              >
+                <template #default="scope">
+                  <dict-tag
+                    :type="DICT_TYPE.PMS_PROJECT_RD_STATUS"
+                    :value="scope.row.rdStatus ?? ''"
+                  />
+                </template>
+              </zm-table-column>
+              <zm-table-column prop="productionStatus" label="当日生产动态" />
+              <zm-table-column prop="nextPlan" label="下步工作计划" />
+              <zm-table-column label="当日">
+                <zm-table-column prop="cumulativeWorkingWell" label="施工井" />
+                <zm-table-column prop="cumulativeWorkingLayers" label="施工层" />
+                <zm-table-column prop="dailyPumpTrips" label="泵车台次" />
+                <zm-table-column prop="dailyToolsSand" label="仪表/混砂" />
+              </zm-table-column>
+              <zm-table-column prop="runCount" label="趟数" />
+              <zm-table-column prop="bridgePlug" label="桥塞" />
+              <zm-table-column prop="waterVolume" label="水方量" />
+              <zm-table-column prop="hourCount" label="时间(H)" />
+              <zm-table-column prop="dailyFuel" label="油耗(L)" />
+              <zm-table-column prop="externalRental" label="外租设备" />
+              <zm-table-column prop="malfunction" label="故障情况" />
+              <zm-table-column prop="faultDowntime" label="故障误工(H)" />
+              <zm-table-column
+                prop="nonProductionRate"
+                label="非生产时效"
+                cover-formatter
+                :real-value="(row) => (Number(row.nonProductionRate ?? 0) * 100).toFixed(2) + '%'"
+              />
+              <zm-table-column label="非生产时间">
+                <zm-table-column prop="accidentTime" label="工程质量" />
+                <zm-table-column prop="repairTime" label="设备故障" />
+                <zm-table-column prop="selfStopTime" label="设备保养" />
+                <zm-table-column prop="complexityTime" label="技术受限" />
+                <zm-table-column prop="relocationTime" label="生产配合" />
+                <zm-table-column prop="rectificationTime" label="生产组织" />
+                <zm-table-column prop="waitingStopTime" label="不可抗力" />
+                <zm-table-column prop="winterBreakTime" label="待命" />
+                <zm-table-column prop="partyaDesign" label="甲方设计" />
+                <zm-table-column prop="partyaPrepare" label="甲方准备" />
+                <zm-table-column prop="partyaResource" label="甲方资源" />
+                <zm-table-column prop="otherNptTime" label="其它非生产时间" />
+              </zm-table-column>
+              <zm-table-column prop="otherNptReason" label="其他非生产时间原因" />
+              <zm-table-column prop="nonProductFlag" label="非生产时间填写">
+                <template #default="scope">
+                  <el-tag
+                    :type="
+                      scope.row.nonProductFlag || scope.row.processInstanceId === '2'
+                        ? 'success'
+                        : 'danger'
+                    "
+                  >
+                    {{
+                      scope.row.nonProductFlag || scope.row.processInstanceId === '2'
+                        ? '已填写'
+                        : '未填写'
+                    }}
+                  </el-tag>
+                </template>
+              </zm-table-column>
+              <zm-table-column prop="contractName" label="项目" />
+              <zm-table-column prop="timeRange" label="时间节点" />
+              <zm-table-column prop="auditStatus" label="审批状态">
+                <template #default="scope">
+                  <el-tag v-if="scope.row.auditStatus === 0" type="info">
+                    {{ '待提交' }}
+                  </el-tag>
+                  <el-tag v-else-if="scope.row.auditStatus === 10">
+                    {{ '待审批' }}
+                  </el-tag>
+                  <el-tag v-else-if="scope.row.auditStatus === 20" type="success">
+                    {{ '审批通过' }}
+                  </el-tag>
+                  <el-tag v-else-if="scope.row.auditStatus === 30" type="danger">
+                    {{ '审批拒绝' }}
+                  </el-tag>
+                </template>
+              </zm-table-column>
+              <zm-table-column label="操作" width="120" fixed="right">
+                <template #default="scope">
+                  <el-button
+                    link
+                    type="success"
+                    @click="handleDetail(scope.row.id)"
+                    v-hasPermi="['pms:iot-rd-daily-report:query']"
+                  >
+                    查看
+                  </el-button>
+                  <el-button
+                    link
+                    type="warning"
+                    @click="handleApprove(scope.row.id)"
+                    v-hasPermi="['pms:iot-rd-daily-report:update']"
+                    v-if="scope.row.auditStatus === 10"
+                  >
+                    审批
+                  </el-button>
+                </template>
+              </zm-table-column>
+            </zm-table>
           </template>
         </el-auto-resizer>
       </div>
+      <div class="h-10 mt-4 flex items-center justify-end">
+        <el-pagination
+          size="default"
+          v-show="total > 0"
+          v-model:current-page="query.pageNo"
+          v-model:page-size="query.pageSize"
+          :background="true"
+          :page-sizes="[12, 20, 30, 50, 100]"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
     </div>
   </div>
+
+  <IotRdDailyReportForm ref="formRef" @success="loadList" />
 </template>
 
-<style></style>
+<style scoped>
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+</style>

+ 0 - 0
src/views/pms/iotrddailyreport/index copy.vue → src/views/pms/iotrddailyreport/index1.vue