feat: mall bargain record
							parent
							
								
									8ff0f216a9
								
							
						
					
					
						commit
						e1d04d8a6a
					
				|  | @ -0,0 +1,161 @@ | |||
| import type { VbenFormSchema } from '#/adapter/form'; | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| 
 | ||||
| import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; | ||||
| 
 | ||||
| /** 列表的搜索表单 */ | ||||
| export function useGridFormSchema(): VbenFormSchema[] { | ||||
|   return [ | ||||
|     { | ||||
|       fieldName: 'status', | ||||
|       label: '砍价状态', | ||||
|       component: 'Select', | ||||
|       componentProps: { | ||||
|         placeholder: '请选择砍价状态', | ||||
|         clearable: true, | ||||
|         options: getDictOptions( | ||||
|           DICT_TYPE.PROMOTION_BARGAIN_RECORD_STATUS, | ||||
|           'number', | ||||
|         ), | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       fieldName: 'createTime', | ||||
|       label: '创建时间', | ||||
|       component: 'RangePicker', | ||||
|       componentProps: { | ||||
|         ...getRangePickerDefaultProps(), | ||||
|         clearable: true, | ||||
|       }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
| 
 | ||||
| /** 列表的字段 */ | ||||
| export function useGridColumns(): VxeTableGridOptions['columns'] { | ||||
|   return [ | ||||
|     { | ||||
|       field: 'id', | ||||
|       title: '编号', | ||||
|       minWidth: 50, | ||||
|     }, | ||||
|     { | ||||
|       field: 'avatar', | ||||
|       title: '用户头像', | ||||
|       minWidth: 120, | ||||
|       cellRender: { | ||||
|         name: 'CellImage', | ||||
|         props: { | ||||
|           height: 40, | ||||
|           width: 40, | ||||
|           shape: 'circle', | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       field: 'nickname', | ||||
|       title: '用户昵称', | ||||
|       minWidth: 100, | ||||
|     }, | ||||
|     { | ||||
|       field: 'createTime', | ||||
|       title: '发起时间', | ||||
|       width: 180, | ||||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|     { | ||||
|       field: 'activity.name', | ||||
|       title: '砍价活动', | ||||
|       minWidth: 150, | ||||
|     }, | ||||
|     { | ||||
|       field: 'activity.bargainMinPrice', | ||||
|       title: '最低价', | ||||
|       minWidth: 100, | ||||
|       formatter: 'formatAmount2', | ||||
|     }, | ||||
|     { | ||||
|       field: 'bargainPrice', | ||||
|       title: '当前价', | ||||
|       minWidth: 100, | ||||
|       formatter: 'formatAmount2', | ||||
|     }, | ||||
|     { | ||||
|       field: 'activity.helpMaxCount', | ||||
|       title: '总砍价次数', | ||||
|       minWidth: 100, | ||||
|     }, | ||||
|     { | ||||
|       field: 'helpCount', | ||||
|       title: '剩余砍价次数', | ||||
|       minWidth: 100, | ||||
|     }, | ||||
|     { | ||||
|       field: 'status', | ||||
|       title: '砍价状态', | ||||
|       minWidth: 100, | ||||
|       cellRender: { | ||||
|         name: 'CellDict', | ||||
|         props: { type: DICT_TYPE.PROMOTION_BARGAIN_RECORD_STATUS }, | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       field: 'endTime', | ||||
|       title: '结束时间', | ||||
|       width: 180, | ||||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|     { | ||||
|       field: 'orderId', | ||||
|       title: '订单编号', | ||||
|       minWidth: 100, | ||||
|     }, | ||||
|     { | ||||
|       title: '操作', | ||||
|       width: 100, | ||||
|       fixed: 'right', | ||||
|       slots: { default: 'actions' }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
| 
 | ||||
| /** 助力列表表格列配置 */ | ||||
| export function useHelpGridColumns(): VxeTableGridOptions['columns'] { | ||||
|   return [ | ||||
|     { | ||||
|       field: 'userId', | ||||
|       title: '用户编号', | ||||
|       minWidth: 80, | ||||
|     }, | ||||
|     { | ||||
|       field: 'avatar', | ||||
|       title: '用户头像', | ||||
|       minWidth: 80, | ||||
|       cellRender: { | ||||
|         name: 'CellImage', | ||||
|         props: { | ||||
|           height: 40, | ||||
|           width: 40, | ||||
|           shape: 'circle', | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       field: 'nickname', | ||||
|       title: '用户昵称', | ||||
|       minWidth: 100, | ||||
|     }, | ||||
|     { | ||||
|       field: 'reducePrice', | ||||
|       title: '砍价金额', | ||||
|       minWidth: 100, | ||||
|       formatter: 'formatAmount2', | ||||
|     }, | ||||
|     { | ||||
|       field: 'createTime', | ||||
|       title: '助力时间', | ||||
|       width: 180, | ||||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
|  | @ -1,32 +1,83 @@ | |||
| <script lang="ts" setup> | ||||
| import { DocAlert, Page } from '@vben/common-ui'; | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| import type { MallBargainRecordApi } from '#/api/mall/promotion/bargain/bargainRecord'; | ||||
| 
 | ||||
| import { Button } from 'ant-design-vue'; | ||||
| import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; | ||||
| 
 | ||||
| import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; | ||||
| import { getBargainRecordPage } from '#/api/mall/promotion/bargain/bargainRecord'; | ||||
| 
 | ||||
| import { useGridColumns, useGridFormSchema } from './data'; | ||||
| import HelpListModal from './modules/list.vue'; | ||||
| 
 | ||||
| defineOptions({ name: 'PromotionBargainRecord' }); | ||||
| 
 | ||||
| const [HelpListModalApi, helpListModalApi] = useVbenModal({ | ||||
|   connectedComponent: HelpListModal, | ||||
|   destroyOnClose: true, | ||||
| }); | ||||
| 
 | ||||
| /** 查看助力详情 */ | ||||
| function handleViewHelp(row: MallBargainRecordApi.BargainRecord) { | ||||
|   helpListModalApi.setData({ recordId: row.id }).open(); | ||||
| } | ||||
| 
 | ||||
| const [Grid] = useVbenVxeGrid({ | ||||
|   formOptions: { | ||||
|     schema: useGridFormSchema(), | ||||
|   }, | ||||
|   gridOptions: { | ||||
|     columns: useGridColumns(), | ||||
|     height: 'auto', | ||||
|     keepSource: true, | ||||
|     proxyConfig: { | ||||
|       ajax: { | ||||
|         query: async ({ page }, formValues) => { | ||||
|           return await getBargainRecordPage({ | ||||
|             pageNo: page.currentPage, | ||||
|             pageSize: page.pageSize, | ||||
|             ...formValues, | ||||
|           }); | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|     rowConfig: { | ||||
|       keyField: 'id', | ||||
|       isHover: true, | ||||
|     }, | ||||
|     toolbarConfig: { | ||||
|       refresh: { code: 'query' }, | ||||
|       search: true, | ||||
|     }, | ||||
|   } as VxeTableGridOptions<MallBargainRecordApi.BargainRecord>, | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <Page> | ||||
|   <Page auto-content-height> | ||||
|     <template #doc> | ||||
|       <DocAlert | ||||
|         title="【营销】砍价活动" | ||||
|         url="https://doc.iocoder.cn/mall/promotion-bargain/" | ||||
|       /> | ||||
|     <Button | ||||
|       danger | ||||
|       type="link" | ||||
|       target="_blank" | ||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3" | ||||
|     > | ||||
|       该功能支持 Vue3 + element-plus 版本! | ||||
|     </Button> | ||||
|     <br /> | ||||
|     <Button | ||||
|       type="link" | ||||
|       target="_blank" | ||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/mall/promotion/bargain/record/index" | ||||
|     > | ||||
|       可参考 | ||||
|       https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/mall/promotion/bargain/record/index | ||||
|       代码,pull request 贡献给我们! | ||||
|     </Button> | ||||
|     </template> | ||||
| 
 | ||||
|     <HelpListModalApi /> | ||||
| 
 | ||||
|     <Grid table-title="砍价记录列表"> | ||||
|       <template #actions="{ row }"> | ||||
|         <TableAction | ||||
|           :actions="[ | ||||
|             { | ||||
|               label: '助力', | ||||
|               type: 'link', | ||||
|               icon: ACTION_ICON.VIEW, | ||||
|               auth: ['promotion:bargain-help:query'], | ||||
|               onClick: handleViewHelp.bind(null, row), | ||||
|             }, | ||||
|           ]" | ||||
|         /> | ||||
|       </template> | ||||
|     </Grid> | ||||
|   </Page> | ||||
| </template> | ||||
|  |  | |||
|  | @ -0,0 +1,67 @@ | |||
| <script lang="ts" setup> | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| import type { MallBargainHelpApi } from '#/api/mall/promotion/bargain/bargainHelp'; | ||||
| 
 | ||||
| import { computed, ref } from 'vue'; | ||||
| 
 | ||||
| import { useVbenModal } from '@vben/common-ui'; | ||||
| 
 | ||||
| import { useVbenVxeGrid } from '#/adapter/vxe-table'; | ||||
| import { getBargainHelpPage } from '#/api/mall/promotion/bargain/bargainHelp'; | ||||
| 
 | ||||
| import { useHelpGridColumns } from '../data'; | ||||
| 
 | ||||
| /** 助力列表 */ | ||||
| defineOptions({ name: 'BargainRecordListDialog' }); | ||||
| 
 | ||||
| const recordId = ref<number>(); | ||||
| const getTitle = computed(() => { | ||||
|   return `助力列表 - 记录${recordId.value || ''}`; | ||||
| }); | ||||
| 
 | ||||
| const [Modal, modalApi] = useVbenModal({ | ||||
|   async onOpenChange(isOpen: boolean) { | ||||
|     if (!isOpen) { | ||||
|       recordId.value = undefined; | ||||
|       return; | ||||
|     } | ||||
|     // 获取传入的记录ID | ||||
|     const data = modalApi.getData<{ recordId: number }>(); | ||||
|     if (data?.recordId) { | ||||
|       recordId.value = data.recordId; | ||||
|     } | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| const [Grid] = useVbenVxeGrid({ | ||||
|   gridOptions: { | ||||
|     columns: useHelpGridColumns(), | ||||
|     height: 600, | ||||
|     keepSource: true, | ||||
|     proxyConfig: { | ||||
|       ajax: { | ||||
|         query: async ({ page }) => { | ||||
|           return await getBargainHelpPage({ | ||||
|             pageNo: page.currentPage, | ||||
|             pageSize: page.pageSize, | ||||
|             recordId: recordId.value, | ||||
|           }); | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|     rowConfig: { | ||||
|       keyField: 'id', | ||||
|       isHover: true, | ||||
|     }, | ||||
|     toolbarConfig: { | ||||
|       refresh: { code: 'query' }, | ||||
|     }, | ||||
|   } as VxeTableGridOptions<MallBargainHelpApi.BargainHelp>, | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
|   <Modal class="w-2/5" :title="getTitle"> | ||||
|     <Grid class="mx-4" /> | ||||
|   </Modal> | ||||
| </template> | ||||
|  | @ -10,7 +10,7 @@ import { | |||
| // 格式化【优惠金额/折扣】
 | ||||
| export function discountFormat(row: MallCouponTemplateApi.CouponTemplate) { | ||||
|   if (row.discountType === PromotionDiscountTypeEnum.PRICE.type) { | ||||
|     return `¥${floatToFixed2(row.discountPrice)}`; | ||||
|     return `¥${floatToFixed2(row.discountPrice)}`; | ||||
|   } | ||||
|   if (row.discountType === PromotionDiscountTypeEnum.PERCENT.type) { | ||||
|     return `${row.discountPercent}%`; | ||||
|  | @ -61,5 +61,5 @@ export function remainedCountFormat(row: MallCouponTemplateApi.CouponTemplate) { | |||
| 
 | ||||
| // 格式化【最低消费】
 | ||||
| export function usePriceFormat(row: MallCouponTemplateApi.CouponTemplate) { | ||||
|   return `¥${floatToFixed2(row.usePrice)}`; | ||||
|   return `¥${floatToFixed2(row.usePrice)}`; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 xingyu4j
						xingyu4j