From ac6a07af9baba0e0fc8d181aae904da679ae8f5a Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期四, 06 七月 2023 10:04:07 +0800 Subject: [PATCH] 更新部分功能接口 --- cloud-server-activity/src/main/java/com/dsh/activity/service/UserCouponService.java | 11 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/AppUserClient.java | 4 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java | 12 cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java | 81 + cloud-server-activity/pom.xml | 19 cloud-server-activity/src/main/resources/sharding-jdbc.properties | 25 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/StudentClient.java | 4 cloud-server-activity/src/main/java/com/dsh/activity/model/CouponListVo.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/util/GDMapGeocodingUtil.java | 148 +++ cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java | 112 ++ cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpClientUtil.java | 267 ++++++ cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java | 21 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/CouponServiceImpl.java | 12 cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/UserCouponClient.java | 22 cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserCouponMapper.java | 17 cloud-server-course/src/main/java/com/dsh/course/model/PaymentCourseVo.java | 26 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuOfCoursesDetails.java | 13 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageClient.java | 22 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java | 2 cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java | 4 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java | 23 cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java | 18 cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/Coupon.java | 115 ++ cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpResult.java | 31 cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java | 4 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java | 36 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserCouponServiceImpl.java | 70 + cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/UserCoupon.java | 41 + cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java | 22 cloud-server-course/src/main/java/com/dsh/course/feignclient/model/CourseHoursType.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/Student.java | 2 cloud-server-activity/src/main/resources/mapper/UserCouponMapper.xml | 16 cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/GetStuSourseList.java | 19 cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java | 7 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStudentCourse.java | 14 cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java | 113 ++ cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java | 8 cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java | 4 cloud-server-activity/src/main/java/com/dsh/activity/util/ToolUtil.java | 544 +++++++++++++ cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java | 12 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuSessionList.java | 20 /dev/null | 30 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/AppUser.java | 2 cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java | 130 +++ cloud-server-account/src/main/java/com/dsh/account/feignclient/other/model/GetAllNearbyStoreList.java | 13 cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java | 86 ++ cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseSessionNameClient.java | 11 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java | 128 +++ cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java | 18 cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java | 5 51 files changed, 2,247 insertions(+), 123 deletions(-) diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java index 66a66b2..594eb18 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java @@ -1,6 +1,7 @@ package com.dsh.account.feignclient.competition; +import com.dsh.account.feignclient.competition.model.GetStuSourseList; import com.dsh.account.feignclient.competition.model.PurchaseRecordVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -12,8 +13,6 @@ @FeignClient(value = "mb-cloud-competition") public interface DeductionCompetitionsClient { @PostMapping("/competition/getCompetitionsDetails") - public List<PurchaseRecordVo> getStuSourseList(@RequestBody Date startTime, - @RequestBody Date endTime, - @RequestBody Integer appUserId); + List<PurchaseRecordVo> getStuSourseList(GetStuSourseList getStuSourseList); } diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/GetStuSourseList.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/GetStuSourseList.java new file mode 100644 index 0000000..2d1fbdb --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/GetStuSourseList.java @@ -0,0 +1,19 @@ +package com.dsh.account.feignclient.competition.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/6 9:59 + */ +@Data +public class GetStuSourseList { + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + private Integer appUserId; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java index 7b0264c..0607def 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java @@ -1,9 +1,6 @@ package com.dsh.account.feignclient.course; -import com.dsh.account.feignclient.course.model.CourseOfStoreVo; -import com.dsh.account.feignclient.course.model.StuCourseResp; -import com.dsh.account.feignclient.course.model.StuWithCoursesListVo; -import com.dsh.account.feignclient.course.model.StudentOfCourseVo; +import com.dsh.account.feignclient.course.model.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -22,11 +19,8 @@ List<CourseOfStoreVo> getStoreOfCourses(); @PostMapping("/coursePack/stuOfCourses") - StuWithCoursesListVo getStuOfCoursesDetails(@RequestBody Integer stuId, - @RequestBody Integer appUserId); + StuWithCoursesListVo getStuOfCoursesDetails(GetStuOfCoursesDetails getStuOfCoursesDetails); @PostMapping("/coursePack/continuingCourse") - StudentOfCourseVo getStudentCourse(@RequestBody Integer courseId, - @RequestBody Integer stuId, - @RequestBody Integer appUserId); + StudentOfCourseVo getStudentCourse(GetStudentCourse getStudentCourse); } diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseSessionNameClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseSessionNameClient.java index ef01dd4..31452b2 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseSessionNameClient.java +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseSessionNameClient.java @@ -2,6 +2,7 @@ import com.dsh.account.feignclient.competition.model.PurchaseRecordVo; +import com.dsh.account.feignclient.course.model.GetStuSessionList; import com.dsh.account.feignclient.course.model.StuSessionDetailsVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -15,15 +16,9 @@ @PostMapping("/coursePack/sessionNames") - List<StuSessionDetailsVo> getStuSessionList(@RequestBody Date startTime, - @RequestBody Date endTime, - @RequestBody Integer stuId, - @RequestBody Integer appUserId); + List<StuSessionDetailsVo> getStuSessionList(GetStuSessionList getStuSessionList); @PostMapping("/coursePack/paymentCourse") - public List<PurchaseRecordVo> queryCourseDetails(@RequestBody Date startTime, - @RequestBody Date endTime, - @RequestBody Integer stuId, - @RequestBody Integer appUserId); + public List<PurchaseRecordVo> queryCourseDetails(GetStuSessionList getStuSessionList); } diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuOfCoursesDetails.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuOfCoursesDetails.java new file mode 100644 index 0000000..6fb419f --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuOfCoursesDetails.java @@ -0,0 +1,13 @@ +package com.dsh.account.feignclient.course.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/6 9:46 + */ +@Data +public class GetStuOfCoursesDetails { + private Integer stuId; + private Integer appUserId; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuSessionList.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuSessionList.java new file mode 100644 index 0000000..6361c95 --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStuSessionList.java @@ -0,0 +1,20 @@ +package com.dsh.account.feignclient.course.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/6 9:55 + */ +@Data +public class GetStuSessionList { + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + private Integer stuId; + private Integer appUserId; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStudentCourse.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStudentCourse.java new file mode 100644 index 0000000..cf4f7fb --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/GetStudentCourse.java @@ -0,0 +1,14 @@ +package com.dsh.account.feignclient.course.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/6 9:48 + */ +@Data +public class GetStudentCourse { + private Integer courseId; + private Integer stuId; + private Integer appUserId; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java index 0b60f71..a3469b0 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/StoreClient.java @@ -1,7 +1,7 @@ package com.dsh.account.feignclient.other; import com.dsh.account.feignclient.course.model.QueryStoreList; -import com.dsh.account.feignclient.other.model.Store; +import com.dsh.account.feignclient.other.model.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -11,9 +11,6 @@ * @author zhibing.pu * @date 2023/6/24 15:54 */ -import com.dsh.account.feignclient.other.model.StoreDetailOfCourse; -import com.dsh.account.feignclient.other.model.StoreInfo; -import com.dsh.account.feignclient.other.model.StoreLonLatList; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -24,11 +21,6 @@ public interface StoreClient { - - - - - /** * 获取门店列表 * @return @@ -37,16 +29,14 @@ List<Store> queryStoreList(QueryStoreList queryStoreList); - - @PostMapping("/storeDetail/courseOfSto") - public StoreDetailOfCourse getCourseOfStore(@RequestBody Integer storeId); + StoreDetailOfCourse getCourseOfStore(@RequestBody Integer storeId); @PostMapping("/storeDetail/nearbyStore") - List<StoreInfo> getAllNearbyStoreList(@RequestBody String longitude, @RequestBody String latitude); + List<StoreInfo> getAllNearbyStoreList(GetAllNearbyStoreList getAllNearbyStoreList); @PostMapping("/storeDetail/storeOfLonLat") - public List<StoreLonLatList> getAllStoreLonLats(@RequestBody String longitude, @RequestBody String latitude); + List<StoreLonLatList> getAllStoreLonLats(GetAllNearbyStoreList getAllNearbyStoreList); } diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/model/GetAllNearbyStoreList.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/model/GetAllNearbyStoreList.java new file mode 100644 index 0000000..cc842c2 --- /dev/null +++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/model/GetAllNearbyStoreList.java @@ -0,0 +1,13 @@ +package com.dsh.account.feignclient.other.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/6 9:52 + */ +@Data +public class GetAllNearbyStoreList { + private String longitude; + private String latitude; +} diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java index 515f5bc..17ea0eb 100644 --- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java +++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java @@ -7,21 +7,17 @@ import com.dsh.account.feignclient.activity.IntroduceRewardsClient; import com.dsh.account.feignclient.activity.UserConponClient; import com.dsh.account.feignclient.competition.DeductionCompetitionsClient; +import com.dsh.account.feignclient.competition.model.GetStuSourseList; import com.dsh.account.feignclient.competition.model.PurchaseRecordVo; import com.dsh.account.feignclient.course.CancelListClient; import com.dsh.account.feignclient.course.CoursePaymentClient; import com.dsh.account.feignclient.course.CourseRecordClient; import com.dsh.account.feignclient.course.CourseSessionNameClient; -import com.dsh.account.feignclient.course.model.StuSessionDetailsVo; -import com.dsh.account.feignclient.course.model.StuWithCoursesListVo; -import com.dsh.account.feignclient.course.model.StudentOfCourseVo; +import com.dsh.account.feignclient.course.model.*; import com.dsh.account.feignclient.other.NoticeClient; import com.dsh.account.feignclient.other.QuestionClient; import com.dsh.account.feignclient.other.StoreClient; -import com.dsh.account.feignclient.other.model.StoreDetailOfCourse; -import com.dsh.account.feignclient.other.model.StoreInfo; -import com.dsh.account.feignclient.other.model.StoreLonLatList; -import com.dsh.account.feignclient.other.model.SysNotice; +import com.dsh.account.feignclient.other.model.*; import com.dsh.account.mapper.TAppUserMapper; import com.dsh.account.mapper.TStudentMapper; import com.dsh.account.model.vo.classDetails.classInsVo.ClassDetailsInsVo; @@ -41,6 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -58,37 +55,37 @@ @Service public class TStudentServiceImpl extends ServiceImpl<TStudentMapper, TStudent> implements TStudentService { - @Autowired + @Resource private CourseSessionNameClient sessionNameClient; - @Autowired + @Resource private DeductionCompetitionsClient dcttClient; - @Autowired + @Resource private CancelListClient cancelcClient; - @Autowired + @Resource private IntroduceRewardsClient idrClient; - @Autowired + @Resource private CourseRecordClient crClient; - @Autowired + @Resource private CoursePaymentClient couPayClient; - @Autowired + @Resource private UserConponClient userCClient; - @Autowired + @Resource private StoreClient storeClient; - @Autowired + @Resource private NoticeClient noClient; - @Autowired + @Resource private QuestionClient quesClient; - @Autowired + @Resource private TAppUserMapper tauMapper; @Override @@ -117,7 +114,12 @@ ClassDetailsInsVo insVo = new ClassDetailsInsVo(); Date localMonthStart = DateTimeHelper.getCurrentMouthStart(); Date localMonthEnd = DateTimeHelper.getCurrentMouthEnd(); - List<StuSessionDetailsVo> stuSessionList = sessionNameClient.getStuSessionList(localMonthStart,localMonthEnd,stuId,userIdFormRedis); + GetStuSessionList getStuSessionList = new GetStuSessionList(); + getStuSessionList.setStartTime(localMonthStart); + getStuSessionList.setEndTime(localMonthEnd); + getStuSessionList.setStuId(stuId); + getStuSessionList.setAppUserId(userIdFormRedis); + List<StuSessionDetailsVo> stuSessionList = sessionNameClient.getStuSessionList(getStuSessionList); TStudent tStudent = this.baseMapper.selectById(stuId); if (ToolUtil.isNotEmpty(tStudent)){ insVo.setStuId(tStudent.getId()); @@ -125,12 +127,15 @@ insVo.setStuImage(tStudent.getHeadImg()); List<PurchaseRecordVo> purchaseRecordVoList = new ArrayList<>(); - - List<PurchaseRecordVo> stuSourseList = dcttClient.getStuSourseList(localMonthStart,localMonthEnd,userIdFormRedis); + GetStuSourseList getStuSourseList = new GetStuSourseList(); + getStuSourseList.setStartTime(localMonthStart); + getStuSourseList.setEndTime(localMonthEnd); + getStuSourseList.setAppUserId(userIdFormRedis); + List<PurchaseRecordVo> stuSourseList = dcttClient.getStuSourseList(getStuSourseList); purchaseRecordVoList.addAll(stuSourseList); List<PurchaseRecordVo> cancelCourseList = cancelcClient.getCancelCourseList(localMonthStart,localMonthEnd,stuId,userIdFormRedis); purchaseRecordVoList.addAll(cancelCourseList); - List<PurchaseRecordVo> purchaseRecordVos = sessionNameClient.queryCourseDetails(localMonthStart,localMonthEnd,stuId,userIdFormRedis); + List<PurchaseRecordVo> purchaseRecordVos = sessionNameClient.queryCourseDetails(getStuSessionList); purchaseRecordVoList.addAll(purchaseRecordVos); List<TAppUser> tAppUsers = tauMapper.selectList(new QueryWrapper<TAppUser>() .eq("referralUserId",userIdFormRedis ) @@ -140,7 +145,10 @@ purchaseRecordVoList.addAll(purchaseRecordVos1); insVo.setSessionNames(stuSessionList); insVo.setDetails(dealDataOfTime(purchaseRecordVoList)); - StuWithCoursesListVo stuOfCoursesDetails = couPayClient.getStuOfCoursesDetails(stuId, userIdFormRedis); + GetStuOfCoursesDetails getStuOfCoursesDetails = new GetStuOfCoursesDetails(); + getStuOfCoursesDetails.setStuId(stuId); + getStuOfCoursesDetails.setAppUserId(userIdFormRedis); + StuWithCoursesListVo stuOfCoursesDetails = couPayClient.getStuOfCoursesDetails(getStuOfCoursesDetails); insVo.setTotalNums(stuOfCoursesDetails.getTotalNums()); insVo.setDeductedNums(stuOfCoursesDetails.getDeductedNums()); insVo.setRemainingNums(stuOfCoursesDetails.getRemainingNums()); @@ -156,12 +164,20 @@ List<PurchaseRecordVo> purchaseRecordVoList = new ArrayList<>(); Date startTime = DateTimeHelper.getCurrentIdetMouthStart(timeRequest.getStartTime()); Date endTime = DateTimeHelper.getCurrentIdeaMouthEnd(timeRequest.getEndTime()); - - List<PurchaseRecordVo> stuSourseList = dcttClient.getStuSourseList(startTime,endTime,appUserId); + GetStuSourseList getStuSourseList = new GetStuSourseList(); + getStuSourseList.setStartTime(startTime); + getStuSourseList.setEndTime(endTime); + getStuSourseList.setAppUserId(appUserId); + List<PurchaseRecordVo> stuSourseList = dcttClient.getStuSourseList(getStuSourseList); purchaseRecordVoList.addAll(stuSourseList); List<PurchaseRecordVo> cancelCourseList = cancelcClient.getCancelCourseList(startTime,endTime,timeRequest.getStuId(),appUserId); purchaseRecordVoList.addAll(cancelCourseList); - List<PurchaseRecordVo> purchaseRecordVos = sessionNameClient.queryCourseDetails(startTime,endTime,timeRequest.getStuId(),appUserId); + GetStuSessionList getStuSessionList = new GetStuSessionList(); + getStuSessionList.setStartTime(startTime); + getStuSessionList.setEndTime(endTime); + getStuSessionList.setStuId(timeRequest.getStuId()); + getStuSessionList.setAppUserId(appUserId); + List<PurchaseRecordVo> purchaseRecordVos = sessionNameClient.queryCourseDetails(getStuSessionList); purchaseRecordVoList.addAll(purchaseRecordVos); List<TAppUser> tAppUsers = tauMapper.selectList(new QueryWrapper<TAppUser>() .eq("referralUserId",appUserId ) @@ -185,7 +201,11 @@ public CourseDetailsOfContinuationResp queryStuOfCourseDetails(Integer lessonId, Integer stuId, Integer appUserId) { CourseDetailsOfContinuationResp resp = new CourseDetailsOfContinuationResp(); - StudentOfCourseVo studentCourse = couPayClient.getStudentCourse(lessonId,stuId,appUserId); + GetStudentCourse getStudentCourse = new GetStudentCourse(); + getStudentCourse.setCourseId(lessonId); + getStudentCourse.setStuId(stuId); + getStudentCourse.setAppUserId(appUserId); + StudentOfCourseVo studentCourse = couPayClient.getStudentCourse(getStudentCourse); StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(studentCourse.getStoreId()); @@ -220,8 +240,11 @@ @Override public ExploreDatasVo queryIndexOfExplores(LonLatRequest llrequest) { ExploreDatasVo datasVo = new ExploreDatasVo(); - List<StoreInfo> allNearbyStoreList = storeClient.getAllNearbyStoreList(llrequest.getLongitude(),llrequest.getLatitude()); - List<StoreLonLatList> allStoreLonLats = storeClient.getAllStoreLonLats(llrequest.getLongitude(), llrequest.getLatitude()); + GetAllNearbyStoreList getAllNearbyStoreList = new GetAllNearbyStoreList(); + getAllNearbyStoreList.setLongitude(llrequest.getLongitude()); + getAllNearbyStoreList.setLatitude(llrequest.getLatitude()); + List<StoreInfo> allNearbyStoreList = storeClient.getAllNearbyStoreList(getAllNearbyStoreList); + List<StoreLonLatList> allStoreLonLats = storeClient.getAllStoreLonLats(getAllNearbyStoreList); datasVo.setStoreLists(allNearbyStoreList); datasVo.setLonLatLists(allStoreLonLats); return datasVo; diff --git a/cloud-server-activity/pom.xml b/cloud-server-activity/pom.xml index b49f87f..535bb1a 100644 --- a/cloud-server-activity/pom.xml +++ b/cloud-server-activity/pom.xml @@ -75,6 +75,25 @@ <artifactId>swagger-models</artifactId> <version>1.5.22</version> </dependency> + <dependency> + <groupId>org.apache.shardingsphere</groupId> + <artifactId>shardingsphere-jdbc-core</artifactId> + <version>5.2.0</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + </dependency> + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.1</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpmime</artifactId> + <version>4.5.2</version> + </dependency> </dependencies> <build> diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java index dcf1887..c52a588 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java @@ -1,5 +1,6 @@ package com.dsh.activity.controller; +import com.dsh.activity.entity.Coupon; import com.dsh.activity.model.CouponListVo; import com.dsh.activity.service.ICouponService; import com.dsh.activity.util.ResultUtil; @@ -36,7 +37,7 @@ @ApiImplicitParam(value = "1=积分购买,2=注册赠送", name = "distributionMethod", dataType = "int", required = true), @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) - public ResultUtil queryCouponList(@RequestBody Integer distributionMethod){ + public ResultUtil<List<CouponListVo>> queryCouponList(@RequestBody Integer distributionMethod){ if(null == distributionMethod){ return ResultUtil.paranErr("distributionMethod"); } @@ -52,4 +53,22 @@ return ResultUtil.success(); } } + + + /** + * 根据id获取优惠券信息 + * @param id + * @return + */ + @ResponseBody + @PostMapping("/coupon/queryCouponById") + public Coupon queryCouponById(@RequestBody Integer id){ + try { + Coupon coupon = couponService.getById(id); + return coupon; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserConponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserConponController.java deleted file mode 100644 index 2978d06..0000000 --- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserConponController.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.dsh.activity.controller; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.dsh.activity.entity.Coupon; -import com.dsh.activity.entity.UserCoupon; -import com.dsh.activity.feignclient.model.CouponStuAvailableVo; -import com.dsh.activity.service.ICouponService; -import com.dsh.activity.service.UserCouponService; -import io.swagger.annotations.Api; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Api -@CrossOrigin -@RestController -@RequestMapping("") -public class UserConponController { - - @Autowired - private UserCouponService uconService; - - @Autowired - private ICouponService cService; - - private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); - - @PostMapping("/userConpon/getStuOfConpons") - public List<CouponStuAvailableVo> queryUserWithConponList(@RequestBody Integer appUserId){ - - List<CouponStuAvailableVo> availableVos = new ArrayList<>(); - - List<UserCoupon> list = uconService.list(new QueryWrapper<UserCoupon>() - .eq("userId", appUserId) - .eq("status",1)); - if (list.size() > 0){ - List<Integer> collect = list.stream().map(UserCoupon::getCouponId).collect(Collectors.toList()); - List<Coupon> conponList = cService.list(new QueryWrapper<Coupon>() - .in("id", collect)); - for (Coupon coupon : conponList) { - CouponStuAvailableVo availableVo = new CouponStuAvailableVo(); - availableVo.setConponId(coupon.getId()); - availableVo.setConponName(coupon.getName()); - availableVo.setConponType(coupon.getType()); - Map<String,Object> conponRuleMap = cService.queryConponRuleOfJson(coupon.getId()); - switch (coupon.getType()){ - case 1: - Object conditionalAmount = conponRuleMap.get("conditionalAmount"); - Object deductionAmount = conponRuleMap.get("deductionAmount"); - availableVo.setConditionalAmount((double) conditionalAmount); - availableVo.setAmount((double) deductionAmount); - break; - case 2: - Object amount = conponRuleMap.get("deductionAmount"); - availableVo.setAmount((double)amount); - break; - default: - break; - } - availableVo.setLifespan(format.format(coupon.getEndTime())); - availableVos.add(availableVo); - } - } - return availableVos; - } - - -} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java new file mode 100644 index 0000000..b5ebd02 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java @@ -0,0 +1,130 @@ +package com.dsh.activity.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dsh.activity.entity.Coupon; +import com.dsh.activity.entity.UserCoupon; +import com.dsh.activity.feignclient.model.CouponStuAvailableVo; +import com.dsh.activity.model.CouponListVo; +import com.dsh.activity.service.ICouponService; +import com.dsh.activity.service.UserCouponService; +import com.dsh.activity.util.ResultUtil; +import com.dsh.activity.util.TokenUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Api +@CrossOrigin +@RestController +@RequestMapping("") +public class UserCouponController { + + @Autowired + private UserCouponService uconService; + + @Autowired + private ICouponService cService; + + @Autowired + private TokenUtil tokenUtil; + + @Autowired + private UserCouponService userCouponService; + + + + + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); + + @PostMapping("/userConpon/getStuOfConpons") + public List<CouponStuAvailableVo> queryUserWithConponList(@RequestBody Integer appUserId){ + + List<CouponStuAvailableVo> availableVos = new ArrayList<>(); + + List<UserCoupon> list = uconService.list(new QueryWrapper<UserCoupon>() + .eq("userId", appUserId) + .eq("status",1)); + if (list.size() > 0){ + List<Integer> collect = list.stream().map(UserCoupon::getCouponId).collect(Collectors.toList()); + List<Coupon> conponList = cService.list(new QueryWrapper<Coupon>() + .in("id", collect)); + for (Coupon coupon : conponList) { + CouponStuAvailableVo availableVo = new CouponStuAvailableVo(); + availableVo.setConponId(coupon.getId()); + availableVo.setConponName(coupon.getName()); + availableVo.setConponType(coupon.getType()); + Map<String,Object> conponRuleMap = cService.queryConponRuleOfJson(coupon.getId()); + switch (coupon.getType()){ + case 1: + Object conditionalAmount = conponRuleMap.get("conditionalAmount"); + Object deductionAmount = conponRuleMap.get("deductionAmount"); + availableVo.setConditionalAmount((double) conditionalAmount); + availableVo.setAmount((double) deductionAmount); + break; + case 2: + Object amount = conponRuleMap.get("deductionAmount"); + availableVo.setAmount((double)amount); + break; + default: + break; + } + availableVo.setLifespan(format.format(coupon.getEndTime())); + availableVos.add(availableVo); + } + } + return availableVos; + } + + + + @ResponseBody + @PostMapping("/api/coupon/queryAvailableCouponList") + @ApiOperation(value = "获取课程支付页面可用优惠券列表", tags = {"APP-课程列表", ""}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "课程id", name = "coursePackageId", dataType = "int", required = true), + @ApiImplicitParam(value = "支付金额", name = "price", dataType = "double", required = true), + @ApiImplicitParam(value = "经度", name = "lon", dataType = "string", required = true), + @ApiImplicitParam(value = "纬度", name = "lat", dataType = "string", required = true), + @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") + }) + public ResultUtil<List<CouponListVo>> queryAvailableCouponList(@RequestBody Integer coursePackageId, @RequestBody Double price, @RequestBody String lon, @RequestBody String lat){ + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + List<CouponListVo> listVos = userCouponService.queryAvailableCouponList(uid, coursePackageId, price, lon, lat); + return ResultUtil.success(listVos); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + + + /** + * 根据id获取用户优惠券数据 + * @param id + * @return + */ + @ResponseBody + @PostMapping("/userCoupon/queryUserCouponById") + public UserCoupon queryUserCouponById(@RequestBody Long id){ + try { + UserCoupon userCoupon = userCouponService.getById(id); + return userCoupon; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java index 3f00b17..7392b3d 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -80,10 +81,12 @@ /** * 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; /** * 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; /** * 使用范围(1=全国,2=指定城市,3=指定门店) @@ -128,6 +131,7 @@ /** * 添加时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java index 110f152..8ce4a39 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -30,8 +31,8 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) - private Integer id; + @TableId(value = "id", type = IdType.INPUT) + private Long id; /** * 优惠券id */ @@ -51,10 +52,12 @@ /** * 核销时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date verificationTime; /** * 领取时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java index 1bba930..5969073 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java @@ -30,8 +30,8 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) - private Integer id; + @TableId(value = "id", type = IdType.INPUT) + private Long id; /** * 优惠券id */ diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/AppUserClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/AppUserClient.java similarity index 80% rename from cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/AppUserClient.java rename to cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/AppUserClient.java index f0ff7d7..dc45750 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/AppUserClient.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/AppUserClient.java @@ -1,6 +1,6 @@ -package com.dsh.activity.feginClient.account; +package com.dsh.activity.feignclient.account; -import com.dsh.activity.feginClient.account.model.AppUser; +import com.dsh.activity.feignclient.account.model.AppUser; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/StudentClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/StudentClient.java similarity index 81% rename from cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/StudentClient.java rename to cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/StudentClient.java index 1ac20a9..af6ce71 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/StudentClient.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/StudentClient.java @@ -1,6 +1,6 @@ -package com.dsh.activity.feginClient.account; +package com.dsh.activity.feignclient.account; -import com.dsh.activity.feginClient.account.model.Student; +import com.dsh.activity.feignclient.account.model.Student; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/AppUser.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/AppUser.java similarity index 96% rename from cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/AppUser.java rename to cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/AppUser.java index e358646..122dc9a 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/AppUser.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/AppUser.java @@ -1,4 +1,4 @@ -package com.dsh.activity.feginClient.account.model; +package com.dsh.activity.feignclient.account.model; import lombok.Data; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/Student.java similarity index 95% rename from cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java rename to cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/Student.java index 3731742..c0386be 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/account/model/Student.java @@ -1,4 +1,4 @@ -package com.dsh.activity.feginClient.account.model; +package com.dsh.activity.feignclient.account.model; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageClient.java new file mode 100644 index 0000000..9b1333e --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageClient.java @@ -0,0 +1,22 @@ +package com.dsh.activity.feignclient.course; + +import com.dsh.activity.feignclient.course.model.CoursePackage; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author zhibing.pu + * @date 2023/7/5 9:55 + */ +@FeignClient("mb-cloud-course") +public interface CoursePackageClient { + + + /** + * 根据id获取课包 + * @param id + * @return + */ + @PostMapping("/coursePackage/queryCoursePackageById") + CoursePackage queryCoursePackageById(Integer id); +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java new file mode 100644 index 0000000..3d6097c --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java @@ -0,0 +1,128 @@ +package com.dsh.activity.feignclient.course.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/5 9:56 + */ +@Data +public class CoursePackage { + private Integer id; + /** + * 省 + */ + private String province; + /** + * 省编号 + */ + private String provinceCode; + /** + * 市 + */ + private String city; + /** + * 市编号 + */ + private String cityCode; + /** + * 门店id + */ + private Integer storeId; + /** + * 课包类型id + */ + private Integer coursePackageTypeId; + /** + * 课包名称 + */ + private String name; + /** + * 上课场地id + */ + private Integer siteId; + /** + * 教练id + */ + private Integer coachId; + /** + * 最多预约人数 + */ + private Integer maxSubscribeNumber; + /** + * 上课开始时间 + */ + private String classStartTime; + /** + * 上课结束时段 + */ + private String classEndTime; + /** + * 上课周,多个分号分隔 + */ + private String classWeeks; + /** + * 封面图 + */ + private String coverDrawing; + /** + * 详情图 + */ + private String detailDrawing; + /** + * 介绍图 + */ + private String introduceDrawing; + /** + * 排序 + */ + private Integer sort; + /** + * 支付方式(1=现金,2=玩湃币) + */ + private Integer payType; + /** + * 有效天数 + */ + private Integer validDays; + /** + * 课后练习课程id + */ + private Integer courseId; + /** + * 课后练习视频介绍 + */ + private String introduce; + /** + * 完成课后练习获取积分 + */ + private Integer integral; + /** + * 课程状态(1=未开始,2=进行中,3=已结束,4=已取消) + */ + private Integer status; + /** + * 审核状态(1=待审核,2=已同意,3=已拒绝) + */ + private Integer auditStatus; + /** + * 审核人id + */ + private Integer auditUserId; + /** + * 审核备注 + */ + private String authRemark; + /** + * 状态(1=正常,2=冻结,3=删除) + */ + private Integer state; + /** + * 添加时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date insertTime; +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserCouponMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserCouponMapper.java index d70eed1..62546d5 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserCouponMapper.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/UserCouponMapper.java @@ -2,6 +2,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.activity.entity.UserCoupon; +import com.dsh.activity.model.CouponListVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; /** * <p> @@ -13,4 +18,16 @@ */ public interface UserCouponMapper extends BaseMapper<UserCoupon> { + + /** + * 获取购买课程可用优惠券列表 + * @param uid + * @param storeId + * @param provinceCode + * @param cityCode + * @return + */ + List<Map<String, Object>> queryAvailableCouponList(@Param("uid") Integer uid, @Param("storeId") Integer storeId, + @Param("provinceCode") String provinceCode, @Param("cityCode") String cityCode); + } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/CouponListVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/CouponListVo.java index 882772a..4e4aaea 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/model/CouponListVo.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/CouponListVo.java @@ -12,7 +12,7 @@ @ApiModel public class CouponListVo { @ApiModelProperty("优惠券id") - private Integer id; + private Long id; @ApiModelProperty("优惠券名称") private String name; @ApiModelProperty("优惠券类型(1=满减券,2=代金券,3=体验券)") diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/UserCouponService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/UserCouponService.java index 6a21198..2d73f97 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/UserCouponService.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/UserCouponService.java @@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.activity.entity.UserCoupon; +import com.dsh.activity.model.CouponListVo; + +import java.util.List; /** * <p> @@ -13,4 +16,12 @@ */ public interface UserCouponService extends IService<UserCoupon> { + + /** + * 获取购买课程可用优惠券列表 + * @param uid + * @param coursePackageId + * @return + */ + List<CouponListVo> queryAvailableCouponList(Integer uid, Integer coursePackageId, Double price, String lon, String lat) throws Exception; } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/CouponServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/CouponServiceImpl.java index a61bebf..8187b53 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/CouponServiceImpl.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/CouponServiceImpl.java @@ -6,10 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.activity.entity.Coupon; -import com.dsh.activity.feginClient.account.AppUserClient; -import com.dsh.activity.feginClient.account.StudentClient; -import com.dsh.activity.feginClient.account.model.AppUser; -import com.dsh.activity.feginClient.account.model.Student; +import com.dsh.activity.feignclient.account.AppUserClient; +import com.dsh.activity.feignclient.account.StudentClient; +import com.dsh.activity.feignclient.account.model.AppUser; +import com.dsh.activity.feignclient.account.model.Student; import com.dsh.activity.mapper.CouponMapper; import com.dsh.activity.model.CouponListVo; import com.dsh.activity.service.ICouponService; @@ -65,7 +65,7 @@ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (Coupon coupon : list) { CouponListVo couponListVo = new CouponListVo(); - couponListVo.setId(coupon.getId()); + couponListVo.setId(coupon.getId().longValue()); couponListVo.setName(coupon.getName()); couponListVo.setType(coupon.getType()); couponListVo.setEffectiveTime(sdf.format(coupon.getStartTime()) + "-" + sdf.format(coupon.getEndTime())); @@ -75,7 +75,7 @@ couponListVo.setUseCondition("满" + jsonObject.getDouble("num1") + "元可用"); couponListVo.setFavorable(jsonObject.getDouble("num2") + "元"); } - if (coupon.getType() == 2) {//满减{"num1":1} + if (coupon.getType() == 2) {//代金券{"num1":1} JSONObject jsonObject = JSON.parseObject(content); couponListVo.setUseCondition(""); couponListVo.setFavorable(jsonObject.getDouble("num1") + "元"); diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserCouponServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserCouponServiceImpl.java index d646a5b..c8441cd 100644 --- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserCouponServiceImpl.java +++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/UserCouponServiceImpl.java @@ -1,10 +1,23 @@ package com.dsh.activity.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.activity.entity.UserCoupon; +import com.dsh.activity.feignclient.course.CoursePackageClient; +import com.dsh.activity.feignclient.course.model.CoursePackage; import com.dsh.activity.mapper.UserCouponMapper; +import com.dsh.activity.model.CouponListVo; import com.dsh.activity.service.UserCouponService; +import com.dsh.activity.util.GDMapGeocodingUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * <p> @@ -17,4 +30,61 @@ @Service public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService { + @Resource + private CoursePackageClient coursePackageClient; + + @Autowired + private GDMapGeocodingUtil gdMapGeocodingUtil; + + + /** + * 获取购买课程可用优惠券列表 + * @param uid + * @param coursePackageId + * @return + */ + @Override + public List<CouponListVo> queryAvailableCouponList(Integer uid, Integer coursePackageId, Double price, String lon, String lat) throws Exception { + CoursePackage coursePackage = coursePackageClient.queryCoursePackageById(coursePackageId); + Integer storeId = coursePackage.getStoreId(); + Map<String, String> geocode = gdMapGeocodingUtil.geocode(lon, lat); + String provinceCode = geocode.get("provinceCode"); + String cityCode = geocode.get("cityCode"); + List<Map<String, Object>> userCoupons = this.baseMapper.queryAvailableCouponList(uid, storeId, provinceCode, cityCode); + List<CouponListVo> listVos = new ArrayList<>(); + for (Map<String, Object> userCoupon : userCoupons) { + Integer type = Integer.valueOf(userCoupon.get("type").toString()); + CouponListVo couponListVo = new CouponListVo(); + couponListVo.setId(Long.valueOf(userCoupon.get("id").toString())); + couponListVo.setName(userCoupon.get("name").toString()); + couponListVo.setType(type); + couponListVo.setEffectiveTime(userCoupon.get("endTime").toString()); + String content = userCoupon.get("content").toString(); + if (type == 1) {//满减{"num1":1,"num2":1} + JSONObject jsonObject = JSON.parseObject(content); + Double num1 = jsonObject.getDouble("num1"); + if(price.compareTo(num1) <= 0){ + continue; + } + couponListVo.setUseCondition("满" + num1 + "元可用"); + couponListVo.setFavorable(jsonObject.getDouble("num2") + "元"); + } + if (type == 2) {//代金券{"num1":1} + JSONObject jsonObject = JSON.parseObject(content); + Double num1 = jsonObject.getDouble("num1"); + if(price.compareTo(num1) <= 0){ + continue; + } + couponListVo.setUseCondition(""); + couponListVo.setFavorable(num1 + "元"); + } + if (type == 3) {//体验券{"num1":1} + JSONObject jsonObject = JSON.parseObject(content); + couponListVo.setUseCondition(""); + couponListVo.setFavorable(jsonObject.getString("num1")); + } + listVos.add(couponListVo); + } + return listVos; + } } diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/GDMapGeocodingUtil.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/GDMapGeocodingUtil.java new file mode 100644 index 0000000..5d97b54 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/GDMapGeocodingUtil.java @@ -0,0 +1,148 @@ +package com.dsh.activity.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.dsh.activity.util.httpClinet.HttpClientUtil; +import com.dsh.activity.util.httpClinet.HttpResult; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 高德地图的地理编码工具类 + */ +@Component +public class GDMapGeocodingUtil { + + private String key = "fb131ad2dbfb3f39d7d37d244b92aa2d"; + + + /** + * 将行政区域名称转化为坐标 + * @param province + * @param city + * @param county + * @param address + * @return + */ + public Map<String, Object> geocoding(String province, String city, String county, String address) throws Exception{ + Map<String, Object> map = new HashMap<>(); + if(ToolUtil.isEmpty(province)){ + map.put("status", -1); + map.put("data", "省不能为空"); + return map; + } + if((ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(county)) || (ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(address))){ + map.put("status", -1); + map.put("data", "市不能为空"); + return map; + } + if((ToolUtil.isEmpty(county) && ToolUtil.isNotEmpty(address))){ + map.put("status", -1); + map.put("data", "县/区不能为空"); + return map; + } + + String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON"; + url += "&address=" + province + (ToolUtil.isNotEmpty(city) ? city : "") + (ToolUtil.isNotEmpty(county) ? county : "") + (ToolUtil.isNotEmpty(address) ? address : ""); + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json"); + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + String status = jsonObject.getString("status"); + List<String> list = new ArrayList<>(); + + if(status.equals("1")){ + JSONArray geocodes = jsonObject.getJSONArray("geocodes"); + for(int i = 0; i < geocodes.size(); i++){ + String location = geocodes.getJSONObject(i).getString("location"); + list.add(location); + } + } + map.put("status", 0); + map.put("data", list); + return map; + } + + + + public Map<String, Object> geocoding(String address) throws Exception{ + Map<String, Object> map = new HashMap<>(); + String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON&address=" + address; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json"); + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + String status = jsonObject.getString("status"); + List<String> list = new ArrayList<>(); + + if(status.equals("1")){ + JSONArray geocodes = jsonObject.getJSONArray("geocodes"); + for(int i = 0; i < geocodes.size(); i++){ + String location = geocodes.getJSONObject(i).getString("location"); + list.add(location); + } + } + map.put("status", 0); + map.put("data", list); + return map; + } + + + + /** + * 根据经纬度获取行政区域信息 + * @param lon + * @param lan + * @return + * @throws Exception + */ + public Map<String, String> geocode(String lon, String lan) throws Exception{ + String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json"); + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + Map<String, String> map = new HashMap<>(); + + if(jsonObject.getString("status").equals("1")){ + JSONObject regeocode = jsonObject.getJSONObject("regeocode"); + JSONObject addressComponent = regeocode.getJSONObject("addressComponent"); + String address = regeocode.getString("formatted_address"); + map.put("address", address); + String code = addressComponent.getString("adcode"); + String province = addressComponent.getString("province"); + String city = addressComponent.getString("city"); + String district = addressComponent.getString("district"); + map.put("province", province); + map.put("provinceCode", code.substring(0, 2) + "0000"); + map.put("city", city); + map.put("cityCode", code.substring(0, 4) + "00"); + map.put("district", district); + map.put("districtCode", code); + } + return map; + } + + + /** + * 坐标转换 + * @param locations 经度和纬度用","分割,经度在前,纬度在后,经纬度小数点后不得超过6位。多个坐标对之间用”|”进行分隔最多支持40对坐标。 + * @param coordsys 可选值:gps;mapbar;baidu;autonavi(不进行转换) + * @return + * @throws Exception + */ + public Map<String, String> convert(String locations, String coordsys) throws Exception{ + String url = "https://restapi.amap.com/v3/assistant/coordinate/convert?locations=" + locations + "&coordsys=" + coordsys + "&output=json&key=" + key; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "json"); + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + Map<String, String> map = new HashMap<>(); + if("1".equals(jsonObject.getString("status"))){ + map.put("code", jsonObject.getString("infocode"));//"10000" + map.put("info", jsonObject.getString("info"));//status为0时,info返回错误原;否则返回“OK”。 + map.put("locations", jsonObject.getString("locations").split(";")[0]);//转换之后的坐标。若有多个坐标,则用 “;”进行区分和间隔 + }else{ + map.put("code", jsonObject.getString("infocode")); + map.put("info", jsonObject.getString("info"));//status为0时,info返回错误原;否则返回“OK”。 + } + return map; + } +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/ToolUtil.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/ToolUtil.java new file mode 100644 index 0000000..cce7ff1 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/ToolUtil.java @@ -0,0 +1,544 @@ +/** + * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com). + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dsh.activity.util; + + + + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Array; +import java.math.BigDecimal; +import java.net.URISyntaxException; +import java.util.*; +import java.util.Map.Entry; + +/** + * 高频方法集合类 + */ +public class ToolUtil { + + /** + * 获取随机位数的字符串 + * + * @author fengshuonan + * @Date 2017/8/24 14:09 + */ + public static String getRandomString(int length) { + String base = "abcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 判断一个对象是否是时间类型 + * + * @author stylefeng + * @Date 2017/4/18 12:55 + */ + public static String dateType(Object o) { + if (o instanceof Date) { + return DateUtil.getDay((Date) o); + } else { + return o.toString(); + } + } + + /** + * 获取异常的具体信息 + * + * @author fengshuonan + * @Date 2017/3/30 9:21 + * @version 2.0 + */ + public static String getExceptionMsg(Exception e) { + StringWriter sw = new StringWriter(); + try { + e.printStackTrace(new PrintWriter(sw)); + } finally { + try { + sw.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + return sw.getBuffer().toString().replaceAll("\\$", "T"); + } + + /** + * 比较两个对象是否相等。<br> + * 相同的条件有两个,满足其一即可:<br> + * 1. obj1 == null && obj2 == null; 2. obj1.equals(obj2) + * + * @param obj1 对象1 + * @param obj2 对象2 + * @return 是否相等 + */ + public static boolean equals(Object obj1, Object obj2) { + return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null); + } + + /** + * 计算对象长度,如果是字符串调用其length函数,集合类调用其size函数,数组调用其length属性,其他可遍历对象遍历计算长度 + * + * @param obj 被计算长度的对象 + * @return 长度 + */ + public static int length(Object obj) { + if (obj == null) { + return 0; + } + if (obj instanceof CharSequence) { + return ((CharSequence) obj).length(); + } + if (obj instanceof Collection) { + return ((Collection<?>) obj).size(); + } + if (obj instanceof Map) { + return ((Map<?, ?>) obj).size(); + } + + int count; + if (obj instanceof Iterator) { + Iterator<?> iter = (Iterator<?>) obj; + count = 0; + while (iter.hasNext()) { + count++; + iter.next(); + } + return count; + } + if (obj instanceof Enumeration) { + Enumeration<?> enumeration = (Enumeration<?>) obj; + count = 0; + while (enumeration.hasMoreElements()) { + count++; + enumeration.nextElement(); + } + return count; + } + if (obj.getClass().isArray() == true) { + return Array.getLength(obj); + } + return -1; + } + + /** + * 对象中是否包含元素 + * + * @param obj 对象 + * @param element 元素 + * @return 是否包含 + */ + public static boolean contains(Object obj, Object element) { + if (obj == null) { + return false; + } + if (obj instanceof String) { + if (element == null) { + return false; + } + return ((String) obj).contains(element.toString()); + } + if (obj instanceof Collection) { + return ((Collection<?>) obj).contains(element); + } + if (obj instanceof Map) { + return ((Map<?, ?>) obj).values().contains(element); + } + + if (obj instanceof Iterator) { + Iterator<?> iter = (Iterator<?>) obj; + while (iter.hasNext()) { + Object o = iter.next(); + if (equals(o, element)) { + return true; + } + } + return false; + } + if (obj instanceof Enumeration) { + Enumeration<?> enumeration = (Enumeration<?>) obj; + while (enumeration.hasMoreElements()) { + Object o = enumeration.nextElement(); + if (equals(o, element)) { + return true; + } + } + return false; + } + if (obj.getClass().isArray() == true) { + int len = Array.getLength(obj); + for (int i = 0; i < len; i++) { + Object o = Array.get(obj, i); + if (equals(o, element)) { + return true; + } + } + } + return false; + } + + /** + * 对象是否不为空(新增) + * + * @param o String,List,Map,Object[],int[],long[] + * @return + */ + public static boolean isNotEmpty(Object o) { + return !isEmpty(o); + } + + /** + * 对象是否为空 + * + * @param o String,List,Map,Object[],int[],long[] + * @return + */ + @SuppressWarnings("rawtypes") + public static boolean isEmpty(Object o) { + if (o == null) { + return true; + } + if (o instanceof String) { + if (o.toString().trim().equals("")) { + return true; + } + } else if (o instanceof List) { + if (((List) o).size() == 0) { + return true; + } + } else if (o instanceof Map) { + if (((Map) o).size() == 0) { + return true; + } + } else if (o instanceof Set) { + if (((Set) o).size() == 0) { + return true; + } + } else if (o instanceof Object[]) { + if (((Object[]) o).length == 0) { + return true; + } + } else if (o instanceof int[]) { + if (((int[]) o).length == 0) { + return true; + } + } else if (o instanceof long[]) { + if (((long[]) o).length == 0) { + return true; + } + } + return false; + } + + /** + * 对象组中是否存在 Empty Object + * + * @param os 对象组 + * @return + */ + public static boolean isOneEmpty(Object... os) { + for (Object o : os) { + if (isEmpty(o)) { + return true; + } + } + return false; + } + + /** + * 对象组中是否全是 Empty Object + * + * @param os + * @return + */ + public static boolean isAllEmpty(Object... os) { + for (Object o : os) { + if (!isEmpty(o)) { + return false; + } + } + return true; + } + + /** + * 是否为数字 + * + * @param obj + * @return + */ + public static boolean isNum(Object obj) { + try { + Integer.parseInt(obj.toString()); + } catch (Exception e) { + return false; + } + return true; + } + + /** + * 如果为空, 则调用默认值 + * + * @param str + * @return + */ + public static Object getValue(Object str, Object defaultValue) { + if (isEmpty(str)) { + return defaultValue; + } + return str; + } + + + /** + * 强转->string,并去掉多余空格 + * + * @param str + * @return + */ + public static String toStr(Object str) { + return toStr(str, ""); + } + + /** + * 强转->string,并去掉多余空格 + * + * @param str + * @param defaultValue + * @return + */ + public static String toStr(Object str, String defaultValue) { + if (null == str) { + return defaultValue; + } + return str.toString().trim(); + } + + /** + * 强转->int + * + * @param obj + * @return + */ +// public static int toInt(Object value) { +// return toInt(value, -1); +// } + + /** + * 强转->int + * + * @param obj + * @param defaultValue + * @return + */ +// public static int toInt(Object value, int defaultValue) { +// return Convert.toInt(value, defaultValue); +// } + + /** + * 强转->long + * + * @param obj + * @return + */ +// public static long toLong(Object value) { +// return toLong(value, -1); +// } + + /** + * 强转->long + * + * @param obj + * @param defaultValue + * @return + */ +// public static long toLong(Object value, long defaultValue) { +// return Convert.toLong(value, defaultValue); +// } +// +// public static String encodeUrl(String url) { +// return URLKit.encode(url, CharsetKit.UTF_8); +// } +// +// public static String decodeUrl(String url) { +// return URLKit.decode(url, CharsetKit.UTF_8); +// } + + /** + * map的key转为小写 + * + * @param map + * @return Map<String , Object> + */ + public static Map<String, Object> caseInsensitiveMap(Map<String, Object> map) { + Map<String, Object> tempMap = new HashMap<>(); + for (String key : map.keySet()) { + tempMap.put(key.toLowerCase(), map.get(key)); + } + return tempMap; + } + + /** + * 获取map中第一个数据值 + * + * @param <K> Key的类型 + * @param <V> Value的类型 + * @param map 数据源 + * @return 返回的值 + */ + public static <K, V> V getFirstOrNull(Map<K, V> map) { + V obj = null; + for (Entry<K, V> entry : map.entrySet()) { + obj = entry.getValue(); + if (obj != null) { + break; + } + } + return obj; + } + + /** + * 创建StringBuilder对象 + * + * @return StringBuilder对象 + */ + public static StringBuilder builder(String... strs) { + final StringBuilder sb = new StringBuilder(); + for (String str : strs) { + sb.append(str); + } + return sb; + } + + /** + * 创建StringBuilder对象 + * + * @return StringBuilder对象 + */ + public static void builder(StringBuilder sb, String... strs) { + for (String str : strs) { + sb.append(str); + } + } + + /** + * 去掉指定后缀 + * + * @param str 字符串 + * @param suffix 后缀 + * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串 + */ + public static String removeSuffix(String str, String suffix) { + if (isEmpty(str) || isEmpty(suffix)) { + return str; + } + + if (str.endsWith(suffix)) { + return str.substring(0, str.length() - suffix.length()); + } + return str; + } + + /** + * 当前时间 + * + * @author stylefeng + * @Date 2017/5/7 21:56 + */ + public static String currentTime() { + return DateUtil.getTime(); + } + + + + /** + * 判断是否是windows操作系统 + * + * @author stylefeng + * @Date 2017/5/24 22:34 + */ + public static Boolean isWinOs() { + String os = System.getProperty("os.name"); + if (os.toLowerCase().startsWith("win")) { + return true; + } else { + return false; + } + } + + /** + * 获取临时目录 + * + * @author stylefeng + * @Date 2017/5/24 22:35 + */ + public static String getTempPath() { + return System.getProperty("java.io.tmpdir"); + } + + /** + * 把一个数转化为int + * + * @author fengshuonan + * @Date 2017/11/15 下午11:10 + */ + public static Integer toInt(Object val) { + if (val instanceof Double) { + BigDecimal bigDecimal = new BigDecimal((Double) val); + return bigDecimal.intValue(); + } else { + return Integer.valueOf(val.toString()); + } + + } + + /** + * 获取项目路径 + */ + public static String getWebRootPath(String filePath) { + try { + String path = ToolUtil.class.getClassLoader().getResource("").toURI().getPath(); + path = path.replace("/WEB-INF/classes/", ""); + path = path.replace("/target/classes/", ""); + path = path.replace("file:/", ""); + if (ToolUtil.isEmpty(filePath)) { + return path; + } else { + return path + "/" + filePath; + } + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + /** + * 获取文件后缀名 不包含点 + */ + public static String getFileSuffix(String fileWholeName) { + if (ToolUtil.isEmpty(fileWholeName)) { + return "none"; + } + int lastIndexOf = fileWholeName.lastIndexOf("."); + return fileWholeName.substring(lastIndexOf + 1); + } +} \ No newline at end of file diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpClientUtil.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpClientUtil.java new file mode 100644 index 0000000..20112fe --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpClientUtil.java @@ -0,0 +1,267 @@ +package com.dsh.activity.util.httpClinet; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLContext; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.security.KeyStore; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * http工具类 + */ +public class HttpClientUtil { + + private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class); + + private static PoolingHttpClientConnectionManager connectionManager; + + + { + //1.创建连接池管理器 + connectionManager = new PoolingHttpClientConnectionManager(60000, + TimeUnit.MILLISECONDS); + connectionManager.setMaxTotal(1000); + connectionManager.setDefaultMaxPerRoute(50); + } + + /** + * 创建一个httpClient对象 + */ + private static CloseableHttpClient getHttpCline(){ + return HttpClients.custom() + .setConnectionManager(connectionManager) + .disableAutomaticRetries() + .build(); + } + + private static RequestConfig getRequestConfig(){ + RequestConfig.Builder builder = RequestConfig.custom(); + builder.setSocketTimeout(60000)//3.1设置客户端等待服务端返回数据的超时时间 + .setConnectTimeout(30000)//3.2设置客户端发起TCP连接请求的超时时间 + .setExpectContinueEnabled(true) + .setConnectionRequestTimeout(30000);//3.3设置客户端从连接池获取链接的超时时间 + return builder.build(); + } + + + + /** + * 创建一个POST请求实例 + * @param url 请求地址 + * @param params 请求参数 + */ + private static CloseableHttpResponse setPostHttpRequset(String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception{ + HttpPost httpPost = new HttpPost(url); + httpPost.setConfig(getRequestConfig()); + if(null != header){ + for(String key : header.keySet()){ + httpPost.setHeader(key, header.get(key)); + } + } + List<NameValuePair> list = new ArrayList<>(); + if(null != params){ + Set<String> keys = params.keySet(); + for(String key : keys){ + list.add(new BasicNameValuePair(key, null == params.get(key) ? null : params.get(key).toString())); + } + } + switch (contentType){ + case "form": + httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8")); + break; + case "json": + ObjectMapper objectMapper = new ObjectMapper(); + String s =objectMapper.writeValueAsString(params); + httpPost.setEntity(new StringEntity(s, ContentType.create(ContentType.APPLICATION_JSON.getMimeType(), Charset.forName("UTF-8")))); + break; + } + return getHttpCline().execute(httpPost); + } + + + /** + * 获取get请求实例 + * @param url 请求地址 + * @param params 请求参数 + */ + private static CloseableHttpResponse setGetHttpRequset(String url, Map<String, Object> params, Map<String, String> header) throws Exception{ + StringBuffer sb = new StringBuffer(); + String p = ""; + if(null != params){ + Set<String> keys = params.keySet(); + for(String key : keys){ + sb.append(key + "=" + params.get(key) + "&"); + } + p = "?" + sb.substring(0, sb.length() - 1); + } + HttpGet httpGet = new HttpGet(url + p); + httpGet.setConfig(getRequestConfig()); + if(null != header){ + for(String key : header.keySet()){ + httpGet.setHeader(key, header.get(key)); + } + } + return getHttpCline().execute(httpGet); + } + + + /** + * 发送http请求 + * @param mothed "GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS" + * @param url 请求地址 + * @param params 请求参数 + * @param header 请求头 + * @param contentType 参数请求方式form/json + * @return + */ + public static HttpResult pushHttpRequset(String mothed, String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception{ + String randome = UUID.randomUUID().toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + logger.info(sdf.format(new Date()) + "----(" + randome + ")请求参数:" + JSON.toJSONString(params)); + CloseableHttpResponse httpResponse = null; + switch (mothed){ + case "GET": + httpResponse = setGetHttpRequset(url, params, header); + break; + case "POST": + httpResponse = setPostHttpRequset(url, params, header, contentType); + break; + } + int statusCode = httpResponse.getStatusLine().getStatusCode(); + String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); + logger.info(sdf.format(new Date()) + "----(" + randome + ")返回结果:" + content); + HttpResult httpResult = HttpResult.getHttpResult(statusCode, content); + close(httpResponse); + return httpResult; + } + + + /** + * 发送XML请求 + * @param url 请求地址 + * @param xml XML数据 + * @param header 自定义请求头 + * @return + */ + public static HttpResult pushHttpRequsetXml(String url, String xml, Map<String, String> header) throws Exception{ + HttpPost httpPost = new HttpPost(url); + httpPost.setConfig(getRequestConfig()); + for(String key : header.keySet()){ + httpPost.setHeader(key, header.get(key)); + } + httpPost.setHeader("Content-Type", "application/xml"); + httpPost.setEntity(new StringEntity(xml, "UTF-8")); + CloseableHttpResponse httpResponse = getHttpCline().execute(httpPost); + int statusCode = httpResponse.getStatusLine().getStatusCode(); + String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); + HttpResult httpResult = HttpResult.getHttpResult(statusCode, content); + close(httpResponse); + return httpResult; + } + + + + /** + * 请求https发送XML请求 + * @param url 接口路径 + * @param xml 内容 + * @param header 请求头 + * @param certPassword 证书密码 + * @param certPath 证书路径 + * @param certType 证书类型 + * @return + * @throws Exception + */ + public String pushHttpsRequsetXml(String url, String xml, Map<String, String> header, String certPassword, String certPath, String certType) throws Exception{ + HttpPost httpPost = new HttpPost(url); + for(String key : header.keySet()){ + httpPost.setHeader(key, header.get(key)); + } + httpPost.setHeader("Content-Type", "application/xml"); + httpPost.setEntity(new StringEntity(xml, "UTF-8")); + CloseableHttpClient httpCline = this.initCert(certPassword, certPath, certType); + CloseableHttpResponse httpResponse = httpCline.execute(httpPost); + String content = null; + if(httpResponse.getStatusLine().getStatusCode() == 200){ + content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); + }else{ + content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity()); + } + this.close(httpResponse); + httpCline.close(); + return content; + } + + + /** + * 初始化https对象(带证书) + * @param key 证书密码 + * @param certPath 证书路径 + * @param certType 证书类型 + * @throws Exception + */ + private CloseableHttpClient initCert(String key, String certPath, String certType) throws Exception { + KeyStore keyStore = KeyStore.getInstance(certType); + InputStream inputStream = new FileInputStream(new File(certPath)); + try { + keyStore.load(inputStream, key.toCharArray()); + } finally { + inputStream.close(); + } + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build(); + SSLConnectionSocketFactory sslsf = + new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + return HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } + + + + /** + * 关闭资源 + */ + private static void close(CloseableHttpResponse httpResponse){ + try { + if(null != httpResponse){ + EntityUtils.consume(httpResponse.getEntity());//此处高能,通过源码分析,由EntityUtils是否回收HttpEntity + httpResponse.close(); + } + } catch (Exception e) { + e.printStackTrace(); + }finally { + try { + if(null != httpResponse){ + httpResponse.close(); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + } + + +} diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpResult.java b/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpResult.java new file mode 100644 index 0000000..6192740 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/activity/util/httpClinet/HttpResult.java @@ -0,0 +1,31 @@ +package com.dsh.activity.util.httpClinet; + +import lombok.Data; + +/** + * http请求返回封装 + */ +@Data +public class HttpResult { + /** + * 返回状态码 + */ + private Integer code; + /** + * 返回结果 + */ + private String data; + + /** + * 返回封装结果 + * @param code + * @param data + * @return + */ + public static HttpResult getHttpResult(Integer code, String data){ + HttpResult httpResult = new HttpResult(); + httpResult.setCode(code); + httpResult.setData(data); + return httpResult; + } +} diff --git a/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java new file mode 100644 index 0000000..ea4cd0f --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java @@ -0,0 +1,86 @@ +package com.dsh.config.Sharding_jdbc; + + +/** +* 数据源 +* @author pzb +* @Date 2022/11/21 21:13 +*/ +public class DatasourceModel { + private String url; + private String username; + private String password; + private String driverClassName; + private Integer maxActive; + private Long maxWait; + private Integer minIdle; + private Integer initialSize; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public DatasourceModel getDatasourceModel(){ + return this; + } + + public Integer getMaxActive() { + return maxActive; + } + + public void setMaxActive(Integer maxActive) { + this.maxActive = maxActive; + } + + public Long getMaxWait() { + return maxWait; + } + + public void setMaxWait(Long maxWait) { + this.maxWait = maxWait; + } + + public Integer getMinIdle() { + return minIdle; + } + + public void setMinIdle(Integer minIdle) { + this.minIdle = minIdle; + } + + public Integer getInitialSize() { + return initialSize; + } + + public void setInitialSize(Integer initialSize) { + this.initialSize = initialSize; + } +} diff --git a/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java new file mode 100644 index 0000000..e1bbbaa --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java @@ -0,0 +1,18 @@ +package com.dsh.config.Sharding_jdbc; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +/** +* 数据源配置 +* @author pzb +* @Date 2022/11/21 20:32 +*/ +@Component +@PropertySource(value = "classpath:sharding-jdbc.properties") +@ConfigurationProperties(prefix = "datasource.master0") +public class Master0DataSource extends DatasourceModel { + +} diff --git a/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java new file mode 100644 index 0000000..75f7e69 --- /dev/null +++ b/cloud-server-activity/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java @@ -0,0 +1,113 @@ +package com.dsh.config.Sharding_jdbc; + +import com.alibaba.druid.pool.DruidDataSource; +import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory; +import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration; +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.*; + +@Configuration +public class ShardingConfig { + + @Autowired + private Master0DataSource master0DataSource; + + + @Bean + public DataSource getDataSource(){ + DataSource dataSource = null; + try { + Properties properties = new Properties(); + properties.setProperty("sql-show", "true"); + String databaseName = "m_0";//真实数据源名称,多个数据源用逗号区分 + dataSource = ShardingSphereDataSourceFactory.createDataSource(databaseName, createDataSourceMap(), createShardingRuleConfiguration(), properties); + } catch (SQLException e) { + e.printStackTrace(); + } + return dataSource; + } + + + /** + * 配置多数据源 + * @return + */ + private Map<String, DataSource> createDataSourceMap() { + Map<String, DataSource> dataSourceMap = new HashMap<>(); + // 配置第 1 个数据源 + DruidDataSource dataSource1 = new DruidDataSource(); + dataSource1.setDriverClassName(master0DataSource.getDriverClassName()); + dataSource1.setUrl(master0DataSource.getUrl()); + dataSource1.setUsername(master0DataSource.getUsername()); + dataSource1.setPassword(master0DataSource.getPassword()); + dataSource1.setMaxActive(master0DataSource.getMaxActive()); + dataSource1.setMaxWait(master0DataSource.getMaxWait()); + dataSource1.setMinIdle(master0DataSource.getMinIdle()); + dataSource1.setInitialSize(master0DataSource.getInitialSize()); + dataSourceMap.put("m_0", dataSource1); + return dataSourceMap; + } + + + /** + * 分片配置 + * @return + */ + private Collection<RuleConfiguration> createShardingRuleConfiguration() { + LinkedList<RuleConfiguration> linkedList = new LinkedList(); + + //分片规则配置 + ShardingRuleConfiguration result1 = new ShardingRuleConfiguration(); + result1.getTables().add(getUserCouponTableRuleConfiguration()); + Properties props1 = new Properties(); + props1.setProperty("algorithm-expression", "t_user_coupon$->{userId % 5 + 1}"); + result1.getShardingAlgorithms().put("t_user_coupon-inline", new AlgorithmConfiguration("INLINE", props1)); + result1.getKeyGenerators().put("t_user_coupon-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); + + //分片规则配置 + result1.getTables().add(getUserPointsMerchandiseTableRuleConfiguration()); + Properties props2 = new Properties(); + props2.setProperty("algorithm-expression", "t_user_points_merchandise$->{userId % 5 + 1}"); + result1.getShardingAlgorithms().put("t_user_points_merchandise-inline", new AlgorithmConfiguration("INLINE", props2)); + result1.getKeyGenerators().put("t_user_points_merchandise-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); + + linkedList.add(result1); + + return linkedList; + } + + /** + * 分片算法配置 + * @return + */ + private ShardingTableRuleConfiguration getUserCouponTableRuleConfiguration() { + ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_user_coupon", "m$->{0}.t_user_coupon->{1..5}");//50 + result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("userId", "t_user_coupon-inline")); + result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_user_coupon-snowflake")); + return result; + } + + + + /** + * 分片算法配置 + * @return + */ + private ShardingTableRuleConfiguration getUserPointsMerchandiseTableRuleConfiguration() { + ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_user_points_merchandise", "m$->{0}.t_user_points_merchandise$->{1..5}");//30 + result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("userId", "t_user_points_merchandise-inline")); + result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_user_points_merchandise-snowflake")); + return result; + } + +} diff --git a/cloud-server-activity/src/main/resources/mapper/UserCouponMapper.xml b/cloud-server-activity/src/main/resources/mapper/UserCouponMapper.xml index 9a81eac..4a2ac89 100644 --- a/cloud-server-activity/src/main/resources/mapper/UserCouponMapper.xml +++ b/cloud-server-activity/src/main/resources/mapper/UserCouponMapper.xml @@ -5,4 +5,20 @@ <!-- 开启二级缓存 --> <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/> + + + <select id="queryAvailableCouponList" resultType="map"> + select + a.id, + b.`name`, + b.type, + b.content, + DATE_FORMAT('%y-%M-%d', b.startTime) as startTime, + DATE_FORMAT('%y-%M-%d', b.endTime) as endTime + from t_user_coupon a + left join t_coupon b on (a.couponId = b.id) + where a.`status` = 1 and b.type != 3 and a.userId = #{uid} and ( + b.useScope = 1 or (b.useScope = 2 and provinceCode = #{provinceCode} and cityCode = #{cityCode}) + or (b.useScope = 3 and b.id in (select couponId from t_coupon_store where storeId = #{storeId}))) + </select> </mapper> diff --git a/cloud-server-activity/src/main/resources/sharding-jdbc.properties b/cloud-server-activity/src/main/resources/sharding-jdbc.properties new file mode 100644 index 0000000..54db095 --- /dev/null +++ b/cloud-server-activity/src/main/resources/sharding-jdbc.properties @@ -0,0 +1,25 @@ +datasource.names=master0 + +#�������� +datasource.master0.type=com.alibaba.druid.pool.DruidDataSource +datasource.master0.driverClassName=com.mysql.cj.jdbc.Driver +datasource.master0.url=jdbc:mysql://192.168.110.80:3306/playpai_activity?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +datasource.master0.username=root +datasource.master0.password=123456 +datasource.master0.maxActive=20 +datasource.master0.maxWait=60000 +datasource.master0.minIdle=5 +datasource.master0.initialSize=2 + +#�������� +#datasource.master0.type=com.alibaba.druid.pool.DruidDataSource +#datasource.master0.driverClassName=com.mysql.cj.jdbc.Driver +#datasource.master0.url=jdbc:mysql://110.239.68.140:3306/playpai_activity?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B7 +#datasource.master0.username=root +#datasource.master0.password=G4LLlNouAGH1dijbyU&xDo$X +#datasource.master0.maxActive=200 +#datasource.master0.maxWait=60000 +#datasource.master0.minIdle=100 +#datasource.master0.initialSize=100 + + diff --git a/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java index dbac4e9..179ef3d 100644 --- a/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java +++ b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java @@ -68,7 +68,7 @@ //分片规则配置 ShardingRuleConfiguration result1 = new ShardingRuleConfiguration(); - result1.getTables().add(gettCoursePackagePaymentTableRuleConfiguration()); + result1.getTables().add(getCoursePackagePaymentTableRuleConfiguration()); Properties props1 = new Properties(); props1.setProperty("algorithm-expression", "t_course_package_payment$->{appUserId % 5 + 1}"); result1.getShardingAlgorithms().put("t_course_package_payment-inline", new AlgorithmConfiguration("INLINE", props1)); @@ -90,7 +90,7 @@ * 分片算法配置 * @return */ - private ShardingTableRuleConfiguration gettCoursePackagePaymentTableRuleConfiguration() { + private ShardingTableRuleConfiguration getCoursePackagePaymentTableRuleConfiguration() { ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_course_package_payment", "m$->{0}.t_course_package_payment$->{1..5}");//50 result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("appUserId", "t_course_package_payment-inline")); result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_course_package_payment-snowflake")); diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java index ac142ba..0400ac4 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java +++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java @@ -5,10 +5,7 @@ import com.dsh.course.entity.TCourse; import com.dsh.course.entity.TCoursePackageType; import com.dsh.course.feignclient.model.ExerciseVideo; -import com.dsh.course.model.BaseVo; -import com.dsh.course.model.CoursePackageInfo; -import com.dsh.course.model.CoursePackageList; -import com.dsh.course.model.CoursePackageListVo; +import com.dsh.course.model.*; import com.dsh.course.service.TCoursePackageService; import com.dsh.course.service.TCoursePackageTypeService; import com.dsh.course.service.TCourseService; @@ -141,4 +138,22 @@ } } + + + + + + public ResultUtil paymentCourse(@RequestBody PaymentCourseVo paymentCourseVo){ + try { + Integer uid = tokenUtil.getUserIdFormRedis(); + if(null == uid){ + return ResultUtil.tokenErr(); + } + return coursePackageService.paymentCourse(uid, paymentCourseVo); + }catch (Exception e){ + e.printStackTrace(); + return ResultUtil.runErr(); + } + } + } diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java new file mode 100644 index 0000000..3c83277 --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java @@ -0,0 +1,36 @@ +package com.dsh.course.controller; + +import com.dsh.course.entity.TCoursePackage; +import com.dsh.course.service.TCoursePackageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author zhibing.pu + * @date 2023/7/5 9:58 + */ +@RestController +@RequestMapping("") +public class CoursePackageController { + + @Autowired + private TCoursePackageService coursePackageService; + + + /** + * 根据id获取课包 + * @param id + * @return + */ + @ResponseBody + @PostMapping("/coursePackage/queryCoursePackageById") + public TCoursePackage queryCoursePackageById(@RequestBody Integer id){ + try { + TCoursePackage coursePackage = coursePackageService.getById(id); + return coursePackage; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java index ab7af9d..66e508c 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java +++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java @@ -159,7 +159,7 @@ tCoursePackagePayments.forEach(cou -> { CourseHoursType hoursType = new CourseHoursType(); hoursType.setCourseConfigId(cou.getId()); - hoursType.setCourseConfigId(cou.getClassHours()); + hoursType.setCourseHourNums(cou.getClassHours()); typeList.add(hoursType); }); TCoursePackagePayment tCoursePackagePayment = tCoursePackagePayments.get(0); diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java index d6c3bc8..f58b478 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java +++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -140,6 +141,7 @@ /** * 添加时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; } diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java index b60ce2b..2869623 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java +++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java @@ -51,6 +51,14 @@ */ private Integer classHours; /** + * 原价 + */ + private Double originalPrice; + /** + * 优惠券id + */ + private Long userCouponId; + /** * 现金支付价格 */ private BigDecimal cashPayment; diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java deleted file mode 100644 index cc51aa7..0000000 --- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dsh.course.feignclient; - - - -import com.dsh.course.feignclient.model.*; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import java.util.List; - -@FeignClient(value = "mb-cloud-course") -public interface CoursePaymentClient { - - - @PostMapping("/coursePack/queryPayment") - List<StuCourseResp> getStuCoursePayment(); - - @PostMapping("/coursePack/storeOfCourse") - List<CourseOfStoreVo> getStoreOfCourses(); - - @PostMapping("/coursePack/stuOfCourses") - StuWithCoursesListVo getStuOfCoursesDetails(@RequestBody Integer stuId,@RequestBody Integer appUserId); - - @PostMapping("/coursePack/continuingCourse") - StudentOfCourseVo getStudentCourse(@RequestBody Integer courseId, - @RequestBody Integer stuId, - @RequestBody Integer appUserId); - -} diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java new file mode 100644 index 0000000..8b18450 --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/CouponClient.java @@ -0,0 +1,22 @@ +package com.dsh.course.feignclient.activity; + +import com.dsh.course.feignclient.activity.model.Coupon; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author zhibing.pu + * @date 2023/7/5 21:06 + */ +@FeignClient("mb-cloud-activity") +public interface CouponClient { + + + /** + * 根据id获取优惠券 + * @param id + * @return + */ + @PostMapping("/coupon/queryCouponById") + Coupon queryCouponById(Integer id); +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/UserCouponClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/UserCouponClient.java new file mode 100644 index 0000000..4e4b546 --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/UserCouponClient.java @@ -0,0 +1,22 @@ +package com.dsh.course.feignclient.activity; + +import com.dsh.course.feignclient.activity.model.UserCoupon; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author zhibing.pu + * @date 2023/7/5 20:54 + */ +@FeignClient("mb-cloud-activity") +public interface UserCouponClient { + + + /** + * 根据id获取用户优惠券数据 + * @param id + * @return + */ + @PostMapping("/userCoupon/queryUserCouponById") + UserCoupon queryUserCouponById(Long id); +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/Coupon.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/Coupon.java new file mode 100644 index 0000000..eaa0e5f --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/Coupon.java @@ -0,0 +1,115 @@ +package com.dsh.course.feignclient.activity.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/5 21:06 + */ +@Data +public class Coupon { + private Integer id; + /** + * 优惠券名称 + */ + private String name; + /** + * 优惠券类型(1=满减券,2=代金券,3=体验券) + */ + private Integer type; + /** + * 优惠券规则JSON + */ + private String content; + /** + * 优惠券说明 + */ + private String illustrate; + /** + * 发放方式(1=积分购买,2=注册赠送,3=自动发券) + */ + private Integer distributionMethod; + /** + * 兑换方式(1=积分,2=积分+现金) + */ + private Integer redemptionMethod; + /** + * 所需现金 + */ + private BigDecimal cash; + /** + * 所属积分 + */ + private BigDecimal integral; + /** + * 用户人群(1=全部用户,2=年度会员,3=已有学员用户) + */ + private Integer userPopulation; + /** + * 发放数量 + */ + private Integer quantityIssued; + /** + * 限领数量 + */ + private Integer pickUpQuantity; + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + /** + * 使用范围(1=全国,2=指定城市,3=指定门店) + */ + private Integer useScope; + /** + * 省 + */ + private String province; + /** + * 省编号 + */ + private String provinceCode; + /** + * 市 + */ + private String city; + /** + * 市编号 + */ + private String cityCode; + /** + * 审核状态(1=待审核,2=已通过,3=已拒绝) + */ + private Integer auditStatus; + /** + * 审核人id + */ + private Integer auditUserId; + /** + * 审核备注 + */ + private String auditRemark; + /** + * 状态(1=未开始,2=已开始,3=已结束,4=已取消) + */ + private Integer status; + /** + * 状态(1=正常,2=冻结,3=删除) + */ + private Integer state; + /** + * 添加时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date insertTime; +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/UserCoupon.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/UserCoupon.java new file mode 100644 index 0000000..9a82e0b --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/UserCoupon.java @@ -0,0 +1,41 @@ +package com.dsh.course.feignclient.activity.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author zhibing.pu + * @date 2023/7/5 20:55 + */ +@Data +public class UserCoupon { + private Long id; + /** + * 优惠券id + */ + private Integer couponId; + /** + * 用户id + */ + private Integer userId; + /** + * 状态(1=待核销,2=已核销) + */ + private Integer status; + /** + * 核销人员id + */ + private Integer verificationUserId; + /** + * 核销时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date verificationTime; + /** + * 领取时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date insertTime; +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/CourseHoursType.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/CourseHoursType.java index 3877b72..6042f1d 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/CourseHoursType.java +++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/CourseHoursType.java @@ -8,7 +8,7 @@ public class CourseHoursType { @ApiModelProperty(value = "课时id") - private Integer courseConfigId; + private Long courseConfigId; @ApiModelProperty(value = "课时数") private Integer courseHourNums; diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/PaymentCourseVo.java b/cloud-server-course/src/main/java/com/dsh/course/model/PaymentCourseVo.java new file mode 100644 index 0000000..3d8757d --- /dev/null +++ b/cloud-server-course/src/main/java/com/dsh/course/model/PaymentCourseVo.java @@ -0,0 +1,26 @@ +package com.dsh.course.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @date 2023/7/5 20:29 + */ +@Data +@ApiModel +public class PaymentCourseVo { + @ApiModelProperty(value = "课程id", dataType = "int", required = true) + private Integer id; + @ApiModelProperty(value = "支付方式(1=微信,2=支付宝,3=玩湃币)", dataType = "int", required = true) + private Integer payType; + @ApiModelProperty(value = "支付金额", dataType = "double", required = true) + private Double price; + @ApiModelProperty(value = "课时id", dataType = "int", required = true) + private Integer coursePackagePaymentConfigId; + @ApiModelProperty(value = "学员id,多个分号分隔", dataType = "string", required = true) + private String studentIds; + @ApiModelProperty(value = "优惠券id", dataType = "long", required = false) + private Long couponId; +} diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java index 0bb29d3..f45d97a 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java +++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java @@ -6,6 +6,8 @@ import com.dsh.course.model.CoursePackageInfo; import com.dsh.course.model.CoursePackageList; import com.dsh.course.model.CoursePackageListVo; +import com.dsh.course.model.PaymentCourseVo; +import com.dsh.course.util.ResultUtil; import java.util.List; @@ -40,4 +42,14 @@ * @throws Exception */ CoursePackageInfo queryCourseInfo(Integer uid, Integer id, String lon, String lat) throws Exception; + + + /** + * 课程报名支付 + * @param uid + * @param paymentCourseVo + * @return + * @throws Exception + */ + ResultUtil paymentCourse(Integer uid, PaymentCourseVo paymentCourseVo) throws Exception; } diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java index cade892..356f640 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java +++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java @@ -8,10 +8,15 @@ import com.dsh.course.entity.CoursePackagePaymentConfig; import com.dsh.course.entity.TCoursePackage; import com.dsh.course.entity.TCoursePackageDiscount; +import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.feignclient.account.AppUserClient; import com.dsh.course.feignclient.account.StudentClient; import com.dsh.course.feignclient.account.model.AppUser; import com.dsh.course.feignclient.account.model.Student; +import com.dsh.course.feignclient.activity.CouponClient; +import com.dsh.course.feignclient.activity.UserCouponClient; +import com.dsh.course.feignclient.activity.model.Coupon; +import com.dsh.course.feignclient.activity.model.UserCoupon; import com.dsh.course.feignclient.other.StoreClient; import com.dsh.course.feignclient.other.model.Store; import com.dsh.course.mapper.TCoursePackageMapper; @@ -23,6 +28,7 @@ import com.dsh.course.service.TCoursePackageService; import com.dsh.course.util.GDMapGeocodingUtil; import com.dsh.course.util.GeodesyUtil; +import com.dsh.course.util.ResultUtil; import com.dsh.course.util.ToolUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,6 +71,12 @@ @Resource private StudentClient studentClient; + + @Resource + private UserCouponClient userCouponClient; + + @Resource + private CouponClient couponClient; @@ -273,9 +285,11 @@ coursePackageInfo.setStoreAddress(store.getAddress()); coursePackageInfo.setLon(store.getLon()); coursePackageInfo.setLat(store.getLat()); - Map<String, Double> distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat()); - double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); - coursePackageInfo.setDistance(wgs84); + if(ToolUtil.isNotEmpty(lon) && ToolUtil.isNotEmpty(lat)){ + Map<String, Double> distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat()); + double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + coursePackageInfo.setDistance(wgs84); + } String[] split = coursePackage.getClassWeeks().split(";"); coursePackageInfo.setWeeks(Arrays.asList(split)); @@ -290,7 +304,7 @@ coursePackagePaymentConfigVo.setClassHours(coursePackagePaymentConfig.getClassHours()); coursePackagePaymentConfigVo.setPayType(coursePackage.getPayType()); coursePackagePaymentConfigVo.setPlayPaiCoin(coursePackagePaymentConfig.getPlayPaiCoin()); - //会员显示原价和会员价(最低)。非会员显示会员价和支付价(最低) + //会员显示原价和支付价(会员价)。非会员显示会员价和支付价(最低) if(appUser.getIsVip() == 0){//非会员 List<TCoursePackageDiscount> list2 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId()) .eq("type", 1).eq("auditStatus", 2)); @@ -406,4 +420,94 @@ coursePackageInfo.setStudent(studentVo); return coursePackageInfo; } + + + /** + * 课程包名支付 + * @param uid + * @param paymentCourseVo + * @return + * @throws Exception + */ + @Override + public ResultUtil paymentCourse(Integer uid, PaymentCourseVo paymentCourseVo) throws Exception { + AppUser appUser = appUserClient.queryAppUser(uid); + CoursePackageInfo coursePackageInfo = queryCourseInfo(uid, paymentCourseVo.getId(), null, null); + List<CoursePackagePaymentConfigVo> list = coursePackageInfo.getList(); + + String[] students = paymentCourseVo.getStudentIds().split(";"); + for (CoursePackagePaymentConfigVo coursePackagePaymentConfigVo : list) { + if(paymentCourseVo.getCoursePackagePaymentConfigId().compareTo(coursePackagePaymentConfigVo.getId()) == 0){ + Integer payType = coursePackagePaymentConfigVo.getPayType(); + if(payType == 1 && paymentCourseVo.getPayType() == 3){//现金支付 + return ResultUtil.error("支付方式错误,请刷新后重试"); + } + if(payType == 2 && paymentCourseVo.getPayType() != 3){//玩湃币支付 + return ResultUtil.error("支付方式错误,请刷新后重试"); + } + Double paymentPrice = coursePackagePaymentConfigVo.getPaymentPrice();//支付价 + paymentPrice = new BigDecimal(students.length).multiply(new BigDecimal(paymentPrice)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + Double playPaiCoin = coursePackagePaymentConfigVo.getPlayPaiCoin().doubleValue();//支付币 + playPaiCoin = new BigDecimal(students.length).multiply(new BigDecimal(playPaiCoin)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + if(payType == 1 && paymentPrice.compareTo(paymentCourseVo.getPrice()) != 0){ + return ResultUtil.error("支付金额异常,请刷新后重试"); + } + if(payType == 2 && playPaiCoin.compareTo(paymentCourseVo.getPrice()) != 0){ + return ResultUtil.error("支付金额异常,请刷新后重试"); + } + } + } + + Double price = paymentCourseVo.getPrice();//支付金额 + + //校验优惠券 + Long couponId = paymentCourseVo.getCouponId(); + if(null != couponId && paymentCourseVo.getPayType() != 3){ + UserCoupon userCoupon = userCouponClient.queryUserCouponById(couponId); + if(userCoupon.getStatus() == 2){ + return ResultUtil.error("优惠券已被核销"); + } + Coupon coupon = couponClient.queryCouponById(userCoupon.getCouponId()); + long time = coupon.getEndTime().getTime(); + if(System.currentTimeMillis() >= time){ + return ResultUtil.error("优惠券已过期"); + } + if(coupon.getType() == 1){//满减 + JSONObject jsonObject = JSON.parseObject(coupon.getContent()); + Double num1 = jsonObject.getDouble("num1"); + Double num2 = jsonObject.getDouble("num2"); + if(price.compareTo(num1) <= 0){ + return ResultUtil.error("该优惠券无法使用"); + } + + price = new BigDecimal(price).subtract(new BigDecimal(num2)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + } + if(coupon.getType() == 2){//代金券 + JSONObject jsonObject = JSON.parseObject(coupon.getContent()); + Double num1 = jsonObject.getDouble("num1"); + if(price.compareTo(num1) <= 0){ + return ResultUtil.error("该优惠券无法使用"); + } + price = new BigDecimal(price).subtract(new BigDecimal(num1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + } + } + + if(paymentCourseVo.getPayType() == 1){//微信支付 + + } + if(paymentCourseVo.getPayType() == 2){//支付宝支付 + + } + if(paymentCourseVo.getPayType() == 3){//玩湃币支付 + + } + return null; + } + + + public ResultUtil weChatPaymentCourse(Integer uid, PaymentCourseVo paymentCourseVo){ + TCoursePackagePayment coursePackagePayment = new TCoursePackagePayment(); +// coursePackagePayment + return ResultUtil.success(); + } } -- Gitblit v1.7.1