审批调整
This commit is contained in:
parent
5222b1c8e6
commit
2d2314c336
@ -164,3 +164,5 @@ const setDefaultValue = () => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 += `×tamp=${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"
|
||||
});
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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参数,不执行初始化');
|
||||
// 如果没有qdId参数,检查Token状态
|
||||
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, '毫秒');
|
||||
}
|
||||
}
|
||||
|
||||
// 第二步:通过qdId和教师ID查询该教师是否能签到
|
||||
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' });
|
||||
}
|
||||
};
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user