index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <script lang="ts" setup>
  2. import { IotRyDailyReportApi } from '@/api/pms/iotrydailyreport'
  3. import { useUserStore } from '@/store/modules/user'
  4. import download from '@/utils/download'
  5. import { rangeShortcuts } from '@/utils/formatTime'
  6. import { useDebounceFn } from '@vueuse/core'
  7. import ryForm from './ry-form.vue'
  8. import dayjs from 'dayjs'
  9. import RyTable from './ry-table.vue'
  10. defineOptions({ name: 'IotRyDailyReport' })
  11. const { t } = useI18n()
  12. const route = useRoute()
  13. const message = useMessage()
  14. const id = useUserStore().getUser.deptId
  15. const deptId = id
  16. interface Query {
  17. deptId?: number
  18. contractName?: string
  19. taskName?: string
  20. createTime?: string[]
  21. pageNo: number
  22. pageSize: number
  23. nonProductFlag?: string
  24. projectClassification: string
  25. }
  26. const initQuery: Query = {
  27. pageNo: 1,
  28. pageSize: 10,
  29. projectClassification: '1',
  30. deptId: route.query.deptId ? Number(route.query.deptId) : id,
  31. createTime: route.query.createTime
  32. ? (route.query.createTime as string[])
  33. : [...rangeShortcuts[2].value().map((item) => dayjs(item).format('YYYY-MM-DD HH:mm:ss'))],
  34. nonProductFlag: route.query.nonProductFlag ? (route.query.nonProductFlag as string) : undefined
  35. }
  36. const query = ref<Query>({ ...initQuery })
  37. const list = ref<any[]>([])
  38. const total = ref(0)
  39. const loading = ref(false)
  40. const loadList = useDebounceFn(async function () {
  41. loading.value = true
  42. try {
  43. const data = await IotRyDailyReportApi.getIotRyDailyReportPage(query.value)
  44. list.value = data.list
  45. total.value = data.total
  46. } finally {
  47. loading.value = false
  48. }
  49. })
  50. function handleSizeChange(val: number) {
  51. query.value.pageSize = val
  52. handleQuery()
  53. }
  54. function handleCurrentChange(val: number) {
  55. query.value.pageNo = val
  56. loadList()
  57. }
  58. function handleQuery(setPage = true) {
  59. if (setPage) {
  60. query.value.pageNo = 1
  61. }
  62. loadList()
  63. }
  64. function resetQuery() {
  65. query.value = { ...initQuery }
  66. handleQuery()
  67. }
  68. watch(
  69. [
  70. () => query.value.deptId,
  71. () => query.value.contractName,
  72. () => query.value.taskName,
  73. () => query.value.createTime,
  74. () => query.value.nonProductFlag
  75. ],
  76. () => {
  77. handleQuery()
  78. },
  79. { immediate: true }
  80. )
  81. const exportLoading = ref(false)
  82. async function handleExport() {
  83. try {
  84. await message.exportConfirm()
  85. exportLoading.value = true
  86. const res = await IotRyDailyReportApi.exportIotRyDailyReport(query.value)
  87. download.excel(res, '瑞鹰钻井日报.xlsx')
  88. } finally {
  89. exportLoading.value = false
  90. }
  91. }
  92. const handleDelete = async (id: number) => {
  93. try {
  94. await message.delConfirm()
  95. await IotRyDailyReportApi.deleteIotRyDailyReport(id)
  96. message.success(t('common.delSuccess'))
  97. await loadList()
  98. } catch {}
  99. }
  100. const visible = ref(false)
  101. const formRef = ref()
  102. function handleOpenForm(id: number, type: 'edit' | 'readonly') {
  103. if (formRef.value) {
  104. formRef.value.handleOpenForm(id, type)
  105. }
  106. }
  107. </script>
  108. <template>
  109. <div
  110. class="grid grid-cols-[auto_1fr] grid-rows-[48px_1fr_auto] gap-x-4 gap-y-3 h-[calc(100vh-20px-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height))]"
  111. >
  112. <DeptTreeSelect
  113. :top-id="158"
  114. :deptId="deptId"
  115. v-model="query.deptId"
  116. :show-title="false"
  117. class="row-span-3"
  118. />
  119. <!-- <div class="p-4 bg-white dark:bg-[#1d1e1f] shadow rounded-lg row-span-3"> </div> -->
  120. <el-form
  121. size="default"
  122. class="bg-white dark:bg-[#1d1e1f] rounded-lg shadow px-6 gap-8 flex items-center justify-between"
  123. >
  124. <div class="flex items-center gap-8">
  125. <el-form-item label="项目">
  126. <el-input
  127. v-model="query.contractName"
  128. placeholder="请输入项目"
  129. clearable
  130. @keyup.enter="handleQuery()"
  131. class="!w-180px"
  132. />
  133. </el-form-item>
  134. <el-form-item label="任务">
  135. <el-input
  136. v-model="query.taskName"
  137. placeholder="请输入任务"
  138. clearable
  139. @keyup.enter="handleQuery()"
  140. class="!w-180px"
  141. />
  142. </el-form-item>
  143. <el-form-item label="创建时间" prop="createTime">
  144. <el-date-picker
  145. v-model="query.createTime"
  146. value-format="YYYY-MM-DD HH:mm:ss"
  147. type="daterange"
  148. start-placeholder="开始日期"
  149. end-placeholder="结束日期"
  150. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  151. class="!w-220px"
  152. :shortcuts="rangeShortcuts"
  153. />
  154. </el-form-item>
  155. <el-form-item label="非生产时效" prop="nonProductFlag">
  156. <el-switch v-model="query.nonProductFlag" active-value="Y" inactive-value="N" />
  157. </el-form-item>
  158. </div>
  159. <el-form-item>
  160. <el-button type="primary" @click="handleQuery()">
  161. <Icon icon="ep:search" class="mr-5px" /> 搜索
  162. </el-button>
  163. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" />重置</el-button>
  164. <!-- <el-button
  165. type="primary"
  166. plain
  167. @click="openForm('create')"
  168. v-hasPermi="['pms:iot-ry-daily-report:create']"
  169. >
  170. <Icon icon="ep:plus" class="mr-5px" /> 新增
  171. </el-button> -->
  172. <el-button
  173. type="success"
  174. plain
  175. @click="handleExport"
  176. :loading="exportLoading"
  177. v-hasPermi="['pms:iot-ry-daily-report:export']"
  178. >
  179. <Icon icon="ep:download" class="mr-5px" /> 导出
  180. </el-button>
  181. </el-form-item>
  182. </el-form>
  183. <ry-table
  184. :list="list"
  185. :total="total"
  186. :loading="loading"
  187. :page-no="query.pageNo"
  188. :page-size="query.pageSize"
  189. is-index
  190. @current-change="handleCurrentChange"
  191. @size-change="handleSizeChange"
  192. >
  193. <template #action="{ row }">
  194. <el-button
  195. link
  196. type="primary"
  197. @click="handleOpenForm(row.id, 'edit')"
  198. v-hasPermi="['pms:iot-ry-daily-report:update']"
  199. >
  200. 编辑
  201. </el-button>
  202. <el-button
  203. link
  204. type="danger"
  205. @click="handleDelete(row.id)"
  206. v-hasPermi="['pms:iot-ry-daily-report:delete']"
  207. >
  208. 删除
  209. </el-button>
  210. </template>
  211. </ry-table>
  212. <div class="p-2 bg-white dark:bg-[#1d1e1f] rounded-lg shadow flex flex-col gap-2">
  213. <el-alert
  214. class="h-8!"
  215. title="当日油耗大于9000升&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;红色预警"
  216. type="error"
  217. show-icon
  218. :closable="false"
  219. />
  220. <el-alert
  221. class="h-8!"
  222. title="进尺工作时间+其它生产时间+非生产时间=24H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否则橙色预警"
  223. type="warning"
  224. show-icon
  225. :closable="false"
  226. />
  227. </div>
  228. </div>
  229. <ry-form
  230. v-model:visible="visible"
  231. type="edit"
  232. ref="formRef"
  233. :load-list="loadList"
  234. no-validate-status
  235. />
  236. </template>
  237. <style scoped>
  238. :deep(.el-form-item) {
  239. margin-bottom: 0;
  240. }
  241. </style>