Commit 0f6a80d2 by 夏超

[fix] 玖姿项目导出数据

parent 57791b52
import datetime import datetime
import pandas as pd
import xlsxwriter
from odoo import http, tools from odoo import http, tools
from odoo.http import content_disposition, request
import os import os
import io
from jinja2 import FileSystemLoader, Environment from jinja2 import FileSystemLoader, Environment
import logging import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -44,10 +47,13 @@ class ProductIncomeExpenseIframe(http.Controller): ...@@ -44,10 +47,13 @@ class ProductIncomeExpenseIframe(http.Controller):
page = _self.jsonrequest.get("page", 1) page = _self.jsonrequest.get("page", 1)
start_date = _self.jsonrequest.get("start_date", "") start_date = _self.jsonrequest.get("start_date", "")
end_date = _self.jsonrequest.get("end_date", "") end_date = _self.jsonrequest.get("end_date", "")
type_str = _self.jsonrequest.get("type_str", False) # income收入/expenditure支出
domain = [] domain = []
if start_date and end_date: if start_date and end_date:
domain.append(("business_date", ">=", start_date)) domain.append(("business_date", ">=", start_date))
domain.append(("business_date", "<=", end_date)) domain.append(("business_date", "<=", end_date))
if type_str:
domain.append((type_str, ">", 0))
data_list = _self.env["roke.product.income.expense"].sudo().search(domain, limit=limit, data_list = _self.env["roke.product.income.expense"].sudo().search(domain, limit=limit,
offset=(page - 1) * limit, offset=(page - 1) * limit,
order="business_date desc, create_date desc") order="business_date desc, create_date desc")
...@@ -77,3 +83,73 @@ class ProductIncomeExpenseIframe(http.Controller): ...@@ -77,3 +83,73 @@ class ProductIncomeExpenseIframe(http.Controller):
return {"code": 1, "message": "删除失败,没找到对应数据。"} return {"code": 1, "message": "删除失败,没找到对应数据。"}
data.unlink() data.unlink()
return {"code": 0, "message": "删除成功!"} return {"code": 0, "message": "删除成功!"}
@http.route("/roke/product/product_income_expense/export", type="http", auth='none', cors='*', csrf=False)
def get_product_income_expense_export(self, **kwargs):
_self = http.request
start_date = kwargs.get("start_date", "")
end_date = kwargs.get("end_date", "")
type_str = kwargs.get("type_str", False) # income收入/expenditure支出
domain = []
if start_date and end_date:
domain.append(("business_date", ">=", start_date))
domain.append(("business_date", "<=", end_date))
if type_str:
domain.append((type_str, ">", 0.0))
data_list = _self.env["roke.product.income.expense"].sudo().search(domain, order="business_date desc, create_date desc")
data = []
for v in data_list:
data.append({
"business_date": v.business_date,
"abstract": v.abstract or "",
"income": v.income or 0,
"expenditure": v.expenditure or 0,
"balance": v.balance or 0,
"user_name": v.create_uid.name or "",
"create_date": v.create_date + datetime.timedelta(hours=8),
})
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
worksheet = workbook.add_worksheet('Sheet1')
header_format = workbook.add_format({
'bold': True, 'border': 1,
'fg_color': '#17a2b8', 'font_color': '#FFFFFF',
'align': 'center', 'valign': 'vcenter'
})
date_format = workbook.add_format({'num_format': 'YYYY-MM-DD'})
datetime_format = workbook.add_format({'num_format': 'YYYY-MM-DD HH:MM'})
currency_format = workbook.add_format({'num_format': '#,##0.00'}) # 逗号作为千分位分隔符
worksheet.write(0, 0, "业务日期", header_format)
worksheet.write(0, 1, "摘要", header_format)
worksheet.write(0, 2, "收入", header_format)
worksheet.write(0, 3, "支出", header_format)
worksheet.write(0, 4, "结余", header_format)
worksheet.write(0, 5, "创建人", header_format)
worksheet.write(0, 6, "创建时间", header_format)
for row_num, row_data in enumerate(data):
worksheet.write_datetime(row_num + 1, 0, row_data.get("business_date"), date_format)
worksheet.write(row_num + 1, 1, row_data.get("abstract"))
worksheet.write_number(row_num + 1, 2, row_data.get("income"), currency_format)
worksheet.write_number(row_num + 1, 3, row_data.get("expenditure"), currency_format)
worksheet.write_number(row_num + 1, 4, row_data.get("balance"), currency_format)
worksheet.write(row_num + 1, 5, row_data.get("user_name"))
worksheet.write_datetime(row_num + 1, 6, row_data.get("create_date"), datetime_format)
workbook.close()
output.seek(0)
file_name = '财务收支记录.xlsx'
response = request.make_response(
None,
headers=[
('Content-Type', 'application/vnd.ms-excel'),
('Content-Disposition', content_disposition(file_name))
]
)
response.stream.write(output.read())
output.close()
return response
...@@ -44,13 +44,13 @@ ...@@ -44,13 +44,13 @@
<el-input v-model="scope.row.expenditure" type="number" placeholder="请输入"></el-input> <el-input v-model="scope.row.expenditure" type="number" placeholder="请输入"></el-input>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="创建人" align="center" width="110">--> <!-- <el-table-column label="创建人" align="center" width="110">
<!-- <template slot-scope="scope">--> <template slot-scope="scope">
<!-- <div>--> <div>
<!-- [[ scope.row.user_name ]]--> [[ scope.row.user_name ]]
<!-- </div>--> </div>
<!-- </template>--> </template>
<!-- </el-table-column>--> </el-table-column> -->
<el-table-column label="操作" align="center" width="95"> <el-table-column label="操作" align="center" width="95">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" @click="saveListData">保存</el-button> <el-button type="primary" @click="saveListData">保存</el-button>
...@@ -62,10 +62,16 @@ ...@@ -62,10 +62,16 @@
<div style="text-align: right; margin-bottom: 5px;"> <div style="text-align: right; margin-bottom: 5px;">
<el-select v-model="select_value" clearable placeholder="请选择类型" @change="select_change">
<el-option v-for="item in select_options" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-date-picker v-model="datePickerValue" type="daterange" range-separator="至" start-placeholder="开始日期" <el-date-picker v-model="datePickerValue" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="datePickerChange">
@change="datePickerChange">
</el-date-picker> </el-date-picker>
<el-button type="primary" @click="export_click">导出</el-button>
</div> </div>
<el-table :data="dataList" border height="500" :row-style="{height: '0'}" <el-table :data="dataList" border height="500" :row-style="{height: '0'}"
style="width: 100%;border: 1px solid black;border-color: black" :cell-style="tableCellStyle" style="width: 100%;border: 1px solid black;border-color: black" :cell-style="tableCellStyle"
...@@ -156,7 +162,15 @@ ...@@ -156,7 +162,15 @@
user_id: null, user_id: null,
} }
], ],
datePickerValue: ['', ''] datePickerValue: ['', ''],
select_options: [{
value: 'income',
label: '收入'
}, {
value: 'expenditure',
label: '支出'
}],
select_value: ''
}; };
}, },
...@@ -170,6 +184,11 @@ ...@@ -170,6 +184,11 @@
this.getDataList() this.getDataList()
}, },
methods: { methods: {
select_change(e) {
console.log(e);
console.log(this.select_value);
this.getDataList()
},
// 列表 时间过滤 // 列表 时间过滤
datePickerChange(e) { datePickerChange(e) {
console.log(e); console.log(e);
...@@ -185,12 +204,13 @@ ...@@ -185,12 +204,13 @@
}, },
// 获取列表数据 // 获取列表数据
getDataList() { getDataList() {
this.loading = true; // this.loading = true;
let parameter = { let parameter = {
limit: 10, //每页数量 非必填 limit: 10, //每页数量 非必填
page: this.currentPageNo, //当前页码 page: this.currentPageNo, //当前页码
start_date: this.datePickerValue[0], start_date: this.datePickerValue[0],
end_date: this.datePickerValue[1] end_date: this.datePickerValue[1],
type_str: this.select_value
} }
axios.request({ axios.request({
url: "/roke/product/product_income_expense/get", url: "/roke/product/product_income_expense/get",
...@@ -210,7 +230,13 @@ ...@@ -210,7 +230,13 @@
}); });
} }
this.loading = false; this.loading = false;
}); }).catch(err=>{
console.log(err);
this.$message({
type: "error",
message: "接口报错,获取列表数据失败",
});
})
}, },
// 删除 // 删除
deleteItem(item, index) { deleteItem(item, index) {
...@@ -243,7 +269,38 @@ ...@@ -243,7 +269,38 @@
} else { } else {
this.dataList.splice(item.$index, 1) this.dataList.splice(item.$index, 1)
} }
},
// 导出
export_click() {
if (this.dataList.length > 0) {
this.loading = true;
let formData = new FormData();
let _config = { responseType: 'blob' }
formData.append("start_date", this.datePickerValue[0]);
formData.append("end_date", this.datePickerValue[1]);
formData.append("type_str", this.select_value);
axios.post("/roke/product/product_income_expense/export",
formData,
_config,
).then(res => {
this.loading = false
let blob = new Blob([res.data], { type: res.data.type });
let url = window.URL.createObjectURL(blob);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", `财务收入支出表.xlsx`);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
})
} else {
this.$message({
type: 'error',
message: '请根据配置的筛选条件查询数据后在导出报表!'
});
}
}, },
// 保存 // 保存
saveListData() { saveListData() {
......
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