明树Git Lab

Commit 485bc38d authored by zhanghan's avatar zhanghan

建设期投资检查开发完毕

parents ada7604b 33a92c02
Pipeline #106419 passed with stage
in 17 seconds
import * as XLSX from "xlsx";
// 导入excel文件显示到前端页面
const importTableFile = async (file) => {
const data = await readFile(file.raw);
// 使用 xlsx 解析
let workbook = XLSX.read(data, {
type: 'array',
cellDates: true,
cellStyles: true
});
console.log(workbook);
};
const readFile = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target.result);
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
};
// 导出页面数据,生成excel文件
const exportTableFile = (tableData, tableColumns, title, fileName) => {
const wb = XLSX.utils.book_new()
// 2. 准备数据
let wsData = [[title], []]
// 添加表头
if (tableColumns && tableColumns.length > 0) {
const headerRow = tableColumns.map(h => h.label || h)
wsData.push(headerRow)
}
// 添加数据行
tableData.forEach(item => {
if (tableColumns) {
// 按表头配置提取数据
const row = tableColumns.map(header => {
const value = getNestedValue(item, header.prop || header)
return formatCellValue(value, header.formatter)
})
wsData.push(row)
} else {
// 如果没有表头配置,直接使用对象值
const row = Object.values(item)
wsData.push(row)
}
})
// 3. 创建工作表
const ws = XLSX.utils.aoa_to_sheet(wsData)
// 4. 设置列宽(可选)
if (tableColumns) {
const colWidths = tableColumns.map(header => ({
wch: header.width || Math.max(
(header.label || header).length,
...tableData.map(item => {
const value = getNestedValue(item, header.prop || header)
return String(value || '').length
})
) * 2
}))
ws['!cols'] = colWidths
}
// 合并标题单元格
ws['!merges'] = [
XLSX.utils.decode_range('A1:Q1') // 合并第一行的 A-E 列
]
// 5. 将工作表添加到工作簿
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
// 6. 生成 Excel 文件并下载
XLSX.writeFile(wb, fileName + ".xlsx");
};
// 辅助函数:获取嵌套对象的值
const getNestedValue = (obj, path) => {
return path.split('.').reduce((prev, curr) => {
return prev ? prev[curr] : null
}, obj)
}
// 辅助函数:格式化单元格值
const formatCellValue = (value, formatter) => {
if (formatter && typeof formatter === 'function') {
return formatter(value)
}
return value
}
export{
importTableFile,
exportTableFile
}
\ No newline at end of file
...@@ -235,7 +235,7 @@ ...@@ -235,7 +235,7 @@
v-model="scope.row.yjwcsj" v-model="scope.row.yjwcsj"
type="datetime" type="datetime"
placeholder="请选择" placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:SS" value-format="YYYY-MM-DD HH:mm:ss"
/> />
</template> </template>
</el-table-column> </el-table-column>
......
...@@ -84,6 +84,135 @@ ...@@ -84,6 +84,135 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item label="项目类型" label-width="180">
<el-select v-model="formData.xmlx" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in xmlxList" :key="item.key"
:label="item.name" :value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="本集团股比(%)" label-width="190">
<el-input-number v-model="formData.bjtgb" :min="0" :max="99999999999.99999999"
controls-position="right"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="已发现或暴露的风险" name="已发现或暴露的风险">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="风险处置情况" :label-width="100"></el-form-item>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addFxczqk">新增</el-button>
</div>
<el-table :data="fxczqkData" style="width: 100%" empty-text="暂无数据" border>
<el-table-column type="index" width="60" />
<el-table-column prop="nd" label="年度" width="260">
<template #default="scope">
<el-date-picker
v-model="scope.row.nd"
type="month"
placeholder="请选择"
value-format="YYYY-MM"
/>
</template>
</el-table-column>
<el-table-column prop="mbfj" label="目标分解" width="240">
<template #default="scope">
<el-input v-model="scope.row.mbfj" type="textarea"/>
</template>
</el-table-column>
<el-table-column prop="jzqk" label="进展情况" width="240">
<template #default="scope">
<el-input v-model="scope.row.jzqk" type="textarea"/>
</template>
</el-table-column>
<el-table-column prop="fxdj" label="风险等级" width="240">
<template #default="scope">
<el-input v-model="scope.row.fxdj"/>
</template>
</el-table-column>
<el-table-column prop="fxfl" label="风险分类" width="240">
<template #default="scope">
<el-input v-model="scope.row.fxfl"/>
</template>
</el-table-column>
<el-table-column prop="fxgk" label="风险概况" width="240">
<template #default="scope">
<el-input v-model="scope.row.fxgk" type="textarea"/>
</template>
</el-table-column>
<el-table-column prop="kzcs" label="控制措施" width="240">
<template #default="scope">
<el-input v-model="scope.row.kzcs" type="textarea"/>
</template>
</el-table-column>
<el-table-column prop="czjz" label="处置进展" width="240">
<template #default="scope">
<el-input v-model="scope.row.czjz" type="textarea"/>
</template>
</el-table-column>
<el-table-column prop="yjzgwcsj" label="预计整改完成时间" width="260">
<template #default="scope">
<el-date-picker
v-model="scope.row.yjzgwcsj"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</template>
</el-table-column>
<el-table-column prop="fxsjje" label="风险涉及金额" width="260">
<template #default="scope">
<el-input-number v-model="scope.row.fxsjje" :min="0" :max="99999999999.99999999"
controls-position="right"
/>
</template>
</el-table-column>
<el-table-column prop="cxgl" label="出险概率" width="240">
<template #default="scope">
<el-input v-model="scope.row.cxgl"/>
</template>
</el-table-column>
<el-table-column prop="fxfxfs" label="风险发现方式" width="240">
<template #default="scope">
<el-input v-model="scope.row.fxfxfs"/>
</template>
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deleteFxczqk(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="12">
<el-form-item label="可能发生的潜在风险" label-width="140">
<el-input v-model="formData.knfsqzfx" type="textarea" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否当期新增">
<el-radio-group v-model="formData.sfdqxz">
<el-radio :value="1"></el-radio>
<el-radio :value="2"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="责任人" label-width="140">
<el-input v-model="formData.zrr" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
<el-input v-model="formData.lxfs" />
</el-form-item>
</el-col>
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
...@@ -107,7 +236,7 @@ ...@@ -107,7 +236,7 @@
token.value = userStore.authToken || sessionStorage.getItem("authToken") || ""; token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
const activeCollapse = reactive([ const activeCollapse = reactive([
"基本信息" "基本信息", "已发现或暴露的风险"
]); ]);
let formData = reactive({}); let formData = reactive({});
let loading = ref(false); let loading = ref(false);
...@@ -116,13 +245,23 @@ ...@@ -116,13 +245,23 @@
const getRiskInfo = () => { const getRiskInfo = () => {
loading.value = true; loading.value = true;
proxy.$post({ proxy.$post({
url: "/api/project/getTzkzInfo", url: "/api/project/getZdfxInfo",
data: { data: {
id: riskId id: riskId
}, },
callback: (res) => { callback: (res) => {
loading.value = false; loading.value = false;
Object.assign(formData, res); Object.assign(formData, {
...res,
jnw: res.jnw ? res.jnw.toString() : undefined,
sjnzjjw: res.sjnzjjw ? res.sjnzjjw.toString() : undefined,
dsjngjjw: res.dsjngjjw ? res.dsjngjjw.toString() : undefined,
xmlx: res.xmlx ? res.xmlx.toString() : undefined,
});
console.log(formData);
szjList.value = jnwList.filter(item => item.key == res.jnw)[0]?.children || [];
dsgjList.value = szjList.value.filter(item => item.key == res.sjnzjjw)[0]?.children || [];
Object.assign(fxczqkData.value, res.zdfxczs);
} }
}); });
}; };
...@@ -146,11 +285,16 @@ ...@@ -146,11 +285,16 @@
let szjList = ref([]); // 省(境内)/洲际(境外) // 级联 let szjList = ref([]); // 省(境内)/洲际(境外) // 级联
let dsgjList = ref([]); // 地市(境内)/国家(境外) // 级联 let dsgjList = ref([]); // 地市(境内)/国家(境外) // 级联
let tzbkList = ref([]); // 投资板块 let tzbkList = ref([]); // 投资板块
let tzbkProps = {
label: "name"
};
let xmlxList = ref([]); //项目类型
onMounted(() => { onMounted(() => {
getProjectData(); getProjectData();
let resourceData = JSON.parse(sessionStorage.getItem("resourceData")); let resourceData = JSON.parse(sessionStorage.getItem("resourceData"));
jnwList = resourceData.dqlx; jnwList = resourceData.dqlx;
tzbkList = resourceData.tzbk; tzbkList = resourceData.tzbk;
xmlxList = resourceData["zdfx-type"];
if (riskId) { if (riskId) {
getRiskInfo(); getRiskInfo();
} }
...@@ -160,7 +304,6 @@ ...@@ -160,7 +304,6 @@
let selectData = jnwList.filter(item => item.key == val); let selectData = jnwList.filter(item => item.key == val);
szjList.value = selectData[0] && selectData[0].children || []; szjList.value = selectData[0] && selectData[0].children || [];
dsgjList.value = []; dsgjList.value = [];
qxgjList.value = [];
delete formData.sjnzjjw; delete formData.sjnzjjw;
delete formData.dsjngjjw; delete formData.dsjngjjw;
} }
...@@ -169,10 +312,24 @@ ...@@ -169,10 +312,24 @@
if (val || val === 0) { if (val || val === 0) {
let selectData = szjList.value.filter(item => item.key == val); let selectData = szjList.value.filter(item => item.key == val);
dsgjList.value = selectData[0] && selectData[0].children || []; dsgjList.value = selectData[0] && selectData[0].children || [];
qxgjList.value = [];
delete formData.dsjngjjw; delete formData.dsjngjjw;
} }
} }
// 风险处置情况
let fxczqkData = ref([]);
const addFxczqk = () => {
fxczqkData.value.push({});
};
const deleteFxczqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
fxczqkData.value.splice(index, 1);
})
}
const backClick = () => { const backClick = () => {
router.back(-1) router.back(-1)
} }
...@@ -184,7 +341,8 @@ ...@@ -184,7 +341,8 @@
proxy.$post({ proxy.$post({
url: "/api/project/" + url, url: "/api/project/" + url,
data: { data: {
...formData ...formData,
zdfxczs: fxczqkData.value
}, },
callback: (data) => { callback: (data) => {
router.back(-1) router.back(-1)
...@@ -192,3 +350,9 @@ ...@@ -192,3 +350,9 @@
}); });
} }
</script> </script>
<style lang="less">
@import "@/styles/manage.less";
.add-project-header{
margin-bottom: 10px;
}
</style>
\ No newline at end of file
...@@ -208,6 +208,7 @@ ...@@ -208,6 +208,7 @@
v-model="scope.row.lssj" v-model="scope.row.lssj"
type="datetime" type="datetime"
placeholder="请选择" placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:ss"
/> />
</template> </template>
</el-table-column> </el-table-column>
......
...@@ -101,7 +101,7 @@ ...@@ -101,7 +101,7 @@
router.push({ router.push({
name: "addRisk", name: "addRisk",
query: { query: {
controlId: item.id riskId: item.id
} }
}); });
}; };
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<script setup> <script setup>
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import * as XLSX from "xlsx"; import { exportTableFile } from "../../common/tableFileHandle";
const tableColumns = reactive([ const tableColumns = reactive([
{ {
prop: "projectName", prop: "projectName",
...@@ -116,74 +116,8 @@ ...@@ -116,74 +116,8 @@
}).catch(() => {}); }).catch(() => {});
}; };
const exportData = () => { const exportData = () => {
// 1. 创建工作簿 exportTableFile(tableData.value, tableColumns, "投资项目批复意见落实情况统计表", "导出文件")
const wb = XLSX.utils.book_new()
// 2. 准备数据
let wsData = [["投资项目批复意见落实情况统计表"], []]
// 添加表头
if (tableColumns && tableColumns.length > 0) {
const headerRow = tableColumns.map(h => h.label || h)
wsData.push(headerRow)
}
// 添加数据行
tableData.value.forEach(item => {
if (tableColumns) {
// 按表头配置提取数据
const row = tableColumns.map(header => {
const value = getNestedValue(item, header.prop || header)
return formatCellValue(value, header.formatter)
})
wsData.push(row)
} else {
// 如果没有表头配置,直接使用对象值
const row = Object.values(item)
wsData.push(row)
}
})
// 3. 创建工作表
const ws = XLSX.utils.aoa_to_sheet(wsData)
// 4. 设置列宽(可选)
if (tableColumns) {
const colWidths = tableColumns.map(header => ({
wch: header.width || Math.max(
(header.label || header).length,
...tableData.value.map(item => {
const value = getNestedValue(item, header.prop || header)
return String(value || '').length
})
) * 2
}))
ws['!cols'] = colWidths
}
// 合并标题单元格
ws['!merges'] = [
XLSX.utils.decode_range('A1:Q1') // 合并第一行的 A-E 列
]
// 5. 将工作表添加到工作簿
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
// 6. 生成 Excel 文件并下载
XLSX.writeFile(wb, "导出文件.xlsx");
}; };
// 辅助函数:获取嵌套对象的值
function getNestedValue(obj, path) {
return path.split('.').reduce((prev, curr) => {
return prev ? prev[curr] : null
}, obj)
}
// 辅助函数:格式化单元格值
function formatCellValue(value, formatter) {
if (formatter && typeof formatter === 'function') {
return formatter(value)
}
return value
}
</script> </script>
<style lang="less"> <style lang="less">
......
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