package com.xiaopeng.account.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.account.mapper.XpAppUserCouponMapper;
import com.xiaopeng.account.model.dto.ReceiveCouponDto;
import com.xiaopeng.account.model.query.XpUserCouponListQuery;
import com.xiaopeng.account.model.vo.XpAppUserCouponListVo;
import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo;
import com.xiaopeng.account.model.vo.XpAppUserCouponVo;
import com.xiaopeng.account.service.IXpAppUserCouponService;
import com.xiaopeng.account.util.holiday.HolidayUtil;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*
* 用户优惠券 服务实现类
*
*
* @author mitao
* @since 2026-02-03
*/
@Service
public class XpAppUserCouponServiceImpl extends ServiceImpl implements IXpAppUserCouponService {
@Autowired
private HolidayUtil holidayUtil;
/**
* 获取用户优惠券列表
* @param query
* @param uid
* @return
*/
@Override
public XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String uid) {
Page page = new Page<>(query.getPageNum(), query.getPageSize());
Page list = baseMapper.userCouponList(page, query, Long.valueOf(uid));
XpAppUserCouponVo vo = new XpAppUserCouponVo();
vo.setTotal((int) page.getTotal());
vo.setList(list.getRecords());
return vo;
}
/**
* 获取用户优惠券数量total
* @param uid
* @return
*/
@Override
public XpAppUserCouponTotalVo userCouponTotal(String uid) {
List couponList = baseMapper.selectList(new LambdaQueryWrapper().eq(XpAppUserCoupon::getAppUserId, uid));
XpAppUserCouponTotalVo vo = new XpAppUserCouponTotalVo();
vo.setAvailableNum((int) couponList.stream().filter(e -> e.getStatus() == 1).count());
vo.setUsedNum((int) couponList.stream().filter(e -> e.getStatus() == 2).count());
vo.setExpiredNum((int) couponList.stream().filter(e -> e.getStatus() == 3).count());
return vo;
}
/**
* 领取优惠券
* @param dto
* @param uid
* @return
*/
@Override
public boolean receive(ReceiveCouponDto dto, String uid) {
XpAppUserCoupon coupon = baseMapper.selectById(dto.getCouponId());
if(coupon.getAppUserId().toString().equals(uid)){
coupon.setStatus(1);
return updateById(coupon);
}
return false;
}
/**
* 时间规则
* @param couponList
* @return
*/
@Override
public List timeRule(List couponList) {
List xpAppUserCoupons = new ArrayList<>();
for (XpAppUserCoupon coupon : couponList) {
String timeJson = coupon.getTimeJson();
Boolean inOperationTime = isInOperationTime(timeJson);
if(inOperationTime){
xpAppUserCoupons.add(coupon);
}
}
return xpAppUserCoupons;
}
/**
* 是否在运营内
* @param timeJson 规则json字符串
* @return
*/
private Boolean isInOperationTime(String timeJson) {
JSONArray jsonArray = JSONArray.parseArray(timeJson);
Integer holidayToday = holidayUtil.isHolidayToday();
for (Object o : jsonArray) {
JSONObject jsonObject =JSONObject.parseObject(o.toString());
String type = jsonObject.getString("type");
if(type.equals(holidayToday.toString())){
JSONArray time = jsonObject.getJSONArray("time");
// 判断当前时间 是否在time时间段中
for (Object object : time) {
String[] timeArray = object.toString().split("-");
String startTime = timeArray[0];
String endTime = timeArray[1];
boolean currentTimeInRange = DateUtils.isCurrentTimeInRange(startTime, endTime);
if(currentTimeInRange){
return true;
}
}
}else if(type.equals("3")){
// 判断是什么类型 0每天 1-7 想起
String typeStr = jsonObject.getString("typeStr");
// 查看今天周几
Integer week = DateUtils.getWeek();
// 包含每天 或者 包含当天
if(typeStr.contains("0") || typeStr.contains(week.toString())){
JSONArray time = jsonObject.getJSONArray("time");
// 判断当前时间 是否在time时间段中
for (Object object : time) {
String[] timeArray = object.toString().split("-");
String startTime = timeArray[0];
String endTime = timeArray[1];
boolean currentTimeInRange = DateUtils.isCurrentTimeInRange(startTime, endTime);
if(currentTimeInRange){
return true;
}
}
}
}
}
return false;
}
}