From 11f931c998915bd4179dd7a04a11e038beafc450 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Wed, 9 Oct 2024 11:44:44 +0800 Subject: [PATCH] =?UTF-8?q?241009=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deployment.xml | 15 + .idea/webServers.xml | 14 + file/qr/friendPay_583486.png | Bin 0 -> 56838 bytes pom.xml | 179 ++--- .../controller/DesignCollectController.java | 114 +++ .../controller/DesignSignUpController.java | 115 +++ .../cms/controller/MpController.java | 537 +++++++------- .../com/gxwebsoft/cms/entity/Article.java | 4 + .../gxwebsoft/cms/entity/DesignCollect.java | 61 ++ .../gxwebsoft/cms/entity/DesignSignUp.java | 63 ++ .../cms/mapper/DesignCollectMapper.java | 37 + .../cms/mapper/DesignSignUpMapper.java | 37 + .../cms/mapper/xml/ArticleMapper.xml | 4 +- .../cms/mapper/xml/DesignCollectMapper.xml | 63 ++ .../cms/mapper/xml/DesignSignUpMapper.xml | 66 ++ .../cms/param/DesignCollectParam.java | 54 ++ .../cms/param/DesignSignUpParam.java | 57 ++ .../cms/service/DesignCollectService.java | 42 ++ .../cms/service/DesignSignUpService.java | 42 ++ .../impl/DesignCollectServiceImpl.java | 47 ++ .../service/impl/DesignSignUpServiceImpl.java | 47 ++ .../common/core/security/SecurityConfig.java | 3 +- .../common/core/utils/RequestUtil.java | 424 ++++++----- .../system/controller/FileController.java | 2 +- .../gxwebsoft/shop/config/WxMaProperties.java | 43 ++ .../gxwebsoft/shop/consts/BalanceScene.java | 8 + .../gxwebsoft/shop/consts/OrderPayType.java | 8 + .../shop/controller/CartController.java | 237 ++++--- .../controller/GoodsCategoryController.java | 407 +++++------ .../shop/controller/GoodsController.java | 12 + .../GoodsIncomeConfigController.java | 119 ++++ .../GoodsStockInMerchantController.java | 122 ++++ .../controller/MerchantApplyController.java | 245 ++++--- .../shop/controller/OrderController.java | 671 ++++++++++-------- .../controller/OrderDeliveryController.java | 100 ++- .../shop/controller/SplashController.java | 115 +++ .../shop/controller/SwiperController.java | 115 +++ .../controller/UserAddressController.java | 7 +- .../controller/UserCollectionController.java | 26 +- .../shop/controller/WeChatController.java | 97 +++ .../controller/WxPayNotifyNbgController.java | 1 - .../java/com/gxwebsoft/shop/entity/Cart.java | 3 + .../java/com/gxwebsoft/shop/entity/Goods.java | 37 + .../shop/entity/GoodsIncomeConfig.java | 67 ++ .../shop/entity/GoodsStockInMerchant.java | 66 ++ .../gxwebsoft/shop/entity/KuaiDi100Resp.java | 11 + .../com/gxwebsoft/shop/entity/Merchant.java | 8 + .../java/com/gxwebsoft/shop/entity/Order.java | 45 ++ .../gxwebsoft/shop/entity/OrderDelivery.java | 10 +- .../com/gxwebsoft/shop/entity/OrderGoods.java | 5 + .../com/gxwebsoft/shop/entity/Splash.java | 64 ++ .../com/gxwebsoft/shop/entity/Swiper.java | 68 ++ .../gxwebsoft/shop/entity/UserAddress.java | 6 + .../gxwebsoft/shop/entity/UserCollection.java | 8 +- .../shop/mapper/GoodsIncomeConfigMapper.java | 37 + .../mapper/GoodsStockInMerchantMapper.java | 38 + .../gxwebsoft/shop/mapper/MerchantMapper.java | 3 +- .../gxwebsoft/shop/mapper/SplashMapper.java | 37 + .../gxwebsoft/shop/mapper/SwiperMapper.java | 37 + .../shop/mapper/UserCollectionMapper.java | 2 +- .../gxwebsoft/shop/mapper/xml/CartMapper.xml | 3 + .../mapper/xml/GoodsIncomeConfigMapper.xml | 63 ++ .../gxwebsoft/shop/mapper/xml/GoodsMapper.xml | 34 +- .../mapper/xml/GoodsStockInMerchantMapper.xml | 69 ++ .../gxwebsoft/shop/mapper/xml/OrderMapper.xml | 1 + .../shop/mapper/xml/SplashMapper.xml | 63 ++ .../shop/mapper/xml/SwiperMapper.xml | 63 ++ .../shop/mapper/xml/UserCollectionMapper.xml | 3 + .../com/gxwebsoft/shop/param/CartParam.java | 10 + .../shop/param/GoodsIncomeConfigParam.java | 56 ++ .../com/gxwebsoft/shop/param/GoodsParam.java | 6 + .../shop/param/GoodsStockInMerchantParam.java | 63 ++ .../com/gxwebsoft/shop/param/OrderParam.java | 4 + .../com/gxwebsoft/shop/param/SplashParam.java | 57 ++ .../com/gxwebsoft/shop/param/SwiperParam.java | 57 ++ .../shop/param/UserCollectionParam.java | 6 +- .../service/GoodsIncomeConfigService.java | 43 ++ .../gxwebsoft/shop/service/GoodsService.java | 2 +- .../shop/service/GoodsSkuService.java | 2 + .../service/GoodsStockInMerchantService.java | 45 ++ .../com/gxwebsoft/shop/service/KuaiDi100.java | 17 + .../shop/service/MerchantService.java | 1 + .../shop/service/OrderDeliveryService.java | 1 + .../shop/service/OrderGoodsService.java | 2 + .../gxwebsoft/shop/service/OrderService.java | 52 +- .../gxwebsoft/shop/service/SplashService.java | 42 ++ .../gxwebsoft/shop/service/SwiperService.java | 42 ++ .../shop/service/UserAddressService.java | 1 + .../shop/service/UserCollectionService.java | 3 +- .../shop/service/impl/CartServiceImpl.java | 185 ++--- .../impl/GoodsIncomeConfigServiceImpl.java | 71 ++ .../shop/service/impl/GoodsServiceImpl.java | 171 +++-- .../service/impl/GoodsSkuServiceImpl.java | 9 + .../impl/GoodsStockInMerchantServiceImpl.java | 86 +++ .../shop/service/impl/KuaiDi100Impl.java | 43 ++ .../service/impl/MerchantServiceImpl.java | 12 + .../impl/OrderDeliveryServiceImpl.java | 11 + .../service/impl/OrderGoodsServiceImpl.java | 21 + .../shop/service/impl/OrderServiceImpl.java | 640 +++++++++++------ .../shop/service/impl/SplashServiceImpl.java | 47 ++ .../shop/service/impl/SwiperServiceImpl.java | 47 ++ .../service/impl/UserAddressServiceImpl.java | 15 +- .../impl/UserCollectionServiceImpl.java | 40 +- .../com/gxwebsoft/shop/vo/CartShopVo.java | 6 + src/main/resources/account.properties | 9 + src/main/resources/application-dev.yml | 3 +- src/main/resources/application.yml | 13 +- .../com/gxwebsoft/generator/CmsGenerator.java | 429 +++++------ .../gxwebsoft/generator/ShopGenerator.java | 3 +- 109 files changed, 5648 insertions(+), 1936 deletions(-) create mode 100644 .idea/deployment.xml create mode 100644 .idea/webServers.xml create mode 100644 file/qr/friendPay_583486.png create mode 100644 src/main/java/com/gxwebsoft/cms/controller/DesignCollectController.java create mode 100644 src/main/java/com/gxwebsoft/cms/controller/DesignSignUpController.java create mode 100644 src/main/java/com/gxwebsoft/cms/entity/DesignCollect.java create mode 100644 src/main/java/com/gxwebsoft/cms/entity/DesignSignUp.java create mode 100644 src/main/java/com/gxwebsoft/cms/mapper/DesignCollectMapper.java create mode 100644 src/main/java/com/gxwebsoft/cms/mapper/DesignSignUpMapper.java create mode 100644 src/main/java/com/gxwebsoft/cms/mapper/xml/DesignCollectMapper.xml create mode 100644 src/main/java/com/gxwebsoft/cms/mapper/xml/DesignSignUpMapper.xml create mode 100644 src/main/java/com/gxwebsoft/cms/param/DesignCollectParam.java create mode 100644 src/main/java/com/gxwebsoft/cms/param/DesignSignUpParam.java create mode 100644 src/main/java/com/gxwebsoft/cms/service/DesignCollectService.java create mode 100644 src/main/java/com/gxwebsoft/cms/service/DesignSignUpService.java create mode 100644 src/main/java/com/gxwebsoft/cms/service/impl/DesignCollectServiceImpl.java create mode 100644 src/main/java/com/gxwebsoft/cms/service/impl/DesignSignUpServiceImpl.java create mode 100644 src/main/java/com/gxwebsoft/shop/config/WxMaProperties.java create mode 100644 src/main/java/com/gxwebsoft/shop/consts/BalanceScene.java create mode 100644 src/main/java/com/gxwebsoft/shop/consts/OrderPayType.java create mode 100644 src/main/java/com/gxwebsoft/shop/controller/GoodsIncomeConfigController.java create mode 100644 src/main/java/com/gxwebsoft/shop/controller/GoodsStockInMerchantController.java create mode 100644 src/main/java/com/gxwebsoft/shop/controller/SplashController.java create mode 100644 src/main/java/com/gxwebsoft/shop/controller/SwiperController.java create mode 100644 src/main/java/com/gxwebsoft/shop/controller/WeChatController.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/GoodsIncomeConfig.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/GoodsStockInMerchant.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/KuaiDi100Resp.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/Splash.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/Swiper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/GoodsIncomeConfigMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/GoodsStockInMerchantMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/SplashMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/SwiperMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsIncomeConfigMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsStockInMerchantMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/SplashMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/SwiperMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/param/GoodsIncomeConfigParam.java create mode 100644 src/main/java/com/gxwebsoft/shop/param/GoodsStockInMerchantParam.java create mode 100644 src/main/java/com/gxwebsoft/shop/param/SplashParam.java create mode 100644 src/main/java/com/gxwebsoft/shop/param/SwiperParam.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/GoodsIncomeConfigService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/GoodsStockInMerchantService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/KuaiDi100.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/SplashService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/SwiperService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/GoodsIncomeConfigServiceImpl.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/GoodsStockInMerchantServiceImpl.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/KuaiDi100Impl.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/SplashServiceImpl.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/SwiperServiceImpl.java create mode 100644 src/main/resources/account.properties diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..a263ee1 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/.idea/webServers.xml b/.idea/webServers.xml new file mode 100644 index 0000000..ae7d8cb --- /dev/null +++ b/.idea/webServers.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/file/qr/friendPay_583486.png b/file/qr/friendPay_583486.png new file mode 100644 index 0000000000000000000000000000000000000000..6777c44bf7f582144eeac14580b894ac1abfc148 GIT binary patch literal 56838 zcmbrl2UL@36gC(IL_k2gfDjcB6#)xHX&FTXM8pP2jfm73G7cg^LZbAZK}Hy1AS%+t zfYeYE=_(?<7=#o?dfX8%3AXa7BCch7D(Uk)7L%`NYH?{lAf-|fk5CT#De zi;fpzJ9fZeJD@Mv_7uz(`sx4Q>%T?*|E&Q1_x5|3!tNdWcI*?|aR|0kVTYK)j_ocO z9FkMwf2Jb3cl zE~RUJl85dqpL&w@a<|U;>UNduLxAq-JAcGVNvo>uQ`gWttbgR_F%wfW^D}2HY%kbd zw0Cg4bmOM0oBJ&fPyf3CfkD9`q2UiA9!6rL9>v8cBqk-Nq(065>se0j-_P@26}>Jl zDJ?61Q&U@4-#}?>YVPRl>h9_N@bS~|$mrPk#N<~xi#_}A_qq9n#U<{KpX(dEP4L&& ze|qhJiT&>;`yYz^PkJdpdhHY!7ZaEKPp=(2BcVr3L0sbC$z6))u1WgcS2}d+$!_KI zSud;GrF2eT2UPC-F(j?3Yr@jw{-@gis@eZL#bW_J8O_hwTyD0Xa`h0fvBy zL`Pnw!v0@BRpwwjHs6G_frnQA*B(by~-iOs6^T z6VH}Dt8Ore_6iPcZfVNV^tu(;n0I7q4l{`oNt^Ny658!?O0)1}c#VFyDfpbV2E*nd zq_D01ESe(der?D!KmP`ywD?OdJHx=SHQMLOd(A1CK5Pjk?*O-@H+&CpVaKMd^0nV2 z{vRLr&+rC&4gqlDDF_R#qWLbOLHbPTOWbiVQaejX34gh$ron59jI2VLS?nT~ENq$9 z>e3U0ywb9%3t7jrdX;@6KL6;(h}RsE99ehogaaZTKu zt&B^+*yWBw{UIy+qJGxEKG3!+=OJ$sQ;bbJ*O(L8U~U%aw%HuPsqY>qmC^g=Jf|JF zF8dMTgFEb$C$27ha5@qZa6J9m``Z^?M-$!DKh^wslNr1Fg}gOD>1HHopW*7KSZOh7 zDKvS351X;;^SHdAfzjU>=$_@9wwGBrdKeShV zQTj!5Go`w|sjW57GTO;9smX#{KDpjN?um{GUhezmEdrmEBti{zA7=4O zN2w(U+}Rb=t`GEwM|?)_)&rFp6@C823$q?0g}fhJzw1Ujy$nCU??&DS{k!tu>8<9F zd(=Sx>y&YvIh(9>i3?BKh(6yladXJDWuK{`!LKHY{n zjmo9mb@e>6`u6V6lIkYP(^h8ztj-p#EKLEd12P5Zxob7lQ(I#mZh$?+WXvh$;LhMvXm3hi~s4lakM* zv=fq%d*2=yH9AmV*E-&6$!g(GOJ2$GdhQor;N<0O({aS}7JUx&H|G_`>}J($wn+B; zHY_%W(0-19-iFa>yjp<9G3O3+6EvynAxNn@8vM2IX<7{dJcmP>~RUH_V`Dw_cz`}v!8R8oX+e#A29~9QBG3Qqhz!c98pd{lvXEF5L-mFln z;mEzpxumNINvej)qmmLzh)jvebaYRyw)#5*8?Z`eBx0Ycn!+bw%UqzL&(|wm8QX@5 z_j8Ro#r?%ZC13QZ)_8P2!B8PS|k7lCb9x3MI?halPgrvET0G|z}8ESRM! zI^50-%$dXvT;)EjjwySscQK{J^Pe{IKYx(c`M~^2FEG`CtieCy!-L&^V8dC7B;X8A ztUB%7Q)?sMNauC%n2V&h&*Jb@ue5E2V~F0DS3wTBpJ`D>y6LM~4w76~z9F=Mqqbp~ zfhmSaW`pJOWE)m%oZ+^~Q*Q*xY!^97=Sdb^y064nAPpSOio&olDfEey?}L?A&H;qC z-XZ>7bl2ffZcJW`yVIcIpZ1ZurwO<*PzSQpBS_bsq5&k};G!<@1#_9CltN>0imS;^ zd=|j6lve>~JGbOg!kHv7kI?YY>;(;7i_>3p8z(9!97$ao=})_Pl%ae6l=}L|j+&y) zt5Ed+zkiU2@!z&#HS(RLsXpE{aEO0IaKn5r_6B=Cer_n&t!9e14U+{Ed*&FofYQ|C zVmqrMSPaFGt-v>bp7{D8r^d7CX2IXM@BB!}CU+6cLK1N0q-s9@vLJfs!GP8`Q_5G7 z5~xi_!f`juHucOHz98bakkxf->pO%x8OGke*IomA5B0AG996LLY7MIsp~c!zvC zLer$LO3R65eK7kyNyTQ5z?SH!eH6G-8ZGyFOK(2;!NKxHsxI&^99`V6&DAjz8%K7sxx0*rxn%J*R^0(Tmq^-fE6`l#pMK)OJscRsHi|AC{50hx#+4_?EVsRTb71n(oRyvV$)R?TtN<@&ik7;1(iw8@4ZE8wSUn1!x^r=?HPF zkXONYePAH2-r40QAgW+tR6|ZPuwLD&h$+1d&7($DbtHw5+=d&@_m%%xtaid!zFpgo zXv-b{eaXx{FXn?kCI)ps=y!$Gvx#&1iC5pAbvweTPdfH{wEHgtp&d%CS`lksp)}vg z)#TmeCTBYlXDOX)aKY)Z^_HP<<#B?N&7LJS{IQWkW<%Zgl_T$eT@alb3ElQQ>!J{po6x{3eMsvb$Mcv z*V_|^7T7nln)_JIi0>u#2HmP+S0IR@@x0Aa{Vz!C#ZnO%E1U~#Ti#9T&t?H!{1#VL#k)G9>-zWc%Fe1yP|J0Gjmo<~T*p=PIVu%m#2&2%p( zuC6<|EX1=up(@pHc-_nL7Skd|nDCKS*Lvz1e5x3R?d7Nenh@6F*a151i4_j_`X}}_ zj5Xhb*#V}pHq&m`L}TlBuS5Ih$7El0iAw}J3WKf)sd3aUD)#9^{oat5K_-7lp&u~# z87Gp0_K3KzFdq{4FPaSA3ai5l=DKt_W4dWt+pwrAfjyW_c)5f>_)hd;I3mNcogS92 zn(!*vGlrVWTCC6SzfeT)zaLZf&D-1gRM()Fm#EX72^Z|&0Ue}6!g>TVpCN7|iCyNM z1eHnzcP6L@1uiszlCj~8dOvdld{T_HcX&6%9<8eg91^IPFH*)S)MK=e2g~U5Li*5k zdNk^`sXE64hEOLk;}}2~g5$^E583m)z@C3wG&N3>4;-=CHwn^R;^I2-mT5f}q%^z^ z_KV|#aqjnxR@Ec-pgN_~Gp9}0|5o0_O*G*~eWTO)2b*~`M@Z!s1mH*lkGKew&1WZ8 zilIYdB`jTM#A!=|jwMSPK^az-Zv=MSZP=45q)KlvM>Y_y9XwtrJzVu-VncqV>`Iod zXZ+yI`P&V#V>zFee$7I$i&@S9+>t5B8a07}6Kjogu5z&-aN!LK%S6fo3kW53R*8|H z+P}dnu?L8)#{QMyfP2HB;CypJe?6&_qh23##WLp3(bW~>e+Sn&PJOh0p0G(k$Qs9z zj}?s*Y9cv1xGuaN@cAqzO{9cLAJ5ZochSO~Ym8m)&z zUh<0kyI;1U)TrG5?oco4xB`rDV@vDVT*0e_EqoE-a7EdzkVi4kc;%;FIhFf*(rqRB z1?3v{8Xu!hS$DoUbf_-=*s;gEidDdD$fe(fC6I zBhY14Nr>B3=}@eKDt1Z1PH>u!2BR;7rrcf+&^3fzm9ce^;=c{stxaNCUr{&qT-t_t z4M#K`(3bo8pv=(J$LTVyz<;Q?DR0J6;Sik!#c((zKpPtwIX?Lf@yf#B z2a=}(1@QlhYBL)1l|>g7;ui3T#dm^>Ub&Qd(1UB~LSj+63fQb%8Tq{Mf zKMUb)qm`_7zAKrgE)0ILGxf;-^`RLzqi4}F5QjkRdR;-2&US@LPS1_03! zO{mq(59hk{4mUhu@~6H}a*aqYrw5FaF?KzN3Kfm3v|4i71N#4R~aVMa3 z1?rUcTm)1z%1{)<9-9NW6JRwPrDegs`&3>WboXqeaLveuf7xq1qo#yZ94-$RD@yb7 z^4K`Aqvjh7AxB_B5E}Sx8?t}GK&-NB3d=| zr#;s$eJxsTD!}m|)h|Y28@5Y?3jpo-VUXqaQq^$c05QX`j-(<$fW}Zr{F=t*<+6UU z>mZCH{DU{r^~f-@;U3y9?LB=UsU8Ja4&KZ%fA(nP!_%4ib@L9RUeWG2C>oxtgCsoZ zi68c?tl&F3bIYlw&MbA^r!KoGk4@yI7qnp*Wfycz3>uMY3S#P`7b1Ak{7uxY2McK5 znd!O2kbv9r9mb%!F)tnzLhJntEtiWQgafundStgoZc3|7UT$g_Ugqz)(G7VyFtS%$ zby$zv-#;JU^AasPp3jm`CCC+Lcg?|%Y3?>9pBi^4^2)fvizY6#^gxa|$CzC1VE{MC zN+M}88Jo?nr}V@~cKO1&pQ)0R37oZB2Y*c+bn0~T-8a-~8x>@pq&wlCDWhehxjePI zev-3V?@-iw%64xaoiGRIUEnqpKqq@AL@%_o#_%0PU*1qpfO^0KY$e|pOkn-W8@bQ| zFrH8)joXuP_QE2JMEU4StIKRlA4=<(Wx-m-;vceA;eHq@Z7|$xlx}M8 zt&yq+`IJN!C(tYA%8b)dT-x7Xbz}d?&e~Jm{Nd?e!INih{HCo1c=76me=%fO^1^b|AhN^e_*uzwL_)5Rqd(^DtwQ->cokUnERMh z$KMTze;Df9Q{8w}_j=Fgr#d?;-?}~#hj6GKCe22HJ0MW77s;I*nFrjHRwa{KkMgeu zL$-{0K^GJEJqjvt*KS7pvG}`J@?8GHBD?9d1m+WEiP7~x$@h|JLGVQ=3rlDSn{W^% zBhD87Nj)l>Andi$Vq@T7G%F7bQw5UZU)MK`N3_{@`|1t18W&F;eu)#cSLd#l zyZNG9w$&)>^~9-j;xsKnJA!&r)CC8;h))e64jSQvcU9w4?-Mk z-ZOIs&`)laD7X7v7ht3_E)g0Q6?~TVE^V0%?xWRiNJhz$OG-oU!r&hwIVT~}MubhY zAOd(cydAlp5QzM`%tj=OG;p@Uw>Da$LA(<9%#TS@3Ps4Q6XkFhAf&mL_OS2-H-MZ& zDGlBW;^*DD38l#r-@Dw+%yLyJIS+Hn@B3*GUbiV-#^K|2|b zZjFYFSpq;TMU_Y++Iz%ADBq(k&lOIzM*s<3TYu5l;;fWPp_24sHJ8ctM*0KPS2>5a zevI&?W@IAs?Gulp!!8eQ!?XzyRhl0G5JfVtXbJ*E30&HDsZdOqC(^$KCVE-tnxgjd{l^rJw99i>y<6uFp>3zve!xKq@!{w_h~|~*ssd}((W!g&IW{Hu0-ZA zfm!~CAgXahU?|^B*o_OHun{A4s6<$g7jt#mo5M15o_c``*ajU`(UOhM5U158QjMo+ z-C9P!yw@?{ES6B}De|THky2=YuTQv0#++}9Mexc2Oo|DVHS_}#Uvjgo6v{$<6#%1r zKs3>r5zvwtwmCZnd8DLwG)Zf(C`n&Vfl9 zF9;mqUlX{R6Pd`^8ObqR(A&wyk{uPO>mF~;6@$?ZYR3CzE3k3yjnzZztkZ7|BBGT( z_endv7X$QJxtxAT&HM=jvz2;E_^j2BZ?&Wf2d?xZx(ba(pij`GwYS~r>&&6auQPTo zc~-^aqC&Xk9J`$23KUg8aeUZG>31H*T(R#(XAsJ?V!Cu=*Ft8CkL$#-hs}xJ6}xW4 z?*8;{Pifih-R-c6S)@RrS0rN$l!|0zfuFOI=~Re?;Fh*?kj&n66M`%@snh1f*n>6# zhi9WVvSw;1<~0(Lp)C{b=D~W`+CY1kw{P|MD(B|)lzW_|<(#7#1Av7vxlEk|K68L*XpBUnVfU3lYLv}1eoJe9AXM%aEoJiQa z%+`rwlT?uLV)!C9LE+odqv_=ahrEp<$vX$&*Zw;H>HE#*UAw=Z3y`N^-E@v=hOWXM zPr09cUwT#Y-vNQDtw_2EV2Gs7@%2zNjfjPHnxepmdpFlt0Tcszcu{H)(u98u-joTi zunRG9=Rwhf%bG_ZvY-EQY5cYbaw)8U&11rt_ z5Vj@vE2~nA=5<-`f#^R6;eUxe(rlDjj(0^!&0zwO6M&grT)bz=I@C z1ed`}7nTzO;ou?n6*75gOF!AhY{_QNn9Zp)REDk72+kv#tLE;5U=75ZF89eqRp|rB zq?LOS@cq~(Lv~|r&goLq(Hn%j1G|L?ArzsR(=<>gXax@FcRVE3BOZ(P;yk#Ve^np3 zr{m4=!-YrVE{#~7V{_ar%jSj!`mdKQco{6Tbhqp}&%!!~bk{U3&B@D&bAFC3+F^x& zf(GEhP?Vn}h~#2~DKxZ8hMUqNycPoH92@D-YarvgaoGazkxL?HgOH?cO(pin{^Xw( zC>T{k1j<*Bj<6Rsg<6+}#5X_8Z`nikA0f2sm|#G|-1k*qw_)diT#lw%N3?O0uW=Lj zj73up5osaz;`C;rQlPh!*Bt$!!3?iE=ogaf@*_f4{#N4LcMrY7p`0_uzSzeINl4um zBoH>R0*M*T!;d5WBf&0Ps*A+2BfRJl4*oc{>U|-MYt$CO@*%Y6ne>sJx$>-MOFk$K zVxqvEbq4>D?AiTl$*fR|I!HEJ^Y`+ax?8xmr3i^C24xc44I+3{U!X)}MRqf^e7qTg z05CEp25_JCExs?AEo_@*h)*tt8>h}b$h3??c2hOR>g4w_(gGB`mNvICYF-^bR{tFm z?)sXl-~hCyH?*dd%|V58Z~z1p>R$R0`9= z55LiUdY6w(#+c0NL5Jj3$izv<2RXcthB$}>+7$_bbw(!=)XPn_3YgW>ygF1z%OKPt zGOc2mJ7TP+Oo@^qGg?4W?1*pOyFcUWDAWmoY2{S+@5ypS66tD|uj7CFO>!gpf1;FO z4zQ=c!R}_ihehb}cGjA-VeH0d8*}Z(*4umyyq@1%eLcL!G2P9nWIoJ{_DZVD2}qn% zSD4L_lJ3*2FenQ+a3AX8;FO}d#w?evfg}q|GR8`;4BULLeF6wbN`3HMmcZ&8Py(Z` z4x#J&Om)K=hfCU=7XCVQ+6s0&t6GjWC;0|K9tb9r2p&XoPD`c`0+tbJG_}^Vl_&+T zMXCv?S%f7)@EkhWse`@_)xE_y2hd+vBjL;QHBbk3*5RwkT}!ZXViMGY$88QloX!I+uTE|KLDMsKJq6@o4Nm-4U{&!<$M1Ue)OSsV z^amdfpVbuKukgK43v5HN;7{Ok)Wf3Ty!lv>%% zZKc*G?&lhT1z5_GHCx)(8pn<@=?|6J?Vsx8bA=Vu*7y^tiT^+XA|aAa<_hxb1TTvV zfR=z$kBoVe=pbrh#sJh}Vq~Wmax!G8McXi`{fJ$vKYQ`|HKYAibpPSE=-0y=k&)hB zliqC*`=fMPB=<#FA`-*hY6I1wNQ@jYtx7K3O++>VylU>Lk@w@;D&PPR=~LH?l9_T* z11>8${z=UWIHr9a?tFDDlM7E~)-#d$X)0zcRlKJ1_r)p+((`A13X=9p&aS-MftU z2(ExZvp%OLT!FPTD}!>|vc=7Zn^*0AKhSvd(5&+)=jmPI)nU^kXj5ym*@*g$;?{+s z$MRjoNj08?Fa-)B-{dDrY-0CX8bjH?bqu2eh{$|<{1BazwBc`5dvq-OB0!99)njR? zn@)RncIId_G&khAJqxC66;_lp`rjwel0{jRM>iiPH!w;YEq2_=4v27UC zxlqLZe9x#scBfS-iAH>7z~~CFf;B;`!^ngdsyjRwP{tBFa-CQV6`v51{HWQ?Mf^ZS zi4!KW9HrquttIy(8o5*|lGfoXfbt?~eLh@pN0=o#gnCq(u#%^qLnX5hn*D`R zyRt(#1r?Y6!2GQFlZ|ayB25)1&vHpY%H!Nav~rULYO`n=XRdLg>6F8K;_AK#YfV>5 z^Sjne%?hm1i=QvUWxGxcD0ukW!=L*~L2iUdm-eIEu)8EWssjOB!X!ea<9)z>R%1y6 zpUa{>nb{3S{@2TRL`V@JOTDnUmk0lyFd@o&fkso^Hb-h`aaSEyBTh$_`FyjN`2KNp z70sCwkfCD87dj)g3ixS6?Fynszn7@kYs_)xn}hyWs)tQ8f^K+3U?BEQ>Nspjk^xpSvWkIv$V)XL)|m zrzeQI2@Ql4>LIK-&s+FPq=gIN+IOTJK*EEma-(5k7?XWrVa3&yQ7t2~p(_7Uo=9rN zf6QdOb%egE7RS-#?OHhr&iyzvq3f{iQkez*O0jp`%&O{ac}C{QODQ0`9W9YCDK2iRDOrub68(1tx8Y&jJK9_ z<3DyGZAF(7_FW-6+GNFh{Xk?_f!1lP#L`!yDMU?acQ5MW0}LGhMI$K=-4`<4T}odf z$lDxPZcg~75L$9E@dp%__J4J;e%h!w{4ir1DR#A&D@tG@x!5edzDJR&Zd2S>U}ZU<1s=>G>WK) zn2_Arc)ap3ErcAzixIxK10+^Omw|4Ku5H+!RU5-j7TWD7T7uIZU%~PTwLXc-8y?gD z@!HA9SM#Q$+tTjGS{o#Rs=i37#Se{nIVlKE?7LJwLVml#F{El@MY6|cdiM1fQ}a>K zoQlf9*m3&4S*HL>Cf(9s`M%5Y9DVnUMh(yE?8bwPIH5hTZr*D|c3YTTH9jVa&>{QIK#eRbYQ|cujlmELs1v z+EZs#xP~Z{&^||~4;2^*u#CV=M@XA)!_-lP+J~ilbDR{{yeq?V z2!|?PK*;HUcI8;=uYaRB`EIl(peKRXw>vB-Z}!1R$#Ybcb$8#d@Byo;UP8MAf%%m2 zE?1z+n_$vX1<~Aa-<)M;`@|h!GY!839C^Q48#<%O_4$$&Spi|I?r|bJd8WU3XqM!d zXI$%4>OJl2eazdivuC>T@_=FQHmoUd-|@iQ1~rxQEtH4lH?y6_;QC#7IF}*0-2IPA z_dh2pUln)lx6J>S`^U4lfBoE}t!>y+p*s}~KTK#ZLDr-rY6k?0#14c~y`~h|%8%~` zu0fk+-$sbhofDsN#(say>;`0;k6!g0c2?{Bx!h2rn*CXW-xwfnr?!;S1m(he!p8zj z{=G#c;9~7Q`z2qE<596>W}#Kp3F0i-6&3qhoyr%0ymiNAr}@e>|L8RCtT11or_$fsZv4c2Mita&mfwxK&f~ww@5<|Z z|7g#TW9mkCsjVXqro57N>o(^FA#|Lw1du1&|7$D}>6^0y0_Bz-1aOr&waKD%uO)FH zBxcdu)d-(8j<<4RWkj=SkmXdSQNPo_dB`hHef{PeqAgxf714Il3A=inNlWXb-@N=M zCL@}dg&6u$v(5>(8~e8{$#LAI?K=9@>`Gp`=fjsF(T7Qq)pz-(OJ2?fp59Sm#DBl& zWcwSS>F-H%^CCHjPmBEsm22&0h(JfYoIsPS_nOe4#*r^VhS*3X!Y0%Rd#G@4^*V-< z;702;O8 zcM@;Qk7K~IX(H*Q*){O+{EDStiC|x%sB<=mbB+w152;qA*)pBROa`kV3-eNwu@7wi zvL%xiMB$>TxlyuJai1|do=cI26|Kkf0w+L!(VkzRIo~gYP)mf2O84g_b9=jdP%I2b zmW_}m#cJqx8LOgf4mXdDwEqO($gAV*-%%!v>t))G_4_#a zb7@A55qdFSi+It(Qh|9fXv<3l4S|7KOrnYN9r)g0I=qV^8C-Z`q^=-L{A5XK$<(r2 zBq{(qSUc5kO39f}t#L%%pPTB_brvjOE4q<@w~H8|{XSj;w;wbGKJh!D(BkMUc?~d5 zT3NxFGvP^|g!Te`=J(RhX+0|!9c-rTA!CJwnS;YtmvdF~+_D2q)Kn=ara~V1yv;Mo zc0M4v6!{;$DRmAwEs`GLpRH=ArMgpm_i!2U#+3p`Ac(!11)<#DPMXTJmmYa)pv1cS zwI_sBBKm^;YPoVxtotc+b|QW0%WB`Xn)+tqFAczbMH6Zy-6pi3y3-;g(fkKe1_fv# z31`(0e}Y-ZC<+d6?Gui#n0ieu44GhL1Q@<~x|RBUiSbukg~hLL9nUlTr+oi%WK4iq zwkUCo^d^+>PNhoV%NXeVBs&`u=) zP#+OI7TGf(gS!iD+DXySquh9rHdf8mDH@a5AkqaWsaB|pg`FZxj@JdiHwE}U!XkE} zPy5gZUD)C|d{5Vah@oP>brX?SE0Tublmyhci-l$(6a^A2m#>=4`FM`VNZ<{+un6*? zPA8%^sk0!|+Ta4{#cI=Wtb?XI*ocfu!-(VuGDW4<#T_9>L*9Z#*Q1lDR0>70ZDbpE zX~)L>Lb^o3ZHFhRfYV3}OiRos2NXQ!cE79#b)DTdVB^Wa5Z;kb9ztr~TCB|>5c&px2Gp|tlEGTrO?}fa`0?#jC~fa>09TI^`&#w<68p=H^C{8r z*s7ub1e)WYPy`cRhtz;ta_tb4DE*SZ4-Ds#2?=VXU2FC78ra_V&82a3Yn1@CLW=OJZo-m1DPhsM( z2{eJdxgA@oDF8INOMS^4kn0c7(QGr6OfU+oH+TBw!owr=1@OCyi@vV;UcTNjRS?Ab2I1KEv_K>s?g4Ce z3``}lev0~N3ibWx`z{WPbimL#X#9{QUY~J(3rjZKRehWbZIqosjn7n8P4`9gOMg4< z5>7Tar0`Z!r3^M|bT4}+t3vZ(zbL1y|d!mn~lt zdbD_^SM%e&@mw_{+I$7z&Z9vtfPi;<6G5vKbeWY^>d}@12)x&u8kF|~se?;4M?f*| zp~1EyBsPwxu%KBy}&>a!iL>sND*_gbW1 zBn1>t{&se+M+k3-?%5%)u5fNo@R@~r!JGh!*0E6Ez5O_X`GP^gWFVL+ggX8A#>zN1 zZYZkI0MGzSd!VMmXd#TkT}x^;h+!K(oNAvr*1+Az9Y`>(aFUTio6wXO#w`Ly^SXA8 zpY=;Q*!Yha*S!mh2*AZP&;tHjZNsq93gR{aJa%p*D8>dNL@o_~pn7m7+aL1bk_Y~f~17qDSj)rX;Bpy7&#Ij7s+3h3Q59PQGD<>r(fuOaH z|E5eS?j0`lXeNadGV3CTgM+Tzqz;1WIx*g2El%wgw}2!#qyMop$}h6~AiD1UYy zkes9em*AigaU~o&mp1_X^HQuq*F%B~BA9P&7=}ahEwBS_4Qbt~ktYttH1pp#|1~r@ zB{&Css!d9}HjHMEl3yJ+MeDc(|4pL5*@hV#L(G6cGlPGf&~C9&;W8B|lImw8QwWOq z9aud2G+R5)JfYGw+L&(7BcwW=F?BF?0@r1twOo7#>xieK^tcz3BpQld-8xj2VzMxs zIe#sC>lAdVA-S0iggSeHa`t7gh;J$yeI%}}1HR;2gKFovcC=o!#pvRuw$+fS@m}v> z9cO43H6&nHmLGd+ml^e9`R(zLDle}Y=kQXpK+XL0V}dCGf?MDbdx5HfND2X|o(j@t ztF&-Pus4F`RF#f5fG!6h6R9>_Wby{-F4nEhcBkN0W;NN(^@hz z4LjaEUS9zc-9{rggd4Q+2(s^w*{frwK3A4d)3#TsEze4tT3TBgqYgJV7P?32<=6*4 zyyK`l@$Y^lJ7G^lv3JXXjN@UaQRR z8Rs6T$Sn#iQ7^LQnq}YbLSz*l=0>IpLdyHd*xs(016;SNvw^ucx!TobDEA+#cR0;! z*BhHi5`P!Gdc$vz^Fuh^~0-0Zf^^YMATcHtk<{%HOJ%q@kxBy z_u5KWG%F0br?yih^Wh9qe&0ovW8WL4olbQBs5m;OP7ZK4`5gMyW31Qzq>4t(T#dt# zfnVD&L}{_Idk#KPWgLs>rJey}-q?{rr5+o7Ah24jTi276u)(=;uFXC1)_k(C=yG#I zR)h1N>#)y#RFiuF7tdN8dwF)`X~Ee~N@=Y@QfEFH-Wz>2;?jS5kDHoIM(0?E|L>zG zv7W$#Wmfgg5cY|Umxe62j9Xs{9Biup@r=2~kKjY$rv1S-ER+!UBP0*rvu}NXSSU?F zVfAx;rHZhk;U3*v`76Fh-^HIR`=Tr*gN<_@4JtgBL`y#DC$zzTL{cVJX88fZj*&oB zkAf%IJTs<0f!6?^y&P^uzdCum(#s{pSIhImse(ub}qrvWiAE+WAH%)Mj ziBMS7HU3u|A1@@>q**R2!tdNtWPv2(W6Y5IAPVNL;*>Bd5G{X$jl71o zCWvHT2wy`}=t#i5z@1kPCUINdhw!zr1J}SXk?!#8alr+e>bm?+(4g~?>N7HQ&!#d1 zp5%4DHYRYZ&lRn6%Lk3F12<4)PoDaQiP;2gsFV}V_r>=z0DHvbr_LT5>lpp_aA~Rv z*4-J9Y#)dh?ejW=vz>Kzx;UIO(TU#yn5BCjZXGq!X>c?(ymZyjWC~NioHsUnvF4+G zI|I1P0FUQnbKjuFnC=`~LMb+!T{k!403>zYsSXioa|Io`u`|70ny*#2j3JK9+up=U zHT$j05r>?fmDg&BLxlEj24HJUUxR8TZZt21JF&v$+OpgsGy+iGi;h4;5UnS<_C8$g zv|Xff)T19LM|PX4wOFV20pfM@oIg8@8NHTv(Mq0QV+wq~u4=#+-sW2MHO7hU!F&0* z6&qZ9tySbD@AmOi#-qrv0td#IQ*H%kugF56A<^bIXxodI=7t%>HS&)Xdi_0gr9no` z@e|dx;P(D+M+2j5ET1ZK|F$5T(9;cAOXYstzfOR85l4D|d4UlAkvIoMxh{z1r!gzw zGHbM;ZCDCJ9jAsV!?^;5O+`2r&}r61VF4*+qm0u6dXv!s<5jIeK_O)!&D!KrIv9%j zmrF>-U44a7p7EvT?z3whF)5>sk;TNXu4r|XMasN84HG-z++TO{qfApnTt=^Y)dwP| zJ1Ylk3VWWs%}(vaP4@4WnoZI8?xEmp3JU=B{Z@f&_a? z<{6|XSFWg8)@+7tmN>q(+ve*nQz*p(D&y`Yn6!)12o1&pB?=Gf zEyfOsz94HGiuf*|d2fTKVM9KP23<=`>nuFn0$|c{h6thn0`NN@?b5NRx{8+kP{dJ*7^3~Wk%0syur9` zi#PV)ZQ5pym3-^A7^x8-ul{9`SQQnndqTXfPIdggEoPr&GGsL9ZWW90Rg8CASU|X4 zrGXzp$cqf{gM^(TrC_>zdfk+ZdWaI(yo41^lzTgeu)JD+vL^-BCH8-eYuJ4$y`5`Z zG)bTKetXC{WqpF<3LKu`y%6S6Ek$2)sfVGVdla{YWuIxY&xPH8$SnUFu!QaFgz_=3 zt-j{lSK+(K{C2Ax!$^$Q`cb`qYF^)Hs+xC!_%R2U$M9-nfl6sF4e+X>%kV%bGj|#% z+IK@;q736s8r)+F8+t2(p^k;$03s%mTrx4ZI};Y7j8FdQDGyLSq&(q~}2)TQ?J{3wClZF+3qx%Bass-YS7UC_dH$JJlUH z^DxsMeHFaa--X^E_+3}AOp=o%*!xqodxpTwWJuvn1XfMp&j{|w4X~Fh=?L8?5cn$R zw?8`kB!nf@Mk`&Ztr;rjswLxu7q_H5mt99M51u|X<#F+8XVCs1BDVWas4&|F;m7uC z+b|RyVmVgkx!LSojuSA@;j7pPNOqBpJG3RZlqWb-GKlQ7u^Fi{QFw!rQYoo@i&B^g zwb5)tMWg!qwQsFhRq(x{io7OEjD>suryFGiOA>IO#HoP7hPp5r5lD>RhAAMJBwxwq z38Q*UvS%fUo8Qw+=sYVr<_pSnJoG#s*}VTpaBT0@nxXY+lWo5>mG0-*p z;hWO?@4R5|tVr&Wund7-qtCK1EB1U>oID^`!8T3_VfXo%&&qdd`d~U96A3S-gK{&XxCiROdVcbKeE1Pbh|M6Vyaa7WB4~yoL>>4-4d#MG4l8^jVez4 zE72FY?D`tL$dm8CgjDCO_a$&$yJw1C_q|y1e9=D@@@`opC*|~_XJVB^{G*KTStkbm zU{+&l7hcGJ|0$CG4)lp+y4g@qs%oW(4F~m!={V;i{D-^%VrLha9rOZAd;dr>VMSnz zp6$Og%hsCcYLn^8%b?b>t&P^&<^A_a1!2O`rtdWH1$!P1d6WnR&?K84{xh=fVHK04 zfFDG_Y~%$2T(!=Mq*mZcEm!TmwiXu+LEg$@?0lnz)|V##==%W})6o;t)~`N{uZ2sr z_4Q1s0-s2>L%;18*c=4NJ!C}uiwP@)Sra;7{u>ym<#Hw4jWSYm;AiR3(}%68eY&=D zj`!Z(P5$}C;5mToFis%sS#7l|$C-iwz~*~TQkoI1&dMp8xh4q`Iwov%Mz1-fF8ekQ zu1`5`oc$|1rAoFd+1DOfz=-@+3uO!fGXt7KBTX*zhCyiWNk|C)-e9DXRIKD@jniyQ zLCOo<4N#2jqTs|0XH}Be1%E7e!6yq(0S_|)Y|1?oyJpenr<V)aJHy5OqRw6(dkIXJZ6vY0&-aYe;%a zCj+>;CW+0zD9keHgC}DE`cEW~^mtuf<|~*u)thHc>+C}&=B*{JFUJIRJ@R41YHx+i z{9w<~QMV&xF9vVC8tfk>w1?7|#cFtE=Nr7=Ko$1Ul~%iOX?t#IkEhm;UYl&c2<3L_ zeh(K#b+EMg^a`e%c1z?WgkeFid&R@p_EH(pDj@D%3oW zTK|^e6Z)vKyv*AvGN$Z*A?-bbn%ds5Zxj&$5vBL2G?6AVDT{GWAZ-e=yK_v<^3qkb@x&E9*h z`@Zh$`mF$o#w&eam%k1V{~UvF-~4H=_-uH%HyiaQwzzLsXa3YbI%~wghP^d$;eHmA zWKWe+zrI>8N6{B;g;T}X{7BJKW^4qz2ydzmlm8}$^P|6NyZ7ETAyh1Z!m5`tvE(aa z8c5{U;$}}-zh3V3{&Gdt_KyGi(G0bV`L>1ch$j4P@mUWeRVp{5$4Hf1CZdkp4V>lw z4`=~c38wIxOg zZUEmb4v9X{VLg}`8R*+O=C8!!qeWZ%t3TF@6!0JC+Q&>~6qhs2k}wK_>RC6p1Lj?1 zO4?UOH%d7c94Scn7Y&uc(xsqf7Tk4$POiaxvh6xg%*tn`-yoa;pot@FFYxdw)Qgl;6}B|MF=^KD?e6viq~70*ur+#>>9e<@A%Ed(NR-vgI8c0} z<~@E;c-Ma&9LFJ{N;+vSd!S2ZrUaTS#iYGsw*NJe215*%5$G|T$>-XZC{le>oaAL-o zdYm-m8OG3cK_+{(wHPd&BBJj32&ukLVX2m^IgAgMo7KRz1Jc>Zm_B?nZxS9oHn;SF zAk}0X6jZsEt6;&bOXJ=|$TM4BJnyCnYUHGZKlvioH97Y?&x+WTr`V>?3dDB@ktpAV z=6xwk8wyOzy%X$MguDzp=H0-H zu1#Q{*3mkca<%M)+QK*ijLv>!Y3{&|Bj*^NUJsoU>cxNN{UEOiK0SL?dh_{#$y&@g zX6T15O~z(66(+TWyL8~*h*i7A3`z`hNB+?a1nM;3j>BpNY8Zzo$qmi$n`epnSMiSe zV}ejb?_QcG&7IeTDVS=JU6$Kc_IYh4P47Xy><|Xe)2pT)Shafk>i3T|r6-SlhkLPJ za(F;(q5^~lB*Tr6Y{v?M$l=UWaP8{Ri81EFUhNFrm}+y(B;da9fdqMscf?b<67P8| z!c|R+2Wz`P4u*X-$NOeYvlGF`AV`!+umg{+7i%RE!wST!)^zWt0J5g%P5o3~~i9g1DV}5pnZy~j^6zKYH43bWXiPVk zxSHSNV0m|*Y(6hBS2%xG?Q+N4J2!4QzkHd@Uv)^m_X(HcEB=3X@X7MrO!3w#2u&>*)t&V+`#LgOsBJ#7iAb zU~JCzj)XI2dk}_Q%x}+Fk2wkqhcfDdyBezVZIg|_XTLpNbWHg7f;-do(iqjh-?ct5 zN56T)`zsw7T910PMMYNlwf7fSIGI;ldFU!cj z@-=5BN1UXRGTPFf{zLuYA_|=!SSuTGvh}liZEcyh(9S?TKU8s`6*EGR^@#-ruMe;| zlvv3!ZgRAgDG5?JThGC4WS8QmcWMW7VRl|5M21{Fxu4?3%c3b`r&N%mRiC0FLXJZxZCVv zJf&dq^aRoUK#cVV^gpfxH794NzB_-5j1t8iAwq48t)5>5MsmPoeNIj-_C6Fa)GO`2 znRMi_#gc0Q`sTW(-g3h5*+nPOifvV<4Mz~{IkA^mkEZo+fRW0BdQqGeM zR5ifP_&1S*( zsm%2kgEDw;Es|HHr{xCb>EIo$xF+3m_e5U>o^g7bbqEfkP_1AHkGO*G9s)!V!Ul;U zu;&etDM9mN11LV6In%C3UKYxx)@N{z&BiEWwf=z6%55d9AZewU#!US=;1(pb+9mg? zIeDvOCX66CQtEQEMf=N~`w>@Nc0Rt_2}!9(H7>D))u;q=P%=uErNk5&$U}<5o!>w< z-9=(hh(AaK+l0LKXRNi)lvOUG=UZ}oD^^tlCF*iL*(!qkIQ;*%U(tG7ks<%JUq*=~ zdXLBbeAq;G^Z&T+BIl4Cei=sp5LIOZ%_y*hN~l+4?&P^MhO<#??JCJ|g?cN$Jsq@% zBvU*gs$#9(Y9}`Xvw6f(5FL5+bXQAT{IT!c+m?Hv>y85>O3HIW^B)G{A)N7G+!1EN z`lkhj z)Io(XP@*l-x6+QyJg!efT=82JU?7v5R|9KQws+VOmdyW(Q@NRH?~7mk>-s`9D;|6l zmYL!g#VezleOXe*4Bg)9@S2!@QZq80BeABX_ilhPmLaV{=tUksw%n0*4dYA8Jl+QY zY5q)?`I~RA2JLK}9Mg4GaC4J*pXEpLCs8tC3>#7kjA5b$sYLW^9l?b_lCY;lJ zSLqNE@8~cN0db#)$Sy0OM{GpAVS!PdZUlw!(be;^np2HoCyIEaPy z@TOGs6VGG^FA5|%2=K=B-5SBB9T*?kcK#NoO?+>k_08#vwO1-l_D+RGxd3-cpV!-F z&lK`4mGP37i2o>FiA-WV#rTNO#ESZb=@uwzE`qxd=6grh%l zjZ}KRhW6)sG?rpR4+I>I%9Gys8#F8|Mkj8q>&}1edt<(G-ifUB>Wx=$*`FK~3&_~9 z3o&01ms*%XaS!zI+$^KXt#4CJk>w100=)3i$6?DWr89f&b&XL~Bbdu3FS6DyW~~?u zU1z-KiD|vijg6F-{m8ssSxBCTf6Nd%Wg`^7zjC%&bv(z3J{hliCxOqtf?vE+#_q-I zigLp67ool->+_37P!jp`Gl_WYSmkZX@v)SL4`RZ5>l5C=OLTgCB>xZ#6s(kWP|@zD z=~`TRbXlyRr=0tgl#l4SnOy1f0b+QWW2gVTc0~3h_H@SI8NIh{a?SG1m2>8na~93z zGMvADZtRd>A2wHMQ+|ocBCI~_uvk@fc2}M!-6=3{jxI3o8oK+Msb&?B>vG4nfJMQJ}Hv& z#>wH;*nM=vFs9xz#_OOFNZhjcKC$~jH+g(J2pTu85_L;%`}V2aTGL#%P(Vi>KxW1_f6(+D0cfua?Q69XcL zW9-WQId!;sg|o{b&&(_42h8iX&ga?I85F6&*4!=4gZc*K&p?$gvDv+mrWo2-+AF0z z%KQ3fKZnC{t!WIn;h+CrRL_;_S2$EaS<^i9@uxcK`1V}})&+g4Pjs7wY6%PeEbDRp zR;4RlYr$)e|G%`({b;pb`Ad-C!Oi+7BtLw-e>t|*64;c+r2LA&^!~8n^Dw>eiIvHX zT|(2^zI`vjC)O^)>y2xN^VjQd-Qk1KZ|3E_4@^`q>Ie#ZcD4rq1aiuoWewV=IfP26 z+LegWJXI_K+L@$*l;%zs7(e#Wrp@v1LQ!RYgOVN6CeMVw$oS<;un&X#+>bj7ZPQT; z|3v}tf-FI(tP;yFDAVooAVzxRZ{1DhgPGG+=f5qM0c|6YW_%ABTit>NWr-qzrc zL`RxTN&l8?^7x>Pj=4;wnVGHq^YJI%-goU^Jh>Bl>?jFATlaQ5fq8jXht+;blgFXg zGrCAV$K_7Q+cJl+-1DdE#VajpHJ$F{icMD7o|k9`qRRQIw! zCjB3sGrr)4w`?b^mmNrBQMCS!11BhsV)#Ljn=ZW&-O-DZ-yP$|s#r6_i3X22mI3n> z8R0ULbr_Yz5n;aOl&#n82kIBd`g4iLa*$87=IAtFKk3fQAn_s2ufA(CL~uh-srXa6 zs-7#(pVwMODqY_?fDC_yOtru0g(caVQp)U}Kd2 zFd64aLmt9in}A=d?XLWaMfDoRJXO#Cn=zI=Ycg8i?$IFjuWngiQ-mtdMr~=Uc*HHW z0aP{CtiV$0`Mrl9->nqcrHRtu!rR$5=#;Q!RCG;Y$Pb|Z5;YVRe4PNd=`ex5)K zF~*A%n6T5?!)|9w_+Ocjb;!%m#|Q_14v}cwm;N+m4jRS_ZO!N)Pi3M;q6mfxjOYQ3{EpM^0IlESZ$}A%q*5+4F0m zY90&oU)PL?xie#8%~LHBXn4!p5K<$IC8hLtAEtEee_Sm>8_%me7Mp^tssYX^h7sMI z{z~Uh>8OiDJiR+AB&-MJ;I5WMX6OHecH%7l2k`00@V@I#S2);*#_PaR` zim1$rK3Ee_%w;%yuv$QVf=}s#=w*}8hWUXO6x5IBgE=yJz9luIj-WY4<4w_#O+k?5 zhDJ?YQyRJA3+nrx{Q1_#gnQ_MXqR(d3DeooB?xSnM{Dri_Ymh<4&%hg15;@01L<%W z8`%eZ-Y&m-w~|rP%TOFW2QBC^sv4dyz0mXP@y1s+r=CB$;wHfkSSP=gYL^%5zgV>I zz`rpmOD})vi78(-$bB51lThm5f=MrHdNd<$F!QO#Ah%`aQIF)^rj`_iR5h&lIeLQl z#n^MVki&L+qhQhauLm4LwV*b(o=)QBU5nC zhaAxJ#|K%)_0Q}p73Gz!&g^>>D<^mse?iaR2{s9d_EIjD`xn?|t*;2#WSfucMW1*5 zk#6m-YcaX=TVL&U;*VQdA17pdyV|s?OanFN6+*Pr#g1ng^x1!qjcH`0QO%NB=wg;R zlb5WOw7=DBbDX?~KY`tHVnif0Ye{~;5E*NqWX9B3DKuy-@6XEA(Q72eo1O7}rgm9` z2{ME>dnoqbcrW~C5ejmB``{Mt512RtQ!Pij&EEefa5%b{@^APrZdYJiU3(%b+oeTnnyJ z-G2)mVOMoscHw|Vw$X6_Kd^|;>Lp-@`=3Mrxm6w@Jb!8 zVM);mDP8B7_BlOfz8LBP+Xs2dDL}%}P$IB#Ae5ReV$x|ST=p*VIafXBIpGvSg(b^C z?%5=A)NxlK3{?xVk*8lD*MlV^R2id*@Vnc+pT4ddJ$gw~`{7y7SNwt;>K(*0@lW1rWX$B*Q8-mPXmtFl+-#4QD3m<_<3~tgC;JgH1>Id5%m|=Ng1J|pyzqNR zXO=ciE`mJ&sIum}h+?KF_ekBbILB4qo@9F6*|=Ku{=E$D z!#Z_fA~S0LBDMmIWsFk6Gj;_(-^e-sfn5v_VWQ}~y-Ts+A@1pXNbcuoF)goJQ+ z7)j5XH1HdXs!SeEt7dvFlzHPl)4S&NKd9fZg`QFWUEY*BB+4!EvZ9PTW;3+ZbEDODtP0Y?MJAda@QF+llG^buEXmvo$UrhzBhTu;1wGiZA49QSWoZmHp6SF~&PeyAd`0x>!vyAj zyGYDwX~ivk*bp^>&lMmbHh%jc8!xv_lAv5bcO%pY{G6!t6pahr=Y4Yq>`HF}6vFG9r-q&1- zBFoD#?bG}7Kxo)6MsZTJwoZMsX(P(~?TmWhgDr)hbsK>i`T|jDk+pTN*?HnM>*|81{0lb#8(e$MRjrh0y~{K=%fST>%(jw%=oWl;%#(e{3hsp+t$@ zGshrxlfvdCmPi!cBqQl4!L!WSm@z*;G5T@-;seaidw4X}sTLFVkH&F>nYTS@fw_aC zK8u&{|13#9oB+30dR58TjJjx0cATK|!lilA$!O;BYVrQ;6ReBmk}OfS=bo1ol_`IY zA$I;#c7SdL;@ronzrVOV%K8=dcyY`avb6X0zF|AME+%Gbse4lFs%)0|2W}wQbJ7r8 z_-@G=NkPO#pC?LLy$4}NkhxawF7+x_|7!?80}N^hFrcN zO7kS$Qq{*#s?;y7b-V19JknE;$COnx1?ZudroM z`o#^oYSUN8#}vtU$0|{y*obL+h}|xGR*OOo|Ll_O_I<)&PB!#JzqM zVAR~8ze;V8%zx*Eov1V|G@4?<7M55d+j}VRoMUkkP$pewY|fE3P3j9uv7wYr5^aoF z*C&bI%7s)7GrJa@n{WLbTJr6y76Tj%2Gvs)3vo@))NfKqJxFoiG9b=ToWowxgON#`>|32HE&z|ey}N_{~HLs zM_d4|-~?xw)MVHzh^9NH))K`)|A*7;9B=v`*U2^2hx_-9>IgOd^F7Y)0#3d;-lS%L zgjD{S+B}RtYCQas1sI22XZ%Rwc)y@@ya?PN+l&g>gg7f^UdoQidzKLzZ(Y^wH zeGk4(=(x>N{po`2d8M#}X49LtS45RZ^xU7hSw#a)>QPm$=6 zH<~>1S}yeZ`;5!gQkvqfXsh=08eNT|@`kG|fR)|)-r(OJThc9%0R?m=cW%&8d6WQc zGqIuE9Mly>B#d_zR(S$gOpIyl@YAhRwP72k$C#QgsXnQ9&M&42pQ<0U!EJdtrg!+X%ZD^8jj@cC1;DW`^_EMz|w1Y@?9fW)|UMj ziznv#zenvdhc2{@z+=2}fJh)#<-i#&v+sH38W?uB5aqWvUZQEgUNv}dv(L1&wCx3{ z1Adb-ilk}rGrvf5%b&SJt<&jUz9?H6vgnmN*+;Lw{z~=Mh;~**o+Y=KeH@OLR;vPkMWO@m>DWt06L<};~jw^Lai+&iX>C4rsj zK8VNpp7urAQQ;9?#JN{zx1ZU_Sm*`dYges9Z}m;|-71m3=;&}K*V*Edw?&Ssb<WZ&x;q=I z=eu{6geqmc&hlpl+?!b28@0T2ud6lI()?wX#+!4n>3OT z+>9zP#=Dw_IvF;%ixh_L^+$#Byl9VU5S$XiYd-5yD?GD{t@mws-_n8&6gzWsV5RwC z$WcR;>H^!5pFFm)y%rb2@d*y{uZo`zn7)3s+HHQPIGH?^zxO;XE!H+{Sxn|yv|%hx zftKh>t@EPhrP~Kf_5O4bgY3@HIIz)%rVuyR?%iN5zW9FH@^vTplHw@iFK76PvqbHa zy;Fro*pC-q&f071 z3N<>3&sCCYWXvaTY=uUn1@k>z=L!bPpShZ-;@D`G({jXo*q3_l)SmK7^#G0dF94&E#HReoWG|_x{}=&{>SB85Lx$6dRgSzN4JJp z|Ko}oAu(=^MC|!Pe6-9b`-a`f1iY{wN)~Fj5ySSNQfKz-Q+M2*$Uzm?N}bH8+7aGm zuH^;FMR`a+ExkNLdAB;T;%Aw42(g%XZB$!l z{KCt|!85VxcHu{t=LBTWx_y@)2ajfwb# zu{8fV2Sw&F>rP1F_fW_Gb@R>lfpfzhjwb40he-z_8E{*muS-aOo|k-J?bs`&q^`4H zhj~_!H(8QeA~cDD&hvt(_TFFYJlKrtrne|RA2_CRk^KcgI_MW zd9@2=dwF&KrM=SgGdE|@k;m`-Ta|T`_h%+Ej%GE`FO;%q02M}3$4+1^eho;ox036L zNUECoI_`4C;+oLPSIq+d(9j4y?UCU7ZO>gIjz*SwAFDZqw?R@GU@eB-r1@DIsiz-O zskEU59mg3meE{a1e-3G=1z!4b#xS;`2I&w?N>Yj&lA)!IJx8EI#@G}QyI0?j^9mJTy49W-@f~_ zW10943om@UNL!XZ2BargLhXSXB;mkxjOFkTG6Z^zw)UP+;V@KWq7LiIr`_=BI-g)I z`0Zk>b8WrDzVqh&8wK{wB2votjbHK;BJ%q`uAtEcX_uWh)#r*PB5P^6Xh+;pw7oT-$`T_ia|7JUvoWm)K}+}^pnJiV7*(M8b%tv!gP-mH zxZZH)f!g6pbs+40UGmIZM?Kia6}BR*$8@ZgnwJ>Y>p?O6&+Jlb{Sy$FoqJ5$Fsq39 z_?TVPT!Zs%1mO1D_uJ)Lz29I}dIhNGz*7$>&(jhviRVIHlg zgc=9gE8sjRycXdtm}D7p_|*;&_--GhpUpxZU1-DIi%yt}qbZj#^AE^fhvI0kO#Q-8 zw@Jhqw1h+#4`Zd7f^ju#Wn{!*D3bExW|KkEGO8HN-=D6wzVC1%y)gnk;5eveC-B|e zXTYCrAOZghp$*PVsbrl(9tpd=#gCTehcr==-L>CayA;!Um*!oLl=K1Q@zJilQ!=XF zQRu${Jq=oQ-e=on@coagxKqS3^Tv2sy143Q;Ohy!4nfV!)q@^U9e?c{+^iLjs{GeC z3;idpI;GqHu&!n31?}q@bPN{`#EN;YvfDuW85_ju1vCvLdX*y^ z027y?#>Ysc&VJaFF8OX*wFp)BJvL0h+@A`cn%I3_vieA8?MGzfo*|?ZLJ^XK#(EIE(?mHc#)c+dOWMs^>zC|VbBzQfssB(57`}%;Ee$&i1JY!{XC&wN39f-KZ^%$Kztn^jX(IMMTCk zZjV8lHtW*|_gryu>=dFDQ=x~@m{Cc=^BTr+&aiZ#!!gPzh~AGlJGpg_X;5hRY>TKu zD{#MjXF~sQ?o7VsOTmP_qPtBbL!E*?h5Zyj$;a>^eNmv-0dnR-CS@xQNsTb0Y{j+^ zBv^;2eoDl~CT2`Qt;?!oyZ+bpmOqCo=U25?=bK#mtM^>}wWx1f+HR!y*xLO&2Au)m zw{2PlOU!G}f@wCeltwzTLyBEg2Eg3HAS%%zMz(FH4yQ${meV40WM{HH#xs+-rl{DJ znU%@rW5@Fx8pZ+=7dOrPsV!Wb6FY^DoD*a0;$3%LvnB$E|NbuznJM*VSO0JsEfL)5 z$&EVAK(FS+s12K2%?y*odY`QG%_BLx{UyFZ{GELxRo6X?Ik5yj4nOBBQUpo)vjues z56Xlrz?|J-ep_##0noQPRMcKuleZ`X0c4ke>!hB$uRW7D9x;beuBpVC$CRks=j&Xzm@zRpvrhN2DBu^mJqnd z1fWJZ3MI!FP5VF<%uEVz5(b02nWfbWJBf2*k}{gD9?LBJF0f^q=6HKiT?@VI51Yup z-rHx-B)#z%3gI``3sv6|+FLld6*F9P8oCX>n&%W)DZiroU0QoHMR5G=f-YGtNp@IqD_C&W0=aq|o&i-Nb%TZ)Zwh=jtY$0tBKyXK4PYxP6 zzCJFA_yL*S%U>(kwZpF67e*l*hZF^2sUp3c?fP!ZDk%=yzpt)q>JH@{b+tM zy>_hlyQ!ZQDOFsiR)51MzlSyz+4wO}TZH_Qis;N;k<`$7)_w17)qzJR|BLJx^MCdM z8y?DJ+t5e(X6wy{ zh-(66nk7Yxj_BEcWoxEx-P(SlBD~yfu63m6HV8pB9Z5 z>yKYNd(oe>7Wl4MMc<%uWW+8{&r@pT=jH8l*Xxva~Kbc2798cb;QD`%t`y)?S zvX+`W&O**deOdzyP2?mjVYMaOG-u_1;=otk|=p77>=7!Z8NJ`2j)A6aRLy53W|)! zEg7+gKm*%@4pWp)N(uMQx)fM{zdgiPzxVma)euEX4eK*dK{*b_*ji@`v4ofC6}?OG zk6b2X>QCUpp+c&SH>y~tx;u6!?SW9w~FS3?%)yRweLj#b~Tw+i0*_~u_rUiB-|QoSKf zYxEG9jAS zITh_F9{l~?n(j!55^MjCg@$)~8lQgFW9zn++W+9+P1|6Kali7DLmJE~F z!0}MrWxD4@@eO#gP_lG<`*9A;wUgJpnJL~-r7)&wV6bg@-dyoqBj5dtS*E-ns1LF= z2mZ?{`}J9QR#V>o6_9!I?M_*8?^JJ}-L2}B?wLwkq94-h$g3@h5grYpdBk%M%@7g~ z;L=`k6G|>R8o6oJhqEM594uYo!{`2W78g2G>nO{-^ypgO%RpYu*Cg4(zDN47QaHi?_>Ha z%D*$dbf)L@mpp{sn%=D0If%~9ZT#o>FKu4$WAPp539ABqi*P9N;5x`nwh+km2_&hN zmY_tGKr>2&Wy1(Vy(5sf;xnrTsT$Tn>ujCqh-*`dFUy-}n|{Tb-YBf4`p>JUoY?yI zV-L*jQ|MZN&mjazTlew_Nx0j(+0^u6(yZcVOH50{a;-;ygep;m3aoMHr_@~iDehfAA*kppgv4nL9n>@^75QVQ zQgU@+rWc*>`rmsu4;iWHlw7hPA{Y=DW&!!~9o(6QzH)hBULq+*0&BanV5@^&0+#(z-zD4z`kqOyrjq2%&;kHvCaLFb3@AWO5RDmV zF#MI;{fl#)b%9Y=&9tMLrE-*@f@{-(xXagm~hL=GD=ILYg>+Y(&&MCu$GVo%%Q^U!v3<+t-7tudcHg1=xF!; zlA`PM zINIRIBz<2hXz5HF83W)X`wau+}XBg8?Rx9G??M`=}+E~h*iB!G?mxj$snPMi+%np_XR6xj65vLWR4 zlKZt9m)CF2>uP8jUdxx`*p3ikz(Z~#<}|2buIeAE##ZmS>Ei6zMF^=rW)wBB5afel zl2C^$vCUE=K<=_Ta&F_w{@Nps49P&Mxn=UfxAzNs$;)EQSBB)5F%fyRYKJ~cL6_Vs z*Ws1z&&kG`!`gubg}!D-3jL{+5{Fusfc!GMmjm;5&q!6ca3(z+r$|T059ut*RuH_M zGmo+Zo2o4eW#v^6{UP6uFnYE1-gsB*(<<#gzKvYeto@@y<0EsoA$0gcMtq1GUuty% z2S?!WWiwyKoP;81uktrDD?ES(W0s0gTYzLxpK$K4(Vv_kV+RB2fh3>K_v57#XPBoO zGNSK|S(7^6=5xkRsZaRJ5lJJ&Q{9w|W54Rx@$?#$qyz;~AB{h7WH~lLAqQ|MYOj@u76 zSDH3|Q7i2e9*jz=lLb>o5cQ67mV!5L4S%c>&^=kjHK=}*>(H0%5AwU5B-F7kfi*|e zTfQ8Ke^)>K%3!>#!ps=vknGLVsq2Xl#(%Go9foA@mAFyAN zP*mMLbI2?bgnM!zRmSUyubU$Mu#?2g-j!9R6UV}2T)*$i#jMz)etQL#I4@Z$2v;3m zerbA>GlHkofqW(!4=KUcZ`X3B3k30AKS zI#j(^6@uZj>G3#H;-J$z;bz?TGC_1Q$4I}c?1i_!Vyi{X_ix&1U0s8#Wn)x38gRh; z0PU^^LnUnnNEXQcpeM*v6e5%VG}yNh^v|&%n!C@WD`S34cHHJAPkBx) z`fI=F~C1RQ4y9PuTvG$xP)cg6&ut$`nvYwcf* zHXAS@5e6FJg^w0zU8iey7MwSl3arc=W3OD_T!n;TJC;rgUezcEg~ zsl4ldT=ieTqQ$}DDYPvZc*C7yV4M+{K(i2}l=z$}{L7<*+26@KAZJ76P1pgA;~(QJ z8CX(p5iI-qM151ITma9&B;8M$YtJ~;Nb_l=P?RP3LZ3Y%ywukSC{PHn#%)R>FFEUnGm z0)fM?WTob*lV28wJCtH+iuqEv{CNEl5iu*qY!UdZIBm?Wn62o^(gWzQ! zDgnk7qvaeRT_dcS9mN>x^Wd5dTz{Q5^nL{H65i(WDw1k*CrF%UwWW zvfPUIFzAHx7y$Foi?Jln770(`z%I`Vje>f1KJ6%pvHUHCb*18mqmdk)%h1i=&ZF~L zjlERSVV8@aU!XqV7hoI#*8^D0FoAJr>?xjMO_JyQGf&9moPh`~kaOAUk~D^OiIP&& zB@Z4b>1F|q%j5}gBH7eV3d=m2=iQjUR&=u~wY4fop~XEE8m85E)d+%CRc6uQUh?TD-e}+q z4Jzc8doQfc=zP8Lubu)U3BY#zKoUQ6FC2f8BzQ%-J%N6))abP;FMZAou z@IR3!FP9;?Q5#5?ZZGJljtoSGk}#w>%N}H_#Cipjv}ePdO(tHWY6;*18Sb-jyGRkp z`ESnGPsE`PtLu}tZxh#LF84QgHMC@*1*XxKKSDHWD2in-xXanEx-?=&2vQs&KbQJ- z5>tR$-)9piFFU!x;(NV>yTBCBp~D1LTe_qs)@wW&4F!L+cipUO8c|z6Iauy-q4TC< ztL_clvM=ibxCgiK-BC?2aG>PI(82W>a=ywsA)H}s3MrN0uFnv)X$xAynib;3o{WP5 zBgdzk>nt0pYtS)2heZ+6boms%31hESkvd1`4CMH<3xsMd0WwM^q~r)V>x%gGWg6;< zJQqZu3#EDWqlERfQi{$nebZ|6*kYr#Z~Pw1Kgo~DE?y0FbN1hluFXy0{+$@PrTH!2 zv8^!cGPam4!e|9J33*Q`OU>2E}Y@xs?1F1>ykzsgsZU$~fa(sN`(O)hvH zZ}@m>-cY;!y|YMCdTN%~)Spt;Qc+K@%JVR|_ktOKH8ocNvhNKQDZ~)QFDf`AfS;w% zin!R?I8)BFeo9S0I(bb8%J{e<751aCiu_<=(JA`X>UU+d(`id5dWt8b;u+o>84K7~ zBwy4Kh(J;4A&I-6o6=`Bmq4uUl(=>LM6aMY*v$H z7!i83UhGvnDV{dHrM~iha))qq^^x>+=c~81Gi|}cYZa_hOB}(E;9>g{cb8oi!^io$ z)KXMW(|WQf&5-B|I)?LWOQRLF*8D&<`SxyD_Ovfoq-bbVOehia92u`%I+tG=>?hXJ zHEhW)t&O=p&7U@{1;DqofCF*3y|0>>$Ntcg%^(W6;3yQEgRl*bZG1g!9-#d$RTLBty*8m zk#QYM(NFJ%%@hOQDZIJweHVjHP^QOYJsusWJ zZ>CjVQ)=ETto;1P-Y$lSmF?#z8}FBXZ0Ix#gEy7n?bQvb=wH@Lm3 z$^YT$%j2Qk!?$%xC84Y#rp1=^*dxqovBwm$GnH&jOhQJ6DaF_wgd!wcc46#hVhpEb z-!j6?I4b*0g{NjY@3-IYecwN3`lrw1neTev*L~gBr7z>!GWo_y*7<7IYi^f8mnuQF z;~t6^AM=oSmd3fpMDOi+UaqNsc7SZ6B#RGKH;wGS_FY)^iJ~Q5H{b$xn4m(dtSORQ zG$~0MH#`)EkJd3e7Bcp3I(EGewzmg7P^+-p|lrWCu2%a|c%M)Z@%<1OV{C+cIVpkJ$p&&dY;UQvHBX{7mecjNU5YI03K0aE$+~uRu;gmLGda@{vgvVm%hly5#$!g zy0YpXg)r=7fe4QLgnliKvA-$sMumraUvBMv*2P15j!!UoE)VBO-(AcjjVy4E%EivW zKmltW$Y6e?hQHCRRk_-C_jJTVp|FkP=&GzweaT0(z}|K3Y#CghUgRI^?BZr>I)pB`UJ+dB3Y*IX2TYZR+n zzV={ad9${9)l7zkd{X$`E=_q7?Z+0%srug7dn2(lyDtT(fy#O>}!Q~o*kU$yB)fL#=P{sPl`>dYF5ds3k%|Fp$wnoyaMCws@FE*+?p>cdPU96J`xg-%+2qTEdeH9LL5t$*ix4}9xQ?&ggo{tvyQ+vz~l}5)iKGD zj=ZD3zWI_>HaAj+c(w4Urs-YzTxHZNjo`7J_>pD^xs%U*ZW1ICj|(*9zGN^rbD48H zR?s`P35kqMSx^WHUHX#PWmjijIZzD6F0qvaYQl?alG~&<-aPx95nGzkf7%cB!Bk@1 zVX5nVf$fMuY_-jqDAi#7Vil+OQ?7aXip~;FtH#$9X4ICSER`fZD0=1xznJz1g|=iX z(D%YE*JsW7-iMIMHQ%;8OqZteDKe86^rYlrA5A&FM}1&#eEGD}p*k%A_wOZcz^}>Q z`PZCDj{>g!S1U(CnZBCEv9Y9%r<)%mC$wL16FTzRRbkdYQ01gxLqtW<|{&u$U)8ez= z+s8s*EZwR$awtLT_G}gV5zaDPC6UwCnA72OsZHTQ3rSeEEb02 z3EUigS%TgZF)~0s?@-KWp)NEL9#R?TEekfdjEJaZ9n|^umqnT(GJq#R9NP%e!wH#e zW_}vzrz6 zozTly%;Wu{GvD;=rERGQeV$!7msmx6joACd_4T!a!{>TNU!bPq9wd(To*NDhDKWBh z4Bl2&ZOnEX4tn{0moY~QvI`Fk9sXT;8v z1>@o+iKr)Jx^H@gyr-~enirnD{1GcJdbAj}C;}PI?OZSNV9lfh+&}$j-~jt{&$J6n zga<=}NWBXMsKv1|mRVWAFiCs7*=K+L=i;|nu5Eus^v~hS0B@^kCmbrNLlrdvp1^q~ znjw;?sRwOx%$bNjYJDunv396@!|9@4*4WJOW@aAo+_goY6Ohd$RB;CO8z+tLtRQ{xadtCHTHod7-Yc`YsIC zMQhGPt3r`Q1m%}r%fk7SW1o}MJZ|VMPH+@6Eb;e_OL|VmG`w6}QkHXKg>M*BxvwX7 z1A0~-guPnFjkt_^^vf(5VJH-Agp{+izUL*KG)c0vy>2ga+Mx_T2&9%;ZCVU>XUkQy zsqwn7grxgcyu>a;db$u~cyR)&O&1aQS}4I>NDbBiCQ4AK&6_bjJIzVmvn@bq$UqP! ztFpI~lpVA$uzR*;^QQeW&JbWZPDRjJ(K((#D?2h~nDi!u`;1VZED6B!FcO}+KwA1} z;seJA>*d1|yp5(zL;_KC(>++V8m+`_A=RLBY>RbVz?|j1O+8GG?5i1VoaH|~W1jo3 ztky_OmOOlWTn7kg>Bc+rRsM70DAFe8uyMxot8VkzN1d7g>{nHy{$YSmg)h^ZZ%-CQ zW8WVKPaLs0Xc8-O#qusNiZx)RbEIZ?LSI;|8*h{4hmCOAgbD+6pW4lMoLJ|k zkZz-nX@NvCo%)!DqfE7>-m-=52diqKq^`dv{x8k0vokDA?ECY_zRSxF=?FOJ)P1d5 zMSKTRBA}enQv&G4Bx*!|j6PJvBmoRfisXleVV2ydIEd;Vx}2jus58xWnb$5LDsM*& z(nX{^1}k07qh2Ev`*I#wCf!l5<*ZDPPb>VX02@YbNPtW-6xU-3yeo5Kl(^Y3Iviz) zTd{&$$vaD!2}i^hi6zesgojo0#}hQR;+MKasZ`6`)4X#Rb|XN?US-k(Dw~hjj*SA( z;cKz`tIdq=?%fhAmVAgx)*&^}K{o@cE*2AE{SR1Z&Y1tvKxSBncQLXN;`U$v;n zov++_GszeVl5pT{IzA$Av2P70I=h0DG83mTM1;HpWpd+8~sB{VF6c2Y~Wny;q zz=iI#Z@V_6(TyMNTdzVvb?ZaQ9`4(#=Hh%Vc&sh=8JJ2~3NX_6l47RG;fG9Fa7y8k zY(FL`(FDg_?3LG?(UX=?N`*J++eKLsyP7ZACia?(4~j;PXa9BUUUYvF-@DNta)M-; zYdLZBS}AMhPGWhFTwOuQ*9YN+S!J#s7m~#dcHE<%80_RUn9C@HQ1)r}CsZXBJMF1; z+7_}zjH?H4+d2OlxjdoAjtt(~mb>s-P)%0N>c~6Oq51hi3OWdV`1XkUgjGiW!={ES zcK6Kqpkn3>gO~wQDJ{^DT9iPQDC73$hSxw+6k}MjUT2W~Sc_NSuGBAyZElTJ!|}+L z#`jGpR4IQnX6~7Hc@Jwf1Y}v#$50R`us~016WM(rr5O<`zjqSs*El^Xt8n;{d2>@j z{PR*uq`G5I#l^_VMK?-hneco>q=G}jCB#nvsPQjzp94`J62WCXioS>^G3{ZA zR6H4%>nRe><#eiaNtikK^e@6{yfrS-r-q{|4s=|GtxS`;(ZE=s3k1_ zJDueQ%~0eGZj@unPotyCzDBs0*K~#tT~N$8ooUU`+{254|L#l$ZAbig@YFm^9r6(n zFNuG|(2DKQN>XqQBgMlTad-}b0Z*oO*PQ(D_zHyg4T@OO(!Anq+s|BXjaSd`ar*lh zhphDjoO=7`V+LR?UpQjqK9bb$7QCLzJcC)R%s4J!Q5dLE6&)nFq*2mU7CC zX@waALTczG%3E<#BdoyhoZ6#OLP6OIOYXz3xISab3%Gx)1rIF5n_6*2OmJTu=I8)d zi1j@*+$_lsLN3YHS_E_jvP}bcLdFIpOs=40B|3xwKTJ`Wain^_&DnhrG`|vU=IT7Z zQA<53!@CCV9XRdL-{8$Wc?P^;*s@!Zq8VqhN))+rP5wm#Mv(RXe!nTqIz#T%n3b`AnT z+pt7;+#{@Z;8N`cLAydE}B{*F03P2o=_HX)Z7Ej=f zKLha?cffZHG`i0nI(L4b8UHvsb%4AT?-C(&%wr@eMtQ=Initolp~r-@F6Djkj!N*s zyBP~Lvp&7!N*4(o<49s*fmN#ppW%W4+}01OeU9b2|Iy*H<7r%3xHSBoaIB#<<_-`2 z{9fnsV$KNbDEkz6gS2lM>fJ$?oOCpR;iswksy!JAvP%`<=*98eEyf)BXB73KCCr=E8stFXTS{+;2 z85G*A4a13IG4-AvC z+^vGNgv($FGMKF&Z9y_>ADtK15qCC1L^29*waK3ttX^(|La)|j#aYc>D|R;wTN}$l zVJZ6;tny12GM*_dE zP~%F+-Z(zaBej55A>&T>! zgZF!8WW0-UZH-dUlP3+^ua*vt^)jYB6*bM0RO+9>UtUO3dHKixeAK3ihp~sDTJ{CZ z(q$-u`MBo+h>IPo>|`{`bMFkHD&{(?tY5FmByTj1hs{OLZEDqjj$P1q{N9x9Jf14k zmel<9N|^)UcH@;Yo2QBnW!CRzfgj_&r}?uAv*hQWp9kCKF6rJ``m@K^%^P{4TutuT z=d*cdO(aExY&5T-7$L5S6D1e2&z3JclrD+4`WJjP7A7!KQMSx4c)d<8+IxDdwt48Z z)r3Y_*QCDOg>Tnlr^m;q`6K-cBMW@e^c-xDBIo=$qK|n3-M(x&NPwt-wRzLr#eLa@ zE9=$2e@g8sgroo5@wBAN8QeX{8-4yH6qB~Ie@_3srH@!Qq5S6vr1T#jc)(laoB4wD zzWPL=a_nE+m-QO^H#{$X0a8l>p-0443PscCd-AW4^$dxp^7PuDN0|G_)i%Kke*Ttp z+64=Tjr9iKe__43g)!1t9d033gmn|J_a1S~mlls;9uE*t%`~GhwLgNQfJh1Ga{!-Q z+rE4Hg4~N&L`wrT%DTHt3vW$Wa>W4W3csavcQ`aJB(k&^t0X}XXb|gp9uLY=W0=;PsfD0QkNtk78U$pe@ek&7Gh2gF2U@ zPt$kfIiau2S;sK()QL-@yi;CldHd_N@L{rC$eMb4u4|EQ)HpnE2FEtJlF2)xRvI9_r?lM*Co#{R@ErXL1M05MNX)8 zQMkzMtdp(dH@J8H%OFf-EWWN=zJ{uyq9E z=j)%L#N;(q0%BwQ-zy5~dgvP=d#s;*cw+s1<`q!m1TjN(%p4B*f2E9K@BZ$Q55gVf zT$#cO0s6&7@^_9YRK|+vSx_16iY!|*^ghusQ3qsy)BAWz@#9}8wWx|eyT_e3&vm0M z8YYM%;rFLS-BfWtPxt%;83g|oFt=%t7*D{Lt+)mvv2-2`s%FF#RY0A+!~^44S-M)a zsR7$zrpqfNR4664W4J_o+Sno&C0FoaH^R|eug>9|heu?ca;hbenYOEk&W`-=q{vQ& z!SEf1DQF@e2RBn!JQ21STO?i9Fdhy&x|%B*={#+=j}={0Psbhe@-lKFjMF+BSo^;H znPz&l&5xS{M2BHO<@OA7rVn`_#*|~gOsAyBo2kX04d3F2<}6#Ln{Ai&{%mPIwXiJc zzACA^C!}K4`JTtBO!WI&O2G#))iz#Wvk0V@zjF*ivjaFv-0GM^SXXF>IoOL7j8O!~ zbXmpQXPbJ9q5%#Vd=Kx$81?5-|W?|=&DG>5HLO>i{`Q?Oq3B?MX zLJMFbv2X=deII}#1rxhTc^CcVJ{OLz>>eB^ScB^u91o9c!NpmyNcdrld%`nW4dwmL z@PZZMKL&uSf?&0+6)!V2)VG2@2tr|s?Kw3KgUPPUayCwCg(w~H$j^Gy$MPv3?uzb3 zi9Uz(CRc%@-q_%8S3ULMLtXbQ=)h4g8_4NAIuR>`8F&KsBh4;?&6Bo`PLkgTi7|0K zMWXt1m|FcJd5jBv;EA4y)NSX{+V`bWg(t?Flf4`Q-Ym=Yhoors*K{vJkKYo1l9gY@yo zdDH**T2Xl^Li6Vdj<7YrK*o^JxVi8BMNL|7fq^U5xs4l-cIiD$&&Ndc+2$Jb(nGP8V2#`vVT`2L^29kBP!{XLmJMkpDCRgMLRm0wAJcoi;DvB`-1}gE zalLK1t3t@-&znEhWvGjHbQo^eQts?=uK@PfE@`8ZZ)3W_zfsZ8c6{Mi#Ycc@i4~)xQugsv-%5#ARLhS_vd?IRT5lJj6L8LvyJ+&2J!t502kp;H!4K#p~ob6!k1UjLv*j09GTnNwCBKs-4`5IG91Ipw^?q`S5v zM5wh>?+6nd!_ott809JXbJ6Bze}bod!1YkgB%rVb9d16H_S`X$Xv}Jh-z6_7a;vtE zYGI}5$;rtV`QJjOrLFR6Gk25<#$l3c0x9X|ikRV{7+iu&jY4J3UM|(l%|>16{y|7Gtj!4J?X&o~-BTV=+@<@FOeKai2+bjk2BCfU1YkZCoVQ|cR_TU)DcID<>^2ZbgdpQSx;tB0#=(D0ZPYq zf_)F-%8F992$ey8%&EGf>VOBgp^`o`E!(xZ5%CZE9(XLM2D;xue&q-I7^L2@m;NWE zx5M%gpeW|f^aMB07M5lJwKWE{M?5H_zzdTy3T^Ae3z!jp+|NjDSX zwl%Cb2_DtSkAICH-K!gSWmEiI+@5Dj8;_nHZtxmv7QL`}$48082dA~en4WRqkDb+8 z-$0|;=e#-hyP=J!B_qE)r1TIiTA55mJo?Ohzu3e73-a%?u3YQL!z6P>C%AIz4)eiv zIhZeL27KTwNyIU|>eIasfMax<#(I2#wIr$$4CD zeMBF_`j+n-??TbP&8kve5;T?!Pf6VK{OB#%ZQ%SaXYAe315$4hP`YD`JS0kEgC6%@ z4d}@26T!!bv!Y|yWPCfIl8X~vJ}*}~pwZ1OUqbvZWr9ar?IvCR@;$rYyc%6~_JzJp_|4LK>4E&r zQrRaq~W* zA~0?c+-H9+BS@Jc@=%${E2_f;uQ>%B4F`mBaGF|2NLH8Ey?!;#P)n%QDt4<4R%|-r zS&}~Z9W9_^a;wZmy^nG4`TMO|g*VTf7QanYpLI?mnJ0vJSZG`RlA_md=&*2c4G@-; ze(x~8536{vKmUWT(cO`wPEQ=HXZn{Rtn;;mr#FdbZarOdiU>!&xBCFtVfQQ!o;Es= z;!_t>VAkbueS1KjzysSwhPV&cV-}`3K|rJS zR#SKM*c(`q>VLatA~WPvYkPL^iy-IPnVW$&^FMuL-t#yMb*|GgY3^6;Mt##)Tp^>RlmD8Z-$^GGb!$_; zLjnpre4GtRkUQ|e(v%PfpP$U1UHdHdzyh&dc%Dkz9{jv6)Cl;|Ex>; zCC8NMw4h2%wqbsvUY7aXUODUL>1J6T@GA->nJ6n6mAvB25Hh1OJR+}|9v69h#@beA z_|wb0&t;E#zrCxgbg6f+G4%45cV6^Lk7sOAD;-=PG-JeiUB@Uk8dpD@ZA$QZpttNB z==ABz@a;uA0p~d zS^aHnzwSEE$h@4|u)dtd@VhJWj0Q{58-J{s8BWG%^M*is7h<-$ufx8w274LOsKm6= zT#{jfSr*+>ST|bxHUjVdDVAQ6;5HZ)T{{0ytD;Y;pvLdr!&Nj*oUxJ7CEggrD@40caj$ck$+^f zk_S{jbwyAxNwa#YRUd<;-rwM6kzL&=3ooYK;6+*ll~#<+gnk>#>;Z!`!LbM~(xMVixPIbQj0tb;9Wyz?;v2F$3`&Nq^qawKd?WTC}0TaJ{3qmf!8b22EY) zMD+Nutz7Wuuk$G6UbGS^Q{oz_Giu1^ZO*^%?o&&DRp3i5WCa>9xhElQXn<|R8^$r6 zMSgcsb0i+qcOQ1~Gue!w&F(0cVGnQLz57Uxgz zk4^ZH^1kLDYYSDuld4Wn6@0CoRjqndtxQDKzNAypJNY2JRKps!1CvML&y4$pOKh!P zp42#}Vy4TZ-UOldAUOZ{@ZUY?eJZ;T>ZRtP1%F((>B>E z?UR*;0sU&#xL8|fspPbUH+MZV zJ#=FxMoI&X74yjz9vlxOf9g`1Oqz6zkkb>d?iMA7bYm|c3(2RB3!2xA@=$p%yvBIG zP$Jt(g&wL3!2}_hc>i4b>ieS%Va+~9!`h!I%I{Zi+&kVr)_0>}TinY=;?48Y5dAZg z_-UPWIV<}t-YiF#jpDtF(VDt3rl&;}p@&h+MsiwOI`B#A&F~gG{h{ts$@{vf+VZ)D zRVgW{KL>)!se}65VJ})s#>wX;zwS%FYD+pp%Q2!A>g7on17oIF85alC9ZufLG&=gY zq(mb8;*V9gs?Iy!L9tD=WdaoK@7Stfb)$HaTE~!2kw3K;azlD|O;qOS-m=R=) z;f6F@5p~5Kg7>*UV|KZSm{kL}(>KUPj1D*0w!1GQAlG4T9usk;Eqi)pJ6*^#;8*tK z&JGK_-HxDs${PQG#*li9fW^~-?iNW0Y`#XI6Z*N@eA|?RZGiPxOTL&f>eQP_6)2y+ ztuAkuP%opy5EkjXxf*@`UD<$zrBiFc~Ex3&}ba zp4qM!SX@Z1m?#XSTNO`+Mf=IBwg0g5TTm$`dU(va-DsZtv0>9YvYN-HN_=I!p6I)= zYEdim=5vLEFe`H^yva^)Nu{|=T3K3AVf;V7%WbH{d-8w&(>Sa|Pni%XxMeg9Y=c{M zd+bI;5??N>-fPvn;gIdFf5TBEk?aEEQzCI$pfCSZEPaaWi80d)1USd~EOVDaJO*84L=TZcc|Er~PDNm^M5Wo8(4P`yx<_4$o1l*>S- z+)Bwh1ZDM8^N6((zISY8HRPw(e|Sh{x@qWr^(~B4;LHNluFMP$fyan&j(%T?9w8U_ z1swo(MT|u}7zX_Ud#YedCxRc^a%@K)b946woSfP4Xeqn4vGR`gaLYH7S{f&ZhWhyb zf`cL+3Jn=+0T0mP7$X1{G~zi&#df^9p^;h)&MBuKmb}Xon2I^+i7B!k+uCSeOGWh* z3588IOmu+;8_iqs(=bU4XzF*{+$j``{XRgFj5&g-*m(-gF3G75o4QaIP5?t({SAL>W?`;g zgbPJIOiM6e+C4fa-N&@HtiM4sTyV`wYg73MR|HH#3OG$Bu!q3+Y`|hO`bjek3@S+Q zg=>gn6#6`zA} zyRO47fnTfwr`6(`ihv0!&3B8U^%xaR2f`{ks}ojGC)2+#_x_Bx8WdiGtR=5xb= z$r);5sW~z4SBC&|^_U5=nRvrkv+H(k6HKU*l=Ga0LuQC1>z}<4|{G(ln2n)#?oQhz1($XGc`=|iRKe;k?8Txqj#l{#w!Q== z1o&%n#Fv(&dg_l|$Q$StdAxXpP#?P>-xgWBeevN=bTyk z$VX|EaNsRUt^u09R(#kzs*fiOv1y0{3m9dF)}vtkk9vcq79*GJ{QK^nZJfT|*v1>2 zR@Vr=GxlTc<1 zj!#HbsBmuS+?PPI*j;RI2w-ZB#>C-tMX{+is> z6FPP@2p#qMq& zGR+YOG0q-ZTI=6>J-Fs-!&n3hO*ec5ghv(+K!XeyGWe&nzx5BTLy%7&QH#0xhyfFy zHww6>rvY=E)CiaJ3zV09#Gl$twpNe15d8PPm%_hR$EiExjQ-7oUz$2w^Tt0@&4t9L zC;CT+_9c!EDA@Cqi^V=Cx}*C|u`Ks4`Ng{45`b5U#gg@x&3@JqmS_6wUQm;s(? z_&+jX!!v*f*lhQIb;5L$0(_ab{=ZJxVFHKgs+HLF|8&B}z&80U6ec;n@-pq=?9P_V#aI}mfSsbXpq}Z`-S8=lG{Tspqy?JJ_3xc^lqXBsu zxrvG_!<`(`8J2ywJgL6B@74P=4pgdafcex1`&*L=u_9?C+U6o?gQXyW!mkG;#+swS z$Vf?!160I5hhe*emUcQ~5AKFR1QW}uk6-hYa&Jpt`Lt?W zS7u5`eY$5}Y^c3ZZ(+5w_0I$MNb+D|)q`D+1(YfNV_XnpqS8M`(SD0M{ox%mx+^dE zhGme!+_hkR!GC6Hvy>llE|x=NOXf^cv!I>ps=MEFh6h(bPvG-Z&?y42OeS=+9UATb z>%i)l$6Y}*Qo_RV2@aAbB8fo_n2AlF3JfEOLbje0CYCR6UsXHyFG|D1s=ceB!znyq z`N%NOGij{N#rY~Hjt2^{x0_+oBwDH2(chL@zVI~pBcPBkRK>Z%jG!zgAw~QF2ArTt zD9{?nlS(=X)VnyA%;7Ejjv(WyE|1VaIqHgGiG9Nu0mNU`IGvuHcV?g*@mQa9Cp{%b z7J9?B!u9CKoD9tSL_Ex##xnrHP_l7SL)oJ!Zo%j`yxff3&#_=m@t~9((1TcXb)qh2 z;4bT8VExybesL-H?t$mLSSP+ohlDD(7gbfcSoA$U+5CWOpFR!-U6WSk6IO!;xm~2d zdE1?0VB?Jt^|&1&1rzR44vC<{juE5!oHY4q)VWj?BI}~v1<5_6aXrv} zemeS2%^|%VR?Wi_eVnMo&n-Eh+vYcPAVZmO@i+Q4>lK5VHrn?Wv@}d%g6&>IU;;o^-iRi+o9? zeYvX9{nMEecf-ox@8V{QXfc&+3(&#{>($U%Xc_nq=~Yy;dLX6esxPI8lg4rf~4;leXe5VOQ{ilg`D!_KdrVxWl@WjmR7 zd^6dqeP*k9YN}Md+?0xGi&OZin4^ol0gyZpB`FTT+FG$ zPZgx(b&f){$eF3Hz~JpB?qE?b=RB=im{5AJx8j6C(MZxb>!nBA&331SQA*{?H>#)d z^PeE-;}2*ePT_(IJT5oHMy;(a9>l^MCe~@rc~QyLoz^#739X6uMijokuRI>0^UaKJ z&}GGtBbL7-!a}UqMgajr((&*Osq@pD9I^27IVf20-zc=e*IWm;RqAjtqrmHZAY(`6 z$JbMA{TEr(*;Ag@8tZj~$8n+f0Uwszu(Ddk5cNR-c`t^Vmy;V(Ilu6AL6~L5 ztWT?5pRAGBgZ!)Q{4q28KP=1qSP}aO;cZg>p3Yk?Xtr<^{iIMd^SR))+ihxeT6Os+ z%gBn`_wQ5V;yx)ntE;I$VVm!fkjVG!ORUxMg})SCZ|$YvBuFg-{c<8pts6!_X9gY* zOc{sEYR{Kr9(*lMB?z4+Q=`lAfmPzya&0-9!ZwN-{21AL0S;$`^&|lYl8I z#^IaRcg(Mb3*IJ*C2Z;7`dZ(5YqF#sh23b6&1kh^E+?(`pB~65%f5JwuI_m2YpwWhzqyytoNwOsI;*4FqBgBwtE3TPc-Ve-et=w=~;jcIDKf7+WY)V zm&e;|Mep)cIZ~>FP+HDKFZ!C@U}3!f;}4DMmymi+t2b^loV+eyi-flXyh>s(arF+V zyn6WmKb%}Js*AkdjscFiB~O6B`j2lXl9|$~#*&dUL_h`1#_9Q;@+Q!N-24rLKhK;W zrzM_X>4kVh(R<#;Z#fV;Mt+%zteK1N;rwQKcEUl;ZkA2kUH^~I2ZSMH@bttr8Ql8r z68w=El>1hG9}7uIc56oONAV=uXX?gx>A8JIgtBi~(Bm((YTRG)ih`^0y^@(gGJ@k1dJzq=;!-^aOSkiv#UTQtPSocP5qxS>`ij*sKQc_$to~s;yVo z@%-8n5{;59g(B>k_v;EnGJ7YyK@xkB z?9Scpezngwp>})jn7*j&#-9go{mCaXh=vSD=(+tPkZJ@+0?Y&mDPlizZZTV`X-Isb z*kqSAnmJ9K*Xn;<{hMzsiNhN!$NsQ$|E15HpD>ffYFj(@iM{<$U5gBOzlQ#tj{!2D zfJ#)dBg<_Bk-*EvhB*9Nk&h#;V?HdoMN0i)Ogh8mF=0evfHnxEu;F82^TD^qU~V1o z>jigAoEGF~;NYaIj{4aQDN7w4ym8!-H-%M$?3jZz^g|$rT2I@0$WddC0G^AwMLxZV zAERa7IBIh4)hs^JT}{IfktBA^^qzEnsAQ=; zBZ3|+NJsZ+!7vfz!V}P=5=@zviIHi1!K>Tu*@eZCfwi3r0WITw3Awo+rX@4G*Ay=8 zUH*>`Qa-?uVDD&yDSWL(3FAKPvRtyez^2WAP83PeBgtWmw|ai1@8A-Brx>I9L#nd* z`K6@s?Y*zO<9#!MK)%T{bZzawg^K9!|8h(I<-P>-*RaUEM;Ra|TWur%ST#G$E!!Xh zRda@qR&UW0c#~m*rlx-SQJa!M*KoHW6YUzz)9<45m~>A6=0< zNQ#vV;tf2<2+cO&XaXBK&KY0UfxgC7_)#;3H5p!W@OFTS7(M7z|K=7&W*{4_SzTpW z{xNX$BKkO5f1%>8vs4G76$H8UFx~);Aob`6dd_yod5k9uWm!TaKCdHj$C^d()8107 z+@u@8OKM)txq&5If-4R*(?lg}-0uBG{Wap&7ytQ_)!?awTPLJ(f+Wzx@CHuVqAK^} z8l}iuR0Mq{4IU^GpRuNm8KL{-Rw3X?dha-ALUu&NFP=6nb&m$zc6{C2bR=P-Ub9Yb z7G`+$(%x*gJxLVjhk#DZtVgj`!T!D&qYV0UKoK>W0Rmr2eWDD$FZG6rG(!kY-i3=` zfhnacvAvsBu!Hyarw?ibPCG_~pi4cFYf?v7?s|HjK{bvNNE-yc7+}}T6aE8|qiI2E z>39+?%cW>9Q3Z(^@L>7JVfVoMWllxx1{tK=xB1ZUCeVArb3iAROf#BA4QN)b&N;7S49g)W@8{AnE%nSp7m#WENy- z2|Z_Um2HXR&1X#DCwQ}k!;4N+L0H|_3$=Zrl$!TuBR(OwYtOJxza>cmO;eIQj`q?_ zd9+I~imi^l2$oixWWs^2fhKJI-W#1CP$}i86Nss@5{u$noy9-+lM`pvDT`1|00-%Pl1F_1i z0~?CJU(l4>PCPaD6_mIHyO2w8fv*>rgo{yCo^}8t7x6yNm>SbWhrQm?yi?93CRX3> z$jWLe(Arg2(S}wKOY3}uu0V_$ z_9V9)dp-nRgSqc4e{-mc63B@5AzLOo&-6WztL22KmbKNd+wz3@z-TRF5#ZZop7-Gw zf(&~|lz>{JSUp`KRVeq?wC(69i_x%J<+n32Qn6mL7P%LYI$yjeUA!}G6N5d;WgdcR zk5HK4ln@?~H$>Fo7QxZzhomOMjeJ<|7M`cn#@Zqm9l}~MmEJJYK{D6JQ)Ke<2-jQP zb5ct&kFQMBp_}KngxAoOfmwDHh@j*(BmWeICx7z&g7v}$V#FaW?-@=IZ6uEO2h%^9 zb7wGuu>}Y!Jw*9Y6I;f)L~MIOmt{@hgXosxYQ*PPCPTQ;yWVt@X^j($-Wf>4n2!r^ zsFqo=bA?+%RKf}}H|mpPw4uGU`aaw-tS)nYqq%juV<3fNO7}uIjn*nn(9{fG)kX)2 zr5YF}ZcCasik<)RvyuaLQV&Snm`Hdkl6iG20VfUQWVPllx--27227=Fk%_Q_`sqTL zn*%*pp`u>Ni2Z~83*znLca{xWjR)d_HJgVV`mIWA+ke=m{^glypSdf%hpQ7q3!uXTNqN)* z7zc|y__E-RGGtoJxzDXIli-|X8UG|oPZBD(;YX-=?Uv$FOcbJXM)OC*>cy(nn>}|F z!_-cl4^hu(2zNwMCr2qE;tdG#&>j=?;n5Gt3XbNdo@So$x%*Dx-f8i$aMe|th7%dc ze*gxtAFAL9klA-veod#Ak3`aOLQpmq&0PO9JZ{NA$IJX^&B+XCT45n-;&I&)+_hGJo0NMqFWJ zT;0FL2b>E<4wk95QLnl*NRKR`6iEu0NpUTVj$4{JK_(l^u*+N99vlIeIWOt zHP1P<0^?$J&C3++lWbpzAb5k$v!^KZaRUddepeEZ2+Ewv?WovjDqW5EJ`x=r1$JhF z)b4IplbtDLYU+iGlU_fO2Fm2rT_y&IP7fH?od-= zAFdseD&r~x&p4^o!AO`ra{T(rsjLOd-i@j=@%Qo z$kRDbR?R$EpG(x@Q5T!P40s)a3v#TX+S=6x8CSY(>H+)K2@}(@RXgEBL)Fx;lJ56b z$EE(T>v#n6Wm$T>t|x9on?-i|KdoJ9G@I+U*Q#@Rs#KenBdTfD)S_u?tf-trX;lez zR8dmY5HVbb5|xThrkv2Cv=l{AV~!H3F(rngXv9!4ggB@nBpuR}B)yNj*1aG8>%Z>0 zAMS@|<=gw_eTMz){o8y0et@sV826d8RvO6qQ&{ALTFuoch7fK9K!YnyLy}6BrFMP( zy_EH4>`%3FyBLjkz0YludC9^c`pGgEm8U3KPl}n5KIBTsv*Y#(RdxgR@-HA4Jy#kp z+xJi=LDo)$;v)Zb{Thsw)0$Hh~~Eoxi&rI*%22g2)*LYK#2uN+2I?!{n;T zFD+v@Q{IzSP4w7bm}`gAJ2r&+_oT16ez?HEM1J;0hyxexm_!{D7|cCmAF<+0703LsRI)kzYJ6fdToA(h$zM$E_SE8Nj}&Audy3wC_jT=Z zEPdj0>a~c9=x-qgGJ!`{ar}Yn^yGN*{WHb8%ApyKRdtfMbjHjyQ7pZYhY{kEq8)b+1_&==eSXa29)K~vgl|K`O2mY|Ba;xzgN z266A7CEc0>)yfRK)oht>*7=byxqc?qZpUUIlfQ=@c&B7ER!@brh3_V6p7+>Pk-UZN zpn1W@=iZzG%Ur`2-K^IYz)R)#EIsQagx_}dtqf;s9~c8$fx^kFp$GxDzQSuIKC4~|cC z10tRRp6pD1M?MUP5vk0j!axK0?Kz~9(B3*Jhu*5ehd(f=@^NDfrk{NmsB5UwN4!Z2 z(L8m0C(GrgpLzRi@=5ER^H+~Po<5Lx}A;x={NYeSI(fDose?A9WBus?@p%#A}7Ii?izw3{#0pV}QE6_5JFq=!|cbX>Z7y z-WMWP?9DlQLYDYIFVansDgnil81{GfL+g^E+gq)&PVj`sVqlirjuO1cLf!7w?_iz| zh$~u8N+xM_K=A@1xX$lS?JzNuo}F0#i`Ctsr+;k>G)M$&Q14L4@;F7o>FD3@*HOj;m2PW%Inc{IhjUvm5E3PtSFwjW=%KA$%-Ic8#^8RC@wP z;dAJC^X+`>hnBXc7-K%{K}3~Tl^eGxamuiv`6Q(+`RFOjBP7{i*rGqkIMxfDteLbR z!iV)Pqf9wPDu*!M*TJ%`efgcbJ1a9!Nk}4`AO)#KLs^=y%nuKLsN37ETeup{J)EMN zKLyfy$WADmL<3DKe=id8w$Wm6uO$c^guj#rj!j{j!t{^$m92kM0?np*i37v4Erg2C99sP+PQb9PXz)JXtgN4g4 zowD^+U8tC0Cyqw370gcgC2FQzALJBqxW^F{bt!5x&6ude$>-`NRluv(<^2q3<>OmT zg-E^=-IVZ`MC4jqwgJ~D~gey=%Kr<{)tFiz$|7+^J$WuPGAE9`04IFuqn^QA|#_QIj~ye zQMN+k8N&SykCcKLF2PP1Hpi9*q3Gw1ET~?0oMB(SN+4A*eWW#54bJsVYu_2dQJAue zAo@hzc=SU`3kjq$$BRH@C)z75kuBhT6Qqfsi1aGqbXp=BVlbFWlc}4MZ~yuwXLHYi zl{5@Zv31u4U9U&xy&+%a!q27JIs2#5&D9vb$!c$l3Bx0f3N_BoCnhG#<2-mu;n(H* zDb7&`pJ^+Hf1QacB8xns8Ca>wP;%gD~3xzd~3lJ~Gzp-I)(`P783F?vu$H|0IxF1o%9!67|T z?5|^C3hv$8nCn{hXzP*q+=?#eZ?1Jmw9*$4Vq3?N5V`46Ld?slle@-@zd21`JDrm3 z_d3mHr?QF6-};?|+Z*w@rOROALMnXx%a+C-JqcMglnsFERu`&64s=%a+U($`Z9AqL z^dc_oq0Ss!k!6xTZ>30H0YxSQ2jTEv| zd#hPrQM&i3ePq;;xoAHVjPK;o(EiW(9O-P`_LIc0;^W`V6`Q?&wWz|Mo2)?2S+w2} zN^ipPLE>VOMWa$XK?XFQR2pw*U*!j{8bb+p@kY}Q&qxGNLZR^>m;M`m<@O29hEej| z?g*|CuR>c=hSvvo1WTOQtWn-sxrCN#Mn*;L$$ABY;1asc4Tp028mNtEgav?d47u`i zrzfmmMQ=pp1=n74?Q0!cTmGeWfDv(4iGIr?FJX2HX8Yd2!_+7N#rWc3&b&CZ>Ww+% zmpq87iI=qvV7aP4PTT2tDGl+^^~uw=|IkAR6hHAfb{sRsY(F;O(1TQ*-FDEjL4*zYv8 zLFN}5=Y+THnuJxa8N!FpZ#LpniH=Q{c z=%I&MS(?Av_4jkd-2M@a%QIS z>EG<~ips`4tkfp0b`sdhLY@DDZFWp=QHPWgWWMCzAy5>FoZ$2Av8sGhR;t;VmqO!? zaGZNbHY}+!VhVL3Wo__}^ojE>4Su#&+kw%1qtV ziS2ds5{82yb{mlPV(p)jh( zWNNqeY$K^j5XhOSRN)a6m%gb(XtS1RNq~eHk{)0N3!Q<>Zb_aV!a@_0n^idz>_p_g zR`q2a-wGk!9;#VEo}O@Z$N8;z=Gk5OWM{O7or*-9%k)ciqDsN0Mp~MUGI?$j)_+e- zSRQEJt7&1iTf3$cde>%GVtGZHz0^Vp*d{un0>Z!gM2{t8XNdz1aI93Nf<1yU7is}! zp)7i@)K;VOy;%{E_9`H>ofWwsda55_luZS(x%|}15y&cUd4rTs*F&M0>gneGxncgr z%TW#`Lpgf>K^51HzksFuNrbDWcfmld+6Rc^-=j3DeJ;J3%v$;FAm!@!}IUWJz$eB@%dR(HV z&ZLLUTxh&R4QrcNf|{fsc*<+;G09qZOg_B#&+0uNsUm3AoGJn|L|YNYTYKAC8`J0= zxTZPuJ&I;?vdLWI@O5D^2c=-xf5+yA{?#1RUN?(ZZ`B@7(j(#zC#KB67`_AqfT*01 zLKB)G5bVkuk`HV-IWel!bk98?sv_I%d0;d`<*d$Z{Jpu`J`PNSo=}6^ zzoQ+;LaTHuT{>JwBVW0eG1iW_yRN~}Z($4>f&z^f;Ud}#6SRw)e@JbGQn0$xRexSP zEV+@0H$?7?Js#j7%xarfYI(o#zS%Ci0+iF&B9m^a?nW0C?a^kIe62QPg_4#ckq+Op zBxv36th{)p!S<@5hou8=p43$ka@A2{XJuoG%o{F-_D8PSHFraZFu%cg)3uj zH@lKf%bn)1U6}m~Poql)WLo+uly|#(pTo95oiIY14)FD8Aa!=f{4h>h;QYSXqjc$q z6hs90D%i?_(7asSi_zvWa$mAHp^4|7o^5BG|`n)IgStaH^p(7owqB$&0<2XEg3E bD0Ao2H2?qT#;v4cruGAg!vAH!evJPox;U)w literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 33a70ea..55c451f 100644 --- a/pom.xml +++ b/pom.xml @@ -88,9 +88,9 @@ - com.github.yulichang - mybatis-plus-join-boot-starter - 1.4.5 + com.github.yulichang + mybatis-plus-join-boot-starter + 1.4.5 @@ -190,108 +190,113 @@ - org.springframework.boot - spring-boot-starter-data-redis + org.springframework.boot + spring-boot-starter-data-redis - com.aliyun - aliyun-java-sdk-core - 4.4.3 + com.aliyun + aliyun-java-sdk-core + 4.4.3 - com.alipay.sdk - alipay-sdk-java - 4.35.0.ALL + com.alipay.sdk + alipay-sdk-java + 4.35.0.ALL + + + + org.bouncycastle + bcprov-jdk15on + 1.70 + + + + commons-logging + commons-logging + 1.2 + + + + com.alibaba + fastjson + 2.0.20 - - - org.bouncycastle - bcprov-jdk15on - 1.70 - - - - commons-logging - commons-logging - 1.2 - - - - com.alibaba - fastjson - 2.0.20 - - - - com.google.zxing - core - 3.3.3 - + + + com.google.zxing + core + 3.3.3 + - - com.google.code.gson - gson - 2.8.0 - + + com.google.code.gson + gson + 2.8.0 + - - com.vaadin.external.google - android-json - 0.0.20131108.vaadin1 - compile - + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + compile + - - - com.corundumstudio.socketio - netty-socketio - 2.0.2 - + + + com.corundumstudio.socketio + netty-socketio + 2.0.2 + - - - com.github.wechatpay-apiv3 - wechatpay-java - 0.2.9 - + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.9 + - - com.github.binarywang - weixin-java-miniapp - 4.5.0 - + + com.github.binarywang + weixin-java-miniapp + 4.6.0 + - - - com.aliyun.oss - aliyun-sdk-oss - 3.17.0 - + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.0 + + + + com.github.kuaidi100-api + sdk + 1.0.13 + - - - com.nuonuo - open-sdk - 1.0.5.2 - + + + com.nuonuo + open-sdk + 1.0.5.2 + - - - com.github.xiaoymin - knife4j-spring-boot-starter - 3.0.3 - - - - com.belerweb - pinyin4j - 2.5.1 - + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + com.belerweb + pinyin4j + 2.5.1 + diff --git a/src/main/java/com/gxwebsoft/cms/controller/DesignCollectController.java b/src/main/java/com/gxwebsoft/cms/controller/DesignCollectController.java new file mode 100644 index 0000000..24e59c3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/controller/DesignCollectController.java @@ -0,0 +1,114 @@ +package com.gxwebsoft.cms.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.cms.service.DesignCollectService; +import com.gxwebsoft.cms.entity.DesignCollect; +import com.gxwebsoft.cms.param.DesignCollectParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 设计征集控制器 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Api(tags = "设计征集管理") +@RestController +@RequestMapping("/api/cms/design-collect") +public class DesignCollectController extends BaseController { + @Resource + private DesignCollectService designCollectService; + + @ApiOperation("分页查询设计征集") + @GetMapping("/page") + public ApiResult> page(DesignCollectParam param) { + // 使用关联查询 + return success(designCollectService.pageRel(param)); + } + + @ApiOperation("查询全部设计征集") + @GetMapping() + public ApiResult> list(DesignCollectParam param) { + // 使用关联查询 + return success(designCollectService.listRel(param)); + } + + @ApiOperation("根据id查询设计征集") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(designCollectService.getByIdRel(id)); + } + + @ApiOperation("添加设计征集") + @PostMapping() + public ApiResult save(@RequestBody DesignCollect designCollect) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + designCollect.setUserId(loginUser.getUserId()); + } + if (designCollectService.save(designCollect)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改设计征集") + @PutMapping() + public ApiResult update(@RequestBody DesignCollect designCollect) { + if (designCollectService.updateById(designCollect)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除设计征集") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (designCollectService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加设计征集") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (designCollectService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改设计征集") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(designCollectService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除设计征集") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (designCollectService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/controller/DesignSignUpController.java b/src/main/java/com/gxwebsoft/cms/controller/DesignSignUpController.java new file mode 100644 index 0000000..dcb1b76 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/controller/DesignSignUpController.java @@ -0,0 +1,115 @@ +package com.gxwebsoft.cms.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.cms.service.DesignSignUpService; +import com.gxwebsoft.cms.entity.DesignSignUp; +import com.gxwebsoft.cms.param.DesignSignUpParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 设计征集报名控制器 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Api(tags = "设计征集报名管理") +@RestController +@RequestMapping("/api/cms/design-sign-up") +public class DesignSignUpController extends BaseController { + @Resource + private DesignSignUpService designSignUpService; + + @ApiOperation("分页查询设计征集报名") + @GetMapping("/page") + public ApiResult> page(DesignSignUpParam param) { + // 使用关联查询 + return success(designSignUpService.pageRel(param)); + } + + @ApiOperation("查询全部设计征集报名") + @GetMapping() + public ApiResult> list(DesignSignUpParam param) { + // 使用关联查询 + return success(designSignUpService.listRel(param)); + } + + @PreAuthorize("hasAuthority('cms:designSignUp:list')") + @ApiOperation("根据id查询设计征集报名") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(designSignUpService.getByIdRel(id)); + } + + @ApiOperation("添加设计征集报名") + @PostMapping() + public ApiResult save(@RequestBody DesignSignUp designSignUp) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + designSignUp.setUserId(loginUser.getUserId()); + } + if (designSignUpService.save(designSignUp)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改设计征集报名") + @PutMapping() + public ApiResult update(@RequestBody DesignSignUp designSignUp) { + if (designSignUpService.updateById(designSignUp)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除设计征集报名") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (designSignUpService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加设计征集报名") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (designSignUpService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改设计征集报名") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(designSignUpService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除设计征集报名") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (designSignUpService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/controller/MpController.java b/src/main/java/com/gxwebsoft/cms/controller/MpController.java index 9d1856a..917887f 100644 --- a/src/main/java/com/gxwebsoft/cms/controller/MpController.java +++ b/src/main/java/com/gxwebsoft/cms/controller/MpController.java @@ -41,279 +41,298 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/api/cms/mp") public class MpController extends BaseController { - @Resource - private MpService mpService; - @Resource - private MpPagesService mpPagesService; - @Resource - private AdService adService; - @Resource - private MpMenuService mpMenuService; - @Resource - private MpFieldService mpFieldService; - @Resource - private GoodsService goodsService; - @Resource - private RedisUtil redisUtil; + @Resource + private MpService mpService; + @Resource + private MpPagesService mpPagesService; + @Resource + private AdService adService; + @Resource + private MpMenuService mpMenuService; + @Resource + private MpFieldService mpFieldService; + @Resource + private GoodsService goodsService; + @Resource + private RedisUtil redisUtil; - @ApiOperation("分页查询小程序") - @GetMapping("/page") - public ApiResult> page(MpParam param) { - // 使用关联查询 - return success(mpService.pageRel(param)); - } - - @ApiOperation("查询全部小程序") - @GetMapping() - public ApiResult> list(MpParam param) { - // 使用关联查询 - return success(mpService.listRel(param)); - } - - @PreAuthorize("hasAuthority('cms:mp:list')") - @ApiOperation("根据id查询小程序") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(mpService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('cms:mp:save')") - @ApiOperation("添加小程序") - @PostMapping() - public ApiResult save(@RequestBody Mp mp) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - mp.setUserId(loginUser.getUserId()); - } - if (mpService.save(mp)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('cms:mp:update')") - @ApiOperation("修改小程序") - @PutMapping() - public ApiResult update(@RequestBody Mp mp) { - // 只允许一个主账号 - if (mp.getType().equals(1)) { - mpService.update(new LambdaUpdateWrapper().eq(Mp::getType, 1).set(Mp::getType, 0)); - } - if (mpService.updateById(mp)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('cms:mp:remove')") - @ApiOperation("删除小程序") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (mpService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('cms:mp:save')") - @ApiOperation("批量添加小程序") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (mpService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('cms:mp:update')") - @ApiOperation("批量修改小程序") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(mpService, "mp_id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('cms:mp:remove')") - @ApiOperation("批量删除小程序") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (mpService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - - - @ApiOperation("小程序基本信息") - @GetMapping("/getMpInfo") - public ApiResult getMpInfo() { - final Integer tenantId = getTenantId(); - String key = "MpInfo:" + tenantId; - System.out.println("key = " + key); - final String mpInfo = redisUtil.get(key); - - if (tenantId.equals(0)) { - return fail("租户ID不存在", null); - } - System.out.println("mpInfo = " + mpInfo); - // 从缓存读取信息 - if (StrUtil.isNotBlank(mpInfo)) { - final Object object = JSONUtil.parseObject(mpInfo, Object.class); - System.out.println("object = " + object); - return success(object); + @ApiOperation("分页查询小程序") + @GetMapping("/page") + public ApiResult> page(MpParam param) { + // 使用关联查询 + return success(mpService.pageRel(param)); } - // 获取小程序 - if (mpService.count(new LambdaUpdateWrapper().eq(Mp::getDeleted, 0)) == 0) { - // 创建小程序 - createMp(); + @ApiOperation("查询全部小程序") + @GetMapping() + public ApiResult> list(MpParam param) { + // 使用关联查询 + return success(mpService.listRel(param)); } - HashMap map = new HashMap<>(); - - // 获取小程序 - final Mp mp = mpService.getOne(new LambdaQueryWrapper().eq(Mp::getTenantId, tenantId).last("limit 1")); - mp.setAppSecret(null); - map.put("mp", mp); - - // 原生导航条 - final List tabBar = mpPagesService.list(new LambdaQueryWrapper().eq(MpPages::getSubpackage, "MainPackage").last("limit 5")); - map.put("tabBar", tabBar); - - // 配置信息 - HashMap config = new HashMap<>(); - config.put("LICENSE_CODE", ""); - config.put("MAP_KEY", ""); - final List fields = mpFieldService.list(); - fields.forEach(d -> { - config.put(d.getName(), d.getValue()); - }); - map.put("config", config); - - // 服务器时间 - HashMap serverTime = new HashMap<>(); - // 今天日期 - DateTime date = DateUtil.date(); - String today = DateUtil.today(); - // 明天日期 - final DateTime dateTime = DateUtil.tomorrow(); - String tomorrow = DateUtil.format(dateTime, "yyyy-MM-dd"); - // 后天日期 - final DateTime dateTime2 = DateUtil.offsetDay(date, 2); - final String afterDay = DateUtil.format(dateTime2, "yyyy-MM-dd"); - // 今天星期几 - final int week = DateUtil.thisDayOfWeek(); - final DateTime nextWeek = DateUtil.nextWeek(); - serverTime.put("now", DateUtil.now()); // 2024-07-18 22:06:36 - serverTime.put("today", today); // 2024-07-18 - serverTime.put("tomorrow", tomorrow); // 2024-07-19 - serverTime.put("afterDay", afterDay); // 2024-07-20 - serverTime.put("nextWeek", nextWeek); // 2024-07-25 22:06:36 - serverTime.put("week", week); // 5 - map.put("serverTime", serverTime); - redisUtil.set(key, map, 1L, TimeUnit.DAYS); - return success(map); - } - - private void createMp() { - System.out.println("创建小程序 = "); - final User loginUser = getLoginUser(); - final Integer tenantId = getTenantId(); - // 创建网站记录 - final Mp mp = new Mp(); - mp.setTenantId(tenantId); - mp.setAppId("小程序ID"); - mp.setMpName("小程序名称"); - mp.setMainPath("/pages/index"); - if (loginUser != null) { - mp.setUserId(getLoginUserId()); + @PreAuthorize("hasAuthority('cms:mp:list')") + @ApiOperation("根据id查询小程序") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(mpService.getByIdRel(id)); } - mp.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.YEAR, 1)); - mpService.save(mp); - // 创建底部导航栏 - final MpPages mpPages = new MpPages(); - mpPages.setHome(1); - mpPages.setTitle("首页"); - mpPages.setPath("/pages/index"); - mpPages.setSubpackage("MainPackage"); - mpPages.setIcon("HomeOutlined"); - mpPages.setSortNumber(0); - mpPages.setTenantId(tenantId); - mpPagesService.save(mpPages); - mpPages.setHome(0); - mpPages.setTitle("分类"); - mpPages.setPath("/pages/category"); - mpPages.setSubpackage("MainPackage"); - mpPages.setIcon("AppstoreOutlined"); - mpPages.setSortNumber(0); - mpPagesService.save(mpPages); - mpPages.setTitle("购物车"); - mpPages.setPath("/pages/category"); - mpPages.setSubpackage("MainPackage"); - mpPages.setIcon("ShoppingCartOutlined"); - mpPages.setSortNumber(0); - mpPagesService.save(mpPages); - mpPages.setTitle("我的"); - mpPages.setPath("/pages/user"); - mpPages.setSubpackage("MainPackage"); - mpPages.setIcon("UserOutlined"); - mpPages.setSortNumber(0); - mpPagesService.save(mpPages); + @PreAuthorize("hasAuthority('cms:mp:save')") + @ApiOperation("添加小程序") + @PostMapping() + public ApiResult save(@RequestBody Mp mp) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + mp.setUserId(loginUser.getUserId()); + } + if (mpService.save(mp)) { + return success("添加成功"); + } + return fail("添加失败"); + } - // 创建导航图标 - final MpMenu mpMenu = new MpMenu(); - mpMenu.setTenantId(tenantId); - mpMenu.setTitle("分类1"); - mpMenu.setIcon("PictureOutlined"); - mpMenu.setPath("/package/order"); - mpMenu.setTarget("uni.navigateTo"); - mpMenuService.save(mpMenu); - mpMenu.setTitle("分类2"); - mpMenu.setIcon("PictureOutlined"); - mpMenu.setPath("/package/order"); - mpMenuService.save(mpMenu); - mpMenu.setTitle("分类3"); - mpMenu.setIcon("PictureOutlined"); - mpMenu.setPath("/package/order"); - mpMenuService.save(mpMenu); - mpMenu.setTitle("分类4"); - mpMenu.setIcon("PictureOutlined"); - mpMenu.setPath("/package/order"); - mpMenuService.save(mpMenu); + @PreAuthorize("hasAuthority('cms:mp:update')") + @ApiOperation("修改小程序") + @PutMapping() + public ApiResult update(@RequestBody Mp mp) { + // 只允许一个主账号 + if (mp.getType().equals(1)) { + mpService.update(new LambdaUpdateWrapper().eq(Mp::getType, 1).set(Mp::getType, 0)); + } + if (mpService.updateById(mp)) { + return success("修改成功"); + } + return fail("修改失败"); + } - // 小程序配置信息 - MpField field = new MpField(); - field.setName("mpLogo"); - mpFieldService.save(field); - } + @PreAuthorize("hasAuthority('cms:mp:remove')") + @ApiOperation("删除小程序") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (mpService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } - @ApiOperation("首页数据") - @GetMapping("/index") - public ApiResult index(GoodsParam param) { - // 使用关联查询 - final HashMap layout = new HashMap<>(); - // 瀑布流商品数据 (type:0 商城商品,1 外卖商品) + @PreAuthorize("hasAuthority('cms:mp:save')") + @ApiOperation("批量添加小程序") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (mpService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:mp:update')") + @ApiOperation("批量修改小程序") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(mpService, "mp_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:mp:remove')") + @ApiOperation("批量删除小程序") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (mpService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + + @ApiOperation("小程序基本信息") + @GetMapping("/getMpInfo") + public ApiResult getMpInfo() { + final Integer tenantId = getTenantId(); + String key = "MpInfo:" + tenantId; + System.out.println("key = " + key); + final String mpInfo = redisUtil.get(key); + + if (tenantId.equals(0)) { + return fail("租户ID不存在", null); + } + System.out.println("mpInfo = " + mpInfo); + // 从缓存读取信息 + if (StrUtil.isNotBlank(mpInfo)) { + final Object object = JSONUtil.parseObject(mpInfo, Object.class); + System.out.println("object = " + object); + return success(object); + } + + // 获取小程序 + if (mpService.count(new LambdaUpdateWrapper().eq(Mp::getDeleted, 0)) == 0) { + // 创建小程序 + createMp(); + } + + HashMap map = new HashMap<>(); + + // 获取小程序 + final Mp mp = mpService.getOne(new LambdaQueryWrapper().eq(Mp::getTenantId, tenantId).last("limit 1")); + mp.setAppSecret(null); + map.put("mp", mp); + + // 原生导航条 + final List tabBar = mpPagesService.list(new LambdaQueryWrapper().eq(MpPages::getSubpackage, "MainPackage").last("limit 5")); + map.put("tabBar", tabBar); + + // 配置信息 + HashMap config = new HashMap<>(); + config.put("LICENSE_CODE", ""); + config.put("MAP_KEY", ""); + final List fields = mpFieldService.list(); + fields.forEach(d -> { + config.put(d.getName(), d.getValue()); + }); + map.put("config", config); + + // 服务器时间 + HashMap serverTime = new HashMap<>(); + // 今天日期 + DateTime date = DateUtil.date(); + String today = DateUtil.today(); + // 明天日期 + final DateTime dateTime = DateUtil.tomorrow(); + String tomorrow = DateUtil.format(dateTime, "yyyy-MM-dd"); + // 后天日期 + final DateTime dateTime2 = DateUtil.offsetDay(date, 2); + final String afterDay = DateUtil.format(dateTime2, "yyyy-MM-dd"); + // 今天星期几 + final int week = DateUtil.thisDayOfWeek(); + final DateTime nextWeek = DateUtil.nextWeek(); + serverTime.put("now", DateUtil.now()); // 2024-07-18 22:06:36 + serverTime.put("today", today); // 2024-07-18 + serverTime.put("tomorrow", tomorrow); // 2024-07-19 + serverTime.put("afterDay", afterDay); // 2024-07-20 + serverTime.put("nextWeek", nextWeek); // 2024-07-25 22:06:36 + serverTime.put("week", week); // 5 + map.put("serverTime", serverTime); + redisUtil.set(key, map, 1L, TimeUnit.DAYS); + return success(map); + } + + private void createMp() { + System.out.println("创建小程序 = "); + final User loginUser = getLoginUser(); + final Integer tenantId = getTenantId(); + // 创建网站记录 + final Mp mp = new Mp(); + mp.setTenantId(tenantId); + mp.setAppId("小程序ID"); + mp.setMpName("小程序名称"); + mp.setMainPath("/pages/index"); + if (loginUser != null) { + mp.setUserId(getLoginUserId()); + } + mp.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.YEAR, 1)); + mpService.save(mp); + + // 创建底部导航栏 + final MpPages mpPages = new MpPages(); + mpPages.setHome(1); + mpPages.setTitle("首页"); + mpPages.setPath("/pages/index"); + mpPages.setSubpackage("MainPackage"); + mpPages.setIcon("HomeOutlined"); + mpPages.setSortNumber(0); + mpPages.setTenantId(tenantId); + mpPagesService.save(mpPages); + mpPages.setHome(0); + mpPages.setTitle("分类"); + mpPages.setPath("/pages/category"); + mpPages.setSubpackage("MainPackage"); + mpPages.setIcon("AppstoreOutlined"); + mpPages.setSortNumber(0); + mpPagesService.save(mpPages); + mpPages.setTitle("购物车"); + mpPages.setPath("/pages/category"); + mpPages.setSubpackage("MainPackage"); + mpPages.setIcon("ShoppingCartOutlined"); + mpPages.setSortNumber(0); + mpPagesService.save(mpPages); + mpPages.setTitle("我的"); + mpPages.setPath("/pages/user"); + mpPages.setSubpackage("MainPackage"); + mpPages.setIcon("UserOutlined"); + mpPages.setSortNumber(0); + mpPagesService.save(mpPages); + + // 创建导航图标 + final MpMenu mpMenu = new MpMenu(); + mpMenu.setTenantId(tenantId); + mpMenu.setTitle("分类1"); + mpMenu.setIcon("PictureOutlined"); + mpMenu.setPath("/package/order"); + mpMenu.setTarget("uni.navigateTo"); + mpMenuService.save(mpMenu); + mpMenu.setTitle("分类2"); + mpMenu.setIcon("PictureOutlined"); + mpMenu.setPath("/package/order"); + mpMenuService.save(mpMenu); + mpMenu.setTitle("分类3"); + mpMenu.setIcon("PictureOutlined"); + mpMenu.setPath("/package/order"); + mpMenuService.save(mpMenu); + mpMenu.setTitle("分类4"); + mpMenu.setIcon("PictureOutlined"); + mpMenu.setPath("/package/order"); + mpMenuService.save(mpMenu); + + // 小程序配置信息 + MpField field = new MpField(); + field.setName("mpLogo"); + mpFieldService.save(field); + } + + @ApiOperation("首页数据") + @GetMapping("/index") + public ApiResult index(GoodsParam param) { + // 使用关联查询 + final HashMap layout = new HashMap<>(); + // 瀑布流商品数据 (type:0 商城商品,1 外卖商品) // final List goods = goodsService.list(new LambdaQueryWrapper().ne(Goods::getType, 0).last("limit 10")); // final List foods = goodsService.list(new LambdaQueryWrapper().eq(Goods::getType, 1).last("limit 10")); - layout.put("goods",goodsService.getGoodsSpecType0()); - layout.put("foods", goodsService.getGoodsSpecType1()); + List goodsList = goodsService.getGoodsSpecType0(param); + if (getLoginUser() != null) { + for (Goods goods : goodsList) { + if (getLoginUser().getGradeId().equals(33)) { + if (goods.getDealerGift()) goods.setShowGift(true); + goods.setPrice(goods.getDealerPrice()); + } + // 会员店 + if (getLoginUser().getGradeId().equals(31)) { + if (goods.getPriceGift()) goods.setShowGift(true); + } + if (getLoginUser().getGradeId().equals(0)) { + goods.setPrice(goods.getSalePrice()); + } + } + }else { + for (Goods goods : goodsList) { + goods.setPrice(goods.getSalePrice()); + } + } + layout.put("goods", goodsList); + layout.put("foods", goodsService.getGoodsSpecType1()); - return success(layout); - } + return success(layout); + } - @PreAuthorize("hasAuthority('cms:mp:remove')") - @ApiOperation("清除缓存") - @DeleteMapping("/clearMpInfo/{key}") - public ApiResult clearSiteInfo(@PathVariable("key") String key) { - redisUtil.delete("MpInfo:" + getTenantId()); - return success("清除成功"); - } + @PreAuthorize("hasAuthority('cms:mp:remove')") + @ApiOperation("清除缓存") + @DeleteMapping("/clearMpInfo/{key}") + public ApiResult clearSiteInfo(@PathVariable("key") String key) { + redisUtil.delete("MpInfo:" + getTenantId()); + return success("清除成功"); + } } diff --git a/src/main/java/com/gxwebsoft/cms/entity/Article.java b/src/main/java/com/gxwebsoft/cms/entity/Article.java index 03dd84b..c0d9ed6 100644 --- a/src/main/java/com/gxwebsoft/cms/entity/Article.java +++ b/src/main/java/com/gxwebsoft/cms/entity/Article.java @@ -46,6 +46,10 @@ public class Article implements Serializable { @ApiModelProperty(value = "封面图") private String image; + private Integer imageWidth; + + private Integer imageHeight; + @ApiModelProperty(value = "来源") private String source; diff --git a/src/main/java/com/gxwebsoft/cms/entity/DesignCollect.java b/src/main/java/com/gxwebsoft/cms/entity/DesignCollect.java new file mode 100644 index 0000000..a9cbd9c --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/entity/DesignCollect.java @@ -0,0 +1,61 @@ +package com.gxwebsoft.cms.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 设计征集 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "DesignCollect对象", description = "设计征集") +@TableName("cms_design_collect") +public class DesignCollect implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String title; + + private String content; + + private String image; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/cms/entity/DesignSignUp.java b/src/main/java/com/gxwebsoft/cms/entity/DesignSignUp.java new file mode 100644 index 0000000..e5013f9 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/entity/DesignSignUp.java @@ -0,0 +1,63 @@ +package com.gxwebsoft.cms.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 设计征集报名 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "DesignSignUp对象", description = "设计征集报名") +@TableName("cms_design_sign_up") +public class DesignSignUp implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer designId; + + private String name; + + private String phone; + + private String content; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/DesignCollectMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/DesignCollectMapper.java new file mode 100644 index 0000000..e045b50 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/DesignCollectMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.cms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.cms.entity.DesignCollect; +import com.gxwebsoft.cms.param.DesignCollectParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 设计征集Mapper + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +public interface DesignCollectMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") DesignCollectParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") DesignCollectParam param); + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/DesignSignUpMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/DesignSignUpMapper.java new file mode 100644 index 0000000..d7c2045 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/DesignSignUpMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.cms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.cms.entity.DesignSignUp; +import com.gxwebsoft.cms.param.DesignSignUpParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 设计征集报名Mapper + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +public interface DesignSignUpMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") DesignSignUpParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") DesignSignUpParam param); + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/ArticleMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/ArticleMapper.xml index d7830e6..2a8510e 100644 --- a/src/main/java/com/gxwebsoft/cms/mapper/xml/ArticleMapper.xml +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/ArticleMapper.xml @@ -110,12 +110,10 @@ AND (a.title LIKE CONCAT('%', #{param.keywords}, '%') - OR a.phone LIKE CONCAT('%', #{param.keywords}, '%') - OR a.region LIKE CONCAT('%', #{param.keywords}, '%') - OR a.user_id = #{param.keywords} ) + ORDER BY a.sort_number ASC, a.create_time DESC diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignCollectMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignCollectMapper.xml new file mode 100644 index 0000000..0a2fe3a --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignCollectMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.* + FROM cms_design_collect a + + + AND a.id = #{param.id} + + + AND a.title LIKE CONCAT('%', #{param.title}, '%') + + + AND a.content LIKE CONCAT('%', #{param.content}, '%') + + + AND a.image LIKE CONCAT('%', #{param.image}, '%') + + + AND a.user_id = #{param.userId} + + + AND a.sort_number = #{param.sortNumber} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignSignUpMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignSignUpMapper.xml new file mode 100644 index 0000000..9f287d3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/DesignSignUpMapper.xml @@ -0,0 +1,66 @@ + + + + + + + SELECT a.* + FROM cms_design_sign_up a + + + AND a.id = #{param.id} + + + AND a.design_id = #{param.designId} + + + AND a.name LIKE CONCAT('%', #{param.name}, '%') + + + AND a.phone LIKE CONCAT('%', #{param.phone}, '%') + + + AND a.content LIKE CONCAT('%', #{param.content}, '%') + + + AND a.user_id = #{param.userId} + + + AND a.sort_number = #{param.sortNumber} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/cms/param/DesignCollectParam.java b/src/main/java/com/gxwebsoft/cms/param/DesignCollectParam.java new file mode 100644 index 0000000..42447fc --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/DesignCollectParam.java @@ -0,0 +1,54 @@ +package com.gxwebsoft.cms.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 设计征集查询参数 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "DesignCollectParam对象", description = "设计征集查询参数") +public class DesignCollectParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + private String title; + + private String content; + + private String image; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/cms/param/DesignSignUpParam.java b/src/main/java/com/gxwebsoft/cms/param/DesignSignUpParam.java new file mode 100644 index 0000000..ead3928 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/DesignSignUpParam.java @@ -0,0 +1,57 @@ +package com.gxwebsoft.cms.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 设计征集报名查询参数 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "DesignSignUpParam对象", description = "设计征集报名查询参数") +public class DesignSignUpParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer designId; + + private String name; + + private String phone; + + private String content; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/DesignCollectService.java b/src/main/java/com/gxwebsoft/cms/service/DesignCollectService.java new file mode 100644 index 0000000..5b143c7 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/DesignCollectService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.cms.entity.DesignCollect; +import com.gxwebsoft.cms.param.DesignCollectParam; + +import java.util.List; + +/** + * 设计征集Service + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +public interface DesignCollectService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(DesignCollectParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(DesignCollectParam param); + + /** + * 根据id查询 + * + * @param id + * @return DesignCollect + */ + DesignCollect getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/DesignSignUpService.java b/src/main/java/com/gxwebsoft/cms/service/DesignSignUpService.java new file mode 100644 index 0000000..326d81a --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/DesignSignUpService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.cms.entity.DesignSignUp; +import com.gxwebsoft.cms.param.DesignSignUpParam; + +import java.util.List; + +/** + * 设计征集报名Service + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +public interface DesignSignUpService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(DesignSignUpParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(DesignSignUpParam param); + + /** + * 根据id查询 + * + * @param id + * @return DesignSignUp + */ + DesignSignUp getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/DesignCollectServiceImpl.java b/src/main/java/com/gxwebsoft/cms/service/impl/DesignCollectServiceImpl.java new file mode 100644 index 0000000..7c72f61 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/DesignCollectServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.cms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.cms.mapper.DesignCollectMapper; +import com.gxwebsoft.cms.service.DesignCollectService; +import com.gxwebsoft.cms.entity.DesignCollect; +import com.gxwebsoft.cms.param.DesignCollectParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 设计征集Service实现 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Service +public class DesignCollectServiceImpl extends ServiceImpl implements DesignCollectService { + + @Override + public PageResult pageRel(DesignCollectParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(DesignCollectParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public DesignCollect getByIdRel(Integer id) { + DesignCollectParam param = new DesignCollectParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/DesignSignUpServiceImpl.java b/src/main/java/com/gxwebsoft/cms/service/impl/DesignSignUpServiceImpl.java new file mode 100644 index 0000000..b397586 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/DesignSignUpServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.cms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.cms.mapper.DesignSignUpMapper; +import com.gxwebsoft.cms.service.DesignSignUpService; +import com.gxwebsoft.cms.entity.DesignSignUp; +import com.gxwebsoft.cms.param.DesignSignUpParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 设计征集报名Service实现 + * + * @author 科技小王子 + * @since 2024-10-08 15:21:56 + */ +@Service +public class DesignSignUpServiceImpl extends ServiceImpl implements DesignSignUpService { + + @Override + public PageResult pageRel(DesignSignUpParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(DesignSignUpParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public DesignSignUp getByIdRel(Integer id) { + DesignSignUpParam param = new DesignSignUpParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java b/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java index 5d42e0d..6f5857b 100644 --- a/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java +++ b/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java @@ -67,7 +67,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { "/5zbYEPkyV4.txt", "/api/love/user-plan-log/wx-pay/**", "/api/cms/form-record", - "/api/shop/merchant-account/getMerchantAccountByPhone" + "/api/shop/merchant-account/getMerchantAccountByPhone", + "/api/shop/order-delivery/notify" ) .permitAll() .anyRequest() diff --git a/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java b/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java index e56067f..2f6a6b1 100644 --- a/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java +++ b/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java @@ -24,222 +24,256 @@ import java.util.HashMap; @Component public class RequestUtil { - private static final String host = "https://server.gxwebsoft.com/api"; - private static String ACCESS_TOKEN; - private static String TENANT_ID; + private static final String host = "https://server.gxwebsoft.com/api"; + private static String ACCESS_TOKEN; + private static String TENANT_ID; - public void setTenantId(String tenantId) { - TENANT_ID = tenantId; - } - - public void setAccessToken(String token) { - ACCESS_TOKEN = token; - } - - // 预付请求付款(余额支付) - public Object balancePay(Order order){ - // 设置租户ID - setTenantId(order.getTenantId().toString()); - // 设置token - setAccessToken(order.getAccessToken()); - // 余额支付接口 - String path = "/system/payment/balancePay"; - try { - // 链式构建请求 - final String body = HttpRequest.post(host.concat(path)) - .header("Tenantid", TENANT_ID) - .header("Authorization", ACCESS_TOKEN) - .body(JSONUtil.toJSONString(order))//表单内容 - .timeout(20000)//超时,毫秒 - .execute().body(); - - return JSONUtil.parseObject(body, ApiResult.class).getData(); - - } catch (Exception e) { - e.printStackTrace(); + public void setTenantId(String tenantId) { + TENANT_ID = tenantId; } - return null; - } - // 微信支付通知 - public String pushWxPayNotify(Transaction transaction, Payment payment){ - // 设置租户ID - setTenantId(payment.getTenantId().toString()); - // 推送支付通知地址 - String path = payment.getNotifyUrl(); - try { - // 链式构建请求 - return HttpRequest.post(path) - .header("Tenantid", TENANT_ID) - .body(JSONUtil.toJSONString(transaction))//表单内容 - .timeout(20000)//超时,毫秒 - .execute().body(); - - } catch (Exception e) { - e.printStackTrace(); + public void setAccessToken(String token) { + ACCESS_TOKEN = token; } - return "支付失败"; - } + // 预付请求付款(余额支付) + public Object balancePay(Order order) { + // 设置租户ID + setTenantId(order.getTenantId().toString()); + // 设置token + setAccessToken(order.getAccessToken()); + // 余额支付接口 + String path = "/system/payment/balancePay"; + try { + // 链式构建请求 + final String body = HttpRequest.post(host.concat(path)) + .header("Tenantid", TENANT_ID) + .header("Authorization", ACCESS_TOKEN) + .body(JSONUtil.toJSONString(order))//表单内容 + .timeout(20000)//超时,毫秒 + .execute().body(); + System.out.println("body:" + body); + return JSONUtil.parseObject(body, ApiResult.class).getData(); - public User getUserByPhone(String phone) { - String path = "/system/user/getByPhone/" + phone; - try { - // 链式构建请求 - String result = HttpRequest.get(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("Tenantid", TENANT_ID) - .timeout(20000)//超时,毫秒 - .execute().body(); - - JSONObject jsonObject = JSONObject.parseObject(result); - final String data = jsonObject.getString("data"); - return JSONObject.parseObject(data, User.class); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - return null; - } - public User getByUserId(Integer userId) { - String path = "/system/user/" + userId; - try { - // 链式构建请求 - String result = HttpRequest.get(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("Tenantid", TENANT_ID) - .timeout(20000)//超时,毫秒 - .execute().body(); + // 微信支付通知 + public String pushWxPayNotify(Transaction transaction, Payment payment) { + // 设置租户ID + setTenantId(payment.getTenantId().toString()); + // 推送支付通知地址 + String path = payment.getNotifyUrl(); + try { + // 链式构建请求 + return HttpRequest.post(path) + .header("Tenantid", TENANT_ID) + .body(JSONUtil.toJSONString(transaction))//表单内容 + .timeout(20000)//超时,毫秒 + .execute().body(); - JSONObject jsonObject = JSONObject.parseObject(result); - System.out.println("jsonObject = " + jsonObject); - final String data = jsonObject.getString("data"); - return JSONObject.parseObject(data, User.class); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return "支付失败"; } - return null; - } - // 新增用户 - public boolean saveUserByPhone(MerchantAccount merchantAccount) { - String path = "/system/user/"; - try { - HashMap map = new HashMap<>(); - map.put("nickname", merchantAccount.getRealName()); - map.put("username", merchantAccount.getPhone()); - map.put("realName", merchantAccount.getRealName()); - map.put("phone", merchantAccount.getPhone()); - map.put("password", merchantAccount.getPassword()); - map.put("merchantId",merchantAccount.getMerchantId()); - map.put("merchantName",merchantAccount.getMerchantName()); - map.put("merchantAvatar",merchantAccount.getMerchantAvatar()); - final ArrayList roles = new ArrayList<>(); - final UserRole userRole = new UserRole(); - userRole.setUserId(merchantAccount.getUserId()); - userRole.setRoleId(merchantAccount.getRoleId()); - userRole.setTenantId(merchantAccount.getTenantId()); - roles.add(userRole); - map.put("roles", roles); - map.put("tenantId", TENANT_ID); - // 链式构建请求 - String result = HttpRequest.post(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("Tenantid", TENANT_ID) - .body(JSONUtil.toJSONString(map))//表单内容 - .timeout(20000)//超时,毫秒 - .execute().body(); - } catch (Exception e) { - e.printStackTrace(); + public User getUserByPhone(String phone) { + String path = "/system/user/getByPhone/" + phone; + try { + // 链式构建请求 + String result = HttpRequest.get(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .timeout(20000)//超时,毫秒 + .execute().body(); + + JSONObject jsonObject = JSONObject.parseObject(result); + final String data = jsonObject.getString("data"); + return JSONObject.parseObject(data, User.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - return true; - } - public ApiResult updateUserBalance(String path,User user) { - try { - // 链式构建请求 - final String body = HttpRequest.put(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("Tenantid", TENANT_ID) - .body(JSONUtil.toJSONString(user)) - .timeout(20000) - .execute().body(); - return JSONUtil.parseObject(body, ApiResult.class); - } catch (Exception e) { - e.printStackTrace(); + public User getByUserId(Integer userId) { + String path = "/system/user/" + userId; + try { + // 链式构建请求 + String result = HttpRequest.get(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .timeout(20000)//超时,毫秒 + .execute().body(); + + JSONObject jsonObject = JSONObject.parseObject(result); + System.out.println("jsonObject = " + jsonObject); + final String data = jsonObject.getString("data"); + return JSONObject.parseObject(data, User.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - return null; - } - // 更新用户信息 - public void updateUser(User user) { - String path = "/system/user/"; - try { - // 链式构建请求 - final String body = HttpRequest.put(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("Tenantid", TENANT_ID) - .body(JSONUtil.toJSONString(user)) - .timeout(20000) - .execute().body(); + // 新增用户 + public boolean saveUserByPhone(MerchantAccount merchantAccount) { + String path = "/system/user/"; + try { + HashMap map = new HashMap<>(); + map.put("nickname", merchantAccount.getRealName()); + map.put("username", merchantAccount.getPhone()); + map.put("realName", merchantAccount.getRealName()); + map.put("phone", merchantAccount.getPhone()); + map.put("password", merchantAccount.getPassword()); + map.put("merchantId", merchantAccount.getMerchantId()); + map.put("merchantName", merchantAccount.getMerchantName()); + map.put("merchantAvatar", merchantAccount.getMerchantAvatar()); + final ArrayList roles = new ArrayList<>(); + final UserRole userRole = new UserRole(); + userRole.setUserId(merchantAccount.getUserId()); + userRole.setRoleId(merchantAccount.getRoleId()); + userRole.setTenantId(merchantAccount.getTenantId()); + roles.add(userRole); + map.put("roles", roles); + map.put("tenantId", TENANT_ID); + // 链式构建请求 + String result = HttpRequest.post(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .body(JSONUtil.toJSONString(map))//表单内容 + .timeout(20000)//超时,毫秒 + .execute().body(); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return true; } - } - public String getMpOrderQrCode(String orderNo) { - String path = "/wx-login/getOrderQRCode/"; - try { - // 链式构建请求 - final String body = HttpRequest.get(host.concat(path).concat(orderNo)) - .header("Authorization", ACCESS_TOKEN) - .header("tenantId", TENANT_ID) - .timeout(20000) - .execute().body(); - final JSONObject jsonObject = JSONObject.parseObject(body); - final String qrCode = jsonObject.getString("message"); - return qrCode; - } catch (Exception e) { - e.printStackTrace(); + public ApiResult updateUserBalance(String path, User user) { + try { + // 链式构建请求 + final String body = HttpRequest.put(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .body(JSONUtil.toJSONString(user)) + .timeout(20000) + .execute().body(); + return JSONUtil.parseObject(body, ApiResult.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - return null; - } - public String getOrderQRCodeUnlimited(String orderNo) { - String path = "/wx-login/getOrderQRCodeUnlimited/"; - try { - // 链式构建请求 - final String body = HttpRequest.get(host.concat(path).concat(orderNo)) - .header("Authorization", ACCESS_TOKEN) - .header("tenantId", TENANT_ID) - .timeout(20000) - .execute().body(); - System.out.println("body = " + body); - final JSONObject jsonObject = JSONObject.parseObject(body); - final String qrCode = jsonObject.getString("message"); - System.out.println("qrCode = " + qrCode); - return qrCode; - } catch (Exception e) { - e.printStackTrace(); + public User getParent(Integer userId) { + try { + // 链式构建请求 + final String result = HttpRequest.get(host.concat("/system/user-referee/getReferee/" + userId)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .timeout(20000) + .execute().body(); + JSONObject jsonObject = JSONObject.parseObject(result); + final String data = jsonObject.getString("data"); + return JSONObject.parseObject(data, User.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - return null; - } - public void updateUserMerchantId(User user) { - String path = "/system/user/updateUserMerchantId"; - try { - // 链式构建请求 - final String body = HttpRequest.put(host.concat(path)) - .header("Authorization", ACCESS_TOKEN) - .header("tenantId", TENANT_ID) - .body(JSONUtil.toJSONString(user)) - .timeout(20000) - .execute().body(); - System.out.println("body = " + body); - } catch (Exception e) { - e.printStackTrace(); - } - } + // 更新用户信息 + public void updateUser(User user) { + String path = "/system/user/"; + try { + // 链式构建请求 + final String body = HttpRequest.put(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .body(JSONUtil.toJSONString(user)) + .timeout(20000) + .execute().body(); + System.out.println("body = " + body); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public String getMpOrderQrCode(String orderNo) { + String path = "/wx-login/getOrderQRCode/"; + try { + // 链式构建请求 + final String body = HttpRequest.get(host.concat(path).concat(orderNo)) + .header("Authorization", ACCESS_TOKEN) + .header("tenantId", TENANT_ID) + .timeout(20000) + .execute().body(); + final JSONObject jsonObject = JSONObject.parseObject(body); + final String qrCode = jsonObject.getString("message"); + return qrCode; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public String getOrderQRCodeUnlimited(String orderNo) { + String path = "/wx-login/getOrderQRCodeUnlimited/"; + try { + // 链式构建请求 + final String body = HttpRequest.get(host.concat(path).concat(orderNo)) + .header("Authorization", ACCESS_TOKEN) + .header("tenantId", TENANT_ID) + .timeout(20000) + .execute().body(); + System.out.println("body = " + body); + final JSONObject jsonObject = JSONObject.parseObject(body); + final String qrCode = jsonObject.getString("message"); + System.out.println("qrCode = " + qrCode); + return qrCode; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public void updateUserMerchantId(User user) { + String path = "/system/user/updateUserMerchantId"; + try { + // 链式构建请求 + final String body = HttpRequest.put(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("tenantId", TENANT_ID) + .body(JSONUtil.toJSONString(user)) + .timeout(20000) + .execute().body(); + System.out.println("body = " + body); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public ApiResult getWxConfig() { + String path = "/system/setting?settingKey=mp-weixin"; + try { + // 链式构建请求 + final String body = HttpRequest.get(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("tenantId", TENANT_ID) + .timeout(20000) + .execute().body(); + System.out.println("body = " + body); + return JSONUtil.parseObject(body, ApiResult.class); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/java/com/gxwebsoft/common/system/controller/FileController.java b/src/main/java/com/gxwebsoft/common/system/controller/FileController.java index 12b5a7e..c5480c1 100644 --- a/src/main/java/com/gxwebsoft/common/system/controller/FileController.java +++ b/src/main/java/com/gxwebsoft/common/system/controller/FileController.java @@ -280,7 +280,7 @@ public class FileController extends BaseController { * 文件上传位置(服务器) */ private String getUploadDir() { - return config.getUploadPath() + "file/"; + return config.getUploadPath(); } /** diff --git a/src/main/java/com/gxwebsoft/shop/config/WxMaProperties.java b/src/main/java/com/gxwebsoft/shop/config/WxMaProperties.java new file mode 100644 index 0000000..db25e5c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/config/WxMaProperties.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.shop.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Data +@ConfigurationProperties(prefix = "wx.miniapp") +@Configuration +public class WxMaProperties { + private List configs; + + @Data + public static class Config { + /** + * 设置微信小程序的appid + */ + private String appid; + + /** + * 设置微信小程序的Secret + */ + private String secret; + + /** + * 设置微信小程序消息服务器配置的token + */ + private String token; + + /** + * 设置微信小程序消息服务器配置的EncodingAESKey + */ + private String aesKey; + + /** + * 消息格式,XML或者JSON + */ + private String msgDataFormat; + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/consts/BalanceScene.java b/src/main/java/com/gxwebsoft/shop/consts/BalanceScene.java new file mode 100644 index 0000000..69bbe6b --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/consts/BalanceScene.java @@ -0,0 +1,8 @@ +package com.gxwebsoft.shop.consts; + +public class BalanceScene { + public static final Integer BALANCE_SCENE_DIRECT_INCOME = 0; + public static final Integer BALANCE_SCENE_SUPPLIER = 1; + public static final Integer BALANCE_SCENE_DIFF = 2; + public static final Integer BALANCE_SCENE_OUT_TAKE = 3; +} diff --git a/src/main/java/com/gxwebsoft/shop/consts/OrderPayType.java b/src/main/java/com/gxwebsoft/shop/consts/OrderPayType.java new file mode 100644 index 0000000..248097f --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/consts/OrderPayType.java @@ -0,0 +1,8 @@ +package com.gxwebsoft.shop.consts; + +public class OrderPayType { + public static final Integer PAY_TYPE_BALANCE = 0; + public static final Integer PAY_TYPE_WECHAT = 1; + // 朋友代付 + public static final Integer PAY_TYPE_FRIEND = 18; +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/CartController.java b/src/main/java/com/gxwebsoft/shop/controller/CartController.java index 1112338..091ebf3 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/CartController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/CartController.java @@ -40,133 +40,144 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/api/shop/cart") public class CartController extends BaseController { - @Resource - private CartService cartService; - @Resource - private MerchantService merchantService; + @Resource + private CartService cartService; + @Resource + private MerchantService merchantService; - @ApiOperation("分页查询购物车") - @GetMapping("/page") - public ApiResult> page(CartParam param) { - // 使用关联查询 - return success(cartService.pageRel(param)); - } - - @ApiOperation("查询全部购物车") - @GetMapping() - public ApiResult list(CartParam param) { - if (ObjectUtil.isEmpty(getLoginUser())) { - return success("请先登录",new CartVo()); - } - // 附加用户ID - param.setUserId(getLoginUserId()); - return success(cartService.listRel(param)); - } - - @PreAuthorize("hasAuthority('shop:cart:list')") - @ApiOperation("根据id查询购物车") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(cartService.getByIdRel(id)); - } - - @ApiOperation("添加购物车") - @PostMapping() - public ApiResult save(@RequestBody Cart cart) { - if (ObjectUtil.isEmpty(getLoginUser())) { - return success("请先登录",null); + @ApiOperation("分页查询购物车") + @GetMapping("/page") + public ApiResult> page(CartParam param) { + // 使用关联查询 + return success(cartService.pageRel(param)); } - // 修正用户ID - cart.setUserId(getLoginUserId()); - // 修正购买数量 - if (ObjectUtil.isEmpty(cart.getCartNum())) { - cart.setCartNum(1); - } - // 超出最大限制 - if (cartService.count(new LambdaUpdateWrapper().eq(Cart::getUserId,cart.getUserId())) > 50) { - return fail("购物车宝贝数量已满,建议您先去结算或清理~"); - } - // 叠加 - final Cart one = cartService.getOne(new LambdaQueryWrapper().eq(Cart::getGoodsId, cart.getGoodsId()).eq(Cart::getSpec, cart.getSpec()).eq(Cart::getUserId, cart.getUserId()).eq(Cart::getType, cart.getType()).last("limit 1")); - if (ObjectUtil.isNotEmpty(one)) { - one.setCartNum(one.getCartNum() + cart.getCartNum()); - cartService.updateById(one); - return success("添加成功",one.getId()); - } - if (cartService.save(cart)) { - return success("添加成功",cart.getId()); + @ApiOperation("查询全部购物车") + @GetMapping() + public ApiResult list(CartParam param) { + param.setIsShow(true); + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录", new CartVo()); + } + // 附加用户ID + param.setUserId(getLoginUserId()); + param.setLoginUser(getLoginUser()); + return success(cartService.listRel(param)); } - return fail("添加失败"); - } - - @ApiOperation("修改购物车") - @PutMapping() - public ApiResult update(@RequestBody Cart cart) { - if (cartService.updateById(cart)) { - final CartParam param = new CartParam(); - param.setType(cart.getType()); - return success("修改成功"); + @PreAuthorize("hasAuthority('shop:cart:list')") + @ApiOperation("根据id查询购物车") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(cartService.getByIdRel(id)); } - return fail("修改失败"); - } - @PreAuthorize("hasAuthority('shop:cart:remove')") - @ApiOperation("删除购物车") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (cartService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } + @ApiOperation("添加购物车") + @PostMapping() + public ApiResult save(@RequestBody Cart cart) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录", null); + } - @PreAuthorize("hasAuthority('shop:cart:save')") - @ApiOperation("批量添加购物车") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (cartService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } + // 修正用户ID + cart.setUserId(getLoginUserId()); + // 修正购买数量 + if (ObjectUtil.isEmpty(cart.getCartNum())) { + cart.setCartNum(1); + } + // 超出最大限制 + if (cartService.count(new LambdaUpdateWrapper().eq(Cart::getUserId, cart.getUserId())) > 50) { + return fail("购物车宝贝数量已满,建议您先去结算或清理~"); + } + // 叠加 + if (!cart.getIsNew()) { + LambdaQueryWrapper cartLambdaQueryWrapper = new LambdaQueryWrapper() + .eq(Cart::getGoodsId, cart.getGoodsId()) + .eq(Cart::getUserId, cart.getUserId()) + .eq(Cart::getType, cart.getType()); + if (cart.getSpec() != null) cartLambdaQueryWrapper.eq(Cart::getSpec, cart.getSpec()); + cartLambdaQueryWrapper.last("limit 1"); + final Cart one = cartService.getOne(cartLambdaQueryWrapper); + if (ObjectUtil.isNotEmpty(one)) { + one.setIsNew(false); + one.setCartNum(one.getCartNum() + cart.getCartNum()); + cartService.updateById(one); + return success("添加成功", one.getId()); + } + } + if (cartService.save(cart)) { + return success("添加成功", cart.getId()); + } - @PreAuthorize("hasAuthority('shop:cart:update')") - @ApiOperation("批量修改购物车") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(cartService, "id")) { - return success("修改成功"); + return fail("添加失败"); } - return fail("修改失败"); - } - @PreAuthorize("hasAuthority('shop:cart:remove')") - @ApiOperation("批量删除购物车") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (cartService.removeByIds(ids)) { - return success("删除成功"); + @ApiOperation("修改购物车") + @PutMapping() + public ApiResult update(@RequestBody Cart cart) { + if (cartService.updateById(cart)) { + final CartParam param = new CartParam(); + param.setType(cart.getType()); + return success("修改成功"); + } + return fail("修改失败"); } - return fail("删除失败"); - } - @ApiOperation("全选操作") - @PutMapping("/onSelectAll/{yes}") - public ApiResult onSelectAll(@PathVariable("yes") Boolean yes) { - if (ObjectUtil.isEmpty(getLoginUser())) { - return success("请先登录",null); + @PreAuthorize("hasAuthority('shop:cart:remove')") + @ApiOperation("删除购物车") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (cartService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PreAuthorize("hasAuthority('shop:cart:save')") + @ApiOperation("批量添加购物车") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (cartService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('shop:cart:update')") + @ApiOperation("批量修改购物车") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cartService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('shop:cart:remove')") + @ApiOperation("批量删除购物车") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (cartService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("全选操作") + @PutMapping("/onSelectAll/{yes}") + public ApiResult onSelectAll(@PathVariable("yes") Boolean yes) { + if (ObjectUtil.isEmpty(getLoginUser())) { + return success("请先登录", null); + } + final List carts = cartService.list(new LambdaUpdateWrapper() + .eq(Cart::getSelected, !yes) + .eq(Cart::getUserId, getLoginUserId())); + carts.forEach(d -> { + d.setSelected(yes); + }); + return success("修改成功", cartService.updateBatchById(carts)); } - final List carts = cartService.list(new LambdaUpdateWrapper() - .eq(Cart::getSelected,!yes) - .eq(Cart::getUserId, getLoginUserId())); - carts.forEach(d -> { - d.setSelected(yes); - }); - return success("修改成功", cartService.updateBatchById(carts)); - } // @ApiOperation("我的购物车") diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java index 9a42595..d6c0383 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsCategoryController.java @@ -26,9 +26,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static com.gxwebsoft.common.core.utils.CommonUtil.toTreeData; @@ -43,235 +41,242 @@ import static com.gxwebsoft.common.core.utils.CommonUtil.toTreeData; @RestController @RequestMapping("/api/shop/goods-category") public class GoodsCategoryController extends BaseController { - @Resource - private GoodsCategoryService goodsCategoryService; - @Resource - private GoodsSpecService goodsSpecService; - @Resource - private GoodsService goodsService; - @Resource - private CartService cartService; + @Resource + private GoodsCategoryService goodsCategoryService; + @Resource + private GoodsSpecService goodsSpecService; + @Resource + private GoodsService goodsService; + @Resource + private CartService cartService; - @ApiOperation("查询商城菜单分类级商品数据(不联动)") - @GetMapping("/listCategoryTree") - public ApiResult> listCategoryTree(GoodsCategoryParam param) { - // 查询非店铺分类 - param.setMerchantId(0); - final List goodsCategoryList = goodsCategoryService.listRel(param); - // 收集分类ID - final Set categoryIds = goodsCategoryList.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); - if (categoryIds.isEmpty()) { - return success("分类为空",goodsCategoryList); - } - // List转为树形结构 - final List list = toTreeData(goodsCategoryList, 0, GoodsCategory::getParentId, GoodsCategory::getCategoryId, GoodsCategory::setChildren); - // 查询所有商品 - final List goods = goodsService.list(new LambdaQueryWrapper() - .in(Goods::getCategoryId, categoryIds) - .eq(Goods::getIsShow, 1) - .eq(Goods::getDeleted, 0)); + @ApiOperation("查询商城菜单分类级商品数据(不联动)") + @GetMapping("/listCategoryTree") + public ApiResult> listCategoryTree(GoodsCategoryParam param) { + // 查询非店铺分类 + param.setMerchantId(0); + final List goodsCategoryList = goodsCategoryService.listRel(param); + // 收集分类ID + final Set categoryIds = goodsCategoryList.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); + if (categoryIds.isEmpty()) { + return success("分类为空", goodsCategoryList); + } + // List转为树形结构 + final List list = toTreeData(goodsCategoryList, 0, GoodsCategory::getParentId, GoodsCategory::getCategoryId, GoodsCategory::setChildren); + // 查询所有商品 + final List goods = goodsService.list(new LambdaQueryWrapper() + .in(Goods::getCategoryId, categoryIds) + .eq(Goods::getIsShow, 1) + .eq(Goods::getDeleted, 0)); - System.out.println("goods.size() = " + goods.size()); + System.out.println("goods.size() = " + goods.size()); - final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); + final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); + final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); - final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); + final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); - final Map> collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); + final Map> collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); - list.forEach(d -> { - d.setName(d.getTitle()); - final List goodsList = collectGoods.get(d.getCategoryId()); - if (!CollectionUtils.isEmpty(goodsList)) { - goodsList.forEach(v -> { - final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); - if (!CollectionUtils.isEmpty(goodsSpecs)) { - final GoodsSpec spec = goodsSpecs.get(0); - v.setSpecValue(spec.getSpecValue()); - v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); - } + list.forEach(d -> { + d.setName(d.getTitle()); + final List goodsList = collectGoods.get(d.getCategoryId()); + if (!CollectionUtils.isEmpty(goodsList)) { + goodsList.forEach(v -> { + final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); + if (!CollectionUtils.isEmpty(goodsSpecs)) { + final GoodsSpec spec = goodsSpecs.get(0); + v.setSpecValue(spec.getSpecValue()); + v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); + } + }); + d.setGoods(collectGoods.get(d.getCategoryId())); + } }); - d.setGoods(collectGoods.get(d.getCategoryId())); - } - }); - return success(list); - } - - @ApiOperation("查询商城菜单分类级商品数据(不联动)") - @GetMapping("/listCategoryParentIdTree/{parentId}") - public ApiResult> listCategoryParentIdTree(@PathVariable("parentId") Integer parentId) { - // 查询非店铺分类 - final List list = goodsCategoryService.list(new LambdaQueryWrapper() - .eq(GoodsCategory::getParentId,parentId) - .eq(GoodsCategory::getType,0) - .eq(GoodsCategory::getMerchantId,0)); - - final Set categoryIds = list.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); - final List goods = goodsService.list(new LambdaQueryWrapper().in(Goods::getCategoryId, categoryIds)); - final Map> collect = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - - final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - - final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); - - final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); - - final Map> collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); - - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(Cart::getGoodsId, goodsIds).eq(Cart::getSelected,1); - if(ObjectUtil.isNotEmpty(getLoginUser())){ - wrapper.eq(Cart::getUserId,getLoginUser().getUserId()); + return success(list); } - final List carts = cartService.list(); - final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getGoodsId)); - list.forEach(d -> { - d.setName(d.getTitle()); - final List goodsList = collectGoods.get(d.getCategoryId()); - if (!CollectionUtils.isEmpty(goodsList)) { - goodsList.forEach(v -> { - final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); - if (!CollectionUtils.isEmpty(goodsSpecs)) { - final GoodsSpec spec = goodsSpecs.get(0); - v.setSpecValue(spec.getSpecValue()); - v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); - } - final List carts1 = collectCart.get(v.getGoodsId()); + @ApiOperation("查询商城菜单分类级商品数据(不联动)") + @GetMapping("/listCategoryParentIdTree/{parentId}") + public ApiResult> listCategoryParentIdTree(@PathVariable("parentId") Integer parentId) { + // 查询非店铺分类 + final List list = goodsCategoryService.list(new LambdaQueryWrapper() + .eq(GoodsCategory::getParentId, parentId) + .eq(GoodsCategory::getType, 0) + .eq(GoodsCategory::getMerchantId, 0)); - if (ArrayUtil.isNotEmpty(carts1)) { - final Cart cart = carts1.get(0); + final Set categoryIds = list.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); + final List goods = goodsService.list(new LambdaQueryWrapper().in(Goods::getCategoryId, categoryIds)); + final Map> collect = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - if (getLoginUser() != null && cart.getUserId().equals(getLoginUserId())) { - v.setTotalNums(cart.getCartNum()); - } + final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - } + final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); + final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); + + final Map> collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(Cart::getGoodsId, goodsIds).eq(Cart::getSelected, 1); + if (ObjectUtil.isNotEmpty(getLoginUser())) { + wrapper.eq(Cart::getUserId, getLoginUser().getUserId()); + } + final List carts = cartService.list(); + final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getGoodsId)); + + list.forEach(d -> { + d.setName(d.getTitle()); + final List goodsList = collectGoods.get(d.getCategoryId()); + if (!CollectionUtils.isEmpty(goodsList)) { + goodsList.forEach(v -> { + final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); + if (!CollectionUtils.isEmpty(goodsSpecs)) { + final GoodsSpec spec = goodsSpecs.get(0); + v.setSpecValue(spec.getSpecValue()); + v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); + } + final List carts1 = collectCart.get(v.getGoodsId()); + + if (ArrayUtil.isNotEmpty(carts1)) { + final Cart cart = carts1.get(0); + + if (getLoginUser() != null && cart.getUserId().equals(getLoginUserId())) { + v.setTotalNums(cart.getCartNum()); + } + + } + + }); + d.setGoods(goodsList); + } }); - d.setGoods(goodsList); - } - }); - return success("请求成功",list); - } - - @ApiOperation("查询门店菜单分类及菜品数据(联动)") - @GetMapping("/listShopCategoryTree") - public ApiResult> listShopCategoryTree(GoodsCategoryParam param) { - final List list = goodsCategoryService.listRel(param); - final Set categoryIds = list.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); - if (categoryIds.isEmpty()) { - return success(list); + return success("请求成功", list); } - final List goods = goodsService.list(new LambdaQueryWrapper().in(Goods::getCategoryId, categoryIds).eq(Goods::getIsShow, 1).eq(Goods::getDeleted, 0)); - final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); + @ApiOperation("查询门店菜单分类及菜品数据(联动)") + @GetMapping("/listShopCategoryTree") + public ApiResult> listShopCategoryTree(GoodsCategoryParam param) { + final List list = goodsCategoryService.listRel(param); + final Set categoryIds = list.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toSet()); + if (categoryIds.isEmpty()) { + return success(list); + } - final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); + final List goods = goodsService.list(new LambdaQueryWrapper().in(Goods::getCategoryId, categoryIds).eq(Goods::getIsShow, 1).eq(Goods::getDeleted, 0)); + final Map> collectGoods = goods.stream().collect(Collectors.groupingBy(Goods::getCategoryId)); - final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); + final Set goodsIds = goods.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); - final Map> collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); + List specs = new ArrayList<>(); + Map> collectGoodsSpec; + if (!goodsIds.isEmpty()) { + specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); + collectGoodsSpec = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); + } else { + collectGoodsSpec = null; + } - list.forEach(d -> { - d.setName(d.getTitle()); - final List goodsList = collectGoods.get(d.getCategoryId()); - if (!CollectionUtils.isEmpty(goodsList)) { - goodsList.forEach(v -> { - final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); - if (!CollectionUtils.isEmpty(goodsSpecs)) { - final GoodsSpec spec = goodsSpecs.get(0); - v.setSpecValue(spec.getSpecValue()); - v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); - } + list.forEach(d -> { + d.setName(d.getTitle()); + final List goodsList = collectGoods.get(d.getCategoryId()); + if (!CollectionUtils.isEmpty(goodsList)) { + goodsList.forEach(v -> { + if (collectGoodsSpec != null) { + final List goodsSpecs = collectGoodsSpec.get(v.getGoodsId()); + if (!CollectionUtils.isEmpty(goodsSpecs)) { + final GoodsSpec spec = goodsSpecs.get(0); + v.setSpecValue(spec.getSpecValue()); + v.setGoodsSpecValue(JSONUtil.parseObject(spec.getSpecValue(), Object.class)); + } + } + }); + d.setGoods(collectGoods.get(d.getCategoryId())); + } }); - d.setGoods(collectGoods.get(d.getCategoryId())); - } - }); - return success(list); - } - - - @ApiOperation("分页查询商品分类") - @GetMapping("/page") - public ApiResult> page(GoodsCategoryParam param) { - // 使用关联查询 - return success(goodsCategoryService.pageRel(param)); - } - - @ApiOperation("查询全部商品分类") - @GetMapping() - public ApiResult> list(GoodsCategoryParam param) { - // 使用关联查询 - return success(goodsCategoryService.listRel(param)); - } - - @ApiOperation("根据id查询商品分类") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(goodsCategoryService.getByIdRel(id)); - } - - @ApiOperation("添加商品分类") - @PostMapping() - public ApiResult save(@RequestBody GoodsCategory goodsCategory) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - goodsCategory.setUserId(loginUser.getUserId()); + return success(list); } - if (goodsCategoryService.save(goodsCategory)) { - return success("添加成功"); - } - return fail("添加失败"); - } - @ApiOperation("修改商品分类") - @PutMapping() - public ApiResult update(@RequestBody GoodsCategory goodsCategory) { - if (goodsCategoryService.updateById(goodsCategory)) { - return success("修改成功"); - } - return fail("修改失败"); - } - @ApiOperation("删除商品分类") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (goodsCategoryService.removeById(id)) { - return success("删除成功"); + @ApiOperation("分页查询商品分类") + @GetMapping("/page") + public ApiResult> page(GoodsCategoryParam param) { + // 使用关联查询 + return success(goodsCategoryService.pageRel(param)); } - return fail("删除失败"); - } - @ApiOperation("批量添加商品分类") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (goodsCategoryService.saveBatch(list)) { - return success("添加成功"); + @ApiOperation("查询全部商品分类") + @GetMapping() + public ApiResult> list(GoodsCategoryParam param) { + // 使用关联查询 + return success(goodsCategoryService.listRel(param)); } - return fail("添加失败"); - } - @ApiOperation("批量修改商品分类") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(goodsCategoryService, "category_id")) { - return success("修改成功"); + @ApiOperation("根据id查询商品分类") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(goodsCategoryService.getByIdRel(id)); } - return fail("修改失败"); - } - @ApiOperation("批量删除商品分类") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (goodsCategoryService.removeByIds(ids)) { - return success("删除成功"); + @ApiOperation("添加商品分类") + @PostMapping() + public ApiResult save(@RequestBody GoodsCategory goodsCategory) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + goodsCategory.setUserId(loginUser.getUserId()); + } + if (goodsCategoryService.save(goodsCategory)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改商品分类") + @PutMapping() + public ApiResult update(@RequestBody GoodsCategory goodsCategory) { + if (goodsCategoryService.updateById(goodsCategory)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除商品分类") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (goodsCategoryService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加商品分类") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (goodsCategoryService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改商品分类") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(goodsCategoryService, "category_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除商品分类") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (goodsCategoryService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); } - return fail("删除失败"); - } } diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java index 3071965..56fb72b 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsController.java @@ -65,6 +65,16 @@ public class GoodsController extends BaseController { public ApiResult get(@PathVariable("id") Integer id) { // 使用关联查询 final Goods goods = goodsService.getByIdRel(id); + if (getLoginUser() != null) { + // 经销商 + if (getLoginUser().getGradeId().equals(33)) { + if (goods.getDealerGift()) goods.setShowGift(true); + } + // 会员店 + if (getLoginUser().getGradeId().equals(31)) { + if (goods.getPriceGift()) goods.setShowGift(true); + } + } // 提取specValue final GoodsSpec spec = goodsSpecService.getOne(new LambdaQueryWrapper().eq(GoodsSpec::getGoodsId, id).last("limit 1")); @@ -82,6 +92,8 @@ public class GoodsController extends BaseController { if(loginUser.getGradeId().equals(0)){ goods.setPrice(goods.getSalePrice()); } + }else { + goods.setPrice(goods.getSalePrice()); } // 店铺信息 goods.setMerchant(merchantService.getOne(new LambdaUpdateWrapper().eq(Merchant::getMerchantId, goods.getMerchantId()))); diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsIncomeConfigController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsIncomeConfigController.java new file mode 100644 index 0000000..a31afda --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsIncomeConfigController.java @@ -0,0 +1,119 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.service.GoodsIncomeConfigService; +import com.gxwebsoft.shop.entity.GoodsIncomeConfig; +import com.gxwebsoft.shop.param.GoodsIncomeConfigParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 分润配置控制器 + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +@Api(tags = "分润配置管理") +@RestController +@RequestMapping("/api/shop/goods-income-config") +public class GoodsIncomeConfigController extends BaseController { + @Resource + private GoodsIncomeConfigService goodsIncomeConfigService; + + @ApiOperation("分页查询分润配置") + @GetMapping("/page") + public ApiResult> page(GoodsIncomeConfigParam param) { + // 使用关联查询 + return success(goodsIncomeConfigService.pageRel(param)); + } + + @ApiOperation("查询全部分润配置") + @GetMapping() + public ApiResult> list(GoodsIncomeConfigParam param) { + // 使用关联查询 + return success(goodsIncomeConfigService.listRel(param)); + } + + @PreAuthorize("hasAuthority('shop:goodsIncomeConfig:list')") + @ApiOperation("根据id查询分润配置") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(goodsIncomeConfigService.getByIdRel(id)); + } + + @ApiOperation("添加分润配置") + @PostMapping() + public ApiResult save(@RequestBody GoodsIncomeConfig goodsIncomeConfig) { + GoodsIncomeConfig check = goodsIncomeConfigService.check(goodsIncomeConfig.getGoodsId(), goodsIncomeConfig.getSkuId(), goodsIncomeConfig.getMerchantShopType()); + if (check != null) return fail("该配置已存在"); + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + goodsIncomeConfig.setUserId(loginUser.getUserId()); + } + if (goodsIncomeConfigService.save(goodsIncomeConfig)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改分润配置") + @PutMapping() + public ApiResult update(@RequestBody GoodsIncomeConfig goodsIncomeConfig) { + GoodsIncomeConfig check = goodsIncomeConfigService.check(goodsIncomeConfig.getGoodsId(), goodsIncomeConfig.getSkuId(), goodsIncomeConfig.getMerchantShopType()); + if (check != null && !check.getId().equals(goodsIncomeConfig.getId())) return fail("该配置已存在"); + if (goodsIncomeConfigService.updateById(goodsIncomeConfig)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除分润配置") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (goodsIncomeConfigService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加分润配置") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (goodsIncomeConfigService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改分润配置") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(goodsIncomeConfigService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除分润配置") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (goodsIncomeConfigService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/GoodsStockInMerchantController.java b/src/main/java/com/gxwebsoft/shop/controller/GoodsStockInMerchantController.java new file mode 100644 index 0000000..79145d2 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/GoodsStockInMerchantController.java @@ -0,0 +1,122 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.service.GoodsStockInMerchantService; +import com.gxwebsoft.shop.entity.GoodsStockInMerchant; +import com.gxwebsoft.shop.param.GoodsStockInMerchantParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 商户商品库存控制器 + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +@Api(tags = "商户商品库存管理") +@RestController +@RequestMapping("/api/shop/goods-stock-in-merchant") +public class GoodsStockInMerchantController extends BaseController { + @Resource + private GoodsStockInMerchantService goodsStockInMerchantService; + + @ApiOperation("分页查询商户商品库存") + @GetMapping("/page") + public ApiResult> page(GoodsStockInMerchantParam param) { + // 使用关联查询 + return success(goodsStockInMerchantService.pageRel(param)); + } + + @ApiOperation("查询全部商户商品库存") + @GetMapping() + public ApiResult> list(GoodsStockInMerchantParam param) { + // 使用关联查询 + return success(goodsStockInMerchantService.listRel(param)); + } + + @PreAuthorize("hasAuthority('shop:goodsStockInMerchant:list')") + @ApiOperation("根据id查询商户商品库存") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(goodsStockInMerchantService.getByIdRel(id)); + } + + @ApiOperation("添加商户商品库存") + @PostMapping() + public ApiResult save(@RequestBody GoodsStockInMerchant goodsStockInMerchant) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + goodsStockInMerchant.setUserId(loginUser.getUserId()); + goodsStockInMerchant.setMerchantId(loginUser.getMerchantId()); + GoodsStockInMerchant check = goodsStockInMerchantService.check(loginUser.getMerchantId(), goodsStockInMerchant.getGoodsId(), goodsStockInMerchant.getSkuId()); + if (check != null) { + check.setStock(goodsStockInMerchant.getStock()); + goodsStockInMerchantService.updateById(goodsStockInMerchant); + return success("操作成功"); + } + } + if (goodsStockInMerchantService.save(goodsStockInMerchant)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改商户商品库存") + @PutMapping() + public ApiResult update(@RequestBody GoodsStockInMerchant goodsStockInMerchant) { + if (goodsStockInMerchantService.updateById(goodsStockInMerchant)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除商户商品库存") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (goodsStockInMerchantService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加商户商品库存") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (goodsStockInMerchantService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改商户商品库存") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(goodsStockInMerchantService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除商户商品库存") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (goodsStockInMerchantService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/MerchantApplyController.java b/src/main/java/com/gxwebsoft/shop/controller/MerchantApplyController.java index c58ede2..bd89af3 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/MerchantApplyController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/MerchantApplyController.java @@ -2,6 +2,7 @@ package com.gxwebsoft.shop.controller; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.common.core.security.JwtUtil; import com.gxwebsoft.common.core.utils.RequestUtil; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.shop.entity.Merchant; @@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.List; /** @@ -39,128 +41,149 @@ import java.util.List; @RestController @RequestMapping("/api/shop/merchant-apply") public class MerchantApplyController extends BaseController { - @Resource - private MerchantApplyService merchantApplyService; - @Resource - private MerchantService merchantService; - @Resource - private RequestUtil requestUtil; + @Resource + private MerchantApplyService merchantApplyService; + @Resource + private MerchantService merchantService; + @Resource + private RequestUtil requestUtil; - @ApiOperation("分页查询商户入驻申请") - @GetMapping("/page") - public ApiResult> page(MerchantApplyParam param) { - // 使用关联查询 - return success(merchantApplyService.pageRel(param)); - } - - @ApiOperation("查询全部商户入驻申请") - @GetMapping() - public ApiResult> list(MerchantApplyParam param) { - // 使用关联查询 - return success(merchantApplyService.listRel(param)); - } - - @ApiOperation("根据id查询商户入驻申请") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(merchantApplyService.getByIdRel(id)); - } - - @ApiOperation("添加商户入驻申请") - @PostMapping() - public ApiResult save(@RequestBody MerchantApply merchantApply) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - merchantApply.setUserId(loginUser.getUserId()); + @ApiOperation("分页查询商户入驻申请") + @GetMapping("/page") + public ApiResult> page(MerchantApplyParam param) { + // 使用关联查询 + return success(merchantApplyService.pageRel(param)); } - if (merchantService.count(new LambdaQueryWrapper().eq(Merchant::getPhone, merchantApply.getPhone())) > 0) { - return fail("该手机号码已存在"); - } - if (merchantApplyService.count(new LambdaQueryWrapper().eq(MerchantApply::getPhone, merchantApply.getPhone())) > 0) { - return fail("该手机号码已存在"); - } - if (merchantApplyService.save(merchantApply)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @ApiOperation("修改商户入驻申请") - @PutMapping() - public ApiResult update(@RequestBody MerchantApply merchantApply) { - if (merchantApply.getStatus().equals(1)) { - // TODO 审核通过则创建商户 - final Merchant one = merchantService.getOne(new LambdaQueryWrapper().eq(Merchant::getPhone, merchantApply.getPhone()).last("limit 1")); - final MerchantAccount merchantAccount = new MerchantAccount(); - BeanUtils.copyProperties(merchantApply, merchantAccount); - - final User user = new User(); - - if(ObjectUtil.isNotEmpty(one)){ - BeanUtils.copyProperties(merchantApply, one); - one.setStatus(0); - merchantService.updateById(one); - user.setMerchantId(one.getMerchantId()); - user.setMerchantName(one.getMerchantName()); - }else { - final Merchant merchant = new Merchant(); - BeanUtils.copyProperties(merchantApply, merchant); - merchant.setStatus(0); - merchantService.save(merchant); - user.setMerchantId(merchant.getMerchantId()); - user.setMerchantName(merchant.getMerchantName()); - } - // TODO 创建商户账号 - merchantAccount.setRealName(merchantApply.getRealName()); - requestUtil.saveUserByPhone(merchantAccount); - // TODO 更新用户表的商户ID - requestUtil.updateUserMerchantId(user); + @ApiOperation("查询全部商户入驻申请") + @GetMapping() + public ApiResult> list(MerchantApplyParam param) { + // 使用关联查询 + return success(merchantApplyService.listRel(param)); } - // TODO 驳回 - if (merchantApplyService.updateById(merchantApply)) { - return success("修改成功"); + @ApiOperation("根据id查询商户入驻申请") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(merchantApplyService.getByIdRel(id)); } - return fail("修改失败"); - } - @ApiOperation("删除商户入驻申请") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (merchantApplyService.removeById(id)) { - return success("删除成功"); + @ApiOperation("添加商户入驻申请") + @PostMapping() + public ApiResult save(@RequestBody MerchantApply merchantApply) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + merchantApply.setUserId(loginUser.getUserId()); + } + if (merchantService.count(new LambdaQueryWrapper().eq(Merchant::getPhone, merchantApply.getPhone())) > 0) { + return fail("该手机号码已存在"); + } + if (merchantApplyService.count(new LambdaQueryWrapper().eq(MerchantApply::getPhone, merchantApply.getPhone())) > 0) { + return fail("该手机号码已存在"); + } + if (merchantApplyService.save(merchantApply)) { + return success("添加成功"); + } + return fail("添加失败"); } - return fail("删除失败"); - } - @ApiOperation("批量添加商户入驻申请") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (merchantApplyService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } + @ApiOperation("修改商户入驻申请") + @PutMapping() + public ApiResult update(@RequestBody MerchantApply merchantApply, HttpServletRequest request) { + if (merchantApply.getStatus().equals(1)) { + // TODO 审核通过则创建商户 + final Merchant one = merchantService.getOne(new LambdaQueryWrapper().eq(Merchant::getPhone, merchantApply.getPhone()).last("limit 1")); + final MerchantAccount merchantAccount = new MerchantAccount(); + BeanUtils.copyProperties(merchantApply, merchantAccount); + final User user = new User(); + final User loingUser = new User(); + loingUser.setUserId(merchantAccount.getUserId()); - @ApiOperation("批量修改商户入驻申请") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(merchantApplyService, "apply_id")) { - return success("修改成功"); - } - return fail("修改失败"); - } + Integer gradeId = 30; + if (ObjectUtil.isNotEmpty(one)) { + BeanUtils.copyProperties(merchantApply, one); + one.setStatus(0); + merchantService.updateById(one); + user.setMerchantId(one.getMerchantId()); + user.setMerchantName(one.getMerchantName()); + gradeId = switch (one.getShopType()) { + case "会员店" -> 31; + case "实体连锁店" -> 32; + case "经销商" -> 33; + case "供应商" -> 34; + default -> gradeId; + }; + } else { + final Merchant merchant = new Merchant(); + BeanUtils.copyProperties(merchantApply, merchant); + merchant.setStatus(0); + merchantService.save(merchant); + user.setMerchantId(merchant.getMerchantId()); + user.setMerchantName(merchant.getMerchantName()); + gradeId = switch (merchant.getShopType()) { + case "会员店" -> 31; + case "实体连锁店" -> 32; + case "经销商" -> 33; + case "供应商" -> 34; + default -> gradeId; + }; + } + loingUser.setGradeId(gradeId); - @ApiOperation("批量删除商户入驻申请") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (merchantApplyService.removeByIds(ids)) { - return success("删除成功"); + // TODO 创建商户账号 + requestUtil.setAccessToken(JwtUtil.getAccessToken(request)); + requestUtil.setTenantId(getTenantId().toString()); + merchantAccount.setRealName(merchantApply.getRealName()); + requestUtil.saveUserByPhone(merchantAccount); + requestUtil.updateUser(loingUser); + // TODO 更新用户表的商户ID + requestUtil.updateUserMerchantId(user); + + } + // TODO 驳回 + + if (merchantApplyService.updateById(merchantApply)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除商户入驻申请") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (merchantApplyService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加商户入驻申请") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (merchantApplyService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改商户入驻申请") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(merchantApplyService, "apply_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除商户入驻申请") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (merchantApplyService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); } - return fail("删除失败"); - } } diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java index 85e70f5..b0e4902 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java @@ -2,25 +2,22 @@ package com.gxwebsoft.shop.controller; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.gxwebsoft.cms.entity.Ad; import com.gxwebsoft.common.core.exception.BusinessException; import com.gxwebsoft.common.core.security.JwtUtil; import com.gxwebsoft.common.core.utils.CommonUtil; import com.gxwebsoft.common.core.utils.RequestUtil; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.system.entity.Role; -import com.gxwebsoft.shop.entity.Cart; -import com.gxwebsoft.shop.entity.OrderGoods; -import com.gxwebsoft.shop.entity.OrderInfo; -import com.gxwebsoft.shop.service.CartService; -import com.gxwebsoft.shop.service.OrderGoodsService; -import com.gxwebsoft.shop.service.OrderInfoService; -import com.gxwebsoft.shop.service.OrderService; -import com.gxwebsoft.shop.entity.Order; +import com.gxwebsoft.shop.entity.*; +import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.param.OrderParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; @@ -28,15 +25,21 @@ import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.system.entity.User; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; +import static com.gxwebsoft.shop.consts.OrderPayType.*; + /** * 订单控制器 * @@ -47,310 +50,392 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/api/shop/order") public class OrderController extends BaseController { - @Resource - private OrderService orderService; - @Resource - private OrderInfoService orderInfoService; - @Resource - private OrderGoodsService orderGoodsService; - @Resource - private CartService cartService; - @Resource - private RequestUtil requestUtil; + @Resource + private OrderService orderService; + @Resource + private OrderInfoService orderInfoService; + @Resource + private OrderGoodsService orderGoodsService; + @Resource + private CartService cartService; + @Resource + private RequestUtil requestUtil; + @Resource + private ExpressService expressService; + @Resource + private OrderDeliveryService orderDeliveryService; + @Autowired + private WeChatController weChatController; + @Autowired + private MerchantService merchantService; - @ApiOperation("分页查询订单") - @GetMapping("/page") - public ApiResult> page(OrderParam param) { - // 使用关联查询 - return success(orderService.pageRel(param)); - } + @Value("${config.upload-path}") + private String uploadPath; - @ApiOperation("查询全部订单") - @GetMapping() - public ApiResult> list(OrderParam param) { - // 使用关联查询 - return success(orderService.listRel(param)); - } - - @PreAuthorize("hasAuthority('shop:order:list')") - @ApiOperation("根据id查询订单") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(orderService.getByIdRel(id)); - } - - @ApiOperation("根据orderNo查询订单") - @GetMapping("/getByOrderNo/{orderNo}") - public ApiResult getByOrderNo(@PathVariable("orderNo") String orderNo){ - final User loginUser = getLoginUser(); - if(loginUser == null){ - return fail("请先登录",null); + @ApiOperation("分页查询订单") + @GetMapping("/page") + public ApiResult> page(OrderParam param) { + // 使用关联查询 + if (getLoginUser() != null) { + param.setLoginUser(getLoginUser()); + } + return success(orderService.pageRel(param)); } - final Order order = orderService.getByOutTradeNo(orderNo); - if(order != null){ - final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, order.getOrderId())); - order.setOrderInfo(orderInfoList); - } - return success(order); - } - - - @PreAuthorize("hasAuthority('shop:order:verification')") - @ApiOperation("根据orderNo核销订单") - @GetMapping("/verification/{orderNo}") - public ApiResult verification(@PathVariable("orderNo") String orderNo){ - final User loginUser = getLoginUser(); - if(loginUser == null){ - return fail("请先登录",null); + @ApiOperation("查询全部订单") + @GetMapping() + public ApiResult> list(OrderParam param) { + // 使用关联查询 + return success(orderService.listRel(param)); } - final Set collect = loginUser.getRoles().stream().map(Role::getRoleCode).collect(Collectors.toSet()); - final boolean merchant = Arrays.asList(collect).contains("merchant"); - final boolean merchantClerk = Arrays.asList(collect).contains("merchantClerk"); - - if(merchant || merchantClerk){ - System.out.println("merchant = " + merchant); - System.out.println("merchantClerk = " + merchantClerk); - final Order order = orderService.getByOutTradeNo(orderNo); - if(order != null){ - final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, order.getOrderId())); - order.setOrderInfo(orderInfoList); - } - return success(order); - } - return fail("核销失败",null); - } - - @ApiOperation("下单") - @PostMapping() - public ApiResult save(@RequestBody Order order, HttpServletRequest request) { - String access_token = JwtUtil.getAccessToken(request); - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser == null) { - return fail("请先登录"); - } - // 微信openid(必填) - if (StrUtil.isBlank(loginUser.getOpenid())) { - return fail("微信openid(必填)"); - } - // 商品描述(必填) - if (StrUtil.isBlank(order.getComments())) { - return fail("商品描述(必填)"); - } - // 判断场地是否被抢占 - if (order.getType().equals(1)) { - if (ObjectUtil.isNotEmpty(order.getOrderInfo())) { - order.getOrderInfo().forEach(d -> { - if (orderInfoService.count(new LambdaUpdateWrapper() - .eq(OrderInfo::getPayStatus,1) - .eq(OrderInfo::getOrderCode,d.getOrderCode())) > 0) { - order.setScene(1234); + @PreAuthorize("hasAuthority('shop:order:list')") + @ApiOperation("根据id查询订单") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + Order order = orderService.getByIdRel(id); + if (getLoginUser() != null) { + for (OrderGoods orderGoods : order.getGoodsList()) { + Goods goods = orderGoods.getGoods(); + if (getLoginUser().getGradeId().equals(33)) { + if (goods.getDealerGift()) goods.setShowGift(true); + } + // 会员店 + if (getLoginUser().getGradeId().equals(31)) { + if (goods.getPriceGift()) goods.setShowGift(true); + } } - }); - if(order.getScene() != null && order.getScene().equals(1234)){ - return fail("场地不存在"); - } - } - } - // 微信支付(商品金额不能为0) - if (order.getPayType().equals(1)) { - if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { - return fail("商品金额不能为0"); - } + } + if (order.getType().equals(0)) { + if (order.getDeliveryType().equals(0)) { + OrderDelivery orderDelivery = orderDeliveryService.getByOrderId(order.getOrderId()); + if (orderDelivery != null) { + orderDelivery.setExpress(expressService.getById(orderDelivery.getExpressId())); + order.setOrderDelivery(orderDelivery); + } + } else if (order.getDeliveryType().equals(1) && order.getSelfTakeMerchantId() != null) { + Merchant merchant = merchantService.getById(order.getSelfTakeMerchantId()); + order.setMerchant(merchant); + } + }else if (order.getType().equals(1)) { + Merchant merchant = merchantService.getById(order.getMerchantId()); + order.setMerchant(merchant); + } + return success(order); } - // 已下过订单 - if(order.getOrderId() != null){ - Order order1 = orderService.getByIdRel(order.getOrderId()); - order1.setPayType(order.getPayType()); - order1.setOpenid(loginUser.getOpenid()); - order1.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId())); - order1.setAccessToken(access_token); - order1.setLoginUser(loginUser); - // 调起支付 - return onPay(order1); - } - - // 创建订单 - long timeMillis = System.currentTimeMillis(); - long orderNo = IdUtil.getSnowflakeNextId(); - order.setOrderNo(Long.toString(orderNo)); - order.setUserId(loginUser.getUserId()); - order.setOpenid(loginUser.getOpenid()); - order.setRealName(loginUser.getRealName()); - order.setPhone(loginUser.getPhone()); - order.setUserId(loginUser.getUserId()); - order.setLoginUser(loginUser); - order.setAccessToken(access_token); - order.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.MINUTE, 1)); - if (order.getOrderInfo() != null) { - order.setTotalNum(order.getOrderInfo().size()); - } - if (order.getGoodsList() != null) { - order.setTotalNum(order.getGoodsList().size()); - } - - if (orderService.save(order)) { - // 商城订单 - if (ObjectUtil.isNotEmpty(order.getGoodsList())) { - order.getGoodsList().forEach(d -> { - d.setOrderId(order.getOrderId()); - d.setTimeFlag(timeMillis); - d.setVersion(10); - d.setDateTime(DateUtil.date()); - d.setUserId(getLoginUser().getUserId()); - d.setExpirationTime(order.getExpirationTime()); - }); - orderGoodsService.saveBatch(order.getGoodsList()); - } - // 预定订单 - if (ObjectUtil.isNotEmpty(order.getOrderInfo())) { - if (ObjectUtil.isNotEmpty(order.getOrderInfo())) { - order.getOrderInfo().forEach(d -> { - d.setOrderId(order.getOrderId()); - d.setTimeFlag(timeMillis); - d.setVersion(10); - d.setUserId(getLoginUser().getUserId()); - d.setDateTime(d.getDateTime()); - d.setExpirationTime(order.getExpirationTime()); - d.setTenantId(order.getTenantId()); - }); - orderInfoService.saveBatch(order.getOrderInfo()); + @ApiOperation("根据orderNo查询订单") + @GetMapping("/getByOrderNo/{orderNo}") + public ApiResult getByOrderNo(@PathVariable("orderNo") String orderNo) { + final User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录", null); } - } - // 会员卡订单 -// if (order.getType().equals(2)) { -// // 会员卡信息 -// final Card card = cardService.getByIdRel(Integer.valueOf(order.getCardId())); -// final UserCard userCard = new UserCard(); -// userCard.setPhone(loginUser.getPhone()); -// userCard.setSid(card.getMerchantIds()); -// userCard.setCardNum(CommonUtil.createCardNo()); -// userCard.setName(card.getCardName()); -// userCard.setUsername(loginUser.getRealName()); -// userCard.setPhone(loginUser.getPhone()); -// userCard.setPrice(card.getPrice()); -// userCard.setComments(card.getCardDesc()); -// userCard.setInfo(card.getComments()); -// userCard.setUid(loginUser.getUserId()); -// userCard.setRemainingMoney(card.getPrice()); -// userCard.setVid(0); -// userCard.setAid(0); -// userCard.setCode(CommonUtil.randomUUID8()); -// userCard.setDiscount(card.getDiscount()); -// userCard.setNumber(1); -// userCard.setNum(card.getNumber()); -// userCard.setMonth(card.getMonth()); -// userCard.setPayType(1); -// userCard.setType(card.getType()); -// userCard.setTenantId(card.getTenantId()); -// final long epochMilli = DateUtil.toInstant(DateUtil.offset(DateUtil.date(), DateField.MONTH, card.getMonth())).toEpochMilli(); -// userCard.setExpireTime(epochMilli/1000); -// userCardService.save(userCard); -// order.setCardId(userCard.getId()); -// } - // 调起支付 - return onPay(order); - } - return fail("下单失败"); - } - - private ApiResult onPay(Order order) { - // TODO 余额支付 - if (order.getPayType().equals(0)) { - order.setAccessToken(order.getAccessToken()); - final User loginUser = order.getLoginUser(); - if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { - throw new BusinessException("余额不足"); - } - // 清空购物车 - final Set cartIds = order.getGoodsList().stream().map(OrderGoods::getGoodsId).collect(Collectors.toSet()); - cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId,order.getUserId()).in(Cart::getGoodsId,cartIds)); - // 外卖订单 - if(!order.getMerchantId().equals(0)){ - cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId,order.getUserId()).eq(Cart::getType,1)); - } - return success("下单成功", requestUtil.balancePay(order)); + final Order order = orderService.getByOutTradeNo(orderNo); + if (order != null) { + final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, order.getOrderId())); + order.setOrderInfo(orderInfoList); + } + return success(order); } - // TODO 微信统一下单接口 - if (order.getPayType().equals(1)) { - // 清空购物车 - final Set cartIds = order.getGoodsList().stream().map(OrderGoods::getGoodsId).collect(Collectors.toSet()); - cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId,order.getUserId()).in(Cart::getGoodsId,cartIds)); - // 外卖订单 - if(!order.getMerchantId().equals(0)){ - cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId,order.getUserId()).eq(Cart::getType,1)); - } - return success("下单成功", orderService.createWxOrder(order)); + + @PreAuthorize("hasAuthority('shop:order:verification')") + @ApiOperation("根据orderNo核销订单") + @GetMapping("/verification/{orderNo}") + public ApiResult verification(@PathVariable("orderNo") String orderNo, HttpServletRequest request) { + final User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录", null); + } + + final Set collect = loginUser.getRoles().stream().map(Role::getRoleCode).collect(Collectors.toSet()); + final boolean merchant = Arrays.asList(collect).contains("merchant"); + final boolean merchantClerk = Arrays.asList(collect).contains("merchantClerk"); + + if (merchant || merchantClerk) { + System.out.println("merchant = " + merchant); + System.out.println("merchantClerk = " + merchantClerk); + final Order order = orderService.getByOutTradeNo(orderNo); + if (order != null) { + final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, order.getOrderId())); + order.setOrderInfo(orderInfoList); + } + return success(order); + } + return fail("核销失败", null); } -// // TODO 微信Native支付 -// if(order.getPayType().equals(102)){ -// order.setAccessToken(access_token); -// order.setLoginUser(loginUser); -// return success("下单成功", orderService.payByWxNative(order)); -// } - - // TODO 会员卡支付 -// if(order.getPayType().equals(2)){ -// order.setAccessToken(order.getAccessToken()); -// System.out.println("getAccessToken = " + order.getAccessToken()); -// return success("下单成功", orderService.payByUserCard(order)); -// } - return fail("支付失败"); - } - - @ApiOperation("修改订单") - @PutMapping() - public ApiResult update(@RequestBody Order order) { - if(order.getOrderStatus().equals(2)){ - order.setExpirationTime(DateUtil.date()); - orderInfoService.update(new LambdaUpdateWrapper().eq(OrderInfo::getOrderId,order.getOrderId()).set(OrderInfo::getExpirationTime,DateUtil.date())); + @ApiOperation("代付") + @PostMapping("/friend-pay") + public ApiResult friendPay(@RequestBody Order orderTmp, HttpServletRequest request) throws IOException, WxErrorException { + Order order = orderService.getById(orderTmp.getOrderId()); + String access_token = JwtUtil.getAccessToken(request); + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录"); + } + // 微信openid(必填) + if (StrUtil.isBlank(loginUser.getOpenid())) { + return fail("微信openid(必填)"); + } + // 微信支付(商品金额不能为0) + if (order.getPayType().equals(PAY_TYPE_WECHAT)) { + if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { + return fail("商品金额不能为0"); + } + } + order.setFriendPayType(orderTmp.getFriendPayType()); + order.setOpenid(loginUser.getOpenid()); + order.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId())); + order.setAccessToken(access_token); + order.setPayUserId(loginUser.getUserId()); + orderService.updateById(order); + order.setLoginUser(loginUser); + // 调起支付 + order.setNotClearData(true); + return onPay(request, order); } - if (orderService.updateById(order)) { - return success("操作成功"); - } - return fail("操作失败"); - } - @ApiOperation("删除订单") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (orderService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } + @ApiOperation("下单") + @PostMapping() + public ApiResult save(@RequestBody Order order, HttpServletRequest request) throws IOException, WxErrorException { + String access_token = JwtUtil.getAccessToken(request); + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录"); + } + // 微信openid(必填) + if (StrUtil.isBlank(loginUser.getOpenid())) { + return fail("微信openid(必填)"); + } + // 商品描述(必填) + if (StrUtil.isBlank(order.getComments())) { + return fail("商品描述(必填)"); + } + // 微信支付(商品金额不能为0) + if (order.getPayType().equals(PAY_TYPE_WECHAT)) { + if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { + return fail("商品金额不能为0"); + } + } - @ApiOperation("批量添加订单") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (orderService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } + // 已下过订单 + if (order.getOrderId() != null) { + Order order1 = orderService.getByIdRel(order.getOrderId()); + order1.setPayType(order.getPayType()); + order1.setOpenid(loginUser.getOpenid()); + order1.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId())); + order1.setAccessToken(access_token); + order1.setLoginUser(loginUser); + order1.setPayUserId(loginUser.getUserId()); + // 调起支付 + return onPay(request, order1); + } - @ApiOperation("批量修改订单") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(orderService, "order_id")) { - return success("修改成功"); - } - return fail("修改失败"); - } + // 创建订单 + long timeMillis = System.currentTimeMillis(); + long orderNo = IdUtil.getSnowflakeNextId(); + String name = loginUser.getRealName(); + String phone = loginUser.getPhone(); + String address = ""; + if (order.getRealName() != null) { + name = order.getRealName(); + } + if (order.getPhone() != null) { + phone = order.getPhone(); + } + if (order.getAddress() != null) { + address = order.getAddress(); + } + order.setOrderNo(Long.toString(orderNo)); + order.setUserId(loginUser.getUserId()); + order.setOpenid(loginUser.getOpenid()); + order.setRealName(name); + order.setPhone(phone); + order.setAddress(address); + order.setUserId(loginUser.getUserId()); + order.setLoginUser(loginUser); + order.setPayUserId(loginUser.getUserId()); + order.setAccessToken(access_token); + order.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.MINUTE, 1)); + if (order.getOrderInfo() != null) { + order.setTotalNum(order.getOrderInfo().size()); + } + if (order.getGoodsList() != null) { + order.setTotalNum(order.getGoodsList().size()); + } + if (order.getDeliveryType().equals(1)) { + order.setSelfTakeCode(RandomUtil.randomString(4)); + } - @ApiOperation("批量删除订单") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (orderService.removeByIds(ids)) { - return success("删除成功"); + if (orderService.save(order)) { + // 商城订单 + if (ObjectUtil.isNotEmpty(order.getGoodsList())) { + order.getGoodsList().forEach(d -> { + d.setOrderId(order.getOrderId()); + d.setTimeFlag(timeMillis); + d.setVersion(10); + d.setDateTime(DateUtil.date()); + d.setUserId(getLoginUser().getUserId()); + d.setExpirationTime(order.getExpirationTime()); + }); + orderGoodsService.saveBatch(order.getGoodsList()); + } + // 预定订单 + if (ObjectUtil.isNotEmpty(order.getOrderInfo())) { + if (ObjectUtil.isNotEmpty(order.getOrderInfo())) { + order.getOrderInfo().forEach(d -> { + d.setOrderId(order.getOrderId()); + d.setTimeFlag(timeMillis); + d.setVersion(10); + d.setUserId(getLoginUser().getUserId()); + d.setDateTime(d.getDateTime()); + d.setExpirationTime(order.getExpirationTime()); + d.setTenantId(order.getTenantId()); + }); + orderInfoService.saveBatch(order.getOrderInfo()); + } + } + // 调起支付 + return onPay(request, order); + } + return fail("下单失败"); + } + + private ApiResult onPay(HttpServletRequest request, Order order) throws IOException, WxErrorException { + // 余额支付 + if (order.getPayType().equals(PAY_TYPE_BALANCE)) { + order.setAccessToken(order.getAccessToken()); + final User loginUser = order.getLoginUser(); + if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { + throw new BusinessException("余额不足"); + } + if (order.getNotClearData() == null) { + // 清空购物车 + final Set cartIds = order.getGoodsList().stream().map(OrderGoods::getGoodsId).collect(Collectors.toSet()); + cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId, order.getUserId()).in(Cart::getGoodsId, cartIds)); + // 外卖订单 + if (!order.getMerchantId().equals(0)) { + cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId, order.getUserId()).eq(Cart::getType, 1)); + } + } + return success("下单成功", requestUtil.balancePay(order)); + } + + // 微信统一下单接口 + if (order.getPayType().equals(PAY_TYPE_WECHAT)) { + // 清空购物车 + if (order.getNotClearData() == null) { + final Set cartIds = order.getGoodsList().stream().map(OrderGoods::getGoodsId).collect(Collectors.toSet()); + cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId, order.getUserId()).in(Cart::getGoodsId, cartIds)); + // 外卖订单 + if (!order.getMerchantId().equals(0)) { + cartService.remove(new LambdaQueryWrapper().eq(Cart::getUserId, order.getUserId()).eq(Cart::getType, 1)); + } + } + return success("下单成功", orderService.createWxOrder(order)); + } + + // 代付 + if (order.getPayType().equals(PAY_TYPE_FRIEND)) { + if (order.getFriendPayType() != null) { + if (order.getFriendPayType().equals(PAY_TYPE_BALANCE)) { + order.setAccessToken(order.getAccessToken()); + final User loginUser = order.getLoginUser(); + if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { + throw new BusinessException("余额不足"); + } + return success("下单成功", requestUtil.balancePay(order)); + } + if (order.getFriendPayType().equals(PAY_TYPE_WECHAT)) { + return success("下单成功", orderService.createWxOrder(order)); + } + } + String filepath = uploadPath + "qrcode/" + getTenantId(); + if (!FileUtil.exist(filepath)) FileUtil.mkdir(filepath); + String filename = "/friendPay_" + order.getOrderId() + ".png"; + weChatController.makeQr(request, filepath + filename, "orderId=" + order.getOrderId(), "package/order/friendPay"); + return success("下单成功", "file/qrcode/" + getTenantId() + filename); + } + return fail("支付失败"); + } + + @ApiOperation("自提") + @PostMapping("/self-take") + public ApiResult selfTake(@RequestBody Order order, HttpServletRequest request) { + String access_token = JwtUtil.getAccessToken(request); + Order order1 = orderService.getById(order.getOrderId()); +// if (!order1.getSelfTakeCode().equals(order.getSelfTakeCode())) return fail("自提码不正确"); + if (order1.getOrderStatus().equals(1)) return fail("订单已完成"); + order1.setOrderStatus(1); + orderService.updateById(order1); + orderService.settle(access_token, getTenantId().toString(), order1); + return success("提货成功"); + } + + @ApiOperation("外卖确认收货") + @PostMapping("/out-take-confirm") + public ApiResult outTakeConfirm(@RequestBody Order order, HttpServletRequest request) { + String access_token = JwtUtil.getAccessToken(request); + Order order1 = orderService.getById(order.getOrderId()); + if (order1.getOrderStatus().equals(1)) return fail("订单已完成"); + order1.setOrderStatus(1); + order1.setHasTakeGift(order.getHasTakeGift()); + orderService.updateById(order1); + orderService.settle(access_token, getTenantId().toString(), order1); + return success("外卖确认收货"); + } + + @ApiOperation("修改订单") + @PutMapping() + public ApiResult update(@RequestBody Order order) { + if (order.getOrderStatus().equals(2)) { + order.setExpirationTime(DateUtil.date()); + orderInfoService.update(new LambdaUpdateWrapper().eq(OrderInfo::getOrderId, order.getOrderId()).set(OrderInfo::getExpirationTime, DateUtil.date())); + } + if (orderService.updateById(order)) { + return success("操作成功"); + } + return fail("操作失败"); + } + + @ApiOperation("删除订单") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (orderService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加订单") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (orderService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改订单") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(orderService, "order_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除订单") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (orderService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); } - return fail("删除失败"); - } } diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderDeliveryController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderDeliveryController.java index b5be2e2..853a6b4 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/OrderDeliveryController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/OrderDeliveryController.java @@ -1,10 +1,14 @@ package com.gxwebsoft.shop.controller; import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import com.google.gson.JsonObject; +import com.gxwebsoft.common.core.security.JwtUtil; +import com.gxwebsoft.common.core.utils.JSONUtil; import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.shop.entity.Order; -import com.gxwebsoft.shop.service.OrderDeliveryService; -import com.gxwebsoft.shop.entity.OrderDelivery; +import com.gxwebsoft.shop.entity.*; +import com.gxwebsoft.shop.param.GoodsStockInMerchantParam; +import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.param.OrderDeliveryParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; @@ -12,7 +16,10 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.system.entity.User; -import com.gxwebsoft.shop.service.OrderService; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.BOrderReq; +import com.kuaidi100.sdk.response.BOrderResp; +import com.kuaidi100.sdk.response.SubscribeResp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -20,7 +27,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 发货单控制器 @@ -36,6 +47,16 @@ public class OrderDeliveryController extends BaseController { private OrderDeliveryService orderDeliveryService; @Resource private OrderService orderService; + @Resource + private KuaiDi100 kuaiDi100; + @Resource + private ExpressService expressService; + @Resource + private OrderGoodsService orderGoodsService; + @Resource + private GoodsStockInMerchantService goodsStockInMerchantService; + @Resource + private MerchantService merchantService; @ApiOperation("分页查询发货单") @GetMapping("/page") @@ -44,6 +65,18 @@ public class OrderDeliveryController extends BaseController { return success(orderDeliveryService.pageRel(param)); } + @ApiOperation("发货回调") + @PostMapping("/notify") + @GetMapping("/notify") + public SubscribeResp notify(@RequestBody Map data) { + System.out.println("快递100回调:" + data); + SubscribeResp subscribeResp = new SubscribeResp(); + subscribeResp.setResult(Boolean.TRUE); + subscribeResp.setReturnCode("200"); + subscribeResp.setMessage("成功"); + return subscribeResp; + } + @ApiOperation("查询全部发货单") @GetMapping() public ApiResult> list(OrderDeliveryParam param) { @@ -63,13 +96,56 @@ public class OrderDeliveryController extends BaseController { @PreAuthorize("hasAuthority('shop:orderDelivery:list')") @ApiOperation("添加发货单") @PostMapping() - public ApiResult save(@RequestBody OrderDelivery orderDelivery) { - if (orderDeliveryService.save(orderDelivery)) { - final Order order = orderService.getById(orderDelivery.getOrderId()); - order.setDeliveryStatus(20); - order.setDeliveryTime(DateUtil.date()); - orderService.updateById(order); - return success("操作成功"); + public ApiResult save(@RequestBody OrderDelivery orderDelivery, HttpServletRequest request) throws Exception { + String access_token = JwtUtil.getAccessToken(request); + String tenantId = getTenantId().toString(); + Order order = orderService.getById(orderDelivery.getOrderId()); + Merchant merchant = null; + // 根据最近的库存分配发货 + List orderGoodsList = orderGoodsService.listByOrderId(orderDelivery.getOrderId()); + List goodsStockInMerchantList = + goodsStockInMerchantService.canExpressList(orderGoodsList.get(0).getGoodsId(), orderGoodsList.get(0).getTotalNum(), order.getAddressLat(), order.getAddressLng()); + if (goodsStockInMerchantList.isEmpty()) return fail("暂无可发货店铺"); + for (OrderGoods orderGoods : orderGoodsList) { + if (!goodsStockInMerchantList.isEmpty()) { + GoodsStockInMerchant usable = goodsStockInMerchantList.get(0); + GoodsStockInMerchant goodsStockInMerchant = goodsStockInMerchantService.check(usable.getMerchantId(), orderGoods.getGoodsId(), orderGoods.getSkuId()); + if (goodsStockInMerchant == null || goodsStockInMerchant.getStock() < orderGoods.getTotalNum()) + return fail("库存不足"); + } + } + merchant = merchantService.getById(goodsStockInMerchantList.get(0).getMerchantId()); + if (merchant != null) { + // 商家发货 + Express express = expressService.getByIdRel(orderDelivery.getExpressId()); + BOrderReq bOrderReq = new BOrderReq(); + bOrderReq.setKuaidicom(express.getKuaidi100Code()); + bOrderReq.setSendManName(merchant.getMerchantName()); + bOrderReq.setSendManMobile(merchant.getPhone()); + bOrderReq.setSendManPrintAddr(merchant.getProvince() + merchant.getCity() + merchant.getRegion() + merchant.getAddress()); + bOrderReq.setRecManName(order.getRealName()); + bOrderReq.setRecManMobile(order.getPhone()); + bOrderReq.setRecManPrintAddr(order.getAddress()); + bOrderReq.setCallBackUrl("https://modules.gxwebsoft.com/api/shop/order-delivery/notify"); + HttpResult res = kuaiDi100.border(bOrderReq); +// System.out.println("res.getBody():" + res.getBody()); + if (res.getStatus() != 200) return fail("快递100接口异常"); + KuaiDi100Resp kuaiDi100Resp = JSONUtil.parseObject(res.getBody(), KuaiDi100Resp.class); + if (kuaiDi100Resp == null) return fail("快递100接口异常"); + if (!kuaiDi100Resp.getResult()) return fail(kuaiDi100Resp.getMessage()); + Map bOrderData = (Map) kuaiDi100Resp.getData(); +// System.out.println("kuaidinum:" + bOrderData.get("kuaidinum")); + orderDelivery.setExpressNo((String) bOrderData.get("kuaidinum")); + if (orderDeliveryService.save(orderDelivery)) { + order.setExpressMerchantId(merchant.getMerchantId()); + order.setExpressMerchantName(merchant.getMerchantName()); + order.setDeliveryStatus(20); + order.setDeliveryTime(DateUtil.date()); + orderService.updateById(order); + // 结算 + orderService.settle(access_token, tenantId, order); + return success("操作成功"); + } } return fail("操作失败"); } @@ -83,6 +159,7 @@ public class OrderDeliveryController extends BaseController { } return fail("修改失败"); } + @PreAuthorize("hasAuthority('shop:orderDelivery:list')") @ApiOperation("删除发货单") @DeleteMapping("/{id}") @@ -112,6 +189,7 @@ public class OrderDeliveryController extends BaseController { } return fail("修改失败"); } + @PreAuthorize("hasAuthority('shop:orderDelivery:list')") @ApiOperation("批量删除发货单") @DeleteMapping("/batch") diff --git a/src/main/java/com/gxwebsoft/shop/controller/SplashController.java b/src/main/java/com/gxwebsoft/shop/controller/SplashController.java new file mode 100644 index 0000000..675bf3c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/SplashController.java @@ -0,0 +1,115 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.service.SplashService; +import com.gxwebsoft.shop.entity.Splash; +import com.gxwebsoft.shop.param.SplashParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 开屏广告控制器 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Api(tags = "开屏广告管理") +@RestController +@RequestMapping("/api/shop/splash") +public class SplashController extends BaseController { + @Resource + private SplashService splashService; + + @ApiOperation("分页查询开屏广告") + @GetMapping("/page") + public ApiResult> page(SplashParam param) { + // 使用关联查询 + return success(splashService.pageRel(param)); + } + + @ApiOperation("查询全部开屏广告") + @GetMapping() + public ApiResult> list(SplashParam param) { + // 使用关联查询 + return success(splashService.listRel(param)); + } + + @PreAuthorize("hasAuthority('shop:splash:list')") + @ApiOperation("根据id查询开屏广告") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(splashService.getByIdRel(id)); + } + + @ApiOperation("添加开屏广告") + @PostMapping() + public ApiResult save(@RequestBody Splash splash) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + splash.setUserId(loginUser.getUserId()); + } + if (splashService.save(splash)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改开屏广告") + @PutMapping() + public ApiResult update(@RequestBody Splash splash) { + if (splashService.updateById(splash)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除开屏广告") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (splashService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加开屏广告") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (splashService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改开屏广告") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(splashService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除开屏广告") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (splashService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/SwiperController.java b/src/main/java/com/gxwebsoft/shop/controller/SwiperController.java new file mode 100644 index 0000000..aa422a5 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/SwiperController.java @@ -0,0 +1,115 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.service.SwiperService; +import com.gxwebsoft.shop.entity.Swiper; +import com.gxwebsoft.shop.param.SwiperParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 轮播图控制器 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Api(tags = "轮播图管理") +@RestController +@RequestMapping("/api/shop/swiper") +public class SwiperController extends BaseController { + @Resource + private SwiperService swiperService; + + @ApiOperation("分页查询轮播图") + @GetMapping("/page") + public ApiResult> page(SwiperParam param) { + // 使用关联查询 + return success(swiperService.pageRel(param)); + } + + @ApiOperation("查询全部轮播图") + @GetMapping() + public ApiResult> list(SwiperParam param) { + // 使用关联查询 + return success(swiperService.listRel(param)); + } + + @PreAuthorize("hasAuthority('shop:swiper:list')") + @ApiOperation("根据id查询轮播图") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(swiperService.getByIdRel(id)); + } + + @ApiOperation("添加轮播图") + @PostMapping() + public ApiResult save(@RequestBody Swiper swiper) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + swiper.setUserId(loginUser.getUserId()); + } + if (swiperService.save(swiper)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改轮播图") + @PutMapping() + public ApiResult update(@RequestBody Swiper swiper) { + if (swiperService.updateById(swiper)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除轮播图") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (swiperService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加轮播图") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (swiperService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改轮播图") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(swiperService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除轮播图") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (swiperService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/UserAddressController.java b/src/main/java/com/gxwebsoft/shop/controller/UserAddressController.java index 6b1e077..66c9907 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/UserAddressController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/UserAddressController.java @@ -60,7 +60,10 @@ public class UserAddressController extends BaseController { // 记录当前登录用户id User loginUser = getLoginUser(); if (loginUser != null) { - userAddress.setUserId(loginUser.getUserId()); + userAddress.setUserId(loginUser.getUserId()); + } + if (userAddress.getIsDefault() != null && userAddress.getIsDefault()) { + userAddressService.clearDefault(userAddress.getUserId()); } if (userAddressService.save(userAddress)) { return success("添加成功"); @@ -72,7 +75,7 @@ public class UserAddressController extends BaseController { @PutMapping() public ApiResult update(@RequestBody UserAddress userAddress) { if (userAddress.getIsDefault() != null && userAddress.getIsDefault().equals(true)) { - final boolean update = userAddressService.update(new LambdaUpdateWrapper().eq(UserAddress::getUserId, getLoginUserId()).set(UserAddress::getIsDefault, 0)); + userAddressService.clearDefault(userAddress.getUserId()); } if (userAddressService.updateById(userAddress)) { return success("修改成功"); diff --git a/src/main/java/com/gxwebsoft/shop/controller/UserCollectionController.java b/src/main/java/com/gxwebsoft/shop/controller/UserCollectionController.java index 1218ec9..aefa4da 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/UserCollectionController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/UserCollectionController.java @@ -22,7 +22,7 @@ import java.util.List; * 我的收藏控制器 * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ @Api(tags = "我的收藏管理") @RestController @@ -31,6 +31,13 @@ public class UserCollectionController extends BaseController { @Resource private UserCollectionService userCollectionService; + @ApiOperation("检查收藏") + @PostMapping("/has-collect") + public ApiResult check(@RequestBody UserCollection userCollection) { + UserCollection check = userCollectionService.check(getLoginUserId(), userCollection.getType(), userCollection.getTid()); + return success(check != null); + } + @ApiOperation("分页查询我的收藏") @GetMapping("/page") public ApiResult> page(UserCollectionParam param) { @@ -40,8 +47,10 @@ public class UserCollectionController extends BaseController { @ApiOperation("查询全部我的收藏") @GetMapping() - public ApiResult> list(UserCollectionParam param) { + public ApiResult list(UserCollectionParam param) { + if (getLoginUser() == null) return fail("请先登录"); // 使用关联查询 + param.setUserId(getLoginUserId()); return success(userCollectionService.listRel(param)); } @@ -57,10 +66,15 @@ public class UserCollectionController extends BaseController { @PostMapping() public ApiResult save(@RequestBody UserCollection userCollection) { // 记录当前登录用户id - // User loginUser = getLoginUser(); - // if (loginUser != null) { - // userCollection.setUserId(loginUser.getUserId()); - // } + User loginUser = getLoginUser(); + if (loginUser != null) { + userCollection.setUserId(loginUser.getUserId()); + } + UserCollection check = userCollectionService.check(getLoginUserId(), userCollection.getType(), userCollection.getTid()); + if (check != null) { + userCollectionService.removeById(check.getId()); + return success("取消成功"); + } if (userCollectionService.save(userCollection)) { return success("添加成功"); } diff --git a/src/main/java/com/gxwebsoft/shop/controller/WeChatController.java b/src/main/java/com/gxwebsoft/shop/controller/WeChatController.java new file mode 100644 index 0000000..65e2b0c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/WeChatController.java @@ -0,0 +1,97 @@ +package com.gxwebsoft.shop.controller; + +import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaQrcodeServiceImpl; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import cn.hutool.core.io.FileUtil; +import cn.hutool.http.HttpRequest; +import com.gxwebsoft.common.core.security.JwtUtil; +import com.gxwebsoft.common.core.utils.RequestUtil; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.config.WxMaProperties; +import com.gxwebsoft.shop.entity.Order; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.error.WxRuntimeException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Api(tags = "微信相关") +@RestController +@RequestMapping("/api/wechat") +public class WeChatController extends BaseController { + @Resource + private WxMaProperties wxMaProperties; + + @Value("${config.upload-path}") + private String uploadPath; + + @ApiOperation("好友代付二维码") + @PostMapping("/friend-pay-qr") + public ApiResult makeFriendPayQr(@RequestBody Order order, HttpServletRequest request){ + String filepath = uploadPath + "qrcode/" + getTenantId(); + if (!FileUtil.exist(filepath)) FileUtil.mkdir(filepath); + String filename = "/friendPay_" + order.getOrderId() + ".png"; + if (FileUtil.exist(filepath + "/" + filename)) return success("生成成功", "file/qrcode/" + getTenantId() + filename); + try { + makeQr(request, filename, order.getOrderId().toString(), "pages/index/index"); + } catch (IOException | WxErrorException e) { + e.printStackTrace(); + } + return success("生成成功", "file/qrcode/" + getTenantId() + filename); + } + + public void makeQr(HttpServletRequest request, String filename, String scene, String page) throws IOException, WxErrorException { +// final RequestUtil requestUtil = new RequestUtil(); +// String access_token = JwtUtil.getAccessToken(request); +// requestUtil.setAccessToken(access_token); +// requestUtil.setTenantId(getTenantId().toString()); +// ApiResult res = requestUtil.getWxConfig(); +// System.out.println(res); + WxMaService wxMaService = wxMaService(); + WxMaQrcodeService wxMaQrcodeService = new WxMaQrcodeServiceImpl(wxMaService); + WxMaCodeLineColor lineColor = new WxMaCodeLineColor(); + lineColor.setR("0"); + lineColor.setG("0"); + lineColor.setB("0"); + File file = wxMaQrcodeService.createWxaCodeUnlimit(scene, page, false, "develop", 200, false, + lineColor, false); + file.renameTo(new File(filename)); + } + + public WxMaService wxMaService() { + List configs = wxMaProperties.getConfigs(); + if (configs == null) { + throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!"); + } + WxMaService maService = new WxMaServiceImpl(); + maService.setMultiConfigs( + configs.stream() + .map(a -> { + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + config.setAppid(a.getAppid()); + config.setSecret(a.getSecret()); + config.setToken(a.getToken()); + config.setAesKey(a.getAesKey()); + config.setMsgDataFormat(a.getMsgDataFormat()); + return config; + }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o))); + return maService; + } +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/WxPayNotifyNbgController.java b/src/main/java/com/gxwebsoft/shop/controller/WxPayNotifyNbgController.java index 97d253c..08f57d6 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/WxPayNotifyNbgController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/WxPayNotifyNbgController.java @@ -82,7 +82,6 @@ public class WxPayNotifyNbgController extends BaseController { if (g.getStock().compareTo(0) >= 0) { g.setStock(g.getStock() - goods2.getTotalNum()); } - } final boolean batchById = goodsService.updateBatchById(goods); System.out.println("batchById = " + batchById); diff --git a/src/main/java/com/gxwebsoft/shop/entity/Cart.java b/src/main/java/com/gxwebsoft/shop/entity/Cart.java index e53f2dd..7c662ee 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Cart.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Cart.java @@ -108,4 +108,7 @@ public class Cart implements Serializable { @TableField(exist = false) private List children; + @TableField(exist = false) + private Goods goods; + } diff --git a/src/main/java/com/gxwebsoft/shop/entity/Goods.java b/src/main/java/com/gxwebsoft/shop/entity/Goods.java index cf488b2..172d75d 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Goods.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Goods.java @@ -59,6 +59,12 @@ public class Goods implements Serializable { @ApiModelProperty(value = "商品分类ID") private Integer categoryId; + @ApiModelProperty(value = "供应商") + private Integer supplierMerchantId; + + @ApiModelProperty(value = "供应商") + private String supplierName; + @ApiModelProperty(value = "商品规格 0单规格 1多规格") private Integer specs; @@ -83,12 +89,36 @@ public class Goods implements Serializable { @ApiModelProperty(value = "经销商价格") private BigDecimal dealerPrice; + @ApiModelProperty(value = "连锁店价格") + private BigDecimal chainStorePrice; + private BigDecimal chainStoreRate; + + @ApiModelProperty(value = "会员店价格") + private BigDecimal memberStorePrice; + private BigDecimal memberStoreRate; + + @ApiModelProperty(value = "会员超市价格") + private BigDecimal memberMarketPrice; + private BigDecimal memberMarketRate; + @ApiModelProperty(value = "有赠品(经销商)") private Boolean buyingGift; @ApiModelProperty(value = "有赠品(会员店)") private Boolean priceGift; + @ApiModelProperty(value = "有赠品(经销商)") + private Boolean dealerGift; + + @ApiModelProperty(value = "赠品数(经销商)") + private Integer buyingGiftNum; + + @ApiModelProperty(value = "赠品数(会员店)") + private Integer priceGiftNum; + + @ApiModelProperty(value = "赠品数(经销商)") + private Integer dealerGiftNum; + @ApiModelProperty(value = "库存计算方式(10下单减库存 20付款减库存)") private Integer deductStockType; @@ -132,6 +162,9 @@ public class Goods implements Serializable { @ApiModelProperty(value = "用户ID") private Integer userId; + @ApiModelProperty(value = "是否新品") + private Integer isNew; + @ApiModelProperty(value = "是否删除, 0否, 1是") @TableLogic private Integer deleted; @@ -188,6 +221,10 @@ public class Goods implements Serializable { @TableField(exist = false) private String parentPath; + @ApiModelProperty(value = "是否显示赠品") + @TableField(exist = false) + private Boolean showGift; + @ApiModelProperty(value = "当前栏目名称") private String categoryName; diff --git a/src/main/java/com/gxwebsoft/shop/entity/GoodsIncomeConfig.java b/src/main/java/com/gxwebsoft/shop/entity/GoodsIncomeConfig.java new file mode 100644 index 0000000..8d05727 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/GoodsIncomeConfig.java @@ -0,0 +1,67 @@ +package com.gxwebsoft.shop.entity; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; + +import java.time.LocalDateTime; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 分润配置 + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "GoodsIncomeConfig对象", description = "分润配置") +@TableName("shop_goods_income_config") +public class GoodsIncomeConfig implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer goodsId; + + @ApiModelProperty(value = "店铺类型") + private String merchantShopType; + + private Integer skuId; + + @ApiModelProperty(value = "比例") + private BigDecimal rate; + + @ApiModelProperty(value = "用户id") + private Integer userId; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + private Integer sortNumber; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @TableField(exist = false) + private Goods goods; + + @TableField(exist = false) + private GoodsSku goodsSku; +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/GoodsStockInMerchant.java b/src/main/java/com/gxwebsoft/shop/entity/GoodsStockInMerchant.java new file mode 100644 index 0000000..be5eb52 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/GoodsStockInMerchant.java @@ -0,0 +1,66 @@ +package com.gxwebsoft.shop.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.time.LocalDateTime; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 商户商品库存 + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "GoodsStockInMerchant对象", description = "商户商品库存") +@TableName("shop_goods_stock_in_merchant") +public class GoodsStockInMerchant implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer goodsId; + + private Integer skuId; + + private Integer num; + + private Integer merchantId; + + private Integer stock; + + @ApiModelProperty(value = "状态, 0上架 1待上架 2待审核 3审核不通过") + private Integer status; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + + @TableField(exist = false) + private Goods goods; + +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/KuaiDi100Resp.java b/src/main/java/com/gxwebsoft/shop/entity/KuaiDi100Resp.java new file mode 100644 index 0000000..c1348ad --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/KuaiDi100Resp.java @@ -0,0 +1,11 @@ +package com.gxwebsoft.shop.entity; + +import lombok.Data; + +@Data +public class KuaiDi100Resp { + private String message; + private Integer returnCode; + private Boolean result; + private Object data; +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/Merchant.java b/src/main/java/com/gxwebsoft/shop/entity/Merchant.java index a2c82cc..385326f 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Merchant.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Merchant.java @@ -57,6 +57,8 @@ public class Merchant implements Serializable { private Integer merchantCategoryId; + private Integer canExpress; + private String merchantCategoryTitle; @ApiModelProperty(value = "经纬度") @@ -66,6 +68,12 @@ public class Merchant implements Serializable { private String lat; + private String startTime; + + private String endTime; + + private Integer isOn; + @ApiModelProperty(value = "所在省份") private String province; diff --git a/src/main/java/com/gxwebsoft/shop/entity/Order.java b/src/main/java/com/gxwebsoft/shop/entity/Order.java index 6b99de7..55ded53 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Order.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Order.java @@ -36,6 +36,9 @@ public class Order implements Serializable { @ApiModelProperty(value = "订单类型,0商城订单 1预定订单 2会员卡") private Integer type; + @ApiModelProperty(value = "类型,0快递 1自提") + private Integer deliveryType; + @ApiModelProperty(value = "下单渠道,0普通预定 1俱乐部训练场 3活动订场") private Integer channel; @@ -82,6 +85,16 @@ public class Order implements Serializable { @ApiModelProperty(value = "手机号码") private String phone; + @ApiModelProperty(value = "收货地址") + private String address; + + private String addressLat; + + private String addressLng; + + @ApiModelProperty(value = "自提码") + private String selfTakeCode; + @ApiModelProperty(value = "订单总额") private BigDecimal totalPrice; @@ -113,6 +126,8 @@ public class Order implements Serializable { @ApiModelProperty(value = "0余额支付, 1微信支付,2积分,3支付宝,4现金,5POS机,6VIP月卡,7VIP年卡,8VIP次卡,9IC月卡,10IC年卡,11IC次卡,12免费,13VIP充值卡,14IC充值卡,15积分支付,16VIP季卡,17IC季卡") private Integer payType; + private Integer friendPayType; + @ApiModelProperty(value = "0未付款,1已付款") private Integer payStatus; @@ -149,6 +164,12 @@ public class Order implements Serializable { @ApiModelProperty(value = "发票流水号") private String invoiceNo; + @ApiModelProperty(value = "外卖开始时间") + private String sendStartTime; + + @ApiModelProperty(value = "外卖结束时间") + private String sendEndTime; + @ApiModelProperty(value = "支付时间") private Date payTime; @@ -177,6 +198,21 @@ public class Order implements Serializable { @ApiModelProperty(value = "用户id") private Integer userId; + private Integer payUserId; + + private Integer selfTakeMerchantId; + + @TableField(exist = false) + private Merchant selfTakeMerchant; + + private String selfTakeMerchantName; + + private Integer expressMerchantId; + + private String expressMerchantName; + + private Integer hasTakeGift; + @ApiModelProperty(value = "备注") private String comments; @@ -220,4 +256,13 @@ public class Order implements Serializable { @TableField(exist = false) private List goodsList; + @ApiModelProperty(value = "不清数据") + @TableField(exist = false) + private Boolean notClearData; + + @TableField(exist = false) + private OrderDelivery orderDelivery; + + @TableField(exist = false) + private Merchant merchant; } diff --git a/src/main/java/com/gxwebsoft/shop/entity/OrderDelivery.java b/src/main/java/com/gxwebsoft/shop/entity/OrderDelivery.java index 7bf98ad..5b2c575 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/OrderDelivery.java +++ b/src/main/java/com/gxwebsoft/shop/entity/OrderDelivery.java @@ -1,10 +1,8 @@ package com.gxwebsoft.shop.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.*; + import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.TableLogic; import java.io.Serializable; import java.util.Date; @@ -64,4 +62,8 @@ public class OrderDelivery implements Serializable { @ApiModelProperty(value = "修改时间") private Date updateTime; + @TableField(exist = false) + private Express express; + + } diff --git a/src/main/java/com/gxwebsoft/shop/entity/OrderGoods.java b/src/main/java/com/gxwebsoft/shop/entity/OrderGoods.java index ebf32e6..5faf4a5 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/OrderGoods.java +++ b/src/main/java/com/gxwebsoft/shop/entity/OrderGoods.java @@ -52,6 +52,8 @@ public class OrderGoods implements Serializable { @ApiModelProperty(value = "关联商品id") private Integer goodsId; + private Integer skuId; + @ApiModelProperty(value = "商品名称") private String goodsName; @@ -108,4 +110,7 @@ public class OrderGoods implements Serializable { @ApiModelProperty(value = "创建时间") private Date createTime; + + @TableField(exist = false) + private Goods goods; } diff --git a/src/main/java/com/gxwebsoft/shop/entity/Splash.java b/src/main/java/com/gxwebsoft/shop/entity/Splash.java new file mode 100644 index 0000000..f155702 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/Splash.java @@ -0,0 +1,64 @@ +package com.gxwebsoft.shop.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 开屏广告 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "Splash对象", description = "开屏广告") +@TableName("shop_splash") +public class Splash implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "跳转类型") + private String jumpType; + + @ApiModelProperty(value = "跳转主键") + private Integer jumpPk; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/Swiper.java b/src/main/java/com/gxwebsoft/shop/entity/Swiper.java new file mode 100644 index 0000000..2347091 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/Swiper.java @@ -0,0 +1,68 @@ +package com.gxwebsoft.shop.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 轮播图 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "Swiper对象", description = "轮播图") +@TableName("shop_swiper") +public class Swiper implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "所属页面") + private String type; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "跳转类型") + private String jumpType; + + @ApiModelProperty(value = "跳转主键") + private Integer jumpPk; + + @ApiModelProperty(value = "备注") + private String comments; + + private String color; + + private String color1; + + @ApiModelProperty(value = "排序号") + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/UserAddress.java b/src/main/java/com/gxwebsoft/shop/entity/UserAddress.java index 370b059..f41029c 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/UserAddress.java +++ b/src/main/java/com/gxwebsoft/shop/entity/UserAddress.java @@ -50,6 +50,12 @@ public class UserAddress implements Serializable { @ApiModelProperty(value = "收货地址") private String address; + private String fullAddress; + + private String lat; + + private String lng; + @ApiModelProperty(value = "1先生 2女士") private Integer gender; diff --git a/src/main/java/com/gxwebsoft/shop/entity/UserCollection.java b/src/main/java/com/gxwebsoft/shop/entity/UserCollection.java index cf2c2fe..e48eb25 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/UserCollection.java +++ b/src/main/java/com/gxwebsoft/shop/entity/UserCollection.java @@ -1,5 +1,6 @@ package com.gxwebsoft.shop.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -14,7 +15,7 @@ import lombok.EqualsAndHashCode; * 我的收藏 * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ @Data @EqualsAndHashCode(callSuper = false) @@ -27,6 +28,9 @@ public class UserCollection implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; + @ApiModelProperty(value = "0店铺,1商品") + private Integer type; + @ApiModelProperty(value = "租户ID") private Integer tid; @@ -39,4 +43,6 @@ public class UserCollection implements Serializable { @ApiModelProperty(value = "注册时间") private LocalDateTime createTime; + @TableField(exist = false) + private Merchant merchant; } diff --git a/src/main/java/com/gxwebsoft/shop/mapper/GoodsIncomeConfigMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/GoodsIncomeConfigMapper.java new file mode 100644 index 0000000..d56af7d --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/GoodsIncomeConfigMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.GoodsIncomeConfig; +import com.gxwebsoft.shop.param.GoodsIncomeConfigParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分润配置Mapper + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +public interface GoodsIncomeConfigMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") GoodsIncomeConfigParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") GoodsIncomeConfigParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/GoodsStockInMerchantMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/GoodsStockInMerchantMapper.java new file mode 100644 index 0000000..eb3e85c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/GoodsStockInMerchantMapper.java @@ -0,0 +1,38 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.yulichang.base.MPJBaseMapper; +import com.gxwebsoft.shop.entity.GoodsStockInMerchant; +import com.gxwebsoft.shop.param.GoodsStockInMerchantParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商户商品库存Mapper + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +public interface GoodsStockInMerchantMapper extends MPJBaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") GoodsStockInMerchantParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") GoodsStockInMerchantParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/MerchantMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/MerchantMapper.java index 06c5ab3..ce93b22 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/MerchantMapper.java +++ b/src/main/java/com/gxwebsoft/shop/mapper/MerchantMapper.java @@ -2,6 +2,7 @@ package com.gxwebsoft.shop.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.yulichang.base.MPJBaseMapper; import com.gxwebsoft.shop.entity.Merchant; import com.gxwebsoft.shop.param.MerchantParam; import org.apache.ibatis.annotations.Param; @@ -14,7 +15,7 @@ import java.util.List; * @author 科技小王子 * @since 2024-04-05 00:03:54 */ -public interface MerchantMapper extends BaseMapper { +public interface MerchantMapper extends MPJBaseMapper { /** * 分页查询 diff --git a/src/main/java/com/gxwebsoft/shop/mapper/SplashMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/SplashMapper.java new file mode 100644 index 0000000..1cde619 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/SplashMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.Splash; +import com.gxwebsoft.shop.param.SplashParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 开屏广告Mapper + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +public interface SplashMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") SplashParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") SplashParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/SwiperMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/SwiperMapper.java new file mode 100644 index 0000000..d85a740 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/SwiperMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.Swiper; +import com.gxwebsoft.shop.param.SwiperParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 轮播图Mapper + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +public interface SwiperMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") SwiperParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") SwiperParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/UserCollectionMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/UserCollectionMapper.java index ba08881..114096e 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/UserCollectionMapper.java +++ b/src/main/java/com/gxwebsoft/shop/mapper/UserCollectionMapper.java @@ -12,7 +12,7 @@ import java.util.List; * 我的收藏Mapper * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ public interface UserCollectionMapper extends BaseMapper { diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml index 4f85852..751d22b 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml @@ -30,6 +30,9 @@ AND a.is_new = #{param.isNew} + + AND a.is_show = #{param.isShow} + AND a.combination_id = #{param.combinationId} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsIncomeConfigMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsIncomeConfigMapper.xml new file mode 100644 index 0000000..461e31a --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsIncomeConfigMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.* + FROM shop_goods_income_config a + + + AND a.id = #{param.id} + + + AND a.goods_id = #{param.goodsId} + + + AND a.merchant_shop_type LIKE CONCAT('%', #{param.merchantShopType}, '%') + + + AND a.spec LIKE CONCAT('%', #{param.spec}, '%') + + + AND a.rate = #{param.rate} + + + AND a.user_id = #{param.userId} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml index b34e594..028eec0 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsMapper.xml @@ -69,16 +69,16 @@ AND a.merchant_id = #{param.merchantId} - AND a.category_id IN (SELECT category_id FROM shop_goods_category WHERE parent_id=#{param.parentId}) + AND a.category_id IN (SELECT category_id FROM shop_goods_category WHERE parent_id=#{param.parentId}) - - - + + + - AND a.merchant_id IN - - #{item} - + AND a.merchant_id IN + + #{item} + AND a.merchant_name LIKE CONCAT('%', #{param.merchantName}, '%') @@ -115,14 +115,20 @@ AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - OR a.goods_name LIKE CONCAT('%', #{param.keywords}, '%') - OR a.parent_name LIKE CONCAT('%', #{param.keywords}, '%') - OR a.category_name LIKE CONCAT('%', #{param.keywords}, '%') - OR a.goods_id = #{param.keywords} - OR a.code = #{param.keywords} + OR a.goods_name LIKE CONCAT('%', #{param.keywords}, '%') + OR a.parent_name LIKE CONCAT('%', #{param.keywords}, '%') + OR a.category_name LIKE CONCAT('%', #{param.keywords}, '%') + OR a.goods_id = #{param.keywords} + OR a.code = #{param.keywords} ) - + + + ORDER BY ${param.orderBy} + + + ORDER BY a.sort_number ASC, a.create_time DESC + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsStockInMerchantMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsStockInMerchantMapper.xml new file mode 100644 index 0000000..f141eba --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/GoodsStockInMerchantMapper.xml @@ -0,0 +1,69 @@ + + + + + + + SELECT a.* + FROM shop_goods_stock_in_merchant a + + + AND a.id = #{param.id} + + + AND a.goods_id = #{param.goodsId} + + + AND a.sku_id = #{param.skuId} + + + AND a.num = #{param.num} + + + AND a.merchant_id = #{param.merchantId} + + + AND a.stock = #{param.stock} + + + AND a.status = #{param.status} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.user_id = #{param.userId} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderMapper.xml index 3f77a67..405950c 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderMapper.xml @@ -165,6 +165,7 @@ ) + ORDER BY a.order_id DESC diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/SplashMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/SplashMapper.xml new file mode 100644 index 0000000..06dc9cb --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/SplashMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.* + FROM shop_splash a + + + AND a.id = #{param.id} + + + AND a.title LIKE CONCAT('%', #{param.title}, '%') + + + AND a.image LIKE CONCAT('%', #{param.image}, '%') + + + AND a.jump_type LIKE CONCAT('%', #{param.jumpType}, '%') + + + AND a.jump_pk = #{param.jumpPk} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.user_id = #{param.userId} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/SwiperMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/SwiperMapper.xml new file mode 100644 index 0000000..ca2abed --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/SwiperMapper.xml @@ -0,0 +1,63 @@ + + + + + + + SELECT a.* + FROM shop_swiper a + + + AND a.id = #{param.id} + + + AND a.type LIKE CONCAT('%', #{param.type}, '%') + + + AND a.image LIKE CONCAT('%', #{param.image}, '%') + + + AND a.jump_type LIKE CONCAT('%', #{param.jumpType}, '%') + + + AND a.jump_pk = #{param.jumpPk} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.user_id = #{param.userId} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/UserCollectionMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/UserCollectionMapper.xml index e5e3fe5..289ec55 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/UserCollectionMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/UserCollectionMapper.xml @@ -10,6 +10,9 @@ AND a.id = #{param.id} + + AND a.type = #{param.type} + AND a.tid = #{param.tid} diff --git a/src/main/java/com/gxwebsoft/shop/param/CartParam.java b/src/main/java/com/gxwebsoft/shop/param/CartParam.java index 2bd375f..c1d07c3 100644 --- a/src/main/java/com/gxwebsoft/shop/param/CartParam.java +++ b/src/main/java/com/gxwebsoft/shop/param/CartParam.java @@ -1,10 +1,13 @@ package com.gxwebsoft.shop.param; import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableField; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; import com.gxwebsoft.common.core.web.BaseParam; import com.fasterxml.jackson.annotation.JsonInclude; +import com.gxwebsoft.common.system.entity.User; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.swagger.models.auth.In; @@ -55,6 +58,8 @@ public class CartParam extends BaseParam { @QueryField(type = QueryType.EQ) private Boolean isNew; + private Boolean isShow; + @ApiModelProperty(value = "拼团id") @QueryField(type = QueryType.EQ) private Integer combinationId; @@ -70,6 +75,9 @@ public class CartParam extends BaseParam { @ApiModelProperty(value = "用户ID") private Integer userId; + @TableField(exist = false) + private User loginUser; + @ApiModelProperty(value = "是否选中") private Boolean selected; @@ -84,4 +92,6 @@ public class CartParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer shopId; + @TableField(exist = false) + private Boolean withMerchantInfo; } diff --git a/src/main/java/com/gxwebsoft/shop/param/GoodsIncomeConfigParam.java b/src/main/java/com/gxwebsoft/shop/param/GoodsIncomeConfigParam.java new file mode 100644 index 0000000..c9acd40 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/GoodsIncomeConfigParam.java @@ -0,0 +1,56 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 分润配置查询参数 + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "GoodsIncomeConfigParam对象", description = "分润配置查询参数") +public class GoodsIncomeConfigParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer goodsId; + + @ApiModelProperty(value = "店铺类型") + private String merchantShopType; + + private String spec; + + @ApiModelProperty(value = "比例") + @QueryField(type = QueryType.EQ) + private BigDecimal rate; + + @ApiModelProperty(value = "用户id") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java b/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java index c483415..5ff5152 100644 --- a/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java +++ b/src/main/java/com/gxwebsoft/shop/param/GoodsParam.java @@ -145,4 +145,10 @@ public class GoodsParam extends BaseParam { @TableField(exist = false) private User loginUser; + @TableField(exist = false) + private String orderBy; + + @TableField(exist = false) + private String orderDir; + } diff --git a/src/main/java/com/gxwebsoft/shop/param/GoodsStockInMerchantParam.java b/src/main/java/com/gxwebsoft/shop/param/GoodsStockInMerchantParam.java new file mode 100644 index 0000000..64d6ba0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/GoodsStockInMerchantParam.java @@ -0,0 +1,63 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 商户商品库存查询参数 + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "GoodsStockInMerchantParam对象", description = "商户商品库存查询参数") +public class GoodsStockInMerchantParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer goodsId; + + @QueryField(type = QueryType.EQ) + private Integer skuId; + + @QueryField(type = QueryType.EQ) + private Integer num; + + @QueryField(type = QueryType.EQ) + private Integer merchantId; + + @QueryField(type = QueryType.EQ) + private Integer stock; + + @ApiModelProperty(value = "状态, 0上架 1待上架 2待审核 3审核不通过") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/param/OrderParam.java b/src/main/java/com/gxwebsoft/shop/param/OrderParam.java index 774995c..cdbb252 100644 --- a/src/main/java/com/gxwebsoft/shop/param/OrderParam.java +++ b/src/main/java/com/gxwebsoft/shop/param/OrderParam.java @@ -3,10 +3,12 @@ package com.gxwebsoft.shop.param; import java.math.BigDecimal; import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; import com.gxwebsoft.common.core.web.BaseParam; import com.fasterxml.jackson.annotation.JsonInclude; +import com.gxwebsoft.common.system.entity.User; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -210,4 +212,6 @@ public class OrderParam extends BaseParam { @QueryField(type = QueryType.GT) private Date expirationTime; + @TableField(exist = false) + private User loginUser; } diff --git a/src/main/java/com/gxwebsoft/shop/param/SplashParam.java b/src/main/java/com/gxwebsoft/shop/param/SplashParam.java new file mode 100644 index 0000000..ddbb5e3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/SplashParam.java @@ -0,0 +1,57 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 开屏广告查询参数 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "SplashParam对象", description = "开屏广告查询参数") +public class SplashParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "跳转类型") + private String jumpType; + + @ApiModelProperty(value = "跳转主键") + @QueryField(type = QueryType.EQ) + private Integer jumpPk; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/param/SwiperParam.java b/src/main/java/com/gxwebsoft/shop/param/SwiperParam.java new file mode 100644 index 0000000..ea11b89 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/SwiperParam.java @@ -0,0 +1,57 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 轮播图查询参数 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "SwiperParam对象", description = "轮播图查询参数") +public class SwiperParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @ApiModelProperty(value = "所属页面") + private String type; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "跳转类型") + private String jumpType; + + @ApiModelProperty(value = "跳转主键") + @QueryField(type = QueryType.EQ) + private Integer jumpPk; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/shop/param/UserCollectionParam.java b/src/main/java/com/gxwebsoft/shop/param/UserCollectionParam.java index 99a2013..6cf163a 100644 --- a/src/main/java/com/gxwebsoft/shop/param/UserCollectionParam.java +++ b/src/main/java/com/gxwebsoft/shop/param/UserCollectionParam.java @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; * 我的收藏查询参数 * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ @Data @EqualsAndHashCode(callSuper = false) @@ -27,6 +27,10 @@ public class UserCollectionParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer id; + @ApiModelProperty(value = "0店铺,1商品") + @QueryField(type = QueryType.EQ) + private Integer type; + @ApiModelProperty(value = "租户ID") @QueryField(type = QueryType.EQ) private Integer tid; diff --git a/src/main/java/com/gxwebsoft/shop/service/GoodsIncomeConfigService.java b/src/main/java/com/gxwebsoft/shop/service/GoodsIncomeConfigService.java new file mode 100644 index 0000000..391e420 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/GoodsIncomeConfigService.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.GoodsIncomeConfig; +import com.gxwebsoft.shop.param.GoodsIncomeConfigParam; + +import java.util.List; + +/** + * 分润配置Service + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +public interface GoodsIncomeConfigService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(GoodsIncomeConfigParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(GoodsIncomeConfigParam param); + + /** + * 根据id查询 + * + * @param id + * @return GoodsIncomeConfig + */ + GoodsIncomeConfig getByIdRel(Integer id); + + GoodsIncomeConfig check(Integer goodsId, Integer skuId, String merchantShopType); +} diff --git a/src/main/java/com/gxwebsoft/shop/service/GoodsService.java b/src/main/java/com/gxwebsoft/shop/service/GoodsService.java index e100827..e5eb57c 100644 --- a/src/main/java/com/gxwebsoft/shop/service/GoodsService.java +++ b/src/main/java/com/gxwebsoft/shop/service/GoodsService.java @@ -45,7 +45,7 @@ public interface GoodsService extends IService { List getGoodsSpec(); // 商城商品 - List getGoodsSpecType0(); + List getGoodsSpecType0(GoodsParam param); // 外卖商品 List getGoodsSpecType1(); diff --git a/src/main/java/com/gxwebsoft/shop/service/GoodsSkuService.java b/src/main/java/com/gxwebsoft/shop/service/GoodsSkuService.java index 2adadc1..de248a9 100644 --- a/src/main/java/com/gxwebsoft/shop/service/GoodsSkuService.java +++ b/src/main/java/com/gxwebsoft/shop/service/GoodsSkuService.java @@ -31,6 +31,8 @@ public interface GoodsSkuService extends IService { */ List listRel(GoodsSkuParam param); + List listByGoods(Integer goodsId); + /** * 根据id查询 * diff --git a/src/main/java/com/gxwebsoft/shop/service/GoodsStockInMerchantService.java b/src/main/java/com/gxwebsoft/shop/service/GoodsStockInMerchantService.java new file mode 100644 index 0000000..bcb6db3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/GoodsStockInMerchantService.java @@ -0,0 +1,45 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.GoodsStockInMerchant; +import com.gxwebsoft.shop.param.GoodsStockInMerchantParam; + +import java.util.List; + +/** + * 商户商品库存Service + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +public interface GoodsStockInMerchantService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(GoodsStockInMerchantParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(GoodsStockInMerchantParam param); + + /** + * 根据id查询 + * + * @param id + * @return GoodsStockInMerchant + */ + GoodsStockInMerchant getByIdRel(Integer id); + + GoodsStockInMerchant check(Integer merchantId, Integer goodsId, Integer skuId); + + List canExpressList(Integer goodsId, Integer stock, String lat, String lng); +} diff --git a/src/main/java/com/gxwebsoft/shop/service/KuaiDi100.java b/src/main/java/com/gxwebsoft/shop/service/KuaiDi100.java new file mode 100644 index 0000000..005f77d --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/KuaiDi100.java @@ -0,0 +1,17 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.BOrderReq; + +import java.util.Map; + +public interface KuaiDi100 { + /** + * 商家寄件 + * @param bOrderReq + * @return + * @throws Exception + */ + HttpResult border(BOrderReq bOrderReq) throws Exception; +} diff --git a/src/main/java/com/gxwebsoft/shop/service/MerchantService.java b/src/main/java/com/gxwebsoft/shop/service/MerchantService.java index 503ffb3..241c9ba 100644 --- a/src/main/java/com/gxwebsoft/shop/service/MerchantService.java +++ b/src/main/java/com/gxwebsoft/shop/service/MerchantService.java @@ -39,4 +39,5 @@ public interface MerchantService extends IService { */ Merchant getByIdRel(Integer merchantId); + Merchant getByUserId(Integer userId); } diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderDeliveryService.java b/src/main/java/com/gxwebsoft/shop/service/OrderDeliveryService.java index baaa547..613280d 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderDeliveryService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderDeliveryService.java @@ -39,4 +39,5 @@ public interface OrderDeliveryService extends IService { */ OrderDelivery getByIdRel(Integer deliveryId); + OrderDelivery getByOrderId(Integer orderId); } diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderGoodsService.java b/src/main/java/com/gxwebsoft/shop/service/OrderGoodsService.java index d2e9049..f8c601b 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderGoodsService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderGoodsService.java @@ -31,6 +31,8 @@ public interface OrderGoodsService extends IService { */ List listRel(OrderGoodsParam param); + List listByOrderId(Integer orderId); + /** * 根据id查询 * diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderService.java b/src/main/java/com/gxwebsoft/shop/service/OrderService.java index cea09c2..c5ecd21 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderService.java @@ -17,37 +17,39 @@ import java.util.List; */ public interface OrderService extends IService { - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(OrderParam param); + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(OrderParam param); - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(OrderParam param); + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(OrderParam param); - /** - * 根据id查询 - * - * @param orderId 订单号 - * @return Order - */ - Order getByIdRel(Integer orderId); + /** + * 根据id查询 + * + * @param orderId 订单号 + * @return Order + */ + Order getByIdRel(Integer orderId); - HashMap createWxOrder(Order order); + HashMap createWxOrder(Order order); - Order getByOutTradeNo(String outTradeNo); + Order getByOutTradeNo(String outTradeNo); - Boolean updateByOutTradeNo(Order order); + Boolean updateByOutTradeNo(Order order); - Boolean payByBalance(Order order); + Boolean payByBalance(Order order); + + void settle(String token, String tenantId, Order order); // String payByWxNative(Order order); } diff --git a/src/main/java/com/gxwebsoft/shop/service/SplashService.java b/src/main/java/com/gxwebsoft/shop/service/SplashService.java new file mode 100644 index 0000000..9a8f151 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/SplashService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.Splash; +import com.gxwebsoft.shop.param.SplashParam; + +import java.util.List; + +/** + * 开屏广告Service + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +public interface SplashService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(SplashParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(SplashParam param); + + /** + * 根据id查询 + * + * @param id + * @return Splash + */ + Splash getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/SwiperService.java b/src/main/java/com/gxwebsoft/shop/service/SwiperService.java new file mode 100644 index 0000000..27f8edd --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/SwiperService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.Swiper; +import com.gxwebsoft.shop.param.SwiperParam; + +import java.util.List; + +/** + * 轮播图Service + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +public interface SwiperService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(SwiperParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(SwiperParam param); + + /** + * 根据id查询 + * + * @param id + * @return Swiper + */ + Swiper getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/UserAddressService.java b/src/main/java/com/gxwebsoft/shop/service/UserAddressService.java index 8944668..7795115 100644 --- a/src/main/java/com/gxwebsoft/shop/service/UserAddressService.java +++ b/src/main/java/com/gxwebsoft/shop/service/UserAddressService.java @@ -39,4 +39,5 @@ public interface UserAddressService extends IService { */ UserAddress getByIdRel(Integer id); + void clearDefault(Integer userId); } diff --git a/src/main/java/com/gxwebsoft/shop/service/UserCollectionService.java b/src/main/java/com/gxwebsoft/shop/service/UserCollectionService.java index 96556d8..967302b 100644 --- a/src/main/java/com/gxwebsoft/shop/service/UserCollectionService.java +++ b/src/main/java/com/gxwebsoft/shop/service/UserCollectionService.java @@ -11,7 +11,7 @@ import java.util.List; * 我的收藏Service * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ public interface UserCollectionService extends IService { @@ -39,4 +39,5 @@ public interface UserCollectionService extends IService { */ UserCollection getByIdRel(Integer id); + UserCollection check(Integer userId, Integer type, Integer tid); } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java index 798c35f..466c47f 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java @@ -9,17 +9,22 @@ import com.gxwebsoft.common.system.entity.Dict; import com.gxwebsoft.common.system.entity.DictData; import com.gxwebsoft.shop.entity.Goods; import com.gxwebsoft.shop.entity.GoodsSpec; +import com.gxwebsoft.shop.entity.Merchant; import com.gxwebsoft.shop.mapper.CartMapper; import com.gxwebsoft.shop.service.CartService; import com.gxwebsoft.shop.entity.Cart; import com.gxwebsoft.shop.param.CartParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.service.GoodsService; +import com.gxwebsoft.shop.service.MerchantService; import com.gxwebsoft.shop.vo.CartShopVo; import com.gxwebsoft.shop.vo.CartVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -33,95 +38,115 @@ import java.util.stream.Stream; */ @Service public class CartServiceImpl extends ServiceImpl implements CartService { + @Resource + private GoodsService goodsService; + @Resource + private MerchantService merchantService; - @Override - public PageResult pageRel(CartParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - @Transactional(rollbackFor = {Exception.class}) - public CartVo listRel(CartParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("create_time desc"); - final List carts = page.sortRecords(list); - System.out.println("carts = " + carts.size()); - // 整理数据 - final CartVo vo = new CartVo(); - // 计算单品总价 - for (Cart cart : carts) { - cart.setTotalPrice(cart.getPrice().multiply(BigDecimal.valueOf(cart.getCartNum()))); + @Override + public PageResult pageRel(CartParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); } - // 计算购物车金额 - final Integer cartNum = carts.stream().map(Cart::getCartNum).reduce(Integer::sum).orElse(0); - final Integer selectNums = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getCartNum).reduce(Integer::sum).orElse(0); - final BigDecimal totalPrice = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); - // 按店铺ID分组 - final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getMerchantId)); - final ArrayList shops = new ArrayList<>(); - if (MapUtil.isNotEmpty(collectCart)) { - for (Integer shopId : collectCart.keySet()) { - final CartShopVo shopVo = new CartShopVo(); - shopVo.setShopId(shopId); - shopVo.setCarts(collectCart.get(shopId)); - if (ObjectUtil.isNotEmpty(collectCart.get(shopId).get(0))) { - final Cart cart = collectCart.get(shopId).get(0); - shopVo.setShopName(cart.getMerchantName()); - shopVo.setShopLogo(cart.getImage()); + + @Override + @Transactional(rollbackFor = {Exception.class}) + public CartVo listRel(CartParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + final List carts = page.sortRecords(list); + System.out.println("carts = " + carts.size()); + // 整理数据 + final CartVo vo = new CartVo(); + // 计算单品总价 + for (Cart cart : carts) { + cart.setTotalPrice(cart.getPrice().multiply(BigDecimal.valueOf(cart.getCartNum()))); + Goods goods = goodsService.getById(cart.getGoodsId()); + if (param.getLoginUser() != null) { + // 经销商 + if (param.getLoginUser().getGradeId().equals(33)) { + if (goods.getDealerGift()) goods.setShowGift(true); + } + // 会员店 + if (param.getLoginUser().getGradeId().equals(31)) { + if (goods.getPriceGift()) goods.setShowGift(true); + } + } + cart.setGoods(goods); + } + // 计算购物车金额 + final Integer cartNum = carts.stream().map(Cart::getCartNum).reduce(Integer::sum).orElse(0); + final Integer selectNums = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getCartNum).reduce(Integer::sum).orElse(0); + final BigDecimal totalPrice = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + // 按店铺ID分组 + final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getMerchantId)); + final ArrayList shops = new ArrayList<>(); + if (MapUtil.isNotEmpty(collectCart)) { + for (Integer shopId : collectCart.keySet()) { + final CartShopVo shopVo = new CartShopVo(); + shopVo.setShopId(shopId); + shopVo.setCarts(collectCart.get(shopId)); + if (ObjectUtil.isNotEmpty(collectCart.get(shopId).get(0))) { + final Cart cart = collectCart.get(shopId).get(0); + shopVo.setShopName(cart.getMerchantName()); + shopVo.setShopLogo(cart.getImage()); + } + if (param.getWithMerchantInfo() != null) { + Merchant merchant = merchantService.getById(shopId); + shopVo.setMerchant(merchant); + } + shops.add(shopVo); + } } - shops.add(shopVo); - } - } - vo.setShops(shops); - vo.setTotalPrice(totalPrice); - vo.setTotalNums(Long.valueOf(cartNum)); - vo.setSelectNums(Long.valueOf(selectNums)); + vo.setShops(shops); + vo.setTotalPrice(totalPrice); + vo.setTotalNums(Long.valueOf(cartNum)); + vo.setSelectNums(Long.valueOf(selectNums)); // updateBatchById(carts); - return vo; - } + return vo; + } - @Override - public Cart getByIdRel(Integer id) { - CartParam param = new CartParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } + @Override + public Cart getByIdRel(Integer id) { + CartParam param = new CartParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } - @Override - public List listRelMpj(CartParam param) { + @Override + public List listRelMpj(CartParam param) { - // 多表查询 - MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); - mpjLambdaWrapper.selectAll(Cart.class) - .select(Goods::getGoodsName) - .select(Goods::getImage) - .leftJoin(Goods.class,Goods::getGoodsId,Cart::getGoodsId).eq(Cart::getUserId,param.getUserId()); + // 多表查询 + MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); + mpjLambdaWrapper.selectAll(Cart.class) + .select(Goods::getGoodsName) + .select(Goods::getImage) + .leftJoin(Goods.class, Goods::getGoodsId, Cart::getGoodsId).eq(Cart::getUserId, param.getUserId()); - // 查询选中状态 - if(param.getSelected() != null){ - mpjLambdaWrapper.eq(Cart::getSelected, param.getSelected()); - } - // 商品类型 0商城 1预定 - if(param.getType() != null){ - mpjLambdaWrapper.eq(Cart::getType,param.getType()); - } - // 是否为立即购买 - if(param.getIsNew() != null){ - mpjLambdaWrapper.eq(Cart::getIsNew,param.getIsNew()); - } - // 指定cartId - if(param.getId() != null){ - mpjLambdaWrapper.eq(Cart::getId,param.getId()); - } - System.out.println("mpjLambdaWrapper = " + mpjLambdaWrapper); - return baseMapper.selectJoinList(Cart.class, mpjLambdaWrapper); - } + // 查询选中状态 + if (param.getSelected() != null) { + mpjLambdaWrapper.eq(Cart::getSelected, param.getSelected()); + } + // 商品类型 0商城 1预定 + if (param.getType() != null) { + mpjLambdaWrapper.eq(Cart::getType, param.getType()); + } + // 是否为立即购买 + if (param.getIsNew() != null) { + mpjLambdaWrapper.eq(Cart::getIsNew, param.getIsNew()); + } + // 指定cartId + if (param.getId() != null) { + mpjLambdaWrapper.eq(Cart::getId, param.getId()); + } + System.out.println("mpjLambdaWrapper = " + mpjLambdaWrapper); + return baseMapper.selectJoinList(Cart.class, mpjLambdaWrapper); + } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsIncomeConfigServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsIncomeConfigServiceImpl.java new file mode 100644 index 0000000..4237d5c --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsIncomeConfigServiceImpl.java @@ -0,0 +1,71 @@ +package com.gxwebsoft.shop.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.mapper.GoodsIncomeConfigMapper; +import com.gxwebsoft.shop.service.GoodsIncomeConfigService; +import com.gxwebsoft.shop.entity.GoodsIncomeConfig; +import com.gxwebsoft.shop.param.GoodsIncomeConfigParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.service.GoodsService; +import com.gxwebsoft.shop.service.GoodsSkuService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 分润配置Service实现 + * + * @author 科技小王子 + * @since 2024-10-06 17:55:50 + */ +@Service +public class GoodsIncomeConfigServiceImpl extends ServiceImpl implements GoodsIncomeConfigService { + @Resource + private GoodsSkuService goodsSkuService; + @Resource + private GoodsService goodsService; + + @Override + public PageResult pageRel(GoodsIncomeConfigParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + for (GoodsIncomeConfig goodsIncomeConfig : list) { + goodsIncomeConfig.setGoods(goodsService.getById(goodsIncomeConfig.getGoodsId())); + if (goodsIncomeConfig.getSkuId() != null) { + goodsIncomeConfig.setGoodsSku(goodsSkuService.getById(goodsIncomeConfig.getSkuId())); + } + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(GoodsIncomeConfigParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public GoodsIncomeConfig getByIdRel(Integer id) { + GoodsIncomeConfigParam param = new GoodsIncomeConfigParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public GoodsIncomeConfig check(Integer goodsId, Integer skuId, String merchantShopType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(GoodsIncomeConfig::getGoodsId, goodsId); + wrapper.eq(GoodsIncomeConfig::getMerchantShopType, merchantShopType); + if (skuId != null) wrapper.eq(GoodsIncomeConfig::getSkuId, skuId); + wrapper.last("limit 1"); + return getOne(wrapper); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java index 678250e..1910367 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsServiceImpl.java @@ -48,9 +48,9 @@ public class GoodsServiceImpl extends ServiceImpl implements public PageResult pageRel(GoodsParam param) { // 按行业名称查找店铺ID if (ObjectUtil.isNotEmpty(param.getIndustryName())) { - final List merchants = merchantService.list(new LambdaQueryWrapper().like(Merchant::getCategory, param.getIndustryName())); - final Set merchantIds = merchants.stream().map(Merchant::getMerchantId).collect(Collectors.toSet()); - param.setShopIdsByIndustry(merchantIds); + final List merchants = merchantService.list(new LambdaQueryWrapper().like(Merchant::getCategory, param.getIndustryName())); + final Set merchantIds = merchants.stream().map(Merchant::getMerchantId).collect(Collectors.toSet()); + param.setShopIdsByIndustry(merchantIds); } PageParam page = new PageParam<>(param); page.setDefaultOrder("sort_number asc, create_time desc"); @@ -58,30 +58,43 @@ public class GoodsServiceImpl extends ServiceImpl implements final Set goodsIds = list.stream().map(Goods::getGoodsId).collect(Collectors.toSet()); if (!CollectionUtils.isEmpty(goodsIds)) { - final User loginUser = param.getLoginUser(); - final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); - final List skus = goodsSkuService.list(new LambdaQueryWrapper().in(GoodsSku::getGoodsId, goodsIds)); - final Map> collectSpecs = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); - final Map> collectSkus = skus.stream().collect(Collectors.groupingBy(GoodsSku::getGoodsId)); - list.forEach(d -> { - final List goodsSpecs = collectSpecs.get(d.getGoodsId()); - if (!CollectionUtils.isEmpty(goodsSpecs)) { - final GoodsSpec spec = goodsSpecs.get(0); - final String value = spec.getSpecValue(); - final Object object = JSONUtil.parseObject(value,Object.class); - d.setGoodsSpecValue(object); - // 整理商品价格 - if (loginUser != null) { - if(loginUser.getGradeId().equals(33)){ - d.setPrice(d.getDealerPrice()); + final User loginUser = param.getLoginUser(); + final List specs = goodsSpecService.list(new LambdaQueryWrapper().in(GoodsSpec::getGoodsId, goodsIds)); + final List skus = goodsSkuService.list(new LambdaQueryWrapper().in(GoodsSku::getGoodsId, goodsIds)); + final Map> collectSpecs = specs.stream().collect(Collectors.groupingBy(GoodsSpec::getGoodsId)); + final Map> collectSkus = skus.stream().collect(Collectors.groupingBy(GoodsSku::getGoodsId)); + list.forEach(d -> { + final List goodsSpecs = collectSpecs.get(d.getGoodsId()); + if (!CollectionUtils.isEmpty(goodsSpecs)) { + final GoodsSpec spec = goodsSpecs.get(0); + final String value = spec.getSpecValue(); + final Object object = JSONUtil.parseObject(value, Object.class); + d.setGoodsSpecValue(object); + // 整理商品价格 + if (loginUser != null) { + // 经销商 + if (loginUser.getGradeId().equals(33)) { + d.setPrice(d.getDealerPrice()); + } + if (loginUser.getGradeId().equals(0)) { + d.setPrice(d.getSalePrice()); + } + }else { + d.setPrice(d.getSalePrice()); + } } - if(loginUser.getGradeId().equals(0)){ - d.setPrice(d.getSalePrice()); + if (loginUser != null) { + // 经销商 + if (loginUser.getGradeId().equals(33)) { + if (d.getDealerGift()) d.setShowGift(true); + } + // 会员店 + if (loginUser.getGradeId().equals(31)) { + if (d.getPriceGift()) d.setShowGift(true); + } } - } - } // d.setGoodsSkus(collectSkus.get(d.getGoodsId())); - }); + }); } return new PageResult<>(list, page.getTotal()); @@ -90,6 +103,9 @@ public class GoodsServiceImpl extends ServiceImpl implements @Override public List listRel(GoodsParam param) { List list = baseMapper.selectListRel(param); + for (Goods goods : list) { + goods.setGoodsSkus(goodsSkuService.listByGoods(goods.getGoodsId())); + } // 排序 PageParam page = new PageParam<>(); page.setDefaultOrder("sort_number asc, create_time desc"); @@ -105,63 +121,66 @@ public class GoodsServiceImpl extends ServiceImpl implements @Override public void saveBatchByAsync(Goods goods) { - // 保存商品多规格 - if (goods.getSpecs().equals(1)) { - final GoodsSpec spec = goods.getGoodsSpec(); - if (spec != null) { - spec.setGoodsId(goods.getGoodsId()); - if(spec.getSpecValue() == null){ - spec.setSpecValue(JSON.toJSONString(new ArrayList<>())); - } - goodsSpecService.save(spec); + // 保存商品多规格 + if (goods.getSpecs().equals(1)) { + final GoodsSpec spec = goods.getGoodsSpec(); + if (spec != null) { + spec.setGoodsId(goods.getGoodsId()); + if (spec.getSpecValue() == null) { + spec.setSpecValue(JSON.toJSONString(new ArrayList<>())); + } + goodsSpecService.save(spec); - // 保存商品sku表 - final List goodsSkus = goods.getGoodsSkus(); - if (!CollectionUtils.isEmpty(goodsSkus)) { - goodsSkus.forEach(d -> { - d.setGoodsId(goods.getGoodsId()); - }); - goodsSkuService.saveBatch(goodsSkus); - } + // 保存商品sku表 + final List goodsSkus = goods.getGoodsSkus(); + if (!CollectionUtils.isEmpty(goodsSkus)) { + goodsSkus.forEach(d -> { + d.setGoodsId(goods.getGoodsId()); + }); + goodsSkuService.saveBatch(goodsSkus); + } + } } - } } - @Override - public List getGoodsSpec() { - // 多表查询 - MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); - mpjLambdaWrapper.selectAll(Goods.class) - .select(GoodsSpec::getSpecValue) - .select(GoodsSpec::getSpecName) - .leftJoin(GoodsSpec.class,GoodsSpec::getGoodsId,GoodsSpec::getGoodsId); - return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); - } + @Override + public List getGoodsSpec() { + // 多表查询 + MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); + mpjLambdaWrapper.selectAll(Goods.class) + .select(GoodsSpec::getSpecValue) + .select(GoodsSpec::getSpecName) + .leftJoin(GoodsSpec.class, GoodsSpec::getGoodsId, GoodsSpec::getGoodsId); + return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); + } - @Override - public List getGoodsSpecType0() { - // 多表查询 - MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); - mpjLambdaWrapper.selectAll(Goods.class) - .select(GoodsSpec::getSpecValue) - .select(GoodsSpec::getSpecName) - .leftJoin(GoodsSpec.class,GoodsSpec::getGoodsId,GoodsSpec::getGoodsId) - .gt(Goods::getStock,0) - .eq(Goods::getType,0); - return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); - } + @Override + public List getGoodsSpecType0(GoodsParam param) { + // 多表查询 + MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); + mpjLambdaWrapper.selectAll(Goods.class) + .select(GoodsSpec::getSpecValue) + .select(GoodsSpec::getSpecName) + .leftJoin(GoodsSpec.class, GoodsSpec::getGoodsId, GoodsSpec::getGoodsId) + .gt(Goods::getStock, 0) + .eq(Goods::getType, 0); + if (param.getOrderBy() != null && param.getOrderDir() != null) { + mpjLambdaWrapper.orderBy(true, param.getOrderDir().equals("asc"), param.getOrderBy()); + } + return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); + } - @Override - public List getGoodsSpecType1() { - // 多表查询 - MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); - mpjLambdaWrapper.selectAll(Goods.class) - .select(GoodsSpec::getSpecValue) - .select(GoodsSpec::getSpecName) - .leftJoin(GoodsSpec.class,GoodsSpec::getGoodsId,GoodsSpec::getGoodsId) - .gt(Goods::getStock,0) - .eq(Goods::getType,1); - return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); - } + @Override + public List getGoodsSpecType1() { + // 多表查询 + MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); + mpjLambdaWrapper.selectAll(Goods.class) + .select(GoodsSpec::getSpecValue) + .select(GoodsSpec::getSpecName) + .leftJoin(GoodsSpec.class, GoodsSpec::getGoodsId, GoodsSpec::getGoodsId) + .gt(Goods::getStock, 0) + .eq(Goods::getType, 1); + return baseMapper.selectJoinList(Goods.class, mpjLambdaWrapper); + } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsSkuServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsSkuServiceImpl.java index 47adc40..a806f9b 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsSkuServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsSkuServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.shop.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.shop.mapper.GoodsSkuMapper; import com.gxwebsoft.shop.service.GoodsSkuService; @@ -37,6 +38,14 @@ public class GoodsSkuServiceImpl extends ServiceImpl i return page.sortRecords(list); } + @Override + public List listByGoods(Integer goodsId) { + return list( + new LambdaQueryWrapper() + .eq(GoodsSku::getGoodsId, goodsId) + ); + } + @Override public GoodsSku getByIdRel(Integer id) { GoodsSkuParam param = new GoodsSkuParam(); diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/GoodsStockInMerchantServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsStockInMerchantServiceImpl.java new file mode 100644 index 0000000..3535052 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/GoodsStockInMerchantServiceImpl.java @@ -0,0 +1,86 @@ +package com.gxwebsoft.shop.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.query.MPJQueryWrapper; +import com.gxwebsoft.shop.entity.Goods; +import com.gxwebsoft.shop.entity.Merchant; +import com.gxwebsoft.shop.mapper.GoodsStockInMerchantMapper; +import com.gxwebsoft.shop.service.GoodsService; +import com.gxwebsoft.shop.service.GoodsStockInMerchantService; +import com.gxwebsoft.shop.entity.GoodsStockInMerchant; +import com.gxwebsoft.shop.param.GoodsStockInMerchantParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 商户商品库存Service实现 + * + * @author 科技小王子 + * @since 2024-10-05 02:33:23 + */ +@Service +public class GoodsStockInMerchantServiceImpl extends ServiceImpl implements GoodsStockInMerchantService { + + @Resource + private GoodsService goodsService; + @Override + public PageResult pageRel(GoodsStockInMerchantParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + for (GoodsStockInMerchant goodsStockInMerchant : list) { + Goods goods = goodsService.getById(goodsStockInMerchant.getGoodsId()); + goodsStockInMerchant.setGoods(goods); + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(GoodsStockInMerchantParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public GoodsStockInMerchant getByIdRel(Integer id) { + GoodsStockInMerchantParam param = new GoodsStockInMerchantParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public GoodsStockInMerchant check(Integer merchantId, Integer goodsId, Integer skuId) { + GoodsStockInMerchantParam param = new GoodsStockInMerchantParam(); + param.setMerchantId(merchantId); + param.setGoodsId(goodsId); + param.setSkuId(skuId); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public List canExpressList(Integer goodsId, Integer stock, String lat, String lng) { + String distanceSql = "ACOS(SIN(( " + lat + " * 3.1415) / 180 ) * SIN((lat * 3.1415) / 180 ) + " + + "COS(( " + lat + " * 3.1415) / 180) * COS((b.lat * 3.1415) / 180 ) * COS(( " + lng + " * 3.1415) / 180 - " + + "(b.lng * 3.1415) / 180 ) ) * 6380" + + " as distance"; + return list( + new MPJQueryWrapper() + .leftJoin("shop_merchant AS b ON b.merchant_id = t.merchant_id") + .select("t.*", distanceSql) + .eq("goods_id", goodsId) + .eq("can_express", 1) + .ge("stock", stock) + .orderByDesc("distance") + ); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/KuaiDi100Impl.java b/src/main/java/com/gxwebsoft/shop/service/impl/KuaiDi100Impl.java new file mode 100644 index 0000000..bb89c15 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/KuaiDi100Impl.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.shop.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.google.gson.Gson; +import com.gxwebsoft.shop.service.KuaiDi100; +import com.kuaidi100.sdk.api.BOrderOfficial; +import com.kuaidi100.sdk.contant.ApiInfoConstant; +import com.kuaidi100.sdk.core.BaseClient; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.BOrderReq; +import com.kuaidi100.sdk.request.BaseRequest; +import com.kuaidi100.sdk.request.PrintReq; +import com.kuaidi100.sdk.utils.SignUtils; +import org.springframework.stereotype.Service; + +@Service +public class KuaiDi100Impl implements KuaiDi100 { + private String key = "QIfOPROg5054"; + private String secret = "09401b3c56f54175bcacc74d0519e4ef"; + @Override + public HttpResult border(BOrderReq bOrderReq) throws Exception { + PrintReq printReq = new PrintReq(); + + String t = String.valueOf(System.currentTimeMillis()); + String param = new Gson().toJson(bOrderReq); + + printReq.setKey(key); + printReq.setSign(SignUtils.printSign(param,t,key,secret)); + printReq.setT(t); + printReq.setParam(param); + printReq.setMethod(ApiInfoConstant.B_ORDER_OFFICIAL_ORDER_METHOD); + System.out.println(printReq); +// IBaseClient bOrder = new BOrderOfficial(); + IBaseClient bOrder = new BaseClient() { + @Override + public String getApiUrl(BaseRequest baseRequest) { + return "https://api.kuaidi100.com/apiMock/border"; + } + }; + return bOrder.execute(printReq); + } +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/MerchantServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/MerchantServiceImpl.java index cf0f860..034bf97 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/MerchantServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/MerchantServiceImpl.java @@ -32,6 +32,11 @@ public class MerchantServiceImpl extends ServiceImpl i PageParam page = new PageParam<>(param); page.setDefaultOrder("sort_number asc, create_time desc"); List list = baseMapper.selectPageRel(page, param); + for (Merchant merchant : list) { + if (param.getWithOrderNum() != null && param.getWithOrderNum()) { + merchant.setOrderNum(orderGoodsService.countByMerchant(merchant.getMerchantId())); + } + } return new PageResult<>(list, page.getTotal()); } @@ -64,4 +69,11 @@ public class MerchantServiceImpl extends ServiceImpl i return param.getOne(baseMapper.selectListRel(param)); } + @Override + public Merchant getByUserId(Integer userId) { + MerchantParam param = new MerchantParam(); + param.setUserId(userId); + return param.getOne(baseMapper.selectListRel(param)); + } + } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/OrderDeliveryServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/OrderDeliveryServiceImpl.java index 349330a..b014647 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/OrderDeliveryServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/OrderDeliveryServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.shop.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.shop.mapper.OrderDeliveryMapper; import com.gxwebsoft.shop.service.OrderDeliveryService; @@ -44,4 +45,14 @@ public class OrderDeliveryServiceImpl extends ServiceImpl() + .eq(OrderDelivery::getOrderId, orderId) + .orderByDesc(OrderDelivery::getCreateTime) + .last("limit 1") + ); + } + } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/OrderGoodsServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/OrderGoodsServiceImpl.java index 8b05f3a..535fc53 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/OrderGoodsServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/OrderGoodsServiceImpl.java @@ -1,8 +1,11 @@ package com.gxwebsoft.shop.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.entity.Goods; import com.gxwebsoft.shop.mapper.OrderGoodsMapper; +import com.gxwebsoft.shop.service.GoodsService; import com.gxwebsoft.shop.service.OrderGoodsService; import com.gxwebsoft.shop.entity.OrderGoods; import com.gxwebsoft.shop.param.OrderGoodsParam; @@ -10,6 +13,7 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; /** @@ -20,6 +24,8 @@ import java.util.List; */ @Service public class OrderGoodsServiceImpl extends ServiceImpl implements OrderGoodsService { + @Resource + private GoodsService goodsService; @Override public PageResult pageRel(OrderGoodsParam param) { @@ -38,6 +44,21 @@ public class OrderGoodsServiceImpl extends ServiceImpl listByOrderId(Integer orderId) { + List list = list( + new LambdaQueryWrapper() + .eq(OrderGoods::getOrderId, orderId) + ); + List goodsList = goodsService.listByIds(list.stream().map(OrderGoods::getGoodsId).toList()); + for (OrderGoods orderGoods : list) { + for (Goods goods : goodsList) { + if (orderGoods.getGoodsId().equals(goods.getGoodsId())) orderGoods.setGoods(goods); + } + } + return list; + } + @Override public OrderGoods getByIdRel(Integer id) { OrderGoodsParam param = new OrderGoodsParam(); diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java index 8c43a0e..3edd985 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java @@ -12,12 +12,14 @@ import com.gxwebsoft.cms.entity.Website; import com.gxwebsoft.cms.entity.WebsiteField; import com.gxwebsoft.common.core.config.ConfigProperties; import com.gxwebsoft.common.core.exception.BusinessException; +import com.gxwebsoft.common.core.security.JwtUtil; import com.gxwebsoft.common.core.utils.RedisUtil; import com.gxwebsoft.common.core.utils.RequestUtil; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.shop.consts.BalanceScene; import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.mapper.OrderMapper; import com.gxwebsoft.shop.param.OrderParam; @@ -37,12 +39,16 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import static com.gxwebsoft.shop.consts.OrderPayType.PAY_TYPE_FRIEND; +import static com.gxwebsoft.shop.consts.OrderPayType.PAY_TYPE_WECHAT; + /** * 订单Service实现 * @@ -51,254 +57,450 @@ import java.util.stream.Collectors; */ @Service public class OrderServiceImpl extends ServiceImpl implements OrderService { - @Value("${spring.profiles.active}") - String active; - @Resource - private OrderInfoService orderInfoService; - @Resource - private OrderGoodsService orderGoodsService; - @Resource - private ConfigProperties config; - @Resource - private RequestUtil requestUtil; - @Resource - private OrderService orderService; - @Resource - private UsersService usersService; - @Resource - private RedisUtil redisUtil; + @Value("${spring.profiles.active}") + String active; + @Resource + private OrderInfoService orderInfoService; + @Resource + private OrderGoodsService orderGoodsService; + @Resource + private ConfigProperties config; + @Resource + private RequestUtil requestUtil; + @Resource + private OrderService orderService; + @Resource + private UsersService usersService; + @Resource + private RedisUtil redisUtil; + @Resource + private GoodsService goodsService; + @Resource + private ExpressService expressService; + @Resource + private OrderDeliveryService orderDeliveryService; + @Resource + private MerchantService merchantService; + @Resource + private GoodsIncomeConfigService goodsIncomeConfigService; + @Resource + private UserBalanceLogService userBalanceLogService; + + // public static String privateKeyPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.modules/src/main/resources/cert/apiclient_key.pem"; // public static String privateCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_cert.pem"; // public static String wechatpayCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.modules/src/main/resources/cert/wechatpay_2DD5A0669263BAE55E52BF3F35BF4A4006A2DAA6.pem"; // 平台证书 - public static String privateKeyPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/apiclient_key.pem"; - public static String privateCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_cert.pem"; - public static String wechatpayCertPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/wechatpay_55729BDEC2502C301BA02CDC28E4CEE4DE4D1DB9.pem"; // 平台证书 + public static String privateKeyPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/apiclient_key.pem"; + public static String privateCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_cert.pem"; + public static String wechatpayCertPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/wechatpay_55729BDEC2502C301BA02CDC28E4CEE4DE4D1DB9.pem"; // 平台证书 - @Override - public PageResult pageRel(OrderParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); + @Override + public PageResult pageRel(OrderParam param) { + PageParam page = new PageParam<>(param); +// page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); - if (param.getSceneType() != null) { - final Set orderIds = list.stream().map(Order::getOrderId).collect(Collectors.toSet()); - if (!CollectionUtils.isEmpty(orderIds)) { - // 查询预定订单信息 - if (param.getSceneType().equals("showOrderInfo")) { - final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().in(OrderInfo::getOrderId, orderIds)); - final Map> collect = orderInfoList.stream().collect(Collectors.groupingBy(OrderInfo::getOrderId)); - list.forEach(d -> { - final DateTime date = DateUtil.date(d.getExpirationTime()); - final DateTime now = DateUtil.date(); - d.setTimestamp(date.getTime() - now.getTime()); - if (!collect.isEmpty()) { - final List orderInfos = collect.get(d.getOrderId()); - if (!CollectionUtils.isEmpty(orderInfos)) { - d.setOrderInfo(orderInfos); - } + if (param.getSceneType() != null) { + final Set orderIds = list.stream().map(Order::getOrderId).collect(Collectors.toSet()); + if (!CollectionUtils.isEmpty(orderIds)) { + // 查询预定订单信息 + if (param.getSceneType().equals("showOrderInfo")) { + final List orderInfoList = orderInfoService.list(new LambdaQueryWrapper().in(OrderInfo::getOrderId, orderIds)); + final Map> collect = orderInfoList.stream().collect(Collectors.groupingBy(OrderInfo::getOrderId)); + list.forEach(d -> { + final DateTime date = DateUtil.date(d.getExpirationTime()); + final DateTime now = DateUtil.date(); + d.setTimestamp(date.getTime() - now.getTime()); + if (!collect.isEmpty()) { + final List orderInfos = collect.get(d.getOrderId()); + if (!CollectionUtils.isEmpty(orderInfos)) { + d.setOrderInfo(orderInfos); + } + } + }); + } + // 查询商品信息 + if (param.getSceneType().equals("showOrderGoods")) { + final List goodsList = orderGoodsService.list(new LambdaQueryWrapper().in(OrderGoods::getOrderId, orderIds)); + final Map> collect = goodsList.stream().collect(Collectors.groupingBy(OrderGoods::getOrderId)); + list.forEach(d -> { + final DateTime date = DateUtil.date(d.getExpirationTime()); + final DateTime now = DateUtil.date(); + d.setTimestamp(date.getTime() - now.getTime()); + if (!collect.isEmpty()) { + final List orderGoodsList = collect.get(d.getOrderId()); + if (!CollectionUtils.isEmpty(orderGoodsList)) { + for (OrderGoods orderGoods : orderGoodsList) { + Goods goods = goodsService.getById(orderGoods.getGoodsId()); + if (param.getLoginUser() != null) { + // 经销商 + if (param.getLoginUser().getGradeId().equals(33)) { + if (goods.getDealerGift()) goods.setShowGift(true); + } + // 会员店 + if (param.getLoginUser().getGradeId().equals(31)) { + if (goods.getPriceGift()) goods.setShowGift(true); + } + } + orderGoods.setGoods(goods); + } + d.setGoodsList(orderGoodsList); + } + } + }); + } } - }); - } - // 查询商品信息 - if (param.getSceneType().equals("showOrderGoods")) { - final List goodsList = orderGoodsService.list(new LambdaQueryWrapper().in(OrderGoods::getOrderId, orderIds)); - final Map> collect = goodsList.stream().collect(Collectors.groupingBy(OrderGoods::getOrderId)); - list.forEach(d -> { - final DateTime date = DateUtil.date(d.getExpirationTime()); - final DateTime now = DateUtil.date(); - d.setTimestamp(date.getTime() - now.getTime()); - if (!collect.isEmpty()) { - final List goods = collect.get(d.getOrderId()); - if (!CollectionUtils.isEmpty(goods)) { - d.setGoodsList(goods); - } + } else { + for (Order order : list) { + if (order.getType().equals(0)) { + if (order.getDeliveryType() != null && order.getDeliveryType().equals(0)) { + OrderDelivery orderDelivery = orderDeliveryService.getByOrderId(order.getOrderId()); + if (orderDelivery != null) { + orderDelivery.setExpress(expressService.getById(orderDelivery.getExpressId())); + order.setOrderDelivery(orderDelivery); + } + } + if (order.getDeliveryType() != null && order.getDeliveryType().equals(1)) { + Merchant merchant = merchantService.getById(order.getSelfTakeMerchantId()); + order.setSelfTakeMerchant(merchant); + } + } else if (order.getType().equals(1)) { + Merchant merchant = merchantService.getById(order.getMerchantId()); + order.setMerchant(merchant); + } } - }); } - } + + return new PageResult<>(list, page.getTotal()); } - return new PageResult<>(list, page.getTotal()); - } + @Override + public List listRel(OrderParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } - @Override - public List listRel(OrderParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } + @Override + public Order getByIdRel(Integer orderId) { + OrderParam param = new OrderParam(); + param.setOrderId(orderId); + Order order = param.getOne(baseMapper.selectListRel(param)); + if (order != null) { + final List list = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, orderId)); - @Override - public Order getByIdRel(Integer orderId) { - OrderParam param = new OrderParam(); - param.setOrderId(orderId); - Order order = param.getOne(baseMapper.selectListRel(param)); - if (order != null) { - final List list = orderInfoService.list(new LambdaQueryWrapper().eq(OrderInfo::getOrderId, orderId)); - - // 订单信息 - order.setOrderInfo(list); - if (!CollectionUtils.isEmpty(list)) { - final OrderInfo orderInfo = list.get(0); - final int i = orderInfo.getDateTime().compareTo(DateUtil.today()); - } - // 订单商品 - final List orderGoods = orderGoodsService.list(new LambdaQueryWrapper().eq(OrderGoods::getOrderId, orderId)); - order.setGoodsList(orderGoods); - // 生成订单核销码 + // 订单信息 + order.setOrderInfo(list); + if (!CollectionUtils.isEmpty(list)) { + final OrderInfo orderInfo = list.get(0); + final int i = orderInfo.getDateTime().compareTo(DateUtil.today()); + } + // 订单商品 + final List orderGoodsList = orderGoodsService.list(new LambdaQueryWrapper().eq(OrderGoods::getOrderId, orderId)); + for (OrderGoods orderGoods : orderGoodsList) { + orderGoods.setGoods(goodsService.getById(orderGoods.getGoodsId())); + } + order.setGoodsList(orderGoodsList); + // 生成订单核销码 // requestUtil.setTenantId(order.getTenantId().toString()); // order.setQrcode(requestUtil.getOrderQRCodeUnlimited(order.getOrderNo())); - return order; + return order; + } + return null; } - return null; - } - /** - * 创建微信支付 - * - * @param order - * @return - */ - @Override - public HashMap createWxOrder(Order order) { - final String uploadPath = config.getUploadPath(); // 服务器本地路径 - final HashMap orderInfo = new HashMap<>(); - // 微信小程序(微信支付) - String key = "mp-weixin:".concat(order.getTenantId().toString()); - final String string = redisUtil.get(key); + /** + * 创建微信支付 + * + * @param order + * @return + */ + @Override + public HashMap createWxOrder(Order order) { + Integer payType = order.getPayType(); + if (order.getPayType().equals(PAY_TYPE_FRIEND) && order.getFriendPayType().equals(PAY_TYPE_WECHAT)) + payType = PAY_TYPE_WECHAT; + final String uploadPath = config.getUploadPath(); // 服务器本地路径 + final HashMap orderInfo = new HashMap<>(); + // 微信小程序(微信支付) + String key = "mp-weixin:".concat(order.getTenantId().toString()); + final String string = redisUtil.get(key); // System.out.println("string = " + string); - final JSONObject mpWx = JSONObject.parseObject(string); + final JSONObject mpWx = JSONObject.parseObject(string); // System.out.println("mpWx = " + mpWx); - String key2 = "Payment:".concat(order.getPayType().toString()).concat(":").concat(order.getTenantId().toString()); - final Payment payment = redisUtil.get(key2, Payment.class); + String key2 = "Payment:".concat(payType.toString()).concat(":").concat(order.getTenantId().toString()); + final Payment payment = redisUtil.get(key2, Payment.class); // System.out.println("payment = " + payment); - // 计算金额 - BigDecimal decimal = order.getTotalPrice(); - final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); - // 将 BigDecimal 转换为 Integer - Integer money = multiply.intValue(); - String privateKey = uploadPath.concat("/file").concat(payment.getApiclientKey()); // 秘钥证书 - String apiclientCert = uploadPath.concat("/file").concat(payment.getApiclientCert()); - // 开发环境配置 - if (active.equals("dev")) { - privateKey = privateKeyPath; - apiclientCert = wechatpayCertPath; - } - Config config = - new RSAConfig.Builder() - .merchantId(payment.getMchId()) - .privateKeyFromPath(privateKey) - .merchantSerialNumber(payment.getMerchantSerialNumber()) - .wechatPayCertificatesFromPath(apiclientCert) - .build(); + // 计算金额 + BigDecimal decimal = order.getTotalPrice(); + final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); + // 将 BigDecimal 转换为 Integer + Integer money = multiply.intValue(); + String privateKey = uploadPath.concat("/file").concat(payment.getApiclientKey()); // 秘钥证书 + String apiclientCert = uploadPath.concat("/file").concat(payment.getApiclientCert()); + // 开发环境配置 + if (active.equals("dev")) { + privateKey = privateKeyPath; + apiclientCert = wechatpayCertPath; + } + Config config = + new RSAConfig.Builder() + .merchantId(payment.getMchId()) + .privateKeyFromPath(privateKey) + .merchantSerialNumber(payment.getMerchantSerialNumber()) + .wechatPayCertificatesFromPath(apiclientCert) + .build(); - // 构建service - JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build(); - // 跟之前下单示例一样,填充预下单参数 - PrepayRequest request = new PrepayRequest(); - Amount amount = new Amount(); - amount.setTotal(money); - amount.setCurrency("CNY"); - request.setAmount(amount); - request.setAppid(mpWx.getString("appId")); - request.setMchid(payment.getMchId()); - request.setDescription(order.getComments()); - request.setOutTradeNo(order.getOrderNo()); - request.setAttach(order.getTenantId().toString()); - final Payer payer = new Payer(); - payer.setOpenid(order.getOpenid()); - request.setPayer(payer); - // 测试环境 - if (active.equals("dev")) { - amount.setTotal(1); - request.setAmount(amount); - request.setNotifyUrl("http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId()); // 默认回调地址 - } - // 生成环境 - if (active.equals("prod")) { - amount.setTotal(2); - request.setAmount(amount); - request.setNotifyUrl("https://server.gxwebsoft.com/api/system/wx-pay/notify/" + order.getTenantId()); // 默认回调地址 - } + // 构建service + JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build(); + // 跟之前下单示例一样,填充预下单参数 + PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(money); + amount.setCurrency("CNY"); + request.setAmount(amount); + request.setAppid(mpWx.getString("appId")); + request.setMchid(payment.getMchId()); + request.setDescription(order.getComments()); + request.setOutTradeNo(order.getOrderNo()); + request.setAttach(order.getTenantId().toString()); + final Payer payer = new Payer(); + payer.setOpenid(order.getOpenid()); + request.setPayer(payer); + // 测试环境 + if (active.equals("dev")) { + amount.setTotal(1); + request.setAmount(amount); + request.setNotifyUrl("http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId()); // 默认回调地址 + } + // 生成环境 + if (active.equals("prod")) { + amount.setTotal(2); + request.setAmount(amount); + request.setNotifyUrl("https://server.gxwebsoft.com/api/system/wx-pay/notify/" + order.getTenantId()); // 默认回调地址 + } // if (StrUtil.isNotBlank(payment.getNotifyUrl())) { - // 后台配置的回调地址 + // 后台配置的回调地址 // request.setNotifyUrl(payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString())); // } - System.out.println("request = " + request); - PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request); - orderInfo.put("provider", "wxpay"); - orderInfo.put("timeStamp", response.getTimeStamp()); - orderInfo.put("nonceStr", response.getNonceStr()); - orderInfo.put("package", response.getPackageVal()); - orderInfo.put("signType", "RSA"); - orderInfo.put("paySign", response.getPaySign()); - return orderInfo; - } - - - @Override - public Order getByOutTradeNo(String outTradeNo) { - OrderParam param = new OrderParam(); - param.setOrderNo(outTradeNo); - baseMapper.getByOutTradeNo(param); - return param.getOne(baseMapper.getByOutTradeNo(param)); - } - - @Override - public Boolean updateByOutTradeNo(Order order) { - baseMapper.updateByOutTradeNo(order); - return true; - } - - @Override - @Transactional(rollbackFor = {Exception.class}) - public Boolean payByBalance(Order order) { - final User loginUser = order.getLoginUser(); - - if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { - throw new BusinessException("余额不足"); + System.out.println("request = " + request); + PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request); + orderInfo.put("provider", "wxpay"); + orderInfo.put("timeStamp", response.getTimeStamp()); + orderInfo.put("nonceStr", response.getNonceStr()); + orderInfo.put("package", response.getPackageVal()); + orderInfo.put("signType", "RSA"); + orderInfo.put("paySign", response.getPaySign()); + return orderInfo; } - // 发起网络请求(更新余额接口) - final RequestUtil requestUtil = new RequestUtil(); - requestUtil.setAccessToken(order.getAccessToken()); - requestUtil.setTenantId(order.getTenantId().toString()); - String api = "/system/user/updateUserBalance"; // 更新余额接口 - final BigDecimal subtract = loginUser.getBalance().subtract(order.getTotalPrice()); - loginUser.setBalance(subtract); - // 累加会员积分 - String key = "SiteInfo:" + order.getTenantId(); - final String siteInfo = redisUtil.get(key); - // 从缓存读取信息 - if (StrUtil.isNotBlank(siteInfo)) { - final Website website = JSONObject.parseObject(siteInfo, Website.class); - final List fields = website.getFields(); - if (!CollectionUtils.isEmpty(fields)) { - fields.forEach(d -> { - if (d.getName().equals("integral_enabled") && d.getValue().equals("1")) { - loginUser.setPoints(loginUser.getPoints() + order.getPayPrice().intValue()); - } - }); - } + @Override + public Order getByOutTradeNo(String outTradeNo) { + OrderParam param = new OrderParam(); + param.setOrderNo(outTradeNo); + baseMapper.getByOutTradeNo(param); + return param.getOne(baseMapper.getByOutTradeNo(param)); } - final ApiResult apiResult = requestUtil.updateUserBalance(api, loginUser); - if (apiResult.getCode().equals(0)) { - // 修改订单状态 - order.setPayStatus(1); - order.setPayTime(DateUtil.date()); - order.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.YEAR, 10)); - orderService.updateById(order); - orderInfoService.update(new LambdaUpdateWrapper().eq(OrderInfo::getOrderId, order.getOrderId()).set(OrderInfo::getPayStatus, 1)); - // 发放积分 - usersService.addIntegral(order); - return true; + + @Override + public Boolean updateByOutTradeNo(Order order) { + baseMapper.updateByOutTradeNo(order); + return true; + } + + @Override + @Transactional(rollbackFor = {Exception.class}) + public Boolean payByBalance(Order order) { + final User loginUser = order.getLoginUser(); + + if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { + throw new BusinessException("余额不足"); + } + + // 发起网络请求(更新余额接口) + final RequestUtil requestUtil = new RequestUtil(); + requestUtil.setAccessToken(order.getAccessToken()); + requestUtil.setTenantId(order.getTenantId().toString()); + String api = "/system/user/updateUserBalance"; // 更新余额接口 + final BigDecimal subtract = loginUser.getBalance().subtract(order.getTotalPrice()); + + loginUser.setBalance(subtract); + // 累加会员积分 + String key = "SiteInfo:" + order.getTenantId(); + final String siteInfo = redisUtil.get(key); + // 从缓存读取信息 + if (StrUtil.isNotBlank(siteInfo)) { + final Website website = JSONObject.parseObject(siteInfo, Website.class); + final List fields = website.getFields(); + if (!CollectionUtils.isEmpty(fields)) { + fields.forEach(d -> { + if (d.getName().equals("integral_enabled") && d.getValue().equals("1")) { + loginUser.setPoints(loginUser.getPoints() + order.getPayPrice().intValue()); + } + }); + } + } + final ApiResult apiResult = requestUtil.updateUserBalance(api, loginUser); + if (apiResult.getCode().equals(0)) { + // 修改订单状态 + order.setPayStatus(1); + order.setPayTime(DateUtil.date()); + order.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.YEAR, 10)); + orderService.updateById(order); + orderInfoService.update(new LambdaUpdateWrapper().eq(OrderInfo::getOrderId, order.getOrderId()).set(OrderInfo::getPayStatus, 1)); + // 发放积分 + usersService.addIntegral(order); + return true; + } + return true; + } + + /*** + * 结算 + * @param order + */ + @Override + public void settle(String token, String tenantId, Order order) { + List orderGoodsList = orderGoodsService.listByOrderId(order.getOrderId()); + RequestUtil requestUtil = new RequestUtil(); + requestUtil.setAccessToken(token); + requestUtil.setTenantId(tenantId); + String balanceApi = "/system/user/updateUserBalance"; + if (order.getType().equals(0)) { + User parentUser = requestUtil.getParent(order.getUserId()); +// System.out.println(parentRes); + // 上级收入 + if (parentUser != null) { +// User parentUser = requestUtil.getUserByPhone(parentRes); + Merchant parentMerchant = merchantService.getByUserId(parentUser.getUserId()); + if (parentMerchant != null) { + for (OrderGoods orderGoods : orderGoodsList) { + Goods goods = orderGoods.getGoods(); + GoodsIncomeConfig goodsIncomeConfig = goodsIncomeConfigService.check(goods.getGoodsId(), orderGoods.getSkuId(), parentMerchant.getShopType()); + if (goodsIncomeConfig != null) { + BigDecimal rate = goodsIncomeConfig.getRate().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); + BigDecimal amountTotal = orderGoods.getPrice().multiply(BigDecimal.valueOf(orderGoods.getTotalNum())); + BigDecimal incomeTotal = amountTotal.multiply(rate); + BigDecimal newBalance = parentUser.getBalance().add(incomeTotal); + parentUser.setBalance(newBalance); + requestUtil.updateUserBalance(balanceApi, parentUser); + userBalanceLogService.save(new UserBalanceLog() {{ + setUserId(parentUser.getUserId()); + setScene(BalanceScene.BALANCE_SCENE_DIRECT_INCOME); + setMoney(incomeTotal); + setBalance(newBalance); + setMerchantId(parentMerchant.getMerchantId()); + setMerchantCode(parentMerchant.getMerchantCode()); + setOrderNo(order.getOrderNo()); + setTenantId(getTenantId()); + }}); + } + } + } + } + + // 供应商收入 + for (OrderGoods orderGoods : orderGoodsList) { + Goods goods = orderGoods.getGoods(); + Merchant supplier = merchantService.getById(goods.getSupplierMerchantId()); + if (supplier != null) { + User supplierUser = requestUtil.getByUserId(supplier.getUserId()); + BigDecimal incomeTotal = goods.getBuyingPrice().multiply(BigDecimal.valueOf(orderGoods.getTotalNum())); + BigDecimal newBalance = supplierUser.getBalance().add(incomeTotal); + supplierUser.setBalance(newBalance); + requestUtil.updateUserBalance(balanceApi, supplierUser); + userBalanceLogService.save(new UserBalanceLog() {{ + setUserId(supplier.getUserId()); + setScene(BalanceScene.BALANCE_SCENE_SUPPLIER); + setMoney(incomeTotal); + setBalance(newBalance); + setOrderNo(order.getOrderNo()); + setMerchantId(supplier.getMerchantId()); + setMerchantCode(supplier.getMerchantCode()); + setTenantId(getTenantId()); + }}); + } + } + // 发货门店/提货门店收入 + Merchant merchant = null; + if (order.getDeliveryType().equals(0)) merchant = merchantService.getById(order.getExpressMerchantId()); + else merchant = merchantService.getById(order.getSelfTakeMerchantId()); + if (merchant != null) { + BigDecimal diffAmountTotal = BigDecimal.ZERO; + BigDecimal buyAmountTotal = BigDecimal.ZERO; + User merchantUser = requestUtil.getByUserId(merchant.getUserId()); + for (OrderGoods orderGoods : orderGoodsList) { + Goods goods = orderGoods.getGoods(); + BigDecimal merchantAmount = BigDecimal.ZERO; + BigDecimal rate = BigDecimal.ZERO; + switch (merchant.getShopType()) { + case "会员店": { + merchantAmount = goods.getMemberStorePrice(); + rate = goods.getMemberStoreRate().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); + } + break; + case "实体连锁店": { + merchantAmount = goods.getChainStorePrice(); + rate = goods.getChainStoreRate().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); + } + break; + case "会员超市": { + merchantAmount = goods.getMemberMarketPrice(); + rate = goods.getMemberMarketRate().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); + } + break; + } + BigDecimal amountDiff = orderGoods.getPrice().subtract(merchantAmount); + buyAmountTotal = buyAmountTotal.add(merchantAmount.multiply(BigDecimal.valueOf(orderGoods.getTotalNum()))); + if (amountDiff.compareTo(BigDecimal.ZERO) > 0) { + diffAmountTotal = diffAmountTotal.add(amountDiff.multiply(BigDecimal.valueOf(orderGoods.getTotalNum()))); + diffAmountTotal = diffAmountTotal.multiply(rate); + } + } + BigDecimal incomeTotal = diffAmountTotal.add(buyAmountTotal); + BigDecimal newBalance = merchantUser.getBalance().add(incomeTotal); + merchantUser.setBalance(newBalance); + requestUtil.updateUserBalance(balanceApi, merchantUser); + Merchant finalMerchant = merchant; + userBalanceLogService.save(new UserBalanceLog() {{ + setUserId(merchantUser.getUserId()); + setScene(BalanceScene.BALANCE_SCENE_DIFF); + setMoney(incomeTotal); + setBalance(newBalance); + setOrderNo(order.getOrderNo()); + setMerchantId(finalMerchant.getMerchantId()); + setMerchantCode(finalMerchant.getMerchantCode()); + setTenantId(getTenantId()); + }}); + } + } else if (order.getPayType().equals(1)) { + // 外卖 + Merchant merchant = merchantService.getById(order.getMerchantId()); + User merchantUser = requestUtil.getByUserId(merchant.getUserId()); + + BigDecimal rate = BigDecimal.ONE.subtract(merchant.getCommission().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)); + BigDecimal amountTotal = order.getTotalPrice(); + BigDecimal incomeTotal = amountTotal.multiply(rate); + BigDecimal newBalance = merchantUser.getBalance().add(incomeTotal); + merchantUser.setBalance(newBalance); + requestUtil.updateUserBalance(balanceApi, merchantUser); + userBalanceLogService.save(new UserBalanceLog() {{ + setUserId(merchantUser.getUserId()); + setScene(BalanceScene.BALANCE_SCENE_OUT_TAKE); + setMoney(incomeTotal); + setBalance(newBalance); + setMerchantId(merchant.getMerchantId()); + setMerchantCode(merchant.getMerchantCode()); + setOrderNo(order.getOrderNo()); + setTenantId(getTenantId()); + }}); + + } } - return true; - } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/SplashServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/SplashServiceImpl.java new file mode 100644 index 0000000..30274d0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/SplashServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.mapper.SplashMapper; +import com.gxwebsoft.shop.service.SplashService; +import com.gxwebsoft.shop.entity.Splash; +import com.gxwebsoft.shop.param.SplashParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 开屏广告Service实现 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Service +public class SplashServiceImpl extends ServiceImpl implements SplashService { + + @Override + public PageResult pageRel(SplashParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(SplashParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public Splash getByIdRel(Integer id) { + SplashParam param = new SplashParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/SwiperServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/SwiperServiceImpl.java new file mode 100644 index 0000000..ce3b7e1 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/SwiperServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.mapper.SwiperMapper; +import com.gxwebsoft.shop.service.SwiperService; +import com.gxwebsoft.shop.entity.Swiper; +import com.gxwebsoft.shop.param.SwiperParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 轮播图Service实现 + * + * @author 科技小王子 + * @since 2024-09-30 22:07:41 + */ +@Service +public class SwiperServiceImpl extends ServiceImpl implements SwiperService { + + @Override + public PageResult pageRel(SwiperParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(SwiperParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public Swiper getByIdRel(Integer id) { + SwiperParam param = new SwiperParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/UserAddressServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/UserAddressServiceImpl.java index 3ba085a..309f053 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/UserAddressServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/UserAddressServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.shop.service.impl; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.shop.mapper.UserAddressMapper; import com.gxwebsoft.shop.service.UserAddressService; @@ -10,7 +11,6 @@ import com.gxwebsoft.common.core.web.PageResult; import org.springframework.stereotype.Service; import java.util.List; -import java.util.stream.Collectors; /** * 收货地址Service实现 @@ -24,7 +24,7 @@ public class UserAddressServiceImpl extends ServiceImpl pageRel(UserAddressParam param) { PageParam page = new PageParam<>(param); - page.setDefaultOrder("is_default desc"); + page.setDefaultOrder("is_default desc, id desc"); List list = baseMapper.selectPageRel(page, param); return new PageResult<>(list, page.getTotal()); } @@ -34,7 +34,7 @@ public class UserAddressServiceImpl extends ServiceImpl list = baseMapper.selectListRel(param); // 排序 PageParam page = new PageParam<>(); - page.setDefaultOrder("is_default desc"); + page.setDefaultOrder("is_default desc, id desc"); return page.sortRecords(list); } @@ -45,4 +45,13 @@ public class UserAddressServiceImpl extends ServiceImpl() + .eq(UserAddress::getUserId, userId) + .eq(UserAddress::getIsDefault, 1) + .set(UserAddress::getIsDefault, 0) + ); + } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/UserCollectionServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/UserCollectionServiceImpl.java index b65ad72..a42cef1 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/UserCollectionServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/UserCollectionServiceImpl.java @@ -1,7 +1,12 @@ package com.gxwebsoft.shop.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.entity.Merchant; import com.gxwebsoft.shop.mapper.UserCollectionMapper; +import com.gxwebsoft.shop.service.MerchantService; +import com.gxwebsoft.shop.service.OrderGoodsService; +import com.gxwebsoft.shop.service.OrderService; import com.gxwebsoft.shop.service.UserCollectionService; import com.gxwebsoft.shop.entity.UserCollection; import com.gxwebsoft.shop.param.UserCollectionParam; @@ -9,16 +14,21 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; /** * 我的收藏Service实现 * * @author 科技小王子 - * @since 2024-04-28 18:17:37 + * @since 2024-10-03 01:51:46 */ @Service public class UserCollectionServiceImpl extends ServiceImpl implements UserCollectionService { + @Resource + private MerchantService merchantService; + @Resource + private OrderGoodsService orderGoodsService; @Override public PageResult pageRel(UserCollectionParam param) { @@ -30,11 +40,20 @@ public class UserCollectionServiceImpl extends ServiceImpl listRel(UserCollectionParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); + List list = list( + new LambdaQueryWrapper() + .eq(UserCollection::getUserId, param.getUserId()) + .eq(UserCollection::getType, param.getType()) + .orderByDesc(UserCollection::getCreateTime) + ); + for (UserCollection userCollection : list) { + if (userCollection.getType().equals(0)) { + Merchant merchant = merchantService.getById(userCollection.getTid()); + merchant.setOrderNum(orderGoodsService.countByMerchant(merchant.getMerchantId())); + userCollection.setMerchant(merchant); + } + } + return list; } @Override @@ -44,4 +63,13 @@ public class UserCollectionServiceImpl extends ServiceImpl carts; + @Data public static class Payload { private Integer shopId; private Integer shopName; + private Merchant merchant; private List carts; } } diff --git a/src/main/resources/account.properties b/src/main/resources/account.properties new file mode 100644 index 0000000..dbb7ff9 --- /dev/null +++ b/src/main/resources/account.properties @@ -0,0 +1,9 @@ +key = QIfOPROg5054 +#customer = +secret = 09401b3c56f54175bcacc74d0519e4ef +#userid = + +#??????100??????????????????????????????true:?? false: ?? ? +log.return.record = true +#????????????????? +logPath = /Users/liangxin/Project/JAVA/nbg-java \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index f5538db..c0943eb 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -22,4 +22,5 @@ socketio: config: # 开发环境接口 server-url: http://127.0.0.1:9091/api - upload-path: /Users/gxwebsoft/Documents/uploads/ # window(D:\Temp) + upload-path: /Users/liangxin/Project/JAVA/nbg-java/file/ + local-upload-path: /Users/liangxin/Project/JAVA/nbg-java/file/ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bbaa999..8af862f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,7 +4,8 @@ server: # 多环境配置 spring: profiles: - active: dev +# active: dev + active: prod application: name: server @@ -89,8 +90,8 @@ config: server-url: https://server.gxwebsoft.com/api # 文件服务器 file-server: https://file.gxwebsoft.com - upload-path: /Users/gxwebsoft/Documents/uploads/ - local-upload-path: /Users/gxwebsoft/Documents/uploads/ +# upload-path: /Users/gxwebsoft/Documents/uploads/ +# local-upload-path: /Users/gxwebsoft/Documents/uploads/ # 阿里云OSS云存储 endpoint: https://oss-cn-shenzhen.aliyuncs.com @@ -100,4 +101,10 @@ config: bucketDomain: https://oss.wsdns.cn aliyunDomain: https://oss-gxwebsoft.oss-cn-shenzhen.aliyuncs.com +wx: + miniapp: + configs: + - appid: wx309c034f7556aeb1 + secret: c8fa9e5ee2edc8c0bbd5f9c38df244ec + msgDataFormat: JSON diff --git a/src/test/java/com/gxwebsoft/generator/CmsGenerator.java b/src/test/java/com/gxwebsoft/generator/CmsGenerator.java index 4fc9b70..970d5cc 100644 --- a/src/test/java/com/gxwebsoft/generator/CmsGenerator.java +++ b/src/test/java/com/gxwebsoft/generator/CmsGenerator.java @@ -21,32 +21,32 @@ import java.util.Map; * @since 2021-09-05 00:31:14 */ public class CmsGenerator { - // 输出位置 - private static final String OUTPUT_LOCATION = System.getProperty("user.dir"); - //private static final String OUTPUT_LOCATION = "D:/codegen"; // 不想生成到项目中可以写磁盘路径 - // 输出目录 - private static final String OUTPUT_DIR = "/src/main/java"; - // Vue文件输出位置 - private static final String OUTPUT_LOCATION_VUE = "/Users/gxwebsoft/VUE/gxtyzx-admin-vue"; - // Vue文件输出目录 - private static final String OUTPUT_LOCATION_UNIAPP = "/Users/gxwebsoft/VUE/nbg"; - // Vue文件输出目录 - private static final String OUTPUT_DIR_VUE = "/src"; - // 作者名称 - private static final String AUTHOR = "科技小王子"; - // 是否在xml中添加二级缓存配置 - private static final boolean ENABLE_CACHE = false; - // 数据库连接配置 - private static final String DB_URL = "jdbc:mysql://47.119.165.234:3308/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8"; - private static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; - private static final String DB_USERNAME = "modules"; - private static final String DB_PASSWORD = "8YdLnk7KsPAyDXGA"; - // 包名 - private static final String PACKAGE_NAME = "com.gxwebsoft"; - // 模块名 - private static final String MODULE_NAME = "cms"; - // 需要生成的表 - private static final String[] TABLE_NAMES = new String[]{ + // 输出位置 + private static final String OUTPUT_LOCATION = System.getProperty("user.dir"); + //private static final String OUTPUT_LOCATION = "D:/codegen"; // 不想生成到项目中可以写磁盘路径 + // 输出目录 + private static final String OUTPUT_DIR = "/src/main/java"; + // Vue文件输出位置 + private static final String OUTPUT_LOCATION_VUE = "/Users/liangxin/Project/Html/web/nbg-admin"; + // Vue文件输出目录 + private static final String OUTPUT_LOCATION_UNIAPP = "/Users/liangxin/Project/Html/miniProgram/nbg-uniapp"; + // Vue文件输出目录 + private static final String OUTPUT_DIR_VUE = "/src"; + // 作者名称 + private static final String AUTHOR = "科技小王子"; + // 是否在xml中添加二级缓存配置 + private static final boolean ENABLE_CACHE = false; + // 数据库连接配置 + private static final String DB_URL = "jdbc:mysql://47.119.165.234:3308/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8"; + private static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver"; + private static final String DB_USERNAME = "modules"; + private static final String DB_PASSWORD = "8YdLnk7KsPAyDXGA"; + // 包名 + private static final String PACKAGE_NAME = "com.gxwebsoft"; + // 模块名 + private static final String MODULE_NAME = "cms"; + // 需要生成的表 + private static final String[] TABLE_NAMES = new String[]{ // "cms_article", // "cms_article_category", // "cms_article_like", @@ -71,200 +71,201 @@ public class CmsGenerator { // "cms_mp_field" // "cms_mp_ad" // "cms_components" - "cms_mp_official_menu" + "cms_design_collect", + "cms_design_sign_up" - }; - // 需要去除的表前缀 - private static final String[] TABLE_PREFIX = new String[]{ - "cms_", - "tb_" - }; - // 不需要作为查询参数的字段 - private static final String[] PARAM_EXCLUDE_FIELDS = new String[]{ - "tenant_id", - "create_time", - "update_time" - }; - // 查询参数使用String的类型 - private static final String[] PARAM_TO_STRING_TYPE = new String[]{ - "Date", - "LocalDate", - "LocalTime", - "LocalDateTime" - }; - // 查询参数使用EQ的类型 - private static final String[] PARAM_EQ_TYPE = new String[]{ - "Integer", - "Boolean", - "BigDecimal" - }; - // 是否添加权限注解 - private static final boolean AUTH_ANNOTATION = false; - // 是否添加日志注解 - private static final boolean LOG_ANNOTATION = false; - // controller的mapping前缀 - private static final String CONTROLLER_MAPPING_PREFIX = "/api"; - // 模板所在位置 - private static final String TEMPLATES_DIR = "/src/test/java/com/gxwebsoft/generator/templates"; - - public static void main(String[] args) { - // 代码生成器 - AutoGenerator mpg = new AutoGenerator(); - - // 全局配置 - GlobalConfig gc = new GlobalConfig(); - gc.setOutputDir(OUTPUT_LOCATION + OUTPUT_DIR); - gc.setAuthor(AUTHOR); - gc.setOpen(false); - gc.setFileOverride(true); - gc.setEnableCache(ENABLE_CACHE); - gc.setSwagger2(true); - gc.setIdType(IdType.AUTO); - gc.setServiceName("%sService"); - mpg.setGlobalConfig(gc); - - // 数据源配置 - DataSourceConfig dsc = new DataSourceConfig(); - dsc.setUrl(DB_URL); - // dsc.setSchemaName("public"); - dsc.setDriverName(DB_DRIVER); - dsc.setUsername(DB_USERNAME); - dsc.setPassword(DB_PASSWORD); - mpg.setDataSource(dsc); - - // 包配置 - PackageConfig pc = new PackageConfig(); - pc.setModuleName(MODULE_NAME); - pc.setParent(PACKAGE_NAME); - mpg.setPackageInfo(pc); - - // 策略配置 - StrategyConfig strategy = new StrategyConfig(); - strategy.setNaming(NamingStrategy.underline_to_camel); - strategy.setColumnNaming(NamingStrategy.underline_to_camel); - strategy.setInclude(TABLE_NAMES); - strategy.setTablePrefix(TABLE_PREFIX); - strategy.setSuperControllerClass(PACKAGE_NAME + ".common.core.web.BaseController"); - strategy.setEntityLombokModel(true); - strategy.setRestControllerStyle(true); - strategy.setControllerMappingHyphenStyle(true); - strategy.setLogicDeleteFieldName("deleted"); - mpg.setStrategy(strategy); - - // 模板配置 - TemplateConfig templateConfig = new TemplateConfig(); - templateConfig.setController(TEMPLATES_DIR + "/controller.java"); - templateConfig.setEntity(TEMPLATES_DIR + "/entity.java"); - templateConfig.setMapper(TEMPLATES_DIR + "/mapper.java"); - templateConfig.setXml(TEMPLATES_DIR + "/mapper.xml"); - templateConfig.setService(TEMPLATES_DIR + "/service.java"); - templateConfig.setServiceImpl(TEMPLATES_DIR + "/serviceImpl.java"); - mpg.setTemplate(templateConfig); - mpg.setTemplateEngine(new BeetlTemplateEnginePlus()); - - // 自定义模板配置 - InjectionConfig cfg = new InjectionConfig() { - @Override - public void initMap() { - Map map = new HashMap<>(); - map.put("packageName", PACKAGE_NAME); - map.put("paramExcludeFields", PARAM_EXCLUDE_FIELDS); - map.put("paramToStringType", PARAM_TO_STRING_TYPE); - map.put("paramEqType", PARAM_EQ_TYPE); - map.put("authAnnotation", AUTH_ANNOTATION); - map.put("logAnnotation", LOG_ANNOTATION); - map.put("controllerMappingPrefix", CONTROLLER_MAPPING_PREFIX); - this.setMap(map); - } }; - String templatePath = TEMPLATES_DIR + "/param.java.btl"; - List focList = new ArrayList<>(); - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION + OUTPUT_DIR + "/" - + PACKAGE_NAME.replace(".", "/") - + "/" + pc.getModuleName() + "/param/" - + tableInfo.getEntityName() + "Param" + StringPool.DOT_JAVA; - } - }); - /** - * 以下是生成VUE项目代码 - * 生成文件的路径 /api/shop/goods/index.ts - */ - templatePath = TEMPLATES_DIR + "/index.ts.btl"; + // 需要去除的表前缀 + private static final String[] TABLE_PREFIX = new String[]{ + "cms_", + "tb_" + }; + // 不需要作为查询参数的字段 + private static final String[] PARAM_EXCLUDE_FIELDS = new String[]{ + "tenant_id", + "create_time", + "update_time" + }; + // 查询参数使用String的类型 + private static final String[] PARAM_TO_STRING_TYPE = new String[]{ + "Date", + "LocalDate", + "LocalTime", + "LocalDateTime" + }; + // 查询参数使用EQ的类型 + private static final String[] PARAM_EQ_TYPE = new String[]{ + "Integer", + "Boolean", + "BigDecimal" + }; + // 是否添加权限注解 + private static final boolean AUTH_ANNOTATION = false; + // 是否添加日志注解 + private static final boolean LOG_ANNOTATION = false; + // controller的mapping前缀 + private static final String CONTROLLER_MAPPING_PREFIX = "/api"; + // 模板所在位置 + private static final String TEMPLATES_DIR = "/src/test/java/com/gxwebsoft/generator/templates"; - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE - + "/api/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/" + "index.ts"; - } - }); - focList.add(new FileOutConfig() { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_UNIAPP + OUTPUT_DIR_VUE - + "/api/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/" + "index.ts"; - } - }); - // 生成TS文件 (/api/shop/goods/model/index.ts) - templatePath = TEMPLATES_DIR + "/model.ts.btl"; - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE - + "/api/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/model/" + "index.ts"; - } - }); - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_UNIAPP + OUTPUT_DIR_VUE - + "/api/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/model/" + "index.ts"; - } - }); - // 生成Vue文件(/views/shop/goods/index.vue) - templatePath = TEMPLATES_DIR + "/index.vue.btl"; - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE - + "/views/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/" + "index.vue"; - } - }); + public static void main(String[] args) { + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); - // 生成components文件(/views/shop/goods/components/edit.vue) - templatePath = TEMPLATES_DIR + "/components.edit.vue.btl"; - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE - + "/views/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/components/" + tableInfo.getEntityPath() + "Edit.vue"; - } - }); + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + gc.setOutputDir(OUTPUT_LOCATION + OUTPUT_DIR); + gc.setAuthor(AUTHOR); + gc.setOpen(false); + gc.setFileOverride(true); + gc.setEnableCache(ENABLE_CACHE); + gc.setSwagger2(true); + gc.setIdType(IdType.AUTO); + gc.setServiceName("%sService"); + mpg.setGlobalConfig(gc); - // 生成components文件(/views/shop/goods/components/search.vue) - templatePath = TEMPLATES_DIR + "/components.search.vue.btl"; - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE - + "/views/" + pc.getModuleName() + "/" - + tableInfo.getEntityPath() + "/components/" + "search.vue"; - } - }); + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl(DB_URL); + // dsc.setSchemaName("public"); + dsc.setDriverName(DB_DRIVER); + dsc.setUsername(DB_USERNAME); + dsc.setPassword(DB_PASSWORD); + mpg.setDataSource(dsc); - cfg.setFileOutConfigList(focList); - mpg.setCfg(cfg); + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setModuleName(MODULE_NAME); + pc.setParent(PACKAGE_NAME); + mpg.setPackageInfo(pc); - mpg.execute(); - } + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setInclude(TABLE_NAMES); + strategy.setTablePrefix(TABLE_PREFIX); + strategy.setSuperControllerClass(PACKAGE_NAME + ".common.core.web.BaseController"); + strategy.setEntityLombokModel(true); + strategy.setRestControllerStyle(true); + strategy.setControllerMappingHyphenStyle(true); + strategy.setLogicDeleteFieldName("deleted"); + mpg.setStrategy(strategy); + + // 模板配置 + TemplateConfig templateConfig = new TemplateConfig(); + templateConfig.setController(TEMPLATES_DIR + "/controller.java"); + templateConfig.setEntity(TEMPLATES_DIR + "/entity.java"); + templateConfig.setMapper(TEMPLATES_DIR + "/mapper.java"); + templateConfig.setXml(TEMPLATES_DIR + "/mapper.xml"); + templateConfig.setService(TEMPLATES_DIR + "/service.java"); + templateConfig.setServiceImpl(TEMPLATES_DIR + "/serviceImpl.java"); + mpg.setTemplate(templateConfig); + mpg.setTemplateEngine(new BeetlTemplateEnginePlus()); + + // 自定义模板配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + Map map = new HashMap<>(); + map.put("packageName", PACKAGE_NAME); + map.put("paramExcludeFields", PARAM_EXCLUDE_FIELDS); + map.put("paramToStringType", PARAM_TO_STRING_TYPE); + map.put("paramEqType", PARAM_EQ_TYPE); + map.put("authAnnotation", AUTH_ANNOTATION); + map.put("logAnnotation", LOG_ANNOTATION); + map.put("controllerMappingPrefix", CONTROLLER_MAPPING_PREFIX); + this.setMap(map); + } + }; + String templatePath = TEMPLATES_DIR + "/param.java.btl"; + List focList = new ArrayList<>(); + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION + OUTPUT_DIR + "/" + + PACKAGE_NAME.replace(".", "/") + + "/" + pc.getModuleName() + "/param/" + + tableInfo.getEntityName() + "Param" + StringPool.DOT_JAVA; + } + }); + /** + * 以下是生成VUE项目代码 + * 生成文件的路径 /api/shop/goods/index.ts + */ + templatePath = TEMPLATES_DIR + "/index.ts.btl"; + + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE + + "/api/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/" + "index.ts"; + } + }); + focList.add(new FileOutConfig() { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_UNIAPP + OUTPUT_DIR_VUE + + "/api/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/" + "index.ts"; + } + }); + // 生成TS文件 (/api/shop/goods/model/index.ts) + templatePath = TEMPLATES_DIR + "/model.ts.btl"; + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE + + "/api/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/model/" + "index.ts"; + } + }); + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_UNIAPP + OUTPUT_DIR_VUE + + "/api/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/model/" + "index.ts"; + } + }); + // 生成Vue文件(/views/shop/goods/index.vue) + templatePath = TEMPLATES_DIR + "/index.vue.btl"; + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE + + "/views/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/" + "index.vue"; + } + }); + + // 生成components文件(/views/shop/goods/components/edit.vue) + templatePath = TEMPLATES_DIR + "/components.edit.vue.btl"; + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE + + "/views/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/components/" + tableInfo.getEntityPath() + "Edit.vue"; + } + }); + + // 生成components文件(/views/shop/goods/components/search.vue) + templatePath = TEMPLATES_DIR + "/components.search.vue.btl"; + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + return OUTPUT_LOCATION_VUE + OUTPUT_DIR_VUE + + "/views/" + pc.getModuleName() + "/" + + tableInfo.getEntityPath() + "/components/" + "search.vue"; + } + }); + + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + mpg.execute(); + } } diff --git a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java index f76616b..412e8e1 100644 --- a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java +++ b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java @@ -92,7 +92,8 @@ public class ShopGenerator { // "shop_order_delivery", // "shop_order_delivery_goods", // "shop_order_extract" - "shop_merchant_category" +// "shop_splash", + "shop_goods_income_config", }; // 需要去除的表前缀 private static final String[] TABLE_PREFIX = new String[]{