金额互用

This commit is contained in:
zt
2025-01-27 09:11:19 +08:00
parent 84ae48ba5e
commit d86dc8c145
10 changed files with 141 additions and 41 deletions

View File

@ -82,7 +82,8 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_ALREADY_COMPLETE = new ErrorCode(1_004_099_004, "餐盘未绑定"); ErrorCode ORDER_ALREADY_COMPLETE = new ErrorCode(1_004_099_004, "餐盘未绑定");
ErrorCode FACE_NOT_BIND_USER = new ErrorCode(1_004_099_005, "人脸未绑定"); ErrorCode FACE_NOT_BIND_USER = new ErrorCode(1_004_099_005, "人脸未绑定");
ErrorCode CARD_NOT_BIND_USER = new ErrorCode(1_004_099_006, "该卡未绑定用户"); ErrorCode CARD_NOT_BIND_USER = new ErrorCode(1_004_099_006, "该卡未绑定用户");
ErrorCode INSUFFICIENT_BALANCE = new ErrorCode(1_004_099_007, "余额不足15元,请充值"); ErrorCode INSUFFICIENT_BALANCE = new ErrorCode(1_004_099_007, "余额不足10元,请充值");
ErrorCode INSUFFICIENT_BALANCE_NEW = new ErrorCode(1_004_099_007, "余额不足,非工作日只能使用微信余额");
ErrorCode EXIST_TO_COMPLETE_ORDER = new ErrorCode(1_004_099_008, "存在未支付完的订单"); ErrorCode EXIST_TO_COMPLETE_ORDER = new ErrorCode(1_004_099_008, "存在未支付完的订单");
ErrorCode CARD_ALREADY_BIND = new ErrorCode(1_004_099_008, "卡号已绑定"); ErrorCode CARD_ALREADY_BIND = new ErrorCode(1_004_099_008, "卡号已绑定");
ErrorCode ORDER_NOT_COMPLETE = new ErrorCode(1_004_099_009, "订单未完成"); ErrorCode ORDER_NOT_COMPLETE = new ErrorCode(1_004_099_009, "订单未完成");

View File

@ -64,4 +64,6 @@ public interface MemberGroupMapper extends BaseMapperX<MemberGroupDO> {
void deleteAssociation(Long groupId); void deleteAssociation(Long groupId);
List<Long> getCarteenId(Long userId); List<Long> getCarteenId(Long userId);
List<MemberGroupDO> getGroupByUserId(Long userId);
} }

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.member.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum GroupTypeEnum {
ADMINISTRATIVE(1, "行政服务中心"),
DISTRICT(2, "区管单位"),
YCLH(3, "盈创力和"),
PERSON(4, "私人"),
OTHER(5, "其他单位"),
;
/**
* 编码
*/
private final Integer code;
/**
* 类型
*/
private final String name;
}

View File

@ -11,10 +11,12 @@ import cn.iocoder.yudao.module.member.dal.dataobject.money.MoneyDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum; import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import cn.iocoder.yudao.module.member.enums.GroupTypeEnum;
import cn.iocoder.yudao.module.member.enums.TimePeriodEnum; import cn.iocoder.yudao.module.member.enums.TimePeriodEnum;
import cn.iocoder.yudao.module.member.service.business.BusinessService; import cn.iocoder.yudao.module.member.service.business.BusinessService;
import cn.iocoder.yudao.module.member.service.card.CardService; import cn.iocoder.yudao.module.member.service.card.CardService;
import cn.iocoder.yudao.module.member.service.group.MemberGroupService; import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
import cn.iocoder.yudao.module.member.service.holiday.HolidayService;
import cn.iocoder.yudao.module.member.service.money.MoneyService; import cn.iocoder.yudao.module.member.service.money.MoneyService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import com.sun.istack.NotNull; import com.sun.istack.NotNull;
@ -26,8 +28,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Arrays; import java.util.*;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.CASH_AMOUNT_NOT_ENOUGH; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.CASH_AMOUNT_NOT_ENOUGH;
@ -54,6 +55,10 @@ public class DeductionServiceImpl implements DeductionService {
private BusinessService businessService; private BusinessService businessService;
@Resource @Resource
private MoneyService moneyService; private MoneyService moneyService;
@Resource
private MemberGroupService memberGroupService;
@Resource
private HolidayService holidayService;
private static final List<String> CHECK_LIST = Arrays.asList(CostTypeEnum.SHOPPING.getCode()); private static final List<String> CHECK_LIST = Arrays.asList(CostTypeEnum.SHOPPING.getCode());
@ -71,12 +76,16 @@ public class DeductionServiceImpl implements DeductionService {
synchronized (getUserLock(userId)) { synchronized (getUserLock(userId)) {
MemberUserDO user = userService.getUser(userId); MemberUserDO user = userService.getUser(userId);
MoneyDO moneyDO = moneyService.getMoney(dishOrderDO.getUserId(), dishOrderDO.getStoreId()); //获取所有现金
List<MoneyDO> allDebt = moneyService.getAllDebt(userId);
BigDecimal cashAmount = allDebt.stream().map(MoneyDO::getCashAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
//获取当前门店的数据
MoneyDO moneyDO =getStoreMoney(allDebt,dishOrderDO.getStoreId(),user.getId());
//新的总价 //新的总价
String s = deductionRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); String s = deductionRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId());
BigDecimal total = new BigDecimal(StrUtil.isBlank(s) ? "0" : s); BigDecimal total = new BigDecimal(StrUtil.isBlank(s) ? "0" : s);
//现有金额
//BigDecimal money = user.getMoney();
//计算减免价格 //计算减免价格
BigDecimal reductionAmount = BigDecimal.ZERO; BigDecimal reductionAmount = BigDecimal.ZERO;
//补贴 //补贴
@ -102,13 +111,9 @@ public class DeductionServiceImpl implements DeductionService {
//当前金额 //当前金额
BigDecimal wxAmount = user.getWxAmount(); BigDecimal wxAmount = user.getWxAmount();
BigDecimal giftAmount = user.getGiftAmount(); BigDecimal giftAmount = user.getGiftAmount();
BigDecimal cashAmount = BigDecimal.ZERO;
if(ObjectUtil.isNotEmpty(moneyDO)){
cashAmount = moneyDO.getCashAmount();
}
BigDecimal money = wxAmount.add(giftAmount).add(cashAmount); BigDecimal money = wxAmount.add(giftAmount).add(cashAmount);
// user.setMoney(money.subtract(total));
//待支付金额 最大退款金额 //待支付金额 最大退款金额
dishOrderDO.setRefundAmount(total); dishOrderDO.setRefundAmount(total);
if (money.compareTo(BigDecimal.ZERO) <= 0) { if (money.compareTo(BigDecimal.ZERO) <= 0) {
@ -133,7 +138,7 @@ public class DeductionServiceImpl implements DeductionService {
moneyDO.setDebtAmount(money.subtract(total).add(moneyDO.getDebtAmount())); moneyDO.setDebtAmount(money.subtract(total).add(moneyDO.getDebtAmount()));
} else { } else {
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE); dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
//计算金额 //计算金额 现金->赠送->微信
if (total.compareTo(cashAmount) <= 0) { if (total.compareTo(cashAmount) <= 0) {
moneyDO.setCashAmount(cashAmount.subtract(total)); moneyDO.setCashAmount(cashAmount.subtract(total));
dishOrderDO.setCashAmount(total); dishOrderDO.setCashAmount(total);
@ -585,5 +590,48 @@ public class DeductionServiceImpl implements DeductionService {
updateRedis(userId, name, wxNewMoney); updateRedis(userId, name, wxNewMoney);
} }
//判断先扣那个金额
public boolean checkWay(Long userId){
//获取用户所在组分类
Integer type = memberGroupService.getGroupTypeByUserId(userId);
List<Integer> typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode());
//查询今天是否假期
Boolean isHoliday = holidayService.checkHoliday();
return isHoliday && typeList.contains(type);
}
//获取门店的金额数据
public MoneyDO getStoreMoney(List<MoneyDO> list,Long storeId,Long userId){
Optional<MoneyDO> optionalDebt = list.stream()
.filter(debt -> storeId.equals(debt.getCarteenId()))
.findFirst();
// 如果找到了匹配的元素,则返回,否则新建一个返回
return optionalDebt.orElseGet(() -> {
MoneyDO add = new MoneyDO();
add.setUserId(userId);
add.setCarteenId(storeId);
moneyService.insertOne(add);
return add;
});
}
//清零所有门店的金额数据,并把欠款放在当前门店数据上
public void cleanCashAmount(List<MoneyDO> list,Long storeId,BigDecimal debtAmount,MoneyDO moneyDO){
boolean isNotContain = true;
for (MoneyDO money : list) {
if (storeId.equals(money.getCarteenId())) {
money.setDebtAmount(debtAmount.add(money.getDebtAmount()));
isNotContain = false;
}
money.setCashAmount(BigDecimal.ZERO);
}
if (isNotContain) {
moneyDO.setDebtAmount(debtAmount.add(moneyDO.getDebtAmount()));
moneyDO.setCashAmount(BigDecimal.ZERO);
list.add(moneyDO);
}
moneyService.updateList(list);
}
} }

View File

@ -22,10 +22,13 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.diningplates.DiningPlatesMapper; import cn.iocoder.yudao.module.member.dal.mysql.diningplates.DiningPlatesMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper; import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.enums.GroupTypeEnum;
import cn.iocoder.yudao.module.member.service.admincard.AdminCardService; import cn.iocoder.yudao.module.member.service.admincard.AdminCardService;
import cn.iocoder.yudao.module.member.service.amount.DeductionService; import cn.iocoder.yudao.module.member.service.amount.DeductionService;
import cn.iocoder.yudao.module.member.service.async.MemberAsyncService; import cn.iocoder.yudao.module.member.service.async.MemberAsyncService;
import cn.iocoder.yudao.module.member.service.card.CardService; import cn.iocoder.yudao.module.member.service.card.CardService;
import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
import cn.iocoder.yudao.module.member.service.holiday.HolidayService;
import cn.iocoder.yudao.module.member.service.money.MoneyService; import cn.iocoder.yudao.module.member.service.money.MoneyService;
import cn.iocoder.yudao.module.member.util.MemberConstants; import cn.iocoder.yudao.module.member.util.MemberConstants;
import cn.iocoder.yudao.module.system.api.carteen.CarteenApi; import cn.iocoder.yudao.module.system.api.carteen.CarteenApi;
@ -46,10 +49,7 @@ import java.time.Duration;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -67,8 +67,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
@Resource @Resource
private DiningPlatesMapper diningPlatesMapper; private DiningPlatesMapper diningPlatesMapper;
@Resource @Resource
private CardService cardService;
@Resource
private MemberUserMapper memberUserMapper; private MemberUserMapper memberUserMapper;
@Resource @Resource
private DishOrderMapper dishOrderMapper; private DishOrderMapper dishOrderMapper;
@ -79,8 +77,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
@Resource @Resource
private CarteenApi carteenApi; private CarteenApi carteenApi;
@Resource @Resource
private DishesApi dishesApi;
@Resource
private AdminCardService adminCardService; private AdminCardService adminCardService;
@Resource @Resource
private MemberAsyncService asyncService; private MemberAsyncService asyncService;
@ -88,6 +84,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
private DeductionService deductionService; private DeductionService deductionService;
@Resource @Resource
private MoneyService moneyService; private MoneyService moneyService;
@Resource
private MemberGroupService memberGroupService;
@Resource
private HolidayService holidayService;
@Override @Override
public Long createDiningPlates(DiningPlatesSaveReqVO createReqVO) { public Long createDiningPlates(DiningPlatesSaveReqVO createReqVO) {
@ -363,19 +363,22 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
} }
public BigDecimal checkMoney(MemberUserDO memberUserDO,Long storeId) { public BigDecimal checkMoney(MemberUserDO memberUserDO,Long storeId) {
BigDecimal cashAmount = BigDecimal.ZERO; //获取所有现金
MoneyDO moneyDO = moneyService.getMoney(memberUserDO.getId(), storeId); BigDecimal cashAmount = moneyService.getAllMoney(memberUserDO.getId());
//获取用户所在组分类
if (ObjectUtil.isNotEmpty(moneyDO)) { Integer type = memberGroupService.getGroupTypeByUserId(memberUserDO.getId());
cashAmount = moneyDO.getCashAmount(); List<Integer> typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode());
}else { //查询今天是否假期
MoneyDO add = new MoneyDO(); Boolean isHoliday = holidayService.checkHoliday();
add.setUserId(memberUserDO.getId()); boolean typeHoliday = isHoliday && typeList.contains(type);
add.setCarteenId(storeId); if(typeHoliday){
moneyService.insertOne(add); cashAmount = BigDecimal.ZERO;
} }
BigDecimal money = memberUserDO.getWxAmount().add(cashAmount); BigDecimal money = memberUserDO.getWxAmount().add(cashAmount);
if (money.compareTo(MemberConstants.ALARM_BALANCE) < 0) { if (money.compareTo(MemberConstants.ALARM_BALANCE) < 0) {
if(typeHoliday){
throw exception(INSUFFICIENT_BALANCE_NEW);
}
throw exception(INSUFFICIENT_BALANCE); throw exception(INSUFFICIENT_BALANCE);
} }
return money; return money;
@ -384,7 +387,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
public void checkOrder(Long userId,Long carteenId) { public void checkOrder(Long userId,Long carteenId) {
LambdaQueryWrapper<DishOrderDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DishOrderDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DishOrderDO::getUserId,userId); wrapper.eq(DishOrderDO::getUserId,userId);
wrapper.eq(DishOrderDO::getOrderStatus,DishOrderDO.TOCOMPLETE); wrapper.eq(DishOrderDO::getOrderStatus,DishOrderDO.TOCOMPLETE);
wrapper.eq(DishOrderDO::getStoreId,carteenId); wrapper.eq(DishOrderDO::getStoreId,carteenId);
@ -487,21 +489,12 @@ public class DiningPlatesServiceImpl implements DiningPlatesService {
.eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum)
.eq(DiningPlatesDO::getStoreId,storeId) .eq(DiningPlatesDO::getStoreId,storeId)
.last("limit 1")); .last("limit 1"));
// BigDecimal moneyByUserId = cardService.getMoneyByUserId(diningPlatesDO.getUserId());
MemberUserDO memberUserDO = memberUserMapper.selectById(diningPlatesDO.getUserId()); MemberUserDO memberUserDO = memberUserMapper.selectById(diningPlatesDO.getUserId());
// DishesRespDto dish = dishesApi.getDish(dishId); BigDecimal cashAmount = moneyService.getAllMoney(memberUserDO.getId());
MoneyDO moneyDO = moneyService.getMoney(memberUserDO.getId(), storeId);
BigDecimal cashAmount = BigDecimal.ZERO;
if(ObjectUtil.isNotEmpty(moneyDO)){
cashAmount = moneyDO.getCashAmount();
}
AppUserInfo appUserInfo = new AppUserInfo(); AppUserInfo appUserInfo = new AppUserInfo();
appUserInfo.setNickname(StrUtil.isNotBlank(memberUserDO.getName())?memberUserDO.getName():memberUserDO.getNickname()) appUserInfo.setNickname(StrUtil.isNotBlank(memberUserDO.getName())?memberUserDO.getName():memberUserDO.getNickname())
// .setDishesName(dish.getDishesName())
// .setDishesBasePrice(dish.getDishesBasePrice()).setDishesSumPrice(dish.getDishesSumPrice())
.setMoney(memberUserDO.getWxAmount().add(cashAmount)) .setMoney(memberUserDO.getWxAmount().add(cashAmount))
.setOrderMoney(new BigDecimal(stringRedisTemplate.opsForValue().get(diningPlatesNum+"-"+storeId))) .setOrderMoney(new BigDecimal(stringRedisTemplate.opsForValue().get(diningPlatesNum+"-"+storeId)))
.setReception(memberUserDO.getReception()).setLimitAmount(memberUserDO.getLimitAmount()); .setReception(memberUserDO.getReception()).setLimitAmount(memberUserDO.getLimitAmount());

View File

@ -133,4 +133,9 @@ public interface MemberGroupService {
void setAdmin(GroupAdminReqVO vo); void setAdmin(GroupAdminReqVO vo);
List<Long> getCarteenId(Long userId); List<Long> getCarteenId(Long userId);
/**
* 获取用户所在组类别
*/
Integer getGroupTypeByUserId(Long userId);
} }

View File

@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
import cn.iocoder.yudao.module.member.enums.GroupTypeEnum;
import cn.iocoder.yudao.module.member.service.card.CardService; import cn.iocoder.yudao.module.member.service.card.CardService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -201,4 +202,14 @@ public class MemberGroupServiceImpl implements MemberGroupService {
public List<Long> getCarteenId(Long userId) { public List<Long> getCarteenId(Long userId) {
return memberGroupMapper.getCarteenId(userId); return memberGroupMapper.getCarteenId(userId);
} }
@Override
public Integer getGroupTypeByUserId(Long userId) {
List<MemberGroupDO> groupByUserId = memberGroupMapper.getGroupByUserId(userId);
if (CollectionUtil.isEmpty(groupByUserId)) {
return GroupTypeEnum.PERSON.getCode();
}
List<Integer> collect = groupByUserId.stream().map(MemberGroupDO::getType).collect(Collectors.toList());
return collect.get(0);
}
} }

View File

@ -60,6 +60,8 @@ public interface MoneyService {
*/ */
MoneyDO getMoney(Long userId, Long carteenId); MoneyDO getMoney(Long userId, Long carteenId);
BigDecimal getAllMoney(Long userId);
List<MoneyDO> getAllDebt(Long userId); List<MoneyDO> getAllDebt(Long userId);
void updateById(MoneyDO moneyDO); void updateById(MoneyDO moneyDO);

View File

@ -81,6 +81,15 @@ public class MoneyServiceImpl implements MoneyService {
return moneyMapper.selectOne(new LambdaQueryWrapper<MoneyDO>().eq(MoneyDO::getUserId, userId).eq(MoneyDO::getCarteenId, carteenId)); return moneyMapper.selectOne(new LambdaQueryWrapper<MoneyDO>().eq(MoneyDO::getUserId, userId).eq(MoneyDO::getCarteenId, carteenId));
} }
@Override
public BigDecimal getAllMoney(Long userId) {
List<MoneyDO> moneyDOS = moneyMapper.selectList(new LambdaQueryWrapper<MoneyDO>().eq(MoneyDO::getUserId, userId));
if(CollectionUtil.isNotEmpty(moneyDOS)){
return moneyDOS.stream().map(MoneyDO::getCashAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
}
return BigDecimal.ZERO;
}
@Override @Override
public List<MoneyDO> getAllDebt(Long userId) { public List<MoneyDO> getAllDebt(Long userId) {

View File

@ -90,4 +90,9 @@
id in (select group_id from member_group_member where member_id = #{userId}) id in (select group_id from member_group_member where member_id = #{userId})
</select> </select>
<select id="getGroupByUserId" resultType="cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO">
SELECT * FROM member_group WHERE
id in (select group_id from member_group_member where member_id = #{userId}) order by type
</select>
</mapper> </mapper>