Просмотр исходного кода

✨ feat: 设备状态列表支持手动生成运行记录

Zimo 1 неделя назад
Родитель
Сommit
5b18f89a7a

+ 12 - 4
src/api/pms/iotopeationfill/plan/index.ts

@@ -8,12 +8,12 @@ export interface IotOperationPlanVO {
   planCycle: number // 周期
   planUnit: string // 单位
   charge: string // 负责人
-  charges: [],
-  chargeName: string,
+  charges: []
+  chargeName: string
   deviceIds: string // 设备
   remark: string // 备注
   deptId: number // 部门id
-  planDevList:[]
+  planDevList: []
 }
 
 // 巡检计划 API
@@ -47,11 +47,19 @@ export const IotOperationPlanApi = {
   exportIotOperationPlan: async (params) => {
     return await request.download({ url: `/rq/iot-operation-plan/export-excel`, params })
   },
-  updateIotOperationStatus : (id: number, status: number) => {
+  updateIotOperationStatus: (id: number, status: number) => {
     const data = {
       id,
       status
     }
     return request.put({ url: '/rq/iot-operation-plan/update-status', data: data })
+  },
+
+  // 根据设备手动生成所在小部门当天的运行记录
+  manualGenerateByDeviceId: async (deviceId: number) => {
+    return await request.post<string>({
+      url: '/rq/iot-operation-plan/manual-generate',
+      params: { deviceId }
+    })
   }
 }

+ 27 - 1
src/views/pms/device/statuslog/DeviceStatus.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
+import { IotOperationPlanApi } from '@/api/pms/iotopeationfill/plan'
 import { useUserStore } from '@/store/modules/user'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import download from '@/utils/download'
@@ -21,6 +22,7 @@ interface QueryParams extends PageParam {
 }
 
 const { t } = useI18n()
+const message = useMessage()
 const { push } = useRouter()
 const { ZmTable, ZmTableColumn } = useTableComponents<IotDeviceVO>()
 
@@ -44,6 +46,7 @@ const queryParams = reactive<QueryParams>({ ...initQuery })
 const queryFormRef = ref()
 const loading = ref(false)
 const exportLoading = ref(false)
+const generatingDeviceId = ref<number>()
 const ifShow = ref(false)
 const list = ref<IotDeviceVO[]>([])
 const total = ref(0)
@@ -129,6 +132,20 @@ const handleView = async (deviceId: number) => {
   })
 }
 
+const handleGenerateRecord = async (row: IotDeviceVO) => {
+  try {
+    await message.confirm(
+      `将为“${row.deviceName}”所属部门重新生成今日运行记录,如已有记录将先删除再生成,是否继续?`
+    )
+    generatingDeviceId.value = row.id
+    const result = await IotOperationPlanApi.manualGenerateByDeviceId(row.id)
+    message.success(result)
+  } catch {
+  } finally {
+    generatingDeviceId.value = undefined
+  }
+}
+
 const handleExport = async () => {
   exportLoading.value = true
   try {
@@ -300,7 +317,7 @@ onMounted(() => {
                   <dict-tag :type="DICT_TYPE.PMS_DEVICE_STATUS" :value="row.deviceStatus" />
                 </template>
               </ZmTableColumn>
-              <ZmTableColumn :label="t('deviceStatus.operation')" width="150" fixed="right" action>
+              <ZmTableColumn :label="t('deviceStatus.operation')" width="230" fixed="right" action>
                 <template #default="{ row }">
                   <el-button
                     link
@@ -309,6 +326,15 @@ onMounted(() => {
                     v-hasPermi="['rq:iot-device:query']">
                     {{ t('deviceStatus.adjustmentRecords') }}
                   </el-button>
+                  <el-button
+                    link
+                    type="primary"
+                    :loading="generatingDeviceId === row.id"
+                    :disabled="generatingDeviceId !== undefined && generatingDeviceId !== row.id"
+                    @click="handleGenerateRecord(row)"
+                    v-hasPermi="['rq:iot-operation-plan:create']">
+                    生成记录
+                  </el-button>
                 </template>
               </ZmTableColumn>
             </ZmTable>

+ 21 - 16
src/views/pms/iotopeationfill/index.vue

@@ -283,6 +283,7 @@
 
 <script setup lang="ts">
 import type { FormInstance } from 'element-plus'
+import dayjs from 'dayjs'
 import { dateFormatter } from '@/utils/formatTime'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { onMounted, ref } from 'vue'
@@ -400,10 +401,26 @@ const handleDeptNodeClick = async (row: Tree) => {
   queryParams.pageNo = 1
   await getList()
 }
+
+const normalizeCreateTime = () => {
+  if (!Array.isArray(queryParams.createTime) || queryParams.createTime.length !== 2) return
+
+  const [startTime, endTime] = queryParams.createTime
+  const start = dayjs(startTime)
+  const end = dayjs(endTime)
+  if (!start.isValid() || !end.isValid()) return
+
+  queryParams.createTime = [
+    start.startOf('day').format('YYYY-MM-DD HH:mm:ss'),
+    end.endOf('day').format('YYYY-MM-DD HH:mm:ss')
+  ]
+}
+
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
+    normalizeCreateTime()
     const data = await IotOpeationFillApi.getOperationRecordPage(queryParams)
     list.value = data.list
     total.value = data.total
@@ -441,22 +458,10 @@ const openWrite = (id?: string) => {
 /** 初始化 **/
 onMounted(async () => {
   // 计算近一周时间
-  const end = new Date()
-  const start = new Date()
-  start.setTime(start.getTime() - 7 * 24 * 60 * 60 * 1000)
-
-  // 格式化日期为后端需要的格式
-  const formatDate = (date: Date) => {
-    const year = date.getFullYear()
-    const month = String(date.getMonth() + 1).padStart(2, '0')
-    const day = String(date.getDate()).padStart(2, '0')
-    const hours = String(date.getHours()).padStart(2, '0')
-    const minutes = String(date.getMinutes()).padStart(2, '0')
-    const seconds = String(date.getSeconds()).padStart(2, '0')
-    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
-  }
-
-  queryParams.createTime = [formatDate(start), formatDate(end)]
+  queryParams.createTime = [
+    dayjs().subtract(7, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
+    dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')
+  ]
 
   if (deptId != null) {
     queryParams.deptId = deptId