318 lines
7.6 KiB
Vue
Raw Normal View History

<template>
2025-08-29 15:23:48 +08:00
<BasicLayout :fixed="false">
<view class="p-15">
<BasicForm @register="register">
<template #dkmx>
2025-09-24 11:34:23 +08:00
<view class="mt-15" v-if="formData.dkfs === 0">
<JsQjDkEdit :data="formData" ref="dkRef" />
</view>
2025-08-29 15:23:48 +08:00
</template>
<template #spcs>
<BasicSpCsMgr
2025-09-22 18:11:59 +08:00
rule-id="yfzc_js_qj"
:yw-id="formData.id"
@change="onSpCsChange"
2025-08-29 01:27:54 +08:00
/>
2025-08-29 15:23:48 +08:00
</template>
</BasicForm>
</view>
<template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
2025-09-22 18:11:59 +08:00
<u-button text="取消" class="ml-15 mr-7" :plain="true" @click="goBack" />
2025-08-29 15:23:48 +08:00
<u-button text="提交" class="mr-15 mr-7" type="primary" @click="submit" />
</view>
</view>
2025-08-29 15:23:48 +08:00
</template>
</BasicLayout>
</template>
<script setup lang="ts">
2025-08-29 15:23:48 +08:00
import JsQjDkEdit from "./jsQjDkEdit.vue"
import BasicSpCsMgr from "@/components/BasicSpCsMgr/index.vue"
import { useForm } from "@/components/BasicForm/hooks/useForm";
import { jsQjSqApi, jsQjCxtjApi } from "@/api/base/jsQjApi";
import { showToast } from "@/utils/uniapp";
import dayjs from "dayjs";
import { useUserStore } from "@/store/modules/user";
import { useDicStore } from "@/store/modules/dic";
2025-09-24 11:34:23 +08:00
import { QjPageUtils } from "@/utils/qjPageUtils";
2025-08-29 15:23:48 +08:00
const { getJs, getUser } = useUserStore();
const { findByPid } = useDicStore();
2025-08-29 01:27:54 +08:00
2025-08-29 15:23:48 +08:00
// 接收外部传入属性
const props = withDefaults(defineProps<{
data?: any
}>(), {
data: () => ({
id: "",
2025-09-08 22:33:14 +08:00
qjlx: "",
qjkstime: "",
qjjstime: "",
qjsc: "",
qjsy: "",
2025-08-29 15:23:48 +08:00
dkfs: 0,
sprList: [],
csrList: [],
})
});
2025-08-29 15:23:48 +08:00
let formData = ref<any>({
...props.data,
jsId: getJs.id,
});
2025-07-24 13:34:56 +08:00
2025-08-29 15:23:48 +08:00
const dkRef = ref<any>(null);
2025-08-29 15:23:48 +08:00
const [register, { setValue, getValue }] = useForm({
schema: [
{
field: "qjlx",
label: "请假类型",
required: true,
component: "BasicPicker",
componentProps: {
api: findByPid,
2025-09-08 22:33:14 +08:00
param: { pid: 1405417393 },
2025-08-29 15:23:48 +08:00
rangeKey: "dictionaryValue",
savaKey: "dictionaryCode",
},
},
{
field: "qjkstime",
label: "开始时间",
component: "BasicDateTimes",
required: true,
componentProps: {
type: 'datetime',
change: (e: string) => changeKsTime(e)
},
},
{
field: "qjjstime",
label: "结束时间",
component: "BasicDateTimes",
required: true,
componentProps: {
type: 'datetime',
change: (e: string) => changeJsTime(e)
},
},
{
field: "qjsc",
label: "请假时长",
component: "BasicInput",
componentProps: {
disabled: true,
placeholder: "请输入选择开始时间和结束时间"
},
},
{
field: "qjsy",
label: "请假事由",
component: "BasicInput",
required: true,
itemProps: {
labelPosition: "top",
},
componentProps: {
type: "textarea",
},
},
{ interval: true },
{
field: "dkfs",
label: "代课方式",
component: "BasicCheckbox",
required: true,
itemProps: {
labelPosition: "top",
},
componentProps: {
data: [
{ value: 0, text: "自行协调" },
{ value: 1, text: "教科处协调" },
{ value: 2, text: "无须代课" },
],
change: (value: any) => {
formData.value.dkfs = value;
updateDk();
},
},
},
{ colSlot: "dkmx" },
{ interval: true },
{ colSlot: "spcs" },
],
});
2025-08-29 15:23:48 +08:00
const changeKsTime = (selectedTime?: string) => {
if (!selectedTime) {
return;
}
2025-08-29 15:23:48 +08:00
formData.value.qjkstime = selectedTime;
validateTime();
};
2025-08-29 15:23:48 +08:00
const changeJsTime = (selectedTime?: string) => {
if (!selectedTime) {
return;
}
2025-08-29 15:23:48 +08:00
formData.value.qjjstime = selectedTime;
validateTime();
};
2025-08-29 01:27:54 +08:00
2025-08-29 15:23:48 +08:00
const validateTime = () => {
const data = formData.value;
if (!data.qjkstime || !data.qjjstime) {
return false;
}
2025-08-29 15:23:48 +08:00
// 使用dayjs库进行时间比较
const ksTime = dayjs(data.qjkstime).valueOf();
const jsTime = dayjs(data.qjjstime).valueOf();
if (ksTime > jsTime) {
uni.showToast({
title: "请假开始时间不能大于请假结束时间!",
icon: "none",
});
return false;
2025-07-24 13:34:56 +08:00
}
2025-08-29 15:23:48 +08:00
// 计算请假时长(小时)
data.qjsc = Math.round((jsTime - ksTime) / (1000 * 60 * 60)) + "小时";
setValue({ qjsc: data.qjsc });
updateDk();
return true;
2025-08-29 01:27:54 +08:00
}
2025-07-24 13:34:56 +08:00
2025-08-29 15:23:48 +08:00
const updateDk = () => {
nextTick(() => {
if (dkRef.value) {
dkRef.value.getPkkbList();
}
});
2025-08-29 15:23:48 +08:00
};
2025-07-24 13:34:56 +08:00
2025-09-22 18:11:59 +08:00
const initDk = () => {
nextTick(() => {
if (dkRef.value) {
dkRef.value.initDkList();
}
});
}
2025-08-29 01:27:54 +08:00
2025-08-29 15:23:48 +08:00
const submit = async () => {
const fd = await getValue();
if (!validateTime()) {
return;
2025-07-25 13:52:59 +08:00
}
2025-08-29 15:23:48 +08:00
const params = { ...fd };
2025-09-22 22:20:00 +08:00
// 注入审批人/抄送人
params.sprList = formData.value.sprList || [];
params.csrList = formData.value.csrList || [];
2025-08-29 15:23:48 +08:00
if (fd.dkfs === 0) {
const dkList = dkRef.value.getDkList();
if (!dkList.length) {
uni.showToast({
title: "请选择代课教师",
icon: "none",
});
return;
}
if (dkList.length) {
2025-09-24 11:34:23 +08:00
let emptyJsList:any = [];
2025-08-29 15:23:48 +08:00
params.dkList = dkList.map((item: any) => {
const newItem = {...item};
2025-09-24 11:34:23 +08:00
newItem.jsId = item.dkJsId;
newItem.jsName = item.dkJsName;
newItem.userId = item.dkUserId || item.userId;
2025-08-29 15:23:48 +08:00
newItem.pkkbId = item.id;
newItem.dktime = item.dktime + " 00:00:00";
newItem.id = "";
newItem.qjId = "";
2025-09-24 11:34:23 +08:00
if (!newItem.jsId) {
emptyJsList.push(item);
}
2025-08-29 15:23:48 +08:00
return newItem;
});
2025-09-24 11:34:23 +08:00
if (emptyJsList.length) {
const item = emptyJsList[0];
uni.showToast({
title: `请选择${item.dktime}${QjPageUtils.wdNameList[item.xq - 1]})的${item.jcmc}的代课教师`,
icon: "none",
});
return;
}
2025-08-29 15:23:48 +08:00
} else {
params.dkList = [];
2025-08-29 01:27:54 +08:00
}
}
2025-08-29 15:23:48 +08:00
let submitApi = jsQjSqApi;
if (props.data && props.data.id) {
submitApi = jsQjCxtjApi
2025-09-22 18:11:59 +08:00
params.id = props.data.id;
params.jsId = getJs.id;
params.jsName = getJs.jsxm;
2025-08-29 15:23:48 +08:00
} else {
params.id = null;
params.jsId = getJs.id;
params.jsName = getJs.jsxm;
}
console.log("请假参数:", params);
2025-08-29 15:23:48 +08:00
uni.showLoading({ title: "提交中..." });
await submitApi(params).then(() => {
showToast({ title: "提交成功", icon: "success" });
uni.reLaunch({
url: "/pages/base/service/index"
});
});
uni.hideLoading();
};
// 审批/抄送选人变更回调
const onSpCsChange = (payload: any) => {
2025-09-22 22:20:00 +08:00
console.log("onSpCsChange:", payload);
if (payload) {
formData.value.sprList = Array.isArray(payload.sprList) ? payload.sprList : [];
formData.value.csrList = Array.isArray(payload.csrList) ? payload.csrList : [];
}
};
2025-09-22 18:11:59 +08:00
const goBack = () => {
if (props.data && props.data.id) {
uni.reLaunch({ url: "/pages/base/message/index" });
} else {
uni.reLaunch({ url: "/pages/base/service/index" });
}
};
onMounted(() => {
2025-09-22 22:20:00 +08:00
const t = {
jsId: formData.value.jsId || getJs.id,
sprList: formData.value.sprList || [],
csrList: formData.value.csrList || [],
dkfs: formData.value.dkfs || 0
};
formData.value = {
...props.data,
...t
};
formData.value.dkfs = parseInt(props.data.dkfs);
2025-09-22 18:11:59 +08:00
if (props.data && props.data.id) {
// 初始化
2025-09-22 21:21:28 +08:00
setValue(formData.value);
2025-09-22 18:11:59 +08:00
initDk();
2025-09-22 21:21:28 +08:00
} else {
setValue(formData.value);
2025-09-22 18:11:59 +08:00
}
2025-09-22 22:20:00 +08:00
console.log("onMounted:", formData.value);
2025-09-22 18:11:59 +08:00
});
2025-08-29 15:23:48 +08:00
</script>
<style lang="scss" scoped>
:deep(.global-bg-color) { background-color: #fff; }
/* 保持BasicForm区块背景统一 */
:deep(.white-bg-color) { background-color: #fff; }
2025-08-29 01:27:54 +08:00
</style>