From a63543a5c793c8954fa2f9da0ee4fb215c62d8c2 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期一, 20 五月 2024 10:26:46 +0800
Subject: [PATCH] !118 ♥️发布 5.2.0-BETA 公测版本 Merge pull request !118 from 疯狂的狮子Li/dev

---
 src/views/workflow/leave/leaveEdit.vue |  273 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 273 insertions(+), 0 deletions(-)

diff --git a/src/views/workflow/leave/leaveEdit.vue b/src/views/workflow/leave/leaveEdit.vue
new file mode 100644
index 0000000..e978ad8
--- /dev/null
+++ b/src/views/workflow/leave/leaveEdit.vue
@@ -0,0 +1,273 @@
+<template>
+  <div class="p-2">
+    <el-card shadow="never">
+      <div style="display: flex; justify-content: space-between">
+        <div>
+          <el-button
+            v-if="
+              routeParams.type === 'add' ||
+              (routeParams.type === 'update' &&
+                form.processInstanceVo &&
+                form.processInstanceVo.businessStatus &&
+                (form.processInstanceVo.businessStatus === 'draft' ||
+                  form.processInstanceVo.businessStatus === 'cancel' ||
+                  form.processInstanceVo.businessStatus === 'back'))
+            "
+            :loading="buttonLoading"
+            type="info"
+            @click="submitForm('draft')"
+            >鏆傚瓨</el-button
+          >
+          <el-button
+            v-if="
+              routeParams.type === 'add' ||
+              (routeParams.type === 'update' &&
+                form.processInstanceVo &&
+                (form.processInstanceVo.businessStatus === 'draft' ||
+                  form.processInstanceVo.businessStatus === 'cancel' ||
+                  form.processInstanceVo.businessStatus === 'back'))
+            "
+            :loading="buttonLoading"
+            type="primary"
+            @click="submitForm('submit')"
+            >鎻� 浜�</el-button
+          >
+          <el-button
+            v-if="routeParams.type === 'approval' && form.processInstanceVo && form.processInstanceVo.businessStatus === 'waiting'"
+            :loading="buttonLoading"
+            type="primary"
+            @click="approvalVerifyOpen"
+            >瀹℃壒</el-button
+          >
+          <el-button v-if="processInstanceId" type="primary" @click="handleApprovalRecord">娴佺▼杩涘害</el-button>
+        </div>
+        <div>
+          <el-button style="float: right" @click="goBack()">杩斿洖</el-button>
+        </div>
+      </div>
+    </el-card>
+    <el-card shadow="never" style="height: 78vh; overflow-y: auto">
+      <el-form ref="leaveFormRef" v-loading="loading" :disabled="routeParams.type === 'view'" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="璇峰亣绫诲瀷" prop="leaveType">
+          <el-select v-model="form.leaveType" placeholder="璇烽�夋嫨璇峰亣绫诲瀷" style="width: 100%">
+            <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇峰亣鏃堕棿">
+          <el-date-picker
+            v-model="leaveTime"
+            type="daterange"
+            range-separator="To"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            @change="changeLeaveTime()"
+          />
+        </el-form-item>
+        <el-form-item label="璇峰亣澶╂暟" prop="leaveDays">
+          <el-input v-model="form.leaveDays" disabled type="number" placeholder="璇疯緭鍏ヨ鍋囧ぉ鏁�" />
+        </el-form-item>
+        <el-form-item label="璇峰亣鍘熷洜" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ヨ鍋囧師鍥�" />
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <!-- 鎻愪氦缁勪欢 -->
+    <submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
+    <!-- 瀹℃壒璁板綍 -->
+    <approvalRecord ref="approvalRecordRef" />
+  </div>
+</template>
+
+<script setup name="Leave" lang="ts">
+import { addLeave, getLeave, updateLeave } from '@/api/workflow/leave';
+import { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types';
+import { startWorkFlow } from '@/api/workflow/task';
+import SubmitVerify from '@/components/Process/submitVerify.vue';
+import ApprovalRecord from '@/components/Process/approvalRecord.vue';
+import { AxiosResponse } from 'axios';
+import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const buttonLoading = ref(false);
+const loading = ref(true);
+const leaveTime = ref<Array<string>>([]);
+//娴佺▼瀹炰緥id
+const processInstanceId = ref('');
+//璺敱鍙傛暟
+const routeParams = ref<Record<string, any>>({});
+const options = [
+  {
+    value: '1',
+    label: '浜嬪亣'
+  },
+  {
+    value: '2',
+    label: '璋冧紤'
+  },
+  {
+    value: '3',
+    label: '鐥呭亣'
+  },
+  {
+    value: '4',
+    label: '濠氬亣'
+  }
+];
+//鎻愪氦缁勪欢
+const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
+//瀹℃壒璁板綍缁勪欢
+const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
+
+const leaveFormRef = ref<ElFormInstance>();
+
+const submitFormData = ref<StartProcessBo>({
+  businessKey: '',
+  tableName: '',
+  variables: {}
+});
+const taskVariables = ref<Record<string, any>>({});
+
+const initFormData: LeaveForm = {
+  id: undefined,
+  leaveType: undefined,
+  startDate: undefined,
+  endDate: undefined,
+  leaveDays: undefined,
+  remark: undefined,
+  processInstanceVo: {}
+};
+const data = reactive<PageData<LeaveForm, LeaveQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    startLeaveDays: undefined,
+    endLeaveDays: undefined
+  },
+  rules: {
+    id: [{ required: true, message: '涓婚敭涓嶈兘涓虹┖', trigger: 'blur' }],
+    leaveType: [{ required: true, message: '璇峰亣绫诲瀷涓嶈兘涓虹┖', trigger: 'blur' }],
+    leaveTime: [{ required: true, message: '璇峰亣鏃堕棿涓嶈兘涓虹┖', trigger: 'blur' }],
+    leaveDays: [{ required: true, message: '璇峰亣澶╂暟涓嶈兘涓虹┖', trigger: 'blur' }]
+  }
+});
+
+const { form, rules } = toRefs(data);
+
+/** 琛ㄥ崟閲嶇疆 */
+const reset = () => {
+  form.value = { ...initFormData };
+  leaveTime.value = [];
+  leaveFormRef.value?.resetFields();
+};
+
+const changeLeaveTime = () => {
+  const startDate = new Date(leaveTime.value[0]).getTime();
+  const endDate = new Date(leaveTime.value[1]).getTime();
+  const diffInMilliseconds = endDate - startDate;
+  form.value.leaveDays = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24));
+};
+/** 鑾峰彇璇︽儏 */
+const getInfo = () => {
+  loading.value = true;
+  buttonLoading.value = false;
+  nextTick(async () => {
+    const res = await getLeave(routeParams.value.id);
+    Object.assign(form.value, res.data);
+    leaveTime.value = [];
+    leaveTime.value.push(form.value.startDate);
+    leaveTime.value.push(form.value.endDate);
+    if (form.value.processInstanceVo) {
+      processInstanceId.value = form.value.processInstanceVo.id;
+    }
+    loading.value = false;
+    buttonLoading.value = false;
+  });
+};
+
+/** 鎻愪氦鎸夐挳 */
+const submitForm = (status: string) => {
+  if (leaveTime.value.length === 0) {
+    proxy?.$modal.msgError('璇峰亣鏃堕棿涓嶈兘涓虹┖');
+    return;
+  }
+  try {
+    leaveFormRef.value?.validate(async (valid: boolean) => {
+      form.value.startDate = leaveTime.value[0];
+      form.value.endDate = leaveTime.value[1];
+      if (valid) {
+        buttonLoading.value = true;
+        let res: AxiosResponse<LeaveVO>;
+        if (form.value.id) {
+          res = await updateLeave(form.value);
+        } else {
+          res = await addLeave(form.value);
+        }
+        form.value = res.data;
+        if (status === 'draft') {
+          buttonLoading.value = false;
+          proxy?.$modal.msgSuccess('鏆傚瓨鎴愬姛');
+          proxy.$tab.closePage(proxy.$route);
+          proxy.$router.go(-1);
+        } else {
+          await handleStartWorkFlow(res.data);
+        }
+      }
+    });
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+//鎻愪氦鐢宠
+const handleStartWorkFlow = async (data: LeaveVO) => {
+  try {
+    submitFormData.value.tableName = 'test_leave';
+    submitFormData.value.businessKey = data.id;
+    //娴佺▼鍙橀噺
+    taskVariables.value = {
+      entity: data,
+      leaveDays: data.leaveDays,
+      userList: [1, 3],
+      userList2: [1, 3]
+    };
+    submitFormData.value.variables = taskVariables.value;
+    const resp = await startWorkFlow(submitFormData.value);
+    if (submitVerifyRef.value) {
+      buttonLoading.value = false;
+      submitVerifyRef.value.openDialog(resp.data.taskId);
+    }
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+//瀹℃壒璁板綍
+const handleApprovalRecord = () => {
+  approvalRecordRef.value.init(processInstanceId.value);
+};
+//鎻愪氦鍥炶皟
+const submitCallback = async () => {
+  await proxy.$tab.closePage(proxy.$route);
+  proxy.$router.go(-1);
+};
+
+//杩斿洖
+const goBack = () => {
+  proxy.$tab.closePage(proxy.$route);
+  proxy.$router.go(-1);
+};
+//瀹℃壒
+const approvalVerifyOpen = async () => {
+  submitVerifyRef.value.openDialog(routeParams.value.taskId);
+};
+onMounted(() => {
+  nextTick(async () => {
+    routeParams.value = proxy.$route.query;
+    reset();
+    loading.value = false;
+    if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
+      getInfo();
+    }
+  });
+});
+</script>

--
Gitblit v1.9.3