1、完善请假相关页面的显示

2、将待办请假的加载业务逻辑提取到qjPageUtil中
This commit is contained in:
ywyonui 2025-09-05 21:11:32 +08:00
parent 5d77454c4d
commit 978f53aa64
9 changed files with 437 additions and 713 deletions

View File

@ -19,6 +19,10 @@
<text class="label">代课老师:</text>
<view class="value">{{ item.jsName }}</view>
</view>
<view class="info-row">
<text class="label">确认状态:</text>
<view class="value">{{ item.statusLabel }}</view>
</view>
</view>
</view>
</view>
@ -67,6 +71,12 @@ const jsTypeMc: any = {
PM: "下午",
};
const qrStatus: any = {
"wait": "待确认",
"approved": "同意",
"rejected": "拒绝",
};
const dkList = ref<any>([]);
watch(
@ -92,6 +102,7 @@ const init = async () => {
item.jcmc = jsTypeMc[item.jcType] + "第" + item.jc + "节";
const xq: number = item.xq - 1;
item.xqLabel = wdNameList.value[xq];
item.statusLabel = qrStatus[item.qrStatus] || "未知";
return item;
});
//

View File

@ -23,8 +23,11 @@
</view>
<!-- 代课信息 -->
<view v-show="showDkTab && curTabIndex === 1">
<JsQjDetailDk
<view v-show="curTabIndex === 1">
<view v-if="!showDkFlag" class="empty-dk">
<view>{{ showDkEmptyLabel }}</view>
</view>
<JsQjDetailDk v-else
:qjId="qjId"
@loadDkList="handleDkListLoaded"
/>
@ -54,24 +57,18 @@ import ProgressList from "./components/progressList.vue";
const { getData, setData } = useDataStore();
const tabList = ref<any>([{ name: "请假信息", id: "tab-qj" }]);
const tabList = ref<any>([
{ name: "请假信息", id: "tab-qj" },
{ name: "代课信息", id: "tab-dk" },
{ name: "审批流程", id: "tab-sp" }
]);
const curTabIndex = ref(0);
const dbFlag = ref(false);
const qjId = computed(() => getData.id);
const showDkTab = ref(false);
const showDkFlag = ref(false);
const showDkEmptyLabel = ref('');
// Tab
const rebuildTabList = (showDk: boolean) => {
// Tab
tabList.value = [
{ name: "请假信息", id: "tab-qj" },
];
if (showDk) {
tabList.value.push({ name: "代课信息", id: "tab-dk" });
}
tabList.value.push({ name: "审批流程", id: "tab-sp" });
};
// Tab
const switchTab = (index: number) => {
@ -80,8 +77,15 @@ const switchTab = (index: number) => {
const handleQjDataLoaded = (data: any) => {
setData(data);
showDkTab.value = !!(data && data.dkfs != 2);
rebuildTabList(showDkTab.value);
data = data || {};
const dkfs = typeof(data.dkfs) === "string" ? parseInt(data.dkfs) : (data.dkfs || 2);
const bpmStatus = typeof(data.bpmStatus) === "string" ? parseInt(data.bpmStatus) : (data.bpmStatus || 1);
showDkFlag.value = dkfs === 0 || (dkfs === 1 && bpmStatus > 4);
if (dkfs === 1) {
showDkEmptyLabel.value = "等待教科处协调";
} else if (dkfs === 2) {
showDkEmptyLabel.value = "无需代课";
}
};
const handleDkListLoaded = (list: any[]) => {
@ -101,4 +105,12 @@ const goHome = () => {
background-color: #f5f7fa;
}
.empty-dk {
margin: 15px;
background-color: #fff;
border-radius: 8px;
padding: 50px 15px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
text-align: center;
}
</style>

View File

@ -1,289 +1,212 @@
<template>
<BasicLayout>
<view class="p-15">
<!-- 请假信息卡片 -->
<view class="info-card">
<view class="card-header">
<text class="applicant-name">教师{{ qjData.jsName }}的请假申请</text>
</view>
<view class="card-content">
<view class="info-row">
<text class="label">请假老师:</text>
<text class="value">{{ qjData.jsName }}</text>
</view>
<view class="info-row">
<text class="label">请假类型:</text>
<text class="value">{{ qjData.qjlx }}</text>
</view>
<view class="info-row">
<text class="label">请假时间:</text>
<text class="value">{{ qjData.qjkstime }} {{ qjData.qjjstime }}</text>
</view>
<view class="info-row">
<text class="label">请假时长:</text>
<text class="value">{{ qjData.qjsc }}</text>
</view>
<view class="info-row">
<text class="label">请假事由:</text>
<text class="value">{{ qjData.qjsy }}</text>
</view>
<template #top>
<view>
<BasicTabs
class="detail-tabs"
:list="tabList"
bar-width="60px"
scroll-count="4"
:current="curTabIndex"
@change="switchTab"
/>
</view>
</template>
<view class="qj-detail">
<!-- 请假信息 -->
<view v-show="curTabIndex === 0">
<JsQjDetailInfo
:qjId="qjId"
:dbFlag="dbFlag"
@loadQjData="handleQjDataLoaded"
/>
</view>
<!-- 代课信息 -->
<view class="dk-info-card">
<view class="card-header">
<text class="card-title">代课信息</text>
</view>
<view class="card-content">
<view class="info-row">
<text class="label">代课时间:</text>
<text class="value">{{ dkData.dktime }}</text>
</view>
<view class="info-row">
<text class="label">课程名称:</text>
<text class="value">{{ dkData.kcmc }}</text>
</view>
<view class="info-row">
<text class="label">班级:</text>
<text class="value">{{ dkData.bjmc }}</text>
</view>
</view>
<view v-show="showDkTab && curTabIndex === 1">
<JsQjDetailDk
:qjId="qjId"
@loadDkList="handleDkListLoaded"
/>
</view>
<!-- 确认操作 -->
<view class="action-section">
<view class="action-title">确认代课</view>
<view class="action-buttons">
<u-button
text="拒绝代课"
type="error"
@click="handleReject"
class="action-btn"
/>
<u-button
text="确认代课"
type="primary"
@click="handleConfirm"
class="action-btn"
<!-- 审批流程 -->
<view v-show="curTabIndex === 2">
<ProgressList :qjId="qjId" />
</view>
</view>
<template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
<u-button text="驳回" class="ml-15 mr-7" :plain="true" @click="showDlg" />
<u-button text="同意" class="mr-15 mr-7" type="primary" @click="submit" />
</view>
</view>
</template>
<!-- 驳回弹窗 -->
<u-popup
:show="dlgFlag"
mode="center"
:closeOnClickOverlay="false"
@close="closeDlg"
>
<view class="popup-content">
<view class="popup-title">驳回原因</view>
<u-input
v-model="rejectReason"
type="textarea"
placeholder="请填写驳回原因"
:autoHeight="true"
maxlength="200"
/>
<view class="popup-actions flex-row justify-end mt-4">
<u-button class="mr-2" @click="closeDlg">取消</u-button>
<u-button type="primary" @click="handleReject">确定</u-button>
</view>
</view>
</view>
</u-popup>
</BasicLayout>
</template>
<script setup lang="ts">
import { onLoad } from "@dcloudio/uni-app";
import { jsQjDkQrApi } from "@/api/base/jsQjApi";
import { findQjById, findDkByIdApi } from "@/api/base/jsQjApi";
import { xxtsFindByIdApi } from "@/api/base/server";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { navigateBack } from "@/utils/uniapp";
import { onLoad } from "@dcloudio/uni-app";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
import ProgressList from "./components/progressList.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs, loginByOpenId } = useUserStore();
const { getData, setXxts, setData, getXxts } = useDataStore();
const { getJs } = useUserStore();
const { setData } = useDataStore();
const tabList = ref<any>([{ name: "请假信息", id: "tab-qj" }]);
const curTabIndex = ref(0);
const dbFlag = ref(false);
const qjId = ref<string>();
const dkId = ref<string>();
const qjData = ref<any>({});
const dkData = ref<any>({});
const qjId = ref('');
const showDkTab = ref(false);
//
const loadQjData = async () => {
try {
const result: any = await findQjById({ id: qjId.value });
if (result.code === 1) {
qjData.value = result.data;
}
} catch (error) {
console.error('获取请假信息失败:', error);
const dlgFlag = ref(false);
const rejectReason = ref("");
// Tab
const rebuildTabList = (showDk: boolean) => {
// Tab
tabList.value = [
{ name: "请假信息", id: "tab-qj" },
];
if (showDk) {
tabList.value.push({ name: "代课信息", id: "tab-dk" });
}
tabList.value.push({ name: "审批流程", id: "tab-sp" });
};
//
const loadDkData = async () => {
try {
const result: any = await findDkByIdApi({ id: dkId.value });
if (result.code === 1) {
dkData.value = result.data;
}
} catch (error) {
console.error('获取代课信息失败:', error);
}
// Tab
const switchTab = (index: number) => {
curTabIndex.value = index;
};
//
const handleConfirm = async () => {
const handleQjDataLoaded = (data: any) => {
setData(data);
showDkTab.value = !!(data && data.dkfs != 2);
rebuildTabList(showDkTab.value);
};
const handleDkListLoaded = (list: any[]) => {
// JsQjDetail
};
const showDlg = () => {
dlgFlag.value = true;
};
const closeDlg = () => {
dlgFlag.value = false;
};
const submit = async () => {
const params = {
qjId: qjId.value,
jsId: getJs.id,
qrStatus: "1", // 1
remark: "确认代课"
spStatus: "approved",
spRemark: "同意",
};
uni.showLoading({ title: "确认中..." });
try {
await jsQjDkQrApi(params);
uni.showToast({ title: "确认成功", icon: "success" });
navigateBack();
} catch (error) {
uni.showToast({ title: "确认失败", icon: "error" });
}
uni.hideLoading();
setTimeout(() => {
uni.reLaunch({ url: '/pages/base/message/index' });
}, 1000);
};
//
//
const handleReject = async () => {
uni.showModal({
title: "确认拒绝",
content: "确定要拒绝代课吗?",
success: async (res) => {
if (res.confirm) {
if (!rejectReason.value.trim()) {
uni.showToast({ title: "请填写驳回意见", icon: "none" });
return;
}
const params = {
qjId: qjId.value,
jsId: getJs.id,
qrStatus: "2", // 2
remark: "拒绝代课"
spStatus: "rejected",
spRemark: rejectReason.value,
};
uni.showLoading({ title: "处理中..." });
try {
uni.showLoading({ title: "正在驳回..." });
await jsQjDkQrApi(params);
uni.showToast({ title: "已拒绝", icon: "success" });
navigateBack();
} catch (error) {
uni.showToast({ title: "操作失败", icon: "error" });
}
uni.hideLoading();
}
}
});
closeDlg();
setTimeout(() => {
uni.reLaunch({ url: '/pages/base/message/index' });
}, 1000);
};
onLoad(async (data?: any) => {
//
console.log(data);
if (data && data.from && data.from == "db") {
dbFlag.value = true;
//
const isLoggedIn = await loginByOpenId(data.openId);
if (!isLoggedIn) {
console.log("用户未登录,跳过处理");
const ret = await QjPageUtils.init(data);
if (!ret || !ret.success) {
return;
}
try {
// urlidXxts
const xxtsRes = await xxtsFindByIdApi({ id: data.id });
if (xxtsRes && xxtsRes.result) {
const xxts = xxtsRes.result;
//
if (xxts.dbZt === "B") {
setData({ id: xxts.xxzbId });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
setXxts(xxts);
qjId.value = xxts.xxzbId;
dkId.value = xxts.xxglId
loadQjData();
loadDkData();
}
} catch (error) {
console.error("获取待办信息失败", error);
// Xxts退
const xxtsData = getXxts;
if (xxtsData && xxtsData.dbZt === "B") {
setData({ id: data.id });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
qjId.value = data.id;
}
} else {
dbFlag.value = false;
//
qjId.value = getData.id || '';
}
qjId.value = ret.qjId;
dbFlag.value = ret.dbFlag;
});
</script>
<style lang="scss" scoped>
.info-card,
.dk-info-card {
background: white;
border-radius: 8px;
margin-bottom: 15px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
.qj-detail {
background-color: #f5f7fa;
}
.card-header {
.info-card {
margin: 15px;
background-color: #fff;
border-radius: 8px;
padding: 15px;
border-bottom: 1px solid #eee;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
.applicant-name,
.card-title {
.card-header {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.card-content {
padding: 15px;
}
.info-row {
display: flex;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
.label {
width: 80px;
font-size: 14px;
color: #666;
flex-shrink: 0;
}
.value {
flex: 1;
font-size: 14px;
color: #333;
}
}
.action-section {
background: white;
border-radius: 8px;
padding: 15px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
.action-title {
.applicant-name {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.divider {
height: 1px;
background-color: #eee;
margin-bottom: 15px;
text-align: center;
}
.action-buttons {
display: flex;
gap: 15px;
.action-btn {
flex: 1;
}
.card-body {
padding: 15px;
}
}
</style>

View File

@ -74,14 +74,14 @@ import { navigateBack } from "@/utils/uniapp";
import { jsQjJwcQrApi } from "@/api/base/jsQjApi";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { ref, computed } from "vue";
import { xxtsFindByIdApi } from "@/api/base/server";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
import ProgressList from "./components/progressList.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs, loginByOpenId } = useUserStore();
const { getData, setXxts, setData, getXxts } = useDataStore();
const { getJs } = useUserStore();
const { setData } = useDataStore();
const tabList = ref<any>([{ name: "请假信息", id: "tab-qj" }]);
const curTabIndex = ref(0);
@ -162,50 +162,12 @@ const handleReject = async () => {
};
onLoad(async (data?: any) => {
//
console.log(data);
if (data && data.from && data.from == "db") {
dbFlag.value = true;
//
const isLoggedIn = await loginByOpenId(data.openId);
if (!isLoggedIn) {
console.log("用户未登录,跳过处理");
const ret = await QjPageUtils.init(data);
if (!ret || !ret.success) {
return;
}
try {
// urlidXxts
const xxtsRes = await xxtsFindByIdApi({ id: data.id });
if (xxtsRes && xxtsRes.result) {
const xxts = xxtsRes.result;
//
if (xxts.dbZt === "B") {
setData({ id: xxts.xxzbId });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
setXxts(xxts);
qjId.value = xxts.xxzbId;
}
} catch (error) {
console.error("获取待办信息失败", error);
// Xxts退
const xxtsData = getXxts;
if (xxtsData && xxtsData.dbZt === "B") {
setData({ id: data.id });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
qjId.value = data.id;
}
} else {
dbFlag.value = false;
//
qjId.value = getData.id || '';
}
qjId.value = ret.qjId;
dbFlag.value = ret.dbFlag;
});
</script>

View File

@ -1,366 +1,176 @@
<template>
<BasicLayout>
<view class="p-15">
<!-- 请假信息卡片 -->
<view class="info-card">
<view class="card-header">
<text class="applicant-name">教师{{ qjData.jsName }}的请假申请</text>
</view>
<view class="card-content">
<view class="info-row">
<text class="label">请假类型:</text>
<text class="value">{{ qjData.qjlx }}</text>
</view>
<view class="info-row">
<text class="label">请假时间:</text>
<text class="value">{{ qjData.qjkstime }} {{ qjData.qjjstime }}</text>
</view>
<view class="info-row">
<text class="label">请假时长:</text>
<text class="value">{{ qjData.qjsc }}</text>
</view>
<view class="info-row">
<text class="label">请假事由:</text>
<text class="value">{{ qjData.qjsy }}</text>
</view>
</view>
</view>
<!-- 代课安排 -->
<view class="dk-arrange-card">
<view class="card-header">
<text class="card-title">代课安排</text>
</view>
<view class="card-content">
<view class="dk-list">
<view
v-for="(dk, index) in dkList"
:key="index"
class="dk-item"
>
<view class="dk-header">
<text class="dk-title">代课{{ index + 1 }}</text>
<u-button
text="删除"
size="mini"
type="error"
@click="removeDk(index)"
<template #top>
<view>
<BasicTabs
class="detail-tabs"
:list="tabList"
bar-width="60px"
scroll-count="4"
:current="curTabIndex"
@change="switchTab"
/>
</view>
<view class="dk-content">
<view class="info-row">
<text class="label">代课教师:</text>
<text class="value">{{ dk.jsName }}</text>
</view>
<view class="info-row">
<text class="label">代课时间:</text>
<text class="value">{{ dk.dktime }}</text>
</view>
<view class="info-row">
<text class="label">课程名称:</text>
<text class="value">{{ dk.kcmc }}</text>
</view>
<view class="info-row">
<text class="label">班级:</text>
<text class="value">{{ dk.bjmc }}</text>
</view>
</view>
</view>
</view>
<view class="add-dk-section">
<u-button
text="添加代课安排"
type="primary"
@click="showDkSelector"
class="add-btn"
</template>
<view class="qj-detail">
<!-- 请假信息 -->
<view v-show="curTabIndex === 0">
<JsQjDetailInfo
:qjId="qjId"
:dbFlag="dbFlag"
@loadQjData="handleQjDataLoaded"
/>
</view>
</view>
<!-- 代课信息 -->
<view v-show="curTabIndex === 1" class="px-15">
<JsQjDkEdit :data="qjData" ref="dkRef" />
</view>
<!-- 提交按钮 -->
<view class="submit-section">
<u-button
text="提交协调结果"
type="primary"
@click="handleSubmit"
class="submit-btn"
/>
<!-- 审批流程 -->
<view v-show="curTabIndex === 2">
<ProgressList :qjId="qjId" />
</view>
</view>
<!-- 代课教师选择弹窗 -->
<u-popup
:show="showSelector"
mode="bottom"
height="70%"
@close="closeSelector"
>
<view class="selector-container">
<view class="selector-header">
<text class="selector-title">选择代课教师</text>
<u-button text="确定" type="primary" @click="confirmSelection" />
</view>
<view class="selector-content">
<u-checkbox-group v-model="selectedDkIds">
<view
v-for="dk in availableDkList"
:key="dk.id"
class="dk-option"
>
<u-checkbox
:value="dk.id"
:label="`${dk.jsName} - ${dk.kcmc} - ${dk.bjmc}`"
/>
</view>
</u-checkbox-group>
<template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
<u-button text="取消" class="ml-15 mr-7" :plain="true" @click="navigateBack" />
<u-button text="提交" class="mr-15 mr-7" type="primary" @click="submit" />
</view>
</view>
</u-popup>
</template>
</BasicLayout>
</template>
<script setup lang="ts">
import { jsQjJwcXtApi } from "@/api/base/jsQjApi";
import { findQjById, getPkkbByJsRangeTimeApi } from "@/api/base/jsQjApi";
import { useUserStore } from "@/store/modules/user";
import { navigateBack } from "@/utils/uniapp";
import { onLoad } from "@dcloudio/uni-app";
import { navigateBack } from "@/utils/uniapp";
import { jsQjJwcXtApi } from "@/api/base/jsQjApi";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDkEdit from "./components/jsQjDkEdit.vue";
import ProgressList from "./components/progressList.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs } = useUserStore();
const { setData, getData } = useDataStore();
const qjId = ref<string>();
const qjData = ref<any>({});
const dkList = ref<any[]>([]);
const availableDkList = ref<any[]>([]);
const selectedDkIds = ref<string[]>([]);
const showSelector = ref(false);
const tabList = ref<any>([
{ name: "请假信息", id: "tab-qj" },
{ name: "代课信息", id: "tab-dk" },
{ name: "审批流程", id: "tab-sp" }
]);
const curTabIndex = ref(1);
//
const loadQjData = async () => {
try {
const result = await findQjById({ id: qjId.value });
if (result.code === 1) {
qjData.value = result.data;
//
await loadAvailableDkList();
}
} catch (error) {
console.error('获取请假信息失败:', error);
}
const dbFlag = ref(false);
const qjId = ref('');
const qjData = computed(() => getData);
const dkRef = ref<any>(null);
// Tab
const switchTab = (index: number) => {
curTabIndex.value = index;
};
//
const loadAvailableDkList = async () => {
try {
const params = {
jsId: qjData.value.jsId,
startTime: qjData.value.qjkstime,
endTime: qjData.value.qjjstime
};
const result = await getPkkbByJsRangeTimeApi(params);
if (result.code === 1) {
availableDkList.value = result.data || [];
const updateDk = () => {
nextTick(() => {
if (dkRef.value) {
dkRef.value.getPkkbList();
}
} catch (error) {
console.error('获取可用代课安排失败:', error);
}
};
//
const showDkSelector = () => {
selectedDkIds.value = [];
showSelector.value = true;
};
//
const closeSelector = () => {
showSelector.value = false;
selectedDkIds.value = [];
};
//
const confirmSelection = () => {
const selectedDks = availableDkList.value.filter(dk =>
selectedDkIds.value.includes(dk.id)
);
//
selectedDks.forEach(dk => {
const dkItem = {
jsId: dk.jsId,
jsName: dk.jsName,
dktime: dk.dktime,
kcmc: dk.kcmc,
bjmc: dk.bjmc,
pkkbId: dk.id
};
dkList.value.push(dkItem);
});
closeSelector();
};
//
const removeDk = (index: number) => {
dkList.value.splice(index, 1);
const handleQjDataLoaded = (data: any) => {
setData(data);
updateDk();
};
//
const handleSubmit = async () => {
if (dkList.value.length === 0) {
uni.showToast({
title: "请至少添加一个代课安排",
icon: "none"
});
return;
}
const handleDkListLoaded = (list: any[]) => {
// JsQjDetail
};
const submit = async () => {
const params = {
qjId: qjId.value,
jsId: getJs.id,
dkList: dkList.value
dkList: [],
};
uni.showLoading({ title: "提交中..." });
try {
await jsQjJwcXtApi(params);
uni.showToast({ title: "协调成功", icon: "success" });
navigateBack();
} catch (error) {
uni.showToast({ title: "协调失败", icon: "error" });
const flag = await dkRef.value.validate();
if (!flag) {
uni.showToast({
title: "请选择代课教师",
icon: "none",
});
return;
}
let dkList = dkRef.value.getDkList() || [];
if (dkList.length) {
params.dkList = dkList.map((item: any) => {
const newItem = { ...item };
newItem.jsId = item.dkJsId;
newItem.jsName = item.dkJsName;
newItem.pkkbId = item.id;
newItem.dktime = item.dktime + " 00:00:00";
newItem.id = "";
newItem.qjId = "";
return newItem;
});
}
uni.showLoading({ title: "提交中..." });
await jsQjJwcXtApi(params);
uni.hideLoading();
setTimeout(() => {
uni.reLaunch({ url: '/pages/base/message/index' });
}, 1000);
};
onLoad((options) => {
if (options.qjId) {
qjId.value = options.qjId;
loadQjData();
onLoad(async (data?: any) => {
const ret = await QjPageUtils.init(data);
if (!ret || !ret.success) {
return;
}
qjId.value = ret.qjId;
dbFlag.value = ret.dbFlag;
});
</script>
<style lang="scss" scoped>
.info-card,
.dk-arrange-card {
background: white;
.qj-detail {
background-color: #f5f7fa;
}
.info-card {
margin: 15px;
background-color: #fff;
border-radius: 8px;
padding: 15px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
.card-header {
font-size: 16px;
font-weight: bold;
color: #333;
margin-bottom: 10px;
.applicant-name {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.divider {
height: 1px;
background-color: #eee;
margin-bottom: 15px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
}
.card-header {
.card-body {
padding: 15px;
border-bottom: 1px solid #eee;
.applicant-name,
.card-title {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.card-content {
padding: 15px;
}
.info-row {
display: flex;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
.label {
width: 80px;
font-size: 14px;
color: #666;
flex-shrink: 0;
}
.value {
flex: 1;
font-size: 14px;
color: #333;
}
}
.dk-list {
.dk-item {
border: 1px solid #eee;
border-radius: 6px;
margin-bottom: 10px;
.dk-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
background-color: #f5f5f5;
border-bottom: 1px solid #eee;
.dk-title {
font-size: 14px;
font-weight: bold;
color: #333;
}
}
.dk-content {
padding: 10px;
}
}
}
.add-dk-section {
margin-top: 15px;
text-align: center;
.add-btn {
width: 100%;
}
}
.submit-section {
margin-top: 20px;
.submit-btn {
width: 100%;
}
}
.selector-container {
height: 100%;
display: flex;
flex-direction: column;
.selector-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px;
border-bottom: 1px solid #eee;
.selector-title {
font-size: 16px;
font-weight: bold;
}
}
.selector-content {
flex: 1;
padding: 15px;
overflow-y: auto;
.dk-option {
padding: 10px 0;
border-bottom: 1px solid #f0f0f0;
}
}
}
</style>

View File

@ -23,8 +23,11 @@
</view>
<!-- 代课信息 -->
<view v-show="showDkTab && curTabIndex === 1">
<JsQjDetailDk
<view v-show="curTabIndex === 1">
<view v-if="!showDkFlag" class="empty-dk">
<view>{{ showDkEmptyLabel }}</view>
</view>
<JsQjDetailDk v-else
:qjId="qjId"
@loadDkList="handleDkListLoaded"
/>
@ -56,21 +59,26 @@ import { navigateBack } from "@/utils/uniapp";
import { jsQjSpApi } from "@/api/base/jsQjApi";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { ref, computed } from "vue";
import { xxtsFindByIdApi } from "@/api/base/server";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
import ProgressList from "./components/progressList.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs, loginByOpenId } = useUserStore();
const { getData, setXxts, setData, getXxts } = useDataStore();
const { getJs } = useUserStore();
const { setData } = useDataStore();
const tabList = ref<any>([{ name: "请假信息", id: "tab-qj" }]);
const tabList = ref<any>([
{ name: "请假信息", id: "tab-qj" },
{ name: "代课信息", id: "tab-dk" },
{ name: "审批流程", id: "tab-sp" }
]);
const curTabIndex = ref(0);
const dbFlag = ref(false);
const qjId = ref('');
const showDkTab = ref(false);
const showDkFlag = ref(false);
const showDkEmptyLabel = ref('');
const [register, { getValue }] = useForm({
schema: [
@ -90,7 +98,7 @@ const [register, { getValue }] = useForm({
},
},
{
field: "spYj",
field: "spRemark",
label: "审批说明",
component: "BasicInput",
required: true,
@ -105,18 +113,6 @@ const [register, { getValue }] = useForm({
],
});
// Tab
const rebuildTabList = (showDk: boolean) => {
// Tab
tabList.value = [
{ name: "请假信息", id: "tab-qj" },
];
if (showDk) {
tabList.value.push({ name: "代课信息", id: "tab-dk" });
}
tabList.value.push({ name: "审批流程", id: "tab-sp" });
};
// Tab
const switchTab = (index: number) => {
curTabIndex.value = index;
@ -124,8 +120,14 @@ const switchTab = (index: number) => {
const handleQjDataLoaded = (data: any) => {
setData(data);
showDkTab.value = !!(data && data.dkfs != 2);
rebuildTabList(showDkTab.value);
data = data || {};
const dkfs = typeof(data.dkfs) === "string" ? parseInt(data.dkfs) : (data.dkfs || 2);
showDkFlag.value = dkfs === 0;
if (dkfs === 1) {
showDkEmptyLabel.value = "审批同意后由教科处协调";
} else if (dkfs === 2) {
showDkEmptyLabel.value = "无需代课";
}
};
const handleDkListLoaded = (list: any[]) => {
@ -135,7 +137,7 @@ const handleDkListLoaded = (list: any[]) => {
const submit = async () => {
try {
const formData = await getValue();
if (!formData.spStatus || !formData.spYj) {
if (!formData.spStatus || !formData.spRemark) {
uni.showToast({
title: '请填写完整的审批信息',
icon: 'none'
@ -147,7 +149,7 @@ const submit = async () => {
qjId: qjId.value,
jsId: getJs.id,
spStatus: formData.spStatus,
spYj: formData.spYj,
spRemark: formData.spRemark,
};
uni.showLoading({
@ -161,11 +163,9 @@ const submit = async () => {
title: '审批提交成功',
icon: 'success'
});
setTimeout(() => {
navigateBack();
}, 1500);
uni.reLaunch({ url: '/pages/base/message/index' });
}, 1000);
} catch (error) {
uni.hideLoading();
uni.showToast({
@ -177,50 +177,12 @@ const submit = async () => {
};
onLoad(async (data?: any) => {
//
console.log(data);
if (data && data.from && data.from == "db") {
dbFlag.value = true;
//
const isLoggedIn = await loginByOpenId(data.openId);
if (!isLoggedIn) {
console.log("用户未登录,跳过处理");
const ret = await QjPageUtils.init(data);
if (!ret || !ret.success) {
return;
}
try {
// urlidXxts
const xxtsRes = await xxtsFindByIdApi({ id: data.id });
if (xxtsRes && xxtsRes.result) {
const xxts = xxtsRes.result;
//
if (xxts.dbZt === "B") {
setData({ id: xxts.xxzbId });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
setXxts(xxts);
qjId.value = xxts.xxzbId;
}
} catch (error) {
console.error("获取待办信息失败", error);
// Xxts退
const xxtsData = getXxts;
if (xxtsData && xxtsData.dbZt === "B") {
setData({ id: data.id });
let url = "/pages/view/hr/jsQj/detail";
uni.navigateTo({ url });
return;
}
qjId.value = data.id;
}
} else {
dbFlag.value = false;
//
qjId.value = getData.id || '';
}
qjId.value = ret.qjId;
dbFlag.value = ret.dbFlag;
});
</script>
@ -229,34 +191,12 @@ onLoad(async (data?: any) => {
background-color: #f5f7fa;
}
.info-card {
.empty-dk {
margin: 15px;
background-color: #fff;
border-radius: 8px;
padding: 15px;
padding: 50px 15px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
.card-header {
font-size: 16px;
font-weight: bold;
color: #333;
margin-bottom: 10px;
.applicant-name {
font-size: 16px;
font-weight: bold;
color: #333;
}
}
.divider {
height: 1px;
background-color: #eee;
margin-bottom: 15px;
}
.card-body {
padding: 15px;
}
text-align: center;
}
</style>

View File

@ -147,7 +147,7 @@ const mediaData = ref({
photoList: [],
videoList: []
});
const dmPsRef = ref(null);
const dmPsRef = ref<any>(null);
const now = dayjs();
let wDay = now.day();

View File

@ -240,6 +240,8 @@ const goDm = (xkkc: any) => {
} else {
msg = "上课时间未到,无法点名";
}
// TODO:
dmFlag = true;
if (dmFlag) {
setData(xkkc);
uni.navigateTo({

64
src/utils/qjPageUtils.ts Normal file
View File

@ -0,0 +1,64 @@
import { xxtsFindByIdApi } from "@/api/base/server";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
const { loginByOpenId } = useUserStore();
const { getData, setXxts, setData, getXxts } = useDataStore();
export const QjPageUtils = {
async init(data?: any) {
let ret = {
success: true,
dbFlag: false,
qjId: getData.id,
};
if (!data || !data.from || data.from != "db") {
return ret;
}
// 从待办过来的,需要从后端获取数据
ret.dbFlag = true;
// 检查登录状态
const isLoggedIn = await loginByOpenId(data.openId);
if (!isLoggedIn) {
console.log("用户未登录,跳过处理");
ret.success = false;
return ret;
}
let url = "/pages/base/message/index";
try {
// 优先从后端根据url中的id去查询Xxts
const xxtsRes = await xxtsFindByIdApi({ id: data.id });
if (xxtsRes && xxtsRes.result) {
const xxts = xxtsRes.result;
// 检查待办状态
if (xxts.dbZt === "B") {
setData({ id: xxts.xxzbId });
url = "/pages/view/hr/jsQj/detail";
uni.reLaunch({ url });
ret.success = false;
} else {
setXxts(xxts);
ret.qjId = xxts.xxzbId;
}
} else {
uni.showToast({
title: "获取消息推送数据失败",
icon: "error",
});
uni.reLaunch({ url });
ret.success = false;
}
return ret;
} catch (error) {
console.error("获取待办信息失败", error);
// 如果获取Xxts失败回退到原来的逻辑
const xxtsData = getXxts;
if (xxtsData && xxtsData.dbZt === "B") {
setData({ id: data.id });
uni.reLaunch({ url });
ret.success = false;
return ret;
}
}
}
}