From b41ea6645d9f4f54378530f6fcb7d3725dd44bf5 Mon Sep 17 00:00:00 2001 From: gyq <875626088@qq.com> Date: Sat, 20 Dec 2025 09:12:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A5=97=E9=A4=90=E6=8E=A8?= =?UTF-8?q?=E5=B9=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/market/ware.js | 143 +++++++++++- src/components/refundDialog/index.vue | 68 ++++++ .../components/addGroupGoods.vue | 8 +- .../group_booking/components/groupOrder.vue | 88 ++++---- .../group_booking/components/groupPage.vue | 6 +- .../marketing_center/group_booking/index.vue | 40 +++- .../components/addGroupGoods.vue | 169 +++++++++++---- .../components/groupOrder.vue | 204 ++++++++++-------- .../components/groupPage.vue | 122 +++++------ .../package_popularize/index.vue | 48 ++++- 10 files changed, 643 insertions(+), 253 deletions(-) create mode 100644 src/components/refundDialog/index.vue diff --git a/src/api/market/ware.js b/src/api/market/ware.js index 7bd7f1e..feb0d6f 100644 --- a/src/api/market/ware.js +++ b/src/api/market/ware.js @@ -157,4 +157,145 @@ export function packageAddEdit(data) { method: data.id ? 'put' : 'post', data, }); -} \ No newline at end of file +} + +/** + * 套餐推广:获取套餐列表 + * @param {*} data + * @returns + */ +export function packageGet(params) { + return request({ + url: `${Market_BaseUrl}/admin/package`, + method: 'get', + params, + }); +} + +/** + * 套餐推广:获取套餐推广开关 + * @param {*} data + * @returns + */ +export function packageSwitchGet() { + return request({ + url: `${Market_BaseUrl}/admin/package/switch`, + method: 'get' + }); +} + +/** + * 套餐推广:修改套餐推广开关 + * @param {*} data + * @returns + */ +export function packageSwitchPut(data) { + return request({ + url: `${Market_BaseUrl}/admin/package/switch`, + method: 'put', + data + }); +} + +/** + * 套餐推广:删除套餐 + * @param {*} data + * @returns + */ +export function packageDel(id) { + return request({ + url: `${Market_BaseUrl}/admin/package/${id}`, + method: 'DELETE' + }); +} + +/** + * 套餐推广:确认删除套餐 + * @param {*} data + * @returns + */ +export function packageSureDel(id) { + return request({ + url: `${Market_BaseUrl}/admin/package/sure/${id}`, + method: 'DELETE' + }); +} + +/** + * 套餐推广:修改套餐推广开关 + * @param {*} data + * @returns + */ +export function packageOnline(data) { + return request({ + url: `${Market_BaseUrl}/admin/package/online`, + method: 'put', + data + }); +} + +/** + * 套餐推广:获取套餐推广订单列表 + * @param {*} data + * @returns + */ +export function packageOrder(params) { + return request({ + url: `${Market_BaseUrl}/admin/package/order`, + method: 'GET', + params + }); +} + +/** + * 套餐推广:订单统计 + * @param {*} data + * @returns + */ +export function packageOrderStat(params) { + return request({ + url: `${Market_BaseUrl}/admin/package/order/stat`, + method: 'GET', + params + }); +} + +/** + * 套餐推广:确认退单 + * @param {*} data + * @returns + */ +export function packageConfirmRefund(data) { + return request({ + url: `${Order_BaseUrl}/admin/ppOrder/confirmRefund`, + method: 'post', + data + }); +} + +/** + * 套餐推广:驳回退单 + * @param {*} data + * @returns + */ +export function packageRejectRefund(data) { + return request({ + url: `${Order_BaseUrl}/admin/ppOrder/rejectRefund`, + method: 'post', + data + }); +} + +/** + * 套餐推广:核销 + * @param {*} data + * @returns + */ +export function packageCheckout(data) { + return request({ + url: `${Order_BaseUrl}/admin/ppOrder/checkout`, + method: 'post', + data + }); +} + diff --git a/src/components/refundDialog/index.vue b/src/components/refundDialog/index.vue new file mode 100644 index 0000000..b4eb5e8 --- /dev/null +++ b/src/components/refundDialog/index.vue @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/marketing_center/group_booking/components/addGroupGoods.vue b/src/views/marketing_center/group_booking/components/addGroupGoods.vue index 3a96409..507dc81 100644 --- a/src/views/marketing_center/group_booking/components/addGroupGoods.vue +++ b/src/views/marketing_center/group_booking/components/addGroupGoods.vue @@ -83,6 +83,7 @@ diff --git a/src/views/marketing_center/package_popularize/components/addGroupGoods.vue b/src/views/marketing_center/package_popularize/components/addGroupGoods.vue index c82c228..520d395 100644 --- a/src/views/marketing_center/package_popularize/components/addGroupGoods.vue +++ b/src/views/marketing_center/package_popularize/components/addGroupGoods.vue @@ -35,6 +35,10 @@ form.originPrice = filterNumberInput(e)" style="width: 300px;"> + + form.price = filterNumberInput(e)" style="width: 300px;"> + @@ -43,9 +47,9 @@ - + @blur="item.num = 1"> 删除 @@ -89,8 +93,8 @@ - - + + @@ -100,7 +104,7 @@ - + @@ -110,11 +114,11 @@ - + - + @@ -125,9 +129,9 @@ - - {{ form.originPrice ? '添加阶梯' : '请填写商品原价' }} + {{ form.price ? '添加阶梯' : '请填写商品价格' }} @@ -136,7 +140,7 @@ form.expireHours = filterNumberInput(e, 1)" style="width: 300px;"> - + @@ -162,8 +166,8 @@ - - stepForm.num = filterNumberInput(e, 1)"> + + stepForm.peopleNum = filterNumberInput(e, 1)"> 人 @@ -201,7 +205,7 @@ const selecProductDialogRef = ref(null) const packageContentItem = ref({ name: '', - count: 1, + num: 1, packageProducts: [] }) @@ -230,13 +234,13 @@ function showGoodsDialogHandle(index) { // 选择的商品 function selectProduceHandle(obj) { - let data = _.cloneDeepWith(packageProductsItem.value) + let data = _.cloneDeep(packageProductsItem.value) data.name = obj.name data.price = obj.price form.value.packageContent[portGoodsIndex.value].packageProducts.push(data) } -const visible = ref(true) +const visible = ref(false) const loading = ref(false) const formRef = ref(null) const formObj = { @@ -250,7 +254,7 @@ const formObj = { price: '', // 售价 packageContent: [], // 套餐内容 useTimes: '', // 可用时段:08:00~21:30 - useWeeks: [], // 可用周期: [周一,周二] + useWeeks: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], // 可用周期: [周一,周二] otherDesc: '', // 其他描述 tieredDiscount: [], // 阶梯优惠 expireHours: '', // 分享期限(小时)不低于1小时,最大72小时 @@ -258,24 +262,24 @@ const formObj = { detailImages: [], // 商品详情图片(多个用逗号分隔) } -const form = ref({ ...formObj }) +const form = ref(_.cloneDeep(formObj)) const addStepIndex = ref(0) const showStepDialog = ref(false) const stepFormRef = ref(null) const stepForm = ref({ - num: '', + peopleNum: '', price: '' }) const stepFormType = ref('add') const stepFormRules = ref({ - num: [ + peopleNum: [ { required: true, validator: (rule, value, callback) => { - if (addStepIndex.value == 1 && +stepForm.value.num <= +form.value.tieredDiscount[0].num) { + if (addStepIndex.value == 1 && +stepForm.value.peopleNum <= +form.value.tieredDiscount[0].peopleNum) { callback(new Error('二阶段价格分享人数不可小于一阶段分享人数')) - } else if (addStepIndex.value == 2 && +stepForm.value.num <= +form.value.tieredDiscount[1].num) { + } else if (addStepIndex.value == 2 && +stepForm.value.peopleNum <= +form.value.tieredDiscount[1].peopleNum) { callback(new Error('三阶段价格分享人数不可小于二阶段分享人数')) } else { callback() @@ -288,17 +292,71 @@ const stepFormRules = ref({ { required: true, validator: (rule, value, callback) => { - if (stepForm.value.price == '') { - return callback(new Error('请输入价格')) + // 1. 空值校验(优先处理) + if (stepForm.value.price.trim() === '') { + return callback(new Error('请输入价格')); } - if (addStepIndex.value == 0 && +stepForm.value.price > +form.value.originPrice) { - callback(new Error(`一阶段价格不可大于商品原价¥${form.value.originPrice}`)) - } else if (addStepIndex.value == 1 && +stepForm.value.price >= +form.value.tieredDiscount[0].price) { - callback(new Error('二阶段价格不可大于等于一阶段价格')) - } else if (addStepIndex.value == 2 && +stepForm.value.price >= +form.value.tieredDiscount[1].price) { - callback(new Error('三阶段价格不可大于等于二阶段价格')) - } else { - callback() + + // 统一转数值(避免字符串比较问题) + const currentPrice = +stepForm.value.price; + const originPrice = +form.value.price; + // 解构阶梯价格(转数值) + const [firstPrice, secondPrice, thirdPrice] = form.value.tieredDiscount.map(item => +item.price); + + // 2. 新增模式(原有逻辑不变) + if (stepFormType.value === 'add') { + if (addStepIndex.value === 0 && currentPrice > originPrice) { + callback(new Error(`一阶段价格不可大于商品售价¥${originPrice}`)); + } else if (addStepIndex.value === 1 && currentPrice >= firstPrice) { + callback(new Error('二阶段价格不可大于等于一阶段价格')); + } else if (addStepIndex.value === 2 && currentPrice >= secondPrice) { + callback(new Error('三阶段价格不可大于等于二阶段价格')); + } else { + callback(); // 校验通过 + } + } + // 3. 编辑模式(新增逻辑:瞻前顾后) + else if (stepFormType.value === 'editor') { + // 编辑第一阶段 + if (addStepIndex.value === 0) { + // 规则:不大于原价 + 不小于第二阶段(若第二阶段存在) + if (currentPrice > originPrice) { + callback(new Error(`一阶段价格不可大于商品售价¥${form.value.originPrice}`)); + } else if (secondPrice && currentPrice <= secondPrice) { // 第二阶段有值时,第一阶段需大于第二阶段 + callback(new Error('一阶段价格不可小于等于二阶段价格')); + } else { + callback(); + } + } + // 编辑第二阶段 + else if (addStepIndex.value === 1) { + // 规则:不小于第一阶段 + 不大于第三阶段(若第三阶段存在) + const errors = []; + if (currentPrice >= firstPrice) { + errors.push('二阶段价格不可大于等于一阶段价格'); + } + if (thirdPrice && currentPrice <= thirdPrice) { // 第三阶段有值时,第二阶段需大于第三阶段 + errors.push('二阶段价格不可小于等于三阶段价格'); + } + if (errors.length > 0) { + callback(new Error(errors.join(';'))); + } else { + callback(); + } + } + // 编辑第三阶段 + else if (addStepIndex.value === 2) { + // 规则:仅校验不大于等于第二阶段(和新增一致) + if (currentPrice >= secondPrice) { + callback(new Error('三阶段价格不可大于等于二阶段价格')); + } else { + callback(); + } + } + } + // 兜底:无匹配模式时校验通过 + else { + callback(); } }, trigger: "blur", @@ -321,13 +379,13 @@ function editorStepFormHandle(index) { showStepDialog.value = true addStepIndex.value = index - stepForm.value.num = form.value.tieredDiscount[index].num + stepForm.value.peopleNum = form.value.tieredDiscount[index].peopleNum stepForm.value.price = form.value.tieredDiscount[index].price } // 关闭dialog后初始化stepForm function stepDialogReset() { - stepForm.value.num = '' + stepForm.value.peopleNum = '' stepForm.value.price = '' stepFormRef.value.resetFields() } @@ -336,10 +394,12 @@ function stepDialogReset() { function stepFormSubmitHandle() { stepFormRef.value.validate((vaild) => { if (vaild) { - if (stepFormType.value = 'add') { + console.log('stepFormType.value', stepFormType.value); + console.log('addStepIndex.value', addStepIndex.value); + if (stepFormType.value == 'add') { form.value.tieredDiscount.push(_.cloneDeep(stepForm.value)) } else { - form.value.tieredDiscount[index] = _.cloneDeep(stepForm.value) + form.value.tieredDiscount[addStepIndex.value] = _.cloneDeep(stepForm.value) } showStepDialog.value = false } @@ -391,6 +451,19 @@ const rules = ref({ trigger: "blur", } ], + price: [ + { + required: true, + validator: (rule, value, callback) => { + if (form.value.price <= 0 || !form.value.price) { + callback(new Error('请输入价格')) + } else { + callback() + } + }, + trigger: "blur", + } + ], packageContent: [ { required: true, @@ -423,6 +496,26 @@ const rules = ref({ trigger: "change", } ], + useWeeks: [ + { + required: true, + message: "请选择可用周期", + trigger: "change", + } + ], + useTimes: [ + { + required: true, + validator: (rule, value, callback) => { + if (form.value.useTimes == '') { + callback(new Error('请选择可用时段')) + } else { + callback() + } + }, + trigger: "change", + } + ], tieredDiscount: [ { required: true, @@ -498,15 +591,17 @@ function submitHandle() { // 重置表单 function resetHandle() { - form.value = { ...formObj } + form.value = _.cloneDeep(formObj) formRef.value.resetFields() + useTimeScope.value = [] } function show(obj) { visible.value = true if (obj && obj.id) { - console.log(obj); form.value = { ...obj } + form.value.useShops = obj.useShops ? obj.useShops.split(',') : [] + useTimeScope.value = obj.useTimes ? obj.useTimes.split('~').map(item => dayjs().format(`YYYY-MM-DD ${item}`)) : [] } } diff --git a/src/views/marketing_center/package_popularize/components/groupOrder.vue b/src/views/marketing_center/package_popularize/components/groupOrder.vue index 23114b5..68c316e 100644 --- a/src/views/marketing_center/package_popularize/components/groupOrder.vue +++ b/src/views/marketing_center/package_popularize/components/groupOrder.vue @@ -25,8 +25,11 @@ - + + + 搜索 @@ -42,7 +45,7 @@ 总订单数 - {{ multiplyAndFormat(infoObj.successAmount || 0) }} + {{ multiplyAndFormat(infoObj.countNum || 0) }} @@ -51,7 +54,7 @@ 已支付金额(元) - {{ multiplyAndFormat(infoObj.pendingAmount || 0) }} + {{ multiplyAndFormat(infoObj.paidAmountTotal || 0) }} @@ -60,7 +63,7 @@ 已退款金额(元) - {{ multiplyAndFormat(infoObj.balanceAmount || 0) }} + {{ multiplyAndFormat(infoObj.refundAmount || 0) }} @@ -68,49 +71,47 @@ - + - - {{ scope.row.wareJson.wareName }} + + {{ scope.row.packageName }} + - {{ scope.row.userName }} / {{ scope.row.userPhone }} + {{ scope.row.nickname }} / {{ scope.row.phone }} - + + - - {{ scope.row.status }} + {{ statusFilter(scope.row).label }} - - - + 审核 - + 退款 - + 核销 @@ -126,57 +127,66 @@ :page-sizes="[10, 20, 50, 100, 500]" background layout="total, sizes, prev, pager, next, jumper" :total="tableData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> + diff --git a/src/views/marketing_center/package_popularize/components/groupPage.vue b/src/views/marketing_center/package_popularize/components/groupPage.vue index af3ad47..94faebe 100644 --- a/src/views/marketing_center/package_popularize/components/groupPage.vue +++ b/src/views/marketing_center/package_popularize/components/groupPage.vue @@ -11,13 +11,8 @@ - - - - + 搜索 @@ -30,19 +25,26 @@ - - - +{{ scope.row.wareImgs.split(',').length }} + + + +{{ scope.row.images.length }} - - - - - + + + + + + + + {{ scope.row.useWeeks.join(',') }} + {{ scope.row.useTimes }} + + + - - (下架后编辑/删除) - - - 编辑 - - - 删除 - - - + 编辑 + 删除 无权操作 @@ -82,10 +75,9 @@ diff --git a/src/views/marketing_center/package_popularize/index.vue b/src/views/marketing_center/package_popularize/index.vue index 92bda17..339da87 100644 --- a/src/views/marketing_center/package_popularize/index.vue +++ b/src/views/marketing_center/package_popularize/index.vue @@ -8,7 +8,7 @@ - + @@ -17,10 +17,11 @@