审批调整

This commit is contained in:
hebo 2025-09-23 18:15:14 +08:00
parent 5222b1c8e6
commit 2d2314c336
9 changed files with 450 additions and 42 deletions

View File

@ -164,3 +164,5 @@ const setDefaultValue = () => {

View File

@ -1,7 +1,7 @@
<template>
<view class="spr-list-container">
<!-- 原始审批人 -->
<view class="section">
<view v-if="!hideOriginal" class="section">
<view class="section-header">
<text class="section-title">原审批人{{ srcSprList.length || 0 }}</text>
</view>
@ -24,7 +24,7 @@
</view>
<!-- 原始抄送人 -->
<view class="section">
<view v-if="!hideOriginal" class="section">
<view class="section-header">
<text class="section-title">原抄送人{{ srcCsrList.length || 0 }}</text>
</view>
@ -53,9 +53,10 @@
<view class="section">
<view class="section-header">
<text class="section-title">{{ newSprTitle }}</text>
<text class="required-asterisk">*</text>
<!-- 审批人选择器 -->
<BasicJsPicker ref="approverPickerRef" :customTrigger="true" :multiple="true"
:excludeIds="getExcludeApproverIds()" :defaultValue="approvers" title="选择审批人" placeholder="请选择审批转办人"
:excludeIds="getExcludeApproverIds()" :defaultValue="approvers" title="选择转办人" placeholder="请选择转办人"
searchPlaceholder="搜索审批人" @change="handleApproverChange">
<template #trigger>
<view class="add-btn">
@ -98,7 +99,7 @@
<text class="section-title">{{ newCsrTitle }}</text>
<!-- 抄送人选择器 -->
<BasicJsPicker ref="ccPickerRef" :customTrigger="true" :multiple="true" :excludeIds="getExcludeCcIds()"
:defaultValue="ccList" title="选择抄送人" placeholder="请选择抄送人" searchPlaceholder="搜索抄送人" @change="handleCcChange">
:defaultValue="ccList" title="选择抄送人" placeholder="请选择抄送人(可选)" searchPlaceholder="搜索抄送人" @change="handleCcChange">
<template #trigger>
<view class="add-btn">
<text class="add-icon">+</text>
@ -137,9 +138,11 @@ const { getLcgl } = useDataStore();
const props = withDefaults(defineProps<{
newSprTitle?: string;
newCsrTitle?: string;
hideOriginal?: boolean;
}>(), {
newSprTitle: "审批转办人",
newCsrTitle: "新抄送人"
newCsrTitle: "新抄送人",
hideOriginal: false
});
// JsVo
@ -406,6 +409,13 @@ defineExpose({
font-weight: bold;
color: #262626;
}
.required-asterisk {
color: #ff4757;
font-size: 32rpx;
font-weight: bold;
margin-left: 8rpx;
}
.add-btn {
display: flex;

View File

@ -1,16 +1,14 @@
<template>
<view class="white-bg-color py-5 yw-confirm">
<view class="flex-row items-center pt-5 pb-10">
<u-button text="驳回" class="ml-15 mr-7" :plain="true" @click="showDlg('reject')" />
<u-button text="同意" class="mr-15 ml-7" type="primary" @click="submit" />
<view class="flex-row items-center pt-5 pb-10" v-if="showReject || showTransfer || showApprove || showXtDk">
<u-button v-if="showReject" text="驳回" class="flex-1 mx-2 reject-btn" @click="showDlg('reject')" />
<u-button v-if="showTransfer" text="转办" class="flex-1 mx-2 transfer-btn" @click="showTransfer" />
<u-button v-if="showApprove" text="同意" class="flex-1 mx-2" type="primary" @click="submit" />
<u-button v-if="showXtDk" text="协调代课" class="flex-1 mx-2" type="primary" @click="showXtDlg" />
</view>
<view class="flex-row items-center pb-10">
<u-button text="终止" class="ml-15 mr-7" type="error" @click="showDlg('stop')" />
<u-button text="转办" class="mr-15 ml-7" :plain="true" @click="showTransfer" />
</view>
<view class="flex-row items-center pb-5" v-if="showXt">
<u-button text="返回" class="ml-15 mr-7" :plain="true" @click="goToMessage" />
<u-button text="同意并协调代课" class="mr-15 ml-7" type="primary" @click="showXtDlg" />
<view class="flex-row items-center pb-5" v-if="showXt && (showReturn || showStop)">
<u-button v-if="showReturn" text="返回" class="flex-1 mx-2" :plain="true" @click="goToMessage" />
<u-button v-if="showStop" text="终止" class="flex-1 mx-2" type="error" @click="showDlg('stop')" />
</view>
<!-- 驳回弹窗 -->
<u-popup :show="dlgFlag" mode="center" :closeOnClickOverlay="false" @close="closeDlg">
@ -52,6 +50,12 @@ const props = withDefaults(defineProps<{
approvedRemark?: string //
autoToMessage?: boolean //
showXt?: boolean
showReject?: boolean //
showTransfer?: boolean //
showApprove?: boolean //
showReturn?: boolean //
showStop?: boolean //
showXtDk?: boolean //
}>(), {
spApi: async (params: any) => {},
transferApi: async (params: any) => {},
@ -63,7 +67,13 @@ const props = withDefaults(defineProps<{
rejectValue: 'rejected',
approvedRemark: '同意',
autoToMessage: true,
showXt: false
showXt: false,
showReject: true,
showTransfer: true,
showApprove: true,
showReturn: true,
showStop: true,
showXtDk: true
});
// emit
@ -215,6 +225,30 @@ defineExpose({
margin-top: 8rpx;
}
// -
:deep(.reject-btn) {
background-color: #ff4757 !important;
border-color: #ff4757 !important;
color: #fff !important;
&:hover {
background-color: #ff3742 !important;
border-color: #ff3742 !important;
}
}
// -
:deep(.transfer-btn) {
background-color: #ffa502 !important;
border-color: #ffa502 !important;
color: #fff !important;
&:hover {
background-color: #ff9500 !important;
border-color: #ff9500 !important;
}
}
.popup-content {
.popup-header {
padding: 20rpx 30rpx;

View File

@ -3,19 +3,31 @@
class="transfer-popup">
<view class="popup-content">
<view class="popup-header">
<view class="popup-title">转办设置</view>
<view class="popup-title">转办</view>
</view>
<view class="popup-body">
<!-- 原审批人信息 -->
<view class="info-section">
<view class="info-row">
<text class="info-label">当前审批人:</text>
<text class="info-value">{{ currentApprovers }}</text>
</view>
<view class="info-row">
<text class="info-label">当前抄送人:</text>
<text class="info-value">{{ currentCcRecipients }}</text>
</view>
</view>
<TransferSpCsMgr ref="transferSpCsMgrRef" :hideOriginal="true" newSprTitle="转办人" newCsrTitle="抄送人" />
<view class="section">
<view class="section-header">
<text class="section-title">转办原因</text>
</view>
<view class="list-content">
<u-input v-model="spRemark" type="textarea" placeholder="请填写转办原因" :autoHeight="true" maxlength="200"
<u-input v-model="spRemark" type="textarea" placeholder="请输入转办原因和描述(可选)" :autoHeight="true" maxlength="200"
class="remark-input" />
</view>
</view>
<TransferSpCsMgr ref="transferSpCsMgrRef" />
</view>
<view class="popup-actions flex-row justify-end mt-4">
<u-button class="mr-2" @click="closeDlg">取消</u-button>
@ -26,8 +38,9 @@
</template>
<script setup lang="ts">
import { ref } from "vue";
import { ref, computed } from "vue";
import TransferSpCsMgr from "@/components/TransferSpCsMgr/index.vue"
import { useDataStore } from "@/store/modules/data";
// emit
const emit = defineEmits(["submit"]);
@ -36,6 +49,20 @@ const transferSpCsMgrRef = ref<any>(null);
const dlgFlag = ref(false);
const spRemark = ref("");
const { getLcgl } = useDataStore();
//
const currentApprovers = computed(() => {
const sprList = getLcgl.sprSpList || [];
return sprList.map((item: any) => item.userName || item.jsxm).join('、');
});
//
const currentCcRecipients = computed(() => {
const csrList = getLcgl.csrSpList || [];
return csrList.map((item: any) => item.userName || item.jsxm).join('、');
});
const showDlg = (type: string) => {
dlgFlag.value = true;
};
@ -46,14 +73,10 @@ const closeDlg = () => {
//
const submit = () => {
if (!spRemark.value || !spRemark.value.trim()) {
uni.showToast({ title: "请填写转办原因", icon: "none" });
return;
}
const newSprList = transferSpCsMgrRef.value.getNewSprList();
const newCsrList = transferSpCsMgrRef.value.getNewCsrList();
if (!newSprList.length) {
uni.showToast({ title: "请选择审批转办人", icon: "none" });
uni.showToast({ title: "请选择转办人", icon: "none" });
return;
}
emit('submit', { newSprList, newCsrList, spRemark: spRemark.value });
@ -147,8 +170,37 @@ defineExpose({
}
}
.list-content {
}
.info-section {
margin-bottom: 40rpx;
padding: 30rpx;
background: #f8f9fa;
border-radius: 12rpx;
.info-row {
display: flex;
align-items: flex-start;
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
}
.info-label {
font-size: 28rpx;
color: #666;
width: 160rpx;
flex-shrink: 0;
margin-right: 20rpx;
}
.info-value {
font-size: 28rpx;
color: #333;
flex: 1;
word-break: break-all;
}
}
}

View File

@ -55,6 +55,28 @@ async function forceRefreshPermission(changeTime?: string): Promise<void> {
}
function goByJs(js: any) {
//
const globalData = getGlobal;
console.log('goByJs - globalData:', globalData);
console.log('goByJs - js:', js);
if (globalData && globalData.qdId) {
//
let confirmUrl = `/pages/view/routine/qd/confirm?qdId=${globalData.qdId}`;
if (globalData.rqgqtime) {
confirmUrl += `&rqgqtime=${globalData.rqgqtime}`;
}
if (globalData.timestamp) {
confirmUrl += `&timestamp=${globalData.timestamp}`;
}
console.log('重定向到签到确认页面:', confirmUrl);
uni.reLaunch({
url: confirmUrl
});
return;
}
if (getGlobal && getGlobal.type === '1') {
uni.reLaunch({
url: "/pages/view/routine/xk/qd?from=login"
@ -79,8 +101,11 @@ function goByJs(js: any) {
}
onLoad(async (data: any) => {
console.log('launchPage onLoad - 接收到的参数:', data);
if (data && data.openId) {
setGlobal(data);
console.log('launchPage onLoad - 设置global数据后:', getGlobal);
try {
const res = await checkOpenId({
@ -88,6 +113,8 @@ onLoad(async (data: any) => {
appCode: "JS",
});
console.log('launchPage onLoad - checkOpenId结果:', res);
if (res.resultCode == 1 && res.result) {
//
afterLoginAction(res.result);
@ -104,6 +131,7 @@ onLoad(async (data: any) => {
}
//
console.log('launchPage onLoad - 准备调用goByJs');
goByJs(res.result.js);
} else {
uni.reLaunch({
@ -111,11 +139,13 @@ onLoad(async (data: any) => {
});
}
} catch (err) {
console.error('launchPage onLoad - checkOpenId失败:', err);
uni.reLaunch({
url: "/pages/system/login/login"
});
}
} else {
console.log('launchPage onLoad - 没有openId参数跳转到登录页面');
uni.reLaunch({
url: "/pages/system/login/login"
});

View File

@ -10,10 +10,10 @@
<view class="info-row"><text class="label">开始时间:</text><text class="value">{{ qjData.qjkstime }}</text></view>
<view class="info-row"><text class="label">结束时间:</text><text class="value">{{ qjData.qjjstime }}</text></view>
<view class="info-row"><text class="label">请假时长:</text><text class="value">{{ qjData.qjsc }}</text></view>
<view class="info-column"><text class="label">请假事由:</text><text class="value">{{ qjData.qjsy }}</text></view>
<view class="info-row"><text class="label">请假事由:</text><text class="value">{{ qjData.qjsy }}</text></view>
<view class="info-row" style="margin-bottom: 0; margin-top: 10px">
<text class="label">代课方式:</text>
<text class="value">{{ dkfsText }}</text>
<text class="value" :class="{ 'no-dk-style': dkfsText === '无须代课' }">{{ dkfsText }}</text>
</view>
</view>
</view>
@ -144,6 +144,11 @@ defineExpose({
font-size: 14px;
color: #333;
flex: 1;
&.no-dk-style {
color: #ff4757;
font-weight: bold;
}
}
}

View File

@ -9,9 +9,35 @@
/>
<!-- 代课信息 -->
<view class="dk-info">
<view v-if="!showDkFlag" class="empty-dk">
<view class="section-title">
<text class="title-text">代课信息</text>
<view class="title-underline"></view>
</view>
<view v-if="!showDkFlag && !showPkkbFlag" class="empty-dk">
<view>{{ showDkEmptyLabel }}</view>
</view>
<view v-else-if="showPkkbFlag && !showDkFlag" class="pkkb-list">
<view v-for="(item, index) in pkkbList" :key="index" class="pkkb-card">
<view class="card-header">
<text class="applicant-name">{{ item.dktime }}{{ item.xqLabel }}{{ item.jcmc }}</text>
</view>
<view class="divider"></view>
<view class="card-body">
<view class="info-row">
<text class="label">排课名称:</text>
<text class="value">{{ item.pkMc }}</text>
</view>
<view class="info-row">
<text class="label">上课时间:</text>
<text class="value">{{ item.startTime }}-{{ item.endTime }}</text>
</view>
<view class="info-row">
<text class="label">代课老师:</text>
<text class="value no-teacher">没有选择代课老师</text>
</view>
</view>
</view>
</view>
<JsQjDetailDk v-else
:qjId="qjId"
@loadDkList="handleDkListLoaded"
@ -22,15 +48,26 @@
<LcglSp :yw-id="qjId" yw-type="JS_QJ" />
</view>
<template #bottom>
<YwConfirm :spApi="jsQjSpApi" :stopApi="jsQjStopApi" :xtDkApi="jsQjXtApi"
:transferApi="jsQjTransferApi" :params="spParams" :showXt="true" />
<YwConfirm
:spApi="jsQjSpApi"
:stopApi="jsQjStopApi"
:xtDkApi="jsQjXtApi"
:transferApi="jsQjTransferApi"
:params="spParams"
:showXt="true"
:showReject="true"
:showTransfer="true"
:showApprove="showApproveButton"
:showReturn="false"
:showStop="false"
:showXtDk="showXtDkButton" />
</template>
</BasicLayout>
</template>
<script setup lang="ts">
import { onLoad } from "@dcloudio/uni-app";
import { jsQjSpApi, jsQjStopApi, jsQjTransferApi, jsQjXtApi } from "@/api/base/jsQjApi";
import { jsQjSpApi, jsQjStopApi, jsQjTransferApi, jsQjXtApi, getPkkbByJsRangeTimeApi } from "@/api/base/jsQjApi";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
@ -48,6 +85,10 @@ const dbFlag = ref(false);
const qjId = ref('');
const showDkFlag = ref(false);
const showDkEmptyLabel = ref('');
const showXtDkButton = ref(false);
const showApproveButton = ref(true);
const pkkbList = ref<any[]>([]);
const showPkkbFlag = ref(false);
const spParams = computed(() => {
return {
@ -56,7 +97,7 @@ const spParams = computed(() => {
};
});
const handleQjDataLoaded = (data: any) => {
const handleQjDataLoaded = async (data: any) => {
data = data || {};
setData(data);
if (data.spResult != "A" && getXxts && getXxts.dbZt === "A") {
@ -64,10 +105,21 @@ const handleQjDataLoaded = (data: any) => {
}
const dkfs = typeof(data.dkfs) === "string" ? parseInt(data.dkfs) : (data.dkfs || 2);
showDkFlag.value = dkfs === 0;
//
await getPkkbData(data);
if (dkfs === 1) {
showDkEmptyLabel.value = "审批同意后由教科处协调";
showDkEmptyLabel.value = "教科处协调,请点击协调代课按钮\n如无法协调,请点击转办按钮";
showXtDkButton.value = true; //
showApproveButton.value = false; //
} else if (dkfs === 2) {
showDkEmptyLabel.value = "无需代课";
showXtDkButton.value = false; //
showApproveButton.value = true; //
} else {
showXtDkButton.value = false; //
showApproveButton.value = true; //
}
};
@ -75,6 +127,50 @@ const handleDkListLoaded = (list: any[]) => {
// JsQjDetail
};
//
const getPkkbData = async (data: any) => {
if (!data.qjkstime || !data.qjjstime) {
return;
}
try {
const res = await getPkkbByJsRangeTimeApi({
jsId: data.jsId,
startTime: data.qjkstime,
endTime: data.qjjstime,
});
if (res && res.result) {
pkkbList.value = res.result.map((item: any) => {
item.dktime = item.kbtime.split(" ")[0];
item.jcmc = getJcMc(item.jcType) + "第" + item.jc + "节";
const xq: number = item.xq - 1;
item.xqLabel = getWdName(xq);
return item;
});
showPkkbFlag.value = pkkbList.value.length > 0;
}
} catch (error) {
console.error("获取排课信息失败:", error);
}
};
//
const getJcMc = (jcType: string) => {
const jsTypeMc: any = {
ZAM: "早自习",
AM: "上午",
PM: "下午",
};
return jsTypeMc[jcType] || jcType;
};
//
const getWdName = (xq: number) => {
const wdNameList = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
return wdNameList[xq] || "";
};
onLoad(async (data?: any) => {
const ret = await QjPageUtils.init(data);
if (!ret || !ret.success) {
@ -90,12 +186,117 @@ onLoad(async (data?: any) => {
background-color: #f5f7fa;
}
.empty-dk {
.dk-info {
margin: 15px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
overflow: hidden;
.section-title {
padding: 15px 15px 0 15px;
margin-bottom: 0;
.title-text {
font-size: 16px;
font-weight: bold;
color: #333;
display: block;
margin-bottom: 8px;
}
.title-underline {
height: 2px;
background-color: #007aff;
width: 100%;
border-radius: 1px;
}
}
//
:deep(.dk-info) {
margin: 0;
background-color: transparent;
box-shadow: none;
}
:deep(.info-card) {
margin: 0;
border-radius: 0;
box-shadow: none;
border-bottom: 1px solid #f0f0f0;
&:last-child {
border-bottom: none;
}
}
}
.empty-dk {
background-color: #fff;
border-radius: 8px;
padding: 50px 15px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
text-align: center;
white-space: pre-line;
line-height: 1.6;
}
.pkkb-list {
.pkkb-card {
background-color: #fff;
border-radius: 8px;
margin-bottom: 15px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
overflow: hidden;
.card-header {
padding: 15px;
border-bottom: 1px solid #eee;
.applicant-name {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.divider {
height: 1px;
background-color: #eee;
}
.card-body {
padding: 15px;
.info-row {
display: flex;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
.label {
font-size: 14px;
color: #999;
width: 70px;
flex-shrink: 0;
margin-right: 8px;
}
.value {
font-size: 14px;
color: #333;
flex: 1;
&.no-teacher {
color: #ff4757;
font-weight: 500;
}
}
}
}
}
}
</style>

View File

@ -214,16 +214,37 @@ const options = ref<any>({});
//
onLoad((params) => {
console.log('confirm.vue onLoad - 接收到的参数:', params);
options.value = params || {};
if (params && params.from === "login") {
options.value = getGlobal;
console.log('confirm.vue onLoad - 从登录页面来使用global数据:', options.value);
} else {
setGlobal({
...options.value,
type: "qd"
});
}
// launchPage
if (params && params.qdId) {
console.log('confirm.vue onLoad - 检测到qdId参数准备初始化页面');
//
setTimeout(() => {
console.log('confirm.vue onLoad - 开始执行initializePage');
initializePage();
}, 100);
} else {
console.log('confirm.vue onLoad - 没有qdId参数不执行初始化');
// qdIdToken
if (checkToken()) {
return;
console.log('confirm.vue onLoad - Token有效但没有qdId参数');
} else {
console.log('confirm.vue onLoad - Token无效跳转登录页面');
uni.navigateTo({
url: '/pages/system/login/login'
});
}
}
});
@ -254,26 +275,39 @@ const showSignature = ref<boolean>(false);
// store
const userStore = useUserStore();
//
onMounted(async () => {
//
const initializePage = async () => {
console.log('confirm.vue initializePage - 开始初始化');
console.log('confirm.vue initializePage - options.value:', options.value);
// ID
if (options.value?.qdId) {
qdId.value = options.value.qdId;
console.log('confirm.vue initializePage - 设置qdId:', qdId.value);
} else {
console.log('confirm.vue initializePage - 没有qdId参数显示错误');
uni.showToast({ title: '参数错误', icon: 'none' });
return;
}
//
//
if (options.value?.rqgqtime) {
qrExpireTime.value = parseInt(options.value.rqgqtime) || 60;
console.log('confirm.vue initializePage - 设置qrExpireTime:', qrExpireTime.value, '秒');
} else {
qrExpireTime.value = 60; // 60
console.log('confirm.vue initializePage - 使用默认qrExpireTime:', qrExpireTime.value, '秒');
}
//
const jsData = userStore.getJs;
console.log('confirm.vue initializePage - 获取教师信息:', jsData);
if (jsData && Object.keys(jsData).length > 0) {
userInfo.value = jsData;
console.log('confirm.vue initializePage - 教师信息有效,继续执行');
} else {
console.log('confirm.vue initializePage - 教师信息无效,跳转登录页面');
uni.showToast({ title: '请先登录', icon: 'none' });
//
setTimeout(() => {
@ -289,42 +323,72 @@ onMounted(async () => {
const qrTimestamp = parseInt(options.value.timestamp);
const currentTimestamp = Date.now();
const timeDiff = currentTimestamp - qrTimestamp;
const maxValidTime = qrExpireTime.value * 1000; //
const maxValidTime = qrExpireTime.value * 1000; // qrExpireTime
console.log('confirm.vue initializePage - 验证二维码时间戳:', {
qrTimestamp,
currentTimestamp,
timeDiff: timeDiff + '毫秒',
maxValidTime: maxValidTime + '毫秒',
qrExpireTime: qrExpireTime.value + '秒'
});
if (timeDiff > maxValidTime) {
console.log('confirm.vue initializePage - 二维码已过期,时间差:', timeDiff, '毫秒,超过最大有效时间:', maxValidTime, '毫秒');
currentStep.value = 'qrExpired';
return;
} else {
console.log('confirm.vue initializePage - 二维码未过期,时间差:', timeDiff, '毫秒,小于最大有效时间:', maxValidTime, '毫秒');
}
}
// qdIdID
console.log('confirm.vue initializePage - 准备调用checkTeacherSignInPermission');
await checkTeacherSignInPermission();
};
//
onMounted(async () => {
// onLoad
// DOM
});
//
const checkTeacherSignInPermission = async () => {
console.log('confirm.vue checkTeacherSignInPermission - 开始检查签到权限');
console.log('confirm.vue checkTeacherSignInPermission - qdId:', qdId.value);
console.log('confirm.vue checkTeacherSignInPermission - userInfo.value.id:', userInfo.value?.id);
try {
console.log('confirm.vue checkTeacherSignInPermission - 准备调用qdzxFindByQdAndJsApi');
const result = await qdzxFindByQdAndJsApi({
qdId: qdId.value,
jsId: userInfo.value.id
});
console.log('confirm.vue checkTeacherSignInPermission - API调用结果:', result);
if (result && result.resultCode === 1 && result.result) {
//
console.log('confirm.vue checkTeacherSignInPermission - 找到签到记录');
qdzxRecord.value = result.result;
qdzxId.value = result.result.id;
//
console.log('confirm.vue checkTeacherSignInPermission - 准备调用loadMeetingInfo');
await loadMeetingInfo();
} else if (result && result.resultCode === 0) {
//
console.log('confirm.vue checkTeacherSignInPermission - 未找到签到记录');
currentStep.value = 'notInList';
await loadMeetingInfo(); //
} else {
//
console.log('confirm.vue checkTeacherSignInPermission - 查询失败:', result);
uni.showToast({ title: '查询签到权限失败', icon: 'none' });
}
} catch (error) {
console.error('confirm.vue checkTeacherSignInPermission - 网络异常:', error);
uni.showToast({ title: '网络异常,请重试', icon: 'none' });
}
};

View File

@ -46,8 +46,18 @@
<LcglSp :yw-id="xkTf.id" yw-type="XK_TF" />
</view>
<template #bottom>
<YwConfirm :spApi="xkTfSpApi" :stopApi="xkTfStopApi"
:transferApi="xkTfTransferApi" :params="spParams" v-if="xkTf.id" />
<YwConfirm
:spApi="xkTfSpApi"
:stopApi="xkTfStopApi"
:transferApi="xkTfTransferApi"
:params="spParams"
:showReject="true"
:showTransfer="true"
:showApprove="true"
:showReturn="false"
:showStop="false"
:showXtDk="false"
v-if="xkTf.id" />
</template>
</BasicLayout>
</template>