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 @@
+
+
+
+
+
+
+
+
+ *
+ 开始时间
+
+
+ {{ formData.qjkstime || "请选择开始时间" }}
+
+
+
+
+
+
+ *
+ 结束时间
+
+
+ {{ formData.qjjstime || "请选择结束时间" }}
+
+
+
+
+
+ 请假时长
+
+ {{ formData.qjsc || "请输入选择开始时间和结束时间" }}
+
+
+
+
+
+
+
审批信息
@@ -14,6 +53,9 @@
+
+
+
@@ -33,6 +75,22 @@
+
+
+
+
@@ -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 () => {