Преглед изворни кода

feat(OA集成): 添加报告状态更新和流程撤销功能

添加管道和锅炉报告状态更新接口及页面
在报告审核/审批阶段增加撤销OA流程功能
为ReportItemVO添加summaryId字段存储OA流程ID
xuzhancheng пре 2 недеља
родитељ
комит
c81ce3b3df

+ 11 - 0
yudao-ui-admin-vue3/src/api/pressure2/boilertaskorder/index.ts

@@ -152,6 +152,7 @@ export interface ReportItemVO {
   attachment: string // 附件
   instructionId: string // 关联操作指导书ID
   itemPartId : string
+  summaryId?: string // OA系统流程ID
 }
 
 // 我的任务单详情VO
@@ -724,4 +725,14 @@ export const BoilerTaskOrderApi = {
     return await request.download({ url: '/pressure2/boiler-task-order/issue-report/use-logo/preview', params })
   },
 
+  // 撤销OA流程
+  cancelOAFlow: async (summaryId: string) => {
+    return await request.post({ url: `/pressure2/external-oa/cancleflow/${summaryId}` })
+  },
+
+  // 退回OA流程
+  returnOAFlow: async (data: any) => {
+    return await request.post({ url: `/pressure2/external-oa/returnFlow`, data })
+  },
+
 }

+ 6 - 0
yudao-ui-admin-vue3/src/api/pressure2/pipetaskorder/index.ts

@@ -122,6 +122,7 @@ export interface ReportItemVO {
   attachment: string // 附件
   instructionId: string // 关联操作指导书ID
   itemPartId : string
+  summaryId?: string // OA系统流程ID
 }
 
 // 我的任务单详情VO
@@ -710,5 +711,10 @@ export const PipeTaskOrderApi = {
     return await request.download({ url: '/pressure2/pipe-task-order/issue-report/use-logo/preview', params })
   },
 
+  // 撤销OA流程
+  cancelOAFlow: async (summaryId: string) => {
+    return await request.post({ url: `/pressure2/external-oa/cancleflow/${summaryId}` })
+  },
+
 
 }

+ 11 - 0
yudao-ui-admin-vue3/src/api/pressure2/reportupdate/index.ts

@@ -0,0 +1,11 @@
+import request from '@/config/axios'
+
+// 更新管道报告状态(从OA轮询)
+export const updatePipeReport = () => {
+  return request.get({ url: '/pressure2/external-oa/updatePipeReport' })
+}
+
+// 更新锅炉报告状态(从OA轮询)
+export const updateBoilerReport = () => {
+  return request.get({ url: '/pressure2/external-oa/updateBoilerReport' })
+}

+ 44 - 1
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/components/StatusOperationPanel.vue

@@ -676,6 +676,13 @@
           :disabled="checkerIsLoginUser"
           size="small"
         >{{ selectedItem.reportType === PressureReportType['SUGGUESTION'] ? '编制意见书' : '填写记录' }}</el-button>
+        <!-- 撤销流程:报告审核或审批阶段,有OA流程ID且当前用户是发起人时显示 -->
+        <el-button
+          v-if="isCanCancelFlow"
+          type="warning"
+          @click="handleCancelFlow"
+          size="small"
+        >撤销流程</el-button>
       </template>
     </div>
   </Teleport>
@@ -1226,7 +1233,43 @@ const isCanEditReport = computed(
     props.selectedItem.taskStatus === PressureCheckerMyTaskStatus['REPORT_INPUT']
 )
 
-// 判断“填写结果”按钮是否显示
+// 判断"撤销流程"按钮是否显示:报告审核或审批阶段,且有OA流程ID,且当前用户是发起人
+const isCanCancelFlow = computed(() => {
+  if (!props.selectedItem) return false
+  const isAuditOrApprove = [
+    PressureCheckerMyTaskStatus['REPORT_AUDIT'],
+    PressureCheckerMyTaskStatus['REPORT_APPROVE']
+  ].includes(props.selectedItem.taskStatus)
+  if (!isAuditOrApprove) return false
+  if (!props.selectedItem.summaryId) return false
+  return !checkerIsLoginUser.value
+})
+
+// 撤销流程
+const handleCancelFlow = async () => {
+  if (!props.selectedItem?.summaryId) {
+    ElMessage.warning('未找到OA流程ID,无法撤销')
+    return
+  }
+  ElMessageBox.confirm('确定要撤销该流程吗?撤销后报告将回到报告编制阶段,您可以重新发起。', '撤销流程', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    try {
+      const result = await BoilerTaskOrderApi.cancelOAFlow(props.selectedItem.summaryId)
+      if (result) {
+        ElMessage.success('流程已撤销')
+        emit('refresh')
+      }
+    } catch (error) {
+      console.error('撤销流程失败:', error)
+      ElMessage.error('撤销流程失败,请稍后重试')
+    }
+  }).catch(() => {})
+}
+
+// 判断"填写结果"按钮是否显示
 const isCanEditRecordResult = computed(() => {
   // 非我的任务详情页面,不显示
   if ('BoilerCheckerTaskDetail' !== routeName.value) return false

+ 44 - 1
yudao-ui-admin-vue3/src/views/pressure2/pipechecker/components/StatusOperationPanel.vue

@@ -676,6 +676,13 @@
           :disabled="checkerIsLoginUser"
           size="small"
         >{{ selectedItem.reportType === PressureReportType['SUGGUESTION'] ? '编制意见书' : '填写记录' }}</el-button>
+        <!-- 撤销流程:报告审核或审批阶段,有OA流程ID且当前用户是发起人时显示 -->
+        <el-button
+          v-if="isCanCancelFlow"
+          type="warning"
+          @click="handleCancelFlow"
+          size="small"
+        >撤销流程</el-button>
 <!--        <el-button v-if="isCanSyncReportData" type="primary" @click="handleSyncReportData" :disabled="checkerIsLoginUser" size="small"-->
 <!--        >同步报表</el-button>-->
       </template>
@@ -1212,7 +1219,43 @@ const isCanEditReport = computed(
     props.selectedItem.taskStatus === PressureCheckerMyTaskStatus['REPORT_INPUT']
 )
 
-// 判断“填写结果”按钮是否显示
+// 判断"撤销流程"按钮是否显示:报告审核或审批阶段,且有OA流程ID,且当前用户是发起人
+const isCanCancelFlow = computed(() => {
+  if (!props.selectedItem) return false
+  const isAuditOrApprove = [
+    PressureCheckerMyTaskStatus['REPORT_AUDIT'],
+    PressureCheckerMyTaskStatus['REPORT_APPROVE']
+  ].includes(props.selectedItem.taskStatus)
+  if (!isAuditOrApprove) return false
+  if (!props.selectedItem.summaryId) return false
+  return !checkerIsLoginUser.value
+})
+
+// 撤销流程
+const handleCancelFlow = async () => {
+  if (!props.selectedItem?.summaryId) {
+    ElMessage.warning('未找到OA流程ID,无法撤销')
+    return
+  }
+  ElMessageBox.confirm('确定要撤销该流程吗?撤销后报告将回到报告编制阶段,您可以重新发起。', '撤销流程', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    try {
+      const result = await PipeTaskOrderApi.cancelOAFlow(props.selectedItem.summaryId)
+      if (result) {
+        ElMessage.success('流程已撤销')
+        handleRefresh()
+      }
+    } catch (error) {
+      console.error('撤销流程失败:', error)
+      ElMessage.error('撤销流程失败,请稍后重试')
+    }
+  }).catch(() => {})
+}
+
+// 判断"填写结果"按钮是否显示
 const isCanEditRecordResult = computed(() => {
   // 非我的任务详情页面,不显示
   if ('PipeCheckerTaskDetail' !== routeName.value) return false

+ 57 - 0
yudao-ui-admin-vue3/src/views/pressure2/reportupdate/index.vue

@@ -0,0 +1,57 @@
+<template>
+  <ContentWrap>
+    <div class="flex items-center gap-8">
+      <el-button type="primary" :loading="pipeLoading" @click="handleUpdatePipeReport">
+        更新管道报告状态
+      </el-button>
+      <el-button type="primary" :loading="boilerLoading" @click="handleUpdateBoilerReport">
+        更新锅炉报告状态
+      </el-button>
+    </div>
+    <div v-if="lastResult" class="mt-4">
+      <el-alert :title="lastResult" type="success" show-icon :closable="false" />
+    </div>
+  </ContentWrap>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { updatePipeReport, updateBoilerReport } from '@/api/pressure2/reportupdate'
+
+const pipeLoading = ref(false)
+const boilerLoading = ref(false)
+const lastResult = ref('')
+
+/** 更新管道报告状态 */
+const handleUpdatePipeReport = async () => {
+  pipeLoading.value = true
+  lastResult.value = ''
+  try {
+    await updatePipeReport()
+    lastResult.value = '管道报告状态更新完成'
+    ElMessage.success('管道报告状态更新完成')
+  } catch (e) {
+    console.error('更新管道报告状态失败', e)
+    ElMessage.error('更新管道报告状态失败')
+  } finally {
+    pipeLoading.value = false
+  }
+}
+
+/** 更新锅炉报告状态 */
+const handleUpdateBoilerReport = async () => {
+  boilerLoading.value = true
+  lastResult.value = ''
+  try {
+    await updateBoilerReport()
+    lastResult.value = '锅炉报告状态更新完成'
+    ElMessage.success('锅炉报告状态更新完成')
+  } catch (e) {
+    console.error('更新锅炉报告状态失败', e)
+    ElMessage.error('更新锅炉报告状态失败')
+  } finally {
+    boilerLoading.value = false
+  }
+}
+</script>