Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
dwsproject
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dws
dwsproject
Commits
0f6a80d2
Commit
0f6a80d2
authored
Feb 10, 2025
by
夏超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[fix] 玖姿项目导出数据
parent
57791b52
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
147 additions
and
14 deletions
+147
-14
roke_product_income_expense/controller/main.py
+77
-1
roke_product_income_expense/static/src/js/index.html
+70
-13
No files found.
roke_product_income_expense/controller/main.py
View file @
0f6a80d2
import
datetime
import
pandas
as
pd
import
xlsxwriter
from
odoo
import
http
,
tools
from
odoo.http
import
content_disposition
,
request
import
os
import
io
from
jinja2
import
FileSystemLoader
,
Environment
import
logging
_logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -44,10 +47,13 @@ class ProductIncomeExpenseIframe(http.Controller):
page
=
_self
.
jsonrequest
.
get
(
"page"
,
1
)
start_date
=
_self
.
jsonrequest
.
get
(
"start_date"
,
""
)
end_date
=
_self
.
jsonrequest
.
get
(
"end_date"
,
""
)
type_str
=
_self
.
jsonrequest
.
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
))
data_list
=
_self
.
env
[
"roke.product.income.expense"
]
.
sudo
()
.
search
(
domain
,
limit
=
limit
,
offset
=
(
page
-
1
)
*
limit
,
order
=
"business_date desc, create_date desc"
)
...
...
@@ -77,3 +83,73 @@ class ProductIncomeExpenseIframe(http.Controller):
return
{
"code"
:
1
,
"message"
:
"删除失败,没找到对应数据。"
}
data
.
unlink
()
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
roke_product_income_expense/static/src/js/index.html
View file @
0f6a80d2
...
...
@@ -44,13 +44,13 @@
<el-input
v-model=
"scope.row.expenditure"
type=
"number"
placeholder=
"请输入"
></el-input>
</template>
</el-table-column>
<!-- <el-table-column label="创建人" align="center" width="110">--
>
<!-- <template slot-scope="scope">--
>
<!-- <div>--
>
<!-- [[ scope.row.user_name ]]-->
<!-- </div>--
>
<!-- </template>--
>
<!-- </el-table-column>
-->
<!-- <el-table-column label="创建人" align="center" width="110"
>
<template slot-scope="scope"
>
<div
>
[[ scope.row.user_name ]]
</div
>
</template
>
</el-table-column>
-->
<el-table-column
label=
"操作"
align=
"center"
width=
"95"
>
<template
slot-scope=
"scope"
>
<el-button
type=
"primary"
@
click=
"saveListData"
>
保存
</el-button>
...
...
@@ -62,10 +62,16 @@
<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=
"开始日期"
end-placeholder=
"结束日期"
format=
"yyyy-MM-dd"
value-format=
"yyyy-MM-dd"
@
change=
"datePickerChange"
>
end-placeholder=
"结束日期"
format=
"yyyy-MM-dd"
value-format=
"yyyy-MM-dd"
@
change=
"datePickerChange"
>
</el-date-picker>
<el-button
type=
"primary"
@
click=
"export_click"
>
导出
</el-button>
</div>
<el-table
:data=
"dataList"
border
height=
"500"
:row-style=
"{height: '0'}"
style=
"width: 100%;border: 1px solid black;border-color: black"
:cell-style=
"tableCellStyle"
...
...
@@ -156,7 +162,15 @@
user_id
:
null
,
}
],
datePickerValue
:
[
''
,
''
]
datePickerValue
:
[
''
,
''
],
select_options
:
[{
value
:
'income'
,
label
:
'收入'
},
{
value
:
'expenditure'
,
label
:
'支出'
}],
select_value
:
''
};
},
...
...
@@ -170,6 +184,11 @@
this
.
getDataList
()
},
methods
:
{
select_change
(
e
)
{
console
.
log
(
e
);
console
.
log
(
this
.
select_value
);
this
.
getDataList
()
},
// 列表 时间过滤
datePickerChange
(
e
)
{
console
.
log
(
e
);
...
...
@@ -185,12 +204,13 @@
},
// 获取列表数据
getDataList
()
{
this
.
loading
=
true
;
//
this.loading = true;
let
parameter
=
{
limit
:
10
,
//每页数量 非必填
page
:
this
.
currentPageNo
,
//当前页码
start_date
:
this
.
datePickerValue
[
0
],
end_date
:
this
.
datePickerValue
[
1
]
end_date
:
this
.
datePickerValue
[
1
],
type_str
:
this
.
select_value
}
axios
.
request
({
url
:
"/roke/product/product_income_expense/get"
,
...
...
@@ -210,7 +230,13 @@
});
}
this
.
loading
=
false
;
}).
catch
(
err
=>
{
console
.
log
(
err
);
this
.
$message
({
type
:
"error"
,
message
:
"接口报错,获取列表数据失败"
,
});
})
},
// 删除
deleteItem
(
item
,
index
)
{
...
...
@@ -243,7 +269,38 @@
}
else
{
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
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment