Răsfoiți Sursa

开发购物金接口

jinshihui 2 zile în urmă
părinte
comite
1aeccb0df4
15 a modificat fișierele cu 473 adăugiri și 6 ștergeri
  1. 29 1
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WxController.java
  2. 36 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/dto/UserShoppingFundsDetailQueryDTO.java
  3. 45 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsDetailItemVO.java
  4. 43 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsDetailVO.java
  5. 16 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsSummaryVO.java
  6. 23 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/mapper/GiftCardOrderMapper.java
  7. 14 0
      nightFragrance-massage/src/main/java/com/ylx/giftCard/service/IGiftCardOrderService.java
  8. 68 1
      nightFragrance-massage/src/main/java/com/ylx/giftCard/service/impl/GiftCardOrderServiceImpl.java
  9. 1 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
  10. 23 1
      nightFragrance-massage/src/main/java/com/ylx/shopingfundsdetail/mapper/ShoppingFundsDetailMapper.java
  11. 39 1
      nightFragrance-massage/src/main/resources/mapper/giftCard/GiftCardOrderMapper.xml
  12. 39 1
      nightFragrance-massage/src/main/resources/mapper/giftCard/ShoppingFundsDetailMapper.xml
  13. 36 0
      nightFragrance-massage/src/test/java/com/ylx/giftCard/mapper/GiftCardOrderMapperXmlTest.java
  14. 25 0
      nightFragrance-massage/src/test/java/com/ylx/giftCard/service/impl/GiftCardOrderServiceImplTest.java
  15. 36 0
      nightFragrance-massage/src/test/java/com/ylx/shopingfundsdetail/mapper/ShoppingFundsDetailMapperXmlTest.java

+ 29 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WxController.java

@@ -24,6 +24,10 @@ import com.ylx.framework.config.ServerConfig;
 import com.ylx.framework.manager.AsyncManager;
 import com.ylx.framework.manager.factory.AsyncFactory;
 import com.ylx.framework.web.service.WxTokenService;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailVO;
+import com.ylx.giftCard.service.IGiftCardOrderService;
 import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.domain.dto.QueryWxUserDTO;
 import com.ylx.massage.domain.vo.TWxUserVo;
@@ -92,6 +96,9 @@ public class WxController extends BaseController {
     @Resource
     private IPointUserLogService pointUserLogService;
 
+    @Resource
+    private IGiftCardOrderService giftCardOrderService;
+
     @Resource(name = "commonAsyncExecutor")
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
@@ -393,6 +400,27 @@ public class WxController extends BaseController {
         }
     }
 
-
+    /**
+     * PC端根据用户ID查询用户购物金明细
+     *
+     * @param page 分页参数
+     * @param queryDTO 查询条件,包含用户ID、明细类型、开始时间、结束时间
+     * @return R<UserShoppingFundsDetailVO> 用户购物金明细
+     */
+    @GetMapping("pc/getUserShoppingFundsDetail")
+    @ApiOperation("PC端根据用户ID查询用户购物金明细")
+    public R<UserShoppingFundsDetailVO> getUserShoppingFundsDetail(Page<UserShoppingFundsDetailItemVO> page, UserShoppingFundsDetailQueryDTO queryDTO) {
+        try {
+            if (queryDTO == null || StringUtils.isBlank(queryDTO.getUserId())) {
+                return R.fail("userId不能为空");
+            }
+            return R.ok(giftCardOrderService.getPcUserShoppingFundsDetail(page, queryDTO));
+        } catch (IllegalArgumentException e) {
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("查询用户购物金明细失败", e);
+            return R.fail("查询用户购物金明细失败");
+        }
+    }
 
 }

+ 36 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/dto/UserShoppingFundsDetailQueryDTO.java

@@ -0,0 +1,36 @@
+package com.ylx.giftCard.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * PC用户购物金明细查询DTO
+ */
+@Data
+@ApiModel("PC用户购物金明细查询DTO")
+public class UserShoppingFundsDetailQueryDTO {
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    /**
+     * 明细类型:0-购买,1-支出
+     */
+    @ApiModelProperty("明细类型:0-购买,1-支出")
+    private Integer detailType;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty("结束时间")
+    private String endTime;
+}

+ 45 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsDetailItemVO.java

@@ -0,0 +1,45 @@
+package com.ylx.giftCard.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * PC用户购物金明细行VO
+ */
+@Data
+@ApiModel("PC用户购物金明细行VO")
+public class UserShoppingFundsDetailItemVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单号
+     */
+    @ApiModelProperty("订单号")
+    private String orderNo;
+
+    /**
+     * 购物卡名称
+     */
+    @ApiModelProperty("购物卡名称")
+    private String giftCardName;
+
+    /**
+     * 订单金额
+     */
+    @ApiModelProperty("订单金额")
+    private BigDecimal orderAmount;
+
+    /**
+     * 订单时间
+     */
+    @ApiModelProperty("订单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date orderTime;
+}

+ 43 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsDetailVO.java

@@ -0,0 +1,43 @@
+package com.ylx.giftCard.domain.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * PC用户购物金明细VO
+ */
+@Data
+@ApiModel("PC用户购物金明细VO")
+public class UserShoppingFundsDetailVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 购物金余额
+     */
+    @ApiModelProperty("购物金余额")
+    private BigDecimal shoppingFundsBalance;
+
+    /**
+     * 合计金额
+     */
+    @ApiModelProperty("合计金额")
+    private BigDecimal totalAmount;
+
+    /**
+     * 合计笔数
+     */
+    @ApiModelProperty("合计笔数")
+    private Long totalCount;
+
+    /**
+     * 明细分页数据
+     */
+    @ApiModelProperty("明细分页数据")
+    private Page<UserShoppingFundsDetailItemVO> page;
+}

+ 16 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/vo/UserShoppingFundsSummaryVO.java

@@ -0,0 +1,16 @@
+package com.ylx.giftCard.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户购物金明细汇总VO
+ */
+@Data
+public class UserShoppingFundsSummaryVO {
+
+    private BigDecimal totalAmount;
+
+    private Long totalCount;
+}

+ 23 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/mapper/GiftCardOrderMapper.java

@@ -1,8 +1,31 @@
 package com.ylx.giftCard.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.giftCard.domain.GiftCardOrder;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsSummaryVO;
+import org.apache.ibatis.annotations.Param;
 
 public interface GiftCardOrderMapper extends BaseMapper<GiftCardOrder> {
 
+    /**
+     * 查询PC端用户购买购物卡明细
+     *
+     * @param page 分页参数
+     * @param dto 查询条件
+     * @return 购买购物卡明细
+     */
+    Page<UserShoppingFundsDetailItemVO> selectPcPurchaseShoppingFundsDetail(
+            Page<UserShoppingFundsDetailItemVO> page,
+            @Param("dto") UserShoppingFundsDetailQueryDTO dto);
+
+    /**
+     * 查询PC端用户购买购物卡汇总
+     *
+     * @param dto 查询条件
+     * @return 购买购物卡汇总
+     */
+    UserShoppingFundsSummaryVO selectPcPurchaseShoppingFundsSummary(@Param("dto") UserShoppingFundsDetailQueryDTO dto);
 }

+ 14 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/service/IGiftCardOrderService.java

@@ -1,10 +1,14 @@
 package com.ylx.giftCard.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.giftCard.domain.GiftCard;
 import com.ylx.giftCard.domain.GiftCardOrder;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailVO;
 import com.ylx.massage.domain.TWxUser;
 
 public interface IGiftCardOrderService extends IService<GiftCardOrder> {
@@ -14,4 +18,14 @@ public interface IGiftCardOrderService extends IService<GiftCardOrder> {
     void cancelOrder(Long id);
 
     void processGiftCardPayment(WxPayOrderNotifyV3Result.DecryptNotifyResult result, TWxUser wxUser, GiftCardOrder cardOrder);
+
+    /**
+     * 查询PC端用户购物金明细
+     *
+     * @param page 分页参数
+     * @param dto 查询条件
+     * @return 用户购物金明细
+     */
+    UserShoppingFundsDetailVO getPcUserShoppingFundsDetail(Page<UserShoppingFundsDetailItemVO> page,
+                                                           UserShoppingFundsDetailQueryDTO dto);
 }

+ 68 - 1
nightFragrance-massage/src/main/java/com/ylx/giftCard/service/impl/GiftCardOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.ylx.giftCard.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
 import com.ylx.common.core.domain.model.WxLoginUser;
@@ -10,6 +11,10 @@ import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.giftCard.domain.GiftCard;
 import com.ylx.giftCard.domain.GiftCardOrder;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsSummaryVO;
 import com.ylx.giftCard.enums.GiftCardOrderStatusEnum;
 import com.ylx.giftCard.mapper.GiftCardOrderMapper;
 import com.ylx.giftCard.service.IGiftCardOrderService;
@@ -19,8 +24,10 @@ import com.ylx.massage.service.TJsService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.shopingfundsdetail.domain.vo.ShoppingFundsDetailAddDto;
 import com.ylx.shopingfundsdetail.enums.ShoppingFundsExpenseTypeEnum;
+import com.ylx.shopingfundsdetail.mapper.ShoppingFundsDetailMapper;
 import com.ylx.shopingfundsdetail.service.ShoppingFundsDetailService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -38,6 +45,11 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
     private TWxUserService wxUserService;
     @Resource
     private ShoppingFundsDetailService shoppingFundsDetailService;
+    @Resource
+    private ShoppingFundsDetailMapper shoppingFundsDetailMapper;
+
+    private static final int DETAIL_TYPE_PURCHASE = 0;
+    private static final int DETAIL_TYPE_EXPENSE = 1;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -139,6 +151,61 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
         shoppingFundsDetailService.addShoppingFundsDetail(dto);
     }
 
+    @Override
+    public UserShoppingFundsDetailVO getPcUserShoppingFundsDetail(Page<UserShoppingFundsDetailItemVO> page, UserShoppingFundsDetailQueryDTO dto) {
+        validateShoppingFundsDetailQuery(dto);
+        normalizeTimeRange(dto);
+
+        TWxUser user = wxUserService.getById(dto.getUserId());
+        if (ObjectUtil.isNull(user)) {
+            throw new IllegalArgumentException("用户不存在");
+        }
+
+        UserShoppingFundsSummaryVO summary;
+        Page<UserShoppingFundsDetailItemVO> detailPage;
+        // 支出
+        if (DETAIL_TYPE_EXPENSE == dto.getDetailType()) {
+            summary = shoppingFundsDetailMapper.selectPcExpenseShoppingFundsSummary(dto);
+            detailPage = shoppingFundsDetailMapper.selectPcExpenseShoppingFundsDetail(page, dto);
+        } else {
+            // 购买
+            summary = baseMapper.selectPcPurchaseShoppingFundsSummary(dto);
+            detailPage = baseMapper.selectPcPurchaseShoppingFundsDetail(page, dto);
+        }
+
+        UserShoppingFundsDetailVO vo = new UserShoppingFundsDetailVO();
+        vo.setShoppingFundsBalance(defaultAmount(user.getdBalance()));
+        vo.setTotalAmount(defaultAmount(summary == null ? null : summary.getTotalAmount()));
+        vo.setTotalCount(summary == null || summary.getTotalCount() == null ? 0L : summary.getTotalCount());
+        vo.setPage(detailPage);
+        return vo;
+    }
+
+    private void validateShoppingFundsDetailQuery(UserShoppingFundsDetailQueryDTO dto) {
+        if (dto == null || StringUtils.isBlank(dto.getUserId())) {
+            throw new IllegalArgumentException("userId不能为空");
+        }
+        if (dto.getDetailType() == null) {
+            dto.setDetailType(DETAIL_TYPE_PURCHASE);
+        }
+        if (dto.getDetailType() != DETAIL_TYPE_PURCHASE && dto.getDetailType() != DETAIL_TYPE_EXPENSE) {
+            throw new IllegalArgumentException("明细类型不正确");
+        }
+    }
+
+    private void normalizeTimeRange(UserShoppingFundsDetailQueryDTO dto) {
+        if (StringUtils.isNotBlank(dto.getStartTime()) && dto.getStartTime().trim().length() == 10) {
+            dto.setStartTime(dto.getStartTime().trim() + " 00:00:00");
+        }
+        if (StringUtils.isNotBlank(dto.getEndTime()) && dto.getEndTime().trim().length() == 10) {
+            dto.setEndTime(dto.getEndTime().trim() + " 23:59:59");
+        }
+    }
+
+    private BigDecimal defaultAmount(BigDecimal amount) {
+        return amount == null ? BigDecimal.ZERO : amount;
+    }
+
     /**
      * 生成唯一订单号
      */
@@ -205,4 +272,4 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
 
         order.setCommissionAmount(commissionAmount);
     }
-}
+}

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -424,7 +424,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         }
         Integer currentAuditStatus = existsMerchant.getAuditStatus();
         if (currentAuditStatus == null || (currentAuditStatus != AUDIT_WAIT_ENTER)) {
-            throw new ServiceException("当前商户状态不能审核");
+            throw new ServiceException("当前商户待入驻已审核,不用重复审核");
         }
 
         MaTechnician maTechnician = new MaTechnician();

+ 23 - 1
nightFragrance-massage/src/main/java/com/ylx/shopingfundsdetail/mapper/ShoppingFundsDetailMapper.java

@@ -2,6 +2,9 @@ package com.ylx.shopingfundsdetail.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsSummaryVO;
 import com.ylx.shopingfundsdetail.domain.ShoppingFundsDetail;
 import com.ylx.shopingfundsdetail.domain.dto.ShoppingFundsDetailQueryDto;
 import com.ylx.shopingfundsdetail.domain.vo.ShoppingFundsDetailQueryVo;
@@ -16,4 +19,23 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface ShoppingFundsDetailMapper extends BaseMapper<ShoppingFundsDetail> {
     Page<ShoppingFundsDetailQueryVo> queryShoppingFundsDetail(@Param("dto")  ShoppingFundsDetailQueryDto shoppingFundsDetailQueryDto, @Param("page") Page<ShoppingFundsDetailQueryVo> page);
-}
+
+    /**
+     * 查询PC端用户购物金支出明细
+     *
+     * @param page 分页参数
+     * @param dto 查询条件
+     * @return 购物金支出明细
+     */
+    Page<UserShoppingFundsDetailItemVO> selectPcExpenseShoppingFundsDetail(
+            Page<UserShoppingFundsDetailItemVO> page,
+            @Param("dto") UserShoppingFundsDetailQueryDTO dto);
+
+    /**
+     * 查询PC端用户购物金支出汇总
+     *
+     * @param dto 查询条件
+     * @return 购物金支出汇总
+     */
+    UserShoppingFundsSummaryVO selectPcExpenseShoppingFundsSummary(@Param("dto") UserShoppingFundsDetailQueryDTO dto);
+}

+ 39 - 1
nightFragrance-massage/src/main/resources/mapper/giftCard/GiftCardOrderMapper.xml

@@ -4,4 +4,42 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ylx.giftCard.mapper.GiftCardOrderMapper">
 
-</mapper>
+    <select id="selectPcPurchaseShoppingFundsDetail" resultType="com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO">
+        SELECT
+            gco.order_no AS orderNo,
+            gco.gift_card_name AS giftCardName,
+            gco.pay_amount AS orderAmount,
+            gco.create_time AS orderTime
+        FROM gift_card_order gco
+        <where>
+            gco.user_id = #{dto.userId}
+            AND gco.status = 1
+            <if test="dto.startTime != null and dto.startTime != ''">
+                AND gco.create_time &gt;= #{dto.startTime}
+            </if>
+            <if test="dto.endTime != null and dto.endTime != ''">
+                AND gco.create_time &lt;= #{dto.endTime}
+            </if>
+        </where>
+        ORDER BY
+            gco.create_time DESC
+    </select>
+
+    <select id="selectPcPurchaseShoppingFundsSummary" resultType="com.ylx.giftCard.domain.vo.UserShoppingFundsSummaryVO">
+        SELECT
+            COALESCE(SUM(gco.pay_amount), 0) AS totalAmount,
+            COUNT(1) AS totalCount
+        FROM gift_card_order gco
+        <where>
+            gco.user_id = #{dto.userId}
+            AND gco.status = 1
+            <if test="dto.startTime != null and dto.startTime != ''">
+                AND gco.create_time &gt;= #{dto.startTime}
+            </if>
+            <if test="dto.endTime != null and dto.endTime != ''">
+                AND gco.create_time &lt;= #{dto.endTime}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 39 - 1
nightFragrance-massage/src/main/resources/mapper/giftCard/ShoppingFundsDetailMapper.xml

@@ -27,4 +27,42 @@
             and DATE_FORMAT(d.create_time, '%Y-%m-%d') &lt;= #{dto.endTime}
         </if>
     </select>
-</mapper>
+
+    <select id="selectPcExpenseShoppingFundsDetail" resultType="com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO">
+        SELECT
+            d.order_no AS orderNo,
+            NULL AS giftCardName,
+            -d.amount AS orderAmount,
+            d.create_time AS orderTime
+        FROM t_shopping_funds_detail d
+        <where>
+            d.user_id = #{dto.userId}
+            AND d.expense_type = 1
+            <if test="dto.startTime != null and dto.startTime != ''">
+                AND d.create_time &gt;= #{dto.startTime}
+            </if>
+            <if test="dto.endTime != null and dto.endTime != ''">
+                AND d.create_time &lt;= #{dto.endTime}
+            </if>
+        </where>
+        ORDER BY
+            d.create_time DESC
+    </select>
+
+    <select id="selectPcExpenseShoppingFundsSummary" resultType="com.ylx.giftCard.domain.vo.UserShoppingFundsSummaryVO">
+        SELECT
+            COALESCE(SUM(d.amount), 0) AS totalAmount,
+            COUNT(1) AS totalCount
+        FROM t_shopping_funds_detail d
+        <where>
+            d.user_id = #{dto.userId}
+            AND d.expense_type = 1
+            <if test="dto.startTime != null and dto.startTime != ''">
+                AND d.create_time &gt;= #{dto.startTime}
+            </if>
+            <if test="dto.endTime != null and dto.endTime != ''">
+                AND d.create_time &lt;= #{dto.endTime}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 36 - 0
nightFragrance-massage/src/test/java/com/ylx/giftCard/mapper/GiftCardOrderMapperXmlTest.java

@@ -0,0 +1,36 @@
+package com.ylx.giftCard.mapper;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class GiftCardOrderMapperXmlTest {
+
+    @Test
+    public void pcPurchaseShoppingFundsSqlFiltersByUserStatusTimeAndSortsByCreateTimeDesc() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("selectPcPurchaseShoppingFundsDetail"));
+        assertTrue(xml.contains("selectPcPurchaseShoppingFundsSummary"));
+        assertTrue(xml.contains("gco.user_id = #{dto.userId}"));
+        assertTrue(xml.contains("gco.status = 1"));
+        assertTrue(xml.contains("gco.create_time &gt;= #{dto.startTime}"));
+        assertTrue(xml.contains("gco.create_time &lt;= #{dto.endTime}"));
+        assertTrue(xml.contains("ORDER BY"));
+        assertTrue(xml.contains("gco.create_time DESC"));
+    }
+
+    private String readMapperXml() throws Exception {
+        try (InputStream inputStream = getClass().getClassLoader()
+                .getResourceAsStream("mapper/giftCard/GiftCardOrderMapper.xml")) {
+            assertNotNull(inputStream, "GiftCardOrderMapper.xml should exist in test classpath");
+            byte[] bytes = new byte[inputStream.available()];
+            inputStream.read(bytes);
+            return new String(bytes, StandardCharsets.UTF_8);
+        }
+    }
+}

+ 25 - 0
nightFragrance-massage/src/test/java/com/ylx/giftCard/service/impl/GiftCardOrderServiceImplTest.java

@@ -0,0 +1,25 @@
+package com.ylx.giftCard.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.giftCard.domain.dto.UserShoppingFundsDetailQueryDTO;
+import com.ylx.giftCard.domain.vo.UserShoppingFundsDetailItemVO;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class GiftCardOrderServiceImplTest {
+
+    @Test
+    public void pcShoppingFundsDetailRejectsBlankUserId() {
+        GiftCardOrderServiceImpl service = new GiftCardOrderServiceImpl();
+        UserShoppingFundsDetailQueryDTO query = new UserShoppingFundsDetailQueryDTO();
+        query.setUserId(" ");
+        query.setDetailType(0);
+
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+                () -> service.getPcUserShoppingFundsDetail(new Page<UserShoppingFundsDetailItemVO>(), query));
+
+        assertEquals("userId不能为空", exception.getMessage());
+    }
+}

+ 36 - 0
nightFragrance-massage/src/test/java/com/ylx/shopingfundsdetail/mapper/ShoppingFundsDetailMapperXmlTest.java

@@ -0,0 +1,36 @@
+package com.ylx.shopingfundsdetail.mapper;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class ShoppingFundsDetailMapperXmlTest {
+
+    @Test
+    public void pcExpenseShoppingFundsSqlFiltersByUserExpenseTypeTimeAndSortsByCreateTimeDesc() throws Exception {
+        String xml = readMapperXml();
+
+        assertTrue(xml.contains("selectPcExpenseShoppingFundsDetail"));
+        assertTrue(xml.contains("selectPcExpenseShoppingFundsSummary"));
+        assertTrue(xml.contains("d.user_id = #{dto.userId}"));
+        assertTrue(xml.contains("d.expense_type = 1"));
+        assertTrue(xml.contains("d.create_time &gt;= #{dto.startTime}"));
+        assertTrue(xml.contains("d.create_time &lt;= #{dto.endTime}"));
+        assertTrue(xml.contains("ORDER BY"));
+        assertTrue(xml.contains("d.create_time DESC"));
+    }
+
+    private String readMapperXml() throws Exception {
+        try (InputStream inputStream = getClass().getClassLoader()
+                .getResourceAsStream("mapper/giftCard/ShoppingFundsDetailMapper.xml")) {
+            assertNotNull(inputStream, "ShoppingFundsDetailMapper.xml should exist in test classpath");
+            byte[] bytes = new byte[inputStream.available()];
+            inputStream.read(bytes);
+            return new String(bytes, StandardCharsets.UTF_8);
+        }
+    }
+}