index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <script setup lang="ts">
  2. import { FiveIotProjectDailyReportApi } from '@/api/pms/fiveconstructiondailyreport'
  3. import { useUserStore } from '@/store/modules/user'
  4. import { rangeShortcuts } from '@/utils/formatTime'
  5. import { useDebounceFn } from '@vueuse/core'
  6. import ConstructionDailyReportDrawer from './components/ConstructionDailyReportDrawer.vue'
  7. import ConstructionDailyReportTable from './components/ConstructionDailyReportTable.vue'
  8. import type {
  9. ConstructionDailyReportQuery,
  10. ConstructionDailyReportRow
  11. } from './components/report-config'
  12. defineOptions({ name: 'ConstructionDailyReport' })
  13. const userStore = useUserStore()
  14. const deptId = userStore.getUser.deptId
  15. const initQuery: ConstructionDailyReportQuery = {
  16. pageNo: 1,
  17. pageSize: 10,
  18. deptId
  19. }
  20. const query = ref<ConstructionDailyReportQuery>({ ...initQuery })
  21. const list = ref<ConstructionDailyReportRow[]>([])
  22. const total = ref(0)
  23. const loading = ref(false)
  24. const visible = ref(false)
  25. const formRef = ref<InstanceType<typeof ConstructionDailyReportDrawer>>()
  26. const route = useRoute()
  27. const loadList = useDebounceFn(async () => {
  28. loading.value = true
  29. try {
  30. const data = await FiveIotProjectDailyReportApi.getIotProjectDailyReportPage(query.value as any)
  31. list.value = data.list ?? []
  32. total.value = data.total ?? 0
  33. } finally {
  34. loading.value = false
  35. }
  36. }, 200)
  37. function handleQuery(setPage = true) {
  38. if (setPage) {
  39. query.value.pageNo = 1
  40. }
  41. loadList()
  42. }
  43. function resetQuery() {
  44. query.value = { ...initQuery }
  45. handleQuery()
  46. }
  47. function handleSizeChange(value: number) {
  48. query.value.pageSize = value
  49. handleQuery()
  50. }
  51. function handleCurrentChange(value: number) {
  52. query.value.pageNo = value
  53. loadList()
  54. }
  55. function handleOpenForm(id: number, type: 'edit' | 'readonly') {
  56. formRef.value?.handleOpenForm(id, type)
  57. }
  58. watch(
  59. [
  60. () => query.value.deptId,
  61. () => query.value.projectName,
  62. () => query.value.wellName,
  63. () => query.value.createTime
  64. ],
  65. () => handleQuery(),
  66. { immediate: true }
  67. )
  68. onMounted(() => {
  69. if (route.query.id) {
  70. handleOpenForm(Number(route.query.id), 'edit')
  71. }
  72. })
  73. </script>
  74. <template>
  75. <div
  76. class="grid grid-cols-[auto_1fr] grid-rows-[62px_1fr] gap-4 h-[calc(100vh-20px-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height))]"
  77. >
  78. <DeptTreeSelect
  79. v-model="query.deptId"
  80. :top-id="158"
  81. :deptId="deptId"
  82. :show-title="false"
  83. class="row-span-2"
  84. />
  85. <el-form
  86. size="default"
  87. class="bg-white dark:bg-[#1d1e1f] rounded-lg shadow px-8 gap-8 flex items-center justify-between"
  88. >
  89. <div class="flex items-center gap-8">
  90. <el-form-item label="项目">
  91. <el-input
  92. v-model="query.projectName"
  93. placeholder="请输入项目名称"
  94. clearable
  95. @keyup.enter="handleQuery()"
  96. class="!w-240px"
  97. />
  98. </el-form-item>
  99. <el-form-item label="生产任务">
  100. <el-input
  101. v-model="query.wellName"
  102. placeholder="请输入生产任务"
  103. clearable
  104. @keyup.enter="handleQuery()"
  105. class="!w-240px"
  106. />
  107. </el-form-item>
  108. <el-form-item label="创建时间">
  109. <el-date-picker
  110. v-model="query.createTime"
  111. value-format="YYYY-MM-DD HH:mm:ss"
  112. type="daterange"
  113. start-placeholder="开始日期"
  114. end-placeholder="结束日期"
  115. :shortcuts="rangeShortcuts"
  116. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  117. class="!w-260px"
  118. />
  119. </el-form-item>
  120. </div>
  121. <el-form-item>
  122. <el-button type="primary" @click="handleQuery()">
  123. <Icon icon="ep:search" class="mr-5px" /> 搜索
  124. </el-button>
  125. <el-button @click="resetQuery">
  126. <Icon icon="ep:refresh" class="mr-5px" /> 重置
  127. </el-button>
  128. </el-form-item>
  129. </el-form>
  130. <ConstructionDailyReportTable
  131. :list="list"
  132. :loading="loading"
  133. :total="total"
  134. :page-no="query.pageNo"
  135. :page-size="query.pageSize"
  136. @size-change="handleSizeChange"
  137. @current-change="handleCurrentChange"
  138. >
  139. <template #action="{ row }">
  140. <el-button
  141. v-if="row.status === 0"
  142. link
  143. type="primary"
  144. @click="handleOpenForm(row.id!, 'edit')"
  145. v-hasPermi="['pms:iot-five-daily-report:update']"
  146. >
  147. 填报
  148. </el-button>
  149. <el-button
  150. v-else-if="row.status === 1"
  151. link
  152. type="success"
  153. @click="handleOpenForm(row.id!, 'readonly')"
  154. v-hasPermi="['pms:iot-five-daily-report:query']"
  155. >
  156. 查看
  157. </el-button>
  158. </template>
  159. </ConstructionDailyReportTable>
  160. </div>
  161. <ConstructionDailyReportDrawer
  162. ref="formRef"
  163. v-model:visible="visible"
  164. :load-list="loadList"
  165. />
  166. </template>
  167. <style scoped>
  168. :deep(.el-form-item) {
  169. margin-bottom: 0;
  170. }
  171. </style>