发票功能添加
This commit is contained in:
@ -148,5 +148,6 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode INVOICE_INFORMATION_NOT_EXISTS = new ErrorCode(1_004_022_001, "用户发票信息不存在");
|
||||
|
||||
ErrorCode BILLING_NOT_EXISTS = new ErrorCode(1_004_023_00, "开票记录不存在");
|
||||
ErrorCode BILLING_NOT_ORDER_EXISTS= new ErrorCode(1_004_023_00, "该时间段没有订单可开票");
|
||||
}
|
||||
|
||||
|
@ -62,4 +62,6 @@ public class BillingPageReqVO extends PageParam {
|
||||
private LocalDateTime[] createTime;
|
||||
@Schema(description = "发票商品名称")
|
||||
private String billingName;
|
||||
@Schema(description = "订单ids")
|
||||
private String orderId;
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.billing.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Schema(description = "管理后台 - 开票金额 Response VO")
|
||||
@Data
|
||||
public class BillingRespMoneyVO {
|
||||
|
||||
@Schema(description = "发票编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private BigDecimal haveMoney;
|
||||
private BigDecimal withoutMoney;
|
||||
|
||||
}
|
@ -76,4 +76,6 @@ public class BillingRespVO {
|
||||
@Schema(description = "发票商品名称")
|
||||
@ExcelProperty("发票商品名称")
|
||||
private String billingName;
|
||||
@Schema(description = "订单ids")
|
||||
private String orderId;
|
||||
}
|
@ -16,19 +16,15 @@ public class BillingSaveReqVO {
|
||||
private String id;
|
||||
|
||||
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
||||
@NotEmpty(message = "用户名称不能为空")
|
||||
private String userName;
|
||||
|
||||
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "用户手机号不能为空")
|
||||
private String userPhone;
|
||||
|
||||
@Schema(description = "申请开票时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "申请开票时间不能为空")
|
||||
private LocalDateTime requestBillingTime;
|
||||
|
||||
@Schema(description = "发票金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "发票金额不能为空")
|
||||
private BigDecimal billingMoney;
|
||||
|
||||
@Schema(description = "开票人,谁要开票", requiredMode = Schema.RequiredMode.REQUIRED, example = "6477")
|
||||
@ -63,5 +59,10 @@ public class BillingSaveReqVO {
|
||||
private String pdfUrl;
|
||||
@Schema(description = "发票商品名称")
|
||||
private String billingName;
|
||||
|
||||
@Schema(description = "订单选择时间段-开始时间")
|
||||
private LocalDateTime startTime;
|
||||
@Schema(description = "订单选择时间段-结束时间")
|
||||
private LocalDateTime endTime;
|
||||
@Schema(description = "订单id")
|
||||
private Set<Long> orderId;
|
||||
}
|
@ -87,4 +87,7 @@ public class OrderSpaceCapsulePageReqVO extends PageParam {
|
||||
private String phone;
|
||||
@Schema(description = "太空舱名称")
|
||||
private String spaceName;
|
||||
@Schema(description = "是否开票")
|
||||
private Boolean billingExist;
|
||||
private String billingNum;
|
||||
}
|
@ -99,4 +99,6 @@ public class OrderSpaceCapsuleRespVO {
|
||||
@Schema(description = "太空舱名称")
|
||||
@ExcelProperty("太空舱名称")
|
||||
private String spaceName;
|
||||
private Boolean billingExist;
|
||||
private String billingNum;
|
||||
}
|
@ -37,7 +37,10 @@ public class StoreOrderPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "用户ID")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "订单状态 1-已支付,2-已完成,3-已取消,4-已退款")
|
||||
private Integer status;
|
||||
@Schema(description = "是否开票 0开票1未开票")
|
||||
private Boolean billingExist;
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
@ -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.billing.vo.BillingPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMoneyVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
||||
@ -55,7 +56,11 @@ public class AppBillingController {
|
||||
BillingDO billing = billingService.getBilling(id);
|
||||
return success(BeanUtils.toBean(billing, BillingRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/moeny")
|
||||
@Operation(summary = "获得开票金额与未开票金额")
|
||||
public CommonResult<BillingRespMoneyVO> getBillingPage(@RequestParam("userId")Long userId) {
|
||||
return success(billingService.getHaveWithoutMoney(userId));
|
||||
}
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得开票记录分页")
|
||||
public CommonResult<PageResult<BillingRespVO>> getBillingPage(@Valid BillingPageReqVO pageReqVO) {
|
||||
|
@ -14,4 +14,6 @@ public class AppPageVo extends PageParam {
|
||||
private Long userId;
|
||||
|
||||
private String mobile;
|
||||
private String orderStatus;
|
||||
private Boolean billingExist;
|
||||
}
|
||||
|
@ -86,4 +86,8 @@ public class BillingDO extends BaseDO {
|
||||
* 发票商品名称
|
||||
*/
|
||||
private String billingName;
|
||||
/**
|
||||
* 订单id 用json
|
||||
*/
|
||||
private String orderId;
|
||||
}
|
@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Param;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 会员订单 Mapper
|
||||
@ -48,5 +49,5 @@ public interface DishOrderMapper extends BaseMapperX<DishOrderDO> {
|
||||
Integer selectUser(@Param("time")Long storeId,@Param("storeId")String time);
|
||||
|
||||
BigDecimal getSaleMoney(@Param("storeId")Long storeId, @Param("time")String time);
|
||||
|
||||
Integer updateByIdBillingExist(@Param("ids")Set<Long> ids,@Param("exist")Boolean exist);
|
||||
}
|
@ -14,6 +14,7 @@ import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 太空舱订单 Mapper
|
||||
@ -40,6 +41,7 @@ public interface OrderSpaceCapsuleMapper extends BaseMapperX<OrderSpaceCapsuleDO
|
||||
.eqIfPresent(OrderSpaceCapsuleDO::getEndMoney, reqVO.getEndMoney())
|
||||
.likeIfPresent(OrderSpaceCapsuleDO::getPhone, reqVO.getPhone())
|
||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayNum, reqVO.getPayNum())
|
||||
.eqIfPresent(OrderSpaceCapsuleDO::getBillingExist, reqVO.getBillingExist())
|
||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
||||
.orderByDesc(OrderSpaceCapsuleDO::getId));
|
||||
@ -47,4 +49,5 @@ public interface OrderSpaceCapsuleMapper extends BaseMapperX<OrderSpaceCapsuleDO
|
||||
OrderSpaceCapsuleStatisticsVo compDay(@Param("status")Integer status,@Param("start") Date start,@Param("end") Date end,@Param("carteenId")Long carteenId);
|
||||
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);
|
||||
}
|
@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 商品订单 Mapper
|
||||
@ -25,6 +26,8 @@ public interface StoreOrderMapper extends BaseMapperX<StoreOrderDO> {
|
||||
.eqIfPresent(StoreOrderDO::getCardNumber, reqVO.getCardNumber())
|
||||
.eqIfPresent(StoreOrderDO::getOpenId, reqVO.getOpenId())
|
||||
.eqIfPresent(StoreOrderDO::getNumber, reqVO.getNumber())
|
||||
.eqIfPresent(StoreOrderDO::getStatus, reqVO.getStatus())
|
||||
.eqIfPresent(StoreOrderDO::getBillingExist, reqVO.getBillingExist())
|
||||
.eqIfPresent(StoreOrderDO::getEquipmentCode, reqVO.getEquipmentCode())
|
||||
.eqIfPresent(StoreOrderDO::getUuid, reqVO.getUuid())
|
||||
.eqIfPresent(StoreOrderDO::getTotalPrice, reqVO.getTotalPrice())
|
||||
@ -37,4 +40,5 @@ public interface StoreOrderMapper extends BaseMapperX<StoreOrderDO> {
|
||||
IPage<StoreOrderPageVO> getStoreOrderPageNew(IPage<StoreOrderPageVO> page, @Param("vo") StoreOrderPageVO vo);
|
||||
|
||||
List<StoreOrderPageVO> getStoreOrderPageNewList(@Param("vo") StoreOrderPageVO vo);
|
||||
Integer updateByIdBillingExist (@Param("ids") Set<Long> ids, @Param("exist")Boolean exist);
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package cn.iocoder.yudao.module.member.enums;
|
||||
|
||||
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 lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.apache.poi.ss.formula.functions.T;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum BillingEnum {
|
||||
//0食堂发票,1超市发票,2太空舱;
|
||||
BILLING_CANTEEN(0,"食堂"),
|
||||
BILLING_SUPERMARKET(1,"超市"),
|
||||
BILLING_SPACE_CAPSULE(2,"太空舱");
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
private final Integer code;
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final String name;
|
||||
// 根据 code 查找对应的枚举实例
|
||||
public static BillingEnum fromCode(int code) {
|
||||
for (BillingEnum type : BillingEnum.values()) {
|
||||
if (type.getCode() == code) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid code for BillingEnum: " + code);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package cn.iocoder.yudao.module.member.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum BillingStatusEnum {
|
||||
//0开票中,1开票完成,2开票回拒
|
||||
BILLING_INVOICING(0,"开票中"),
|
||||
BILLING_INVOICING_IS_COMPLETE(1,"开票完成"),
|
||||
BILLING_INVOICING_REJECTION(2,"开票回拒");
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
private final Integer code;
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final String name;
|
||||
}
|
@ -2,10 +2,9 @@ package cn.iocoder.yudao.module.member.service.billing;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
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;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
||||
|
||||
import java.util.*;
|
||||
import javax.validation.*;
|
||||
|
||||
/**
|
||||
@ -52,5 +51,6 @@ public interface BillingService {
|
||||
* @return 开票记录分页
|
||||
*/
|
||||
PageResult<BillingDO> getBillingPage(BillingPageReqVO pageReqVO);
|
||||
BillingRespMoneyVO getHaveWithoutMoney(Long userId);
|
||||
|
||||
}
|
@ -1,21 +1,57 @@
|
||||
package cn.iocoder.yudao.module.member.service.billing;
|
||||
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
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;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
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.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;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
||||
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.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.BillingEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.BillingStatusEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.SpaceCapsuleOrderEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.StoreOrderStatusEnum;
|
||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
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.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
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.BILLING_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.BILLING_NOT_ORDER_EXISTS;
|
||||
|
||||
/**
|
||||
* 开票记录 Service 实现类
|
||||
@ -28,23 +64,182 @@ public class BillingServiceImpl implements BillingService {
|
||||
|
||||
@Resource
|
||||
private BillingMapper billingMapper;
|
||||
@Resource
|
||||
private MemberUserService userService;
|
||||
@Resource
|
||||
private OrderSpaceCapsuleMapper orderSpaceCapsuleMapper;
|
||||
@Resource
|
||||
private DishOrderMapper dishOrderMapper;
|
||||
@Resource
|
||||
private StoreOrderMapper storeOrderMapper;
|
||||
|
||||
/**
|
||||
* 食堂
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
public List<DishOrderDO> getDishOrderDO(LocalDateTime startTime, LocalDateTime endTime, Set<Long> ids){
|
||||
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)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* 超市
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
public List<StoreOrderDO> getStoreOrderDO(LocalDateTime startTime, LocalDateTime endTime, Set<Long> ids){
|
||||
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)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* 太空舱
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
public List<OrderSpaceCapsuleDO> getOrderSpaceCapsuleDO(LocalDateTime startTime, LocalDateTime endTime, Set<Long> ids){
|
||||
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)
|
||||
);
|
||||
}
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String createBilling(BillingSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
// 插入 BillingDO 对象并生成唯一主键
|
||||
BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class);
|
||||
//这里使用雪花算法 作为主键
|
||||
billing.setId(IdUtil.getSnowflakeNextId()+"");
|
||||
billing.setId(IdUtil.getSnowflakeNextId() + "");
|
||||
// 获取用户信息
|
||||
MemberUserDO user = userService.getUser(createReqVO.getUserId());
|
||||
billing.setUserName(user.getNickname());
|
||||
billing.setUserPhone(user.getMobile());
|
||||
// 根据不同的 billingType 获取订单、金额和订单 ID 列表,并设置开票信息
|
||||
List<Long> orderIds;
|
||||
BigDecimal totalMoney;
|
||||
String billingName;
|
||||
switch (BillingEnum.fromCode(billing.getBillingType())) {
|
||||
case BILLING_CANTEEN:
|
||||
List<DishOrderDO> dishOrders = getDishOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
||||
if (CollUtil.isEmpty(dishOrders)) throw exception(BILLING_NOT_ORDER_EXISTS);
|
||||
totalMoney = calculateTotalMoney(dishOrders, DishOrderDO::getTotalMoney);
|
||||
orderIds = getOrderIds(dishOrders, DishOrderDO::getId);
|
||||
billingName = "食堂餐饮费";
|
||||
updateBillingExist(dishOrders, dishOrderMapper);
|
||||
break;
|
||||
case BILLING_SUPERMARKET:
|
||||
List<StoreOrderDO> storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
||||
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);
|
||||
break;
|
||||
case BILLING_SPACE_CAPSULE:
|
||||
List<OrderSpaceCapsuleDO> capsuleOrders = getOrderSpaceCapsuleDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId());
|
||||
if (CollUtil.isEmpty(capsuleOrders)) throw exception(BILLING_NOT_ORDER_EXISTS);
|
||||
totalMoney = calculateTotalMoney(capsuleOrders, OrderSpaceCapsuleDO::getMoney);
|
||||
orderIds = getOrderIds(capsuleOrders, OrderSpaceCapsuleDO::getId);
|
||||
billingName = "太空舱费用";
|
||||
updateBillingExist(capsuleOrders, orderSpaceCapsuleMapper);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unsupported billing type");
|
||||
}
|
||||
// 设置 BillingDO 对象的基本信息
|
||||
billing.setBillingMoney(totalMoney);
|
||||
billing.setStatus(BillingStatusEnum.BILLING_INVOICING.getCode());
|
||||
billing.setBillingName(billingName);
|
||||
billing.setOrderId(JsonUtils.toJsonString(orderIds));
|
||||
billing.setRequestBillingTime(LocalDateTime.now());
|
||||
// 插入 BillingDO 对象到数据库
|
||||
billingMapper.insert(billing);
|
||||
// 返回
|
||||
// 返回主键 ID
|
||||
return billing.getId();
|
||||
}
|
||||
// 计算订单的总金额,处理 Double 到 BigDecimal 的转换
|
||||
private <T> BigDecimal calculateTotalMoney1(List<T> orders, Function<T, Double> moneyMapper) {
|
||||
return orders.stream()
|
||||
.map(moneyMapper)
|
||||
.filter(Objects::nonNull) // 过滤掉 null 值,避免空指针异常
|
||||
.map(BigDecimal::valueOf) // 将 Double 转换为 BigDecimal
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
|
||||
}
|
||||
// 计算订单的总金额
|
||||
private <T> BigDecimal calculateTotalMoney(List<T> orders, Function<T, BigDecimal> moneyMapper) {
|
||||
return orders.stream()
|
||||
.map(moneyMapper)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
// 获取订单 ID 列表
|
||||
private <T, R> List<R> getOrderIds(List<T> orders, Function<T, R> idMapper) {
|
||||
return orders.stream()
|
||||
.map(idMapper)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
// 更新订单为开票状态
|
||||
private <T> void updateBillingExist(List<T> orders, BaseMapperX<T> mapper) {
|
||||
orders.forEach(order -> {
|
||||
// Assuming that the order has a `setBillingExist` method
|
||||
try {
|
||||
Method setBillingExist = order.getClass().getMethod("setBillingExist", Boolean.class);
|
||||
setBillingExist.invoke(order, Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error setting billing exist status", e);
|
||||
}
|
||||
});
|
||||
mapper.updateBatch(orders);
|
||||
}
|
||||
@Override
|
||||
public void updateBilling(BillingSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
validateBillingExists(updateReqVO.getId());
|
||||
// 更新
|
||||
BillingDO updateObj = BeanUtils.toBean(updateReqVO, BillingDO.class);
|
||||
//开票成功是根据pdf上传成功没
|
||||
if(StrUtil.isNotBlank(updateObj.getPdfUrl())){
|
||||
//上传成功 修改状态
|
||||
updateObj.setStatus(BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode());
|
||||
//设置同意人
|
||||
updateObj.setSystemId(SecurityFrameworkUtils.getLoginUserId());
|
||||
}else{
|
||||
//开票回拒
|
||||
Assert.notNull(updateObj.getRefuseDetails(),"拒绝理由不能为空");
|
||||
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());
|
||||
//拒绝就把锁住的订单释放掉
|
||||
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);
|
||||
}
|
||||
|
||||
@ -61,7 +256,6 @@ public class BillingServiceImpl implements BillingService {
|
||||
throw exception(BILLING_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BillingDO getBilling(String id) {
|
||||
return billingMapper.selectById(id);
|
||||
@ -72,4 +266,37 @@ public class BillingServiceImpl implements BillingService {
|
||||
return billingMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BillingRespMoneyVO getHaveWithoutMoney(Long userId) {
|
||||
BillingRespMoneyVO b=new BillingRespMoneyVO();
|
||||
//查询开票的订单
|
||||
BigDecimal reduce = billingMapper.selectList(new LambdaQueryWrapperX<BillingDO>()
|
||||
.eq(BillingDO::getStatus, BillingStatusEnum.BILLING_INVOICING_IS_COMPLETE.getCode())
|
||||
.eq(BillingDO::getUserId,userId)
|
||||
).stream()
|
||||
.map(BillingDO::getBillingMoney)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);// 求和
|
||||
b.setHaveMoney(reduce);
|
||||
BigDecimal reduce1 = orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX<OrderSpaceCapsuleDO>()
|
||||
.eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())
|
||||
.eq(OrderSpaceCapsuleDO::getBillingExist, Boolean.FALSE)
|
||||
.eq(OrderSpaceCapsuleDO::getUserId,userId)
|
||||
)
|
||||
.stream().map(OrderSpaceCapsuleDO::getMoney)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);// 求和
|
||||
BigDecimal reduce2 = dishOrderMapper.selectList(new LambdaQueryWrapperX<DishOrderDO>()
|
||||
.eq(DishOrderDO::getOrderStatus, DishOrderDO.COMPLETE)
|
||||
.eq(DishOrderDO::getBillingExist, Boolean.FALSE).eq(DishOrderDO::getUserId,userId))
|
||||
.stream().map(DishOrderDO::getTotalMoney)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);// 求和
|
||||
BigDecimal reduce3 = storeOrderMapper.selectList(new LambdaQueryWrapperX<StoreOrderDO>()
|
||||
.eq(StoreOrderDO::getStatus, StoreOrderStatusEnum.COMPLETE.getCode())
|
||||
.eq(StoreOrderDO::getBillingExist, Boolean.FALSE).eq(StoreOrderDO::getUserId,userId))
|
||||
.stream().map(f-> BigDecimal.valueOf(f.getTotalPrice()))
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);// 求和
|
||||
BigDecimal add = reduce1.add(reduce2).add(reduce3);
|
||||
b.setWithoutMoney(add);
|
||||
return b;
|
||||
}
|
||||
|
||||
}
|
@ -174,6 +174,8 @@ public class OrderServiceImpl implements OrderService {
|
||||
|
||||
PageResult<DishOrderDO> dishOrderDOPageResult = dishOrderMapper.selectPage(vo, Wrappers.<DishOrderDO>lambdaQuery()
|
||||
.in(CollectionUtil.isNotEmpty(ids), DishOrderDO::getUserId, ids)
|
||||
.eq(StrUtil.isNotBlank(vo.getOrderStatus()),DishOrderDO::getOrderStatus,vo.getOrderStatus())
|
||||
.eq(ObjUtil.isNotEmpty(vo.getBillingExist()),DishOrderDO::getBillingExist,vo.getBillingExist())
|
||||
.orderByDesc(DishOrderDO::getCreateTime));
|
||||
PageResult<AppOrderRespVO> appOrderRespVOPageResult = BeanUtils.toBean(dishOrderDOPageResult, AppOrderRespVO.class);
|
||||
List<AppOrderRespVO> list = appOrderRespVOPageResult.getList();
|
||||
|
@ -33,4 +33,11 @@
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<update id="updateByIdBillingExist">
|
||||
update member_dish_order SET billing_exist = #{exist}
|
||||
WHERE id IN
|
||||
<foreach collection="ids" item="id" open="(" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</update>
|
||||
</mapper>
|
@ -64,4 +64,12 @@
|
||||
GROUP BY
|
||||
a.carteen_id, a.carteen_name, a.space_capsule_id, b.space_name;
|
||||
</select>
|
||||
|
||||
<update id="updateByIdBillingExist">
|
||||
update t_order_space_capsule SET billing_exist = #{exist}
|
||||
WHERE id IN
|
||||
<foreach collection="ids" item="id" open="(" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</update>
|
||||
</mapper>
|
@ -61,4 +61,11 @@
|
||||
order by so.order_id DESC
|
||||
</select>
|
||||
|
||||
<update id="updateByIdBillingExist">
|
||||
update member_store_order SET billing_exist = #{exist}
|
||||
WHERE order_id IN
|
||||
<foreach collection="ids" item="id" open="(" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</update>
|
||||
</mapper>
|
Reference in New Issue
Block a user