|
@@ -1,12 +1,12 @@
|
|
|
<template>
|
|
<template>
|
|
|
<el-drawer
|
|
<el-drawer
|
|
|
v-model="isDrawer"
|
|
v-model="isDrawer"
|
|
|
- size="480"
|
|
|
|
|
|
|
+ size="500"
|
|
|
:title="props.type === 'add' ? '添加监控调阅记录' : '编辑监控调阅记录'"
|
|
:title="props.type === 'add' ? '添加监控调阅记录' : '编辑监控调阅记录'"
|
|
|
@close="handleCloseDrawer"
|
|
@close="handleCloseDrawer"
|
|
|
>
|
|
>
|
|
|
<el-form ref="formRef" :model="formParams" :rules="rules" label-placement="left" :label-width="95">
|
|
<el-form ref="formRef" :model="formParams" :rules="rules" label-placement="left" :label-width="95">
|
|
|
- <el-form-item label="工号" prop="staffNo" style="margin-bottom: 8px">
|
|
|
|
|
|
|
+ <el-form-item label="工号" prop="staffNo" style="margin-bottom: 18px">
|
|
|
<el-input placeholder="请输入工号" v-model="formParams.staffNo" v-if="staffNoHtmlType === 'INPUT'" />
|
|
<el-input placeholder="请输入工号" v-model="formParams.staffNo" v-if="staffNoHtmlType === 'INPUT'" />
|
|
|
<el-tree-select
|
|
<el-tree-select
|
|
|
v-model="formParams.staffNo"
|
|
v-model="formParams.staffNo"
|
|
@@ -36,20 +36,24 @@
|
|
|
:disabled="staffNoHtmlType === 'SELECT'"
|
|
:disabled="staffNoHtmlType === 'SELECT'"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="所属部门" prop="deptName">
|
|
|
|
|
|
|
+ <el-form-item label="所属部门" prop="deptId">
|
|
|
<el-tree-select
|
|
<el-tree-select
|
|
|
- v-model="formParams.deptName"
|
|
|
|
|
|
|
+ v-model="formParams.deptId"
|
|
|
:data="departmentArr"
|
|
:data="departmentArr"
|
|
|
:render-after-expand="false"
|
|
:render-after-expand="false"
|
|
|
:default-expand-all="true"
|
|
:default-expand-all="true"
|
|
|
- check-strictly
|
|
|
|
|
:placeholder="staffNoHtmlType === 'INPUT' ? '请选择部门' : '请选择工号,此项自动填充'"
|
|
:placeholder="staffNoHtmlType === 'INPUT' ? '请选择部门' : '请选择工号,此项自动填充'"
|
|
|
class="protocal-select"
|
|
class="protocal-select"
|
|
|
:filter-node-method="filterDept"
|
|
:filter-node-method="filterDept"
|
|
|
filterable
|
|
filterable
|
|
|
clearable
|
|
clearable
|
|
|
:disabled="staffNoHtmlType === 'SELECT'"
|
|
:disabled="staffNoHtmlType === 'SELECT'"
|
|
|
- />
|
|
|
|
|
|
|
+ @change="handleChangeDept"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #default>
|
|
|
|
|
+ {{ formParams.deptName }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-tree-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="调阅位置" prop="accessLocation">
|
|
<el-form-item label="调阅位置" prop="accessLocation">
|
|
|
<el-input
|
|
<el-input
|
|
@@ -69,6 +73,7 @@
|
|
|
end-placeholder="结束时间"
|
|
end-placeholder="结束时间"
|
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
|
|
+ placement="left"
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
@change="handleChangeAccessTimeRange"
|
|
@change="handleChangeAccessTimeRange"
|
|
|
/>
|
|
/>
|
|
@@ -85,7 +90,7 @@
|
|
|
<el-radio :value="1">已调阅</el-radio>
|
|
<el-radio :value="1">已调阅</el-radio>
|
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="审批单上传" prop="approvalFormUrl" :rules="approvalFormRules">
|
|
|
|
|
|
|
+ <el-form-item label="审批单上传" prop="approvalFormUrl">
|
|
|
<UploadImages
|
|
<UploadImages
|
|
|
ref="uploadImagesRef"
|
|
ref="uploadImagesRef"
|
|
|
:maxCount="1"
|
|
:maxCount="1"
|
|
@@ -142,7 +147,7 @@
|
|
|
const { id, realname, staffNo } = useUserInfoHook();
|
|
const { id, realname, staffNo } = useUserInfoHook();
|
|
|
|
|
|
|
|
const formRef = ref<FormInstance>();
|
|
const formRef = ref<FormInstance>();
|
|
|
- const formParams = ref<SurveillanceInfoStruct & { accessTimeRange: [string, string] }>({
|
|
|
|
|
|
|
+ const formParams = ref<SurveillanceInfoStruct & { accessTimeRange: [string, string] | null }>({
|
|
|
id: 0,
|
|
id: 0,
|
|
|
staffNo: '',
|
|
staffNo: '',
|
|
|
userName: '',
|
|
userName: '',
|
|
@@ -151,7 +156,7 @@
|
|
|
accessLocation: '',
|
|
accessLocation: '',
|
|
|
accessStartTime: '',
|
|
accessStartTime: '',
|
|
|
accessEndTime: '',
|
|
accessEndTime: '',
|
|
|
- accessTimeRange: ['', ''],
|
|
|
|
|
|
|
+ accessTimeRange: null,
|
|
|
isCopy: 0,
|
|
isCopy: 0,
|
|
|
accessStatus: 0,
|
|
accessStatus: 0,
|
|
|
approvalFormUrl: '',
|
|
approvalFormUrl: '',
|
|
@@ -166,25 +171,23 @@
|
|
|
const rules = reactive<FormRules<SurveillanceInfoStruct & { accessTimeRange: [string, string] }>>({
|
|
const rules = reactive<FormRules<SurveillanceInfoStruct & { accessTimeRange: [string, string] }>>({
|
|
|
staffNo: { required: true, message: '工号不能为空', trigger: 'blur' },
|
|
staffNo: { required: true, message: '工号不能为空', trigger: 'blur' },
|
|
|
userName: { required: true, message: '姓名不能为空', trigger: 'blur' },
|
|
userName: { required: true, message: '姓名不能为空', trigger: 'blur' },
|
|
|
- deptName: { required: true, message: '所属部门不能为空', trigger: 'blur' },
|
|
|
|
|
|
|
+ deptId: { required: true, message: '所属部门不能为空', trigger: 'blur' },
|
|
|
accessLocation: { required: true, message: '调阅位置不能为空', trigger: 'blur' },
|
|
accessLocation: { required: true, message: '调阅位置不能为空', trigger: 'blur' },
|
|
|
- accessTimeRange: { required: true, message: '调阅时段不能为空', trigger: 'change' },
|
|
|
|
|
- isCopy: { required: true, message: '请选择是否拷贝', trigger: 'change' },
|
|
|
|
|
- accessStatus: { required: true, message: '请选择调阅状态', trigger: 'change' },
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- // 审批单上传验证规则
|
|
|
|
|
- const approvalFormRules = [
|
|
|
|
|
- {
|
|
|
|
|
- validator: (_: unknown, value: string, callback: (err?: Error) => void) => {
|
|
|
|
|
- if (!value || value.trim() === '') {
|
|
|
|
|
- return callback(new Error('请上传审批单'));
|
|
|
|
|
|
|
+ accessTimeRange: {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
|
|
+ if (!value || !Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {
|
|
|
|
|
+ callback(new Error('调阅时段不能为空'));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ callback();
|
|
|
}
|
|
}
|
|
|
- callback();
|
|
|
|
|
},
|
|
},
|
|
|
- trigger: ['blur', 'change'],
|
|
|
|
|
|
|
+ trigger: 'change',
|
|
|
},
|
|
},
|
|
|
- ];
|
|
|
|
|
|
|
+ isCopy: { required: true, message: '请选择是否拷贝', trigger: 'change' },
|
|
|
|
|
+ accessStatus: { required: true, message: '请选择调阅状态', trigger: 'change' },
|
|
|
|
|
+ approvalFormUrl: { required: true, message: '请上传审批单', trigger: 'change' },
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
const isDrawer = ref(true);
|
|
const isDrawer = ref(true);
|
|
|
const loading = ref(false);
|
|
const loading = ref(false);
|
|
@@ -203,14 +206,7 @@
|
|
|
|
|
|
|
|
const approvalImageList = computed(() => {
|
|
const approvalImageList = computed(() => {
|
|
|
if (!formParams.value.approvalFormUrl) return [];
|
|
if (!formParams.value.approvalFormUrl) return [];
|
|
|
- // 如果是单个URL字符串,转换为数组格式
|
|
|
|
|
- try {
|
|
|
|
|
- const parsed = JSON.parse(formParams.value.approvalFormUrl);
|
|
|
|
|
- return Array.isArray(parsed) ? parsed : [parsed];
|
|
|
|
|
- } catch {
|
|
|
|
|
- // 如果不是JSON格式,直接作为单个URL处理
|
|
|
|
|
- return [{ url: formParams.value.approvalFormUrl }];
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return JSON.parse(formParams.value.approvalFormUrl);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// 通过工号查询组织结构树
|
|
// 通过工号查询组织结构树
|
|
@@ -289,8 +285,12 @@
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ const handleChangeDept = (value) => {
|
|
|
|
|
+ const dept = findNodeInTree(departmentArr.value, value);
|
|
|
|
|
+ formParams.value.deptName = dept ? dept.label : '';
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
const handleChangeAccessTimeRange = () => {
|
|
const handleChangeAccessTimeRange = () => {
|
|
|
- console.log('accessTimeRange', formParams.value.accessTimeRange);
|
|
|
|
|
if (formParams.value.accessTimeRange && formParams.value.accessTimeRange.length === 2) {
|
|
if (formParams.value.accessTimeRange && formParams.value.accessTimeRange.length === 2) {
|
|
|
formParams.value.accessStartTime = formParams.value.accessTimeRange[0];
|
|
formParams.value.accessStartTime = formParams.value.accessTimeRange[0];
|
|
|
formParams.value.accessEndTime = formParams.value.accessTimeRange[1];
|
|
formParams.value.accessEndTime = formParams.value.accessTimeRange[1];
|
|
@@ -299,33 +299,24 @@
|
|
|
|
|
|
|
|
// 格式化审批单图片
|
|
// 格式化审批单图片
|
|
|
const formatApprovalImage = async (file: File) => {
|
|
const formatApprovalImage = async (file: File) => {
|
|
|
- if (!file) return '';
|
|
|
|
|
|
|
+ if (!file) return file;
|
|
|
const fileName = file.name;
|
|
const fileName = file.name;
|
|
|
const res = await uploadFileApi({ bizType: UPLOAD_BIZ_TYPE.ATTACHMENT, fileName, file });
|
|
const res = await uploadFileApi({ bizType: UPLOAD_BIZ_TYPE.ATTACHMENT, fileName, file });
|
|
|
- return res.url;
|
|
|
|
|
|
|
+ return '"' + res.url + '"';
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const handleApprovalUploadChange = async () => {
|
|
const handleApprovalUploadChange = async () => {
|
|
|
approvalImages.value = uploadImagesRef.value!.getUploadedImages();
|
|
approvalImages.value = uploadImagesRef.value!.getUploadedImages();
|
|
|
- if (approvalImages.value && approvalImages.value.length > 0) {
|
|
|
|
|
- const image = approvalImages.value[0]; // 只取第一张图片
|
|
|
|
|
- if (!image.file && image.url) {
|
|
|
|
|
- // 如果已有URL,直接使用
|
|
|
|
|
- formParams.value.approvalFormUrl = image.url;
|
|
|
|
|
- } else if (image.file) {
|
|
|
|
|
- // 如果有新文件,上传后使用新URL
|
|
|
|
|
- const url = await formatApprovalImage(image.file);
|
|
|
|
|
- formParams.value.approvalFormUrl = url;
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- // 如果没有图片,清空URL
|
|
|
|
|
- formParams.value.approvalFormUrl = '';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 手动触发审批单字段的校验
|
|
|
|
|
- if (formRef.value) {
|
|
|
|
|
- formRef.value.validateField('approvalFormUrl');
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const images = await Promise.all(
|
|
|
|
|
+ (approvalImages.value || []).map((item) => {
|
|
|
|
|
+ if (!item.file && item.url) {
|
|
|
|
|
+ return '"' + item.url + '"';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return formatApprovalImage(item.file!);
|
|
|
|
|
+ }
|
|
|
|
|
+ }),
|
|
|
|
|
+ );
|
|
|
|
|
+ formParams.value.approvalFormUrl = '[' + images.toString() + ']';
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 部门过滤函数
|
|
// 部门过滤函数
|
|
@@ -377,18 +368,13 @@
|
|
|
() => props.initialData,
|
|
() => props.initialData,
|
|
|
(newData) => {
|
|
(newData) => {
|
|
|
if (newData) {
|
|
if (newData) {
|
|
|
- formParams.value = { ...newData, accessTimeRange: ['', ''] };
|
|
|
|
|
- // 处理调阅时段
|
|
|
|
|
|
|
+ formParams.value = { ...newData, accessTimeRange: null };
|
|
|
if (newData.accessStartTime && newData.accessEndTime) {
|
|
if (newData.accessStartTime && newData.accessEndTime) {
|
|
|
formParams.value.accessTimeRange = [newData.accessStartTime, newData.accessEndTime];
|
|
formParams.value.accessTimeRange = [newData.accessStartTime, newData.accessEndTime];
|
|
|
}
|
|
}
|
|
|
- // 处理审批单图片 - 直接使用URL字符串
|
|
|
|
|
- // approvalFormUrl 已经是字符串格式,不需要额外处理
|
|
|
|
|
- // 如果有工号,尝试查询用户信息
|
|
|
|
|
if (newData.staffNo) {
|
|
if (newData.staffNo) {
|
|
|
remoteMethod(newData.staffNo);
|
|
remoteMethod(newData.staffNo);
|
|
|
}
|
|
}
|
|
|
- // 编辑模式下,记录人字段保持原有数据,不覆盖
|
|
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{ immediate: true, deep: true },
|
|
{ immediate: true, deep: true },
|
|
@@ -396,7 +382,6 @@
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
initDepartmentList();
|
|
initDepartmentList();
|
|
|
- // 只有在添加模式下才初始化记录人为当前登录用户
|
|
|
|
|
if (props.type === 'add') {
|
|
if (props.type === 'add') {
|
|
|
formParams.value.createdByName = realname;
|
|
formParams.value.createdByName = realname;
|
|
|
}
|
|
}
|