Files
Docker/WebVue/src/views/master/DmsFileEnquiry.vue
T
2026-09-13 22:45:07 +08:00

1092 lines
32 KiB
Vue

<template>
<a-spin size="large" :spinning="loading" :tip="spinTip">
<div class="dms-file-enquiry">
<Toolbar :path-stack="pathStack" :root-path="rootPath" :loading="loading" @go-top="onGoTop" @go-back="onGoBack"
@refresh="onReSearch" @search="onSearchByName" @breadcrumb-click="onBreadcrumbClick" />
<OperatorStation :selected-items="keys" :upload-url="uploadUrl" :headers="headers" :can-create="canCreate"
:can-amend="canAmend" :can-delete="canDelete" :can-view="canView"
:resolve-file-path="resolveUploadFilePath" @create-folder="onCreate" @upload-start="onUploadStart"
@upload-progress="onUploadProgress" @upload-success="onUploadSuccess" @upload-error="onUploadError"
@download="onDownloadSelected" @share="onShareSelected" @publish="onPublishSelected"
@view-preview="onViewPreviewSelected" @play-video="onUrlVideoPlayItem" @play-audio="onPlayAudioItem"
@pause-audio="onPauseAudio" @continue-audio="onContinueAudio" @preview="onPreviewSelected"
@rename="onAmendSelected" @move="onMoveSelected" @delete="onDeleteSelected" />
<MyComputer :datas="datas" v-model:selected-keys="keys" @select-change="onSelectChange"
@open-folder="onOpenFolder" @open-file="onOpenFile" @preview-image="onPreviewOrgFile" />
</div>
<a-image :width="1024" :style="{ display: 'none' }" :preview="{
visible,
onVisibleChange: setPicVisible,
}" :src="imageSrc" />
<dmsFolder @on-submit="onReload" @submit-start="loading = true" @submit-end="loading = false"></dmsFolder>
<videoPlay></videoPlay>
<dragModal v-model:open="showModalShare" width="60%" title="分享管理查询" :mask-closable="false" :fullscreen="width < 640"
@ok="handleSelectShare">
<DmsFileShareModal ref="shareEnquiry"></DmsFileShareModal>
</dragModal>
<dragModal v-model:open="showModalPublishPhoto" width="60%" title="相册专辑查询" :mask-closable="false"
:fullscreen="width < 640" @ok="handleSelectPublishPhoto">
<PublishPhotoEnquiry ref="publishPhotoEnquiry"></PublishPhotoEnquiry>
</dragModal>
<dragModal v-model:open="showModalPublishAudio" width="60%" title="音乐专辑查询" :mask-closable="false"
:fullscreen="width < 640" @ok="handleSelectPublishAudio">
<PublishAudioEnquiry ref="publishAudioEnquiry"></PublishAudioEnquiry>
</dragModal>
<dragModal v-model:open="showModalPublishVideo" width="60%" title="影视专辑查询" :mask-closable="false"
:fullscreen="width < 640" @ok="handleSelectPublishVideo">
<PublishVideoEnquiry ref="publishVideoEnquiry"></PublishVideoEnquiry>
</dragModal>
</a-spin>
</template>
<script setup lang="ts">
import { reactive, onMounted, onUnmounted, ref, unref, h, provide } from "vue";
import { BindOption } from "@/data/custom/bindOption";
import { SelectOption } from "@/data/auto/selectOption";
import { DmsFileUploadViewDisplayData } from "@/data/auto/dmsFileUploadViewDisplayData";
import { SearchFilter } from "@/data/auto/searchFilter";
import dmsFileService from "@/service/master/dmsFileService";
import publishPhotoService from "@/service/master/publishPhotoService";
import publishAudioService from "@/service/master/publishAudioService";
import { DmsFileSearchCriteria } from "@/data/auto/dmsFileSearchCriteria";
import dragModal from "@/components/basic/DragModal.vue";
import DmsFileShareModal from "./DmsFileShareModal.vue";
import PublishPhotoEnquiry from "./PublishPhotoEnquiry.vue";
import PublishAudioEnquiry from "./PublishAudioEnquiry.vue";
import PublishVideoEnquiry from "./PublishVideoEnquiry.vue";
import { FamilyGroupFolderEntity } from "@/data/auto/familyGroupFolderEntity";
import {
PermissionContext,
usePermissionContext,
} from "@/hooks/PermissionContext";
import { useRoute, useRouter } from "vue-router";
import { useBindOption } from "@/hooks/useBindOption";
import { SearchFilterOperatorPolicy } from "@/data/custom/searchFilterOperatorPolicy";
import { SearchFilterTypePolicy } from "@/data/custom/searchFilterTypePolicy";
import { notification } from "ant-design-vue";
import { SearchCriteriaResultData } from "@/data/auto/searchCriteriaResultData";
import dmsFolder from "./DmsFolderModal.vue";
import { useLoginProfileStore } from "@/store/modules/loginProfile";
import { WebSitePolicy } from "@/policy/custom/webSitePolicy";
import { orderBy } from "lodash-es";
import VideoPlay from "./PlayVideo.vue";
import { Howl } from "howler";
import { PublishVideoEntity } from "@/data/auto/publishVideoEntity";
import publishVideoService from "@/service/master/publishVideoService";
import { useWindowSize } from "@vueuse/core";
import fileTypePolicy from "@/policy/custom/fileTypePolicy";
import { PublishAudioEntity } from "@/data/auto/publishAudioEntity";
import { FamilyFolderFavoriteViewEntity } from "@/data/auto/familyFolderFavoriteViewEntity";
import { DmsFileEntity } from "@/data/auto/dmsFileEntity";
import { PublishData } from "@/data/auto/publishData";
import { PublishPhotoEntity } from "@/data/auto/publishPhotoEntity";
import MyComputer from "@/components/basic/MyComputer.vue";
import Toolbar from "@/components/basic/Toolbar.vue";
import OperatorStation from "@/components/basic/OperatorStation.vue";
interface BreadcrumbItem {
value: string;
displayName: string;
}
const { width } = useWindowSize();
const showModalShare = ref<boolean>(false);
const sharedFileRecord = ref<DmsFileUploadViewDisplayData | null>(null);
const showModalPublishPhoto = ref<boolean>(false);
const showModalPublishAudio = ref<boolean>(false);
const showModalPublishVideo = ref<boolean>(false);
const spinTip = ref<string>("加载中...");
const loading = ref<boolean>(false);
const canView = ref<boolean>(false);
const canAmend = ref<boolean>(false);
const canDelete = ref<boolean>(false);
const canCreate = ref<boolean>(false);
const rootPath = ref<string>("");
const imageSrc = ref<string>("");
const route = useRoute();
const router = useRouter();
const previousFilePath = ref<string>("");
/**
* 上传地址:
* 开发环境指向本地服务,生产环境指向同源根路径。
* 注意 WebApiRoot 生产环境为 "/",必须先去掉结尾斜杠再拼接,
* 否则会得到 "//DmsFile/UploadDmsFile",被浏览器当作协议相对地址(host = dmsfile)而导致解析失败。
*/
const uploadUrl = ref<string>(
`${
(process.env.NODE_ENV === "development"
? WebSitePolicy.WebApiRootDev
: WebSitePolicy.WebApiRoot
).replace(/\/$/, "")
}/DmsFile/UploadDmsFile`
);
const currFilePath = ref<string>("");
const headers = ref({
Authorization: useLoginProfileStore().getToken(),
"Content-Type": "multipart/form-data",
FilePath: currFilePath.value,
});
const bindOptions = ref<BindOption[]>([]);
const datas = ref<DmsFileUploadViewDisplayData[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 999999, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<DmsFileSearchCriteria>(
new DmsFileSearchCriteria(),
);
const keys = ref<DmsFileUploadViewDisplayData[]>([]);
const dmsFolderModal = ref<boolean>(false);
const dmsFolderTitle = ref<string>("新建文件夹");
const dmsFolderIsRename = ref<boolean>(false);
const dmsFolderIsMove = ref<boolean>(false);
const entity = ref<DmsFileEntity>(new DmsFileEntity());
const videoPlayModal = ref<boolean>(false);
const videoSrc = ref<string>("");
const videoPoster = ref<string>("");
const videoType = ref<string>("");
const videoPlayTitle = ref<string>("");
const visible = ref<boolean>(false);
const pathStack = ref<BreadcrumbItem[]>([]);
interface PublishPhotoEnquiry {
keys: PublishPhotoEntity[];
}
const publishPhotoEnquiry = ref<PublishPhotoEnquiry | null>(null);
interface PublishAudioEnquiry {
keys: PublishAudioEntity[];
}
const publishAudioEnquiry = ref<PublishAudioEnquiry | null>(null);
interface PublishVideoEnquiry {
keys: PublishVideoEntity[];
}
const publishVideoEnquiry = ref<PublishVideoEnquiry | null>(null);
interface ShareEnquiry {
keys: FamilyFolderFavoriteViewEntity[];
}
const shareEnquiry = ref<ShareEnquiry | null>(null);
const sound = ref();
const toUploadView = (r: Record<string, any>): DmsFileUploadViewDisplayData =>
r as DmsFileUploadViewDisplayData;
onUnmounted(() => {
sound.value?.stop();
});
const play = (src: string) => {
sound.value?.stop();
if (!src || src == undefined || src == "") {
return;
}
sound.value = new Howl({
src: src,
volume: 0.5,
autoplay: true,
loop: false,
html5: true,
preload: true,
onend: () => {
datas.value.forEach((element) => {
element.IsPlay = "";
});
},
});
sound.value.play();
};
const onPauseAudio = (record: DmsFileUploadViewDisplayData) => {
record.IsPause = "Y";
sound.value?.pause();
};
const onContinueAudio = (record: DmsFileUploadViewDisplayData) => {
record.IsPause = "";
sound.value?.play();
};
const onPlayAudio = (record: DmsFileUploadViewDisplayData) => {
datas.value.forEach((element) => {
if (element.FileId == record.FileId && element.IsPlay == "Y") {
element.IsPlay = "";
} else if (
element.FileId == record.FileId &&
(element.IsPlay == "" ||
element.IsPlay == null ||
element.IsPlay == undefined)
) {
element.IsPlay = "Y";
} else {
element.IsPlay = "";
}
record.IsPause = "";
});
if (record.IsPlay == "") {
sound.value?.stop();
return;
}
play(record.Url);
};
//================provide================
provide("dmsFolderModal", dmsFolderModal);
provide("dmsFolderTitle", dmsFolderTitle);
provide("dmsFolderIsRename", dmsFolderIsRename);
provide("dmsFolderIsMove", dmsFolderIsMove);
provide("DmsFileEntity", entity);
provide("videoPlayModal", videoPlayModal);
provide("videoPlayTitle", videoPlayTitle);
provide("videoSrc", videoSrc);
provide("videoPoster", videoPoster);
provide("videoType", videoType);
provide("isModalPublishVideo", showModalPublishVideo);
provide("isModalPublishAudio", showModalPublishAudio);
provide("isModalPublishPhoto", showModalPublishPhoto);
//================provide================
defineExpose({
keys,
});
onMounted(async () => {
let pContext: PermissionContext = usePermissionContext();
canView.value = pContext.canView(route.meta.permission as string);
canAmend.value = pContext.canAmend(route.meta.permission as string);
canDelete.value = pContext.canDelete(route.meta.permission as string);
canCreate.value = pContext.canCreate(route.meta.permission as string);
await initBindOption();
pathStack.value = [{ value: rootPath.value, displayName: "我的云盘" }];
onSearchByFilePath(rootPath.value);
});
/** 解析上传目标文件夹(DMS 当前路径) */
const resolveUploadFilePath = () => {
const bindOption = bindOptions.value.filter(
(x) => x.BindValue == DmsFileUploadViewDisplayData.DB_FILE_PATH,
)[0];
return bindOption?.Value || currFilePath.value;
};
const onUploadStart = () => {
loading.value = true;
};
const onUploadProgress = (payload: { text?: string }) => {
spinTip.value = payload?.text || "上传中...";
};
const onUploadSuccess = (payload: { total?: number }) => {
const total = payload?.total ?? 1;
let sec = 2500;
if (total > 25) sec = total * 100;
spinTip.value = "加载中...";
setTimeout(() => {
onReSearch();
}, sec);
};
const onUploadError = () => {
loading.value = false;
spinTip.value = "加载中...";
};
const onSelectChange = (selected: DmsFileUploadViewDisplayData[]) => {
keys.value = selected;
};
const onViewPreviewPhoto = async (filePath: string) => {
router.push({ name: "Preview", params: { id: filePath, mode: "list" } });
};
const onViewPreviewAudio = async (filePath: string) => {
router.push({
name: "PreviewAudio",
params: { id: filePath, mode: "list" },
});
};
const onViewPreviewVideo = async (filePath: string) => {
router.push({
name: "PreviewVideo",
params: { id: filePath, mode: "list" },
});
};
const onChangeFolder = async (fvalue: string) => {
onSearchByFilePath(fvalue);
};
const onUrlVideoPlay = (url: string, title: string, poster: string) => {
sound.value?.stop();
datas.value.forEach((element) => {
element.IsPlay = "";
});
videoPoster.value = poster;
videoType.value = "m3u8";
videoSrc.value = url;
videoPlayModal.value = true;
videoPlayTitle.value = title;
};
const onVideoPlay = async (fid: number) => {
dmsFileService
.FindSourceVideoPath(fid)
.then((res) => {
videoType.value = "video/mp4";
videoSrc.value = res;
videoPlayModal.value = true;
})
.catch(() => {
videoPlayModal.value = false;
});
};
const onPreviewFile = async (usernameOrRecord: any, orderKey?: string) => {
let username: string;
let fname: string;
if (typeof usernameOrRecord === "object") {
username = usernameOrRecord.CreatedBy;
fname = usernameOrRecord.OrderKey;
} else {
username = usernameOrRecord;
fname = orderKey!;
}
loading.value = true;
getPreviewFile(username, fname);
};
const onPreviewOrgFile = async (usernameOrRecord: any, orderKey?: string) => {
let fileId: number;
let orgFileName: string;
if (typeof usernameOrRecord === "object") {
fileId = usernameOrRecord.FileId;
orgFileName = usernameOrRecord.OrgFileName;
} else {
fileId = usernameOrRecord;
orgFileName = orderKey!;
}
loading.value = true;
onViewPictureFile(fileId, orgFileName);
};
const getPreviewFile = (username: string, fname: string) => {
let dms: DmsFileEntity = new DmsFileEntity();
dms.CreatedBy = username;
dms.OrderKey = fname;
dmsFileService
.DownloadFilePreview(dms)
.then((res) => {
const downloadUrl = window.URL.createObjectURL(new Blob([res]));
imageSrc.value = downloadUrl;
loading.value = false;
setPicVisible(true);
})
.catch(() => {
loading.value = false;
});
};
const DownloadFileCombine = (
fs: string[],
mergedData: Uint8Array,
index: number,
ttl: number,
total: number,
preview: boolean,
fname: string,
) => {
loading.value = true;
fs[fs.length - 2] = index.toString();
spinTip.value = "加载中(" + index + "/" + total + ")...";
dmsFileService
.DownloadFileCombine(fs.toString().replace(/,/g, "-"))
.then((res) => {
mergedData.set(new Uint8Array(res), ttl);
if (index < total) {
DownloadFileCombine(
fs,
mergedData,
index + 1,
ttl + res.byteLength,
total,
preview,
fname,
);
} else if (index == total) {
loading.value = false;
spinTip.value = "加载中...";
const downloadUrl = window.URL.createObjectURL(
new Blob([mergedData as unknown as BlobPart]),
);
imageSrc.value = downloadUrl;
if (!preview) {
const link = document.createElement("a");
link.href = downloadUrl;
link.setAttribute("download", fname);
document.body.appendChild(link);
link.click();
} else {
setPicVisible(true);
}
}
})
.catch(() => {
spinTip.value = "加载中...";
loading.value = false;
});
};
const onLastFolder = async () => {
if (!datas.value || datas.value.length == 0) {
onSearchByFilePath(previousFilePath.value);
} else {
onPreviousFolder();
}
};
const onPreviousFolder = async () => {
let filePath: string = "";
if (datas.value && datas.value.length > 0) filePath = datas.value[0].FilePath;
dmsFileService.FindFolderNameParentByFolderName(filePath).then((res) => {
if (res && res.length > 0) onSearchByFilePath(res);
});
};
const onPublishPhoto = async () => {
showModalPublishPhoto.value = true;
};
const onPublishAudio = async () => {
showModalPublishAudio.value = true;
};
const onPublishVideo = async () => {
showModalPublishVideo.value = true;
};
const onShareFamily = async (record: Record<string, any>) => {
sharedFileRecord.value = toUploadView(record);
showModalShare.value = true;
};
const onDownloadFile = async (fid: number, fname: string) => {
GetOrgPictureFile(fid, fname, false);
};
const GetOrgPictureFile = async (
fid: number,
fname: string,
preview: boolean,
) => {
if (fileTypePolicy.isVideo(fname)) {
return;
}
loading.value = true;
dmsFileService
.FindByKey(fid)
.then((res) => {
let fs: string[] = res.OrderKey.split("-");
let index: string = fs[fs.length - 2];
let total: string = fs[fs.length - 1].split(".")[0];
var mergedData = new Uint8Array((res.FileSize + 1) * 1024);
let ttl: number = 0;
fs[fs.length - 2] = "1";
spinTip.value = "加载中(1/" + total + ")...";
DownloadFileCombine(
fs,
mergedData,
1,
ttl,
parseInt(total),
preview,
fname,
);
})
.catch(() => {
loading.value = false;
});
};
const onViewPictureFile = async (fid: number, fname: string) => {
GetOrgPictureFile(fid, fname, true);
};
const onSearchByFilePath = async (fvalue: string) => {
setBindOptionValue(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
fvalue,
"",
[fvalue],
false,
);
previousFilePath.value = unref(currFilePath.value);
currFilePath.value = fvalue;
headers.value.FilePath = fvalue;
isSearched.value = true;
if (currentSearchCriteria.value && fvalue && fvalue.length > 0) {
currentSearchCriteria.value.Filter = [];
let filter: SearchFilter;
filter = new SearchFilter();
filter.Column = DmsFileUploadViewDisplayData.DB_FILE_PATH;
filter.Type = "SingleSelection";
filter.Operator = "single";
filter.Value = fvalue;
currentSearchCriteria.value.Filter.push(filter);
} else {
currentSearchCriteria.value.Filter = [];
}
await findBySearchCriteria(unref(currentSearchCriteria));
};
const onViewPic = () => {
if (keys.value.length == 0) return;
if (keys.value[0].IsDirectoryIndc == "Y") {
onChangeFolder(keys.value[0].FileName);
} else if (fileTypePolicy.isImage(keys.value[0].OrgFileName)) {
onPreviewFile(keys.value[0].CreatedBy, keys.value[0].OrderKey);
} else if (fileTypePolicy.isVideo(keys.value[0].OrgFileName)) {
onVideoPlay(keys.value[0].FileId);
} else {
notification.info({
message: "系统提示:",
description: "未知格式无法预览",
placement: "topRight",
});
}
};
const setPicVisible = (value: boolean): void => {
visible.value = value;
};
const onCreate = () => {
dmsFolderTitle.value = "新增文件夹";
dmsFolderIsRename.value = false;
dmsFolderIsMove.value = false;
dmsFolderModal.value = true;
entity.value = new DmsFileEntity();
let bindOption: BindOption = bindOptions.value.filter(
(x) => x.BindValue == DmsFileUploadViewDisplayData.DB_FILE_PATH,
)[0];
entity.value.FilePath = bindOption.SelectOptions.filter(
(x) => x.BindValue == bindOption.Value,
)[0].DisplayName;
entity.value.OrgFileName = bindOption.Value;
currFilePath.value = bindOption.Value;
};
const onAmend = () => {
if (keys.value[0].IsDirectoryIndc == "Y") {
dmsFolderTitle.value = "重命名文件夹";
} else {
dmsFolderTitle.value = "重命名文件";
}
dmsFolderIsRename.value = true;
dmsFolderModal.value = true;
dmsFolderIsMove.value = false;
entity.value = new DmsFileEntity();
entity.value.FileId = keys.value[0].FileId;
entity.value.FilePath = keys.value[0].FolderLocalName;
if (keys.value[0].CreatedBy == keys.value[0].FolderLocalName) {
entity.value.FilePath = "";
}
entity.value.FileName = keys.value[0].OrgFileName;
};
const onMove = () => {
if (keys.value[0].IsDirectoryIndc == "Y") {
dmsFolderTitle.value = "移动文件夹";
} else {
dmsFolderTitle.value = "移动文件";
}
dmsFolderIsRename.value = false;
dmsFolderIsMove.value = true;
dmsFolderModal.value = true;
entity.value = new DmsFileEntity();
entity.value.FileId = keys.value[0].FileId;
entity.value.FilePath = keys.value[0].FolderLocalName;
if (keys.value[0].CreatedBy == keys.value[0].FolderLocalName) {
entity.value.FilePath = "";
}
entity.value.FileName = keys.value[0].FileName;
entity.value.OrgFileName = keys.value[0].OrgFileName;
};
const onDelete = async () => {
try {
loading.value = true;
for (let i = 0; i < keys.value.length; i++) {
await dmsFileService.Delete(keys.value[i].FileId);
}
notification.info({
message: "系统提示:",
description: "记录删除成功",
placement: "topRight",
});
} catch (error) {
}
finally {
loading.value = false;
onReload();
}
};
const setBindOptionValue = (
bindValue: string,
value: string,
value1: string,
values: string[],
disabled: boolean,
) => {
let bindOption: BindOption = bindOptions.value.filter(
(x) => x.BindValue == bindValue,
)[0];
if (!bindOption) return;
bindOption.Value = value;
bindOption.Value1 = value1;
bindOption.Values = values;
bindOption.disabled = disabled;
};
const initBindOption = async () => {
let ubo = useBindOption();
bindOptions.value = [];
bindOptions.value.splice(0, bindOptions.value.length);
let bindOption: BindOption = ubo.getBindOption(
DmsFileUploadViewDisplayData.DB_ORG_FILE_NAME,
"名称",
SearchFilterTypePolicy.TEXT,
SearchFilterOperatorPolicy.CONTAIN,
);
bindOptions.value.push(bindOption);
let rps: SelectOption[] = await dmsFileService.FindDmsFolders();
if (rps && rps.length > 1) {
rootPath.value = rps[1].BindValue;
if (!currFilePath.value) {
currFilePath.value = rps[1].BindValue;
}
}
bindOption = ubo.getBindSelectOption(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
"当前目录",
SearchFilterTypePolicy.SINGLE_SELECTION,
SearchFilterOperatorPolicy.SINGLE,
rps,
);
bindOptions.value.push(bindOption);
setBindOptionValue(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
currFilePath.value,
"",
[currFilePath.value],
false,
);
};
result.value.Page = pagingParams.value.page ?? 1;
result.value.Limit = pagingParams.value.pageSize;
const onSubmit = async (filters: SearchFilter[]) => {
loading.value = true;
let c: DmsFileSearchCriteria = new DmsFileSearchCriteria();
currentFilter.value = filters;
c.Filter = filters;
c.limit = pagingParams.value.pageSize;
c.page = pagingParams.value.page ?? 1;
c.GridColumns = [];
currentSearchCriteria.value = c;
await findBySearchCriteria(c);
};
const findBySearchCriteria = async (c: DmsFileSearchCriteria) => {
keys.value = [];
try {
if (c.limit == 0) c.limit = pagingParams.value.pageSize;
if (c.page == 0) c.page = pagingParams.value.page ?? 1;
currentFilter.value = c.Filter;
let data = await dmsFileService.FindBySearchCriteria(c);
isSearched.value = true;
result.value.Total = data.Total;
result.value.Page = data.Page;
result.value.Limit = data.Limit;
const rawList = data.Datas ?? [];
// 始终排序,空数组orderBy也安全
datas.value = orderBy(
rawList,
(x: DmsFileUploadViewDisplayData) => x.IsDirectoryIndc,
"desc",
);
loading.value = false;
if (
data.Datas &&
data.Datas.length > 0 &&
fileTypePolicy.isAudio(data.Datas[0].OrderKey)
) {
onPlayAudio(data.Datas[0]);
onPauseAudio(data.Datas[0]);
} else {
sound.value?.stop();
}
} catch (error) {
loading.value = false;
console.log(error);
}
};
const onReSearch = async () => {
setBindOptionValue(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
currFilePath.value,
"",
[currFilePath.value],
false,
);
await findBySearchCriteria(unref(currentSearchCriteria));
loading.value = false;
spinTip.value = "加载中...";
};
const onReload = async () => {
let cfp: string = currFilePath.value;
await initBindOption();
setBindOptionValue(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
cfp,
"",
[cfp],
false,
);
await findBySearchCriteria(unref(currentSearchCriteria));
};
const handleSelectShare = async () => {
if (shareEnquiry.value) {
if (shareEnquiry.value.keys.length > 0) {
let fgps: FamilyGroupFolderEntity[] = [];
let fgp: FamilyGroupFolderEntity;
shareEnquiry.value.keys.forEach((element) => {
fgp = new FamilyGroupFolderEntity();
fgp.FamilyName = element.FamilyName;
fgp.TopFolderName = element.TopFolderName;
fgp.FolderName = sharedFileRecord.value?.FileName ?? "";
fgp.FolderLocalName = sharedFileRecord.value?.OrgFileName ?? "";
fgp.FilePath = element.FolderName;
fgps.push(fgp);
});
await dmsFileService.CreateFamilyGroupFolder(fgps);
showModalShare.value = false;
} else {
notification.info({
message: "系统提示:",
description: "请选择一条记录",
placement: "topRight",
});
}
}
};
const handleSelectPublishPhoto = async () => {
if (publishPhotoEnquiry.value) {
if (publishPhotoEnquiry.value.keys.length > 0) {
let data: PublishData;
for (let i = 0; i < keys.value.length; i++) {
data = new PublishData();
data.FileId = keys.value[i].FileId;
data.PublishName = publishPhotoEnquiry.value.keys[0].PublishName;
await publishPhotoService.InsertPublishPhotoDetail(data);
}
showModalPublishPhoto.value = false;
notification.info({
message: "系统提示:",
description: "作品发布成功",
placement: "topRight",
});
} else {
notification.info({
message: "系统提示:",
description: "请选择一条记录",
placement: "topRight",
});
}
}
};
const handleSelectPublishAudio = async () => {
if (publishAudioEnquiry.value) {
if (publishAudioEnquiry.value.keys.length > 0) {
let data: PublishData;
for (let i = 0; i < keys.value.length; i++) {
data = new PublishData();
data.FileId = keys.value[i].FileId;
data.PublishName = publishAudioEnquiry.value.keys[0].PublishName;
await publishAudioService.InsertPublishAudioDetail(data);
}
showModalPublishAudio.value = false;
notification.info({
message: "系统提示:",
description: "专辑发布成功",
placement: "topRight",
});
} else {
notification.info({
message: "系统提示:",
description: "请选择一条记录",
placement: "topRight",
});
}
}
};
const handleSelectPublishVideo = async () => {
if (publishVideoEnquiry.value) {
if (publishVideoEnquiry.value.keys.length > 0) {
let data: PublishData;
for (let i = 0; i < keys.value.length; i++) {
data = new PublishData();
data.FileId = keys.value[i].FileId;
data.PublishName = publishVideoEnquiry.value.keys[0].PublishName;
await publishVideoService.InsertPublishVideoDetail(data);
}
showModalPublishVideo.value = false;
notification.info({
message: "系统提示:",
description: "专辑发布成功",
placement: "topRight",
});
} else {
notification.info({
message: "系统提示:",
description: "请选择一条记录",
placement: "topRight",
});
}
}
};
const onGoTop = () => {
pathStack.value = [{ value: rootPath.value, displayName: "我的云盘" }];
onSearchByFilePath(rootPath.value);
};
const onGoBack = () => {
if (pathStack.value.length > 1) {
pathStack.value.pop();
const prev = pathStack.value[pathStack.value.length - 1];
onSearchByFilePath(prev.value);
}
};
const onBreadcrumbClick = (item: BreadcrumbItem, index: number) => {
pathStack.value = pathStack.value.slice(0, index + 1);
onSearchByFilePath(item.value);
};
const onSearchByName = (keyword: string) => {
let c: DmsFileSearchCriteria = new DmsFileSearchCriteria();
let filters: SearchFilter[] = [];
let filePathFilter: SearchFilter = new SearchFilter();
filePathFilter.Column = DmsFileUploadViewDisplayData.DB_FILE_PATH;
filePathFilter.Type = "SingleSelection";
filePathFilter.Operator = "single";
filePathFilter.Value = currFilePath.value;
filters.push(filePathFilter);
if (keyword && keyword.trim()) {
let nameFilter: SearchFilter = new SearchFilter();
nameFilter.Column = DmsFileUploadViewDisplayData.DB_ORG_FILE_NAME;
nameFilter.Type = SearchFilterTypePolicy.TEXT;
nameFilter.Operator = SearchFilterOperatorPolicy.CONTAIN;
nameFilter.Value = keyword.trim();
filters.push(nameFilter);
}
c.Filter = filters;
c.limit = pagingParams.value.pageSize;
c.page = 1;
c.GridColumns = [];
currentSearchCriteria.value = c;
setBindOptionValue(
DmsFileUploadViewDisplayData.DB_FILE_PATH,
currFilePath.value,
"",
[currFilePath.value],
false,
);
pagingParams.value.page = 1;
findBySearchCriteria(c);
};
const onOpenFolder = (record: DmsFileUploadViewDisplayData) => {
if (record.IsDirectoryIndc == "Y") {
pathStack.value.push({
value: record.FileName,
displayName: record.OrgFileName,
});
onChangeFolder(record.FileName);
}
};
const onOpenFile = (record: DmsFileUploadViewDisplayData) => {
if (fileTypePolicy.isImage(record.OrgFileName)) {
onPreviewFile(record.CreatedBy, record.OrderKey);
} else if (fileTypePolicy.isVideo(record.OrgFileName)) {
onVideoPlay(record.FileId);
} else if (fileTypePolicy.isAudio(record.OrgFileName)) {
onPlayAudio(toUploadView(record));
} else {
onDownloadFile(record.FileId, record.OrgFileName);
}
};
const onDownloadSelected = (items: DmsFileUploadViewDisplayData[]) => {
items.forEach((item) => {
if (item.IsDirectoryIndc != "Y") {
onDownloadFile(item.FileId, item.OrgFileName);
}
});
};
const onShareSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length > 0) {
onShareFamily(items[0]);
}
};
const onPublishSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length === 0) return;
const first = items[0];
if (
fileTypePolicy.isImage(first.OrderKey) ||
fileTypePolicy.isImage(first.OrgFileName)
) {
onPublishPhoto();
} else if (
fileTypePolicy.isVideo(first.OrderKey) ||
fileTypePolicy.isVideo(first.OrgFileName)
) {
onPublishVideo();
} else if (
fileTypePolicy.isAudio(first.OrderKey) ||
fileTypePolicy.isAudio(first.OrgFileName)
) {
onPublishAudio();
}
};
const onViewPreviewSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length === 0) return;
const first = items[0];
if (
fileTypePolicy.isImage(first.OrderKey) ||
fileTypePolicy.isImage(first.OrgFileName)
) {
onViewPreviewPhoto(first.FilePath);
} else if (
fileTypePolicy.isVideo(first.OrderKey) ||
fileTypePolicy.isVideo(first.OrgFileName)
) {
onViewPreviewVideo(first.FilePath);
} else if (
fileTypePolicy.isAudio(first.OrderKey) ||
fileTypePolicy.isAudio(first.OrgFileName)
) {
onViewPreviewAudio(first.FilePath);
}
};
const onUrlVideoPlayItem = (record: DmsFileUploadViewDisplayData) => {
onUrlVideoPlay(
record.Url,
record.OrgFileName,
record.FormattedPic.replace(".m3u8", ".png"),
);
};
const onPlayAudioItem = (record: DmsFileUploadViewDisplayData) => {
onPlayAudio(record);
};
const onPreviewSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length > 0) {
keys.value = items;
onViewPic();
}
};
const onAmendSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length === 1) {
keys.value = items;
onAmend();
}
};
const onMoveSelected = (items: DmsFileUploadViewDisplayData[]) => {
if (items.length === 1) {
keys.value = items;
onMove();
}
};
const onDeleteSelected = () => {
onDelete();
};
</script>
<style scoped>
.dms-file-enquiry {
display: flex;
flex-direction: column;
height: calc(100vh - 120px);
}
</style>