|
@@ -0,0 +1,181 @@
|
|
|
+/*
|
|
|
+ * Copyright [2022] [https://www.xiaonuo.vip]
|
|
|
+ *
|
|
|
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
|
|
+ *
|
|
|
+ * 1.请不要删除和修改根目录下的LICENSE文件。
|
|
|
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
|
|
|
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
|
|
|
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
|
|
|
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
|
|
|
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
|
|
|
+ */
|
|
|
+package vip.xiaonuo.biz.modular.consumptionrecord.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.collection.CollStreamUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
|
|
|
+import vip.xiaonuo.biz.modular.user.service.BizUserService;
|
|
|
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
|
|
|
+import vip.xiaonuo.common.exception.CommonException;
|
|
|
+import vip.xiaonuo.common.page.CommonPageRequest;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.entity.ConsumptionRecord;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.mapper.ConsumptionRecordMapper;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordAddParam;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordEditParam;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordIdParam;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordPageParam;
|
|
|
+import vip.xiaonuo.biz.modular.consumptionrecord.service.ConsumptionRecordService;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 消费记录Service接口实现类
|
|
|
+ *
|
|
|
+ * @author fanzherong
|
|
|
+ * @date 2025/02/06 08:56
|
|
|
+ **/
|
|
|
+@Service
|
|
|
+public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordMapper, ConsumptionRecord> implements ConsumptionRecordService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private BizUserService bizUserService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<ConsumptionRecord> page(ConsumptionRecordPageParam consumptionRecordPageParam) {
|
|
|
+ QueryWrapper<ConsumptionRecord> queryWrapper = new QueryWrapper<ConsumptionRecord>().checkSqlInjection();
|
|
|
+ if(ObjectUtil.isAllNotEmpty(consumptionRecordPageParam.getSortField(), consumptionRecordPageParam.getSortOrder())) {
|
|
|
+ CommonSortOrderEnum.validate(consumptionRecordPageParam.getSortOrder());
|
|
|
+ queryWrapper.orderBy(true, consumptionRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
|
|
|
+ StrUtil.toUnderlineCase(consumptionRecordPageParam.getSortField()));
|
|
|
+ } else {
|
|
|
+ queryWrapper.lambda().orderByAsc(ConsumptionRecord::getId);
|
|
|
+ }
|
|
|
+ return this.page(CommonPageRequest.defaultPage(), queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void add(ConsumptionRecordAddParam consumptionRecordAddParam) {
|
|
|
+ //前置参数校验
|
|
|
+ checkParam(consumptionRecordAddParam);
|
|
|
+ ConsumptionRecord consumptionRecord = BeanUtil.toBean(consumptionRecordAddParam, ConsumptionRecord.class);
|
|
|
+ //获取用户信息
|
|
|
+ BizUser bizUser = bizUserService.getById(consumptionRecordAddParam.getUserId());
|
|
|
+ if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"1")){
|
|
|
+ //会员赠送
|
|
|
+ if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"1")){
|
|
|
+ //判断当前选择的是代金券还是余额 1:代金券 2:余额
|
|
|
+ //选择代金券,用户原有代金券金额+本地赠送金额
|
|
|
+ bizUser.setVoucherBalance(bizUser.getVoucherBalance().add(consumptionRecordAddParam.getVoucherMoney()));
|
|
|
+ consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getVoucherMoney());
|
|
|
+ }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"2")){
|
|
|
+ //选择余额,用户原有余额+本次赠送余额金额
|
|
|
+ bizUser.setAccountBalance(bizUser.getAccountBalance().add(consumptionRecordAddParam.getAccountMoney()));
|
|
|
+ consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getAccountMoney());
|
|
|
+ }
|
|
|
+ }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"2")){
|
|
|
+ //会员扣减
|
|
|
+ if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"1")){
|
|
|
+ //选择代金券,用户原有代金券金额-本次扣减金额
|
|
|
+ bizUser.setVoucherBalance(bizUser.getVoucherBalance().subtract(consumptionRecordAddParam.getVoucherMoney()));
|
|
|
+ consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getVoucherMoney());
|
|
|
+ }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"2")){
|
|
|
+ //选择账户余额,用户原有余额-本次扣减余额
|
|
|
+ bizUser.setAccountBalance(bizUser.getAccountBalance().subtract(consumptionRecordAddParam.getAccountMoney()));
|
|
|
+ consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getAccountMoney());
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //正常消费结算
|
|
|
+ //判断当前消费金额是否大于代金券金额,优先扣减代金券金额
|
|
|
+ if(consumptionRecordAddParam.getConsumptionMoney().compareTo(bizUser.getVoucherBalance()) > 0){
|
|
|
+ //计算本次消费和代金券差额
|
|
|
+ BigDecimal subtract = consumptionRecordAddParam.getConsumptionMoney().subtract(bizUser.getVoucherBalance());
|
|
|
+ //如果差额大于账户余额,表示账户余额不足
|
|
|
+ if(subtract.compareTo(bizUser.getAccountBalance()) > 0){
|
|
|
+ throw new CommonException("账户余额不足!");
|
|
|
+ }
|
|
|
+ //记录消费信息
|
|
|
+ consumptionRecord.setVoucherMoney(bizUser.getVoucherBalance());
|
|
|
+ //代金券直接清空
|
|
|
+ bizUser.setVoucherBalance(new BigDecimal(0));
|
|
|
+ //余额扣去差额
|
|
|
+ bizUser.setAccountBalance(bizUser.getAccountBalance().subtract(subtract));
|
|
|
+ consumptionRecord.setAccountMoney(subtract);
|
|
|
+ }else{
|
|
|
+ //直接扣减代金券
|
|
|
+ bizUser.setVoucherBalance(bizUser.getVoucherBalance().subtract(consumptionRecordAddParam.getConsumptionMoney()));
|
|
|
+ consumptionRecord.setVoucherMoney(consumptionRecordAddParam.getConsumptionMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //保存消费记录
|
|
|
+ this.save(consumptionRecord);
|
|
|
+ //修改账户余额
|
|
|
+ bizUserService.updateById(bizUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ //会员赠送/扣减
|
|
|
+ public void customerConsumption(ConsumptionRecordAddParam consumptionRecordAddParam){
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //参数校验
|
|
|
+ public void checkParam(ConsumptionRecordAddParam consumptionRecordAddParam){
|
|
|
+ //判断当前操作consumptionOperate 1:会员赠送 2:会员扣减 3:消费结算
|
|
|
+ if(ObjectUtil.isEmpty(consumptionRecordAddParam.getConsumptionOperate())){
|
|
|
+ throw new CommonException("消费操作consumptionOperate不能为空!");
|
|
|
+ }
|
|
|
+ if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"1") || StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"2")){
|
|
|
+ //会员操作填写说明
|
|
|
+ if(ObjectUtil.isEmpty(consumptionRecordAddParam.getConsumptionRemark())){
|
|
|
+ throw new CommonException("消费说明consumptionRemark不能为空!");
|
|
|
+ }
|
|
|
+ //选择赠送和扣减操作时要选择代金券还是账户余额
|
|
|
+ if(ObjectUtil.isEmpty(consumptionRecordAddParam.getConsumptionType())){
|
|
|
+ throw new CommonException("消费方式consumptionType不能为空!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(ObjectUtil.isEmpty(consumptionRecordAddParam.getUserId())){
|
|
|
+ throw new CommonException("用户userId不能为空!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void edit(ConsumptionRecordEditParam consumptionRecordEditParam) {
|
|
|
+ ConsumptionRecord consumptionRecord = this.queryEntity(consumptionRecordEditParam.getId());
|
|
|
+ BeanUtil.copyProperties(consumptionRecordEditParam, consumptionRecord);
|
|
|
+ this.updateById(consumptionRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void delete(List<ConsumptionRecordIdParam> consumptionRecordIdParamList) {
|
|
|
+ // 执行删除
|
|
|
+ this.removeByIds(CollStreamUtil.toList(consumptionRecordIdParamList, ConsumptionRecordIdParam::getId));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConsumptionRecord detail(ConsumptionRecordIdParam consumptionRecordIdParam) {
|
|
|
+ return this.queryEntity(consumptionRecordIdParam.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConsumptionRecord queryEntity(String id) {
|
|
|
+ ConsumptionRecord consumptionRecord = this.getById(id);
|
|
|
+ if(ObjectUtil.isEmpty(consumptionRecord)) {
|
|
|
+ throw new CommonException("消费记录不存在,id值为:{}", id);
|
|
|
+ }
|
|
|
+ return consumptionRecord;
|
|
|
+ }
|
|
|
+}
|