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; } }