@@ -261,13 +258,14 @@ const eachCube = (callback: (x: number, y: number, cube: Cube) => void) => {
.cube {
box-sizing: border-box;
- color: var(--el-text-color-secondary);
+ color: var(--ant-color-text-secondary);
text-align: center;
+ line-height: 1;
cursor: pointer;
- border: 1px solid var(--el-border-color);
+ border: 1px solid var(--ant-color-border);
&.active {
- background: var(--el-color-primary-light-9);
+ background: color-mix(in srgb, var(--ant-color-primary) 10%, transparent);
}
}
@@ -277,12 +275,12 @@ const eachCube = (callback: (x: number, y: number, cube: Cube) => void) => {
display: flex;
align-items: center;
justify-content: center;
- color: var(--el-color-primary);
+ color: var(--ant-color-primary);
cursor: pointer;
border-spacing: 0;
border-collapse: collapse;
- background: var(--el-color-primary-light-8);
- border: 1px solid var(--el-color-primary);
+ background: color-mix(in srgb, var(--ant-color-primary) 20%, transparent);
+ border: 1px solid var(--ant-color-primary);
.btn-delete {
position: absolute;
@@ -294,7 +292,7 @@ const eachCube = (callback: (x: number, y: number, cube: Cube) => void) => {
justify-content: center;
width: 16px;
height: 16px;
- background-color: #fff;
+ background-color: var(--ant-color-bg-container);
border-radius: 50%;
}
}
diff --git a/apps/web-antd/src/views/mall/promotion/components/magic-cube-editor/util.ts b/apps/web-antd/src/views/mall/promotion/components/magic-cube-editor/util.ts
index 1ee8fb5a4..6e3eb7cd2 100644
--- a/apps/web-antd/src/views/mall/promotion/components/magic-cube-editor/util.ts
+++ b/apps/web-antd/src/views/mall/promotion/components/magic-cube-editor/util.ts
@@ -1,51 +1,47 @@
-// 坐标点
+/** 坐标点 */
export interface Point {
x: number;
y: number;
}
-// 矩形
+/** 矩形 */
export interface Rect {
- // 左上角 X 轴坐标
- left: number;
- // 左上角 Y 轴坐标
- top: number;
- // 右下角 X 轴坐标
- right: number;
- // 右下角 Y 轴坐标
- bottom: number;
- // 矩形宽度
- width: number;
- // 矩形高度
- height: number;
+ left: number; // 左上角 X 轴坐标
+ top: number; // 左上角 Y 轴坐标
+ right: number; // 右下角 X 轴坐标
+ bottom: number; // 右下角 Y 轴坐标
+ width: number; // 矩形宽度
+ height: number; // 矩形高度
}
/**
* 判断两个矩形是否重叠
+ *
* @param a 矩形 A
* @param b 矩形 B
*/
-export const isOverlap = (a: Rect, b: Rect): boolean => {
+export function isOverlap(a: Rect, b: Rect): boolean {
return (
a.left < b.left + b.width &&
a.left + a.width > b.left &&
a.top < b.top + b.height &&
a.height + a.top > b.top
);
-};
+}
+
/**
* 检查坐标点是否在矩形内
* @param hotArea 矩形
* @param point 坐标
*/
-export const isContains = (hotArea: Rect, point: Point): boolean => {
+export function isContains(hotArea: Rect, point: Point): boolean {
return (
point.x >= hotArea.left &&
point.x < hotArea.right &&
point.y >= hotArea.top &&
point.y < hotArea.bottom
);
-};
+}
/**
* 在两个坐标点中间,创建一个矩形
@@ -59,14 +55,17 @@ export const isContains = (hotArea: Rect, point: Point): boolean => {
* @param a 坐标点一
* @param b 坐标点二
*/
-export const createRect = (a: Point, b: Point): Rect => {
+export function createRect(a: Point, b: Point): Rect {
// 计算矩形的范围
- const [left, left2] = [a.x, b.x].sort();
- const [top, top2] = [a.y, b.y].sort();
+ let [left, left2] = [a.x, b.x].sort();
+ left = left ?? 0;
+ left2 = left2 ?? 0;
+ let [top, top2] = [a.y, b.y].sort();
+ top = top ?? 0;
+ top2 = top2 ?? 0;
const right = left2 + 1;
const bottom = top2 + 1;
const height = bottom - top;
const width = right - left;
-
return { left, right, top, bottom, height, width };
-};
+}
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/components/index.ts b/apps/web-antd/src/views/mall/promotion/coupon/components/index.ts
index 00a6c3f32..24cb4e274 100644
--- a/apps/web-antd/src/views/mall/promotion/coupon/components/index.ts
+++ b/apps/web-antd/src/views/mall/promotion/coupon/components/index.ts
@@ -1,2 +1,2 @@
-export * from './data';
+export { default as CouponSelect } from './select.vue';
export { default as CouponSendForm } from './send-form.vue';
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/components/select-data.ts b/apps/web-antd/src/views/mall/promotion/coupon/components/select-data.ts
new file mode 100644
index 000000000..e8c0ad53e
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/coupon/components/select-data.ts
@@ -0,0 +1,119 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { DICT_TYPE } from '@vben/constants';
+import { getDictOptions } from '@vben/hooks';
+
+import {
+ discountFormat,
+ remainedCountFormat,
+ takeLimitCountFormat,
+ validityTypeFormat,
+} from '../formatter';
+
+/** 优惠券选择的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'name',
+ label: '优惠券名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入优惠券名称',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'discountType',
+ label: '优惠类型',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.PROMOTION_DISCOUNT_TYPE, 'number'),
+ placeholder: '请选择优惠类型',
+ allowClear: true,
+ },
+ },
+ ];
+}
+
+/** 优惠券选择的表格列 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 55 },
+ {
+ field: 'name',
+ title: '优惠券名称',
+ minWidth: 140,
+ },
+ {
+ field: 'productScope',
+ title: '类型',
+ minWidth: 80,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.PROMOTION_PRODUCT_SCOPE },
+ },
+ },
+ {
+ field: 'discountType',
+ title: '优惠类型',
+ minWidth: 100,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.PROMOTION_DISCOUNT_TYPE },
+ },
+ },
+ {
+ field: 'discountPrice',
+ title: '优惠力度',
+ minWidth: 100,
+ formatter: ({ row }) => discountFormat(row),
+ },
+ {
+ field: 'takeType',
+ title: '领取方式',
+ minWidth: 100,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.PROMOTION_COUPON_TAKE_TYPE },
+ },
+ },
+ {
+ field: 'validityType',
+ title: '使用时间',
+ minWidth: 185,
+ align: 'center',
+ formatter: ({ row }) => validityTypeFormat(row),
+ },
+ {
+ field: 'totalCount',
+ title: '发放数量',
+ minWidth: 100,
+ align: 'center',
+ },
+ {
+ field: 'remainedCount',
+ title: '剩余数量',
+ minWidth: 100,
+ align: 'center',
+ formatter: ({ row }) => remainedCountFormat(row),
+ },
+ {
+ field: 'takeLimitCount',
+ title: '领取上限',
+ minWidth: 100,
+ align: 'center',
+ formatter: ({ row }) => takeLimitCountFormat(row),
+ },
+ {
+ field: 'status',
+ title: '状态',
+ minWidth: 80,
+ align: 'center',
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.COMMON_STATUS },
+ },
+ },
+ ];
+}
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/components/select.vue b/apps/web-antd/src/views/mall/promotion/coupon/components/select.vue
new file mode 100644
index 000000000..073206aff
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/coupon/components/select.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/components/data.ts b/apps/web-antd/src/views/mall/promotion/coupon/components/send-form-data.ts
similarity index 100%
rename from apps/web-antd/src/views/mall/promotion/coupon/components/data.ts
rename to apps/web-antd/src/views/mall/promotion/coupon/components/send-form-data.ts
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/components/send-form.vue b/apps/web-antd/src/views/mall/promotion/coupon/components/send-form.vue
index 442217efe..f858cc75f 100644
--- a/apps/web-antd/src/views/mall/promotion/coupon/components/send-form.vue
+++ b/apps/web-antd/src/views/mall/promotion/coupon/components/send-form.vue
@@ -11,7 +11,7 @@ import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { sendCoupon } from '#/api/mall/promotion/coupon/coupon';
import { getCouponTemplatePage } from '#/api/mall/promotion/coupon/couponTemplate';
-import { useFormSchema, useGridColumns } from './data';
+import { useFormSchema, useGridColumns } from './send-form-data';
/** 发送优惠券 */
async function handleSendCoupon(row: MallCouponTemplateApi.CouponTemplate) {
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/data.ts b/apps/web-antd/src/views/mall/promotion/coupon/data.ts
index 3d104b51c..6f30c5597 100644
--- a/apps/web-antd/src/views/mall/promotion/coupon/data.ts
+++ b/apps/web-antd/src/views/mall/promotion/coupon/data.ts
@@ -101,6 +101,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
formatter: 'formatDateTime',
},
{
+ field: 'actions',
title: '操作',
width: 100,
fixed: 'right',
diff --git a/apps/web-antd/src/views/mall/promotion/coupon/index.vue b/apps/web-antd/src/views/mall/promotion/coupon/index.vue
index 110dd01ba..5a442b1de 100644
--- a/apps/web-antd/src/views/mall/promotion/coupon/index.vue
+++ b/apps/web-antd/src/views/mall/promotion/coupon/index.vue
@@ -7,7 +7,6 @@ import { ref } from 'vue';
import { DocAlert, Page } from '@vben/common-ui';
import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
-import { $t } from '@vben/locales';
import { message, TabPane, Tabs } from 'ant-design-vue';
@@ -32,7 +31,7 @@ function handleRefresh() {
/** 删除优惠券 */
async function handleDelete(row: MallCouponApi.Coupon) {
const hideLoading = message.loading({
- content: $t('ui.actionMessage.deleting', [row.name]),
+ content: '回收中...',
duration: 0,
});
try {
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png
new file mode 100644
index 000000000..32939004d
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png
new file mode 100644
index 000000000..02cf5c498
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png
new file mode 100644
index 000000000..25e642234
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png
new file mode 100644
index 000000000..d16260afd
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png
new file mode 100644
index 000000000..a3b18002e
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png
new file mode 100644
index 000000000..54c4b3f71
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png
new file mode 100644
index 000000000..5f272e3e4
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png
new file mode 100644
index 000000000..8649727ec
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png
new file mode 100644
index 000000000..aa85a2947
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png
new file mode 100644
index 000000000..26206bc05
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png
new file mode 100644
index 000000000..2e7f00eba
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png
new file mode 100644
index 000000000..9c8455165
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png
new file mode 100644
index 000000000..84e9726f1
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png
new file mode 100644
index 000000000..0772de262
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png
new file mode 100644
index 000000000..6e18dac3e
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png
new file mode 100644
index 000000000..be9761658
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png
new file mode 100644
index 000000000..20c57338c
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png
new file mode 100644
index 000000000..30ec329d2
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png
new file mode 100644
index 000000000..35bbb89f3
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png
new file mode 100644
index 000000000..a0bc838b1
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png
new file mode 100644
index 000000000..2e52b6bee
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png
new file mode 100644
index 000000000..65b5de8f0
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png
new file mode 100644
index 000000000..bc0e76c4c
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png
new file mode 100644
index 000000000..7aa65845f
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png
new file mode 100644
index 000000000..0e984d68d
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png
new file mode 100644
index 000000000..9ba6bab32
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png
new file mode 100644
index 000000000..29c9f5ddb
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png
new file mode 100644
index 000000000..d3b582c69
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png
new file mode 100644
index 000000000..cef489ea4
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png
new file mode 100644
index 000000000..1ddc388a6
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png
new file mode 100644
index 000000000..c5c6feebb
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png
new file mode 100644
index 000000000..e6ddc6f4d
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png
new file mode 100644
index 000000000..3e2fba656
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png
new file mode 100644
index 000000000..dbf820404
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png
new file mode 100644
index 000000000..a4206eefb
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png
new file mode 100644
index 000000000..6f315b98e
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png
new file mode 100644
index 000000000..19b9fb94a
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png
new file mode 100644
index 000000000..2f9a06d63
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg b/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg
new file mode 100644
index 000000000..8811d4957
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png
new file mode 100644
index 000000000..7dce41dc9
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png
new file mode 100644
index 000000000..97d0f0a67
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png
new file mode 100644
index 000000000..eb922dd7a
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png
new file mode 100644
index 000000000..29fbc0e19
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png
new file mode 100644
index 000000000..88a169d4f
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png
new file mode 100644
index 000000000..a0f572a11
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png
new file mode 100644
index 000000000..43dfd7090
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png
new file mode 100644
index 000000000..4c0da7095
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png
new file mode 100644
index 000000000..56e5d0218
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png
new file mode 100644
index 000000000..593ef5e68
Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png differ
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue
new file mode 100644
index 000000000..16d8f349a
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue
@@ -0,0 +1,296 @@
+
+
+
+
+
+ 会话记录({{ kefuStore.getConversationList.length }})
+
+
+
+
+
+
+ {{ item.userNickname || 'null' }}
+
+ {{ lastMessageTimeMap.get(item.id) ?? '计算中' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue
new file mode 100644
index 000000000..5b1c1d39e
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(item.createTime) }}
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 有新消息
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts
new file mode 100644
index 000000000..90ddd0df4
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts
@@ -0,0 +1,6 @@
+export { default as KeFuConversationList } from './KeFuConversationList.vue';
+export { default as KeFuMessageList } from './KeFuMessageList.vue';
+export { default as MemberInfo } from './member/MemberInfo.vue';
+
+// TODO @jawe:components =》modules;在 vben 里,modules 是给自己用的,把一个大 vue 拆成 n 个小 vue;components 是给别的模块使用的;
+// TODO @jawe:1)组件名小写,类似 conversation-list.vue;2)KeFu 开头可以去掉,因为已经是当前模块下,不用重复拼写;
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue
new file mode 100644
index 000000000..1a5fb9d0d
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 基本信息
+
+
+
+
+
+ 账户信息
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue
new file mode 100644
index 000000000..a6c7f1a2f
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue
new file mode 100644
index 000000000..f8b733310
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue
new file mode 100644
index 000000000..ceaefc0e3
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue
new file mode 100644
index 000000000..c41885b83
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+
+
+
+ 共 {{ getMessageContent?.productCount }} 件商品,总金额:
+
+
+ ¥{{ fenToYuan(getMessageContent?.payPrice) }}
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue
new file mode 100644
index 000000000..78ccf86c1
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
{{ title }}
+
+ 库存: {{ stock || 0 }}
+ 销量: {{ salesCount || 0 }}
+
+
+ ¥{{ fenToYuan(price) }}
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue
new file mode 100644
index 000000000..b50bc11dd
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue
new file mode 100644
index 000000000..3912f2e74
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
![]()
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts
new file mode 100644
index 000000000..266a6cf02
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts
@@ -0,0 +1,17 @@
+/** 客服消息类型枚举类 */
+export const KeFuMessageContentTypeEnum = {
+ TEXT: 1, // 文本消息
+ IMAGE: 2, // 图片消息
+ VOICE: 3, // 语音消息
+ VIDEO: 4, // 视频消息
+ SYSTEM: 5, // 系统消息
+ // ========== 商城特殊消息 ==========
+ PRODUCT: 10, // 商品消息
+ ORDER: 11, // 订单消息"
+};
+
+/** Promotion 的 WebSocket 消息类型枚举类 */
+export const WebSocketMessageTypeConstants = {
+ KEFU_MESSAGE_TYPE: 'kefu_message_type', // 客服消息类型
+ KEFU_MESSAGE_ADMIN_READ: 'kefu_message_read_status_change', // 客服消息管理员已读
+};
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts
new file mode 100644
index 000000000..69b948d01
--- /dev/null
+++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts
@@ -0,0 +1,126 @@
+import { onMounted, ref } from 'vue';
+
+import { isEmpty } from '@vben/utils';
+
+const emojiList = [
+ { name: '[笑掉牙]', file: 'xiaodiaoya.png' },
+ { name: '[可爱]', file: 'keai.png' },
+ { name: '[冷酷]', file: 'lengku.png' },
+ { name: '[闭嘴]', file: 'bizui.png' },
+ { name: '[生气]', file: 'shengqi.png' },
+ { name: '[惊恐]', file: 'jingkong.png' },
+ { name: '[瞌睡]', file: 'keshui.png' },
+ { name: '[大笑]', file: 'daxiao.png' },
+ { name: '[爱心]', file: 'aixin.png' },
+ { name: '[坏笑]', file: 'huaixiao.png' },
+ { name: '[飞吻]', file: 'feiwen.png' },
+ { name: '[疑问]', file: 'yiwen.png' },
+ { name: '[开心]', file: 'kaixin.png' },
+ { name: '[发呆]', file: 'fadai.png' },
+ { name: '[流泪]', file: 'liulei.png' },
+ { name: '[汗颜]', file: 'hanyan.png' },
+ { name: '[惊悚]', file: 'jingshu.png' },
+ { name: '[困~]', file: 'kun.png' },
+ { name: '[心碎]', file: 'xinsui.png' },
+ { name: '[天使]', file: 'tianshi.png' },
+ { name: '[晕]', file: 'yun.png' },
+ { name: '[啊]', file: 'a.png' },
+ { name: '[愤怒]', file: 'fennu.png' },
+ { name: '[睡着]', file: 'shuizhuo.png' },
+ { name: '[面无表情]', file: 'mianwubiaoqing.png' },
+ { name: '[难过]', file: 'nanguo.png' },
+ { name: '[犯困]', file: 'fankun.png' },
+ { name: '[好吃]', file: 'haochi.png' },
+ { name: '[呕吐]', file: 'outu.png' },
+ { name: '[龇牙]', file: 'ziya.png' },
+ { name: '[懵比]', file: 'mengbi.png' },
+ { name: '[白眼]', file: 'baiyan.png' },
+ { name: '[饿死]', file: 'esi.png' },
+ { name: '[凶]', file: 'xiong.png' },
+ { name: '[感冒]', file: 'ganmao.png' },
+ { name: '[流汗]', file: 'liuhan.png' },
+ { name: '[笑哭]', file: 'xiaoku.png' },
+ { name: '[流口水]', file: 'liukoushui.png' },
+ { name: '[尴尬]', file: 'ganga.png' },
+ { name: '[惊讶]', file: 'jingya.png' },
+ { name: '[大惊]', file: 'dajing.png' },
+ { name: '[不好意思]', file: 'buhaoyisi.png' },
+ { name: '[大闹]', file: 'danao.png' },
+ { name: '[不可思议]', file: 'bukesiyi.png' },
+ { name: '[爱你]', file: 'aini.png' },
+ { name: '[红心]', file: 'hongxin.png' },
+ { name: '[点赞]', file: 'dianzan.png' },
+ { name: '[恶魔]', file: 'emo.png' },
+];
+
+export interface Emoji {
+ name: string;
+ url: string;
+}
+
+export const useEmoji = () => {
+ const emojiPathList = ref
([]);
+
+ /** 加载本地图片 */
+ const initStaticEmoji = async () => {
+ const pathList = import.meta.glob('../../asserts/*.{png,jpg,jpeg,svg}');
+ for (const path in pathList) {
+ const imageModule: any = await pathList[path]?.();
+ emojiPathList.value.push({ path, src: imageModule.default });
+ }
+ };
+
+ /** 初始化 */
+ onMounted(async () => {
+ if (isEmpty(emojiPathList.value)) {
+ await initStaticEmoji();
+ }
+ });
+
+ /**
+ * 将文本中的表情替换成图片
+ *
+ * @return 替换后的文本
+ * @param content 消息内容
+ */
+ const replaceEmoji = (content: string) => {
+ let newData = content;
+ if (typeof newData !== 'object') {
+ const reg = /\[(.+?)\]/g; // [] 中括号
+ const zhEmojiName = newData.match(reg);
+ if (zhEmojiName) {
+ zhEmojiName.forEach((item) => {
+ const emojiFile = getEmojiFileByName(item);
+ newData = newData.replace(
+ item,
+ `
`,
+ );
+ });
+ }
+ }
+ return newData;
+ };
+
+ /** 获得所有表情 */
+ function getEmojiList(): Emoji[] {
+ return emojiList.map((item) => ({
+ url: getEmojiFileByName(item.name),
+ name: item.name,
+ })) as Emoji[];
+ }
+
+ function getEmojiFileByName(name: string) {
+ for (const emoji of emojiList) {
+ if (emoji.name === name) {
+ const emojiPath = emojiPathList.value.find(
+ (item: { path: string; src: string }) =>
+ item.path.includes(emoji.file),
+ );
+ return emojiPath ? emojiPath.src : undefined;
+ }
+ }
+ return false;
+ }
+
+ return { replaceEmoji, getEmojiList };
+};
diff --git a/apps/web-antd/src/views/mall/promotion/kefu/index.vue b/apps/web-antd/src/views/mall/promotion/kefu/index.vue
index 59a7d2179..c45defe83 100644
--- a/apps/web-antd/src/views/mall/promotion/kefu/index.vue
+++ b/apps/web-antd/src/views/mall/promotion/kefu/index.vue
@@ -1,28 +1,136 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/components/index.ts b/apps/web-antd/src/views/mall/promotion/rewardActivity/components/index.ts
deleted file mode 100644
index 93b72c326..000000000
--- a/apps/web-antd/src/views/mall/promotion/rewardActivity/components/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { default as RewardRuleCouponSelect } from './reward-rule-coupon-select.vue';
-export { default as RewardRule } from './reward-rule.vue';
diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts
index 238a23961..46e6e9cae 100644
--- a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts
+++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts
@@ -1,10 +1,15 @@
import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
-import { DICT_TYPE } from '@vben/constants';
+import {
+ DICT_TYPE,
+ PromotionConditionTypeEnum,
+ PromotionProductScopeEnum,
+} from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { $t } from '@vben/locales';
+import { z } from '#/adapter/form';
import { getRangePickerDefaultProps } from '#/utils';
/** 列表的搜索表单 */
@@ -98,8 +103,8 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
export function useFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
+ component: 'Input',
dependencies: {
triggerFields: [''],
show: () => false,
@@ -109,23 +114,36 @@ export function useFormSchema(): VbenFormSchema[] {
fieldName: 'name',
label: '活动名称',
component: 'Input',
+ rules: 'required',
componentProps: {
placeholder: '请输入活动名称',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Textarea',
+ componentProps: {
+ placeholder: '请输入备注',
+ rows: 4,
+ allowClear: true,
},
- rules: 'required',
},
{
fieldName: 'startAndEndTime',
label: '活动时间',
component: 'RangePicker',
+ rules: 'required',
componentProps: {
showTime: true,
format: 'YYYY-MM-DD HH:mm:ss',
- placeholder: [$t('common.startTimeText'), $t('common.endTimeText')],
+ placeholder: [
+ $t('utils.rangePicker.beginTime'),
+ $t('utils.rangePicker.endTime'),
+ ],
},
- rules: 'required',
},
- // TODO @puhui999:增加一个 defaultValue
{
fieldName: 'conditionType',
label: '条件类型',
@@ -135,8 +153,7 @@ export function useFormSchema(): VbenFormSchema[] {
buttonStyle: 'solid',
optionType: 'button',
},
- defaultValue: PromotionConditionTypeEnum.PRICE.type,
- rules: 'required',
+ rules: z.number().default(PromotionConditionTypeEnum.PRICE.type),
},
{
fieldName: 'productScope',
@@ -147,16 +164,28 @@ export function useFormSchema(): VbenFormSchema[] {
buttonStyle: 'solid',
optionType: 'button',
},
+ rules: z.number().default(PromotionProductScopeEnum.ALL.scope),
+ },
+ // TODO @puhui999:选择完删除后,自动就退出了 modal;
+ {
+ fieldName: 'productSpuIds',
+ label: '选择商品',
+ component: 'Input',
+ dependencies: {
+ triggerFields: ['productScope'],
+ show: (values) => {
+ return values.productScope === PromotionProductScopeEnum.SPU.scope;
+ },
+ },
rules: 'required',
},
+ // TODO @puhui999:这里还有个分类;
{
- fieldName: 'remark',
- label: '备注',
- component: 'Textarea',
- componentProps: {
- placeholder: '请输入备注',
- rows: 4,
- },
+ fieldName: 'rules',
+ label: '优惠设置',
+ component: 'Input',
+ formItemClass: 'items-start',
+ // TODO @puhui999:这里可能要加个 rules: 'required',
},
];
}
diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/index.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/index.vue
index c0e384190..77d038161 100644
--- a/apps/web-antd/src/views/mall/promotion/rewardActivity/index.vue
+++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/index.vue
@@ -3,6 +3,7 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MallRewardActivityApi } from '#/api/mall/promotion/reward/rewardActivity';
import { Page, useVbenModal } from '@vben/common-ui';
+import { CommonStatusEnum } from '@vben/constants';
import { message } from 'ant-design-vue';
@@ -41,13 +42,14 @@ function handleEdit(row: MallRewardActivityApi.RewardActivity) {
/** 关闭满减送活动 */
async function handleClose(row: MallRewardActivityApi.RewardActivity) {
+ // TODO @puhui999:这个国际化,需要加下哈;closing、closeSuccess;
const hideLoading = message.loading({
- content: '正在关闭中...',
+ content: $t('ui.actionMessage.closing', [row.name]),
duration: 0,
});
try {
await closeRewardActivity(row.id!);
- message.success('关闭成功');
+ message.success($t('ui.actionMessage.closeSuccess', [row.name]));
handleRefresh();
} finally {
hideLoading();
@@ -96,7 +98,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: true,
search: true,
},
- } as VxeTableGridOptions,
+ } as VxeTableGridOptions,
});
@@ -111,19 +113,20 @@ const [Grid, gridApi] = useVbenVxeGrid({
label: $t('ui.actionTitle.create', ['活动']),
type: 'primary',
icon: ACTION_ICON.ADD,
+ auth: ['promotion:reward-activity:create'],
onClick: handleCreate,
},
]"
/>
-
-import type { VbenFormProps } from '#/adapter/form';
import type { MallRewardActivityApi } from '#/api/mall/promotion/reward/rewardActivity';
import { computed, nextTick, ref } from 'vue';
@@ -11,7 +10,7 @@ import {
} from '@vben/constants';
import { convertToInteger, formatToFraction } from '@vben/utils';
-import { Alert, FormItem, message } from 'ant-design-vue';
+import { message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import {
@@ -20,37 +19,41 @@ import {
updateRewardActivity,
} from '#/api/mall/promotion/reward/rewardActivity';
import { $t } from '#/locales';
-// TODO @puhui999:有问题
-// import { SpuAndSkuList } from '#/views/mall/promotion/components';
+import { SpuShowcase } from '#/views/mall/product/spu/components';
-import RewardRule from '../components/reward-rule.vue';
import { useFormSchema } from '../data';
+import RewardRule from './reward-rule.vue';
const emit = defineEmits(['success']);
-// TODO @puhui999:代码风格,和别的 form 保持一致;
+
const formData = ref({
+ // TODO @puhui999:这里的 conditionType、productScope 是不是可以删除呀。因为 data.ts 已经搞了 defaultValue;
conditionType: PromotionConditionTypeEnum.PRICE.type,
productScope: PromotionProductScopeEnum.ALL.scope,
rules: [],
});
+
const getTitle = computed(() => {
return formData.value?.id
? $t('ui.actionTitle.edit', ['满减送'])
: $t('ui.actionTitle.create', ['满减送']);
});
+const rewardRuleRef = ref>();
+
const [Form, formApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
- } as VbenFormProps['commonConfig'],
+ labelWidth: 100,
+ },
+ layout: 'horizontal',
schema: useFormSchema(),
showDefaultActions: false,
});
-const rewardRuleRef = ref>();
-
+// TODO @芋艿:这里需要在简化下;
const [Modal, modalApi] = useVbenModal({
async onConfirm() {
const { valid } = await formApi.validate();
@@ -58,30 +61,26 @@ const [Modal, modalApi] = useVbenModal({
return;
}
modalApi.lock();
+ // 提交表单
try {
const data = await formApi.getValues();
- // 设置活动规则优惠券
rewardRuleRef.value?.setRuleCoupon();
- // 时间段转换
if (data.startAndEndTime && Array.isArray(data.startAndEndTime)) {
data.startTime = data.startAndEndTime[0];
data.endTime = data.startAndEndTime[1];
delete data.startAndEndTime;
}
- // 规则元转分
data.rules?.forEach((item: any) => {
item.discountPrice = convertToInteger(item.discountPrice || 0);
if (data.conditionType === PromotionConditionTypeEnum.PRICE.type) {
item.limit = convertToInteger(item.limit || 0);
}
});
- // 设置商品范围
setProductScopeValues(data);
- // 提交表单
await (formData.value?.id
- ? updateRewardActivity(data)
- : createRewardActivity(data));
+ ? updateRewardActivity(data as MallRewardActivityApi.RewardActivity)
+ : createRewardActivity(data as MallRewardActivityApi.RewardActivity));
// 关闭并提示
await modalApi.close();
emit('success');
@@ -107,21 +106,17 @@ const [Modal, modalApi] = useVbenModal({
modalApi.lock();
try {
const result = await getReward(data.id);
- // 转区段时间
- result.startAndEndTime = [result.startTime, result.endTime];
- // 规则分转元
+ result.startAndEndTime = [result.startTime, result.endTime] as any[];
result.rules?.forEach((item: any) => {
item.discountPrice = formatToFraction(item.discountPrice || 0);
if (result.conditionType === PromotionConditionTypeEnum.PRICE.type) {
item.limit = formatToFraction(item.limit || 0);
}
});
-
formData.value = result;
// 设置到 values
await formApi.setValues(result);
- // 获得商品范围
await getProductScope();
} finally {
modalApi.unlock();
@@ -129,8 +124,6 @@ const [Modal, modalApi] = useVbenModal({
},
});
-/** 获得商品范围 */
-// TODO @puhui999:可以参考下优惠劵模版的做法;可见 /Users/yunai/Java/yudao-ui-admin-vben-v5/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts 的 295 行;
async function getProductScope() {
switch (formData.value.productScope) {
case PromotionProductScopeEnum.CATEGORY.scope: {
@@ -140,15 +133,12 @@ async function getProductScope() {
Array.isArray(productCategoryIds) &&
productCategoryIds.length === 1
) {
- // 单选时使用数组不能反显
productCategoryIds = productCategoryIds[0];
}
- // 设置品类编号
formData.value.productCategoryIds = productCategoryIds;
break;
}
case PromotionProductScopeEnum.SPU.scope: {
- // 设置商品编号
formData.value.productSpuIds = formData.value.productScopeValues;
break;
}
@@ -158,7 +148,7 @@ async function getProductScope() {
}
}
-/** 设置商品范围 */
+// TODO @puhui999:/Users/yunai/Java/yudao-ui-admin-vben-v5/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts 可以类似 /Users/yunai/Java/yudao-ui-admin-vben-v5/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts 的 productScopeValues(微信交流)
function setProductScopeValues(data: any) {
switch (formData.value.productScope) {
case PromotionProductScopeEnum.CATEGORY.scope: {
@@ -179,33 +169,17 @@ function setProductScopeValues(data: any) {
-
-
-
-
+
+
diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/components/reward-rule-coupon-select.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue
similarity index 57%
rename from apps/web-antd/src/views/mall/promotion/rewardActivity/components/reward-rule-coupon-select.vue
rename to apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue
index e2844fc11..b91b63398 100644
--- a/apps/web-antd/src/views/mall/promotion/rewardActivity/components/reward-rule-coupon-select.vue
+++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue
@@ -1,16 +1,19 @@
-
+
-
-
活动层级{{ index + 1 }}
+
+
+ 活动层级 {{ index + 1 }}
-