发票功能添加
This commit is contained in:
@ -148,5 +148,6 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode INVOICE_INFORMATION_NOT_EXISTS = new ErrorCode(1_004_022_001, "用户发票信息不存在");
|
ErrorCode INVOICE_INFORMATION_NOT_EXISTS = new ErrorCode(1_004_022_001, "用户发票信息不存在");
|
||||||
|
|
||||||
ErrorCode BILLING_NOT_EXISTS = new ErrorCode(1_004_023_00, "开票记录不存在");
|
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;
|
private LocalDateTime[] createTime;
|
||||||
@Schema(description = "发票商品名称")
|
@Schema(description = "发票商品名称")
|
||||||
private String billingName;
|
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 = "发票商品名称")
|
@Schema(description = "发票商品名称")
|
||||||
@ExcelProperty("发票商品名称")
|
@ExcelProperty("发票商品名称")
|
||||||
private String billingName;
|
private String billingName;
|
||||||
|
@Schema(description = "订单ids")
|
||||||
|
private String orderId;
|
||||||
}
|
}
|
@ -16,19 +16,15 @@ public class BillingSaveReqVO {
|
|||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
||||||
@NotEmpty(message = "用户名称不能为空")
|
|
||||||
private String userName;
|
private String userName;
|
||||||
|
|
||||||
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotEmpty(message = "用户手机号不能为空")
|
|
||||||
private String userPhone;
|
private String userPhone;
|
||||||
|
|
||||||
@Schema(description = "申请开票时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "申请开票时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "申请开票时间不能为空")
|
|
||||||
private LocalDateTime requestBillingTime;
|
private LocalDateTime requestBillingTime;
|
||||||
|
|
||||||
@Schema(description = "发票金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "发票金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "发票金额不能为空")
|
|
||||||
private BigDecimal billingMoney;
|
private BigDecimal billingMoney;
|
||||||
|
|
||||||
@Schema(description = "开票人,谁要开票", requiredMode = Schema.RequiredMode.REQUIRED, example = "6477")
|
@Schema(description = "开票人,谁要开票", requiredMode = Schema.RequiredMode.REQUIRED, example = "6477")
|
||||||
@ -63,5 +59,10 @@ public class BillingSaveReqVO {
|
|||||||
private String pdfUrl;
|
private String pdfUrl;
|
||||||
@Schema(description = "发票商品名称")
|
@Schema(description = "发票商品名称")
|
||||||
private String billingName;
|
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;
|
private String phone;
|
||||||
@Schema(description = "太空舱名称")
|
@Schema(description = "太空舱名称")
|
||||||
private String spaceName;
|
private String spaceName;
|
||||||
|
@Schema(description = "是否开票")
|
||||||
|
private Boolean billingExist;
|
||||||
|
private String billingNum;
|
||||||
}
|
}
|
@ -99,4 +99,6 @@ public class OrderSpaceCapsuleRespVO {
|
|||||||
@Schema(description = "太空舱名称")
|
@Schema(description = "太空舱名称")
|
||||||
@ExcelProperty("太空舱名称")
|
@ExcelProperty("太空舱名称")
|
||||||
private String spaceName;
|
private String spaceName;
|
||||||
|
private Boolean billingExist;
|
||||||
|
private String billingNum;
|
||||||
}
|
}
|
@ -37,7 +37,10 @@ public class StoreOrderPageReqVO extends PageParam {
|
|||||||
|
|
||||||
@Schema(description = "用户ID")
|
@Schema(description = "用户ID")
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
@Schema(description = "订单状态 1-已支付,2-已完成,3-已取消,4-已退款")
|
||||||
|
private Integer status;
|
||||||
|
@Schema(description = "是否开票 0开票1未开票")
|
||||||
|
private Boolean billingExist;
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] createTime;
|
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.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
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.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.BillingRespVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingSaveReqVO;
|
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.billing.BillingDO;
|
||||||
@ -55,7 +56,11 @@ public class AppBillingController {
|
|||||||
BillingDO billing = billingService.getBilling(id);
|
BillingDO billing = billingService.getBilling(id);
|
||||||
return success(BeanUtils.toBean(billing, BillingRespVO.class));
|
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")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得开票记录分页")
|
@Operation(summary = "获得开票记录分页")
|
||||||
public CommonResult<PageResult<BillingRespVO>> getBillingPage(@Valid BillingPageReqVO pageReqVO) {
|
public CommonResult<PageResult<BillingRespVO>> getBillingPage(@Valid BillingPageReqVO pageReqVO) {
|
||||||
|
@ -14,4 +14,6 @@ public class AppPageVo extends PageParam {
|
|||||||
private Long userId;
|
private Long userId;
|
||||||
|
|
||||||
private String mobile;
|
private String mobile;
|
||||||
|
private String orderStatus;
|
||||||
|
private Boolean billingExist;
|
||||||
}
|
}
|
||||||
|
@ -86,4 +86,8 @@ public class BillingDO extends BaseDO {
|
|||||||
* 发票商品名称
|
* 发票商品名称
|
||||||
*/
|
*/
|
||||||
private String billingName;
|
private String billingName;
|
||||||
|
/**
|
||||||
|
* 订单id 用json
|
||||||
|
*/
|
||||||
|
private String orderId;
|
||||||
}
|
}
|
@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Param;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员订单 Mapper
|
* 会员订单 Mapper
|
||||||
@ -48,5 +49,5 @@ public interface DishOrderMapper extends BaseMapperX<DishOrderDO> {
|
|||||||
Integer selectUser(@Param("time")Long storeId,@Param("storeId")String time);
|
Integer selectUser(@Param("time")Long storeId,@Param("storeId")String time);
|
||||||
|
|
||||||
BigDecimal getSaleMoney(@Param("storeId")Long storeId, @Param("time")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.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 太空舱订单 Mapper
|
* 太空舱订单 Mapper
|
||||||
@ -40,6 +41,7 @@ public interface OrderSpaceCapsuleMapper extends BaseMapperX<OrderSpaceCapsuleDO
|
|||||||
.eqIfPresent(OrderSpaceCapsuleDO::getEndMoney, reqVO.getEndMoney())
|
.eqIfPresent(OrderSpaceCapsuleDO::getEndMoney, reqVO.getEndMoney())
|
||||||
.likeIfPresent(OrderSpaceCapsuleDO::getPhone, reqVO.getPhone())
|
.likeIfPresent(OrderSpaceCapsuleDO::getPhone, reqVO.getPhone())
|
||||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayNum, reqVO.getPayNum())
|
.eqIfPresent(OrderSpaceCapsuleDO::getPayNum, reqVO.getPayNum())
|
||||||
|
.eqIfPresent(OrderSpaceCapsuleDO::getBillingExist, reqVO.getBillingExist())
|
||||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
||||||
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
.eqIfPresent(OrderSpaceCapsuleDO::getPayMethods, reqVO.getPayMethods())
|
||||||
.orderByDesc(OrderSpaceCapsuleDO::getId));
|
.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);
|
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);
|
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);
|
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 org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品订单 Mapper
|
* 商品订单 Mapper
|
||||||
@ -25,6 +26,8 @@ public interface StoreOrderMapper extends BaseMapperX<StoreOrderDO> {
|
|||||||
.eqIfPresent(StoreOrderDO::getCardNumber, reqVO.getCardNumber())
|
.eqIfPresent(StoreOrderDO::getCardNumber, reqVO.getCardNumber())
|
||||||
.eqIfPresent(StoreOrderDO::getOpenId, reqVO.getOpenId())
|
.eqIfPresent(StoreOrderDO::getOpenId, reqVO.getOpenId())
|
||||||
.eqIfPresent(StoreOrderDO::getNumber, reqVO.getNumber())
|
.eqIfPresent(StoreOrderDO::getNumber, reqVO.getNumber())
|
||||||
|
.eqIfPresent(StoreOrderDO::getStatus, reqVO.getStatus())
|
||||||
|
.eqIfPresent(StoreOrderDO::getBillingExist, reqVO.getBillingExist())
|
||||||
.eqIfPresent(StoreOrderDO::getEquipmentCode, reqVO.getEquipmentCode())
|
.eqIfPresent(StoreOrderDO::getEquipmentCode, reqVO.getEquipmentCode())
|
||||||
.eqIfPresent(StoreOrderDO::getUuid, reqVO.getUuid())
|
.eqIfPresent(StoreOrderDO::getUuid, reqVO.getUuid())
|
||||||
.eqIfPresent(StoreOrderDO::getTotalPrice, reqVO.getTotalPrice())
|
.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);
|
IPage<StoreOrderPageVO> getStoreOrderPageNew(IPage<StoreOrderPageVO> page, @Param("vo") StoreOrderPageVO vo);
|
||||||
|
|
||||||
List<StoreOrderPageVO> getStoreOrderPageNewList(@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.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.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.controller.admin.billing.vo.BillingSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import javax.validation.*;
|
import javax.validation.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,5 +51,6 @@ public interface BillingService {
|
|||||||
* @return 开票记录分页
|
* @return 开票记录分页
|
||||||
*/
|
*/
|
||||||
PageResult<BillingDO> getBillingPage(BillingPageReqVO pageReqVO);
|
PageResult<BillingDO> getBillingPage(BillingPageReqVO pageReqVO);
|
||||||
|
BillingRespMoneyVO getHaveWithoutMoney(Long userId);
|
||||||
|
|
||||||
}
|
}
|
@ -1,21 +1,57 @@
|
|||||||
package cn.iocoder.yudao.module.member.service.billing;
|
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.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.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.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.controller.admin.billing.vo.BillingSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.billing.BillingDO;
|
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.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 org.springframework.stereotype.Service;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
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.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_EXISTS;
|
||||||
|
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.BILLING_NOT_ORDER_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开票记录 Service 实现类
|
* 开票记录 Service 实现类
|
||||||
@ -28,23 +64,182 @@ public class BillingServiceImpl implements BillingService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private BillingMapper billingMapper;
|
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
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public String createBilling(BillingSaveReqVO createReqVO) {
|
public String createBilling(BillingSaveReqVO createReqVO) {
|
||||||
// 插入
|
// 插入 BillingDO 对象并生成唯一主键
|
||||||
BillingDO billing = BeanUtils.toBean(createReqVO, BillingDO.class);
|
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);
|
billingMapper.insert(billing);
|
||||||
// 返回
|
// 返回主键 ID
|
||||||
return billing.getId();
|
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
|
@Override
|
||||||
public void updateBilling(BillingSaveReqVO updateReqVO) {
|
public void updateBilling(BillingSaveReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateBillingExists(updateReqVO.getId());
|
validateBillingExists(updateReqVO.getId());
|
||||||
// 更新
|
// 更新
|
||||||
BillingDO updateObj = BeanUtils.toBean(updateReqVO, BillingDO.class);
|
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);
|
billingMapper.updateById(updateObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +256,6 @@ public class BillingServiceImpl implements BillingService {
|
|||||||
throw exception(BILLING_NOT_EXISTS);
|
throw exception(BILLING_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BillingDO getBilling(String id) {
|
public BillingDO getBilling(String id) {
|
||||||
return billingMapper.selectById(id);
|
return billingMapper.selectById(id);
|
||||||
@ -72,4 +266,37 @@ public class BillingServiceImpl implements BillingService {
|
|||||||
return billingMapper.selectPage(pageReqVO);
|
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()
|
PageResult<DishOrderDO> dishOrderDOPageResult = dishOrderMapper.selectPage(vo, Wrappers.<DishOrderDO>lambdaQuery()
|
||||||
.in(CollectionUtil.isNotEmpty(ids), DishOrderDO::getUserId, ids)
|
.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));
|
.orderByDesc(DishOrderDO::getCreateTime));
|
||||||
PageResult<AppOrderRespVO> appOrderRespVOPageResult = BeanUtils.toBean(dishOrderDOPageResult, AppOrderRespVO.class);
|
PageResult<AppOrderRespVO> appOrderRespVOPageResult = BeanUtils.toBean(dishOrderDOPageResult, AppOrderRespVO.class);
|
||||||
List<AppOrderRespVO> list = appOrderRespVOPageResult.getList();
|
List<AppOrderRespVO> list = appOrderRespVOPageResult.getList();
|
||||||
|
@ -33,4 +33,11 @@
|
|||||||
</where>
|
</where>
|
||||||
</select>
|
</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>
|
</mapper>
|
@ -64,4 +64,12 @@
|
|||||||
GROUP BY
|
GROUP BY
|
||||||
a.carteen_id, a.carteen_name, a.space_capsule_id, b.space_name;
|
a.carteen_id, a.carteen_name, a.space_capsule_id, b.space_name;
|
||||||
</select>
|
</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>
|
</mapper>
|
@ -61,4 +61,11 @@
|
|||||||
order by so.order_id DESC
|
order by so.order_id DESC
|
||||||
</select>
|
</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>
|
</mapper>
|
Reference in New Issue
Block a user