|
|
|
@ -1,9 +1,10 @@
|
|
|
|
|
package cn.iocoder.yudao.module.member.service.billing;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
@ -12,7 +13,6 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
|
|
import cn.iocoder.yudao.module.member.api.card.CardApi;
|
|
|
|
|
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingPageReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMoneyVO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO;
|
|
|
|
@ -22,7 +22,6 @@ import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.mysql.billing.BillingMapper;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
|
|
|
|
@ -30,30 +29,17 @@ import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.mysql.orderspacecapsule.OrderSpaceCapsuleMapper;
|
|
|
|
|
import cn.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper;
|
|
|
|
|
import cn.iocoder.yudao.module.member.enums.*;
|
|
|
|
|
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
|
|
|
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.util.Assert;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.function.Function;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
|
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
|
|
|
@ -69,8 +55,6 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
@Resource
|
|
|
|
|
private BillingMapper billingMapper;
|
|
|
|
|
@Resource
|
|
|
|
|
private MemberUserService userService;
|
|
|
|
|
@Resource
|
|
|
|
|
private OrderSpaceCapsuleMapper orderSpaceCapsuleMapper;
|
|
|
|
|
@Resource
|
|
|
|
|
private DishOrderMapper dishOrderMapper;
|
|
|
|
@ -80,20 +64,19 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
private MemberGroupMapper memberGroupMapper;
|
|
|
|
|
@Resource
|
|
|
|
|
private CardMapper cardMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 食堂
|
|
|
|
|
* @param startTime
|
|
|
|
|
* @param endTime
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public List<DishOrderDO> getDishOrderDO(Date startTime, Date endTime, Set<Long> ids){
|
|
|
|
|
public List<DishOrderDO> getDishOrderDO(Date startTime, Date endTime, List<Long> ids,Long carteenId){
|
|
|
|
|
return dishOrderMapper.selectList(new LambdaQueryWrapperX<DishOrderDO>()
|
|
|
|
|
.betweenIfPresent(DishOrderDO::getCreateTime,startTime,endTime)
|
|
|
|
|
.eq(DishOrderDO::getOrderStatus,DishOrderDO.COMPLETE)
|
|
|
|
|
.ne(DishOrderDO::getBillingExist,Boolean.TRUE)
|
|
|
|
|
.in(ObjUtil.isNotEmpty(ids), DishOrderDO::getId,ids)
|
|
|
|
|
.ne(DishOrderDO::getBillingExist,Boolean.FALSE)
|
|
|
|
|
.eq(DishOrderDO::getStoreId,carteenId)
|
|
|
|
|
.in(DishOrderDO::getUserId,ids)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
@ -102,12 +85,13 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
* @param endTime
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public List<StoreOrderDO> getStoreOrderDO(Date startTime, Date endTime, Set<Long> ids){
|
|
|
|
|
public List<StoreOrderDO> getStoreOrderDO(Date startTime, Date endTime, List<Long> ids,Long carteenId){
|
|
|
|
|
return storeOrderMapper.selectList(new LambdaQueryWrapperX<StoreOrderDO>()
|
|
|
|
|
.betweenIfPresent(StoreOrderDO::getCreateTime,startTime,endTime)
|
|
|
|
|
.eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode())
|
|
|
|
|
.ne(StoreOrderDO::getBillingExist,Boolean.TRUE)
|
|
|
|
|
.in(ObjUtil.isNotEmpty(ids), StoreOrderDO::getOrderId,ids)
|
|
|
|
|
.ne(StoreOrderDO::getBillingExist,Boolean.FALSE)
|
|
|
|
|
.eq(StoreOrderDO::getCarteenId,carteenId)
|
|
|
|
|
.in(StoreOrderDO::getUserId,ids)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
@ -116,12 +100,13 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
* @param endTime
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public List<OrderSpaceCapsuleDO> getOrderSpaceCapsuleDO(Date startTime, Date endTime, Set<Long> ids){
|
|
|
|
|
public List<OrderSpaceCapsuleDO> getOrderSpaceCapsuleDO(Date startTime, Date endTime, List<Long> ids,Long carteenId){
|
|
|
|
|
return orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX<OrderSpaceCapsuleDO>()
|
|
|
|
|
.betweenIfPresent(OrderSpaceCapsuleDO::getCreateTime,startTime,endTime)
|
|
|
|
|
.eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())
|
|
|
|
|
.ne(OrderSpaceCapsuleDO::getBillingExist,Boolean.TRUE)
|
|
|
|
|
.in(ObjUtil.isNotEmpty(ids), OrderSpaceCapsuleDO::getId,ids)
|
|
|
|
|
.ne(OrderSpaceCapsuleDO::getBillingExist,Boolean.FALSE)
|
|
|
|
|
.eq(OrderSpaceCapsuleDO::getCarteenId,carteenId)
|
|
|
|
|
.in(OrderSpaceCapsuleDO::getUserId,ids)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
@ -129,40 +114,47 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
public String createBilling(BillingSaveReqVO createReqVO) {
|
|
|
|
|
// 插入 BillingDO 对象并生成唯一主键
|
|
|
|
|
BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class);
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupDO(billing.getUserId());
|
|
|
|
|
billing.setId(IdUtil.getSnowflakeNextId() + "");
|
|
|
|
|
// 获取用户信息
|
|
|
|
|
MemberUserDO user = userService.getUser(createReqVO.getUserId());
|
|
|
|
|
billing.setUserName(user.getNickname());
|
|
|
|
|
billing.setUserPhone(user.getMobile());
|
|
|
|
|
billing.setUserName(memberGroupDO.getName());
|
|
|
|
|
billing.setUserPhone(String.valueOf(memberGroupDO.getId()));
|
|
|
|
|
// 根据不同的 billingType 获取订单、金额和订单 ID 列表,并设置开票信息
|
|
|
|
|
List<Long> orderIds;
|
|
|
|
|
BigDecimal totalMoney;
|
|
|
|
|
String billingName;
|
|
|
|
|
//处理时间段
|
|
|
|
|
Date startTime = createReqVO.getStartTime();
|
|
|
|
|
DateTime start = DateUtil.beginOfMonth(startTime);
|
|
|
|
|
DateTime end = DateUtil.endOfMonth(startTime);
|
|
|
|
|
createReqVO.setStartTime(start);
|
|
|
|
|
createReqVO.setEndTime(end);
|
|
|
|
|
//获取当前单位下的所有人
|
|
|
|
|
List<Long> memberList = memberGroupMapper.getMemberList(memberGroupDO.getId());
|
|
|
|
|
switch (BillingEnum.fromCode(billing.getBillingType())) {
|
|
|
|
|
case BILLING_CANTEEN:
|
|
|
|
|
List<DishOrderDO> dishOrders = getDishOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
|
|
|
|
List<DishOrderDO> dishOrders = getDishOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), memberList,billing.getCarteenId());
|
|
|
|
|
if (CollUtil.isEmpty(dishOrders)) throw exception(BILLING_NOT_ORDER_EXISTS);
|
|
|
|
|
totalMoney = calculateTotalMoney(dishOrders, DishOrderDO::getTotalMoney);
|
|
|
|
|
orderIds = getOrderIds(dishOrders, DishOrderDO::getId);
|
|
|
|
|
billingName = "食堂餐饮费";
|
|
|
|
|
updateBillingExist(dishOrders, dishOrderMapper);
|
|
|
|
|
updateBillingExist(dishOrders, dishOrderMapper,billing.getId());
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SUPERMARKET:
|
|
|
|
|
List<StoreOrderDO> storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
|
|
|
|
List<StoreOrderDO> storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), memberList,billing.getCarteenId());
|
|
|
|
|
if (CollUtil.isEmpty(storeOrders)) throw exception(BILLING_NOT_ORDER_EXISTS);
|
|
|
|
|
totalMoney = calculateTotalMoney1(storeOrders, StoreOrderDO::getTotalPrice);
|
|
|
|
|
List<Integer> orderIds1 = getOrderIds(storeOrders, StoreOrderDO::getOrderId);
|
|
|
|
|
orderIds = orderIds1.stream().map(Integer::longValue).collect(Collectors.toList());
|
|
|
|
|
billingName = "超市物品费";
|
|
|
|
|
updateBillingExist(storeOrders, storeOrderMapper);
|
|
|
|
|
updateBillingExist(storeOrders, storeOrderMapper,billing.getId());
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SPACE_CAPSULE:
|
|
|
|
|
List<OrderSpaceCapsuleDO> capsuleOrders = getOrderSpaceCapsuleDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
|
|
|
|
List<OrderSpaceCapsuleDO> capsuleOrders = getOrderSpaceCapsuleDO(createReqVO.getStartTime(), createReqVO.getEndTime(),memberList,billing.getCarteenId());
|
|
|
|
|
if (CollUtil.isEmpty(capsuleOrders)) throw exception(BILLING_NOT_ORDER_EXISTS);
|
|
|
|
|
totalMoney = calculateTotalMoney(capsuleOrders, OrderSpaceCapsuleDO::getMoney);
|
|
|
|
|
orderIds = getOrderIds(capsuleOrders, OrderSpaceCapsuleDO::getId);
|
|
|
|
|
billingName = "太空舱费用";
|
|
|
|
|
updateBillingExist(capsuleOrders, orderSpaceCapsuleMapper);
|
|
|
|
|
updateBillingExist(capsuleOrders, orderSpaceCapsuleMapper,billing.getId());
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new IllegalArgumentException("Unsupported billing type");
|
|
|
|
@ -183,14 +175,9 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public String createBillingUnit(BillingSaveReqVO createReqVO) {
|
|
|
|
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
|
|
|
|
//校验是否为管理员
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupMapper.selectOne(new LambdaQueryWrapperX<MemberGroupDO>()
|
|
|
|
|
.eq(MemberGroupDO::getUserId, loginUserId)
|
|
|
|
|
.last(" limit 1")
|
|
|
|
|
);
|
|
|
|
|
if(ObjUtil.isEmpty(memberGroupDO)) throw exception(BILLING_NOT_ORDER_SECURITY);
|
|
|
|
|
// 插入 BillingDO 对象并生成唯一主键
|
|
|
|
|
BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class);
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupDO(billing.getUserId());
|
|
|
|
|
billing.setId(IdUtil.getSnowflakeNextId() + "");
|
|
|
|
|
billing.setUserName(memberGroupDO.getName());
|
|
|
|
|
billing.setUserPhone(String.valueOf(memberGroupDO.getId()));
|
|
|
|
@ -238,7 +225,7 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
// 更新订单为开票状态
|
|
|
|
|
private <T> void updateBillingExist(List<T> orders, BaseMapperX<T> mapper) {
|
|
|
|
|
private <T> void updateBillingExist(List<T> orders, BaseMapperX<T> mapper,String billingId) {
|
|
|
|
|
orders.forEach(order -> {
|
|
|
|
|
// Assuming that the order has a `setBillingExist` method
|
|
|
|
|
try {
|
|
|
|
@ -260,12 +247,32 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
// 更新
|
|
|
|
|
BillingDO updateObj = BeanUtils.toBean(updateReqVO, BillingDO.class);
|
|
|
|
|
updateObj.setOrderId(billingDO.getOrderId());
|
|
|
|
|
String orderId = updateObj.getOrderId();
|
|
|
|
|
JSONArray jsonArray = JSONUtil.parseArray(orderId);
|
|
|
|
|
// 转换为 Set<Long>
|
|
|
|
|
Set<Long> orderIds = jsonArray.stream()
|
|
|
|
|
.map(object -> Long.parseLong(object.toString())) // 将每个元素转换为 Long
|
|
|
|
|
.collect(Collectors.toSet());
|
|
|
|
|
//开票成功是根据pdf上传成功没
|
|
|
|
|
if(StrUtil.isNotBlank(updateObj.getPdfUrl())){
|
|
|
|
|
//上传成功 修改状态
|
|
|
|
|
updateObj.setStatus(BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode());
|
|
|
|
|
//设置同意人
|
|
|
|
|
updateObj.setSystemId(SecurityFrameworkUtils.getLoginUserId());
|
|
|
|
|
//同意就把订单编号付上去
|
|
|
|
|
switch (BillingEnum.fromCode(updateObj.getBillingType())){
|
|
|
|
|
case BILLING_CANTEEN:
|
|
|
|
|
dishOrderMapper.updateByIdBillingNum(orderIds,updateObj.getId());
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SUPERMARKET:
|
|
|
|
|
storeOrderMapper.updateByIdBillingNum(orderIds,updateObj.getId());
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SPACE_CAPSULE:
|
|
|
|
|
orderSpaceCapsuleMapper.updateByIdBillingNum(orderIds,updateObj.getId());
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new IllegalArgumentException("Unsupported billing type");
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
//开票回拒
|
|
|
|
|
if(StrUtil.isBlank(updateObj.getRefuseDetails())){
|
|
|
|
@ -273,16 +280,20 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
}
|
|
|
|
|
updateObj.setStatus(BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode());
|
|
|
|
|
updateObj.setRefuseTime(LocalDateTime.now());
|
|
|
|
|
String orderId = updateObj.getOrderId();
|
|
|
|
|
JSONArray jsonArray = JSONUtil.parseArray(orderId);
|
|
|
|
|
// 转换为 Set<Long>
|
|
|
|
|
Set<Long> orderIds = jsonArray.stream()
|
|
|
|
|
.map(object -> Long.parseLong(object.toString())) // 将每个元素转换为 Long
|
|
|
|
|
.collect(Collectors.toSet());
|
|
|
|
|
LambdaUpdateChainWrapper<CardDO> wrapper = new LambdaUpdateChainWrapper<>(cardMapper);
|
|
|
|
|
wrapper.in(CardDO::getId,orderIds);
|
|
|
|
|
wrapper.set(CardDO::getBillingExist,BillingStatusEnum.BILLING_INVOICING_REJECTION.getCode());
|
|
|
|
|
cardMapper.update(wrapper);
|
|
|
|
|
//拒绝就把锁住的订单释放掉
|
|
|
|
|
switch (BillingEnum.fromCode(updateObj.getBillingType())){
|
|
|
|
|
case BILLING_CANTEEN:
|
|
|
|
|
dishOrderMapper.updateByIdBillingExist(orderIds,Boolean.FALSE);
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SUPERMARKET:
|
|
|
|
|
storeOrderMapper.updateByIdBillingExist(orderIds,Boolean.FALSE);
|
|
|
|
|
break;
|
|
|
|
|
case BILLING_SPACE_CAPSULE:
|
|
|
|
|
orderSpaceCapsuleMapper.updateByIdBillingExist(orderIds,Boolean.FALSE);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new IllegalArgumentException("Unsupported billing type");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
billingMapper.updateById(updateObj);
|
|
|
|
|
}
|
|
|
|
@ -311,25 +322,188 @@ public class BillingServiceImpl implements BillingService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public BillingRespMoneyVO getHaveWithoutMoney(Long userId) {
|
|
|
|
|
BillingRespMoneyVO b=new BillingRespMoneyVO();
|
|
|
|
|
//查询开票的订单
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupMapper.selectOne(new LambdaQueryWrapperX<MemberGroupDO>()
|
|
|
|
|
.eq(MemberGroupDO::getUserId, userId)
|
|
|
|
|
.last(" limit 1")
|
|
|
|
|
);
|
|
|
|
|
BigDecimal reduce = billingMapper.selectList(new LambdaQueryWrapperX<BillingDO>()
|
|
|
|
|
.eq(BillingDO::getStatus, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode())
|
|
|
|
|
.eq(BillingDO::getUserId,memberGroupDO.getId())
|
|
|
|
|
).stream()
|
|
|
|
|
public BillingRespMoneyVO getHaveWithoutMoney(Long userId,Long carteenId) {
|
|
|
|
|
List<Long> memberList = getMemberListByUserId(userId);
|
|
|
|
|
// 创建 BillingRespMoneyVO 对象
|
|
|
|
|
BillingRespMoneyVO response = new BillingRespMoneyVO();
|
|
|
|
|
// 查询已开票的金额
|
|
|
|
|
BigDecimal haveMoney = getTotalMoneyForBilling(userId, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode());
|
|
|
|
|
response.setHaveMoney(haveMoney);
|
|
|
|
|
// 查询未开票的金额
|
|
|
|
|
BigDecimal withoutMoney = getTotalMoneyForOrders(memberList, carteenId);
|
|
|
|
|
response.setWithoutMoney(withoutMoney);
|
|
|
|
|
return response;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询已开票的金额
|
|
|
|
|
* @param userId 用户 ID
|
|
|
|
|
* @param billingStatus 账单状态
|
|
|
|
|
* @return 已开票金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal getTotalMoneyForBilling(Long userId, Integer billingStatus) {
|
|
|
|
|
return billingMapper.selectList(new LambdaQueryWrapperX<BillingDO>()
|
|
|
|
|
.eq(BillingDO::getStatus, billingStatus)
|
|
|
|
|
.eq(BillingDO::getUserId, userId))
|
|
|
|
|
.stream()
|
|
|
|
|
.map(BillingDO::getBillingMoney)
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
|
|
|
|
|
//获取当前单位下的所有人
|
|
|
|
|
List<Long> memberList = memberGroupMapper.getMemberList(memberGroupDO.getId());
|
|
|
|
|
//获取所有未开票的
|
|
|
|
|
BigDecimal moneyByUserIds = cardMapper.getTotalMoneyByuserIds(memberList, CardDO.ADD, CostTypeEnum.ADMIN_PAY.getCode());
|
|
|
|
|
b.setWithoutMoney(moneyByUserIds);
|
|
|
|
|
b.setHaveMoney(reduce);
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询未开票的金额(食堂、超市、太空舱)
|
|
|
|
|
* @param memberList 成员 ID 列表
|
|
|
|
|
* @return 未开票金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal getTotalMoneyForOrders(List<Long> memberList,Long carteenId) {
|
|
|
|
|
// 合并所有订单金额查询
|
|
|
|
|
BigDecimal totalSpaceCapsuleMoney = getTotalMoneyForOrderSpaceCapsules(memberList,carteenId);
|
|
|
|
|
BigDecimal totalDishOrderMoney = getTotalMoneyForDishOrders(memberList,carteenId);
|
|
|
|
|
BigDecimal totalStoreOrderMoney = getTotalMoneyForStoreOrders(memberList,carteenId);
|
|
|
|
|
|
|
|
|
|
return totalSpaceCapsuleMoney.add(totalDishOrderMoney).add(totalStoreOrderMoney);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询未开票的太空舱订单金额
|
|
|
|
|
* @param memberList 成员 ID 列表
|
|
|
|
|
* @return 太空舱订单金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal getTotalMoneyForOrderSpaceCapsules(List<Long> memberList,Long carteenId) {
|
|
|
|
|
return orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX<OrderSpaceCapsuleDO>()
|
|
|
|
|
.eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())
|
|
|
|
|
.isNull(OrderSpaceCapsuleDO::getBillingNum)
|
|
|
|
|
.eq(OrderSpaceCapsuleDO::getCarteenId,carteenId)
|
|
|
|
|
.in(OrderSpaceCapsuleDO::getUserId, memberList))
|
|
|
|
|
.stream()
|
|
|
|
|
.map(OrderSpaceCapsuleDO::getMoney)
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询未开票的食堂订单金额
|
|
|
|
|
* @param memberList 成员 ID 列表
|
|
|
|
|
* @return 食堂订单金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal getTotalMoneyForDishOrders(List<Long> memberList,Long carteenId) {
|
|
|
|
|
return dishOrderMapper.selectList(new LambdaQueryWrapperX<DishOrderDO>()
|
|
|
|
|
.eq(DishOrderDO::getOrderStatus, DishOrderDO.COMPLETE)
|
|
|
|
|
.isNull(DishOrderDO::getBillingNum)
|
|
|
|
|
.eq(DishOrderDO::getStoreId,carteenId)
|
|
|
|
|
.in(DishOrderDO::getUserId, memberList))
|
|
|
|
|
.stream()
|
|
|
|
|
.map(DishOrderDO::getTotalMoney)
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询未开票的超市订单金额
|
|
|
|
|
* @param memberList 成员 ID 列表
|
|
|
|
|
* @return 超市订单金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal getTotalMoneyForStoreOrders(List<Long> memberList,Long carteenId) {
|
|
|
|
|
return storeOrderMapper.selectList(new LambdaQueryWrapperX<StoreOrderDO>()
|
|
|
|
|
.eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode())
|
|
|
|
|
.eq(StoreOrderDO::getBillingExist, Boolean.FALSE)
|
|
|
|
|
.isNull(StoreOrderDO::getBillingNum)
|
|
|
|
|
.eq(StoreOrderDO::getCarteenId,carteenId)
|
|
|
|
|
.in(StoreOrderDO::getUserId, memberList))
|
|
|
|
|
.stream()
|
|
|
|
|
.map(f -> BigDecimal.valueOf(f.getTotalPrice()))
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public BigDecimal getTotalMoney(Date time, Integer billingType, Long carteenId, Long userId) {
|
|
|
|
|
List<?> data =(List<?>) getData(time, billingType, carteenId, userId);
|
|
|
|
|
// 根据账单类型计算总金额
|
|
|
|
|
return calculateTotalMoneyByBillingType(billingType, data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object getData(Date time, Integer billingType, Long carteenId, Long userId) {
|
|
|
|
|
// 获取当前单位下的所有成员
|
|
|
|
|
List<Long> memberList = getMemberListByUserId(userId);
|
|
|
|
|
// 获取订单并返回
|
|
|
|
|
List<?> orders = getOrders(time, billingType, memberList,carteenId);
|
|
|
|
|
if (CollUtil.isEmpty(orders)) {
|
|
|
|
|
throw exception(BILLING_NOT_ORDER_EXISTS);
|
|
|
|
|
}
|
|
|
|
|
return orders;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getMemberId(Long userId) {
|
|
|
|
|
//校验是否为管理员
|
|
|
|
|
return memberGroupDO(userId).getId()+"";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Map<Integer, Integer> getBillingTypeTotal(Long carteenId, Long userId) {
|
|
|
|
|
Map<Integer,Integer> map= MapUtil.newHashMap();
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupDO(userId);
|
|
|
|
|
Long id = memberGroupDO.getId();
|
|
|
|
|
List<BillingDO> billingDOS = billingMapper.selectList(new LambdaQueryWrapperX<BillingDO>()
|
|
|
|
|
.eq(BillingDO::getUserPhone, id)
|
|
|
|
|
.eqIfPresent(BillingDO::getCarteenId,carteenId)
|
|
|
|
|
);
|
|
|
|
|
Map<Integer, List<BillingDO>> collect = billingDOS.stream().collect(Collectors.groupingBy(BillingDO::getStatus));
|
|
|
|
|
for (Map.Entry<Integer, List<BillingDO>> entry : collect.entrySet()) {
|
|
|
|
|
map.put(entry.getKey(),entry.getValue().size());
|
|
|
|
|
}
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当前用户所属单位的所有成员列表
|
|
|
|
|
* @param userId 当前用户 ID
|
|
|
|
|
* @return 当前单位的所有成员 ID 列表
|
|
|
|
|
*/
|
|
|
|
|
private List<Long> getMemberListByUserId(Long userId) {
|
|
|
|
|
// 获取当前单位下的所有成员
|
|
|
|
|
return memberGroupMapper.getMemberList(memberGroupDO(userId).getId());
|
|
|
|
|
}
|
|
|
|
|
private MemberGroupDO memberGroupDO(Long userId){
|
|
|
|
|
// 校验是否为管理员
|
|
|
|
|
MemberGroupDO memberGroupDO = memberGroupMapper.selectOne(new LambdaQueryWrapperX<MemberGroupDO>()
|
|
|
|
|
.eq(MemberGroupDO::getUserId, userId)
|
|
|
|
|
.last(" limit 1"));
|
|
|
|
|
if (memberGroupDO == null) {
|
|
|
|
|
throw exception(GROUP_NOT_EXISTS);
|
|
|
|
|
}
|
|
|
|
|
return memberGroupDO;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 根据账单类型计算订单的总金额
|
|
|
|
|
* @param billingType 账单类型
|
|
|
|
|
* @param orders 订单列表
|
|
|
|
|
* @return 计算后的总金额
|
|
|
|
|
*/
|
|
|
|
|
private BigDecimal calculateTotalMoneyByBillingType(Integer billingType, List<?> orders) {
|
|
|
|
|
switch (BillingEnum.fromCode(billingType)) {
|
|
|
|
|
case BILLING_CANTEEN:
|
|
|
|
|
return calculateTotalMoney((List<DishOrderDO>) orders, DishOrderDO::getTotalMoney);
|
|
|
|
|
case BILLING_SUPERMARKET:
|
|
|
|
|
return calculateTotalMoney1((List<StoreOrderDO>) orders, StoreOrderDO::getTotalPrice);
|
|
|
|
|
case BILLING_SPACE_CAPSULE:
|
|
|
|
|
return calculateTotalMoney((List<OrderSpaceCapsuleDO>) orders, OrderSpaceCapsuleDO::getMoney);
|
|
|
|
|
default:
|
|
|
|
|
throw new IllegalArgumentException("Unsupported billing type: " + billingType);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
private List<?> getOrders(Date time, Integer billingType,List<Long> ids,Long carteenId) {
|
|
|
|
|
// 获取时间内的订单
|
|
|
|
|
DateTime start = DateUtil.beginOfMonth(time);
|
|
|
|
|
DateTime end = DateUtil.endOfMonth(time);
|
|
|
|
|
switch (BillingEnum.fromCode(billingType)) {
|
|
|
|
|
case BILLING_CANTEEN:
|
|
|
|
|
return getDishOrderDO(start, end, ids,carteenId);
|
|
|
|
|
case BILLING_SUPERMARKET:
|
|
|
|
|
return getStoreOrderDO(start, end, ids,carteenId);
|
|
|
|
|
case BILLING_SPACE_CAPSULE:
|
|
|
|
|
return getOrderSpaceCapsuleDO(start, end, ids,carteenId);
|
|
|
|
|
default:
|
|
|
|
|
throw new IllegalArgumentException("Unsupported billing type");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|