diff --git a/src/components/LcglSp/index.vue b/src/components/LcglSp/index.vue index 7132c41..55381fb 100644 --- a/src/components/LcglSp/index.vue +++ b/src/components/LcglSp/index.vue @@ -52,7 +52,7 @@ - + + <!– 更多按钮 –> {{ csrExpanded ? '收起' : `更多(${csrSpList.length - 2})` }} - + --> 操作记录({{ logList.length || 0 }}) diff --git a/src/pages/base/qj/components/xsQjEdit.vue b/src/pages/base/qj/components/xsQjEdit.vue index 77d8e79..bad51a1 100644 --- a/src/pages/base/qj/components/xsQjEdit.vue +++ b/src/pages/base/qj/components/xsQjEdit.vue @@ -1,8 +1,47 @@ @@ -45,6 +103,12 @@ import dayjs from "dayjs"; import { useUserStore } from "@/store/modules/user"; import { useCommonStore } from "@/store/modules/common"; import { useDebounce } from "@/utils/debounce"; +import DatetimePicker from "@/components/BasicPicker/TimePicker/DatetimePicker.vue"; + +// 定义事件 +const emit = defineEmits<{ + (e: 'submit-success'): void +}>(); const { getCurXs, getUser } = useUserStore(); const { findByPid } = useDicStore(); @@ -52,6 +116,14 @@ const commonStore = useCommonStore(); // 替换 isSubmitting 状态为 useDebounce const { isProcessing: isSubmitting, debounce } = useDebounce(2000); +// 自定义时间选择器控制 +const startTimePicker = ref(null); +const endTimePicker = ref(null); + +// 签名组件引用 +const signCompRef = ref(null); +const signFile = ref(null); + // 接收外部传入属性 const props = withDefaults(defineProps<{ data?: any @@ -67,7 +139,11 @@ const props = withDefaults(defineProps<{ }) }); -let formData = ref({}); +let formData = ref({ + qjkstime: "", + qjjstime: "", + qjsc: "" +}); let approverName = ref(''); // 审批人姓名(班主任) const [register, { getValue, setValue }] = useForm({ @@ -84,37 +160,11 @@ const [register, { getValue, setValue }] = useForm({ savaKey: "dictionaryCode", }, }, - { interval: true }, - { - 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: "请输入选择开始时间和结束时间" - }, - }, - { interval: true }, + ], +}); + +const [register2, { getValue: getValue2, setValue: setValue2 }] = useForm({ + schema: [ { field: "qjsy", label: "请假事由", @@ -142,20 +192,11 @@ const [register, { getValue, setValue }] = useForm({ ], }, }, - // { - // field: "qjtp", - // label: "请假图片", - // component: "BasicUpload", - // required: true, - // itemProps: { - // labelPosition: "top", - // }, - // componentProps: {}, - // }, ], }); setValue(props.data) +setValue2(props.data) const goHome = () => { uni.reLaunch({ @@ -163,6 +204,30 @@ const goHome = () => { }); }; +// 日期格式化函数 +const formatDate = (dateString: string | null): string | null => { + if (!dateString) return null; + const date = new Date(dateString); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +}; + +// 自定义时间选择器确认事件处理 +const handleStartTimeConfirm = (e: any) => { + formData.value.qjkstime = formatDate(e.value); + calculateDuration(); +}; + +const handleEndTimeConfirm = (e: any) => { + formData.value.qjjstime = formatDate(e.value); + calculateDuration(); +}; + // 获取默认审批人信息 onMounted(async () => { await getDefaultApprover(); @@ -180,25 +245,37 @@ const getDefaultApprover = async () => { } }; -const changeKsTime = (selectedTime?: string) => { - if (!selectedTime) { +// 计算请假时长(不显示错误提示) +const calculateDuration = () => { + const data = formData.value; + // 如果两个时间都不存在,直接返回 + if (!data.qjkstime || !data.qjjstime) { + data.qjsc = ""; return; } - formData.value.qjkstime = selectedTime; - validateTime(); -}; - -const changeJsTime = (selectedTime?: string) => { - if (!selectedTime) { + // 使用dayjs库进行时间比较 + const ksTime = dayjs(data.qjkstime).valueOf(); + const jsTime = dayjs(data.qjjstime).valueOf(); + if (ksTime > jsTime) { + uni.showToast({ + title: "请假开始时间不能大于请假结束时间!", + icon: "none", + }); + data.qjsc = ""; return; } - formData.value.qjjstime = selectedTime; - validateTime(); -}; + // 计算请假时长(小时) + data.qjsc = Math.round((jsTime - ksTime) / (1000 * 60 * 60)) + "小时"; +} +// 验证时间(用于提交时的完整验证) const validateTime = () => { const data = formData.value; if (!data.qjkstime || !data.qjjstime) { + uni.showToast({ + title: "请选择开始时间和结束时间", + icon: "none", + }); return false; } // 使用dayjs库进行时间比较 @@ -213,16 +290,40 @@ const validateTime = () => { } // 计算请假时长(小时) data.qjsc = Math.round((jsTime - ksTime) / (1000 * 60 * 60)) + "小时"; - setValue({ qjsc: data.qjsc }); return true; } const submit = debounce(async () => { - const fd = await getValue(); if (!validateTime()) { return; } - const params = { ...fd }; + + // 获取签名 + const signData = await signCompRef.value.getSyncSignature(); + if (!signData) { + uni.showToast({ + title: "请签名", + icon: "none", + }); + return; + } + signFile.value = signData.base64; + + const fd = await getValue(); + const fd2 = await getValue2(); + + // 组合班级别称:njbc + "(" + bjmc + ")" + const bc = getCurXs.njbc ? `${getCurXs.njbc}(${getCurXs.bjmc || ''})` : (getCurXs.bjmc || ''); + + const params = { + ...fd, + ...fd2, + qjkstime: formData.value.qjkstime, + qjjstime: formData.value.qjjstime, + qjsc: formData.value.qjsc, + signFile: signFile.value, // 添加签名数据 + bc: bc // 添加班级别称 + }; if (props.data && props.data.id) { params.id = props.data.id; } else { @@ -241,7 +342,8 @@ const submit = debounce(async () => { setTimeout(() => { if (res.resultCode === 1) { showToast({ title: "提交成功", icon: "success" }); - goHome(); + // 触发提交成功事件,切换到请假记录页 + emit('submit-success'); } else { showToast({ title: res.message, icon: "error" }); } @@ -251,6 +353,78 @@ const submit = debounce(async () => {