Merge remote-tracking branch 'origin/feature_活动电子档案' into release_20260829

This commit is contained in:
2026-08-29 09:50:22 +08:00
8 changed files with 1255 additions and 0 deletions
@@ -0,0 +1,186 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.archive-ledger-header {margin-bottom:16px}
.archive-ledger-title {font-size:17px; font-weight:600; margin-bottom:10px}
.archive-ledger-meta {display:flex; gap:20px; flex-wrap:wrap; color:#909399}
</style>
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy"
clearable placeholder="请选择年度" style="width: 100%"
@change="doSearch"></el-date-picker>
</search-item>
<search-item label="项目名称">
<el-input v-model="pageForm.projectName" clearable placeholder="请输入项目名称"
@keyup.enter.native="doSearch"></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" clearable filterable placeholder="请选择所属工会"
style="width: 100%" @change="doSearch">
<el-option v-for="item in unionOptions" :key="item.id"
:label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="档案台账"></table-tool>
<el-table :data="tableData" :size="tableSize">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="年度" prop="year" width="90" align="center"></el-table-column>
<el-table-column label="项目名称" prop="projectName" min-width="210" show-overflow-tooltip></el-table-column>
<el-table-column label="项目状态" width="110" align="center">
<template v-slot="{row}">
<el-tag size="small" :type="projectStatusType(row.status)">{{row.statusLabel}}</el-tag>
</template>
</el-table-column>
<el-table-column label="所属工会" prop="unionName" min-width="170" show-overflow-tooltip></el-table-column>
<el-table-column label="归档文档数" prop="documentCount" width="120" align="center"></el-table-column>
<el-table-column label="创建时间" prop="createdAt" width="170" align="center">
<template v-slot="{row}">{{$moment(row.createdAt).format("YYYY-MM-DD HH:mm")}}</template>
</el-table-column>
<el-table-column label="操作" width="90" align="center">
<template v-slot="{row}">
<el-button size="mini" type="primary" @click="openLedger(row)">查阅</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<el-drawer title="项目归档台账" :visible.sync="drawerVisible" size="82%" :destroy-on-close="true">
<div v-if="currentProject" style="padding:0 20px 20px">
<div class="archive-ledger-header">
<div class="archive-ledger-title">
{{currentProject.projectName}}
<el-tag size="small" :type="projectStatusType(currentProject.status)">
{{currentProject.statusLabel}}
</el-tag>
</div>
<div class="archive-ledger-meta">
<span>年度:{{currentProject.year}}</span>
<span>所属工会:{{currentProject.unionName}}</span>
<span>归档文档:{{currentProject.documentCount || 0}}</span>
</div>
</div>
<el-table :data="detailData" size="small">
<el-table-column label="序号" type="index" width="60"></el-table-column>
<el-table-column label="项目阶段" prop="projectStageLabel" width="120"></el-table-column>
<el-table-column label="文档名称" prop="documentName" min-width="180" show-overflow-tooltip></el-table-column>
<el-table-column label="文档类型" prop="docTypeName" min-width="140" show-overflow-tooltip></el-table-column>
<el-table-column label="上传人" prop="uploader" width="110"></el-table-column>
<el-table-column label="上传时间" width="160">
<template v-slot="{row}">{{row.uploadTime ? $moment(row.uploadTime).format("YYYY-MM-DD HH:mm") : "-"}}</template>
</el-table-column>
<el-table-column label="状态" width="120" align="center">
<template v-slot="{row}">
<el-tag size="small" :type="row.status === 1 ? 'success' : 'info'">{{row.statusLabel}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100" align="center">
<template v-slot="{row}">
<el-button size="mini" type="primary" @click="preview(row)">查看附件</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top:15px;text-align:center"
:current-page="detailForm.pageNumber"
:page-size="detailForm.pageSize"
:page-sizes="[10,20,50]"
:total="detailForm.totalCount"
layout="total, sizes, prev, pager, next"
@current-change="val=>{detailForm.pageNumber=val;loadDetail()}"
@size-change="val=>{detailForm.pageSize=val;detailForm.pageNumber=1;loadDetail()}">
</el-pagination>
</div>
</el-drawer>
<el-dialog title="附件预览" :visible.sync="previewVisible" width="760px">
<file-preview :files="previewFiles" complete_result></file-preview>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
tableData: [],
detailData: [],
unionOptions: [],
drawerVisible: false,
previewVisible: false,
previewFiles: [],
currentProject: null,
pageForm: {
year: String(new Date().getFullYear()),
projectName: "",
unionId: ""
},
detailForm: {pageNumber: 1, pageSize: 10, totalCount: 0, projectId: ""}
}
},
methods: {
normalizeFiles(files) {
if (Array.isArray(files)) return files
if (!files) return []
try { return JSON.parse(files) || [] } catch (e) { return [] }
},
projectStatusType(status) {
return status === 2 ? "success" : (status === 1 ? "warning" : "info")
},
pageData() {
this.$axios.post("/platform/archive/ledger/pageData", this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
loadUnions() {
this.$axios.post("/platform/archive/common/unionOptions").then(res => {
if (res.code === 0) this.unionOptions = res.data || []
})
},
openLedger(row) {
this.currentProject = row
this.detailForm = {pageNumber: 1, pageSize: 10, totalCount: 0, projectId: row.id}
this.drawerVisible = true
this.loadDetail()
},
loadDetail() {
this.$axios.post("/platform/archive/ledger/detail", this.detailForm).then(res => {
if (res.code === 0) {
this.detailData = (res.data.list || []).map(item =>
Object.assign({}, item, {files: this.normalizeFiles(item.files)}))
this.detailForm.totalCount = res.data.totalCount
}
})
},
preview(row) {
this.previewFiles = this.normalizeFiles(row.files)
if (!this.previewFiles.length) {
this.$message.warning("当前文档没有附件")
return
}
this.previewVisible = true
}
},
created() {
this.loadUnions()
this.pageData()
}
})
</script>
<!--#
}
#-->