From cfb96f1af1dcad31619a239bc47e72b61fa2f738 Mon Sep 17 00:00:00 2001 From: dzq Date: Sat, 19 Apr 2025 16:28:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(shop/order):=20=E6=96=B0=E5=A2=9E=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=EF=BC=8C=E5=8C=85?= =?UTF-8?q?=E6=8B=AC=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E5=92=8CAPI?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增订单管理模块,包含订单列表展示、搜索、分页等功能。前端页面使用Vue3和Element Plus实现,后端API接口包括订单查询、分页处理等。同时添加了订单实体类、查询条件类以及控制器类,支持订单状态的筛选和支付状态的查询。 --- src/api/shop/java/SearchShopOrderQuery.java | 34 +++++ src/api/shop/java/ShopOrderController.java | 31 ++++ src/api/shop/java/ShopOrderEntity.java | 94 ++++++++++++ src/api/shop/order.ts | 37 +++++ src/views/shop/approval/index.vue | 4 + src/views/shop/order/index.vue | 158 ++++++++++++++++++++ 6 files changed, 358 insertions(+) create mode 100644 src/api/shop/java/SearchShopOrderQuery.java create mode 100644 src/api/shop/java/ShopOrderController.java create mode 100644 src/api/shop/java/ShopOrderEntity.java create mode 100644 src/api/shop/order.ts create mode 100644 src/views/shop/order/index.vue diff --git a/src/api/shop/java/SearchShopOrderQuery.java b/src/api/shop/java/SearchShopOrderQuery.java new file mode 100644 index 0000000..95b3fae --- /dev/null +++ b/src/api/shop/java/SearchShopOrderQuery.java @@ -0,0 +1,34 @@ +package com.agileboot.domain.shop.order.query; + +import cn.hutool.core.util.StrUtil; +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import java.util.Date; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class SearchShopOrderQuery extends AbstractPageQuery { + + private String orderNumber; + private Integer status; + private Integer payStatus; + private Date startTime; + private Date endTime; + + @Override + public QueryWrapper addQueryCondition() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper + .like(StrUtil.isNotEmpty(orderNumber), "order_number", orderNumber) + .eq(status != null, "status", status) + .eq(payStatus != null, "pay_status", payStatus) + .between(startTime != null && endTime != null, "create_time", startTime, endTime) + .eq("deleted", 0) + .orderByDesc("create_time"); + + return queryWrapper; + } +} \ No newline at end of file diff --git a/src/api/shop/java/ShopOrderController.java b/src/api/shop/java/ShopOrderController.java new file mode 100644 index 0000000..e445945 --- /dev/null +++ b/src/api/shop/java/ShopOrderController.java @@ -0,0 +1,31 @@ +package com.agileboot.admin.controller.shop; + +import com.agileboot.common.core.base.BaseController; +import com.agileboot.common.core.dto.ResponseDTO; +import com.agileboot.common.core.page.PageDTO; +import com.agileboot.domain.shop.order.OrderApplicationService; +import com.agileboot.domain.shop.order.db.ShopOrderEntity; +import com.agileboot.domain.shop.order.query.SearchShopOrderQuery; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/shop/order") +@RequiredArgsConstructor +@Validated +public class ShopOrderController extends BaseController { + private OrderApplicationService orderApplicationService; + + + @Operation(summary = "订单列表") +// @PreAuthorize("@permission.has('shop:goods:list')") + @GetMapping("/list") + public ResponseDTO> list(SearchShopOrderQuery query) { + PageDTO page = orderApplicationService.getOrderList(query); + return ResponseDTO.ok(page); + } +} diff --git a/src/api/shop/java/ShopOrderEntity.java b/src/api/shop/java/ShopOrderEntity.java new file mode 100644 index 0000000..553cd32 --- /dev/null +++ b/src/api/shop/java/ShopOrderEntity.java @@ -0,0 +1,94 @@ +package com.agileboot.domain.shop.order.db; + +import com.agileboot.common.core.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 商品订单表 + *

+ * + * @author valarchie + * @since 2025-03-10 + */ +@Getter +@Setter +@TableName("shop_order") +@ApiModel(value = "ShopOrderEntity对象", description = "商品订单表") +public class ShopOrderEntity extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单唯一ID") + @TableId(value = "order_id", type = IdType.AUTO) + private Long orderId; + + @ApiModelProperty("ucid") + @TableField("ucid") + private String ucid; + + @ApiModelProperty("openid") + @TableField("openid") + private String openid; + + @ApiModelProperty("支付网关交易id") + @TableField("trade_id") + private String tradeId; + + @ApiModelProperty("手机号码") + @TableField("mobile") + private String mobile; + + @ApiModelProperty("企业微信用户ID或汇邦云用户ID") + @TableField("userid") + private String userid; + + @ApiModelProperty("用户姓名") + @TableField("name") + private String name; + + @ApiModelProperty("是否内部用户(0否 1汇邦云用户 2企业微信用户)") + @TableField("is_internal") + private Integer isInternal; + + @ApiModelProperty("业务系统订单ID(对接外部系统)") + @TableField("biz_order_id") + private String bizOrderId; + + @ApiModelProperty("订单总金额") + @TableField("total_amount") + private BigDecimal totalAmount; + + @ApiModelProperty("订单状态(1待付款 2已付款 3已发货 4已完成 5已取消)") + @TableField("`status`") + private Integer status; + + @ApiModelProperty("支付状态(1未支付 2已支付 3退款中 4已退款)") + @TableField("pay_status") + private Integer payStatus; + + @ApiModelProperty("支付方式") + @TableField("payment_method") + private String paymentMethod; + + @ApiModelProperty("支付时间") + @TableField("pay_time") + private Date payTime; + + + @Override + public Serializable pkVal() { + return this.orderId; + } + +} diff --git a/src/api/shop/order.ts b/src/api/shop/order.ts new file mode 100644 index 0000000..93f1e57 --- /dev/null +++ b/src/api/shop/order.ts @@ -0,0 +1,37 @@ +import { http } from "@/utils/http"; + +export interface OrderQuery extends BasePageQuery { + orderNumber?: string; + status?: number; + payStatus?: number; + startTime?: string; + endTime?: string; +} + +export interface OrderDTO { + orderId: number; + ucid?: string; + openid?: string; + tradeId?: string; + mobile?: string; + userid?: string; + name?: string; + isInternal?: number; + bizOrderId?: string; + totalAmount: number; + status: number; + payStatus: number; + paymentMethod?: string; + payTime?: string; +} + +export const getOrderListApi = (params?: OrderQuery) => { + return http.request>>("get", "/shop/order/list", { + params: { + ...params, + // 处理时间范围参数格式 + startTime: params?.startTime ? new Date(params.startTime).toISOString() : undefined, + endTime: params?.endTime ? new Date(params.endTime).toISOString() : undefined + } + }); +}; \ No newline at end of file diff --git a/src/views/shop/approval/index.vue b/src/views/shop/approval/index.vue index 27e6371..ee8e77d 100644 --- a/src/views/shop/approval/index.vue +++ b/src/views/shop/approval/index.vue @@ -9,6 +9,10 @@ import Refresh from "@iconify-icons/ep/refresh"; import View from "@iconify-icons/ep/view"; import { ElMessage, ElMessageBox } from "element-plus"; +defineOptions({ + name: "Approval" +}); + const formRef = ref(); const tableRef = ref(); diff --git a/src/views/shop/order/index.vue b/src/views/shop/order/index.vue new file mode 100644 index 0000000..55d55ed --- /dev/null +++ b/src/views/shop/order/index.vue @@ -0,0 +1,158 @@ + + + + + \ No newline at end of file