Browse Source

Merge branch 'refs/heads/lyx_order_temporary'

# Conflicts:
#	alien-store/src/main/java/shop/alien/store/service/LifeCouponService.java
lyx 3 months ago
parent
commit
88f856d854

+ 19 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUserOrder.java

@@ -45,6 +45,25 @@ public class LifeUserOrder {
 
     private Date refundTime;
 
+    /**
+     * 购买类型(订单类型,1,代金券;2,团购订单)
+     */
+    private Integer couponType;
+
+
+    @ApiModelProperty(value = "取消时间")
+    @TableField("cancel_time")
+    private Date cancelTime;
+    /**
+     * 取消原因
+     */
+    @ApiModelProperty(value = "取消原因")
+    @TableField("cancel_reason")
+    private String cancelReason;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date finishTime;
+
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

+ 74 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeUserOrderVo.java

@@ -5,9 +5,11 @@ 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.OrderCouponMiddle;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 用户订单
@@ -59,6 +61,78 @@ public class LifeUserOrderVo {
 
     private Integer count;
 
+    private String storeName;
+
+    private Integer couponCount;
+
+    private Integer couponType;
+
+    private BigDecimal nominalValue;
+
+    private String imgUrl;
+
+    private String userName;
+
+    private String storeAddress;
+
+    /**
+     * 距离
+     */
+    private String dist;
+
+    @ApiModelProperty(value = "取消时间")
+    private Date cancelTime;
+
+    @ApiModelProperty(value = "取消原因")
+    private String cancelReason;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date finishTime;
+
+    @ApiModelProperty(value = "佣金比例")
+    private String commissionRate;
+
+    @ApiModelProperty(value = "订单优惠券中间表")
+    List<OrderCouponMiddle> orderCouponMiddleList;
+
+    @ApiModelProperty(value = "退款列表")
+    List<OrderCouponMiddle> refundList;
+
+    @ApiModelProperty(value = "预期收入")
+    private BigDecimal expectIncome;
+
+    @ApiModelProperty(value = "有效日期类型")
+    private Integer effectiveDateType;
+
+    @ApiModelProperty(value = "有效日期")
+    private Integer effectiveDateValue;
+
+    @ApiModelProperty(value = "使用规则")
+    private String useRules;
+
+    @ApiModelProperty(value = "适用人数")
+    private Integer applicableNum;
+
+    @ApiModelProperty(value = "优惠券额度类型")
+    private Integer quotaType;
+
+    @ApiModelProperty(value = "限购数量")
+    private BigDecimal quotaValue;
+
+    @ApiModelProperty(value = "预约规则")
+    private String reservationRules;
+
+    @ApiModelProperty(value = "营业时间类型")
+    private String businessType;
+    @ApiModelProperty(value = "营业日")
+    private String businessDate;
+    @ApiModelProperty(value = "营业开始时间")
+    private String startTime;
+    @ApiModelProperty(value = "营业结束时间")
+    private String endTime;
+
+
+
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

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

@@ -2,6 +2,7 @@ package shop.alien.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -25,4 +26,30 @@ public interface LifeUserOrderMapper extends BaseMapper<LifeUserOrder> {
 
     @Select("SELECT quan_id quanId, count(id) count FROM life_user_order ${ew.customSqlSegment}")
     List<LifeUserOrderVo> getQuanCount(@Param(Constants.WRAPPER) QueryWrapper<LifeUserOrderVo> queryWrapper);
+
+    LifeUserOrderVo queryUserOrderDetail(@Param("orderId") String orderId,@Param("position") String position);
+
+    @Select("with total_coupon as(\n" +
+            "-- 团购\n" +
+            "\tselect id coupon_id,2 coupon_type,lgbm.group_name coupon_name, SUBSTRING_INDEX(image_id, ',', 1) AS image_id,effective_date_type,effective_date_value \n" +
+            "from life_group_buy_main lgbm where lgbm.delete_flag = 0\n" +
+            "\tunion all\n" +
+            "-- 代金券\n" +
+            "\tselect id coupon_id,1 coupon_type,lc.name coupon_name, SUBSTRING_INDEX(image_path, ',', 1) AS image_id,0 effective_date_type,expiration_date effective_date_value \n" +
+            "from life_coupon lc where lc.delete_flag = 0\n" +
+            ")\n" +
+            "select luo.id,luo.buy_time,luo.status,luo.price,luo.final_price,luo.user_id,luo.store_id,luo.order_no,luo.pay_time,luo.cancel_time,luo.finish_time,\n" +
+            "si.store_name,si.commission_rate,\n" +
+            "count(ocm.coupon_code) coupon_count,\n" +
+            "simg.img_url,\n" +
+            "lu.user_phone,\n" +
+            "tc.*\n" +
+            "from life_user_order luo\n" +
+            "left join store_info si on si.id = luo.store_id and si.delete_flag = 0 -- 查询店铺相关 \n" +
+            "left join life_user lu on lu.id = luo.user_id and lu.delete_flag = 0 -- 查询用户相关 \n" +
+            "left join order_coupon_middle ocm on ocm.order_id = luo.id and ocm.delete_flag = 0\n" +
+            "inner join total_coupon tc on tc.coupon_id = ocm.coupon_id and tc.coupon_type = luo.coupon_type\n" +
+            "left join  store_img simg on simg.id = tc.image_id and simg.delete_flag = 0 \n" +
+            "${ew.customSqlSegment}")
+    IPage<LifeUserOrderVo> queryUserOrderList(IPage<LifeUserOrderVo> brandedPage,@Param(Constants.WRAPPER) QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper);
 }

+ 1 - 1
alien-entity/src/main/java/shop/alien/mapper/StoreIncomeDetailsRecordMapper.java

@@ -25,7 +25,7 @@ public interface StoreIncomeDetailsRecordMapper extends BaseMapper<StoreIncomeDe
             "join store_info store on store.id = income.store_id " +
             "left join life_user_order uorder on uorder.id = income.user_order_id " +
             "left join life_coupon coupon on coupon.id = uorder.quan_id " +
-            "left join life_refund_order lfo on coupon.id = lfo.order_id and lfo.status = 0 " +
+            "left join life_refund_order lfo on uorder.id = lfo.order_id and lfo.status = 0 " +
             "${ew.customSqlSegment}")
     List<StoreIncomeDetailsRecordVo> getIncomeList(@Param(Constants.WRAPPER) QueryWrapper<StoreIncomeDetailsRecordVo> wrapper);
 

+ 8 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeCouponController.java

@@ -86,6 +86,14 @@ public class LifeCouponController {
         return R.data(lifeCouponService.couponVerify(storeId, quanCode));
     }
 
+    @ApiOperation("核销订单前效验")
+    @ApiImplicitParams(@ApiImplicitParam(name = "orderId", value = "订单id", dataType = "Integer", paramType = "query", required = true))
+    @GetMapping("/orderVerify")
+    public R<String> orderVerify(@RequestParam("orderId") Integer orderId) {
+        log.info("LifeCouponController.orderVerify?orderId={}", orderId);
+        return lifeCouponService.orderVerify(orderId);
+    }
+
     @ApiOperation("获取优惠券状态")
     @ApiOperationSupport(order = 1)
     @GetMapping("/getCouponStatus")

+ 1 - 3
alien-store/src/main/java/shop/alien/store/controller/PlatformStoreCouponController.java

@@ -6,8 +6,6 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.LifeCoupon;
-import shop.alien.entity.store.LifeGroupBuyMain;
 import shop.alien.entity.store.vo.LifeCouponVo;
 import shop.alien.entity.store.vo.LifeGroupBuyMainVo;
 import shop.alien.store.service.PlatformStoreCouponService;
@@ -135,7 +133,7 @@ public class PlatformStoreCouponController {
     @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "status", value = "状态", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "comment", value = "审批意见", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "type", value = "代金券/套餐类型 0:代金券 1:套餐", dataType = "String", paramType = "query")})
+            @ApiImplicitParam(name = "type", value = "代金券/套餐类型 1:代金券 2:套餐", dataType = "String", paramType = "query")})
     @GetMapping("/approvalCoupon")
     public R<Integer> approvalCoupon(Integer id, Integer status, String comment, String type) {
         log.info("PlatformStoreCouponController.approvalCoupon?id={},status={},comment={}type={}", id, status, comment, type);

+ 7 - 6
alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java

@@ -9,7 +9,7 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreIncomeDetailsRecord;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 import shop.alien.store.service.StoreIncomeDetailsRecordService;
-import shop.alien.store.task.ScheduledTask;
+
 
 import java.util.Map;
 
@@ -30,7 +30,6 @@ public class StoreIncomeDetailsRecordController {
 
     private final StoreIncomeDetailsRecordService storeIncomeDetailsRecordService;
 
-    private final ScheduledTask scheduledTask;
 
     @ApiOperation("提现-提现全部/部分提现")
     @ApiOperationSupport(order = 1)
@@ -131,10 +130,12 @@ public class StoreIncomeDetailsRecordController {
         return R.data(storeIncomeDetailsRecordService.groupIncome(storeId, date, incomeType,page,size));
     }
 
-    //团购详情
 
-    @GetMapping("/autoTransferAccounts")
-    public void autoTransferAccounts() {
-        scheduledTask.autoTransferAccounts();
+    @ApiOperation("今日订单数")
+    @ApiOperationSupport(order = 7)
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/todayOrderCount")
+    public R<Integer> todayOrderCount(Integer storeId) {
+        return R.data(storeIncomeDetailsRecordService.todayOrderCount(storeId));
     }
 }

+ 5 - 1
alien-store/src/main/java/shop/alien/store/controller/UserOrderController.java

@@ -33,6 +33,7 @@ public class UserOrderController {
             @ApiImplicitParam(name = "quanName", value = "quanName", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "storeType", value = "storeType", dataType = "String", paramType = "query")})
     @GetMapping("/getOrderListByStatus")
+    @Deprecated
     public R<IPage<Map<String, Object>>> getOrderListByStatus(@RequestParam(value = "page", defaultValue = "1") Integer page,
                                                               @RequestParam(value = "size", defaultValue = "10") Integer size,
                                                               @RequestParam(required = false) String userId,
@@ -54,6 +55,7 @@ public class UserOrderController {
             @ApiImplicitParam(name = "jingdu", value = "jingdu", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "weidu", value = "weidu", dataType = "String", paramType = "query")})
     @GetMapping("/getOrderByOrderId")
+    @Deprecated
     public R<Map<String, Object>> getOrderByOrderId(@RequestParam(required = false) String orderId,
                                                     @RequestParam(required = false) String jingdu,
                                                     @RequestParam(required = false) String weidu) {
@@ -76,7 +78,8 @@ public class UserOrderController {
 
     @ApiOperation("订单是否可以退款")
     @ApiOperationSupport(order = 4)
-    @PostMapping("/refundCheck")
+    @PostMapping("/refundCfheck")
+    @Deprecated
     public R<Map<String, Object>> refundCheck(LifeRefundOrder refundOrder) {
         log.info("UserOrderController.refundCheck?refundOrder={}", refundOrder.toString());
         return R.data(userOrderService.refundCheck(refundOrder));
@@ -85,6 +88,7 @@ public class UserOrderController {
     @ApiOperation("订单退款")
     @ApiOperationSupport(order = 5)
     @PostMapping("/requestRefund")
+    @Deprecated
     public R<Map<String, Object>> requestRefund(LifeRefundOrder refundOrder) {
         log.info("UserOrderController.requestRefund?refundOrder={}", refundOrder.toString());
         return R.data(userOrderService.requestRefund(refundOrder));

+ 3 - 0
alien-store/src/main/java/shop/alien/store/controller/UserStoreController.java

@@ -69,6 +69,7 @@ public class UserStoreController {
             @ApiImplicitParam(name = "cnt", value = "cnt", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "payPrice", value = "payPrice", dataType = "String", paramType = "query")})
     @GetMapping("/buyQuanCheck")
+    @Deprecated
     public R<Map<String, Object>> buyQuanCheck(@RequestParam("quanId") String quanId,
                                                @RequestParam("userId") String userId,
                                                @RequestParam("cnt") int cnt,
@@ -82,6 +83,7 @@ public class UserStoreController {
     @ApiImplicitParams({@ApiImplicitParam(name = "payPrice", value = "payPrice", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "quanName", value = "quanName", dataType = "String", paramType = "query")})
     @GetMapping("/getOrderStrForPay")
+    @Deprecated
     public R<Map<String, Object>> getOrderStrForPay(@RequestParam("payPrice") String payPrice,
                                                     @RequestParam("quanName") String quanName) {
         log.info("LifeUserStoreController.getOrderStrForPay?payPrice={},quanName={}", payPrice, quanName);
@@ -106,6 +108,7 @@ public class UserStoreController {
             @ApiImplicitParam(name = "payPrice", value = "payPrice", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "orderNo", value = "orderNo", dataType = "String", paramType = "query")})
     @GetMapping("/buyQuan")
+    @Deprecated
     public R<Map<String, Object>> buyQuan(@RequestParam("quanId") String quanId,
                                           @RequestParam("couponId") String couponId,
                                           @RequestParam("userId") String userId,

+ 9 - 0
alien-store/src/main/java/shop/alien/store/service/LifeCouponService.java

@@ -3,6 +3,8 @@ package shop.alien.store.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springframework.web.bind.annotation.RequestParam;
+import shop.alien.entity.result.R;
+import org.springframework.web.bind.annotation.RequestParam;
 import shop.alien.entity.store.EssentialHolidayComparison;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
@@ -45,4 +47,11 @@ public interface LifeCouponService extends IService<LifeCoupon> {
     boolean delHolidayByYear(String year);
 
     boolean openCloseHoliday(String id);
+
+    /**
+     * 核销订单前效验
+     * @param orderId
+     * @return
+     */
+    R<String> orderVerify(Integer orderId);
 }

+ 413 - 3
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -3,20 +3,33 @@ package shop.alien.store.service;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.result.BusinessException;
+import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
+import shop.alien.entity.store.dto.LifeUserOrderDto;
 import shop.alien.entity.store.excelVo.LifeUserOrderExcelVo;
-import shop.alien.entity.store.excelVo.StoreInfoExcelVo;
 import shop.alien.entity.store.excelVo.util.ExcelGenerator;
+import shop.alien.entity.store.vo.LifeUserOrderVo;
 import shop.alien.entity.store.vo.StoreInfoVo;
 import shop.alien.mapper.*;
 import shop.alien.store.config.GaoDeMapUtil;
 import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.AlipayTradeRefund;
+import shop.alien.util.common.UniqueRandomNumGenerator;
+import shop.alien.util.common.constant.CouponStatusEnum;
+import shop.alien.util.common.constant.CouponTypeEnum;
+import shop.alien.util.common.constant.DiscountCouponEnum;
+import shop.alien.util.common.constant.OrderStatusEnum;
 
 import java.io.File;
 import java.io.IOException;
@@ -32,7 +45,7 @@ import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
-public class LifeUserOrderService {
+public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeUserOrder> {
 
     private final LifeUserOrderMapper lifeUserOrderMapper;
 
@@ -61,8 +74,12 @@ public class LifeUserOrderService {
     private final StoreImgMapper storeImgMapper;
 
     private final StoreUserMapper storeUserMapper;
+    private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
+    private final OrderCouponMiddleService orderCouponMiddleService;
 
     private final AliOSSUtil aliOSSUtil;
+    private final OrderCouponMiddleMapper orderCouponMiddleMapper;
+    private final LifeGroupBuyMainMapper lifeGroupBuyMainMapper;
 
     @Value("${spring.web.resources.excel-path}")
     private String excelPath;
@@ -434,7 +451,7 @@ public class LifeUserOrderService {
     public Map<String, Object> refundCheck(LifeRefundOrder refundOrder) {
         Map<String, Object> returnMap = new HashMap<>();
         LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
-        if (order.getStatus() != 0) {
+        if (order.getStatus() != 1) {
             returnMap.put("success", "不可退款");
             returnMap.put("reason", "当前订单状态不是待消费");
             return returnMap;
@@ -551,4 +568,397 @@ public class LifeUserOrderService {
         String filePath = ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", lifeUserOrderExcelVos, LifeUserOrderExcelVo.class);
         return aliOSSUtil.uploadFile(new File(filePath), "excel/" + fileName + ".xlsx");
     }
+
+    /**
+     * 创建用户订单
+     * @param lifeUserOrderDto 构造数据用
+     */
+    @Transactional
+    public Map<String, Object> createUserOrder(LifeUserOrderDto lifeUserOrderDto) {
+        Date date = new Date();
+        //1.创建订单
+        LifeUserOrder lifeUserOrder = new LifeUserOrder();
+        // 用户id
+        lifeUserOrder.setUserId(lifeUserOrderDto.getUserId());
+        // 店铺id
+        lifeUserOrder.setStoreId(lifeUserOrderDto.getStoreId());
+        // 订单号
+        lifeUserOrder.setOrderNo(lifeUserOrderDto.getOrderNo());
+        // 优惠券id
+        lifeUserOrder.setQuanId(lifeUserOrderDto.getYhquanId());
+        // 付款金额
+        lifeUserOrder.setPrice(lifeUserOrderDto.getPrice());
+        // 订单金额
+        lifeUserOrder.setFinalPrice(lifeUserOrderDto.getFinalPrice());
+        // 订单类型
+        lifeUserOrder.setCouponType(null == lifeUserOrderDto.getCouponType() ? 1 : lifeUserOrderDto.getCouponType());
+        // 订单状态
+        lifeUserOrder.setStatus(null == lifeUserOrderDto.getStatus() ? 0 : lifeUserOrderDto.getStatus());
+        // 购买时间
+        lifeUserOrder.setBuyTime(date);
+        this.saveOrUpdate(lifeUserOrder);
+        //2.判断是否使用优惠券
+        //查询优惠券信息
+        if (StringUtils.isNotEmpty(lifeUserOrderDto.getYhquanId())) {
+            LifeDiscountCouponUser lifeDiscountCouponUser = lifeDiscountCouponUserMapper.selectById(lifeUserOrderDto.getYhquanId());
+            //将优惠券状态变更为已使用
+            lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.HAVE_BEEN_USED.getValue()));
+            //将优惠券使用时间存入
+            lifeDiscountCouponUser.setUseTime(date);
+            lifeDiscountCouponUserMapper.updateById(lifeDiscountCouponUser);
+        }
+        //3.根据购买数量增加中间关系 订单id+券编号 确定一条数据
+        BigDecimal sumPrice = new BigDecimal(0);
+        for (int i = 0; i < lifeUserOrderDto.getCount(); i++) {
+            String code = UniqueRandomNumGenerator.generateUniqueCode(12);
+            OrderCouponMiddle orderCouponMiddle = new OrderCouponMiddle();
+            // 订单id
+            orderCouponMiddle.setOrderId(lifeUserOrder.getId());
+            // 团购/代金券id
+            orderCouponMiddle.setCouponId(lifeUserOrderDto.getCouponId());
+            // 团购/代金券 code
+            orderCouponMiddle.setCouponCode(code);
+            // 团购/代金券价格
+            if(i == lifeUserOrderDto.getCount() - 1){
+                orderCouponMiddle.setPrice(new BigDecimal(lifeUserOrderDto.getFinalPrice()).subtract(sumPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
+            } else {
+                BigDecimal divide = new BigDecimal(lifeUserOrderDto.getFinalPrice()).divide(new BigDecimal(lifeUserOrderDto.getCount()), 2, BigDecimal.ROUND_HALF_UP);
+                orderCouponMiddle.setPrice(divide);
+                sumPrice = sumPrice.add(divide);
+            }
+            // 订单状态
+            orderCouponMiddle.setStatus(0);
+            orderCouponMiddleService.save(orderCouponMiddle);
+            // 使用时间
+            // 退款时间
+            // 删除标记
+        }
+        //4. 代金券/团购库存扣除 coupon_type 1 代金券 2团购
+        int successful = 0;
+        if(lifeUserOrderDto.getCouponType() == 2){
+            // 团购库存扣除
+            successful = lifeGroupBuyMainMapper.update(null, new UpdateWrapper<LifeGroupBuyMain>()
+                    .eq("id", lifeUserOrderDto.getCouponId()).setSql("inventory_num = inventory_num - " + lifeUserOrderDto.getCount()));
+        } else {
+            successful = lifeCouponMapper.update(null, new UpdateWrapper<LifeCoupon>()
+                    .eq("id", lifeUserOrderDto.getCouponId()).setSql("stock_qty = stock_qty - " + lifeUserOrderDto.getCount()));
+        }
+        if(successful == 0){
+            log.error("库存不足");
+            throw new BusinessException("库存不足");
+        }
+        Map<String, Object> returnMap = new HashMap<>();
+        returnMap.put("success", "下单成功");
+        returnMap.put("orderNo", lifeUserOrderDto.getOrderNo());
+        returnMap.put("lifeUserOrder", lifeUserOrder);
+        return returnMap;
+    }
+
+    /**
+     * 更新用户订单
+     *
+     * @param lifeUserOrderDto 构造数据用
+     */
+    @Transactional
+    public boolean updateUserOrder(LifeUserOrderDto lifeUserOrderDto) {
+        Date date = new Date();
+        LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(lifeUserOrderDto.getId());
+        if ( null == lifeUserOrder){
+            log.error("updateUserOrder未查询到订单");
+            return false;
+        }
+        UpdateWrapper<OrderCouponMiddle> orderCouponMiddleUpdateWrapper = new UpdateWrapper<>();
+        orderCouponMiddleUpdateWrapper.eq("order_id",lifeUserOrderDto.getId());
+        // 根据状态判断怎么更新数据 目前只进行已支付,已取消,已过期判断
+        // TODO 后续再进行已核销和已退款判断 ()
+        switch (lifeUserOrderDto.getStatus()){
+            case 1:
+                lifeUserOrder.setPayTime(date);
+                lifeUserOrder.setPayMethod(lifeUserOrderDto.getPayMethod());
+            case 3:
+            case 4:
+                lifeUserOrder.setStatus(lifeUserOrderDto.getStatus());
+                orderCouponMiddleUpdateWrapper.set("status",lifeUserOrderDto.getStatus());
+                break;
+        }
+
+        return this.saveOrUpdate(lifeUserOrder) && orderCouponMiddleService.update(orderCouponMiddleUpdateWrapper);
+    }
+
+    /**
+     * 删除用户订单,删除需要判断订单状态并且删除中间关系
+     * @param orderId 订单id
+     */
+    @Transactional
+    public boolean deleteUserOrder(String orderId) {
+        LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(orderId);
+        if ( null == lifeUserOrder){
+            log.error("deleteUserOrder未查询到订单");
+            return false;
+        }
+        // 判断订单状态
+        // 已核销才可以删除
+        if (lifeUserOrder.getStatus() != 2) {
+            log.error("deleteUserOrder订单状态错误,订单已核销才可以删除");
+            return false;
+        }
+        // 删除中间关系
+        UpdateWrapper<OrderCouponMiddle> orderCouponMiddleUpdateWrapper = new UpdateWrapper<>();
+        orderCouponMiddleUpdateWrapper.eq("order_id",orderId);
+        return this.removeById(orderId) && orderCouponMiddleService.remove(orderCouponMiddleUpdateWrapper);
+    }
+
+    /**
+     * 查询用户订单列表
+     * @param page 页码
+     * @param size 每页数量
+     * @param userId 用户id
+     * @param couponType 订单类型
+     * @param name 店铺名称
+     */
+    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";
+
+        if (!"-1".equals(orderStatus)) {
+            // 非-1状态:直接添加状态条件
+            String sql = baseSql + " and ocm1.status = " + orderStatus;
+            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
+        } else {
+            // -1状态且storeId不为空时添加条件
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(storeId)) {
+                // 注意:原代码中的concat不会修改原字符串,需要重新赋值
+                String sql = baseSql + " and ocm1.status != 0";
+                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.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);
+        }
+        return lifeUserOrderVoIPage;
+    }
+
+    /**
+     * 查询用户订单详情
+     * @param orderId
+     * @return
+     */
+    public R<LifeUserOrderVo> queryUserOrderDetail(String orderId,String longitude, String latitude) {
+        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId,longitude+","+latitude);
+        if ( null == lifeUserOrderVo){
+            log.error("queryUserOrderDetail未查询到订单");
+            return R.fail("未查询到订单");
+        }
+        calcExpectIncome(lifeUserOrderVo);
+        return R.data(lifeUserOrderVo);
+    }
+
+    private static void calcExpectIncome(LifeUserOrderVo lifeUserOrderVo) {
+        // 退款记录
+        List<OrderCouponMiddle> orderCouponMiddleList = lifeUserOrderVo.getOrderCouponMiddleList();
+        List<OrderCouponMiddle> refundList = orderCouponMiddleList.stream().filter(x -> x.getStatus() == 5).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 = new BigDecimal(lifeUserOrderVo.getPrice()).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.HALF_UP);
+                // 保留 4 位小数,四舍五入(确保计算精度)
+            } catch (NumberFormatException e) {
+                // 处理非数字格式的异常(如 commissionRate 为空或非法字符)
+                e.printStackTrace();
+                // 可根据业务需求设置默认值或抛出提示
+            } catch (ArithmeticException e) {
+                // 处理除法异常(理论上除以 100 不会出现,此处为稳妥处理)
+                e.printStackTrace();
+            }
+        }
+        expectIncome = expectIncome.subtract(expectIncome.multiply(commissionRate)).setScale(2, RoundingMode.HALF_UP);
+        lifeUserOrderVo.setExpectIncome(expectIncome);
+    }
+
+    /**
+     * 平台端-查询订单列表
+     * @param page 页码
+     * @param size 每页数量
+     * @param orderNo 订单号
+     * @param orderStatus 订单状态
+     * @param couponName 优惠券名称
+     * @param couponType 优惠券类型
+     * @param storeName 店铺名称
+     * @param buyStartTime 购买时间开始
+     * @param buyEndTime 购买时间结束
+     * @param payStartTime 支付时间开始
+     * @param payEndTime 支付时间结束
+     * @param finishStartTime 完成时间开始
+     * @param finishEndTime 完成时间结束
+     */
+    public IPage<LifeUserOrderVo> queryOrderList(Integer page, Integer size, String orderNo, String orderStatus, String couponName, String couponType, String storeName, String buyStartTime, String buyEndTime, String payStartTime, String payEndTime, String finishStartTime, String finishEndTime) {
+        IPage<LifeUserOrderVo> brandedPage = new Page<>(page, size);
+        QueryWrapper<LifeUserOrderVo> lifeUserOrderQueryWrapper = new QueryWrapper<>();
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(orderNo),"luo.order_no",orderNo);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(couponName),"tc.coupon_name",couponName);
+        lifeUserOrderQueryWrapper.eq(org.apache.commons.lang3.StringUtils.isNotBlank(couponType),"tc.coupon_type",couponType);
+        lifeUserOrderQueryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(storeName),"si.store_name",storeName);
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(buyStartTime),"luo.buy_time",buyStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(buyEndTime),"luo.buy_time",buyEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(payStartTime),"luo.pay_time",payStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(payEndTime),"luo.pay_time",payEndTime + " 23:59:59");
+        lifeUserOrderQueryWrapper.gt(org.apache.commons.lang3.StringUtils.isNotBlank(finishStartTime),"luo.finish_time",finishStartTime + " 00:00:00");
+        lifeUserOrderQueryWrapper.lt(org.apache.commons.lang3.StringUtils.isNotBlank(finishEndTime),"luo.finish_time",finishEndTime + " 23:59:59");
+//            @ApiImplicitParam(name = "orderStatus", value = "订单状态,-1,全部(可以不传);0,待支付;1,已支付/待使用;2,已核销;3,已过期;4,已取消;5.已退款,全退款了才算", required = false),
+        // 提取SQL基础部分,避免重复定义
+//        String baseSql = "select DISTINCT ocm1.order_id from order_coupon_middle ocm1 where 1=1";
+
+        if (!"-1".equals(orderStatus)) {
+            // 非-1状态:直接添加状态条件
+//            String sql = baseSql + " and ocm1.status = " + orderStatus;
+//            lifeUserOrderQueryWrapper.inSql("luo.id", sql);
+            lifeUserOrderQueryWrapper.eq("ocm.status",orderStatus);
+        }
+        lifeUserOrderQueryWrapper.groupBy("tc.coupon_type","tc.coupon_id");
+        IPage<LifeUserOrderVo> lifeUserOrderVoIPage = lifeUserOrderMapper.queryUserOrderList(brandedPage, lifeUserOrderQueryWrapper);
+
+        if (!"-1".equals(orderStatus)) {
+            lifeUserOrderVoIPage.getRecords().forEach(x->x.setStatus(Integer.parseInt(orderStatus)));
+        }
+        return lifeUserOrderVoIPage;
+    }
+
+    /**
+     * 平台端-查询订单详情
+     * @param orderId
+     * @return
+     */
+    public R queryOrderDetail(String orderId) {
+        LifeUserOrderVo lifeUserOrderVo = lifeUserOrderMapper.queryUserOrderDetail(orderId,null);
+        if ( null == lifeUserOrderVo){
+            log.error("queryUserOrderDetail未查询到订单");
+            return R.fail("未查询到订单");
+        }
+        // 退款记录
+        calcExpectIncome(lifeUserOrderVo);
+        lifeUserOrderVo.setCouponCount(lifeUserOrderVo.getOrderCouponMiddleList().size());
+        return R.data(lifeUserOrderVo);
+    }
+    /**
+     * 团购/代金券-校验用户是否可以购买
+     * @param couponId 团购/代金券id
+     * @param couponType 团购/代金券类型
+     * @param userId 用户id
+     * @param count 购买数量
+     * @return
+     */
+    public Map<String, Object> buyCouponCheck(String couponId, Integer couponType, String userId,String storeId, Integer count) {
+        Map<String, Object> returnMap = new HashMap<>();
+        // 获取团购/代金券信息
+        Integer status = 0;
+        // 限购数量, 已购数量
+        Integer buyLimit = 0;
+        Integer buyCount = 0;
+        // 库存
+        Integer stockQty = 0;
+        // 结束时间
+        Date endTime = null;
+        if (couponType == CouponTypeEnum.GROUP_BUY.getCode()) {
+            // 团购
+            LifeGroupBuyMain lifeGroupBuyMain = lifeGroupBuyMainMapper.selectById(couponId);
+            status = lifeGroupBuyMain.getStatus();
+            // 限购类型
+            Integer quotaType = lifeGroupBuyMain.getQuotaType();
+            if (0 != quotaType) {
+                // 限购数量
+                buyLimit = Integer.parseInt(lifeGroupBuyMain.getQuotaValue());
+                // 已购数量
+                buyCount = orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().eq("coupon_id", couponId).notIn("status", OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.REFUND.getStatus())
+                        .inSql("order_id", "select order_id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
+            }
+            // 库存 inventory_num
+            stockQty = lifeGroupBuyMain.getInventoryNum();
+            endTime = lifeGroupBuyMain.getEndTime();
+        } else if (1 == CouponTypeEnum.COUPON.getCode()) {
+            // 代金券
+            LifeCoupon lifeCoupon = lifeCouponMapper.selectById(couponId);
+            status = lifeCoupon.getStatus();
+            // 限购数量
+            buyLimit = lifeCoupon.getBuyLimit();
+            // 已购数量
+            buyCount = orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().eq("coupon_id", couponId).notIn("status", OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.REFUND.getStatus())
+                    .inSql("order_id", "select order_id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
+            stockQty = lifeCoupon.getStockQty();
+            endTime = lifeCoupon.getEndDate();
+        } else {
+            log.error("buyCouponCheck-团购/代金券类型错误");
+            returnMap.put("success", false);
+            returnMap.put("reason", "团购/代金券类型错误");
+            return returnMap;
+        }
+        // 状态(0草稿/1待审核/2未开始/3审核拒绝/4已售罄/5进行中/6已下架/7已结束/8=2+手动下架)
+        if (status != CouponStatusEnum.ONGOING.getCode()) {
+            returnMap.put("success", false);
+            returnMap.put("reason", "团购/代金券未开始");
+            return returnMap;
+        }
+        // 限购
+        if (0 != buyLimit) {
+            if (buyCount + count > buyLimit) {
+                returnMap.put("success", false);
+                returnMap.put("reason", "购买数量大于限购数量");
+                return returnMap;
+            }
+        }
+        // 库存
+        if (count > stockQty) {
+            returnMap.put("success", false);
+            returnMap.put("reason", "购买数量大于库存数量");
+            return returnMap;
+        }
+        // 时间
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date nowDay = calendar.getTime();
+        if (nowDay.compareTo(endTime) > 0) {
+            if (couponType == CouponTypeEnum.GROUP_BUY.getCode()) {
+                lifeGroupBuyMainMapper.update(null, new UpdateWrapper<LifeGroupBuyMain>().set("status", CouponStatusEnum.ENDED.getCode()).eq("id", couponId));
+            } else {
+                lifeCouponMapper.update(null, new UpdateWrapper<LifeCoupon>().set("status", CouponStatusEnum.ENDED.getCode()).eq("id", couponId));
+            }
+            returnMap.put("success", false);
+            returnMap.put("reason", "活动已结束");
+            return returnMap;
+        }
+        return returnMap;
+    }
 }

+ 7 - 0
alien-store/src/main/java/shop/alien/store/service/StoreIncomeDetailsRecordService.java

@@ -78,4 +78,11 @@ public interface StoreIncomeDetailsRecordService extends IService<StoreIncomeDet
      */
     StoreIncomeDetailsRecordVo groupIncome(Integer storeId, String date, Integer incomeType, Integer page, Integer size);
 
+    /**
+     * 今日订单数
+     *
+     * @param storeId 门店id
+     * @return 今日订单数
+     */
+    Integer todayOrderCount(Integer storeId);
 }

+ 122 - 4
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
+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;
@@ -21,9 +22,14 @@ import shop.alien.util.common.UniqueRandomNumGenerator;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.TextStyle;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 优惠券
@@ -50,6 +56,11 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
 
     private final StoreUserMapper storeUserMapper;
 
+    private final OrderCouponMiddleMapper orderCouponMiddleMapper;
+
+    private final LifeGroupBuyMainMapper lifeGroupBuyMainMapper;
+
+
     @Override
     public boolean addOrUpdateCoupon(LifeCoupon lifeCoupon) {
 
@@ -202,10 +213,10 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         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);
+        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()));
@@ -306,4 +317,111 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         return true;
     }
 
+    /**
+     * 核销订单前效验
+     *
+     * @param orderId
+     * @return
+     */
+    @Override
+    public R<String> orderVerify(Integer orderId) {
+            OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getId, orderId));
+            if (StringUtils.isEmpty(orderCouponMiddle) && orderCouponMiddle.getStatus() != 1) {
+                return R.fail("该劵不是待使用状态");
+            }
+            if (!StringUtils.isEmpty(orderCouponMiddle)) {
+                LifeGroupBuyMain lifeGroupBuyMain = lifeGroupBuyMainMapper.selectOne(new LambdaQueryWrapper<LifeGroupBuyMain>().eq(LifeGroupBuyMain::getId, orderCouponMiddle.getCouponId()));
+                //团购有效期类型为:0 指定天数
+                if (lifeGroupBuyMain.getEffectiveDateType() == 0) {
+                    //订单支付时间加上指定天数 为团购劵有效期
+                    LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
+                    LocalDateTime localDateTime = lifeUserOrder.getBuyTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                    LocalDateTime validityPeriod = localDateTime.plusDays(Long.parseLong(lifeGroupBuyMain.getEffectiveDateValue()));
+                    LocalDateTime nowDate = LocalDateTime.now(); // 获取当前时间
+                    if (nowDate.isAfter(validityPeriod)) {
+                        return R.fail("该劵不在有效期内");
+                    }
+                } else if (lifeGroupBuyMain.getEffectiveDateType() == 1) {//类型为:1 指定时间段
+                    String[] strings = lifeGroupBuyMain.getEffectiveDateValue().split(",");
+                    String startDate = strings[0];
+                    String endDate = strings[1];
+                    LocalDate localStartDate = LocalDate.parse(startDate);
+                    LocalDate localEndDate = LocalDate.parse(endDate);
+                    LocalDate nowDate = LocalDate.now(); // 获取当前时间
+                    if (nowDate.isAfter(localEndDate) || nowDate.isBefore(localStartDate)) {
+                        return R.fail("该劵不在有效期内");
+                    }
+                }
+                //判断订单是否在不可用日期内
+                //判断当前日期是否在不可用星期
+                if(lifeGroupBuyMain.getDisableDateType() == 1){//限制日期: 1234567;节日id
+                    LocalDate nowDate = LocalDate.now(); // 获取当前时间
+                    DayOfWeek dayOfWeek = nowDate.getDayOfWeek();
+                    String week = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINA);
+                    String beforeSemicolon = lifeGroupBuyMain.getDisableDateValue().split(";")[0];
+                    if (!StringUtils.isEmpty(beforeSemicolon)) {
+                        List<String> collectUnavailableDate = Arrays.stream(beforeSemicolon.split(",")).map(String::trim).collect(Collectors.toList());
+                        boolean isExist = collectUnavailableDate.stream().anyMatch(s -> s.equals(week));
+                        if(isExist){
+                            return R.fail("该劵在不可用日期内");
+                        }
+                    }
+                    //判断当前日期是否在不可用节日
+                    String afterSemicolon = lifeGroupBuyMain.getDisableDateValue().split(";")[1];
+                    if(!StringUtils.isEmpty(afterSemicolon)){
+                        List<String> collectUnavailableDate = Arrays.stream(afterSemicolon.split(",")).map(String::trim).collect(Collectors.toList());
+                        List<EssentialHolidayComparison> essentialHolidayComparisons = essentialHolidayComparisonMapper.
+                                selectList(new LambdaQueryWrapper<EssentialHolidayComparison>().in(EssentialHolidayComparison::getId, collectUnavailableDate));
+                        boolean isExist = essentialHolidayComparisons.stream().anyMatch(s -> nowDate.isAfter(s.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
+                                && nowDate.isBefore(s.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()));
+                        if(isExist){
+                            return R.fail("该劵在不可用日期内");
+                        }
+                    }
+                }
+                //判断当前日期是否在自定义不可用日期内
+                if(lifeGroupBuyMain.getDisableDateType() == 2){
+                    String [] customDate = lifeGroupBuyMain.getDisableDateValue().split(";");
+                    boolean isExist = isCurrentDateInAnyRange(customDate);
+                    if(isExist){
+                        return R.fail("该劵在不可用日期内");
+                    }
+                }
+            }
+        return R.fail("效验通过");
+    }
+
+    public static boolean isCurrentDateInAnyRange(String[] dateRanges) {
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+        // 定义日期格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        // 遍历数组中的每一对日期范围
+        for (String range : dateRanges) {
+            // 分割每一对日期(开始日期和结束日期)
+            String[] dates = range.split(",");
+            if (dates.length != 2) {
+                // 格式不正确,跳过这一对
+                continue;
+            }
+            try {
+                // 解析开始日期和结束日期
+                LocalDate startDate = LocalDate.parse(dates[0], formatter);
+                LocalDate endDate = LocalDate.parse(dates[1], formatter);
+
+                // 检查当前日期是否在范围内(包括开始和结束日期)
+                if (!currentDate.isBefore(startDate) &&
+                        !currentDate.isAfter(endDate)) {
+                    return true;
+                }
+            } catch (Exception e) {
+                // 日期解析错误,跳过这一对
+                continue;
+            }
+        }
+        // 没有任何一对日期范围包含当前日期
+        return false;
+    }
+
 }

+ 14 - 9
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -1,24 +1,21 @@
 package shop.alien.store.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
-import org.springframework.beans.BeanUtils;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
-import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
+import shop.alien.mapper.LifeUserOrderMapper;
 import shop.alien.mapper.StoreCashOutRecordMapper;
 import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
 import shop.alien.mapper.StoreUserMapper;
@@ -30,12 +27,10 @@ import shop.alien.util.common.ListToPage;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -58,6 +53,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
     private final AliApi aliApi;
 
     private final StoreIncomeDetailsRecordMapper storeIncomeDetailsRecordMapper;
+    private final LifeUserOrderMapper lifeUserOrderMapper;
 
 
     /**
@@ -155,7 +151,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
             }
             return R.fail("余额不足");
         }
-        return "支付密码错误";
+        return R.fail("支付密码错误");
     }
 
     /**
@@ -299,7 +295,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
      * @return 未到账期
      */
     @Override
-    public JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType) {
+    public JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType, String startTime, String endTime, int page, int size) {
         LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
         JSONObject jsonObject = new JSONObject();
         Date now = new Date();
@@ -485,4 +481,13 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
         }
         return vo;
     }
+
+    @Override
+    public Integer todayOrderCount(Integer storeId) {
+        LambdaQueryWrapper<LifeUserOrder> wrapper = new LambdaQueryWrapper<>();
+        LocalDate now = LocalDate.now();
+        wrapper.eq(LifeUserOrder::getStoreId, storeId)
+                .between(LifeUserOrder::getBuyTime, now + " 00:00:00", now + " 23:59:59");
+        return lifeUserOrderMapper.selectCount(wrapper);
+    }
 }

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -772,9 +772,9 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             return R.fail("未查询到用户");
         }
         if( null == storeUser.getPayPassword()){
-            return R.fail("false");
+            return R.fail("用户未设置支付密码");
         } else if(null != password){
-             return password.equals(storeUser.getPayPassword())? R.success("true"):R.fail("false");
+             return password.equals(storeUser.getPayPassword())? R.success("true"):R.fail("密码错误");
         }
         return R.success("true");
     }