From 0befca3e70b575c420e7a14fa113aeb74b8fbef8 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 27 十一月 2024 09:05:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java       |    5 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderVO.java                                  |   34 +++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java          |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java                            |   61 +++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java                             |   32 ++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java                |    2 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java                           |   14 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java    |   15 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java                      |   10 
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java     |   34 +++
 ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java                                                 |    4 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java                  |   57 ++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java                        |   10 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java               |   18 +
 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java  |  142 ++++++++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java                    |   23 ++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java          |   47 ++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java             |   10 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java                          |   31 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java                   |   18 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java |   39 +++
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java              |    2 
 ruoyi-common/ruoyi-common-redis/pom.xml                                                                  |    6 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java                             |   14 
 24 files changed, 580 insertions(+), 49 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java b/ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java
index 1c171b2..fba67dd 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java
@@ -84,6 +84,10 @@
     @TableField("express_json")
     private String expressJson;
 
+    @ApiModelProperty(value = "收货地址信息")
+    @TableField("address_json")
+    private String addressJson;
+
     @ApiModelProperty(value = "平台分佣")
     @TableField("share_amount")
     private BigDecimal shareAmount;
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java
index 0fe1a4a..6d91ea3 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java
@@ -38,7 +38,7 @@
 
     @ApiModelProperty(value = "技师id")
     @TableField("technician_id")
-    private Integer technicianId;
+    private Long technicianId;
 
     @ApiModelProperty(value = "预约时间")
     @TableField("subscribe_time")
diff --git a/ruoyi-common/ruoyi-common-redis/pom.xml b/ruoyi-common/ruoyi-common-redis/pom.xml
index 97c986b..46d20b4 100644
--- a/ruoyi-common/ruoyi-common-redis/pom.xml
+++ b/ruoyi-common/ruoyi-common-redis/pom.xml
@@ -22,6 +22,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.10.1</version>
+        </dependency>
         
         <!-- RuoYi Common Core-->
         <dependency>
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java
new file mode 100644
index 0000000..93a38a7
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java
@@ -0,0 +1,34 @@
+package com.ruoyi.common.redis.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Descreption: 分布式锁注解
+ * @Author: luofl
+ * @Date: 2024/11/26 16:43
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DistributedLock {
+
+    /**
+     * 锁名字(没有EL解析)
+     */
+    String lockName() default "";
+
+    /**
+     * 锁前缀(有EL解析)
+     */
+    String lockNamePre() default "";
+
+    /**
+     * 锁后缀(有EL解析)
+     */
+    String lockNamePost() default "";
+
+    /**
+     * 锁前后缀拼接分隔符
+     */
+    String separator() default "_";
+}
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java
new file mode 100644
index 0000000..fa06f8c
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java
@@ -0,0 +1,142 @@
+package com.ruoyi.common.redis.aspectj;
+
+import com.ruoyi.common.redis.annotation.DistributedLock;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+/**
+ * @Description 分布式锁切面
+ * 注意!!!分布式锁不能加在事务方法当中:因为当锁释放,事务还没有提交
+ * @Author luofl
+ * @Date 2024/11/26 16:42
+ */
+@Aspect
+@Component
+@Slf4j
+public class DistributedLockAspect {
+    @Resource
+    private RedissonClient redissonClient;
+
+    /**
+     * @Descreption: 定义切面:以注解为切面
+     * @Author: luofl
+     * @Date: 2024/11/26 16:44
+     */
+    @Pointcut("@annotation(com.ruoyi.common.redis.annotation.DistributedLock)")
+    public void distributedLockAspect() {
+    }
+
+    @Around(value = "distributedLockAspect()")
+    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
+
+        //切点所在的类
+        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
+        Method method = methodSignature.getMethod();
+        //
+        DistributedLock annotation = method.getAnnotation(DistributedLock.class);
+        String lockName = getLockName(annotation, pjp.getArgs(), method);
+        //log.info("lockName:"+lockName);
+        RLock lock = redissonClient.getLock(lockName);
+        lock.lock();
+        try {
+            return pjp.proceed();
+        } finally {
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                //释放锁
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * @Descreption: 获取锁名字,优先获取注解中锁名
+     * @Author: luofl
+     * @Date: 2024/11/26 16:45
+     */
+    private String getLockName(DistributedLock distributedLock, Object[] args, Method method) {
+        //优先获取注解名称
+        if (StringUtils.isNotBlank(distributedLock.lockName())) {
+            return distributedLock.lockName();
+        }
+        //根据参数匹配有参数就使用动态参数,没有就使用定义参数
+        String lockNamePre = distributedLock.lockNamePre();
+        String lockNamePost = distributedLock.lockNamePost();
+        String separator = distributedLock.separator();
+
+        String preExpression = parseExpression(lockNamePre, method, args);
+        String postExpression = parseExpression(lockNamePost, method, args);
+        StringBuilder sb = new StringBuilder();
+        if (StringUtils.isNotBlank(preExpression)) {
+            sb.append(preExpression);
+        } else {
+            sb.append(lockNamePre);
+        }
+        sb.append(separator);
+        if (StringUtils.isNotBlank(postExpression)) {
+            sb.append(postExpression);
+        } else {
+            sb.append(lockNamePost);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * el表达式解析
+     *
+     * @param expressionString 解析值
+     * @param method           方法
+     * @param args             参数
+     */
+    private String parseExpression(String expressionString, Method method, Object[] args) {
+        //获取被拦截方法参数名列表
+        LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
+        String[] paramNameArr = discoverer.getParameterNames(method);
+        //SPEL解析
+        ExpressionParser parser = new SpelExpressionParser();
+        StandardEvaluationContext context = new StandardEvaluationContext();
+        for (int i = 0; i < Objects.requireNonNull(paramNameArr).length; i++) {
+            context.setVariable(paramNameArr[i], args[i]);
+        }
+        return parser.parseExpression(expressionString).getValue(context, String.class);
+    }
+
+    //    ==========================示例=============================
+
+    //固定静态参数锁:product_lock
+    @DistributedLock(lockName = "product_lock")
+    @GetMapping(value = "/test1")
+    public void test1() {
+        System.out.println("执行事务");
+    }
+
+    //未匹配到参数,因此仍然是静态参数锁:#param1_#param2
+    @DistributedLock(lockNamePre = "#param1", lockNamePost = "#param2")
+    @GetMapping(value = "/test2")
+    public void test2() {
+        System.out.println("执行事务");
+    }
+
+    //匹配到参数,动态参数锁:hello_world
+    @DistributedLock(lockNamePre = "#order", lockNamePost = "#param2")
+    @GetMapping(value = "/test3")
+    public void test3(String param1, String param2) {
+        System.out.println("执行事务");
+    }
+}
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
index 50fec32..4152c2c 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -1,9 +1,23 @@
 package com.ruoyi.account.controller;
 
 
+import com.ruoyi.account.service.UserPointService;
+import com.ruoyi.account.vo.UserPointDetailVO;
+import com.ruoyi.account.vo.UserPointVO;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -16,10 +30,39 @@
 @RestController
 @RequestMapping("/user-point")
 @Api("用户积分")
-public class UserPointController {
+public class UserPointController extends BaseController {
+    @Resource
+    private UserPointService userPointService;
+
 
     /**
-     * 积分
+     * 获取个人积分
      */
+    @GetMapping("/getUserPoint")
+    @ApiOperation("获取个人积分")
+    public R<UserPointVO> getUserPoint(){
+        return R.ok(userPointService.getUserPoint(SecurityUtils.getUserId()));
+    }
+
+    /**
+     * 获取变更明细
+     */
+    @GetMapping("/getUserPointDetail")
+    @ApiOperation("获取变更明细")
+    public R<UserPointDetailVO> getUserPointDetail(@ApiParam("指定日期") LocalDateTime date,
+                                                   @ApiParam("变动类型(1=消费积分,2=返佣积分,3=拉新人积分,4=兑换商品 " +
+                                                           "5 = 门店业绩积分 6 =门店返佣积分7=技师业绩积分8 =转赠积分 9 =做工积分 " +
+                                                           "10 =注册积分)") Integer type){
+        return R.ok();
+    }
+
+    /**
+     * 转赠积分
+     */
+    @PostMapping("/transferPoint")
+    @ApiOperation("转赠积分")
+    public R<Void> transferPoint(@ApiParam("积分") BigDecimal point, @ApiParam("手机号") Long phone){
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java
index e6c1e7f..5cc846e 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.account.api.model.BalanceChangeRecord;
 import com.ruoyi.account.service.BalanceChangeRecordService;
 import com.ruoyi.account.vo.WalletVO;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.security.utils.SecurityUtils;
@@ -14,6 +15,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @Api("钱包")
 @RestController
@@ -27,11 +29,11 @@
      */
     @GetMapping("detail")
     @ApiOperation(value = "钱包详情", notes = "钱包详情", tags = {"小程序-个人中心-我的钱包-钱包详情"})
-    public AjaxResult detail() {
+    public R<WalletVO> detail() {
         Long userId = SecurityUtils.getUserId();
         // TODO 查询钱包详情
         WalletVO walletVO = new WalletVO();
-        return AjaxResult.success(walletVO);
+        return R.ok(walletVO);
     }
 
     /**
@@ -39,9 +41,9 @@
      */
     @ApiOperation(value = "变更明细", notes = "变更明细", tags = {"小程序-个人中心-我的钱包-变更记录"})
     @GetMapping("change")
-    public AjaxResult change() {
+    public R<List<BalanceChangeRecord>> change() {
         Long userId = SecurityUtils.getUserId();
-        return AjaxResult.success(balanceChangeRecordService.list(new LambdaQueryWrapper<BalanceChangeRecord>()
+        return R.ok(balanceChangeRecordService.list(new LambdaQueryWrapper<BalanceChangeRecord>()
                 .eq(BalanceChangeRecord::getAppUserId, userId)));
     }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
index a77887d..1e104a9 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.account.api.model.UserPoint;
+import com.ruoyi.account.vo.UserPointVO;
 
 /**
  * <p>
@@ -13,4 +14,5 @@
  */
 public interface UserPointService extends IService<UserPoint> {
 
+    UserPointVO getUserPoint(Long userId);
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
index 0b4a3fb..0b091af 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -4,6 +4,7 @@
 import com.ruoyi.account.mapper.UserPointMapper;
 import com.ruoyi.account.api.model.UserPoint;
 import com.ruoyi.account.service.UserPointService;
+import com.ruoyi.account.vo.UserPointVO;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +18,8 @@
 @Service
 public class UserPointServiceImpl extends ServiceImpl<UserPointMapper, UserPoint> implements UserPointService {
 
+    @Override
+    public UserPointVO getUserPoint(Long userId) {
+        return null;
+    }
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java
new file mode 100644
index 0000000..92dc03c
--- /dev/null
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java
@@ -0,0 +1,23 @@
+package com.ruoyi.account.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value="UserPointDetail对象", description="")
+public class UserPointDetailVO {
+
+    @ApiModelProperty(value = "变动类型(1=消费积分,2=返佣积分,3=拉新人积分,4=兑换商品 5 = 门店业绩积分 6 =门店返佣积分7=技师业绩积分8 =转赠积分 9 =做工积分 10 =注册积分)")
+    private Integer type;
+
+    @ApiModelProperty(value = "变动金额")
+    private BigDecimal variablePoint;
+
+    @ApiModelProperty(value = "变动时间")
+    private LocalDateTime createTime;
+}
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java
new file mode 100644
index 0000000..d81b7c9
--- /dev/null
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java
@@ -0,0 +1,31 @@
+package com.ruoyi.account.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value="UserPoint对象", description="")
+public class UserPointVO {
+
+    @ApiModelProperty(value = "总积分")
+    private Integer totalPoint;
+
+    @ApiModelProperty(value = "消费积分数")
+    private BigDecimal shopPoint;
+
+    @ApiModelProperty(value = "返佣积分数")
+    private BigDecimal sharePoint;
+
+    @ApiModelProperty(value = "拉新积分")
+    private BigDecimal pullNewPoint;
+
+    @ApiModelProperty(value = "门店业绩积分")
+    private BigDecimal shopAchievementPoint;
+
+    @ApiModelProperty(value = "门店返佣积分")
+    private BigDecimal shopSharePoint;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
index e913905..b943e89 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -1,8 +1,10 @@
 package com.ruoyi.order.controller;
 
 
-import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.order.service.OrderService;
+import com.ruoyi.order.vo.OrderDetailVO;
+import com.ruoyi.order.vo.OrderVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -13,6 +15,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -31,6 +34,30 @@
 
 
     /**
+     * 我的订单列表
+     */
+    @ApiOperation(value = "我的订单列表", tags = {"小程序-个人中心-我的订单"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单状态", name = "status", required = true, dataType = "int"),
+    })
+    @GetMapping("/list/{status}")
+    public R<List<OrderVO>> list(@PathVariable("status") Integer status){
+        return R.ok(orderService.getOrderList(status));
+    }
+
+    /**
+     * 订单详情
+     */
+    @ApiOperation(value = "订单详情", tags = {"小程序-订单详情"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
+    })
+    @GetMapping("/detail/{orderId}")
+    public R<OrderDetailVO> detail(@PathVariable("orderId") Long orderId){
+        return R.ok(orderService.getOrderDetail(orderId));
+    }
+
+    /**
      * 扫码校验
      */
     @ApiOperation(value = "扫码校验", tags = {"小程序-个人中心-门店管理-扫码核销校验"})
@@ -38,21 +65,35 @@
             @ApiImplicitParam(value = "分享id", name = "shareId", required = true, dataType = "int"),
     })
     @GetMapping("/check/{orderId}/{shopId}")
-    public AjaxResult check(@PathVariable("orderId") Integer orderId, @PathVariable("shopId") Integer shopId){
-        return AjaxResult.ok(orderService.check(orderId, shopId));
+    public R<Boolean> check(@PathVariable("orderId") Long orderId, @PathVariable("shopId") Long shopId){
+        return R.ok(orderService.check(orderId, shopId));
     }
 
     /**
-     * 订单详情
+     * 订单核销
      */
-    @ApiOperation(value = "订单详情", tags = {"订单详情"})
+    @ApiOperation(value = "订单核销", tags = {"小程序-个人中心-门店管理-扫码核销"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "核销码", name = "code", required = true, dataType = "String"),
+    })
+    @GetMapping("/writeOff/{code}")
+    public R<Void> writeOff(@PathVariable("code") String code){
+        return R.ok();
+    }
+
+    /**
+     * 取消订单
+     */
+    @ApiOperation(value = "取消订单", tags = {"小程序-个人中心-我的订单-取消订单"})
     @ApiImplicitParams({
             @ApiImplicitParam(value = "订单id", name = "orderId", required = true, dataType = "int"),
     })
-    @GetMapping("/detail/{orderId}")
-    public AjaxResult detail(@PathVariable("orderId") Integer orderId){
-        return AjaxResult.success(orderService.getById(orderId));
+    @GetMapping("/cancel/{orderId}")
+    public R<Void> cancel(@PathVariable("orderId") Long orderId){
+        return R.ok();
     }
 
+
+
 }
 
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
index 541715a..0961a26 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
@@ -1,7 +1,11 @@
 package com.ruoyi.order.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.order.vo.OrderDetailVO;
+import com.ruoyi.order.vo.OrderVO;
 import model.Order;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +16,9 @@
  * @since 2024-11-21
  */
 public interface OrderService extends IService<Order> {
-    boolean check(Integer orderId, Integer shopId);
+    List<OrderVO> getOrderList(Integer status);
+
+    OrderDetailVO getOrderDetail(Long orderId);
+
+    boolean check(Long orderId, Long shopId);
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
index a969b93..8b83866 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -3,8 +3,13 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.order.mapper.OrderMapper;
 import com.ruoyi.order.service.OrderService;
+import com.ruoyi.order.vo.OrderDetailVO;
+import com.ruoyi.order.vo.OrderVO;
 import model.Order;
 import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
 
 /**
  * <p>
@@ -18,7 +23,18 @@
 public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
 
     @Override
-    public boolean check(Integer orderId, Integer shopId) {
+    public List<OrderVO> getOrderList(Integer status) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public OrderDetailVO getOrderDetail(Long orderId) {
+        return null;
+    }
+
+    @Override
+    public boolean check(Long orderId, Long shopId) {
+        // TODO 待实现
         return false;
     }
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java
new file mode 100644
index 0000000..eef904e
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java
@@ -0,0 +1,61 @@
+package com.ruoyi.order.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "订单明细")
+public class OrderDetailVO {
+    @ApiModelProperty(value = "订单id")
+    private Long id;
+
+    @ApiModelProperty(value = "订单商品")
+    private List<OrderGoodsVO> goodsList;
+
+    @ApiModelProperty(value = "使用积分")
+    private BigDecimal point;
+
+    @ApiModelProperty(value = "收货地址id")
+    private Long addressId;
+
+    @ApiModelProperty(value = "收货联系人")
+    private String recieveName;
+
+    @ApiModelProperty(value = "收货联系电话")
+    private String recievePhone;
+
+    @ApiModelProperty(value = "收货地址")
+    private String recieveAddress;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNumber;
+
+    @ApiModelProperty("下单时间")
+    private String createTime;
+
+    @ApiModelProperty(value = "订单总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "参与活动名称")
+    private String activityName;
+
+    @ApiModelProperty(value = "抵扣金额")
+    private BigDecimal couponAmount;
+
+    @ApiModelProperty(value = "快递费")
+    private BigDecimal expressAmount;
+
+    @ApiModelProperty(value = "可获得积分")
+    private BigDecimal pointAmount;
+
+    @ApiModelProperty(value = "实际支付价格")
+    private BigDecimal paymentAmount;
+
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java
new file mode 100644
index 0000000..e19f665
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java
@@ -0,0 +1,32 @@
+package com.ruoyi.order.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "订单商品")
+public class OrderGoodsVO {
+    @ApiModelProperty(value = "商品id")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)")
+    private Integer type;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "商品图片")
+    private String goodsPic;
+
+    @ApiModelProperty(value = "基础售价")
+    private BigDecimal sellingPrice;
+
+    @ApiModelProperty(value = "划线价")
+    private BigDecimal originalPrice;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderVO.java
new file mode 100644
index 0000000..796f3d8
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderVO.java
@@ -0,0 +1,34 @@
+package com.ruoyi.order.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class OrderVO {
+    @ApiModelProperty(value = "订单id")
+    private Long id;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成待评论5已取消6已退款7售后中8已完成已评论")
+    private Integer orderStatus;
+
+    @ApiModelProperty(value = "商品图片")
+    private List<String> goodsPics;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "使用积分")
+    private BigDecimal point;
+
+    @ApiModelProperty(value = "实际支付价格")
+    private BigDecimal paymentAmount;
+
+    @ApiModelProperty(value = "商品数量")
+    private Integer num;
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java
index 6aa2f8b..b072ab6 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java
@@ -12,10 +12,7 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-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;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -49,6 +46,16 @@
     }
 
     /**
+     * 预约技师
+     */
+    @PostMapping("/subscribe")
+    @ApiOperation(value = "预约技师", notes = "预约技师", tags = {"小程序-个人中心-门店管理-预约列表-预约技师"})
+    public R<Void> subscribe(@RequestBody TechnicianSubscribe technicianSubscribe){
+        technicianSubscribeService.subscribe(technicianSubscribe);
+        return R.ok();
+    }
+
+    /**
      * 取消服务
      */
     @GetMapping("/cancel")
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
index c17d2e1..1a6702b 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java
@@ -1,22 +1,18 @@
 package com.ruoyi.other.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum GoodsStatus {
     DOWN(0, "下架"),
     UP(1, "上架");
 
-    private Integer code;
-    private String desc;
+    private final Integer code;
+    private final String desc;
 
     GoodsStatus(Integer code, String desc) {
         this.code = code;
         this.desc = desc;
     }
 
-    public Integer getCode() {
-        return code;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
index 830d7dd..7fe4fd8 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java
@@ -1,22 +1,18 @@
 package com.ruoyi.other.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum PhoneType {
     PLATFORM(1, "平台"),
     SHOP(2, "门店");
 
-    private Integer code;
-    private String desc;
+    private final Integer code;
+    private final String desc;
 
     PhoneType(Integer code, String desc) {
         this.code = code;
         this.desc = desc;
     }
 
-    public Integer getCode() {
-        return code;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
index 16a5617..1f0ce88 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java
@@ -1,5 +1,8 @@
 package com.ruoyi.other.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum ShareAuditStatus {
     WAIT(0, "待审核"),
     SUCCESS(1, "审核通过"),
@@ -13,11 +16,4 @@
         this.message = message;
     }
 
-    public Integer getCode() {
-        return code;
-    }
-
-    public String getMessage() {
-        return message;
-    }
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java
new file mode 100644
index 0000000..50ab4e6
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java
@@ -0,0 +1,18 @@
+package com.ruoyi.other.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum TechnicianErrorCode {
+    TECHNICIAN_ALREADY_SUBSCRIBED(1001, "该技师已被预约"),
+    ;
+
+    private final int code;
+    private final String message;
+
+    TechnicianErrorCode(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
index 2bbdf42..f2e2555 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
@@ -21,4 +21,5 @@
      */
     List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long userId, Long shopId);
 
+    void subscribe(TechnicianSubscribe technicianSubscribe);
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
index a1e6e7f..e1434cb 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
@@ -1,19 +1,26 @@
 package com.ruoyi.other.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.other.mapper.TechnicianSubscribeMapper;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.other.api.domain.Technician;
 import com.ruoyi.other.api.domain.TechnicianSubscribe;
+import com.ruoyi.other.enums.TechnicianErrorCode;
+import com.ruoyi.other.mapper.TechnicianMapper;
+import com.ruoyi.other.mapper.TechnicianSubscribeMapper;
 import com.ruoyi.other.service.TechnicianSubscribeService;
 import com.ruoyi.other.vo.TechnicianSubscribeVO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Collections;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author luodangjia
@@ -23,9 +30,35 @@
 public class TechnicianSubscribeServiceImpl extends ServiceImpl<TechnicianSubscribeMapper, TechnicianSubscribe> implements TechnicianSubscribeService {
     @Resource
     private TechnicianSubscribeMapper technicianSubscribeMapper;
+    @Resource
+    private TechnicianMapper technicianMapper;
 
     @Override
     public List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long userId, Long shopId) {
         return technicianSubscribeMapper.getTechnicianSubscribeByUserAndShop(userId, shopId);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void subscribe(TechnicianSubscribe technicianSubscribe) {
+        // 创建技师预约单
+        Long technicianId = technicianSubscribe.getTechnicianId();
+        Long userId = SecurityUtils.getUserId();
+        TechnicianSubscribe subscribe = new TechnicianSubscribe();
+        subscribe.setAppUserId(userId);
+        subscribe.setDelFlag(0);
+        subscribe.setCreateTime(LocalDateTime.now());
+        technicianSubscribeMapper.insert(subscribe);
+        // 更新技师状态
+        UpdateWrapper<Technician> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", technicianId);
+        updateWrapper.eq("subscribe_status", 1);
+        updateWrapper.eq("status", 2);
+        updateWrapper.set("subscribe_status", 2);
+        updateWrapper.set("create_time", LocalDateTime.now());
+        int update = technicianMapper.update(null, updateWrapper);
+        if (update == 0){
+            throw new ServiceException("该技师已被预约", TechnicianErrorCode.TECHNICIAN_ALREADY_SUBSCRIBED.getCode());
+        }
+    }
 }

--
Gitblit v1.7.1