From 77eccd6f34c14e376dd99ec6915a935765c471a7 Mon Sep 17 00:00:00 2001 From: wurong <953969641@qq.com> Date: Thu, 28 Dec 2023 16:50:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88=E9=A6=96=E9=A1=B5=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=EF=BC=9B=20=E6=88=91=E7=9A=84=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=97=A8=E5=BA=97=E4=BA=8C=E7=BB=B4=E7=A0=81?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=EF=BC=8C=E5=BA=97=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9B=EF=BC=88=E9=97=A8=E5=BA=97=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=E6=8E=A5=E5=8F=A3=E6=9A=82=E6=9C=AA=E6=97=A0?= =?UTF-8?q?=EF=BC=8C=E8=AF=A5=E5=8A=9F=E8=83=BD=E6=9A=82=E6=9C=AA=E5=BC=80?= =?UTF-8?q?=E6=94=BE=EF=BC=89=20=E9=A6=96=E9=A1=B5=E5=95=86=E5=93=81?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E6=9B=B4=E6=94=B9=EF=BC=9B=20=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8C=87=E5=AE=9Atab?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=EF=BC=9B=20=E6=96=B0=E5=A2=9E=E6=94=B6?= =?UTF-8?q?=E9=93=B6=E5=8F=B0=E9=A1=B5=E9=9D=A2=EF=BC=9B=20=E6=94=B6?= =?UTF-8?q?=E9=93=B6=E5=8F=B0=E9=A1=B5=E9=9D=A2=E6=95=B4=E4=BD=93=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=95=B0=E6=8D=AE=E6=B5=81=E7=A8=8B=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=EF=BC=9B=20=E5=BA=97=E5=91=98=E7=AE=A1=E7=90=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2/=E4=BC=9A=E5=91=98=E4=BD=99=E9=A2=9D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E9=A1=B5=E9=9D=A2=E6=8E=A5=E5=8F=A3=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=AF=B9=E6=8E=A5=EF=BC=9B=20app=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=80=9A=E7=9F=A5=E5=9B=BE=E7=89=87bug=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=EF=BC=9B=EF=BC=88=E6=96=87=E4=BB=B6=E5=90=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=89=20=E6=89=AB=E4=B8=80=E6=89=AB=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=96=B0=E5=A2=9E=E6=94=B6=E9=93=B6=E5=8F=B0=E6=89=AB?= =?UTF-8?q?=E7=A0=81=E6=94=AF=E4=BB=98=E6=B5=81=E7=A8=8B=E5=8F=8A=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AF=B9=E6=8E=A5=EF=BC=9B=20=E6=80=BB=E8=A7=88?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8C=87=E5=AE=9Atab=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E6=9B=B4=E6=94=B9=EF=BC=9B=20vip=E5=85=85=E5=80=BC?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E9=80=89=E6=8B=A9=E5=85=85=E5=80=BC=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E6=98=BE=E7=A4=BA=E9=9A=90=E8=97=8F=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/image/2x/bs_query_logo.webp | Bin 922 -> 0 bytes assets/image/2x/bs_trophy_one.webp | Bin 1182 -> 0 bytes assets/image/2x/bs_trophy_three.webp | Bin 1530 -> 0 bytes assets/image/2x/bs_trophy_two.webp | Bin 1452 -> 0 bytes assets/image/2x/bus_calculator_enter.webp | Bin 0 -> 1034 bytes .../bus_calculator_plus.webp} | Bin 648 -> 592 bytes assets/image/2x/bus_cashier_balance.webp | Bin 0 -> 1574 bytes assets/image/2x/bus_cashier_pt.webp | Bin 0 -> 1248 bytes assets/image/2x/bus_cashier_scan_code.webp | Bin 0 -> 896 bytes assets/image/2x/bus_cashier_xj.webp | Bin 0 -> 1660 bytes .../bus_coupon.webp} | Bin 780 -> 776 bytes assets/image/2x/bus_integral.webp | Bin 0 -> 1154 bytes assets/image/2x/bus_vip_balance.webp | Bin 0 -> 1236 bytes assets/image/2x/icon_new_vip.webp | Bin 1114 -> 0 bytes assets/image/2x/icon_vip_recharge.webp | Bin 1140 -> 0 bytes assets/image/2x/icon_vip_total.webp | Bin 1126 -> 0 bytes assets/image/3x/bs_query_logo.webp | Bin 1258 -> 0 bytes assets/image/3x/bs_trophy_one.webp | Bin 1736 -> 0 bytes assets/image/3x/bs_trophy_three.webp | Bin 3548 -> 0 bytes assets/image/3x/bs_trophy_two.webp | Bin 2230 -> 0 bytes assets/image/3x/bus_calculator_enter.webp | Bin 0 -> 1408 bytes .../bus_calculator_plus.webp} | Bin 758 -> 670 bytes assets/image/3x/bus_cashier_balance.webp | Bin 0 -> 2544 bytes assets/image/3x/bus_cashier_pt.webp | Bin 0 -> 2120 bytes assets/image/3x/bus_cashier_scan_code.webp | Bin 0 -> 1270 bytes assets/image/3x/bus_cashier_xj.webp | Bin 0 -> 4134 bytes assets/image/3x/bus_coupon.webp | Bin 0 -> 1044 bytes assets/image/3x/bus_integral.webp | Bin 0 -> 2108 bytes assets/image/3x/bus_vip_balance.webp | Bin 0 -> 2244 bytes assets/image/3x/icon_new_vip.webp | Bin 3184 -> 0 bytes assets/image/3x/icon_vip_recharge.webp | Bin 3000 -> 0 bytes assets/image/3x/icon_vip_total.webp | Bin 3124 -> 0 bytes assets/image/bs_trophy_one.webp | Bin 800 -> 0 bytes assets/image/bs_trophy_three.webp | Bin 950 -> 0 bytes assets/image/bs_trophy_two.webp | Bin 926 -> 0 bytes ...p_total.webp => bus_calculator_enter.webp} | Bin 760 -> 710 bytes assets/image/bus_calculator_plus.webp | Bin 0 -> 568 bytes assets/image/bus_cashier_balance.webp | Bin 0 -> 874 bytes assets/image/bus_cashier_pt.webp | Bin 0 -> 796 bytes assets/image/bus_cashier_scan_code.webp | Bin 0 -> 714 bytes assets/image/bus_cashier_xj.webp | Bin 0 -> 980 bytes assets/image/bus_coupon.webp | Bin 0 -> 640 bytes assets/image/bus_integral.webp | Bin 0 -> 774 bytes assets/image/bus_vip_balance.webp | Bin 0 -> 818 bytes lib/business_system/business_page.dart | 4 + .../home/business_home_page.dart | 1436 ++++------------- .../home/cashier/cashier_page.dart | 1289 ++++++++++++++- .../home/consumer_ranking_page.dart | 105 +- .../home/overview/trade_overview_page.dart | 5 +- .../home/vip/business_vip_page.dart | 2 +- .../home/vip/vip_recharge_page.dart | 6 +- .../mine/business_mine_page.dart | 5 +- lib/business_system/scan_code_page.dart | 39 +- lib/retrofit/business_api.dart | 19 +- lib/retrofit/business_api.g.dart | 87 + .../data/phone_query_member_info.dart | 417 ++++- lib/retrofit/data/store_total_money_info.dart | 51 + lib/setting/permission_setting_page.dart | 2 +- 58 files changed, 2268 insertions(+), 1199 deletions(-) delete mode 100644 assets/image/2x/bs_query_logo.webp delete mode 100644 assets/image/2x/bs_trophy_one.webp delete mode 100644 assets/image/2x/bs_trophy_three.webp delete mode 100644 assets/image/2x/bs_trophy_two.webp create mode 100644 assets/image/2x/bus_calculator_enter.webp rename assets/image/{bs_query_logo.webp => 2x/bus_calculator_plus.webp} (62%) create mode 100644 assets/image/2x/bus_cashier_balance.webp create mode 100644 assets/image/2x/bus_cashier_pt.webp create mode 100644 assets/image/2x/bus_cashier_scan_code.webp create mode 100644 assets/image/2x/bus_cashier_xj.webp rename assets/image/{icon_vip_recharge.webp => 2x/bus_coupon.webp} (52%) create mode 100644 assets/image/2x/bus_integral.webp create mode 100644 assets/image/2x/bus_vip_balance.webp delete mode 100644 assets/image/2x/icon_new_vip.webp delete mode 100644 assets/image/2x/icon_vip_recharge.webp delete mode 100644 assets/image/2x/icon_vip_total.webp delete mode 100644 assets/image/3x/bs_query_logo.webp delete mode 100644 assets/image/3x/bs_trophy_one.webp delete mode 100644 assets/image/3x/bs_trophy_three.webp delete mode 100644 assets/image/3x/bs_trophy_two.webp create mode 100644 assets/image/3x/bus_calculator_enter.webp rename assets/image/{icon_new_vip.webp => 3x/bus_calculator_plus.webp} (53%) create mode 100644 assets/image/3x/bus_cashier_balance.webp create mode 100644 assets/image/3x/bus_cashier_pt.webp create mode 100644 assets/image/3x/bus_cashier_scan_code.webp create mode 100644 assets/image/3x/bus_cashier_xj.webp create mode 100644 assets/image/3x/bus_coupon.webp create mode 100644 assets/image/3x/bus_integral.webp create mode 100644 assets/image/3x/bus_vip_balance.webp delete mode 100644 assets/image/3x/icon_new_vip.webp delete mode 100644 assets/image/3x/icon_vip_recharge.webp delete mode 100644 assets/image/3x/icon_vip_total.webp delete mode 100644 assets/image/bs_trophy_one.webp delete mode 100644 assets/image/bs_trophy_three.webp delete mode 100644 assets/image/bs_trophy_two.webp rename assets/image/{icon_vip_total.webp => bus_calculator_enter.webp} (53%) create mode 100644 assets/image/bus_calculator_plus.webp create mode 100644 assets/image/bus_cashier_balance.webp create mode 100644 assets/image/bus_cashier_pt.webp create mode 100644 assets/image/bus_cashier_scan_code.webp create mode 100644 assets/image/bus_cashier_xj.webp create mode 100644 assets/image/bus_coupon.webp create mode 100644 assets/image/bus_integral.webp create mode 100644 assets/image/bus_vip_balance.webp create mode 100644 lib/retrofit/data/store_total_money_info.dart diff --git a/assets/image/2x/bs_query_logo.webp b/assets/image/2x/bs_query_logo.webp deleted file mode 100644 index 08efe8e5a7ad15f9873a5b8f2bf45a7b4c841c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmWIYbaR`;%)k)t>J$(bU=hK^z`$St#L{5o>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33tpu6&c zFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou1WFfuUcOCMkpC{I$zo&Cdn?^|=j|DVrq z$i01HlLCW)Q%6G5f*S${54i-qss1h_ z#>T+W#TY1(z}(=#!O+#o&>+vuti-{@F-c|iwr4lD<=#Gaw0`~f{d51HoB4TTQ^!B; zoZH)8-V2rb&Zz_h*{k+nzn@=w-#@amqod+vW9po=>0FboQ}Kkd@b8y(?OwB*E=SX1b4xaN4I==@9`w z1>1x}7kF;YO^9Bt(=a>MCu_xouZ@#V+|$?5bunR@)U>#z-IUdL*9wLuM_COQsLfoa zcs0Gc>w30B%mjv2D)}$pPyBh%xL84pF=fN`hvD0FY!h^qe=OXe82n6e!)Jr-5B@r5 zFnOzMHr+}5p)VtIU!be6%2V$X{l6 z@Ib9<%^BBX_FYa^XO3?&lQ_YdQ6sR!OvU%3?n1}c#bVd5%-`}uo%g@z@Bbgt|9!d6 F0RT>z2vGn4 diff --git a/assets/image/2x/bs_trophy_one.webp b/assets/image/2x/bs_trophy_one.webp deleted file mode 100644 index e7a1ee2e7a535fec0ece535cc76f73dcbbe6ce87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182 zcmWIYbaR`=!oU#j>J$(bU=hK^z`$St#KvIc>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9z}R45N=sv4__UmXfj5$YLHGg#16MRy4oKi|n*vZu2I#JQ zAWUb-VMt|AVDMzfV@PJu1G0>Ok!r|b28>~!6-*2a`o;%%1lB)Zc57Q|<-G6T<<-o% z1R8Fpr+q3ou~;z1*nxTWoq5}j{n_1_dpq>o-v5&wnPf$sUIaMIo~xk5&i;czTH{2b zb%{DPB2Ei-{rku3 zv1VdOcHEMnjf&Y{n3Xl973<{#I&ZN2Q~5Zd-u*LzLhX|7VU*3NqjtR;7uZcb8JS#~*T z=FFKllhV>MucUo5H2(JU|Av}(@7_qsEB`uwAXnKnOuSF>9x!0H@vfNxREZ4Me#vKL zSg`C$|6~=nMFHU@?XsVbO}|9ssB1K*ar28#6GX0k5&yJzzmq_8rP o*4tX&cR#rH{;R?Oud{Xi)BIOHo&4UmJ$(bU=hK^z`$St#KvIc>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33tpu6&c zFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou1Yf#&NQAK($V&uV&mTk7f3`}66d;jT-+NP!=CTF-jH>B+osgDwS{k8%Kh!vpDB(g@f1+peV6E=&bY?#~3lqWqqn}LrhgF|aWB|~|we0%O~k0QS>Z|>DIvUmulsIQ5z-*w>F zg_(VKqI?ytu3|nf3q%s3yu%}FaFy%nZwZS>+`z5 zm;dgL|Nr#<*0Z5Ag8%*(^9xOs{qjFtb?wPh|3jnpaQ*lFAOBF**-E+6WpC5;g$fTt z_Zr<ks!Fn!7(?Zyog9*0mS@Bz3W7XU zI#iZU5?(sVAW*?HQ>}T6ny%BPHMzOlZXW+V_h(2vWAD+^rodVx%UX>Mw6POa1Ze4zS)9jghRgJ}_ofdkm%T*ja4Yiid*wX&n zx%+D8yZ8J$*VNRNqMu#!dGRjm{PDFc?T=IJ6t@M*c!~XJxfV0+jds+Y|ZV+^z3cD z7OQV=oBns+x&5n`cmFY5^q=R>wqE5Udv{Al_uB&#hl9sTZb4LVF;obc7z{k(PIq>o zgK3qkX1bb~7&>2kBrG}CDrAX^dxdr6`9F0lDo*b?=lS(QknJrCyDc(hn{M?8_uKvd z^Wnh^##FyY*1Rifbd;1XUEdJvo_=OQ>%@;S{>>-m-wuDjwc|>5#jIsf^_*6+Z>E}C zcV@(|{uBDUGkE!z4PfTYvd2&|$_LJj$+&$uDdrxE*KYOLK?_WiIfLhSvFUIa? zRb=Cr9{s7Q*EuKr7w2pDQjwh|cSLr+ixA(xBzyg-b7J{t6?X<4o|pEry7HmVUHgf< zy{x$%oOi9O+7dWt_J`K0lgnOn+;-dbs5k#@tnd1BEB7X7yjYZ>;Ws7eg3;PLaZfKh z%J2O4q>*u7>b9td+{_E-Zo23v{p-2J(JN=oZkeziFgO%GEBk5+!($E&lhB3s3=twq z(`HSX=EBerTXAgKwCu3Me=Lss=G+yS5whXN%}pBingR?A2_8~=wAr>?WoFR1_~tR! zaf9=mI-N5kVZbtc6%gp9Yxkt6NoDC8gTUt7Z_9Sy%~H?q5xJA=T|R+x^G%lCsWa7n b)TXCFLGQlVbDcHIca^I8-d>y13M>r)>~}a( diff --git a/assets/image/2x/bs_trophy_two.webp b/assets/image/2x/bs_trophy_two.webp deleted file mode 100644 index 937ad45a0790d215b766631713b5fd17a6bae9b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1452 zcmaJ=3s4hR6unC{5I#yMXc+7a=!&2erfM^F%$yUs`Cp_NgSUd;re=8^TWce^@jjMYZj4$ z$E zkfh$FACYNtE+q+*iUmquBV^7NV`7?53Z(pLKC(plx0ftAvnp{p5U~a*5u5LQ&HCv!PLx*uNk58 zQUp{m?t8TfT@+E-1vpu|A9mhzKgjXVJXOTi8?vDR*=WC#3`B8)Kdo&ksPv&tLzRn3 zy|wpNv}v(Kg8H$_i}bgDpVUx+z$sUl1O{>(C)$}LjsXz;lTR(a-g0+5wVWGE0&FrE z_Un5f39bsgw9^sn3OWdMDf|Mt(=T6PrQy{+X7b#CZcTh$c=dL5f8gocSvVNk6gNkm z-=prAu_7vaGI0>qYNYi8-Uip0B(}*6aEd%yl^eI=#1Dg$zTMF-&J5$_n!TRPWs45P zVe-&5mK!E2e)73w6<27vgRahZ{H$DEq&Tv0vDGzM_Lvu?PHaWf9?nt!p*2BMHr@7% z{HwRYk1(eJoa?~yH~$Oym^8=qc^SL#Xld`WL|UD5!EnS-WAdJ%I(|f zju5AU-}gR>l}S>Dau?qIh~$aK2F&TXPXbq*rm3kdhY~~sS)JN6lg^GiYbX)d$6F$@ z+R~Opk79JCL;LXtPvV8MRm`u4{l2V(LE(6X%5zmQ!!-7Z`A}KwuE9@uzkO2)_iOwX z_2wM7yS!xo!{!=?jZ+G%{_z?uDI0m{l(D6vB)9Q$@zUo>M~Xe-wbNU}_U#V-LLk)^ zetvOf$Psa$y;Q%S8=7F(GqFDGQ)SZr(#Twgb%!!L7rlmREGtBh+HEYepws^fU{BoI z>PkN>l^)~z+m|2XK3!LSb%K#+_%}b;@M`N-+cbCa*#VJIokv-+fTzB+nvvdqyu77r z-G}?mq?BH7R!(CM%7-WGohB*gw(}dRAG5J5!!{L7qg9?%$aa~yp4ps1@8%beXfjVw znt~qW?_;-1f-=y}dS+%iW~uFBjktFTrn0+d!ni%IF0WC;`cbJ=)_2@8$2Z>Y<|*FB n*|GZRkqg7^J_k*F6}wV10ACTY-ae}jJjbN&Lg diff --git a/assets/image/2x/bus_calculator_enter.webp b/assets/image/2x/bus_calculator_enter.webp new file mode 100644 index 0000000000000000000000000000000000000000..3d4c5852fe57307ae929f4d8779021507677202e GIT binary patch literal 1034 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 cD>=gQeS6cBu+U$6nsWEQ8~cA-;eIh z?|4%4LW6-c2N26J6f*=dxHC9`{14;-+vc?`)6dO(&DFj5T}%z!cM)5*xdpzrA*AP~QB#YB~*<@|NeehW!U@c{5OFf!vf0o@uVG-NbWH_ z7Qt>%znqU@*)fUF4AI)*U*_vf)A*_kokOrqREypFin6TMcN9 zIl~#Clv%^c+#;3l9DiMo=#SK-&?Uw(|4B0>ahp~`q7A!qjH!;qgEzdoAdb;lWzTeOLdB5M!^Sj*3t!f=s7+ySeD%{rq*62Y~`KK3EWuMpf*2L6wkD8WECAKn|xumqRtdAPx&#;zn{Fyu=;loI$71A&r-uQ+>Q$ zAszy8qp**7@JF0Tq003ckj610JW76-+~luY9ZL2+2(2q2*8w!(4cvf>{Qb}#vd9tu z?4|)&k+mEPE(D+^8GucF%P}|y0JS6l_~PZ*@}E$Gs6ii&Q-ts<5($9GG62>>!esv#)nscEa7cVZxEQZ3ctOs$j&M_)tFjX1G z;YVnb=!kJ3OVDYvZ@F80Gn`m#KkG70dzuG36Ftr3_F^Ba_+r~~N{|y}y=cqbiJD2C z=LTuNXeWVUCbPi(*EH-&rZ9wMSqOK@e*Th&beb>CV;{DT9eInJ-^p-{PwJMo)eXxu z3!Mk}{OX7)SnB4EiM}AxJL}oz&Wy+cttr}~;2vwbffc2oKA)=<5Tu=fh0cADgm*zxaQ5X(RZU_y;<$8 zfh(eA7T5LGUI?S$75Wy7(ok7k!&R6-N&D(8T8 zomG(U!uwobF>*5cLF{0ZZQ%9-bHAfqS?O zeT%Xkig34xT)J+@%Qul}PBHkZ z*0l4DK2v#mM>J0i>9fVIV+(;^xEU;$w|$*n44N$bLqhqD((=Sv*Esg%5K;@DkY3`< zlnSzIM26ZsJ&G#O#(i<){P$c1m!Zg3Zq()B-5!Pw#dws-X&d`FRTL?#h;WL_4mYPV zJJ2soAL(~T|3$cW1)ENo9opt`;+tB;hL{MeRGnP4wAp+M=~?08xc_WWiMg7h4zfFW zM_svxQTk3Rl)o)5pW?Vz)#QNVmh$xvqb`4MY~YsL_%irZiisL_gwJC?I`(X+CH+9& z4;tR~K|hu5dyPBeqa5B=TW)APrapQJ!4*#q6Gl_mJVh1#pVyWrADL??7{77`=8pR= zQP{cp7MXeQO<8n(y!*t0Qb3oM#NgaH^+|rW-gJ|fVkes+YXn06duONXGOc4pO;sfF z{8cq+gcVxJc9VF`ou0hCtMXtD9h{EwE0v9nPu?Mv4+@jH{jaE{f3g?>w;DOLnQItQ z4e2&zbRr%e+d~&s8@;+A(` zQ;c|Z#fnJr_a`1F$-v2pgoqQ%B0?ajf>;)?BuR2wHQsxu`(ITWEisIq`Hkp51GkM7 z<(PWIk7#xP000000001hf1^1dW(_(A0D!31B}tMbNs=V#-k$%5xp+pg+(@0x6Pojt zxx2OSQzlzhji$8vnaqHp&Ly>GLgT{j*$>*pmI3I!bikO}QUjY8tK%xQB?m4qm#L+; zWKYRcTPkZ5FB?#&wwP$=r8iYGB}m8=>cLEy{P|rm(JD*orS$Pp7=7=uim$)rX+6*X QZ=Xlc$iTrHHpqj{8@NW11ONa4 delta 322 zcmV-I0lof+28;$AQb|Te1Oos7S4BclR!}%t3IG5AFaQ7m6951cu^iR`e-!}$05223 z1Q2(jpp7JDp2_r^d@+nB(6((Gs{bF{DQ3_}lA=B)(`WL$JkBs|8%c3+PUnMXOpv^- zI5SzQo73>GIm%`~hfFd{6j>5cn2V_6-+AYeeI`VkA%--Ca1$GmJ&HK*yjYnQQ5ahw z*k*`VPFV%bqWXzu!!JdU|=u+Vm&bObaoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktlU~DijrKK@2d|J-Hz#GZHAbf#=fh!s;2PAN~O#vt+19VqD z5T-NaFr+dlFnBWLF(d<{Qh~t;7^#K~X22Ns>0x4E(AR6=7Py}{A$Q5WiF@s@%x_z4 zHc92=MdzF!i)X%{cXC0liu*pl-wWh=*B{=HD}CHh`r&t}6L+QCkH6bx(S7~!Pm8(# z>t7%5*dM!azSi&h)#f`pCp~vs?RIm`hLE)Y73J?fs+3(ahxqkK(b=0H zKf2fVU*0m09W3-KEb)gD7%aMO@cneyO9vO1B{CLM)0PWH@v zdiTw#tk9m7>usKT-oMP!Uwtg*`kB}dt9Ir0ve=|Nq>|Nbv2x?AcDq-YXS9 zcHWXbnjW~@u|Rm&E#u~mZ5>LwYEJD8MT^d9^8OE6;^uT^FTK0 z7Gm-6|L;voNlEpq4~a={jDG$*i%o_nFj?uW=KbkcFFKtTUZ+3f_?sgsIt{8fT#mB~ z#_AdzooV|0c&hmUu{myzInQ5w-tVlE$#1wY$$fjan&6-I{ZE8Ge0Y2!iK|39*y^m) z_1%&YzP)oY+#hb4)xUQKyBd>);!i=p0}~`mnSQK!`(uql%p8NA5t&Yxj;@isXkPzL zFnQtT0@)RBo^De)cd!4i?~00rCFif?-<@nao%7o4{6*%!(*pgio?Jh-{;cRl=cl1w z@^fmQ%5?oS-c`6P%z9~V>AiCzU8{{R%1-|`bH`7s95%zlNB;g$skK|fpRV7ZwWCt+ mnWx%^tb=>@JXpDKy{lX6{BZrB$KHJD(5RA2Kif1fk^unaagYN5 literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_vip_balance.webp b/assets/image/2x/bus_vip_balance.webp new file mode 100644 index 0000000000000000000000000000000000000000..8f0baf4636444f76138b20b4d889bd11a02917e2 GIT binary patch literal 1236 zcmWIYbaOky!oU#j>J$(bU=hK^z`$St#Cl-l>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9z}R45N=sv4__UmXfj5$YLHGg#16MRy4oKi|n*vZu2I#JQ zAWUb-VMt|AVDMzfV@L)@r2>NyFj5T}%z!cMbC-#ML0_+dTVQ?Sgxn?fChoPrGM{bn zwuve`cc)kA)|>p^>+N{k%`fj`-HP+ct&O+06)xsG!*q9V!<~&AEN`0KE`8x{{(t|~ z<1TwlqyOnwe*Ui{zs)K2!7mG4UyqB4lV0oy(9(8FImT(#)74e&V45CC(XQ>ojkF^^>1=Pt^V(~|8k11 z*rsh;KA~>5Ti`|!>DlWSy=3j<2=Dm(%8hT{j?YdDd^7U%1=5(J*Yyf2tvz#AZe7^f z;#b-HHkrL_GTWQJ?-I*95PIGJuhWqzcDr!L|0~+{SROIn{x^HUM%65ixQ%Ih4q0vE z=#g&VEn)4FmMnalog*Mo%VedpNN7!Q4(tDyB8^v-BffK8bdbAn@yp>axsC7S9Sp8H z#4eN&uyyU(sJL48o6s>m(TV?lcPcd*d1y~vc-4^Iz~^Lc!gkH?rYGKo-C)Y)@XXfw zzVudkN%)IB0#j~!mLzTXvi$PPl665DdIGi0o+jmcj6dIW*m+a4hs$h+-lCoTI@Nr> zr(fu5+@5o5+S2Dgl^1)Si(R7?q9MZ7+T`;@R#52mh66ILK3aim5>sQ$dwR-dSzg<1 zEWyLpe9-%zxZth6uk*G!_|D|BzH((vLzuB?d)VoN!7ak6nO2PZCvj?>-xWD)p6}Fj z(G!m}4m-S(-?T%;l<8I4v&KtOT1H0N6Vi)A6-s7Y@lW~2^)BtY`HJnurh)S1Uv2K> zZEs#&)%9%Bp6t!BKUJUa(f%*2z5k_ly?B#U*3{y~0lriCS<57EYFvMHWZl|#-a7+c zd~wO0&gcI}a^8!FJ5K4TrXMNPS98C6{`~W}I=;F|PyTFukn8_QO76bW)HCt=PoI4$ R`TyZ};he2n?`Enp004?!r5ykO literal 0 HcmV?d00001 diff --git a/assets/image/2x/icon_new_vip.webp b/assets/image/2x/icon_new_vip.webp deleted file mode 100644 index e864fc116d2ed7d90c2438ee3920b1e6fc9305b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 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 Sx>5J;)7S5x6Y~{z@d5xign>o? diff --git a/assets/image/3x/bs_query_logo.webp b/assets/image/3x/bs_query_logo.webp deleted file mode 100644 index f4d420d9c816914842282e7598612bf6927d66c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1258 zcmWIYbaQ*e!oU#j>J$(bU=hK^z`$St#F}8_>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9z}R45N=sv4__UmXfj5$YLHGg#16MRy4oKi|n*vZu2I#JQ zAWUb-VMt|AVDMzfV@PJu1G0>Ok!r|b28>~!FH8&!`kD@00`f~1EJ6NpO>*(~r}7Yz-{8xAA&brQY6_3q-rEPlXCry4{og z|6jvLVbOm+<^{R4{rqQoG}H?Sg22QFOCI&zj6J<=?cJMwkCr5W1wUrAUgOEFV`4b) z{8@nSi|bMUQnRNqCuCV%i<-H={IveU@2qoFEDUmKPeJKG9Rv(9~Nt!ui?TmIoT(+}F7+&Oz&k6&V_ zb^ocE6Z*>Fk$2W>t+CnsoJe*uHCC@^(8n%l(g8YtFXP;nVgHYt>dP z|8^*MX<5kCnTnrM=5#InBvv)m`E=Zd=&d)cxPR=hsV|fM-1#bH^;z$kvu~KrxVGr2 z4AbeMLvzOryW=sDZwTBcy|w?x&jqXK(5>NmT1-&UUOd33(a-^G1x_1`}h zMpUnxp;~d`3TNq&^g?!@S3Vr;*R9sRvT1%T<84o?MV>Eav@TmevHlFZ@I$LEwHbF? z53S##^sDhW8*`u2jjamTeq5bo|ATG5t(w>IrqpI_b^WP5^#`)6Hw1Ph)V~zH!u}`s zr+eM{>9;?MWc*dOG2N~8@x=~r8)cuL3xX#uIxdu~Fjuj9!|XLlhU`V!?^@M9Go~qp z>OAYx*7@Wxxv-$tc0uO7GfKwBPr28nr7b&E)}QMs>Z&-ad&bRmS|@tc^B+H4X7A&g z6f$9%SMf!$7)P-c4n3=`OwH4|-M9LaR%@`^(%E+ow`2(H2n$Io<6o>iQ^L4%*X0*> svu{q^6LW4t|CAa3H^=FHZ$9_4IPcG7zW>eJkDb5kvcG8e-v_;#0K`(cYXATM diff --git a/assets/image/3x/bs_trophy_one.webp b/assets/image/3x/bs_trophy_one.webp deleted file mode 100644 index c3eb848a5a2a485fe5d24e1bd5029ec9b5da07d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1736 zcmaJ>do+}37=Mkyu%&U_t=e%fw^6pix*L~f(3!@Fp@cDm&KP5u*yIvsQiDTs%7{?b zN-EdHiga1lWiTbjxFwt0R!S{4wBOJ<`or$;eV*t0z0dPI@8x^n?<3+|UE8Dq@Nsb> z93@!#$^ih(Aotub92QIHkbt^CqC*_vP$_~D!y>vlp?t}HD47W$0ksVTQKFffY}*K_ z{vO=a3Qe|E{C`q5gc?nOBny!1vY^SKH7P+{DRh(X74zUtZX@QgG0Yf9LlAQoiHL=G z2*me>e#3*m;S?rItj~ZnHW75TcrG!-yW2r!czZ!l1mv0^8W4dSa1!qy>O+Vu1;FwX z0Fv2Tx!`;N?r{K68{W$476Y&=4S)v0R&MK^FoRe@8^gh&2&2&e_)reOPBH+BeE`V$ zZ`7dhA8SKFB~55ukx&Z-bU+0tfCCIb0j3Z;03GUnfPqffqaPX{?dhP1L>t_1XrKsg z&nE_lhGb^K=*`7-6j7~5At}(>zG$97SuYuGsG^gnM|l1e7Lyhf;OYZ*gdKE ze`J(3`bVpX_V-0mB20>=QsHRJ3n^rKzb>hbQ&h=R{CG(#x}1=;M~SG1#{WFydC|j8 z7dOS5DvpGi=;0GryPW$*(4Efq7vUe=2l|u3leBPt$*m_{!q2ADKC14#dB6;{;_gm@ zSGU$FH6dUh&Y{wEC1ep2=N&xc91r17a=Slwq3bp30WDNf9DoSb44{{3+}F zqIwIEfwjrzNG99#rz7N@%sCS!)ZpXqp)9+ztBKM>jHJ!LYd-X`1s>%G@?l9FnR>g0(I{s8xu zY?9+JaNv%5&_xf18*+#7b2l0y3WPByIrW+D5xNzl7E9O*OJi>XM$rmuu@jh!+T_u$ z9SOBd;`;=BHx(9a9qsKg`Lu%FA|Y1MX@TSP?L|6wJv^s5*fG)bhOQv`AUmkJ*KR$mqZwoN2jdOC$naE}!MGat{YvVMPMmh0Sy;-D zLI7sRD`BQ+{E)X(S<$tj=uhXO)@Sn)>R$a`orKOIJMUUNp-`gIWx1H4JZV2*gI!A- zrsWSP-Rrp;f2F*+mS9w8!k6;r)n^;sG3&a351v%zQyp)ql|Q7ZPwFo3C$M=7QH)j+ zk;oz~7uQstMZHjOmuX_h1_X>9ewoUjl`B1BF1jSRq=7PyD^=I$oY84y7CxVgW=FUo zcijn^%Ul52>Df}H``%|H73wQ1t5)=Il-u-6_`<;Y0nS`fg?Y`(Ax369eeu(EFFU@; zk-RScnQH^)MyB4mT}BB7l_998Rlk)I_Nz(Y;Jw_y*DI(cMyyI#kPVwehWRCV$0<`P zil5`Pv=XW(XoIG2^PnGC@o6WgQ9I$_aNz;l>kJr3wvv1sME!oLDAbl3AaJEV8i6hX zy@!}sVePNFlm!3^_r(9%6Ti=2Y)68mU5L& diff --git a/assets/image/3x/bs_trophy_three.webp b/assets/image/3x/bs_trophy_three.webp deleted file mode 100644 index a9690c678f3c252fd4f263f25944f48c9c10fdf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3548 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 diff --git a/assets/image/3x/bus_calculator_enter.webp b/assets/image/3x/bus_calculator_enter.webp new file mode 100644 index 0000000000000000000000000000000000000000..45dce11cd99e7c40412dd0a33f44cc9f5c90b30b GIT binary patch literal 1408 zcmWIYbaSg$ zTO=LA)&Q}SAZ!~DyS${J1gIte#4ZX6at5+ffNYI)Bz6)KJGr0;q`n8J#wItX6l50& zfPBZ3nim=jq&a|ChM|}t2pBw0ApZmTK#;$Pfx+S{0|WB}gjmu{28Qje3=9&t5Mn9| z7#R3l7#OylM~ET9q#&^<5o{a_kYq|rV_^8SoPmKil7T_^0s{kAG*}Ku;BcD)P)Y{q zu6!U&XUJhlWl&)7WXNMkX3zt&jDV49$Y2JHVV_QBVAQ%F;1+0S)!dYO-Ru2t=9z+e z2A!TE2B$yH%Vo|}xxH?YrTEj#?gJ<68GIu4zVCT+V_T@U)awW5)E^2+c}{BD?fu=7 zJL$%@#yfKyp6}z8VAyd(_}dv({_4tmhkxFS3*WbIo^8_m{ptJu-T!;X-uBPGA3v?X z{{H_sUv_8w{yT5p|3ClV>cjqjZ~hhcKde}Pe0%JlyluN*XZ_v&`~JK7<%ivN->%!X zx7+V=(_P=?g;CPwUi)4ybN(N0e&he`9S`gO?*5!}Z=H3{w8Aa3j?G-_8!S`5^_rUQ z>0|$V*ryxHZjfBAS9t3>XNb?)EW;knnd0VJb)Ba|j=NfE_gvkwEK7HVm(cH7464(D z)gJ|1Pj$<+|IxE?f=WQiqea;v(H==(;zg`ZMf5&UQeC1rIZXDKSQwLT+s0K3mWA*p zhD0$09D57N9I34)+ac4=l5-%;}!E~ZpxDXIvZ^s z%;M+K%qrP@C`T(X+V*A9`?$^TbK<4%X4#~=9PAY1x63`XW#ONoes=%t$vG0`l^1NU z)-61ek$ZQpqPcy!h_vDFsmIgwpR3;XIeNbG@w`_%ZI5PTzWSvvH(OTER4Mhfz4`v| z<vsFqXWaViSg-M{ zPQKP?hCl}YN%7fF-pg>DlxL6nRe0lZ)~gwXjpZz4Ci-qunfY~3^170pcej`wJ+qU2 z-_E;xY;T{*TwPaD;lC@^Z05f;=VLi`Z+dI%}SHaDG+(K>BN$puxHZuTtC%SmK2$5f4=3O jShv<=%YS9b>aDZu!+$>F*L;6rvcSHAs0T7!3(MFkTjP=Wb9DTC}UV-w23Asyj z*}we@vgc*ayqywk^8Zm?Q_k#rpZ`e(b1-nsdVODEo(5OL?fm--e&*SFwmf@zkipbX zNr=UKWA5%#|DJTsoIk~-wj_PU#ReXg3&}~d6~b3`z1ZKhg?EP5i$0*m3CriDF)$pc z?_BqK7Z~-us?@D|Vi+C@2HWR1s(4OPnZEkOzlq0}>73pKMu$uLzfE-icyIrIF9rqx Di)dW) delta 300 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_cashier_xj.webp b/assets/image/3x/bus_cashier_xj.webp new file mode 100644 index 0000000000000000000000000000000000000000..1ac8d4ddea3679f66794d31b9a8c18efa972f826 GIT binary patch literal 4134 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 D|CmQI literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_integral.webp b/assets/image/3x/bus_integral.webp new file mode 100644 index 0000000000000000000000000000000000000000..0c646dcd1ed908be4bd5e2e7ca8b9367a2027790 GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/icon_new_vip.webp b/assets/image/3x/icon_new_vip.webp deleted file mode 100644 index 262388d7724a1e96c8ef54728e6cc1dd81bc9963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3184 zcmaJ@2{@Er7r$dfmieQMvSnJ7EnA5!W62T=&$;vWVusQe@^@9@xH=pQ+x zHP`n`w`cD^YW#npfRAsuH>5HH)m?aKa%fHB5El3Qg%#E@?ibcy$ApN`2uR0n9pg`6 z4nf!l!U}$WVB8TZX#@KxF~|Ti^Yb?aBc_le&nESXK8IFjjggz)>ExPFC(6NF00(9T^Gg; z97wC|Sgg&iK4KjKPNvAG8-H7Pt}jg9kf-jK^g}4sn6tOFufohGYkqC4>Z%io)*y>x zi+`!OCez2%-&u=!eJmpdFjmK5Fjo@9>}V%$*DW*MT|`nZ|^mr zz)vyiirT}nSF1eB1d+!Lu!8pZMH$7kwHMEEnj81Gim~KTW||vswu>n%!tM(5Ao0AR zBr86rEA3+ae!ffaZr>_tvAPX>qOChv??-H8&w3YA-soi`CPZ0?bIGpL+dYVpx9TFo z8vC`ebOEg?<9NP)wz>5*KL@8_#6`j8&KML%TLj>jlEs(LC(?%sY8F^l2g&0RDU{K! z)wSIfgftQ2?uL)ZOFU>XUjAGe@mh@q|JY6AvleD3SS$Vc0W3=vGzgDXa++_ZC}t|k^Sdn z9)RNn0R;&Lb^jLZd^WMItU1`gZQIyV?K^GSg$Jrv8aK-yU7AL$X3D6or-$)Rf*%JM z6LecKddqv4ZpGFKmlq|Nsjnl~Ga5!svDaN0Rd4z25Je+`($oh5kw#|ZdEt+=w*d6G zJ$DF>cwb5hJl5!$Krhj_=-BFnnDicwM`mZ$-F~&FMTqz{@g?3ZheYdobxlj=KfUfOr7SD`gm=l=MY%(S65($ymB?1Y%b zlTPrkY$T<|mvot|IAkDq1fl0NX&8Q5bLy})8^IfA$OE!Ro2)JBqhO#mrgXv!d7z_0h|K-``@^qq^=M_LsowSjLoD)Sl<=9^)Smfos<1dAno(HEK5po^x_>b@R zAeJBQcbkG+B>bpS^?JU=)sAy)z24ZYuM6*dSmCvpZ8>6 zT70NBL=Tcbs5@lp?cU01>3JFqSg%PHVkAQ= z=L2`PXaHdA-d;TH(*2+t?wdvBey%1)t85u=cE2&pbx8b<8|xA4uGerZu_PX zDX~A3(*gO3Jiy0ibVv!1^6o#piu1PWI#fr?_Xq-!+Rrc5$eAi!-Dq==zV@`k%7(=Q zEq!ICv-(EHrO|=zKxV?&D=SSvnv}k8FN)z=$uCm714YS|i&bj^M-AO;-CoPu4ya{r zsFLc_YtVtlaz?N4eH|&@C)KUP3&X_0z|7u9u+&YgUb$&nI-sU>S@k_1j^>KADGvD} zzciWyQ4f_GHK~R+WzR|`KU79TEMipek%r0Wme{uRLR111*=;)LrRg{ z?4~tno^AD6W5Y$B!YFFv=5Y^Q0E`YY+N-mYu%8ZzOg$!71HjVUAkMG1Y0mBOiXY#? z^5=5ZexY|Q0o%fp>l^~VG^D=}Y2v4_aJv4sVqeAXm>8BbWh1nYL*eSKggBhxwHQsl)ID3pSJ z(=3|GUFW1P__4p;2@w)X1l`X_XLI#rXM##~L|Ca>6*F{*ApmAN7qW0rrc_7>?e}wf z+*$d^K?N>PjsIT48vqNE7dTAb09ZTy3_B^+T9QBDp2&wvb)x0>Cco`kkzDR+$(xzD z)+h-+3}_cI(6*P$U+w_1oS3S0jJpwd&Upv8qI>;0 zqw4Y&ris@n=xq9d8Z|fl&l7>{*4f4$)>hkj266pdcwbIwq4jFi##6+xxi=b{@V%{A z{5{H5L1!k+$h53fqTS;zl#`uS=X=+)VrT4~)bym=lo=GWrAX<-)1b7tkC9tGib(8v zf)9LNxx49LHqoJQ(ng5Z$jg-XXYP}~CiOyu_2F$t@v56R&xt06h`wYY&q7iGVw9%i zszMBrh2pYwl`Ylb?1x_daq`()D-X4VhdH|H&4S8Eg&zT|RK}!1Sh(g_2bmWO+SBWI zl_AOW-sW#~D@nny^K^da26+6If5G8E>|}7&=?4KmUr=Q75qpfPVv( C%~h2E diff --git a/assets/image/3x/icon_vip_recharge.webp b/assets/image/3x/icon_vip_recharge.webp deleted file mode 100644 index 3d9f6b2ccd767250b307b5761e1c63243b233579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 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 diff --git a/assets/image/bs_trophy_one.webp b/assets/image/bs_trophy_one.webp deleted file mode 100644 index 9aa12528c6f5b3c5e1ba5ba15187254e67363a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmWIYbaRtnW?%?+bqWXzu!!JdU|=u+Vo5OabaoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}ZzKbQ@C612u4u3vkig+K1)!7+&|UdJ zn9h*HkjkLI;K`83kj$V5WElY?)sVpq7{fkVj0_C=k`8PF{RcHBsc44ozEd=zf!#-` z$-L^FxUt!@`MJ5bjkZ-zJ0-e=e`$uhrIvu^!PGl$lOAPU*ZKVM?rWwkcf(&lzP!w> zLH|nF-)e{Ey8Yp-Le2pbMb;~^F8I+Zz{1Gjt;guWxJyGcb5m>9Cyk|DmnRF%jtx)$ z+J0HA{GO~Ii!LVvL*7>|0p*)!xo0>3Jp1+U{QJ9pwwM19ba44Exg+;>$KA*8daBtj zOjGfk1Vm8`1;LMv&Zzxc^YNkKnXI!5;#afJ3C{POT-del&N0n>vvQA#R<8fGZo-ov zvDfW4tlHR9nqAV7J?rsPTVIEyfPY_^FIB~7l}}j7|MMHiO{=q8B?D&k%sYJUvcLkH kNRQ$l_w~$XpH16rFH;uSP}-M!dt2`9vU3}+^gYxA0A7ySo&W#< diff --git a/assets/image/bs_trophy_three.webp b/assets/image/bs_trophy_three.webp deleted file mode 100644 index 063b494cca81a3597eaf3a9bd825efac98a24b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmWIYbaPwB%)k)t>J$(bU=hK^z`$St#FAj->FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33tpu6&c zFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou2hGcqvfOFFO#xF1s6l&k*UW)sJj040UT z24P<;9Jq4*&a>Su`c%eQwhy*N1cxz)DZrIzgFRtt5c3VxJ63UZI~ zlCP67pS0w}#Z#}M()L|%Wq9>F?e;Wr#|7`KWNNk#WoQtO2rl-P5 z3U#IS5}_~t&0p|={fYQN{eUAbGcI`DaZ?iDFwA0`z-i^d!0K!Bc-o;u7t40uG8R~s zbM2?3qHO!jn5SY26TPeNvoShkR?d`*6?*!yXLjYDa4B)NDO#rw90*KXmRKjzW)9HYg_L7$@N~+{fsVO<~QEn)_Y^` z?cMPVCnl+Qf)Fs#Pg6I%5*6#GUZ`Zcz;vZpK+l^P8Fns)eS3F*nK|im>asN!nbUp3 zpK&Q4+4jBUMN!X#gZ=yU=Ulnzd#hjf=DcR(N$1yZoL9QS`rn<|)+KBAysq~5ug_a7 zlk-K{{rdBFYz3zt*L!i=t?Tt(?I3Xd@fOCGje<+n8VskNn)WRxj4`2Rsq?nRqh>qy i0zqv>b+v)`3wIY6mnZ-4$0~eMR8msXt9=o}zyJWC(i@=w diff --git a/assets/image/bs_trophy_two.webp b/assets/image/bs_trophy_two.webp deleted file mode 100644 index 9cae39c854376e423d422951dee55c36bffca542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmWIYbaR`=%)k)t>J$(bU=hK^z`$St#FAj->FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33tpu6&c zFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou0rFfuUcOFFO#{6A>6DOdG-os7{eg|c7% zYZ+f3l>L|8oSSmn>)l_A6cficU*<p10glpyvO7cbBruCWgjSJ?xNumuZE^wy131%YU|BW16spK}671 z#cQRv3yT5+qmK&Xg-I?hDx98-84_-WzMF%*j+&g!nx*Edk|>chD=qhS+43n}nX|SA zt&%%_QKQT2dZ}!KVPCRGSnh4E1B*0PtU9$wgJHs|RXV4I9CB1VCx*D6KlA6S#rcAs ztN(6qwYB}7;NbFKa!2lx6Q@hIf8b{DouuLkM4K2H4tUD8hvvqvFWr;Ddt+5LcSP5n zJ@%|t3~4+4rDvw9<(8)f<>RABCpn|ZH)Z8JaC_t_-&&c+1&+sA4o za;mOp|BkhpF*EY~+l8$1dw)*}^6JmyKe1+te5z!njs8+&g%0t;T`Y%o2rl(yXg&3+ q^lI@|E{3P4_;&LC$!EWtxBd28ezw}}jek49?g~nY@p_!4#{d8wlM99b diff --git a/assets/image/icon_vip_total.webp b/assets/image/bus_calculator_enter.webp similarity index 53% rename from assets/image/icon_vip_total.webp rename to assets/image/bus_calculator_enter.webp index e513436255342785b7afd89028361d03b833e8fb..610c3352f64b746be13741c619ae72fdf2b34bd5 100644 GIT binary patch delta 251 zcmVB*0WGMgoIQ{$`l183SDv-FF!PHCRWq_yayEPNQ4OAbK=KqSXc0X*OU zgo8+u6seB+|L?i{OFe1{RT2GH*tTsG?47h<003|s0000^Xw{6~>YC6`bqVOdQFE=8 zoAwR7ovNy;s@r~yrf|<-d#q_Uph!AbJ1nEu{A^f9_}H+GaNe*dZ1E!e$>;eN007qI BZGZp( delta 302 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 literal 0 HcmV?d00001 diff --git a/assets/image/bus_coupon.webp b/assets/image/bus_coupon.webp new file mode 100644 index 0000000000000000000000000000000000000000..c0ca9d4c80353a0f1b8ca07d7c7ac9a8b39f989d GIT binary patch literal 640 zcmWIYbaSg$ zTO=LA)&Q}SAZ!~DyS${J1gIte#4ZX6at5+ffNYI)Bz6)KJGr0;q`n8J#wItX6l50& zfPBZ3nim=jq&a|ChM|}th{2t~3FLnu9|-anF)&zsWnf^QfDlWX$-uC^m4QLx7D7yA z0Rsbn3j@Qp^9V6Sm=q)yC4!A(0g_BZr`^@{#|1*i~eWb-j--$xp&S)phE(J$(bU=hK^z`$St#NuG&>FgYEf)U7NU_1dLS%6Zxc_l?b?oJ93 zkx>fl4;UDM5DXHNiwhtutRzs?w`&l!mvynKz%R&|l3JV$RPq6cRf>R?1KlJ7WQ(Lj z*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZ zZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33tpu6&c zFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou2j85tP##SgFwtZ!J5dwWM~*}p0KE*VVN z=3C|X{e2$WrEQ+I_xAVrdonD@ol!5+#Sw9XiJ_+c|NR|4Q4=Nh6^LhTa@}aTVbf35 zIi)ThDgr#pofC3=b&GSc>0>1MFpzyb>9mo|2Xt4D`RV9@l{ddu>an#Z>z-YvDhbLxpUY0 zHnyb^PyZPUZ$AHje|`V-l@D$Ac?vr6>!m4%#qq}prv07sy2@6rX-S*R=k9xPayP4L I%Nm^-001k<6951J literal 0 HcmV?d00001 diff --git a/assets/image/bus_vip_balance.webp b/assets/image/bus_vip_balance.webp new file mode 100644 index 0000000000000000000000000000000000000000..c05387ce538d4555e0aac8b69a2bcc174f774a5e GIT binary patch literal 818 zcmWIYbaT^UW?%?+bqWXzu!!JdU|=u+VsS9?baoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}ZzKbQ@C612u4u3vkig+K1)!7+&|UdJ zn9h*HkjkLI;K`83kj$V5WElY?)sVpq7{fl+j0_C=;s;m-o;NJWy}d(v^XKJX`q-Mb zIVXR2@q%3Glhp}*_T9U+x>Q#B7F#mevm`Vq88E!R`(OGN)86)<)y6kPxF3p2 zEPY$PO=aWZ6Lx+gObZ;CLmfCc7!D+=So$azos(Sm-_B9!hOEn%`;E6fy0-X~&ut3t z00I&11GBn2I_iaZ7#8riJxJ}JlDy{fmN`=tN~+nW%v;N3Z|=@}Z_B@ZZ{`T$D%{YaBXcUC=}E$Z>KW-TikP`(mS1}5w8WIs&9k<# zp4*l?Wl`9+5KgoF&&xz!)_cGGyXn+j{_tb*e8Sm setState(() { selectStoreIndex = index; }); + },(index){ + setState((){ + choiceIndex = 3; + }); }), if (choiceIndex == 1) BusinessOrderPage(businessLoginInfo?.storeList[selectStoreIndex]?.id ?? "0"), // if (choiceIndex == 2) BusinessScanCode(businessLoginInfo?.storeList[selectStoreIndex]?.id ?? "0"), diff --git a/lib/business_system/home/business_home_page.dart b/lib/business_system/home/business_home_page.dart index 5fd086a2..bbcbe3dd 100644 --- a/lib/business_system/home/business_home_page.dart +++ b/lib/business_system/home/business_home_page.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/business_system/home/home_view/home_sideslip_dialog.dart'; -import 'package:huixiang/retrofit/data/day_flow_list.dart'; import 'package:huixiang/utils/business_instance.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/my_footer.dart'; @@ -17,24 +16,19 @@ import '../../generated/l10n.dart'; import '../../retrofit/business_api.dart'; import '../../retrofit/data/base_data.dart'; import '../../retrofit/data/business_login_info.dart'; -import '../../retrofit/data/business_vip_list.dart' as vip; import '../../retrofit/data/day_count.dart'; -import '../../retrofit/data/order_trend.dart'; -import '../../retrofit/data/popular_sales_list.dart'; -import '../../retrofit/data/recharge_flow_list.dart'; -import '../../retrofit/data/vip_counts_info.dart'; import '../../utils/flutter_utils.dart'; import '../../utils/font_weight.dart'; -import '../../view_widget/no_data_view.dart'; -import 'home_view/my_line_chart.dart'; +import '../../view_widget/settlement_tips_dialog.dart'; class BusinessHomePage extends StatefulWidget { final BusinessLoginInfo businessLoginInfo; final int selectStoreIndex; final Function changeIndex; + final Function changeTab; BusinessHomePage( - this.businessLoginInfo, this.selectStoreIndex, this.changeIndex); + this.businessLoginInfo, this.selectStoreIndex, this.changeIndex,this.changeTab); @override State createState() { @@ -49,35 +43,18 @@ class _BusinessHomePage extends State BusinessApiService businessService; DayCount dayCount; int _loadCount = 0; - PopularSalesList popularSalesList; - List records = []; - List rechargeFlowList = []; - List orderTrend = []; - VipCountsInfo vipCountsInfo; - int daySelectIndex = 0; - int vipIndex = 0; - List dayFlowList = []; - List lineChartSample2Data = [ - LineChartSample2Data(0, 0, "2023-03-09"), - LineChartSample2Data(1, 0, "2023-03-10"), - LineChartSample2Data(2, 0, "2023-03-11"), - LineChartSample2Data(3, 0, "2023-03-12"), - LineChartSample2Data(4, 0, "2023-03-13"), - LineChartSample2Data(5, 0, "2023-03-14"), - LineChartSample2Data(6, 0, "2023-03-15") - ]; @override void initState() { super.initState(); _onRefresh(); + } @override void dispose() { super.dispose(); } - _onRefresh({int index, isLoading = true}) async { if (isLoading) EasyLoading.show( @@ -89,28 +66,18 @@ class _BusinessHomePage extends State token: BusinessInstance.instance.businessToken, tenant: BusinessInstance.instance.businessTenant, storeId: widget.businessLoginInfo - .storeList[index ?? widget.selectStoreIndex].name == - "所有门店" + .storeList[index ?? widget.selectStoreIndex].name == + "所有门店" ? "0" : widget.businessLoginInfo - .storeList[index ?? widget.selectStoreIndex].id); - if(vipIndex != 1 && vipIndex != 2){ + .storeList[index ?? widget.selectStoreIndex].id); queryDayAmount(); - queryPopularList(isSing: false); - queryOrderTrend(); - queryVipCounts(); - queryDayFlow(); - } - if(vipIndex == 1) - queryVipList(); - if(vipIndex == 2) - queryRechargeFlow(); }); } addLoadCount() { _loadCount += 1; - if (_loadCount == 5) { + if (_loadCount == 1) { _loadCount = 0; EasyLoading.dismiss(); if (refreshController.isRefresh) refreshController.refreshCompleted(); @@ -137,123 +104,6 @@ class _BusinessHomePage extends State } } - ///热销榜单 - queryPopularList({isSing = true}) async { - try { - if (isSing) - EasyLoading.show( - status: S.current.zhengzaijiazai, - maskType: EasyLoadingMaskType.black); - BaseData baseData = await businessService - .popularList(daySelectIndex.toString()) - .catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - popularSalesList = baseData.data; - } - } finally { - if (isSing) { - setState(() {}); - EasyLoading.dismiss(); - } else { - addLoadCount(); - } - } - } - - ///生意总览 - queryOrderTrend() async { - try { - BaseData> baseData = - await businessService.orderTrend().catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - double index = 0; - if (baseData.data.isNotEmpty) { - lineChartSample2Data.clear(); - } - orderTrend = baseData.data; - orderTrend.forEach((element) { - lineChartSample2Data.add(LineChartSample2Data( - index, double.tryParse(element.number.toString()), element.date)); - index += 1; - }); - } - } finally { - addLoadCount(); - } - } - - ///用户总览/会员统计数据 - queryVipCounts() async { - try { - BaseData baseData = await businessService - .vipCounts("${DateFormat("yyyy-MM-dd").format(DateTime.now())}") - .catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - vipCountsInfo = baseData.data; - } - } finally { - addLoadCount(); - } - } - - ///今日流水/isMonth=0(当月数据),isMonth=1(当日数据) - queryDayFlow() async { - try { - BaseData> baseData = await businessService - .dayFlow(DateFormat("yyyy-MM-dd").format(DateTime.now()), "1") - .catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - dayFlowList = baseData.data; - } - } finally { - addLoadCount(); - } - } - - ///会员列表 - queryVipList() async { - try { - BaseData baseData = await businessService.vipDataList({ - "map": {"nickname": "", "phone": "", "source": "", "hasMoney": "2"}, - "model": {"tenantCode": null}, - "date": "", - "sort": "id", - "size": 12, - "current": 1 - }).catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - records.clear(); - records.addAll(baseData?.data?.records ?? []); - setState((){}); - } - } finally { - EasyLoading.dismiss(); - } - } - - ///会员充值流水 - queryRechargeFlow() async { - try { - BaseData baseData = await businessService.rechargeFlow({ - "size": 10, - "pageSize": 10, - "current": 1, - "currentPage": 1, - "sort": "id", - "order": "descending", - "model": {"id":""}, - "timeRange": null - }).catchError((error) {}); - if (baseData != null && baseData.isSuccess) { - rechargeFlowList.clear(); - rechargeFlowList.addAll(baseData?.data?.records ?? []); - setState((){}); - } - } finally { - EasyLoading.dismiss(); - } - } - @override Widget build(BuildContext context) { super.build(context); @@ -283,10 +133,8 @@ class _BusinessHomePage extends State child: Column( children: [ homeTop(), - tradeOverview(), - vipManage(), - hotSellHotCharts(), - todayFlow(), + commonFunctions(), + homeStatistics(), ], )), ), @@ -636,21 +484,23 @@ class _BusinessHomePage extends State ); } - ///生意总览 - Widget tradeOverview() { + ///常用功能 + Widget commonFunctions() { return Container( - padding: - EdgeInsets.only(left: 16.w, right: 21.w, top: 12.h, bottom: 16.h), color: Colors.white, + margin: EdgeInsets.only(bottom:16.h), + padding: EdgeInsets.only(left: 16.w, right: 15.w, top: 12.h, bottom: 16.h), child: Column( children: [ Row( children: [ Container(width: 4.w, height: 16.h, color: Color(0xFF30415B)), Padding( - padding: EdgeInsets.only(left: 12.w, right: 8.w), + padding: EdgeInsets.only( + left: 12.w, + ), child: Text( - "生意总览", + "常用功能", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, @@ -658,626 +508,177 @@ class _BusinessHomePage extends State ), ), ), - Expanded( - child: Text( - "近一周订单量趋势", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Color(0x99000000), - ), - )), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Navigator.of(context) - .pushNamed('/router/trade_overview_page', arguments: { - "storeId": widget.businessLoginInfo - .storeList[widget.selectStoreIndex].name == - "所有门店" - ? "0" - : widget.businessLoginInfo - .storeList[widget.selectStoreIndex].id, - }); - }, - child: Row( - children: [ - Text( - "更多数据", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF252626), - ), - ), - SizedBox( - width: 5.w, - ), - Image.asset( - "assets/image/bs_right.webp", - width: 8.w, - height: 12.h, - ), - ], - ), - ) ], ), - SizedBox( - height: 18.h, + GridView.builder( + itemCount:commonFunctionsList.length ?? 0, + padding: EdgeInsets.only(top:24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing:15.w, + mainAxisSpacing: 12.w, + ), + itemBuilder: (context, index) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + commonFunctionsIndex(index); + }, + child: commonFunctionsItem(index)); + }, ), - LineChartSample2(lineChartSample2Data, "销售量"), ], ), ); } - ///会员概览 - Widget userOverview() { - return Container( - color: Colors.white, - margin: EdgeInsets.only(bottom: 16.h), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - showVipTipDialog(1); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 6.h), - margin: EdgeInsets.symmetric(horizontal: 4.w), - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [Color(0xFFFC5A58), Color(0xFFFF716F)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - borderRadius: BorderRadius.circular(6.w), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Padding( - padding: EdgeInsets.only(right: 6.w), - child: Text( - "今日会员充值", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Colors.white, - ), - ), - ), - Image.asset( - "assets/image/bs_query_logo.webp", - width: 14, - height: 14, - ), - ], - ), - SizedBox( - height: 7.h, - ), - Text( - vipCountsInfo?.rechargeMoney ?? "0", - style: TextStyle( - fontSize: 24.sp, - fontWeight: MyFontWeight.medium, - color: Colors.white, - ), - ), - ], - ), - ), - )), - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - showVipTipDialog(2); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 8.w, vertical: 6.h), - margin: EdgeInsets.symmetric(horizontal: 4.w), - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [Color(0xFFFFA238), Color(0xFFFFBA6D)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - borderRadius: BorderRadius.circular(6.w), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Padding( - padding: EdgeInsets.only(right: 6.w), - child: Text( - "今日新增会员", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Colors.white, - ), - ), - ), - Image.asset( - "assets/image/bs_query_logo.webp", - width: 14, - height: 14, - ), - ], - ), - SizedBox( - height: 7.h, - ), - Text( - (vipCountsInfo?.newMemberNum ?? 0).toString(), - style: TextStyle( - fontSize: 24.sp, - fontWeight: MyFontWeight.medium, - color: Colors.white, - ), - ), - ], - ), - ))), - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - showVipTipDialog(3); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 8.w, vertical: 6.h), - margin: EdgeInsets.symmetric(horizontal: 4.w), - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [Color(0xFF4B77FC), Color(0xFF7091FF)], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - borderRadius: BorderRadius.circular(6.w), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Padding( - padding: EdgeInsets.only(right: 6.w), - child: Text( - "总会员数", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Colors.white, - ), - ), - ), - Image.asset( - "assets/image/bs_query_logo.webp", - width: 14, - height: 14, - ), - ], - ), - SizedBox( - height: 7.h, - ), - Text( - (vipCountsInfo?.memberNum ?? 0).toString(), - style: TextStyle( - fontSize: 24.sp, - fontWeight: MyFontWeight.medium, - color: Colors.white, - ), - ), - ], - ), - ))), - ], - ) - ], - ), - ); - } + ///常用功能跳转 + commonFunctionsIndex(index) async { + switch (index) { + case 0: + if ((widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id) == "0") { + SmartDialog.show( + widget: SettlementTips( + () {}, + text: "请选择门店进行收银操作", + color: Color(0xFF30415B), + )); + }else{ + Navigator.of(context).pushNamed('/router/cashier_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + } + break; + case 1: + Navigator.of(context) + .pushNamed('/router/vip_recharge_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 2: + Navigator.of(context) + .pushNamed('/router/add_vip', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 3: + Navigator.of(context) + .pushNamed('/router/trade_overview_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 4: + Navigator.of(context) + .pushNamed('/router/business_vip_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 5: + Navigator.of(context) + .pushNamed('/router/hot_selling_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 6: + Navigator.of(context) + .pushNamed('/router/flow_page', arguments: { + "storeName": widget?.businessLoginInfo + ?.storeList[widget.selectStoreIndex].name ?? + "", + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 7: + widget.changeTab(3); + break; - ///会员管理 - Widget vipManage() { - return Container( - color: Colors.white, - margin: EdgeInsets.only(top: 16.h), - padding: EdgeInsets.only(bottom: 12.h), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only(left: 16.w), - child: Row( - children: [ - Container(width: 4.w, height: 16.h, color: Color(0xFF30415B),margin: EdgeInsets.only(right: 12.w,top: 12.h),), - Expanded( - child: Padding( - padding: EdgeInsets.only(top: 12.h), - child: Text( - "会员管理", - style: TextStyle( - fontSize: 15.sp, - fontWeight: MyFontWeight.semi_bold, - color: Color(0xFF0D0D0D), - ), - ), - ), - ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Navigator.of(context).pushNamed( - '/router/business_vip_page', - arguments: {"storeId": widget.businessLoginInfo - .storeList[widget.selectStoreIndex].name == - "所有门店" - ? "0" - : widget.businessLoginInfo - .storeList[widget.selectStoreIndex].id,}, - ); - }, - child: Container( - // color: Colors.red, - padding: EdgeInsets.only(left: 20.w,right: 20.w,top: 12.h), - child: Row( - children: [ - Text( - "更多数据", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF252626), - ), - ), - SizedBox( - width: 5.w, - ), - Image.asset( - "assets/image/bs_right.webp", - width: 8.w, - height: 12.h, - ), - ], - ), - ), - ) - ], - )), - Padding( - padding: EdgeInsets.only(left: 16.w), - child: Row( - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - setState(() { - vipIndex = 0; - }); - }, - child: Container( - padding: - EdgeInsets.only(right: 20.w, top: 15.h, bottom: 18.h), - alignment: Alignment.center, - child: Text( - "会员概览", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.bold, - color: vipIndex == 0 - ? Color(0xFF30415B) - : Color(0XFF262626), - ), - ), - ), - ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - setState(() { - vipIndex = 1; - _onRefresh(); - }); - }, - child: Container( - padding: - EdgeInsets.only(right: 20.w, top: 15.h, bottom: 18.h), - alignment: Alignment.center, - child: Text( - "会员列表", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.bold, - color: vipIndex == 1 - ? Color(0xFF30415B) - : Color(0XFF262626), - ), - ), - ), - ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - setState(() { - vipIndex = 2; - _onRefresh(); - }); - }, - child: Container( - padding: - EdgeInsets.only(right: 20.w, top: 15.h, bottom: 18.h), - alignment: Alignment.center, - child: Text( - "会员充值流水", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.bold, - color: vipIndex == 2 - ? Color(0xFF30415B) - : Color(0XFF262626), - ), - ), - ), - ), - ], - )), - if (vipIndex == 0) userOverview(), - if (vipIndex == 1 || vipIndex == 2) - Padding( - padding: EdgeInsets.only(left: 16.w), - child: Row( - children: [ - Expanded( - child: Text( - "昵称", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xFF30415B), - ), - ), - ), - Expanded( - child: Text( - "手机号", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xFF30415B), - ), - ), - ), - Expanded( - child: Text( - "商户余额", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xFF30415B), - ), - ), - ), - ], - )), - if (vipIndex == 1) - Container( - height: 310.h, - padding: EdgeInsets.only(left: 16.w), - child: - (records == null || - records.length == 0) - ? NoDataView( - src: "assets/image/bs_no data_logo.webp", - isShowBtn: false, - text: "暂无数据", - fontSize: 16.sp, - margin: EdgeInsets.all(20.h), - ) : - ListView.builder( - padding: EdgeInsets.zero, - itemCount: records?.length ?? 0, - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () {}, - child: busVipItem(records[position]), - ); - }, - ), - ), - if (vipIndex == 2) - Container( - height: 310.h, - padding: EdgeInsets.only(left: 16.w), - child: - (rechargeFlowList == null || - rechargeFlowList.length == 0) - ? NoDataView( - src: "assets/image/bs_no data_logo.webp", - isShowBtn: false, - text: "暂无数据", - fontSize: 16.sp, - margin: EdgeInsets.all(20.h), - ) : - ListView.builder( - padding: EdgeInsets.zero, - itemCount: rechargeFlowList?.length ?? 0, - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () {}, - child: busRechargeFlowItem(rechargeFlowList[position]), - ); - }, - ), - ), - ], - ), - ); + } } - ///会员列表 - Widget busVipItem(vip.Records records) { - return Container( - margin: EdgeInsets.only(top: 17.h, bottom: 20.h), - child: Row( - children: [ - Expanded( - child: Text( - records?.nickname ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - Expanded( - child: Text( - records?.phone ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - Expanded( - child: Text( - records?.balance ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - ], - ), - ); - } + ///常用功能板块 + List> commonFunctionsList = [ + {"image":"assets/image/bus_home_syt.webp","commonName":"收银台","imageWidth":"26","imageHeight":"23"}, + {"image":"assets/image/bus_home_cz.webp","commonName":"充值","imageWidth":"22","imageHeight":"19"}, + {"image":"assets/image/bus_home_bhy.webp","commonName":"办会员","imageWidth":"24","imageHeight":"21"}, + {"image":"assets/image/bus_home_syzl.webp","commonName":"生意总览","imageWidth":"22","imageHeight":"23"}, + {"image":"assets/image/bus_home_hygl.webp","commonName":"会员管理","imageWidth":"23","imageHeight":"25"}, + {"image":"assets/image/bus_home_rxbd.webp","commonName":"热销榜单","imageWidth":"20","imageHeight":"26"}, + {"image":"assets/image/bus_home_jrls.webp","commonName":"今日流水","imageWidth":"22","imageHeight":"23"}, + {"image":"assets/image/bus_home_goods.webp","commonName":"商品","imageWidth":"21","imageHeight":"23"}, + ]; - ///会员充值流水 - Widget busRechargeFlowItem(Records rechargeFlowList) { - return Container( - margin: EdgeInsets.only(top: 17.h, bottom: 20.h), - child: Row( - children: [ - Expanded( - child: Text( - rechargeFlowList?.createPerson ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - Expanded( - child: Text( - rechargeFlowList?.phone ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - Expanded( + ///常用功能Item + Widget commonFunctionsItem(index){ + return Column( + children: [ + Image.asset( + commonFunctionsList[index]["image"], + width: double.tryParse(commonFunctionsList[index]["imageWidth"]).w, + height: double.tryParse(commonFunctionsList[index]["imageHeight"]).h, + fit: BoxFit.fill, + ), + Padding(padding: EdgeInsets.only(top: 12.h), child: Text( - rechargeFlowList?.balance ?? "", + commonFunctionsList[index]["commonName"], + textAlign: TextAlign.center, style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ), - ], - ), - ); - } - - ///用户概览弹窗提示 - showVipTipDialog(index) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - index == 1 - ? "assets/image/icon_vip_recharge.webp" - : (index == 2 - ? "assets/image/icon_new_vip.webp" - : "assets/image/icon_vip_total.webp"), - width: 20.h, - height: 20.h, - ), - SizedBox( - height: 6.h, - ), - Text( - index == 1 ? "今日会员充值" : (index == 2 ? "今日新增会员" : "总会员数"), - style: TextStyle( - color: Color(0xFF0D0D0D), - fontSize: 15.sp, - fontWeight: MyFontWeight.bold, - ), - ), - SizedBox( - height: 13.h, - ), - Text( - index == 1 - ? "今日会员充值指今天所选门店会员充值额度" - : (index == 2 ? "今日新增会员指今天所选门店新增会员" : "总会员数指所选门店会员总会员人数"), - textAlign: TextAlign.center, - style: TextStyle( - color: Color(0xFF666666), - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - ), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF252626), ), - ], - ), - ); - }, + )), + ], ); } - ///热销榜单 - Widget hotSellHotCharts() { + ///统计 + Widget homeStatistics() { return Container( color: Colors.white, - margin: EdgeInsets.only(top: 16.h), - padding: - EdgeInsets.only(left: 16.w, right: 15.w, top: 12.h, bottom: 16.h), + margin: EdgeInsets.only(bottom:16.h), + padding: EdgeInsets.only(left: 16.w, right: 15.w, top: 12.h, bottom: 16.h), child: Column( children: [ Row( @@ -1288,7 +689,7 @@ class _BusinessHomePage extends State left: 12.w, ), child: Text( - "热销榜单", + "统计", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, @@ -1298,397 +699,138 @@ class _BusinessHomePage extends State ), ], ), - SizedBox( - height: 14.h, - ), - Row( - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - daySelectIndex = 0; - queryPopularList(); - }, - child: Container( - padding: - EdgeInsets.symmetric(horizontal: 19.w, vertical: 5.h), - alignment: Alignment.center, - margin: EdgeInsets.only(right: 16.w, bottom: 16.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2.w), - color: daySelectIndex == 0 - ? Color(0xFF30415B) - : Colors.transparent, - border: Border.all( - color: Color(0xFF30415B), - width: 1.w, - ), - ), - child: Text( - "今天", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: daySelectIndex == 0 - ? Colors.white - : Color(0XFF30415B), - ), - ), - ), - ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - daySelectIndex = 1; - queryPopularList(); - }, - child: Container( - padding: - EdgeInsets.symmetric(horizontal: 19.w, vertical: 5.h), - alignment: Alignment.center, - margin: EdgeInsets.only(right: 16.w, bottom: 16.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2.w), - color: daySelectIndex == 1 - ? Color(0xFF30415B) - : Colors.transparent, - border: Border.all( - color: Color(0xFF30415B), - width: 1.w, - ), - ), - child: Text( - "昨天", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: daySelectIndex == 1 - ? Colors.white - : Color(0XFF30415B), - ), - ), - )), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - daySelectIndex = 7; - queryPopularList(); - }, - child: Container( - padding: - EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h), - alignment: Alignment.center, - margin: EdgeInsets.only(right: 16.w, bottom: 16.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2.w), - color: daySelectIndex == 7 - ? Color(0xFF30415B) - : Colors.transparent, - border: Border.all( - color: Color(0xFF30415B), - width: 1.w, - ), - ), - child: Text( - "最近7天", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: daySelectIndex == 7 - ? Colors.white - : Color(0XFF30415B), - ), - ), - )), - GestureDetector( + GridView.builder( + itemCount:homeStatisticsList.length ?? 0, + padding: EdgeInsets.only(top:24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing:15.w, + mainAxisSpacing: 12.w, + ), + itemBuilder: (context, index) { + return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - daySelectIndex = 30; - queryPopularList(); + homeStatisticsIndex(index); }, - child: Container( - padding: - EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h), - alignment: Alignment.center, - margin: EdgeInsets.only(right: 16.w, bottom: 16.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2.w), - color: daySelectIndex == 30 - ? Color(0xFF30415B) - : Colors.transparent, - border: Border.all( - color: Color(0xFF30415B), - width: 1.w, - ), - ), - child: Text( - "最近30天", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: daySelectIndex == 30 - ? Colors.white - : Color(0XFF30415B), - ), - ), - )), - ], - ), - Container( - height: 310.h, - child: (popularSalesList == null || - popularSalesList.saleProductList.length == 0) - ? NoDataView( - src: "assets/image/bs_no data_logo.webp", - isShowBtn: false, - text: "暂无数据", - fontSize: 16.sp, - margin: EdgeInsets.all(20.h), - ) - : ListView.builder( - padding: EdgeInsets.zero, - itemCount: popularSalesList?.saleProductList?.length ?? 0, - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () {}, - child: salesVolumeItem( - popularSalesList.saleProductList[position], - position), - ); - }, - ), + child: homeStatisticsItem(index)); + }, ), ], ), ); } - ///销量item - Widget salesVolumeItem(SaleProductList saleProductList, index) { - return Container( - padding: EdgeInsets.only(bottom: 12.h), - child: Row( - children: [ - if (index == 0 || index == 1 || index == 2) - Image.asset( - index == 0 - ? "assets/image/bs_trophy_one.webp" - : (index == 1 - ? "assets/image/bs_trophy_two.webp" - : "assets/image/bs_trophy_three.webp"), - width: 26.h, - height: 26.h, - ), - if (index != 0 && index != 1 && index != 2) - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.w), - child: Text( - (index + 1).toString(), - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xFF0D0D0D), - ), - ), - ), - SizedBox( - width: 8.w, - ), - Expanded( - child: Text( - saleProductList?.productName ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF0D0D0D), - ), - ), - ), - Text( - "已售", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF0D0D0D), - ), - ), - Padding( - padding: EdgeInsets.only(left: 7.w), - child: Text( - "${(saleProductList?.saleNum ?? 0).toString()}件", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF0D0D0D), - ), - ), - ) - ], - ), - ); + ///统计跳转 + homeStatisticsIndex(index) async { + switch (index) { + case 0: + Navigator.of(context) + .pushNamed('/router/trade_overview_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + }); + break; + case 1: + Navigator.of(context) + .pushNamed('/router/business_vip_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + "index":2 + }); + break; + case 2: + Navigator.of(context) + .pushNamed('/router/business_vip_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + "index":1 + }); + break; + case 3: + Navigator.of(context) + .pushNamed('/router/consumer_ranking_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + "titleName":"会员余额统计" + }); + break; + case 4: + Navigator.of(context) + .pushNamed('/router/consumer_ranking_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + "titleName":"消费排名" + }); + break; + case 5: + Navigator.of(context) + .pushNamed('/router/trade_overview_page', arguments: { + "storeId": widget.businessLoginInfo + .storeList[widget.selectStoreIndex].name == + "所有门店" + ? "0" + : widget.businessLoginInfo + .storeList[widget.selectStoreIndex].id, + "index":2 + }); + break; + } } - ///今日流水 - Widget todayFlow() { - return Container( - color: Colors.white, - margin: EdgeInsets.only(top: 16.h, bottom: 26.h), - padding: - EdgeInsets.only(left: 16.w, right: 21.w, top: 12.h, bottom: 16.h), - child: Column( - children: [ - Row( - children: [ - Container( - width: 4.w, - height: 16.h, - color: Color(0xFF30415B), - margin: EdgeInsets.only(right: 12.w), - ), - Expanded( - child: Text( - "今日流水", - style: TextStyle( - fontSize: 15.sp, - fontWeight: MyFontWeight.semi_bold, - color: Color(0xFF0D0D0D), - ), - )), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Navigator.of(context) - .pushNamed('/router/flow_page', arguments: { - "storeName": widget?.businessLoginInfo - ?.storeList[widget.selectStoreIndex].name ?? - "", - "storeId": widget.businessLoginInfo - .storeList[widget.selectStoreIndex].name == - "所有门店" - ? "0" - : widget.businessLoginInfo - .storeList[widget.selectStoreIndex].id, - }); - }, - child: Row( - children: [ - Text( - "更多数据", - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - color: Color(0xFF252626), - ), - ), - SizedBox( - width: 5.w, - ), - Image.asset( - "assets/image/bs_right.webp", - width: 8.w, - height: 12.h, - ), - ], - ), - ), - ], - ), - SizedBox( - height: 20.h, - ), - Container( - height: 360.h, - child: (dayFlowList.length == null || dayFlowList?.length == 0) - ? NoDataView( - src: "assets/image/bs_no data_logo.webp", - isShowBtn: false, - text: "暂无数据", - fontSize: 16.sp, - margin: EdgeInsets.all(20.h), - ) - : ListView.builder( - padding: EdgeInsets.zero, - itemCount: dayFlowList?.length ?? 0, - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () {}, - child: flowItem(dayFlowList[position]), - ); - }, - )) - ], - ), - ); - } + ///统计板块 + List> homeStatisticsList = [ + {"image":"assets/image/bus_home_yytj.webp","commonName":"营业统计","imageWidth":"21","imageHeight":"20"}, + {"image":"assets/image/bus_home_xfjl.webp","commonName":"消费记录","imageWidth":"22","imageHeight":"21"}, + {"image":"assets/image/bus_home_czjl.webp","commonName":"充值记录","imageWidth":"19","imageHeight":"22"}, + {"image":"assets/image/bus_home_hyyetj.webp","commonName":"会员余额统计","imageWidth":"23","imageHeight":"23"}, + {"image":"assets/image/bus_home_xfpm.webp","commonName":"消费排名","imageWidth":"26","imageHeight":"22"}, + {"image":"assets/image/bus_home_goods_ssfx.webp","commonName":"商品销售分析","imageWidth":"26","imageHeight":"23"}, + ]; - ///流水item - Widget flowItem(DayFlowList dayFlowList) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(0.w), - color: Color(0xFFF3F7FF), - ), - margin: EdgeInsets.only(bottom: 12.h), - padding: EdgeInsets.symmetric(horizontal: 17.w, vertical: 8.h), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - dayFlowList?.localDateTime ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - SizedBox( - height: 7.h, - ), - Text( - dayFlowList?.storeName ?? "", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.regular, - color: Color(0x99000000), - ), + ///统计Item + Widget homeStatisticsItem(index){ + return Column( + children: [ + Image.asset( + homeStatisticsList[index]["image"], + width: double.tryParse(homeStatisticsList[index]["imageWidth"]).w, + height: double.tryParse(homeStatisticsList[index]["imageHeight"]).h, + fit: BoxFit.fill, + ), + Padding(padding: EdgeInsets.only(top: 12.h), + child: Text( + homeStatisticsList[index]["commonName"], + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF252626), ), - ], - )), - Text.rich( - TextSpan( - children: [ - TextSpan( - text: (dayFlowList?.amount != "0.00") ? "+" : "-", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - TextSpan( - text: (dayFlowList?.amount != "0.00") - ? (dayFlowList?.amount ?? "") - : (dayFlowList?.refundAmount ?? ""), - style: TextStyle( - fontSize: 14.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xD9000000), - ), - ), - ], - ), - ), - ], - ), + )), + ], ); } diff --git a/lib/business_system/home/cashier/cashier_page.dart b/lib/business_system/home/cashier/cashier_page.dart index 06c14c27..a2403d22 100644 --- a/lib/business_system/home/cashier/cashier_page.dart +++ b/lib/business_system/home/cashier/cashier_page.dart @@ -1,8 +1,23 @@ +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:intl/intl.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +import '../../../generated/l10n.dart'; +import '../../../retrofit/business_api.dart'; +import '../../../retrofit/data/base_data.dart'; +import '../../../retrofit/data/phone_query_member_info.dart'; +import '../../../utils/business_instance.dart'; +import '../../../utils/flutter_utils.dart'; +import '../../../view_widget/border_text.dart'; +import '../../../view_widget/classic_header.dart'; +import '../../../view_widget/my_footer.dart'; +import '../../../view_widget/round_button.dart'; +import '../../../view_widget/settlement_tips_dialog.dart'; class CashierPage extends StatefulWidget { final Map arguments; @@ -16,45 +31,1281 @@ class CashierPage extends StatefulWidget { } class _CashierPage extends State { + final TextEditingController editingController = TextEditingController(); + final RefreshController refreshController = RefreshController(); + FocusNode _focusNode = FocusNode(); + bool isKeyBoardShow = false; + BusinessApiService businessService; + String networkError = ""; + int networkStatus = 0; + PhoneQueryMemberInfo phoneQueryMemberInfo; + String cashierOrderId; + String _display = ""; + double _displayTotal = 0; + List manualQueryInfo; + bool isDisplayVipInfo = false; + + + ///离开页面记着销毁和清除 + @override + void dispose() { + super.dispose(); + refreshController.dispose(); + _focusNode.unfocus(); + } @override void initState() { super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + print("object: ${MediaQuery.of(context).viewInsets.bottom}"); + if (MediaQuery.of(context).viewInsets.bottom == 0) { + if (isKeyBoardShow) { + isKeyBoardShow = false; + //关闭键盘 软键盘关闭了, 清除输入控件的焦点, 否则重新进入页面会导致软键盘再弹出问题 + FocusScope.of(context).requestFocus(FocusNode()); + } + } else { + isKeyBoardShow = true; + } + }); + }); } + ///根据手机号搜索用户信息 + queryMemberPhoneInfo(phoneNum, {isShow = true}) async { + try { + if (isShow) + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService + .queryMemberInfo( + {"phoneNum": phoneNum, "isNewUser": false}).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + phoneQueryMemberInfo = baseData.data; + refreshController.loadComplete(); + refreshController.refreshCompleted(); + networkStatus = 1; + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + refreshController.refreshFailed(); + refreshController.loadFailed(); + } + } finally { + if (isShow) + EasyLoading.dismiss(); + setState((){}); + } + } + + ///收银台创建直付订单 + cashierCreateOrder(payChannel) async { + try { + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService.createOrder({ + "createOrderType": "DIRECT",// 创建订单类型 DIRECT 直接下单 ASSIGN 指定商品下单 + "orderAmount": _displayTotal.toStringAsFixed(2), + "virtualProductId":-2, + "mid":phoneQueryMemberInfo?.sid ?? "" + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + cashierOrderId = baseData.data; + if(payChannel == 1|| payChannel == 2){ + Navigator.of(context).pushNamed( + '/router/scan_code_page', + arguments: { + "storeId": widget.arguments["storeId"], + "scanCodeType": "收银台支付", + "mid":phoneQueryMemberInfo?.sid ??"", + "orderId": cashierOrderId, + "payChannel":payChannel + }).then((value) { + if (value == 1) { + _display = ""; + _displayTotal = 0; + }else{ + manualQueryInfo = value; + showPayQueryDialog(manualQueryInfo[0], manualQueryInfo[1]); + } + }); + }else{ + await cashierPayOrder(cashierOrderId,payChannel,phoneQueryMemberInfo?.sid ?? ""); + } + networkStatus = 1; + setState(() {}); + } + } finally { + EasyLoading.dismiss(); + } + } + + ///支付接口 + cashierPayOrder(orderId, payChannel,mid) async { + try { + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService.prePayOrder({ + "orderId": orderId, + "payChannel": payChannel, + "mid":mid, + "authCode":(payChannel ==1 || payChannel == 2) ?"": null, + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + _display = ""; + _displayTotal = 0; + await queryMemberPhoneInfo(editingController?.text ?? "",isShow: false); + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.data ??"", + color: Color(0xFF30415B), + )); + networkStatus = 1; + setState(() {}); + } else { + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.msg, + color: Color(0xFF30415B), + )); + } + } finally { + } + } + + ///手动查询充值订单状态 + manualQueryCashierOrder(orderId) async { + try { + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService.queryCashierOrder(cashierOrderId,true).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + _display = ""; + _displayTotal = 0; + Navigator.of(context).pop(); + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.data ??"", + color: Color(0xFF30415B), + )); + } else { + if (baseData.msg != "需要用户输入支付密码") Navigator.of(context).pop(); + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.msg, + color: Color(0xFF30415B), + )); + } + } finally { + EasyLoading.dismiss(); + } + } @override Widget build(BuildContext context) { - return Scaffold( - appBar: MyAppBar( - title: "收银", - titleColor: Colors.black, - background: Colors.white, - leadingColor: Colors.black, - brightness: Brightness.dark, + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + FocusScope.of(context).requestFocus(FocusNode()); + }, + child: Scaffold( + appBar: MyAppBar( + title: "收银", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: Container( + child: SmartRefresher( + enablePullDown: true, + enablePullUp: false, + header: MyHeader( + color: Color(0xFF30415B), + ), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + controller: refreshController, + onRefresh: () { + if(editingController.text != "") + queryMemberPhoneInfo(editingController.text ?? "",isShow: false); + else{ + refreshController.loadComplete(); + refreshController.refreshCompleted(); + } + }, + physics: BouncingScrollPhysics(), + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: EdgeInsets.only(top: 19.h, bottom: 13.h), + decoration: BoxDecoration( + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 16.w), + child: Text( + "快速收银", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ), + Stack( + children: [ + Container( + width: double.infinity, + height: 2.h, + margin: EdgeInsets.only(top: 5.h), + color: Color(0xFFD8D8D8), + ), + Container( + width: 44.w, + height: 1.5.h, + margin: EdgeInsets.only(top: 5.h, left: 24.w), + color: Color(0xFF30415B), + ), + ], + ), + SizedBox( + height: 13.h, + ), + vipUserSearch(), + ], + ), + ), + phoneQueryMemberInfo != null? + vipPlate(): + SizedBox(height:103.h), + calculator() + ], + ), + ), + )), + ), + ); + } + + /// 搜索框 + Widget vipUserSearch() { + return Container( + color: Colors.white, + child: Container( + height: 40.h, + margin: EdgeInsets.only(left: 18.w, right: 18.w), + decoration: BoxDecoration( + color: Color(0xFFF7F8FA), + borderRadius: BorderRadius.circular(2), + ), + child: TextField( + focusNode: _focusNode, + textInputAction: TextInputAction.search, + onEditingComplete: () { + FocusScope.of(context).requestFocus(FocusNode()); + queryMemberPhoneInfo(editingController.text ?? ""); + }, + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF808080), + ), + controller: editingController, + decoration: InputDecoration( + hintText: "请输入会员手机号", + hintStyle: TextStyle( + color: Color(0xFF808080), + fontSize: 15.sp, + fontWeight: MyFontWeight.regular), + contentPadding: EdgeInsets.symmetric( + vertical: 12.h, + ), + prefixIcon: Image.asset( + "assets/image/bs_goods_search.webp", + width: 20, + height: 20, + ), + border: InputBorder.none, + ), + ), + ), + ); + } + + ///会员信息板块 + Widget vipPlate() { + return Container( + width: double.infinity, + margin: EdgeInsets.only(top: 12.h, left: 19.w, right: 13.w), + padding: EdgeInsets.only(bottom: 15.h), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.center, + child: Column( children: [ Container( width: double.infinity, - margin: EdgeInsets.only(top:8.h, left: 16.w, right: 16.w), - padding: EdgeInsets.only(top:19.h,bottom: 36.h), + padding: EdgeInsets.only(top: 13.h, left: 16.w, bottom: 33.h), + margin: EdgeInsets.only(bottom: 10.h), decoration: BoxDecoration( color: Colors.white, - boxShadow: [ - BoxShadow( - color: Color(0x0F06152E), - offset: Offset(0, 2), - blurRadius: 4, - spreadRadius: 0, + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [Color(0xFF30415B), Color(0xFF5171A4)]), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 52.h, + height: 52.h, + margin: EdgeInsets.only(right: 15.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + ), + child: Image.asset( + "assets/image/bs_mine_heading.webp", + width: double.infinity, + height: double.infinity, + fit: BoxFit.fill, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8.h), + child: Text( + "会员名称:${phoneQueryMemberInfo?.nickName ?? ""}", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + )), + Text( + "手机号:${phoneQueryMemberInfo?.phoneNum ?? ""}", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ) + ], ) ], - borderRadius: BorderRadius.circular(8), ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 7.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + "assets/image/bus_vip_balance.webp", + width: 24.h, + height: 24.h, + fit: BoxFit.fill, + ), + Padding( + padding: EdgeInsets.only(left: 7.w), + child: Text( + "会员余额", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF252626), + ), + )) + ], + )), + Text( + "${double.tryParse(phoneQueryMemberInfo?.balance ?? 0)}", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF30415B), + ), + ) + ], + )), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 7.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + "assets/image/bus_coupon.webp", + width: 20.w, + height: 18.h, + fit: BoxFit.fill, + ), + Padding( + padding: EdgeInsets.only(left: 7.w), + child: Text( + "优惠券", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF252626), + ), + )) + ], + )), + Text( + (phoneQueryMemberInfo?.useableConponList?.length ?? 0).toString(), + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF30415B), + ), + ) + ], + )), + ], + ) + ], + ), + ); + } + + ///计算器ui + Widget calculator() { + return Container( + color: Colors.white, + margin: EdgeInsets.only(top: 15.h), + alignment: Alignment.bottomCenter, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + padding: EdgeInsets.symmetric( + vertical: 6.h, + ), + margin: EdgeInsets.only(right: 32.w), + child: Text( + _display, + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.bold, + color: Color(0x4D000000), + ), + ), + ), + Container( + margin: EdgeInsets.only(right: 30.w), + child: Text( + _displayTotal.toStringAsFixed(2), + style: TextStyle( + fontSize: 36.sp, + fontWeight: MyFontWeight.bold, + color: Colors.black, + ), + ), + ), + Container( + color: Color(0xFFD8D8D8), + width: double.infinity, + height: 1.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + buildButton('7'), + buildButton('8'), + buildButton('9'), + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + setState(() { + _display = ""; + _displayTotal = 0; + }); + }, + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 23.h, bottom: 18.h), + decoration: BoxDecoration( + border: Border( + right: BorderSide( + color: Color(0xFFD8D8D8), + width: 1.w, + ), + ), + ), + child: Text( + "C", + style: TextStyle( + fontSize: 32.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF30415B), + ), + ), + ), + )) + ], + ), + Container( + color: Color(0xFFD8D8D8), + width: double.infinity, + height: 1.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + buildButton('4'), + buildButton('5'), + buildButton('6'), + Expanded( + flex: 2, + child: GestureDetector( + onTap: () => _onPressed("back"), + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + right: BorderSide( + color: Color(0xFFD8D8D8), + width: 1.w, + ), + ), + ), + child: Image.asset( + "assets/image/bus_calculator_enter.webp", + width: 24.w, + height: 16.h, + fit: BoxFit.fill, + ), + ), + )) + ], + ), + Container( + color: Color(0xFFD8D8D8), + width: double.infinity, + height: 1.h, + ), + Row( + children: [ + Expanded( + child: Column( + children: [ + Row( + children: [ + buildButton('1'), + buildButton('2'), + buildButton('3'), + ], + ), + Container( + color: Color(0xFFD8D8D8), + width: double.infinity, + height: 1.h, + ), + Row( + children: [ + buildButton('0', flex: 2), + buildButton('.'), + ], + ), + ], + ), + flex: 3, + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => _onPressed("+"), + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 23.h, bottom: 18.h), + decoration: BoxDecoration(), + child: Text( + "+", + style: TextStyle( + fontSize: 32.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF30415B), + ), + ), + ), + ), + flex: 2, + ), + ], + ), + Row( + children: [ + Expanded( + flex: 2, + child: Container( + alignment: Alignment.center, + color: Color(0xFF5A7092), + padding: EdgeInsets.only(top: 32.h, bottom: 33.h), + child: Text( + "¥${_displayTotal.toStringAsFixed(2)}", + style: TextStyle( + fontSize: 24.sp, + fontWeight: MyFontWeight.bold, + color: Colors.white, + ), + ), + )), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if(_displayTotal.toStringAsFixed(2) == "0.00"){ + SmartDialog.show( + widget: SettlementTips( + () {}, + text:"订单支付金额小于或等于0,无法进行支付操作", + color: Color(0xFF30415B), + )); + }else{ + if(phoneQueryMemberInfo != null){ + showPaySelectDialog(); + }else { + SmartDialog.show( + widget: SettlementTips( + () {}, + text:"请输入会员手机号进行结账", + color: Color(0xFF30415B), + )); + } + } + + }, + child: Container( + alignment: Alignment.center, + color: Color(0xFF30415B), + padding: EdgeInsets.only( + top: 22.h, bottom: 25.h, left: 45.w, right: 33.w), + child: Text( + "结账", + style: TextStyle( + fontSize: 36.sp, + fontWeight: MyFontWeight.bold, + color: Colors.white, + ), + ), + )), + ], ) ], ), ); } + + ///计算器文本 + Widget buildButton(String text, {int flex = 1}) { + return Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 23.h, bottom: 18.h), + decoration: BoxDecoration( + border: Border( + right: BorderSide( + color: Color(0xFFD8D8D8), + width: 1.w, + ), + ), + ), + child: Text( + text, + style: TextStyle( + fontSize: 32.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xD9000000), + ), + ), + ), + onTap: () => _onPressed(text), + ), + flex: flex, + ); + } + + ///计算器点击事件的处理 + void _onPressed(String button) { + setState(() { + FocusScope.of(context).requestFocus(FocusNode()); + int addIndex = _display.lastIndexOf("+") + 1; + String rStr = _display.substring(addIndex); + if (button == "+" || button == ".") { + if (_display.isEmpty || + _display.endsWith(".") || + _display.endsWith("+")) { + return; + } + if (button == ".") { + if (rStr.contains(".")) return; + } + } else if (button == "0") { + if (rStr == "0") return; + } else { + if (rStr == "0") { + _display = _display.substring(0, _display.length - 1); + } + } + if (button == "back") { + // 回删一个数值 + if (_display.length > 0) + _display = _display.substring(0, _display.length - 1); + } else { + _display += button; + } + _displayTotal = 0; + var tempNumArr = _display.split("+"); + tempNumArr.forEach((element) { + _displayTotal += double.parse(element); + }); + }); + } + + ///支付选项 + showPaySelectDialog() { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (context) { + return Container( + width: double.infinity, + height: 280.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Container( + alignment: Alignment.center, + margin: EdgeInsets.only(top: 12.h,bottom: 12.h,left: 41.w), + child: Text( + S.of(context).zhifufangshi, + style: TextStyle( + fontWeight: MyFontWeight.bold, + fontSize: 17.sp, + color: Color(0xFF1A1A1A), + ), + ), + )), + GestureDetector( + onTap: () { + setState(() { + Navigator.of(context).pop(); + }); + }, + child: Padding( + padding: EdgeInsets.only(right: 16.w), + child: Image.asset( + "assets/image/cancel.webp", + width: 25.h, + height: 25.h, + ), + ), + ), + ], + ), + Padding( + padding: EdgeInsets.only(left: 23.w,right: 9.w), + child:Column( + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap:(){ + Navigator.of(context).pop(); + showPayAmountDialog(0,"现金"); + }, + child: Padding(padding:EdgeInsets.only(left: 5.w), + child: Row( + children: [ + Image.asset( + "assets/image/bus_cashier_xj.webp", + width: 31.w, + height: 22.h, + ), + Padding( + padding: EdgeInsets.only(left: 14.w), + child: Text( + "现金支付", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ),), + ), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.symmetric(vertical:13.h), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap:(){ + Navigator.of(context).pop(); + showPayAmountDialog(1,"微信");}, + child: Padding(padding:EdgeInsets.only(left: 5.w), + child: Row( + children: [ + Image.asset( + "assets/image/bus_vip_wx.webp", + width: 29.w, + height: 26.h, + ), + Padding( + padding: EdgeInsets.only(left: 14.w), + child: Text( + "微信", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ),)), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.symmetric(vertical:13.h), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap:(){ + Navigator.of(context).pop(); + showPayAmountDialog(2,"支付宝");}, + child: Padding(padding:EdgeInsets.only(left: 5.w), + child: Row( + children: [ + Image.asset( + "assets/image/bus_vip_alipay.webp", + width: 29.h, + height: 29.h, + ), + Padding( + padding: EdgeInsets.only(left: 14.w), + child: Text( + "支付宝", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ),)), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.symmetric(vertical:13.h), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap:(){ + Navigator.of(context).pop(); + showPayAmountDialog(3,"商户余额");}, + child: Padding(padding:EdgeInsets.only(left: 5.w), + child: Row( + children: [ + Image.asset( + "assets/image/bus_cashier_balance.webp", + width: 27.h, + height: 27.h, + ), + Padding( + padding: EdgeInsets.only(left: 14.w), + child: Text( + "商户余额", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ),)), + // Container( + // width: double.infinity, + // height: 1.h, + // color: Color(0xFFEBEBEB), + // margin: EdgeInsets.symmetric(vertical:13.h), + // ), + // GestureDetector( + // behavior: HitTestBehavior.opaque, + // onTap:(){ + // Navigator.of(context).pop(); + // showPayAmountDialog(4,"平台余额");}, + // child: Padding(padding:EdgeInsets.only(left: 5.w), + // child: Row( + // children: [ + // Image.asset( + // "assets/image/bus_cashier_pt.webp", + // width: 27.h, + // height: 27.h, + // ), + // Padding( + // padding: EdgeInsets.only(left: 14.w), + // child: Text( + // "平台余额", + // textAlign: TextAlign.center, + // style: TextStyle( + // color: Color(0xFF1A1A1A), + // fontSize: 14.sp, + // fontWeight: MyFontWeight.regular, + // ), + // )) + // ], + // ),)), + ], + ), + ) + ], + ), + ); + }); + } + + ///确认支付金额提示 + showPayAmountDialog(index,payText) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Container( + width: MediaQuery.of(context).size.width - 84.w, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "此操作将进行金额支付,请确认支付金额及支付方式是否正确?", + style: TextStyle( + color: Color(0xFFF4524D), + fontSize: 16.sp, + fontWeight: MyFontWeight.regular, + ), + ), + SizedBox( + height: 15.h, + ), + Text( + "支付方式: ${payText}", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 16.sp, + fontWeight: MyFontWeight.regular, + ), + ), + SizedBox( + height:10.h, + ), + Text( + "支付金额: ${_displayTotal.toStringAsFixed(2)}元", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 16.sp, + fontWeight: MyFontWeight.regular, + ), + ), + SizedBox( + height: 35.h, + ), + Row( + children: [ + Expanded( + child: InkWell( + child: BorderText( + text: S.of(context).quxiao, + textColor: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: FontWeight.bold, + borderColor: Color(0xFF30415B), + radius: 4, + padding: EdgeInsets.all(12), + borderWidth: 1, + ), + onTap: () { + Navigator.of(context).pop(); + }, + ), + flex: 1, + ), + SizedBox( + width: 16.w, + ), + Expanded( + child: InkWell( + child: RoundButton( + text: S.of(context).queren, + textColor: Colors.white, + radius: 4, + padding: EdgeInsets.all(12), + backgroup: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + onTap: () { + setState(() { + Navigator.of(context).pop(); + cashierCreateOrder(index); + }); + }, + ), + flex: 1, + ), + ], + ) + ], + ), + ), + ); + }, + ); + } + + ///手动查询弹窗 + showPayQueryDialog(String queryDialog, String orderId) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + contentPadding: EdgeInsets.all(0), + content: Container( + width: MediaQuery.of(context).size.width - 80, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pop(); + }, + child: Container( + alignment: Alignment.topRight, + padding: + EdgeInsets.symmetric(horizontal: 5.w, vertical: 10.h), + child: Image.asset( + "assets/image/cancel.webp", + width: 24.h, + height: 24.h, + )), + ), + Padding( + padding: + EdgeInsets.only(bottom: 20.h, left: 14.w, right: 14.w), + child: Text( + queryDialog, + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: MyFontWeight.bold, + ), + ), + ), + Padding( + padding: + EdgeInsets.only(bottom: 20.h, left: 14.w, right: 14.w), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: "*", + style: TextStyle( + color: Color(0xFFFA5151), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "请确认用户支付成功后再点击手动查询", + style: TextStyle( + color: Color(0xFFFA5151), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + TextSpan( + text: "*", + style: TextStyle( + color: Color(0xFFFA5151), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "\n*", + style: TextStyle( + color: Colors.blue, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "订单查询成功后可关闭当前弹窗", + style: TextStyle( + color: Colors.blue, + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + TextSpan( + text: "*", + style: TextStyle( + color: Colors.blue, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + manualQueryCashierOrder(orderId); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(4), + ), + padding: EdgeInsets.symmetric( + horizontal: 26.w, vertical: 10.h), + margin: EdgeInsets.only(right: 8.w, bottom: 20.h), + child: Text( + "手动查询", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + )), + ], + ), + ), + ); + }, + ); + } } diff --git a/lib/business_system/home/consumer_ranking_page.dart b/lib/business_system/home/consumer_ranking_page.dart index 87cca153..761ef4c6 100644 --- a/lib/business_system/home/consumer_ranking_page.dart +++ b/lib/business_system/home/consumer_ranking_page.dart @@ -13,6 +13,7 @@ import '../../generated/l10n.dart'; import '../../retrofit/business_api.dart'; import '../../retrofit/data/balance_consumption_ranking_list.dart'; import '../../retrofit/data/base_data.dart'; +import '../../retrofit/data/store_total_money_info.dart'; import '../../utils/business_instance.dart'; import '../../utils/flutter_utils.dart'; import '../../view_widget/classic_header.dart'; @@ -44,12 +45,28 @@ class _ConsumerRankingPage extends State { String networkError = ""; int networkStatus = 0; List records = []; + StoreTotalMoneyInfo storeTotalMoneyInfo; int _pageNum = 1; String total = "0"; + int _loadCount = 0; @override void initState() { super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + print("object: ${MediaQuery.of(context).viewInsets.bottom}"); + if (MediaQuery.of(context).viewInsets.bottom == 0) { + if (isKeyBoardShow) { + isKeyBoardShow = false; + //关闭键盘 软键盘关闭了, 清除输入控件的焦点, 否则重新进入页面会导致软键盘再弹出问题 + FocusScope.of(context).requestFocus(FocusNode()); + } + } else { + isKeyBoardShow = true; + } + }); + }); titleName = widget?.arguments["titleName"] ?? ""; _onRefresh(); } @@ -67,15 +84,28 @@ class _ConsumerRankingPage extends State { EasyLoading.show( status: S.current.zhengzaijiazai, maskType: EasyLoadingMaskType.black); - await queryStoreMoney(); - EasyLoading.dismiss(); - if (refreshController.isRefresh) refreshController.refreshCompleted(); - if (mounted) setState(() {}); + queryStoreMoney(isRefresh:false); + queryStoreTotalMoney(); + } + + + addLoadCount() { + _loadCount += 1; + if (_loadCount == 2) { + _loadCount = 0; + EasyLoading.dismiss(); + if (refreshController.isRefresh) refreshController.refreshCompleted(); + if (mounted) setState(() {}); + } } ///查询会员余额统计/消费排名 - queryStoreMoney({nickName,isShow = true}) async { + queryStoreMoney({keyword,isRefresh = true}) async { try { + if (isRefresh) + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); if (businessService == null) { businessService = BusinessApiService(Dio(), context: context, @@ -84,9 +114,9 @@ class _ConsumerRankingPage extends State { storeId: widget.arguments["storeId"]); } BaseData baseData = await businessService.storeMoney({ - "startTime": titleName == "消费排名" ? selectTimeDateNum.substring(0,19):"", - "endTime": titleName == "消费排名" ? selectTimeDateNum.substring(24,43):"", - "nickName": titleName == "消费排名" ? "" : nickName, + "startTime": titleName == "消费排名" ? (selectTimeDate != ""?selectTimeDate.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "").substring(0,19):selectTimeDateNum.substring(0,19)):"", + "endTime": titleName == "消费排名" ? (selectTimeDate!=""?selectTimeDate.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "").substring(22,41):selectTimeDateNum.substring(24,43)):"", + "keyword": titleName == "消费排名" ? "" : (keyword ?? ""), "type":titleName == "消费排名" ? 1:0, "pageNum": _pageNum, "pageSize": 10, @@ -100,24 +130,56 @@ class _ConsumerRankingPage extends State { if (!mounted) return; if (baseData != null && baseData.isSuccess) { records.addAll(baseData?.data?.records ?? []); - total = baseData?.data?.total ?? "0"; if ((baseData?.data?.records ?? []).isEmpty || records.length.toString() == baseData.data.pages) refreshController.loadNoData(); else refreshController.loadComplete(); networkStatus = 1; - } else { - SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } finally { - if (isShow) setState(() {}); + if(isRefresh){ + setState(() {}); + EasyLoading.dismiss(); + }else + addLoadCount(); + } + } + + ///会员余额统计(总会员数,总余额数)查询/消费排名(消费会员数量,销售金额)查询 + queryStoreTotalMoney({keyword}) async { + try { + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService.storeTotalMoney({ + "startTime": titleName == "消费排名" ? selectTimeDateNum.substring(0,19):"", + "endTime": titleName == "消费排名" ? selectTimeDateNum.substring(24,43):"", + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + storeTotalMoneyInfo = baseData.data; + networkStatus = 1; + } + } finally { + addLoadCount(); } } @override Widget build(BuildContext context) { return Scaffold( + resizeToAvoidBottomInset: false, appBar: MyAppBar( title: titleName, titleColor: Colors.black, @@ -147,7 +209,7 @@ class _ConsumerRankingPage extends State { }, onLoading: () { _pageNum++; - _onRefresh(isShowLoad: false); + queryStoreMoney(); }, physics: BouncingScrollPhysics(), scrollController: ScrollController(), @@ -183,7 +245,7 @@ class _ConsumerRankingPage extends State { ), ), Text( - total, + (storeTotalMoneyInfo?.paySumCount ?? 0).toString(), style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.bold, @@ -207,7 +269,7 @@ class _ConsumerRankingPage extends State { ), ), Text( - "12334.00", + storeTotalMoneyInfo?.storeTotalMoney ?? "0", style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.bold, @@ -236,7 +298,7 @@ class _ConsumerRankingPage extends State { ), ), Text( - total, + (storeTotalMoneyInfo?.memberCount ?? 0).toString(), style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.bold, @@ -260,7 +322,7 @@ class _ConsumerRankingPage extends State { ), ), Text( - "12334.00", + storeTotalMoneyInfo?.memberTotalBalance ?? "0", style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.bold, @@ -293,7 +355,7 @@ class _ConsumerRankingPage extends State { ? NoDataView( src: "assets/image/bs_no data_logo.webp", isShowBtn: false, - text: "暂无商品分类", + text: "暂无相关数据", fontSize: 16.sp, margin: EdgeInsets.all(20.h), ) @@ -329,7 +391,7 @@ class _ConsumerRankingPage extends State { Navigator.of(context).pushNamed('/router/custom_page', arguments: {"beyondDateRange": "0"}).then((value) { selectTimeDate = value; - setState((){}); + queryStoreMoney(); }); }, child: Container( @@ -377,7 +439,8 @@ class _ConsumerRankingPage extends State { textInputAction: TextInputAction.search, onEditingComplete: () { FocusScope.of(context).requestFocus(FocusNode()); - queryStoreMoney(nickName: editingController?.text ?? ""); + records.clear(); + queryStoreMoney(keyword: editingController?.text ?? ""); }, style: TextStyle( fontSize: 15.sp, @@ -429,7 +492,7 @@ class _ConsumerRankingPage extends State { Padding( padding: EdgeInsets.only(bottom: 16.h), child: Text( - "${records?.name ?? ""}(${records?.phone})", + "${records?.name ?? ""}(${records?.phone})", style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.bold, diff --git a/lib/business_system/home/overview/trade_overview_page.dart b/lib/business_system/home/overview/trade_overview_page.dart index c5035d9e..65cce994 100644 --- a/lib/business_system/home/overview/trade_overview_page.dart +++ b/lib/business_system/home/overview/trade_overview_page.dart @@ -23,11 +23,14 @@ class TradeOverviewPage extends StatefulWidget { class _TradeOverviewPage extends State with SingleTickerProviderStateMixin{ final RefreshController refreshController = RefreshController(); String storeId; + TabController tabController; @override void initState() { super.initState(); storeId = widget?.arguments["storeId"] ??""; + tabController = TabController( + length: 3, vsync: this, initialIndex: widget?.arguments["index"]??0); } @override @@ -55,7 +58,7 @@ class _TradeOverviewPage extends State with SingleTickerProvi fontWeight: FontWeight.normal, color: Color(0xFF666666) ), - // controller: tabController, + controller: tabController, //未选中文字颜色 unselectedLabelColor: Color(0xffA29E9E), indicatorSize: TabBarIndicatorSize.label, diff --git a/lib/business_system/home/vip/business_vip_page.dart b/lib/business_system/home/vip/business_vip_page.dart index cb37896a..97a6189a 100644 --- a/lib/business_system/home/vip/business_vip_page.dart +++ b/lib/business_system/home/vip/business_vip_page.dart @@ -28,7 +28,7 @@ class _BusinessVipPage extends State @override void initState() { super.initState(); - tabController = TabController(length: 3, vsync: this); + tabController = TabController(length: 3, vsync: this, initialIndex: widget?.arguments["index"] ?? 0); tabController.addListener(() { if (!tabController.indexIsChanging) { setState(() {}); diff --git a/lib/business_system/home/vip/vip_recharge_page.dart b/lib/business_system/home/vip/vip_recharge_page.dart index 9ecdb0f0..43f9bdd3 100644 --- a/lib/business_system/home/vip/vip_recharge_page.dart +++ b/lib/business_system/home/vip/vip_recharge_page.dart @@ -410,7 +410,7 @@ class _VipRechargePage extends State { rechargeList(), ///选择充值的套餐 - if (networkStatus == 1) + if (networkStatus == 1 && records.length > 0) Container( decoration: BoxDecoration( color: Colors.white, @@ -840,7 +840,7 @@ class _VipRechargePage extends State { '/router/scan_code_page', arguments: { "storeId": widget.arguments["storeId"], - "scanCodeType": "支付", + "scanCodeType": "充值支付", "rechargePreferentialId": records[selectIndex]?.id ?? "", "memberSourceId": @@ -1012,7 +1012,7 @@ class _VipRechargePage extends State { child: (records != null && (records?.length ?? 0) > 0) ? ListView.builder( padding: EdgeInsets.zero, - itemCount: records.length ?? 0, + itemCount: records?.length ?? 0, scrollDirection: Axis.vertical, shrinkWrap: true, physics: BouncingScrollPhysics(), diff --git a/lib/business_system/mine/business_mine_page.dart b/lib/business_system/mine/business_mine_page.dart index 785cc8fc..8581d97e 100644 --- a/lib/business_system/mine/business_mine_page.dart +++ b/lib/business_system/mine/business_mine_page.dart @@ -277,8 +277,9 @@ class _BusinessMinePage extends State GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - Navigator.of(context).pushNamed('/router/shop_reservation_code', - arguments: {"storeId": widget.storeId,}); + // Navigator.of(context).pushNamed('/router/shop_reservation_code', + // arguments: {"storeId": widget.storeId,}); + SmartDialog.showToast("该功能暂未开放!", alignment: Alignment.center); }, child: commonFunctionsItem( "assets/image/bs_mine_code.webp", "门店预约二维码", "",18,18), diff --git a/lib/business_system/scan_code_page.dart b/lib/business_system/scan_code_page.dart index 2fba9600..8273bc7e 100644 --- a/lib/business_system/scan_code_page.dart +++ b/lib/business_system/scan_code_page.dart @@ -101,6 +101,39 @@ class _ScanCodePage extends State { } } + ///收银台支付 + cashierPay(authCode) async { + try{ + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + if (businessService == null) { + businessService = BusinessApiService(Dio(), + context: context, + token: BusinessInstance.instance.businessToken, + tenant: BusinessInstance.instance.businessTenant, + storeId: widget.arguments["storeId"]); + } + BaseData baseData = await businessService.prePayOrder({ + "orderId": widget?.arguments["orderId"] ?? "", + "payChannel": widget?.arguments["payChannel"] ?? "", + "mid":widget?.arguments["mid"] ?? "", + "authCode": authCode ?? null + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + Navigator.of(context).pop(1); + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.data, + color: Color(0xFF30415B), + )); + } else { + Navigator.of(context).pop([baseData.msg,baseData.data]); + }}finally{ + EasyLoading.dismiss(); + } + } @override Widget build(BuildContext context) { @@ -121,7 +154,11 @@ class _ScanCodePage extends State { widget.arguments["scanCodeType"] == null) { queryTicketDetails(data); } else { - rechargePay(data); + if(widget.arguments["scanCodeType"] == "充值支付"){ + rechargePay(data); + }else{ + cashierPay(data); + } } }, ), diff --git a/lib/retrofit/business_api.dart b/lib/retrofit/business_api.dart index 55adaf4d..0b4aeadb 100644 --- a/lib/retrofit/business_api.dart +++ b/lib/retrofit/business_api.dart @@ -33,6 +33,7 @@ import 'data/recharge_flow_list.dart'; import 'data/refund_reason_list.dart'; import 'data/single_sales_list.dart'; import 'data/store_time_info_list.dart'; +import 'data/store_total_money_info.dart'; import 'data/ticket_details.dart'; import 'data/ticket_record.dart'; import 'data/ticket_show.dart'; @@ -325,7 +326,7 @@ abstract class BusinessApiService { @POST("member/posMemberRecharge") Future posMemberRecharge(@Body() Map param); - ///充值订单查询 + ///充值订单手动查询 @POST("member/manualQuery") Future manualQuery(@Body() Map param); @@ -353,4 +354,20 @@ abstract class BusinessApiService { @POST("dashBoard/storeMoney") Future> storeMoney(@Body() Map param); + ///会员余额统计(总会员数,总余额数)查询/消费排名(消费会员数量,销售金额)查询 + @POST("dashBoard/storeTotalMoney") + Future> storeTotalMoney(@Body() Map param); + + ///收银台创建直付订单 + @POST("order/createOrder") + Future createOrder(@Body() Map param); + + ///收银台支付 + @POST("order/prePayOrder") + Future prePayOrder(@Body() Map param); + + ///收银台直付订单手动查询 + @POST("order/queryOrder/{orderId}?login={login}") + Future queryCashierOrder(@Path("orderId") String orderId,@Path("login") bool login); + } diff --git a/lib/retrofit/business_api.g.dart b/lib/retrofit/business_api.g.dart index 124e27a4..3a621c82 100644 --- a/lib/retrofit/business_api.g.dart +++ b/lib/retrofit/business_api.g.dart @@ -1076,4 +1076,91 @@ class _BusinessApiService implements BusinessApiService { return value; } + @override + Future> storeTotalMoney(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'dashBoard/storeTotalMoney', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : StoreTotalMoneyInfo.fromJson(json), + ); + return value; + } + + @override + Future createOrder(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _result = await _dio.request>( + 'order/createOrder', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: param); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : json, + ); + return value; + } + + @override + Future prePayOrder(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _result = await _dio.request>( + 'order/prePayOrder', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: param); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : json, + ); + return value; + } + + @override + Future> queryCashierOrder(orderId,login) async { + ArgumentError.checkNotNull(orderId, 'orderId'); + ArgumentError.checkNotNull(login, 'login'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('order/queryOrder/$orderId?login=$login', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => json as dynamic, + ); + return value; + } + } diff --git a/lib/retrofit/data/phone_query_member_info.dart b/lib/retrofit/data/phone_query_member_info.dart index 33e57cec..30df614c 100644 --- a/lib/retrofit/data/phone_query_member_info.dart +++ b/lib/retrofit/data/phone_query_member_info.dart @@ -1,16 +1,19 @@ /// mid : "1379254113602109440" -/// sid : "1706504181134655488" +/// sid : "1659496253991419904" /// phoneNum : "13052919193" /// nickName : "" /// headimg : "" /// sex : "0" /// balance : "0.00" +/// realBalance : "0.00" +/// giftBalance : "0.00" /// memberSourceCredit : false /// money : "1.49" /// memberCredit : false /// greenMoney : "0.00" /// raiseMoney : "0.00" /// payPassword : "222222" +/// useableConponList : [{"id":"1730867009651998720","storeIds":["1333246101343436800","1432164681279078400","1665555596536971264"],"stores":[],"bizType":2,"fullType":"TOTAL_FULL","fullAmount":"0.00","discountAmount":"0.00","fullNumber":2,"dateOrDay":true,"startAfterDays":0,"daysValidate":3,"discountPercent":68,"limitAmount":"0.00","bizId":"","publishStartTime":"2023-05-05","publishEndTime":"2023-12-31","useStartTime":"2023-12-02 16:30:28","useEndTime":"2023-12-05 16:30:28","doStartTime":"00:00","doEndTime":"23:59","promotionId":"0","couponId":"1654409900576473088","receiveTime":"2023-12-02","useTime":null,"status":1,"tenantCode":"admin","type":2,"promotionName":"双杯优享6.8折(海峡姐妹)","usable":false,"usableReason":"不在可使用时间内,本券须在领取0天后,3天内使用","allProduct":false,"productSkuId":[],"productGroupIds":["1433971071249285120","1433971071266062336","1433971071287033856","1433971071303811072","1433971071316393984","1433972467273039872","1435141914704740352","1524320958125441024","1552172579970613248","1668105881067192320","1668134716433235968","1668134867440762880","1668134955919605760","1668135085221609472","1668135269255086080","1425708380399337472","1426064940447301632","1426067376096411648","1426095795836289024","1522572290481455104","1522572604823568384","1524327158112059392","1601821884305899520","1668135150308818944","1678291351080271872"],"productList":null,"isMaxCoupon":false,"productGroupList":[],"remark":"

1.本券自领取日起3天有效。
2.本券仅用于海峡姐妹饮品,一次性购买满2杯使用。
3.本券不可与其他活动同享。

","canUseBalance":true},{"id":"1738109465292439552","storeIds":["1432164681279078400"],"stores":[],"bizType":6,"fullType":"EACH_FULL","fullAmount":"0.00","discountAmount":"0.00","fullNumber":1,"dateOrDay":true,"startAfterDays":0,"daysValidate":90,"discountPercent":0,"limitAmount":"0.00","bizId":"","publishStartTime":"2023-08-28","publishEndTime":"2025-08-31","useStartTime":"2023-12-22 16:09:24","useEndTime":"2024-03-21 16:09:24","doStartTime":"00:00","doEndTime":"23:59","promotionId":"0","couponId":"1695995932824305664","receiveTime":"2023-12-22","useTime":null,"status":1,"tenantCode":"admin","type":6,"promotionName":"茶饮畅饮券","usable":false,"usableReason":null,"allProduct":false,"productSkuId":[],"productGroupIds":["1433971071249285120","1433971071266062336","1433971071287033856","1433971071303811072","1433972467273039872","1434859128668291072","1435141914704740352","1524320958125441024","1552172579970613248"],"productList":null,"isMaxCoupon":false,"productGroupList":[],"remark":"

1.本券仅作为有奖兑换凭证,不可转赠,不可兑换现金;
2.请在有效期内使用该券,逾期作废;
3.本券一次性核销。

","canUseBalance":true},{"id":"1739525906998755328","storeIds":["1432164681279078400"],"stores":[],"bizType":6,"fullType":"EACH_FULL","fullAmount":"0.00","discountAmount":"0.00","fullNumber":1,"dateOrDay":true,"startAfterDays":0,"daysValidate":90,"discountPercent":0,"limitAmount":"0.00","bizId":"","publishStartTime":"2023-08-28","publishEndTime":"2025-08-31","useStartTime":"2023-12-26 13:57:50","useEndTime":"2024-03-25 13:57:50","doStartTime":"00:00","doEndTime":"23:59","promotionId":"0","couponId":"1695995932824305664","receiveTime":"2023-12-26","useTime":null,"status":1,"tenantCode":"admin","type":6,"promotionName":"茶饮畅饮券","usable":false,"usableReason":null,"allProduct":false,"productSkuId":[],"productGroupIds":["1433971071249285120","1433971071266062336","1433971071287033856","1433971071303811072","1433972467273039872","1434859128668291072","1435141914704740352","1524320958125441024","1552172579970613248"],"productList":null,"isMaxCoupon":false,"productGroupList":[],"remark":"

1.本券仅作为有奖兑换凭证,不可转赠,不可兑换现金;
2.请在有效期内使用该券,逾期作废;
3.本券一次性核销。

","canUseBalance":true},{"id":"1739947698053709824","storeIds":["1627869775969386496"],"stores":[{"id":"1627869775969386496","createTime":"2023-02-21 11:16:14","createUser":"1","updateTime":"2023-02-21 11:16:14","updateUser":"1","tenantCode":"1193","useErp":false,"openStartTime":"08:00:00","openEndTime":"21:15:00","storeName":"海峡姐妹茶膳坊","nickName":"","logo":"https://pos.upload.lotus-wallet.com/1193/2023/05/335470b8-557e-4809-92b3-c8050f98bb7f.png","facade":"https://pos.upload.lotus-wallet.com/1193/2023/05/f4e502de-d3af-4524-962a-d588733f0b1b.jpg","shipAddress":null,"remark":"","mobile":"18696193737","longitude":"116.4273410000","latitude":"39.9028420000","refundAddress":"北京市东城区毛家湾胡同甲13号北京站第八候车室西侧第一跨2-8-1B","refundTel":null,"refundContact":null,"isAutoSendRefundAddress":1,"province":"北京","city":"北京","district":"东城区","address":"北京市东城区毛家湾胡同甲13号北京站第八候车室西侧第一跨2-8-1B","headName":"","headMobile":"","tel":"18696193737","businessService":"","businessType":"","deliveryInfo":null,"pickupType":{"dineInTakeStatus":true,"takeawayStatus":false,"expressDeliveryStatus":false},"miniParam":{"mini_program_app_id":"wx8f3ce8f059abff52","mini_program_secret":"40a7eb06bb1eb537a2faf094baa787e1","mini_mch_id":"","mini_sub_mch_id":"1639906514","is_sub_app":true,"sub_app_id":"wx8f3ce8f059abff52","mini_mch_key":"e10adc3949ba59abbe56e057f20f883e","mini_key_path":"","mini_key_sn_no":"","mini_key_cert_path":"","mini_key_key_path":""},"alipayParam":{"appid":"","privateKey":"","alipayPublicKey":"","alipayPid":"2088541867845156","appAuthToken":"202303BBbcba1639502a4d1c8e1c67e209b71D15"},"setting":{"speakerKey":"","speakerSn":"zsw03","printUsername":"","printUserPwd":"","tagWidth":null,"tagHeight":null},"refundApprover":null,"enableRefundApprover":null,"tableFee":{"merchant_table_price":"","per_capita_consumption":"30","pay_set":["0","1","2","3","4"]},"money":"1502.00","platformShow":true,"subMchId":"","serviceType":"EATSTORE","isEnable":true,"is_delete":0,"sort":0,"profitSharing":{"type":"manual","mchName":"","mchCode":"","ratio":0},"autoSetting":{"use_auto_open":false,"use_finish_order":true,"use_flow_auto_open":true,"use_flow_finish_order":false},"posType":{"desc":"快消餐饮","code":"FASTSTORE"}}],"bizType":2,"fullType":"TOTAL_FULL","fullAmount":"0.00","discountAmount":"0.00","fullNumber":1,"dateOrDay":false,"startAfterDays":0,"daysValidate":0,"discountPercent":80,"limitAmount":"0.00","bizId":"","publishStartTime":"2023-12-26","publishEndTime":"2023-12-28","useStartTime":"2023-12-26 00:00:00","useEndTime":"2023-12-30 00:00:00","doStartTime":"00:00","doEndTime":"23:59","promotionId":"0","couponId":"1739593476279894016","receiveTime":"2023-12-27","useTime":null,"status":1,"tenantCode":"1193","type":2,"promotionName":"素燥饭八折券","usable":false,"usableReason":null,"allProduct":false,"productSkuId":["1647843685146034176"],"productGroupIds":[],"productList":[{"id":"1647843685146034176","createTime":"2023-04-17 14:05:25","createUser":"1627869775885500416","updateTime":"2023-06-21 13:02:44","updateUser":"1627869775885500416","supplierName":"茶膳坊","storeId":"1627869775969386496","categoryId":"1300687829071822848","groupId":"1646761808653975552","shortName":"主食搭配贡丸汤,美味又营养","productName":"素燥饭套餐","sellDesc":"","attribute":null,"productCode":"PRO202304171405240000000000003","weight":"0","applyPrice":"42.00","price":"42.00","vipPrice":"42.00","stock":991,"sellCount":1032,"needLogistics":1,"oversold":0,"organic":0,"status":1,"posShow":true,"subscribeParam":null,"isRaise":false,"productType":0,"productNumber":1,"setMeal":1,"attrStyle":0,"detail":"","isDelete":0,"printerFlag":"DEFAULT","materials":null,"materialId":null,"details":"","thumbnailImg":"","info":"","buyCount":-53,"sellCountLimit":0,"stockRecoveryTime":"00:00:00","isAddPurchase":null,"limitNum":0,"rankId":"0","happyBean":0,"sort":0,"salesRules":null}],"isMaxCoupon":false,"productGroupList":null,"remark":"

111

","canUseBalance":true},{"id":"1739947724452659200","storeIds":["1627869775969386496"],"stores":[{"id":"1627869775969386496","createTime":"2023-02-21 11:16:14","createUser":"1","updateTime":"2023-02-21 11:16:14","updateUser":"1","tenantCode":"1193","useErp":false,"openStartTime":"08:00:00","openEndTime":"21:15:00","storeName":"海峡姐妹茶膳坊","nickName":"","logo":"https://pos.upload.lotus-wallet.com/1193/2023/05/335470b8-557e-4809-92b3-c8050f98bb7f.png","facade":"https://pos.upload.lotus-wallet.com/1193/2023/05/f4e502de-d3af-4524-962a-d588733f0b1b.jpg","shipAddress":null,"remark":"","mobile":"18696193737","longitude":"116.4273410000","latitude":"39.9028420000","refundAddress":"北京市东城区毛家湾胡同甲13号北京站第八候车室西侧第一跨2-8-1B","refundTel":null,"refundContact":null,"isAutoSendRefundAddress":1,"province":"北京","city":"北京","district":"东城区","address":"北京市东城区毛家湾胡同甲13号北京站第八候车室西侧第一跨2-8-1B","headName":"","headMobile":"","tel":"18696193737","businessService":"","businessType":"","deliveryInfo":null,"pickupType":{"dineInTakeStatus":true,"takeawayStatus":false,"expressDeliveryStatus":false},"miniParam":{"mini_program_app_id":"wx8f3ce8f059abff52","mini_program_secret":"40a7eb06bb1eb537a2faf094baa787e1","mini_mch_id":"","mini_sub_mch_id":"1639906514","is_sub_app":true,"sub_app_id":"wx8f3ce8f059abff52","mini_mch_key":"e10adc3949ba59abbe56e057f20f883e","mini_key_path":"","mini_key_sn_no":"","mini_key_cert_path":"","mini_key_key_path":""},"alipayParam":{"appid":"","privateKey":"","alipayPublicKey":"","alipayPid":"2088541867845156","appAuthToken":"202303BBbcba1639502a4d1c8e1c67e209b71D15"},"setting":{"speakerKey":"","speakerSn":"zsw03","printUsername":"","printUserPwd":"","tagWidth":null,"tagHeight":null},"refundApprover":null,"enableRefundApprover":null,"tableFee":{"merchant_table_price":"","per_capita_consumption":"30","pay_set":["0","1","2","3","4"]},"money":"1502.00","platformShow":true,"subMchId":"","serviceType":"EATSTORE","isEnable":true,"is_delete":0,"sort":0,"profitSharing":{"type":"manual","mchName":"","mchCode":"","ratio":0},"autoSetting":{"use_auto_open":false,"use_finish_order":true,"use_flow_auto_open":true,"use_flow_finish_order":false},"posType":{"desc":"快消餐饮","code":"FASTSTORE"}}],"bizType":1,"fullType":"EACH_FULL","fullAmount":"49.00","discountAmount":"10.00","fullNumber":1,"dateOrDay":true,"startAfterDays":1,"daysValidate":90,"discountPercent":100,"limitAmount":"0.00","bizId":"","publishStartTime":"2023-06-19","publishEndTime":"2023-06-26","useStartTime":"2023-12-28 17:53:59","useEndTime":"2024-03-27 17:53:59","doStartTime":"00:00","doEndTime":"23:59","promotionId":"0","couponId":"1669883455174868992","receiveTime":"2023-12-27","useTime":null,"status":1,"tenantCode":"1193","type":1,"promotionName":"满49减10元端午礼券","usable":false,"usableReason":"不在可使用时间内,本券须在领取1天后,90天内使用","allProduct":true,"productSkuId":[],"productGroupIds":[],"productList":null,"isMaxCoupon":false,"productGroupList":null,"remark":"

1.本券自领取日,次日生效可用,90天内有效;
2.本券可用于购买海峡姐妹茶膳坊内商品,满49元可使用;
3.本券不可与其他活动同享;
4.本券不可转赠,不可找零。

\n

 

","canUseBalance":true}] class PhoneQueryMemberInfo { PhoneQueryMemberInfo({ @@ -21,12 +24,15 @@ class PhoneQueryMemberInfo { String headimg, String sex, String balance, + String realBalance, + String giftBalance, bool memberSourceCredit, String money, bool memberCredit, String greenMoney, String raiseMoney, - String payPassword,}){ + String payPassword, + List useableConponList,}){ _mid = mid; _sid = sid; _phoneNum = phoneNum; @@ -34,12 +40,15 @@ class PhoneQueryMemberInfo { _headimg = headimg; _sex = sex; _balance = balance; + _realBalance = realBalance; + _giftBalance = giftBalance; _memberSourceCredit = memberSourceCredit; _money = money; _memberCredit = memberCredit; _greenMoney = greenMoney; _raiseMoney = raiseMoney; _payPassword = payPassword; + _useableConponList = useableConponList; } PhoneQueryMemberInfo.fromJson(dynamic json) { @@ -50,12 +59,20 @@ class PhoneQueryMemberInfo { _headimg = json['headimg']; _sex = json['sex']; _balance = json['balance']; + _realBalance = json['realBalance']; + _giftBalance = json['giftBalance']; _memberSourceCredit = json['memberSourceCredit']; _money = json['money']; _memberCredit = json['memberCredit']; _greenMoney = json['greenMoney']; _raiseMoney = json['raiseMoney']; _payPassword = json['payPassword']; + if (json['useableConponList'] != null) { + _useableConponList = []; + json['useableConponList'].forEach((v) { + _useableConponList.add(UseableConponList.fromJson(v)); + }); + } } String _mid; String _sid; @@ -64,12 +81,15 @@ class PhoneQueryMemberInfo { String _headimg; String _sex; String _balance; + String _realBalance; + String _giftBalance; bool _memberSourceCredit; String _money; bool _memberCredit; String _greenMoney; String _raiseMoney; String _payPassword; + List _useableConponList; PhoneQueryMemberInfo copyWith({ String mid, String sid, String phoneNum, @@ -77,12 +97,15 @@ PhoneQueryMemberInfo copyWith({ String mid, String headimg, String sex, String balance, + String realBalance, + String giftBalance, bool memberSourceCredit, String money, bool memberCredit, String greenMoney, String raiseMoney, String payPassword, + List useableConponList, }) => PhoneQueryMemberInfo( mid: mid ?? _mid, sid: sid ?? _sid, phoneNum: phoneNum ?? _phoneNum, @@ -90,12 +113,15 @@ PhoneQueryMemberInfo copyWith({ String mid, headimg: headimg ?? _headimg, sex: sex ?? _sex, balance: balance ?? _balance, + realBalance: realBalance ?? _realBalance, + giftBalance: giftBalance ?? _giftBalance, memberSourceCredit: memberSourceCredit ?? _memberSourceCredit, money: money ?? _money, memberCredit: memberCredit ?? _memberCredit, greenMoney: greenMoney ?? _greenMoney, raiseMoney: raiseMoney ?? _raiseMoney, payPassword: payPassword ?? _payPassword, + useableConponList: useableConponList ?? _useableConponList, ); String get mid => _mid; String get sid => _sid; @@ -104,12 +130,15 @@ PhoneQueryMemberInfo copyWith({ String mid, String get headimg => _headimg; String get sex => _sex; String get balance => _balance; + String get realBalance => _realBalance; + String get giftBalance => _giftBalance; bool get memberSourceCredit => _memberSourceCredit; String get money => _money; bool get memberCredit => _memberCredit; String get greenMoney => _greenMoney; String get raiseMoney => _raiseMoney; String get payPassword => _payPassword; + List get useableConponList => _useableConponList; Map toJson() { final map = {}; @@ -120,12 +149,396 @@ PhoneQueryMemberInfo copyWith({ String mid, map['headimg'] = _headimg; map['sex'] = _sex; map['balance'] = _balance; + map['realBalance'] = _realBalance; + map['giftBalance'] = _giftBalance; map['memberSourceCredit'] = _memberSourceCredit; map['money'] = _money; map['memberCredit'] = _memberCredit; map['greenMoney'] = _greenMoney; map['raiseMoney'] = _raiseMoney; map['payPassword'] = _payPassword; + if (_useableConponList != null) { + map['useableConponList'] = _useableConponList.map((v) => v.toJson()).toList(); + } + return map; + } + +} + +/// id : "1730867009651998720" +/// storeIds : ["1333246101343436800","1432164681279078400","1665555596536971264"] +/// stores : [] +/// bizType : 2 +/// fullType : "TOTAL_FULL" +/// fullAmount : "0.00" +/// discountAmount : "0.00" +/// fullNumber : 2 +/// dateOrDay : true +/// startAfterDays : 0 +/// daysValidate : 3 +/// discountPercent : 68 +/// limitAmount : "0.00" +/// bizId : "" +/// publishStartTime : "2023-05-05" +/// publishEndTime : "2023-12-31" +/// useStartTime : "2023-12-02 16:30:28" +/// useEndTime : "2023-12-05 16:30:28" +/// doStartTime : "00:00" +/// doEndTime : "23:59" +/// promotionId : "0" +/// couponId : "1654409900576473088" +/// receiveTime : "2023-12-02" +/// useTime : null +/// status : 1 +/// tenantCode : "admin" +/// type : 2 +/// promotionName : "双杯优享6.8折(海峡姐妹)" +/// usable : false +/// usableReason : "不在可使用时间内,本券须在领取0天后,3天内使用" +/// allProduct : false +/// productSkuId : [] +/// productGroupIds : ["1433971071249285120","1433971071266062336","1433971071287033856","1433971071303811072","1433971071316393984","1433972467273039872","1435141914704740352","1524320958125441024","1552172579970613248","1668105881067192320","1668134716433235968","1668134867440762880","1668134955919605760","1668135085221609472","1668135269255086080","1425708380399337472","1426064940447301632","1426067376096411648","1426095795836289024","1522572290481455104","1522572604823568384","1524327158112059392","1601821884305899520","1668135150308818944","1678291351080271872"] +/// productList : null +/// isMaxCoupon : false +/// productGroupList : [] +/// remark : "

1.本券自领取日起3天有效。
2.本券仅用于海峡姐妹饮品,一次性购买满2杯使用。
3.本券不可与其他活动同享。

" +/// canUseBalance : true + +class UseableConponList { + UseableConponList({ + String id, + List storeIds, + List stores, + num bizType, + String fullType, + String fullAmount, + String discountAmount, + num fullNumber, + bool dateOrDay, + num startAfterDays, + num daysValidate, + num discountPercent, + String limitAmount, + String bizId, + String publishStartTime, + String publishEndTime, + String useStartTime, + String useEndTime, + String doStartTime, + String doEndTime, + String promotionId, + String couponId, + String receiveTime, + dynamic useTime, + num status, + String tenantCode, + num type, + String promotionName, + bool usable, + String usableReason, + bool allProduct, + List productSkuId, + List productGroupIds, + dynamic productList, + bool isMaxCoupon, + List productGroupList, + String remark, + bool canUseBalance,}){ + _id = id; + _storeIds = storeIds; + _stores = stores; + _bizType = bizType; + _fullType = fullType; + _fullAmount = fullAmount; + _discountAmount = discountAmount; + _fullNumber = fullNumber; + _dateOrDay = dateOrDay; + _startAfterDays = startAfterDays; + _daysValidate = daysValidate; + _discountPercent = discountPercent; + _limitAmount = limitAmount; + _bizId = bizId; + _publishStartTime = publishStartTime; + _publishEndTime = publishEndTime; + _useStartTime = useStartTime; + _useEndTime = useEndTime; + _doStartTime = doStartTime; + _doEndTime = doEndTime; + _promotionId = promotionId; + _couponId = couponId; + _receiveTime = receiveTime; + _useTime = useTime; + _status = status; + _tenantCode = tenantCode; + _type = type; + _promotionName = promotionName; + _usable = usable; + _usableReason = usableReason; + _allProduct = allProduct; + _productSkuId = productSkuId; + _productGroupIds = productGroupIds; + _productList = productList; + _isMaxCoupon = isMaxCoupon; + _productGroupList = productGroupList; + _remark = remark; + _canUseBalance = canUseBalance; +} + + UseableConponList.fromJson(dynamic json) { + _id = json['id']; + _storeIds = json['storeIds'] != null ? json['storeIds'].cast() : []; + // if (json['stores'] != null) { + // _stores = []; + // json['stores'].forEach((v) { + // _stores.add(Dynamic.fromJson(v)); + // }); + // } + _bizType = json['bizType']; + _fullType = json['fullType']; + _fullAmount = json['fullAmount']; + _discountAmount = json['discountAmount']; + _fullNumber = json['fullNumber']; + _dateOrDay = json['dateOrDay']; + _startAfterDays = json['startAfterDays']; + _daysValidate = json['daysValidate']; + _discountPercent = json['discountPercent']; + _limitAmount = json['limitAmount']; + _bizId = json['bizId']; + _publishStartTime = json['publishStartTime']; + _publishEndTime = json['publishEndTime']; + _useStartTime = json['useStartTime']; + _useEndTime = json['useEndTime']; + _doStartTime = json['doStartTime']; + _doEndTime = json['doEndTime']; + _promotionId = json['promotionId']; + _couponId = json['couponId']; + _receiveTime = json['receiveTime']; + _useTime = json['useTime']; + _status = json['status']; + _tenantCode = json['tenantCode']; + _type = json['type']; + _promotionName = json['promotionName']; + _usable = json['usable']; + _usableReason = json['usableReason']; + _allProduct = json['allProduct']; + if (json['productSkuId'] != null) { + _productSkuId = []; + // json['productSkuId'].forEach((v) { + // _productSkuId.add(Dynamic.fromJson(v)); + // }); + } + _productGroupIds = json['productGroupIds'] != null ? json['productGroupIds'].cast() : []; + _productList = json['productList']; + _isMaxCoupon = json['isMaxCoupon']; + if (json['productGroupList'] != null) { + _productGroupList = []; + // json['productGroupList'].forEach((v) { + // _productGroupList.add(Dynamic.fromJson(v)); + // }); + } + _remark = json['remark']; + _canUseBalance = json['canUseBalance']; + } + String _id; + List _storeIds; + List _stores; + num _bizType; + String _fullType; + String _fullAmount; + String _discountAmount; + num _fullNumber; + bool _dateOrDay; + num _startAfterDays; + num _daysValidate; + num _discountPercent; + String _limitAmount; + String _bizId; + String _publishStartTime; + String _publishEndTime; + String _useStartTime; + String _useEndTime; + String _doStartTime; + String _doEndTime; + String _promotionId; + String _couponId; + String _receiveTime; + dynamic _useTime; + num _status; + String _tenantCode; + num _type; + String _promotionName; + bool _usable; + String _usableReason; + bool _allProduct; + List _productSkuId; + List _productGroupIds; + dynamic _productList; + bool _isMaxCoupon; + List _productGroupList; + String _remark; + bool _canUseBalance; +UseableConponList copyWith({ String id, + List storeIds, + List stores, + num bizType, + String fullType, + String fullAmount, + String discountAmount, + num fullNumber, + bool dateOrDay, + num startAfterDays, + num daysValidate, + num discountPercent, + String limitAmount, + String bizId, + String publishStartTime, + String publishEndTime, + String useStartTime, + String useEndTime, + String doStartTime, + String doEndTime, + String promotionId, + String couponId, + String receiveTime, + dynamic useTime, + num status, + String tenantCode, + num type, + String promotionName, + bool usable, + String usableReason, + bool allProduct, + List productSkuId, + List productGroupIds, + dynamic productList, + bool isMaxCoupon, + List productGroupList, + String remark, + bool canUseBalance, +}) => UseableConponList( id: id ?? _id, + storeIds: storeIds ?? _storeIds, + stores: stores ?? _stores, + bizType: bizType ?? _bizType, + fullType: fullType ?? _fullType, + fullAmount: fullAmount ?? _fullAmount, + discountAmount: discountAmount ?? _discountAmount, + fullNumber: fullNumber ?? _fullNumber, + dateOrDay: dateOrDay ?? _dateOrDay, + startAfterDays: startAfterDays ?? _startAfterDays, + daysValidate: daysValidate ?? _daysValidate, + discountPercent: discountPercent ?? _discountPercent, + limitAmount: limitAmount ?? _limitAmount, + bizId: bizId ?? _bizId, + publishStartTime: publishStartTime ?? _publishStartTime, + publishEndTime: publishEndTime ?? _publishEndTime, + useStartTime: useStartTime ?? _useStartTime, + useEndTime: useEndTime ?? _useEndTime, + doStartTime: doStartTime ?? _doStartTime, + doEndTime: doEndTime ?? _doEndTime, + promotionId: promotionId ?? _promotionId, + couponId: couponId ?? _couponId, + receiveTime: receiveTime ?? _receiveTime, + useTime: useTime ?? _useTime, + status: status ?? _status, + tenantCode: tenantCode ?? _tenantCode, + type: type ?? _type, + promotionName: promotionName ?? _promotionName, + usable: usable ?? _usable, + usableReason: usableReason ?? _usableReason, + allProduct: allProduct ?? _allProduct, + productSkuId: productSkuId ?? _productSkuId, + productGroupIds: productGroupIds ?? _productGroupIds, + productList: productList ?? _productList, + isMaxCoupon: isMaxCoupon ?? _isMaxCoupon, + productGroupList: productGroupList ?? _productGroupList, + remark: remark ?? _remark, + canUseBalance: canUseBalance ?? _canUseBalance, +); + String get id => _id; + List get storeIds => _storeIds; + List get stores => _stores; + num get bizType => _bizType; + String get fullType => _fullType; + String get fullAmount => _fullAmount; + String get discountAmount => _discountAmount; + num get fullNumber => _fullNumber; + bool get dateOrDay => _dateOrDay; + num get startAfterDays => _startAfterDays; + num get daysValidate => _daysValidate; + num get discountPercent => _discountPercent; + String get limitAmount => _limitAmount; + String get bizId => _bizId; + String get publishStartTime => _publishStartTime; + String get publishEndTime => _publishEndTime; + String get useStartTime => _useStartTime; + String get useEndTime => _useEndTime; + String get doStartTime => _doStartTime; + String get doEndTime => _doEndTime; + String get promotionId => _promotionId; + String get couponId => _couponId; + String get receiveTime => _receiveTime; + dynamic get useTime => _useTime; + num get status => _status; + String get tenantCode => _tenantCode; + num get type => _type; + String get promotionName => _promotionName; + bool get usable => _usable; + String get usableReason => _usableReason; + bool get allProduct => _allProduct; + List get productSkuId => _productSkuId; + List get productGroupIds => _productGroupIds; + dynamic get productList => _productList; + bool get isMaxCoupon => _isMaxCoupon; + List get productGroupList => _productGroupList; + String get remark => _remark; + bool get canUseBalance => _canUseBalance; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['storeIds'] = _storeIds; + if (_stores != null) { + map['stores'] = _stores.map((v) => v.toJson()).toList(); + } + map['bizType'] = _bizType; + map['fullType'] = _fullType; + map['fullAmount'] = _fullAmount; + map['discountAmount'] = _discountAmount; + map['fullNumber'] = _fullNumber; + map['dateOrDay'] = _dateOrDay; + map['startAfterDays'] = _startAfterDays; + map['daysValidate'] = _daysValidate; + map['discountPercent'] = _discountPercent; + map['limitAmount'] = _limitAmount; + map['bizId'] = _bizId; + map['publishStartTime'] = _publishStartTime; + map['publishEndTime'] = _publishEndTime; + map['useStartTime'] = _useStartTime; + map['useEndTime'] = _useEndTime; + map['doStartTime'] = _doStartTime; + map['doEndTime'] = _doEndTime; + map['promotionId'] = _promotionId; + map['couponId'] = _couponId; + map['receiveTime'] = _receiveTime; + map['useTime'] = _useTime; + map['status'] = _status; + map['tenantCode'] = _tenantCode; + map['type'] = _type; + map['promotionName'] = _promotionName; + map['usable'] = _usable; + map['usableReason'] = _usableReason; + map['allProduct'] = _allProduct; + if (_productSkuId != null) { + map['productSkuId'] = _productSkuId.map((v) => v.toJson()).toList(); + } + map['productGroupIds'] = _productGroupIds; + map['productList'] = _productList; + map['isMaxCoupon'] = _isMaxCoupon; + if (_productGroupList != null) { + map['productGroupList'] = _productGroupList.map((v) => v.toJson()).toList(); + } + map['remark'] = _remark; + map['canUseBalance'] = _canUseBalance; return map; } diff --git a/lib/retrofit/data/store_total_money_info.dart b/lib/retrofit/data/store_total_money_info.dart new file mode 100644 index 00000000..5f332dc0 --- /dev/null +++ b/lib/retrofit/data/store_total_money_info.dart @@ -0,0 +1,51 @@ +/// storeTotalMoney : "117.00" +/// paySumCount : 2 +/// memberCount : 9385 +/// memberTotalBalance : "42236.77" + +class StoreTotalMoneyInfo { + StoreTotalMoneyInfo({ + String storeTotalMoney, + num paySumCount, + num memberCount, + String memberTotalBalance,}){ + _storeTotalMoney = storeTotalMoney; + _paySumCount = paySumCount; + _memberCount = memberCount; + _memberTotalBalance = memberTotalBalance; +} + + StoreTotalMoneyInfo.fromJson(dynamic json) { + _storeTotalMoney = json['storeTotalMoney']; + _paySumCount = json['paySumCount']; + _memberCount = json['memberCount']; + _memberTotalBalance = json['memberTotalBalance']; + } + String _storeTotalMoney; + num _paySumCount; + num _memberCount; + String _memberTotalBalance; +StoreTotalMoneyInfo copyWith({ String storeTotalMoney, + num paySumCount, + num memberCount, + String memberTotalBalance, +}) => StoreTotalMoneyInfo( storeTotalMoney: storeTotalMoney ?? _storeTotalMoney, + paySumCount: paySumCount ?? _paySumCount, + memberCount: memberCount ?? _memberCount, + memberTotalBalance: memberTotalBalance ?? _memberTotalBalance, +); + String get storeTotalMoney => _storeTotalMoney; + num get paySumCount => _paySumCount; + num get memberCount => _memberCount; + String get memberTotalBalance => _memberTotalBalance; + + Map toJson() { + final map = {}; + map['storeTotalMoney'] = _storeTotalMoney; + map['paySumCount'] = _paySumCount; + map['memberCount'] = _memberCount; + map['memberTotalBalance'] = _memberTotalBalance; + return map; + } + +} \ No newline at end of file diff --git a/lib/setting/permission_setting_page.dart b/lib/setting/permission_setting_page.dart index 5b720738..b0cbf557 100644 --- a/lib/setting/permission_setting_page.dart +++ b/lib/setting/permission_setting_page.dart @@ -46,7 +46,7 @@ class _PermissionSettingPage extends State { List tipIcons = [ "assets/image/icon_location_permission_tips.webp", - "assets/image/icon_notification_permission_tips.webp", + "assets/image/icon_natification_permission_tips.webp", "assets/image/icon_camera_permission_tips.webp", "assets/image/icon_storage_permission_tips.webp", ];