项目汇编和单片材料

main
严飞永 4 weeks ago
parent 6b63160278
commit 276b44c769

@ -1,4 +1,6 @@
import Vue from "vue";
// 预览docx
import VueCompositionAPI from '@vue/composition-api'
import Cookies from "js-cookie";
@ -55,6 +57,8 @@ import DictData from "@/components/DictData";
//echarts
import * as echarts from "echarts";
// 全局方法挂载
Vue.prototype.getDicts = getDicts;
Vue.prototype.getConfigKey = getConfigKey;
@ -90,6 +94,8 @@ DictData.install();
* Currently MockJs will be used in the production environment,
* please remove it before going online! ! !
*/
//预览docx
Vue.use(VueCompositionAPI)
Vue.use(Element, {
size: Cookies.get("size") || "medium", // set element-ui default size

@ -0,0 +1,3 @@
<template>
<div>项目手册报告</div>
</template>

@ -41,12 +41,18 @@
<el-table-column label="文件名称" align="center" prop="name" />
<el-table-column label="类型" align="center">
<template slot-scope="scope">
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
<a v-if="scope.row.lx === '3'" :href="scope.row.wz" target="_blank"
style="color: #409EFF; text-decoration: underline;">
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
</a>
<span v-else>
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
</span>
</template>
</el-table-column>
<el-table-column label="附件" align="center" prop="fj">
<template slot-scope="scope">
{{ getFileName(scope.row.fj) }}
{{ getFileName(scope.row.fj) || "未上传" }}
</template>
</el-table-column>
<el-table-column label="上传用户" align="center" prop="scyh" />
@ -59,7 +65,7 @@
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.current" :limit.sync="queryParams.size"
@pagination="getList" />
</div>
@ -70,14 +76,22 @@
<el-input v-model="form.name" placeholder="请输入文件名称" />
</el-form-item>
<el-form-item label="类型" prop="lx">
<el-select v-model="form.lx" placeholder="请选择文件类型" style="width: 100%;">
<el-select v-model="form.lx" placeholder="请选择文件类型" style="width: 100%;" @change="handleTypeChange">
<el-option v-for="dict in dict.type.wjlx" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<!-- 如果文件类型是网络信息假设值为 4 -->
<el-form-item v-if="form.lx === '3'" label="网址" prop="scyh">
<el-input v-model="form.scsj" placeholder="请输入网址" />
<!-- 文件类型是网络信息 -->
<el-form-item v-if="form.lx === '3'" label="网址" prop="wz">
<el-input v-model="form.wz" placeholder="请输入网址" class="input-with-select">
<template slot="prepend">
<el-select v-model="select" style="width: 5.7rem;" @change="handleProtocolChange">
<el-option label="http" value="http"></el-option>
<el-option label="https" value="https"></el-option>
</el-select>
<span class="wangzhispan">://</span>
</template>
</el-input>
</el-form-item>
<el-form-item label="上传用户" prop="scyh">
<el-input v-model="form.scyh" placeholder="请输入上传用户" />
@ -86,7 +100,10 @@
<el-date-picker v-model="form.scsj" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
style="width: 100%;" />
</el-form-item>
<el-form-item label="附件" prop="fj">
<el-form-item v-if="form.lx !== '3'" label="附件" prop="fj" required>
<fileload v-model="form.fj"></fileload>
</el-form-item>
<el-form-item v-if="form.lx === '3'" label="附件" prop="fj">
<fileload v-model="form.fj"></fileload>
</el-form-item>
</el-form>
@ -108,8 +125,8 @@
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="detailForm.lx === '3'" label="网址" prop="scyh">
<el-input v-model="detailForm.scsj" placeholder="请输入网址" readonly />
<el-form-item v-if="detailForm.lx === '3'" label="网址" prop="wz">
<el-input v-model="detailForm.wz" placeholder="wz" readonly />
</el-form-item>
<el-form-item label="上传用户" prop="scyh">
<el-input v-model="detailForm.scyh" placeholder="请输入上传用户" />
@ -164,8 +181,8 @@ export default {
detailOpen: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
current: 1,
size: 10,
name: undefined,
lx: undefined
},
@ -177,6 +194,7 @@ export default {
fj: undefined,
scsj: undefined,
scyh: undefined,
wz: undefined,
createBy: undefined,
createId: undefined,
createTime: undefined,
@ -192,6 +210,7 @@ export default {
fj: undefined,
scsj: undefined,
scyh: undefined,
wz: undefined,
createBy: undefined,
createId: undefined,
createTime: undefined,
@ -207,6 +226,9 @@ export default {
lx: [
{ required: true, message: "文件类型不能为空", trigger: "change" }
],
wz: [
{ required: true, message: "网址不能为空", trigger: "change" }
],
scyh: [
{ required: true, message: "上传用户不能为空", trigger: "blur" }
],
@ -220,14 +242,15 @@ export default {
2: "研究报告",
3: "网络信息",
4: "其他",
}
},
select: 'http' //
};
},
created() {
this.getList();
},
methods: {
//
//
getFileName(filePath) {
if (filePath) {
return filePath.split('/').pop();
@ -237,7 +260,6 @@ export default {
querySearchAsync(queryString, cb) {
let results = [];
// getXmzskPage API
getXmzskPage({ name: queryString }).then(res => {
res.data.records.forEach(item => {
results.push({
@ -274,6 +296,7 @@ export default {
fj: undefined,
scsj: undefined,
scyh: undefined,
wz: undefined,
createBy: undefined,
createId: undefined,
createTime: undefined,
@ -281,11 +304,12 @@ export default {
updateId: undefined,
updateTime: undefined
};
this.select = 'http'; //
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.queryParams.current = 1;
this.getList();
},
/** 重置按钮操作 */
@ -310,6 +334,7 @@ export default {
this.reset();
const catalogId = row.id;
this.form = { ...row };
this.setProtocolType(this.form.wz); //
this.open = true;
this.title = "修改项目知识库";
},
@ -357,6 +382,36 @@ export default {
}).catch(error => {
console.error('API Request Error:', error);
});
},
//
setProtocolType(url) {
if (url) {
if (url.startsWith('https://')) {
this.select = 'https';
} else if (url.startsWith('http://')) {
this.select = 'http';
} else {
this.select = 'http';
this.form.wz = 'http://' + url;
}
} else {
this.select = 'http';
}
},
//
handleProtocolChange() {
if (this.form.wz && !this.form.wz.startsWith(this.select + '://')) {
this.form.wz = this.select + '://' + this.form.wz.replace(/(http|https):\/\//, '');
}
},
//
handleTypeChange() {
if (this.form.lx !== '3') {
this.form.wz = undefined;
this.select = 'http';
} else {
this.setProtocolType(this.form.wz);
}
}
}
};

@ -45,7 +45,7 @@
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.current" :limit.sync="queryParams.size"
@pagination="getList" />
</div>
@ -106,7 +106,7 @@
<script>
import Editorone from '@/components/Editor';
import { addClgl, deleteClgl, updateClgl, getClglPage, exportToPdf, downloadPdf } from '@/api/ManageApi/index';
import { addClgl, deleteClgl, updateClgl, getClglPage, exportToPdf } from '@/api/ManageApi/index';
export default {
components: { Editorone },
@ -116,8 +116,8 @@ export default {
postList: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
current: 1,
size: 10,
fileTitle: '',
startTime: ''
},
@ -332,13 +332,13 @@ export default {
}
},
handleQuery() {
this.queryParams.pageNum = 1;
this.queryParams.current = 1;
this.getList();
},
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
current: 1,
size: 10,
fileTitle: '',
startTime: ''
};

@ -0,0 +1,235 @@
<template>
<div>
<!-- 报告管理 -->
<!-- 表单查询项 -->
<div v-if="!previewMode" class="headerbox">
<el-form size="small" :inline="true" label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="文件标题" style="width: 100%;">
<el-input v-model="queryParams.fileTitle" placeholder="请输入模板标题" clearable />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="发布时间">
<el-date-picker v-model="queryParams.startTime" type="date" placeholder="选择日期"
style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表格内容区 -->
<div v-if="!previewMode" class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="id" />
<el-table-column label="文件标题" align="center" prop="title" />
<el-table-column label="发布单位" align="center" prop="unit" />
<el-table-column label="发布人" align="center" prop="author" />
<el-table-column label="发布时间" align="center" prop="createTime" />
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" style="color: gray;"
@click="handlePreview(scope.row)">预览</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.current"
:limit.sync="queryParams.size" @pagination="getList" />
</div>
<!-- DOCX预览区域 -->
<div v-if="previewMode" class="previewbox">
<div class="previewhead">
<h3>{{ previewData.title }}</h3>
<div class="headtwo">
<el-button size="mini" @click="previewMode = false">返回</el-button>
</div>
</div>
<div class="previewinfo">
<span>发布单位{{ previewData.unit }}</span>
<span>发布人{{ previewData.author }}</span>
<span>发布时间{{ previewData.createTime }}</span>
</div>
<div class="previewcontent">
<vue-office-docx
:src="docxFileData"
style="width: 100%; height: calc(100vh - 250px); border: 1px solid #eee;"
@rendered="renderedHandler"
/>
</div>
</div>
</div>
</template>
<script>
import VueOfficeDocx from '@vue-office/docx'
import axios from 'axios'
export default {
components: {
'vue-office-docx': VueOfficeDocx
},
data() {
return {
//
queryParams: {
current: 1,
size: 10,
fileTitle: undefined,
startTime: undefined
},
//
postList: [],
//
loading: false,
//
total: 0,
//
previewMode: false,
//
previewData: {},
// DOCX
docxFileData: null
}
},
created() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
// API
// api.getList(this.queryParams).then(response => {
// this.postList = response.data.records
// this.total = response.data.total
// this.loading = false
// })
//
setTimeout(() => {
this.postList = [
{ id: 1, title: '2023年度报告', unit: '技术部', author: '张三', createTime: '2023-01-15', fileUrl: 'docx/单体材料模板.docx' },
]
this.total = 2
this.loading = false
}, 500)
},
//
handleQuery() {
this.queryParams.current = 1
this.getList()
},
//
resetQuery() {
this.queryParams = {
current: 1,
size: 10,
fileTitle: undefined,
startTime: undefined
}
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
//
handlePreview(row) {
this.previewMode = true
this.previewData = row
this.loadDocxFile(row.fileUrl)
},
// DOCX
loadDocxFile(url) {
this.docxFileData = null
axios.get(url, { responseType: 'arraybuffer' })
.then(response => {
this.docxFileData = response.data
})
.catch(error => {
console.error('加载文档失败:', error)
this.$message.error('文档加载失败')
})
},
//
renderedHandler() {
console.log('文档渲染完成')
}
}
}
</script>
<style scoped>
.headerbox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablebox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablebtntwo {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 1rem;
margin-bottom: 1rem;
}
.previewbox {
width: 90%;
height: auto;
margin-left: 5%;
margin-top: .3rem;
display: flex;
flex-direction: column;
padding: 1rem;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.previewhead {
width: 100%;
height: 2rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.headtwo {
display: flex;
gap: .5rem;
}
.previewinfo {
display: flex;
gap: 1rem;
justify-content: flex-start;
margin-top: 1rem;
}
.previewcontent {
margin-top: 1rem;
width: 100%;
}
</style>

@ -246,8 +246,7 @@ export default {
},
//
getCurrentUserName() {
// Vuex store
return this.$store.state.user.name; //
return this.$store.state.user.name;
},
//
formatDateTime(dateTime) {

@ -235,7 +235,7 @@ export default {
// anotherInfo
this.anotherInfo.push({
id: response.data.id, // ID
id: response.data.id,
zdname: this.form.zdname,
zdinfor: this.form.zdinfor
});

@ -144,7 +144,7 @@ export default {
const data = elementMap[element];
evaluations.push({
element: element,
ranking: data.project // pjpm
ranking: data.project
});
projectData.push(data.project);
medianData.push(data.median);
@ -158,7 +158,6 @@ export default {
},
processDescriptionData(data) {
//
// data
this.descriptionData = data;
},
initChart() {

@ -236,7 +236,6 @@ export default {
checkPermi,
checkRole,
loadData() {
console.log('Loading data for project ID:', this.projectId);
getzwBasicInformationById(this.projectId).then(response => {
const data = response.data;
this.basicInformation = data.basicInformation;
@ -274,7 +273,7 @@ export default {
} else {
this[dataKey] = updatedData;
}
console.log(`接收到 ${dataKey} 更新:`, updatedData);
// console.log(` ${dataKey} :`, updatedData);
},
isDefault(obj, defaultObj) {
@ -289,7 +288,7 @@ export default {
saveAll() {
this.loading = true;
const tempData = this.prepareSubmitData(); //
console.log('准备暂存的完整数据:', JSON.stringify(tempData, null, 2)); //
// console.log(':', JSON.stringify(tempData, null, 2)); //
tempBasicInformation(tempData)
.then(response => {
this.$message.success('暂存成功');
@ -307,7 +306,7 @@ export default {
submitAll() {
this.loading = true;
const submitData = this.prepareSubmitData();
console.log('准备提交的完整数据:', JSON.stringify(submitData, null, 2)); //
// console.log(':', JSON.stringify(submitData, null, 2)); //
fillBasicInformation(submitData)
.then(response => {
this.$message.success('提交成功');
@ -326,7 +325,7 @@ export default {
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
// console.log(':', response);
this.$message.success('审核通过');
this.isSubmitted = true;
this.$router.push('/manage');
@ -342,7 +341,7 @@ export default {
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
// console.log(':', response);
this.$message.success('修改成功');
this.isSubmitted = true;
this.$router.push('/manage');

@ -8,25 +8,25 @@
<el-row>
<el-col :span="5">
<el-form-item label="企业名称" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable
<el-input v-model="queryParams.name" placeholder="请输入企业名称" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="标签代码" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable
<el-input v-model="queryParams.bqdm" placeholder="请输入标签代码" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="标签状态" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable
<el-input v-model="queryParams.bqzt" placeholder="请输入标签状态" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="用户类型">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目名称" clearable
<el-input v-model="queryParams.yhlx" placeholder="请输入用户类型" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
@ -53,11 +53,11 @@
</el-table-column>
<el-table-column label="企业名称" align="center" prop="name" width="200" />
<el-table-column label="统一信用代码" align="center" prop="tyshxydm" width="200" />
<el-table-column label="标签代码" align="center" prop="xzfl" />
<el-table-column label="有效状态" align="center" prop="xmfrdwxz" width="200" />
<el-table-column label="用户类型" align="center" width="130" prop="ztze" />
<el-table-column label="标签注释" align="center" width="180" prop="zydmj" />
<el-table-column label="标签状态" align="center" prop="status" />
<el-table-column label="标签代码" align="center" prop="bqdm" />
<el-table-column label="有效状态" align="center" prop="state" width="200" />
<el-table-column label="用户类型" align="center" width="130" prop="yhlx" />
<el-table-column label="标签注释" align="center" width="180" prop="bqzs" />
<el-table-column label="标签状态" align="center" prop="bqzt" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
@ -71,8 +71,9 @@
</template>
<script>
import { getCybqInformationPage} from "@/api/ManageApi/index";
import { getCybqInformationPage } from "@/api/ManageApi/index";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
dicts: ["xzfl"],
data() {
@ -95,9 +96,10 @@ export default {
queryParams: {
current: 1,
size: 10,
xzfl: undefined,
bqdm: undefined,
bqzt: undefined,
yhlx: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined,
@ -114,13 +116,8 @@ export default {
getList() {
this.loading = true;
// isFmqd=2
const params = {
...this.queryParams,
isFmqd: 1
};
getBasicInformationPage(params).then((response) => {
// 使 API
getCybqInformationPage(this.queryParams).then((response) => {
this.postList = response.data.records;
this.total = response.data.total;
this.loading = false;
@ -130,27 +127,13 @@ export default {
});
},
//
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除项目id为"' + ids + '"的数据项?')
.then(() => {
return deleteBasicInformation(ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => { });
},
/** 详情按钮操作 */
getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
@ -162,13 +145,13 @@ export default {
this.queryParams = {
current: 1,
size: 10,
xzfl: undefined,
bqdm: undefined,
bqzt: undefined,
yhlx: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined,
isFmqd: 1
};
this.getList();
},
@ -181,6 +164,7 @@ export default {
}
};
</script>
<style scoped>
.headerbox {
background-color: #fff;

@ -222,7 +222,6 @@ export default {
querySearchAsync(queryString, cb) {
let results = [];
// getAllCatalogs API
getAllCatalogs({ gydl: queryString }).then(res => {
res.data.records.forEach(item => {
results.push({

@ -260,7 +260,6 @@ export default {
querySearchAsync(queryString, cb) {
let results = [];
// getXfcyglPage API
getXfcyglPage({ cyxf: queryString }).then(res => {
res.data.records.forEach(item => {
results.push({

Loading…
Cancel
Save