金额互用
This commit is contained in:
@ -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, "订单未完成");
|
||||
|
@ -64,4 +64,6 @@ public interface MemberGroupMapper extends BaseMapperX<MemberGroupDO> {
|
||||
void deleteAssociation(Long groupId);
|
||||
|
||||
List<Long> getCarteenId(Long userId);
|
||||
|
||||
List<MemberGroupDO> getGroupByUserId(Long userId);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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<String> 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<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());
|
||||
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<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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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<Integer> 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<DishOrderDO> 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());
|
||||
|
@ -133,4 +133,9 @@ public interface MemberGroupService {
|
||||
void setAdmin(GroupAdminReqVO vo);
|
||||
|
||||
List<Long> getCarteenId(Long userId);
|
||||
|
||||
/**
|
||||
* 获取用户所在组类别
|
||||
*/
|
||||
Integer getGroupTypeByUserId(Long userId);
|
||||
}
|
||||
|
@ -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<Long> getCarteenId(Long 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);
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,8 @@ public interface MoneyService {
|
||||
*/
|
||||
MoneyDO getMoney(Long userId, Long carteenId);
|
||||
|
||||
BigDecimal getAllMoney(Long userId);
|
||||
|
||||
List<MoneyDO> getAllDebt(Long userId);
|
||||
|
||||
void updateById(MoneyDO moneyDO);
|
||||
|
@ -81,6 +81,15 @@ public class MoneyServiceImpl implements MoneyService {
|
||||
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
|
||||
public List<MoneyDO> getAllDebt(Long userId) {
|
||||
|
||||
|
@ -90,4 +90,9 @@
|
||||
id in (select group_id from member_group_member where member_id = #{userId})
|
||||
</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>
|
Reference in New Issue
Block a user