package com.rabbiter.market.service.sale_management.exchange_point_products.impl; import com.rabbiter.market.common.redis.service.RedisTemplateService; import com.rabbiter.market.domain.goods_management.goods.Goods; import com.rabbiter.market.domain.goods_management.point_products.PointProducts; import com.rabbiter.market.domain.member_management.member.Member; import com.rabbiter.market.domain.personnel_management.employee.Employee; import com.rabbiter.market.domain.sale_management.exchange_point_products.ExchangePointProducts; import com.rabbiter.market.mapper.sale_management.exchange_point_products.ExchangePointProductsMapper; import com.rabbiter.market.qo.exchange_point_products_records.QueryExchangePointProductsRecords; import com.rabbiter.market.service.goods_management.goods.IGoodsService; import com.rabbiter.market.service.goods_management.point_products.IPointProductsService; import com.rabbiter.market.service.member_management.member.IMemberService; import com.rabbiter.market.service.sale_management.exchange_point_products.IExchangePointProductsService; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.*; @Service public class ExchangePointProductsServiceImpl extends ServiceImpl implements IExchangePointProductsService { // 依赖注入... /** * 根据会员ID查询可兑换商品选项 * @param memberId 会员ID(可为空) * @return 包含商品ID和名称的Map列表 * 逻辑说明: * - 当memberId为空时,返回所有需要积分的商品 * - 当memberId存在时,只返回会员当前积分可兑换的商品 */ @Autowired private IMemberService memberService; @Autowired private IPointProductsService pointProductsService; @Autowired private RedisTemplateService redisTemplateService; @Autowired private IGoodsService goodsService; @Override public List> queryPointProductBymemberId(Long memberId) { /** * 通过商品ID获取积分商品详情 * @param goodsId 商品ID * @return 积分商品实体 */ Member member = memberService.getById(memberId); QueryWrapper pointProductsQueryWrapper = new QueryWrapper(); if (memberId == null) { pointProductsQueryWrapper.gt("integral", 0L); } else { pointProductsQueryWrapper.le("integral", member.getIntegral()); } List list = pointProductsService.list(pointProductsQueryWrapper); List> mapArrayList = new ArrayList<>(); for (PointProducts pointProducts : list) { Map map = new HashMap<>(); map.put("id", pointProducts.getGoodsId()); map.put("name", pointProducts.getGoodsName()); mapArrayList.add(map); } return mapArrayList; } @Override public PointProducts queryPointProductByGoodsId(Long goodsId) { /** * 保存积分兑换记录 * @param exchangePointProducts 兑换记录实体 * @param token 用户令牌 * 核心逻辑: * 1. 生成唯一兑换单号 * 2. 设置操作人信息(从Redis获取) * 3. 更新会员积分 * 4. 保存兑换记录 */ PointProducts pointProducts = pointProductsService.getOne(new QueryWrapper().eq(goodsId != null, "goods_id", goodsId)); return pointProducts; } @Override public void saveExchangePointProductRecords(ExchangePointProducts exchangePointProducts, String token) { /** * 查询有兑换记录的会员手机号选项 * @return 包含会员ID和手机号的Map列表 * 注意:仅查询状态正常的兑换记录 */ Employee employee = JSONObject.parseObject(redisTemplateService.getCacheObject(token), Employee.class); exchangePointProducts.setCn(IdWorker.getIdStr());//鐢熸垚璁㈠崟鍙� exchangePointProducts.setUpdateby(employee.getNickName()); exchangePointProducts.setUpdateId(employee.getId()); exchangePointProducts.setUpdateTime(new Date()); exchangePointProducts.setState(ExchangePointProducts.STATE_NORMAL); /*淇敼浼氬憳鐨勭Н鍒�*/ Member member = memberService.getById(exchangePointProducts.getMemberId()); member.setIntegral(member.getIntegral() - exchangePointProducts.getIntegral()); memberService.updateById(member); super.save(exchangePointProducts); } @Override public List> queryOptionsMemberPhone() { /** * 逻辑删除兑换记录(标记删除) * @param cn 兑换单号 */ QueryWrapper wrapper = new QueryWrapper() .select("member_id") .eq("state", ExchangePointProducts.STATE_NORMAL) .groupBy("member_id"); List list = super.list(wrapper); List memberIds = new ArrayList<>(); for (ExchangePointProducts exchangePointProducts : list) { memberIds.add(exchangePointProducts.getMemberId()); } if (memberIds==null || memberIds.size()<=0){ return null; } List members = memberService.listByIds(memberIds); List> vos = new ArrayList<>(); for (Member member : members) { Map map = new HashMap<>(); map.put("id", member.getId()); map.put("name", member.getPhone()); vos.add(map); } return vos; } @Override public void delExchangePointProducts(String cn) { /** * 分页查询兑换记录 * @param qo 查询条件对象 * @return 分页结果(包含关联的会员手机号和商品信息) * 功能特点: * - 支持时间范围过滤 * - 支持会员ID过滤 * - 支持单号模糊查询 * - 自动补充商品封面和名称 */ UpdateWrapper wrapper = new UpdateWrapper() .set("state", ExchangePointProducts.STATE_DEL) .eq("cn", cn); super.update(wrapper); } @Override public Page queryPageByQoExchangePointProducts(QueryExchangePointProductsRecords qo) { /** * 查询所有可兑换商品选项 * @return 包含商品ID和名称的Map列表 */ Page page = new Page<>(qo.getCurrentPage(), qo.getPageSize()); QueryWrapper queryWrapper = new QueryWrapper() .eq("state", ExchangePointProducts.STATE_NORMAL) .eq(qo.getMemberId() != null, "member_id", qo.getMemberId()) .ge(StringUtils.hasText(qo.getStartTime()), "update_time", qo.getStartTime()) .le(StringUtils.hasText(qo.getEndTime()), "update_time", qo.getEndTime()) .likeRight(StringUtils.hasText(qo.getCn()), "cn", qo.getCn()); super.page(page, queryWrapper); for (ExchangePointProducts record : page.getRecords()) { Member member = memberService.getById(record.getMemberId()); record.setMemberPhone(member.getPhone()); Goods goods = goodsService.getById(record.getGoodsId()); record.setGoodsCoverUrl(goods.getCoverUrl()); record.setGoodsName(goods.getName()); } return page; } @Override public List> queryOptionsPointProducts() { /** * 查询所有正常状态会员选项 * @return 包含会员ID和手机号的Map列表 */ QueryWrapper wrapper = new QueryWrapper() .eq("state", PointProducts.STATE_NORMAL); List list = pointProductsService.list(wrapper); List> vos = new ArrayList<>(); for (PointProducts pointProducts : list) { Map map = new HashMap<>(); map.put("id", pointProducts.getGoodsId()); map.put("name", pointProducts.getGoodsName()); vos.add(map); } return vos; } @Override public List> queryOptionsMember() { /** * 根据商品ID查询有足够积分兑换的会员 * @param goodsId 商品ID(可为空) * @return 包含会员ID和手机号的Map列表 * 逻辑说明: * - 当商品ID存在时,查询积分足够的会员 * - 当商品ID为空时,返回所有有积分的会员 */ List> vos = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper() .groupBy("id") .eq("state", Member.STATE_NORMAL); List list = memberService.list(wrapper); for (Member member : list) { Map map = new HashMap<>(); map.put("id", member.getId()); map.put("name", member.getPhone()); vos.add(map); } return vos; } @Override public List> queryMemberByGoodsId(Long goodsId) { List members = new ArrayList<>(); QueryWrapper memberQueryWrapper = new QueryWrapper(); memberQueryWrapper.eq("state", Member.STATE_NORMAL); if (goodsId != null) { PointProducts pointProducts = pointProductsService.getOne(new QueryWrapper() .eq("goods_id", goodsId) .eq("state", PointProducts.STATE_NORMAL)); memberQueryWrapper.ge("integral", pointProducts.getIntegral()); } else { memberQueryWrapper.gt("integral", 0); } members = memberService.list(memberQueryWrapper); List> vos = new ArrayList<>(); for (Member member : members) { Map map = new HashMap<>(); map.put("id", member.getId()); map.put("name", member.getPhone()); vos.add(map); } return vos; } }