feat:h5领取食堂优惠券

This commit is contained in:
dzc committed 2026-01-29 11:40:08 +08:00
1 parent cce4230f0d
commit 1344217733
16 files changed
+255 -26

No files matched your search

@@ -11,8 +11,15 @@ public class ActCancelItemDto extends ActCancelItemEntity {
private List<Long> actIdList;
private List<String> actStatusList;
private List<Long> mchIdList;
private LocalDateTime[] cancelTimeList;
/**
* 是否查询未过期的核销项
*/
private Boolean isFindNoExpire = false;
}
@@ -3,6 +3,19 @@ package com.bsd.pjcloud.wallet.api.dto.act;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ActCouponRecordDto extends ActCouponRecordEntity {
/**
* 是否查询未过期的核销项
*/
private Boolean isFindNoExpire = false;
private List<String> statusCodeList;
private LocalDateTime[] createTimeList;
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.wallet.api.vo.act;
import lombok.Data;
@Data
public class ActUserTotalVo {
/**
* 所有活动总数
*/
private Long allCount;
/**
* 核销活动总数
*/
private Long cancelCount;
/**
* 优惠券活动总数
*/
private Long couponCount;
}
@@ -9,6 +9,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum;
import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto;
import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity;
import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo;
@@ -22,6 +23,8 @@ import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 核销活动项
*/
@@ -52,6 +55,17 @@ public class ActCancelItemController {
/* ************************************* start app start ************************************* */
@Operation(summary = "用户领取核销券列表", description = "用户领取核销券列表")
@GetMapping("/app/user-list")
public R<Page<ActCancelItemVo>> userList(@ParameterObject Page page) {
PjcloudUser user = SecurityUtils.getUser();
ActCancelItemDto dto = new ActCancelItemDto();
dto.setReceiverUserId(user.getId());
dto.setActStatusList(List.of(ActCancelStatusEnum.CANCEL_AWAIT.getCode()));
dto.setIsFindNoExpire(true);
return R.ok(actCancelItemService.pageList(page, dto));
}
@Operation(summary = "app领取优惠券", description = "app领取优惠券")
@PostMapping("/app/get")
@Idempotent(expireTime = 2, key = "'/act/cancel/app/get/' + #dto.getReceiverUserId()", info = "正在领取中,请勿重复操作")
@@ -8,6 +8,7 @@ import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum;
import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo;
import com.bsd.pjcloud.wallet.service.ActComService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -50,4 +51,12 @@ public class ActComController {
return R.ok(actComService.isEligibleForAct(actType, actId, user.getId()));
}
@Operation(summary = "用户参加活动的数量统计", description = "用户参加活动的数量统计")
@GetMapping("/app/user-total")
public R<ActUserTotalVo> userTotal() {
PjcloudUser user = SecurityUtils.getUser();
return R.ok(actComService.userTotal(user.getId()));
}
}
@@ -10,9 +10,14 @@ import com.bsd.pjcloud.common.idempotent.annotation.Idempotent;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum;
import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity;
import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo;
import com.bsd.pjcloud.wallet.service.ActCouponRecordService;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -50,6 +55,16 @@ public class ActCouponRecordController {
return R.ok(actCouponRecordService.appReceive(dto));
}
@Operation(summary = "用户领取核销券列表", description = "用户领取核销券列表")
@GetMapping("/app/user-list")
public R<Page<ActCouponRecordVo>> userList(@ParameterObject Page page) {
PjcloudUser user = SecurityUtils.getUser();
ActCouponRecordDto dto = new ActCouponRecordDto();
dto.setUserId(user.getId());
dto.setStatusCodeList(List.of(ActCouponRecordStatusEnum.UNUSED.getCode()));
dto.setIsFindNoExpire(true);
return R.ok(actCouponRecordService.pageList(page, dto));
}
/* ************************************* end app end ************************************* */
@@ -59,9 +74,8 @@ public class ActCouponRecordController {
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')")
public R getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) {
LambdaQueryWrapper<ActCouponRecordEntity> wrapper = Wrappers.lambdaQuery();
return R.ok(actCouponRecordService.page(page, wrapper));
public R<Page<ActCouponRecordVo>> getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) {
return R.ok(actCouponRecordService.pageList(page, dto));
}
@@ -75,27 +89,6 @@ public class ActCouponRecordController {
return R.ok(actCouponRecordService.getById(id));
}
/**
* 新增优惠券领取记录表
*/
@Operation(summary = "新增优惠券领取记录表", description = "新增优惠券领取记录表")
@SysLog("新增优惠券领取记录表")
@PostMapping
@PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_add')")
public R save(@RequestBody ActCouponRecordEntity actCouponRecord) {
return R.ok(actCouponRecordService.save(actCouponRecord));
}
/**
* 修改优惠券领取记录表
*/
@Operation(summary = "修改优惠券领取记录表", description = "修改优惠券领取记录表")
@SysLog("修改优惠券领取记录表")
@PutMapping
@PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_edit')")
public R updateById(@RequestBody ActCouponRecordEntity actCouponRecord) {
return R.ok(actCouponRecordService.updateById(actCouponRecord));
}
/**
* 通过id删除优惠券领取记录表
@@ -15,4 +15,5 @@ public interface ActCancelItemMapper extends PjcloudBaseMapper<ActCancelItemEnti
List<ActCancelItemCountVo> count(@Param("dto") ActCancelItemDto dto);
Long userTotal(@Param("userId") Long userId, @Param("statusCodeList") List<String> statusCodeList);
}
@@ -1,11 +1,19 @@
package com.bsd.pjcloud.wallet.mapper.act;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity;
import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ActCouponRecordMapper extends PjcloudBaseMapper<ActCouponRecordEntity> {
Page<ActCouponRecordVo> pageList(Page page, @Param("dto") ActCouponRecordDto dto);
Long userTotal(@Param("userId") Long userId, @Param("statusCodeList") List<String> statusCodeList);
}
@@ -42,4 +42,9 @@ public interface ActCancelItemService extends IService<ActCancelItemEntity> {
* 查询详情
*/
ActCancelItemVo getDetail(Long cancelId);
/**
* 用户参加活动的数量统计
*/
Long userTotal(Long userId);
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.wallet.service;
import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum;
import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo;
public interface ActComService {
@@ -20,4 +21,9 @@ public interface ActComService {
* 判断用户是否可以参加活动
*/
String isEligibleForAct(ActTypeEnum actType, Long actId, Long userId);
/**
* 用户参加活动的数量统计
*/
ActUserTotalVo userTotal(Long userId);
}
@@ -1,12 +1,20 @@
package com.bsd.pjcloud.wallet.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity;
import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo;
public interface ActCouponRecordService extends IService<ActCouponRecordEntity> {
/**
* 分页查询
*/
Page<ActCouponRecordVo> pageList(Page page, ActCouponRecordDto dto);
/**
* 领取优惠券
*/
@@ -16,4 +24,10 @@ public interface ActCouponRecordService extends IService<ActCouponRecordEntity>
* 判断用户是否可以参加活动
*/
ActUserReceiveEnum isEligibleForAct(Long actId, Long userId);
/**
* 用户参加活动的数量统计
*/
Long userTotal(Long userId);
}
@@ -1,6 +1,8 @@
package com.bsd.pjcloud.wallet.service.impl.act;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,6 +17,7 @@ import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActStatusEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum;
import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto;
@@ -67,6 +70,8 @@ public class ActCancelItemServiceImpl extends ServiceImpl<ActCancelItemMapper, A
.like(ObjectUtil.isNotEmpty(dto.getReceiverUserName()), ActCancelItemEntity::getReceiverUserName, dto.getReceiverUserName())
.eq(ObjectUtil.isNotEmpty(dto.getCancelUserId()), ActCancelItemEntity::getCancelUserId, dto.getCancelUserId())
.eq(ObjectUtil.isNotEmpty(dto.getActStatus()), ActCancelItemEntity::getActStatus, dto.getActStatus())
.in(ObjectUtil.isNotEmpty(dto.getActStatusList()), ActCancelItemEntity::getActStatus, dto.getActStatusList())
.ge(ObjectUtil.isNotEmpty(dto.getIsFindNoExpire()) && dto.getIsFindNoExpire(), ActCancelItemEntity::getExpireTime, LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN))
.orderByDesc(ActCancelItemEntity::getReceiverTime)
.orderByDesc(ActCancelItemEntity::getId)
);
@@ -315,7 +320,15 @@ public class ActCancelItemServiceImpl extends ServiceImpl<ActCancelItemMapper, A
return result;
}
// 判断车牌号是否重复
/**
* 用户参加活动的数量统计
*/
@Override
public Long userTotal(Long userId) {
return baseMapper.userTotal(userId, List.of(ActCancelStatusEnum.CANCEL_AWAIT.getCode()));
}
// 判断用户是否已领取
private boolean existAct(Long userId, Long actId) {
Long count = baseMapper.selectCount(new LambdaQueryWrapper<ActCancelItemEntity>()
.eq(ObjectUtil.isNotEmpty(userId), ActCancelItemEntity::getReceiverUserId, userId)
@@ -6,6 +6,7 @@ import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum;
import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity;
import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo;
import com.bsd.pjcloud.wallet.service.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -98,4 +99,20 @@ public class ActComServiceImpl implements ActComService {
}
return status.getCode();
}
/**
* 用户参加活动的数量统计
*/
@Override
public ActUserTotalVo userTotal(Long userId) {
ActUserTotalVo result = new ActUserTotalVo();
// 查询用户参加核销活动的总数
Long cancelCount = actCancelItemService.userTotal(userId);
// 查询用户参加优惠券活动的总数
Long couponCount = actCouponRecordService.userTotal(userId);
result.setCancelCount(cancelCount);
result.setCouponCount(couponCount);
result.setAllCount(cancelCount + couponCount);
return result;
}
}
@@ -1,6 +1,7 @@
package com.bsd.pjcloud.wallet.service.impl.act;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.entity.SysUser;
@@ -8,12 +9,15 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum;
import com.bsd.pjcloud.common.core.exception.ServiceException;
import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum;
import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum;
import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto;
import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity;
import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo;
import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo;
import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper;
import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper;
@@ -46,6 +50,14 @@ public class ActCouponRecordServiceImpl extends ServiceImpl<ActCouponRecordMappe
private final RemoteUserService remoteUserService;
/**
* 分页查询
*/
@Override
public Page<ActCouponRecordVo> pageList(Page page, ActCouponRecordDto dto) {
return baseMapper.pageList(page, dto);
}
/**
* 领取优惠券
*/
@@ -76,6 +88,9 @@ public class ActCouponRecordServiceImpl extends ServiceImpl<ActCouponRecordMappe
}
public ActUserReceiveEnum specialCoupon(ActCouponEntity actCouponEntity, SysUser sysUser) {
if (true) {
return null;
}
// 食堂生日券
if (ObjectUtil.equals(actCouponEntity.getUniqueCode(), "1qRgFo")) {
// 判断是否为食堂用户
@@ -112,9 +127,21 @@ public class ActCouponRecordServiceImpl extends ServiceImpl<ActCouponRecordMappe
UserInfo userInfo = remoteUserService.getByUserId(userId).getData();
ActCouponEntity actCouponEntity = actCouponMapper.selectById(actId);
if (ObjectUtil.isNotEmpty(userInfo) && ObjectUtil.isNotEmpty(actCouponEntity)) {
userReceiveEnum = specialCoupon(actCouponEntity, userInfo.getSysUser());
ActUserReceiveEnum specialCouponStatus = specialCoupon(actCouponEntity, userInfo.getSysUser());
if (ObjectUtil.isNotEmpty(specialCouponStatus)) {
userReceiveEnum = specialCouponStatus;
}
}
}
return userReceiveEnum;
}
/**
* 用户参加活动的数量统计
*/
@Override
public Long userTotal(Long userId) {
return baseMapper.userTotal(userId, List.of(ActCouponRecordStatusEnum.UNUSED.getCode()));
}
}
@@ -62,4 +62,18 @@
group by a.act_id
</select>
<select id="userTotal" resultType="java.lang.Long">
select count(*)
from act_cancel_item a
where a.del_flag = '0'
and a.expire_time >= now()
and a.receiver_user_id = #{userId}
<if test="statusCodeList != null and statusCodeList.size() != 0">
and a.act_status in
<foreach collection="statusCodeList" item="v" open="(" close=")" separator=",">
#{v}
</foreach>
</if>
</select>
</mapper>
@@ -3,8 +3,73 @@
<mapper namespace="com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper">
<sql id="selectA">
select a.id,
a.coupon_id,
a.user_id,
a.user_name,
a.coupon_code,
a.status,
a.coupon_name,
a.coupon_type,
a.face_value,
a.min_point,
a.start_time,
a.end_time,
a.use_time,
a.order_id,
a.use_amount,
a.create_by,
a.create_time,
a.update_by,
a.update_time,
a.del_flag,
a.tenant_id
</sql>
<sql id="whereA">
a.del_flag = '0'
<if test="dto.couponId != null">
and a.coupon_id = #{dto.couponId}
</if>
<if test="dto.userId != null">
and a.user_id = #{dto.userId}
</if>
<if test="dto.status != null and dto.status != '' ">
and a.status = #{dto.status}
</if>
<if test="dto.isFindNoExpire != null and dto.isFindNoExpire == true ">
and a.end_time >= now()
</if>
<if test="dto.statusCodeList != null and dto.statusCodeList.size() != 0">
and a.status IN
<foreach collection="dto.statusCodeList" item="v" open="(" close=")" separator=",">
#{v}
</foreach>
</if>
<if test="dto.createTimeList != null and dto.createTimeList.length == 2">
and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]}
</if>
</sql>
<select id="pageList" resultType="com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo">
<include refid="selectA"/>
from act_coupon_record a
<where>
<include refid="whereA"/>
</where>
</select>
<select id="userTotal" resultType="java.lang.Long">
select count(0)
from act_coupon_record a
where a.del_flag = '0'
and a.end_time >= now()
and a.user_id = #{userId}
<if test="statusCodeList != null and statusCodeList.size() != 0">
and a.status IN
<foreach collection="statusCodeList" item="v" open="(" close=")" separator=",">
#{v}
</foreach>
</if>
</select>
</mapper>