修改开票逻辑

This commit is contained in:
qjq
2024-11-19 17:29:01 +08:00
parent a1fc384c69
commit baa515dd73
13 changed files with 344 additions and 83 deletions

View File

@ -49,7 +49,8 @@ public class BillingPageReqVO extends PageParam {
@Schema(description = "备注", example = "随便")
private String remark;
@Schema(description = "门店id")
private Long carteenId;
@Schema(description = "拒绝时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] refuseTime;

View File

@ -69,7 +69,8 @@ public class BillingRespVO {
@Schema(description = "pdf地址", example = "https://www.iocoder.cn")
@ExcelProperty("pdf地址")
private String pdfUrl;
@Schema(description = "门店id")
private Long carteenId;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;

View File

@ -48,7 +48,8 @@ public class BillingSaveReqVO {
@Schema(description = "0食堂发票,1超市发票,2太空舱发票", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "0食堂发票,1超市发票,2太空舱发票不能为空")
private Integer billingType;
@Schema(description = "门店id")
private Long carteenId;
@Schema(description = "拒绝理由")
private String refuseDetails;

View File

@ -12,11 +12,17 @@ import cn.iocoder.yudao.module.member.service.billing.BillingService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Tag(name = "小程序 - 开票记录")
@ -31,7 +37,7 @@ public class AppBillingController {
@PostMapping("/create")
@Operation(summary = "创建开票记录")
public CommonResult<String> createBilling(@Valid @RequestBody BillingSaveReqVO createReqVO) {
return success(billingService.createBillingUnit(createReqVO));
return success(billingService.createBilling(createReqVO));
}
@PutMapping("/update")
@ -58,13 +64,40 @@ public class AppBillingController {
}
@GetMapping("/moeny")
@Operation(summary = "获得开票金额与未开票金额")
public CommonResult<BillingRespMoneyVO> getBillingPage(@RequestParam("userId")Long userId) {
return success(billingService.getHaveWithoutMoney(userId));
public CommonResult<BillingRespMoneyVO> getBillingPage(@RequestParam("userId")Long userId,@RequestParam("carteenId") Long carteenId) {
return success(billingService.getHaveWithoutMoney(userId,carteenId));
}
@GetMapping("/page")
@Operation(summary = "获得开票记录分页")
public CommonResult<PageResult<BillingRespVO>> getBillingPage(@Valid BillingPageReqVO pageReqVO) {
Long userId = pageReqVO.getUserId();
pageReqVO.setUserPhone(billingService.getMemberId(userId));
pageReqVO.setUserId(null);
PageResult<BillingDO> pageResult = billingService.getBillingPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, BillingRespVO.class));
}
@GetMapping("/totalMoney")
@Operation(summary = "获取月时间段的金额")
public CommonResult<BigDecimal> getBillingPage(@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @RequestParam("time") Date time,
@RequestParam("billingType") Integer billingType,
@RequestParam("carteenId") Long carteenId,
@RequestParam("userId")Long userId) {
BigDecimal totalMoney = billingService.getTotalMoney(time, billingType, carteenId,userId);
return success(totalMoney);
}
@GetMapping("/data")
@Operation(summary = "获取月时间段的订单详情")
public CommonResult<Object> getData(@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @RequestParam("time") Date time,
@RequestParam("billingType") Integer billingType,
@RequestParam("carteenId") Long carteenId,
@RequestParam("userId")Long userId) {
Object data = billingService.getData(time, billingType, carteenId,userId);
return success(data);
}
@GetMapping("/data")
@Operation(summary = "获取月时间段的订单详情")
public CommonResult<Map<Integer, Integer>> getBillingTypeTotal(@RequestParam("carteenId") Long carteenId,@RequestParam("userId") Long userId) {
Map<Integer, Integer> billingTypeTotal = billingService.getBillingTypeTotal(carteenId, userId);
return success(billingTypeTotal);
}
}

View File

@ -86,6 +86,10 @@ public class BillingDO extends BaseDO {
* 发票商品名称
*/
private String billingName;
/**
* 门店id
*/
private Long carteenId;
/**
* userid 用json
*/

View File

@ -50,4 +50,5 @@ public interface DishOrderMapper extends BaseMapperX<DishOrderDO> {
BigDecimal getSaleMoney(@Param("storeId")Long storeId, @Param("time")String time);
Integer updateByIdBillingExist(@Param("ids")Set<Long> ids,@Param("exist")Boolean exist);
Integer updateByIdBillingNum(@Param("ids")Set<Long> ids,@Param("num")String num);
}

View File

@ -50,4 +50,5 @@ public interface OrderSpaceCapsuleMapper extends BaseMapperX<OrderSpaceCapsuleDO
SpaceCapsuleOrderNameRespVO compDay1(@Param("status")Integer status, @Param("start") Date start, @Param("end") Date end,@Param("spId")Long spId);
OrderSpaceCapsuleStatisticsComVo compMoney(@Param("start") Date start, @Param("end") Date end);
Integer updateByIdBillingExist (@Param("ids") Set<Long> ids, @Param("exist")Boolean exist);
Integer updateByIdBillingNum (@Param("ids") Set<Long> ids, @Param("num")String num);
}

View File

@ -41,4 +41,5 @@ public interface StoreOrderMapper extends BaseMapperX<StoreOrderDO> {
List<StoreOrderPageVO> getStoreOrderPageNewList(@Param("vo") StoreOrderPageVO vo);
Integer updateByIdBillingExist (@Param("ids") Set<Long> ids, @Param("exist")Boolean exist);
Integer updateByIdBillingNum (@Param("ids") Set<Long> ids, @Param("num")String num);
}

View File

@ -6,6 +6,9 @@ import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMon
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
import javax.validation.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
/**
* 开票记录 Service 接口
@ -58,6 +61,24 @@ public interface BillingService {
* @return 开票记录分页
*/
PageResult<BillingDO> getBillingPage(BillingPageReqVO pageReqVO);
BillingRespMoneyVO getHaveWithoutMoney(Long userId);
BillingRespMoneyVO getHaveWithoutMoney(Long userId,Long carteenId);
/**
* 获取指定时间段的所有金额
* @param time
* @param billingType
* @param carteenId
* @return
*/
BigDecimal getTotalMoney(Date time,Integer billingType,Long carteenId,Long userId);
Object getData(Date time,Integer billingType,Long carteenId,Long userId);
String getMemberId(Long userId);
/**
* 开票完成数量,开票中数量,开票回拒数量
* @param carteenId
* @param userId
* @return
*/
Map<Integer, Integer>getBillingTypeTotal(Long carteenId, Long userId);
}

View File

@ -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");
}
}
}

View File

@ -40,4 +40,11 @@
#{id}
</foreach>
</update>
<update id="updateByIdBillingNum">
update member_dish_order SET billing_num = #{num}
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>

View File

@ -72,4 +72,12 @@
#{id}
</foreach>
</update>
<update id="updateByIdBillingNum">
update t_order_space_capsule SET billing_num = #{num}
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>

View File

@ -71,4 +71,12 @@
#{id}
</foreach>
</update>
<update id="updateByIdBillingNum">
update member_store_order SET billing_num = #{num}
WHERE order_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>