明树Git Lab

Commit bf028b85 authored by zhanghan's avatar zhanghan

进度条处理

parent ee354647
Pipeline #111015 passed with stage
in 19 seconds
...@@ -3,16 +3,32 @@ ...@@ -3,16 +3,32 @@
<!-- 上传按钮区域 --> <!-- 上传按钮区域 -->
<div class="uploadFlex"> <div class="uploadFlex">
<el-upload <el-upload
:timeout="300000"
:action="uploadUrl" :action="uploadUrl"
:headers="headers" :headers="headers"
:show-file-list="false" :show-file-list="false"
multiple multiple
:disabled="disabled" :disabled="disabled || uploading"
:on-success="handleUploadSuccess" :on-success="handleUploadSuccess"
:on-error="handleUploadError"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:on-progress="handleProgress"
> >
<el-button type="default" :disabled="disabled">上传</el-button> <el-button type="default" :disabled="disabled || uploading">
<span v-if="uploading">上传中...</span>
<span v-else>上传</span>
</el-button>
</el-upload> </el-upload>
<!-- 进度条 -->
<div v-if="showProgress" class="progress-container">
<el-progress
:percentage="uploadPercentage"
stroke-width="6"
size="small"
/>
</div>
<el-button <el-button
v-if="!isInline" v-if="!isInline"
type="default" type="default"
...@@ -24,6 +40,7 @@ ...@@ -24,6 +40,7 @@
</el-button> </el-button>
<slot name="actions"></slot> <slot name="actions"></slot>
</div> </div>
<!-- 文件列表表格 --> <!-- 文件列表表格 -->
<el-table <el-table
v-if="!isInline" v-if="!isInline"
...@@ -311,6 +328,11 @@ const emit = defineEmits([ ...@@ -311,6 +328,11 @@ const emit = defineEmits([
const selectedIds = ref([]); const selectedIds = ref([]);
const popoverVisible = ref(false); const popoverVisible = ref(false);
// ========== 上传进度 & loading 状态 ==========
const uploading = ref(false); // 上传中
const uploadPercentage = ref(0); // 进度百分比
const showProgress = ref(false); // 是否显示进度条
// 核心:安全处理文件列表,将非数组值转为空数组 // 核心:安全处理文件列表,将非数组值转为空数组
const safeFileList = computed({ const safeFileList = computed({
get() { get() {
...@@ -326,19 +348,42 @@ const formatDate = (date) => { ...@@ -326,19 +348,42 @@ const formatDate = (date) => {
return date ? moment(date).format("YYYY-MM-DD HH:mm:SS") : ""; return date ? moment(date).format("YYYY-MM-DD HH:mm:SS") : "";
}; };
// 上传前
const beforeUpload = (file) => {
uploading.value = true;
uploadPercentage.value = 0;
showProgress.value = true;
return true;
};
// 上传进度
const handleProgress = (event, file, fileList) => {
uploadPercentage.value = Math.floor(event.percent);
};
// 文件上传成功处理 // 文件上传成功处理
const handleUploadSuccess = (res) => { const handleUploadSuccess = (res) => {
if (res && res.data) { if (res && res.data) {
safeFileList.value = [...safeFileList.value, res.data]; safeFileList.value = [...safeFileList.value, res.data];
console.log("上传成功:", res.data);
ElMessage.success("文件上传成功"); ElMessage.success("文件上传成功");
popoverVisible.value = false; popoverVisible.value = false;
} }
finishUpload();
}; };
const beforeUpload = (file) => { // 上传失败
// 可添加文件类型、大小等校验逻辑 const handleUploadError = () => {
return true; ElMessage.error("文件上传失败");
finishUpload();
};
// 结束上传
const finishUpload = () => {
uploading.value = false;
uploadPercentage.value = 100;
setTimeout(() => {
showProgress.value = false;
}, 500);
}; };
// 选择文件变化 // 选择文件变化
...@@ -438,7 +483,9 @@ watch( ...@@ -438,7 +483,9 @@ watch(
} }
.uploadFlex { .uploadFlex {
display: flex; display: flex;
align-items: center;
margin-bottom: 16px; margin-bottom: 16px;
gap: 12px;
} }
.inline { .inline {
display: flex; display: flex;
...@@ -450,6 +497,12 @@ watch( ...@@ -450,6 +497,12 @@ watch(
} }
} }
// 进度条容器
.progress-container {
flex: 1;
max-width: 200px;
}
.inline-file-wrapper { .inline-file-wrapper {
flex: 1; flex: 1;
margin-left: 10px; margin-left: 10px;
......
...@@ -64,7 +64,10 @@ ...@@ -64,7 +64,10 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目名称"> <el-form-item label="项目名称">
<el-input v-model="formData.projectName" :disabled="projectDisabled" /> <el-input
v-model="formData.projectName"
:disabled="projectDisabled"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
...@@ -583,66 +586,7 @@ ...@@ -583,66 +586,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="策划文件"> <el-form-item label="策划文件">
<el-upload <FileUploader v-model="chwjData" />
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{ Authorization: token }"
:show-file-list="false"
multiple
:disabled="isPreview"
:on-success="addChwjFile"
>
<el-button :disabled="isPreview" type="default"
>上传</el-button
>
</el-upload>
<el-button
type="default"
@click="multiDeleteChwj"
:disabled="!chwjSelectIds.length"
>删除选中文件</el-button
>
</el-form-item>
<el-form-item label=" ">
<el-table
:data="chwjData"
style="width: 100%"
empty-text="暂无数据"
border
@selection-change="chwjSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row }">
<span>{{
moment(row.updatedAt).format(
"YYYY-MM-DD HH:mm:SS"
)
}}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小">
<template #default="{ row }">
<span>{{ row.size }} MB</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, index }">
<span
class="always-click"
@click="downloadFile(row)"
>下载</span
>
<el-button
link
type="danger"
size="small"
@click="deleteChwj(index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -659,64 +603,7 @@ ...@@ -659,64 +603,7 @@
> >
<el-col :span="24"> <el-col :span="24">
<el-form-item label="责任书文件"> <el-form-item label="责任书文件">
<el-upload <FileUploader v-model="zrsData" />
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{ Authorization: token }"
:show-file-list="false"
multiple
:on-success="addZrsFile"
>
<el-button type="default">上传</el-button>
</el-upload>
<el-button
type="default"
@click="multiDeleteZrs"
:disabled="!zrsSelectIds.length"
>删除选中文件</el-button
>
</el-form-item>
<el-form-item label="">
<el-table
:data="zrsData"
style="width: 100%"
empty-text="暂无数据"
border
@selection-change="zrsSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row, index }">
<span>{{
moment(row.updatedAt).format(
"YYYY-MM-DD HH:mm:SS"
)
}}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小">
<template #default="{ row }">
<span>{{ row.size }} MB</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, index }">
<span
class="always-click"
@click="downloadFile(row)"
>下载</span
>
<el-button
link
type="danger"
size="small"
@click="deleteZrs(index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form> </el-form>
...@@ -849,7 +736,7 @@ watch( ...@@ -849,7 +736,7 @@ watch(
} else { } else {
selectedFullPath.value = ""; selectedFullPath.value = "";
} }
} },
); );
// 构建节点映射表 // 构建节点映射表
const nodeMap = new Map(); const nodeMap = new Map();
...@@ -928,7 +815,7 @@ const getStatementInfo = () => { ...@@ -928,7 +815,7 @@ const getStatementInfo = () => {
...item, ...item,
sfsy: item.sfsy && item.sfsy.toString(), sfsy: item.sfsy && item.sfsy.toString(),
}; };
}) }),
); );
Object.assign(chwjData.value, res.chwj); Object.assign(chwjData.value, res.chwj);
Object.assign(pfyjlsqkData.value, res.tzmbzrsPfyjs); Object.assign(pfyjlsqkData.value, res.tzmbzrsPfyjs);
...@@ -1001,7 +888,7 @@ const multiDeleteZrs = () => { ...@@ -1001,7 +888,7 @@ const multiDeleteZrs = () => {
}) })
.then(() => { .then(() => {
zrsData.value = zrsData.value.filter( zrsData.value = zrsData.value.filter(
(item) => !zrsSelectIds.value.includes(item.id) (item) => !zrsSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -1584,7 +1471,7 @@ const multiDeleteChwj = () => { ...@@ -1584,7 +1471,7 @@ const multiDeleteChwj = () => {
}) })
.then(() => { .then(() => {
chwjData.value = chwjData.value.filter( chwjData.value = chwjData.value.filter(
(item) => !chwjSelectIds.value.includes(item.id) (item) => !chwjSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -1616,7 +1503,7 @@ const multiDeleteQdfj = () => { ...@@ -1616,7 +1503,7 @@ const multiDeleteQdfj = () => {
}) })
.then(() => { .then(() => {
qdfjData.value = qdfjData.value.filter( qdfjData.value = qdfjData.value.filter(
(item) => !qdfjSelectIds.value.includes(item.id) (item) => !qdfjSelectIds.value.includes(item.id),
); );
}) })
.catch(() => {}); .catch(() => {});
...@@ -1690,7 +1577,11 @@ const exportStatement = () => { ...@@ -1690,7 +1577,11 @@ const exportStatement = () => {
{ prop: "zbmc", label: "指标名称" }, { prop: "zbmc", label: "指标名称" },
{ prop: "zbmbz", label: "指标目标值" }, { prop: "zbmbz", label: "指标目标值" },
{ prop: "khjzf", label: "考核基准分" }, { prop: "khjzf", label: "考核基准分" },
{ prop: "sfsy", label: "是否适用", formatter: (v) => v === "1" ? "是" : "否" }, {
prop: "sfsy",
label: "是否适用",
formatter: (v) => (v === "1" ? "是" : "否"),
},
{ prop: "khsm", label: "考核说明" }, { prop: "khsm", label: "考核说明" },
], ],
colWidths: [35, 15, 12, 10, 30], colWidths: [35, 15, 12, 10, 30],
...@@ -1700,10 +1591,20 @@ const exportStatement = () => { ...@@ -1700,10 +1591,20 @@ const exportStatement = () => {
type: "table", type: "table",
data: pfyjlsqkData.value, data: pfyjlsqkData.value,
columns: [ columns: [
{ prop: "lx", label: "类型", formatter: (v) => pfyjlxList.find((l) => l.key === v)?.name || v || "" }, {
prop: "lx",
label: "类型",
formatter: (v) =>
pfyjlxList.find((l) => l.key === v)?.name || v || "",
},
{ prop: "pfyj", label: "批复意见" }, { prop: "pfyj", label: "批复意见" },
{ prop: "jzf", label: "基准分" }, { prop: "jzf", label: "基准分" },
{ prop: "lsqk", label: "落实情况", formatter: (v) => lsqkList.find((l) => l.key === v)?.name || v || "" }, {
prop: "lsqk",
label: "落实情况",
formatter: (v) =>
lsqkList.find((l) => l.key === v)?.name || v || "",
},
{ prop: "lssj", label: "落实时间" }, { prop: "lssj", label: "落实时间" },
{ prop: "lsqkjtsm", label: "落实情况具体说明" }, { prop: "lsqkjtsm", label: "落实情况具体说明" },
], ],
......
...@@ -50,9 +50,9 @@ export function useJueceData(jcFormData, gdlxListRef) { ...@@ -50,9 +50,9 @@ export function useJueceData(jcFormData, gdlxListRef) {
obj[item.gdlx].lrfpbl = new Decimal( obj[item.gdlx].lrfpbl = new Decimal(
Number(obj[item.gdlx].lrfpbl || 0), Number(obj[item.gdlx].lrfpbl || 0),
).plus(new Decimal(Number(item.lrfpbl || 0))); ).plus(new Decimal(Number(item.lrfpbl || 0)));
obj[item.gdlx].cze = new Decimal( obj[item.gdlx].cze = new Decimal(Number(obj[item.gdlx].cze || 0)).plus(
Number(obj[item.gdlx].cze || 0), new Decimal(Number(item.cze || 0)),
).plus(new Decimal(Number(item.cze || 0))); );
obj[item.gdlx].yjzczb = new Decimal( obj[item.gdlx].yjzczb = new Decimal(
Number(obj[item.gdlx].yjzczb || 0), Number(obj[item.gdlx].yjzczb || 0),
).plus(new Decimal(Number(item.yjzczb || 0))); ).plus(new Decimal(Number(item.yjzczb || 0)));
...@@ -539,25 +539,86 @@ export function useJueceData(jcFormData, gdlxListRef) { ...@@ -539,25 +539,86 @@ export function useJueceData(jcFormData, gdlxListRef) {
return { return {
jcRadioClick, jcRadioClick,
jcSwlzbData, addJcSwlzb, deleteJcSwlzb, jcSwlzbData,
jcGdxxData, addJcGdxx, deleteJcGdxx, jcgdxxSums, changeJcGdxxSums, jcgdxxIndexMethod, addJcSwlzb,
dbzqData, addDbzq, deleteDbzq, deleteJcSwlzb,
fxglData, addFxgl, deleteFxgl, jcGdxxData,
lcbjdData, addLcbjd, deleteLcbjd, addJcGdxx,
lcbspData, addLcbspFile, deleteLcbsp, lcbspSelectIds, lcbspSelectionChange, multiDeleteLcbsp, deleteJcGdxx,
kyclData, addKyclFile, deleteKycl, kyclSelectIds, kyclSelectionChange, multiDeleteKycl, jcgdxxSums,
jjzbcsData, addJjzbcsFile, deleteJjzbcs, jjzbcsSelectIds, jjzbcsSelectionChange, multiDeleteJjzbcs, changeJcGdxxSums,
tpbczcclData, addTpbczcclFile, deleteTpbczccl, tpbczcclSelectIds, tpbczcclSelectionChange, multiDeleteTpbczccl, jcgdxxIndexMethod,
tpzcclData, addTpzcclFile, deleteTpzccl, tpzcclSelectIds, tpzcclSelectionChange, multiDeleteTpzccl, dbzqData,
shyaData, addShyaFile, deleteShya, shyaSelectIds, shyaSelectionChange, multiDeleteShya, addDbzq,
deleteDbzq,
fxglData,
addFxgl,
deleteFxgl,
lcbjdData,
addLcbjd,
deleteLcbjd,
lcbspData,
addLcbspFile,
deleteLcbsp,
lcbspSelectIds,
lcbspSelectionChange,
multiDeleteLcbsp,
kyclData,
addKyclFile,
deleteKycl,
kyclSelectIds,
kyclSelectionChange,
multiDeleteKycl,
jjzbcsData,
addJjzbcsFile,
deleteJjzbcs,
jjzbcsSelectIds,
jjzbcsSelectionChange,
multiDeleteJjzbcs,
tpbczcclData,
addTpbczcclFile,
deleteTpbczccl,
tpbczcclSelectIds,
tpbczcclSelectionChange,
multiDeleteTpbczccl,
tpzcclData,
addTpzcclFile,
deleteTpzccl,
tpzcclSelectIds,
tpzcclSelectionChange,
multiDeleteTpzccl,
shyaData,
addShyaFile,
deleteShya,
shyaSelectIds,
shyaSelectionChange,
multiDeleteShya,
jcTzzeqkjData, jcTzzeqkjData,
jcCwpjzbData, jcCwpjzbData,
jcHxbjtjData, addJchxbjtj, deleteJchxbjtj, jcHxbjtjData,
jcztshqkData, addJcztshqk, deleteJcztshqk, addJcztshqkFile, deleteJcztshqkFile, addJchxbjtj,
tzztshqkData, addTzztshqk, deleteTzztshqk, addTzztshqkFile, deleteTzztshqkFile, deleteJchxbjtj,
jcspyjData, addJcspyj, deleteJcspyj, addJcspyjFile, deleteRowFile, jcztshqkData,
addJcztshqk,
deleteJcztshqk,
addJcztshqkFile,
deleteJcztshqkFile,
tzztshqkData,
addTzztshqk,
deleteTzztshqk,
addTzztshqkFile,
deleteTzztshqkFile,
jcspyjData,
addJcspyj,
deleteJcspyj,
addJcspyjFile,
deleteRowFile,
bhqkData, bhqkData,
jxjlData, addJxjl, deleteJxjl, jxjlData,
jlrData, addJlr, deleteJlr, addJxjl,
deleteJxjl,
jlrData,
addJlr,
deleteJlr,
}; };
} }
...@@ -12,6 +12,7 @@ export function useLixiangData(formData, gdlxListRef) { ...@@ -12,6 +12,7 @@ export function useLixiangData(formData, gdlxListRef) {
delete formData[key]; delete formData[key];
} }
}; };
let uploadDialogVisible = ref(false);
// 建设规模(实物量指标) // 建设规模(实物量指标)
let swlzbData = reactive([]); let swlzbData = reactive([]);
...@@ -41,7 +42,8 @@ export function useLixiangData(formData, gdlxListRef) { ...@@ -41,7 +42,8 @@ export function useLixiangData(formData, gdlxListRef) {
if (item.gdlx) { if (item.gdlx) {
if (!obj[item.gdlx]) { if (!obj[item.gdlx]) {
obj[item.gdlx] = { obj[item.gdlx] = {
name: gdlxListRef.filter((gdlx) => gdlx.key == item.gdlx)[0].value, name: gdlxListRef.filter((gdlx) => gdlx.key == item.gdlx)[0]
.value,
}; };
} }
obj[item.gdlx].cgbl = new Decimal( obj[item.gdlx].cgbl = new Decimal(
...@@ -73,6 +75,7 @@ export function useLixiangData(formData, gdlxListRef) { ...@@ -73,6 +75,7 @@ export function useLixiangData(formData, gdlxListRef) {
// 支撑材料 // 支撑材料
let zcclData = ref([]); let zcclData = ref([]);
const addZcclFile = (res, file) => { const addZcclFile = (res, file) => {
uploadDialogVisible.value = false;
zcclData.value.push(res.data); zcclData.value.push(res.data);
}; };
const deleteZccl = (index) => { const deleteZccl = (index) => {
...@@ -273,14 +276,42 @@ export function useLixiangData(formData, gdlxListRef) { ...@@ -273,14 +276,42 @@ export function useLixiangData(formData, gdlxListRef) {
return { return {
radioClick, radioClick,
swlzbData, addSwlzb, deleteSwlzb, swlzbData,
gdxxData, addGdxx, deleteGdxx, gdxxSums, changeGdxxSums, gdxxIndexMethod, getObjSums, addSwlzb,
zcclData, addZcclFile, deleteZccl, zcclSelectIds, zcclSelectionChange, multiDeleteZccl, deleteSwlzb,
gdxxData,
addGdxx,
deleteGdxx,
gdxxSums,
changeGdxxSums,
gdxxIndexMethod,
getObjSums,
zcclData,
addZcclFile,
deleteZccl,
zcclSelectIds,
zcclSelectionChange,
multiDeleteZccl,
tzzeqkjData, tzzeqkjData,
cwpjzbData, cwpjzbData,
hxbjtjData, addHxbjtj, deleteHxbjtj, hxbjtjData,
lxpfwjData, addLxpfFile, deleteLxpf, lxpfSelectIds, lxpfSelectionChange, multiDeleteLxpf, addHxbjtj,
spyjTableData, addSpyj, deleteSpyj, deleteHxbjtj,
shclData, addShclFile, deleteShcl, shclSelectIds, shclSelectionChange, multiDeleteShcl, lxpfwjData,
addLxpfFile,
deleteLxpf,
lxpfSelectIds,
lxpfSelectionChange,
multiDeleteLxpf,
spyjTableData,
addSpyj,
deleteSpyj,
shclData,
addShclFile,
deleteShcl,
shclSelectIds,
shclSelectionChange,
multiDeleteShcl,
uploadDialogVisible,
}; };
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment