This commit is contained in:
seesaw
2024-10-17 16:01:04 +08:00
parent b8f709f284
commit 8d4f8a6706
19 changed files with 792 additions and 78 deletions

View File

@ -86,7 +86,7 @@ public interface ErrorCodeConstants {
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, "订单未完成");
ErrorCode NEED_ADD_USER = new ErrorCode(1_007_901_004, "请先添加人员");
ErrorCode NEED_ADD_USER = new ErrorCode(1_007_901_004, "人员未指定");
ErrorCode ADMIN_CARD_NOT_EXISTS = new ErrorCode(1_007_901_005, "管理员卡不存在");
ErrorCode CARD_NOT_EXIST = new ErrorCode(1_007_901_005, "卡号不存在");
ErrorCode ADMIN_CARD = new ErrorCode(1_007_901_006, "管理员餐盘无法绑定");

View File

@ -49,7 +49,7 @@ public class BusinessPageReqVO extends PageParam {
@Schema(description = "智能称重")
private BigDecimal weigh;
@Schema(description = "创建时间")
@Schema(description = "日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
import cn.iocoder.yudao.module.member.controller.app.business.vo.BusinessDataVO;
import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO;
import cn.iocoder.yudao.module.member.service.business.BusinessService;
import io.swagger.v3.oas.annotations.Operation;
@ -35,8 +36,8 @@ public class AppBusinessController {
@GetMapping("/data")
@Operation(summary = "获得营业统计")
public CommonResult<List<BusinessRespVO>> getBusinessPage(String time,Long carteenId,Integer type) {
List<BusinessRespVO> result = new ArrayList<>();
public CommonResult<BusinessDataVO> getBusinessPage(String time,Long carteenId,Integer type) {
BusinessDataVO result = new BusinessDataVO();
switch (type){
case 0:
result = businessService.getDay(time, carteenId);

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.member.controller.app.business.vo;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
import lombok.Data;
import java.util.List;
@Data
public class BusinessDataVO {
private BusinessRespVO old;
private List<BusinessRespVO> businessList;
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.member.service.amount;
import java.math.BigDecimal;
public interface AmountService {
void operateAmount(Long userId, BigDecimal money, BigDecimal cashAmount, BigDecimal giftAmount, BigDecimal wxAmount);
BigDecimal getAmount(Long userId);
}

View File

@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.rechargelog.RechargeLogDO;
import cn.iocoder.yudao.module.member.dal.dataobject.refund.RefundDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.rechargelog.RechargeLogMapper;
import cn.iocoder.yudao.module.member.dal.mysql.refund.IntegralRefundMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import cn.iocoder.yudao.module.member.service.appup.AppUpService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 金额操作 Service 实现类
*
* @author 开发账号
*/
@Service
@Slf4j
public class AmountServiceImpl implements AmountService {
@Resource
private MemberUserMapper userMapper;
@Resource
private DishOrderMapper dishOrderMapper;
@Resource
private CardMapper cardMapper;
@Resource
private IntegralRefundMapper refundMapper;
@Resource
private RechargeLogMapper rechargeLogMapper;
@Override
public void operateAmount(Long userId, BigDecimal money, BigDecimal cashAmount, BigDecimal giftAmount, BigDecimal wxAmount) {
synchronized (userId) {
MemberUserDO memberUserDO = userMapper.selectById(userId);
if (memberUserDO != null) {
memberUserDO.setMoney(memberUserDO.getMoney().add(money));
memberUserDO.setCashAmount(memberUserDO.getCashAmount().add(cashAmount));
memberUserDO.setGiftAmount(memberUserDO.getGiftAmount().add(giftAmount));
// memberUserDO.setWxAmt(memberUserDO.getWxAmt().add(wxAmount));
userMapper.updateById(memberUserDO);
}
}
}
@Override
public BigDecimal getAmount(Long userId) {
return null;
}
//微信充值
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RechargeVO;
import java.math.BigDecimal;
import java.util.List;
public interface CashRechargeService {
void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money);
}

View File

@ -0,0 +1,154 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.refund.RefundDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.refund.IntegralRefundMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 现金充值 Service 实现类
*
* @author 开发账号
*/
@Service
@Slf4j
public class CashRechargeServiceImpl implements CashRechargeService{
@Resource
private MemberUserMapper userMapper;
@Resource
private DishOrderMapper dishOrderMapper;
@Resource
private CardMapper cardMapper;
@Resource
private IntegralRefundMapper refundMapper;
@Resource
private MemberGroupMapper memberGroupMapper;
@Override
public void rechargeByAdmin(List<Long> userIds, Long groupId, BigDecimal money) {
List<Long> memberList = new ArrayList<>();
if (groupId != null) {
memberList.addAll(memberGroupMapper.getMemberList(groupId));
} else {
memberList.addAll(userIds);
}
//明细列表
ArrayList<CardDO> addList = new ArrayList<>();
for (Long userId : memberList){
BigDecimal newMoney;
BigDecimal wxNewMoney;
BigDecimal giftNewMoney;
BigDecimal cashNewAmount;
synchronized (userId){
MemberUserDO memberUserDO = userMapper.selectById(userId);
//金额变动
memberUserDO.setMoney(memberUserDO.getMoney().add(money));
if (memberUserDO.getMoney().compareTo(BigDecimal.ZERO) > 0) {
memberUserDO.setCashAmount(memberUserDO.getCashAmount().add(money));
}
userMapper.updateById(memberUserDO);
newMoney = memberUserDO.getMoney();
wxNewMoney = memberUserDO.getWxAmount();
giftNewMoney = memberUserDO.getGiftAmount();
cashNewAmount = memberUserDO.getCashAmount();
}
//记录明细
CardDO add = new CardDO();
add.setUserId(userId);
add.setFlag(CardDO.ADD);
add.setChangeMoney(money);
add.setType(CostTypeEnum.ADMIN_PAY.getCode());
add.setMoney(newMoney);
add.setCashAmount(cashNewAmount);
add.setWxAmount(wxNewMoney);
add.setGiftAmount(giftNewMoney);
addList.add(add);
}
//处理订单
handleOrderCash(memberList,money);
//批量添加
cardMapper.insertBatch(addList);
}
void handleOrderCash(List<Long> userIds, BigDecimal money) {
ArrayList<DishOrderDO> updateList = new ArrayList<>();
List<Long> refundOrder = getRefundOrder();
//查询出所有未完全支付订单
for (Long userId : userIds){
BigDecimal cashMoney = money;
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>lambdaQuery()
.eq(DishOrderDO::getUserId, userId).eq(DishOrderDO::getOrderStatus, DishOrderDO.TOCOMPLETE));
if (CollectionUtil.isNotEmpty(dishOrderDOS)) {
for (DishOrderDO dishOrderDO : dishOrderDOS) {
BigDecimal payAmount = dishOrderDO.getPayAmount();
if(payAmount.compareTo(cashMoney)<=0){
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
dishOrderDO.setPayAmount(BigDecimal.ZERO);
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(payAmount));
if(refundOrder.contains(dishOrderDO.getId())){
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
}
dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(payAmount));
cashMoney = cashMoney.subtract(payAmount);
updateList.add(dishOrderDO);
}else {
dishOrderDO.setPayAmount(payAmount.subtract(cashMoney));
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(cashMoney));
if(refundOrder.contains(dishOrderDO.getId())){
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
}
dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(cashMoney));
updateList.add(dishOrderDO);
break;
}
}
}
}
if(CollectionUtil.isNotEmpty(updateList)){
dishOrderMapper.updateBatch(updateList);
}
}
public List<Long> getRefundOrder(){
List<RefundDO> refundDOS = refundMapper.selectList(Wrappers.<RefundDO>lambdaQuery().in(RefundDO::getStatus, Arrays.asList("2", "3")));
ArrayList<Long> orderIds = new ArrayList<>();
if(CollectionUtil.isNotEmpty(refundDOS)){
List<Long> collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList());
orderIds.addAll(collect);
}
return orderIds;
}
}

View File

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import java.math.BigDecimal;
import java.util.List;
public interface DeductionService {
void deduction(DishOrderDO dishOrderDO);
}

View File

@ -0,0 +1,173 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
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.mysql.user.MemberUserMapper;
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.diningplates.DiningPlatesService;
import cn.iocoder.yudao.module.member.service.order.OrderService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 餐盘统一扣款 Service 实现类
*
* @author 开发账号
*/
@Service
@Slf4j
public class DeductionServiceImpl implements DeductionService {
@Resource
private StringRedisTemplate deductionRedisTemplate;
@Resource
private CardService cardService;
@Resource
private MemberUserService userService;
@Resource
private BusinessService businessService;
@Override
public void deduction(DishOrderDO dishOrderDO) {
Long userId = dishOrderDO.getUserId();
BigDecimal newMoney;
BigDecimal changeMoney;
BigDecimal wxNewMoney;
BigDecimal giftNewMoney;
BigDecimal cashNewAmount;
synchronized (userId) {
MemberUserDO user = userService.getUser(userId);
//新的总价
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;
if (total.compareTo(BigDecimal.ZERO) > 0) {
reductionAmount = userService.getReductionAmount(userId, total, dishOrderDO.getCreateTime());
}
if(dishOrderDO.getReductionAmount().compareTo(BigDecimal.ZERO) > 0){
reductionAmount = reductionAmount.add(dishOrderDO.getReductionAmount());
dishOrderDO.setReductionAmount(reductionAmount);
}else {
dishOrderDO.setReductionAmount(reductionAmount);
}
dishOrderDO.setReductionState(reductionAmount.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
//计算减免后的总价
if (total.compareTo(reductionAmount) < 0) {
total = BigDecimal.ZERO;
} else {
total = total.subtract(reductionAmount);
}
BigDecimal wxAmount = user.getWxAmount();
BigDecimal giftAmount = user.getGiftAmount();
BigDecimal cashAmount = user.getCashAmount();
user.setMoney(money.subtract(total));
//待支付金额 最大退款金额
dishOrderDO.setRefundAmount(total);
if (money.compareTo(BigDecimal.ZERO) <= 0) {
dishOrderDO.setPayAmount(total);
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
} else {
if (total.compareTo(money) > 0) {
dishOrderDO.setPayAmount(total.subtract(money));
dishOrderDO.setRefundAmount(money);
}
}
if (total.compareTo(money) > 0) {
dishOrderDO.setOrderStatus(DishOrderDO.TOCOMPLETE);
dishOrderDO.setWxAmount(wxAmount);
dishOrderDO.setCashAmount(cashAmount);
dishOrderDO.setGiftAmount(giftAmount);
user.setWxAmount(BigDecimal.ZERO);
user.setCashAmount(BigDecimal.ZERO);
user.setGiftAmount(BigDecimal.ZERO);
} else {
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
//计算金额
if (total.compareTo(cashAmount) <= 0) {
user.setCashAmount(cashAmount.subtract(total));
dishOrderDO.setCashAmount(total);
} else {
user.setCashAmount(BigDecimal.ZERO);
dishOrderDO.setCashAmount(cashAmount);
BigDecimal total1 = total.subtract(cashAmount);
if (total1.compareTo(giftAmount) <= 0) {
user.setGiftAmount(giftAmount.subtract(total1));
dishOrderDO.setGiftAmount(total1);
} else {
user.setGiftAmount(BigDecimal.ZERO);
dishOrderDO.setGiftAmount(giftAmount);
BigDecimal total2 = total1.subtract(giftAmount);
user.setWxAmount(wxAmount.subtract(total2));
dishOrderDO.setWxAmount(total2);
}
}
}
userService.updateById(user);
newMoney = user.getMoney();
wxNewMoney = user.getWxAmount();
giftNewMoney = user.getGiftAmount();
cashNewAmount = user.getCashAmount();
changeMoney = total;
}
CardDO cardDO = new CardDO();
cardDO.setType(TimePeriodEnum.getTimePeriod(dishOrderDO.getCreateTime()));
cardDO.setUserId(userId);
cardDO.setChangeMoney(changeMoney);
cardDO.setFlag(CardDO.MINUS);
cardDO.setMoney(newMoney);
cardDO.setCashAmount(cashNewAmount);
cardDO.setWxAmount(wxNewMoney);
cardDO.setGiftAmount(giftNewMoney);
cardService.insertOne(cardDO);
dishOrderDO.setTotalMoney(changeMoney);
dishOrderDO.setUpdateTime(LocalDateTime.now());
deductionRedisTemplate.delete(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId());
//更新营业数据
if(dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)){
StatisticsVo statisticsVo = new StatisticsVo();
statisticsVo.setCarteenId(dishOrderDO.getStoreId());
statisticsVo.setTotalMoney(dishOrderDO.getTotalMoney());
statisticsVo.setOrder_sum(1);
statisticsVo.setReduceMoney(dishOrderDO.getReductionAmount());
statisticsVo.setTime(dishOrderDO.getCreateTime());
statisticsVo.setOrderId(dishOrderDO.getId());
businessService.updateStatistics(statisticsVo);
}
}
}

View File

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.member.service.amount;
import java.math.BigDecimal;
public interface WxRechargeService {
void wxRecharge(BigDecimal money, BigDecimal wxAmount, BigDecimal giftAmount, Long userId);
}

View File

@ -0,0 +1,204 @@
package cn.iocoder.yudao.module.member.service.amount;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.rechargelog.RechargeLogDO;
import cn.iocoder.yudao.module.member.dal.dataobject.refund.RefundDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.rechargelog.RechargeLogMapper;
import cn.iocoder.yudao.module.member.dal.mysql.refund.IntegralRefundMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 微信充值 Service 实现类
*
* @author 开发账号
*/
@Service
@Slf4j
public class WxRechargeServiceImpl implements WxRechargeService {
@Resource
private MemberUserMapper userMapper;
@Resource
private DishOrderMapper dishOrderMapper;
@Resource
private CardMapper cardMapper;
@Resource
private IntegralRefundMapper refundMapper;
@Resource
private RechargeLogMapper rechargeLogMapper;
@Override
public void wxRecharge(BigDecimal money, BigDecimal wxAmount, BigDecimal giftAmount, Long userId) {
BigDecimal newMoney;
BigDecimal wxNewMoney;
BigDecimal giftNewMoney;
BigDecimal cashNewAmount;
synchronized (userId) {
//获取最新余额
MemberUserDO memberUserDO = userMapper.selectById(userId);
BigDecimal oldMoney = memberUserDO.getMoney();
BigDecimal wxOldMoney = memberUserDO.getWxAmount();
BigDecimal giftOldMoney = memberUserDO.getGiftAmount();
BigDecimal cashAmount = memberUserDO.getCashAmount();
memberUserDO.setMoney(oldMoney.add(money));
memberUserDO.setCashAmount(cashAmount);
memberUserDO.setGiftAmount(giftOldMoney);
memberUserDO.setWxAmount(wxOldMoney);
if (memberUserDO.getMoney().compareTo(BigDecimal.ZERO) > 0) {
if (oldMoney.compareTo(BigDecimal.ZERO) < 0) {
if (wxAmount.add(oldMoney).compareTo(BigDecimal.ZERO) >= 0) {
memberUserDO.setWxAmount(wxAmount.add(oldMoney));
memberUserDO.setGiftAmount(giftOldMoney.add(giftAmount));
} else {
BigDecimal left = wxAmount.add(oldMoney);
memberUserDO.setWxAmount(BigDecimal.ZERO);
memberUserDO.setGiftAmount(giftAmount.add(left));
}
} else {
memberUserDO.setWxAmount(wxOldMoney.add(wxAmount));
memberUserDO.setGiftAmount(giftOldMoney.add(giftAmount));
}
}
userMapper.updateById(memberUserDO);
newMoney = memberUserDO.getMoney();
wxNewMoney = memberUserDO.getWxAmount();
giftNewMoney = memberUserDO.getGiftAmount();
cashNewAmount = memberUserDO.getCashAmount();
}
//明细处理
CardDO cardDO = new CardDO();
cardDO.setUserId(userId);
cardDO.setFlag(CardDO.ADD);
cardDO.setChangeMoney(money);
cardDO.setType(CostTypeEnum.WX_PAY.getCode());
cardDO.setMoney(newMoney);
cardDO.setCashAmount(wxNewMoney);
cardDO.setGiftAmount(giftNewMoney);
cardDO.setWxAmount(cashNewAmount);
//处理未完全支付订单
handleOrderWx(cardDO.getUserId(), money, wxAmount, giftAmount);
cardMapper.insert(cardDO);
}
void handleOrderWx(Long userId, BigDecimal money, BigDecimal wxMoney, BigDecimal giftMoney) {
//开始的微信金额
BigDecimal wxStart = wxMoney;
//已审核的订单
List<Long> refundOrder = getRefundOrder();
//查询出所有未完全支付订单
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>lambdaQuery()
.eq(DishOrderDO::getUserId, userId).eq(DishOrderDO::getOrderStatus, DishOrderDO.TOCOMPLETE));
ArrayList<DishOrderDO> updateList = new ArrayList<>();
if (CollectionUtil.isNotEmpty(dishOrderDOS)) {
for (DishOrderDO dishOrderDO : dishOrderDOS) {
BigDecimal payAmount = dishOrderDO.getPayAmount();
if (payAmount.compareTo(money) <= 0) {
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
dishOrderDO.setPayAmount(BigDecimal.ZERO);
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(payAmount));
if (refundOrder.contains(dishOrderDO.getId())) {
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
}
if (payAmount.compareTo(wxMoney) <= 0) {
dishOrderDO.setWxAmount(dishOrderDO.getWxAmount().add(payAmount));
wxMoney = wxMoney.subtract(payAmount);
} else {
dishOrderDO.setWxAmount(dishOrderDO.getWxAmount().add(wxMoney));
wxMoney = BigDecimal.ZERO;
BigDecimal left = payAmount.subtract(wxMoney);
dishOrderDO.setGiftAmount(dishOrderDO.getGiftAmount().add(left));
giftMoney = giftMoney.subtract(left);
}
money = money.subtract(payAmount);
updateList.add(dishOrderDO);
} else {
dishOrderDO.setPayAmount(payAmount.subtract(money));
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(money));
if (refundOrder.contains(dishOrderDO.getId())) {
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
}
dishOrderDO.setWxAmount(dishOrderDO.getWxAmount().add(wxMoney));
dishOrderDO.setGiftAmount(dishOrderDO.getGiftAmount().add(giftMoney));
wxMoney = BigDecimal.ZERO;
updateList.add(dishOrderDO);
break;
}
}
}
rechargeLog(wxStart.subtract(wxMoney));
if (CollectionUtil.isNotEmpty(updateList)) {
dishOrderMapper.updateBatch(updateList);
}
}
//补充金额记录
public void rechargeLog(BigDecimal money) {
List<RechargeLogDO> rechargeLogDOList = rechargeLogMapper.selectList(Wrappers.<RechargeLogDO>lambdaQuery()
.apply("TO_DAYS(NOW())-TO_DAYS(create_time) = 0"));
if (CollectionUtil.isNotEmpty(rechargeLogDOList)) {
RechargeLogDO rechargeLogDO = rechargeLogDOList.get(0);
rechargeLogDO.setMoney(rechargeLogDO.getMoney().add(money));
rechargeLogMapper.updateById(rechargeLogDO);
} else {
RechargeLogDO rechargeLogDO = new RechargeLogDO();
rechargeLogDO.setMoney(money);
rechargeLogDO.setCreateTime(LocalDateTime.now());
rechargeLogMapper.insert(rechargeLogDO);
}
}
public List<Long> getRefundOrder() {
List<RefundDO> refundDOS = refundMapper.selectList(Wrappers.<RefundDO>lambdaQuery().in(RefundDO::getStatus, Arrays.asList("2", "3")));
ArrayList<Long> orderIds = new ArrayList<>();
if (CollectionUtil.isNotEmpty(refundDOS)) {
List<Long> collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList());
orderIds.addAll(collect);
}
return orderIds;
}
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessPageR
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
import cn.iocoder.yudao.module.member.controller.app.business.vo.BusinessDataVO;
import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO;
import javax.validation.*;
@ -58,9 +59,9 @@ public interface BusinessService {
void updateStatistics(StatisticsVo vo);
List<BusinessRespVO> getDay(String time,Long carteenId);
BusinessDataVO getDay(String time, Long carteenId);
List<BusinessRespVO> getWeek(String time,Long carteenId);
BusinessDataVO getWeek(String time,Long carteenId);
List<BusinessRespVO> getMonth(String time,Long carteenId);
BusinessDataVO getMonth(String time,Long carteenId);
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.service.business;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -7,6 +8,7 @@ import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessPageR
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessRespVO;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.BusinessSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
import cn.iocoder.yudao.module.member.controller.app.business.vo.BusinessDataVO;
import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
import cn.iocoder.yudao.module.member.dal.mysql.business.BusinessMapper;
@ -159,7 +161,9 @@ public class BusinessServiceImpl implements BusinessService {
}
@Override
public List<BusinessRespVO> getDay(String time,Long carteenId) {
public BusinessDataVO getDay(String time,Long carteenId) {
BusinessDataVO businessDataVO = new BusinessDataVO();
LambdaQueryWrapper<BusinessDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BusinessDO::getCarteenId,carteenId);
@ -167,11 +171,12 @@ public class BusinessServiceImpl implements BusinessService {
wrapper.apply("DATE_FORMAT(create_time, '%Y-%m') = {0}", time);
List<BusinessDO> businessDOS = businessMapper.selectList(wrapper);
Map<String, BusinessDO> map = businessDOS.stream().collect(Collectors.toMap(vo -> vo.getCreateTime().format(DateTimeFormatter.ofPattern("dd"))
Map<Integer, BusinessDO> map = businessDOS.stream().collect(Collectors.toMap(
vo -> vo.getCreateTime().toLocalDate().getDayOfMonth()
, vo -> vo, (existing, replacement) -> existing));
// 创建一个Map来存储每天的数据
Map<String, BusinessRespVO> monthData = new LinkedHashMap<>();
Map<Integer, BusinessRespVO> monthData = new LinkedHashMap<>();
// 定义日期格式化器
@ -188,30 +193,52 @@ public class BusinessServiceImpl implements BusinessService {
// 循环遍历该月的每一天
for (int day = 1; day <= daysInMonth; day++) {
// 获取当前日期
LocalDate date = yearMonth.atDay(day);
// 格式化日期为两位数的形式
String key = date.format(dayFormatter);
if(map.get(key) == null){
if(map.get(day) == null){
BusinessRespVO bean = new BusinessRespVO();
bean.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO)
.setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO)
.setTime(key);
monthData.put(key,bean);
.setTime(String.valueOf(day));
monthData.put(day,bean);
}else {
BusinessRespVO bean = BeanUtils.toBean(map.get(key), BusinessRespVO.class);
bean.setTime(key);
monthData.put(key,bean);
BusinessRespVO bean = BeanUtils.toBean(map.get(day), BusinessRespVO.class);
bean.setTime(String.valueOf(day));
monthData.put(day,bean);
}
}
return new ArrayList<>(monthData.values());
//获取上一个月最后一天的数据
// 获取上一个月的最后一天
YearMonth previousMonth = yearMonth.minusMonths(1);
LocalDate lastDayOfPreviousMonth = previousMonth.atEndOfMonth();
// 定义格式化器,将 LocalDate 转换为 yyyy-MM-dd 格式
DateTimeFormatter formatterDay = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将 LocalDate 转换为指定格式的字符串
String formattedDate = lastDayOfPreviousMonth.format(formatterDay);
LambdaQueryWrapper<BusinessDO> previousWrapper = new LambdaQueryWrapper<>();
previousWrapper.eq(BusinessDO::getCarteenId,carteenId);
previousWrapper.orderByAsc(BusinessDO::getCreateTime);
previousWrapper.apply("DATE_FORMAT(create_time, '%Y-%m-%d') = {0}", formattedDate);
List<BusinessDO> previousList = businessMapper.selectList(previousWrapper);
BusinessRespVO old = new BusinessRespVO();
if(CollectionUtil.isNotEmpty(previousList)){
BeanUtil.copyProperties(previousList.get(0), old);
}else {
old.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO)
.setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO);
}
businessDataVO.setOld(old);
businessDataVO.setBusinessList(new ArrayList<>(monthData.values()));
return businessDataVO;
}
@Override
public List<BusinessRespVO> getWeek(String time,Long carteenId) {
public BusinessDataVO getWeek(String time,Long carteenId) {
BusinessDataVO businessDataVO = new BusinessDataVO();
LambdaQueryWrapper<BusinessDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BusinessDO::getCarteenId,carteenId);
@ -240,31 +267,18 @@ public class BusinessServiceImpl implements BusinessService {
// 使用weekFields获取当前日期属于当月的第几周
int i = date.get(weekFields.weekOfMonth());
BusinessRespVO businessRespVO = map.get(i);
//营业额
businessRespVO.setTurnover(businessRespVO.getTurnover().add(businessDO.getTurnover()));
//订单数
businessRespVO.setOrderSum(businessRespVO.getOrderSum()+businessDO.getOrderSum());
//均单价
businessRespVO.setPriceAvg(businessDO.getTurnover().divide(new BigDecimal(businessDO.getOrderSum()), 2, RoundingMode.HALF_UP));
//减免金额
businessRespVO.setReduce(businessRespVO.getReduce().add(businessDO.getReduce()));
//重量
businessRespVO.setWeigh(businessRespVO.getWeigh().add(businessDO.getWeigh()));
//早
businessRespVO.setBreakfast(businessRespVO.getBreakfast().add(businessDO.getBreakfast()));
//中
businessRespVO.setLunch(businessRespVO.getLunch().add(businessDO.getLunch()));
//晚
businessRespVO.setDinner(businessRespVO.getDinner().add(businessDO.getDinner()));
//门店
businessRespVO.setCarteenId(businessDO.getCarteenId());
handleBusiness(businessDO,businessRespVO);
}
return new ArrayList<>(map.values());
businessDataVO.setBusinessList(new ArrayList<>(map.values()));
return businessDataVO;
}
@Override
public List<BusinessRespVO> getMonth(String time,Long carteenId) {
public BusinessDataVO getMonth(String time,Long carteenId) {
BusinessDataVO businessDataVO = new BusinessDataVO();
int year = MemberTimeUtils.getYearFromYearMonthString(time);
@ -287,33 +301,52 @@ public class BusinessServiceImpl implements BusinessService {
LocalDate date = businessDO.getCreateTime().toLocalDate();
// 使用weekFields获取当前日期属于当月的第几周
// 当前日期属于哪月
int i = date.getMonthValue();
BusinessRespVO businessRespVO = map.get(i);
//营业额
businessRespVO.setTurnover(businessRespVO.getTurnover().add(businessDO.getTurnover()));
//订单数
businessRespVO.setOrderSum(businessRespVO.getOrderSum()+businessDO.getOrderSum());
//均单价
businessRespVO.setPriceAvg(businessDO.getTurnover().divide(new BigDecimal(businessDO.getOrderSum()), 2, RoundingMode.HALF_UP));
//减免金额
businessRespVO.setReduce(businessRespVO.getReduce().add(businessDO.getReduce()));
//重量
businessRespVO.setWeigh(businessRespVO.getWeigh().add(businessDO.getWeigh()));
//早
businessRespVO.setBreakfast(businessRespVO.getBreakfast().add(businessDO.getBreakfast()));
//中
businessRespVO.setLunch(businessRespVO.getLunch().add(businessDO.getLunch()));
//晚
businessRespVO.setDinner(businessRespVO.getDinner().add(businessDO.getDinner()));
//门店
businessRespVO.setCarteenId(businessDO.getCarteenId());
handleBusiness(businessDO,businessRespVO);
}
return new ArrayList<>(map.values());
//上一年最后一月
int previousYear = year - 1;
LambdaQueryWrapper<BusinessDO> previousWrapper = new LambdaQueryWrapper<>();
previousWrapper.eq(BusinessDO::getCarteenId,carteenId);
previousWrapper.orderByAsc(BusinessDO::getCreateTime);
previousWrapper.apply("DATE_FORMAT(create_time, '%Y-%m') = {0}", previousYear+"-12");
List<BusinessDO> previousList = businessMapper.selectList(previousWrapper);
BusinessRespVO previousVO = new BusinessRespVO();
previousVO.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO)
.setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO);
for (BusinessDO businessDO : previousList) {
handleBusiness(businessDO,previousVO);
}
businessDataVO.setOld(previousVO);
businessDataVO.setBusinessList(new ArrayList<>(map.values()));
return businessDataVO;
}
void handleBusiness(BusinessDO businessDO, BusinessRespVO businessRespVO) {
//营业额
businessRespVO.setTurnover(businessRespVO.getTurnover().add(businessDO.getTurnover()));
//订单数
businessRespVO.setOrderSum(businessRespVO.getOrderSum()+businessDO.getOrderSum());
//均单价
businessRespVO.setPriceAvg(businessDO.getTurnover().divide(new BigDecimal(businessDO.getOrderSum()), 2, RoundingMode.HALF_UP));
//减免金额
businessRespVO.setReduce(businessRespVO.getReduce().add(businessDO.getReduce()));
//重量
businessRespVO.setWeigh(businessRespVO.getWeigh().add(businessDO.getWeigh()));
//早
businessRespVO.setBreakfast(businessRespVO.getBreakfast().add(businessDO.getBreakfast()));
//中
businessRespVO.setLunch(businessRespVO.getLunch().add(businessDO.getLunch()));
//晚
businessRespVO.setDinner(businessRespVO.getDinner().add(businessDO.getDinner()));
//门店
businessRespVO.setCarteenId(businessDO.getCarteenId());
}
}

View File

@ -86,6 +86,8 @@ public interface MemberUserService {
*/
MemberUserDO getUser(Long id);
void updateById(MemberUserDO memberUserDO);
/**
* 通过用户 ID 查询用户们
*

View File

@ -209,6 +209,11 @@ public class MemberUserServiceImpl implements MemberUserService {
return memberUserMapper.selectById(id);
}
@Override
public void updateById(MemberUserDO memberUserDO) {
memberUserMapper.updateById(memberUserDO);
}
@Override
public List<MemberUserDO> getUserList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {

View File

@ -174,6 +174,7 @@ public interface ErrorCodeConstants {
ErrorCode CARTEEN_NOT_EXISt = new ErrorCode(1_002_029_002, "当前门店不存在");
// ========== 菜品管理 1-002-030-000 ==========
ErrorCode DISHES_NOT_EXISTS = new ErrorCode(1_002_030_002, "当前菜品不存在");
ErrorCode DISHES_EXISTS = new ErrorCode(1_002_030_003, "菜品名重复");
// ========== 菜品关联门店 1-002-032-000 ==========
ErrorCode DISHES_TYPE_NOT_EXISTS = new ErrorCode(1_002_032_002, "当前菜品类型不存在");
// ========== 门店 流水 1_002_033_002 ==========

View File

@ -30,6 +30,8 @@ public interface DishesMapper extends BaseMapperX<DishesDO> {
.eqIfPresent(DishesDO::getDishesVipWeighPrice, reqVO.getDishesVipWeighPrice())
.eqIfPresent(DishesDO::getDishecCook, reqVO.getDishecCook())
.eqIfPresent(DishesDO::getDishecType, reqVO.getDishecType())
.eqIfPresent(DishesDO::getWeekTime, reqVO.getWeekTime())
.eqIfPresent(DishesDO::getTimeSlot,reqVO.getTimeSlot())
.inIfPresent(DishesDO::getWeekTime, reqVO.getWeekTimes())
.betweenIfPresent(DishesDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(DishesDO::getId));

View File

@ -69,7 +69,7 @@ public class DishesServiceImpl implements DishesService {
DishesDO dishes = BeanUtils.toBean(createReqVO, DishesDO.class);
dishes.setDeleted(Boolean.FALSE);
checkDishes(dishes.getDishesName(),dishes.getCarteenId());
checkDishes(dishes.getDishesName(),dishes.getCarteenId(),null);
LocalDateTime today = LocalDateTime.now();
int hour = today.getHour();
@ -117,7 +117,7 @@ public class DishesServiceImpl implements DishesService {
dishes.setCarteenId(carteenId);
dishes.setDishesNumber(new BigDecimal("50"));
checkDishes(dishes.getDishesName(),dishes.getCarteenId());
checkDishes(dishes.getDishesName(),dishes.getCarteenId(),null);
LocalDateTime today = LocalDateTime.now();
int hour = today.getHour();
@ -148,7 +148,7 @@ public class DishesServiceImpl implements DishesService {
// 更新
DishesDO updateObj = BeanUtils.toBean(updateReqVO, DishesDO.class);
checkDishes(updateObj.getDishesName(),updateObj.getCarteenId());
checkDishes(updateObj.getDishesName(),updateObj.getCarteenId(),updateReqVO.getId());
//计算每g多少钱
BigDecimal dishesSumPrice = updateObj.getDishesSumPrice();
@ -175,10 +175,10 @@ public class DishesServiceImpl implements DishesService {
@Override
public void updateDishesApp(AppUpdateVO vo) {
validateDishesExists(vo.getId());
DishesDO dishesDO = validateDishesExists(vo.getId());
DishesDO updateObj = BeanUtils.toBean(vo, DishesDO.class);
checkDishes(updateObj.getDishesName(),updateObj.getCarteenId());
checkDishes(updateObj.getDishesName(),dishesDO.getCarteenId(),vo.getId());
//计算每g多少钱
BigDecimal dishesSumPrice = updateObj.getDishesSumPrice();
@ -201,10 +201,12 @@ public class DishesServiceImpl implements DishesService {
dishesMapper.deleteById(id);
}
private void validateDishesExists(Long id) {
if (dishesMapper.selectById(id) == null) {
private DishesDO validateDishesExists(Long id) {
DishesDO dishesDO = dishesMapper.selectById(id);
if ( dishesDO == null) {
throw exception(ErrorCodeConstants.DISHES_NOT_EXISTS);
}
return dishesDO;
}
/**
@ -308,13 +310,13 @@ public class DishesServiceImpl implements DishesService {
}
void checkDishes(String dishName,Long carteenId){
void checkDishes(String dishName,Long carteenId,Long id){
List<DishesDO> dishesDOS = dishesMapper.selectList(Wrappers.<DishesDO>lambdaQuery()
.eq(DishesDO::getCarteenId, carteenId)
.eq(DishesDO::getDishesName, dishName));
.eq(DishesDO::getDishesName, dishName)
.ne(id!=null, DishesDO::getId, id));
if(!dishesDOS.isEmpty()){
throw exception(2000_10_002, "菜品名称已存在");
throw exception(ErrorCodeConstants.DISHES_EXISTS);
}
}