From 5d02cf6ba780f088b24f62cf8db94bf63707db57 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期二, 10 九月 2024 10:14:46 +0800 Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/XinQuanHealing --- xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java | 4 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java | 16 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java | 9 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/OrderUtil.java | 54 ++ xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java | 2 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentTypeEnum.java | 25 + xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMusicMapper.xml | 1 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/OrderPaymentRecord.java | 14 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java | 31 + xinquan-auth/src/main/resources/bootstrap.yml | 5 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java | 7 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentStatusEnum.java | 24 + xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/inner/InnerOrderController.java | 45 ++ xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseMapper.java | 2 xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/domain/Meditation.java | 2 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java | 233 ++++++++++ xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java | 2 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/OrderFromEnum.java | 24 + xinquan-modules/xinquan-job/src/main/resources/bootstrap.yml | 25 + xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java | 25 + xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/inner/InnerMeditationController.java | 39 + xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java | 41 + xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml | 3 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java | 3 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationEveryday.java | 15 xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml | 2 xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java | 25 + xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java | 3 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml | 3 .gitignore | 2 xinquan-gateway/src/main/resources/bootstrap.yml | 2 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientNoticeRecordController.java | 20 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java | 21 xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml | 31 + xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerNoticeRecordController.java | 20 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java | 16 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java | 2 docker/docker-compose.yml | 140 ++++++ xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java | 3 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java | 2 xinquan-ui/src/assets/icons/svgo.yml | 22 + xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ChargeTypeEnum.java | 24 + xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java | 26 + xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java | 8 xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/feign/RemoteMeditationService.java | 29 + xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/factory/RemoteMeditationFallbackFactory.java | 23 + xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml | 6 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/mapper/OrderMapper.java | 2 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java | 1 xinquan-modules/xinquan-gen/src/main/resources/bootstrap.yml | 36 + xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java | 41 + xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java | 58 ++ xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java | 13 xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java | 8 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java | 2 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/NotifyController.java | 16 xinquan-visual/xinquan-monitor/src/main/resources/bootstrap.yml | 25 + xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java | 6 58 files changed, 1,234 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 9482a02..af259f4 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,7 @@ *.log *.xml.versionsBackup *.swp -*.yml + !*/build/*.java !*/build/*.html diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..21c3c10 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,140 @@ +version : '3.8' +services: + xinquan-nacos: + container_name: xinquan-nacos + image: nacos/nacos-server + build: + context: ./nacos + environment: + - MODE=standalone + volumes: + - ./nacos/logs/:/home/nacos/logs + - ./nacos/conf/application.properties:/home/nacos/conf/application.properties + ports: + - "8848:8848" + - "9848:9848" + - "9849:9849" + depends_on: + - xinquan-mysql + xinquan-mysql: + container_name: xinquan-mysql + image: mysql:5.7 + build: + context: ./mysql + ports: + - "3306:3306" + volumes: + - ./mysql/conf:/etc/mysql/conf.d + - ./mysql/logs:/logs + - ./mysql/data:/var/lib/mysql + command: [ + 'mysqld', + '--innodb-buffer-pool-size=80M', + '--character-set-server=utf8mb4', + '--collation-server=utf8mb4_unicode_ci', + '--default-time-zone=+8:00', + '--lower-case-table-names=1' + ] + environment: + MYSQL_DATABASE: 'ry-cloud' + MYSQL_ROOT_PASSWORD: password + xinquan-redis: + container_name: xinquan-redis + image: redis + build: + context: ./redis + ports: + - "6379:6379" + volumes: + - ./redis/conf/redis.conf:/home/xinquan/redis/redis.conf + - ./redis/data:/data + command: redis-server /home/xinquan/redis/redis.conf + xinquan-nginx: + container_name: xinquan-nginx + image: nginx + build: + context: ./nginx + ports: + - "80:80" + volumes: + - ./nginx/html/dist:/home/xinquan/projects/xinquan-ui + - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/logs:/var/log/nginx + - ./nginx/conf.d:/etc/nginx/conf.d + depends_on: + - xinquan-gateway + links: + - xinquan-gateway + xinquan-gateway: + container_name: xinquan-gateway + build: + context: ./xinquan/gateway + dockerfile: dockerfile + ports: + - "8080:8080" + depends_on: + - xinquan-redis + links: + - xinquan-redis + xinquan-auth: + container_name: xinquan-auth + build: + context: ./xinquan/auth + dockerfile: dockerfile + ports: + - "9200:9200" + depends_on: + - xinquan-redis + links: + - xinquan-redis + xinquan-modules-system: + container_name: xinquan-modules-system + build: + context: ./xinquan/modules/system + dockerfile: dockerfile + ports: + - "9201:9201" + depends_on: + - xinquan-redis + - xinquan-mysql + links: + - xinquan-redis + - xinquan-mysql + xinquan-modules-gen: + container_name: xinquan-modules-gen + build: + context: ./xinquan/modules/gen + dockerfile: dockerfile + ports: + - "9202:9202" + depends_on: + - xinquan-mysql + links: + - xinquan-mysql + xinquan-modules-job: + container_name: xinquan-modules-job + build: + context: ./xinquan/modules/job + dockerfile: dockerfile + ports: + - "9203:9203" + depends_on: + - xinquan-mysql + links: + - xinquan-mysql + xinquan-modules-file: + container_name: xinquan-modules-file + build: + context: ./xinquan/modules/file + dockerfile: dockerfile + ports: + - "9300:9300" + volumes: + - ./xinquan/uploadPath:/home/xinquan/uploadPath + xinquan-visual-monitor: + container_name: xinquan-visual-monitor + build: + context: ./xinquan/visual/monitor + dockerfile: dockerfile + ports: + - "9100:9100" diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/Course.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java similarity index 87% rename from xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/Course.java rename to xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java index 15016a1..749ffd3 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/Course.java +++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java @@ -1,6 +1,8 @@ -package com.xinquan.course.domain; +package com.xinquan.course.api.domain; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xinquan.common.core.web.domain.BaseModel; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,6 +10,7 @@ import com.xinquan.user.api.domain.AppUser; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; import lombok.Data; import lombok.EqualsAndHashCode; @@ -61,6 +64,14 @@ @TableField("charge_type") private Integer chargeType; + @ApiModelProperty(value = "通用价格") + @TableField("general_price") + private BigDecimal generalPrice; + + @ApiModelProperty(value = "IOS内购价格") + @TableField("ios_price") + private BigDecimal iosPrice; + @ApiModelProperty(value = "排序权重") @TableField("sort_num") private Integer sortNum; diff --git a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java index 5fcac4a..ec012d1 100644 --- a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java +++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/feign/RemoteCourseService.java @@ -1,14 +1,20 @@ package com.xinquan.course.api.feign; +import com.xinquan.common.core.constant.SecurityConstants; import com.xinquan.common.core.constant.ServiceNameConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.course.api.domain.Course; import com.xinquan.course.api.factory.RemoteCourseFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestHeader; /** * @author mitao * @date 2024/8/21 */ -@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.COURSE_SERVICE, fallbackFactory = RemoteCourseFallbackFactory.class) +@FeignClient(contextId = "remoteCourseService", value = ServiceNameConstants.COURSE_SERVICE, fallbackFactory = RemoteCourseFallbackFactory.class) public interface RemoteCourseService { + R<Course> getCourseById(Long targetId, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/domain/Meditation.java similarity index 98% rename from xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java rename to xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/domain/Meditation.java index 1be293d..015b76e 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java +++ b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/domain/Meditation.java @@ -1,4 +1,4 @@ -package com.xinquan.meditation.domain; +package com.xinquan.meditation.api.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/factory/RemoteMeditationFallbackFactory.java b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/factory/RemoteMeditationFallbackFactory.java new file mode 100644 index 0000000..1d9e95f --- /dev/null +++ b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/factory/RemoteMeditationFallbackFactory.java @@ -0,0 +1,23 @@ +package com.xinquan.meditation.api.factory; + +import com.xinquan.common.core.domain.R; +import com.xinquan.meditation.api.domain.Meditation; +import com.xinquan.meditation.api.feign.RemoteMeditationService; +import org.springframework.cloud.openfeign.FallbackFactory; + +/** + * @author mitao + * @date 2024/9/9 + */ +public class RemoteMeditationFallbackFactory implements FallbackFactory<RemoteMeditationService> { + + @Override + public RemoteMeditationService create(Throwable cause) { + return new RemoteMeditationService() { + @Override + public R<Meditation> getMeditationById(Long targetId, String source) { + return R.fail("获取冥想音频失败"); + } + }; + } +} diff --git a/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/feign/RemoteMeditationService.java b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/feign/RemoteMeditationService.java new file mode 100644 index 0000000..66f2941 --- /dev/null +++ b/xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/feign/RemoteMeditationService.java @@ -0,0 +1,29 @@ +package com.xinquan.meditation.api.feign; + +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.constant.ServiceNameConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.meditation.api.domain.Meditation; +import com.xinquan.meditation.api.factory.RemoteMeditationFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author mitao + * @date 2024/9/9 + */ +@FeignClient(contextId = "remoteMeditationService", value = ServiceNameConstants.MEDITATION_SERVICE, fallbackFactory = RemoteMeditationFallbackFactory.class) +public interface RemoteMeditationService { + + /** + * 根据id获取冥想音频 + * + * @param targetId 冥想音频id + * @return 冥想音频 + */ + @GetMapping("/inner/meditation/meditation/getMeditationById") + R<Meditation> getMeditationById(@RequestParam("targetId") Long targetId, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/Order.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java similarity index 98% rename from xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/Order.java rename to xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java index 507a667..5b93fb4 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/Order.java +++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java @@ -1,4 +1,4 @@ -package com.xinquan.order.domain; +package com.xinquan.order.api.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java new file mode 100644 index 0000000..4b7a7b8 --- /dev/null +++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java @@ -0,0 +1,25 @@ +package com.xinquan.order.api.factory; + +import com.xinquan.common.core.domain.R; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.api.feign.RemoteOrderService; +import java.util.List; +import org.springframework.cloud.openfeign.FallbackFactory; + +/** + * @author mitao + * @date 2024/9/9 + */ +public class RemoteOrderFallbackFactory implements FallbackFactory<RemoteOrderService> { + + @Override + public RemoteOrderService create(Throwable cause) { + return new RemoteOrderService() { + @Override + public R<List<Order>> getOrderListByType(Long userId, Integer orderFrom, + String source) { + return R.fail("获取订单列表失败"); + } + }; + } +} diff --git a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java new file mode 100644 index 0000000..1006727 --- /dev/null +++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java @@ -0,0 +1,25 @@ +package com.xinquan.order.api.feign; + +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.constant.ServiceNameConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.api.factory.RemoteOrderFallbackFactory; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author mitao + * @date 2024/9/9 + */ +@FeignClient(contextId = "remoteOrderService", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderFallbackFactory.class) +public interface RemoteOrderService { + + @PostMapping("/inner/order/order/getOrderListByType") + R<List<Order>> getOrderListByType(@RequestParam("userId") Long userId, + @RequestParam("orderFrom") Integer orderFrom, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} diff --git a/xinquan-auth/src/main/resources/bootstrap.yml b/xinquan-auth/src/main/resources/bootstrap.yml index 53e486b..4a1e45b 100644 --- a/xinquan-auth/src/main/resources/bootstrap.yml +++ b/xinquan-auth/src/main/resources/bootstrap.yml @@ -79,4 +79,7 @@ file-extension: yml # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +meditation: + secret: V8EZaYQ2gGzFaH7GPLZbw7KGYMRZ8MpF diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java index 72b3b35..7810d4d 100644 --- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java @@ -137,4 +137,8 @@ * 默认密码 */ public static final String DEFAULT_PASSWORD = "123456"; + /** + * 支付回调地址 + */ + public static final String PAYMENT_NOTIFY_URL = "/client/order/notify"; } diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ChargeTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ChargeTypeEnum.java new file mode 100644 index 0000000..02e2ca2 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ChargeTypeEnum.java @@ -0,0 +1,24 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ChargeTypeEnum { + FREE(1, "免费"), + FREE_FOR_VIP(2, "会员免费"), + SEPARATE_CHARGE(3, "单独收费"); + + private final Integer code; + private final String desc; + + public static ChargeTypeEnum getEnumByCode(Integer code) { + for (ChargeTypeEnum e : ChargeTypeEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/OrderFromEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/OrderFromEnum.java new file mode 100644 index 0000000..59d857e --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/OrderFromEnum.java @@ -0,0 +1,24 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrderFromEnum { + MEDITATION(1, "冥想订单"), + COURSE(2, "课程订单"), + VIP(3, "会员订单"); + + private final Integer code; + private final String desc; + + public static OrderFromEnum getEnumByCode(Integer code) { + for (OrderFromEnum e : OrderFromEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentStatusEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentStatusEnum.java new file mode 100644 index 0000000..772050a --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentStatusEnum.java @@ -0,0 +1,24 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PaymentStatusEnum { + TO_BE_PAID(1, "待支付"), + COMPLETED(2, "已完成"), + CANCELED(3, "已取消"); + + private final Integer code; + private final String desc; + + public static PaymentStatusEnum getEnumByCode(Integer code) { + for (PaymentStatusEnum e : PaymentStatusEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentTypeEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentTypeEnum.java new file mode 100644 index 0000000..cc90e1c --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/PaymentTypeEnum.java @@ -0,0 +1,25 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PaymentTypeEnum { + WECHAT_PAY(1, "微信支付"), + ALI_PAY(2, "支付宝支付"), + IOS_PAY(3, "IOS内购支付"), + BALANCE_PAY(4, "余额支付"); + + private final Integer code; + private final String desc; + + public static PaymentTypeEnum getEnumByCode(Integer code) { + for (PaymentTypeEnum e : PaymentTypeEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-gateway/src/main/resources/bootstrap.yml b/xinquan-gateway/src/main/resources/bootstrap.yml index 58389c9..6064a08 100644 --- a/xinquan-gateway/src/main/resources/bootstrap.yml +++ b/xinquan-gateway/src/main/resources/bootstrap.yml @@ -2,7 +2,7 @@ spring: application: # 应用名称 - name: xinquan-auth + name: xinquan-gateway main: allow-bean-definition-overriding: true profiles: diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java index 8fafb77..f5c5113 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java @@ -2,6 +2,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; import lombok.Data; /** @@ -35,6 +36,12 @@ @ApiModelProperty(value = "价格设定 1=免费 2=会员免费 3=单独收费") private Integer chargeType; + + @ApiModelProperty(value = "通用价格") + private BigDecimal generalPrice; + + @ApiModelProperty(value = "IOS内购价格") + private BigDecimal iosPrice; @ApiModelProperty(value = "排序权重") private Integer sortNum; diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseMapper.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseMapper.java index e59632d..41fe607 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseMapper.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseMapper.java @@ -1,7 +1,7 @@ package com.xinquan.course.mapper; -import com.xinquan.course.domain.Course; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.course.api.domain.Course; /** * <p> diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java index 262ad01..fb295da 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java @@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xinquan.common.core.utils.page.PageDTO; -import com.xinquan.course.domain.Course; +import com.xinquan.course.api.domain.Course; import com.xinquan.course.domain.vo.ClientCourseVO; /** diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java index 077e643..fa17424 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xinquan.common.core.utils.page.CollUtils; import com.xinquan.common.core.utils.page.PageDTO; -import com.xinquan.course.domain.Course; +import com.xinquan.course.api.domain.Course; import com.xinquan.course.domain.vo.ClientCourseVO; import com.xinquan.course.mapper.CourseMapper; import com.xinquan.course.service.CourseService; diff --git a/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml index 624d362..6e70505 100644 --- a/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml @@ -3,7 +3,7 @@ <mapper namespace="com.xinquan.course.mapper.CourseMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.course.domain.Course"> + <resultMap id="BaseResultMap" type="com.xinquan.course.api.domain.Course"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> @@ -17,6 +17,8 @@ <result column="listing_status" property="listingStatus" /> <result column="recommend" property="recommend" /> <result column="charge_type" property="chargeType" /> + <result column="general_price" property="generalPrice"/> + <result column="ios_price" property="iosPrice"/> <result column="sort_num" property="sortNum" /> <result column="tutor" property="tutor" /> <result column="cover_url" property="coverUrl" /> @@ -36,7 +38,7 @@ create_time, update_by, update_time, - id, course_type, cate_id, course_title, description, listing_status, recommend, charge_type, sort_num, tutor, cover_url, detail_url, brief_introduction, wx_qr_code, address, address_detail, longitude, latitude + id, course_type, cate_id, course_title, description, listing_status, recommend, charge_type, general_price,ios_price,sort_num, tutor, cover_url, detail_url, brief_introduction, wx_qr_code, address, address_detail, longitude, latitude </sql> </mapper> diff --git a/xinquan-modules/xinquan-gen/src/main/resources/bootstrap.yml b/xinquan-modules/xinquan-gen/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..d7e1272 --- /dev/null +++ b/xinquan-modules/xinquan-gen/src/main/resources/bootstrap.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9202 + +# Spring +spring: + application: + # 应用名称 + name: xinquan-gen + profiles: + # 环境配置 + active: dev +--- +spring: + config: + activate: + on-profile: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 192.168.110.64:8848 + service: ${spring.application.name} + group: DEFAULT_GROUP + namespace: 8ebd2324-30b4-477b-af79-b46e717c4fbe + config: + # 配置中心地址 + server-addr: 192.168.110.64:8848 + namespace: 8ebd2324-30b4-477b-af79-b46e717c4fbe + group: DEFAULT_GROUP + name: ${spring.application.name} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/xinquan-modules/xinquan-job/src/main/resources/bootstrap.yml b/xinquan-modules/xinquan-job/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..97e06d3 --- /dev/null +++ b/xinquan-modules/xinquan-job/src/main/resources/bootstrap.yml @@ -0,0 +1,25 @@ +# Tomcat +server: + port: 9203 + +# Spring +spring: + application: + # 应用名称 + name: xinquan-job + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 127.0.0.1:8848 + config: + # 配置中心地址 + server-addr: 127.0.0.1:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java index de25728..73c874a 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java @@ -181,8 +181,7 @@ @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true) }) public R<PageDTO<ClientMeditationVO>> search(@RequestParam String condition, - @RequestParam Integer - pageCurr, @RequestParam Integer pageSize) { + @RequestParam Integer pageCurr, @RequestParam Integer pageSize) { return R.ok(meditationService.search(condition, pageCurr, pageSize)); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/inner/InnerMeditationController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/inner/InnerMeditationController.java new file mode 100644 index 0000000..47264ad --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/inner/InnerMeditationController.java @@ -0,0 +1,39 @@ +package com.xinquan.meditation.controller.inner; + + +import com.xinquan.common.core.domain.R; +import com.xinquan.meditation.api.domain.Meditation; +import com.xinquan.meditation.service.MeditationService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 首页背景音乐用户关系表 前端控制器 + * </p> + * + * @author mitao + * @since 2024-08-23 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/inner/meditation/meditation") +public class InnerMeditationController { + + private final MeditationService meditationService; + + /** + * 根据id获取冥想音频 + * + * @param targetId 冥想音频id + * @return 冥想音频 + */ + @GetMapping("/getMeditationById") + R<Meditation> getMeditationById(@RequestParam("targetId") Long targetId) { + return R.ok(meditationService.getById(targetId)); + } +} + diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationEveryday.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationEveryday.java index c0db414..49aaf6e 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationEveryday.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationEveryday.java @@ -1,13 +1,14 @@ package com.xinquan.meditation.domain; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableName; -import com.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xinquan.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.time.LocalTime; import lombok.Data; import lombok.EqualsAndHashCode; @@ -37,11 +38,13 @@ @ApiModelProperty(value = "播放时间段开始") @TableField("start_play_time") - private LocalDateTime startPlayTime; + @JsonFormat(pattern = "HH:mm:ss") + private LocalTime startPlayTime; @ApiModelProperty(value = "播放时间段结束") @TableField("end_play_time") - private LocalDateTime endPlayTime; + @JsonFormat(pattern = "HH:mm:ss") + private LocalTime endPlayTime; @ApiModelProperty(value = "每日冥想背景图片") @TableField("image_url") diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java index 8fe2a9e..ca469f7 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java @@ -49,7 +49,6 @@ * 创建时间 */ @ApiModelProperty(value = "记录创建时间,前端忽略") - // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java index d3f5df3..afdf63a 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java @@ -22,4 +22,7 @@ @ApiModelProperty(value = "是否收藏 1:是 2:否") private Integer favorite; + + @ApiModelProperty(value = "提问数") + private Long questionCount; } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java index b003329..8c1f3bc 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java @@ -1,9 +1,10 @@ package com.xinquan.meditation.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; -import java.time.LocalDateTime; +import java.time.LocalTime; import lombok.Data; /** @@ -23,10 +24,12 @@ private Long meditationId; @ApiModelProperty(value = "播放时间段开始") - private LocalDateTime startPlayTime; + @JsonFormat(pattern = "HH:mm:ss") + private LocalTime startPlayTime; @ApiModelProperty(value = "播放时间段结束") - private LocalDateTime endPlayTime; + @JsonFormat(pattern = "HH:mm:ss") + private LocalTime endPlayTime; @ApiModelProperty(value = "每日冥想背景图片") private String imageUrl; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java index d81dfcc..33b95be 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java @@ -34,6 +34,9 @@ @ApiModelProperty(value = "价格设定 1=免费 2=会员免费 3=单独收费") private Integer chargeType; + @ApiModelProperty(value = "是否已付费 1:是 2:否") + private Integer paidStatus = 2; + @ApiModelProperty(value = "通用价格", notes = "价格设定为单独收费") private BigDecimal generalPrice; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java index 8bc0193..9521925 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java @@ -1,7 +1,7 @@ package com.xinquan.meditation.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.meditation.domain.vo.ClientMeditationVO; import java.util.List; import java.util.Set; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java index d436295..d82ba16 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java @@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xinquan.common.core.utils.page.PageDTO; -import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO; import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO; import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java index 10608d9..5cfb805 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java @@ -1,15 +1,15 @@ package com.xinquan.meditation.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.DateUtils; import com.xinquan.common.core.utils.page.BeanUtils; -import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.meditation.domain.MeditationEveryday; import com.xinquan.meditation.domain.vo.ClientMeditationEverydayVO; import com.xinquan.meditation.domain.vo.ClientMeditationVO; import com.xinquan.meditation.mapper.MeditationEverydayMapper; import com.xinquan.meditation.mapper.MeditationMapper; import com.xinquan.meditation.service.MeditationEverydayService; -import java.time.LocalDateTime; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -37,11 +37,11 @@ public ClientMeditationEverydayVO getTodayMeditation() { ClientMeditationEverydayVO vo = null; // 当前时间 - LocalDateTime now = LocalDateTime.now(); + String now = DateUtils.dateTimeNow("HH:mm:ss"); // 查询播放时间段在当前时间的每日冥想 Optional<MeditationEveryday> meditationEverydayOpt = this.lambdaQuery() .le(MeditationEveryday::getStartPlayTime, now) - .ge(MeditationEveryday::getEndPlayTime, now) + .gt(MeditationEveryday::getEndPlayTime, now) .orderByDesc(MeditationEveryday::getUpdateTime) .last("limit 1").oneOpt(); if (!meditationEverydayOpt.isPresent()) { diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java index 0142788..d003d07 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java @@ -5,12 +5,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xinquan.common.core.constant.SecurityConstants; import com.xinquan.common.core.enums.DisabledEnum; +import com.xinquan.common.core.enums.OrderFromEnum; import com.xinquan.common.core.exception.ServiceException; import com.xinquan.common.core.utils.page.BeanUtils; import com.xinquan.common.core.utils.page.CollUtils; import com.xinquan.common.core.utils.page.PageDTO; import com.xinquan.common.security.utils.SecurityUtils; -import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.meditation.domain.MeditationCategory; import com.xinquan.meditation.domain.MeditationMusic; import com.xinquan.meditation.domain.MeditationQuestion; @@ -28,6 +29,8 @@ import com.xinquan.meditation.service.MeditationQuestionLikeService; import com.xinquan.meditation.service.MeditationService; import com.xinquan.meditation.service.MeditationUserFavoriteService; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.api.feign.RemoteOrderService; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; import com.xinquan.user.api.feign.RemoteAppUserService; @@ -61,7 +64,7 @@ private final MeditationQuestionMapper meditationQuestionMapper; private final MeditationQuestionLikeService meditationQuestionLikeService; private final MeditationUserFavoriteService meditationUserFavoriteService; - + private final RemoteOrderService remoteOrderService; /** * 获取私人订制 * @@ -79,6 +82,30 @@ .collect(Collectors.toSet()); // 查询冥想列表 voList = baseMapper.getMeditationListByTagId(tagIdSet, sanskritFlag); + } + voList = handlePaidMeditation(voList); + return voList; + } + + /** + * 处理已付费冥想音频 + * + * @param voList + * @return + */ + private List<ClientMeditationVO> handlePaidMeditation(List<ClientMeditationVO> voList) { + // 远程调用订单服务,查询用户已付费冥想 + Long userId = SecurityUtils.getUserId(); + List<Order> orderList = remoteOrderService.getOrderListByType(userId, + OrderFromEnum.MEDITATION.getCode(), + SecurityConstants.INNER).getData(); + List<Long> meditationIdList = orderList.stream().map(Order::getBusinessId) + .collect(Collectors.toList()); + if (CollUtils.isNotEmpty(meditationIdList)) { + voList = voList.stream() + .filter(meditationVO -> meditationIdList.contains(meditationVO.getId())) + .peek(meditationVO -> meditationVO.setPaidStatus(1)) + .collect(Collectors.toList()); } return voList; } @@ -102,6 +129,7 @@ // 对象拷贝 voList = BeanUtils.copyList(list, ClientMeditationVO.class); } + handlePaidMeditation(voList); return voList; } @@ -205,6 +233,7 @@ });*/ // 将实体类转换为VO pageDTO = PageDTO.of(page, ClientMeditationVO.class); + handlePaidMeditation(pageDTO.getList()); return pageDTO; } @@ -235,6 +264,10 @@ .eq(MeditationUserFavorite::getMeditationId, id) .eq(MeditationUserFavorite::getAppUserId, SecurityUtils.getUserId()) .count() > 0 ? 1 : 2); + // 获取提问数 + vo.setQuestionCount(meditationQuestionMapper.selectCount( + Wrappers.lambdaQuery(MeditationQuestion.class) + .eq(MeditationQuestion::getMeditationId, id))); return vo; } @@ -256,7 +289,7 @@ .last("limit 1").oneOpt(); if (userOperationOpt.isPresent()) { meditationUserFavoriteService.removeById(userOperationOpt.get()); - // 增加收藏数 + // 减少收藏数 meditation.setFavoriteCount(meditation.getFavoriteCount() - 1); } else { // 增加收藏记录 @@ -264,7 +297,7 @@ meditationUserFavorite.setMeditationId(id); meditationUserFavorite.setAppUserId(SecurityUtils.getUserId()); meditationUserFavoriteService.save(meditationUserFavorite); - // 减少收藏数 + // 增加收藏数 meditation.setFavoriteCount(meditation.getFavoriteCount() + 1); } this.updateById(meditation); diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml index 6a8df73..ef1c8dd 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml @@ -3,7 +3,7 @@ <mapper namespace="com.xinquan.meditation.mapper.MeditationMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.Meditation"> + <resultMap id="BaseResultMap" type="com.xinquan.meditation.api.domain.Meditation"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> @@ -24,6 +24,7 @@ <result column="detail_description" property="detailDescription" /> <result column="cover_description" property="coverDescription" /> <result column="tutor_audio_url" property="tutorAudioUrl" /> + <result column="tutor_audio_duration" property="tutorAudioDuration"/> <result column="favorite_count" property="favoriteCount" /> </resultMap> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMusicMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMusicMapper.xml index 038a40c..a8ecd6d 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMusicMapper.xml +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMusicMapper.xml @@ -7,6 +7,7 @@ <id column="id" property="id" /> <result column="meditation_id" property="meditationId" /> <result column="music_url" property="musicUrl" /> + <result column="music_duration" property="musicDuration"/> </resultMap> <!-- 通用查询结果列 --> diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java index 18ad2af..59e2d49 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java @@ -2,12 +2,16 @@ import com.xinquan.common.core.domain.R; +import com.xinquan.order.domain.vo.ClientPlaceOrderVO; import com.xinquan.order.service.OrderService; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** @@ -26,10 +30,39 @@ private OrderService orderService; - @PostMapping("/createOrder") - @ApiOperation(value = "创建订单") - public R<?> createOrder() { - return R.ok(); + /** + * 创建待支付订单 + * + * @param targetId 目标id + * @param orderFrom 订单来源 1=冥想音频 2=课程 + * @param receiverId 被赠送课程APP用户id + * @param balanceFlag 是否使用余额抵扣 1=是 2=否 + * @param payType 支付方式 1=微信 2=支付宝 + * @return 下单返回数据视图对象 + * @see com.xinquan.order.domain.vo.ClientPlaceOrderVO + */ + @PostMapping("/placeOrder") + @ApiOperation(value = "创建待支付订单", notes = "微信|支付宝") + @ApiImplicitParams({ + @ApiImplicitParam(name = "targetId", value = "目标id", dataType = "Long", required = true), + @ApiImplicitParam(name = "orderFrom", value = "订单来源 1=冥想音频 2=课程", dataType = "Integer", required = true), + @ApiImplicitParam(name = "receiverId", value = "被赠送课程APP用户id", dataType = "Long", required = false), + @ApiImplicitParam(name = "balanceFlag", value = "是否使用余额抵扣 1=是 2=否", dataType = "Integer", required = true), + @ApiImplicitParam(name = "payType", value = "支付方式 1=微信 2=支付宝", dataType = "Integer", required = true) + }) + public R<ClientPlaceOrderVO> placeOrder( + @RequestParam(value = "targetId") Long targetId, + @RequestParam(value = "orderFrom") Integer orderFrom, + @RequestParam(value = "receiverId", required = false) Long receiverId, + @RequestParam(value = "balanceFlag") Integer balanceFlag, + @RequestParam(value = "payType") Integer payType) { + try { + return R.ok( + orderService.placeOrder(targetId, orderFrom, receiverId, + balanceFlag, payType)); + } catch (Exception e) { + throw new RuntimeException(e); + } } } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/NotifyController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/NotifyController.java new file mode 100644 index 0000000..84fd8d5 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/NotifyController.java @@ -0,0 +1,16 @@ +package com.xinquan.order.controller.client; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 支付回调控制器 + * + * @author mitao + * @date 2024/9/9 + */ +@RestController +@RequestMapping("/client/order/notify") +public class NotifyController { + +} diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/inner/InnerOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/inner/InnerOrderController.java new file mode 100644 index 0000000..7413278 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/inner/InnerOrderController.java @@ -0,0 +1,45 @@ +package com.xinquan.order.controller.inner; + + +import com.xinquan.common.core.domain.R; +import com.xinquan.common.security.annotation.InnerAuth; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.service.OrderService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 订单表 前端控制器 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/inner/order/order") +public class InnerOrderController { + + private final OrderService orderService; + + /** + * 根据类型获取已完成的订单列表 + * + * @param userId 用户id + * @param orderFrom 订单来源 + * @return + */ + @InnerAuth + @PostMapping("/getOrderListByType") + R<List<Order>> getOrderListByType(@RequestParam("userId") Long userId, + @RequestParam("orderFrom") Integer orderFrom) { + return R.ok(orderService.getOrderListByType(userId, orderFrom)); + } + +} + diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/OrderPaymentRecord.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/OrderPaymentRecord.java index bf57374..e221bf9 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/OrderPaymentRecord.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/OrderPaymentRecord.java @@ -1,13 +1,13 @@ package com.xinquan.order.domain; import com.baomidou.mybatisplus.annotation.IdType; -import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; import lombok.Data; import lombok.EqualsAndHashCode; @@ -35,7 +35,7 @@ @TableField("order_id") private Long orderId; - @ApiModelProperty(value = "支付类型 1=微信支付 2=支付宝支付 3=余额支付 4=IOS内购支付") + @ApiModelProperty(value = "支付类型 1=微信支付 2=支付宝支付 3=IOS内购支付 4=余额支付") @TableField("payment_type") private Integer paymentType; @@ -43,9 +43,11 @@ @TableField("pay_amount") private BigDecimal payAmount; - @ApiModelProperty(value = "支付商户订单号") + @ApiModelProperty(value = "第三方支付订单号") @TableField("pay_order_no") private String payOrderNo; - + @ApiModelProperty(value = "支付状态 1=待支付 2=已完成 3=已取消") + @TableField("payment_status") + private Integer paymentStatus; } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java new file mode 100644 index 0000000..2066116 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/vo/ClientPlaceOrderVO.java @@ -0,0 +1,31 @@ +package com.xinquan.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/9 + */ +@Data +@ApiModel("下单返回数据视图对象") +public class ClientPlaceOrderVO implements Serializable { + + private static final long serialVersionUID = -7087327695114447889L; + @ApiModelProperty("订单id") + private Long id; + + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "金额为零无需支付 1是 2否") + private Integer zeroFlag; + + @ApiModelProperty("支付宝支付链接") + private String qrcodeUrl; + + @ApiModelProperty("微信支付信息,用于唤起微信支付") + private String payInfo; +} diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/mapper/OrderMapper.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/mapper/OrderMapper.java index 2941985..0b21910 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/mapper/OrderMapper.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/mapper/OrderMapper.java @@ -1,7 +1,7 @@ package com.xinquan.order.mapper; -import com.xinquan.order.domain.Order; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.order.api.domain.Order; /** * <p> diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java index 3bf1cb3..9105409 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/OrderService.java @@ -1,7 +1,9 @@ package com.xinquan.order.service; -import com.xinquan.order.domain.Order; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.domain.vo.ClientPlaceOrderVO; +import java.util.List; /** * <p> @@ -13,4 +15,26 @@ */ public interface OrderService extends IService<Order> { + /** + * 创建待支付订单 + * + * @param targetId 目标id + * @param orderFrom 订单来源 1=冥想音频 2=课程 + * @param receiverId 被赠送课程APP用户id + * @param balanceFlag 是否使用余额抵扣 1=是 2=否 + * @param payType 支付方式 1=微信 2=支付宝 + * @return 下单返回数据视图对象 + * @see com.xinquan.order.domain.vo.ClientPlaceOrderVO + */ + ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, + Integer balanceFlag, Integer payType) throws Exception; + + /** + * 根据类型获取已完成的订单列表 + * + * @param userId 用户id + * @param orderFrom 订单来源 + * @return + */ + List<Order> getOrderListByType(Long userId, Integer orderFrom); } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java index 2877c44..0fa0063 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java @@ -1,10 +1,37 @@ package com.xinquan.order.service.impl; -import com.xinquan.order.domain.Order; -import com.xinquan.order.mapper.OrderMapper; -import com.xinquan.order.service.OrderService; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.constant.Constants; +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.enums.ChargeTypeEnum; +import com.xinquan.common.core.enums.DisabledEnum; +import com.xinquan.common.core.enums.PaymentStatusEnum; +import com.xinquan.common.core.enums.PaymentTypeEnum; +import com.xinquan.common.core.exception.ServiceException; +import com.xinquan.common.core.utils.ip.IpUtils; +import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.course.api.domain.Course; +import com.xinquan.course.api.feign.RemoteCourseService; +import com.xinquan.meditation.api.domain.Meditation; +import com.xinquan.meditation.api.feign.RemoteMeditationService; +import com.xinquan.order.api.domain.Order; +import com.xinquan.order.domain.OrderPaymentRecord; +import com.xinquan.order.domain.vo.ClientPlaceOrderVO; +import com.xinquan.order.mapper.OrderMapper; +import com.xinquan.order.service.OrderPaymentRecordService; +import com.xinquan.order.service.OrderService; +import com.xinquan.order.utils.JuHeFuUtil; +import com.xinquan.order.utils.OrderUtil; +import com.xinquan.user.api.domain.AppUser; +import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.api.feign.RemoteAppUserService; +import java.math.BigDecimal; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -15,6 +42,206 @@ * @since 2024-08-21 */ @Service +@RequiredArgsConstructor public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService { + private final RemoteMeditationService remoteMeditationService; + private final RemoteCourseService remoteCourseService; + private final RemoteAppUserService remoteAppUserService; + private final OrderPaymentRecordService orderPaymentRecordService; + + /** + * 创建待支付订单 + * + * @param targetId 目标id + * @param orderFrom 订单来源 1=冥想音频 2=课程 + * @param receiverId 被赠送课程APP用户id + * @param balanceFlag 是否使用余额抵扣 1=是 2=否 + * @param payType 支付方式 1=微信 2=支付宝 + * @return 下单返回数据视图对象 + * @see com.xinquan.order.domain.vo.ClientPlaceOrderVO + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, + Integer balanceFlag, Integer payType) throws Exception { + // 获取当前登录用户id + Long userId = SecurityUtils.getUserId(); + // 获取用户信息 + AppUser appUser = getAppUserById(userId); + ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO(); + Order order = new Order(); + // 购买冥想音频 + if (orderFrom == 1) { + Meditation meditation = remoteMeditationService.getMeditationById(targetId, + SecurityConstants.INNER).getData(); + String meditationTitle = meditation.getMeditationTitle(); + String detailDescription = meditation.getDetailDescription(); + String wxOpenId = appUser.getWxOpenId(); + // 创建订单 + String orderNo = OrderUtil.getOrderNoForPrefix("MX"); + order.setOrderFrom(orderFrom); + order.setBizOrderNo(orderNo); + order.setBusinessId(meditation.getId()); + order.setAppUserId(userId); + order.setTotalAmount(meditation.getGeneralPrice()); + this.save(order); + Long orderId = order.getId(); + clientPlaceOrderVO.setOrderNo(orderNo); + clientPlaceOrderVO.setId(orderId); + // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣 + if (balanceFlag.equals(1) && meditation.getChargeType() + .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { + BigDecimal needPayAmount = handleBalancePayment(appUser, + meditation.getGeneralPrice(), + orderId); + + if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { + clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); + return clientPlaceOrderVO; + } + // 创建支付订单 + createPayment(payType, orderNo, needPayAmount, meditationTitle, detailDescription, + wxOpenId, orderId, clientPlaceOrderVO); + } else { + // 创建支付订单 + createPayment(payType, orderNo, meditation.getGeneralPrice(), meditationTitle, + detailDescription, wxOpenId, orderId, clientPlaceOrderVO); + } + } else { + // 购买课程 + Course course = remoteCourseService.getCourseById(targetId, + SecurityConstants.INNER).getData(); + String courseTitle = course.getCourseTitle(); + String wxOpenId = appUser.getWxOpenId(); + String description = course.getDescription(); + + // 创建订单 + String orderNo = OrderUtil.getOrderNoForPrefix("KC"); + order.setOrderFrom(orderFrom); + order.setBizOrderNo(orderNo); + order.setBusinessId(course.getId()); + order.setAppUserId(userId); + order.setTotalAmount(course.getGeneralPrice()); + this.save(order); + Long orderId = order.getId(); + clientPlaceOrderVO.setOrderNo(orderNo); + clientPlaceOrderVO.setId(orderId); + + if (balanceFlag.equals(1) && course.getChargeType() + .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { + BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(), + orderId); + + if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { + clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); + return clientPlaceOrderVO; + } + // 创建支付订单 + createPayment(payType, orderNo, needPayAmount, courseTitle, description, + wxOpenId, orderId, clientPlaceOrderVO); + } else { + // 创建支付订单 + createPayment(payType, orderNo, course.getGeneralPrice(), courseTitle, + description, wxOpenId, orderId, clientPlaceOrderVO); + } + } + return clientPlaceOrderVO; + } + + /** + * 处理余额抵扣 + * + * @param appUser app用户 + * @param generalPrice 通用价格 + * @param orderId 订单号 + * @return 需要支付的金额 + */ + @NotNull + private BigDecimal handleBalancePayment(AppUser appUser, BigDecimal generalPrice, + Long orderId) { + if (appUser.getBalance().compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("用户可用余额不足,请重新选择支付方案"); + } + // 更新用户余额 + remoteAppUserService.updateAppUser( + AppUserDTO.builder().balance( + appUser.getBalance().subtract(generalPrice)) + .build(), SecurityConstants.INNER); + + OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord(); + balancePaymentRecord.setOrderId(orderId); + balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode()); + balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode()); + orderPaymentRecordService.save(balancePaymentRecord); + + // 计算除去余额还需支付的金额 + return generalPrice + .subtract(appUser.getBalance()); + } + + /** + * 获取登录用户信息 + * + * @param userId APP用户id + * @return AppUser + */ + private AppUser getAppUserById(Long userId) { + return remoteAppUserService.getUserByCondition( + AppUserDTO.builder().id(userId).build(), + SecurityConstants.INNER).getData(); + } + + /** + * 创建支付订单 + * + * @param payType 支付方式 1=微信 2=支付宝 + * @param orderNo 订单编号 + * @param needPayAmount 支付金额 + * @param goodsTitle 商品标题 + * @param goodsDesc 商品描述 + * @param wxOpenId 微信openId + * @param orderId 订单id + * @param clientPlaceOrderVO 下单返回数据视图对象 + * @throws Exception + */ + private void createPayment(Integer payType, String orderNo, BigDecimal needPayAmount, + String goodsTitle, String goodsDesc, String wxOpenId, Long orderId, + ClientPlaceOrderVO clientPlaceOrderVO) throws Exception { + // 截取前42个字符 商品描述信息,微信小程序和微信公众号该字段,最大长度 42 个字符 + goodsDesc = goodsDesc.substring(0, 42); + // 调用第三方支付获取支付信息 + JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType, + needPayAmount.toString(), goodsTitle, goodsDesc, + IpUtils.getIpAddr(), wxOpenId, Constants.PAYMENT_NOTIFY_URL); + // 第三方支付记录 + OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); + paymentRecord.setOrderId(orderId); + + if (payType == 1) { + clientPlaceOrderVO.setPayInfo(payInfo.getString("pay_info")); + paymentRecord.setPaymentType(PaymentTypeEnum.WECHAT_PAY.getCode()); + } else { + clientPlaceOrderVO.setQrcodeUrl(payInfo.getString("qrcode_url")); + paymentRecord.setPaymentType(PaymentTypeEnum.ALI_PAY.getCode()); + } + + paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); + orderPaymentRecordService.save(paymentRecord); + // 设置订单是否需要支付标识 + clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode()); + } + + /** + * 根据类型获取已完成的订单列表 + * + * @param userId 用户id + * @param orderFrom 订单来源 + * @return + */ + @Override + public List<Order> getOrderListByType(Long userId, Integer orderFrom) { + return this.lambdaQuery().eq(Order::getAppUserId, userId).eq(Order::getOrderFrom, orderFrom) + .eq(Order::getPaymentStatus, PaymentStatusEnum.COMPLETED.getCode()).list(); + } } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java index cf84f25..7761b0b 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java @@ -106,7 +106,7 @@ * @return JSONObject * @throws Exception */ - public JSONObject createPayment(String orderNo, Integer payChannel, String payAmt, + public static JSONObject createPayment(String orderNo, Integer payChannel, String payAmt, String goodsTitle, String goodsDesc, String deviceIp, String openId, String notifyUrl) throws Exception { JSONObject data = new JSONObject(); @@ -153,7 +153,7 @@ * @param orderNo 订单号 * @return */ - public boolean refund(String paymentId, String orderNo) throws Exception { + public static boolean refund(String paymentId, String orderNo) throws Exception { JSONObject data = new JSONObject(); data.put("payment_id", paymentId); data.put("order_no", orderNo); @@ -185,7 +185,7 @@ * @return * @throws Exception */ - public boolean merchantPay(String orderNo, String payAmt, String cardName, String cardId, + public static boolean merchantPay(String orderNo, String payAmt, String cardName, String cardId, String cardType) throws Exception { JSONObject data = new JSONObject(); diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/OrderUtil.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/OrderUtil.java new file mode 100644 index 0000000..6b06f59 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/OrderUtil.java @@ -0,0 +1,54 @@ +package com.xinquan.order.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 订单处理工具类 + */ +public class OrderUtil { + + /* 订单号 */ + private static long orderNum = 0l; + + /* 日期 */ + private static String date; + + /** + * 生成不重复的订单号 【纯数字】 + * + * @return + */ + public static synchronized String getOrderNo() { + String str = new SimpleDateFormat("yyMMddHHmm").format(new Date()); + if (date == null || !date.equals(str)) { + date = str; + orderNum = 0l; + } + orderNum++; + long orderNo = Long.parseLong((date)) * 10000; + orderNo += orderNum; + return orderNo + ""; + } + + /** + * 生成不重复的订单号 【含前缀】 + * + * @param prefix + * @return + */ + public static synchronized String getOrderNoForPrefix(String prefix) { + return prefix + getOrderNo(); + } + + /** + * 生成不重复的订单号 【含后缀】 + * + * @param suffix + * @return + */ + public static synchronized String getOrderNoForSuffix(String suffix) { + return getOrderNo() + suffix; + } + +} diff --git a/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml index 494ee60..233f06c 100644 --- a/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml +++ b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml @@ -3,7 +3,7 @@ <mapper namespace="com.xinquan.order.mapper.OrderMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.order.domain.Order"> + <resultMap id="BaseResultMap" type="com.xinquan.order.api.domain.Order"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> diff --git a/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml index bf686e2..18448ee 100644 --- a/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml +++ b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml @@ -14,6 +14,7 @@ <result column="payment_type" property="paymentType" /> <result column="pay_amount" property="payAmount" /> <result column="pay_order_no" property="payOrderNo" /> + <result column="payment_status" property="paymentStatus"/> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +24,7 @@ create_time, update_by, update_time, - id, order_id, payment_type, pay_amount, pay_order_no + id, order_id, payment_type, pay_amount, pay_order_no,payment_status </sql> </mapper> diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientNoticeRecordController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientNoticeRecordController.java new file mode 100644 index 0000000..af8d2b3 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientNoticeRecordController.java @@ -0,0 +1,20 @@ +package com.xinquan.user.controller.client; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 前端控制器 + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +@RestController +@RequestMapping("/client/user/notice-record") +public class ClientNoticeRecordController { + +} + diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerNoticeRecordController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerNoticeRecordController.java new file mode 100644 index 0000000..1b9bf9c --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerNoticeRecordController.java @@ -0,0 +1,20 @@ +package com.xinquan.user.controller.inner; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 前端控制器 + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +@RestController +@RequestMapping("/inner/user/notice-record") +public class InnerNoticeRecordController { + +} + diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java new file mode 100644 index 0000000..da4fad4 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java @@ -0,0 +1,58 @@ +package com.xinquan.user.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.xinquan.common.core.web.domain.BaseModel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_notice_record") +@ApiModel(value = "NoticeRecord对象", description = "") +public class NoticeRecord extends BaseModel { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty(value = "APP用户id") + @TableField("app_user_id") + private Long appUserId; + + @ApiModelProperty(value = "冥想提问id 类型为回复通知时使用") + @TableField("meditation_question_id") + private Long meditationQuestionId; + + @ApiModelProperty(value = "查看状态 1:未读 2:已读 ") + @TableField("read_status") + private Integer readStatus; + + @ApiModelProperty(value = "通知类型 1=系统通知 2=回复通知") + @TableField("notice_type") + private Integer noticeType; + + @ApiModelProperty(value = "通知标题") + @TableField("title") + private String title; + + @ApiModelProperty(value = "通知内容") + @TableField("content") + private String content; + + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java new file mode 100644 index 0000000..b117dbb --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java @@ -0,0 +1,16 @@ +package com.xinquan.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.user.domain.NoticeRecord; + +/** + * <p> + * Mapper 接口 + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +public interface NoticeRecordMapper extends BaseMapper<NoticeRecord> { + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java new file mode 100644 index 0000000..bfceea7 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java @@ -0,0 +1,16 @@ +package com.xinquan.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.user.domain.NoticeRecord; + +/** + * <p> + * 服务类 + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +public interface NoticeRecordService extends IService<NoticeRecord> { + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java new file mode 100644 index 0000000..f5d057c --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java @@ -0,0 +1,21 @@ +package com.xinquan.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.user.domain.NoticeRecord; +import com.xinquan.user.mapper.NoticeRecordMapper; +import com.xinquan.user.service.NoticeRecordService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 服务实现类 + * </p> + * + * @author mitao + * @since 2024-09-09 + */ +@Service +public class NoticeRecordServiceImpl extends + ServiceImpl<NoticeRecordMapper, NoticeRecord> implements NoticeRecordService { + +} diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml new file mode 100644 index 0000000..ffd9777 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.user.mapper.NoticeRecordMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.user.domain.NoticeRecord"> + <id column="id" property="id" /> + <result column="del_flag" property="delFlag" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="app_user_id" property="appUserId" /> + <result column="meditation_question_id" property="meditationQuestionId" /> + <result column="read_status" property="readStatus" /> + <result column="notice_type" property="noticeType" /> + <result column="title" property="title" /> + <result column="content" property="content" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + del_flag, + create_by, + create_time, + update_by, + update_time, + id, app_user_id, meditation_question_id, read_status, notice_type, title, content + </sql> + +</mapper> diff --git a/xinquan-ui/src/assets/icons/svgo.yml b/xinquan-ui/src/assets/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/xinquan-ui/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/xinquan-visual/xinquan-monitor/src/main/resources/bootstrap.yml b/xinquan-visual/xinquan-monitor/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..20efd83 --- /dev/null +++ b/xinquan-visual/xinquan-monitor/src/main/resources/bootstrap.yml @@ -0,0 +1,25 @@ +# Tomcat +server: + port: 9100 + +# Spring +spring: + application: + # 应用名称 + name: xinquan-monitor + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 127.0.0.1:8848 + config: + # 配置中心地址 + server-addr: 127.0.0.1:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} -- Gitblit v1.7.1