<!--
|
OA / 审批管理 / 审批处理
|
路由:/pages/oa/ApproveManage/approve-list/approve
|
-->
|
<template>
|
<view class="oa-detail-page">
|
<PageHeader title="审批处理"
|
@back="goBack" />
|
|
<scroll-view v-if="row"
|
class="oa-detail-scroll"
|
scroll-y
|
:show-scrollbar="false">
|
<ApproveInstanceDetailBody :row="row"
|
:module-key="detailModuleKey" />
|
|
<view class="section-card opinion-card">
|
<view class="section-head">
|
<text class="section-title">审批意见</text>
|
</view>
|
<view class="opinion-wrap">
|
<up-textarea v-model="approveOpinion"
|
placeholder="通过可留空;驳回请填写具体原因"
|
maxlength="500"
|
count
|
height="100"
|
border="surround" />
|
</view>
|
</view>
|
</scroll-view>
|
|
<view v-else
|
class="oa-empty">
|
<up-empty mode="data"
|
text="未获取到审批数据" />
|
</view>
|
|
<view v-if="row"
|
class="oa-page-footer">
|
<text class="oa-footer-btn btn-default"
|
:class="{ 'is-disabled': submitting }"
|
@click="goBack">取消</text>
|
<text class="oa-footer-btn btn-danger"
|
:class="{ 'is-disabled': submitting }"
|
@click="submitApprove('rejected')">驳回</text>
|
<text class="oa-footer-btn btn-success"
|
:class="{ 'is-disabled': submitting }"
|
@click="submitApprove('approved')">通过</text>
|
</view>
|
</view>
|
</template>
|
|
<script setup>
|
import { computed, ref } from "vue";
|
import { onLoad } from "@dcloudio/uni-app";
|
import PageHeader from "@/components/PageHeader.vue";
|
import ApproveInstanceDetailBody from "./_components/ApproveInstanceDetailBody.vue";
|
import { approveApprovalInstance } from "@/api/oa/approvalInstance.js";
|
import {
|
buildApproveInstanceDto,
|
canApproveInstance,
|
loadInstanceRow,
|
} from "../../_utils/approveListUtils.js";
|
import { inferModuleKeyFromRow } from "../../_utils/approvalModuleApplyExtras.js";
|
|
const instanceId = ref("");
|
const row = ref(null);
|
const detailModuleKey = computed(() => inferModuleKeyFromRow(row.value));
|
const approveOpinion = ref("");
|
const submitting = ref(false);
|
|
const goBack = () => {
|
uni.navigateBack();
|
};
|
|
const submitApprove = uiResult => {
|
if (!row.value?.id || submitting.value) return;
|
|
if (uiResult === "rejected" && !(approveOpinion.value || "").trim()) {
|
uni.showToast({ title: "驳回时请填写审批意见", icon: "none" });
|
return;
|
}
|
|
submitting.value = true;
|
const dto = buildApproveInstanceDto(
|
row.value.id,
|
uiResult,
|
approveOpinion.value
|
);
|
|
approveApprovalInstance(dto)
|
.then(() => {
|
uni.showToast({
|
title: uiResult === "approved" ? "已通过" : "已驳回",
|
icon: "success",
|
});
|
setTimeout(() => {
|
const pages = getCurrentPages();
|
const prevRoute = pages[pages.length - 2]?.route || "";
|
const delta = prevRoute.includes("approve-list/detail") ? 2 : 1;
|
uni.navigateBack({ delta });
|
}, 300);
|
})
|
.catch(() => {
|
uni.showToast({ title: "审批操作失败", icon: "none" });
|
})
|
.finally(() => {
|
submitting.value = false;
|
});
|
};
|
|
onLoad(options => {
|
if (!options?.id) {
|
uni.showToast({ title: "缺少审批 ID", icon: "none" });
|
setTimeout(goBack, 500);
|
return;
|
}
|
instanceId.value = options.id;
|
const cached = loadInstanceRow(options.id);
|
if (!cached) {
|
uni.showToast({ title: "请从列表进入审批", icon: "none" });
|
setTimeout(goBack, 500);
|
return;
|
}
|
if (!canApproveInstance(cached)) {
|
uni.showToast({ title: "当前审批不可处理", icon: "none" });
|
setTimeout(goBack, 500);
|
return;
|
}
|
row.value = cached;
|
});
|
</script>
|
|
<style scoped lang="scss">
|
@import "../../_styles/oa-approval-list.scss";
|
|
$primary: #2979ff;
|
|
.opinion-card {
|
margin-top: 10px;
|
background: #fff;
|
border-radius: 12px;
|
overflow: hidden;
|
box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
|
}
|
|
.section-head {
|
padding: 12px 16px;
|
border-bottom: 1px solid #f2f4f7;
|
}
|
|
.section-title {
|
font-size: 15px;
|
font-weight: 600;
|
color: #1f2d3d;
|
padding-left: 10px;
|
border-left: 3px solid $primary;
|
line-height: 1.2;
|
}
|
|
.opinion-wrap {
|
padding: 12px 16px 16px;
|
}
|
</style>
|