瀏覽代碼

Merge remote-tracking branch 'origin/point_dev' into point_dev

jinshihui 15 小時之前
父節點
當前提交
748fc5e71e
共有 19 個文件被更改,包括 594 次插入92 次删除
  1. 13 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AreaController.java
  2. 81 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/product/ProductOrderAddressController.java
  3. 1 1
      nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java
  4. 0 63
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/ProductOrderAddress.java
  5. 3 6
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointActivityPageDTO.java
  6. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserActivityTaskCompletionMapper.java
  7. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserActivityTaskCompletionService.java
  8. 7 16
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java
  9. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java
  10. 84 0
      nightFragrance-massage/src/main/java/com/ylx/product/domain/ProductOrderAddress.java
  11. 58 0
      nightFragrance-massage/src/main/java/com/ylx/product/domain/dto/ProductOrderAddressDTO.java
  12. 15 0
      nightFragrance-massage/src/main/java/com/ylx/product/domain/dto/ProductOrderAddressPageDTO.java
  13. 47 0
      nightFragrance-massage/src/main/java/com/ylx/product/domain/vo/ProductOrderAddressVo.java
  14. 19 0
      nightFragrance-massage/src/main/java/com/ylx/product/mapper/ProductOrderAddressMapper.java
  15. 31 0
      nightFragrance-massage/src/main/java/com/ylx/product/service/IProductOrderAddressService.java
  16. 190 0
      nightFragrance-massage/src/main/java/com/ylx/product/service/impl/ProductOrderAddressServiceImpl.java
  17. 1 1
      nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml
  18. 1 1
      nightFragrance-massage/src/main/resources/mapper/point/PointUserActivityTaskCompletionMapper.xml
  19. 39 0
      nightFragrance-massage/src/main/resources/mapper/product/ProductOrderAddressMapper.xml

+ 13 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AreaController.java

@@ -1,6 +1,7 @@
 package com.ylx.web.controller.massage;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -95,5 +96,17 @@ public class AreaController {
     public R delete(@RequestParam("idList") List<Long> idList) {
         return R.ok(this.areaService.removeByIds(idList));
     }
+
+    @GetMapping("/code")
+    @ApiOperation("name获取code")
+    public R getCodeByName(@RequestParam String name) {
+        LambdaQueryWrapper<Area> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Area::getName, name);
+        List<Area> list = this.areaService.list(queryWrapper);
+        if (CollectionUtil.isEmpty(list)) {
+            return R.fail("未找到此数据");
+        }
+        return R.ok(CollectionUtil.getFirst(list).getCode());
+    }
 }
 

+ 81 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/product/ProductOrderAddressController.java

@@ -0,0 +1,81 @@
+package com.ylx.web.controller.product;
+
+import com.ylx.common.annotation.Log;
+import com.ylx.common.core.controller.BaseController;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.core.page.TableDataInfo;
+import com.ylx.common.enums.BusinessType;
+import com.ylx.product.domain.dto.ProductOrderAddressDTO;
+import com.ylx.product.domain.dto.ProductOrderAddressPageDTO;
+import com.ylx.product.domain.vo.ProductOrderAddressVo;
+import com.ylx.product.service.IProductOrderAddressService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/product/order/address")
+@Api(tags = {"订单收货地址"})
+public class ProductOrderAddressController extends BaseController {
+
+    @Resource
+    private IProductOrderAddressService productOrderAddressService;
+
+
+    @ApiOperation("新增地址接口")
+    @Log(title = "新增地址接口", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public R add(@Validated @RequestBody ProductOrderAddressDTO dto) {
+        this.productOrderAddressService.add(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("编辑地址接口")
+    @Log(title = "编辑地址接口", businessType = BusinessType.UPDATE)
+    @PutMapping("/edit")
+    public R edit(@Validated @RequestBody ProductOrderAddressDTO dto) {
+        this.productOrderAddressService.edit(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("地址详情接口")
+    @GetMapping("/{id}")
+    public R<ProductOrderAddressVo> getById(@PathVariable("id") Long id) {
+        ProductOrderAddressVo vo = this.productOrderAddressService.findById(id);
+        return R.ok(vo);
+    }
+
+    @ApiOperation("删除地址接口")
+    @Log(title = "删除地址接口", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{id}")
+    public R delete(@PathVariable("id") Long id) {
+        int i = this.productOrderAddressService.deleteById(id);
+        if (i > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    @ApiOperation("设置默认地址接口")
+    @Log(title = "设置默认地址接口", businessType = BusinessType.UPDATE)
+    @PutMapping("/default/{id}")
+    public R defaultAddress(@PathVariable("id") Long id) {
+        int i = this.productOrderAddressService.defaultAddress(id);
+        if (i > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    @ApiOperation("地址分页接口")
+    @PostMapping("/page")
+    public TableDataInfo page(@Validated @RequestBody ProductOrderAddressPageDTO dto) {
+        startPage();
+        List<ProductOrderAddressVo> list = this.productOrderAddressService.list(dto);
+        return getDataTable(list);
+    }
+}

+ 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").permitAll()
+                        "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.txt", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

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

@@ -1,63 +0,0 @@
-package com.ylx.massage.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-/**
- * 订单收货地址实体类
- */
-@Data
-@TableName("product_order_address")
-public class ProductOrderAddress implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @TableId(type = IdType.ASSIGN_ID)
-    private Long id;
-
-    /** 用户openID */
-    private String openId;
-
-    /** 收货人姓名 */
-    private String receiverName;
-
-    /** 收货人手机号 */
-    private String receiverPhone;
-
-
-    /** 省份名称 */
-    private String provinceName;
-
-
-    /** 城市名称 */
-    private String cityName;
-
-
-    /** 区县名称 */
-    private String districtName;
-
-    /** 详细地址 */
-    private String detailAddress;
-
-    /** 完整地址(省+市+区+详细) */
-    private String fullAddress;
-
-    /** 是否删除 0否 1是 */
-    @TableLogic
-    private Integer isDelete;
-
-    /**
-     * 创建时间
-     */
-    @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
-
-    /**
-     * 更新时间
-     */
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private LocalDateTime updateTime;
-}

+ 3 - 6
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointActivityPageDTO.java

@@ -15,14 +15,11 @@ public class UserPointActivityPageDTO extends BaseEntity {
     @NotNull(message = "活动类型不能为空")
     private Integer type;
 
-    @ApiModelProperty(name = "当前所在城市名称")
-    private String cityName;
-
-    @ApiModelProperty(name = "当前所在城市名称", hidden = true)
+    @ApiModelProperty(name = "当前所在城市code")
     private String cityCode;
 
-    @ApiModelProperty(name = "用户ID", hidden = true)
-    private String userId;
+    @ApiModelProperty(name = "用户openId", hidden = true)
+    private String openId;
 
 }
 

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserActivityTaskCompletionMapper.java

@@ -19,6 +19,6 @@ public interface PointUserActivityTaskCompletionMapper extends BaseMapper<PointU
 
     Integer selectCompletedTaskCount(String openId);
 
-    List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(@Param("openId") String openId, @Param("taskIds") List<Long> taskIds);
+    List<PointUserActivityTaskCompletion> selectCompletionsByOpenIdAndTaskIds(@Param("openId") String openId, @Param("taskIds") List<Long> taskIds);
 
 }

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserActivityTaskCompletionService.java

@@ -18,5 +18,5 @@ public interface IPointUserActivityTaskCompletionService extends IService<PointU
 
     Integer selectCompletedTaskCount(String openId);
 
-    List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(String userId, List<Long> taskIds);
+    List<PointUserActivityTaskCompletion> selectCompletionsByOpenIdAndTaskIds(String openId, List<Long> taskIds);
 }

+ 7 - 16
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -12,8 +12,6 @@ import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.exception.base.BaseException;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.common.utils.SecurityUtils;
-import com.ylx.massage.domain.TWxUser;
-import com.ylx.massage.service.TWxUserService;
 import com.ylx.point.domain.*;
 import com.ylx.point.domain.dto.*;
 import com.ylx.point.domain.vo.*;
@@ -57,8 +55,6 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
     @Resource
     private IPointActivityExpirePolicyService pointActivityExpirePolicyService;
     @Resource
-    private TWxUserService wxUserService;
-    @Resource
     private IPointUserSignLogService pointUserSignLogService;
     @Resource
     private IPointUserSignStatusService pointUserSignStatusService;
@@ -240,14 +236,11 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
         // 当前登录用户信息
         WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
-        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
-        if (user == null) {
+        if (ObjectUtil.isNull(wxLoginUser)) {
             throw new RuntimeException("用户不存在");
         }
-
-        String userId = user.getId();
-        dto.setUserId(userId);
-        // TODO 根据cityName换cityCode
+        String openId = wxLoginUser.getCOpenid();
+        dto.setOpenId(openId);
         return pointActivityMapper.selectTaskWithProgress(dto);
     }
 
@@ -256,12 +249,10 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
         // 当前登录用户信息
         WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
-        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
-        if (user == null) {
+        if (ObjectUtil.isNull(wxLoginUser)) {
             throw new RuntimeException("用户不存在");
         }
-
-        String userId = user.getId();
+        String openId = wxLoginUser.getCOpenid();
 
         List<UserPointActivityVo> resultList = new ArrayList<>();
 
@@ -280,7 +271,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
             // 4. 批量查询用户完成记录
             List<Long> taskIds = taskList.stream().map(PointActivityTask::getId).collect(Collectors.toList());
             List<PointUserActivityTaskCompletion> completionList =
-                    pointUserActivityTaskCompletionService.selectCompletionsByUserAndTaskIds(userId, taskIds);
+                    pointUserActivityTaskCompletionService.selectCompletionsByOpenIdAndTaskIds(openId, taskIds);
 
             Map<Long, PointUserActivityTaskCompletion> completionMap = completionList.stream()
                     .collect(Collectors.toMap(PointUserActivityTaskCompletion::getTaskId, c -> c));
@@ -956,7 +947,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         // 1. 根据城市查询当前生效的活动
         PointActivity activity = pointActivityMapper.selectOne(
                 new QueryWrapper<PointActivity>()
-                        .eq("cityCode", cityCode)
+                        .eq("city_code", cityCode)
                         .eq("status", 1)  // 活动启用
                         .last("LIMIT 1")
         );

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java

@@ -35,7 +35,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
     }
 
     @Override
-    public List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(String userId, List<Long> taskIds) {
-        return pointUserActivityTaskCompletionMapper.selectCompletionsByUserAndTaskIds(userId, taskIds);
+    public List<PointUserActivityTaskCompletion> selectCompletionsByOpenIdAndTaskIds(String openId, List<Long> taskIds) {
+        return pointUserActivityTaskCompletionMapper.selectCompletionsByOpenIdAndTaskIds(openId, taskIds);
     }
 }

+ 84 - 0
nightFragrance-massage/src/main/java/com/ylx/product/domain/ProductOrderAddress.java

@@ -0,0 +1,84 @@
+package com.ylx.product.domain;
+
+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;
+
+/**
+ * 订单收货地址对象 product_order_address
+ *
+ * @author wzj
+ * @date 2026-04-03
+ */
+@Data
+public class ProductOrderAddress extends BaseEntity {
+    private static final long serialVersionUID = -5923046914051480272L;
+
+    /**
+     * 主键ID
+     */
+    private String id;
+
+    /**
+     * 用户的openID
+     */
+    @Excel(name = "用户的openID")
+    private String openId;
+
+    /**
+     * 收货人姓名
+     */
+    @Excel(name = "收货人姓名")
+    private String receiverName;
+
+    /**
+     * 收货人手机号
+     */
+    @Excel(name = "收货人手机号")
+    private String receiverPhone;
+
+    /**
+     * 省份名称
+     */
+    @Excel(name = "省份名称")
+    private String provinceName;
+
+    /**
+     * 城市名称
+     */
+    @Excel(name = "城市名称")
+    private String cityName;
+
+    /**
+     * 区县名称
+     */
+    @Excel(name = "区县名称")
+    private String districtName;
+
+    /**
+     * 详细地址
+     */
+    @Excel(name = "详细地址")
+    private String detailAddress;
+
+    /**
+     * 完整地址(省+市+区+详细)
+     */
+    @Excel(name = "完整地址", readConverterExp = "省=+市+区+详细")
+    private String fullAddress;
+
+    /**
+     * 是否删除 0否1是
+     */
+    @Excel(name = "是否删除 0否1是")
+    private Integer isDelete;
+
+    /**
+     * 是否默认地址 0否1是
+     */
+    @Excel(name = "是否默认地址 0否1是")
+    private Integer isDefault;
+
+}

+ 58 - 0
nightFragrance-massage/src/main/java/com/ylx/product/domain/dto/ProductOrderAddressDTO.java

@@ -0,0 +1,58 @@
+package com.ylx.product.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("订单收货地址新增/修改DTO")
+public class ProductOrderAddressDTO {
+
+    @ApiModelProperty("主键id")
+    private Long id;
+
+    @NotBlank(message = "收货人姓名不能为空")
+    @ApiModelProperty(value = "收货人姓名", required = true)
+    private String receiverName;
+
+    @NotBlank(message = "收货人手机号不能为空")
+    @ApiModelProperty(value = "收货人手机号", required = true)
+    private String receiverPhone;
+
+    @NotBlank(message = "省份编码不能为空")
+    @ApiModelProperty(value = "省份编码", required = true)
+    private String provinceCode;
+
+    @NotBlank(message = "省份名称不能为空")
+    @ApiModelProperty(value = "省份名称", required = true)
+    private String provinceName;
+
+    @NotBlank(message = "城市编码不能为空")
+    @ApiModelProperty(value = "城市编码", required = true)
+    private String cityCode;
+
+    @NotBlank(message = "城市名称不能为空")
+    @ApiModelProperty(value = "城市名称", required = true)
+    private String cityName;
+
+    @NotBlank(message = "区县编码不能为空")
+    @ApiModelProperty(value = "区县编码", required = true)
+    private String districtCode;
+
+    @NotBlank(message = "区县名称不能为空")
+    @ApiModelProperty(value = "区县名称", required = true)
+    private String districtName;
+
+    @NotBlank(message = "详细地址不能为空")
+    @ApiModelProperty(value = "详细地址", required = true)
+    private String detailAddress;
+
+    @ApiModelProperty(value = "邮政编码")
+    private String zipCode;
+
+    @ApiModelProperty(value = "是否默认地址 0-否 1-是")
+    private Integer isDefault;
+
+}

+ 15 - 0
nightFragrance-massage/src/main/java/com/ylx/product/domain/dto/ProductOrderAddressPageDTO.java

@@ -0,0 +1,15 @@
+package com.ylx.product.domain.dto;
+
+import com.ylx.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("订单收货地址分页查询请求DTO")
+public class ProductOrderAddressPageDTO extends BaseEntity {
+
+    @ApiModelProperty(name = "用户openId", hidden = true)
+    private String openId;
+
+}

+ 47 - 0
nightFragrance-massage/src/main/java/com/ylx/product/domain/vo/ProductOrderAddressVo.java

@@ -0,0 +1,47 @@
+package com.ylx.product.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("订单收货地址vo")
+public class ProductOrderAddressVo {
+
+    @ApiModelProperty("地址ID")
+    private Long id;
+
+    @ApiModelProperty("收货人姓名")
+    private String receiverName;
+
+    @ApiModelProperty("收货人手机号")
+    private String receiverPhone;
+
+    @ApiModelProperty("省份编码")
+    private String provinceCode;
+
+    @ApiModelProperty("省份名称")
+    private String provinceName;
+
+    @ApiModelProperty("城市编码")
+    private String cityCode;
+
+    @ApiModelProperty("城市名称")
+    private String cityName;
+
+    @ApiModelProperty("区县编码")
+    private String districtCode;
+
+    @ApiModelProperty("区县名称")
+    private String districtName;
+
+    @ApiModelProperty("详细地址")
+    private String detailAddress;
+
+    @ApiModelProperty("邮政编码")
+    private String zipCode;
+
+    @ApiModelProperty("是否默认地址 0-否 1-是")
+    private Integer isDefault;
+
+}

+ 19 - 0
nightFragrance-massage/src/main/java/com/ylx/product/mapper/ProductOrderAddressMapper.java

@@ -0,0 +1,19 @@
+package com.ylx.product.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ylx.product.domain.ProductOrderAddress;
+import com.ylx.product.domain.dto.ProductOrderAddressPageDTO;
+import com.ylx.product.domain.vo.ProductOrderAddressVo;
+
+/**
+ * 订单收货地址Mapper接口
+ *
+ * @author wzj
+ * @date 2026-04-03
+ */
+public interface ProductOrderAddressMapper extends BaseMapper<ProductOrderAddress> {
+
+    List<ProductOrderAddressVo> list(ProductOrderAddressPageDTO dto);
+}

+ 31 - 0
nightFragrance-massage/src/main/java/com/ylx/product/service/IProductOrderAddressService.java

@@ -0,0 +1,31 @@
+package com.ylx.product.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.product.domain.ProductOrderAddress;
+import com.ylx.product.domain.dto.ProductOrderAddressDTO;
+import com.ylx.product.domain.dto.ProductOrderAddressPageDTO;
+import com.ylx.product.domain.vo.ProductOrderAddressVo;
+
+import java.util.List;
+
+/**
+ * 订单收货地址Service接口
+ *
+ * @author wzj
+ * @date 2026-04-03
+ */
+public interface IProductOrderAddressService extends IService<ProductOrderAddress> {
+
+    void add(ProductOrderAddressDTO dto);
+
+    void edit(ProductOrderAddressDTO dto);
+
+    ProductOrderAddressVo findById(Long id);
+
+    int deleteById(Long id);
+
+    int defaultAddress(Long id);
+
+    List<ProductOrderAddressVo> list(ProductOrderAddressPageDTO dto);
+}

+ 190 - 0
nightFragrance-massage/src/main/java/com/ylx/product/service/impl/ProductOrderAddressServiceImpl.java

@@ -0,0 +1,190 @@
+package com.ylx.product.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.core.domain.model.WxLoginUser;
+import com.ylx.common.utils.DateUtils;
+import com.ylx.common.utils.SecurityUtils;
+import com.ylx.product.domain.ProductOrderAddress;
+import com.ylx.product.domain.dto.ProductOrderAddressDTO;
+import com.ylx.product.domain.dto.ProductOrderAddressPageDTO;
+import com.ylx.product.domain.vo.ProductOrderAddressVo;
+import com.ylx.product.mapper.ProductOrderAddressMapper;
+import com.ylx.product.service.IProductOrderAddressService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 订单收货地址Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-04-03
+ */
+@Service
+public class ProductOrderAddressServiceImpl extends ServiceImpl<ProductOrderAddressMapper, ProductOrderAddress> implements IProductOrderAddressService {
+    @Resource
+    private ProductOrderAddressMapper productOrderAddressMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(ProductOrderAddressDTO dto) {
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户不存在");
+        }
+        String openId = wxLoginUser.getCOpenid();
+
+        ProductOrderAddress entity = new ProductOrderAddress();
+        BeanUtil.copyProperties(dto, entity);
+        entity.setOpenId(openId);
+        entity.setIsDelete(0);
+        // 拼接完整地址
+        String fullAddress = entity.getProvinceName()
+                + entity.getCityName()
+                + entity.getDistrictName()
+                + entity.getDetailAddress();
+        entity.setFullAddress(fullAddress);
+        entity.setCreateTime(DateUtils.getNowDate());
+        productOrderAddressMapper.insert(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void edit(ProductOrderAddressDTO dto) {
+
+        if (ObjectUtil.isNull(dto.getId())) {
+            throw new RuntimeException("id不能为空");
+        }
+
+        ProductOrderAddress entity = this.productOrderAddressMapper.selectById(dto.getId());
+
+        if (ObjectUtil.isNull(entity)) {
+            throw new RuntimeException("参数有误,查询数据不存在");
+        }
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户不存在");
+        }
+        String openId = wxLoginUser.getCOpenid();
+
+        BeanUtil.copyProperties(dto, entity);
+        entity.setOpenId(openId);
+        entity.setUpdateTime(DateUtils.getNowDate());
+        // 拼接完整地址
+        String fullAddress = entity.getProvinceName()
+                + entity.getCityName()
+                + entity.getDistrictName()
+                + entity.getDetailAddress();
+        entity.setFullAddress(fullAddress);
+        productOrderAddressMapper.updateById(entity);
+
+    }
+
+    @Override
+    public ProductOrderAddressVo findById(Long id) {
+
+        ProductOrderAddress entity = this.productOrderAddressMapper.selectById(id);
+
+        if (ObjectUtil.isNull(entity)) {
+            throw new RuntimeException("参数有误,查询数据不存在");
+        }
+
+        ProductOrderAddressVo vo = new ProductOrderAddressVo();
+        BeanUtil.copyProperties(entity, vo);
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteById(Long id) {
+
+        ProductOrderAddress entity = this.productOrderAddressMapper.selectById(id);
+
+        if (ObjectUtil.isNull(entity)) {
+            throw new RuntimeException("参数有误,查询数据不存在");
+        }
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户不存在");
+        }
+        String openId = wxLoginUser.getCOpenid();
+        entity.setOpenId(openId);
+        entity.setIsDelete(1);
+        entity.setUpdateTime(DateUtils.getNowDate());
+
+        return this.productOrderAddressMapper.updateById(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int defaultAddress(Long id) {
+        ProductOrderAddress entity = this.productOrderAddressMapper.selectById(id);
+
+        if (ObjectUtil.isNull(entity)) {
+            throw new RuntimeException("参数有误,查询数据不存在");
+        }
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户不存在");
+        }
+        String openId = wxLoginUser.getCOpenid();
+
+        Integer currentIsDefault = entity.getIsDefault();
+
+        // ==============================================
+        // 核心逻辑:切换默认状态
+        // ==============================================
+        if (currentIsDefault == 1) {
+            // --------------------------
+            // 当前是默认 → 改为 非默认
+            // --------------------------
+            LambdaUpdateWrapper<ProductOrderAddress> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(ProductOrderAddress::getId, id);
+            wrapper.set(ProductOrderAddress::getIsDefault, 0);
+            wrapper.set(ProductOrderAddress::getOpenId, openId);
+            return productOrderAddressMapper.update(null, wrapper);
+
+        } else {
+            // --------------------------
+            // 当前非默认 → 设为默认
+            // 同时把该用户其他所有地址 → 非默认
+            // --------------------------
+            // 第一步:把该用户所有地址设为非默认
+            LambdaUpdateWrapper<ProductOrderAddress> updateAll = new LambdaUpdateWrapper<>();
+            updateAll.eq(ProductOrderAddress::getOpenId, openId);
+            updateAll.set(ProductOrderAddress::getIsDefault, 0);
+            updateAll.set(ProductOrderAddress::getOpenId, openId);
+            productOrderAddressMapper.update(null, updateAll);
+
+            // 第二步:把当前设为默认
+            LambdaUpdateWrapper<ProductOrderAddress> updateOne = new LambdaUpdateWrapper<>();
+            updateOne.eq(ProductOrderAddress::getId, id);
+            updateOne.set(ProductOrderAddress::getIsDefault, 1);
+            updateOne.set(ProductOrderAddress::getOpenId, openId);
+            return productOrderAddressMapper.update(null, updateOne);
+        }
+    }
+
+    @Override
+    public List<ProductOrderAddressVo> list(ProductOrderAddressPageDTO dto) {
+
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户不存在");
+        }
+        String openId = wxLoginUser.getCOpenid();
+        dto.setOpenId(openId);
+        return productOrderAddressMapper.list(dto);
+    }
+
+}

+ 1 - 1
nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml

@@ -103,7 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             t.trigger_value,
             COALESCE(c.completed_count, 0) AS completed_count
         FROM point_activity_task t
-        LEFT JOIN point_user_activity_task_completion c ON t.id = c.task_id AND c.user_id = #{userId}
+        LEFT JOIN point_user_activity_task_completion c ON t.id = c.task_id AND c.open_id = #{openId}
         JOIN point_activity a ON t.activity_id = a.id
         WHERE t.is_deleted = 0 AND t.status = 0
           AND a.activity_type = #{type}

+ 1 - 1
nightFragrance-massage/src/main/resources/mapper/point/PointUserActivityTaskCompletionMapper.xml

@@ -37,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT COUNT(*) FROM point_user_activity_task_completion WHERE open_id = #{openId} AND completed_count > 0
     </select>
 
-    <select id="selectCompletionsByUserAndTaskIds"
+    <select id="selectCompletionsByOpenIdAndTaskIds"
             resultType="com.ylx.point.domain.PointUserActivityTaskCompletion">
         <include refid="selectPointUserActivityTaskCompletionVo"/>
         WHERE

+ 39 - 0
nightFragrance-massage/src/main/resources/mapper/product/ProductOrderAddressMapper.xml

@@ -0,0 +1,39 @@
+<?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.product.mapper.ProductOrderAddressMapper">
+    
+    <resultMap type="ProductOrderAddress" id="ProductOrderAddressResult">
+        <result property="id"    column="id"    />
+        <result property="openId"    column="open_id"    />
+        <result property="receiverName"    column="receiver_name"    />
+        <result property="receiverPhone"    column="receiver_phone"    />
+        <result property="provinceName"    column="province_name"    />
+        <result property="cityName"    column="city_name"    />
+        <result property="districtName"    column="district_name"    />
+        <result property="detailAddress"    column="detail_address"    />
+        <result property="fullAddress"    column="full_address"    />
+        <result property="isDelete"    column="is_delete"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectProductOrderAddressVo">
+        select id, open_id, receiver_name, receiver_phone, province_name, city_name, district_name, detail_address, full_address, is_delete, create_time, update_time from product_order_address
+    </sql>
+
+    <select id="list" parameterType="ProductOrderAddressPageDTO" resultType="com.ylx.product.domain.vo.ProductOrderAddressVo">
+        <include refid="selectProductOrderAddressVo"/>
+        <where>
+            <if test="activityType != null">
+                AND open_id = #{openId}
+            </if>
+            AND is_delete = 0
+        </where>
+        order by update_time desc ,create_time desc
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+
+</mapper>