Commit 78593fde by lijinqi

用户端创建api订单 完成

用户端api支付         完成
用户端我的api资源包    完成
pdf预览接口 完成
parent 9c2888c7
package com.luhu.computility.module.apihub.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author LeeYan9
* @since 2022-09-15
*/
@Configuration
@EnableConfigurationProperties(ApiOrderProperties.class)
public class ApiOrderConfig {
}
package com.luhu.computility.module.apihub.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.Duration;
/**
* 交易订单的配置项
*
* @author ljq
* @since 2025-09-07
*/
@ConfigurationProperties(prefix = "computility.api.order")
@Data
@Validated
public class ApiOrderProperties {
private static final String PAY_APP_KEY_DEFAULT = "apimall";
/**
* 支付应用标识
*
* 在 pay 模块的 [支付管理 -> 应用信息]
*/
@NotEmpty(message = "Pay 应用标识不能为空")
private String payAppKey = PAY_APP_KEY_DEFAULT;
/**
* 支付超时时间
*/
@NotNull(message = "支付超时时间不能为空")
private Duration payExpireTime;
/**
* 收货超时时间
*/
@NotNull(message = "收货超时时间不能为空")
private Duration receiveExpireTime;
/**
* 评论超时时间
*/
@NotNull(message = "评论超时时间不能为空")
private Duration commentExpireTime;
/**
* 是否同步订单状态到微信小程序
*/
@NotNull(message = "是否同步订单状态到微信小程序不能为空")
private Boolean statusSyncToWxaEnable;
}
package com.luhu.computility.module.apihub.controller.admin.apiorder;
import cn.hutool.core.date.DateUtil;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.UserApiUsageSaveReqVO;
import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService;
import com.luhu.computility.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
......@@ -8,6 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
......@@ -33,11 +39,16 @@ import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
@RestController
@RequestMapping("/apihub/api-order")
@Validated
@Slf4j
public class ApiOrderController {
@Resource
private ApiOrderService apiOrderService;
@Resource
private UserApiUsageService userApiUsageService;
@PostMapping("/create")
@Operation(summary = "创建api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:create')")
......@@ -101,4 +112,31 @@ public class ApiOrderController {
BeanUtils.toBean(list, ApiOrderRespVO.class));
}
/**
* 内部支付任务回调
*/
@PostMapping("/update-paid")
@PermitAll
public CommonResult<Boolean> updateApiOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) {
apiOrderService.updateApiOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayOrderId());
log.error("更新Api订单为已支付------------" + notifyReqDTO.getMerchantOrderId());
ApiOrderDO apiOrder = apiOrderService.getApiOrder(Long.parseLong(notifyReqDTO.getMerchantOrderId()));
userApiUsageService.createUserApiUsage(
new UserApiUsageSaveReqVO().setApiId(apiOrder.getApiId())
.setApiName(apiOrder.getApiName())
.setPackageId(apiOrder.getPackageId())
.setPackageName(apiOrder.getPackageName())
.setPackageTimes(apiOrder.getPackageTimes())
.setPackageValidDays(apiOrder.getPackageValidDays())
.setUserId(apiOrder.getUserId())
.setExpireTime(DateUtil.offsetDay(new Date(), apiOrder.getPackageTimes()).toLocalDateTime() )
.setPackagePrice(apiOrder.getPackagePrice())
);
log.error("创建用户Api资源包数据------------" + notifyReqDTO.getMerchantOrderId());
log.error("内部支付任务回调 ");
return success(true);
}
}
\ No newline at end of file
......@@ -25,17 +25,32 @@ public class ApiOrderRespVO {
@ExcelProperty("购买的API ID")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号")
private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单金额(元)")
private BigDecimal amount;
@Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单实际支付金额(分)")
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
......
......@@ -31,9 +31,9 @@ public class ApiOrderSaveReqVO {
@NotEmpty(message = "订单编号不能为空")
private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单金额(元)不能为空")
private BigDecimal amount;
@Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单实际支付金额(分)不能为空")
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
......
......@@ -31,7 +31,7 @@ public class ApiPackageRespVO {
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@ExcelProperty("价格(元)")
private BigDecimal price;
private Integer price;
@Schema(description = "有效期(天),0表示永久有效")
@ExcelProperty("有效期(天),0表示永久有效")
......
......@@ -26,7 +26,7 @@ public class ApiPackageSaveReqVO {
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@NotNull(message = "价格(元)不能为空")
private Long price;
private Integer price;
@Schema(description = "有效期(天),0表示永久有效")
private Integer validDays;
......
......@@ -29,7 +29,7 @@ import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService;
@Tag(name = "管理后台 - 用户 API 使用统计")
@Tag(name = "管理后台 - 用户API管理")
@RestController
@RequestMapping("/apihub/user-api-usage")
@Validated
......@@ -39,14 +39,14 @@ public class UserApiUsageController {
private UserApiUsageService userApiUsageService;
@PostMapping("/create")
@Operation(summary = "创建用户 API 使用统计")
@Operation(summary = "创建用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:create')")
public CommonResult<Long> createUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO createReqVO) {
return success(userApiUsageService.createUserApiUsage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新用户 API 使用统计")
@Operation(summary = "更新用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:update')")
public CommonResult<Boolean> updateUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO updateReqVO) {
userApiUsageService.updateUserApiUsage(updateReqVO);
......@@ -54,7 +54,7 @@ public class UserApiUsageController {
}
@DeleteMapping("/delete")
@Operation(summary = "删除用户 API 使用统计")
@Operation(summary = "删除用户API管理")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsage(@RequestParam("id") Long id) {
......@@ -64,7 +64,7 @@ public class UserApiUsageController {
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除用户 API 使用统计")
@Operation(summary = "批量删除用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsageList(@RequestParam("ids") List<Long> ids) {
userApiUsageService.deleteUserApiUsageListByIds(ids);
......@@ -72,7 +72,7 @@ public class UserApiUsageController {
}
@GetMapping("/get")
@Operation(summary = "获得用户 API 使用统计")
@Operation(summary = "获得用户API管理")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<UserApiUsageRespVO> getUserApiUsage(@RequestParam("id") Long id) {
......@@ -81,24 +81,22 @@ public class UserApiUsageController {
}
@GetMapping("/page")
@Operation(summary = "获得用户 API 使用统计分页")
@Operation(summary = "获得用户API管理分页")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<PageResult<UserApiUsageRespVO>> getUserApiUsagePage(@Valid UserApiUsagePageReqVO pageReqVO) {
PageResult<UserApiUsageDO> pageResult = userApiUsageService.getUserApiUsagePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, UserApiUsageRespVO.class));
return success(userApiUsageService.getUserApiUsagePage(pageReqVO));
}
@GetMapping("/export-excel")
@Operation(summary = "导出用户 API 使用统计 Excel")
@Operation(summary = "导出用户API管理 Excel")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportUserApiUsageExcel(@Valid UserApiUsagePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<UserApiUsageDO> list = userApiUsageService.getUserApiUsagePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "用户 API 使用统计.xls", "数据", UserApiUsageRespVO.class,
BeanUtils.toBean(list, UserApiUsageRespVO.class));
ExcelUtils.write(response, "用户API管理.xls", "数据", UserApiUsageRespVO.class,
userApiUsageService.getUserApiUsagePage(pageReqVO).getList());
}
}
\ No newline at end of file
......@@ -16,14 +16,13 @@ public class UserApiUsagePageReqVO extends PageParam {
@Schema(description = "用户ID", example = "26592")
private Long userId;
@Schema(description = "API ID", example = "8522")
private Long apiId;
@Schema(description = "用户手机", example = "8522")
private String userMobile;
@Schema(description = "购买总次数")
private Integer totalTimes;
@Schema(description = "api名称", example = "8522")
private String apiName;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "资源包名称", example = "8522")
private String packageName;
}
\ No newline at end of file
......@@ -16,17 +16,24 @@ public class UserApiUsageRespVO {
@ExcelProperty("记录ID")
private Long id;
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592")
@ExcelProperty("用户ID")
private Long userId;
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592")
@ExcelProperty("用户手机号")
private String userMobile;
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8522")
@ExcelProperty("API ID")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买总次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("购买总次数")
private Integer totalTimes;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("已使用次数")
......
package com.luhu.computility.module.apihub.controller.admin.userapiusage.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
......@@ -22,9 +23,25 @@ public class UserApiUsageSaveReqVO {
@NotNull(message = "API ID不能为空")
private Long apiId;
@Schema(description = "购买总次数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "购买总次数不能为空")
private Integer totalTimes;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "已使用次数不能为空")
......
package com.luhu.computility.module.apihub.controller.app.apiorder;
import cn.hutool.core.collection.CollectionUtil;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.framework.security.core.util.SecurityFrameworkUtils;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderCreateReqVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderCreateRespVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderPageReqVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderRespVO;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import com.luhu.computility.module.apihub.enums.ApiOrderStatus;
import com.luhu.computility.module.apihub.service.api.ApiService;
import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -19,6 +29,10 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
@Tag(name = "用户端 - api订单")
@RestController
@RequestMapping("/apihub/api-order")
......@@ -32,11 +46,29 @@ public class AppApiOrderController {
@PostMapping("/create")
@Operation(summary = "创建api订单")
public CommonResult<Long> createApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO createReqVO) {
public CommonResult<AppApiOrderCreateRespVO> createApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO createReqVO) {
//创建订单
createReqVO.setUserId(SecurityFrameworkUtils.getLoginUser().getId());
apiOrderService.createOrder(createReqVO);
return null ;//success(apiOrderService.createApiOrder(createReqVO));
ApiOrderDO order = apiOrderService.createOrder(createReqVO);
return success(new AppApiOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId()));
}
@GetMapping("/page")
@Operation(summary = "获得api订单分页")
public CommonResult<PageResult<AppApiOrderRespVO>> getApiOrderPage(@Valid AppApiOrderPageReqVO pageReqVO) {
PageResult<ApiOrderDO> pageResult = apiOrderService.getAppApiOrderPage(pageReqVO);
PageResult<AppApiOrderRespVO> appApiOrderRespVOPageResult
= BeanUtils.toBean(pageResult, AppApiOrderRespVO.class);
//处理状态,这里一般是交给前端处理
List<AppApiOrderRespVO> list = appApiOrderRespVOPageResult.getList();
if (!CollectionUtil.isEmpty(list)) {
for (AppApiOrderRespVO vo : list) {
vo.setStatusName(ApiOrderStatus.getRemarkByValue(vo.getStatus()));
}
}
appApiOrderRespVOPageResult.setList(list);
return success(appApiOrderRespVOPageResult);
}
/*
@PutMapping("/update")
......
......@@ -31,11 +31,11 @@ public class AppApiOrderCreateReqVO {
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "购买的套餐使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@Schema(description = "购买的套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "购买的套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packagePrice;
private Integer packagePrice;
@Schema(description = "购买的套餐有效时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
......@@ -43,8 +43,8 @@ public class AppApiOrderCreateReqVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
private Long amount;
@Schema(description = "订单实际支付金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
......
package com.luhu.computility.module.apihub.controller.app.apiorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 App - api交易订单创建 Response VO")
@Data
public class AppApiOrderCreateRespVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long payOrderId;
}
......@@ -20,24 +20,8 @@ public class AppApiOrderPageReqVO extends PageParam {
@Schema(description = "关键字查询", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String searchQuery;
@Schema(description = "订单编号")
private String orderNo;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
private Long payOrderId;
@Schema(description = "订单支付时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] payTime;
@Schema(description = "支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
......@@ -29,27 +29,27 @@ public class AppApiOrderRespVO {
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packageName;
private String packageName;
@Schema(description = "套餐使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packageTimes;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packagePrice;
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer validDays;
private Integer packageValidDays;
@Schema(description = "购买的套餐实际支出价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long costPrice;
private Integer costPrice;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号")
private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单金额(元)")
private Long amount;
@Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单状态")
private String statusName;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
......
......@@ -54,33 +54,33 @@ public class ApiOrderDO extends BaseDO {
*/
private String packageName;
/**
* 购买的套餐使用次数
* 购买的套餐最大可用次数
*/
private Long packageTimes;
private Integer packageTimes;
/**
* 购买的套餐有效期
*/
private Integer validDays;
private Integer packageValidDays;
/**
* 购买的套餐实际费用
*/private Long costPrice;
*/private Integer costPrice;
/**
* 购买的套餐单价
*/
private Long packagePrice;
private Integer packagePrice;
/**
* 订单编号
*/
private String orderNo;
/**
* 订单金额(元)
*/
private BigDecimal amount;
/**
* 订单状态:0=待支付,1=已支付,2=已取消
*/
private Integer status;
/**
* 支付状态:1=已支付,2=未支付
*/
private Integer payStatus;
/**
* 支付订单编号
*/
private Long payOrderId;
......
......@@ -43,7 +43,7 @@ public class ApiPackageDO extends BaseDO {
/**
* 价格(元)
*/
private Long price;
private Integer price;
/**
* 有效期(天),0表示永久有效
*/
......
......@@ -33,13 +33,29 @@ public class UserApiUsageDO extends BaseDO {
*/
private Long userId;
/**
* API ID
* 购买的API ID
*/
private Long apiId;
/**
* 购买总次数
* 购买的套餐名称
*/
private Integer totalTimes;
private String apiName;
/**
* 购买的套餐ID
*/
private Long packageId;
/**
* 购买的套餐名
*/
private String packageName;
/**
* 购买的套餐最大可用次数
*/
private Long packageTimes;
/**
* 购买的套餐有效期
*/
private Integer packageValidDays;
/**
* 已使用次数
*/
......
......@@ -2,9 +2,14 @@ package com.luhu.computility.module.apihub.dal.mysql.apiorder;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderPageReqVO;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*;
......@@ -31,4 +36,20 @@ public interface ApiOrderMapper extends BaseMapperX<ApiOrderDO> {
.orderByDesc(ApiOrderDO::getId));
}
default PageResult<ApiOrderDO> selectAppPage(AppApiOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiOrderDO>()
.eqIfPresent(ApiOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(ApiOrderDO::getStatus, reqVO.getStatus())
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiOrderDO::getOrderNo, reqVO.getSearchQuery())
.or(!StringUtils.isEmpty(reqVO.getSearchQuery()))
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiOrderDO::getApiName, reqVO.getSearchQuery())
.orderByDesc(ApiOrderDO::getId));
}
default int updateByIdAndStatus(Long id, Integer status, ApiOrderDO update) {
return update(update, new LambdaUpdateWrapper<ApiOrderDO>()
.eq(ApiOrderDO::getId, id).eq(ApiOrderDO::getStatus, status));
}
}
\ No newline at end of file
......@@ -2,10 +2,15 @@ package com.luhu.computility.module.apihub.dal.mysql.userapiusage;
import java.util.*;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
......@@ -17,13 +22,14 @@ import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
@Mapper
public interface UserApiUsageMapper extends BaseMapperX<UserApiUsageDO> {
default PageResult<UserApiUsageDO> selectPage(UserApiUsagePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<UserApiUsageDO>()
.eqIfPresent(UserApiUsageDO::getUserId, reqVO.getUserId())
.eqIfPresent(UserApiUsageDO::getApiId, reqVO.getApiId())
.eqIfPresent(UserApiUsageDO::getTotalTimes, reqVO.getTotalTimes())
.betweenIfPresent(UserApiUsageDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(UserApiUsageDO::getId));
default PageResult<UserApiUsageRespVO> selectPage(UserApiUsagePageReqVO reqVO) {
return selectJoinPage(reqVO, UserApiUsageRespVO.class, new MPJLambdaWrapperX<UserApiUsageDO>()
.selectAll(UserApiUsageDO.class)
.selectAs(MemberUserDO :: getMobile, UserApiUsageRespVO :: getUserMobile)
.leftJoin(MemberUserDO.class, MemberUserDO::getId,UserApiUsageDO::getUserId)
.like(!StringUtils.isEmpty(reqVO.getPackageName()), UserApiUsageDO::getPackageName, reqVO.getPackageName())
.like(!StringUtils.isEmpty(reqVO.getApiName()), UserApiUsageDO::getApiName, reqVO.getApiName())
.orderByDesc(UserApiUsageDO::getCreateTime));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.enums;
/**
* 订单支付状态
*/
public enum ApiOrderPayStatus {
// 请根据实际情况改成对应的值和备注
WAITING(0, "未支付"),
SUCCESS(10, "支付成功"),
REFUND(20, "已退款"),
CLOSED(30, "支付关闭"), // 注意:全部退款后,还是 REFUND 状态
;
private int value;
private String remark;
private ApiOrderPayStatus(int value, String remark) {
this.value = value;
this.remark = remark;
}
public int getValue() {
return value;
}
public String getRemark() {
return remark;
}
public static ApiOrderPayStatus getByValue(int value) {
for (ApiOrderPayStatus o : ApiOrderPayStatus.values()) {
if (o.getValue() == value) {
return o;
}
}
return null;
}
public static String getRemarkByValue(Integer value) {
for (ApiOrderPayStatus status : values()) {
if (status.getValue() == value) {
return status.getRemark();
}
}
return null;
}
}
......@@ -36,4 +36,13 @@ public enum ApiOrderStatus {
}
return null;
}
public static String getRemarkByValue(Integer value) {
for (ApiOrderStatus status : values()) {
if (status.getValue() == value) {
return status.getRemark();
}
}
return null;
}
}
......@@ -14,6 +14,9 @@ public interface ErrorCodeConstants {
ErrorCode API_ORDER_NOT_EXISTS = new ErrorCode(1_010_001_003, " API 订单不存在");
ErrorCode API_PACKAGE_NOT_EXISTS = new ErrorCode(1_010_001_004, " API 套餐不存在");
ErrorCode API_CATEGORY_NOT_EXISTS = new ErrorCode(1_010_001_005, "API分类不存在");
ErrorCode API_ORDER_NOT_FOUND = new ErrorCode(1_010_001_011, "API订单不存在");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR = new ErrorCode(1_010_001_014, "API订单更新支付状态失败,支付单编号不匹配");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1_010_001_015, "API订单更新支付状态失败,支付单状态不是【支付成功】状态");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1_010_001_016, "API订单更新支付状态失败,支付单金额不匹配");
}
......@@ -4,6 +4,7 @@ import java.util.*;
import javax.validation.*;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderCreateReqVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderPageReqVO;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
......@@ -64,4 +65,22 @@ public interface ApiOrderService {
*/
PageResult<ApiOrderDO> getApiOrderPage(ApiOrderPageReqVO pageReqVO);
/**
* 获得api订单分页(用户端)
*
* @param pageReqVO 分页查询
* @return api订单分页
*/
PageResult<ApiOrderDO> getAppApiOrderPage(AppApiOrderPageReqVO pageReqVO);
/**
* 更新api交易订单已支付
*
* @param merchantOrderId api交易订单id
* @param payOrderId api支付订单编号
*/
void updateApiOrderPaid(Long merchantOrderId, Long payOrderId);
}
\ No newline at end of file
......@@ -57,6 +57,6 @@ public interface UserApiUsageService {
* @param pageReqVO 分页查询
* @return 用户 API 使用统计分页
*/
PageResult<UserApiUsageDO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO);
PageResult<UserApiUsageRespVO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO);
}
\ No newline at end of file
......@@ -78,7 +78,7 @@ public class UserApiUsageServiceImpl implements UserApiUsageService {
}
@Override
public PageResult<UserApiUsageDO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO) {
public PageResult<UserApiUsageRespVO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO) {
return userApiUsageMapper.selectPage(pageReqVO);
}
......
......@@ -129,21 +129,22 @@ public class FileController {
@Operation(summary = "购买PDF 文件预览")
@PermitAll
public void previewPdf(HttpServletResponse response) throws IOException {
// 假设 path = /data/xxx.pdf
File file = new File("/data/buy.pdf");
File file = new File("/Users/jackey/data/code/buy.pdf");
if (!file.exists()) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
// 设置 PDF 预览
response.setContentType("application/pdf");
// inline 表示浏览器内嵌预览,attachment 表示下载
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // 避免缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
// 输出文件流
try (InputStream inputStream = new FileInputStream(file);
OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[4096];
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment