From 314fffde91b05e25ebd7b02b53c2c3e74ecff3a4 Mon Sep 17 00:00:00 2001 From: Y1NanPing <735289578@qq.com> Date: Mon, 4 Aug 2025 17:13:18 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC14=E5=A4=A9=20=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E5=92=8C=E5=B7=A5=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/atguigu/tingshu/vo/order/TradeVo.java | 3 + .../tingshu/account/AccountFeignClient.java | 13 +- .../impl/AccountDegradeFeignClient.java | 9 + .../tingshu/account/AccountFeignClient.class | Bin 347 -> 753 bytes .../impl/AccountDegradeFeignClient.class | Bin 505 -> 1108 bytes .../tingshu/album/AlbumFeignClient.java | 2 + .../album/impl/AlbumDegradeFeignClient.java | 6 + .../tingshu/album/AlbumFeignClient.class | Bin 1822 -> 2437 bytes .../album/impl/AlbumDegradeFeignClient.class | Bin 2981 -> 3279 bytes .../tingshu/user/client/UserFeignClient.java | 3 + .../client/impl/UserDegradeFeignClient.java | 7 + .../tingshu/user/client/UserFeignClient.class | Bin 1349 -> 2222 bytes .../client/impl/UserDegradeFeignClient.class | Bin 2583 -> 2930 bytes .../account/api/UserAccountApiController.java | 19 +- .../account/mapper/UserAccountMapper.java | 3 + .../account/service/UserAccountService.java | 4 + .../service/impl/UserAccountServiceImpl.java | 30 ++ .../resources/mapper/UserAccountMapper.xml | 5 + .../api/UserAccountApiController.class | Bin 792 -> 2348 bytes .../account/mapper/UserAccountMapper.class | Bin 425 -> 592 bytes .../account/service/UserAccountService.class | Bin 676 -> 867 bytes .../service/impl/UserAccountServiceImpl.class | Bin 3461 -> 7049 bytes .../classes/mapper/UserAccountMapper.xml | 5 + .../tingshu/album/task/ReviewTask.java | 47 +-- .../album/service/TrackInfoService.class | Bin 1953 -> 2429 bytes .../tingshu/album/task/ReviewTask.class | Bin 5261 -> 5362 bytes service/service-order/pom.xml | 16 + .../order/api/OrderInfoApiController.java | 17 + .../order/pattern/TradeTypeStrategy.java | 10 + .../factory/TradeTypeStrategyFactory.java | 28 ++ .../order/pattern/impl/AlbumTradeType.java | 150 +++++++++ .../order/pattern/impl/TrackTradeType.java | 116 +++++++ .../order/pattern/impl/VIPTradeType.java | 119 +++++++ .../order/service/OrderDerateService.java | 7 + .../order/service/OrderDetailService.java | 7 + .../order/service/OrderInfoService.java | 6 + .../service/impl/OrderDerateServiceImpl.java | 17 + .../service/impl/OrderDetailServiceImpl.java | 13 + .../service/impl/OrderInfoServiceImpl.java | 316 +++++++++--------- .../order/api/OrderInfoApiController.class | Bin 768 -> 2754 bytes .../order/service/OrderInfoService.class | Bin 345 -> 893 bytes .../service/impl/OrderInfoServiceImpl.class | Bin 9069 -> 13230 bytes .../user/api/UserInfoApiController.java | 15 +- .../user/pattern/DeliveryStrategy.java | 12 + .../factory/DeliveryStrategyFactory.java | 29 ++ .../user/pattern/impl/AlbumDelivery.java | 39 +++ .../user/pattern/impl/TrackDelivery.java | 52 +++ .../user/pattern/impl/VIPDelivery.java | 83 +++++ .../tingshu/user/service/UserInfoService.java | 4 + .../service/impl/UserInfoServiceImpl.java | 32 +- .../user/api/UserInfoApiController.class | Bin 3848 -> 4402 bytes .../user/service/UserInfoService.class | Bin 1016 -> 1395 bytes .../service/impl/UserInfoServiceImpl.class | Bin 13263 -> 14262 bytes 53 files changed, 1061 insertions(+), 183 deletions(-) create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/TradeTypeStrategy.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/factory/TradeTypeStrategyFactory.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/AlbumTradeType.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/TrackTradeType.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/VIPTradeType.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDerateService.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDetailService.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDerateServiceImpl.java create mode 100644 service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDetailServiceImpl.java create mode 100644 service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/DeliveryStrategy.java create mode 100644 service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/factory/DeliveryStrategyFactory.java create mode 100644 service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/AlbumDelivery.java create mode 100644 service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/TrackDelivery.java create mode 100644 service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/VIPDelivery.java diff --git a/model/src/main/java/com/atguigu/tingshu/vo/order/TradeVo.java b/model/src/main/java/com/atguigu/tingshu/vo/order/TradeVo.java index 24543f1..0cc46bf 100644 --- a/model/src/main/java/com/atguigu/tingshu/vo/order/TradeVo.java +++ b/model/src/main/java/com/atguigu/tingshu/vo/order/TradeVo.java @@ -4,9 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Positive; import lombok.Data; +import org.springframework.stereotype.Component; @Data @Schema(description = "订单确认对象") + +@Component public class TradeVo { @NotEmpty(message = "付款项目类型不能为空") diff --git a/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/AccountFeignClient.java b/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/AccountFeignClient.java index 68c1f42..94ee3e3 100644 --- a/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/AccountFeignClient.java +++ b/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/AccountFeignClient.java @@ -1,7 +1,11 @@ package com.atguigu.tingshu.account; import com.atguigu.tingshu.account.impl.AccountDegradeFeignClient; +import com.atguigu.tingshu.common.result.Result; +import com.atguigu.tingshu.vo.account.AccountDeductVo; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; /** *

@@ -10,7 +14,14 @@ import org.springframework.cloud.openfeign.FeignClient; * * @author atguigu */ -@FeignClient(value = "service-account", fallback = AccountDegradeFeignClient.class) +@FeignClient(value = "service-account", path = "api/account", fallback = AccountDegradeFeignClient.class) public interface AccountFeignClient { + /** + * 检查扣减账户余额 + * @param accountDeductVo + * @return + */ + @PostMapping("/userAccount/checkAndDeduct") + public Result checkAndDeduct(@RequestBody AccountDeductVo accountDeductVo); } diff --git a/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.java b/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.java index 2c7217f..13e5d93 100644 --- a/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.java +++ b/service-client/service-account-client/src/main/java/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.java @@ -2,9 +2,18 @@ package com.atguigu.tingshu.account.impl; import com.atguigu.tingshu.account.AccountFeignClient; +import com.atguigu.tingshu.common.result.Result; +import com.atguigu.tingshu.vo.account.AccountDeductVo; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Component +@Slf4j public class AccountDegradeFeignClient implements AccountFeignClient { + @Override + public Result checkAndDeduct(AccountDeductVo accountDeductVo) { + log.error("[账户服务]checkAndDeduct服务调用失败"); + return null; + } } diff --git a/service-client/service-account-client/target/classes/com/atguigu/tingshu/account/AccountFeignClient.class b/service-client/service-account-client/target/classes/com/atguigu/tingshu/account/AccountFeignClient.class index 887c9e00a41bb0f0a25da975baf92b41ff57ebf7..73b23f27521141f4eac236c36eb42e1dd69a4325 100644 GIT binary patch literal 753 zcmbVKJx?1!5S;~#2_`llAt*{m1w|O8paKd5q5=gu5>3+V?Tyci_jWJ)VZ>jf;0N%d z5Oc;xe7H)nH@BlVZ{F;ihsV2n062oJCd>)gQ?5iAi=>N$QQIO65=y09vJtz_@r-m~ zPmCrTo3J2Y^;(W38fgpsm0gpH0@`XoYS^{;Ddnk7{M|X9#XNHF$)5|Z+`;b50wyV) zMNc7_h`n(*UM5asZ#^DDmvp6r&J1;}bx}s`ETi|&oi8v{ zo=5K2Bsb0v@rE+Yw9QezVDZw0cp9^l@ev$c~5_l6F!>Pr9s delta 95 zcmey!dYeh$)W2Q(7#J9A8F<+lm>3!KCI>RfOw`eue27tf;%k}7FBwe)S<4c0N>dpb w_={7E$}*EvbthXh#V9f`Ffp(KbuuxqF|Y$^0R~0}4j_-Sn1PFdJDGt80N{fZGynhq diff --git a/service-client/service-account-client/target/classes/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.class b/service-client/service-account-client/target/classes/com/atguigu/tingshu/account/impl/AccountDegradeFeignClient.class index dd71bc7f4837f925b751ed33246354858db0ff85..a6bf8ae5cd2060a592f6e8969f56057d3ac458b4 100644 GIT binary patch literal 1108 zcmaJ=&rcIU6#k~AY+EWns(_%PsA!9Z_29{(2`S-Je*{b~>S5Rp+kxGkW_A|C*^4pp z=Fy9Z8jqkPs0aT5{|}JA!uYn^R6){1XZF3m`QG=w_ukLn-+utOi<^0*khaiQKnDE` z!|QyL+a3>G`{C-ka12BLybPqd$B-_S>p5hRvyd-f00o9Sj`D48+(^2SZDinv&B*4C zqoTmr(r~g|o2`G!{i8a!lep+By^F@|vqXA79XB*Xae_e{&(>NE81jEEK4X*S>U51jxT?hhY zxREL#(AlK3t$1M8;#|*_-mpW;D3sZ13A?KNmI`RJE10G=NrB-U{U+m8p=C?cH|-dm z7s#^dW^`v}_rP}OBZVnC3HHHykGGC*vvcbQGMDFC@*_A5rez>3+Cc627}1_-Z2 MRtjazcDy%$KQe(VtN;K2 delta 119 zcmcb@@spYB)W2Q(7#J9A8AK*>>9esja4<4hO}@ow#mvsYHMxLs`Q%qj6{746Obm<+ zoIrJqK*-9#1|+#B*E5S5^8m#_JO&0123{b^17@=_@G> findWaitBuyTrackList(@PathVariable Long trackId, @PathVariable Integer trackCount); + @GetMapping("/trackInfo/getTrackInfo/{id}") + public Result getTrackInfo(@PathVariable Long id); } diff --git a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java index 4a5c3ec..16ebc29 100644 --- a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java +++ b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java @@ -52,4 +52,10 @@ public class AlbumDegradeFeignClient implements AlbumFeignClient { return null; } + @Override + public Result getTrackInfo(Long id) { + log.error("[专辑服务]提供远程调用方法getTrackInfo执行服务降级"); + return null; + } + } diff --git a/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class b/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class index b4bb2b8ddf3ff35ac5650ba42aecbfecd91a538f..f2805654ead65887ab79b9c067d6bedc200cfee8 100644 GIT binary patch delta 489 zcmbQo*DB0)>ff$?3=9mm3`QHd_*iX4(lYZ>!V@z~oJuQ0iV~BveKLzn7#aLEe6kYD z67_Qu^V0Qw^7GQIk@%i@C8_DDMb?^=85u<<2QY~^STi!Pmwsc5X6d9Bl zSQyxWA;`(ZpbVr`KujQJVo+t^2GV>CKzo6hH=2R5m_dz!A1KDl1QZYeGQcFz6m-iShzS~4Owa_Iz|IKNs{t~Ci9riYYJ=5^0)=%Lm>GDB8FU%+k{R?F42l^H E0Zy@TS^xk5 delta 68 zcmZn_p2x>^>ff$?3=9mm44NCc_*f_ZWjn*jy7?5l2%{MWgj<74;~k)q1~QvG4(iU?Cw92|H`c=B_Qp)??uj z@c}G|58!jyiT~WGx{G!eGjnFn`Tgh2IaduIA@l9$`4vDO>$m2W>d_G?T=r<2$J;vx zh4-M}L@U~SXt&UTPWwgO@WvG+>`!mqeY>Yl^IQA7Cyw*d;ogzm=iRd7x@D*Ji}M&1 zG@=?7=?3>2syKJi>f@?#)e;X-Zn;sB;4H3zT6A-^qyu`;OG`nLK^`Y~mfouHxPvd? ze?pB4<%YIon9f~2Ok{%&C@7taAOY^j0D*%H(G(g$%84H0;jmP(&y4V*c#)(vac!;u zOS@s|5^RL9(IV{22%rDMqJ*_pfMwjUObM1HY^;3#q4N31C=z#xBrR9|Ik!r#q>`t~ zI41aAUG}vZPW?Z*m$alqlU4bH$$y(<+!Urob?k4`oob44Lrz?Tx8mz%HN|emd4$-_ zVvd@k9EQqc@Zhf`^F%L{PrRjk;u)N>@~+I?niUGa2pvnM-i%UH3?raFB6<&>=udV$ TXW5@MeC;wV6)RXRo~{AEdvZtX delta 680 zcmZ{iOH#r>5QhI541pw;7KKngC;=ZJ3O+zl6rZT*iiO9pyn;&)kTb9sS@9aTRSMe1svq3LQ@BnP`mDnPzI)F8u%>4*9OW52$u$l?0 zg|KbHb^;jhTEwfYyeHU+^eZML#G@7+iR37fH$*CC%5_tv9;)n8Wp9wO?VA5zAgyT7 zOjyH&HA2`vVF&D^WHE2uOm&o6nXrn61;ro2g1Q|t?g+=a3Gc31w<_amIxfqvs`NqA z)b2zlp?0S@qo!&{T=E*c7`CLv@i-5MBS#_i#1pX>%=cld0TIT4OptSt;HAVR+O%qJ Gu7E$GU@`~* diff --git a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java index b48302f..ce1cb4e 100644 --- a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java +++ b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java @@ -4,6 +4,7 @@ import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.user.VipServiceConfig; import com.atguigu.tingshu.user.client.impl.UserDegradeFeignClient; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -46,5 +47,7 @@ public interface UserFeignClient { @GetMapping("/userInfo/findUserPaidTrackList/{albumId}") public Result> findUserPaidTrackList(@PathVariable Long albumId); + @PostMapping("/userInfo/savePaidRecord") + public Result savePaidRecord(@RequestBody UserPaidRecordVo userPaidRecordVo); } diff --git a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java index 1ab1b00..358ec06 100644 --- a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java +++ b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java @@ -5,6 +5,7 @@ import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.user.VipServiceConfig; import com.atguigu.tingshu.user.client.UserFeignClient; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -44,4 +45,10 @@ public class UserDegradeFeignClient implements UserFeignClient { log.error("[用户服务]提供远程调用方法findUserPaidTrackList执行服务降级"); return null; } + + @Override + public Result savePaidRecord(UserPaidRecordVo userPaidRecordVo) { + log.error("[用户服务]提供远程调用方法savePaidRecord执行服务降级"); + return null; + } } diff --git a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class index 8c6514918cbdc183f458b17c2b43cc5ca5688ee8..6e698b7a4dc8fb5a5b15f1a184a66c9fa0eee8e6 100644 GIT binary patch delta 672 zcmZvZyG{Z@6o&s<5F$4*1Vu%`I~R5A2_{NKVj*5A)WVfr$mp_bc7cW%N^7!}K7@%a zg`J79fmiTBG|rO1BB7X>Od`WYVE> zTdxun+TCp7PHc!&5!DJk(lkXD)xI^>pO{z68XZAsQ?$sur3#msDqZkcmhfB`OZUgj zs1e+7sre&#%#JXhvjQe<)kI`e8Zg9$Yza^0lBV+~xJXFfvFp VFf;HLGsrN=7Bk2($R{%>001vM3@iWu diff --git a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class index 31de6ac92b540b8f76fbdc51dec2e1ea4346bfad..dc357399c7a1c943caafcb32c89ac9db0f54cbef 100644 GIT binary patch delta 860 zcma))$ua{`7=_QhBt1*YRmj4y@BrSz z#shc&<^0`2BdYY`4*&3-b8p{^&}%sG^!D%wU20k z%3f;UrqTvDmBy<_YNaq=jsqZGHipwPH_Pw;6C&dXtKqlxDh+jJ;>k?hDF7S z8<9P67p0|7kqFCVV+XNI)q^GcmC4`V~ zeMK^NlIyVsh|?xae$x1UH(%;YSY}|!;jx~a<3z*R^kqt&ffvZuYsqqX)K4u$?Yg)C { + UserAccount checkDeduction(Long userId, BigDecimal amount); } diff --git a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java index 01bbbf0..a11a0e3 100644 --- a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java +++ b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/UserAccountService.java @@ -1,6 +1,7 @@ package com.atguigu.tingshu.account.service; import com.atguigu.tingshu.model.account.UserAccount; +import com.atguigu.tingshu.vo.account.AccountDeductVo; import com.baomidou.mybatisplus.extension.service.IService; import java.math.BigDecimal; @@ -24,4 +25,7 @@ public interface UserAccountService extends IService { void saveUserAccountDetail(Long userId, String title, BigDecimal amount, String orderNo); BigDecimal getAvailableAmount(Long userId); + + void checkAndDeduct(AccountDeductVo accountDeductVo); + } diff --git a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java index d1c2575..ee8c7f2 100644 --- a/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java +++ b/service/service-account/src/main/java/com/atguigu/tingshu/account/service/impl/UserAccountServiceImpl.java @@ -6,7 +6,9 @@ import com.atguigu.tingshu.account.service.UserAccountService; import com.atguigu.tingshu.common.constant.SystemConstant; import com.atguigu.tingshu.model.account.UserAccount; import com.atguigu.tingshu.model.account.UserAccountDetail; +import com.atguigu.tingshu.vo.account.AccountDeductVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -68,5 +70,33 @@ public class UserAccountServiceImpl extends ServiceImpl() + .eq(UserAccount::getUserId, accountDeductVo.getUserId()) + .setSql("total_amount = total_amount - " + accountDeductVo.getAmount()) + .setSql("available_amount = available_amount - " + accountDeductVo.getAmount()) + .setSql("total_pay_amount = total_pay_amount + " + accountDeductVo.getAmount()) + ); + if (rows == 0) { + throw new RuntimeException("账户余额不足!"); + } + //3.保存账户变动日志 + this.saveUserAccountDetail(accountDeductVo.getUserId(), accountDeductVo.getContent(), accountDeductVo.getAmount(), accountDeductVo.getOrderNo()); + + + } } diff --git a/service/service-account/src/main/resources/mapper/UserAccountMapper.xml b/service/service-account/src/main/resources/mapper/UserAccountMapper.xml index a52f377..da865a2 100644 --- a/service/service-account/src/main/resources/mapper/UserAccountMapper.xml +++ b/service/service-account/src/main/resources/mapper/UserAccountMapper.xml @@ -12,5 +12,10 @@ id,user_id,total_amount,lock_amount,available_amount,total_income_amount,total_pay_amount,create_time,update_time,is_deleted + + + diff --git a/service/service-account/target/classes/com/atguigu/tingshu/account/api/UserAccountApiController.class b/service/service-account/target/classes/com/atguigu/tingshu/account/api/UserAccountApiController.class index 55e36dd6d2626e6a09225fef08e1d6f6e1663381..d643586ca484d83096a6ff18dcd5bd5d5a7fc1fc 100644 GIT binary patch literal 2348 zcmbVOO;a327=C(LSXov;5-|yh`7qIikaQwRj9G#%ASAk&6hsc{rFXV7+hKNko#|QR z=1I-LidA~?U|A-m<;iGOs)AOp0h=0QJ?cD_yYJ$W|e@yrL^}Nsf_Wb$J?|%Te zjCayVpe==D2JPrz=)EOsf_uVu`L*IL=@^ENQROQ$#?Y1>oKNE!bf%EbpbHs>vyQHC zVcbZ$5jV0nz&SiDf4mVPD)2r zgqKU>00vSxn86{uNOEyr&^L>JAj8Nre6~I@B=iEqSgV~zf^&nhh{P$WV{jycqd3OU z?UbdnkoQZIvJ_dKjAUaK)ihsES2Ilwfq9*?bUJ|JHkK0%!^DN%hLdC1KTF7|ikw%W zvPk;AHo_?Fhc?MNaCuk_h>WvP5c=6S_n+ z=_x2*z8h7FGPq$AMR_Y|M|krhP~YEG3H_mZr8Cdbe|c&ejRi z-#FV&2dbty<@&-z0l7H&6bO#SD;y(-PQ^ykB!s73<@4!CO-BX0r2B&frFpn0TvrCX zHo~Fsf8Uu*7hD^}8P)-@m)^=&P06U#xxo)9U9BA3yk!#+5tw zY5UisZ~ngfEyKCkR4&RQFDk#(Vuw#lGb5^1N;%nSuL&1vS0@ z;F}R{$ZrTsgQQP@QSG+!YwhRn*S`GpNlhY-S=2(!=EFj2+_9QSfyo~+7(D#O}?)sepBykWu)Re8xBMrHx z&Lnzq3a3eT54py1h9u9{6moWL?(+H}SKmVg3GlM~jB{>JU58zhGuMoHskI%{XNL7e?Dys=^bP2}lP%7Qpf aiv%X>9esja4<4hOb%qWnD{tg@SP3xoD5t*nj6St1JXQTQAP$B#{g6zz#s^unHYq?q%hbFX$EEn5um(iF@qR`I8Z_Y$dQa@U@T^k0swkv B7_9&R diff --git a/service/service-account/target/classes/com/atguigu/tingshu/account/mapper/UserAccountMapper.class b/service/service-account/target/classes/com/atguigu/tingshu/account/mapper/UserAccountMapper.class index 5a7ff30c5f0e659715bd42791df4bcc869e19a36..94cb8f24b1aaa52561590e20bc6a9f94b556ad31 100644 GIT binary patch delta 176 zcmZ3G(Up? MkY)oa6l7ok0Q|iw!~g&Q delta 54 zcmcb>vXYtW)W2Q(7#J9A8F(jhwNF-L{3*}Cz|6o76k=lFVBiGPTnyYmnvH>xfro(s E0A$$+O8@`> diff --git a/service/service-account/target/classes/com/atguigu/tingshu/account/service/UserAccountService.class b/service/service-account/target/classes/com/atguigu/tingshu/account/service/UserAccountService.class index 26f38493d9152870aefdb0dd098dd6e419ade9b3..725537f3131a32be728c10014256c3698459fb5f 100644 GIT binary patch delta 221 zcmZ3&`k0OD)W2Q(7#J9A8KgIIEno~0N>43uEKAJHNleN~bTn*Z0ZKOSjg92;?S~Wav9(rn{sjXXYm6STi#4C1<22XFKMlxTL0(CIj^vYxqnQ z5Ya2k*H27N1{tUC2%#Yg!t$*(!x$O(p^{L+$;%lxFtSXJV6w7cVPp_y5Mf|s-~_so d6{wPd0VpKOAchbU2g)!paDzz+21zh21pq$OI3oZ6 delta 48 zcmaFNwuF`I)W2Q(7#J9A8N@bnEnuAN%(Rw~Y4S%VDFnt6fNn4td(pJUE?sPNF>`uBn zn>K&~iU?K2`lKj`sEDG-%apb}>JvqLzY!G`5q#lWk(d9Snaxg;O=!iaJ%Ep6p9 zwt{H_)13CSX7|O{7^!u7!boeTg6RTH(n8Hn<&9K6ZX20Yu8)RVN!^TViG&;=egSoE zbITFbpiDkuDrRA}Kt)csWqU_bV5(nXsYXkEkCZ)0#mP8@N>X-o7(y zcB{Zt%vCWD^96$2*Kgh^Fx@qMtgM`1p^8Ovg2|kq(@ONa6Ncr94_G_7hGjOJYvs5&rMc}mmW)Skn$WS8^vBvM$ z0uejHTrLRNhHdH!&K9UDQn1_3l1O2+2`E-Jsb@D>5yG`r#X79#csXrQ_rb7Ex9J&y zF8@3Ze|&6r$80H0g7I?oJqpedIJK1N6SCV?B!YIy@pi=I<2)6e=n@D^21sMa;Nj^d z=Oam1l$wuqX~v0!mC4x}*HiaU&eqdwz0WYtC&!nsShieF*R5iUoKBU~WwoTfWoST` z4LvHhN+!w$S0HdZwyD@I#UrfU=prqN`5G0k#p?uS_&DVnS76qv6J(aZH~IB?$uCWy zxs<&H+K=a_e-s4?fi~H{WPD9nSzSVwG;9XhTzq$4&kn^qwRCS%J71Q!W*z!R(2KGt zgZEAqDfE$&tTu-jy6fs48z&y!wk)&Xu;aP>z<`ydU)uATgq*EK4!TQ4Kgh~}zFXi- zKQ+B2;3HjOQH-xrkP%pR+*W!<$pt*1VmBBA=x~#ve`AKsYp;6+lYD@ALzUVxWMs5e z`Ltz1ZFRW6kM$05?m^3uo)}WIkc{STu&S$(1j+ zi)djIXM=OryBz+FDlU_XNl};R5{)ZVya{jS9+K$O6aDUh^pwC>zh`_wW9&ZRlHs^F zx)ud*5tvnsX`8td8fks~-h@6NITFTO83~@g_tvMbKKSGV2cEg*#wYK)_UYk!p1uEy z2(H96GJ)t)@HT<9$L;<6KvJ`HkK`9PA0sT^Cu7n+?21C*Iu-B4elG8{)~_>;Bs6=g zVfPgxN=~4`LuEV)MT@-1B}aX?iud5X4EYQr-MdNpQMpGU#EoZnl-bgCQIz32>7xTG zZomg*lH;f@aE{+Mg;jIhXp9iJL(<|#6*u8SjC7<04Q2AhooU)A3XK@F7avw}OF`O; zixGSjA5(CvijT{dxkVt1%%Ih;%hb)#Oygob=|&mu`kYHLy4`Yh#^d%KvmYq}&Y0s+ZvhAxX9+7R+y*777 z-w2l~_`1Nnq9Z#@Q%^Cy%%<{b^24`QzbSBXM`n=jP1c&u9#Wgs8HXH)GpDyQ5j=`( zBKQuztKfSozK}R=S0Audho-J}) z{*j6w<1y03v{Ht03qTDjv7*sea@uVQtC^Enc z0fd;z2S*qqPOAHao!vrUk}pXTh?i7+!jw_slePBHV$mVbD3%`)rfwc8r;k=-l}`&# zWnYaKDO)-A`$dKJMKGfcoUfK^TI?Ua1&dVFuhBP#~tNMrpvE<*>R%h3HKb*QWCF;7h7xT4zC;> z$(TsDmCq*hc0-1)*`$*PzlDo5>5o+Dg8vxnxzUUE`1?NJq1m7st-$GKW2Y3jKJotD*~AMlREP7*yn zmUt7o9pzcFWrvR!CC)8ghqan%b{n?dQiUm%ArX~FhM_9KtE9E1*UH3BD{*I4#`9W8 zK0vr;Mnp`^Qp9X#wPKFIf?_x?@YcCca1-5;E%^HX6Fxq8JUCAfv9LH<;1pY4bX}x5 zH(j->Ye#)H)rzpF6<9nHnTmqrsvO~Y6n2Lg(1wb_^5~xL3 z%)cho5uAFopaE@YLzOVLLV@&xoUN=SP*)22Smz-l~29P+#_ZevMd%jF&h zvh*7~O)ON{lzxWb&t#t{XD;KM7vZ<~9X0CVY`@1Jh|(X~+r?4#e3m``#F`ky%bd1c z!Eyx=1(gb>DyWgr|Czs#pe*ng{sQ=`PBG^il&USEWb!QvFWTk_IRDPv{UBD^1n8-SbVvwUY;h*>yF_9)# z2c5}QvncP8+V~TM{5j90%h(~vy2X+gN6<^Nl82!Kw97b(^dVT1bTwVHFt?%UPKpK` z9!%%>z*Lq4# zc&XQZsTXzG!`~YY;qo$cEqNG|kKoE}(W?&P>W5^zID&mt{OtwB_YC9Oqu3|A9L77q zljgfdKHoR`^Zni@4ZXe$ttZ_uYHV-f56Y4FyV+X_Wex%>`QIDBCc?TI)6q=?dawc) z(vRD49xpDplly(F%kZ``%OG(nG+u1zK7{s-DUrn5JD~px$LVEdJ%IJ zw2H{I=h5*TqfuCtIWbqR718DQ;oJA%hjM8O$Ek&JLvBzIK_O`#5aoraFBFPO pw$4LPR4{^6iE1%b)QIU~281}td7k1t=Zg81i?DWqSS0EY`wvEK9y|a5 delta 657 zcmZ9KOHUM05QV?n^bEtK5$R-vC=drw1Vw?!AOe$+_=r2hf(=mtlan${0FX$3&Xj$4JIybbyeM}I_K2wt-g&D>2H6&?g2x5-bv3Us?&@! zQOUi4Nv5JqFp``JnB{&n7c}~FhFtW+YlsTfspxxcSl$nQdgb3o^QJ_WZafSRsNlHm z&`^(y^eXpIep25@E_aLD|K)te30F~2#RWx1-$ch3%#Le$ENcfqh9|N?T)S>m3p^a8LIVDD?8BjFL8E(+dC>@M(mTAsW + + + diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/task/ReviewTask.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/task/ReviewTask.java index 52f59c1..717e492 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/task/ReviewTask.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/task/ReviewTask.java @@ -41,30 +41,35 @@ public class ReviewTask { RLock lock = redissonClient.getLock("reviewtask:lock"); boolean b = lock.tryLock(); if (b) { - log.info("开始检查审核任务"); - //1.查询审核状态为"审核中"声音列表 - List trackInfoList = trackInfoMapper.selectList( - new LambdaQueryWrapper() - .eq(TrackInfo::getStatus, SystemConstant.TRACK_STATUS_REVIEWING) - .select(TrackInfo::getId, TrackInfo::getReviewTaskId) - .last("limit 100") - ); - //2.遍历列表,查询审核结果 - if (CollUtil.isNotEmpty(trackInfoList)) { - for (TrackInfo trackInfo : trackInfoList) { - String suggestion = auditService.getReviewResult(trackInfo.getReviewTaskId()); - if (StringUtils.isNotBlank(suggestion)) { - //3.根据审核任务结果更新声音审核状态 - if ("pass".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); - } else if ("block".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); - } else if ("review".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); + try { + log.info("开始检查审核任务"); + //1.查询审核状态为"审核中"声音列表 + List trackInfoList = trackInfoMapper.selectList( + new LambdaQueryWrapper() + .eq(TrackInfo::getStatus, SystemConstant.TRACK_STATUS_REVIEWING) + .select(TrackInfo::getId, TrackInfo::getReviewTaskId) + .last("limit 100") + ); + //2.遍历列表,查询审核结果 + if (CollUtil.isNotEmpty(trackInfoList)) { + for (TrackInfo trackInfo : trackInfoList) { + String suggestion = auditService.getReviewResult(trackInfo.getReviewTaskId()); + if (StringUtils.isNotBlank(suggestion)) { + //3.根据审核任务结果更新声音审核状态 + if ("pass".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); + } else if ("block".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); + } else if ("review".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); + } + trackInfoMapper.updateById(trackInfo); } - trackInfoMapper.updateById(trackInfo); } } + } finally { + lock.unlock(); + } } } diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class index 560fe4d35f0d03bd885cf3cd3ccceadcd7363e5f..433725ac8de37c870693e54320ea4faac8da126c 100644 GIT binary patch delta 388 zcmZ3;|5u3X)W2Q(7#J9A8T2=DNwP_bre)@(gche3g%l+wX9px^rubwQmoPFIO_pPn zne4#AE|is6mZ)D^l9{6qlCfrF$b?BHpi0^JAo#wC1yF8IVqUs_a7j^SUb;0z0a(O8 zDJwO(#M%xB85u-CjtEc8EO9EW1iJ&`23L?pmY#Vfsp+Xj$eMlffre=!SqF6)R|&`y z&iSQzKpzx=bZZi;+h+1cR?*1~Y*Lez*_JbMO+L+bB!q>LL6t#`fr)_=7+{=C417R} l8;C`Ln2A9hD6PSu36y delta 48 zcmew>w2+_c)W2Q(7#J9A88kL>NwQ7e%f6hEV{$6T5g`U922r2{6N4&)8kklG0B8{k Avj6}9 diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/task/ReviewTask.class b/service/service-album/target/classes/com/atguigu/tingshu/album/task/ReviewTask.class index cf1d1b251e5b3ebdff05316bca13be25c31b8b37..d3abd200338d08d9c167b20a07e39d841b8e6cb7 100644 GIT binary patch delta 1309 zcmZ8gTWnNS6kTUt_tE1_z2mf2t!C1ooldb46A`tPRGZoWA+df`6EUNm(3W;e>;N%D zN7ML8{5Yai1wlYWQ99I4=~Sr&@qtu)-~*pP0blh6DEI=`z2ha~$317QefD1a?0xoK z9y=B@cc0F02T&`DvgQ)Kq6j5eA@L{z0)fS;&hEPxnplZG4UbDafs{a0CC-bgtbXC` zt0Y$ADFMAL(bINgcWY9>TN!K8u~xvpAenAz)zPJ6y?{a1oKB<{_t;|3NNlv@&bNKK z7In@|rrWw(XSb(X?bA&XNdDzFkSN^DWh4%{j+pn8pJF{t{DIM0S8wyA?g*q0ZG zsRsiWsCj`v>0ODQWKBJnhE%#eeXp(evcxMYW|oUl)yQ?HN}5-QU23^m5!rz^B>cGC z#9P>{;cbaM7$4YWPV+=G92N+7B$gyzm%81mx}6G{9ju^y>n{4G#dsU8SK)LvPl>O+@>gfN9ics1lD)?!pG3PpUHz!bGC zIK`_8LuEq^nRoaS0SN5n?m;^`h|jeZLH^I?BlkN|?=q@}OmO#C4MAibnfJKbqCgqm z=V}Yk0Uux=cYzOi>H&j2h9uN!Jf-e0E)f%IMe&|Yd>D@iK3MQNtpLlk(JTW>F@Z_? zPU1&r_rXrofs44tn4}6}#OXB^QQqomT!p!qhFgeQ$mio4wre_iaV->PaI~(+2Hb!x zsKqd5Vkhb_j#=23K|K!OCMIjdw`gLjMx5Y&60@CZX7b94(jVbtqF&sAPq3fW&BsId z6raIsm-BC}lF^^z3)URQ5qycSSjGXK+Z`$RAEf^wTB@O+K^OcQRNT6B`pp_9Oy?zv z=z4_T(H?wVY~mZ(q!R9p14voh+V0v#I977*p-S9 zyGlkLS5j#NJ8rXH8^Y_O?5fupk-{vNo}ERuv<2VcdpaCali~8rBp=dgDksMtRlu86yB=lX8Qa#(6 zA#x)&1--~BS37l!{9n{}So73w-EUQvjk4D!%v_6?dBxyWo7dQvJ7m=ca+T8-s^ae~ zzUK#nA8k%>Qg;@QIa_04ez8dNtIY;7aemkJv87e~ZSfDM42Ep_*eO9BQdeUplfKof zDxEb{Kru&8#LltKYwGIiSiQG+Q&{-{{y5z%)$b85Xt7KwX8)+bqx#VtAdxDdA&eG)DDs<}GP z{Y`;XGEc9ba4O5!=ee_&iePFJvy#rE9xDk6D^5E7`rMMLp2y674olib=czoKdl?t} zwDX*Y#{@s`40?FG;GC29@Mgio&JGW+FGyn;5R0pHpX|QU8o|EO?Sg%!4#7F+1uy%? z9wEcdE{`lLNPo{rEf$Y2b(vsa>U_bzRE1z)s!Xu26fMY0GO&Zu>z%P7_KZp=gWedp z^NBpZKU>n$W|mX`N?A+P5(Ri?uYg{Wf=^HPqp-Cservice-account-client 1.0 + + com.alibaba.cloud + spring-cloud-starter-alibaba-seata + + + + io.seata + seata-spring-boot-starter + + + + + io.seata + seata-spring-boot-starter + + diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/api/OrderInfoApiController.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/api/OrderInfoApiController.java index 2b58f73..ec8d13f 100644 --- a/service/service-order/src/main/java/com/atguigu/tingshu/order/api/OrderInfoApiController.java +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/api/OrderInfoApiController.java @@ -2,6 +2,7 @@ package com.atguigu.tingshu.order.api; import com.atguigu.tingshu.common.login.GuiGuLogin; import com.atguigu.tingshu.common.result.Result; +import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.order.service.OrderInfoService; import com.atguigu.tingshu.vo.order.OrderInfoVo; import com.atguigu.tingshu.vo.order.TradeVo; @@ -13,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @Tag(name = "订单管理") @RestController @RequestMapping("api/order") @@ -31,6 +34,20 @@ public class OrderInfoApiController { return Result.ok(orderInfoVo); } + /** + * 提交订单(付款方式:1.余额 2.微信) + * @param orderInfoVo + * @return + */ + @GuiGuLogin + @Operation(summary = "提交订单(付款方式:1.余额 2.微信)") + @PostMapping("/orderInfo/submitOrder") + public Result> submitOrder(@RequestBody OrderInfoVo orderInfoVo) { + Long userId = AuthContextHolder.getUserId(); + Map result = orderInfoService.submitOrder(orderInfoVo, userId); + return Result.ok(result); + } + } diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/TradeTypeStrategy.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/TradeTypeStrategy.java new file mode 100644 index 0000000..9bf676e --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/TradeTypeStrategy.java @@ -0,0 +1,10 @@ +package com.atguigu.tingshu.order.pattern; + +import com.atguigu.tingshu.vo.order.OrderInfoVo; +import com.atguigu.tingshu.vo.order.TradeVo; + +public interface TradeTypeStrategy { + + OrderInfoVo trade(TradeVo tradeVo); + +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/factory/TradeTypeStrategyFactory.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/factory/TradeTypeStrategyFactory.java new file mode 100644 index 0000000..d8600fe --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/factory/TradeTypeStrategyFactory.java @@ -0,0 +1,28 @@ +package com.atguigu.tingshu.order.pattern.factory; + +import com.atguigu.tingshu.order.pattern.TradeTypeStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +@Slf4j +public class TradeTypeStrategyFactory { + + + @Autowired + private Map tradeTypeStrategyMap; + + + public TradeTypeStrategy getTradeTypeStrategy(String itemType) + { + log.info("itemType:{}",itemType); + if (tradeTypeStrategyMap.containsKey(itemType)) { + return tradeTypeStrategyMap.get(itemType); + } + log.error("当前商品类型不支持处理!"); + throw new RuntimeException("当前商品类型不支持处理!"); + } +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/AlbumTradeType.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/AlbumTradeType.java new file mode 100644 index 0000000..e0a6a83 --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/AlbumTradeType.java @@ -0,0 +1,150 @@ +package com.atguigu.tingshu.order.pattern.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.common.util.AuthContextHolder; +import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.order.helper.SignHelper; +import com.atguigu.tingshu.order.pattern.TradeTypeStrategy; +import com.atguigu.tingshu.user.client.UserFeignClient; +import com.atguigu.tingshu.vo.order.OrderDerateVo; +import com.atguigu.tingshu.vo.order.OrderDetailVo; +import com.atguigu.tingshu.vo.order.OrderInfoVo; +import com.atguigu.tingshu.vo.order.TradeVo; +import com.atguigu.tingshu.vo.user.UserInfoVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component(SystemConstant.ORDER_ITEM_TYPE_ALBUM) +@Slf4j +public class AlbumTradeType implements TradeTypeStrategy { + + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private UserFeignClient userFeignClient; + @Autowired + private AlbumFeignClient albumFeignClient; + @Override + public OrderInfoVo trade(TradeVo tradeVo) { + //从线程中取出userid来 + Long userId = AuthContextHolder.getUserId(); + //1.创建订单VO对象,创建初始三个金额,两个集合(商品、优惠) + OrderInfoVo orderInfoVo = new OrderInfoVo(); + //1.1 初始化原价金额 + // 必须是BigDecimal类型且必须是字符串 + BigDecimal originalAmount = new BigDecimal("0.00"); + //1.2 初始化减免金额 + BigDecimal derateAmount = new BigDecimal("0.00"); + //1.3 初始化订单金额 + BigDecimal orderAmount = new BigDecimal("0.00"); + + //1.4.初始化订单明细 + List orderDetailVoList = new ArrayList<>(); + //1.5.初始化订单减免明细列表 + List orderDerateVoList = new ArrayList<>(); + + //1.6 获取购买项目类型 付款项目类型: 1001-专辑 1002-声音 1003-vip会员 + String itemType = tradeVo.getItemType(); + //3. 处理购买项目类型:专辑 + //3.1 远程调用用户服务,判断是否重复购买专辑,如果已购过,则业务终止 + Long albumId = tradeVo.getItemId(); + Boolean data = userFeignClient.isPaidAlbum(albumId).getData(); + //如果data为true的话就走断言 + Assert.isFalse(data, "用户已购买专辑{}", albumId); + //3.2 远程调用专辑服务,获取专辑价格以及折扣(普通用户折扣,VIP会员折扣) + AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(albumId).getData(); + BigDecimal price = albumInfo.getPrice(); + BigDecimal discount = albumInfo.getDiscount(); + BigDecimal vipDiscount = albumInfo.getVipDiscount(); + //判断用户是否为vip 如果是vip就走vip折扣 如果不是就走普通用户的折扣 + Boolean isVIP = false; + UserInfoVo userInfoVo = userFeignClient.getUserInfoVo(userId).getData(); + Assert.notNull(userInfoVo, "用户{}不存在", userId); + //判断一下用户是否为vip以及vip的过期时间是否超过了当时的时间 + if (userInfoVo.getIsVip().intValue() == 1 + && userInfoVo.getVipExpireTime().after(new Date())) { + isVIP = true; + } + //3.4 计算相关价格 + //3.4.1 暂时将订单价=原价 + originalAmount = price; + orderAmount = originalAmount; + //当你是普通客户 但是专辑是有普通用户折扣的时候 计算一下专辑价格 + //discount.doubleValue()!=-1 + //BigDecimal.doubleValue() 是将 BigDecimal 转换为 double 类型的操作 + + //如果是普通用户且有折扣,则订单价=原价 100 *折扣 6 + //..divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP)是保留两位小数的标准写法 + if (!isVIP && discount.doubleValue() != -1) { + orderAmount = originalAmount.multiply(discount) + .divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP); + } + //如果是会员,则按照会员折扣走 + if (isVIP && vipDiscount.doubleValue() != -1) { + orderAmount = originalAmount.multiply(vipDiscount) + .divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP); + } + //3.5 封装商品信息列表 + OrderDetailVo orderDetailVo = new OrderDetailVo(); + orderDetailVo.setItemId(albumId); + orderDetailVo.setItemName("专辑:" + albumInfo.getAlbumTitle()); + orderDetailVo.setItemUrl(albumInfo.getCoverUrl()); + orderDetailVo.setItemPrice(originalAmount); + orderDetailVoList.add(orderDetailVo); + + //2.4 如果存在优惠,封装优惠列表 + if (originalAmount.compareTo(orderAmount) == 1) { + OrderDerateVo orderDerateVo = new OrderDerateVo(); + orderDerateVo.setRemarks(SystemConstant.ORDER_DERATE_VIP_SERVICE_DISCOUNT); + orderDerateVo.setDerateType("VIP套餐限时优惠:" + derateAmount); + orderDerateVo.setDerateAmount(originalAmount.subtract(orderAmount)); + orderDerateVoList.add(orderDerateVo); + } + + //5.封装订单VO对象 + //5.1 封装相关价格信息 + orderInfoVo.setOriginalAmount(originalAmount); + orderInfoVo.setOrderAmount(orderAmount); + orderInfoVo.setDerateAmount(derateAmount); + //5.2 封装商品相关集合 + orderInfoVo.setOrderDetailVoList(orderDetailVoList); + orderInfoVo.setOrderDerateVoList(orderDerateVoList); + //5.3 TODO 封装其他信息:流水号、时间戳及签名、项目类型等 + //5.3.1 封装项目的类型 + orderInfoVo.setItemType(itemType); + //5.3.2 流水号机制,防止订单重复提交(1.用户网络卡连续点击结算按钮2.成功提交订单,回退到订单确认页再次提交) + //5.3.2.1 构建当前用户当前订单流水号Key + String tradeKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId; + //5.3.2.2 采用UUID生成本次订单流水号值 + String tradeNo = IdUtil.randomUUID(); + //5.3.2.3 将流水号值保存到Redis中,设置过期时间(5分钟),防止订单重复提交 + redisTemplate.opsForValue().set(tradeKey, tradeNo, 5, TimeUnit.MINUTES); + orderInfoVo.setTradeNo(tradeNo); + + //5.3.3 签名机制,时间戳+签名值,防止订单结算页数据被篡改 + orderInfoVo.setTimestamp(System.currentTimeMillis()); + //5.3.1 将订单VO转为Map对象,由于无法确定支付方式,固将VO中payWay为空属性排除掉 + Map map = BeanUtil.beanToMap(orderInfoVo, false, true); + String sign = SignHelper.getSign(map); + orderInfoVo.setSign(sign); + + //6.响应订单VO对象 + return orderInfoVo; + + } +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/TrackTradeType.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/TrackTradeType.java new file mode 100644 index 0000000..fa8da99 --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/TrackTradeType.java @@ -0,0 +1,116 @@ +package com.atguigu.tingshu.order.pattern.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.common.util.AuthContextHolder; +import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.model.album.TrackInfo; +import com.atguigu.tingshu.order.helper.SignHelper; +import com.atguigu.tingshu.order.pattern.TradeTypeStrategy; +import com.atguigu.tingshu.vo.order.OrderDerateVo; +import com.atguigu.tingshu.vo.order.OrderDetailVo; +import com.atguigu.tingshu.vo.order.OrderInfoVo; +import com.atguigu.tingshu.vo.order.TradeVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Component(SystemConstant.ORDER_ITEM_TYPE_TRACK) +@Slf4j +public class TrackTradeType implements TradeTypeStrategy { + @Autowired + private AlbumFeignClient albumFeignClient; + @Autowired + private RedisTemplate redisTemplate; + @Override + public OrderInfoVo trade(TradeVo tradeVo) { + //从线程中取出userid来 + Long userId = AuthContextHolder.getUserId(); + //1.创建订单VO对象,创建初始三个金额,两个集合(商品、优惠) + OrderInfoVo orderInfoVo = new OrderInfoVo(); + //1.1 初始化原价金额 + // 必须是BigDecimal类型且必须是字符串 + BigDecimal originalAmount = new BigDecimal("0.00"); + //1.2 初始化减免金额 + BigDecimal derateAmount = new BigDecimal("0.00"); + //1.3 初始化订单金额 + BigDecimal orderAmount = new BigDecimal("0.00"); + + //1.4.初始化订单明细 + List orderDetailVoList = new ArrayList<>(); + //1.5.初始化订单减免明细列表 + List orderDerateVoList = new ArrayList<>(); + + //1.6 获取购买项目类型 付款项目类型: 1001-专辑 1002-声音 1003-vip会员 + String itemType = tradeVo.getItemType(); + + //4.处理购买项目类型:声音 + //4.1 远程调用专辑服务,获取未购买声音列表 + Long trackId = tradeVo.getItemId(); + List trackInfoList = + albumFeignClient.findWaitBuyTrackList(trackId, tradeVo.getTrackCount()).getData(); + Assert.notNull(trackInfoList, "不存在待结算声音", trackId); + //4.2 远程调用专辑服务获取,专辑价格(声音单价)声音不支持折扣 + AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(trackInfoList.get(0).getAlbumId()).getData(); + Assert.notNull(albumInfo, "专辑{}不存在", albumInfo.getId()); + BigDecimal price = albumInfo.getPrice(); + //4.3 计算相关价格 + originalAmount = price.multiply(new BigDecimal(trackInfoList.size())); + orderAmount = originalAmount; + //4.4 封装订单明细列表 + orderDetailVoList = trackInfoList.stream().map( + trackInfo -> { + OrderDetailVo orderDetailVo = new OrderDetailVo(); + orderDetailVo.setItemId(trackInfo.getId()); + orderDetailVo.setItemName("声音:" + trackInfo.getTrackTitle()); + orderDetailVo.setItemUrl(trackInfo.getCoverUrl()); + orderDetailVo.setItemPrice(price); + return orderDetailVo; + } + ).collect(Collectors.toList()); + + //5.封装订单VO对象 + //5.1 封装相关价格信息 + orderInfoVo.setOriginalAmount(originalAmount); + orderInfoVo.setOrderAmount(orderAmount); + orderInfoVo.setDerateAmount(derateAmount); + //5.2 封装商品相关集合 + orderInfoVo.setOrderDetailVoList(orderDetailVoList); + orderInfoVo.setOrderDerateVoList(orderDerateVoList); + //5.3 TODO 封装其他信息:流水号、时间戳及签名、项目类型等 + //5.3.1 封装项目的类型 + orderInfoVo.setItemType(itemType); + //5.3.2 流水号机制,防止订单重复提交(1.用户网络卡连续点击结算按钮2.成功提交订单,回退到订单确认页再次提交) + //5.3.2.1 构建当前用户当前订单流水号Key + String tradeKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId; + //5.3.2.2 采用UUID生成本次订单流水号值 + String tradeNo = IdUtil.randomUUID(); + //5.3.2.3 将流水号值保存到Redis中,设置过期时间(5分钟),防止订单重复提交 + redisTemplate.opsForValue().set(tradeKey, tradeNo, 5, TimeUnit.MINUTES); + orderInfoVo.setTradeNo(tradeNo); + + //5.3.3 签名机制,时间戳+签名值,防止订单结算页数据被篡改 + orderInfoVo.setTimestamp(System.currentTimeMillis()); + //5.3.1 将订单VO转为Map对象,由于无法确定支付方式,固将VO中payWay为空属性排除掉 + Map map = BeanUtil.beanToMap(orderInfoVo, false, true); + String sign = SignHelper.getSign(map); + orderInfoVo.setSign(sign); + + return orderInfoVo; + + + + } +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/VIPTradeType.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/VIPTradeType.java new file mode 100644 index 0000000..842d8d3 --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/pattern/impl/VIPTradeType.java @@ -0,0 +1,119 @@ +package com.atguigu.tingshu.order.pattern.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.common.util.AuthContextHolder; +import com.atguigu.tingshu.model.user.VipServiceConfig; +import com.atguigu.tingshu.order.helper.SignHelper; +import com.atguigu.tingshu.order.pattern.TradeTypeStrategy; +import com.atguigu.tingshu.user.client.UserFeignClient; +import com.atguigu.tingshu.vo.order.OrderDerateVo; +import com.atguigu.tingshu.vo.order.OrderDetailVo; +import com.atguigu.tingshu.vo.order.OrderInfoVo; +import com.atguigu.tingshu.vo.order.TradeVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component(SystemConstant.ORDER_ITEM_TYPE_VIP) +@Slf4j +public class VIPTradeType implements TradeTypeStrategy { + + @Autowired + private UserFeignClient userFeignClient; + @Autowired + private RedisTemplate redisTemplate; + + @Override + public OrderInfoVo trade(TradeVo tradeVo) { + //从线程中取出userid来 + Long userId = AuthContextHolder.getUserId(); + //1.创建订单VO对象,创建初始三个金额,两个集合(商品、优惠) + OrderInfoVo orderInfoVo = new OrderInfoVo(); + //1.1 初始化原价金额 + // 必须是BigDecimal类型且必须是字符串 + BigDecimal originalAmount = new BigDecimal("0.00"); + //1.2 初始化减免金额 + BigDecimal derateAmount = new BigDecimal("0.00"); + //1.3 初始化订单金额 + BigDecimal orderAmount = new BigDecimal("0.00"); + + //1.4.初始化订单明细 + List orderDetailVoList = new ArrayList<>(); + //1.5.初始化订单减免明细列表 + List orderDerateVoList = new ArrayList<>(); + //1.6 获取购买项目类型 付款项目类型: 1001-专辑 1002-声音 1003-vip会员 + String itemType = tradeVo.getItemType(); + //2.1 远程调用用户服务得到VIP套餐信息 + VipServiceConfig vipServiceConfig = userFeignClient.getVipServiceConfig(tradeVo.getItemId()).getData(); + Assert.notNull(vipServiceConfig, "VIP套餐{}不存在", tradeVo.getItemId()); + //2.2 计算原金额、订单金额、减免金额 + originalAmount = vipServiceConfig.getPrice(); + orderAmount = vipServiceConfig.getDiscountPrice(); + //2.3 封装商品信息列表 + OrderDetailVo orderDetailVo = new OrderDetailVo(); + //套餐的ID + orderDetailVo.setItemId(tradeVo.getItemId()); + //套餐的名字 + orderDetailVo.setItemName("VIP套餐:" + vipServiceConfig.getName()); + //套餐图片的url + orderDetailVo.setItemUrl(vipServiceConfig.getImageUrl()); + //套餐的折后价 + orderDetailVo.setItemPrice(orderAmount); + orderDetailVoList.add(orderDetailVo); + //2.4 如果存在优惠,封装优惠列表 + //bigdecimal是不能用equals判断的 因为1.10和1.1不相等 + //compareTo(orderAmount)==0是相等 + //compareTo(orderAmount)==-1小于 + //compareTo(orderAmount)==1是大于 如果大于的话说明有了折扣 + if (originalAmount.compareTo(orderAmount) == 1) { + derateAmount = originalAmount.subtract(orderAmount); + //存在优惠 我们要封装优惠列表 + OrderDerateVo orderDerateVo = new OrderDerateVo(); + orderDerateVo.setDerateAmount(derateAmount); + orderDerateVo.setDerateType(SystemConstant.ORDER_DERATE_VIP_SERVICE_DISCOUNT); + orderDerateVo.setRemarks("VIP套餐限时优惠:" + derateAmount); + orderDerateVoList.add(orderDerateVo); + } + //5.封装订单VO对象 + //5.1 封装相关价格信息 + orderInfoVo.setOriginalAmount(originalAmount); + orderInfoVo.setOrderAmount(orderAmount); + orderInfoVo.setDerateAmount(derateAmount); + //5.2 封装商品相关集合 + orderInfoVo.setOrderDetailVoList(orderDetailVoList); + orderInfoVo.setOrderDerateVoList(orderDerateVoList); + //5.3 TODO 封装其他信息:流水号、时间戳及签名、项目类型等 + //5.3.1 封装项目的类型 + orderInfoVo.setItemType(itemType); + //5.3.2 流水号机制,防止订单重复提交(1.用户网络卡连续点击结算按钮2.成功提交订单,回退到订单确认页再次提交) + //5.3.2.1 构建当前用户当前订单流水号Key + String tradeKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId; + //5.3.2.2 采用UUID生成本次订单流水号值 + String tradeNo = IdUtil.randomUUID(); + //5.3.2.3 将流水号值保存到Redis中,设置过期时间(5分钟),防止订单重复提交 + redisTemplate.opsForValue().set(tradeKey, tradeNo, 5, TimeUnit.MINUTES); + orderInfoVo.setTradeNo(tradeNo); + + //5.3.3 签名机制,时间戳+签名值,防止订单结算页数据被篡改 + orderInfoVo.setTimestamp(System.currentTimeMillis()); + //5.3.1 将订单VO转为Map对象,由于无法确定支付方式,固将VO中payWay为空属性排除掉 + Map map = BeanUtil.beanToMap(orderInfoVo, false, true); + String sign = SignHelper.getSign(map); + orderInfoVo.setSign(sign); + + //6.响应订单VO对象 + return orderInfoVo; + + } +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDerateService.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDerateService.java new file mode 100644 index 0000000..bee5afc --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDerateService.java @@ -0,0 +1,7 @@ +package com.atguigu.tingshu.order.service; + +import com.atguigu.tingshu.model.order.OrderDerate; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface OrderDerateService extends IService { +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDetailService.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDetailService.java new file mode 100644 index 0000000..6b6fead --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderDetailService.java @@ -0,0 +1,7 @@ +package com.atguigu.tingshu.order.service; + +import com.atguigu.tingshu.model.order.OrderDetail; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface OrderDetailService extends IService { +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderInfoService.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderInfoService.java index a9dbb8b..1c6923c 100644 --- a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderInfoService.java +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/OrderInfoService.java @@ -5,8 +5,14 @@ import com.atguigu.tingshu.vo.order.OrderInfoVo; import com.atguigu.tingshu.vo.order.TradeVo; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Map; + public interface OrderInfoService extends IService { OrderInfoVo trade(TradeVo tradeVo); + + Map submitOrder(OrderInfoVo orderInfoVo, Long userId); + + OrderInfo saveOrderInfo(OrderInfoVo orderInfoVo, Long userId); } diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDerateServiceImpl.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDerateServiceImpl.java new file mode 100644 index 0000000..6192666 --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDerateServiceImpl.java @@ -0,0 +1,17 @@ +package com.atguigu.tingshu.order.service.impl; + +import com.atguigu.tingshu.model.order.OrderDerate; +import com.atguigu.tingshu.order.mapper.OrderDerateMapper; +import com.atguigu.tingshu.order.service.OrderDerateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author: atguigu + * @create: 2025-08-02 11:35 + */ +@Slf4j +@Service +public class OrderDerateServiceImpl extends ServiceImpl implements OrderDerateService { +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDetailServiceImpl.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDetailServiceImpl.java new file mode 100644 index 0000000..2db34ef --- /dev/null +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderDetailServiceImpl.java @@ -0,0 +1,13 @@ +package com.atguigu.tingshu.order.service.impl; + +import com.atguigu.tingshu.model.order.OrderDetail; +import com.atguigu.tingshu.order.mapper.OrderDetailMapper; +import com.atguigu.tingshu.order.service.OrderDetailService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class OrderDetailServiceImpl extends ServiceImpl implements OrderDetailService { +} diff --git a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.java b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.java index 5bb11d1..1e8af2a 100644 --- a/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.java +++ b/service/service-order/src/main/java/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.java @@ -1,34 +1,51 @@ package com.atguigu.tingshu.order.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.account.AccountFeignClient; import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.common.constant.RedisConstant; import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.common.execption.GuiguException; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.model.album.TrackInfo; +import com.atguigu.tingshu.model.order.OrderDerate; +import com.atguigu.tingshu.model.order.OrderDetail; import com.atguigu.tingshu.model.order.OrderInfo; import com.atguigu.tingshu.model.user.VipServiceConfig; +import com.atguigu.tingshu.order.helper.SignHelper; import com.atguigu.tingshu.order.mapper.OrderInfoMapper; +import com.atguigu.tingshu.order.pattern.TradeTypeStrategy; +import com.atguigu.tingshu.order.pattern.factory.TradeTypeStrategyFactory; +import com.atguigu.tingshu.order.service.OrderDerateService; +import com.atguigu.tingshu.order.service.OrderDetailService; import com.atguigu.tingshu.order.service.OrderInfoService; import com.atguigu.tingshu.user.client.UserFeignClient; +import com.atguigu.tingshu.vo.account.AccountDeductVo; import com.atguigu.tingshu.vo.order.OrderDerateVo; import com.atguigu.tingshu.vo.order.OrderDetailVo; import com.atguigu.tingshu.vo.order.OrderInfoVo; import com.atguigu.tingshu.vo.order.TradeVo; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; -import org.aspectj.weaver.ast.Or; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j @@ -40,163 +57,162 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetailVoList = new ArrayList<>(); - //1.5.初始化订单减免明细列表 - List orderDerateVoList = new ArrayList<>(); - //todo 流水号 签名之类的还未添加 - //1.6 获取购买项目类型 付款项目类型: 1001-专辑 1002-声音 1003-vip会员 String itemType = tradeVo.getItemType(); - //2. 处理购买项目类型:VIP套餐 - if (SystemConstant.ORDER_ITEM_TYPE_VIP.equals(itemType)) { - //2.1 远程调用用户服务得到VIP套餐信息 - VipServiceConfig vipServiceConfig = userFeignClient.getVipServiceConfig(tradeVo.getItemId()).getData(); - Assert.notNull(vipServiceConfig, "VIP套餐{}不存在", tradeVo.getItemId()); - //2.2 计算原金额、订单金额、减免金额 - originalAmount = vipServiceConfig.getPrice(); - orderAmount = vipServiceConfig.getDiscountPrice(); - //2.3 封装商品信息列表 - OrderDetailVo orderDetailVo = new OrderDetailVo(); - //套餐的ID - orderDetailVo.setItemId(tradeVo.getItemId()); - //套餐的名字 - orderDetailVo.setItemName("VIP套餐:" + vipServiceConfig.getName()); - //套餐图片的url - orderDetailVo.setItemUrl(vipServiceConfig.getImageUrl()); - //套餐的折后价 - orderDetailVo.setItemPrice(orderAmount); - orderDetailVoList.add(orderDetailVo); - //2.4 如果存在优惠,封装优惠列表 - //bigdecimal是不能用equals判断的 因为1.10和1.1不相等 - //compareTo(orderAmount)==0是相等 - //compareTo(orderAmount)==-1小于 - //compareTo(orderAmount)==1是大于 如果大于的话说明有了折扣 - if (originalAmount.compareTo(orderAmount) == 1) { - derateAmount = originalAmount.subtract(orderAmount); - //存在优惠 我们要封装优惠列表 - OrderDerateVo orderDerateVo = new OrderDerateVo(); - orderDerateVo.setDerateAmount(derateAmount); - orderDerateVo.setDerateType(SystemConstant.ORDER_DERATE_VIP_SERVICE_DISCOUNT); - orderDerateVo.setRemarks("VIP套餐限时优惠:" + derateAmount); - orderDerateVoList.add(orderDerateVo); + //从策略工厂获取具体实现类对象 + TradeTypeStrategy tradeTypeStrategy = tradeTypeStrategyFactory.getTradeTypeStrategy(itemType); + OrderInfoVo trade = tradeTypeStrategy.trade(tradeVo); + //返回订单信息 + return trade; + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public Map submitOrder(OrderInfoVo orderInfoVo, Long userId) { + //1.业务校验:验证流水号,防止订单重复提交 采用Lua脚本保证判断删除原子性 + String tradeKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId; + //1.1 定义lua脚本 + String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" + + "then\n" + + " return redis.call(\"del\",KEYS[1])\n" + + "else\n" + + " return 0\n" + + "end"; + //1.2 创建脚本对象 + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(luaScript); + redisScript.setResultType(Boolean.class); + //1.3 执行Lua脚本 + Boolean flag = (Boolean) redisTemplate.execute(redisScript, Arrays.asList(tradeKey), orderInfoVo.getTradeNo()); + if (!flag) { + throw new GuiguException(500, "验证流水号失败"); + } + //2.业务校验:`验证签名`,防止订单数据被篡改 + //2.1 将订单VO转为Map对象 由于当时加签将payWay排除掉,并未加入到签名中 + //为何在初始化初始数值时候要用bigdecimal数值中要写String类型,如果数值写了int类型的话 + //会导致数值不一样 比如说0.00会变成0 导致md5编码过程中编码错误 结果导致验签失败 + Map stringObjectMap = BeanUtil.beanToMap(orderInfoVo); + stringObjectMap.remove("payWay"); + //2.2 调用验证签名工具方法 + SignHelper.checkSign(stringObjectMap); + + //当校验流水号和验证签名成功以后 执行核心业务 + //3.核心业务:保存订单以及订单明细,优惠列表等 -- 此时订单:未支付 + OrderInfo orderInfo = this.saveOrderInfo(orderInfoVo, userId); + //支付方式:1101-微信 1102-支付宝 1103-账户余额 + String payWay = orderInfoVo.getPayWay(); + //4.TODO 判断支付方式:余额扣减核心业务 + if(SystemConstant.ORDER_PAY_ACCOUNT.equals(payWay)){ + //余额扣减 + //4.1 远程调用账户服务扣减账户余额 + AccountDeductVo accountDeductVo = new AccountDeductVo(); + accountDeductVo.setAmount(orderInfo.getOrderAmount()); + accountDeductVo.setOrderNo(orderInfo.getOrderNo()); + accountDeductVo.setContent(orderInfo.getOrderTitle()); + accountDeductVo.setUserId(orderInfo.getUserId()); + + + Result result = accountFeignClient.checkAndDeduct(accountDeductVo); + //判断是否为扣减成功 + if(result.getCode().intValue()!=200){ + throw new GuiguException(result.getCode(), result.getMessage()); + } + //4.2 如果扣减余额成功,修改订单状态改为:已支付 + orderInfo.setOrderStatus(SystemConstant.ORDER_STATUS_PAID); + orderInfoMapper.updateById(orderInfo); + + //4.3 远程调用用户服务虚拟物品发货 + //4.3.1 构建虚拟发货VO对象 + UserPaidRecordVo userPaidRecordVo =new UserPaidRecordVo(); + userPaidRecordVo.setOrderNo(orderInfo.getOrderNo()); + userPaidRecordVo.setUserId(orderInfo.getUserId()); + userPaidRecordVo.setItemType(orderInfo.getItemType()); + //根据订单编号查询订单明细获取购买项目ID列表 + List orderDetailList = orderDetailService.list( + new LambdaQueryWrapper() + .eq(OrderDetail::getOrderId, orderInfo.getId()) + .select(OrderDetail::getItemId) + ); + List itemIdList = orderDetailList.stream() + .map(OrderDetail::getItemId).collect(Collectors.toList()); + userPaidRecordVo.setItemIdList(itemIdList); + //4.3.2 远程调用用户服务,发放用户权益 + result = userFeignClient.savePaidRecord(userPaidRecordVo); + //4.3.3 判断远程调用结果业务状态码是否为200 + if (result.getCode().intValue() != 200) { + throw new GuiguException(result.getCode(), result.getMessage()); } - } else if (SystemConstant.ORDER_ITEM_TYPE_ALBUM.equals(itemType)) { - //3. 处理购买项目类型:专辑 - //3.1 远程调用用户服务,判断是否重复购买专辑,如果已购过,则业务终止 - Long albumId = tradeVo.getItemId(); - Boolean data = userFeignClient.isPaidAlbum(albumId).getData(); - //如果data为true的话就走断言 - Assert.isFalse(data, "用户已购买专辑{}", albumId); - //3.2 远程调用专辑服务,获取专辑价格以及折扣(普通用户折扣,VIP会员折扣) - AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(albumId).getData(); - BigDecimal price = albumInfo.getPrice(); - BigDecimal discount = albumInfo.getDiscount(); - BigDecimal vipDiscount = albumInfo.getVipDiscount(); - //判断用户是否为vip 如果是vip就走vip折扣 如果不是就走普通用户的折扣 - Boolean isVIP = false; - UserInfoVo userInfoVo = userFeignClient.getUserInfoVo(userId).getData(); - Assert.notNull(userInfoVo, "用户{}不存在", userId); - //判断一下用户是否为vip以及vip的过期时间是否超过了当时的时间 - if (userInfoVo.getIsVip().intValue() == 1 - && userInfoVo.getVipExpireTime().after(new Date())) { - isVIP = true; - } - //3.4 计算相关价格 - //3.4.1 暂时将订单价=原价 - originalAmount = price; - orderAmount = originalAmount; - //当你是普通客户 但是专辑是有普通用户折扣的时候 计算一下专辑价格 - //discount.doubleValue()!=-1 - //BigDecimal.doubleValue() 是将 BigDecimal 转换为 double 类型的操作 - - //如果是普通用户且有折扣,则订单价=原价 100 *折扣 6 - //..divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP)是保留两位小数的标准写法 - if (!isVIP && discount.doubleValue() != -1) { - orderAmount =originalAmount.multiply(discount) - .divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP); - } - //如果是会员,则按照会员折扣走 - if (isVIP && vipDiscount.doubleValue() != -1) { - orderAmount = originalAmount.multiply(vipDiscount) - .divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP); - } - //3.5 封装商品信息列表 - OrderDetailVo orderDetailVo = new OrderDetailVo(); - orderDetailVo.setItemId(albumId); - orderDetailVo.setItemName("专辑:"+albumInfo.getAlbumTitle()); - orderDetailVo.setItemUrl(albumInfo.getCoverUrl()); - orderDetailVo.setItemPrice(originalAmount); - orderDetailVoList.add(orderDetailVo); - - //2.4 如果存在优惠,封装优惠列表 - if(originalAmount.compareTo(orderAmount)==1){ - OrderDerateVo orderDerateVo = new OrderDerateVo(); - orderDerateVo.setRemarks(SystemConstant.ORDER_DERATE_VIP_SERVICE_DISCOUNT); - orderDerateVo.setDerateType("VIP套餐限时优惠:" + derateAmount); - orderDerateVo.setDerateAmount(originalAmount.subtract(orderAmount)); - orderDerateVoList.add(orderDerateVo); - } - - } else if (SystemConstant.ORDER_ITEM_TYPE_TRACK.equals(itemType)) { - //4.处理购买项目类型:声音 - //4.1 远程调用专辑服务,获取未购买声音列表 - Long trackId = tradeVo.getItemId(); - List trackInfoList = - albumFeignClient.findWaitBuyTrackList(trackId, tradeVo.getTrackCount()).getData(); - Assert.notNull(trackInfoList, "不存在待结算声音",trackId); - //4.2 远程调用专辑服务获取,专辑价格(声音单价)声音不支持折扣 - AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(trackInfoList.get(0).getAlbumId()).getData(); - Assert.notNull(albumInfo, "专辑{}不存在", albumInfo.getId()); - BigDecimal price = albumInfo.getPrice(); - //4.3 计算相关价格 - originalAmount = price.multiply(new BigDecimal(trackInfoList.size())); - orderAmount = originalAmount; - //4.4 封装订单明细列表 - orderDetailVoList = trackInfoList.stream().map( - trackInfo -> { - OrderDetailVo orderDetailVo = new OrderDetailVo(); - orderDetailVo.setItemId(trackInfo.getId()); - orderDetailVo.setItemName("声音:" + trackInfo.getTrackTitle()); - orderDetailVo.setItemUrl(trackInfo.getCoverUrl()); - orderDetailVo.setItemPrice(price); - return orderDetailVo; - } - ).collect(Collectors.toList()); } - //5.封装订单VO对象 - //5.1 封装相关价格信息 - orderInfoVo.setOriginalAmount(originalAmount); - orderInfoVo.setOrderAmount(orderAmount); - orderInfoVo.setDerateAmount(derateAmount); - //5.2 封装商品相关集合 - orderInfoVo.setOrderDetailVoList(orderDetailVoList); - orderInfoVo.setOrderDerateVoList(orderDerateVoList); - //5.3 TODO 封装其他信息:流水号、时间戳及签名、项目类型等 - - //6.响应订单VO对象 - return orderInfoVo; + //5.TODO 判断支付方式:微信 + //else if(SystemConstant.ORDER_PAY_WAY_WEIXIN.equals(payWay)){ + //} + //6.响应结果 + return Map.of("orderNo", orderInfo.getOrderNo()); } + + @Override + public OrderInfo saveOrderInfo(OrderInfoVo orderInfoVo, Long userId) { + //1.保存订单 + //2.1 创建订单对象 + OrderInfo orderInfo = BeanUtil.copyProperties(orderInfoVo, OrderInfo.class); + //2.2 设置用户ID + orderInfo.setUserId(userId); + //2.3 设置订单标题 + List orderDetailVoList = orderInfoVo.getOrderDetailVoList(); + if (CollUtil.isNotEmpty(orderDetailVoList)) { + String itemName = orderDetailVoList.get(0).getItemName(); + orderInfo.setOrderTitle(itemName); + } + //2.4 订单状态:未支付 + orderInfo.setOrderStatus(SystemConstant.ORDER_STATUS_UNPAID); + //2.5 设置订单编号 确保全局唯一且趋势递增 形式:当天日期+雪花算法 + String code = DateUtil.today().replaceAll("-", "") + IdUtil.getSnowflakeNextId(); + orderInfo.setOrderNo(code); + //2.6 保存订单,获取订单ID + orderInfoMapper.insert(orderInfo); + Long orderId = orderInfo.getId(); + + if (CollUtil.isNotEmpty(orderDetailVoList)) { + List collect = orderDetailVoList.stream().map( + m -> { + OrderDetail orderDetail = BeanUtil.copyProperties(m, OrderDetail.class); + orderDetail.setOrderId(orderId); + return orderDetail; + } + ).collect(Collectors.toList()); + orderDetailService.saveBatch(collect); + } + List orderDerateVoList = orderInfoVo.getOrderDerateVoList(); + if (CollUtil.isNotEmpty(orderDerateVoList)) { + List collect = orderDerateVoList.stream().map( + m -> { + OrderDerate orderDerate = BeanUtil.copyProperties(m, OrderDerate.class); + orderDerate.setOrderId(orderId); + return orderDerate; + } + ).collect(Collectors.toList()); + orderDerateService.saveBatch(collect); + } + return orderInfo; + } + } diff --git a/service/service-order/target/classes/com/atguigu/tingshu/order/api/OrderInfoApiController.class b/service/service-order/target/classes/com/atguigu/tingshu/order/api/OrderInfoApiController.class index a0c131e29609b4e9e0f8acb4642693c5b68af6cd..da6d1fe7c3235068b5f9667fb19d0a36a9492c06 100644 GIT binary patch literal 2754 zcmcIm%~Kpj6o0+2Y=AYvC}_kFM2!mpI*C62ey`u}z3xB% zey~bJ@6kvdg{Ue*)lmvl4WovO+Kk3Cnq~0ORY!g*MIkT7C7jpAJN*Axh8EK}J3Q-UOqtw6!zK!+kHKi9mqw~8QX89>?wd%X^FpX%rK1PSeT}zr-Jz+X#GNTV#mXMk>h2=0h85g#} zotzEwP1#yjpB45cp42tV;Zs^l3VV)gB?T3vm^E!Z4YSo}gi8E@xM}GZ+-y>}CpDNy zsBw|fG6~H#)!bjKmeVHuod`_7$LAd=4{!gCUx68B6!FNL5R487;(Cg`NR)?F)t*vo z-&w6ZPbk|FT~3Sin5NEI>Nbv}cEU6)O}aLY?TcNKzHJ9u9zQ6zYyI(d|u0C44SD3%K{%~P^@f$|H zfoz@ClRRl!=`!bhOgIwk&wJ5EQuPDmQ|1Sah?w$=UuKe$} zAK&}7rKhW~x|sjtE*QqBsf-mBZMbeixOPfEYpSl+TuN5OZQP~K7?;y7wIDUa;ggyo zW3`3yXB73Ry?A&1`jzb(aS*j}$;r*v01O8A@L*MsotuSGtDYHNN5eI=4{sSF+@9)j zg7FQ^YB0Wuu?izzIQYJW8OO*lhTDH5_A`D$bQoW?O}MPz##b4D0L7>cBf|@$9W$jo zuAWR78`^)R$dP4wCPX70OZ41*tQGC3M->53J+*qaT8i?%Eojma>VVC9SnQ-ONOQ=C z8J3BTdS<#k^vzK0!TcD6k2};$C-C#mr^FmONvE(8QE|MB9|m`QKEPRMRb#Dji4Ki; zAUl@nwJN&M>7%UjqTTPI>VhZ-qN5(t_M&15X`_b^IY<2ccrS(^8KwbxAG#mFg*v6; v${<$!C_1rGjN)`q6lcn!_^>jH5PbyQ5S=aQ4Z*=Vhlc56Y@ElW7=8R7J1I|N delta 196 zcmX>k+Q7zj>ff$?3=9mm4AK+1^x4=MI2ajBCfhKZOsw^qyoTxc<>RHPYb4pVg z88{OQGWGL|Qc{Z;6dBkVn1K2ifg~pb7m(%#^4Neh4_K6uffdZ-1@iQPqKrVARcku~ z<3=EZiGdGDf)q0_@G|fNNgjv-1_1^^u)GkM6b2hAEzQ8pAOch%TFfBEAP$s~0CFUw J85oNhqySt@7zh9W diff --git a/service/service-order/target/classes/com/atguigu/tingshu/order/service/OrderInfoService.class b/service/service-order/target/classes/com/atguigu/tingshu/order/service/OrderInfoService.class index 193e70deec56fd8b78dbc783cee3cbe6d63d07a6..c02e15a0042b21e5b387b527ebbcb005cfcb6d5b 100644 GIT binary patch literal 893 zcmb_b%}&BV5S}eUMMUujpFuBfqDRo92@!%3!+qPXWl7t`{b}^oJoo@UlyO>WZDOM_ zdYHrf?0nzMeEa(L`~m-0t5o=$PBU+m+{@WI z;KBxh-jbz^Ml1>G)LU}jxX>bSo^|t>j71P#wxgmQfu>O` z-~?`u$8~H{SrEF*%I0!#@_kv!7fX@ogqwv7ZkS>*H(Y4~ZjLvX1UlM!u`u}y0@pv_ zR~wH%=O4=?L{53Y8WGV6TOn{qe(WtnYFS+8C?L?Di7;WtDjfLX{{V*-LNlZAkb|$0 zOQhA+Eal}S1j0XYsJmAz10EG8D}fN%R0yp#GsqA5OT7$huU`+E4ZJmzR{8u&M7Z&O zNvKfYX?8YLE`bJG6Msen)$PJ2dTsQY*Z?xYcVHWwJk)lei2fn0iNj=<^TWy delta 53 zcmey%c9V(g)W2Q(7#J9A8Mr5Mb#ieAXQt;RmXsEyPOe~DDa^pY#J~=eWn$o9-~`iL E0LJPJO8@`> diff --git a/service/service-order/target/classes/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.class b/service/service-order/target/classes/com/atguigu/tingshu/order/service/impl/OrderInfoServiceImpl.class index b3a1e5e86d787079b8542ebe13acf299a2ee985e..d15be6b118d2d7c74f231b71fc1b9e232a560be3 100644 GIT binary patch literal 13230 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 ZNN9%lG&6K$Xf~-u`Rkm}+|bd8{U7Exz@q>F literal 9069 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 diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java index 2c285ab..33aa507 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java @@ -5,6 +5,7 @@ import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.user.service.UserInfoService; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; @@ -83,8 +84,18 @@ public class UserInfoApiController { Long userId = AuthContextHolder.getUserId(); List list = userInfoService.findUserPaidTrackList(userId, albumId); return Result.ok(list); - - + } + /** + * 用户支付成功后,权益方法,虚拟物品(VIP会员、专辑、声音)发货 + * 如果支付方式是微信,微信支付会异步回调,没有token造成接口无法调用,故不加@GuiGuLogin注解 + * @param userPaidRecordVo + * @return + */ + @Operation(summary = "用户支付成功后,权益方法,虚拟物品(VIP会员、专辑、声音)发货") + @PostMapping("/userInfo/savePaidRecord") + public Result savePaidRecord(@RequestBody UserPaidRecordVo userPaidRecordVo){ + userInfoService.savePaidRecord(userPaidRecordVo); + return Result.ok(); } } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/DeliveryStrategy.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/DeliveryStrategy.java new file mode 100644 index 0000000..15a7f11 --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/DeliveryStrategy.java @@ -0,0 +1,12 @@ +package com.atguigu.tingshu.user.pattern; + +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; + +public interface DeliveryStrategy { + + /** + * 虚拟物品"发货"抽象方法 + * @param userPaidRecordVo + */ + void delivery(UserPaidRecordVo userPaidRecordVo); +} diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/factory/DeliveryStrategyFactory.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/factory/DeliveryStrategyFactory.java new file mode 100644 index 0000000..8557caa --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/factory/DeliveryStrategyFactory.java @@ -0,0 +1,29 @@ +package com.atguigu.tingshu.user.pattern.factory; + +import com.atguigu.tingshu.user.pattern.DeliveryStrategy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +@Slf4j +public class DeliveryStrategyFactory { + + @Autowired + private Map deliveryStrategyMap; + + + public DeliveryStrategy getDeliveryStrategy(String itemType){ + log.info("itemType:{}", itemType); + if (deliveryStrategyMap.containsKey(itemType)) { + return deliveryStrategyMap.get(itemType); + } + log.error("当前商品类型不支持处理!"); + throw new RuntimeException("当前商品类型不支持处理!"); + } + + } + + diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/AlbumDelivery.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/AlbumDelivery.java new file mode 100644 index 0000000..ba0e08a --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/AlbumDelivery.java @@ -0,0 +1,39 @@ +package com.atguigu.tingshu.user.pattern.impl; + +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.model.user.UserPaidAlbum; +import com.atguigu.tingshu.user.mapper.UserPaidAlbumMapper; +import com.atguigu.tingshu.user.pattern.DeliveryStrategy; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component(SystemConstant.ORDER_ITEM_TYPE_ALBUM) +@Slf4j +public class AlbumDelivery implements DeliveryStrategy { + + @Autowired + private UserPaidAlbumMapper userPaidAlbumMapper; + + @Override + public void delivery(UserPaidRecordVo userPaidRecordVo) { + log.info("专辑发货"); + //1.1 根据订单编号查询是否存在购买记录,如果存在则忽略 + Long count = userPaidAlbumMapper.selectCount( + new LambdaQueryWrapper() + .eq(UserPaidAlbum::getOrderNo, userPaidRecordVo.getOrderNo()) + .select(UserPaidAlbum::getId) + ); + if (count > 0){ + return; + } + UserPaidAlbum userPaidAlbum =new UserPaidAlbum(); + userPaidAlbum.setUserId(userPaidRecordVo.getUserId()); + userPaidAlbum.setOrderNo(userPaidRecordVo.getOrderNo()); + userPaidAlbum.setAlbumId(userPaidRecordVo.getItemIdList().get(0)); + userPaidAlbumMapper.insert(userPaidAlbum); + + } +} diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/TrackDelivery.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/TrackDelivery.java new file mode 100644 index 0000000..c80d4a2 --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/TrackDelivery.java @@ -0,0 +1,52 @@ +package com.atguigu.tingshu.user.pattern.impl; + +import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.model.album.TrackInfo; +import com.atguigu.tingshu.model.user.UserPaidTrack; +import com.atguigu.tingshu.user.mapper.UserPaidTrackMapper; +import com.atguigu.tingshu.user.pattern.DeliveryStrategy; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component(SystemConstant.ORDER_ITEM_TYPE_TRACK) +public class TrackDelivery implements DeliveryStrategy { + + @Autowired + private UserPaidTrackMapper userPaidTrackMapper; + @Autowired + private AlbumFeignClient albumFeignClient; + + + @Override + public void delivery(UserPaidRecordVo userPaidRecordVo) { + log.info("声音发货"); + //2. 处理购买项目类型为声音 + //2.1 根据订单编号查询是否存在购买记录,如果存在则忽略 + Long count = userPaidTrackMapper.selectCount( + new LambdaQueryWrapper() + .eq(UserPaidTrack::getOrderNo, userPaidRecordVo.getOrderNo()) + .select(UserPaidTrack::getId) + ); + if(count>0){ + return; + } + //2.2 新增声音购买记录 + //远程调用专辑服务获取声音信息,得到所属专辑ID + TrackInfo trackInfo = albumFeignClient.getTrackInfo(userPaidRecordVo.getItemIdList().get(0)).getData(); + Long albumId = trackInfo.getAlbumId(); + userPaidRecordVo.getItemIdList().forEach(trackId -> { + UserPaidTrack userPaidTrack = new UserPaidTrack(); + userPaidTrack.setOrderNo(userPaidRecordVo.getOrderNo()); + userPaidTrack.setUserId(userPaidRecordVo.getUserId()); + userPaidTrack.setAlbumId(albumId); + userPaidTrack.setTrackId(trackId); + userPaidTrackMapper.insert(userPaidTrack); + }); + + } +} diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/VIPDelivery.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/VIPDelivery.java new file mode 100644 index 0000000..4266f2e --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/pattern/impl/VIPDelivery.java @@ -0,0 +1,83 @@ +package com.atguigu.tingshu.user.pattern.impl; + +import cn.hutool.core.date.DateUtil; +import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.model.user.UserInfo; +import com.atguigu.tingshu.model.user.UserVipService; +import com.atguigu.tingshu.model.user.VipServiceConfig; +import com.atguigu.tingshu.user.mapper.UserInfoMapper; +import com.atguigu.tingshu.user.mapper.UserVipServiceMapper; +import com.atguigu.tingshu.user.mapper.VipServiceConfigMapper; +import com.atguigu.tingshu.user.pattern.DeliveryStrategy; +import com.atguigu.tingshu.user.service.impl.UserInfoServiceImpl; +import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Slf4j +@Component(SystemConstant.ORDER_ITEM_TYPE_VIP) +public class VIPDelivery implements DeliveryStrategy { + @Autowired + private UserVipServiceMapper userVipServiceMapper; + @Autowired + private VipServiceConfigMapper vipServiceConfigMapper; + @Autowired + private UserInfoMapper userInfoMapper; + + + + @Override + public void delivery(UserPaidRecordVo userPaidRecordVo) { + //3.TODO 处理购买项目类型为VIP会员 + //3.1 根据订单编号查询是否存在购买记录,如果存在则忽略 + Long cout = userVipServiceMapper.selectCount( + new LambdaQueryWrapper() + .eq(UserVipService::getOrderNo, userPaidRecordVo.getOrderNo()) + .select(UserVipService::getId) + ); + if (cout > 0) { + return; + } + //3.2 新增会员购买记录 + UserVipService userVipService = new UserVipService(); + userVipService.setOrderNo(userPaidRecordVo.getOrderNo()); + userVipService.setUserId(userPaidRecordVo.getUserId()); + //3.2.1 获取当前用户身份,判断是否为VIP + Boolean isVIP = false; + UserInfo userInfo = userInfoMapper.selectById(userPaidRecordVo.getUserId()); + if (userInfo.getIsVip().intValue() == 1 && userInfo.getVipExpireTime().after(new Date())) { + isVIP = true; + } + //3.2.2 获取用户购买套餐信息,得到套餐服务月 + Long vipID = userPaidRecordVo.getItemIdList().get(0); + VipServiceConfig vipServiceConfig = vipServiceConfigMapper.selectById(vipID); + Integer serviceMonth = vipServiceConfig.getServiceMonth(); + //3.2.3 本次会员生效时间 + if (!isVIP) { + // 如果是普通用户,生效时间为当前时间 + userVipService.setStartTime(new Date()); + //3.2.4 本次会员到期时间 + userVipService.setExpireTime(DateUtil.offsetMonth(new Date(), serviceMonth)); + } else { + // 如果是VIP用户 + // 生效时间=现有会员到期时间+1天 + userVipService.setStartTime(DateUtil.offsetDay(userInfo.getVipExpireTime(), 1)); + userVipService.setExpireTime(DateUtil.offsetMonth(userVipService.getStartTime(), serviceMonth)); + } + userVipServiceMapper.insert(userVipService); + + //3.3 更新用户表会员标识以及会员到期时间 + UserInfo userInfo1 = new UserInfo(); + userInfo1.setId(userPaidRecordVo.getUserId()); + userInfo1.setIsVip(1); + userInfo1.setVipExpireTime(userVipService.getExpireTime()); + userInfoMapper.updateById(userInfo1); + + + } +} diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java index de32c4c..85cb791 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java @@ -2,6 +2,7 @@ package com.atguigu.tingshu.user.service; import com.atguigu.tingshu.model.user.UserInfo; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -20,4 +21,7 @@ public interface UserInfoService extends IService { Boolean isPaidAlbum(Long userId, Long albumId); List findUserPaidTrackList(Long userId, Long albumId); + + void savePaidRecord(UserPaidRecordVo userPaidRecordVo); + } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java index 472650c..2350e15 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java @@ -6,18 +6,20 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import com.atguigu.tingshu.album.AlbumFeignClient; import com.atguigu.tingshu.common.cache.GuiGuCache; import com.atguigu.tingshu.common.constant.RedisConstant; +import com.atguigu.tingshu.common.constant.SystemConstant; import com.atguigu.tingshu.common.rabbit.constant.MqConst; import com.atguigu.tingshu.common.rabbit.service.RabbitService; -import com.atguigu.tingshu.model.user.UserInfo; -import com.atguigu.tingshu.model.user.UserPaidAlbum; -import com.atguigu.tingshu.model.user.UserPaidTrack; -import com.atguigu.tingshu.user.mapper.UserInfoMapper; -import com.atguigu.tingshu.user.mapper.UserPaidAlbumMapper; -import com.atguigu.tingshu.user.mapper.UserPaidTrackMapper; +import com.atguigu.tingshu.model.album.TrackInfo; +import com.atguigu.tingshu.model.user.*; +import com.atguigu.tingshu.user.mapper.*; +import com.atguigu.tingshu.user.pattern.DeliveryStrategy; +import com.atguigu.tingshu.user.pattern.factory.DeliveryStrategyFactory; import com.atguigu.tingshu.user.service.UserInfoService; import com.atguigu.tingshu.vo.user.UserInfoVo; +import com.atguigu.tingshu.vo.user.UserPaidRecordVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -27,6 +29,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -50,6 +53,12 @@ public class UserInfoServiceImpl extends ServiceImpl i private UserPaidAlbumMapper userPaidAlbumMapper; @Autowired private UserPaidTrackMapper userPaidTrackMapper; + @Autowired + private VipServiceConfigMapper vipServiceConfigMapper; + @Autowired + private UserVipServiceMapper userVipServiceMapper; + @Autowired + private DeliveryStrategyFactory deliveryStrategyFactory; @Override public Map wxLogin(String code) { @@ -202,5 +211,16 @@ public class UserInfoServiceImpl extends ServiceImpl i } return null; } + + @Override + public void savePaidRecord(UserPaidRecordVo userPaidRecordVo) { + //项目类型: 1001-专辑 1002-声音 1003-vip会员 + String itemType = userPaidRecordVo.getItemType(); + //1.从策略工厂获取具体策略实现类对象 + DeliveryStrategy strategy = deliveryStrategyFactory.getDeliveryStrategy(itemType); + //2.调用策略实现类对象,进行发货方法调用 + strategy.delivery(userPaidRecordVo); + + } } diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class b/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class index d1ef641f254705215ce9df4fea0d479bb5cf4f3c..7b8d3e17f72d4e83197a1e70a1d9e1dcc5bf2b32 100644 GIT binary patch delta 1190 zcmb7?OHWf#6ouEhZ6UVhibNiXkqAB_#NfY;-BXKgd-c#@%XFh^~KKu1#U^wG&~S+C!J;(RwI*kn`l4GzGOh)i1}~RS01k1 z%nJV7TuTrO3=|wSML;g97&{FCj^Q|00w-`1Hh8p{qi9rW?W_Uz!hwCdeh(~MXPbH% zRpS)v9IUFrX{yg~-zJy_YWXQR3rU#I=p2RTgQ!D2gNAO1AR2Ljo0*cciGe^7E=mB# z+H>atok7*_tb&!d=8#izdnf`5QXB=iq;tqzGcNNoD+eywEUd}E6_IHR?uOT*+Y=1CWtn#EKm{zCxu9o#-Nh*;{TS(q5(!lfT& zyzh0>!Gw*A?yh=u>(#lHevQ72c)ow$KLM=cvFVBHtq;BCZY6!XC{Oa#1%WAko%}jg zmS8r`Ovuyt8$^?Vh9uuo3=FUg_)Gz2Fw0C}4)eSq(Rl8SJV~vGJwOy*j4Aynbmo1Q zUPdXT+2>`~0v4%WV%;ft3@r1}umVXq#AubmHG>v13^wWz1~#$9qFZui83;tMEddxe zV*YW(;8!!#aBxD9GbDG4A|PyYgppGm@+^-6hdJm_vgzz`VF$ZB*<;TjYo@Bm$gJ(N zCb@ewUISjxX3rfc_+j31$V1D(5sqyGC(1xjQwHeD;0*$&6bri1MsggM=i&;= zNSqlEvW64XMmZ+bT zn3t~al%JoInwV$J$RL`QnU@k;oLU4@A5xTG delta 48 zcmey&^@E-3)W2Q(7#J9A8KgIIooAZN&9a1%W%34=3?T+425z7P6N3bUB$$>00B_F< AlK=n! diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class b/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class index ae93408d8890bf500e72f05654fd81e5dcf6d73e..ed51420e6b3feb1a6c16ac29ef292b52fc7cfe5b 100644 GIT binary patch delta 4054 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 delta 3362 zcmbVO33OG}72W&&|MQ1DGVmb@2+@!P$iN`9(L%FOQM;l^gUks-8cj%oA%P5NZS*6~ zC`x^5i$%qOhEl6wXt1F|BM7K9+Ce*Li&e3KR<-QRm=M8zjyb!_nfoO zaPPaFjnCJFo;lpL3qYY2-WFOmgc;7DQ5jBKN?K&5%~_mH1ZpdrYo|9>RTG}EIYj}^ zB|8Wju%a7F;>eqQZt zNE^dzoV{t8qgL@c8$NtB#2a{{pI6$fKzWF3c(b3k*j&q7o#3z;-gU%8r+avYvo15y zSv#z(W6kgz;yND7m}e#YKE#*#il2Y5`9~gfQnR{Kni73{ErbHTZgTF%;qALC-L9JIWY%rmQEePPuwNFHs_*T3WwbQKTfi6)WTh( zLe7h$Q_?JVwpYupPmHsC3doAHEx#3TJYx=Ky&ze92m#Bs`8;0`nWBb<>Lyd3>Sn){ zNMt)Jva>yYE7=)8c5>u4_%R&&uwU(JAp@g8ep}->y>BS*MWH;ib<798+ zonvK8=HMf;65}MKNPWhoBbO6|sJAb72e{4Uz&rF5BR$9PPCdm)Pap5%cl0K|%k}Wk z>8Q*3G9&KdB^ajX6eM9PhN2LoF%9{87vOA3rsG`wF2H%1hx4%*U&B(NW?YEXD8}t5 z!6W!Ox^NK=U@o4+e7uA*yoqx3Vj;a)L?0G2j0!_$2}07H!@K!CMUfQ2hupw>l+B@d zpZD@Uc;vQ+8+kvxGIj=@kjy8OPDE=*yq{BLl1FE7QEBz?=%-N8aG~$Pv@R9AZ^RR{%eDO0ktNO)5H|$_lpsj%dPU4fCR(dV$`g10@Eb%GP+Iw$C}xp*LMC`o*ZXJ{uEP$ z;ff7tKmd&xgcZt1Ge)8XV|BW@Rm@dBfSg#I8o60;E1P3HThh!ho;}8M(Bgxdly^Dn z&JXW}Vs^L^UN`%$W`yAV&K0?!(5Uy_N1GU#T??Yhc-mX-Z1EBjcUsZM;_&AiEI zifR$n?1p!SoVb&FH0f@>0N9HPKR!7ofW8bqlN92!{JFwWqk0#pmfB&S-rPZbCDQ7^i}u7)d+u4d&inPakCtu7r|RfMJ#=I zSs<1^^a%9Z>lTPr1KR~+)j)ffKB6a?y|%~+n=kdG?R~Dfom^EG=IR~1cDHuCCw3W0 z6UZ`Wi@A+>diflCbarlWY6=P>x_m`<{ebICC$HZsrGeL({YMPwd;JUk(mhl7E1h`e z$k2t%{Tu?p!GXtlQwR3C_aVk8Xq+Xr=xP0Hz9?+*CHK=DF&2KKwZE0H4e|V)7QV_q z@eRJoKl3dadCxpQFwejD&40*$nfd7I{~U!rr7_x%a QAW_g2&q}b8tic%eUl;85xc~qF