Quellcode durchsuchen

Merge remote-tracking branch 'origin/store-plantform' into store-plantform

wxd vor 1 Monat
Ursprung
Commit
7ff8cef88c

+ 30 - 0
alien-entity/src/main/java/shop/alien/entity/storePlatform/vo/LifeCouponPlatformDto.java

@@ -0,0 +1,30 @@
+package shop.alien.entity.storePlatform.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.LifeCoupon;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 优惠券
+ */
+@Data
+@JsonInclude
+public class LifeCouponPlatformDto extends LifeCoupon {
+
+    // 分组名称
+    @ApiModelProperty(value = "分组名称")
+    private String reviewType;
+
+    // 状态名称
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "销量")
+    private String saleNum;
+}

+ 3 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserOrderMapper.java

@@ -108,4 +108,7 @@ public interface LifeUserOrderMapper extends BaseMapper<LifeUserOrder> {
             "left join life_discount_coupon ldc on ldc.id = ldcu.coupon_id \n" +
             "${ew.customSqlSegment}")
     IPage<LifeUserOrderVo> queryPlatformOrderList(IPage<LifeUserOrderVo> brandedPage,@Param(Constants.WRAPPER) QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper);
+
+    @Select("SELECT count( luo.id ) FROM life_user_order luo LEFT JOIN order_coupon_middle ocm ON luo.id = ocm.order_id WHERE luo.`status` IN ( 0, 1, 2, 7 ) AND luo.delete_flag = 0 AND luo.coupon_type = 1 AND ocm.coupon_id = #{groupId}")
+    Integer countCouponByCouponId(@Param("groupId") String groupId);
 }

+ 139 - 38
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/LifeCouponPlatformController.java

@@ -5,19 +5,27 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.EssentialHolidayComparison;
 import shop.alien.entity.store.LifeCoupon;
+import shop.alien.entity.store.StoreGroupInfo;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
+import shop.alien.entity.storePlatform.vo.LifeCouponPlatformDto;
 import shop.alien.storeplatform.service.LifeCouponPlatformService;
 
 import java.util.Map;
 
 /**
- * 优惠券
+ * 优惠券管理控制器(平台端)
+ * 提供优惠券相关的管理接口,包括优惠券的创建、更新、删除、查询、核销等功能
+ * 支持优惠券库存管理、状态管理、节假日配置等操作
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
  */
-@Api(tags = {"商家端-优惠券"})
+@Api(tags = {"商家端-代金券"})
 @Slf4j
 @CrossOrigin
 @RestController
@@ -27,6 +35,15 @@ public class LifeCouponPlatformController {
 
     private final LifeCouponPlatformService lifeCouponService;
 
+    /**
+     * 新建或更新代金券
+     * 根据代金券是否存在ID判断是新增还是更新操作
+     *
+     * @param lifeCoupon 代金券对象
+     * @return R<LifeCoupon> 保存后的代金券信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("新建代金券")
     @PostMapping("/addOrUpdateCoupon")
     public R<LifeCoupon> addOrUpdateCoupon(@RequestBody LifeCoupon lifeCoupon) {
@@ -36,10 +53,13 @@ public class LifeCouponPlatformController {
 
     /**
      * 修改库存数量
+     * 更新指定优惠券的库存数量
      *
-     * @param id        主键
+     * @param id 优惠券ID
      * @param singleQty 库存数量
-     * @return boolean
+     * @return R<Boolean> 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("修改库存数量")
     @GetMapping("/updateCouponSingleQty")
@@ -51,14 +71,67 @@ public class LifeCouponPlatformController {
         return R.fail("失败");
     }
 
+    /**
+     * 删除代金券
+     * 根据优惠券ID删除代金券信息
+     *
+     * @param id 优惠券ID
+     * @return R<Boolean> 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    @ApiOperation("删除代金券")
+    @GetMapping("/deleteCoupon")
+    public R<Boolean> deleteCoupon(@RequestParam("id") Integer id) {
+        log.info("LifeCouponController.updateCouponSingleQty?id={}", id);
+        if (lifeCouponService.deleteCoupon(id)) {
+            return R.success("成功");
+        }
+        return R.fail("失败");
+    }
+
+    /**
+     * 分页查询代金券列表
+     * 支持按门店、状态、名称、数据类型、审核状态等条件筛选
+     *
+     * @param pageNum 页码
+     * @param pageSize 每页数量
+     * @param storeId 门店ID
+     * @param status 状态
+     * @param name 优惠券名称
+     * @param reviewType 审核状态
+     * @param dataType 数据类型(0:正式数据, 1:草稿数据)
+     * @return R<IPage<LifeCouponPlatformDto>> 分页代金券列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("代金劵列表")
-    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = false), @ApiImplicitParam(name = "name", value = "名称", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "dataType", value = "数据类型: 0:正式数据, 1:草稿数据", dataType = "Integer", paramType = "query", defaultValue = "0")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = false), @ApiImplicitParam(name = "name", value = "名称", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "dataType", value = "数据类型: 0:正式数据, 1:草稿数据", dataType = "Integer", paramType = "query", defaultValue = "0")})
     @GetMapping("/getCouponList")
-    private R<IPage<LifeCoupon>> getCouponList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam("storeId") String storeId, @RequestParam("status") String status, @RequestParam(value = "name", required = false) String name, @RequestParam(value = "dataType", defaultValue = "0") Integer dataType) {
-        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={},name={},dataType={}", page, size, storeId, status, name, dataType);
-        return R.data(lifeCouponService.getCouponList(page, size, storeId, status, name, dataType));
+    private R<IPage<LifeCouponPlatformDto>> getCouponList(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                          @RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
+                                                          @RequestParam("storeId") String storeId,
+                                                          @RequestParam("status") String status,
+                                                          @RequestParam(value = "name", required = false) String name,
+                                                          @RequestParam(value = "reviewType", required = false) String reviewType,
+                                                          @RequestParam(value = "dataType", defaultValue = "0") Integer dataType) {
+        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={},name={},dataType={}", pageNum, pageSize, storeId, status, name, dataType);
+        if (StringUtils.isBlank(storeId)) {
+            return R.data(null, "当前用户未入住!!!");
+        }
+        return R.data(lifeCouponService.getCouponList(pageNum, pageSize, storeId, status, name, dataType, reviewType));
     }
 
+    /**
+     * 暂停或恢复优惠券
+     * 修改优惠券的状态,实现上架、下架等操作
+     *
+     * @param id 优惠券ID
+     * @param status 状态值
+     * @return R<Boolean> 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("暂停恢复优惠券")
     @GetMapping("/updateCoupon")
     public R<Boolean> updateCoupon(@RequestParam("id") String id, @RequestParam("status") Integer status) {
@@ -69,6 +142,15 @@ public class LifeCouponPlatformController {
         return R.fail("失败");
     }
 
+    /**
+     * 查询优惠券详情
+     * 根据优惠券ID获取优惠券的详细信息
+     *
+     * @param id 优惠券ID
+     * @return R<LifeCoupon> 优惠券详情
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("优惠券详情")
     @GetMapping("/getCouponDetail")
     private R<LifeCoupon> getCouponDetail(@RequestParam("id") String id) {
@@ -78,37 +160,20 @@ public class LifeCouponPlatformController {
         return R.data(lifeCouponService.getOne(objectLambdaQueryWrapper));
     }
 
-    @ApiOperation("旧 核销订单")
-    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "quanCode", value = "券码", dataType = "Integer", paramType = "query", required = true)})
-    @GetMapping("/verify")
-    public R<Map<String, String>> verify(@RequestParam("storeId") String storeId, @RequestParam("quanCode") String quanCode) {
-        log.info("LifeCouponController.verify?storeId={},quanCode={}", storeId, quanCode);
-        return R.data(lifeCouponService.couponVerify(storeId, quanCode));
-    }
-
-    @ApiOperation("核销订单前效验")
-    @ApiImplicitParams(@ApiImplicitParam(name = "orderCode", value = "劵code", dataType = "String", paramType = "query", required = true))
-    @GetMapping("/orderVerify")
-    public R<String> orderVerify(@RequestParam("orderCode") String orderCode) {
-        log.info("LifeCouponController.orderVerify?orderCode={}", orderCode);
-        return lifeCouponService.orderVerify(orderCode);
-    }
-
-    @ApiOperation("获取优惠券状态")
-    @ApiOperationSupport(order = 1)
-    @GetMapping("/getCouponStatus")
-    @ApiImplicitParams({@ApiImplicitParam(name = "couponId", value = "优惠券id", dataType = "String", paramType = "query", required = true),})
-    public R<LifeCouponStatusVo> getCouponStatus(@RequestParam(value = "couponId") String couponId) {
-        log.info("LifeDiscountCouponController.getCouponStatus?couponId={}", couponId);
-        try {
-            LifeCouponStatusVo lifeCouponStatusVo = lifeCouponService.getCouponStatus(couponId);
-            return R.data(lifeCouponStatusVo);
-        } catch (Exception e) {
-            log.error("LifeDiscountCouponController.getCouponStatus ERROR Msg={}", e.getMessage());
-            return R.fail("查询失败");
-        }
-    }
 
+    /**
+     * 分页查询节假日列表
+     * 支持按年份、开关状态、节假日名称筛选
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param year 年份
+     * @param openFlag 是否启用(0:未启用,1:已启用)
+     * @param holidayName 节假日名称
+     * @return R<IPage<EssentialHolidayComparison>> 分页节假日列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("节假日列表")
     @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "year", value = "年份", dataType = "String", paramType = "query", required = false), @ApiImplicitParam(name = "openFlag", value = "是否启用(0:未启用,1:已启用)", dataType = "String", paramType = "query", required = false), @ApiImplicitParam(name = "holidayName", value = "节假日名称", dataType = "String", paramType = "query", required = false)})
     @GetMapping("/getHolidayList")
@@ -117,6 +182,15 @@ public class LifeCouponPlatformController {
         return R.data(lifeCouponService.getHolidayList(page, size, year, openFlag, holidayName));
     }
 
+    /**
+     * 保存节假日信息
+     * 新增或更新节假日配置
+     *
+     * @param essentialHolidayComparison 节假日对象
+     * @return R<Boolean> 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("保存节假日")
     @PostMapping("/saveHoliday")
     public R<Boolean> saveHoliday(@RequestBody EssentialHolidayComparison essentialHolidayComparison) {
@@ -127,6 +201,15 @@ public class LifeCouponPlatformController {
         return R.fail("失败");
     }
 
+    /**
+     * 删除节假日
+     * 根据ID删除指定的节假日配置
+     *
+     * @param id 节假日ID
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("删除节假日")
     @GetMapping("/delHoliday")
     private R delHoliday(@RequestParam("id") String id) {
@@ -137,6 +220,15 @@ public class LifeCouponPlatformController {
         return R.fail("失败");
     }
 
+    /**
+     * 启用或禁用节假日
+     * 切换指定节假日的开关状态
+     *
+     * @param id 节假日ID
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("启用禁用节假日")
     @GetMapping("/openCloseHoliday")
     private R openCloseHoliday(@RequestParam("id") String id) {
@@ -147,6 +239,15 @@ public class LifeCouponPlatformController {
         return R.fail("失败");
     }
 
+    /**
+     * 按年份删除节假日
+     * 删除指定年份的所有节假日配置
+     *
+     * @param year 年份
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @ApiOperation("按年份删除节假日")
     @GetMapping("/delHolidayByYear")
     private R delHolidayByYear(@RequestParam("year") String year) {

+ 57 - 30
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/LifeGroupBuyPlatformController.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeGroupBuyThali;
@@ -14,10 +15,15 @@ import shop.alien.entity.store.dto.LifeGroupBuyDto;
 import shop.alien.entity.store.vo.LifeGroupBuyThaliVo;
 import shop.alien.entity.storePlatform.vo.LifeGroupBuyPlatformDto;
 import shop.alien.storeplatform.service.LifeGroupBuyPlatformService;
+import shop.alien.util.string.StringUtil;
 
 /**
- * 团购
- * @date 2025-11-11
+ * 团购管理控制器(平台端)
+ * 提供团购相关的管理接口,包括团购的创建、查询、修改、删除等功能
+ * 支持草稿保存、状态管理、库存管理等操作
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
  */
 @Api(tags = {"商家端-团购"})
 @Slf4j
@@ -34,10 +40,12 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 保存套餐团购草稿
+     * 将团购信息保存为草稿状态,可后续编辑提交
      *
-     * @param lifeGroupBuyDto 套餐团购数据
-     * @return 操作结果
-     * @date 2025-11-11
+     * @param lifeGroupBuyDto 套餐团购数据传输对象
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("保存套餐团购草稿")
     @PostMapping("/saveDraft")
@@ -51,10 +59,12 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 保存套餐团购并返回套餐信息
+     * 保存套餐团购数据,并返回保存后的完整套餐信息
      *
-     * @param lifeGroupBuyDto 套餐团购数据
-     * @return 保存后的套餐详情
-     * @date 2025-11-11
+     * @param lifeGroupBuyDto 套餐团购数据传输对象
+     * @return R<LifeGroupBuyThali> 保存后的套餐详情
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("保存套餐团购(返回保存套餐)")
     @PostMapping("/saveThali")
@@ -66,15 +76,19 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 分页查询套餐团购列表
+     * 支持多条件筛选查询团购列表,包括状态、名称、类型等条件
      *
-     * @param pageNum      页码
-     * @param pageSize      每页数量
-     * @param storeId   门店编号
-     * @param status    状态
+     * @param pageNum 页码
+     * @param pageSize 每页数量
+     * @param storeId 门店ID
+     * @param status 状态(0草稿/1待审核/2未开始/3审核拒绝/4已售罄/5进行中/6已下架/7已结束/8=2+手动下架)
      * @param groupName 团购名称
      * @param groupType 团购类型
-     * @return 套餐团购分页信息
-     * @date 2025-11-11
+     * @param groupNo 团购编号
+     * @param reviewType 审核状态
+     * @return R<IPage<LifeGroupBuyThaliVo>> 套餐团购分页信息
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("套餐团购列表")
     @ApiImplicitParams({@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "Integer", paramType = "query", required = true),
@@ -95,16 +109,23 @@ public class LifeGroupBuyPlatformController {
                                                        @RequestParam(value = "groupNo", required = false) String groupNo,
                                                        @RequestParam(value = "reviewType", required = false) String reviewType) {
         log.info("LifeGroupBuyController.getThaliList?page={},size={},storeId={},status={},groupName={},groupType={},reviewType={},groupNo={}", pageNum, pageSize, storeId, status, groupName, groupType, reviewType, groupNo);
+
+        if (StringUtils.isBlank(storeId)) {
+            return R.data(null ,"当前用户未入住");
+        }
+
         return R.data(lifeGroupBuyService.getThaliList(pageNum, pageSize, storeId, status, groupName, groupType, reviewType, groupNo));
     }
 
     /**
      * 根据编号查询套餐团购详情
+     * 根据团购ID查询团购的详细信息
      *
-     * @param id     团购编号
-     * @param userId 用户编号
-     * @return 团购详情
-     * @date 2025-11-11
+     * @param id 团购ID
+     * @param userId 用户ID
+     * @return R 团购详情信息
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("id查询套餐团购")
     @GetMapping("/getThaliById")
@@ -115,12 +136,14 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 更新团购状态
+     * 修改团购的状态,包括审核、上架、下架等操作
      *
-     * @param id                团购编号
-     * @param status            状态值
-     * @param approvalComments  审核意见
-     * @return 操作结果
-     * @date 2025-11-11
+     * @param id 团购ID
+     * @param status 状态值
+     * @param approvalComments 审核意见
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("修改团购状态")
     @GetMapping("/updateStatus")
@@ -134,11 +157,13 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 修改团购库存
+     * 更新团购的库存数量
      *
-     * @param id  团购编号
+     * @param id 团购ID
      * @param num 库存数量
-     * @return 操作结果
-     * @date 2025-11-11
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("修改团购库存")
     @GetMapping("/updateNum")
@@ -152,11 +177,13 @@ public class LifeGroupBuyPlatformController {
 
     /**
      * 删除套餐团购
+     * 根据团购ID和类型删除团购信息
      *
-     * @param id        团购编号
-     * @param groupType 团购类型
-     * @return 操作结果
-     * @date 2025-11-11
+     * @param id 团购ID
+     * @param groupType 团购类型(1美食)
+     * @return R 操作结果
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @ApiOperation("删除套餐团购")
     @ApiImplicitParams({

+ 103 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/LifeUserOrderPlatformController.java

@@ -0,0 +1,103 @@
+package shop.alien.storeplatform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LifeUserOrderVo;
+import shop.alien.storeplatform.service.LifeUserOrderPlatformService;
+
+/**
+ * 用户订单控制器
+ * 提供订单相关的接口服务,包括订单的创建、更新、删除、查询等功能
+ * 支持代金券和团购券类型的订单管理,以及订单退款等操作
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
+ */
+@Api(tags = {"商家端-订单"})
+@Slf4j
+@CrossOrigin
+@RestController
+@RequestMapping("/userOrderPlatform")
+@RequiredArgsConstructor
+public class LifeUserOrderPlatformController {
+
+    private final LifeUserOrderPlatformService lifeUserOrderService;
+
+    /**
+     * 查询订单列表
+     * 支持按用户、商户、订单类型、订单状态、时间范围等多条件分页查询订单
+     *
+     * @param page 当前页码
+     * @param size 每页数量
+     * @param userId 用户ID,可选
+     * @param storeId 商户ID,可选
+     * @param couponType 订单类型,-1:全部,1:代金券,2:团购
+     * @param orderStatus 订单状态,-1:全部,1:已支付/待使用,2:已完成,5:退款/售后
+     * @param name 订单名称,可选
+     * @param startTime 开始时间,可选
+     * @param endTime 结束时间,可选
+     * @return R<IPage<LifeUserOrderVo>> 返回分页订单列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    @ApiOperation("查询订单列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "当前页", required = true),
+            @ApiImplicitParam(name = "size", value = "每页数量", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户id", required = false),
+            @ApiImplicitParam(name = "storeId", value = "商户id", required = false),
+            @ApiImplicitParam(name = "couponType", value = "订单类型,-1,全部(可以不传),1,代金券;2,团购;", required = false),
+            @ApiImplicitParam(name = "orderStatus", value = "订单状态,-1,全部(可以不传);1,已支付/待使用;2,已完成;5,退款/售后", required = false),
+            @ApiImplicitParam(name = "name", value = "订单名称", required = false)
+    })
+    @GetMapping("/queryUserOrderList")
+    public R<IPage<LifeUserOrderVo>> queryUserOrderList(@RequestParam(value = "page", defaultValue = "1") Integer page,
+                                                        @RequestParam(value = "size", defaultValue = "10") Integer size,
+                                                        @RequestParam(required = false) String userId,
+                                                        @RequestParam(required = false) String storeId,
+                                                        @RequestParam(required = false, defaultValue = "-1") String couponType,
+                                                        @RequestParam(required = false, defaultValue = "-1") String orderStatus,
+                                                        @RequestParam(required = false) String name,
+                                                        @RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd 00:00:00") String startTime,
+                                                        @RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd 23:59:59") String endTime) {
+        log.info("userOrder.queryUserOrderList:page={}&size={}&userId={}&storeId={}&orderType={}&orderStatus={}&name={}&startTime={}&endTime={}", page, size, userId, storeId, couponType, orderStatus, name, startTime, endTime);
+        if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(storeId)) {
+            return R.fail("用户id和商户id不能同时为空");
+        }
+        return R.data(lifeUserOrderService.queryUserOrderList(page, size, userId, storeId, couponType, orderStatus, name, startTime, endTime));
+    }
+
+    /**
+     * 查询订单详情
+     * 根据订单ID查询订单的详细信息,包括商户信息、距离计算等
+     *
+     * @param orderId 订单ID
+     * @param longitude 经度,可选,用于计算距离
+     * @param latitude 纬度,可选,用于计算距离
+     * @return R 返回订单详情信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    @ApiOperation("查询订单详情")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({@ApiImplicitParam(name = "longitude", value = "经度", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "latitude", value = "纬度", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/queryUserOrderDetail")
+    public R queryUserOrderDetail(@RequestParam String orderId,
+                                  @RequestParam(value = "longitude", required = false) String longitude,
+                                  @RequestParam(value = "latitude", required = false) String latitude) {
+        log.info("userOrder.queryUserOrderDetail:orderId={}&longitude={}&latitude={}", orderId, longitude, latitude);
+        return lifeUserOrderService.queryUserOrderDetail(orderId, longitude, latitude);
+    }
+
+
+}
+

+ 105 - 15
alien-store-platform/src/main/java/shop/alien/storeplatform/service/LifeCouponPlatformService.java

@@ -6,53 +6,143 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.EssentialHolidayComparison;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
+import shop.alien.entity.storePlatform.vo.LifeCouponPlatformDto;
 
 import java.util.Map;
 
 /**
- * 优惠券
+ * 优惠券服务接口(平台端)
+ * 提供优惠券相关的业务操作接口,包括优惠券的创建、更新、删除、查询、核销等功能
+ * 支持优惠券库存管理、状态管理、节假日管理等操作
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
  */
 public interface LifeCouponPlatformService extends IService<LifeCoupon> {
 
+    /**
+     * 新增或更新优惠券
+     * 根据优惠券是否存在ID判断是新增还是更新操作
+     *
+     * @param lifeCoupon 优惠券对象
+     * @return LifeCoupon 保存后的优惠券信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     LifeCoupon addOrUpdateCoupon(LifeCoupon lifeCoupon);
 
     /**
      * 修改库存数量
+     * 更新指定优惠券的库存数量
      *
-     * @param id        主键
+     * @param id 优惠券ID
      * @param singleQty 库存数量
-     * @return boolean
+     * @return boolean 更新是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     boolean updateCouponSingleQty(Integer id, Integer singleQty);
 
-    IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType);
+    /**
+     * 删除优惠券
+     * 根据优惠券ID删除优惠券信息
+     *
+     * @param id 优惠券ID
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    boolean deleteCoupon(Integer id);
 
+    /**
+     * 分页查询优惠券列表
+     * 支持多条件筛选查询优惠券列表
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param storeId 商户ID
+     * @param status 状态
+     * @param name 优惠券名称
+     * @param dataType 数据类型
+     * @param reviewType 审核状态
+     * @return IPage<LifeCouponPlatformDto> 分页优惠券列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    IPage<LifeCouponPlatformDto> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType, String reviewType);
+
+    /**
+     * 更新优惠券状态
+     * 修改优惠券的状态,如上架、下架等
+     *
+     * @param id 优惠券ID
+     * @param status 状态值
+     * @return int 更新的记录数
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     int updateCoupon(String id, Integer status);
 
-    Map<String, String> couponVerify(String storeId, String quanCode);
 
-//    Map<String, String> newCouponVerify(String storeId, String quanCode);
 
     /**
-     * 获取代金券状态
+     * 分页查询节假日列表
+     * 支持按年份、开关状态、节假日名称筛选
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param year 年份
+     * @param openFlag 开关状态
+     * @param holidayName 节假日名称
+     * @return IPage<EssentialHolidayComparison> 分页节假日列表
+     * @author alien-cloud
+     * @date 2025-11-18
      */
-    public LifeCouponStatusVo getCouponStatus(String couponId);
-
     IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year, String openFlag, String holidayName);
 
+    /**
+     * 保存节假日信息
+     * 新增或更新节假日配置
+     *
+     * @param essentialHolidayComparison 节假日对象
+     * @return boolean 保存是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     boolean saveHoliday(EssentialHolidayComparison essentialHolidayComparison);
 
+    /**
+     * 删除节假日
+     * 根据ID删除指定的节假日配置
+     *
+     * @param id 节假日ID
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     boolean delHoliday(String id);
 
+    /**
+     * 按年份删除节假日
+     * 删除指定年份的所有节假日配置
+     *
+     * @param year 年份
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     boolean delHolidayByYear(String year);
 
-    boolean openCloseHoliday(String id);
-
     /**
-     * 核销订单前效验
-     * @param orderCode
-     * @return
+     * 开启或关闭节假日
+     * 切换指定节假日的开关状态
+     *
+     * @param id 节假日ID
+     * @return boolean 操作是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
      */
-    R<String> orderVerify(String orderCode);
+    boolean openCloseHoliday(String id);
+
 }
 

+ 52 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/LifeUserOrderPlatformService.java

@@ -0,0 +1,52 @@
+package shop.alien.storeplatform.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserOrder;
+import shop.alien.entity.store.vo.LifeUserOrderVo;
+
+/**
+ * 用户订单服务接口
+ * 定义订单相关的业务操作接口,包括订单的创建、更新、删除、查询、退款等功能
+ * 支持代金券和团购券两种类型的订单管理
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
+ */
+public interface LifeUserOrderPlatformService extends IService<LifeUserOrder> {
+
+    /**
+     * 查询用户订单列表
+     * 支持多条件分页查询订单列表
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param userId 用户ID
+     * @param storeId 商户ID
+     * @param couponType 订单类型
+     * @param orderStatus 订单状态
+     * @param name 店铺名称
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return IPage<LifeUserOrderVo> 分页订单列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    IPage<LifeUserOrderVo> queryUserOrderList(Integer page, Integer size, String userId, String storeId, String couponType, String orderStatus, String name, String startTime, String endTime);
+
+    /**
+     * 查询用户订单详情
+     * 根据订单ID查询订单的详细信息
+     *
+     * @param orderId 订单ID
+     * @param longitude 经度,用于计算距离
+     * @param latitude 纬度,用于计算距离
+     * @return R<LifeUserOrderVo> 订单详情信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    R<LifeUserOrderVo> queryUserOrderDetail(String orderId, String longitude, String latitude);
+
+}
+

+ 239 - 143
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/LifeCouponPlatformServiceImpl.java

@@ -16,6 +16,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.LifeDiscountCouponStoreFriendDto;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
+import shop.alien.entity.storePlatform.vo.LifeCouponPlatformDto;
 import shop.alien.mapper.*;
 import shop.alien.storeplatform.service.LifeCouponPlatformService;
 import shop.alien.util.common.UniqueRandomNumGenerator;
@@ -23,6 +24,7 @@ import shop.alien.util.common.constant.OrderStatusEnum;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.format.TextStyle;
@@ -30,11 +32,12 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- * 优惠券
+ * 优惠券服务实现类(平台端)
+ * 负责处理优惠券的创建、更新、删除、查询、核销等核心业务逻辑
+ * 支持优惠券库存管理、状态管理、节假日管理、订单核销验证等功能
  *
- * @author ssk
- * @version 1.0
- * @date 2024/12/23 15:08
+ * @author alien-cloud
+ * @date 2025-11-18
  */
 @Service
 @RequiredArgsConstructor
@@ -58,6 +61,16 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
 
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
 
+    /**
+     * 新增或更新优惠券
+     * 根据优惠券是否存在ID判断是新增还是更新操作
+     * 自动生成优惠券编码,设置优惠标签和状态
+     *
+     * @param lifeCoupon 优惠券对象
+     * @return LifeCoupon 保存后的优惠券信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public LifeCoupon addOrUpdateCoupon(LifeCoupon lifeCoupon) {
 
@@ -83,17 +96,6 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
             lifeCoupon.setDiscountTagName(String.join(",", businessTypeNames));
         }
 
-//        int status = 0;
-//        Date now = new Date();
-//        Date startDate = lifeCoupon.getStartDate();
-//        Date endDate = lifeCoupon.getEndDate();
-//        if (now.compareTo(startDate) >= 0 && now.compareTo(endDate) <= 0) {
-//            status = 1;
-//        } else if (now.compareTo(startDate) < 0) {
-//            status = 0;
-//        } else if (now.compareTo(endDate) >= 0) {
-//            status = 3;
-//        }
         lifeCoupon.setStatus(1);
         if (StringUtils.isEmpty(lifeCoupon.getId())) {
             lifeCoupon.setType(1);
@@ -107,10 +109,13 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
 
     /**
      * 修改库存数量
+     * 更新指定优惠券的库存数量,当库存为0时增加库存会自动修改状态为进行中
      *
-     * @param id        主键
+     * @param id 优惠券ID
      * @param singleQty 库存数量
-     * @return boolean
+     * @return boolean 更新是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @Override
     public boolean updateCouponSingleQty(Integer id, Integer singleQty) {
@@ -136,14 +141,73 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         return true;
     }
 
+    /**
+     * 删除优惠券
+     * 通过设置删除标记实现软删除
+     *
+     * @param id 优惠券ID
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    @Override
+    public boolean deleteCoupon(Integer id) {
+        LambdaUpdateWrapper<LifeCoupon> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.eq(LifeCoupon :: getId, id);
+        lambdaUpdateWrapper.set(LifeCoupon :: getDeleteFlag, 1);
+        lifeCouponMapper.update(null, lambdaUpdateWrapper);
+        return true;
+    }
+
+    /**
+     * 分页查询优惠券列表
+     * 支持按门店、状态、名称、数据类型、审核状态等条件筛选
+     * 包含销量统计、状态转换等业务逻辑
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param storeId 门店ID
+     * @param status 状态
+     * @param name 优惠券名称
+     * @param dataType 数据类型(0:正式数据, 1:草稿数据)
+     * @param reviewType 审核状态
+     * @return IPage<LifeCouponPlatformDto> 分页优惠券列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
-    public IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType) {
+    public IPage<LifeCouponPlatformDto> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType, String reviewType) {
+
         LambdaUpdateWrapper<LifeCoupon> wrapper = new LambdaUpdateWrapper<>();
+        if (!StringUtils.isEmpty(reviewType)) {
+            switch (reviewType) {
+                case "0":
+                    wrapper.eq(LifeCoupon::getStatus, "1");
+                    break;
+                case "1":
+                    wrapper.in(LifeCoupon::getStatus, Arrays.asList("2", "4", "5", "6", "7", "8"));
+                    break;
+                case "2":
+                    wrapper.eq(LifeCoupon::getStatus, "3");
+                    break;
+                default:
+                    wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, status);
+                    break;
+            }
+        } else {
+            if (dataType == 1) {
+                wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, 1);
+            } else {
+                wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, status);
+            }
+
+        }
         wrapper.eq(storeId != null && !storeId.isEmpty(), LifeCoupon::getStoreId, storeId);
-        wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, status);
         wrapper.like(name != null && !name.isEmpty(), LifeCoupon::getName, name);
         wrapper.eq(LifeCoupon::getType, 1);
-        wrapper.eq(LifeCoupon::getDataType, dataType);
+        if ( dataType != 2 ){
+            wrapper.eq(LifeCoupon::getDataType, dataType);
+        }
 //        修改排序 按照status(0草稿/1待审核/2未开始/3审核拒绝/4已售罄/5进行中/6已下架/7已结束/8=2+手动下架)   审核拒绝>待审核>进行中>已售罄,已下架,已结束(同等优先级的情况下,按照审核时间的倒序显示)
         wrapper.last("ORDER BY CASE " +
                 "WHEN status = 3 THEN 0 " +  // 审核拒绝
@@ -152,10 +216,92 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
                 "WHEN status IN (4, 6, 7) THEN 3 " +  // 已售罄、已下架、已结束
                 "ELSE 4 END ASC, " +
                 "created_time DESC");
-        IPage<LifeCoupon> lifeCouponIPage = new Page<>(page, size);
-        return lifeCouponMapper.selectPage(lifeCouponIPage, wrapper);
+
+        IPage<LifeCoupon> lifeCouponIPag = lifeCouponMapper.selectPage(new Page<>(page, size), wrapper);
+
+        // 创建 LifeCouponPlatformDto 的分页对象
+        IPage<LifeCouponPlatformDto> dto = new Page<>(page, size);
+
+        // 将 lifeCouponIPag 中的数据复制到 dto 中
+        // 复制分页信息
+        dto.setPages(lifeCouponIPag.getPages());
+        dto.setCurrent(lifeCouponIPag.getCurrent());
+        dto.setSize(lifeCouponIPag.getSize());
+        dto.setTotal(lifeCouponIPag.getTotal());
+
+        // 复制记录列表,将 LifeCoupon 转换为 LifeCouponPlatformDto
+        List<LifeCouponPlatformDto> dtoRecords = lifeCouponIPag.getRecords().stream().map(coupon -> {
+            LifeCouponPlatformDto dtoRecord = new LifeCouponPlatformDto();
+            // 使用 BeanUtils 复制相同属性
+            org.springframework.beans.BeanUtils.copyProperties(coupon, dtoRecord);
+
+            if (dtoRecord.getDataType() == 1) {
+                dtoRecord.setSaleNum("");
+                dtoRecord.setSingleQty(null);
+            } else {
+                dtoRecord.setSaleNum(lifeUserOrderMapper.countCouponByCouponId(coupon.getId()).toString());
+            }
+
+
+            if (coupon.getStatus() == 1) {
+                dtoRecord.setReviewType("待审核");
+            } else if (coupon.getStatus() == 2 || coupon.getStatus() == 4 || coupon.getStatus() == 5 || coupon.getStatus() == 6 || coupon.getStatus() == 7 ) {
+                dtoRecord.setReviewType("审核通过");
+            } else if (coupon.getStatus() == 3) {
+                dtoRecord.setReviewType("审核拒绝");
+            }
+
+            if (Objects.nonNull(coupon.getStatus())) {
+                switch (coupon.getStatus()) {
+                    case 0:
+                        dtoRecord.setStatusName("草稿");
+                        break;
+                    case 1:
+                        dtoRecord.setStatusName("待审核");
+                        break;
+                    case 2:
+                        dtoRecord.setStatusName("未开始");
+                        break;
+                    case 3:
+                        dtoRecord.setStatusName("审核拒绝");
+                        break;
+                    case 4:
+                        dtoRecord.setStatusName("已售罄");
+                        break;
+                    case 5:
+                        dtoRecord.setStatusName("进行中");
+                        break;
+                    case 6:
+                        dtoRecord.setStatusName("已下架");
+                        break;
+                    case 7:
+                        dtoRecord.setStatusName("已结束");
+                        break;
+                    default:
+                        dtoRecord.setStatusName("未知状态");
+                        break;
+                }
+            }
+
+            return dtoRecord;
+        }).collect(Collectors.toList());
+
+        dto.setRecords(dtoRecords);
+
+        return dto;
     }
 
+    /**
+     * 更新优惠券状态
+     * 修改优惠券的状态,支持上架、下架等操作
+     * 自动判断优惠券是否已结束
+     *
+     * @param id 优惠券ID
+     * @param status 状态值
+     * @return int 更新的记录数
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public int updateCoupon(String id, Integer status) {
         LifeCoupon coupon = lifeCouponMapper.selectById(id);
@@ -172,114 +318,22 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         return lifeCouponMapper.updateById(lifeCoupon);
     }
 
-    /**
-     * 验券
-     *
-     * @param storeId
-     * @param quanCode
-     * @return
-     */
-    @Override
-    public Map<String, String> couponVerify(String storeId, String quanCode) {
-        LambdaUpdateWrapper<LifeUserOrder> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.eq(LifeUserOrder::getQuanCode, quanCode);
-        LifeUserOrder order = lifeUserOrderMapper.selectOne(wrapper);
-        Map<String, String> resultMap = new HashMap<>();
-        String errMessage = "";
-        if (order == null) {
-            errMessage = "没有这张券";
-        } else {
-            if (order.getStatus() == 5) {
-                errMessage = "该券已核销";
-            }
-            if (order.getStatus() == 6) {
-                errMessage = "该券已过期";
-            }
-            if (order.getStatus() == 7) {
-                errMessage = "该券待退款";
-            }
-            if (order.getStatus() == 4) {
-                errMessage = "该券已退款";
-            }
-            if (!order.getStoreId().equals(storeId)) {
-                errMessage = "核销商家与券不一致";
-            }
-        }
-        if (!StringUtils.isEmpty(errMessage)) {
-            resultMap.put("code", "false");
-            resultMap.put("message", errMessage);
-            return resultMap;
-        }
-
-        order.setStatus(5);
-        order.setUsedTime(new Date());
-        lifeUserOrderMapper.updateById(order);
-
-        LambdaUpdateWrapper<LifeCoupon> couponWrapper = new LambdaUpdateWrapper<>();
-        couponWrapper.eq(LifeCoupon::getId, order.getQuanId());
-        LifeCoupon coupon = lifeCouponMapper.selectOne(couponWrapper);
-        // TODO 抽成比例应该从商户里取
-        BigDecimal amounts = new BigDecimal(order.getFinalPrice()).multiply(new BigDecimal(100));
-        BigDecimal commission = amounts.multiply(new BigDecimal(0.04)).setScale(0, RoundingMode.HALF_UP);
-        BigDecimal money = amounts.subtract(commission);
-
-        // 插入收入明细表数据
-        StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
-        record.setStoreId(Integer.parseInt(storeId));
-        record.setUserOrderId(Integer.parseInt(order.getId()));
-        record.setIncomeType(coupon.getType());
-        record.setBusinessId(Integer.parseInt(order.getQuanId()));
-        record.setCommission(commission.intValue());
-        record.setMoney(money.intValue());
-        storeIncomeDetailsRecordMapper.insert(record);
-        // 店铺账户余额增加
-        UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
-        updateWrapper.eq("store_id", storeId);
-        updateWrapper.eq("delete_flag", 0);
-        updateWrapper.setSql("money = money + " + money);
-        storeUserMapper.update(null, updateWrapper);
-        //发放好友优惠券
-        LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
-        lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(order.getId()));
-//        lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
-        resultMap.put("code", "true");
-        resultMap.put("message", "核销成功");
-        return resultMap;
-    }
 
     /**
-     * <p>
-     * 获取代金券状态
-     * </p>
+     * 分页查询节假日列表
+     * 支持按年份、开关状态、节假日名称筛选
+     * 未指定年份时按年份分组查询,指定年份时查询该年份的详细节假日列表
      *
-     * @author zhangchen
-     * @since 2025-07-14
+     * @param page 页码
+     * @param size 每页数量
+     * @param year 年份
+     * @param openFlag 是否启用(0:未启用,1:已启用)
+     * @param holidayName 节假日名称
+     * @return IPage<EssentialHolidayComparison> 分页节假日列表
+     * @author alien-cloud
+     * @date 2025-11-18
      */
     @Override
-    public LifeCouponStatusVo getCouponStatus(String couponId) {
-        if (couponId == null || couponId.isEmpty()) {
-            log.error("获取代金券状态失败:couponId为空");
-            throw new IllegalArgumentException("couponId不能为空");
-        }
-        try {
-            LifeCoupon coupon = lifeCouponMapper.selectById(couponId);
-            LifeCouponStatusVo lifeCouponStatusVo = new LifeCouponStatusVo();
-            if (coupon != null) {
-                lifeCouponStatusVo.setCouponId(couponId);
-                lifeCouponStatusVo.setSingleQty(coupon.getSingleQty());
-                lifeCouponStatusVo.setBuyLimit(coupon.getBuyLimit());
-            } else {
-                // 可选:设置默认值或标记状态为无效
-                lifeCouponStatusVo.setSingleQty(0); // 或其他默认逻辑
-            }
-            return lifeCouponStatusVo;
-        } catch (Exception e) {
-            log.error("获取代金券状态失败: {}", e);
-            throw new RuntimeException("获取代金券状态失败", e); // 或者根据项目规范处理
-        }
-    }
-
-    @Override
     public IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year, String openFlag, String holidayName) {
         if (StringUtils.isEmpty(year)) {
             LambdaQueryWrapper<EssentialHolidayComparison> essentialHolidayComparisonLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -298,6 +352,15 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         }
     }
 
+    /**
+     * 保存节假日信息
+     * 新增或更新节假日配置,自动设置节假日日期
+     *
+     * @param essentialHolidayComparison 节假日对象
+     * @return boolean 保存是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public boolean saveHoliday(EssentialHolidayComparison essentialHolidayComparison) {
         if (ObjectUtils.isNotEmpty(essentialHolidayComparison.getId())) {
@@ -315,18 +378,45 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         }
     }
 
+    /**
+     * 删除节假日
+     * 根据ID删除指定的节假日配置(软删除)
+     *
+     * @param id 节假日ID
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public boolean delHoliday(String id) {
         essentialHolidayComparisonMapper.update(null, new LambdaUpdateWrapper<EssentialHolidayComparison>().eq(EssentialHolidayComparison::getId, id).set(EssentialHolidayComparison::getDelFlag, 1));
         return true;
     }
 
+    /**
+     * 按年份删除节假日
+     * 删除指定年份的所有节假日配置(软删除)
+     *
+     * @param year 年份
+     * @return boolean 删除是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public boolean delHolidayByYear(String year) {
         essentialHolidayComparisonMapper.update(null, new LambdaUpdateWrapper<EssentialHolidayComparison>().eq(EssentialHolidayComparison::getParticularYear, year).set(EssentialHolidayComparison::getDelFlag, 1));
         return true;
     }
 
+    /**
+     * 启用或禁用节假日
+     * 切换指定节假日的开关状态(0-未启用,1-已启用)
+     *
+     * @param id 节假日ID
+     * @return boolean 操作是否成功
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     @Override
     public boolean openCloseHoliday(String id) {
         EssentialHolidayComparison essentialHolidayComparison = essentialHolidayComparisonMapper.selectById(id);
@@ -339,26 +429,14 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
     }
 
     /**
-     * 核销订单前效验
+     * 判断当前日期是否在任意一个日期范围内
+     * 用于验证优惠券或团购券的自定义不可用日期
      *
-     * @param orderCode
-     * @return
+     * @param dateRanges 日期范围数组,格式为["yyyy-MM-dd,yyyy-MM-dd", ...]
+     * @return boolean 当前日期是否在任意范围内
+     * @author alien-cloud
+     * @date 2025-11-18
      */
-    @Override
-    public R<String> orderVerify(String orderCode) {
-        OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, orderCode));
-        if (!StringUtils.isEmpty(orderCouponMiddle) && orderCouponMiddle.getStatus() == 1) {
-            LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
-            //类型为:1 代金券订单
-            if (lifeUserOrder.getCouponType() == 1) {
-                return couponVerification(orderCouponMiddle);
-            } else if (lifeUserOrder.getCouponType() == 2) {//类型为:2 团购订单
-                return groupVerification(orderCouponMiddle);
-            }
-        }
-        return R.fail("该劵不是待使用状态");
-    }
-
     public static boolean isCurrentDateInAnyRange(String[] dateRanges) {
         // 获取当前日期
         LocalDate currentDate = LocalDate.now();
@@ -392,6 +470,15 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         return false;
     }
 
+    /**
+     * 团购券核销验证
+     * 验证团购券的有效期、不可用日期(星期、节日、自定义日期)等
+     *
+     * @param orderCouponMiddle 订单优惠券中间表对象
+     * @return R<String> 验证结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     public R<String> groupVerification(OrderCouponMiddle orderCouponMiddle) {
         LifeGroupBuyMain lifeGroupBuyMain = lifeGroupBuyMainMapper.selectOne(new LambdaQueryWrapper<LifeGroupBuyMain>().eq(LifeGroupBuyMain::getId, orderCouponMiddle.getCouponId()));
         //团购有效期类型为:0 指定天数
@@ -454,6 +541,15 @@ public class LifeCouponPlatformServiceImpl extends ServiceImpl<LifeCouponMapper,
         return R.success("效验通过");
     }
 
+    /**
+     * 代金券核销验证
+     * 验证代金券的有效期、不可用日期(星期、节日、自定义日期)、使用时间段、单次核销数量等
+     *
+     * @param orderCouponMiddle 订单优惠券中间表对象
+     * @return R<String> 验证结果
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
     public R<String> couponVerification(OrderCouponMiddle orderCouponMiddle) {
         LifeCoupon lifeCoupon = lifeCouponMapper.selectOne(new LambdaQueryWrapper<LifeCoupon>().eq(LifeCoupon::getId, orderCouponMiddle.getCouponId()));
         //代金券有效期类型为:1 指定天数

+ 196 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/LifeUserOrderPlatformServiceImpl.java

@@ -0,0 +1,196 @@
+package shop.alien.storeplatform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.*;
+import shop.alien.entity.store.vo.LifeUserOrderVo;
+import shop.alien.mapper.*;
+import shop.alien.util.common.constant.OrderStatusEnum;
+import shop.alien.storeplatform.service.LifeUserOrderPlatformService;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 用户订单服务实现类
+ * 负责处理订单的创建、更新、删除、查询、退款等核心业务逻辑
+ * 支持代金券和团购券两种类型的订单管理
+ *
+ * @author alien-cloud
+ * @date 2025-11-18
+ */
+@Service
+@RequiredArgsConstructor
+public class LifeUserOrderPlatformServiceImpl extends ServiceImpl<LifeUserOrderMapper, LifeUserOrder> implements LifeUserOrderPlatformService {
+
+    private final LifeUserOrderMapper lifeUserOrderMapper;
+
+
+    private final OrderCouponMiddleMapper orderCouponMiddleMapper;
+
+
+    /**
+     * 查询用户订单列表
+     * 支持多条件分页查询订单列表,包括用户、商户、订单类型、订单状态、时间范围等筛选条件
+     *
+     * @param page 页码
+     * @param size 每页数量
+     * @param userId 用户ID
+     * @param storeId 商户ID
+     * @param couponType 订单类型
+     * @param orderStatus 订单状态
+     * @param name 店铺名称
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return IPage<LifeUserOrderVo> 返回分页订单列表
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    public IPage<LifeUserOrderVo> queryUserOrderList(Integer page, Integer size, String userId, String storeId, String couponType, String orderStatus, String name, String startTime, String endTime) {
+        IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
+        QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(userId), "luo.user_id", userId);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(storeId), "luo.store_id", storeId);
+        lifeUserOrderQueryWrapper.eq(null != couponType && !"-1".equals(couponType), "luo.coupon_type", couponType);
+
+        // 提取SQL基础部分,避免重复定义
+        String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
+        // TODO 应该可以直接判断总表
+        if (!"-1".equals(orderStatus)) {
+            // 非-1状态:直接添加状态条件
+            String sql = baseSql + " and ocm1.status = " + orderStatus;
+            if ("2".equals(orderStatus)) {
+                // 已完成进行特殊处理,
+                sql = sql + " and ocm1.order_id not in (\n" +
+                        "\tselect\n" +
+                        "\tDISTINCT ocm2.order_id\n" +
+                        "from\n" +
+                        "\torder_coupon_middle ocm2\n" +
+                        "where\n" +
+                        "\t ocm2.status = 1\n" +
+                        "\t)";
+            }
+            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
+        } else {
+            // -1状态且storeId不为空时添加条件
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(storeId)) {
+                // 注意:原代码中的concat不会修改原字符串,需要重新赋值
+                String sql = baseSql + " and ocm1.status not in  (" + OrderStatusEnum.WAIT_PAY.getStatus()
+                        + "," + OrderStatusEnum.EXPIRE.getStatus()
+                        + "," + OrderStatusEnum.CANCEL.getStatus()
+                        + ")";
+                lifeUserOrderQueryWrapper.inSql("luo.id", sql);
+            }
+        }
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(name), "tc.coupon_name", name);
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(startTime), "luo.created_time", startTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(endTime), "luo.created_time", endTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.eq("luo.delete_flag", 0);
+        lifeUserOrderQueryWrapper.orderByDesc("luo.created_time");
+        lifeUserOrderQueryWrapper.groupBy("luo.coupon_type", "luo.id");
+        IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryUserOrderList(brandedPage, lifeUserOrderQueryWrapper);
+        if (!"-1".equals(orderStatus)) {
+            lifeUserOrderVoIPage.getRecords().forEach(x -> x.setStatus(Integer.parseInt(orderStatus)));
+        }
+        // 计算退款金额
+        for (LifeUserOrderVo record : lifeUserOrderVoIPage.getRecords()) {
+            record.setOrderCouponMiddleList(orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>().eq("order_id", record.getId())));
+            calcExpectIncome(record);
+            // 如果代金券为平台优惠券并且是商户查询,则需要计算代金券金额
+            if ("3".equals(record.getType()) && org.apache.commons.lang3.StringUtils.isNotBlank(record.getStoreId())) {
+                // 如果付款为0,商家收入为套餐原价
+                if (record.getFinalPrice().equals("0")) {
+                    // 如果付款为0,商家收入为套餐原价*数量
+                    record.setFinalPrice(new BigDecimal(record.getPrice()).multiply(new BigDecimal(record.getCouponCount().toString())).toString());
+                } else {
+                    record.setFinalPrice(record.getNominalValue().add(new BigDecimal(record.getFinalPrice())).toString());
+                }
+            }
+        }
+        return lifeUserOrderVoIPage;
+    }
+
+    /**
+     * 查询用户订单详情
+     * 根据订单ID查询订单的详细信息,包括预计收入计算等
+     *
+     * @param orderId 订单ID
+     * @param longitude 经度,用于计算距离
+     * @param latitude 纬度,用于计算距离
+     * @return R<LifeUserOrderVo> 返回订单详情信息
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    public R<LifeUserOrderVo> queryUserOrderDetail(String orderId, String longitude, String latitude) {
+        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId, org.apache.commons.lang3.StringUtils.isNotBlank(longitude) && org.apache.commons.lang3.StringUtils.isNotBlank(latitude) ? longitude + "," + latitude : "");
+        if (null == lifeUserOrderVo) {
+            log.error("queryUserOrderDetail未查询到订单");
+            return R.fail("未查询到订单");
+        }
+        calcExpectIncome(lifeUserOrderVo);
+        return R.data(lifeUserOrderVo);
+    }
+
+    /**
+     * 计算预计收入
+     * 根据订单信息、退款记录、佣金比例等计算商户的预计收入
+     *
+     * @param lifeUserOrderVo 订单VO对象
+     * @author alien-cloud
+     * @date 2025-11-18
+     */
+    private static void calcExpectIncome(LifeUserOrderVo lifeUserOrderVo) {
+        // 退款记录
+        List<OrderCouponMiddle> orderCouponMiddleList = lifeUserOrderVo.getOrderCouponMiddleList();
+        List<OrderCouponMiddle> refundList = orderCouponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).collect(Collectors.toList());
+        lifeUserOrderVo.setRefundList(refundList);
+        // 预计收入
+        // 退款金额
+        BigDecimal refundAmount = new BigDecimal(0);
+        if (!CollectionUtils.isEmpty(refundList)) {
+            refundAmount = refundList.stream().map(OrderCouponMiddle::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        }
+        // 预计收入
+        BigDecimal expectIncome = BigDecimal.ZERO;
+        // 如果使用了平台优惠券则预计收入特殊处理
+        if ("3".equals(lifeUserOrderVo.getType())) {
+            if (lifeUserOrderVo.getFinalPrice().equals("0")) {
+                // 如果付款为0,商家收入为套餐原价*数量
+                expectIncome = new BigDecimal(lifeUserOrderVo.getPrice()).multiply(new BigDecimal(orderCouponMiddleList.size()));
+            } else {
+                expectIncome = new BigDecimal(lifeUserOrderVo.getFinalPrice()).add(lifeUserOrderVo.getNominalValue());
+            }
+        } else {
+            expectIncome = new BigDecimal(lifeUserOrderVo.getFinalPrice());
+        }
+        expectIncome = expectIncome.subtract(refundAmount);
+        String commissionRateStr = lifeUserOrderVo.getCommissionRate();
+        BigDecimal commissionRate = BigDecimal.ZERO;
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(commissionRateStr)) {
+            try {
+                // 将字符串转换为 BigDecimal,并除以 100(转换为小数)
+                commissionRate = new BigDecimal(commissionRateStr)
+                        .divide(new BigDecimal("100"), 4, RoundingMode.DOWN);
+                // 保留 4 位小数,四舍五入(确保计算精度)
+            } catch (NumberFormatException e) {
+                // 处理非数字格式的异常(如 commissionRate 为空或非法字符)
+                e.printStackTrace();
+                // 可根据业务需求设置默认值或抛出提示
+            } catch (ArithmeticException e) {
+                // 处理除法异常(理论上除以 100 不会出现,此处为稳妥处理)
+                e.printStackTrace();
+            }
+        }
+        expectIncome = expectIncome.subtract(expectIncome.multiply(commissionRate)).setScale(2, RoundingMode.DOWN);
+        lifeUserOrderVo.setExpectIncome(expectIncome);
+    }
+}
+