From 4dabb710c557345ed5e3c391ebd8e77eb818deb3 Mon Sep 17 00:00:00 2001
From: YunaiV <zhijiantianya@gmail.com>
Date: Sat, 15 Apr 2023 16:03:12 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20OA=20=E8=AF=B7=E5=81=87?=
 =?UTF-8?q?=EF=BC=8Ccreate=20=E5=92=8C=20detail=20=E4=BD=BF=E7=94=A8?=
 =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E8=B7=AF=E7=94=B1=EF=BC=8C=E5=8F=AF=E6=8E=A5?=
 =?UTF-8?q?=E5=85=A5=E5=B7=A5=E4=BD=9C=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/router/modules/remaining.ts   |  14 +++-
 src/views/bpm/oa/leave/create.vue | 113 ++++++++++++------------------
 src/views/bpm/oa/leave/detail.vue |  34 +++++----
 src/views/bpm/oa/leave/index.vue  |  20 +++---
 4 files changed, 88 insertions(+), 93 deletions(-)

diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts
index 8886e388..d3b18d9c 100644
--- a/src/router/modules/remaining.ts
+++ b/src/router/modules/remaining.ts
@@ -313,7 +313,19 @@ const remainingRouter: AppRouteRecordRaw[] = [
           hidden: true,
           canTo: true,
           title: '发起 OA 请假',
-          activeMenu: 'bpm/oa/leave/create'
+          activeMenu: '/bpm/oa/leave'
+        }
+      },
+      {
+        path: '/bpm/oa/leave/detail',
+        component: () => import('@/views/bpm/oa/leave/detail.vue'),
+        name: 'OALeaveDetail',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          title: '查看 OA 请假',
+          activeMenu: '/bpm/oa/leave'
         }
       }
     ]
diff --git a/src/views/bpm/oa/leave/create.vue b/src/views/bpm/oa/leave/create.vue
index 321ec609..13c49419 100644
--- a/src/views/bpm/oa/leave/create.vue
+++ b/src/views/bpm/oa/leave/create.vue
@@ -1,56 +1,55 @@
 <template>
-  <Dialog title="发起 OA 请假流程" v-model="dialogVisible">
-    <el-form
-      ref="formRef"
-      :model="formData"
-      :rules="formRules"
-      label-width="80px"
-      v-loading="formLoading"
-    >
-      <el-form-item label="请假类型" prop="type">
-        <el-select v-model="formData.type" placeholder="请选择请假类型" clearable>
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.BPM_OA_LEAVE_TYPE)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="开始时间" prop="startTime">
-        <el-date-picker
-          clearable
-          v-model="formData.startTime"
-          type="datetime"
-          value-format="x"
-          placeholder="请选择开始时间"
+  <el-form
+    ref="formRef"
+    :model="formData"
+    :rules="formRules"
+    label-width="80px"
+    v-loading="formLoading"
+  >
+    <el-form-item label="请假类型" prop="type">
+      <el-select v-model="formData.type" placeholder="请选择请假类型" clearable>
+        <el-option
+          v-for="dict in getIntDictOptions(DICT_TYPE.BPM_OA_LEAVE_TYPE)"
+          :key="dict.value"
+          :label="dict.label"
+          :value="dict.value"
         />
-      </el-form-item>
-      <el-form-item label="结束时间" prop="endTime">
-        <el-date-picker
-          clearable
-          v-model="formData.endTime"
-          type="datetime"
-          value-format="x"
-          placeholder="请选择结束时间"
-        />
-      </el-form-item>
-      <el-form-item label="原因" prop="reason">
-        <el-input v-model="formData.reason" type="textarea" placeholder="请输请假原因" />
-      </el-form-item>
-    </el-form>
-    <template #footer>
+      </el-select>
+    </el-form-item>
+    <el-form-item label="开始时间" prop="startTime">
+      <el-date-picker
+        clearable
+        v-model="formData.startTime"
+        type="datetime"
+        value-format="x"
+        placeholder="请选择开始时间"
+      />
+    </el-form-item>
+    <el-form-item label="结束时间" prop="endTime">
+      <el-date-picker
+        clearable
+        v-model="formData.endTime"
+        type="datetime"
+        value-format="x"
+        placeholder="请选择结束时间"
+      />
+    </el-form-item>
+    <el-form-item label="原因" prop="reason">
+      <el-input v-model="formData.reason" type="textarea" placeholder="请输请假原因" />
+    </el-form-item>
+    <el-form-item>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
+    </el-form-item>
+  </el-form>
 </template>
 <script setup lang="ts">
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import * as LeaveApi from '@/api/bpm/leave'
+import { useTagsViewStore } from '@/store/modules/tagsView'
 const message = useMessage() // 消息弹窗
+const { delView } = useTagsViewStore() // 视图操作
+const { currentRoute } = useRouter() // 路由
 
-const dialogVisible = ref(false) // 弹窗的是否展示
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formData = ref({
   type: undefined,
@@ -66,15 +65,7 @@ const formRules = reactive({
 })
 const formRef = ref() // 表单 Ref
 
-/** 打开弹窗 */
-const open = async () => {
-  dialogVisible.value = true
-  resetForm()
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
 /** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
   // 校验表单
   if (!formRef) return
@@ -85,23 +76,11 @@ const submitForm = async () => {
   try {
     const data = formData.value as unknown as LeaveApi.LeaveVO
     await LeaveApi.createLeave(data)
-    message.success('新增成功')
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
+    message.success('发起成功')
+    // 关闭当前 Tab
+    delView(unref(currentRoute))
   } finally {
     formLoading.value = false
   }
 }
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    type: undefined,
-    reason: undefined,
-    startTime: undefined,
-    endTime: undefined
-  }
-  formRef.value?.resetFields()
-}
 </script>
diff --git a/src/views/bpm/oa/leave/detail.vue b/src/views/bpm/oa/leave/detail.vue
index 838be149..2efc37fb 100644
--- a/src/views/bpm/oa/leave/detail.vue
+++ b/src/views/bpm/oa/leave/detail.vue
@@ -1,40 +1,48 @@
 <template>
-  <Dialog title="详情" v-model="dialogVisible" :scroll="true" :max-height="200">
+  <ContentWrap>
     <el-descriptions border :column="1">
       <el-descriptions-item label="请假类型">
         <dict-tag :type="DICT_TYPE.BPM_OA_LEAVE_TYPE" :value="detailData.type" />
       </el-descriptions-item>
       <el-descriptions-item label="开始时间">
-        {{ formatDate(detailData.startTime) }}
+        {{ formatDate(detailData.startTime, 'YYYY-MM-DD') }}
       </el-descriptions-item>
       <el-descriptions-item label="结束时间">
-        {{ formatDate(detailData.endTime) }}
+        {{ formatDate(detailData.endTime, 'YYYY-MM-DD') }}
       </el-descriptions-item>
       <el-descriptions-item label="原因">
         {{ detailData.reason }}
       </el-descriptions-item>
     </el-descriptions>
-  </Dialog>
+  </ContentWrap>
 </template>
-<script setup lang="ts">
+<script setup lang="ts" name="OALeaveCreate">
 import { DICT_TYPE } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
+import { propTypes } from '@/utils/propTypes'
 import * as LeaveApi from '@/api/bpm/leave'
+const { query } = useRoute() // 查询参数
 
-const dialogVisible = ref(false) // 弹窗的是否展示
+const props = defineProps({
+  id: propTypes.number.def(undefined)
+})
 const detailLoading = ref(false) // 表单的加载中
-const detailData = ref() // 详情数据
+const detailData = ref({}) // 详情数据
+const queryId = query.id as unknown as number // 从 URL 传递过来的 id 编号
 
-/** 打开弹窗 */
-const open = async (data: LeaveApi.LeaveVO) => {
-  dialogVisible.value = true
-  // 设置数据
+/** 获得数据 */
+const getInfo = async () => {
   detailLoading.value = true
   try {
-    detailData.value = data
+    detailData.value = await LeaveApi.getLeave(queryId || props.id)
   } finally {
     detailLoading.value = false
   }
 }
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+defineExpose({ open: getInfo }) // 提供 open 方法,用于打开弹窗
+
+/** 初始化 **/
+onMounted(() => {
+  getInfo()
+})
 </script>
diff --git a/src/views/bpm/oa/leave/index.vue b/src/views/bpm/oa/leave/index.vue
index ebf10d72..901b6038 100644
--- a/src/views/bpm/oa/leave/index.vue
+++ b/src/views/bpm/oa/leave/index.vue
@@ -137,19 +137,12 @@
       @pagination="getList"
     />
   </ContentWrap>
-
-  <!-- 表单弹窗:详情 -->
-  <LeaveDetail ref="detailRef" />
-  <!-- 表单弹窗:添加 -->
-  <LeaveForm ref="formRef" @success="getList" />
 </template>
 <script setup lang="ts" name="BpmOALeave">
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { dateFormatter } from '@/utils/formatTime'
 import * as LeaveApi from '@/api/bpm/leave'
 import * as ProcessInstanceApi from '@/api/bpm/processInstance'
-import LeaveDetail from './detail.vue'
-import LeaveForm from './create.vue'
 const message = useMessage() // 消息弹窗
 const router = useRouter() // 路由
 const { t } = useI18n() // 国际化
@@ -192,15 +185,18 @@ const resetQuery = () => {
 }
 
 /** 添加操作 */
-const formRef = ref()
 const handleCreate = () => {
-  formRef.value.open()
+  router.push({ name: 'OALeaveCreate' })
 }
 
 /** 详情操作 */
-const detailRef = ref()
-const handleDetail = (data: LeaveApi.LeaveVO) => {
-  detailRef.value.open(data)
+const handleDetail = (row: LeaveApi.LeaveVO) => {
+  router.push({
+    name: 'OALeaveDetail',
+    query: {
+      id: row.id
+    }
+  })
 }
 
 /** 取消请假操作 */