diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 5fc7d6aa..3ba94ff6 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -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, "该时间段没有订单可开票"); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java index 575c814f..fe6d3e80 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingPageReqVO.java @@ -62,4 +62,6 @@ public class BillingPageReqVO extends PageParam { private LocalDateTime[] createTime; @Schema(description = "发票商品名称") private String billingName; + @Schema(description = "订单ids") + private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespMoneyVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespMoneyVO.java new file mode 100644 index 00000000..d8f33711 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespMoneyVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java index 20bc1715..5c23246d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingRespVO.java @@ -76,4 +76,6 @@ public class BillingRespVO { @Schema(description = "发票商品名称") @ExcelProperty("发票商品名称") private String billingName; + @Schema(description = "订单ids") + private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java index 0ce7e340..e9e34a0b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/billing/vo/BillingSaveReqVO.java @@ -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 orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java index d3278553..361ce0fc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java @@ -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; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java index 76081bfb..f0918d76 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java @@ -99,4 +99,6 @@ public class OrderSpaceCapsuleRespVO { @Schema(description = "太空舱名称") @ExcelProperty("太空舱名称") private String spaceName; + private Boolean billingExist; + private String billingNum; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderPageReqVO.java index 3868cd39..1e76f9b7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderPageReqVO.java @@ -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; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java index 5b8351a5..2f9e101a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/billing/AppBillingController.java @@ -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 getBillingPage(@RequestParam("userId")Long userId) { + return success(billingService.getHaveWithoutMoney(userId)); + } @GetMapping("/page") @Operation(summary = "获得开票记录分页") public CommonResult> getBillingPage(@Valid BillingPageReqVO pageReqVO) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/order/vo/AppPageVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/order/vo/AppPageVo.java index cd108fee..9eb88705 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/order/vo/AppPageVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/order/vo/AppPageVo.java @@ -14,4 +14,6 @@ public class AppPageVo extends PageParam { private Long userId; private String mobile; + private String orderStatus; + private Boolean billingExist; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java index 5c82df48..255ead56 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/billing/BillingDO.java @@ -86,4 +86,8 @@ public class BillingDO extends BaseDO { * 发票商品名称 */ private String billingName; + /** + * 订单id 用json + */ + private String orderId; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java index dd10b6be..3496175f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/order/DishOrderMapper.java @@ -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 { 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 ids,@Param("exist")Boolean exist); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java index 854058dd..60e8f1f9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/orderspacecapsule/OrderSpaceCapsuleMapper.java @@ -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 ids, @Param("exist")Boolean exist); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java index 4f1bec0a..1ded6f8e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storeorder/StoreOrderMapper.java @@ -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 { .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 { IPage getStoreOrderPageNew(IPage page, @Param("vo") StoreOrderPageVO vo); List getStoreOrderPageNewList(@Param("vo") StoreOrderPageVO vo); + Integer updateByIdBillingExist (@Param("ids") Set ids, @Param("exist")Boolean exist); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingEnum.java new file mode 100644 index 00000000..19a3b42f --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingEnum.java @@ -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); + } + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingStatusEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingStatusEnum.java new file mode 100644 index 00000000..1a0bd9a9 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/BillingStatusEnum.java @@ -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; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java index d8e9c632..f67b27a7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingService.java @@ -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 getBillingPage(BillingPageReqVO pageReqVO); + BillingRespMoneyVO getHaveWithoutMoney(Long userId); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java index 1dda2caf..f0570f22 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/billing/BillingServiceImpl.java @@ -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 getDishOrderDO(LocalDateTime startTime, LocalDateTime endTime, Set ids){ + return dishOrderMapper.selectList(new LambdaQueryWrapperX() + .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 getStoreOrderDO(LocalDateTime startTime, LocalDateTime endTime, Set ids){ + return storeOrderMapper.selectList(new LambdaQueryWrapperX() + .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 getOrderSpaceCapsuleDO(LocalDateTime startTime, LocalDateTime endTime, Set ids){ + return orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX() + .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 orderIds; + BigDecimal totalMoney; + String billingName; + switch (BillingEnum.fromCode(billing.getBillingType())) { + case BILLING_CANTEEN: + List 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 storeOrders = getStoreOrderDO(createReqVO.getStartTime(), createReqVO.getEndTime(), createReqVO.getOrderId()); + if (CollUtil.isEmpty(storeOrders)) throw exception(BILLING_NOT_ORDER_EXISTS); + totalMoney = calculateTotalMoney1(storeOrders, StoreOrderDO::getTotalPrice); + List orderIds1 = getOrderIds(storeOrders, StoreOrderDO::getOrderId); + orderIds = orderIds1.stream().map(Integer::longValue).collect(Collectors.toList()); + billingName = "超市物品费"; + updateBillingExist(storeOrders, storeOrderMapper); + break; + case BILLING_SPACE_CAPSULE: + List 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 BigDecimal calculateTotalMoney1(List orders, Function moneyMapper) { + return orders.stream() + .map(moneyMapper) + .filter(Objects::nonNull) // 过滤掉 null 值,避免空指针异常 + .map(BigDecimal::valueOf) // 将 Double 转换为 BigDecimal + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + } + // 计算订单的总金额 + private BigDecimal calculateTotalMoney(List orders, Function moneyMapper) { + return orders.stream() + .map(moneyMapper) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + // 获取订单 ID 列表 + private List getOrderIds(List orders, Function idMapper) { + return orders.stream() + .map(idMapper) + .collect(Collectors.toList()); + } + // 更新订单为开票状态 + private void updateBillingExist(List orders, BaseMapperX 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 + Set 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() + .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() + .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() + .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() + .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; + } + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/order/OrderServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/order/OrderServiceImpl.java index 367a5545..a518eb98 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/order/OrderServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/order/OrderServiceImpl.java @@ -174,6 +174,8 @@ public class OrderServiceImpl implements OrderService { PageResult dishOrderDOPageResult = dishOrderMapper.selectPage(vo, Wrappers.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 appOrderRespVOPageResult = BeanUtils.toBean(dishOrderDOPageResult, AppOrderRespVO.class); List list = appOrderRespVOPageResult.getList(); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml index 15ec12f4..82b79fb6 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/order/DishOrderMapper.xml @@ -33,4 +33,11 @@ + + update member_dish_order SET billing_exist = #{exist} + WHERE id IN + + #{id} + + \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml index b131096c..524e0f52 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/orderspacecapsule/OrderSpaceCapsuleMapper.xml @@ -64,4 +64,12 @@ GROUP BY a.carteen_id, a.carteen_name, a.space_capsule_id, b.space_name; + + + update t_order_space_capsule SET billing_exist = #{exist} + WHERE id IN + + #{id} + + \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml index 14691c17..48a9737f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/storeorder/StoreOrderMapper.xml @@ -61,4 +61,11 @@ order by so.order_id DESC + + update member_store_order SET billing_exist = #{exist} + WHERE order_id IN + + #{id} + + \ No newline at end of file