diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 8a45917f..9a78f9e5 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -82,7 +82,8 @@ public interface ErrorCodeConstants { ErrorCode ORDER_ALREADY_COMPLETE = new ErrorCode(1_004_099_004, "餐盘未绑定"); ErrorCode FACE_NOT_BIND_USER = new ErrorCode(1_004_099_005, "人脸未绑定"); 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 CARD_ALREADY_BIND = new ErrorCode(1_004_099_008, "卡号已绑定"); ErrorCode ORDER_NOT_COMPLETE = new ErrorCode(1_004_099_009, "订单未完成"); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java index 958ebf14..d4379317 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java @@ -64,4 +64,6 @@ public interface MemberGroupMapper extends BaseMapperX { void deleteAssociation(Long groupId); List getCarteenId(Long userId); + + List getGroupByUserId(Long userId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/GroupTypeEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/GroupTypeEnum.java new file mode 100644 index 00000000..20f83ad6 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/GroupTypeEnum.java @@ -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; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java index 23e8958c..5b4d3d96 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java @@ -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.user.MemberUserDO; 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.service.business.BusinessService; 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.user.MemberUserService; import com.sun.istack.NotNull; @@ -26,8 +28,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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; @Resource private MoneyService moneyService; + @Resource + private MemberGroupService memberGroupService; + @Resource + private HolidayService holidayService; private static final List CHECK_LIST = Arrays.asList(CostTypeEnum.SHOPPING.getCode()); @@ -71,12 +76,16 @@ public class DeductionServiceImpl implements DeductionService { synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - MoneyDO moneyDO = moneyService.getMoney(dishOrderDO.getUserId(), dishOrderDO.getStoreId()); + //获取所有现金 + List 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()); BigDecimal total = new BigDecimal(StrUtil.isBlank(s) ? "0" : s); - //现有金额 - //BigDecimal money = user.getMoney(); + //计算减免价格 BigDecimal reductionAmount = BigDecimal.ZERO; //补贴 @@ -102,13 +111,9 @@ public class DeductionServiceImpl implements DeductionService { //当前金额 BigDecimal wxAmount = user.getWxAmount(); BigDecimal giftAmount = user.getGiftAmount(); - BigDecimal cashAmount = BigDecimal.ZERO; - if(ObjectUtil.isNotEmpty(moneyDO)){ - cashAmount = moneyDO.getCashAmount(); - } BigDecimal money = wxAmount.add(giftAmount).add(cashAmount); - // user.setMoney(money.subtract(total)); + //待支付金额 最大退款金额 dishOrderDO.setRefundAmount(total); if (money.compareTo(BigDecimal.ZERO) <= 0) { @@ -133,7 +138,7 @@ public class DeductionServiceImpl implements DeductionService { moneyDO.setDebtAmount(money.subtract(total).add(moneyDO.getDebtAmount())); } else { dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE); - //计算金额 + //计算金额 现金->赠送->微信 if (total.compareTo(cashAmount) <= 0) { moneyDO.setCashAmount(cashAmount.subtract(total)); dishOrderDO.setCashAmount(total); @@ -585,5 +590,48 @@ public class DeductionServiceImpl implements DeductionService { updateRedis(userId, name, wxNewMoney); } + + //判断先扣那个金额 + public boolean checkWay(Long userId){ + //获取用户所在组分类 + Integer type = memberGroupService.getGroupTypeByUserId(userId); + List typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode()); + //查询今天是否假期 + Boolean isHoliday = holidayService.checkHoliday(); + return isHoliday && typeList.contains(type); + } + + //获取门店的金额数据 + public MoneyDO getStoreMoney(List list,Long storeId,Long userId){ + Optional 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 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); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java index 0f6a632e..741337c4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/diningplates/DiningPlatesServiceImpl.java @@ -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.order.DishOrderMapper; 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.amount.DeductionService; 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.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.util.MemberConstants; import cn.iocoder.yudao.module.system.api.carteen.CarteenApi; @@ -46,10 +49,7 @@ import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -67,8 +67,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Resource private DiningPlatesMapper diningPlatesMapper; @Resource - private CardService cardService; - @Resource private MemberUserMapper memberUserMapper; @Resource private DishOrderMapper dishOrderMapper; @@ -79,8 +77,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { @Resource private CarteenApi carteenApi; @Resource - private DishesApi dishesApi; - @Resource private AdminCardService adminCardService; @Resource private MemberAsyncService asyncService; @@ -88,6 +84,10 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { private DeductionService deductionService; @Resource private MoneyService moneyService; + @Resource + private MemberGroupService memberGroupService; + @Resource + private HolidayService holidayService; @Override public Long createDiningPlates(DiningPlatesSaveReqVO createReqVO) { @@ -363,19 +363,22 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { } public BigDecimal checkMoney(MemberUserDO memberUserDO,Long storeId) { - BigDecimal cashAmount = BigDecimal.ZERO; - MoneyDO moneyDO = moneyService.getMoney(memberUserDO.getId(), storeId); - - if (ObjectUtil.isNotEmpty(moneyDO)) { - cashAmount = moneyDO.getCashAmount(); - }else { - MoneyDO add = new MoneyDO(); - add.setUserId(memberUserDO.getId()); - add.setCarteenId(storeId); - moneyService.insertOne(add); + //获取所有现金 + BigDecimal cashAmount = moneyService.getAllMoney(memberUserDO.getId()); + //获取用户所在组分类 + Integer type = memberGroupService.getGroupTypeByUserId(memberUserDO.getId()); + List typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode()); + //查询今天是否假期 + Boolean isHoliday = holidayService.checkHoliday(); + boolean typeHoliday = isHoliday && typeList.contains(type); + if(typeHoliday){ + cashAmount = BigDecimal.ZERO; } BigDecimal money = memberUserDO.getWxAmount().add(cashAmount); if (money.compareTo(MemberConstants.ALARM_BALANCE) < 0) { + if(typeHoliday){ + throw exception(INSUFFICIENT_BALANCE_NEW); + } throw exception(INSUFFICIENT_BALANCE); } return money; @@ -384,7 +387,6 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { public void checkOrder(Long userId,Long carteenId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(DishOrderDO::getUserId,userId); wrapper.eq(DishOrderDO::getOrderStatus,DishOrderDO.TOCOMPLETE); wrapper.eq(DishOrderDO::getStoreId,carteenId); @@ -487,21 +489,12 @@ public class DiningPlatesServiceImpl implements DiningPlatesService { .eq(DiningPlatesDO::getDiningPlatesNum, diningPlatesNum) .eq(DiningPlatesDO::getStoreId,storeId) .last("limit 1")); -// BigDecimal moneyByUserId = cardService.getMoneyByUserId(diningPlatesDO.getUserId()); MemberUserDO memberUserDO = memberUserMapper.selectById(diningPlatesDO.getUserId()); -// DishesRespDto dish = dishesApi.getDish(dishId); - - MoneyDO moneyDO = moneyService.getMoney(memberUserDO.getId(), storeId); - BigDecimal cashAmount = BigDecimal.ZERO; - if(ObjectUtil.isNotEmpty(moneyDO)){ - cashAmount = moneyDO.getCashAmount(); - } + BigDecimal cashAmount = moneyService.getAllMoney(memberUserDO.getId()); AppUserInfo appUserInfo = new AppUserInfo(); appUserInfo.setNickname(StrUtil.isNotBlank(memberUserDO.getName())?memberUserDO.getName():memberUserDO.getNickname()) -// .setDishesName(dish.getDishesName()) -// .setDishesBasePrice(dish.getDishesBasePrice()).setDishesSumPrice(dish.getDishesSumPrice()) .setMoney(memberUserDO.getWxAmount().add(cashAmount)) .setOrderMoney(new BigDecimal(stringRedisTemplate.opsForValue().get(diningPlatesNum+"-"+storeId))) .setReception(memberUserDO.getReception()).setLimitAmount(memberUserDO.getLimitAmount()); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java index 84018341..7ccea7f0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java @@ -133,4 +133,9 @@ public interface MemberGroupService { void setAdmin(GroupAdminReqVO vo); List getCarteenId(Long userId); + + /** + * 获取用户所在组类别 + */ + Integer getGroupTypeByUserId(Long userId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java index 04f835fb..edfedd1f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java @@ -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.user.MemberUserDO; 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.user.MemberUserService; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -201,4 +202,14 @@ public class MemberGroupServiceImpl implements MemberGroupService { public List getCarteenId(Long userId) { return memberGroupMapper.getCarteenId(userId); } + + @Override + public Integer getGroupTypeByUserId(Long userId) { + List groupByUserId = memberGroupMapper.getGroupByUserId(userId); + if (CollectionUtil.isEmpty(groupByUserId)) { + return GroupTypeEnum.PERSON.getCode(); + } + List collect = groupByUserId.stream().map(MemberGroupDO::getType).collect(Collectors.toList()); + return collect.get(0); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyService.java index 79a24a77..0f67b1d1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyService.java @@ -60,6 +60,8 @@ public interface MoneyService { */ MoneyDO getMoney(Long userId, Long carteenId); + BigDecimal getAllMoney(Long userId); + List getAllDebt(Long userId); void updateById(MoneyDO moneyDO); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyServiceImpl.java index 91b9f649..462bc833 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/money/MoneyServiceImpl.java @@ -81,6 +81,15 @@ public class MoneyServiceImpl implements MoneyService { return moneyMapper.selectOne(new LambdaQueryWrapper().eq(MoneyDO::getUserId, userId).eq(MoneyDO::getCarteenId, carteenId)); } + @Override + public BigDecimal getAllMoney(Long userId) { + List moneyDOS = moneyMapper.selectList(new LambdaQueryWrapper().eq(MoneyDO::getUserId, userId)); + if(CollectionUtil.isNotEmpty(moneyDOS)){ + return moneyDOS.stream().map(MoneyDO::getCashAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + } + return BigDecimal.ZERO; + } + @Override public List getAllDebt(Long userId) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml index 04f0a1f9..0970aca4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/group/MemberGroupMapper.xml @@ -90,4 +90,9 @@ id in (select group_id from member_group_member where member_id = #{userId}) + + \ No newline at end of file