feat(商品管理): 添加自动审批功能

在商品管理模块中新增自动审批功能,包括在商品表单、编辑模态框和列表中添加自动审批开关及相关逻辑。同时更新了商品DTO接口以支持自动审批字段。
This commit is contained in:
dzq 2025-04-21 11:40:59 +08:00
parent e4ee388f0f
commit bad63e65d7
7 changed files with 43 additions and 162 deletions

View File

@ -5,27 +5,48 @@ export interface GoodsQuery extends BasePageQuery {
categoryId?: number;
status?: number;
goodsId?: number;
autoApproval?: number;
}
/** 商品DTO */
export interface GoodsDTO {
/** 商品ID */
goodsId?: number;
/** 商品名称 */
goodsName: string;
/** 商品分类ID */
categoryId: number;
/** 商品价格 */
price: number;
/** 库存数量 */
stock: number;
/** 商品状态0下架 1上架 */
status: number;
/** 自动审批开关0关闭 1开启 */
autoApproval: number;
/** 商品封面图 */
coverImg: string;
/** 商品详情(富文本) */
goodsDetail: string;
/** 创建人ID */
creatorId?: number;
/** 创建时间 */
createTime?: Date;
/** 更新人ID */
updaterId?: number;
/** 更新时间 */
updateTime?: Date;
/** 备注信息 */
remark?: string;
/** 删除标志0存在 1删除 */
deleted?: number;
/** 所属货柜名称 */
cabinetName?: string;
/** 货柜单元格编号 */
cellNo?: number;
/** 单元格编号(字符串形式) */
cellNoStr?: string;
/** 总库存量(含所有仓库) */
totalStock?: number;
}
@ -36,6 +57,7 @@ export interface GoodsRequest {
price: number;
stock: number;
status: number;
autoApproval: number;
coverImg?: string;
goodsDetail: string;
remark?: string;

View File

@ -1,34 +0,0 @@
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<T> extends AbstractPageQuery<T> {
private String orderNumber;
private Integer status;
private Integer payStatus;
private Date startTime;
private Date endTime;
@Override
public QueryWrapper<T> addQueryCondition() {
QueryWrapper<T> 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;
}
}

View File

@ -1,31 +0,0 @@
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<PageDTO<ShopOrderEntity>> list(SearchShopOrderQuery<ShopOrderEntity> query) {
PageDTO<ShopOrderEntity> page = orderApplicationService.getOrderList(query);
return ResponseDTO.ok(page);
}
}

View File

@ -1,94 +0,0 @@
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;
/**
* <p>
* 商品订单表
* </p>
*
* @author valarchie
* @since 2025-03-10
*/
@Getter
@Setter
@TableName("shop_order")
@ApiModel(value = "ShopOrderEntity对象", description = "商品订单表")
public class ShopOrderEntity extends BaseEntity<ShopOrderEntity> {
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;
}
}

View File

@ -29,6 +29,7 @@ const formData = reactive<GoodsDTO>({
price: 0,
stock: 0,
status: 1,
autoApproval: 0,
categoryId: 0,
goodsDetail: "",
coverImg: ""
@ -154,6 +155,10 @@ watch(
</el-select>
</el-form-item>
<el-form-item label="自动审批" prop="autoApproval">
<el-switch v-model="formData.autoApproval" :active-value="1" :inactive-value="0" active-text="启用"
inactive-text="关闭" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio :label="1">上架</el-radio>

View File

@ -2,7 +2,7 @@
import { ref, reactive, onMounted, watch } from "vue";
import { ElMessage, FormRules } from "element-plus";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { addGoodsApi } from "@/api/shop/goods";
import { addGoodsApi, GoodsDTO } from "@/api/shop/goods";
import { CategoryDTO, getCategoryAllApi } from "@/api/shop/category";
import Confirm from "@iconify-icons/ep/check";
import Upload from "@iconify-icons/ep/upload";
@ -18,11 +18,12 @@ const props = defineProps({
const emit = defineEmits(["update:visible", "refresh"]);
const formRef = ref();
const formData = reactive({
const formData = reactive<GoodsDTO>({
goodsName: "",
price: 0,
stock: 0,
status: 1,
autoApproval: 0,
categoryId: 0,
goodsDetail: "",
coverImg: ""
@ -123,6 +124,11 @@ const beforeAvatarUpload = (rawFile) => {
</el-select>
</el-form-item>
<el-form-item label="自动审批" prop="autoApproval">
<el-switch v-model="formData.autoApproval" :active-value="1" :inactive-value="0" active-text="启用"
inactive-text="关闭" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio :label="1">上架</el-radio>

View File

@ -38,7 +38,7 @@ const pagination = ref({
//
const loading = ref(false);
const dataList = ref([]);
const dataList = ref<GoodsDTO[]>([]);
const multipleSelection = ref<number[]>([]);
const editVisible = ref(false);
const configVisible = ref(false);
@ -181,6 +181,13 @@ const handleEdit = (row: GoodsDTO) => {
</el-tag>
</template>
</el-table-column>
<el-table-column label="自动审批" prop="autoApproval" width="120">
<template #default="{ row }">
<el-tag :type="row.autoApproval === 1 ? 'success' : 'info'">
{{ row.autoApproval === 1 ? '启用' : '关闭' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="柜口" prop="cellNo" width="120">
<template #default="{ row }">
{{ !row.cellNoStr ? '未配置' : row.cabinetName + ' 格口' + row.cellNoStr }}