diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index f1ab1016d..70ddf396b 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -59,6 +59,9 @@ const Textarea = defineAsyncComponent(() => const TimePicker = defineAsyncComponent( () => import('ant-design-vue/es/time-picker'), ); +const TimeRangePicker = defineAsyncComponent(() => + import('ant-design-vue/es/time-picker').then((res) => res.TimeRangePicker), +); const TreeSelect = defineAsyncComponent( () => import('ant-design-vue/es/tree-select'), ); @@ -126,6 +129,7 @@ export type ComponentType = | 'Switch' | 'Textarea' | 'TimePicker' + | 'TimeRangePicker' | 'TreeSelect' | 'Upload' | BaseFormComponentType; @@ -195,6 +199,7 @@ async function initComponentAdapter() { Textarea: withDefaultPlaceholder(Textarea, 'input'), RichTextarea, TimePicker, + TimeRangePicker, TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), Upload, FileUpload, diff --git a/apps/web-antd/src/api/mall/product/spu.ts b/apps/web-antd/src/api/mall/product/spu.ts index 3d9a15132..76ca7b55a 100644 --- a/apps/web-antd/src/api/mall/product/spu.ts +++ b/apps/web-antd/src/api/mall/product/spu.ts @@ -113,6 +113,8 @@ export namespace MallSpuApi { createTime?: Date; /** 商品状态 */ status?: number; + /** 浏览量 */ + browseCount?: number; } /** 商品状态更新 */ diff --git a/apps/web-antd/src/api/mall/trade/delivery/pickUpStore/index.ts b/apps/web-antd/src/api/mall/trade/delivery/pickUpStore/index.ts index fe1d9d395..b97f2c3d5 100644 --- a/apps/web-antd/src/api/mall/trade/delivery/pickUpStore/index.ts +++ b/apps/web-antd/src/api/mall/trade/delivery/pickUpStore/index.ts @@ -31,6 +31,8 @@ export namespace MallDeliveryPickUpStoreApi { status: number; /** 绑定用户编号组数 */ verifyUserIds: number[]; + /** 营业时间 用于fieldMappingTime */ + rangeTime: any[]; } /** 绑定自提店员请求 */ diff --git a/apps/web-antd/src/api/pay/app/index.ts b/apps/web-antd/src/api/pay/app/index.ts index d44e5ae2b..53f676742 100644 --- a/apps/web-antd/src/api/pay/app/index.ts +++ b/apps/web-antd/src/api/pay/app/index.ts @@ -16,6 +16,7 @@ export namespace PayAppApi { merchantId: number; merchantName: string; createTime?: Date; + channelCodes: string[]; } /** 更新状态请求 */ diff --git a/apps/web-antd/src/router/routes/modules/mall.ts b/apps/web-antd/src/router/routes/modules/mall.ts index 41e50a1ef..d5d396462 100644 --- a/apps/web-antd/src/router/routes/modules/mall.ts +++ b/apps/web-antd/src/router/routes/modules/mall.ts @@ -1,76 +1,76 @@ -// import type { RouteRecordRaw } from 'vue-router'; +import type { RouteRecordRaw } from 'vue-router'; -// const routes: RouteRecordRaw[] = [ -// { -// path: '/mall/product', -// name: 'ProductCenter', -// meta: { -// title: '商品中心', -// icon: 'lucide:shopping-bag', -// keepAlive: true, -// hideInMenu: true, -// }, -// children: [ -// { -// path: 'spu/add', -// name: 'ProductSpuAdd', -// meta: { -// title: '商品添加', -// activeMenu: '/mall/product/spu', -// }, -// component: () => import('#/views/mall/product/spu/form/index.vue'), -// }, -// { -// path: String.raw`spu/edit/:id(\d+)`, -// name: 'ProductSpuEdit', -// meta: { -// title: '商品编辑', -// activeMenu: '/mall/product/spu', -// }, -// component: () => import('#/views/mall/product/spu/form/index.vue'), -// }, -// { -// path: String.raw`spu/detail/:id(\d+)`, -// name: 'ProductSpuDetail', -// meta: { -// title: '商品详情', -// activeMenu: '/crm/business', -// }, -// component: () => import('#/views/mall/product/spu/form/index.vue'), -// }, -// ], -// }, -// { -// path: '/mall/trade', -// name: 'TradeCenter', -// meta: { -// title: '交易中心', -// icon: 'lucide:shopping-cart', -// keepAlive: true, -// hideInMenu: true, -// }, -// children: [ -// { -// path: String.raw`order/detail/:id(\d+)`, -// name: 'TradeOrderDetail', -// meta: { -// title: '订单详情', -// activeMenu: '/mall/trade/order', -// }, -// component: () => import('#/views/mall/trade/order/detail/index.vue'), -// }, -// { -// path: String.raw`after-sale/detail/:id(\d+)`, -// name: 'TradeAfterSaleDetail', -// meta: { -// title: '退款详情', -// activeMenu: '/mall/trade/after-sale', -// }, -// component: () => -// import('#/views/mall/trade/afterSale/detail/index.vue'), -// }, -// ], -// }, -// ]; +const routes: RouteRecordRaw[] = [ + { + path: '/mall/product', + name: 'ProductCenter', + meta: { + title: '商品中心', + icon: 'lucide:shopping-bag', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: 'spu/add', + name: 'ProductSpuAdd', + meta: { + title: '商品添加', + activeMenu: '/mall/product/spu', + }, + component: () => import('#/views/mall/product/spu/modules/form.vue'), + }, + { + path: String.raw`spu/edit/:id(\d+)`, + name: 'ProductSpuEdit', + meta: { + title: '商品编辑', + activeMenu: '/mall/product/spu', + }, + component: () => import('#/views/mall/product/spu/modules/form.vue'), + }, + { + path: String.raw`spu/detail/:id(\d+)`, + name: 'ProductSpuDetail', + meta: { + title: '商品详情', + activeMenu: '/crm/business', + }, + component: () => import('#/views/mall/product/spu/modules/detail.vue'), + }, + ], + }, + { + path: '/mall/trade', + name: 'TradeCenter', + meta: { + title: '交易中心', + icon: 'lucide:shopping-cart', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: String.raw`order/detail/:id(\d+)`, + name: 'TradeOrderDetail', + meta: { + title: '订单详情', + activeMenu: '/mall/trade/order', + }, + component: () => import('#/views/mall/trade/order/modules/detail.vue'), + }, + { + path: String.raw`after-sale/detail/:id(\d+)`, + name: 'TradeAfterSaleDetail', + meta: { + title: '退款详情', + activeMenu: '/mall/trade/after-sale', + }, + component: () => + import('#/views/mall/trade/afterSale/modules/detail.vue'), + }, + ], + }, +]; -// export default routes; +export default routes; diff --git a/apps/web-antd/src/views/mall/product/category/index.vue b/apps/web-antd/src/views/mall/product/category/index.vue index ba3356b0a..9fa3f35a1 100644 --- a/apps/web-antd/src/views/mall/product/category/index.vue +++ b/apps/web-antd/src/views/mall/product/category/index.vue @@ -43,13 +43,12 @@ function handleEdit(row: MallCategoryApi.Category) { /** 查看商品操作 */ const router = useRouter(); // 路由 -const handleViewSpu = (id: number) => { - // TODO @xingyu:貌似跳转不到详情; +function handleViewSpu(id: number) { router.push({ name: 'ProductSpu', query: { categoryId: id }, }); -}; +} /** 删除分类 */ async function handleDelete(row: MallCategoryApi.Category) { diff --git a/apps/web-antd/src/views/mall/product/spu/index.vue b/apps/web-antd/src/views/mall/product/spu/index.vue index 58fe4aaf9..4dd9e442f 100644 --- a/apps/web-antd/src/views/mall/product/spu/index.vue +++ b/apps/web-antd/src/views/mall/product/spu/index.vue @@ -269,7 +269,7 @@ onMounted(async () => { - {{ treeToString(categoryList, row.categoryId as string) }} + {{ treeToString(categoryList, row.categoryId!) }} {{ row.name }} @@ -291,7 +291,7 @@ onMounted(async () => { {{ fenToYuan(row.costPrice as number) }} 元 - {{ row.browseCount as number }} + {{ row.browseCount }} {{ row.virtualSalesCount }} @@ -320,7 +320,7 @@ onMounted(async () => { danger: true, icon: ACTION_ICON.DELETE, auth: ['product:spu:delete'], - ifShow: () => row.type === 4, + ifShow: () => tabType === 4, popConfirm: { title: $t('ui.actionMessage.deleteConfirm', [row.name]), confirm: handleDelete.bind(null, row), @@ -331,7 +331,6 @@ onMounted(async () => { type: 'link', icon: ACTION_ICON.EDIT, auth: ['product:spu:update'], - ifShow: () => row.type === 4, onClick: handleStatus02Change.bind( null, row, @@ -343,7 +342,6 @@ onMounted(async () => { type: 'link', icon: ACTION_ICON.EDIT, auth: ['product:spu:update'], - ifShow: () => row.type !== 4, onClick: handleStatus02Change.bind( null, row, diff --git a/apps/web-antd/src/views/mall/product/spu/modules/detail.vue b/apps/web-antd/src/views/mall/product/spu/modules/detail.vue index 9d3b5a06e..93326a3b4 100644 --- a/apps/web-antd/src/views/mall/product/spu/modules/detail.vue +++ b/apps/web-antd/src/views/mall/product/spu/modules/detail.vue @@ -1,6 +1,6 @@ diff --git a/apps/web-antd/src/views/mall/product/spu/modules/form.vue b/apps/web-antd/src/views/mall/product/spu/modules/form.vue index e4fc61189..f89d618ca 100644 --- a/apps/web-antd/src/views/mall/product/spu/modules/form.vue +++ b/apps/web-antd/src/views/mall/product/spu/modules/form.vue @@ -1,6 +1,6 @@ diff --git a/apps/web-antd/src/views/mall/trade/afterSale/index.vue b/apps/web-antd/src/views/mall/trade/afterSale/index.vue index a9ccaf58d..c5c92af7f 100644 --- a/apps/web-antd/src/views/mall/trade/afterSale/index.vue +++ b/apps/web-antd/src/views/mall/trade/afterSale/index.vue @@ -31,7 +31,6 @@ function openAfterSaleDetail(row: MallAfterSaleApi.AfterSale) { push({ name: 'TradeAfterSaleDetail', params: { id: row.id } }); } -// TODO @xingyu:缺详情页 /** 查看订单详情 */ function openOrderDetail(row: MallAfterSaleApi.AfterSale) { push({ name: 'TradeOrderDetail', params: { id: row.id } }); diff --git a/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue b/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue new file mode 100644 index 000000000..93326a3b4 --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue index f6c14a52e..c9dec9c62 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue @@ -7,14 +7,12 @@ import type { MallBrokerageUserApi } from '#/api/mall/trade/brokerage/user'; import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { BrokerageRecordBizTypeEnum } from '@vben/constants'; +import { BrokerageRecordBizTypeEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { fenToYuan } from '@vben/utils'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getBrokerageRecordPage } from '#/api/mall/trade/brokerage/record'; -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - import { getRangePickerDefaultProps } from '#/utils'; /** 推广订单列表 */ @@ -52,16 +50,13 @@ function useFormSchema(): VbenFormSchema[] { { fieldName: 'sourceUserLevel', label: '用户类型', - component: 'RadioGroup', - // TODO @xingyu:这里会折行 + component: 'Select', componentProps: { options: [ { label: '全部', value: 0 }, { label: '一级推广人', value: 1 }, { label: '二级推广人', value: 2 }, ], - buttonStyle: 'solid', - optionType: 'button', }, defaultValue: 0, }, diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue index f855d51a0..c353d177b 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue @@ -41,16 +41,13 @@ function useFormSchema(): VbenFormSchema[] { { fieldName: 'level', label: '用户类型', - component: 'RadioGroup', - // TODO @xingyu:这里会折行 + component: 'Select', componentProps: { options: [ { label: '全部', value: undefined }, { label: '一级推广人', value: '1' }, { label: '二级推广人', value: '2' }, ], - buttonStyle: 'solid', - optionType: 'button', }, }, { diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts index ee422abd0..3f4b86015 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts @@ -58,18 +58,22 @@ export function useFormSchema(): VbenFormSchema[] { label: '详细地址', rules: 'required', }, - // TODO @xingyu:时间类型不对 { - component: 'TimePicker', - fieldName: 'openingTime', - label: '营业开始时间', - rules: 'required', - }, - { - component: 'TimePicker', - fieldName: 'closingTime', - label: '营业结束时间', + component: 'TimeRangePicker', + fieldName: 'rangeTime', + label: '营业时间', rules: 'required', + componentProps: { + format: 'HH:mm', + minuteStep: 15, + disabledTime: () => { + return { + disabledHours: () => { + return [0, 1, 2, 3, 4, 5, 6, 7]; + }, + }; + }, + }, }, { component: 'Input', diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue index bb227ddb1..4b2a6e79d 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue @@ -18,7 +18,6 @@ import { useBindFormSchema } from '../data'; const emit = defineEmits(['success']); const formData = ref(); -// TODO @xingyu:店员是多选; const getTitle = computed(() => { return formData.value?.id ? $t('ui.actionTitle.edit', ['绑定店员']) diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue index 5f674ec68..99636a2fb 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue @@ -6,6 +6,7 @@ import { computed, ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { message } from 'ant-design-vue'; +import dayjs from 'dayjs'; import { useVbenForm } from '#/adapter/form'; import { @@ -33,6 +34,7 @@ const [Form, formApi] = useVbenForm({ formItemClass: 'col-span-2', labelWidth: 120, }, + fieldMappingTime: [['rangeTime', ['openingTime', 'closingTime'], 'HH:mm']], layout: 'horizontal', schema: useFormSchema(), showDefaultActions: false, @@ -73,6 +75,10 @@ const [Modal, modalApi] = useVbenModal({ modalApi.lock(); try { formData.value = await getDeliveryPickUpStore(data.id); + formData.value.rangeTime = [ + dayjs(formData.value.openingTime, 'HH:mm'), + dayjs(formData.value.closingTime, 'HH:mm'), + ]; // 设置到 values await formApi.setValues(formData.value); } finally { diff --git a/apps/web-antd/src/views/mall/trade/order/index.vue b/apps/web-antd/src/views/mall/trade/order/index.vue index 20106e908..eefa6c0ec 100644 --- a/apps/web-antd/src/views/mall/trade/order/index.vue +++ b/apps/web-antd/src/views/mall/trade/order/index.vue @@ -33,7 +33,6 @@ function onRefresh() { gridApi.query(); } const { push } = useRouter(); -// TODO xingyu:貌似详情,还点不进去哇? /** 详情 */ function handleDetail(row: MallOrderApi.Order) { push({ name: 'TradeOrderDetail', params: { id: row.id } }); diff --git a/apps/web-antd/src/views/mall/trade/order/modules/detail.vue b/apps/web-antd/src/views/mall/trade/order/modules/detail.vue new file mode 100644 index 000000000..93326a3b4 --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/modules/detail.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/web-antd/src/views/member/user/data.ts b/apps/web-antd/src/views/member/user/data.ts index 30ce8a248..a245cd6b4 100644 --- a/apps/web-antd/src/views/member/user/data.ts +++ b/apps/web-antd/src/views/member/user/data.ts @@ -263,7 +263,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { } /** 修改用户等级 */ -export function useLeavelFormSchema(): VbenFormSchema[] { +export function useLevelFormSchema(): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/member/user/index.vue b/apps/web-antd/src/views/member/user/index.vue index 0a592f4ff..854160f21 100644 --- a/apps/web-antd/src/views/member/user/index.vue +++ b/apps/web-antd/src/views/member/user/index.vue @@ -14,7 +14,7 @@ import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; import BalanceForm from './modules/balance-form.vue'; import Form from './modules/form.vue'; -import LeavelForm from './modules/leavel-form.vue'; +import LevelForm from './modules/level-form.vue'; import PointForm from './modules/point-form.vue'; const router = useRouter(); @@ -34,9 +34,8 @@ const [BalanceFormModal, balanceFormModalApi] = useVbenModal({ destroyOnClose: true, }); -// TODO @xingyu:拼写错误; -const [LeavelFormModal, leavelFormModalApi] = useVbenModal({ - connectedComponent: LeavelForm, +const [LevelFormModal, levelFormModalApi] = useVbenModal({ + connectedComponent: LevelForm, destroyOnClose: true, }); @@ -64,7 +63,7 @@ function handleEdit(row: MemberUserApi.User) { /** 修改会员等级 */ function handleUpdateLevel(row: MemberUserApi.User) { - leavelFormModalApi.setData(row).open(); + levelFormModalApi.setData(row).open(); } /** 修改会员积分 */ @@ -138,7 +137,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ - +