From 4723c789fa4aaaf4e47b49aeb527e3a2285da07c Mon Sep 17 00:00:00 2001 From: wurong <953969641@qq.com> Date: Mon, 25 Dec 2023 17:43:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BC=9A=E5=91=98=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=AE=8C=E6=88=90=EF=BC=9B=20=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E5=85=85=E5=80=BC=E9=A1=B5=E9=9D=A2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?bug=E6=9B=B4=E6=94=B9=EF=BC=9B=20=E6=88=91=E7=9A=84=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=96=B0=E5=A2=9E=E9=97=A8=E5=BA=97=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=BA=97=E5=91=98=E7=AE=A1=E7=90=86=E6=9D=BF?= =?UTF-8?q?=E5=9D=97=EF=BC=9B=20=E6=96=B0=E5=A2=9Eimage=5Fgallery=5Fsaver?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=94=A8=E4=BA=8E=E4=BF=9D=E5=AD=98=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=EF=BC=8CIOS=20info=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=9C=80=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96=E7=9B=B8=E5=86=8C?= =?UTF-8?q?=E6=9D=83=E9=99=90=EF=BC=9B=20=E9=82=80=E8=AF=B7=E5=A5=BD?= =?UTF-8?q?=E5=8F=8Bui=E9=80=82=E9=85=8D=E6=9B=B4=E6=94=B9=EF=BC=9B=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=85=E5=80=BC=E6=94=AF=E4=BB=98=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E9=A1=B5=E9=9D=A2=EF=BC=9B=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E9=A1=B5=E9=9D=A2=EF=BC=88=E5=BE=85=E7=BB=98?= =?UTF-8?q?=E5=88=B6=EF=BC=89=EF=BC=9B=20=E6=96=B0=E5=A2=9E=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=E6=8E=92=E5=90=8D/=E4=BC=9A=E5=91=98=E4=BD=99?= =?UTF-8?q?=E9=A2=9D=E7=BB=9F=E8=AE=A1=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=95=B0=E6=8D=AE=E5=B7=B2=E5=AF=B9=E6=8E=A5=EF=BC=88?= =?UTF-8?q?=E8=AF=A5=E9=A1=B5=E9=9D=A2=E9=87=91=E9=A2=9D=EF=BC=8C=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E4=BD=99=E9=A2=9D=E7=BB=9F=E8=AE=A1=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=BF=E5=9D=97=E4=B8=BA=E5=AE=8C=E5=96=84=EF=BC=8C=E5=BE=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=9B=B4=E6=94=B9=EF=BC=9B=EF=BC=89=20?= =?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?=E9=A1=B5=E9=9D=A2=EF=BC=88=E7=BC=BA=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E4=BA=8C=E7=BB=B4=E7=A0=81=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=9C=89bug=E5=BE=85=E6=9B=B4=E6=94=B9=EF=BC=9B=EF=BC=89=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BA=97=E5=91=98=E7=AE=A1=E7=90=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E6=8E=A5=E5=8F=A3=E6=95=B0=E6=8D=AE=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=B7=B2=E5=AF=B9=E6=8E=A5=EF=BC=9B=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BA=97=E5=91=98=E6=96=B0=E5=A2=9E/=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8E=A5=E5=8F=A3=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=B7=B2=E5=AF=B9=E6=8E=A5=EF=BC=9B=20=E5=9C=A8?= =?UTF-8?q?=E5=94=AE=E5=95=86=E5=93=81=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9B=20=E6=89=AB=E4=B8=80=E6=89=AB=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=85=E5=80=BC=E6=89=AB=E7=A0=81=E4=BB=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9B=20=E6=96=B0=E5=A2=9E=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E5=85=85=E5=80=BC=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=95=B0=E6=8D=AE=E6=B5=81=E7=A8=8B=E5=B7=B2=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=EF=BC=9B=20app=E7=A6=8F=E5=88=A9=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=A2=86=E5=8F=96=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=88=B8=E6=8F=90=E7=A4=BA=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_mine_clerk.webp | Bin 0 -> 890 bytes .../bs_mine_code.webp} | Bin 622 -> 572 bytes assets/image/2x/bs_secure.webp | Bin 922 -> 858 bytes assets/image/2x/bs_shop_logo.webp | Bin 740 -> 692 bytes assets/image/2x/bus_code_save.webp | Bin 0 -> 800 bytes assets/image/2x/bus_home_bhy.webp | Bin 0 -> 1102 bytes assets/image/2x/bus_home_cz.webp | Bin 0 -> 916 bytes assets/image/2x/bus_home_czjl.webp | Bin 0 -> 762 bytes assets/image/2x/bus_home_goods.webp | Bin 0 -> 1084 bytes assets/image/2x/bus_home_goods_ssfx.webp | Bin 0 -> 1216 bytes assets/image/2x/bus_home_hygl.webp | Bin 0 -> 1734 bytes assets/image/2x/bus_home_hyyetj.webp | Bin 0 -> 1324 bytes assets/image/2x/bus_home_jrls.webp | Bin 0 -> 1290 bytes assets/image/2x/bus_home_rxbd.webp | Bin 0 -> 1562 bytes assets/image/2x/bus_home_syt.webp | Bin 0 -> 1440 bytes assets/image/2x/bus_home_syzl.webp | Bin 0 -> 1180 bytes assets/image/2x/bus_home_xfjl.webp | Bin 0 -> 768 bytes assets/image/2x/bus_home_xfpm.webp | Bin 0 -> 1168 bytes assets/image/2x/bus_home_yytj.webp | Bin 0 -> 1258 bytes assets/image/2x/bus_pay_success_logo.png | Bin 0 -> 4348 bytes assets/image/3x/bs_mine_clerk.webp | Bin 0 -> 1258 bytes .../bs_mine_code.webp} | Bin 698 -> 590 bytes assets/image/3x/bs_secure.webp | Bin 1394 -> 1372 bytes assets/image/3x/bs_shop_logo.webp | Bin 888 -> 818 bytes assets/image/3x/bs_store_info_logo.webp | Bin 896 -> 0 bytes assets/image/3x/bus_code_save.webp | Bin 0 -> 1012 bytes assets/image/3x/bus_home_bhy.webp | Bin 0 -> 1826 bytes assets/image/3x/bus_home_cz.webp | Bin 0 -> 1356 bytes assets/image/3x/bus_home_czjl.webp | Bin 0 -> 980 bytes assets/image/3x/bus_home_goods.webp | Bin 0 -> 1740 bytes assets/image/3x/bus_home_goods_ssfx.webp | Bin 0 -> 3152 bytes assets/image/3x/bus_home_hygl.webp | Bin 0 -> 4600 bytes assets/image/3x/bus_home_hyyetj.webp | Bin 0 -> 2240 bytes assets/image/3x/bus_home_jrls.webp | Bin 0 -> 2868 bytes assets/image/3x/bus_home_rxbd.webp | Bin 0 -> 4276 bytes assets/image/3x/bus_home_syt.webp | Bin 0 -> 3858 bytes assets/image/3x/bus_home_syzl.webp | Bin 0 -> 1882 bytes assets/image/3x/bus_home_xfjl.webp | Bin 0 -> 1064 bytes assets/image/3x/bus_home_xfpm.webp | Bin 0 -> 1984 bytes assets/image/3x/bus_home_yytj.webp | Bin 0 -> 2900 bytes assets/image/3x/bus_pay_success_logo.png | Bin 0 -> 8651 bytes assets/image/bs_mine_clerk.webp | Bin 0 -> 652 bytes assets/image/bs_mine_code.webp | Bin 0 -> 558 bytes assets/image/bs_secure.webp | Bin 696 -> 688 bytes assets/image/bs_shop_logo.webp | Bin 606 -> 590 bytes assets/image/bus_code_save.webp | Bin 0 -> 626 bytes assets/image/bus_home_bhy.webp | Bin 0 -> 758 bytes assets/image/bus_home_cz.webp | Bin 0 -> 740 bytes assets/image/bus_home_czjl.webp | Bin 0 -> 632 bytes assets/image/bus_home_goods.webp | Bin 0 -> 750 bytes assets/image/bus_home_goods_ssfx.webp | Bin 0 -> 826 bytes assets/image/bus_home_hygl.webp | Bin 0 -> 984 bytes assets/image/bus_home_hyyetj.webp | Bin 0 -> 836 bytes assets/image/bus_home_jrls.webp | Bin 0 -> 838 bytes assets/image/bus_home_rxbd.webp | Bin 0 -> 874 bytes assets/image/bus_home_syt.webp | Bin 0 -> 902 bytes assets/image/bus_home_syzl.webp | Bin 0 -> 762 bytes assets/image/bus_home_xfjl.webp | Bin 0 -> 658 bytes assets/image/bus_home_xfpm.webp | Bin 0 -> 784 bytes assets/image/bus_home_yytj.webp | Bin 0 -> 806 bytes assets/image/bus_pay_success_logo.png | Bin 0 -> 1600 bytes ios/Runner/Info.plist | 2 + .../goods/off_shelf/off_shelf_page.dart | 2 + .../home/cashier/cashier_page.dart | 60 + .../home/consumer_ranking_page.dart | 579 +++++ lib/business_system/home/vip/add_vip.dart | 104 +- .../home/vip/bus_vip_list.dart | 2 +- .../home/vip/pay_success_page.dart | 180 ++ .../home/vip/vip_recharge_page.dart | 1905 ++++++++++++++--- .../mine/business_mine_page.dart | 65 +- .../mine/clerk_manage/add_new_clerk_page.dart | 546 +++++ .../mine/clerk_manage/clerk_manage_page.dart | 512 +++++ .../mine/shop_reservation_code.dart | 208 ++ lib/business_system/scan_code_page.dart | 56 +- lib/home/welfare_page.dart | 9 +- lib/main.dart | 18 + lib/qr/invite_friends.dart | 89 +- lib/retrofit/business_api.dart | 49 +- lib/retrofit/business_api.g.dart | 225 ++ lib/retrofit/data/add_vip_info.dart | 303 +++ .../balance_consumption_ranking_list.dart | 187 ++ lib/retrofit/data/bus_recharge_list.dart | 304 +++ lib/retrofit/data/clerk_manage_list.dart | 511 +++++ .../data/phone_query_member_info.dart | 132 ++ lib/retrofit/data/user_info_edit.dart | 267 +++ pubspec.lock | 30 +- pubspec.yaml | 4 +- 87 files changed, 5913 insertions(+), 436 deletions(-) create mode 100644 assets/image/2x/bs_mine_clerk.webp rename assets/image/{bs_store_info_logo.webp => 2x/bs_mine_code.webp} (65%) create mode 100644 assets/image/2x/bus_code_save.webp create mode 100644 assets/image/2x/bus_home_bhy.webp create mode 100644 assets/image/2x/bus_home_cz.webp create mode 100644 assets/image/2x/bus_home_czjl.webp create mode 100644 assets/image/2x/bus_home_goods.webp create mode 100644 assets/image/2x/bus_home_goods_ssfx.webp create mode 100644 assets/image/2x/bus_home_hygl.webp create mode 100644 assets/image/2x/bus_home_hyyetj.webp create mode 100644 assets/image/2x/bus_home_jrls.webp create mode 100644 assets/image/2x/bus_home_rxbd.webp create mode 100644 assets/image/2x/bus_home_syt.webp create mode 100644 assets/image/2x/bus_home_syzl.webp create mode 100644 assets/image/2x/bus_home_xfjl.webp create mode 100644 assets/image/2x/bus_home_xfpm.webp create mode 100644 assets/image/2x/bus_home_yytj.webp create mode 100644 assets/image/2x/bus_pay_success_logo.png create mode 100644 assets/image/3x/bs_mine_clerk.webp rename assets/image/{2x/bs_store_info_logo.webp => 3x/bs_mine_code.webp} (58%) delete mode 100644 assets/image/3x/bs_store_info_logo.webp create mode 100644 assets/image/3x/bus_code_save.webp create mode 100644 assets/image/3x/bus_home_bhy.webp create mode 100644 assets/image/3x/bus_home_cz.webp create mode 100644 assets/image/3x/bus_home_czjl.webp create mode 100644 assets/image/3x/bus_home_goods.webp create mode 100644 assets/image/3x/bus_home_goods_ssfx.webp create mode 100644 assets/image/3x/bus_home_hygl.webp create mode 100644 assets/image/3x/bus_home_hyyetj.webp create mode 100644 assets/image/3x/bus_home_jrls.webp create mode 100644 assets/image/3x/bus_home_rxbd.webp create mode 100644 assets/image/3x/bus_home_syt.webp create mode 100644 assets/image/3x/bus_home_syzl.webp create mode 100644 assets/image/3x/bus_home_xfjl.webp create mode 100644 assets/image/3x/bus_home_xfpm.webp create mode 100644 assets/image/3x/bus_home_yytj.webp create mode 100644 assets/image/3x/bus_pay_success_logo.png create mode 100644 assets/image/bs_mine_clerk.webp create mode 100644 assets/image/bs_mine_code.webp create mode 100644 assets/image/bus_code_save.webp create mode 100644 assets/image/bus_home_bhy.webp create mode 100644 assets/image/bus_home_cz.webp create mode 100644 assets/image/bus_home_czjl.webp create mode 100644 assets/image/bus_home_goods.webp create mode 100644 assets/image/bus_home_goods_ssfx.webp create mode 100644 assets/image/bus_home_hygl.webp create mode 100644 assets/image/bus_home_hyyetj.webp create mode 100644 assets/image/bus_home_jrls.webp create mode 100644 assets/image/bus_home_rxbd.webp create mode 100644 assets/image/bus_home_syt.webp create mode 100644 assets/image/bus_home_syzl.webp create mode 100644 assets/image/bus_home_xfjl.webp create mode 100644 assets/image/bus_home_xfpm.webp create mode 100644 assets/image/bus_home_yytj.webp create mode 100644 assets/image/bus_pay_success_logo.png create mode 100644 lib/business_system/home/cashier/cashier_page.dart create mode 100644 lib/business_system/home/consumer_ranking_page.dart create mode 100644 lib/business_system/home/vip/pay_success_page.dart create mode 100644 lib/business_system/mine/clerk_manage/add_new_clerk_page.dart create mode 100644 lib/business_system/mine/clerk_manage/clerk_manage_page.dart create mode 100644 lib/business_system/mine/shop_reservation_code.dart create mode 100644 lib/retrofit/data/add_vip_info.dart create mode 100644 lib/retrofit/data/balance_consumption_ranking_list.dart create mode 100644 lib/retrofit/data/bus_recharge_list.dart create mode 100644 lib/retrofit/data/clerk_manage_list.dart create mode 100644 lib/retrofit/data/phone_query_member_info.dart create mode 100644 lib/retrofit/data/user_info_edit.dart diff --git a/assets/image/2x/bs_mine_clerk.webp b/assets/image/2x/bs_mine_clerk.webp new file mode 100644 index 0000000000000000000000000000000000000000..81cdd8812ccda9f553d4ece439f03d815cd67df1 GIT binary patch literal 890 zcmWIYbaN|WW?%?+bqWXzu!!JdU|=u+Vr2#fbp{4cXXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3?XK$iSele1KEn{ecM+RUA#r71sYc zq5mPX_h)(m)G2!WYbGaUqvsQ{%eZi)vep^oQwaw`&voKwHxwlHKXg2|7=$; z3UT`qr|O>HTEX%2;s)a*TV{T_v1R5ri%hfk+Y0zB&(69SX?N(o#Xc?`vAtf`(pSu5 zczSw)(y~sr10p=RjkoSE@)P2Fq2aD9^XK!5$<|9J0-0-UUg$qR|8RDFR{Q+)+4E0n ZOxk&)S;Ked9mCDL)=fG4bFC*ZEC3LS2QL5s literal 0 HcmV?d00001 diff --git a/assets/image/bs_store_info_logo.webp b/assets/image/2x/bs_mine_code.webp similarity index 65% rename from assets/image/bs_store_info_logo.webp rename to assets/image/2x/bs_mine_code.webp index 83f8609b485d2e3aaa9848c6fae186272cc680ea..f6b8fc83780159a43600b82258c45ba8d4b7eead 100644 GIT binary patch delta 112 zcmaFIvWG<`$kWZugo%M6+|?-{EWjdyi-Cc`0Em@=Xrs(EMlV+&M_>5>hXB99;m`7) zE^tAM+M8js=M z{KVL-GxjqLj(9ApcWZCjmU|;YzE!p+nqlwU*>x&A9t0amxK2`0tyf^w^l)So%FDRF zdk&YpVu>=5K;5}Uc diff --git a/assets/image/2x/bs_secure.webp b/assets/image/2x/bs_secure.webp index d8f3eb12b6ae5a9d318ad82c8b0ba5b4260500d5..a86e2287784c6f2760733258a68bf3b6fac92c27 100644 GIT binary patch delta 373 zcmV-*0gC>b2igW4Qb|TeQUd@0S4BclR!}%t3IG5AFaQ7mBLDy^u^iR`e`Emw052oJ z3J_m`Ad+p|p?@Wn6!5P`FmBs65Y;Z;o$q}K!?uwW2WKTeGk+lW0eGCxI*dp2n`w4> zZvJn}q;{w0#@%dhih`*v>kOkx7X)VYp#%VN1$sb?WZSg0pN((Zzw;09>70FT1QGpb z;I?g?!Ws&v_kuhkA|fIpI3gnY^Yf>VucwPyKO!O`A}X=z=KAFy;Q#ezJ;@v!fYYIc zi}Y5-W0yk3i!6Hg04<^0zb;zSERlg9f1rzB_VUpMgXu>HMC{beAsMeSd0OW(!R6qk z10r^6<#~6UgDPY`$12jI0!=!lO(}jW%JNq0=Av(R)nIDI-Kstzv)Z!v*`A!={WxoH zXA!-Z<^(=G-=r~vKMv)uHO=3r``>x=-yiZk3`-Ss`w(Y9 z&pq2Io>)dm|1!0H`YZU%qj&qdw~(?icr1$0q-w?ST$r+0U{u!DNvwT z0xU_gOI0RUkz(c1t3 diff --git a/assets/image/2x/bs_shop_logo.webp b/assets/image/2x/bs_shop_logo.webp index 2a8819bb52d8c5507fa4b38a0e20d323ba822500..5bb7f8606ae93f8e5bacf57dbabf7ab7300f337b 100644 GIT binary patch delta 233 zcmaFDx`kCH$kWYj4HE-HxT{k@Sb#+Y7Xt%>0T8PL(MFkTjP?6~9DVfzoC3=iEXb8U zS^e&Zu~k~Q)Mt6FTOL8p<=@ZnBxy8+AAb1dbiH-S@5T>@ED9`aEF}5b59g|Qc7+^2 z^K}3Ek8u;y|AZR0))=R!+}b~@!G9SG0I%F*p#T5? delta 261 zcmdnO`h-;`$kWa34if`IxT{k@Sb#+Y7Xt%>0TAm0(MFkTj1g}^9Q^~_0`nKF$W_)X z=C2R%&bYsOsp0>H8k3foRsTE@$e{7io#EUM&qLhTOMl2De&%Ijy({c;n60U?;Eu;6 zrK5()Kl9%h$=+9A^uO!Qw%nF4>(*?`pBN}n-*8sdbCL=I>CIMqDycb3CHd$Up7n2^ zd*9{}|9tb^h56GY^`39OyKw$(-IIIPZ8#y&o;^8uQf_SGY(>81YQI&Ur>1VON$)tk z?&PmH&fMqSxl6Czf4DCz^HSj)U8^morDlAauW3qTdjB`-`EhBQdD?YvyK~zA#Qrhs HFfafB<6?7? diff --git a/assets/image/2x/bus_code_save.webp b/assets/image/2x/bus_code_save.webp new file mode 100644 index 0000000000000000000000000000000000000000..41aaf2e13265f8b313d620e9f3955947811c2d40 GIT binary patch literal 800 zcmWIYbaRtnW?%?+bqWXzu!!JdU|=u+Vs!=vWd;UMXXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3=wo$iSelet<*Z`GEzw%AWVczdKnc zsJFH?Zpq!Gy{kU|zsQzcWz`GEzZC2VylggUj_mum?}0mC?TB$;X#F@L|N77T-H)~J zP28n)rNh<6*KJKl$eF;kE%B1f2Te_w89e$_G$$=u**4Q`)!+aBV^+MG6}QjzOMK&P zvr{F97e7>2@tg!iz$gUM|FjL3ObPPRTq?xm-X^gPnBo{5exBYjH{o?mccpD+)HAP` zusM;vp}SYFVmC`>%~M*xYu#%u@v_SsxW5;j+xex`zV-K|`QP{Mn0D6iSaNXS=Y&|L zJtm@i1=C)J{VIAr@6E!0e=bffj=!CK@!7+>lbwy7{kN%GZ1w+=SMjjwZQ84k*PH%V a8Ry>K21mR=ColxqAMd|e@X?6>o;U!7Gu#~j literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_bhy.webp b/assets/image/2x/bus_home_bhy.webp new file mode 100644 index 0000000000000000000000000000000000000000..888b8eeb9f1b8fe18c72ff72b4c49612b2c6c8ba GIT binary patch literal 1102 zcmWIYbaQiKVPFV%bqWXzu!!JdU|=u+Vtob%O$G)}XXk(uj6f~};|UPS0+h$ 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!9u#s&jZS{ehxr{xR`ypaqH!WS4AxT3*wKmv!`6o67P zKzHQ>VLC$&Ln?y;gC|2CLo$ONkYxmnR6_o!rvb(NIJLx%tIaWf7uzPY$Y$+OJJxun(X$j5$GpC<*~+j4KK&24kFHFL;1 zvteU-`r7A##lKB%`S#A4{%R$Ez1?ZC?)4jvKH4sF*k3YZL7mgSQxRcHBTpK|6L&mwoRH6($XNo)F9%<#K6I5@J#5!q?G8bp{nnS3d$pPMBn{a-n0AL#@}Cz z7ya+Kv#nQU!FJzZ^||&Tp`?Lc!($T3J-7&1VB(`=_7y%p*4zDBEPVM<%jJAP;O95- zYOl0;-klj{*U#ymd3WYR{QBO@_N(qcH~*BF+_`7J;nlj({pa*{Zk=-P%(O*SRXyUt z58h4Me)-`uv2CFbmDinNw$nNG^ZwQTG`(m&zU=UzkK@E9W}c*OuMyQQYy}W`fHo{?00TXt$gsPx}bLA zy~G#A-(KF``5|quQ(yh;i}NE}{{6X-xj%LLvNMNWzjR*+|NZIRjVU`VMD701`~2o$ z($}3!ukS9MSY7?;)0Zfx?aNR2ynMsAX20wDd3X12SUA(~&!59p^>3#9{`M|fQnRR#u6XXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3+ysk%2*9+ksQS|DeXCCuXsW6f90! z?#WqKWmzE1XF4&*)Lm!_i$lA6OTZ%r-7S)CTXVH7?<;8v^yTR}a|JYRjNLX-6lb(VGCq} z`C*%L&u@F`DcQJI?q@LzLrdY;MAO@*Q;iMpFzR@23U%$hyrchN*!ws2t-|LwzVG;F zTyWbX@SB92&FA)iKu1HtgBQv+dDSoY7(SdhFTO4JHXMCZIv+4e#S@OC?B=I63N22{ zjdBl*6N)@rL12sUHLJ6qUgj|7gir$XY;yje&a98+rFhQ(?0(W{jobnZ~AG|t52r|K73yM zXIt-$u!GG96AUDl@9HtuvN)eyR~>(A_Sv+{=jwLf&D;LH#~1Pg0LE(!MF0Q* literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_czjl.webp b/assets/image/2x/bus_home_czjl.webp new file mode 100644 index 0000000000000000000000000000000000000000..a4b3f9f965923f73508d4bb5506e252699ba5c05 GIT binary patch literal 762 zcmWIYbaVT}#J~{l>J$(bU=hK^z`$St#HtJo+6)Yy&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(39n0wkHz(ij*%EoWfhjbvaDzQDl16%CdH5;)wZ0F;se zx+@1;`M!N8 z+oEl`PvkZ|{%@(luE=p~Tkq*V5BQ$AtkcL+@#NK$HMR*n!n)u)hyS1dx`h#C+@L2^r?7G3^~2EfG6(PX{*ZxHTygMX&2mfJ85`$+iv?e zaX@R&-|hf`io_fCrnbTRj!vn+vt?&$8WiZ|zf8QGA}=T?cs9E#F75sDNYi^~H^~*u zUHb5O#@gbS0imH=m+gE}*|u$upZt;Eg>(8o+&{Ma%a@cH&d%<6&OL96|Hr=c4*{y0 oa_sxl?2|9;^*+DzzFV=`{T|S6Aeix6HO^jb&zpFAmHo^N04Pw#+yDRo literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_goods.webp b/assets/image/2x/bus_home_goods.webp new file mode 100644 index 0000000000000000000000000000000000000000..10a50d3d0f62cf6972bcaf5c6dcd4c5223979582 GIT binary patch literal 1084 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 Sef#$11m+o({VLx9%yR%)OvPmY literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_rxbd.webp b/assets/image/2x/bus_home_rxbd.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f6b2ab64c9293aecaf628814fa67db50bb38943 GIT binary patch literal 1562 zcmWIYbaNA8V_*n(bqWXzu!!JdU|=u+Vs!=vV+ICKXXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3=uPG+$r+0FQwBlV#iPZm0~BU4E^L0~eb;@QZ~W%+9_v5sHc4jb_qdiP`Fugj z>OvKp`^_I#$7`#{s-`?Es)wTm37L(uOifL%Bjj7x4c4{*+g8W zO{C@)T=DuR)}o5kKg6X{l?qdCW`oMEKXgW`Q{713mAw@ zxVyXZ>&s93;?{moYZnj%f{AA%4;^X`^3q&7CCF>9-V#fj=+9b9rx@M8(Xsj5n}5sC zE}c?Tu%n78$L&lbIoH%QL3777dn;u>Fsm~val5bC=(Ki9_0_@sV8WGd;<< zXKcErH5~DuE6%78eCCeI;)yetn;gtPdY~rUN}t(b*Nnwn( zsOP5@TWXqZzCJsD$S+7RsbcY=EN4EkMRDJQUU0KdzB*O3G?`uRCg0PY7el_uifX0B zF|R&#j!ERx`i&QAKIFc5z^==E&S?Y7l4&L-C0j(6vPS6eJ$fHm&>s=o_tARG>f82H zicH&o$hIb_@6`RKKdII20B0s2^Mk!+)wkE$e?7|k{G`6@jBf{bcC3(`E}wWqezK|C zt!bYHPIt>jVs$Dp|{`ku>vv$kAcw@mv1^~hi BLjeE) literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_syt.webp b/assets/image/2x/bus_home_syt.webp new file mode 100644 index 0000000000000000000000000000000000000000..60c950846501c2bc5cd2202c5b9aeab1ea273677 GIT binary patch literal 1440 zcmWIYbaR`*%D@or>J$(bU=hK^z`$St#KsH^x(p1S&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBv8E7)efHNhvI2owx0}!he0WAl*Nd(9i zNr$jCKIG*7?>v@#FAz*Fl=vSV34?l5K~#e zz`)eKg93vmLmopigC3A&1dLQe1~Xs``>bMSV9+;q;1+OytT0K%^;Dci)uu21 zT+iM}koKH3S#rx44V|1v3jYI6IILgnHc3YF_M2=^{VS@4|8`AIyuEE=FxQ!CrZ4t- zJ1pf*)StFL;!j^Ee>A{^&p(()Pp0sv7`OOj|CkjT_V!1A{FM^e6vV7`#9+ZM(*=`w zKY6L&Y0yZin|LsJ-DB5l1)ggTyIwB{IAa=jNMJ#mva`xRjwu|HECNgn2?C5A3Qi15 zwgleXyjS_|>*c0Ci*E*9)X3$#oL_HpEBE~Ww9UO`(SN6$a!bDcNq6Z|6ORpB&3jkZ zKbtz!HaKm1a9Uep*4G_p?*8Ws^6p9x6S!E<&NSf|ujejf-avy|U;uzX!;c%TDB7Zq+?rXxeAE{ebJ* zf_F)R%mvSuUEvCMnNrB|?e2Wb>CaC7oxHU%Le!#29K{~lrru&y9!kLvYnJu7FJw1EyNa{7t?6=;O_Q2^zwp|L@(u|Ng7F zyYIZp>xI9+e*HSX#w==IOx|j~`i_kC^(E^?eqMGA7X9(V)1{I7i$V3`YkTDC_XxEc z&;77%(#?$r!62nRT8BxW=TM9G$`GxoUQ1g)h3Mv%uBb@rC@b)f_`E1}bL8>|6A!8< z6$^T%m}O3@NciA&w)5Ujp4ql~&ex){*KP$8Z_O4T*I)@>bmhp`^+zv05@xU56>A`s zoD`*^v{h00%E_2Xk18%dP>-t&3!M>AWnotz${859BcN@`x%$&qw~~7dk4Zp@m+9Z` zK0A^wntx~0r73HUm3Quui1DtUKY#vvC$%>PZ@%kRtA#9*SZ7!9qz7rQ#ao}cHmmq-TN+nC}j zBJU=CyPI*PXBtnF0!LHAM%fkHAKg5Dcw_gw8DH$b{%Trt+}!$aRP7i0X~JdSm4ep= PsLr>GmVVRWXUzZrx_u3k literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_syzl.webp b/assets/image/2x/bus_home_syzl.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a46aa56bccda8b6c3e95ce4c26ea2a89e97d840 GIT binary patch literal 1180 zcmWIYbaR`+!oU#j>J$(bU=hK^z`$St#JUU&+6)Yy&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBv8E81kfHNhvI2owx0}!he0WAl*Nd(9i zNr$jCKIG*7?>v@#FAz*Fl=vSV34?l5K~#e zz`)(X!N8Q3#=!7tIRgW4Bm;x+1qKGLXs{fRz~MFppp*>I zUHL$m&XB{9%AmmD$&km8%%BHk837~JkiiTX!#+!y7#Q?*4{!;vKQ?2y?QwDMfiQCi zo$xDX-2QrtSBWvNKe%9`ie_z9MLIv@0vYBF#Wh79ci0kcn{D{pF@M8lhP%@)$1M2L zQ@N}u@%FZf#af5H-DAjz?%!7XYWG*Y-&eLu&)FYt-g_xHs_fRsH%D&w_b*qe^_*Ja zS2?k4PV|qTmjgLY#n0LLD4%U_=#sff`j=OV{ZPJLrQK0^>a*jPt(;%@{+^NQXk_b9 za)_S)J!-Y+$B8Yn9ktW0#aws%am8WT3AVE$H)B%+8g_=IyuH+t%OEo4CD(?IG6uE@ zOJ>J0GaPW7>8Er{XVF||qw6Y*=DKd#+)>7Nszm7GIi*{S({gSvoBMUmjhh>DZ*QBs z_4obmCvQF%96I0e&$!^WN8q%b=EYyyu66I$g9SE}e$Z3n$Vkmw&EWwf=HpLO^K0cWO*%XsG_}3rkkLFLb_Gt+QfPc;xDe z@T<#$Jl@UN%KkoW`R(*jS)ImB$&2%3O4Tc;>5C`*NYKg?y%MwP_F8_2njcpmUwI&% zaaMBAp^7&bS61b1Zd&DMUnpEV=bNtSC9B4L;g6f7itoI5x4C}J!DX`db-0DomQOZX zoUVJ{Qn_uY4gq|2cPD-!AagQ(h{&EdST6X^ZBGmiI({TW+VvfOdY{jpJL#GC^NpA0t*)J%wPwnjH&w}<{tq`7d%JE(|903~ zkG1B|W9G##FTCIQUv?_vPNkbt6Kp3~0@|J)|2cp}idpmRnHR`U)Wtuv3J$(bU=hK^z`$St#M%rDnhXq{&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(39n0wkHz(ij*%EoWfhjbvaDzQDl16%CdH5;)wZ0F;se zx+@#;B zZWIs^P;6svMXxao&}X|`+xe2mfI=+T7Lp)W=4MZ-2N4-fIw@;wa61+ z6jp-RtG-XTe|25vtYw+Ao+-SVy)4sD@vvi&+s1!4!9HYvTgDG&JeYS@{PN2ZtGV-3 zWt_#@W9_^xZhg7EYpy_?+Uci7mX`BRIu@CQ>pc1tTQ&2{Bo$8tvIOgg5EZAatM3=r fzLz{+Xu}knS|MM#xcq_kPvKp=ul={4_KhC^a4f&S literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_xfpm.webp b/assets/image/2x/bus_home_xfpm.webp new file mode 100644 index 0000000000000000000000000000000000000000..917c4b563acf2ef5f92c89d107561790b423cb46 GIT binary patch literal 1168 zcmWIYbaU%qVPFV%bqWXzu!!JdU|=u+Vq*pdZ3YHUXXk(uj6f~};|UPS0+h$ 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!9u#s&jZS{ehxr{xR`ypaqH!WS4AxT3*wKmv!`6o67P zKzHQ>VLC$&Ln?y;gC|2CLo$ONkYxmnR6_H$K26aQ~3Tq#X6XjENj4 zPV#GQIH*3)uu-hy&Ih=`-g;RXn>wz2nm#)#yZ8XYxrv^xnU;`fBd$M=_cHV00- z6uTz>QWGYQw>l?pH7`EW@n@OBUSXpXaZYAy_x4Z9xnt`c^VE%@f6_mLi9%dr8Uc^f z7{1R6+YS=qV^NwMpdb)xA)PD;&|ISe9V&HfA^+LIe zLEYuoioby@Hxw?pe^chDJtJ)Se9yh9HGEsAJ@e&Pepo->d`h9*vuK@~n-@;y)Sh+{ zw_bQO_CTxOv-1~{;saz?MQpm#$jm1-GhU}OpiPEF_kz^iSj!!cYR*_^Nk%1i-&WtA zSEzJbX6{{!T`zwXT(PmyJ#*!mwV|2JR`xS<99=-*NNitJTXv;Imf)>M&DFi}`u*Fc ztF=qTu6_LEXHC8(yZsue%{p5oyuZ{HZ`o>bP1EYHrqi)k)3eV79kUMYFi4b)m=Ida zzhlEJo#W>{_byILwVL>&Yx?iyVf^nuDdljgZ4N0dNc;Qc<8g`Po|C`T?ALwXziG|< z`s5zNV-^qp&g`tc*Z;9iLV0hih`eXuAG^7^=XkFRKYCen`|-2i|0;5;794sqdC}uS v;ma#~#nU`5>l~W;?$*lP4mX`OneMPuGnPgeJFsXdGR3g`UdZtvem)}raDaW+ literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_home_yytj.webp b/assets/image/2x/bus_home_yytj.webp new file mode 100644 index 0000000000000000000000000000000000000000..bd9b68622a721f0705a1343d4926775d5d378e9e GIT binary patch literal 1258 zcmWIYbaQ*e!oU#j>J$(bU=hK^z`$St#F`8Y>I@8?&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(37Rj12~+v@`~WPs)V!o6fR97zxdy}S9f9kvd-NR1U3!CU zZTqF(D@tv-x83?QIo|KLVwlz6|1;|M{P6eLZ;kI-5RONRDv}R3Q!=N*1D!1dRM=MDBFKb|A#@@0PG?QMlEQm<{lpHc<~`w7FxarXP?pZj)9 z8pKzal6~{Ok-dPRpy1BA`kiOC%1^YHy>sSykk7I|`Y#VpuYAF^>g!BJskU!+xoMX7 z*KAdU*MdIsCh_+;iu;s-CpZ4~}jO$khs$5f7DD*>7d+ z{rPd#iX8#svEQbgH=Q5I(cif#TCh?#hy9T0MN+O$ezc~n?!S=xJ*L|Bi~if0Ebo(ld2rf(cAu2{@y#gShX0e08C^Ebn?$@*;QtHCCbWTl>26geQtMzdy02_+rGXkM5Rp*VsLBcRzMv zN%GMnv-Fdn)))7cuaDmJJUy+W^VqK`*Q>L-i$8g-uDbqi?d0treruTu&QtN6q>?#3 zeBRxy1rzLfpX4;;_1ktXJIn9iJMUy!_N3~73r63c|9SfO^~XQoW3n9&2r~cxLDRgT literal 0 HcmV?d00001 diff --git a/assets/image/2x/bus_pay_success_logo.png b/assets/image/2x/bus_pay_success_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..52c37939510ec89f6a2dd21941c09e1e6766ae93 GIT binary patch literal 4348 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 literal 0 HcmV?d00001 diff --git a/assets/image/2x/bs_store_info_logo.webp b/assets/image/3x/bs_mine_code.webp similarity index 58% rename from assets/image/2x/bs_store_info_logo.webp rename to assets/image/3x/bs_mine_code.webp index b8aae3f9ba40d9cdab6ccf28a7f9828db11f299b..e3a0ebc8b88e41cddb3df21c85b623faf5178960 100644 GIT binary patch delta 130 zcmdnRdX7aV$kWZujfsIF+|?-{EWjdyi-Cc`0EkV2Xrs(E#+Yy*N8i+eSAgH(@MrnY z@)i;%lT?-pu_!QVs`H+^>FLPCGsC&=5sIr08WM~0TAm0(MFkTjP-{>9Q^~_0_h7@ZhBZE;-u*?6R94;mShv2Lhah8S|%cAx@32qWrez&)gyH4Z5m2GQp&HUfK zn6Y(1e}sdgM$1a?qg!Hatqxi(`rmbDTW*E-uII`?)6u{L70*dP^heJAO3_jw&mO7S zqQbp@yIvmiJeu=(Q_{YV0UIw=tcu9p6P9CsPn%C_zUcC|k5|ducz#e>Ysh2R diff --git a/assets/image/3x/bs_secure.webp b/assets/image/3x/bs_secure.webp index 1f3b4306f6d24a8a3ffe1ef1e0592cc1dbeaa414..70ad4f3fa20828c226d20199ea99be7b642d9265 100644 GIT binary patch delta 851 zcmV-Z1FZb=3fu}DQb|TeR0RM4S4BclR!}%t3IG5AFaQ7mH2?rXu^iR`e`W&!053H_ z5D=dPIks(8(LU!RBbRt7;vq9;+TL%c5e_0rc9q$C;YR~#KqVf*O6G1Ewrv|ZW!kwX zAOh!db0*h^)79$YcJH?L*?NCko(|+w{Z?lmW8L)gHT8AVVD4v_{+8so`=|XKGf6{j zV#Zv{KW&rpA7*<0N<-;?e_ngdmJXUikF<1TM@UJ({ItKrtkGgsIuW&)eiBa%J&M&5 zMHennJoT3wbrCHQJQ$u5f~SOP(F>v*)kg7TqC}wJ!JsiIIuR;Dc; z6CIE{+7}`sA|fIpA|fIp+ItNczk1*OM+aAr9MH2pA|fIpA|fIpkqwx#bmz&NAA#>T zPwZSVwSR6)_nBKx-GBD!FHqU=_sjE#XEsmio}{m-YrkQ$x1D|m0Mu6Z?!vYiL;H4V zs?pMI^xX9aEiojuoIK<0x^-08GkfpoqT@Kkd^Xnvb9%hW~>yHFl6-Qmoh@W(k6I>EH2I1#8oMSGqN+8h^g8PYc1}b!k4V zI=$=BVz8Q~p4Q2*nx@9Pi7=bqIhqP{J36{9xu49AR*iX++)q|VA13y@oZQcv9H%u8ad~+%E~0HydD+w!5nZp9j@K%EXu`d+@!o_=XED^(7=|um*?eovKxOtT2lMUU8R29fp?jQ)1Gn7 zX*c^G3-9K{M{~NSzX(Pgf0uk3oE)6@kXUvjN#&m#D?4kxKay0ANHXH#A+0HIofIP$ dFj=Y*^G%j)#7vWA88O3T*+xt?S-uf-Ocso9pPv8# delta 894 zcmV-^1A+Y93i1jZQb|TeY6SoQS4BclR!}%t3IG5AFaQ7mM*sjvu^iR`e|rM}053W(Rw)W#VPlk9Idk^kV7jNgt^ zYGe$j_Hx+ibYgWnQaaKMfAZ2v4>d$f4|+wRuR-l#oA4w%G(yq=NMwpA8axsT77CqptAplVbs1PFr0LYdk+qA7Zwr$(C zZQIthH9mf0?LFqWzV{`f{|qEaYO;liF?$>?PXGV_0000000000ldJ=aVBF$?OYX_E2Z(n~C5fKTl`1bntbZMYA z(dc{;32C`?gUc^OL_|bHL_|WL?#1$8U2a-Jgi}p?eoOzv%FP!M5fPV)FE=X_{VnYN{r=Imy+g(PJ;`=@*>7Mh6!mN)5y7i$qI%?XEe_jtK1#TsI=!1sZ zw#SG1;2#Y?3{S1w^=_fR1jBIDCO?EJ)xNv&z|i!2o^Ill! zxi2rZ%AcS7H>ZSNs%z?>G`jcSoep}bGG*LpbnL%94GclGspn9mIsg5spogkc*sMmq z{u|W6AgWJ=JsMR!fAbY3^ihZDS-D2(YrcC_!tOnX%)FMaQOv-{@6h`W#Hb8F>9xJC zi*-gKddOZw(OO%xX+3Smsr^yqk?nL;8Sq)ks@5mV>8Ul^#j$nV+fDZ!j{dP}Bgpj` zIKPc1XE&TRZKLTd3y0ix{>8cWyv@jJ|}OqH?BH;gJ)i84{ zi`Y1J)$v#^5a8f!3w+YRz!1@wvpVcrarx1$&+OeEeE3v!PJWWhm-vad-MmbRf0ldgo77r=>+EYFr-6aP>6MdJJSU-|x-ip-`}gwMu1~mfv7P<* zCsz=o_F?xr#hq^JkM6jrI%i>(%6apnKAXL5jK6y1`5pCX_qM72>e1Jov}}3h@+B|N z%nwnnjQ5e_UhsL(lbQ4F*RN&reCc%S_}{zR@4iVteDO`do3%nGZ*QCa(ph_Zjk)ip utffz{Z!C>o8Ex|>ZQ+yo&3V#OOO{^qJ+*84+3i#EgST(cF7ExRzzF~XYo5da delta 381 zcmdnQ_Jd6($kWZOfSG|I+|?-{EWjdyi-Cc`0EpdzXrs(E#{5P`1_pii1A+qL3pFM! zNt>p^5ZmEo^xpf%jQzd;ls&uVSUfW}zW(1n^L|B{ZQ3NIU*}KcO1s~xy0S&Z*neW9 z#>5Hy^~>7LJtwJPpgS^tuVwD3tuMVVcTMwO{M+q*pJsh`_xOGD>u;y@l)A2swLZ5l zh|VlG+}7_YZKYH!nEZRjo-5zh8Ax7tQOisUQfsrC-g;`4+9pry$)By%TTgv_u=Dr> zi?=?0uVn7L4_UXpIX&z4YxmoUVQSxhmp%(`z4LN$%*wJ~B446s#+-ZA(p4H++lh-s|{WN_L;vVY%+VS0}x<4~?rl9j{v+ X|C=KzyzaY=Q03ag6Y_6yN-zKbuUf5P diff --git a/assets/image/3x/bs_store_info_logo.webp b/assets/image/3x/bs_store_info_logo.webp deleted file mode 100644 index 698b649db2e2331c22b35f002b4875e3cbdbfa11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmWIYbaSg83vPIG% zYz+`Q3BtAkvCB&eN`PttKxjZ2ZOLAJya&xh|FZsDbFvH;kTf>58rRE6<0SxS{4GpTEo3d2rKX}Jq zUct8a|69fH_Yyv=@Azk2aNA?z^zSnsa>D#ZJ$jOgCkFay``gj~|J7CRo|f$nExR>0 z%ret=?`^H{y=L0qL*GrimE*gr$Ncu2^Q+H%yVWLRA6{vfC23&czv@xs{+o|{=e}-D zd;Qp|Kl|*q__is$H!{j*TshjDHhrqztX^%~lASZd?_R1uZ)I0+|8MV$)Y^UicfbGt nKed1Vy85?u_ueng^qo~^ShdQ-f3aTM;!MX{lRx!;d|4O(Dna4> diff --git a/assets/image/3x/bus_code_save.webp b/assets/image/3x/bus_code_save.webp new file mode 100644 index 0000000000000000000000000000000000000000..8a97131f0ab32bd436ab03bc42765eae49ff1c8b GIT binary patch literal 1012 zcmWIYbaQ*d%)k)t>J$(bU=hK^z`$St#MTT9CJYRo&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(39n0wkHz(ij*%EoWfhjbvaDzQDl16%CdH5;)wZ0F;se zx+@9lk@)H8Gaq{Yd+Z9FO?5}wm$)*`QmkJs`H9GRYew*3lf=MrhF4ni^-Zo>KRFc2j-eZ!ACl~>}1ZV$Meyr6Z z;KZQ_Bv!az?pl{r@Nq8_FmxCgR>c2*^;?N;?&{&Btpb7A6VD8; zwapf+O^*Bh@UqdWZ!ZnzY4T28{@$>{KKFUj&13nS|K_Enyg2xH)532b6*}*p{XA#S z)%CC5E}0uH$!5P=>exS?O{-7+yPH(&*}eO3h-+8U=X-~LO_KW-rFvz}_gzg_v)4}$ z%Db;8w*7Wwh>2fI+57k9(N9Ho+}8bl`LAT+?QOZJh!^Zd45ISiqsYM3&z|PQea&CC KG^gk;I|BftpGkKB literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_bhy.webp b/assets/image/3x/bus_home_bhy.webp new file mode 100644 index 0000000000000000000000000000000000000000..24f8f1803abf5bc3e2b3487d5f0b9f785b54c02e GIT binary patch literal 1826 zcmchVYcQKx7{`yTQmoYr%WP3Cwr&yHt;nKIRehGJLTg9>#Eq9iVfeZ%bNhwe^4?Cf*q{Lk+^&wt)?dogGyr*Gr| z@Nl$u#kyLZQUm~)K^+BvEdXc-2iMm!&=knLmZ~gNB7~76FerPSQ=X@F95(QjQ`M$&klY z$`L0q4iNi8Y!LJj`+dZCVuaLx3-TZcp^?(Hq#-@smjPk!C!lc$)HMMKV4&-fxJ0C3c0 zm7TclMRWqE88JStQhBbKEc#J7(x^Q_v01Z?E@PRZ_Y&KRh;yOJ#ol9O%^pcr!}&@2 z?&ABfYBLMk$H7tjVJBHfEWh9f*-GKtnZd>~LSLC-`^48foBEZbZJE)O=$8c?j{K{( zYN|xJJ8yPY1vQ%^UZXPN5M+i8-kCwG7K??jF^U~ClCd7Y{*KEN(;128591(Yz05C4 zonRj@S#SRK`tidJM#J$~3*D04=Pc3a-^Nnpv|RqoEYLQ8FcFK!Eb5=XXC%q`qha@> zF4nP-U0i!zbRrY)c5SgBYgnnc!^pe$`(8a%$wU1F%!nJtJ0;|3o*~Py&Pm~JnUU$d zDGiRyRmPPcJrV70BA^kklTS40`&3;^QazhCw~hE>s4O2ota!d5{y>u5u&UzrMn%J8 z8VH^2FE9qRLyEozS%=ch(nP9n%@DGeuek35JFZ?$-VYoSil?0C=!Cv#3_t zGd6gIXm(R!rcd-lVP@%BrZ_1|tHz$nd(^TlW>sb4`97!ly-v1suPs&@+~GFS%=c-t zFfBWrzhg}SV)^$(dg=^0E5`D6;|p$VSl%T*VM>swKTV_2b3%*Vkzz4^zLyDCv($e6 z>`8imuvbrDCu8~4?UmM!xp5_|sXTS!e&OgbMoRj<_36A?YQRa`x|Gz})AoE@|CpXI zb;MWt-+n+@%H%-^;%A zRdI%rWKBKuF%#y<(XM;+#CU!RE4T09;8I7!TxX;3=3s>^QsQRQ{JeKfw5P>#)-ra4 zRXFLVxinBXT&+IslrhE|;ahrt$Sj;(0xbG{lY9C%qIRS;-aDgWIY+5$*v{L)=lOiM2cmW- zV&S&9hrP1i;@a0+v{9TUIF+T-%m@1S!GCEKT=R1hwt$3Z^s9T+pc|N!F{7;iXCS@8TES{E literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_cz.webp b/assets/image/3x/bus_home_cz.webp new file mode 100644 index 0000000000000000000000000000000000000000..bcef60336a4c82ad3737119c4776b8fa3557bb36 GIT binary patch literal 1356 zcmWIYbaQiIWnc(*bqWXzu!!JdU|=u+Vn+rB3kC*HXXk(uj6f~};|UPS0+h$ zTO=LA)&Q}SAZ!~DyS${J1gIte#4ZX6at5+ffNYI)Bz6)KJGr0;q`n8J#wItX6l50& zfPBZ3nim=jq&a|ChM|}th{2t~3FLnu9|-an0R!tR0|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^K&1_pgc20nq~kIXjZnp=k7bMq2i z$!3~Z@3wGW7DuPXfzNT$c}cg+rq;gu-}24+fYUi91BX_X90exkEBt~bmgyFK*|*Ck z70V}-%~;zK&@L(*wSm#S=giI1J94E@I(l20eZCL$fceeeH@-}HU1+;sd&R`>uidJp zfBv-lDOUWZV&Gx;Oyf4=1Sx8c>Rfb|_e&))yI^S_It>|?LE z6y=>~#FUJlPI|Om;AW8V@2agvUjLo4wlhv>Wlx&Bpha@o@jK6~1$A3K$_H@2?hBQe zX|$v6&iC4l8STeJicT|ezL~ZpF@-Plfc}zQ{9m)2SADKmEq(Wtfgx$ewAgivV-8Hn z;{SSTUF9hYYZZOF#**9Ht}V0L;mo`JLi6t3&U=rB7v1~sYjt9}xA2pHJumE;x93W) z-0r?Wn)8yZqxb6Bc{g6(Z-4ubqnr1}`~I0vAyaG*VNlfcL=|~`EjR|pybXXm3hw|FUfzs@}+Rqz0W?+{@k5;y*k-irYiBZ z#pS<$cQ3v$=P}=we^1iZ?3O)T|Kq)Hd6&iQD!rQ2s2;KCcfID~R_yImV4uglDK&A)%D^BUS0Vwc5`Yk6kOhLb>-`glX~~t`M0lK zwpi=Wc}3&bmGhog&f6}$&8omQ?NXs(WL*^m6mi{|{W@^okMln!yKAR~N#?e0ob9wQ zKtqJ9HR#5wCslWPj=FyL(3F9Q(I~ObG^FKy%%5*boNY^_w;@5 zfA71mboenC9A4)RR3D->^;Y}L+ADF*3LH%e&;HGx2?u`{)wCbhy*JILzHWV9+Sk3i mRgUx5C8RkTzgyp6ZR0JJK4s^RNh%BP740*R_nFqdQw{)moaBQ5 literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_czjl.webp b/assets/image/3x/bus_home_czjl.webp new file mode 100644 index 0000000000000000000000000000000000000000..c56e0e656aaca7316e7c0a9abfc83772fac074a5 GIT binary patch literal 980 zcmWIYbaOky%)k)t>J$(bU=hK^z`$St#1;$;jtmT*&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyC_85ksPA;eS` zFfj19FfeR8j}SwINkL*!BG@<I zUHL$m&XB{9%AmmD$&km8%%BHk837~JkiiTX!#?*I85r~}90UZeA6${E;<;|#_n>GW z?%d3~uFZieo)cHiW{~wb_@AA7#*N<@Y!g*XrHnQSwhQ}+UF=q2vmBwz~zINB^?dN7c+iv?z@%87r?5756?pJ@||LNIv_GgmF?Emu{(%1ZZ ze4tlZTH3Tm^@)4=lYgy-96wC`)|`C5txKh2j*_SlN21q^E|%?#3m6#$+=_U)WfJD^ zRq)=Hdo{~U;OO1NcHVqs zU_a}Ei~ffH(M$Fp*#dwtpZ RE*4xZVbSnu>v9~ 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_hygl.webp b/assets/image/3x/bus_home_hygl.webp new file mode 100644 index 0000000000000000000000000000000000000000..d15a0507b64273ebca20a67080c7c99fd6109a57 GIT binary patch literal 4600 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 MPi+2D+r|(628;clO#lD@ literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_jrls.webp b/assets/image/3x/bus_home_jrls.webp new file mode 100644 index 0000000000000000000000000000000000000000..c310bce737e93696d97c2d5585172e64476f9752 GIT binary patch literal 2868 zcmb`Jc|4TcAIBf+mZUL-Zpq##$y&^08Dk%!Xfjg>*)^82#9VuRl_iXj>R$U$Vn_{U zYAlmTM)pDsqAWG`lrl2&d(`XR?jQH}`~CC#o^!s>`+U#m^*rZ%&-af9V`*-#vK;`< zm>JvRY>%B41^_?<97f-}rHP4cs{l9!1X?%zW^l-X1f2ECw{ z7XW-L0e~I$03g;40K$&n*Fg6l_9h1|NrC$!fXy5513Upaz!C@m+yOO^j)0e{3BbV{ zwnlCP0CginD0D}tJee=RsG+H5I{>=gOno{hVV{$Y%rzOWC;TbDjWM3zjAxHr*c2F6|pZ95sm?sH*Hy_xLwY- z+ex$4O*}-}{iv_*U%1tYc&PP#*&A%fcS79^o8b|AYtkNFXn^&UI+^;RcVCyDfYrr3+? zIPC3v8>VxbxW;BG%DWlYM_eP9TAC&$3yyW*_c4n4$Yoyq;Pl^S%$y~D7hl4Ml2c3_ z5ayWDRTNTmzivY8@lE5d?%t3QCviZYHF~>K(oS1})_%hXf3u;+G5umWUMYx%Uz~gM zYmLk7xmC?^VRsUBwQZ@gKa6qK8Seh6+U^_{;^BGsKu`so$8&#`@XTz)+&as|vjSIt zULwx0nW7>9P=8Z!_KN>7!m25eJK}UnmP`)csd>kh%4zCbNAcp2$#*`kX4w5ACf|GQ1P$ z6bh=u^`jWv)t3__Bm1UTEKAnZW!Xw~$SJ=Xr%FV)SUF&IW!P9S-cSi+X3()p5CR-(S`G|A!~!a5*2R4EuTG zu$h$eyM42m%j;Fd&|9(9U1=sSmOb6yr&>xX?xo(%f_`Aa4^*{0KBj9xO!7ZC{W3fG zg6Jz~M};KMtFQa9Rfs!k6Js@XleR-0cLo!_bTunzHzhjQF%YMy(qm%rdUPbA^E5JI z6+LZ}Ihd-b(A&YzM(4%hId-#XZ4~44Gh@AlCi^)~XQxNr2Mz?Ghw!T6VRElu8nah> zTNLBf=X}>J8`t?58#&=qJ6kes6@5JMkLIeghb3O)6YkFyeVFFzF5mGjp%DIOmUuHI z1lVZC5o#!bKr5@RF1I+iZU1mOk4AXz%_w>?#dv4wvRPb@rM|n%uB+r69sXQQesB5} z&#b^bpOHdgoYuT&n8)D{j`Zs}aFK1)QLh`f@DaL3k7~3@!iToDR8Dp#Y4lFfira)H zI!oAMZcL2qxM=|gU3P~w&(($a#n!>nisy6glHO~PkD;cvBup*i({D;DTytd%<;M`2 z%MS_XzDysEY?Q8wi9MNOQ?)N4`>0rGHtu9lK#Rb3UgA-!)N2*v!}r+zyy1J4iq_{w zlk%|MG*3Tgzl0$a6B=$6@e4*PBhgakTiPeRhXy%J1{1CZ*JA3|;khn3G5O5Z!ij;A zSUhHv0xNk!#vk``=3}HRa$Zfso6vBG?R;91rIc?<5Fw!NjuZ4^5e5Bnf*#ncaw+-cG=r!!{6R-i{<-}m5MyWX1Nod} zTSEz7Zgoa~Y;_pQdP=(J)78QlNT+fvtP;{Wt%DFnh?a?npqsfWx3EnCPIF$ljAirY zgawrAma&PEGgX2J-f-+99Tgmq|T;DZA&weUZsZxrM zAH3aRW1X}||DL2l6hA5L`2sVyPIATZ`gYf#wyXFD&f_s}dgq$H2MvZG@&JE`mEC z7mZTBgf)Jw$(y08iC-+Fl$G{}XKCNm4_e4=*5j`(cV*|-dq7w&VQM*Gt~W;u_6eQB zn!_CMnyt!?uo4n7>gY-pT_%$5cO7mgYhkXKeudoQ&tE{R>dW?AoOMWvFIT1qKGEr* z2HH|sUROw`$4Ivy2A0R`?qn5|!!Icbv?`y1rC*ouHQ+tnYH^9`-Pb$K_iv|j6i`96w?X?OCjTj@jd cGKnr&t$JcxS)4@+y}W!>`b4%e8~oS!H(xE!djJ3c literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_rxbd.webp b/assets/image/3x/bus_home_rxbd.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6c4c76c0b9659b66fd8654c4c9426ce2a7aa880 GIT binary patch literal 4276 zcmbVObyyTi*B=_C$t(SOw#*3tOi+!4rsW&Gd9 z8!)(&Ifk-}sqBuJ$uVo9#$alTzcJTuZ1y+4`y0DCJ2+!Fn!mB5j+O!j!!Vf3;@_~@ zzhQF+$KU)n7|vZgTbJK+{g&UmBZk}SYGYbLOuYr1fEG{!^1t_w>0<<$3xMPy05~!K z*v#GnP#**U9r_;|do}=MfdJGE{A2s)OdMV~zW6H~E=FS`5CH5I0zd)h(~m`fD`;+Pv&N09;`AR|XbPU6CvdyS$RPRg60X9iRJS<^IC;f zg)p0G^rNQv3c;??UeWbK7)c+~q?}e>s@OhFRTx@6GOdv-N%t9i<9gF@x~|v7>E68T zo~?)xgJ89`FsD+bjsA=F;bsym?sDD<>2Se91UYdEJwaKNO&N9-+qTnnPQCrM)pf&d*W~=)7$jrZi|x3c>Mgmx;r~eMhuQmoN`TWcXQ9)? ziZrF+X3OvgqDngMFn--fH{_53G1>aV65llPcM4jmbkns~+WI=HymmtykJK3dGX@x3 z+Z@_k|FS(MFA zi9VPbfu!m{?P*voDglXc%%=r_s+vf;}Q0J#~QD;i(dP<0#&DL}SWV zVTSqA3^6yj^vmxt66pH|CFnvw8S;CaTEx0P8k+jLzj2=HX5GJjT}w4UU$nC`KVNQO zuOSyr&$0j*FK`&i<#2AK^W7w0xcT;b-{P-d=f}L;Gcp2G?Q=PolYRIq)VtH~ zVv3eT53IkAiVmfXr4j`3^byBZSp_9% zl1#!_f4@~&f5Ey{C7S-)>*}N9w_N)4E7{D3mz{WX+a~+UJ*+xscQqfe2Lds%kRG2@ z!}?O9>ddRjfhCYKo(j%vm7Tzm2(g0feCS%6Q}*H z@cZ6ZL0R-;zuFz*$f*hCkcx=e_fbb5p6z6cfo`AFCfS_D6x$k9NUxMWU+QPIyuJXT zz!*O~xL%xgz1m~h`jY9fpsFm6lJPS^0UG*-nKAeFp4(#L1iLm8vC5`|Ee`e^QuXyc zrQQLXN3I@+9X>RLh6I<~yZH!_tgwx)s(vi>8V{EJhsqIuRByNzuQ6p$Phwi`^EH@m zGb;ME;nTeI{5?mu;D-*jkOB=e3xD*j1iIWnNsXXo((_#T22F1dT zHvblZuxWwchbq=?)eg@U>4j1Of3|7>OAe{*RBG{-AwbBtIG^pm?`DNUi@BuaYjIidfTruaPBvPTyZ5&1PN$Al^V8`I z3Z4ypwjgxF*2*jk7NmZ;)Xu7LS$W2TN-L!E@KgJKOfp($OL>o6dW16zi?)y+n@Q-&G^Rj48b2dLc@w0S{c|}^3 zDjFb0i8@^rYgKggw}n6lxp`OXhnP}7B^IVJbu4U39UUIeDXZ63D4}a_pxGLcKJJm% zqiz#d_*F|*se>CWehJZW&9s{1z9V%K9pdN)$U`Vo28V(BPMdE7!~O1s?vXyD5dC7L z$px%TQMBBzN;*p1o+u1fT0fAQkiU=pj-M4T4h}t1wqe)Oi(?FFy828zKLjg4d|w(R zbw52>=J_g}O}O_(hS_yy@Ln6mLgedCB7-mv?bXy_YW`2GA^YYFgfpNDFPu*QatskP zM&w6Wc7HoD1(VSi(!T@{_h+u~^z`Ai*U%@frU}DoDtXi}X**#>T=G?tOvB!{N6|u( zWI2Wjw1C&_p-Q@+qU277Z%WfTvi#5G_N#jZr96X84PFD8$nHo5X!({Ti~Z)jIsTjS zeX=3;Oj?$oPuozSVb0V16R}GH-7t(oNrrUt`=QY7`SuNS{14MFX+-G~P{m69sm`|STxSGIXpfW?>W5BvwaGEU;C;XO`?%g#e zlwVac`C&H^*Q<%q7{y#2x8zyLck_=U^l3MlE9Yz6UHr8|3BqBN+{Gwbmh~}byJvug zydgUq@toar;mip6)FZU17B=K)Z`hJ_HQXg+fq5n3Qc=lIqNF5dyl>Cuu1I3(%;8MT zdop%0s3=;R@{CxY#IoVXdlj2R$yq<@Js7LCuocKiC)REvE)zF{R2i;);Z^F;hM+ku zu|XmC4b?Fn9k&o12u)Y{`+Md@moZWVlqjHefA+p$#g!X^rA1N7cnfz4Kx;5DUv`R+Pad{eb0%FHG$?8j0%r)pOE3ymiM@0>4?&qzp6otD@~n7${Re+A0Wir_|DD&kVvkBGLA^=_ z=k)XHJiq5LikawoivIZNxNyY5WIeqt*9J;a&v<_~U?TeRHnb$o-q5Scw2_(oYSCQwvJ-bwx<%Fdw3~CZ_)b6DRk5{= zKar-jZMY}g+fLOOb-g3|!w!?=uy8HPM)S&9jiD4d+fdjT$90XQe{R>~;oG0({FsH& z48s~TlFM*C4My6+BYNHs>iXS;xHL8Kbp0Ow0!PVbwXa5UtX97I=(^lgrN_iUAz2yi zNY+&8E47TYL-^}x+r2^Z^Zu<0d%aob+tw8F=L%MewJEk4WwQ;7pXYpi0;)%tXwO$r zVFaZ~kVG0{Z@CZ8EywuDne`n&ezD z@Moyp@`YuC6laK&)saR|YzLW2@}F&P>FVz|!OcGs*RN*Iyc|@F)1V-I&H1y{1i}#y_jB#6wsH3Q?>Dhuok&$9gXqkP)L(A>wGm`Cmo2YKyk!phM*q}>!Wd|p z>q)uSA8Q9|jTy7%t!`M`&iVU3yX8Su9$}5Gj>kjwB;f=IWlH2j?oROE-yHZ>miO$I zi)LM93?VF#MU_u0md2Sk1=`zs+k=a@+j^+1o02y1v7{%LC7-9>JCr(7qEZOs8=L+lYhY~Mu9Nl8~swcih!gP3ujyT@B`{juc7 zEbCHTHsmm}J@;hNj_mH;3^HW}Q?gmV0CG8h*)!D>Lzj38ai0s<4iqxWc;#@P79MUa zZn)I?RG%gGc}>Lnl?NN-ylSm_Vq&5{b#=3IT>^GUt&ob6ca z{&cCKuXyy`ZGCUPUBAX-9x+76 zu^sph(h%~zI+aDs=l%$4_AEnc1zcZ|ejbhJW~NcyG7SIb&V&#;YW&YEkW z%)^=^(w43&p}UV2lD2x2qMHXteXP!xrf7M~)lh$u`^wDu6WHgh{oA2PB--hZ~U|Fs-sl4#3r1c*cB-P12N1Z~n(?nnBi%jk3 VzE73a59tL!>fa?B#eE-aemyM6jU$27_ERmxl09$zgP@4h3FaQ9h z`Cl=D`G5KbBZSxq{qiIfC*TGg01RjX4`2tb5|B7yQLh0>!V2rKQ3D{V3+T>M-{;Oe zg>+T97rxB)ZH!N3;lOY+o$_BL?n>Lqqn_?NZq4E&d$gNSE2mjksHJapo(2)`K5>6y zZTmzWK`}E!94XT2e=+stJhvC*8+5Z5{|MWpU;1jT zUBbRN?9##cNTngxQp=t=I=>IveesR&$DH*yaQBH#N&OB`t;{xqv8{s4+To11@=_r$IhH#xt>ka1J;!J?E7O?~DB2ZCC#z4avv z+lx#-|JL^Z#Kb)N9E44rSv7gCp$GxEBvctA2g$#63wN*aUERWL`$ov5@0Wx-bpCpL z%;_}efd{2Nv1^Fn{f^?F@)q04qF3q)@Ib6o$@G$Wx!zuH)KOXgxz)YxJ5t*ydyN;q zXgoO?#yhepjn;0z+)c4~2x-pS9m7TfDdOf!v+a6>(W(7{A9N_5&89+MfS_%nS(RQ~ zg_J+pX@77rsLG{a#0h&XS}b^zl$>HA?76H>Dnn=F4w*p!6qD`F@v$uksRns6P4VG& zZ|CIU=DQ|t2+T^S*stq)LtO1marn zNpv<1&}2z`$E9X0-;_C&eJYQDCz#ast#NvPQZL=9uglHj3%{H7w8TXeF6_t`F+ihK zo=&E3A?Qqm+<@{48sTm2Z;4zdv4cRu9uJrz?|s0@E>DfPKXA;~d3V$|Kx2I+&y(xL z27{Syoz1~xq9t~*l$$>pJ!-hF1Tds?0W^OoEqK9nwAoQ&-e@LmAY!Y`WhY_lfMbmP z=|5oURIW%=4@2C~|oICge_>_NPSJD;~!b zv#<6IM6Jn^y4}s2kFI0JVDV@SKQrNDfFa?KV4>f3zi<|*12LR$*c`%R!IKYT%cqL@ zZBx)Lq9*TH#hkaIM8s(8Xee`e&CUZU+|tdP##f0h{HZihhTeAEEIrDfnR+x*hl!N` zoM%&e!Sn_x(cz$O2R<>2n~);ewkzH@JGxJrdzz{+;j$j1o>9{NpXw}^O++;lywC=m zJ~oka{246aiSyi;!&MA4{i2ug0uAM!mDp)z+4n*|**Oo{>gl&AiIZb|=<(ob z04cU|EZtfbQ_zzTj;*UE>ym zIH6)|qNMRFKPqBAbGTeHi!yw8eHsc=t9g#aIye08TT8=fcnvbEQx)D9~y z;(fZ=ztKdf+;Uc1FMivZytPwH1z$iXqT0DVE@`**#Vf$bT;-N=1|vCsuxwZDX!1tY@D7e*aJF&I+~s+kICToL16dK z#a|BUp==S!IEl{=%SmpsO~iIgW^rADMojyL3^I|B2WSrFtP$?2{O_}SzJ}7HTZ>Us z=AH$^)nGJr;~fVlXGsHLLu3F{;6+4&Mtb1&Ol~!QizSK0fO!#EuOkwnhK45jPSs=FvJIFHq_*H0txUv|BvvQ!v(}M3e-Gtcb z4Hu*oPDn&UcFun9n5O;4KM{@94BwrfG<8Zgjibuaeo9zw+m34St>B3ryW%Ip%=%AF z_euL3UJ+77fk<$+j>HRhk|31X4CK6|A z{W?cfm0Zqx7-0&bP6zh-wA)f9$?2UF4quim`%Z)=q-AL6qO2iBZ!|){zl&LtJ0BvP9hLjsvh=;KT!98 zqMf*8XiN+xz%O2xs6B7uvmNw)+MD|LcJ;Smq6=YL2mW&C9>|-m?-K82_%1?;Dt0SIxS6sJ zU-lN8WOenJ65OWkzc3WvO;cHg;n!I13z-+cn8#Y5(gAgT1t3Awb)l6_u&inXnsm;s zVOO*2$Dq2=7eRb>NLOEH^Z8lc%b%#7Xr)4vs?2{gUR5EL=|r=P(W!EX1KF%`2N!s* zjd5F2jNT|sER#0Rfdu9mS$)0yYN5*Ao4*#>V|mD3sHY(tu4%clOW@f>oV29pjdfg+ z)&>8#*HeRWN)J1LsF&?IC`jCT3B>2W7v&vgyZW?UcbWy@*K{jSyASfCB{}9DyllF zLDGB?K>|_pk;lvs**D|VDM<#T=OyjqQ!>1-iTJ{cH#Eb>TgXccBS5?VCy28i@owrR_i{chco>^ko3*M!iq1h=yg%4OuEj)!ikv z)&xo&WNhyyldx;KK)H-@MEg`KzsL@z5~3tBs1Y{K8I^cBo+Zwe>Rq@1r~`y_^xj8TobkQUy*1)Q$Ix^scf;|PvdULi`3Jo@>)||$c@LlVK&pP6 zvP@mZhP<9D+cIAhEnKipS$mEnN!+CW`f6=bE(li^R9Ce4Cfx=A50Sp^i?u{LT}NGS zCEJ8PGf$f=6xW|%$cOB@rJU7-j-}jq>}74g#Ct6G*co(IWNBMeudL=rIG`;YBpk{@ zR!bBSEK;dIX}ur%vJmzwBFTCD0_lCKkMY|btzQlYb4*97R~tox_VoL4EQ$C=Wutl5 zGNjU)N<wPy8wX*4L(!h4? z%Myj;uhVADhcSOGvIf+Adv24Zk%frUwY~G>9KSqZPo5d1ta-^i@I$tXsu;WaZP!?S zQ3yKl_P(uN(@6oB?nu9Lgtm%IRybvPak&l-jV1ybw{z;$=ZM!vlhkF+&Ad0HfvBP<9~dQOjr1W225iz{Mc`~ zwIx%UoDYsQk#M6~@7MIR(N4*f3cZk$4W=1S88zE&FC~=A=t&~0$_yhIFLJY?HF&%* z57vlc`3sf>Oo?jxuo;kCAJW|h73gC;Ef@gyR3u6e{y+8PzVnwsUeO6N-dlSn?t=|; z7gR2+Rd%5!XChM(ZO7Ke@ihfz%!j5goG!sR2WzteYjK<*T6t6yc^AyU z*|jTt=n~J5EQmRrY#Q=6(tr92jKVUZnz z;e}05s$r2tmOzg!Bs?Cg0)?>FqM~3dvQzB*wi^RLwBYn=CMJmn!8EAa4 z08&)MNBV4pRI4K&wU5xBRs8>?()pk$5+r#IIVuv`9O_8}VvUfGY$WBtkBpTvofbiZ zG&m_odg2`*J`b@`$X__{FHDMvlOhRsfK@@hKNr3;;hB0Il&)ITQzgFH!*D^?%BJ`X>*&)wpyZH_%sEmbp{)@4oJ6~uR}M8)@PUC!kE zFg-dLKh-aYXAdt|=2Y;k9S#GcENVxRUg;%%-YE{HL08d9ar; zu=K{&$7Oq`QCKREG&86jWXv=fJMUSq_{1&iz}=&ALu8$`fj(QC3ePOUmwqzx-N_9s z-g9BzJI?RD2ChCPLmlOgb;+Sif%7{OZSzDs)YTIU>sTuhMN}saX2euG-$T(uR<^3o zhE-WgFecDkE3UE)Yi7%}^9)agia?utZe#v7B&sN-zXafsuACd*qH2uC?OBE74a@+e{+rBxRSz6-JUE`^DCi;G7RX8NXt6Bfdi(~eu(4=9yJtizWlOeen_${459 zgQNfZB>!g~*g}78PVe&wewx+!-Ome7ODIquQ}2@lv6gRqJbMW;|B8)Z2lwkj$`@1 zWVG`ly#gfp@vmZ>w~w~EWi4NvB6lw-nMT8cJ9b?`+^L`YasBYzaspEgFbd)db_Yz) z;m|1JX1#4Y-%RaYZrnf=QF-H*f(b>LfVg=51q=RmhTd(O8WcM~Y8^>!PNUiE3w|7a zK!4+3^$l=ey1-PNkd)E*VBCUlZZ9%gDy8-*j~Vg_4QofrJdup!)ptyZ4<8pDL{)jZ zkG(7_95Q4i-IQFO|30YhMo#jYxwqK~H{Iuz46i0p!jVue&Sa+8JNi}H-kr_t_ClxF zs*;yKBqkB3Q(uvvY`Ex0cSR0Ib*|@blxPNeZ*AG{%=jhF0z`*6xcV%uN0)XFVFi6j$ 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!9u#s&jZS{ehxr{xR`ypaqH!WS4AxT3*wKmv!`6o67P zKzHQ>VLC$&Ln?y;gC|2CLo$ONkYxmnR6_DDvYmwd;7)m_eqofTmCvNdG>D7?EdW+qRxfxoctF|kVs0eY!gx7rg zUw=pPF#EY+m;aJGbEQ2q*2$jx*WLjIZ2#}~Sj3ln{x7_w4$SzptKaYa zey{rd-}9XJZchhsZY~O!_n+|3lKu0KZ&R(;GeW{~j>W|K_x}zpkK4bG9U_7t4}82f z|4%{o+O5~3UauGKD?fid3dE6I^!&Zwgnw4dpWfeG>;GA1-TS$6`|AGw`uh5Qzuu*b z@6|o{_3!u2HqXDer?TYh4(>g_-PJwJ_2OMXAm#`2m)zH$X}G|%&6|JcY{{j2t-gr=mOH45RwT^YG|T|P(nZfK|sm? zI*KqulcEkC0vVc=fX;CeP!MquDbn^Aojv%+?B4g@{eAAe-}B1vJpvAkZ59H+(Hw(! zz#BLn1_0~S1h77y7l2B{kT43t0)udJzKjt11Hhp6#XP-3$zSPj zJ)~NH@l`vf`L~MypA`1-4fTd3AE2R3ffk4MBm=RG|5sM$vDa5N=5b^gISkU^c}%e* zm_h6VvAX{^?DY+MlPNrXI;1fs28Z+3;u-IBqP`*aw$K+2jguf05P${1@Xim#kdev& zF!%%jKm8!*RRBQKbpYgM4syz+07#?&(8xN-9sCorC&ly2bOMm)^Ya5>wF&?+X8?}; z4!~iTFEz;hkG&zF(n)AvB&hj=VBiZ700%;VH_(Cz1zqZCpa3q)3vl(KZ1Nlmal{OrwqhxrA_>yVi5H_?xM)JsUtOI{*b@r(R2j{t(3@4ef?enjd0YX zMpo_Zzk2TQU}K>@ljXYC77?er;I;jN#XaK`z$J~Z)SM`aHK4Yx1jTycr-gSpW!!5RKy%JBJU10Qyx^cT;28)50jI~NHmO(W=>AKJ)G7RsV{8L zEfhS<4N8vRU0uD>5IEyDbm1ve!+qO#3tt+OO|$l|SSDJ~FfHYo=~INHTv8@>NZg1< zq}>tIA8ORVKShX5UMEIKHbh7KE|eqvgU#6aC$%<$5%x>}95qa!*HjC7GJziU$(_fO zr|)7OjOigngxRO5as%9XQK650%x(;jmpr5!g4t`_bwq7%zggIyC)`MExviffJS zz{aegdO#MgH;y=x6AQ9E^`J+n{@l*sYPGTh7nMJfM3+fKtDjOcF}yccn$H_|+X6UDOx3;Y4n|(Pzl!tJ$LWN?Wc4Qh7mt)b+kk#uFqp%A()2 zZQfd8pleI^%vOsQUbBk?-zV(Tk<^xJ3IJ)=(SqK&Lv^ei9^g31tSXEqyX@bUD-PTg z!$sV*GO6i3yOVk*ezFV9Qs&aBCu zCieH7YMRoqxfS}T@lwkw`wg=jPH5R@-coz?GJ12qe68IXn&Bce!`sxjs)sEf`px}C zC+#u6rWW1j8fE0`v9{vu^jKCDPnE7XTiV*{UTyIZW7FD+zig%$sq~i-;&p5Iw?8}` z5g>4j^|Sv)CuUwX9hIAdCL;z zMrO{;%JRq7N!E9ote#(_DzF~oxG`iV2EX^Nlg7?t-7%Qw5NQ1+kS|cd_?xa3!^}EADpq<=0i5PHxg5RjARt{{!ys@cWqi8 z@VA*dP@B0sxMATJL$d(6FI@}bvdW!<8AV^ z$%p8?aXHi|J3ntWUpn|7XN!fVsBxGO*Z+%Rro7yAP>k7yTz=$y({ bk3q;!+n|CFOYe-5nyQ4eH0eE`vta)L`u8BE literal 0 HcmV?d00001 diff --git a/assets/image/3x/bus_home_yytj.webp b/assets/image/3x/bus_home_yytj.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f6c1d255924821c5d80e41bff66e4173186a3f2 GIT binary patch literal 2900 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 literal 0 HcmV?d00001 diff --git a/assets/image/bs_mine_clerk.webp b/assets/image/bs_mine_clerk.webp new file mode 100644 index 0000000000000000000000000000000000000000..f97819bee8e8ba757ae76ae17976aff3dc1611b2 GIT binary patch literal 652 zcmWIYbaQKAVqge&bqWXzu!!JdU|=u+VnGH5VFm_IXXk(uj6f~};|UPS0+h$ 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_B*_7WA4O?@l~WZTCmbw@y1i}AoHL!>OSyIUx(`3vFlB83vPIG% 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{fm1K!y5(4lDxv28Tb(f0nlpIkZjm?o4$N p2ZP3zPZK}=5PB=^?DF3|G34%@K7YoBL@T3t9~KCjcDV^M008HXU6KF* literal 0 HcmV?d00001 diff --git a/assets/image/bs_secure.webp b/assets/image/bs_secure.webp index 39203e2e08ce033792fc986b5bf78deac1a9d576..ae342709736978eb2fc51ec94f703c9cc13b2161 100644 GIT binary patch delta 229 zcmdnNx`90T2r^FosxbgD_olKuv^8myyBykn)dyQzl;xz z*nk$oz^OO(h4R07ZdX0$6*IS38lPA>Wl4N8>uK5Y^I?zDnOW=pXP7?U+x}ibQ4-s)F)#oCneAEV delta 237 zcmVrZGnN0&4t38S{3H6Wux;BWz}`uF1poj500000Kr^4xIXAYi z-yTVlB2=i-5kvgxt$N zlV#sXeU|UKWtQ|SX8Vs|t02a2#o;n6i#;ZZe7#ifyM}+)@8qA~i+q@re)*f^3U6KY icOwJCmji_!lT`LDjLv=^u(|V%7Vq)E^tAM$~gxt%& zv+rh0eU@io5=mtF|2#r8;QmVu$ 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_B$=osr)ocQ{ZC#*4*0$>!MFdGjM(2_6qH7s4L$WzEPPa@!BtoMOWXL{lO`-@Yl!002#WhF<^x literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_bhy.webp b/assets/image/bus_home_bhy.webp new file mode 100644 index 0000000000000000000000000000000000000000..765d20347dcee7673acb0842a2ead7061647027f GIT binary patch literal 758 zcmWIYbaQ*h#J~{l>J$(bU=hK^z`$St#NrGLA`A?k&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`m%W zGKi!@*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33t zpu6&cFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou2p0~P9vGq4K0Pf(cDGuM9^L+aPX zZHqi6&5~?V6nXH!S@d6~sL7-&Ii~UU7bEok1e-vGX1Ux6HKoHPnNZ`QBD?2-9Uo(C=ZBaw%=I@Ow^%CNFb1zBl zbdE2r*_M&>du`5?PCe_Dw_nN4&feP1*LS?T?qT5il7;K5*gh9EW*w4yclnu6oz=@7 XyEd=0k}Nr2U%TYt`+uMRD>DE9DHOet literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_cz.webp b/assets/image/bus_home_cz.webp new file mode 100644 index 0000000000000000000000000000000000000000..b13fa089bc079d3b94a58412629978b6ac73a6b3 GIT binary patch literal 740 zcmWIYbaT7I#J~{l>J$(bU=hK^z`$St#G(ugLJSO^&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(39n0wkHz(ij*%EoWfhjbvaDzQDl16%CdH5;)wZ0F;se zx+@ks|jVenA+>rol*t!xK2CYyWawH{Y`y^eJ+RmoKkz=`TqB#@~)fTTfg~zZ^hPY^)J73232e- b+o0I;V*QMnGiUZc7qT;n*s$ 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_Bm$qafxmJu*g4H?XUG3?U>RH!fHz$)PGFd4jmc}+4!pTIFZ0p-2z3V=#v3l%-aeV6dO?X% zkmJ;xX`g=ji83kuT7M$J$(bU=hK^z`$St#3Bp~VhjwP&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`m%` zGKi!@*cu>q5`=97VwaZ`lmOKPfY?PLLC!#S3XrXlj>JwvVkZ|AfzZZ((5Ab{-*y2$O=uqC~K9EI^VeEscTU({cs|-be-p;R_55T+v`TAc4be3P33t zpu6&cFr6WXA(cUa!IL46A(=rB$T9*(sv(0JFou1;0~P9vG_VTXUofFpWrgMX{s&9= z-@=B&MQ2ipT2Z_qbE;&{ z*}$h|n?6N++;LE8+WUDD_hsg;6IYF6I4{3(My)a9n}UO_-#*UeEfDaWr1bTk%;C@S zSAK|B`LHSdTE8t<+O1>xmnYnw%s{6!tGwj3{x)&S;mc=0ATB_o$#0TMX5jK>4h^Yt zAo#uv6t!Sb*1hynpR(=Yn9QfMU(HpysS+n_#<_YzW!rnF|Anj8ZeiaNl(F!h&X?%= dwC8qDovt2SeAg*0ZQIY!e?A=k<@}0~0RXGgxtjn0 literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_goods_ssfx.webp b/assets/image/bus_home_goods_ssfx.webp new file mode 100644 index 0000000000000000000000000000000000000000..a93925986291043df6f476bf0341d3a8deb82295 GIT binary patch literal 826 zcmWIYbaOLeW?%?+bqWXzu!!JdU|=u+Vo3%DF$M-tXXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3?{Q$iSd4*}y7b-?$+6c8YTu(`yBp z+lpJ%S1-tw)@=U5Xz}d$gQgcIti39x-*>!H;LUt1Cu?DOELTPI+}Fe0$9Wh}SPIvC zU$;l5Huj@S%~^qOU*E2CdC&Of?B+q&b`*;UOG%l)RFV`@m5 zbkytIB}R?}N28NYMhz0Tx2<}{5U-b4=&$hmTl}N#pW`_N|Ayb#maA;?GH>&`2`ZkG zR6xX^49*QYlf>GtiJf4}&`L1Yu1-+YZMfVM^U!YF13vz+xCi-JhxPYJ{cPb+zh_J$(bU=hK^z`$St#9|B#5)2HU&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCI zUHL$m&XB{9%AmmD$&km8%%BHk837~JkiiTX!#hnD zPtreI=ZdwLx4xcRw!%tlZeVIWnC0$n+0p7QtH$xqtJi$L<6i%G Zd;7e}--=cVEDCEle7GtoKkBgn0|3%WGZFv* literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_hyyetj.webp b/assets/image/bus_home_hyyetj.webp new file mode 100644 index 0000000000000000000000000000000000000000..1dae2931f31d3b6a8e78f5c9696793549cbf8d87 GIT binary patch literal 836 zcmWIYbaS&|W?%?+bqWXzu!!JdU|=u+VlgoCbaoCn!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{fk(j0_C=VhyYU_ZKKk;(g_2#3;Av->;R8 z3vzESNfu#yu3x*fh%NkrN6=>ejx6yl3R{0!9m`eGfM3sfKLADGigo{gTsqZ70+FrMuB3JFJ4c*JG;Sj%H*0&3lytQ zUe=5_srYkZUkt;Pl=d&|?3VU(6P*C_Dy+de1hx%cl_k? literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_jrls.webp b/assets/image/bus_home_jrls.webp new file mode 100644 index 0000000000000000000000000000000000000000..e2db4ead20808d311a2012dc18901e5e2a3f4ae3 GIT binary patch literal 838 zcmWIYbaS&~W?%?+bqWXzu!!JdU|=u+Vo@;ibaoCn!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{fmPj0_C=q7JMA<&7GfrrP+VG1{pISADwd zpJmXYa`I%&AwE+Lhx!=#85YMj<~r{>736Yi^6Wd$6gfR3%7Slf%bgt>!03BPlHs?{ zp^5)bJxjT3bN$&n$6xA)Q*3SL|Jo8?>-$<*XX>Z<55u+A{>#r_qhwUMwdwyE3E?V`@Z6U9)_8yJ@AuE<-`ijH)wtuu zex~iYQ+oOziZe7!Q}MK8v`AjA624?P=Sg#h>Neh;ay)Fzn>M|ktHYqTuK3)BUuQSp zNL{yXDub9JgT?CBNEyEN!w(BAWWE(L6hAz0WcB+qCmL!`{h$4N^2rpVnLa_M&nSP( zdcR}wiPHS@W%rhxd&akES*BF_1#inDTb;m+2}|aw9A|xAqguOr_VY*Y^jc_ ay|(w?S&n}miC$ 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_BLK?%kbSWEAjgv)aEzY0pWQU+9@cRYkCz z@QM4TBb$9{)y79Py(-@fOYZ%D6=XI4LdUs^Y^f*fn4HvqX~msbf8~CFpGD@UywBIS z7GC?f)<|5UU*JGk*9N8y0W1s-lhgNdKY3}y@hOj$wRW}1dohQe-00BFg^xJb72dJj z{{P;CJ^HFHU*a2Yn|YPhEN%{GIPlnQ(lvgDmoGdgsp#9JzdH2qnErcV_6U_y-MOza z!>%sg!en*H%G3V!cIHchpH6uey}x_S^3ffpS3%D;7~ghubeM%%d&WB)k>2CRFu(7z zad>o$?|q*ILhPISxm30nd#RbOxU07Ep+?|L_ZU6F&n~GRRms88evL~__btu47h3vW zQK5*_S8l&w@>IWnljM)7|GQsS+8L;Zblo_#Zo)EV OlTSZAj6S#$ 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_Bm$qafxmJu*g4H?XUG3+yek%2*9vVm2A|B%9@B^GD-f2tnc zuW^p;w#TG7XBO-!4;0(s;`ndjgvLLq7d$2{+LvzdHz=OvvdQ6XxytOJQ`+mq7yOS& zczR1R?bhsN&+9VlX0g@(+a#Hhydu^3$|lJb$=fyrE;Lff>1bW0YaHCWRy*9T>uQh1 zq%#eQZ&D%~m0KmJ#j`Bl|oY>ou+VKq% zx3{f&<{(pkeFuB`;|ukn_V533tGaxd-*|gl@0ELU+a~XGnxx|S-N6q?PTG8zX~ND9 zNt0;>f&qc2CV9_ET{QmyyTNzO*|%+<_8wSoFW=~&dC=!?_fs}6x0X-5?S~tszjDVJ zx)eHH`eEYcv~n%u#dhJE;0PJASg!d?PgQQ`$@$nQoZ}S zr)>@2mi@@6ym4yyg%vI5_B35qdlY}|XZ+cTmT%8p40*xpY9Xuev|Mcs)2^noY%`Yb sdAg0^)xo{Nf4_%q{byn(m#1RO&fLoNpi=v`&quS;W!qNjd%ku70Kh{Hp#T5? literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_syzl.webp b/assets/image/bus_home_syzl.webp new file mode 100644 index 0000000000000000000000000000000000000000..97bd98209d7b7af32497c1acfd37fc0fefbdf9af GIT binary patch literal 762 zcmWIYbaVT}#J~{l>J$(bU=hK^z`$St#9|B#q6`e4&dvcR7=c^{#uFft1t^u9S5g$@ z?xYYA8KuDffPoPR!5}fYxB$Y!N&;1Vy9QBvSr@Ac{DPb*sl~}aB_DuTr3h#_&`lyh zwn#dJtpQ>uLD)7Rc6mub2~bS{h+PyCD76yiG=MiFvFeykZN(39n0wkHz(ij*%EoWfhjbvaDzQDl16%CdH5;)wZ0F;se zx+@wXIjPl%wuR@&~6~i#&=Jar%cmQ0BZfp-j2+{=pT!D#uS&U3s>rT0oEC zgyyNRTfWcMmRx*WbNy{kPs(nE%4sWB{w_~(Vv6_vx5ZW=vm++iwk)YIn7!2JN6LY| zxeA*W-=6W(S0?Jr4bB+PO>0e>kM#=hm!10;-s%2N`PcdrxwqR+WS0J0Bn0#d1H&)I z-)VPlv6{s7S>E`jS8VnuOTOFeVoB?{#zXfGtm^H%QRbVxe8O)1jjzusCM~$DkbgXA ycgrQ;^3EOK`w^FQT3dp0z@y_E@pQLGXMbAlE#Ms literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_xfjl.webp b/assets/image/bus_home_xfjl.webp new file mode 100644 index 0000000000000000000000000000000000000000..316cabeeeb6c4237368f9059810650e8852a632e GIT binary patch literal 658 zcmWIYbaU%sVqge&bqWXzu!!JdU|=u+Vo?SL5e5cNXXk(uj6f~};|UPS0+h=2?(*InG6iuTNxN6ZXv`} z7BDdIw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}ZzKbQ@C612u4u3vkig+K1)!7+ z&|UdJn9h*HkjkLI;K`83kj$V5WElY?)sVpq7{flZfeQ6S8CV6v9VX;np7Vy~`}Un} zj@u?yxqta5l>cS@f?Sadb`Dpab#bn}Dl1PuO|F>7KCOiD!pV15uf2}!uQzaPdHC@* zlR<`x=P4Nl27U{NgXUsxEJ70+nv!)AKA))NQu?)iL+)+2o1V|550o)?2v1PGwJrDe urn#O*uAP;P8`@YHmSpF8PExVl->c#|>1J6c|9&n1b$6TpsNe6gWdH!LPmMPK literal 0 HcmV?d00001 diff --git a/assets/image/bus_home_xfpm.webp b/assets/image/bus_home_xfpm.webp new file mode 100644 index 0000000000000000000000000000000000000000..92c7003b783b2fe4fe8f0234f4146ae2fff122b6 GIT binary patch literal 784 zcmWIYbaUfiW?%?+bqWXzu!!JdU|=u+Vo3%DQ3eK2XXk(uj6f~};|UPS0+h$ 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_Bm$qafxmJu*g4H?XUG3+DB$iSd4>A)%=zEEJ2%JTOo;}jHa zgM=(LUw05VY4&d7i|h}RvmbOXI`Cb>Wzv<56J{GG9#PbN+}Y1{%OfcH_<0{QI|d!+ znXRwZO?Y|q@N9P;^xPN9Htl{L?PD?RL}A?f7?K0(=MZYU2)% z?R)pz_$IFv{d6UDm2b(qWlt8{WIuW1Jay{fos!atd+y!+ckN%=w*2%>55z*EH=pO+ zuzBmz)m8R6%MVtqG~G4hrS7eh38JxI+|}3G&bhaAN{|vunWk=M{PRmwuNNAxI;7ZU XTj%(?{)yVnuRn5a|2=2?(*InG6iuTNxN6ZXv`} z7BDdIw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}ZzM1xE-)}~MT6yl1P-?;0HtJr z?#c(kbcP&;R0ahGPlh~(WClGT%Lo{$h74xF81~U;WMI%2Ilv;Izi`FGB`eAe+ZfB@ zSL`|X;6}ieZ4;-=eBU&a`QW4dl{)QLHCE-$-X(54anE(%E&FA>B<%VNr9HbA@3oRQ zzWjT{>+4m^80U!iL*XB10| zxORxc+j9~hoa_rK!@mdpvpCH!Sk5Ytd^_xF&Yio8^J;&u|M>Y`wTi6Em-xin+j<+; zyt9gDIFP_2_;D}OiOB!QE0vVQrpjLNY|M43QL%otcDI6~=e@>_c_*gSF76P0F}17Y zl2y~npvn3_dY?{TZkBm=`!{J5xq$0a?Od1C8!#|rc>cbr`;&X~x*EeEmf0UgzPH{z v)%7s=-m=`1Inp09Zp@au%v|Px)`bk7VRCr$PoLy`bRTRhnXQr(ID+XdE(U>SPBtW`bQw5?GXCvr?f*}E^yANU| z@mq|EV8o~oYMRDGAC!O}d^~I=)<7)rK_Ka>XaH?wixks`!iz73NNj5x+nqV)&UUx$ zc6aAvcXnp+_OW~Jx##}w$DDiaxtHL>-*RnpeI3-h4Jcs(EhF#}5Z%hm4FuFP(RIQs zV*ZzbQ6jnw=06!U$lwbKjN}CLU;7hXqm?$FDpVnbT3T14MqN+9LqvQRKsBY+%_(O3 zje%oG=|}rc9y$YnOVepx+EZYSEzu=ZLv0E;2BO=o%_%{G`H}&ObBgz!JJ~r{f~KNH zJpr~N61%U~zz!&Q1c2(5@dfniF!1f9f{yb&@t?|FcUgfoMxxCM=zTD+BcihEcG_@e zW)K}Wz;B%E>Fjk{zL0!b8nsk=;--0^b|Tv9!-%qCp)>P=aq#N{i7&5M30wVMGO&;q z+oTXa0dTWbWj_BtWH4UnOT@n}#SYiNnw!_pPc69NV=%V*J^kzgNKaE7s2Lu4vA6f= znB8(S! z4ShX_PCJ3-2w0;QU8@j|5UAcsB|(*C@TkGqcrMX-!mf?BfeBbD&<&z_c9mC!9P_vi zY_JQ>7O?a*R8CwgBP+Kf#YkfqYwb)=OJHJwC$;WWwXa!LqupH7^oiA0AA+L5gzKO$ zSnzWde+{iT<^G;jhllSi=5iDT7LG*s5$GwWwN|q{gZC$UI@=s?jf4kJ;IFF1DJ@qg z3FnqUj~ChzxYzEEd~^*=>)|IEnktP$4qKH|dbmeMkiVJ$OdW1q+bh|?IkvBDXr!^m}=XbQ@_dh(#LxI8k z3Wc@U9wI#BUDL|1*$-Hv70lQx{I6pmT37yNd85%USY~UOk5f}5CIW@ay=h)~wfYJx z-IRU`YtbPhYAA2hW^23cmc@AWxhUT5_!Pq<|G26u0ICJ%UtsXFt4YisK^bppuw7+k`-9=ok9yFEYqtHi+%;&3Oge$sIaEi zlm3c3uEn4|x#iL9Mmn=M^m@BvDVsu4CIx4C*-Hved;T)*+;-Zz046Us zz}dxyDZfl!oyqgjl$Wz|H`#74X9+#>`rq6kCNG#yF)7Oh(+ppEg?W0US&p!bsJtYf zCSeD0<+7@Pq!-3|HBhjp|uS3*7|&PuT!53$VYz@NA6#<*EfX4&Px`rl yCm)S;0nHq7@>x=s打开相册 NSSpeechRecognitionUsageDescription 是否允许语音识别 + NSPhotoLibraryAddUsageDescription + 请允许App保存图片到相册 UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/lib/business_system/goods/off_shelf/off_shelf_page.dart b/lib/business_system/goods/off_shelf/off_shelf_page.dart index 192c34bb..55134bca 100644 --- a/lib/business_system/goods/off_shelf/off_shelf_page.dart +++ b/lib/business_system/goods/off_shelf/off_shelf_page.dart @@ -130,6 +130,7 @@ class _OffShelfPage extends State { checkStatus = false; SmartDialog.showToast("商品上架成功", alignment: Alignment.center); } else { + EasyLoading.dismiss(); SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } @@ -155,6 +156,7 @@ class _OffShelfPage extends State { EasyLoading.dismiss(); SmartDialog.showToast("商品删除成功", alignment: Alignment.center); } else { + EasyLoading.dismiss(); SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } diff --git a/lib/business_system/home/cashier/cashier_page.dart b/lib/business_system/home/cashier/cashier_page.dart new file mode 100644 index 00000000..06c14c27 --- /dev/null +++ b/lib/business_system/home/cashier/cashier_page.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.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'; + +class CashierPage extends StatefulWidget { + final Map arguments; + + CashierPage({this.arguments}); + + @override + State createState() { + return _CashierPage(); + } +} + +class _CashierPage extends State { + + @override + void initState() { + super.initState(); + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppBar( + title: "收银", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + 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), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + ) + ], + ), + ); + } +} diff --git a/lib/business_system/home/consumer_ranking_page.dart b/lib/business_system/home/consumer_ranking_page.dart new file mode 100644 index 00000000..87cca153 --- /dev/null +++ b/lib/business_system/home/consumer_ranking_page.dart @@ -0,0 +1,579 @@ +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 'package:shimmer/shimmer.dart'; + +import '../../generated/l10n.dart'; +import '../../retrofit/business_api.dart'; +import '../../retrofit/data/balance_consumption_ranking_list.dart'; +import '../../retrofit/data/base_data.dart'; +import '../../utils/business_instance.dart'; +import '../../utils/flutter_utils.dart'; +import '../../view_widget/classic_header.dart'; +import '../../view_widget/my_footer.dart'; +import '../../view_widget/no_data_view.dart'; + +class ConsumerRankingPage extends StatefulWidget { + final Map arguments; + + ConsumerRankingPage({this.arguments}); + + @override + State createState() { + return _ConsumerRankingPage(); + } +} + +class _ConsumerRankingPage extends State { + String titleName; + String selectTimeDate = ""; + String selectTimeDateNum = + "${DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now().subtract(Duration(days: 2)))} 至 " + "${DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now())}"; + final TextEditingController editingController = TextEditingController(); + FocusNode _focusNode = FocusNode(); + bool isKeyBoardShow = false; + final RefreshController refreshController = RefreshController(); + BusinessApiService businessService; + String networkError = ""; + int networkStatus = 0; + List records = []; + int _pageNum = 1; + String total = "0"; + + @override + void initState() { + super.initState(); + titleName = widget?.arguments["titleName"] ?? ""; + _onRefresh(); + } + + ///离开页面记着销毁和清除 + @override + void dispose() { + super.dispose(); + refreshController.dispose(); + _focusNode.unfocus(); + } + + _onRefresh({bool isShowLoad = true}) async { + if (isShowLoad) + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + await queryStoreMoney(); + EasyLoading.dismiss(); + if (refreshController.isRefresh) refreshController.refreshCompleted(); + if (mounted) setState(() {}); + } + + ///查询会员余额统计/消费排名 + queryStoreMoney({nickName,isShow = true}) 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.storeMoney({ + "startTime": titleName == "消费排名" ? selectTimeDateNum.substring(0,19):"", + "endTime": titleName == "消费排名" ? selectTimeDateNum.substring(24,43):"", + "nickName": titleName == "消费排名" ? "" : nickName, + "type":titleName == "消费排名" ? 1:0, + "pageNum": _pageNum, + "pageSize": 10, + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + 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(() {}); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppBar( + title: titleName, + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: networkStatus == -1 + ? noNetwork() + : Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: records.length == 0 ? false : true, + header: MyHeader( + color: Color(0xFF30415B), + ), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + onRefresh: () { + _pageNum = 1; + records.clear(); + _onRefresh(isShowLoad: false); + }, + onLoading: () { + _pageNum++; + _onRefresh(isShowLoad: false); + }, + physics: BouncingScrollPhysics(), + scrollController: ScrollController(), + child: Column( + children: [ + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 16.h), + decoration: BoxDecoration( + color: Colors.white, + ), + child: Column( + children: [ + titleName == "消费排名" + ? timeSelect() + : vipBalanceStatisticsSearch(), + titleName == "消费排名" + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 15.h), + child: Text( + "消费会员数量", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF0D0D0D), + ), + ), + ), + Text( + total, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ], + )), + Expanded( + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 15.h), + child: Text( + "销售金额", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF0D0D0D), + ), + ), + ), + Text( + "12334.00", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ], + )), + ], + ) + : Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 15.h), + child: Text( + "总会员数", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF0D0D0D), + ), + ), + ), + Text( + total, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ], + )), + Expanded( + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 15.h), + child: Text( + "总余额数", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF0D0D0D), + ), + ), + ), + Text( + "12334.00", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ], + )), + ], + ) + ], + ), + ), + Expanded(child: networkStatus == 0 + ? Container( + margin: EdgeInsets.only(bottom: 35.h,top:6.h), + child: ListView.builder( + itemCount: 10, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, position) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () {}, + child: consumerRankingItemSm(), + ); + }, + )) + : ((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), + ) + : Container( + margin: EdgeInsets.only(bottom: 35.h,top:6.h), + child: ListView.builder( + itemCount: records?.length ?? 0, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, position) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () {}, + child: consumerRankingItem( + records[position]), + ); + }, + ), + )),) + ], + ), + ), + ), + ); + } + + ///时间选择 + Widget timeSelect() { + return Container( + color: Colors.white, + child: GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/router/custom_page', + arguments: {"beyondDateRange": "0"}).then((value) { + selectTimeDate = value; + setState((){}); + }); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFFF7F8FA), + borderRadius: BorderRadius.circular(2), + ), + margin: + EdgeInsets.only(left: 18.w, right: 18.w, top: 11.h, bottom: 17.h), + padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 12.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + (selectTimeDate == "" || selectTimeDate == null) + ? "${selectTimeDateNum.substring(0,16)} 至 ${selectTimeDateNum.substring(24,40)}" + : "${selectTimeDate.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "").substring(0,16)} 至" + " ${selectTimeDate.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "").substring(22,38)} ", + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF30415B), + fontWeight: MyFontWeight.regular), + ), + ], + ), + ), + ), + ); + } + + /// 搜索框 + Widget vipBalanceStatisticsSearch() { + return Container( + color: Colors.white, + child: Container( + height: 40.h, + margin: + EdgeInsets.only(left: 18.w, right: 18.w, top: 12.h, bottom: 12.h), + decoration: BoxDecoration( + color: Color(0xFFF7F8FA), + borderRadius: BorderRadius.circular(2), + ), + child: TextField( + focusNode: _focusNode, + textInputAction: TextInputAction.search, + onEditingComplete: () { + FocusScope.of(context).requestFocus(FocusNode()); + queryStoreMoney(nickName: 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, + ), + ), + ), + ); + } + + ///消费排行list + Widget consumerRankingItem(Records records) { + return Container( + padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 16.w), + margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 16.h), + child: Text( + "${records?.name ?? ""}(${records?.phone})", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + color: Color(0xFF0D0D0D), + ), + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "消费:", + style: TextStyle( + color: Color(0xFF666666), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + TextSpan( + text: "¥${records?.money ?? ""}", + style: TextStyle( + color: Color(0xFFFA5151), + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget consumerRankingItemSm() { + return Container( + padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 16.w), + margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 6.h), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(bottom: 16.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 149.w, + height: 20.h, + ), + ), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 42.w, + height: 20.h, + ), + ), Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 60.w, + height: 20.h, + ), + ), + ], + ) + ], + ), + ); + } + + Widget noNetwork() { + return Container( + color: Colors.white, + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + networkError.substring(0, networkError.indexOf(",")), + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF0D0D0D), + fontWeight: MyFontWeight.bold), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: Text( + "请检查网络设置或稍后重试", + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF7A797F), + fontWeight: MyFontWeight.regular), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _onRefresh(); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(15), + ), + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 3.h), + child: Text( + "重试", + style: TextStyle( + fontSize: 14.sp, + color: Colors.white, + fontWeight: MyFontWeight.regular), + )), + ) + ], + ), + ); + } +} diff --git a/lib/business_system/home/vip/add_vip.dart b/lib/business_system/home/vip/add_vip.dart index aec48522..47339663 100644 --- a/lib/business_system/home/vip/add_vip.dart +++ b/lib/business_system/home/vip/add_vip.dart @@ -1,10 +1,18 @@ +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 '../../../generated/l10n.dart'; import '../../../retrofit/business_api.dart'; +import '../../../retrofit/data/add_vip_info.dart'; +import '../../../retrofit/data/base_data.dart'; +import '../../../utils/business_instance.dart'; +import '../../../utils/flutter_utils.dart'; +import '../../../view_widget/settlement_tips_dialog.dart'; class AddVip extends StatefulWidget { final Map arguments; @@ -23,6 +31,9 @@ class _AddVip extends State { bool isKeyBoardShow = false; FocusNode _focusNode = FocusNode(); BusinessApiService businessService; + AddVipInfo addVipInfo; + String networkError = ""; + int networkStatus = 0; @override void initState() { @@ -50,6 +61,48 @@ class _AddVip extends State { super.dispose(); } + ///新增会员接口 + addMember(String mobile,String nickName) 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.createMemberSourceByMobile(mobile,nickName).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {});}); + if (baseData != null && baseData.isSuccess) { + addVipInfo = baseData.data; + Navigator.of(context).pop(); + SmartDialog.show( + widget: SettlementTips( + () {}, + text: "会员新增成功,请前往会员管理查询会员新增情况", + color: Color(0xFF30415B), + )); + networkStatus = 1; + }else{ + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.msg, + color: Color(0xFF30415B), + )); + networkStatus = 1; + } + } finally { + EasyLoading.dismiss(); + setState(() {}); + } + } + @override Widget build(BuildContext context) { return GestureDetector( @@ -67,7 +120,7 @@ class _AddVip extends State { leadingColor: Colors.black, brightness: Brightness.dark, ), - body: Container( + body:networkStatus == -1?noNetwork():Container( margin: EdgeInsets.only(top: 24.h, left: 16.w, right: 16.w), child: Column( children: [ @@ -194,7 +247,7 @@ class _AddVip extends State { alignment: Alignment.center); return; } else { - print("新增成功"); + addMember(vipPhoneController?.text ?? "",vipNameController?.text ?? ""); } }, child: Container( @@ -222,4 +275,51 @@ class _AddVip extends State { ), ); } + + Widget noNetwork() { + return Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + networkError.substring(0, networkError.indexOf(",")), + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF0D0D0D), + fontWeight: MyFontWeight.bold), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: Text( + "请检查网络设置或稍后重试", + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF7A797F), + fontWeight: MyFontWeight.regular), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + addMember(vipPhoneController?.text ?? "",vipNameController?.text ?? ""); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(15), + ), + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 3.h), + child: Text( + "重试", + style: TextStyle( + fontSize: 14.sp, + color: Colors.white, + fontWeight: MyFontWeight.regular), + )), + ) + ], + ), + ); + } } diff --git a/lib/business_system/home/vip/bus_vip_list.dart b/lib/business_system/home/vip/bus_vip_list.dart index 649999ca..4552f0c5 100644 --- a/lib/business_system/home/vip/bus_vip_list.dart +++ b/lib/business_system/home/vip/bus_vip_list.dart @@ -196,7 +196,7 @@ class _BusVipList extends State { color: Color(0xFF30415B), borderRadius: BorderRadius.circular(4), ), - padding: EdgeInsets.symmetric(horizontal: 14.w,vertical: 5..h), + padding: EdgeInsets.symmetric(horizontal: 14.w,vertical: 5.h), margin: EdgeInsets.only(right: 8.w), child:Text( "会员充值", diff --git a/lib/business_system/home/vip/pay_success_page.dart b/lib/business_system/home/vip/pay_success_page.dart new file mode 100644 index 00000000..5dbbf9d6 --- /dev/null +++ b/lib/business_system/home/vip/pay_success_page.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.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'; + +class PaySuccessPage extends StatefulWidget { + final Map arguments; + + PaySuccessPage({this.arguments}); + + @override + State createState() { + return _PaySuccessPage(); + } +} + +class _PaySuccessPage extends State { + + @override + void initState() { + super.initState(); + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppBar( + title: "收银成功", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + 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), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + child: Column( + children: [ + Image.asset( + "assets/image/bus_pay_success_logo.png", + width: 76.h, + height: 76.h, + ), + Padding(padding: EdgeInsets.only(top:16.h,), + child:Text( + "收银成功", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 18.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Container( + width: double.infinity, + margin: EdgeInsets.only(left:17.w,right: 16.w,top:11.h,bottom:17.h), + child: Flex( + children: List.generate(70, (_) { + return SizedBox( + width: 2.w, + height: 1.h, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFFEBECEF)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + Padding(padding:EdgeInsets.only(left: 24.w,right: 24.w,bottom: 20.h), + child:Row( + children: [ + Expanded(child:Text( + "订单编号", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Text( + widget?.arguments["rechargeId"] ?? "", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ) + ], + )), + Padding(padding:EdgeInsets.only(left: 24.w,right: 24.w,bottom: 20.h), + child:Row( + children: [ + Expanded(child:Text( + "支付金额", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Text( + "¥${widget?.arguments["rechargeMoney"] ?? ""}", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ) + ], + )), + Padding(padding:EdgeInsets.only(left: 24.w,right: 24.w,bottom: 20.h), + child:Row( + children: [ + Expanded(child:Text( + "支付时间", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Text( + DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now()), + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ) + ], + )), + Padding(padding:EdgeInsets.only(left: 24.w,right: 24.w), + child:Row( + children: [ + Expanded(child:Text( + "支付方式", + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Text( + widget.arguments["payIndex"] == 1 ? "现金":(widget.arguments["payIndex"] == 2?"微信支付":"支付宝支付"), + style: TextStyle( + color: Color(0xFF0D0D0D), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ) + ], + )), + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/business_system/home/vip/vip_recharge_page.dart b/lib/business_system/home/vip/vip_recharge_page.dart index 31735b50..9ecdb0f0 100644 --- a/lib/business_system/home/vip/vip_recharge_page.dart +++ b/lib/business_system/home/vip/vip_recharge_page.dart @@ -1,13 +1,26 @@ +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:shimmer/shimmer.dart'; import '../../../generated/l10n.dart'; import '../../../retrofit/business_api.dart'; +import '../../../retrofit/data/base_data.dart'; +import '../../../retrofit/data/bus_recharge_list.dart'; +import '../../../retrofit/data/phone_query_member_info.dart'; +import '../../../utils/business_instance.dart'; +import '../../../utils/flutter_utils.dart'; import '../../../utils/font_weight.dart'; +import '../../../view_widget/border_text.dart'; import '../../../view_widget/classic_header.dart'; import '../../../view_widget/my_footer.dart'; +import '../../../view_widget/no_data_view.dart'; +import '../../../view_widget/round_button.dart'; +import '../../../view_widget/settlement_tips_dialog.dart'; class VipRechargePage extends StatefulWidget { final Map arguments; @@ -23,11 +36,17 @@ class VipRechargePage extends StatefulWidget { class _VipRechargePage extends State { BusinessApiService businessService; final TextEditingController vipPhoneController = TextEditingController(); - final RefreshController refreshController = RefreshController(); + final RefreshController _refreshController = RefreshController(); bool isKeyBoardShow = false; FocusNode _focusNode = FocusNode(); int selectIndex = 0; - int payIndex = 0; + int payIndex = 1; + String networkError = ""; + int networkStatus = 0; + List records = []; + PhoneQueryMemberInfo phoneQueryMemberInfo; + String rechargeId; + List manualQueryInfo; @override void initState() { @@ -46,6 +65,7 @@ class _VipRechargePage extends State { } }); }); + _onRefresh(); } ///离开页面记着销毁和清除 @@ -55,6 +75,185 @@ class _VipRechargePage extends State { super.dispose(); } + _onRefresh({bool isShowLoad = true}) async { + if (isShowLoad) + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + if (vipPhoneController?.text != "") + await queryMemberPhoneInfo(vipPhoneController?.text ?? "", isShow: false); + else + await queryRechargeList("", isShow: false); + EasyLoading.dismiss(); + if (!mounted) return; + if (_refreshController.isRefresh) _refreshController.refreshCompleted(); + setState(() {}); + } + + ///充值列表 + queryRechargeList(mid, {isShow = true}) 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.getRechargePreferential({ + "current": 1, + "size": 999, + "model": { + "rechargeType": "", + "tenantCode": BusinessInstance.instance.businessTenant, + "mid": mid + } + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + _refreshController.refreshFailed(); + _refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + records.clear(); + records.addAll(baseData?.data?.records ?? []); + networkStatus = 1; + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + } + } finally { + if (isShow) setState(() {}); + } + } + + ///根据手机号搜索用户信息 + 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; + queryRechargeList(phoneQueryMemberInfo?.mid ?? ""); + networkStatus = 1; + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + } + } finally { + if (isShow) EasyLoading.dismiss(); + } + } + + ///充值方式支付 + payMemberType( + authCode, memberSourceId, rechargePreferentialId, source) 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.posMemberRecharge({ + "authCode": authCode, + "memberSourceId": memberSourceId, + "rechargePreferentialId": rechargePreferentialId, + "source": source + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + _refreshController.refreshFailed(); + _refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + rechargeId = baseData.data; + Navigator.of(context) + .popAndPushNamed('/router/pay_success_page', arguments: { + "rechargeId": baseData.data, + "rechargeMoney": records[selectIndex].rechargeMoney, + "payIndex": payIndex, + }); + networkStatus = 1; + setState(() {}); + } else { + SmartDialog.show( + widget: SettlementTips( + () {}, + text: baseData.msg, + color: Color(0xFF30415B), + )); + } + } finally { + EasyLoading.dismiss(); + } + } + + ///手动查询充值订单状态 + manualQueryRechargeOrder(memberRechargeId) 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.manualQuery({ + "phone": phoneQueryMemberInfo?.phoneNum ?? "", + "memberRechargeId": memberRechargeId, + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + Navigator.of(context).pop(); + Navigator.of(context) + .popAndPushNamed('/router/pay_success_page', arguments: { + "rechargeId": baseData.data, + "rechargeMoney": records[selectIndex].rechargeMoney, + "payIndex": payIndex, + }); + } 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 GestureDetector( @@ -71,405 +270,841 @@ class _VipRechargePage extends State { leadingColor: Colors.black, brightness: Brightness.dark, ), - body:SmartRefresher( + body: SmartRefresher( enablePullDown: true, enablePullUp: false, header: MyHeader( - color: Color(0xFF30415B),), + color: Color(0xFF30415B), + ), footer: CustomFooter( builder: (context, mode) { return MyFooter(mode); }, ), - controller: refreshController, - // onRefresh: _onRefresh, + controller: _refreshController, + onRefresh: (){ + _onRefresh(isShowLoad: false); + }, physics: BouncingScrollPhysics(), - child: SingleChildScrollView( + child: networkStatus == -1? noNetwork() : SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Color(0x0F06152E), - offset: Offset(0, 2), - blurRadius: 4, - spreadRadius: 0, - ) - ], - borderRadius: BorderRadius.circular(8), - ), - padding: EdgeInsets.symmetric(horizontal: 16.w), - margin: EdgeInsets.only(bottom: 16.h,right: 16.w,left: 16.w,top: 8.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Text( - "会员", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: FontWeight.w500, + child:networkStatus == 0 ?vipRechargeSm():Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///会员搜索框 + Container( + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.symmetric(horizontal: 16.w), + margin: EdgeInsets.only( + bottom: 16.h, right: 16.w, left: 16.w, top: 8.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text( + "会员", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + Expanded( + child: TextField( + controller: vipPhoneController, + textInputAction: TextInputAction.search, + onEditingComplete: () { + FocusScope.of(context) + .requestFocus(FocusNode()); + queryMemberPhoneInfo( + vipPhoneController.text ?? ""); + }, + decoration: InputDecoration( + hintText: "请输入会员手机号", + hintTextDirection: TextDirection.rtl, + hintStyle: TextStyle( + color: Color(0xFF808080), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular), + border: InputBorder.none, + contentPadding: EdgeInsets.only(left: 16.w), + ), + textAlign: TextAlign.right, + style: TextStyle( + color: Color(0xFF808080), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular), + ), + ), + ], + )), + + ///会员信息 + if (phoneQueryMemberInfo != null) + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), ), + padding: EdgeInsets.only( + top: 16.h, bottom: 16.h, left: 16.w), + margin: EdgeInsets.only( + bottom: 16.h, right: 16.w, left: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 16.h), + child: Text( + "用户名称: ${phoneQueryMemberInfo?.nickName ?? ""}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )), + Padding( + padding: EdgeInsets.only(bottom: 16.h), + child: Text( + "手机号: ${phoneQueryMemberInfo?.phoneNum ?? ""}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )), + Text( + "会员余额: ¥${phoneQueryMemberInfo?.balance ?? ""}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + ], + )), + + ///充值列表 + rechargeList(), + + ///选择充值的套餐 + if (networkStatus == 1) + Container( + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.all(16), + margin: EdgeInsets.only( + bottom: 24.h, + right: 16.w, + left: 16.w, + ), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Text( + "本次充值(元)", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + Text( + AppUtils.calculateDouble((double.tryParse( + records[selectIndex] + ?.rechargeMoney) ?? + 0)), + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBECEF), + margin: EdgeInsets.symmetric(vertical: 16.h), + ), + Row( + children: [ + Expanded( + child: Text( + "充后余额(元)", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + Text( + "${AppUtils.calculateDouble((double.tryParse(records[selectIndex]?.rechargeMoney) ?? 0) + (double.tryParse(records[selectIndex]?.giftdMoney) ?? 0))}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ], ), ), - Expanded( - child: TextField( - controller: vipPhoneController, - decoration: InputDecoration( - hintText: "请输入会员手机号", - hintTextDirection: TextDirection.rtl, - hintStyle: TextStyle( - color: Color(0xFF808080), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular), - border: InputBorder.none, - contentPadding: EdgeInsets.only(left: 16.w), - ), - textAlign: TextAlign.right, + + ///充值方式 + Padding( + padding: EdgeInsets.only(left: 16.w, bottom: 16.h), + child: Text( + "充值方式", style: TextStyle( - color: Color(0xFF808080), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular), - ), + color: Colors.black, + fontSize: 15.sp, + fontWeight: MyFontWeight.bold, + ), + )), + Padding( + padding: EdgeInsets.only(left: 16.w, right: 10.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + setState(() { + payIndex = 1; + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: payIndex == 1 + ? Color(0xFF30415B) + : Color(0x29C5C5C5), + width: 2, + ), + color: payIndex == 1 + ? Color(0XFFEBF3FF) + : Color(0xFFF9FAF8)), + padding: EdgeInsets.only( + top: 21.h, + bottom: 15.h, + ), + margin: EdgeInsets.only(right: 6.w), + child: Column( + children: [ + Image.asset( + "assets/image/bus_vip_xj.webp", + width: 45.w, + height: 36.h, + ), + Padding( + padding: EdgeInsets.only(top: 15.h), + child: Text( + "现金支付", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ), + ), + )), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + setState(() { + payIndex = 3; + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: payIndex == 3 + ? Color(0xFF30415B) + : Color(0x29C5C5C5), + width: 2, + ), + color: payIndex == 3 + ? Color(0XFFEBF3FF) + : Color(0xFFF9FAF8)), + padding: EdgeInsets.only( + top: 21.h, + bottom: 15.h, + ), + margin: EdgeInsets.only(right: 6.w, left: 6.w), + child: Column( + children: [ + Image.asset( + "assets/image/bus_vip_alipay.webp", + width: 36.h, + height: 36.h, + ), + Padding( + padding: EdgeInsets.only(top: 15.h), + child: Text( + "支付宝支付", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ), + ), + )), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + setState(() { + payIndex = 2; + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: payIndex == 2 + ? Color(0xFF30415B) + : Color(0x29C5C5C5), + width: 2, + ), + color: payIndex == 2 + ? Color(0XFFEBF3FF) + : Color(0xFFF9FAF8)), + padding: EdgeInsets.only( + top: 21.h, + bottom: 15.h, + ), + margin: EdgeInsets.only(right: 6.w, left: 6.w), + child: Column( + children: [ + Image.asset( + "assets/image/bus_vip_wx.webp", + width: 36.h, + height: 36.h, + ), + Padding( + padding: EdgeInsets.only(top: 15.h), + child: Text( + "微信支付", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + )) + ], + ), + ), + )), + ], ), - ], - )), - rechargeList(), - Container( - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Color(0x0F06152E), - offset: Offset(0, 2), - blurRadius: 4, - spreadRadius: 0, - ) + ), + + ///确认充值 + Align( + alignment: Alignment.bottomCenter, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (widget.arguments["storeId"] == "0") { + SmartDialog.show( + widget: SettlementTips( + () {}, + text: "请选择门店进行充值", + color: Color(0xFF30415B), + )); + } else { + if (vipPhoneController.text == "") { + SmartDialog.show( + widget: SettlementTips( + () {}, + text: "请输入会员手机号进行充值", + color: Color(0xFF30415B), + )); + } else { + showRechargePayDialog(); + } + } + }, + child: Container( + color: Colors.white, + width: double.infinity, + margin: EdgeInsets.only(top: 132.h), + padding: EdgeInsets.only( + top: 10.h, + left: 16.w, + right: 16.w, + bottom: 34.h), + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 16.h), + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(27), + ), + child: Text( + "确认充值", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: MyFontWeight.bold, + ), + ), + ), + ), + )) ], - borderRadius: BorderRadius.circular(8), ), - padding: EdgeInsets.all(16), - margin: EdgeInsets.only(bottom:24.h,right: 16.w,left: 16.w,), - child: Column( - children: [ - Row( + )), + ), + ), + ); + } + + ///确认充值支付提示弹窗 + showRechargePayDialog() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + contentPadding: EdgeInsets.all(0), + content: Container( + width: MediaQuery.of(context).size.width - 80, + padding: EdgeInsets.only( + top: 24.h, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: + EdgeInsets.only(bottom: 20.h, left: 14.w, right: 14.w), + child: Text.rich( + TextSpan( children: [ - Expanded( - child: Text( - "本次充值(元)", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - Text( - "322", + TextSpan( + text: "*", style: TextStyle( - color: Color(0xFF1A1A1A), + color: Color(0xFFFA5151), fontSize: 14.sp, fontWeight: FontWeight.w500, ), ), - ], - ), - Container( - width:double.infinity, - height: 1.h, - color: Color(0xFFEBECEF), - margin: EdgeInsets.symmetric(vertical: 16.h), - ), - Row( - children: [ - Expanded( - child: Text( - "充后余额(元)", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), + TextSpan( + text: "请确认充账户及充值套餐后再点击确认", + style: TextStyle( + color: Color(0xFFFA5151), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, ), ), - Text( - "344", + TextSpan( + text: "*", style: TextStyle( - color: Color(0xFF1A1A1A), + color: Color(0xFFFA5151), fontSize: 14.sp, fontWeight: FontWeight.w500, ), ), ], ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only( + bottom: 18.h, left: 14.w, right: 14.w), + child: Text( + "充值账户: ${phoneQueryMemberInfo?.phoneNum ?? ""}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.only( + bottom: 18.h, left: 14.w, right: 14.w), + child: Text( + "充值套餐: 充${records[selectIndex]?.rechargeMoney ?? ""}送${records[selectIndex]?.giftdMoney ?? ""}", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.bold, + ), + ), + ), ], ), - ), - Padding(padding:EdgeInsets.only(left: 16.w,bottom: 16.h), - child: - Text( - "充值方式", - style: TextStyle( - color: Colors.black, - fontSize: 15.sp, - fontWeight: MyFontWeight.bold, + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFD8D8D8), ), - )), - Padding(padding:EdgeInsets.only(left: 16.w,right: 10.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded(child:GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - setState((){ - payIndex = 0; - }); - }, - child:Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: - payIndex == 0 ? Color(0xFF30415B) : Color(0x29C5C5C5), - width:2, - ), - color: - payIndex == 0 ? Color(0XFFEBF3FF) : Color(0xFFF9FAF8)), - padding: EdgeInsets.only(top: 21.h,bottom: 15.h,), - margin: EdgeInsets.only(right: 6.w), - child: Column( - children: [ - Image.asset( - "assets/image/bus_vip_xj.webp", - width: 45.w, - height:36.h, - ), - Padding(padding:EdgeInsets.only(top: 15.h), - child: Text( - "现金支付", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - ), - )) - ], - ),), - )), - Expanded(child:GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - setState((){ - payIndex = 1; - }); - }, - child:Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: - payIndex == 1 ? Color(0xFF30415B) : Color(0x29C5C5C5), - width:2, - ), - color: - payIndex == 1 ? Color(0XFFEBF3FF) : Color(0xFFF9FAF8)), - padding: EdgeInsets.only(top: 21.h,bottom: 15.h,), - margin: EdgeInsets.only(right: 6.w,left: 6.w), - child: Column( - children: [ - Image.asset( - "assets/image/bus_vip_alipay.webp", - width: 36.h, - height:36.h, - ), - Padding(padding:EdgeInsets.only(top: 15.h), - child: Text( - "支付宝支付", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - ), - )) - ], - ),), - )), - Expanded(child:GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - setState((){ - payIndex = 2; - }); - }, - child:Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: - payIndex == 2 ? Color(0xFF30415B) : Color(0x29C5C5C5), - width:2, + Container( + height: 55.h, + child: Row( + children: [ + Expanded( + child: InkWell( + child: BorderText( + text: S.of(context).quxiao, + textColor: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + padding: EdgeInsets.all(14), ), - color: - payIndex == 2 ? Color(0XFFEBF3FF) : Color(0xFFF9FAF8)), - padding: EdgeInsets.only(top: 21.h,bottom: 15.h,), - margin: EdgeInsets.only(right: 6.w,left: 6.w), - child: Column( - children: [ - Image.asset( - "assets/image/bus_vip_wx.webp", - width: 36.h, - height:36.h, + onTap: () { + Navigator.of(context).pop(); + }, + ), + flex: 1, + ), + Container( + width: 1.w, + height: double.infinity, + color: Color(0xFFD8D8D8), + ), + Expanded( + child: InkWell( + child: RoundButton( + text: S.of(context).queren, + textColor: Color(0xFF30415B), + radius: 4, + padding: EdgeInsets.all(14), + fontSize: 16.sp, + fontWeight: FontWeight.bold, ), - Padding(padding:EdgeInsets.only(top: 15.h), - child: Text( - "微信支付", - style: TextStyle( - color: Color(0xFF1A1A1A), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, - ), - )) - ], - ),), - )), - ], - ),), - Align( - alignment: Alignment.bottomCenter, + onTap: () { + Navigator.of(context).pop(); + if (payIndex == 1) { + payMemberType( + null, + phoneQueryMemberInfo?.sid ?? "", + records[selectIndex]?.id ?? "", + payIndex); + } else { + Navigator.of(context).pushNamed( + '/router/scan_code_page', + arguments: { + "storeId": widget.arguments["storeId"], + "scanCodeType": "支付", + "rechargePreferentialId": + records[selectIndex]?.id ?? "", + "memberSourceId": + phoneQueryMemberInfo?.sid ?? "", + "source": payIndex.toString(), + "rechargeMoney": + records[selectIndex]?.rechargeMoney ?? + "" + }).then((value) { + if (value == 1) { + queryMemberPhoneInfo( + vipPhoneController?.text ?? "", + isShow: false); + } else { + manualQueryInfo = value; + showPayQueryDialog( + manualQueryInfo[0], manualQueryInfo[1]); + } + }); + } + }, + ), + flex: 1, + ), + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + + ///手动查询弹窗 + showPayQueryDialog(String queryDialog, String rechargeOrderId) { + 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( - color: Colors.white, - width: double.infinity, - margin: EdgeInsets.only(top: 132.h), - padding: EdgeInsets.only(top: 10.h,left: 16.w,right: 16.w,bottom:34.h), - child: Container( - alignment: Alignment.center, - padding: EdgeInsets.symmetric(vertical:16.h), - decoration: BoxDecoration( - color: Color(0xFF30415B), - borderRadius: BorderRadius.circular(27), + 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.white, + 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: () { + manualQueryRechargeOrder(rechargeOrderId); + }, + 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, + ), + ), + )), + ], + ), ), - ) - ), - ), - ), + ); + }, ); } Widget rechargeList() { return Container( - margin: EdgeInsets.only(left:16.w,right: 16.w,bottom:16.h), - child: ListView.builder( - padding: EdgeInsets.zero, - itemCount: 3, - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () { - setState(() { - selectIndex = position; - }); - }, - child: rechargeItem(position)); - }, - ), - ); - // : NoDataView( - // src: "assets/image/xiao_fei.webp", - // isShowBtn: false, - // text: "暂无充值套餐~", - // fontSize: 16.sp, - // margin: EdgeInsets.only(top: 90.h, left: 60.w, right: 60.w), - // ); + margin: EdgeInsets.only(left: 16.w, right: 16.w, bottom: 16.h), + child: (records != null && (records?.length ?? 0) > 0) + ? ListView.builder( + padding: EdgeInsets.zero, + itemCount: records.length ?? 0, + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + setState(() { + selectIndex = position; + }); + }, + child: rechargeItem(records[position], position)); + }, + ) + : NoDataView( + src: "assets/image/xiao_fei.webp", + isShowBtn: false, + text: "暂无充值套餐~", + fontSize: 16.sp, + margin: EdgeInsets.only(top: 90.h, left: 60.w, right: 60.w), + )); } - Widget rechargeItem(index) { - return Container( - width: double.infinity, - height: 69.h, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: - selectIndex == index ? Color(0xFF30415B) : Color(0x29C5C5C5), - width:2, - ), - color: - selectIndex == index ? Color(0XFFEBF3FF) : Color(0xFFF9FAF8)), - margin: EdgeInsets.only(bottom: 14.w), - padding: EdgeInsets.only(left: 16), - child: Flex( - direction: Axis.horizontal, - children: [ - Expanded( - flex: 1, - child: Container( - child: Text.rich( - TextSpan(children: [ - TextSpan( - text: "储值 ", - style: TextStyle( - fontSize: 12.sp, - color: selectIndex == index - ? Color(0xFF4D4D4D) - : Color(0xFF868686), - fontWeight: MyFontWeight.regular), - ), - TextSpan( - text: - "100", - style: TextStyle( - fontSize: 18.sp, - fontFamily: 'JDZhengHT', - color: selectIndex == index - ? Color(0xFF353535) - : Color(0xFF302F3A), - fontWeight: MyFontWeight.medium), - ),TextSpan( - text: - "元", - style: TextStyle( - fontSize: 18.sp, - fontFamily: 'JDZhengHT', - color: selectIndex == index - ? Color(0xFF353535) - : Color(0xFF302F3A), - fontWeight: MyFontWeight.semi_bold), - ), - ]), - ), - )), - Container( - width: 1.w, - height: 37.h, + Widget rechargeItem(Records records, index) { + return Stack( + alignment: Alignment.topRight, + children: [ + Container( + width: double.infinity, + height: 69.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: selectIndex == index + ? Color(0xFF30415B) + : Color(0x29C5C5C5), + width: 2, + ), color: - selectIndex == index ? Color(0xFF32A060) : Color(0xFF979797), - margin: EdgeInsets.only(right: 16.w, left: 12), - ), - Expanded( - flex: 2, - child: - Text.rich( + selectIndex == index ? Color(0XFFEBF3FF) : Color(0xFFF9FAF8)), + margin: EdgeInsets.only(bottom: 14.w), + padding: EdgeInsets.only(left: 16), + child: Flex( + direction: Axis.horizontal, + children: [ + Expanded( + flex: 2, + child: Container( + child: Text.rich( + TextSpan(children: [ + TextSpan( + text: "储值 ", + style: TextStyle( + fontSize: 12.sp, + color: selectIndex == index + ? Color(0xFF4D4D4D) + : Color(0xFF868686), + fontWeight: MyFontWeight.regular), + ), + TextSpan( + text: records?.rechargeMoney ?? "0", + style: TextStyle( + fontSize: 18.sp, + fontFamily: 'JDZhengHT', + color: selectIndex == index + ? Color(0xFF353535) + : Color(0xFF302F3A), + fontWeight: MyFontWeight.medium), + ), + TextSpan( + text: "元", + style: TextStyle( + fontSize: 18.sp, + fontFamily: 'JDZhengHT', + color: selectIndex == index + ? Color(0xFF353535) + : Color(0xFF302F3A), + fontWeight: MyFontWeight.semi_bold), + ), + ]), + ), + )), + Container( + width: 1.w, + height: 37.h, + color: selectIndex == index + ? Color(0xFF302F3A) + : Color(0xFF979797), + margin: EdgeInsets.only(right: 16.w, left: 12), + ), + Expanded( + flex: 3, + child: Text.rich( TextSpan(children: [ TextSpan( text: "赠送 ", @@ -481,8 +1116,7 @@ class _VipRechargePage extends State { fontWeight: MyFontWeight.regular), ), TextSpan( - text: - "120", + text: records?.giftdMoney ?? "0", style: TextStyle( fontSize: 18.sp, fontFamily: 'JDZhengHT', @@ -492,8 +1126,7 @@ class _VipRechargePage extends State { fontWeight: MyFontWeight.medium), ), TextSpan( - text: - "元", + text: "元", style: TextStyle( fontSize: 18.sp, fontFamily: 'JDZhengHT', @@ -503,8 +1136,576 @@ class _VipRechargePage extends State { fontWeight: MyFontWeight.semi_bold), ), ]), - ),) - ], - )); + ), + ) + ], + ), + ), + if (selectIndex == index) + Image.asset( + "assets/image/bus_vip_j.webp", + width: 32.h, + height: 32.h, + fit: BoxFit.fill, + ), + ], + ); } + + Widget vipRechargeSm() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ///会员搜索框 + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(top:8.h,bottom:16.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:double.infinity, + height: 51.h, + ), + ), + + ///会员信息 + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.only(top: 16.h, bottom: 16.h, left: 16.w), + margin: EdgeInsets.only(bottom: 16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:70.w, + height: 17.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:43.w, + height: 17.h, + ), + ), + ], + ), + SizedBox(height: 16.h,), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:56.w, + height: 17.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:85.w, + height: 17.h, + ), + ), + ], + ), + SizedBox(height: 16.h,), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:70.w, + height: 17.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:77.w, + height: 17.h, + ), + ), + ], + ), + ], + )), + + ///充值列表 + ListView.builder( + padding: EdgeInsets.zero, + itemCount: 3, + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + return rechargeItemSm(); + }, + ), + + ///选择充值的套餐 + Container( + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.all(16), + margin: EdgeInsets.only( + bottom: 24.h, + ), + child: Column( + children: [ + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:89.w, + height: 17.h, + ), + ), + Spacer(), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:26.w, + height: 17.h, + ), + ), + ], + ), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBECEF), + margin: EdgeInsets.symmetric(vertical: 16.h), + ), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:89.w, + height: 17.h, + ), + ), + Spacer(), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:26.w, + height: 17.h, + ), + ), + ], + ), + ], + ), + ), + + ///充值方式 + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(left: 16.w, bottom: 16.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:60.w, + height: 21.h, + ), + ), + Row( + children: [ + Expanded(child:Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.only(top: 16.h, bottom: 16.h, left: 16.w), + margin: EdgeInsets.only(right: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(bottom:15.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:45.w, + height: 32.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:56.w, + height: 17.h, + ), + ), + ], + ))), + Expanded(child:Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.only(top: 16.h, bottom: 16.h, left: 16.w), + margin: EdgeInsets.only(right: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(bottom:15.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:45.w, + height: 32.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:56.w, + height: 17.h, + ), + ), + ], + ))), + Expanded(child:Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.only(top: 16.h, bottom: 16.h, left: 16.w), + margin: EdgeInsets.only(right: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(bottom:15.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:45.w, + height: 32.h, + ), + ), + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:56.w, + height: 17.h, + ), + ), + ], + ))), + ], + ) + , + + ///确认充值 + Align( + alignment: Alignment.bottomCenter, + child: Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(bottom: 16.h,top: 30.h), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(27), + ), + width:double.infinity, + height: 54.h, + ), + ),) + ], + ), + ); + } + + Widget rechargeItemSm() { + return Container( + width: double.infinity, + height: 69.h, + color: Colors.white, + margin: EdgeInsets.only(bottom: 14.w), + padding: EdgeInsets.only(left: 16), + child: Flex( + direction: Axis.horizontal, + children: [ + Expanded( + flex: 2, + child: Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:25.w, + height: 15.h, + ), + ), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:50.w, + height: 25.h, + ), + ), + ], + ) + ], + )), + Container( + width: 1.w, + height: 37.h, + color: Color(0xFF979797), + margin: EdgeInsets.only(right: 16.w, left: 12), + ), + Expanded( + flex: 3, + child: Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:25.w, + height: 15.h, + ), + ), + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + margin: EdgeInsets.only(right:10.w), + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width:60.w, + height: 25.h, + ), + ), + ], + ) + ], + ), + ) + ], + ), + ); + } + + Widget noNetwork() { + return Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + // "无法连接到网络", + networkError.substring(0, networkError.indexOf(",")), + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF0D0D0D), + fontWeight: MyFontWeight.bold), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: Text( + "请检查网络设置或稍后重试", + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF7A797F), + fontWeight: MyFontWeight.regular), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _onRefresh(); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(15), + ), + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 3.h), + child: Text( + "重试", + style: TextStyle( + fontSize: 14.sp, + color: Colors.white, + fontWeight: MyFontWeight.regular), + )), + ) + ], + ), + ); + } + } diff --git a/lib/business_system/mine/business_mine_page.dart b/lib/business_system/mine/business_mine_page.dart index a73a9d90..785cc8fc 100644 --- a/lib/business_system/mine/business_mine_page.dart +++ b/lib/business_system/mine/business_mine_page.dart @@ -246,22 +246,6 @@ class _BusinessMinePage extends State SizedBox( height: 20.h, ), - // GestureDetector( - // behavior: HitTestBehavior.opaque, - // onTap: (){ - // Navigator.of(context).pushNamed('/router/merchant_info',arguments:{ - // "storeId":widget.storeId, - // }); - // }, - // child: - // commonFunctionsItem("assets/image/bs_store_info_logo.webp", "商户信息", widget?.businessLoginInfo?.name ?? ""), - // ), - Container( - width: double.infinity, - height: 1.h, - color: Color(0xFFEBECEF), - margin: EdgeInsets.only(left: 32.w, bottom: 12.h), - ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { @@ -282,7 +266,22 @@ class _BusinessMinePage extends State } }, child: commonFunctionsItem( - "assets/image/bs_shop_logo.webp", "门店设置", ""), + "assets/image/bs_shop_logo.webp", "门店设置", "",20,20), + ), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBECEF), + margin: EdgeInsets.only(left: 32.w, bottom: 12.h), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pushNamed('/router/shop_reservation_code', + arguments: {"storeId": widget.storeId,}); + }, + child: commonFunctionsItem( + "assets/image/bs_mine_code.webp", "门店预约二维码", "",18,18), ), Container( width: double.infinity, @@ -300,25 +299,43 @@ class _BusinessMinePage extends State }); }, child: commonFunctionsItem( - "assets/image/bs_secure.webp", "安全设置", "登录手机号/密码")), + "assets/image/bs_secure.webp", "安全设置", "登录手机号/密码",18,22)), + Container( + width: double.infinity, + height: 1.h, + color: Color(0xFFEBECEF), + margin: EdgeInsets.only(left: 32.w, bottom: 12.h), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context) + .pushNamed('/router/clerk_manage_page', arguments: { + "storeId": widget.storeId, + }); + }, + child: commonFunctionsItem( + "assets/image/bs_mine_clerk.webp", "店员管理", "",18,20), + ), ], ), ); } - Widget commonFunctionsItem(icon, leftText, rightText) { + Widget commonFunctionsItem(icon, leftText, rightText,double width,double height) { return Container( margin: EdgeInsets.only(bottom: 14.h), child: Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( icon, - width: 24, - height: 24, + width: width.w, + height: height.h, fit: BoxFit.fill, ), SizedBox( - width: 8.w, + width:11.w, ), Expanded( child: Text( @@ -326,7 +343,7 @@ class _BusinessMinePage extends State style: TextStyle( fontSize: 14.sp, color: Color(0xFF30415B), - fontWeight: MyFontWeight.medium), + fontWeight: MyFontWeight.bold), )), Text( rightText, @@ -380,7 +397,7 @@ class _BusinessMinePage extends State Navigator.of(context).pushNamed('/router/user_service_page'); }, child: - commonFunctionsItem("assets/image/bs_user.webp", "关于我们", "")) + commonFunctionsItem("assets/image/bs_user.webp", "关于我们", "",24,24)) ], ), ); diff --git a/lib/business_system/mine/clerk_manage/add_new_clerk_page.dart b/lib/business_system/mine/clerk_manage/add_new_clerk_page.dart new file mode 100644 index 00000000..d72e73b7 --- /dev/null +++ b/lib/business_system/mine/clerk_manage/add_new_clerk_page.dart @@ -0,0 +1,546 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; + +import '../../../generated/l10n.dart'; +import '../../../retrofit/business_api.dart'; +import '../../../retrofit/data/base_data.dart'; +import '../../../retrofit/data/user_info_edit.dart'; +import '../../../utils/business_instance.dart'; +import '../../../utils/font_weight.dart'; +import '../../../view_widget/my_appbar.dart'; + +class AddNewClerkPage extends StatefulWidget { + final Map arguments; + + AddNewClerkPage({this.arguments}); + + @override + State createState() { + return _AddNewClerkPage(); + } +} + +class _AddNewClerkPage extends State { + String titleName; + final TextEditingController editingPhoneController = TextEditingController(); + final TextEditingController editingNameController = TextEditingController(); + bool isKeyBoardShow = false; + FocusNode _focusNode = FocusNode(); + BusinessApiService businessService; + String selectSexIndex = "N"; + String clerkAccount; + String clerkName; + String clerkSex; + String sexCode; + + @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"] ??""; + clerkAccount = widget?.arguments["clerkAccount"] ?? ""; + clerkName = widget?.arguments["clerkName"] ?? ""; + clerkSex = widget?.arguments["sex"] ?? ""; + sexCode = widget?.arguments["sexCode"] ?? ""; + } + + ///离开页面记着销毁和清除 + @override + void dispose() { + _focusNode.unfocus(); + super.dispose(); + } + + ///店员信息编辑/新增店员 + editUser(account,name,sex) 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.userEdit({ + "account":account, + "name":name, + "sex":sex, + "password": "123456", + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + Navigator.of(context).pop(1); + SmartDialog.showToast(titleName == "编辑店员资料" ? "店员资料编辑成功" : "新增店员成功", + alignment: Alignment.center); + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + }}finally{ + EasyLoading.dismiss(); + } + } + + ///修改店员信息 + modifyUser(account,name,sex) 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.userModify({ + "account": account == ""?clerkAccount:account, + "name": name == "" ? clerkName :name, + "sex": sex == ""?sexCode:sex, + "password": "123456", + "id":widget?.arguments["id"]??"" + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + Navigator.of(context).pop(1); + SmartDialog.showToast("修改店员信息成功", + alignment: Alignment.center); + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + }}finally{ + EasyLoading.dismiss(); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + FocusScope.of(context).unfocus(); + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: Colors.white, + appBar: MyAppBar( + title: titleName, + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: Container( + margin: EdgeInsets.only(top: 24.h, left: 16.w, right: 16.w), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: "*", + style: TextStyle( + color: Color(0xFFE02020), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "员工姓名", + style: TextStyle( + color: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ), + Expanded( + child: TextField( + controller: editingNameController, + decoration: InputDecoration( + hintText: clerkName != ""?clerkName:"请输入员工姓名", + hintTextDirection: TextDirection.rtl, + hintStyle: TextStyle( + color: Color(0xFF7A797F), + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold), + border: InputBorder.none, + contentPadding: EdgeInsets.only(left: 16.w), + ), + textAlign: TextAlign.right, + style: TextStyle( + color: Color(0xFF7A797F), + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold), + ), + ), + ], + ), + Container( + height: 1.h, + width: double.infinity, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.only(bottom: 16.h), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: "*", + style: TextStyle( + color: Color(0xFFE02020), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "员工性别", + style: TextStyle( + color: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: (){ + showSexSelect(selectSexIndex); + }, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + clerkSex != "" ? clerkSex:(selectSexIndex == "" ? "请选择员工性别":(selectSexIndex == "N"?"未知":(selectSexIndex == "M" ? "男":"女"))), + style: TextStyle( + color: Color(0xFF7A797F), + fontSize: 14.sp, + fontWeight: FontWeight.bold, + ), + ), + Image.asset( + "assets/image/bs_right.webp", + width: 14.h, + height: 14.h, + color: Color(0xFF353535), + ) + ], + ) + ) + ], + ), + Container( + height: 1.h, + width: double.infinity, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.only(top: 16.h), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: "*", + style: TextStyle( + color: Color(0xFFE02020), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: "手机号", + style: TextStyle( + color: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ), + Expanded( + child: TextField( + controller: editingPhoneController, + keyboardType: TextInputType.phone, + decoration: InputDecoration( + hintText: clerkAccount != ""?clerkAccount:"请输入手机号", + hintTextDirection: TextDirection.rtl, + hintStyle: TextStyle( + color: Color(0xFF7A797F), + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold), + border: InputBorder.none, + contentPadding: EdgeInsets.only(left: 16.w), + ), + inputFormatters: [ + LengthLimitingTextInputFormatter(11) + ], + textAlign: TextAlign.right, + style: TextStyle( + color: Color(0xFF7A797F), + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold), + ), + ), + ], + ), + Container( + height: 1.h, + width: double.infinity, + color: Color(0xFFEBEBEB), + margin: EdgeInsets.only(bottom: 16.h), + ), + Spacer(), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (editingNameController.text == "" && clerkName == "") { + SmartDialog.showToast("请输入员工姓名", + alignment: Alignment.center); + return; + } else if (selectSexIndex == "" && clerkSex == "") { + SmartDialog.showToast("请选择员工性别", + alignment: Alignment.center); + return; + } else if (editingPhoneController.text == "" && clerkAccount == "") { + SmartDialog.showToast("请输入手机号", + alignment: Alignment.center); + return; + } { + if(clerkName != "" || clerkAccount != "" || clerkSex != ""){ + modifyUser(editingPhoneController.text,editingNameController.text,selectSexIndex); + }else + editUser(editingPhoneController.text,editingNameController.text,selectSexIndex); + } + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(27), + color: Color(0xFF30415B), + ), + width: double.infinity, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 16.h), + margin: EdgeInsets.only(bottom: 34.h), + child: Text( + S.of(context).baocun, + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + showSexSelect(index) { + showModalBottomSheet( + context: context, + isDismissible: false, + builder: (context) { + return StatefulBuilder(builder: ( + context, + state, + ) { + return Container( + width: double.infinity, + height: 290.h, + padding: EdgeInsets.only(top: 12.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(6), + topLeft: Radius.circular(6), + )), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 14.w), + child: Row( + children: [ + Expanded( + child:GestureDetector( + behavior:HitTestBehavior.opaque, + onTap: (){ + state((){ + selectSexIndex = ""; + Navigator.of(context).pop(); + }); + }, + child: Text( + S.of(context).quxiao, + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: MyFontWeight.black, + ), + ), + )), + Expanded(child:GestureDetector( + behavior:HitTestBehavior.opaque, + onTap: (){ + selectSexIndex == "N"? "未知" :(selectSexIndex == "M" ? "男" : "女" ); + Navigator.of(context).pop(); + setState((){});}, + child: Container( + alignment: Alignment.centerRight, + child: Text( + S.of(context).queding, + style: TextStyle( + color: Color(0xFF30415B), + fontSize: 16.sp, + fontWeight: MyFontWeight.black, + ), + ), + ), + )) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 12.h, bottom: 13.h), + height: 1.h, + color: Color(0xFFF2F2F2)), + GestureDetector( + behavior:HitTestBehavior.opaque, + onTap: () { + state((){ + selectSexIndex = "M"; + }); + }, + child: Container( + width: double.infinity, + alignment: Alignment.center, + padding: + EdgeInsets.only(top:12.h, bottom:12.h, left: 12.w), + margin: EdgeInsets.symmetric(horizontal: 14.w), + decoration: BoxDecoration( + borderRadius:BorderRadius.circular(6), + border: Border.all( + color: selectSexIndex == "M" ? Color(0xFF30415B):Color(0xFFF7F7F7), + width: selectSexIndex == "M" ? 1 :0, + ), + color: selectSexIndex == "M" ? Color(0xFFEFF5FF) :Color(0xFFF7F7F7), + ), + child: Text( + "男", + style: TextStyle( + color: selectSexIndex == "M"? Color(0xFF30415B):Color(0xFF4D4D4D), + fontSize: 18.sp, + fontWeight: MyFontWeight.regular, + ), + ), + ), + ), + SizedBox( + height: 13.h, + ), + GestureDetector( + behavior:HitTestBehavior.opaque, + onTap: () { + state((){ + selectSexIndex = "W"; + }); + }, + child: Container( + width: double.infinity, + alignment: Alignment.center, + padding: + EdgeInsets.only(top: 12.h, bottom: 12.h, left: 12.w), + margin: EdgeInsets.symmetric(horizontal: 14.w), + decoration: BoxDecoration( + borderRadius:BorderRadius.circular(6), + border: Border.all( + color: selectSexIndex == "W" ? Color(0xFF30415B):Color(0xFFF7F7F7), + width: selectSexIndex == "W" ? 1 :0, + ), + color: selectSexIndex == "W" ? Color(0xFFEFF5FF) :Color(0xFFF7F7F7), + ), + child: Text( + "女", + style: TextStyle( + color: selectSexIndex == "W" ?Color(0xFF30415B):Color(0xFF4D4D4D), + fontSize: 18.sp, + fontWeight: MyFontWeight.regular, + ), + )), + ), + SizedBox( + height: 13.h, + ), + GestureDetector( + behavior:HitTestBehavior.opaque, + onTap: () { + state((){ + selectSexIndex = "N"; + }); + }, + child: Container( + width: double.infinity, + alignment: Alignment.center, + padding: + EdgeInsets.only(top: 12.h, bottom: 12.h, left: 12.w), + margin: EdgeInsets.symmetric(horizontal: 14.w), + decoration: BoxDecoration( + borderRadius:BorderRadius.circular(6), + border: Border.all( + color: selectSexIndex == "N" ? Color(0xFF30415B):Color(0xFFF7F7F7), + width: selectSexIndex == "N" ? 1 :0, + ), + color: selectSexIndex == "N" ? Color(0xFFEFF5FF) :Color(0xFFF7F7F7), + ), + child: Text( + "未知", + style: TextStyle( + color: selectSexIndex == "N" ?Color(0xFF30415B):Color(0xFF4D4D4D), + fontSize: 18.sp, + fontWeight: MyFontWeight.regular, + ), + )), + ) + ], + ), + ); + }); + }, + ); + } +} diff --git a/lib/business_system/mine/clerk_manage/clerk_manage_page.dart b/lib/business_system/mine/clerk_manage/clerk_manage_page.dart new file mode 100644 index 00000000..050fbcdd --- /dev/null +++ b/lib/business_system/mine/clerk_manage/clerk_manage_page.dart @@ -0,0 +1,512 @@ +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:pull_to_refresh/pull_to_refresh.dart'; +import 'package:shimmer/shimmer.dart'; + +import '../../../generated/l10n.dart'; +import '../../../retrofit/business_api.dart'; +import '../../../retrofit/data/base_data.dart'; +import '../../../retrofit/data/clerk_manage_list.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/no_data_view.dart'; +import '../../../view_widget/round_button.dart'; + +class ClerkManagePage extends StatefulWidget { + final Map arguments; + + ClerkManagePage({this.arguments}); + + @override + State createState() { + return _ClerkManagePage(); + } +} + +class _ClerkManagePage extends State { + final RefreshController refreshController = RefreshController(); + BusinessApiService businessService; + String networkError = ""; + int networkStatus = 0; + List records = []; + int _current = 1; + + @override + void initState() { + super.initState(); + _onRefresh(); + } + + _onRefresh({bool isShowLoad = true}) async { + if (isShowLoad) + EasyLoading.show( + status: S.current.zhengzaijiazai, + maskType: EasyLoadingMaskType.black); + await queryClerkList(); + EasyLoading.dismiss(); + if (refreshController.isRefresh) refreshController.refreshCompleted(); + if (mounted) setState(() {}); + } + + ///查询店员管理列表 + queryClerkList({isShow = true}) 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.clerkList({ + "size": 20, + "pageSize": 20, + "current": _current, + "currentPage": 1, + "sort": "id", + "order": "descending", + }).catchError((error) { + networkError = AppUtils.dioErrorTypeToString(error.type); + networkStatus = -1; + setState(() {}); + refreshController.refreshFailed(); + refreshController.loadFailed(); + }); + if (!mounted) return; + if (baseData != null && baseData.isSuccess) { + records.addAll(baseData?.data?.records ?? []); + if ((baseData?.data?.records ?? []).isEmpty || + records.length.toString() == baseData.data.total) + refreshController.loadNoData(); + else + refreshController.loadComplete(); + networkStatus = 1; + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + } + } finally { + if (isShow) setState(() {}); + } + } + + ///删除店员 + queryDelUser(ids) 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.delUser(ids).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + await editOnRefresh(); + SmartDialog.showToast("删除店员成功", alignment: Alignment.center); + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + } + } finally { + EasyLoading.dismiss(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: MyAppBar( + title: "店员管理", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: networkStatus == -1 + ? noNetwork() + : Container( + margin: EdgeInsets.only(top: 24.h, left: 16.w, right: 16.w), + child: Column( + children: [ + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: records.length == 0 ? false : true, + header: MyHeader( + color: Color(0xFF30415B), + ), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + onRefresh: () { + _current = 1; + records.clear(); + _onRefresh(isShowLoad: false); + }, + onLoading: () { + _current++; + _onRefresh(isShowLoad: false); + }, + physics: BouncingScrollPhysics(), + scrollController: ScrollController(), + child: Container( + child: networkStatus == 0 + ? ListView.builder( + itemCount: 10, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, position) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () {}, + child: clerkManageItemSm(), + ); + }, + ) + : ((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( + itemCount: records?.length ?? 0, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, position) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () {}, + child: clerkManageItem( + records[position]), + ); + }, + )), + ), + ), + )), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pushNamed( + '/router/add_new_clerk_page', + arguments: { + "storeId": widget.arguments["storeId"], + "titleName": "添加新店员" + }).then((value) { + if (value == 1) { + _current = 1; + records.clear(); + _onRefresh(isShowLoad: false); + } + }); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(27), + color: Color(0xFF30415B), + ), + width: double.infinity, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 16.h), + margin: EdgeInsets.only(bottom: 34.h), + child: Text( + "添加店员", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + ), + )), + ], + ), + )); + } + + editOnRefresh() { + _current = 1; + records.clear(); + _onRefresh(isShowLoad: false); + } + + ///店员管理列表 + Widget clerkManageItem(Records records) { + return Container( + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Text( + records?.name ?? "", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: FontWeight.bold, + ), + )), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context) + .pushNamed('/router/add_new_clerk_page', arguments: { + "storeId": widget.arguments["storeId"], + "titleName": "编辑店员资料", + "clerkAccount": (records?.mobile == "") + ? (records?.account ?? "") + : (records?.mobile ?? ""), + "clerkName": records?.name ?? "", + "sex": records?.sex?.desc ?? "", + "sexCode": records?.sex?.code ?? "", + "id": records?.id ?? "" + }).then((value) { + if(value == 1) + editOnRefresh(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 17.w), + child: Text( + "编辑", + style: TextStyle( + color: Color(0xFF30415B), + fontSize: 14.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + showDelGroupDialog(records?.id); + }, + child: Padding( + padding: EdgeInsets.only(right: 16.w, left: 17.w), + child: Text( + S.of(context).shanchu, + style: TextStyle( + color: Color(0xFFF4524D), + fontSize: 14.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + ], + ), + Container( + margin: EdgeInsets.symmetric(vertical: 16.h), + color: Color(0xFFEBEBEB), + height: 1.h, + width: double.infinity, + ) + ], + ), + ); + } + + Widget clerkManageItemSm() { + return Container( + child: Column( + children: [ + Row( + children: [ + Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 112.w, + height: 20.h, + ), + ), + Spacer(), + Padding( + padding: EdgeInsets.symmetric(horizontal: 17.w), + child: Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 28.w, + height: 20.h, + ), + ), + ), + Padding( + padding: EdgeInsets.only(right: 16.w, left: 17.w), + child: Shimmer.fromColors( + baseColor: Color(0XFFD8D8D8), + highlightColor: Color(0XFFD8D8D8), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFD8D8D8), + borderRadius: BorderRadius.circular(2), + ), + width: 28.w, + height: 20.h, + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric(vertical: 16.h), + color: Color(0xFFEBEBEB), + height: 1.h, + width: double.infinity, + ) + ], + ), + ); + } + + ///删除分组提示弹窗 + showDelGroupDialog(id) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Container( + width: MediaQuery.of(context).size.width - 84, + height: 139.h, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "选中数据将被永久删除, 是否继续?", + style: TextStyle( + color: Color(0xFFF4524D), + 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: () { + Navigator.of(context).pop(); + queryDelUser(id); + }, + ), + flex: 1, + ), + ], + ) + ], + ), + ), + ); + }, + ); + } + + Widget noNetwork() { + return Container( + color: Colors.white, + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + networkError.substring(0, networkError.indexOf(",")), + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF0D0D0D), + fontWeight: MyFontWeight.bold), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: Text( + "请检查网络设置或稍后重试", + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF7A797F), + fontWeight: MyFontWeight.regular), + ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _onRefresh(); + }, + child: Container( + decoration: BoxDecoration( + color: Color(0xFF30415B), + borderRadius: BorderRadius.circular(15), + ), + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 3.h), + child: Text( + "重试", + style: TextStyle( + fontSize: 14.sp, + color: Colors.white, + fontWeight: MyFontWeight.regular), + )), + ) + ], + ), + ); + } +} diff --git a/lib/business_system/mine/shop_reservation_code.dart b/lib/business_system/mine/shop_reservation_code.dart new file mode 100644 index 00000000..0c92631b --- /dev/null +++ b/lib/business_system/mine/shop_reservation_code.dart @@ -0,0 +1,208 @@ +import 'dart:typed_data'; + +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:image_gallery_saver/image_gallery_saver.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + +import '../../view_widget/classic_header.dart'; +import '../../view_widget/my_footer.dart'; + +class ShopReservationCode extends StatefulWidget { + final Map arguments; + + ShopReservationCode({this.arguments}); + + @override + State createState() { + return _ShopReservationCode(); + } +} + +class _ShopReservationCode extends State { + final RefreshController refreshController = RefreshController(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppBar( + title: "门店预约二维码", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + brightness: Brightness.dark, + ), + body: + // networkStatus == -1 + // ? noNetwork() : + SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader( + color: Color(0xFF30415B), + ), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + onRefresh: () { + // _onRefresh(isShowLoad: false); + }, + physics: BouncingScrollPhysics(), + scrollController: ScrollController(), + child: Container( + padding: EdgeInsets.only(top:16.h,bottom:45.h), + child: + // ListView.builder( + // itemCount: 10, + // physics: BouncingScrollPhysics(), + // shrinkWrap: true, + // itemBuilder: (context, position) { + // return GestureDetector( + // behavior: HitTestBehavior.opaque, + // onTap: () {}, + // child: assortItemSm(), + // ); + // }, + // ) + // : ((productGroupList == null || + // productGroupList.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( + itemCount:6, + physics: BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (context, position) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () {}, + child: reservationCodeItem(), + ); + }, + )), + )); + } + + void saveQrImg(String qrImgData) async{ + try { + EasyLoading.show(status: "正在保存...", maskType: EasyLoadingMaskType.clear); + // 如果用户已授权存储权限 + if (await Permission.storage.request().isGranted) { + final painter = QrPainter( + data: qrImgData, + version: QrVersions.auto, + gapless: true, + errorCorrectionLevel: QrErrorCorrectLevel.L, + ); + ByteData imageData = await painter.toImageData(600.0); + final data = imageData.buffer.asUint8List(); + if (data != null) { + var result = await + ImageGallerySaver.saveImage(data, + isReturnImagePathOfIOS: true); + if (result["isSuccess"] == true) { + SmartDialog.showToast("保存成功!", alignment: Alignment.center); + } else + SmartDialog.showToast("保存失败!${result["errorMessage"] ?? ""}", + alignment: Alignment.center); + } else + SmartDialog.showToast("获取图片失败!", alignment: Alignment.center); + } else { + // 没有存储权限时,弹出没有存储权限的弹窗 + await Permission.storage.request(); + SmartDialog.showToast("请在授予应用储存权限后再试!", alignment: Alignment.center); + } + } catch (e, s) { + SmartDialog.showToast("22222", alignment: Alignment.center); + SmartDialog.showToast(e.toString(), alignment: Alignment.center); + SmartDialog.showToast(s.toString(), alignment: Alignment.center); + } finally { + EasyLoading.dismiss(); + } + } + + Widget reservationCodeItem() { + return Container( + width: double.infinity, + margin: EdgeInsets.only(left: 16.w, right: 16.w,bottom:12.h), + padding: EdgeInsets.only(top:12.h, bottom: 12.h,left:20.w,), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Color(0x0F06152E), + offset: Offset(0, 2), + blurRadius: 4, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(8), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + QrImage( + data: "555562332356564512", + version: QrVersions.auto, + size: 104.h, + gapless: true, + padding: EdgeInsets.all(0), + ), + SizedBox(width: 10.w,), + Expanded(child:Container( + height: 104.h, + child: Column( + children: [ + Expanded(child:Padding(padding: EdgeInsets.only(right: 22.w), + child: Text( + "海峡姐妹理发彭和会所", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + color: Color(0xD9000000), + fontSize: 18.sp, + fontWeight: MyFontWeight.bold, + ), + ),)), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: (){ + saveQrImg("555562332356564512"); + }, + child: Container( + padding: EdgeInsets.only(top:15.h,right: 22.w), + alignment: Alignment.bottomRight, + child: Image.asset( + "assets/image/bus_code_save.webp", + width: 20.w, + height: 18.h, + ), + ), + ) + ], + ), + )), + ], + ), + ); + } +} diff --git a/lib/business_system/scan_code_page.dart b/lib/business_system/scan_code_page.dart index 38701dec..2fba9600 100644 --- a/lib/business_system/scan_code_page.dart +++ b/lib/business_system/scan_code_page.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:image_pickers/image_pickers.dart'; @@ -9,6 +10,8 @@ import '../../retrofit/business_api.dart'; import '../../retrofit/data/base_data.dart'; import '../../retrofit/data/ticket_details.dart'; import '../../utils/business_instance.dart'; +import '../generated/l10n.dart'; +import '../utils/font_weight.dart'; import '../view_widget/settlement_tips_dialog.dart'; class ScanCodePage extends StatefulWidget { @@ -65,6 +68,40 @@ class _ScanCodePage extends State { } } + ///会员充值支付 + rechargePay(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.posMemberRecharge({ + "rechargePreferentialId": widget?.arguments["rechargePreferentialId"] ?? "", + "memberSourceId": widget?.arguments["memberSourceId"] ?? "", + "source": widget?.arguments["source"] ?? 1, + "authCode": authCode ?? null + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + Navigator.of(context).pop(1); + Navigator.of(context).popAndPushNamed('/router/pay_success_page',arguments: { + "rechargeId":baseData.data, + "rechargeMoney":widget?.arguments["rechargeMoney"], + "payIndex":int.tryParse(widget?.arguments["source"]), + }); + } else { + Navigator.of(context).pop([baseData.msg,baseData.data]); + }}finally{ + EasyLoading.dismiss(); + } + } + + @override Widget build(BuildContext context) { return Scaffold( @@ -79,8 +116,12 @@ class _ScanCodePage extends State { scanAreaScale: 0.7, scanLineColor: Colors.green.shade400, onCapture: (data) { - if (data != null && data != "") { + if (data != null && + data != "" && + widget.arguments["scanCodeType"] == null) { queryTicketDetails(data); + } else { + rechargePay(data); } }, ), @@ -136,7 +177,7 @@ class _ScanCodePage extends State { ), padding: EdgeInsets.all(8.w), margin: EdgeInsets.only(left: 12.w, right: 16.w, top: 16.h), - child:Icon( + child: Icon( Icons.image, size: 25.w, color: Colors.white, @@ -169,14 +210,13 @@ class _ScanCodePage extends State { String result = await Scan.parse(medias[0].path); if (result != null && result != "") { queryTicketDetails(result); - }else{ + } else { SmartDialog.show( widget: SettlementTips( - () { - }, - text: "照片中未识别到二维码/条码", - color: Color(0xFF30415B), - )); + () {}, + text: "照片中未识别到二维码/条码", + color: Color(0xFF30415B), + )); } } } diff --git a/lib/home/welfare_page.dart b/lib/home/welfare_page.dart index 895b8b2e..9277c070 100644 --- a/lib/home/welfare_page.dart +++ b/lib/home/welfare_page.dart @@ -26,6 +26,8 @@ import 'package:huixiang/view_widget/selector_store_dialog.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../view_widget/settlement_tips_dialog.dart'; + class WelfarePage extends StatefulWidget { @override State createState() { @@ -689,7 +691,12 @@ class _WelfarePage extends State { queryCoupon(); showAlertDialog(); } else { - SmartDialog.showToast(baseData?.msg, alignment: Alignment.center); + SmartDialog.show( + clickBgDismissTemp: false, + widget: SettlementTips( + () {}, + text: baseData.msg, + )); } } diff --git a/lib/main.dart b/lib/main.dart index 7492e671..5bb02341 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -96,18 +96,24 @@ import 'business_system/goods/on_sale/batch_shelf.dart'; import 'business_system/goods/on_sale/goods_assort.dart'; import 'business_system/goods/on_sale/goods_sort.dart'; import 'business_system/goods/reservation_ page.dart'; +import 'business_system/home/cashier/cashier_page.dart'; +import 'business_system/home/consumer_ranking_page.dart'; import 'business_system/home/flow_page.dart'; import 'business_system/home/hot _selling_page.dart'; import 'business_system/home/select_shop.dart'; import 'business_system/home/overview/trade_overview_page.dart'; import 'business_system/home/vip/add_vip.dart'; import 'business_system/home/vip/business_vip_page.dart'; +import 'business_system/home/vip/pay_success_page.dart'; import 'business_system/home/vip/vip_recharge_page.dart'; import 'business_system/login/business_login_page.dart'; import 'business_system/mine/account_information.dart'; +import 'business_system/mine/clerk_manage/add_new_clerk_page.dart'; +import 'business_system/mine/clerk_manage/clerk_manage_page.dart'; import 'business_system/mine/merchant_info.dart'; import 'business_system/mine/security_setting.dart'; import 'business_system/mine/shop_image_info.dart'; +import 'business_system/mine/shop_reservation_code.dart'; import 'business_system/order/business_order_detail.dart'; import 'business_system/order/order_write_off.dart'; import 'business_system/order/request_refund.dart'; @@ -527,4 +533,16 @@ Map routers = { HotSellingPage(arguments:arguments), '/router/vip_recharge_page': (context, {arguments}) => VipRechargePage(arguments:arguments), + '/router/pay_success_page': (context, {arguments}) => + PaySuccessPage(arguments:arguments), + '/router/cashier_page': (context, {arguments}) => + CashierPage(arguments:arguments), + '/router/consumer_ranking_page': (context, {arguments}) => + ConsumerRankingPage(arguments:arguments), + '/router/shop_reservation_code': (context, {arguments}) => + ShopReservationCode(arguments:arguments), + '/router/clerk_manage_page': (context, {arguments}) => + ClerkManagePage(arguments:arguments), + '/router/add_new_clerk_page': (context, {arguments}) => + AddNewClerkPage(arguments:arguments), }; diff --git a/lib/qr/invite_friends.dart b/lib/qr/invite_friends.dart index 8a6ed6b7..025656a3 100644 --- a/lib/qr/invite_friends.dart +++ b/lib/qr/invite_friends.dart @@ -293,7 +293,7 @@ class _InviteFriends extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Column( + Expanded(child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -301,12 +301,12 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/invite_wx.webp", - width: 42, - height: 42, + width: 42.h, + height: 42.h, fit: BoxFit.cover, ), Container( - width: 51, + width:50.w, child: Flex( children: List.generate(8, (_) { return SizedBox( @@ -330,8 +330,8 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/invite_1.webp", - width: 24, - height: 24, + width: 24.h, + height: 24.h, fit: BoxFit.cover, ), Container( @@ -339,8 +339,8 @@ class _InviteFriends extends State { child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -371,12 +371,12 @@ class _InviteFriends extends State { ), ), Container( - width: 43, + width: 43.w, child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -389,8 +389,8 @@ class _InviteFriends extends State { ], ), ], - ), - Column( + )), + Expanded(child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -398,17 +398,17 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/yq_zt.webp", - width: 42, - height: 42, + width: 42.h, + height: 42.h, fit: BoxFit.cover, ), Container( - width: 51, + width: 50.w, child: Flex( children: List.generate(8, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.w, child: DecoratedBox( decoration: BoxDecoration(color: Color(0xFF32A060)), @@ -427,8 +427,8 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/invite_2.webp", - width: 24, - height: 24, + width: 24.h, + height: 24.h, fit: BoxFit.cover, ), Container( @@ -436,8 +436,8 @@ class _InviteFriends extends State { child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -472,8 +472,8 @@ class _InviteFriends extends State { child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -486,8 +486,8 @@ class _InviteFriends extends State { ], ), ], - ), - Column( + )), + Expanded(child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -495,17 +495,17 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/zt_m.webp", - width: 42, - height: 42, + width: 42.h, + height: 42.h, fit: BoxFit.cover, ), Container( - width: 51, + width: 50.w, child: Flex( children: List.generate(8, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Color(0xFF32A060)), @@ -524,8 +524,8 @@ class _InviteFriends extends State { children: [ Image.asset( "assets/image/invite_3.webp", - width: 24, - height: 24, + width: 24.h, + height: 24.h, fit: BoxFit.cover, ), Container( @@ -533,8 +533,8 @@ class _InviteFriends extends State { child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -565,12 +565,12 @@ class _InviteFriends extends State { ), ), Container( - width: 43, + width: 43.w, child: Flex( children: List.generate(0, (_) { return SizedBox( - width: 3, - height: 1, + width: 3.w, + height: 1.h, child: DecoratedBox( decoration: BoxDecoration(color: Colors.white), ), @@ -583,19 +583,19 @@ class _InviteFriends extends State { ], ), ], - ), + )), Column( children: [ Image.asset( "assets/image/invite_q.webp", - width: 42, - height: 42, + width: 42.h, + height: 42.h, fit: BoxFit.cover, ), Image.asset( "assets/image/invite_4.webp", - width: 24, - height: 24, + width: 24.h, + height: 24.h, fit: BoxFit.cover, ), SizedBox(height: 8.h), @@ -613,7 +613,8 @@ class _InviteFriends extends State { ), ) ], - ), + ) + , ], ), ), diff --git a/lib/retrofit/business_api.dart b/lib/retrofit/business_api.dart index 0a9142b2..55adaf4d 100644 --- a/lib/retrofit/business_api.dart +++ b/lib/retrofit/business_api.dart @@ -12,16 +12,21 @@ import 'package:huixiang/retrofit/data/order_trend.dart'; import 'package:huixiang/retrofit/data/vip_counts_info.dart'; import 'package:retrofit/retrofit.dart'; +import 'data/add_vip_info.dart'; import 'data/balance_change_list.dart'; +import 'data/balance_consumption_ranking_list.dart'; import 'data/base_data.dart'; +import 'data/bus_recharge_list.dart'; import 'data/business_goods.dart'; import 'data/business_order_detail_info.dart'; import 'data/business_order_list.dart'; import 'data/business_store_list.dart'; import 'data/business_vip_list.dart'; +import 'data/clerk_manage_list.dart'; import 'data/day_flow_list.dart'; import 'data/goods_type_sales_list.dart'; import 'data/order_user_detail.dart'; +import 'data/phone_query_member_info.dart'; import 'data/popular_sales_list.dart'; import 'data/product_group_list.dart'; import 'data/recharge_flow_list.dart'; @@ -34,6 +39,7 @@ import 'data/ticket_show.dart'; import 'data/ticket_stats_list.dart'; import 'data/trade_summary_list.dart'; import 'data/upload_result.dart'; +import 'data/user_info_edit.dart'; part 'business_api.g.dart'; @@ -244,7 +250,7 @@ abstract class BusinessApiService { @Path("pageIndex") String pageIndex, @Path("pageSize") String pageSize); - ///删除分组分类 + ///编辑门店信息 @PUT("store") Future saveStoreInfo(@Body() Map param); @@ -306,4 +312,45 @@ abstract class BusinessApiService { ///订单列表获取用户金额详情 @GET("order/getOrderUserDetail?orderId={orderId}") Future> getOrderUserDetail(@Path("orderId") String storeId); + + ///根据手机号查询会员信息 + @POST("member/queryMemberInfo") + Future> queryMemberInfo(@Body() Map param); + + ///会员充值列表 + @POST("rechargePreferential/get") + Future> getRechargePreferential(@Body() Map param); + + ///会员充值支付 + @POST("member/posMemberRecharge") + Future posMemberRecharge(@Body() Map param); + + ///充值订单查询 + @POST("member/manualQuery") + Future manualQuery(@Body() Map param); + + ///新增会员 + @GET("member/createMemberSourceByMobile?mobile={mobile}&nickName={nickName}") + Future> createMemberSourceByMobile(@Path("mobile") String mobile,@Path("nickName") String nickName); + + ///店员列表 + @POST("user/userPage") + Future> clerkList(@Body() Map param); + + ///添加新店员,店员信息编辑 + @POST("user") + Future> userEdit(@Body() Map param); + + ///删除会员 + @DELETE("user?ids[]={ids}") + Future delUser(@Path("ids") String ids); + + ///修改用户信息 + @PUT("user") + Future> userModify(@Body() Map param); + + ///会员余额统计/消费排名 + @POST("dashBoard/storeMoney") + Future> storeMoney(@Body() Map param); + } diff --git a/lib/retrofit/business_api.g.dart b/lib/retrofit/business_api.g.dart index c4f22f15..124e27a4 100644 --- a/lib/retrofit/business_api.g.dart +++ b/lib/retrofit/business_api.g.dart @@ -851,4 +851,229 @@ class _BusinessApiService implements BusinessApiService { return value; } + @override + Future> queryMemberInfo(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'member/queryMemberInfo', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : PhoneQueryMemberInfo.fromJson(json), + ); + return value; + } + + @override + Future> getRechargePreferential(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'rechargePreferential/get', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : BusRechargeList.fromJson(json), + ); + return value; + } + + @override + Future posMemberRecharge(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _result = await _dio.request>( + 'member/posMemberRecharge', + 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 manualQuery(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _result = await _dio.request>( + 'member/manualQuery', + 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> createMemberSourceByMobile(mobile,nickName) async { + ArgumentError.checkNotNull(mobile, 'mobile'); + ArgumentError.checkNotNull(nickName, 'nickName'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + 'member/createMemberSourceByMobile?mobile=$mobile&nickName=$nickName', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : AddVipInfo.fromJson(json), + ); + return value; + } + + @override + Future> clerkList(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'user/userPage', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : ClerkManageList.fromJson(json), + ); + return value; + } + + @override + Future> userEdit(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'user', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : UserInfoEdit.fromJson(json), + ); + return value; + } + + @override + Future> delUser(ids) async { + ArgumentError.checkNotNull(ids, 'ids'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + 'user?ids[]=$ids', + queryParameters: queryParameters, + options: RequestOptions( + method: 'DELETE', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => json as dynamic, + ); + return value; + } + + @override + Future> userModify(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'user', + queryParameters: queryParameters, + options: RequestOptions( + method: 'PUT', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : UserInfoEdit.fromJson(json), + ); + return value; + } + + @override + Future> storeMoney(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'dashBoard/storeMoney', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => (json ?? "") == "" ? null : BalanceConsumptionRankingList.fromJson(json), + ); + return value; + } + } diff --git a/lib/retrofit/data/add_vip_info.dart b/lib/retrofit/data/add_vip_info.dart new file mode 100644 index 00000000..c0f48683 --- /dev/null +++ b/lib/retrofit/data/add_vip_info.dart @@ -0,0 +1,303 @@ +/// id : "1737361620364951552" +/// createTime : "2023-12-20 14:37:43" +/// createUser : "1640233401329909760" +/// updateTime : "2023-12-20 14:37:43" +/// updateUser : "1640233401329909760" +/// mid : "1737361616430694400" +/// masterId : null +/// openid : "" +/// aliOpenid : null +/// douyinOpenid : null +/// nickname : null +/// headimg : null +/// rankId : null +/// rankExpireTime : null +/// balance : null +/// realRecharge : null +/// sex : null +/// status : null +/// onCredit : null +/// loginTime : "2023-12-20 14:37:43" +/// loginNum : null +/// tenantCode : null +/// source : null +/// expendAmount : null +/// buyTimes : null +/// lastBuyTime : null +/// vip_no : "001119613052919191" +/// expireTime : "2033-12-20 14:37:43" +/// integral : null +/// level : null +/// vipRegStore : null +/// certification : null + +class AddVipInfo { + AddVipInfo({ + String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String mid, + dynamic masterId, + String openid, + dynamic aliOpenid, + dynamic douyinOpenid, + dynamic nickname, + dynamic headimg, + dynamic rankId, + dynamic rankExpireTime, + dynamic balance, + dynamic realRecharge, + dynamic sex, + dynamic status, + dynamic onCredit, + String loginTime, + dynamic loginNum, + dynamic tenantCode, + dynamic source, + dynamic expendAmount, + dynamic buyTimes, + dynamic lastBuyTime, + String vipNo, + String expireTime, + dynamic integral, + dynamic level, + dynamic vipRegStore, + dynamic certification,}){ + _id = id; + _createTime = createTime; + _createUser = createUser; + _updateTime = updateTime; + _updateUser = updateUser; + _mid = mid; + _masterId = masterId; + _openid = openid; + _aliOpenid = aliOpenid; + _douyinOpenid = douyinOpenid; + _nickname = nickname; + _headimg = headimg; + _rankId = rankId; + _rankExpireTime = rankExpireTime; + _balance = balance; + _realRecharge = realRecharge; + _sex = sex; + _status = status; + _onCredit = onCredit; + _loginTime = loginTime; + _loginNum = loginNum; + _tenantCode = tenantCode; + _source = source; + _expendAmount = expendAmount; + _buyTimes = buyTimes; + _lastBuyTime = lastBuyTime; + _vipNo = vipNo; + _expireTime = expireTime; + _integral = integral; + _level = level; + _vipRegStore = vipRegStore; + _certification = certification; +} + + AddVipInfo.fromJson(dynamic json) { + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _mid = json['mid']; + _masterId = json['masterId']; + _openid = json['openid']; + _aliOpenid = json['aliOpenid']; + _douyinOpenid = json['douyinOpenid']; + _nickname = json['nickname']; + _headimg = json['headimg']; + _rankId = json['rankId']; + _rankExpireTime = json['rankExpireTime']; + _balance = json['balance']; + _realRecharge = json['realRecharge']; + _sex = json['sex']; + _status = json['status']; + _onCredit = json['onCredit']; + _loginTime = json['loginTime']; + _loginNum = json['loginNum']; + _tenantCode = json['tenantCode']; + _source = json['source']; + _expendAmount = json['expendAmount']; + _buyTimes = json['buyTimes']; + _lastBuyTime = json['lastBuyTime']; + _vipNo = json['vip_no']; + _expireTime = json['expireTime']; + _integral = json['integral']; + _level = json['level']; + _vipRegStore = json['vipRegStore']; + _certification = json['certification']; + } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _mid; + dynamic _masterId; + String _openid; + dynamic _aliOpenid; + dynamic _douyinOpenid; + dynamic _nickname; + dynamic _headimg; + dynamic _rankId; + dynamic _rankExpireTime; + dynamic _balance; + dynamic _realRecharge; + dynamic _sex; + dynamic _status; + dynamic _onCredit; + String _loginTime; + dynamic _loginNum; + dynamic _tenantCode; + dynamic _source; + dynamic _expendAmount; + dynamic _buyTimes; + dynamic _lastBuyTime; + String _vipNo; + String _expireTime; + dynamic _integral; + dynamic _level; + dynamic _vipRegStore; + dynamic _certification; +AddVipInfo copyWith({ String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String mid, + dynamic masterId, + String openid, + dynamic aliOpenid, + dynamic douyinOpenid, + dynamic nickname, + dynamic headimg, + dynamic rankId, + dynamic rankExpireTime, + dynamic balance, + dynamic realRecharge, + dynamic sex, + dynamic status, + dynamic onCredit, + String loginTime, + dynamic loginNum, + dynamic tenantCode, + dynamic source, + dynamic expendAmount, + dynamic buyTimes, + dynamic lastBuyTime, + String vipNo, + String expireTime, + dynamic integral, + dynamic level, + dynamic vipRegStore, + dynamic certification, +}) => AddVipInfo( id: id ?? _id, + createTime: createTime ?? _createTime, + createUser: createUser ?? _createUser, + updateTime: updateTime ?? _updateTime, + updateUser: updateUser ?? _updateUser, + mid: mid ?? _mid, + masterId: masterId ?? _masterId, + openid: openid ?? _openid, + aliOpenid: aliOpenid ?? _aliOpenid, + douyinOpenid: douyinOpenid ?? _douyinOpenid, + nickname: nickname ?? _nickname, + headimg: headimg ?? _headimg, + rankId: rankId ?? _rankId, + rankExpireTime: rankExpireTime ?? _rankExpireTime, + balance: balance ?? _balance, + realRecharge: realRecharge ?? _realRecharge, + sex: sex ?? _sex, + status: status ?? _status, + onCredit: onCredit ?? _onCredit, + loginTime: loginTime ?? _loginTime, + loginNum: loginNum ?? _loginNum, + tenantCode: tenantCode ?? _tenantCode, + source: source ?? _source, + expendAmount: expendAmount ?? _expendAmount, + buyTimes: buyTimes ?? _buyTimes, + lastBuyTime: lastBuyTime ?? _lastBuyTime, + vipNo: vipNo ?? _vipNo, + expireTime: expireTime ?? _expireTime, + integral: integral ?? _integral, + level: level ?? _level, + vipRegStore: vipRegStore ?? _vipRegStore, + certification: certification ?? _certification, +); + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get mid => _mid; + dynamic get masterId => _masterId; + String get openid => _openid; + dynamic get aliOpenid => _aliOpenid; + dynamic get douyinOpenid => _douyinOpenid; + dynamic get nickname => _nickname; + dynamic get headimg => _headimg; + dynamic get rankId => _rankId; + dynamic get rankExpireTime => _rankExpireTime; + dynamic get balance => _balance; + dynamic get realRecharge => _realRecharge; + dynamic get sex => _sex; + dynamic get status => _status; + dynamic get onCredit => _onCredit; + String get loginTime => _loginTime; + dynamic get loginNum => _loginNum; + dynamic get tenantCode => _tenantCode; + dynamic get source => _source; + dynamic get expendAmount => _expendAmount; + dynamic get buyTimes => _buyTimes; + dynamic get lastBuyTime => _lastBuyTime; + String get vipNo => _vipNo; + String get expireTime => _expireTime; + dynamic get integral => _integral; + dynamic get level => _level; + dynamic get vipRegStore => _vipRegStore; + dynamic get certification => _certification; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['mid'] = _mid; + map['masterId'] = _masterId; + map['openid'] = _openid; + map['aliOpenid'] = _aliOpenid; + map['douyinOpenid'] = _douyinOpenid; + map['nickname'] = _nickname; + map['headimg'] = _headimg; + map['rankId'] = _rankId; + map['rankExpireTime'] = _rankExpireTime; + map['balance'] = _balance; + map['realRecharge'] = _realRecharge; + map['sex'] = _sex; + map['status'] = _status; + map['onCredit'] = _onCredit; + map['loginTime'] = _loginTime; + map['loginNum'] = _loginNum; + map['tenantCode'] = _tenantCode; + map['source'] = _source; + map['expendAmount'] = _expendAmount; + map['buyTimes'] = _buyTimes; + map['lastBuyTime'] = _lastBuyTime; + map['vip_no'] = _vipNo; + map['expireTime'] = _expireTime; + map['integral'] = _integral; + map['level'] = _level; + map['vipRegStore'] = _vipRegStore; + map['certification'] = _certification; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/data/balance_consumption_ranking_list.dart b/lib/retrofit/data/balance_consumption_ranking_list.dart new file mode 100644 index 00000000..4fed435e --- /dev/null +++ b/lib/retrofit/data/balance_consumption_ranking_list.dart @@ -0,0 +1,187 @@ +/// records : [{"id":"1706504181134655488","name":"","phone":"13052919193","money":"4000.40"},{"id":"1699803728942465024","name":"","phone":"18638550294","money":"1502.00"},{"id":"1699032834800353280","name":"","phone":"13339999709","money":"1387.00"},{"id":"1700069353317203968","name":"","phone":"18530077112","money":"1185.00"},{"id":"1723679701001568256","name":"","phone":"13253333210","money":"1000.00"},{"id":"1700896910958657536","name":"","phone":"15093345036","money":"800.00"},{"id":"1695700464139501568","name":"","phone":"15838033785","money":"780.00"},{"id":"1697426943734972416","name":"昵称","phone":"15827991714","money":"710.11"},{"id":"1692483888078651392","name":"","phone":"15538288982","money":"647.60"},{"id":"1698868848263954432","name":"","phone":"13073719376","money":"628.10"}] +/// total : "1970" +/// size : "10" +/// current : "1" +/// orders : [{"column":"id","asc":false}] +/// hitCount : false +/// searchCount : true +/// pages : "197" + +class BalanceConsumptionRankingList { + BalanceConsumptionRankingList({ + List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages,}){ + _records = records; + _total = total; + _size = size; + _current = current; + _orders = orders; + _hitCount = hitCount; + _searchCount = searchCount; + _pages = pages; +} + + BalanceConsumptionRankingList.fromJson(dynamic json) { + if (json['records'] != null) { + _records = []; + json['records'].forEach((v) { + _records.add(Records.fromJson(v)); + }); + } + _total = json['total']; + _size = json['size']; + _current = json['current']; + if (json['orders'] != null) { + _orders = []; + json['orders'].forEach((v) { + _orders.add(Orders.fromJson(v)); + }); + } + _hitCount = json['hitCount']; + _searchCount = json['searchCount']; + _pages = json['pages']; + } + List _records; + String _total; + String _size; + String _current; + List _orders; + bool _hitCount; + bool _searchCount; + String _pages; +BalanceConsumptionRankingList copyWith({ List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages, +}) => BalanceConsumptionRankingList( records: records ?? _records, + total: total ?? _total, + size: size ?? _size, + current: current ?? _current, + orders: orders ?? _orders, + hitCount: hitCount ?? _hitCount, + searchCount: searchCount ?? _searchCount, + pages: pages ?? _pages, +); + List get records => _records; + String get total => _total; + String get size => _size; + String get current => _current; + List get orders => _orders; + bool get hitCount => _hitCount; + bool get searchCount => _searchCount; + String get pages => _pages; + + Map toJson() { + final map = {}; + if (_records != null) { + map['records'] = _records.map((v) => v.toJson()).toList(); + } + map['total'] = _total; + map['size'] = _size; + map['current'] = _current; + if (_orders != null) { + map['orders'] = _orders.map((v) => v.toJson()).toList(); + } + map['hitCount'] = _hitCount; + map['searchCount'] = _searchCount; + map['pages'] = _pages; + return map; + } + +} + +/// column : "id" +/// asc : false + +class Orders { + Orders({ + String column, + bool asc,}){ + _column = column; + _asc = asc; +} + + Orders.fromJson(dynamic json) { + _column = json['column']; + _asc = json['asc']; + } + String _column; + bool _asc; +Orders copyWith({ String column, + bool asc, +}) => Orders( column: column ?? _column, + asc: asc ?? _asc, +); + String get column => _column; + bool get asc => _asc; + + Map toJson() { + final map = {}; + map['column'] = _column; + map['asc'] = _asc; + return map; + } + +} + +/// id : "1706504181134655488" +/// name : "" +/// phone : "13052919193" +/// money : "4000.40" + +class Records { + Records({ + String id, + String name, + String phone, + String money,}){ + _id = id; + _name = name; + _phone = phone; + _money = money; +} + + Records.fromJson(dynamic json) { + _id = json['id']; + _name = json['name']; + _phone = json['phone']; + _money = json['money']; + } + String _id; + String _name; + String _phone; + String _money; +Records copyWith({ String id, + String name, + String phone, + String money, +}) => Records( id: id ?? _id, + name: name ?? _name, + phone: phone ?? _phone, + money: money ?? _money, +); + String get id => _id; + String get name => _name; + String get phone => _phone; + String get money => _money; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['name'] = _name; + map['phone'] = _phone; + map['money'] = _money; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/data/bus_recharge_list.dart b/lib/retrofit/data/bus_recharge_list.dart new file mode 100644 index 00000000..47bb7ae4 --- /dev/null +++ b/lib/retrofit/data/bus_recharge_list.dart @@ -0,0 +1,304 @@ +/// records : [{"id":"1693482520970002431","rechargeMoney":"50.00","giftdMoney":"20.00","limitNum":0,"gitfdCouponId":null,"startDate":null,"endDate":null,"startTime":null,"endTime":null,"tenantCode":"1195","createTime":"2023-10-25 17:18:40","isDeleted":0,"rechargeType":0,"remark":"充值50.00 赠送20.00","sortValue":0,"useNum":0,"mid":null}] +/// total : "0" +/// size : "999" +/// current : "1" +/// orders : [{"column":"id","asc":false}] +/// hitCount : false +/// searchCount : true +/// pages : "0" + +class BusRechargeList { + BusRechargeList({ + List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages,}){ + _records = records; + _total = total; + _size = size; + _current = current; + _orders = orders; + _hitCount = hitCount; + _searchCount = searchCount; + _pages = pages; +} + + BusRechargeList.fromJson(dynamic json) { + if (json['records'] != null) { + _records = []; + json['records'].forEach((v) { + _records.add(Records.fromJson(v)); + }); + } + _total = json['total']; + _size = json['size']; + _current = json['current']; + if (json['orders'] != null) { + _orders = []; + json['orders'].forEach((v) { + _orders.add(Orders.fromJson(v)); + }); + } + _hitCount = json['hitCount']; + _searchCount = json['searchCount']; + _pages = json['pages']; + } + List _records; + String _total; + String _size; + String _current; + List _orders; + bool _hitCount; + bool _searchCount; + String _pages; +BusRechargeList copyWith({ List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages, +}) => BusRechargeList( records: records ?? _records, + total: total ?? _total, + size: size ?? _size, + current: current ?? _current, + orders: orders ?? _orders, + hitCount: hitCount ?? _hitCount, + searchCount: searchCount ?? _searchCount, + pages: pages ?? _pages, +); + List get records => _records; + String get total => _total; + String get size => _size; + String get current => _current; + List get orders => _orders; + bool get hitCount => _hitCount; + bool get searchCount => _searchCount; + String get pages => _pages; + + Map toJson() { + final map = {}; + if (_records != null) { + map['records'] = _records.map((v) => v.toJson()).toList(); + } + map['total'] = _total; + map['size'] = _size; + map['current'] = _current; + if (_orders != null) { + map['orders'] = _orders.map((v) => v.toJson()).toList(); + } + map['hitCount'] = _hitCount; + map['searchCount'] = _searchCount; + map['pages'] = _pages; + return map; + } + +} + +/// column : "id" +/// asc : false + +class Orders { + Orders({ + String column, + bool asc,}){ + _column = column; + _asc = asc; +} + + Orders.fromJson(dynamic json) { + _column = json['column']; + _asc = json['asc']; + } + String _column; + bool _asc; +Orders copyWith({ String column, + bool asc, +}) => Orders( column: column ?? _column, + asc: asc ?? _asc, +); + String get column => _column; + bool get asc => _asc; + + Map toJson() { + final map = {}; + map['column'] = _column; + map['asc'] = _asc; + return map; + } + +} + +/// id : "1693482520970002431" +/// rechargeMoney : "50.00" +/// giftdMoney : "20.00" +/// limitNum : 0 +/// gitfdCouponId : null +/// startDate : null +/// endDate : null +/// startTime : null +/// endTime : null +/// tenantCode : "1195" +/// createTime : "2023-10-25 17:18:40" +/// isDeleted : 0 +/// rechargeType : 0 +/// remark : "充值50.00 赠送20.00" +/// sortValue : 0 +/// useNum : 0 +/// mid : null + +class Records { + Records({ + String id, + String rechargeMoney, + String giftdMoney, + num limitNum, + dynamic gitfdCouponId, + dynamic startDate, + dynamic endDate, + dynamic startTime, + dynamic endTime, + String tenantCode, + String createTime, + num isDeleted, + num rechargeType, + String remark, + num sortValue, + num useNum, + dynamic mid,}){ + _id = id; + _rechargeMoney = rechargeMoney; + _giftdMoney = giftdMoney; + _limitNum = limitNum; + _gitfdCouponId = gitfdCouponId; + _startDate = startDate; + _endDate = endDate; + _startTime = startTime; + _endTime = endTime; + _tenantCode = tenantCode; + _createTime = createTime; + _isDeleted = isDeleted; + _rechargeType = rechargeType; + _remark = remark; + _sortValue = sortValue; + _useNum = useNum; + _mid = mid; +} + + Records.fromJson(dynamic json) { + _id = json['id']; + _rechargeMoney = json['rechargeMoney']; + _giftdMoney = json['giftdMoney']; + _limitNum = json['limitNum']; + _gitfdCouponId = json['gitfdCouponId']; + _startDate = json['startDate']; + _endDate = json['endDate']; + _startTime = json['startTime']; + _endTime = json['endTime']; + _tenantCode = json['tenantCode']; + _createTime = json['createTime']; + _isDeleted = json['isDeleted']; + _rechargeType = json['rechargeType']; + _remark = json['remark']; + _sortValue = json['sortValue']; + _useNum = json['useNum']; + _mid = json['mid']; + } + String _id; + String _rechargeMoney; + String _giftdMoney; + num _limitNum; + dynamic _gitfdCouponId; + dynamic _startDate; + dynamic _endDate; + dynamic _startTime; + dynamic _endTime; + String _tenantCode; + String _createTime; + num _isDeleted; + num _rechargeType; + String _remark; + num _sortValue; + num _useNum; + dynamic _mid; +Records copyWith({ String id, + String rechargeMoney, + String giftdMoney, + num limitNum, + dynamic gitfdCouponId, + dynamic startDate, + dynamic endDate, + dynamic startTime, + dynamic endTime, + String tenantCode, + String createTime, + num isDeleted, + num rechargeType, + String remark, + num sortValue, + num useNum, + dynamic mid, +}) => Records( id: id ?? _id, + rechargeMoney: rechargeMoney ?? _rechargeMoney, + giftdMoney: giftdMoney ?? _giftdMoney, + limitNum: limitNum ?? _limitNum, + gitfdCouponId: gitfdCouponId ?? _gitfdCouponId, + startDate: startDate ?? _startDate, + endDate: endDate ?? _endDate, + startTime: startTime ?? _startTime, + endTime: endTime ?? _endTime, + tenantCode: tenantCode ?? _tenantCode, + createTime: createTime ?? _createTime, + isDeleted: isDeleted ?? _isDeleted, + rechargeType: rechargeType ?? _rechargeType, + remark: remark ?? _remark, + sortValue: sortValue ?? _sortValue, + useNum: useNum ?? _useNum, + mid: mid ?? _mid, +); + String get id => _id; + String get rechargeMoney => _rechargeMoney; + String get giftdMoney => _giftdMoney; + num get limitNum => _limitNum; + dynamic get gitfdCouponId => _gitfdCouponId; + dynamic get startDate => _startDate; + dynamic get endDate => _endDate; + dynamic get startTime => _startTime; + dynamic get endTime => _endTime; + String get tenantCode => _tenantCode; + String get createTime => _createTime; + num get isDeleted => _isDeleted; + num get rechargeType => _rechargeType; + String get remark => _remark; + num get sortValue => _sortValue; + num get useNum => _useNum; + dynamic get mid => _mid; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['rechargeMoney'] = _rechargeMoney; + map['giftdMoney'] = _giftdMoney; + map['limitNum'] = _limitNum; + map['gitfdCouponId'] = _gitfdCouponId; + map['startDate'] = _startDate; + map['endDate'] = _endDate; + map['startTime'] = _startTime; + map['endTime'] = _endTime; + map['tenantCode'] = _tenantCode; + map['createTime'] = _createTime; + map['isDeleted'] = _isDeleted; + map['rechargeType'] = _rechargeType; + map['remark'] = _remark; + map['sortValue'] = _sortValue; + map['useNum'] = _useNum; + map['mid'] = _mid; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/data/clerk_manage_list.dart b/lib/retrofit/data/clerk_manage_list.dart new file mode 100644 index 00000000..ddbf2a5c --- /dev/null +++ b/lib/retrofit/data/clerk_manage_list.dart @@ -0,0 +1,511 @@ +/// records : [{"id":"1718209460100399104","createTime":"2023-10-28 18:13:53","createUser":"0","updateTime":"2023-10-28 18:13:53","updateUser":"0","account":"王松涛","name":"王松涛","org":null,"station":null,"type":0,"email":"","mobile":"18738828830","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/66165_d3QhlRvnTKGAo6s_1698281591/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1716755848744665088","createTime":"2023-10-24 17:57:45","createUser":"0","updateTime":"2023-10-24 17:57:45","updateUser":"0","account":"李晟垒","name":"李晟垒","org":null,"station":null,"type":0,"email":"","mobile":"17629876603","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/249437_3fqtwXiGSuKq7ld_1697021007/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1716755840049872896","createTime":"2023-10-24 17:57:43","createUser":"0","updateTime":"2023-10-24 17:57:43","updateUser":"0","account":"高凤丽","name":"高凤丽","org":null,"station":null,"type":0,"email":"","mobile":"17698645321","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/879260_Hq64nFhRQu-oyYO_1693879864/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1712817865955999744","createTime":"2023-10-13 21:09:37","createUser":"0","updateTime":"2023-10-13 21:09:37","updateUser":"0","account":"马增凯","name":"马增凯","org":null,"station":null,"type":0,"email":"","mobile":"18539252112","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/26498_W5VMMKB8Ss-E9y-_1697005237/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1700087952224288768","createTime":"2023-09-08 18:05:29","createUser":"1684404021814624256","updateTime":"2023-09-08 18:05:29","updateUser":"1684404021814624256","account":"美食街运营","name":"美食街运营","org":null,"station":null,"type":0,"email":"","mobile":"","sex":{"desc":"未知","code":"N"},"status":true,"avatar":"","nation":{"key":"","data":""},"education":{"key":"","data":""},"positionStatus":{"key":"","data":""},"workDescribe":"","passwordErrorLastTime":"2023-10-08 10:15:03","passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":"2023-10-08 10:15:03"},{"id":"1694559126463447040","createTime":"2023-08-24 11:55:54","createUser":"0","updateTime":"2023-08-24 11:55:54","updateUser":"0","account":"金威","name":"金威","org":null,"station":null,"type":0,"email":"","mobile":"15871028672","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/670541_3pcB-e15RfK-v8S_1666828735/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1693150526188814336","createTime":"2023-08-20 14:38:37","createUser":"0","updateTime":"2023-08-20 14:38:37","updateUser":"0","account":"赵铭","name":"赵铭","org":null,"station":null,"type":0,"email":"","mobile":"15238461762","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/139874_aavX133wRmuEdfb_1681271010/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1692815660305874944","createTime":"2023-08-19 16:27:59","createUser":"0","updateTime":"2023-08-19 16:27:59","updateUser":"0","account":"张培林","name":"张培林","org":null,"station":null,"type":0,"email":"","mobile":"17734788755","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/159908_v3PahHp4ToiDy3w_1692188937/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1692772387621175296","createTime":"2023-08-19 13:36:02","createUser":"0","updateTime":"2023-08-19 13:36:02","updateUser":"0","account":"黄婷","name":"黄婷","org":null,"station":null,"type":0,"email":"","mobile":"15623342902","sex":{"desc":"未知","code":"N"},"status":false,"avatar":"https://wework.qpic.cn/wwpic/289190_R216gvd3Qw2lLwV_1684395430/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":null,"passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":null},{"id":"1692710101808316416","createTime":"2023-08-19 09:28:32","createUser":"0","updateTime":"2023-08-19 09:28:48","updateUser":"1684404021814624256","account":"胡灿","name":"胡灿","org":null,"station":null,"type":0,"email":"","mobile":"15921879317","sex":{"desc":"未知","code":"N"},"status":true,"avatar":"https://wework.qpic.cn/bizmail/BW6FKlOvPUwibCldA3qzZWwzeZyBXjNuhF4CqibDByr4AwqFafL6eNmg/0","nation":{"key":null,"data":""},"education":{"key":null,"data":""},"positionStatus":{"key":null,"data":""},"workDescribe":"","passwordErrorLastTime":"2023-11-22 09:17:42","passwordErrorNum":0,"passwordExpireTime":null,"password":"e10adc3949ba59abbe56e057f20f883e","lastLoginTime":"2023-11-22 09:17:42"}] +/// total : "26" +/// size : "10" +/// current : "1" +/// orders : [{"column":"id","asc":false}] +/// hitCount : false +/// searchCount : true +/// pages : "3" + +class ClerkManageList { + ClerkManageList({ + List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages,}){ + _records = records; + _total = total; + _size = size; + _current = current; + _orders = orders; + _hitCount = hitCount; + _searchCount = searchCount; + _pages = pages; +} + + ClerkManageList.fromJson(dynamic json) { + if (json['records'] != null) { + _records = []; + json['records'].forEach((v) { + _records.add(Records.fromJson(v)); + }); + } + _total = json['total']; + _size = json['size']; + _current = json['current']; + if (json['orders'] != null) { + _orders = []; + json['orders'].forEach((v) { + _orders.add(Orders.fromJson(v)); + }); + } + _hitCount = json['hitCount']; + _searchCount = json['searchCount']; + _pages = json['pages']; + } + List _records; + String _total; + String _size; + String _current; + List _orders; + bool _hitCount; + bool _searchCount; + String _pages; +ClerkManageList copyWith({ List records, + String total, + String size, + String current, + List orders, + bool hitCount, + bool searchCount, + String pages, +}) => ClerkManageList( records: records ?? _records, + total: total ?? _total, + size: size ?? _size, + current: current ?? _current, + orders: orders ?? _orders, + hitCount: hitCount ?? _hitCount, + searchCount: searchCount ?? _searchCount, + pages: pages ?? _pages, +); + List get records => _records; + String get total => _total; + String get size => _size; + String get current => _current; + List get orders => _orders; + bool get hitCount => _hitCount; + bool get searchCount => _searchCount; + String get pages => _pages; + + Map toJson() { + final map = {}; + if (_records != null) { + map['records'] = _records.map((v) => v.toJson()).toList(); + } + map['total'] = _total; + map['size'] = _size; + map['current'] = _current; + if (_orders != null) { + map['orders'] = _orders.map((v) => v.toJson()).toList(); + } + map['hitCount'] = _hitCount; + map['searchCount'] = _searchCount; + map['pages'] = _pages; + return map; + } + +} + +/// column : "id" +/// asc : false + +class Orders { + Orders({ + String column, + bool asc,}){ + _column = column; + _asc = asc; +} + + Orders.fromJson(dynamic json) { + _column = json['column']; + _asc = json['asc']; + } + String _column; + bool _asc; +Orders copyWith({ String column, + bool asc, +}) => Orders( column: column ?? _column, + asc: asc ?? _asc, +); + String get column => _column; + bool get asc => _asc; + + Map toJson() { + final map = {}; + map['column'] = _column; + map['asc'] = _asc; + return map; + } + +} + +/// id : "1718209460100399104" +/// createTime : "2023-10-28 18:13:53" +/// createUser : "0" +/// updateTime : "2023-10-28 18:13:53" +/// updateUser : "0" +/// account : "王松涛" +/// name : "王松涛" +/// org : null +/// station : null +/// type : 0 +/// email : "" +/// mobile : "18738828830" +/// sex : {"desc":"未知","code":"N"} +/// status : false +/// avatar : "https://wework.qpic.cn/wwpic/66165_d3QhlRvnTKGAo6s_1698281591/0" +/// nation : {"key":null,"data":""} +/// education : {"key":null,"data":""} +/// positionStatus : {"key":null,"data":""} +/// workDescribe : "" +/// passwordErrorLastTime : null +/// passwordErrorNum : 0 +/// passwordExpireTime : null +/// password : "e10adc3949ba59abbe56e057f20f883e" +/// lastLoginTime : null + +class Records { + Records({ + String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String account, + String name, + dynamic org, + dynamic station, + num type, + String email, + String mobile, + Sex sex, + bool status, + String avatar, + Nation nation, + Education education, + PositionStatus positionStatus, + String workDescribe, + dynamic passwordErrorLastTime, + num passwordErrorNum, + dynamic passwordExpireTime, + String password, + dynamic lastLoginTime,}){ + _id = id; + _createTime = createTime; + _createUser = createUser; + _updateTime = updateTime; + _updateUser = updateUser; + _account = account; + _name = name; + _org = org; + _station = station; + _type = type; + _email = email; + _mobile = mobile; + _sex = sex; + _status = status; + _avatar = avatar; + _nation = nation; + _education = education; + _positionStatus = positionStatus; + _workDescribe = workDescribe; + _passwordErrorLastTime = passwordErrorLastTime; + _passwordErrorNum = passwordErrorNum; + _passwordExpireTime = passwordExpireTime; + _password = password; + _lastLoginTime = lastLoginTime; +} + + Records.fromJson(dynamic json) { + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _account = json['account']; + _name = json['name']; + _org = json['org']; + _station = json['station']; + _type = json['type']; + _email = json['email']; + _mobile = json['mobile']; + _sex = json['sex'] != null ? Sex.fromJson(json['sex']) : null; + _status = json['status']; + _avatar = json['avatar']; + _nation = json['nation'] != null ? Nation.fromJson(json['nation']) : null; + _education = json['education'] != null ? Education.fromJson(json['education']) : null; + _positionStatus = json['positionStatus'] != null ? PositionStatus.fromJson(json['positionStatus']) : null; + _workDescribe = json['workDescribe']; + _passwordErrorLastTime = json['passwordErrorLastTime']; + _passwordErrorNum = json['passwordErrorNum']; + _passwordExpireTime = json['passwordExpireTime']; + _password = json['password']; + _lastLoginTime = json['lastLoginTime']; + } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _account; + String _name; + dynamic _org; + dynamic _station; + num _type; + String _email; + String _mobile; + Sex _sex; + bool _status; + String _avatar; + Nation _nation; + Education _education; + PositionStatus _positionStatus; + String _workDescribe; + dynamic _passwordErrorLastTime; + num _passwordErrorNum; + dynamic _passwordExpireTime; + String _password; + dynamic _lastLoginTime; +Records copyWith({ String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String account, + String name, + dynamic org, + dynamic station, + num type, + String email, + String mobile, + Sex sex, + bool status, + String avatar, + Nation nation, + Education education, + PositionStatus positionStatus, + String workDescribe, + dynamic passwordErrorLastTime, + num passwordErrorNum, + dynamic passwordExpireTime, + String password, + dynamic lastLoginTime, +}) => Records( id: id ?? _id, + createTime: createTime ?? _createTime, + createUser: createUser ?? _createUser, + updateTime: updateTime ?? _updateTime, + updateUser: updateUser ?? _updateUser, + account: account ?? _account, + name: name ?? _name, + org: org ?? _org, + station: station ?? _station, + type: type ?? _type, + email: email ?? _email, + mobile: mobile ?? _mobile, + sex: sex ?? _sex, + status: status ?? _status, + avatar: avatar ?? _avatar, + nation: nation ?? _nation, + education: education ?? _education, + positionStatus: positionStatus ?? _positionStatus, + workDescribe: workDescribe ?? _workDescribe, + passwordErrorLastTime: passwordErrorLastTime ?? _passwordErrorLastTime, + passwordErrorNum: passwordErrorNum ?? _passwordErrorNum, + passwordExpireTime: passwordExpireTime ?? _passwordExpireTime, + password: password ?? _password, + lastLoginTime: lastLoginTime ?? _lastLoginTime, +); + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get account => _account; + String get name => _name; + dynamic get org => _org; + dynamic get station => _station; + num get type => _type; + String get email => _email; + String get mobile => _mobile; + Sex get sex => _sex; + bool get status => _status; + String get avatar => _avatar; + Nation get nation => _nation; + Education get education => _education; + PositionStatus get positionStatus => _positionStatus; + String get workDescribe => _workDescribe; + dynamic get passwordErrorLastTime => _passwordErrorLastTime; + num get passwordErrorNum => _passwordErrorNum; + dynamic get passwordExpireTime => _passwordExpireTime; + String get password => _password; + dynamic get lastLoginTime => _lastLoginTime; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['account'] = _account; + map['name'] = _name; + map['org'] = _org; + map['station'] = _station; + map['type'] = _type; + map['email'] = _email; + map['mobile'] = _mobile; + if (_sex != null) { + map['sex'] = _sex.toJson(); + } + map['status'] = _status; + map['avatar'] = _avatar; + if (_nation != null) { + map['nation'] = _nation.toJson(); + } + if (_education != null) { + map['education'] = _education.toJson(); + } + if (_positionStatus != null) { + map['positionStatus'] = _positionStatus.toJson(); + } + map['workDescribe'] = _workDescribe; + map['passwordErrorLastTime'] = _passwordErrorLastTime; + map['passwordErrorNum'] = _passwordErrorNum; + map['passwordExpireTime'] = _passwordExpireTime; + map['password'] = _password; + map['lastLoginTime'] = _lastLoginTime; + return map; + } + +} + +/// key : null +/// data : "" + +class PositionStatus { + PositionStatus({ + dynamic key, + String data,}){ + _key = key; + _data = data; +} + + PositionStatus.fromJson(dynamic json) { + _key = json['key']; + _data = json['data']; + } + dynamic _key; + String _data; +PositionStatus copyWith({ dynamic key, + String data, +}) => PositionStatus( key: key ?? _key, + data: data ?? _data, +); + dynamic get key => _key; + String get data => _data; + + Map toJson() { + final map = {}; + map['key'] = _key; + map['data'] = _data; + return map; + } + +} + +/// key : null +/// data : "" + +class Education { + Education({ + dynamic key, + String data,}){ + _key = key; + _data = data; +} + + Education.fromJson(dynamic json) { + _key = json['key']; + _data = json['data']; + } + dynamic _key; + String _data; +Education copyWith({ dynamic key, + String data, +}) => Education( key: key ?? _key, + data: data ?? _data, +); + dynamic get key => _key; + String get data => _data; + + Map toJson() { + final map = {}; + map['key'] = _key; + map['data'] = _data; + return map; + } + +} + +/// key : null +/// data : "" + +class Nation { + Nation({ + dynamic key, + String data,}){ + _key = key; + _data = data; +} + + Nation.fromJson(dynamic json) { + _key = json['key']; + _data = json['data']; + } + dynamic _key; + String _data; +Nation copyWith({ dynamic key, + String data, +}) => Nation( key: key ?? _key, + data: data ?? _data, +); + dynamic get key => _key; + String get data => _data; + + Map toJson() { + final map = {}; + map['key'] = _key; + map['data'] = _data; + return map; + } + +} + +/// desc : "未知" +/// code : "N" + +class Sex { + Sex({ + String desc, + String code,}){ + _desc = desc; + _code = code; +} + + Sex.fromJson(dynamic json) { + _desc = json['desc']; + _code = json['code']; + } + String _desc; + String _code; +Sex copyWith({ String desc, + String code, +}) => Sex( desc: desc ?? _desc, + code: code ?? _code, +); + String get desc => _desc; + String get code => _code; + + Map toJson() { + final map = {}; + map['desc'] = _desc; + map['code'] = _code; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/data/phone_query_member_info.dart b/lib/retrofit/data/phone_query_member_info.dart new file mode 100644 index 00000000..33e57cec --- /dev/null +++ b/lib/retrofit/data/phone_query_member_info.dart @@ -0,0 +1,132 @@ +/// mid : "1379254113602109440" +/// sid : "1706504181134655488" +/// phoneNum : "13052919193" +/// nickName : "" +/// headimg : "" +/// sex : "0" +/// balance : "0.00" +/// memberSourceCredit : false +/// money : "1.49" +/// memberCredit : false +/// greenMoney : "0.00" +/// raiseMoney : "0.00" +/// payPassword : "222222" + +class PhoneQueryMemberInfo { + PhoneQueryMemberInfo({ + String mid, + String sid, + String phoneNum, + String nickName, + String headimg, + String sex, + String balance, + bool memberSourceCredit, + String money, + bool memberCredit, + String greenMoney, + String raiseMoney, + String payPassword,}){ + _mid = mid; + _sid = sid; + _phoneNum = phoneNum; + _nickName = nickName; + _headimg = headimg; + _sex = sex; + _balance = balance; + _memberSourceCredit = memberSourceCredit; + _money = money; + _memberCredit = memberCredit; + _greenMoney = greenMoney; + _raiseMoney = raiseMoney; + _payPassword = payPassword; +} + + PhoneQueryMemberInfo.fromJson(dynamic json) { + _mid = json['mid']; + _sid = json['sid']; + _phoneNum = json['phoneNum']; + _nickName = json['nickName']; + _headimg = json['headimg']; + _sex = json['sex']; + _balance = json['balance']; + _memberSourceCredit = json['memberSourceCredit']; + _money = json['money']; + _memberCredit = json['memberCredit']; + _greenMoney = json['greenMoney']; + _raiseMoney = json['raiseMoney']; + _payPassword = json['payPassword']; + } + String _mid; + String _sid; + String _phoneNum; + String _nickName; + String _headimg; + String _sex; + String _balance; + bool _memberSourceCredit; + String _money; + bool _memberCredit; + String _greenMoney; + String _raiseMoney; + String _payPassword; +PhoneQueryMemberInfo copyWith({ String mid, + String sid, + String phoneNum, + String nickName, + String headimg, + String sex, + String balance, + bool memberSourceCredit, + String money, + bool memberCredit, + String greenMoney, + String raiseMoney, + String payPassword, +}) => PhoneQueryMemberInfo( mid: mid ?? _mid, + sid: sid ?? _sid, + phoneNum: phoneNum ?? _phoneNum, + nickName: nickName ?? _nickName, + headimg: headimg ?? _headimg, + sex: sex ?? _sex, + balance: balance ?? _balance, + memberSourceCredit: memberSourceCredit ?? _memberSourceCredit, + money: money ?? _money, + memberCredit: memberCredit ?? _memberCredit, + greenMoney: greenMoney ?? _greenMoney, + raiseMoney: raiseMoney ?? _raiseMoney, + payPassword: payPassword ?? _payPassword, +); + String get mid => _mid; + String get sid => _sid; + String get phoneNum => _phoneNum; + String get nickName => _nickName; + String get headimg => _headimg; + String get sex => _sex; + String get balance => _balance; + bool get memberSourceCredit => _memberSourceCredit; + String get money => _money; + bool get memberCredit => _memberCredit; + String get greenMoney => _greenMoney; + String get raiseMoney => _raiseMoney; + String get payPassword => _payPassword; + + Map toJson() { + final map = {}; + map['mid'] = _mid; + map['sid'] = _sid; + map['phoneNum'] = _phoneNum; + map['nickName'] = _nickName; + map['headimg'] = _headimg; + map['sex'] = _sex; + map['balance'] = _balance; + map['memberSourceCredit'] = _memberSourceCredit; + map['money'] = _money; + map['memberCredit'] = _memberCredit; + map['greenMoney'] = _greenMoney; + map['raiseMoney'] = _raiseMoney; + map['payPassword'] = _payPassword; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/data/user_info_edit.dart b/lib/retrofit/data/user_info_edit.dart new file mode 100644 index 00000000..82899a5f --- /dev/null +++ b/lib/retrofit/data/user_info_edit.dart @@ -0,0 +1,267 @@ +/// id : "1738082396969893888" +/// createTime : "2023-12-22 14:21:50" +/// createUser : "1640233401329909760" +/// updateTime : "2023-12-22 14:21:50" +/// updateUser : "1640233401329909760" +/// account : "13052919193" +/// name : "wu" +/// org : null +/// station : null +/// type : null +/// email : null +/// mobile : null +/// sex : {"desc":"未知","code":"N"} +/// status : null +/// avatar : null +/// nation : null +/// education : null +/// positionStatus : null +/// workDescribe : null +/// passwordErrorLastTime : null +/// passwordErrorNum : 0 +/// passwordExpireTime : null +/// password : "e10adc3949ba59abbe56e057f20f883e" +/// lastLoginTime : null + +class UserInfoEdit { + UserInfoEdit({ + String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String account, + String name, + dynamic org, + dynamic station, + dynamic type, + dynamic email, + dynamic mobile, + Sex sex, + dynamic status, + dynamic avatar, + dynamic nation, + dynamic education, + dynamic positionStatus, + dynamic workDescribe, + dynamic passwordErrorLastTime, + num passwordErrorNum, + dynamic passwordExpireTime, + String password, + dynamic lastLoginTime,}){ + _id = id; + _createTime = createTime; + _createUser = createUser; + _updateTime = updateTime; + _updateUser = updateUser; + _account = account; + _name = name; + _org = org; + _station = station; + _type = type; + _email = email; + _mobile = mobile; + _sex = sex; + _status = status; + _avatar = avatar; + _nation = nation; + _education = education; + _positionStatus = positionStatus; + _workDescribe = workDescribe; + _passwordErrorLastTime = passwordErrorLastTime; + _passwordErrorNum = passwordErrorNum; + _passwordExpireTime = passwordExpireTime; + _password = password; + _lastLoginTime = lastLoginTime; +} + + UserInfoEdit.fromJson(dynamic json) { + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _account = json['account']; + _name = json['name']; + _org = json['org']; + _station = json['station']; + _type = json['type']; + _email = json['email']; + _mobile = json['mobile']; + _sex = json['sex'] != null ? Sex.fromJson(json['sex']) : null; + _status = json['status']; + _avatar = json['avatar']; + _nation = json['nation']; + _education = json['education']; + _positionStatus = json['positionStatus']; + _workDescribe = json['workDescribe']; + _passwordErrorLastTime = json['passwordErrorLastTime']; + _passwordErrorNum = json['passwordErrorNum']; + _passwordExpireTime = json['passwordExpireTime']; + _password = json['password']; + _lastLoginTime = json['lastLoginTime']; + } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _account; + String _name; + dynamic _org; + dynamic _station; + dynamic _type; + dynamic _email; + dynamic _mobile; + Sex _sex; + dynamic _status; + dynamic _avatar; + dynamic _nation; + dynamic _education; + dynamic _positionStatus; + dynamic _workDescribe; + dynamic _passwordErrorLastTime; + num _passwordErrorNum; + dynamic _passwordExpireTime; + String _password; + dynamic _lastLoginTime; +UserInfoEdit copyWith({ String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String account, + String name, + dynamic org, + dynamic station, + dynamic type, + dynamic email, + dynamic mobile, + Sex sex, + dynamic status, + dynamic avatar, + dynamic nation, + dynamic education, + dynamic positionStatus, + dynamic workDescribe, + dynamic passwordErrorLastTime, + num passwordErrorNum, + dynamic passwordExpireTime, + String password, + dynamic lastLoginTime, +}) => UserInfoEdit( id: id ?? _id, + createTime: createTime ?? _createTime, + createUser: createUser ?? _createUser, + updateTime: updateTime ?? _updateTime, + updateUser: updateUser ?? _updateUser, + account: account ?? _account, + name: name ?? _name, + org: org ?? _org, + station: station ?? _station, + type: type ?? _type, + email: email ?? _email, + mobile: mobile ?? _mobile, + sex: sex ?? _sex, + status: status ?? _status, + avatar: avatar ?? _avatar, + nation: nation ?? _nation, + education: education ?? _education, + positionStatus: positionStatus ?? _positionStatus, + workDescribe: workDescribe ?? _workDescribe, + passwordErrorLastTime: passwordErrorLastTime ?? _passwordErrorLastTime, + passwordErrorNum: passwordErrorNum ?? _passwordErrorNum, + passwordExpireTime: passwordExpireTime ?? _passwordExpireTime, + password: password ?? _password, + lastLoginTime: lastLoginTime ?? _lastLoginTime, +); + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get account => _account; + String get name => _name; + dynamic get org => _org; + dynamic get station => _station; + dynamic get type => _type; + dynamic get email => _email; + dynamic get mobile => _mobile; + Sex get sex => _sex; + dynamic get status => _status; + dynamic get avatar => _avatar; + dynamic get nation => _nation; + dynamic get education => _education; + dynamic get positionStatus => _positionStatus; + dynamic get workDescribe => _workDescribe; + dynamic get passwordErrorLastTime => _passwordErrorLastTime; + num get passwordErrorNum => _passwordErrorNum; + dynamic get passwordExpireTime => _passwordExpireTime; + String get password => _password; + dynamic get lastLoginTime => _lastLoginTime; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['account'] = _account; + map['name'] = _name; + map['org'] = _org; + map['station'] = _station; + map['type'] = _type; + map['email'] = _email; + map['mobile'] = _mobile; + if (_sex != null) { + map['sex'] = _sex.toJson(); + } + map['status'] = _status; + map['avatar'] = _avatar; + map['nation'] = _nation; + map['education'] = _education; + map['positionStatus'] = _positionStatus; + map['workDescribe'] = _workDescribe; + map['passwordErrorLastTime'] = _passwordErrorLastTime; + map['passwordErrorNum'] = _passwordErrorNum; + map['passwordExpireTime'] = _passwordExpireTime; + map['password'] = _password; + map['lastLoginTime'] = _lastLoginTime; + return map; + } + +} + +/// desc : "未知" +/// code : "N" + +class Sex { + Sex({ + String desc, + String code,}){ + _desc = desc; + _code = code; +} + + Sex.fromJson(dynamic json) { + _desc = json['desc']; + _code = json['code']; + } + String _desc; + String _code; +Sex copyWith({ String desc, + String code, +}) => Sex( desc: desc ?? _desc, + code: code ?? _code, +); + String get desc => _desc; + String get code => _code; + + Map toJson() { + final map = {}; + map['desc'] = _desc; + map['code'] = _code; + return map; + } + +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index a4caac9a..bd15e52c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -420,6 +420,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.1.4" + image_gallery_saver: + dependency: "direct main" + description: + name: image_gallery_saver + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.7.1" image_pickers: dependency: "direct main" description: @@ -573,7 +580,21 @@ packages: name: path_provider url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "2.0.11" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.9" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.11" path_provider_linux: dependency: transitive description: @@ -581,6 +602,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.10" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.3" path_provider_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e11cf7b0..d199fc36 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,8 +81,9 @@ dependencies: # qrscan: ^0.3.1 scan: ^1.5.0 - path_provider: ^1.2.0 + path_provider: ^2.0.4 network_to_file_image: ^4.0.1 + image_gallery_saver: ^1.7.0 flutter_html: ^2.1.5 #2.1.0 chewie_audio: ^1.1.2 @@ -125,7 +126,6 @@ dependencies: syncfusion_flutter_datepicker: ^19.4.38 - dev_dependencies: flutter_test: sdk: flutter