Преглед на файлове

开发订单相关的接口

jinshihui преди 1 седмица
родител
ревизия
e1e1961972
променени са 17 файла, в които са добавени 485 реда и са изтрити 31 реда
  1. 42 4
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductOrderController.java
  2. 7 7
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java
  3. 0 1
      nightFragrance-admin/src/main/resources/application-dev.yml
  4. 1 1
      nightFragrance-common/src/main/java/com/ylx/common/config/WechatAccountConfig.java
  5. 3 1
      nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/WxLoginUser.java
  6. 1 1
      nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java
  7. 2 1
      nightFragrance-framework/src/main/java/com/ylx/framework/web/service/WxTokenService.java
  8. 1 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TWxUser.java
  9. 148 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOrderDetailVo.java
  10. 63 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOrderListVo.java
  11. 22 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/ProductOrderInfoMapper.java
  12. 21 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IProductOrderInfoService.java
  13. 63 7
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductOrderInfoServiceImpl.java
  14. 1 1
      nightFragrance-massage/src/main/java/com/ylx/massage/utils/WeChatUtil.java
  15. 21 4
      nightFragrance-massage/src/main/java/com/ylx/product/domain/ProductOrderAddress.java
  16. 4 3
      nightFragrance-massage/src/main/java/com/ylx/product/service/impl/ProductOrderAddressServiceImpl.java
  17. 85 0
      nightFragrance-massage/src/main/resources/mapper/massage/ProductOrderInfoMapper.xml

+ 42 - 4
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductOrderController.java

@@ -1,17 +1,17 @@
 package com.ylx.web.controller.massage;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
+import com.ylx.massage.domain.vo.ProductOrderDetailVo;
+import com.ylx.massage.domain.vo.ProductOrderListVo;
 import com.ylx.massage.service.IProductOrderInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * 商品订单控制器
@@ -59,4 +59,42 @@ public class ProductOrderController extends BaseController {
             return R.fail(e.getMessage());
         }
     }
+
+    /**
+     * 查询我的订单列表(分页)
+     *
+     * @param page 分页参数
+     * @param openId 用户openId
+     * @return R<Page<ProductOrderListVo>> 订单分页列表
+     */
+    @GetMapping("/list")
+    public R<Page<ProductOrderListVo>> getProductOrderList(Page<ProductOrderListVo> page, @RequestParam("openId") String openId) {
+        try {
+            log.info("查询用户订单列表,openId:{}", openId);
+            Page<ProductOrderListVo> result = productOrderInfoService.getProductOrderList(page, openId);
+            return R.ok(result);
+        } catch (Exception e) {
+            log.error("查询用户订单列表失败:{}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    /**
+     * 查询商品订单详情
+     *
+     * @param openId 用户openId
+     * @param orderNo 订单编号
+     * @return R<ProductOrderDetailVo> 订单详情
+     */
+    @GetMapping("/detail")
+    public R<ProductOrderDetailVo> getProductOrderDetail(@RequestParam("openId") String openId, @RequestParam("orderNo") String orderNo) {
+        try {
+            log.info("查询商品订单详情,openId:{},订单编号:{}", openId, orderNo);
+            ProductOrderDetailVo detail = productOrderInfoService.getProductOrderDetail(orderNo, openId);
+            return R.ok(detail);
+        } catch (Exception e) {
+            log.error("查询商品订单详情失败:{}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
 }

+ 7 - 7
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java

@@ -27,6 +27,7 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
+
 import javax.annotation.Resource;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -45,7 +46,6 @@ public class WeSqController extends BaseController {
     private final static String OPEN_ID = "openid";
 
 
-
     @Resource
     private WeChatUtil weChatUtil;
 
@@ -89,24 +89,24 @@ public class WeSqController extends BaseController {
             String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
             // 解析JSON数据
             JSONObject jsonObject = new JSONObject(userInfoJsom);
-            log.info("公众号网页登录:{}",jsonObject);
+            log.info("公众号网页登录:{}", jsonObject);
             // 将用户信息保存到数据库中
             LambdaQueryWrapper<TWxUser> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
             objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid);
             TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper);
             if (user == null || StringUtils.isEmpty(user.getcNickName())) {
-                if(user == null){
+                if (user == null) {
                     user = new TWxUser();
                     user.setcOpenid(openid);
                     TWxUser finalUser = user;
                     //异步 添加新人优惠卷
-    //                threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
+                    //                threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
                 }
                 user.setcOpenid(openid);
                 user.setcNickName(jsonObject.get("nickname").toString());
                 user.setcIcon(jsonObject.get("headimgurl").toString());
                 user.setcSessionKey(refreshToken);
-    //            user.setcPhone(phoneNumber);
+                //            user.setcPhone(phoneNumber);
                 wxUserService.saveOrUpdate(user);
                 user.setId(user.getId());
             }
@@ -116,11 +116,11 @@ public class WeSqController extends BaseController {
             // 生成并返回令牌
             String token = wxTokenService.createToken(wxUser);
             log.info("token的值:{}", token);
-            //给我把token的值保存到redis中
-            redisTemplate.opsForValue().set(wxUser.getCOpenid(), token, 180, TimeUnit.MINUTES);
             if (token == null || token.isEmpty()) {
                 return R.fail("生成令牌失败");
             }
+            //给我把token的值保存到redis中
+            redisTemplate.opsForValue().set(wxUser.getCOpenid(), token, 180, TimeUnit.MINUTES);
             wxUser.setToken(token);
             // 返回用户信息
             // 记录登录信息

+ 0 - 1
nightFragrance-admin/src/main/resources/application-dev.yml

@@ -241,7 +241,6 @@ wechat:
   get-code-url: https://open.weixin.qq.com/connect/oauth2/authorize
   # 回调地址
   redirect-url: http://7tjvt8639914.vicp.fun/sq/getAccessToken
-  # 回调地址
   access-token-url: https://api.weixin.qq.com/sns/oauth2/access_token
   # 消息模版ID
   template-id-1: HU2LfMIes91Au9kxR3VEoNYuMayxZoPNsFRfWNCmKrQ

+ 1 - 1
nightFragrance-common/src/main/java/com/ylx/common/config/WechatAccountConfig.java

@@ -34,7 +34,7 @@ public class WechatAccountConfig {
     private String redirectUrl;
 
     /**
-     * 回调地址,需要修改域名,修改http://1dcd46bb.r24.cpolar.top这个就好啦
+     * 获取微信AccessToken的URL
      */
     private String accessTokenUrl;
 

+ 3 - 1
nightFragrance-common/src/main/java/com/ylx/common/core/domain/model/WxLoginUser.java

@@ -22,7 +22,9 @@ public class WxLoginUser implements UserDetails {
      */
     private String token;
 
-
+    /**
+     * 用户id
+     */
     private String id;
 
     /**

+ 1 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java

@@ -112,7 +112,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                         "/api/lbt/v1/getAll", "/api/js/v1/select", "/api/xiangmu/v1/wx/getAll", "/api/order/v1/getStatus",
                         "/api/xiangmu/v1/getByid", "/api/xiangmu/v1/highlights", "/api/js/v1/wx/getByid", "/api/js/v1/wx/select", "/api/js/v1/wx/add", "/api/recharge/v1/test",
                         "/wx/pay/payNotify", "/wx/pay/refundNotify", "/weChat/getAccessToken", "/weChat/getCode", "/weChat/verifyToken", "/sq/getAccessToken",
-                        "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code").permitAll()
+                        "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code","/product/category/list").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.txt", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 2 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/web/service/WxTokenService.java

@@ -101,12 +101,13 @@ public class WxTokenService {
      * 创建令牌
      *
      * @param wxUser 用户信息
-     * @return 令牌
+     * @return String令牌
      */
     public String createToken(WxLoginUser wxUser) {
         String token = IdUtils.fastUUID();
         wxUser.setToken(token);
         setUserAgent(wxUser);
+        // 刷新令牌有效期
         refreshToken(wxUser);
 
         Map<String, Object> claims = new HashMap<>();

+ 1 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TWxUser.java

@@ -48,6 +48,7 @@ public class TWxUser implements Serializable {
     @TableField("role")
     @ApiModelProperty("角色:0普通,1技师")
     private Integer role;
+
     /**
      * 微信小程序登录会话密钥
      */

+ 148 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOrderDetailVo.java

@@ -0,0 +1,148 @@
+package com.ylx.massage.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品订单详情VO
+ */
+@Data
+public class ProductOrderDetailVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单ID
+     */
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 用户openId
+     */
+    private String openId;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+
+    /**
+     * 订单状态描述
+     */
+    private String orderStatusName;
+
+    /**
+     * 支付状态
+     */
+    private Integer payStatus;
+
+    /**
+     * 支付方式
+     */
+    private Integer payType;
+
+    /**
+     * 支付时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime payTime;
+
+    /**
+     * 支付超时时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime payExpireTime;
+
+    /**
+     * 商品总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 优惠金额
+     */
+    private BigDecimal discountAmount;
+
+    /**
+     * 运费
+     */
+    private BigDecimal freightAmount;
+
+    /**
+     * 实付金额
+     */
+    private BigDecimal payAmount;
+
+
+    /**
+     * 使用积分数量
+     */
+    private Integer pointsUsed;
+
+    /**
+     * 地址ID
+     */
+    private Long addressId;
+
+    /**
+     * 收货人姓名
+     */
+    private String receiverName;
+
+    /**
+     * 收货人手机号
+     */
+    private String receiverPhone;
+
+    /**
+     * 地址名称
+     */
+    private String addressName;
+
+    /**
+     * 配送方式
+     */
+    private Integer deliveryType;
+
+    /**
+     * 快递公司
+     */
+    private String logisticsCompany;
+
+    /**
+     * 快递单号
+     */
+    private String logisticsNo;
+
+    /**
+     * 发货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime deliveryTime;
+
+    /**
+     * 确认收货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime receiveTime;
+
+    /**
+     * 买家备注
+     */
+    private String buyerRemark;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+}

+ 63 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ProductOrderListVo.java

@@ -0,0 +1,63 @@
+package com.ylx.massage.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品订单列表VO
+ */
+@Data
+public class ProductOrderListVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单ID
+     */
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+
+    /**
+     * 订单状态描述
+     */
+    private String orderStatusName;
+
+    /**
+     * 支付状态
+     */
+    private Integer payStatus;
+
+    /**
+     * 商品总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+}

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/ProductOrderInfoMapper.java

@@ -1,12 +1,34 @@
 package com.ylx.massage.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.ProductOrderInfo;
+import com.ylx.massage.domain.vo.ProductOrderDetailVo;
+import com.ylx.massage.domain.vo.ProductOrderListVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 商品订单信息Mapper接口
  */
 @Mapper
 public interface ProductOrderInfoMapper extends BaseMapper<ProductOrderInfo> {
+
+    /**
+     * 分页查询用户商品订单列表
+     *
+     * @param page 分页参数
+     * @param openId 用户openId
+     * @return 订单列表
+     */
+    Page<ProductOrderListVo> selectProductOrderListByOpenId(Page<ProductOrderListVo> page, @Param("openId") String openId);
+
+    /**
+     * 查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @param openId 用户openId
+     * @return 订单详情
+     */
+    ProductOrderDetailVo selectProductOrderDetailByOrderNoAndOpenId(@Param("orderNo") String orderNo, @Param("openId") String openId);
 }

+ 21 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IProductOrderInfoService.java

@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.ProductOrderInfo;
 import com.ylx.massage.domain.TOrder;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
+import com.ylx.massage.domain.vo.ProductOrderDetailVo;
+import com.ylx.massage.domain.vo.ProductOrderListVo;
 
 /**
  * 商品订单信息Service接口
@@ -27,4 +30,22 @@ public interface IProductOrderInfoService extends IService<ProductOrderInfo> {
      * @return R 支付结果
      */
     public R payOrder(ProductOrderPayRequest productOrderPayRequest) throws Exception;
+
+    /**
+     * 分页查询用户商品订单列表
+     *
+     * @param page 分页参数
+     * @param openId 用户openId
+     * @return 订单分页列表
+     */
+    Page<ProductOrderListVo> getProductOrderList(Page<ProductOrderListVo> page, String openId);
+
+    /**
+     * 查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @param openId 用户openId
+     * @return 订单详情
+     */
+    ProductOrderDetailVo getProductOrderDetail(String orderNo, String openId);
 }

+ 63 - 7
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductOrderInfoServiceImpl.java

@@ -1,11 +1,8 @@
 package com.ylx.massage.service.impl;
 
 import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.constant.MassageConstants;
 import com.ylx.common.core.domain.R;
@@ -13,8 +10,9 @@ import com.ylx.common.exception.ServiceException;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
 import com.ylx.massage.domain.dto.ProductOrderPayRequest;
+import com.ylx.massage.domain.vo.ProductOrderDetailVo;
+import com.ylx.massage.domain.vo.ProductOrderListVo;
 import com.ylx.massage.enums.BillTypeEnum;
-import com.ylx.massage.enums.OrderStatusEnum;
 import com.ylx.massage.enums.ProductOrderStatusEnum;
 import com.ylx.massage.mapper.ProductMapper;
 import com.ylx.massage.mapper.ProductOrderInfoMapper;
@@ -24,8 +22,11 @@ import com.ylx.massage.service.TConsumptionLogService;
 import com.ylx.massage.service.TRechargeService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.utils.OrderNumberGenerator;
-import com.ylx.massage.utils.Sendvoice;
+import com.ylx.product.domain.ProductOrderAddress;
+import com.ylx.product.domain.vo.ProductOrderAddressVo;
+import com.ylx.product.service.IProductOrderAddressService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +34,6 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 
 /**
  * 商品订单信息Service实现类
@@ -63,6 +63,9 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
     @Resource
     private TConsumptionLogService consumptionLogService;
 
+    @Autowired
+    private IProductOrderAddressService productOrderAddressService;
+
 
     /**
      * 创建商品订单
@@ -289,4 +292,57 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         //更新订单表
         updateById(productOrderInfo);
     }
+
+    /**
+     * 分页查询用户商品订单列表
+     *
+     * @param page 分页参数
+     * @param openId 用户openId
+     * @return Page<ProductOrderListVo> 订单分页列表
+     */
+    @Override
+    public Page<ProductOrderListVo> getProductOrderList(Page<ProductOrderListVo> page, String openId) {
+        //判断openId是否为空
+        if (StringUtils.isBlank(openId)) {
+            throw new ServiceException("用户openId不能为空");
+        }
+        Page<ProductOrderListVo> result = productOrderInfoMapper.selectProductOrderListByOpenId(page, openId);
+        // 设置订单状态名称
+        for (ProductOrderListVo vo : result.getRecords()) {
+            vo.setOrderStatusName(ProductOrderStatusEnum.getDescByCode(vo.getOrderStatus()));
+        }
+        return result;
+    }
+
+    /**
+     * 查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @param openId 用户openId
+     * @return ProductOrderDetailVo 订单详情
+     */
+    @Override
+    public ProductOrderDetailVo getProductOrderDetail(String orderNo, String openId) {
+        if (StringUtils.isBlank(openId)) {
+            throw new ServiceException("用户openId不能为空");
+        }
+        if (StringUtils.isBlank(orderNo)) {
+            throw new ServiceException("订单编号不能为空");
+        }
+        ProductOrderDetailVo detail = productOrderInfoMapper.selectProductOrderDetailByOrderNoAndOpenId(orderNo, openId);
+        if (detail == null) {
+            throw new ServiceException("订单不存在");
+        }
+        //根据地址ID查询地址信息
+        ProductOrderAddress address = productOrderAddressService.getById(detail.getAddressId());
+        if (address == null) {
+            throw new ServiceException("地址不存在");
+        }
+        //设置收货人姓名和手机号
+        detail.setReceiverName(address.getReceiverName());
+        detail.setReceiverPhone(address.getReceiverPhone());
+        detail.setAddressName(address.getFullAddress());
+        detail.setOrderStatusName(ProductOrderStatusEnum.getDescByCode(detail.getOrderStatus()));
+        return detail;
+    }
 }

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/utils/WeChatUtil.java

@@ -83,7 +83,7 @@ public class WeChatUtil {
      * 获取微信AccessToken
      *
      * @param code 用户code
-     * @return 返回包含微信AccessToken的Map
+     * @return Map<?, ?> 返回包含微信AccessToken的Map
      */
     public Map<?, ?> getAccessToken(String code) {
         StringBuffer url = new StringBuffer();

+ 21 - 4
nightFragrance-massage/src/main/java/com/ylx/product/domain/ProductOrderAddress.java

@@ -1,11 +1,16 @@
 package com.ylx.product.domain;
 
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ylx.common.core.domain.BaseEntity;
 import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ylx.common.annotation.Excel;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * 订单收货地址对象 product_order_address
  *
@@ -13,7 +18,8 @@ import com.ylx.common.annotation.Excel;
  * @date 2026-04-03
  */
 @Data
-public class ProductOrderAddress extends BaseEntity {
+@TableName("product_order_address")
+public class ProductOrderAddress implements Serializable {
     private static final long serialVersionUID = -5923046914051480272L;
 
     /**
@@ -69,6 +75,12 @@ public class ProductOrderAddress extends BaseEntity {
     @Excel(name = "完整地址", readConverterExp = "省=+市+区+详细")
     private String fullAddress;
 
+    /**
+     * 是否默认地址 0否1是
+     */
+    @Excel(name = "是否默认地址 0否1是")
+    private Integer isDefault;
+
     /**
      * 是否删除 0否1是
      */
@@ -76,9 +88,14 @@ public class ProductOrderAddress extends BaseEntity {
     private Integer isDelete;
 
     /**
-     * 是否默认地址 0否1是
+     * 创建时间
      */
-    @Excel(name = "是否默认地址 0否1是")
-    private Integer isDefault;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
 
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
 }

+ 4 - 3
nightFragrance-massage/src/main/java/com/ylx/product/service/impl/ProductOrderAddressServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.List;
 
@@ -51,7 +52,7 @@ public class ProductOrderAddressServiceImpl extends ServiceImpl<ProductOrderAddr
                 + entity.getDistrictName()
                 + entity.getDetailAddress();
         entity.setFullAddress(fullAddress);
-        entity.setCreateTime(DateUtils.getNowDate());
+        entity.setCreateTime(LocalDateTime.now());
         productOrderAddressMapper.insert(entity);
     }
 
@@ -77,7 +78,7 @@ public class ProductOrderAddressServiceImpl extends ServiceImpl<ProductOrderAddr
 
         BeanUtil.copyProperties(dto, entity);
         entity.setOpenId(openId);
-        entity.setUpdateTime(DateUtils.getNowDate());
+        entity.setUpdateTime(LocalDateTime.now());
         // 拼接完整地址
         String fullAddress = entity.getProvinceName()
                 + entity.getCityName()
@@ -119,7 +120,7 @@ public class ProductOrderAddressServiceImpl extends ServiceImpl<ProductOrderAddr
         String openId = wxLoginUser.getCOpenid();
         entity.setOpenId(openId);
         entity.setIsDelete(1);
-        entity.setUpdateTime(DateUtils.getNowDate());
+        entity.setUpdateTime(LocalDateTime.now());
 
         return this.productOrderAddressMapper.updateById(entity);
     }

+ 85 - 0
nightFragrance-massage/src/main/resources/mapper/massage/ProductOrderInfoMapper.xml

@@ -0,0 +1,85 @@
+<?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.ylx.massage.mapper.ProductOrderInfoMapper">
+
+    <resultMap id="ProductOrderDetailVoResult" type="com.ylx.massage.domain.vo.ProductOrderDetailVo">
+        <id property="id" column="id"/>
+        <result property="orderNo" column="order_no"/>
+        <result property="openId" column="open_id"/>
+        <result property="orderStatus" column="order_status"/>
+        <result property="payStatus" column="pay_status"/>
+        <result property="payType" column="pay_type"/>
+        <result property="payTime" column="pay_time"/>
+        <result property="payExpireTime" column="pay_expire_time"/>
+        <result property="totalAmount" column="total_amount"/>
+        <result property="discountAmount" column="discount_amount"/>
+        <result property="freightAmount" column="freight_amount"/>
+        <result property="payAmount" column="pay_amount"/>
+        <result property="pointsUsed" column="points_used"/>
+        <result property="addressId" column="address_id"/>
+        <result property="deliveryType" column="delivery_type"/>
+        <result property="logisticsCompany" column="logistics_company"/>
+        <result property="logisticsNo" column="logistics_no"/>
+        <result property="deliveryTime" column="delivery_time"/>
+        <result property="receiveTime" column="receive_time"/>
+        <result property="buyerRemark" column="buyer_remark"/>
+        <result property="createTime" column="create_time"/>
+    </resultMap>
+
+    <resultMap id="ProductOrderListVoResult" type="com.ylx.massage.domain.vo.ProductOrderListVo">
+        <id property="id" column="id"/>
+        <result property="orderNo" column="order_no"/>
+        <result property="orderStatus" column="order_status"/>
+        <result property="payStatus" column="pay_status"/>
+        <result property="totalAmount" column="total_amount"/>
+        <result property="createTime" column="create_time"/>
+        <result property="productId" column="product_id"/>
+        <result property="productName" column="product_name"/>
+    </resultMap>
+
+    <!-- 分页查询用户订单列表 -->
+    <select id="selectProductOrderListByOpenId" resultMap="ProductOrderListVoResult">
+        SELECT
+            poi.id,
+            poi.order_no,
+            poi.order_status,
+            poi.pay_status,
+            poi.total_amount,
+            poi.create_time,
+            poit.product_id,
+            poit.product_name
+        FROM product_order_info poi
+        JOIN product_order_item poit ON poi.id = poit.order_id
+        WHERE poi.open_id = #{openId}
+        ORDER BY poi.create_time DESC
+    </select>
+
+    <!-- 查询订单详情 -->
+    <select id="selectProductOrderDetailByOrderNoAndOpenId" resultMap="ProductOrderDetailVoResult">
+        SELECT
+            id,
+            order_no,
+            open_id,
+            order_status,
+            pay_status,
+            pay_type,
+            pay_time,
+            pay_expire_time,
+            total_amount,
+            discount_amount,
+            freight_amount,
+            pay_amount,
+            points_used,
+            address_id,
+            delivery_type,
+            logistics_company,
+            logistics_no,
+            delivery_time,
+            receive_time,
+            buyer_remark,
+            create_time
+        FROM product_order_info
+        WHERE order_no = #{orderNo} AND open_id = #{openId}
+    </select>
+
+</mapper>