From f9da0cb09eaeb6310f3fb919b3227e92995be89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Tue, 16 Sep 2025 23:21:42 +0800 Subject: [PATCH] 1 --- yuthon_report/__init__.py | 2 +- yuthon_report/__manifest__.py | 9 ++- yuthon_report/models/__init__.py | 2 + yuthon_report/models/res_partner.py | 16 +++++ yuthon_report/static/description/icon.png | Bin 0 -> 7800 bytes .../components/yuthon_report/yuthon_report.js | 39 +++++++++-- .../yuthon_report/yuthon_report.xml | 61 ++++++++++++------ yuthon_report/views/menu.xml | 13 ++++ .../views/yuthon_report_res_partner.xml | 36 +++++++++++ 9 files changed, 149 insertions(+), 29 deletions(-) create mode 100644 yuthon_report/models/__init__.py create mode 100644 yuthon_report/models/res_partner.py create mode 100644 yuthon_report/static/description/icon.png create mode 100644 yuthon_report/views/menu.xml create mode 100644 yuthon_report/views/yuthon_report_res_partner.xml diff --git a/yuthon_report/__init__.py b/yuthon_report/__init__.py index 8b1378917..0650744f6 100644 --- a/yuthon_report/__init__.py +++ b/yuthon_report/__init__.py @@ -1 +1 @@ - +from . import models diff --git a/yuthon_report/__manifest__.py b/yuthon_report/__manifest__.py index de752798a..c852ab09f 100644 --- a/yuthon_report/__manifest__.py +++ b/yuthon_report/__manifest__.py @@ -8,7 +8,8 @@ 'license': 'LGPL-3', 'depends': ['base', 'web'], 'data': [ - + 'views/menu.xml', + 'views/yuthon_report_res_partner.xml' ], 'installable': True, 'application': True, @@ -16,10 +17,12 @@ 'web.assets_backend': [ # 样式 'yuthon_report/static/src/lib/ag-grid-c/styles/ag-grid.css', - 'yuthon_report/static/src/lib/ag-grid-c/styles/ag-theme-alpine.css', + # 'yuthon_report/static/src/lib/ag-grid-c/styles/ag-theme-alpine.css', + # 'yuthon_report/static/src/lib/ag-grid-c/styles/ag-theme-balham.min.css', + 'yuthon_report/static/src/lib/ag-grid-c/styles/ag-theme-quartz.min.css', # 先引入 community - 'yuthon_report/static/src/lib/ag-grid-c/dist/ag-grid-community.noStyle.js', + 'yuthon_report/static/src/lib/ag-grid-c/dist/ag-grid-community.js', # 再引入 enterprise 'yuthon_report/static/src/lib/ag-grid-e/dist/ag-grid-enterprise.js', diff --git a/yuthon_report/models/__init__.py b/yuthon_report/models/__init__.py new file mode 100644 index 000000000..26fd9feec --- /dev/null +++ b/yuthon_report/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import res_partner \ No newline at end of file diff --git a/yuthon_report/models/res_partner.py b/yuthon_report/models/res_partner.py new file mode 100644 index 000000000..36e703fa7 --- /dev/null +++ b/yuthon_report/models/res_partner.py @@ -0,0 +1,16 @@ +from odoo import fields, models, api + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + @api.model + def get_report_data(self, params): + domain = [] + if params.get("keyword"): + domain.append(("name", "ilike", params["keyword"])) + partners = self.search(domain, limit=100) + return [ + {"customer": p.name, "amount": p.credit} + for p in partners + ] diff --git a/yuthon_report/static/description/icon.png b/yuthon_report/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..89f76073e8217e75a388e358136e02138c00d656 GIT binary patch literal 7800 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%0DhCwx+%Qo7p)6CQJ{wB@9z;x zf=Y865ICuf4Bw2PrF{!?sG$C)aHC{jxS9hdIa+rygo2_j3?=|LYW z%*Q3iv3%$!24>7v%w6(16oLEN&5vJjpqb&+zR3Q_AyyF1Nj392zNtG+95kr52Fo6^ zls*g=NcCYhi2@W?{5TG4Hk$InY`izRT=_ZZLyp^YBkSc_1W7EjjOyQCplV|sho9Oi zD_uQ*VtqTtsrZd`mu?a>Y%AiOx2MTOVd^_Hi3R-8`bwzFN(Gjtc3lN_xKwBiIFuR& zYq~96*ge_54ESACXxD3h|1&$o3#UYAdb_}Vn@~X7nFVIRVlR$ua9=%$OjM8yf)Sp{9cr2; zql@KI)#mF8>!1BDp{sLR*vCmdosm)VT3MG>pL;9^CWL>U8?fk{P6O`7X2!n{q0u4W zj^@4upijD#?)$6+MN}Prm(i?^=_6L+h7B!FpqdtY%#Ka=SL3!$VI3g#M-v-He!Ph0 zu&g&nD!YYpp*_{f)z8P@cysbLjWGL)Kc=g?4jkDTG5zA$ifCx-3j~J zSG4Ym^-+J)rouv6mjuR3Hx{wLWI0Xq=%=e=OUL6yqRq3?xl`&-q1w)#7vR-8R&|M5 z#cxMy)&|K=N^bP~O5~)c{w~Q5dj!jbN&!5L)k(3%DC_pQY7vT3iLd7N_H3Zha{%c7 zO;d51y7#yML6_xx!B+qmivA}&FG!F2#KGq`;V~Fv#4WHE18OGNcoaC0kMw&5hgLsQhhSzbNRzFcUXe-`gI8kq}wiRhw+Zwap``~>(ssU5`jz9BL`BCsPD$z zNwjEg;WMU^3@g0SFT)1=vRF zwcY%A6?6(9NXnrH zL{2)>m1l%09_Fi}C^(w*D85W_<43c~zij5_F#(Fcj1IdFa49zqJU@47t^;tMdJLK+ zq&>!yfRKPYOl9MOADM>q^gr2V3aaCaZoK(?*8?P|yAS3%cR#{C-0%(?K8%SO?VuA zX;$!KQsuV=1nCNU)Z9i_O*@9BgWlbD|JPLCXC { // 加载 ag-grid //await loadJS("https://cdn.jsdelivr.net/npm/ag-grid-community/dist/ag-grid-community.min.js"); this.gridOptions = { + theme:agGrid.themeMaterial, columnDefs: this.config.columns || [], rowData: [], + sideBar: true, defaultColDef: { resizable: true, sortable: true, filter: true }, }; - this.grid = new agGrid.Grid(this.gridRef.el, this.gridOptions); + this.grid = new agGrid.createGrid(this.gridRef.el, this.gridOptions); }); } @@ -37,15 +44,33 @@ class YouthonReport extends Component { date_end: this.state.endDate, keyword: this.state.keyword, }; - - const result = await this.env.services.orm.call( + const result = await this.serviceOrm.call( this.config.model, this.config.method, [params] ); - this.gridOptions.api.setRowData(result); + console.log(result) + this.grid.setGridOption('rowData',result); } + + onExportExcel() { + this.grid.exportDataAsExcel({ + fileName: 'my-data.xlsx', + sheetName: 'Sheet1' + }); } + async onChangeStartDate(date){ + this.state.startDate = date; + } + async onChangeEndDate(date){ + this.state.endDate = date; + } +} +YouthonReport.props = {...standardActionServiceProps }; YouthonReport.template = "youthon_report.YouthonReport"; +YouthonReport.components = { + DateTimeInput +}; + registry.category("actions").add("youthon_report_client", YouthonReport); diff --git a/yuthon_report/static/src/components/yuthon_report/yuthon_report.xml b/yuthon_report/static/src/components/yuthon_report/yuthon_report.xml index ad6fb1e32..de968aea9 100644 --- a/yuthon_report/static/src/components/yuthon_report/yuthon_report.xml +++ b/yuthon_report/static/src/components/yuthon_report/yuthon_report.xml @@ -1,30 +1,55 @@ -
- -
-
- -
-
-
- -
-
-
- -
-
+
+
+
+ 销售报表 +
+
+ +
+
+ + + + +
+
+ +
+ +
+
+
- -
+ + + +
+
+
+
+ + +
-
+
+ diff --git a/yuthon_report/views/menu.xml b/yuthon_report/views/menu.xml new file mode 100644 index 000000000..140196efd --- /dev/null +++ b/yuthon_report/views/menu.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/yuthon_report/views/yuthon_report_res_partner.xml b/yuthon_report/views/yuthon_report_res_partner.xml new file mode 100644 index 000000000..73740df04 --- /dev/null +++ b/yuthon_report/views/yuthon_report_res_partner.xml @@ -0,0 +1,36 @@ + + + + + + Youthon 报表 + youthon_report_client + + { + "sideBar":true, + "report_config": { + "model": "res.partner", + "method": "get_report_data", + "search_fields": [ + {"name": "date_start", "type": "date", "label": "开始日期"}, + {"name": "date_end", "type": "date", "label": "结束日期"}, + {"name": "keyword", "type": "char", "label": "关键字"} + ], + "columns": [ + {"headerName": "客户", "field": "customer", "flex": 1}, + {"headerName": "销售额", "field": "amount", "flex": 1} + ] + } + } + + + + + + + \ No newline at end of file