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; 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 org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -8,6 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; ...@@ -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.Parameter;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import javax.validation.*; import javax.validation.*;
import javax.servlet.http.*; import javax.servlet.http.*;
...@@ -33,11 +39,16 @@ import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService; ...@@ -33,11 +39,16 @@ import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
@RestController @RestController
@RequestMapping("/apihub/api-order") @RequestMapping("/apihub/api-order")
@Validated @Validated
@Slf4j
public class ApiOrderController { public class ApiOrderController {
@Resource @Resource
private ApiOrderService apiOrderService; private ApiOrderService apiOrderService;
@Resource
private UserApiUsageService userApiUsageService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建api订单") @Operation(summary = "创建api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:create')") @PreAuthorize("@ss.hasPermission('apihub:api-order:create')")
...@@ -101,4 +112,31 @@ public class ApiOrderController { ...@@ -101,4 +112,31 @@ public class ApiOrderController {
BeanUtils.toBean(list, ApiOrderRespVO.class)); 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 { ...@@ -25,17 +25,32 @@ public class ApiOrderRespVO {
@ExcelProperty("购买的API ID") @ExcelProperty("购买的API ID")
private Long apiId; private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID") @ExcelProperty("购买的套餐ID")
private Long packageId; 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) @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号") @ExcelProperty("订单编号")
private String orderNo; private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单金额(元)") @ExcelProperty("订单实际支付金额(分)")
private BigDecimal amount; private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2") @Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消") @ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
......
...@@ -31,9 +31,9 @@ public class ApiOrderSaveReqVO { ...@@ -31,9 +31,9 @@ public class ApiOrderSaveReqVO {
@NotEmpty(message = "订单编号不能为空") @NotEmpty(message = "订单编号不能为空")
private String orderNo; private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单金额(元)不能为空") @NotNull(message = "订单实际支付金额(分)不能为空")
private BigDecimal amount; private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2") @Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status; private Integer status;
......
...@@ -31,7 +31,7 @@ public class ApiPackageRespVO { ...@@ -31,7 +31,7 @@ public class ApiPackageRespVO {
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887") @Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@ExcelProperty("价格(元)") @ExcelProperty("价格(元)")
private BigDecimal price; private Integer price;
@Schema(description = "有效期(天),0表示永久有效") @Schema(description = "有效期(天),0表示永久有效")
@ExcelProperty("有效期(天),0表示永久有效") @ExcelProperty("有效期(天),0表示永久有效")
......
...@@ -26,7 +26,7 @@ public class ApiPackageSaveReqVO { ...@@ -26,7 +26,7 @@ public class ApiPackageSaveReqVO {
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887") @Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@NotNull(message = "价格(元)不能为空") @NotNull(message = "价格(元)不能为空")
private Long price; private Integer price;
@Schema(description = "有效期(天),0表示永久有效") @Schema(description = "有效期(天),0表示永久有效")
private Integer validDays; private Integer validDays;
......
...@@ -29,7 +29,7 @@ import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*; ...@@ -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.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService; import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService;
@Tag(name = "管理后台 - 用户 API 使用统计") @Tag(name = "管理后台 - 用户API管理")
@RestController @RestController
@RequestMapping("/apihub/user-api-usage") @RequestMapping("/apihub/user-api-usage")
@Validated @Validated
...@@ -39,14 +39,14 @@ public class UserApiUsageController { ...@@ -39,14 +39,14 @@ public class UserApiUsageController {
private UserApiUsageService userApiUsageService; private UserApiUsageService userApiUsageService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建用户 API 使用统计") @Operation(summary = "创建用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:create')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:create')")
public CommonResult<Long> createUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO createReqVO) { public CommonResult<Long> createUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO createReqVO) {
return success(userApiUsageService.createUserApiUsage(createReqVO)); return success(userApiUsageService.createUserApiUsage(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新用户 API 使用统计") @Operation(summary = "更新用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:update')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:update')")
public CommonResult<Boolean> updateUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO updateReqVO) { public CommonResult<Boolean> updateUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO updateReqVO) {
userApiUsageService.updateUserApiUsage(updateReqVO); userApiUsageService.updateUserApiUsage(updateReqVO);
...@@ -54,7 +54,7 @@ public class UserApiUsageController { ...@@ -54,7 +54,7 @@ public class UserApiUsageController {
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
@Operation(summary = "删除用户 API 使用统计") @Operation(summary = "删除用户API管理")
@Parameter(name = "id", description = "编号", required = true) @Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsage(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteUserApiUsage(@RequestParam("id") Long id) {
...@@ -64,7 +64,7 @@ public class UserApiUsageController { ...@@ -64,7 +64,7 @@ public class UserApiUsageController {
@DeleteMapping("/delete-list") @DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true) @Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除用户 API 使用统计") @Operation(summary = "批量删除用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsageList(@RequestParam("ids") List<Long> ids) { public CommonResult<Boolean> deleteUserApiUsageList(@RequestParam("ids") List<Long> ids) {
userApiUsageService.deleteUserApiUsageListByIds(ids); userApiUsageService.deleteUserApiUsageListByIds(ids);
...@@ -72,7 +72,7 @@ public class UserApiUsageController { ...@@ -72,7 +72,7 @@ public class UserApiUsageController {
} }
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得用户 API 使用统计") @Operation(summary = "获得用户API管理")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<UserApiUsageRespVO> getUserApiUsage(@RequestParam("id") Long id) { public CommonResult<UserApiUsageRespVO> getUserApiUsage(@RequestParam("id") Long id) {
...@@ -81,24 +81,22 @@ public class UserApiUsageController { ...@@ -81,24 +81,22 @@ public class UserApiUsageController {
} }
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得用户 API 使用统计分页") @Operation(summary = "获得用户API管理分页")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<PageResult<UserApiUsageRespVO>> getUserApiUsagePage(@Valid UserApiUsagePageReqVO pageReqVO) { public CommonResult<PageResult<UserApiUsageRespVO>> getUserApiUsagePage(@Valid UserApiUsagePageReqVO pageReqVO) {
PageResult<UserApiUsageDO> pageResult = userApiUsageService.getUserApiUsagePage(pageReqVO); return success(userApiUsageService.getUserApiUsagePage(pageReqVO));
return success(BeanUtils.toBean(pageResult, UserApiUsageRespVO.class));
} }
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出用户 API 使用统计 Excel") @Operation(summary = "导出用户API管理 Excel")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:export')") @PreAuthorize("@ss.hasPermission('apihub:user-api-usage:export')")
@ApiAccessLog(operateType = EXPORT) @ApiAccessLog(operateType = EXPORT)
public void exportUserApiUsageExcel(@Valid UserApiUsagePageReqVO pageReqVO, public void exportUserApiUsageExcel(@Valid UserApiUsagePageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<UserApiUsageDO> list = userApiUsageService.getUserApiUsagePage(pageReqVO).getList();
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "用户 API 使用统计.xls", "数据", UserApiUsageRespVO.class, ExcelUtils.write(response, "用户API管理.xls", "数据", UserApiUsageRespVO.class,
BeanUtils.toBean(list, UserApiUsageRespVO.class)); userApiUsageService.getUserApiUsagePage(pageReqVO).getList());
} }
} }
\ No newline at end of file
...@@ -16,14 +16,13 @@ public class UserApiUsagePageReqVO extends PageParam { ...@@ -16,14 +16,13 @@ public class UserApiUsagePageReqVO extends PageParam {
@Schema(description = "用户ID", example = "26592") @Schema(description = "用户ID", example = "26592")
private Long userId; private Long userId;
@Schema(description = "API ID", example = "8522") @Schema(description = "用户手机", example = "8522")
private Long apiId; private String userMobile;
@Schema(description = "购买总次数") @Schema(description = "api名称", example = "8522")
private Integer totalTimes; private String apiName;
@Schema(description = "创建时间") @Schema(description = "资源包名称", example = "8522")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private String packageName;
private LocalDateTime[] createTime;
} }
\ No newline at end of file
...@@ -16,17 +16,24 @@ public class UserApiUsageRespVO { ...@@ -16,17 +16,24 @@ public class UserApiUsageRespVO {
@ExcelProperty("记录ID") @ExcelProperty("记录ID")
private Long id; private Long id;
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592") @Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592")
@ExcelProperty("用户ID") @ExcelProperty("用户手机号")
private Long userId; private String userMobile;
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8522") @Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@ExcelProperty("API ID") private String apiName;
private Long apiId;
@Schema(description = "购买总次数", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买总次数") private String packageName;
private Integer totalTimes;
@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) @Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("已使用次数") @ExcelProperty("已使用次数")
......
package com.luhu.computility.module.apihub.controller.admin.userapiusage.vo; 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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
...@@ -22,9 +23,25 @@ public class UserApiUsageSaveReqVO { ...@@ -22,9 +23,25 @@ public class UserApiUsageSaveReqVO {
@NotNull(message = "API ID不能为空") @NotNull(message = "API ID不能为空")
private Long apiId; private Long apiId;
@Schema(description = "购买总次数", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@NotNull(message = "购买总次数不能为空") private String apiName;
private Integer totalTimes;
@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) @Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "已使用次数不能为空") @NotNull(message = "已使用次数不能为空")
......
package com.luhu.computility.module.apihub.controller.app.apiorder; 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.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.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.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.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.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.api.ApiService;
import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService; import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService; import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -19,6 +29,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -19,6 +29,10 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
@Tag(name = "用户端 - api订单") @Tag(name = "用户端 - api订单")
@RestController @RestController
@RequestMapping("/apihub/api-order") @RequestMapping("/apihub/api-order")
...@@ -32,11 +46,29 @@ public class AppApiOrderController { ...@@ -32,11 +46,29 @@ public class AppApiOrderController {
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建api订单") @Operation(summary = "创建api订单")
public CommonResult<Long> createApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO createReqVO) { public CommonResult<AppApiOrderCreateRespVO> createApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO createReqVO) {
//创建订单 //创建订单
createReqVO.setUserId(SecurityFrameworkUtils.getLoginUser().getId()); createReqVO.setUserId(SecurityFrameworkUtils.getLoginUser().getId());
apiOrderService.createOrder(createReqVO); ApiOrderDO order = apiOrderService.createOrder(createReqVO);
return null ;//success(apiOrderService.createApiOrder(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") @PutMapping("/update")
......
...@@ -31,11 +31,11 @@ public class AppApiOrderCreateReqVO { ...@@ -31,11 +31,11 @@ public class AppApiOrderCreateReqVO {
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName; private String packageName;
@Schema(description = "购买的套餐使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes; private Integer packageTimes;
@Schema(description = "购买的套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packagePrice; private Integer packagePrice;
@Schema(description = "购买的套餐有效时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐有效时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays; private Integer packageValidDays;
...@@ -43,8 +43,8 @@ public class AppApiOrderCreateReqVO { ...@@ -43,8 +43,8 @@ public class AppApiOrderCreateReqVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String orderNo; private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单实际支付金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
private Long amount; private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2") @Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status; 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 { ...@@ -20,24 +20,8 @@ public class AppApiOrderPageReqVO extends PageParam {
@Schema(description = "关键字查询", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347") @Schema(description = "关键字查询", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String searchQuery; private String searchQuery;
@Schema(description = "订单编号")
private String orderNo;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2") @Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status; 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 { ...@@ -29,27 +29,27 @@ public class AppApiOrderRespVO {
private Long packageId; private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packageName; private String packageName;
@Schema(description = "套餐使用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packageTimes; private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long packagePrice; private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer validDays; private Integer packageValidDays;
@Schema(description = "购买的套餐实际支出价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957") @Schema(description = "购买的套餐实际支出价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Long costPrice; private Integer costPrice;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号") @ExcelProperty("订单编号")
private String orderNo; private String orderNo;
@Schema(description = "订单金额(元)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单金额(元)") @ExcelProperty("订单状态")
private Long amount; private String statusName;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2") @Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消") @ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
......
...@@ -54,33 +54,33 @@ public class ApiOrderDO extends BaseDO { ...@@ -54,33 +54,33 @@ public class ApiOrderDO extends BaseDO {
*/ */
private String packageName; 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 String orderNo;
/** /**
* 订单金额(元)
*/
private BigDecimal amount;
/**
* 订单状态:0=待支付,1=已支付,2=已取消 * 订单状态:0=待支付,1=已支付,2=已取消
*/ */
private Integer status; private Integer status;
/** /**
* 支付状态:1=已支付,2=未支付
*/
private Integer payStatus;
/**
* 支付订单编号 * 支付订单编号
*/ */
private Long payOrderId; private Long payOrderId;
......
...@@ -43,7 +43,7 @@ public class ApiPackageDO extends BaseDO { ...@@ -43,7 +43,7 @@ public class ApiPackageDO extends BaseDO {
/** /**
* 价格(元) * 价格(元)
*/ */
private Long price; private Integer price;
/** /**
* 有效期(天),0表示永久有效 * 有效期(天),0表示永久有效
*/ */
......
...@@ -33,13 +33,29 @@ public class UserApiUsageDO extends BaseDO { ...@@ -33,13 +33,29 @@ public class UserApiUsageDO extends BaseDO {
*/ */
private Long userId; private Long userId;
/** /**
* API ID * 购买的API ID
*/ */
private Long apiId; 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; ...@@ -2,9 +2,14 @@ package com.luhu.computility.module.apihub.dal.mysql.apiorder;
import java.util.*; 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.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX; 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.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 com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*; import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*;
...@@ -31,4 +36,20 @@ public interface ApiOrderMapper extends BaseMapperX<ApiOrderDO> { ...@@ -31,4 +36,20 @@ public interface ApiOrderMapper extends BaseMapperX<ApiOrderDO> {
.orderByDesc(ApiOrderDO::getId)); .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; ...@@ -2,10 +2,15 @@ package com.luhu.computility.module.apihub.dal.mysql.userapiusage;
import java.util.*; import java.util.*;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult; import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX; 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.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.apihub.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*; import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
...@@ -17,13 +22,14 @@ 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 @Mapper
public interface UserApiUsageMapper extends BaseMapperX<UserApiUsageDO> { public interface UserApiUsageMapper extends BaseMapperX<UserApiUsageDO> {
default PageResult<UserApiUsageDO> selectPage(UserApiUsagePageReqVO reqVO) { default PageResult<UserApiUsageRespVO> selectPage(UserApiUsagePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<UserApiUsageDO>() return selectJoinPage(reqVO, UserApiUsageRespVO.class, new MPJLambdaWrapperX<UserApiUsageDO>()
.eqIfPresent(UserApiUsageDO::getUserId, reqVO.getUserId()) .selectAll(UserApiUsageDO.class)
.eqIfPresent(UserApiUsageDO::getApiId, reqVO.getApiId()) .selectAs(MemberUserDO :: getMobile, UserApiUsageRespVO :: getUserMobile)
.eqIfPresent(UserApiUsageDO::getTotalTimes, reqVO.getTotalTimes()) .leftJoin(MemberUserDO.class, MemberUserDO::getId,UserApiUsageDO::getUserId)
.betweenIfPresent(UserApiUsageDO::getCreateTime, reqVO.getCreateTime()) .like(!StringUtils.isEmpty(reqVO.getPackageName()), UserApiUsageDO::getPackageName, reqVO.getPackageName())
.orderByDesc(UserApiUsageDO::getId)); .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 { ...@@ -36,4 +36,13 @@ public enum ApiOrderStatus {
} }
return null; 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 { ...@@ -14,6 +14,9 @@ public interface ErrorCodeConstants {
ErrorCode API_ORDER_NOT_EXISTS = new ErrorCode(1_010_001_003, " API 订单不存在"); 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_PACKAGE_NOT_EXISTS = new ErrorCode(1_010_001_004, " API 套餐不存在");
ErrorCode API_CATEGORY_NOT_EXISTS = new ErrorCode(1_010_001_005, "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.*; ...@@ -4,6 +4,7 @@ import java.util.*;
import javax.validation.*; import javax.validation.*;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*; 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.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.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import com.luhu.computility.framework.common.pojo.PageResult; import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam; import com.luhu.computility.framework.common.pojo.PageParam;
...@@ -64,4 +65,22 @@ public interface ApiOrderService { ...@@ -64,4 +65,22 @@ public interface ApiOrderService {
*/ */
PageResult<ApiOrderDO> getApiOrderPage(ApiOrderPageReqVO pageReqVO); 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 { ...@@ -57,6 +57,6 @@ public interface UserApiUsageService {
* @param pageReqVO 分页查询 * @param pageReqVO 分页查询
* @return 用户 API 使用统计分页 * @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 { ...@@ -78,7 +78,7 @@ public class UserApiUsageServiceImpl implements UserApiUsageService {
} }
@Override @Override
public PageResult<UserApiUsageDO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO) { public PageResult<UserApiUsageRespVO> getUserApiUsagePage(UserApiUsagePageReqVO pageReqVO) {
return userApiUsageMapper.selectPage(pageReqVO); return userApiUsageMapper.selectPage(pageReqVO);
} }
......
...@@ -129,21 +129,22 @@ public class FileController { ...@@ -129,21 +129,22 @@ public class FileController {
@Operation(summary = "购买PDF 文件预览") @Operation(summary = "购买PDF 文件预览")
@PermitAll @PermitAll
public void previewPdf(HttpServletResponse response) throws IOException { public void previewPdf(HttpServletResponse response) throws IOException {
// 假设 path = /data/xxx.pdf File file = new File("/Users/jackey/data/code/buy.pdf");
File file = new File("/data/buy.pdf");
if (!file.exists()) { if (!file.exists()) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND); response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return; return;
} }
// 设置 PDF 预览
response.setContentType("application/pdf"); response.setContentType("application/pdf");
// inline 表示浏览器内嵌预览,attachment 表示下载
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); 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); try (InputStream inputStream = new FileInputStream(file);
OutputStream os = response.getOutputStream()) { OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[4096]; byte[] buffer = new byte[8192];
int bytesRead; int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) { while ((bytesRead = inputStream.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead); 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