فهرست منبع

手动添加蛋糕券

fanzherong_v 2 روز پیش
والد
کامیت
3e29e2f6b2

+ 4 - 0
snowy-admin-web/src/api/biz/bizCouponRecordApi.js

@@ -24,5 +24,9 @@ export default {
 	// 获取优惠券记录详情
 	bizCouponRecordDetail(data) {
 		return request('detail', data, 'get')
+	},
+	// 手动赠送蛋糕券
+	giftCoupon(data){
+		return request('giftCoupon',data)
 	}
 }

+ 3 - 0
snowy-admin-web/src/api/biz/couponConfigApi.js

@@ -24,5 +24,8 @@ export default {
 	// 获取蛋糕券配置详情
 	couponConfigDetail(data) {
 		return request('detail', data, 'get')
+	},
+	getMemberList(data){
+		return request('getMemberList',data,'get')
 	}
 }

+ 153 - 0
snowy-admin-web/src/views/biz/member/coupon.vue

@@ -0,0 +1,153 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '赠送蛋糕券' : '赠送蛋糕券'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol">
+			<a-form-item label="会员姓名:" name="name">
+				<a-input v-model:value="formData.name" placeholder="请输入会员姓名" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="糕点:" name="accountBalance">
+				<a-input v-model:value="formData.accountBalance" placeholder="请输入账户余额" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="积分:" name="voucherBalance">
+				<a-input v-model:value="formData.voucherBalance" placeholder="请输入代金券余额" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="选择蛋糕券:" name="couponId">
+				<a-select v-model:value="formData.couponId" placeholder="请选择蛋糕券"
+						  :options="couponIdList" @change="onChangeCouponId"
+				> </a-select>
+			</a-form-item>
+
+			<a-form-item label="蛋糕券:" name="couponAmount" v-show = "couponFlag">
+				<a-input-number v-model:value="formData.couponAmount" style="width: 100%" :min="0" :max="99999999"
+								:precision="2" placeholder="请输入蛋糕券" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="蛋糕券类型:" name="couponType" v-show = "couponFlag">
+				<a-radio-group button-style="solid" v-model:value="formData.couponType" disabled>
+					<a-radio-button value="1">
+						寸
+					</a-radio-button>
+					<a-radio-button value="2">
+						元
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="蛋糕券数量:" name="couponNum" v-show = "couponFlag">
+				<a-input-number v-model:value="formData.couponNum" style="width: 100%" :min="0" :max="99999999"
+								:precision="0" placeholder="请输入蛋糕券数量" allow-clear disabled/>
+			</a-form-item>
+
+
+
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">确认</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="consumptionRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import consumptionRecordApi from '@/api/biz/consumptionRecordApi'
+	import { Modal } from 'ant-design-vue'
+	import { createVNode } from 'vue'
+	import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
+	import couponConfigApi from "@/api/biz/couponConfigApi";
+	import bizCouponRecordApi from "@/api/biz/bizCouponRecordApi";
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const couponIdList = ref()
+	const couponFlag = ref(false)
+
+	const labelCol = ref({ span: 5 })
+	const wrapperCol = ref({ span: 18 })
+
+	const chongzhiFlag = ref(false)
+	const tuikuanFlag = ref(false)
+	const qitaFlag = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.userId = formData.value.id
+			chongzhiFlag.value = true
+			qitaFlag.value = true
+			tuikuanFlag.value = false
+		}
+
+		couponConfigApi.getMemberList().then((res)=>{
+			couponIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.couponAmount + (item.couponType=='1'?'寸':'元') + "*" + item.couponNum
+				}
+			})
+		})
+	}
+
+	const onChangeCouponId = (value) => {
+		console.log("value:"+value)
+		couponConfigApi.couponConfigDetail({id:value}).then((res)=>{
+			formData.value.couponAmount = res.couponAmount
+			formData.value.couponType = res.couponType
+			formData.value.couponNum = res.couponNum
+			couponFlag.value = true
+		})
+	}
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+		couponFlag.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		name: [required('请输入消费者姓名')],
+		accountBalance:  [required('请输入账户余额')],
+		voucherBalance:  [required('请输入代金券余额')],
+		couponId:  [required('选择蛋糕券')],
+	}
+	// 验证并提交数据
+	//title: '确定要为'+formData.value.name+(formData.value.consumptionOperate=='1'?'赠送':'扣减')+(formData.value.consumptionType=='1'?'代金券':'余额')+formData.value.consumptionMoney+'元吗?',
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizCouponRecordApi
+					.giftCoupon(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+
+
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 6 - 1
snowy-admin-web/src/views/biz/member/index.vue

@@ -74,6 +74,8 @@
 					<a @click="formRef.onOpen(record)" v-if="hasPerm('bizUserEdit') && record.userStatus == 'ENABLE'">余额调整</a>
 					<a-divider type="vertical" v-if="hasPerm('bizUserConsumption') && record.userStatus == 'ENABLE'"/>
 					<a @click="consumptionRef.onOpen(record)" v-if="hasPerm('bizUserConsumption') && record.userStatus == 'ENABLE'">消费结算</a>
+					<a-divider type="vertical" v-if="hasPerm('giftCoupon') && record.userStatus == 'ENABLE'"/>
+					<a @click="couponRef.onOpen(record)" v-if="hasPerm('giftCoupon') && record.userStatus == 'ENABLE'">赠送蛋糕券</a>
 <!--					<a-divider type="vertical" v-if="hasPerm('disableRecord') && record.userStatus == 'DISABLED'"/>-->
 					<a @click="disableRef.onOpen(record)" v-if="hasPerm('disableRecord') && record.userStatus == 'DISABLED'">冻结记录</a>
 				</template>
@@ -85,6 +87,7 @@
 	<AddUserRef ref="addUserRef" @successful="tableRef.refresh()" />
 	<ImpExp ref="ImpExpRef" @successful="tableRef.refresh()" />
 	<DisableRef ref="disableRef" @successful="tableRef.refresh()" />
+	<CouponRef ref="couponRef" @successful="tableRef.refresh()" />
 </template>
 <script setup name="bizUser">
 	import tool from '@/utils/tool'
@@ -94,12 +97,14 @@
 	import AddUserRef from './addUser.vue'
 	import ImpExp from './impExp.vue'
 	import DisableRef from './disable.vue'
+	import CouponRef from './coupon.vue'
 
 	const consumptionRef = ref()
 	const loading = ref(false)
 	const addUserRef = ref()
 	const ImpExpRef = ref()
 	const disableRef = ref()
+	const couponRef = ref()
 
 	const columns = [
 		{
@@ -158,7 +163,7 @@
 		title: '操作',
 		dataIndex: 'action',
 		align: 'center',
-		width: 150
+		width: 200
 	})
 
 	const statusData = tool.dictList('COMMON_STATUS')

+ 12 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponconfig/controller/CouponConfigController.java

@@ -128,4 +128,16 @@ public class CouponConfigController {
     public CommonResult<List<CouponConfig>> getList(CouponConfigPageParam couponConfigPageParam) {
         return CommonResult.data(couponConfigService.getList(couponConfigPageParam));
     }
+
+    /**
+     * 获取蛋糕券配置列表
+     *
+     * @author fanzherong
+     * @date  2025/04/14 10:32
+     */
+    @Operation(summary = "获取蛋糕券配置列表")
+    @GetMapping("/biz/couponconfig/getMemberList")
+    public CommonResult<List<CouponConfig>> getMemberList(CouponConfigPageParam couponConfigPageParam) {
+        return CommonResult.data(couponConfigService.getMemberList(couponConfigPageParam));
+    }
 }

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponconfig/service/CouponConfigService.java

@@ -84,4 +84,9 @@ public interface CouponConfigService extends IService<CouponConfig> {
      * @return
      */
     List<CouponConfig> getList(CouponConfigPageParam couponConfigPageParam);
+
+    /**
+     * 获取蛋糕券列表
+     */
+    List<CouponConfig> getMemberList(CouponConfigPageParam couponConfigPageParam);
 }

+ 14 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponconfig/service/impl/CouponConfigServiceImpl.java

@@ -19,6 +19,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
@@ -31,6 +32,7 @@ import vip.xiaonuo.biz.modular.couponconfig.param.CouponConfigEditParam;
 import vip.xiaonuo.biz.modular.couponconfig.param.CouponConfigIdParam;
 import vip.xiaonuo.biz.modular.couponconfig.param.CouponConfigPageParam;
 import vip.xiaonuo.biz.modular.couponconfig.service.CouponConfigService;
+import vip.xiaonuo.dev.api.DevConfigApi;
 
 import java.util.List;
 
@@ -43,6 +45,9 @@ import java.util.List;
 @Service
 public class CouponConfigServiceImpl extends ServiceImpl<CouponConfigMapper, CouponConfig> implements CouponConfigService {
 
+    @Resource
+    private DevConfigApi devConfigApi;
+
     @Override
     public Page<CouponConfig> page(CouponConfigPageParam couponConfigPageParam) {
         QueryWrapper<CouponConfig> queryWrapper = new QueryWrapper<CouponConfig>().checkSqlInjection();
@@ -94,4 +99,13 @@ public class CouponConfigServiceImpl extends ServiceImpl<CouponConfigMapper, Cou
                 eq(CouponConfig::getRechargePlanId,couponConfigPageParam.getRechargePlanId()));
         return couponConfigList;
     }
+
+    @Override
+    public List<CouponConfig> getMemberList(CouponConfigPageParam couponConfigPageParam) {
+        //充值方案id
+        String planId = devConfigApi.getValueByKey("SNOWY_GIFT_COUPON");
+        List<CouponConfig> couponConfigList = this.list(new QueryWrapper<CouponConfig>().lambda().
+                eq(CouponConfig::getRechargePlanId,planId));
+        return couponConfigList;
+    }
 }

+ 13 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/controller/BizCouponRecordController.java

@@ -154,4 +154,17 @@ public class BizCouponRecordController {
         bizCouponRecordService.destroy(bizCouponRecordEditParam);
         return CommonResult.ok();
     }
+
+    /**
+     * 手动赠送蛋糕券
+     * @param bizCouponRecordEditParam
+     * @return
+     */
+    @Operation(summary = "手动赠送蛋糕券")
+    @CommonLog("手动赠送蛋糕券")
+    @PostMapping("/biz/couponrecord/giftCoupon")
+    public CommonResult<String> giftCoupon(@RequestBody @Valid BizCouponRecordEditParam bizCouponRecordEditParam) {
+        bizCouponRecordService.giftCoupon(bizCouponRecordEditParam);
+        return CommonResult.ok();
+    }
 }

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordEditParam.java

@@ -76,4 +76,6 @@ public class BizCouponRecordEditParam {
     @Schema(description = "核销门店")
     private String orgId;
 
+    /**蛋糕券配置id*/
+    private String couponId;
 }

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/service/BizCouponRecordService.java

@@ -93,4 +93,6 @@ public interface BizCouponRecordService extends IService<BizCouponRecord> {
 
     /**优惠券核销*/
     void destroy(BizCouponRecordEditParam bizCouponRecordEditParam);
+
+    void giftCoupon(BizCouponRecordEditParam bizCouponRecordEditParam);
 }

+ 67 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/service/impl/BizCouponRecordServiceImpl.java

@@ -14,11 +14,17 @@ package vip.xiaonuo.biz.modular.couponrecord.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.wechat.pay.java.service.cashcoupons.model.Coupon;
 import jakarta.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
@@ -28,6 +34,8 @@ import vip.xiaonuo.biz.modular.couponconfig.entity.CouponConfig;
 import vip.xiaonuo.biz.modular.couponconfig.service.CouponConfigService;
 import vip.xiaonuo.biz.modular.rechargerecord.entity.BizRechargeRecord;
 import vip.xiaonuo.biz.modular.rechargerecord.service.BizRechargeRecordService;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.service.BizUserService;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
@@ -38,8 +46,11 @@ import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordEditParam;
 import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordIdParam;
 import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordPageParam;
 import vip.xiaonuo.biz.modular.couponrecord.service.BizCouponRecordService;
+import vip.xiaonuo.common.util.CommonCouponGeneratorUtil;
 import vip.xiaonuo.common.util.CommonCryptogramUtil;
+import vip.xiaonuo.dev.api.DevConfigApi;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -57,6 +68,15 @@ public class BizCouponRecordServiceImpl extends ServiceImpl<BizCouponRecordMappe
     @Resource
     private CouponConfigService couponConfigService;
 
+    @Resource
+    private DevConfigApi devConfigApi;
+
+    @Resource
+    private BizCouponRecordService bizCouponRecordService;
+
+    @Resource
+    private BizUserService bizUserService;
+
     @Override
     public Page<BizCouponRecord> page(BizCouponRecordPageParam bizCouponRecordPageParam) {
         QueryWrapper<BizCouponRecord> queryWrapper = new QueryWrapper<BizCouponRecord>().checkSqlInjection();
@@ -219,4 +239,51 @@ public class BizCouponRecordServiceImpl extends ServiceImpl<BizCouponRecordMappe
         bizCouponRecord.setOrgId(StpLoginUserUtil.getLoginUser().getOrgId());
         this.updateById(bizCouponRecord);
     }
+
+    @Transactional
+    @Override
+    public void giftCoupon(BizCouponRecordEditParam bizCouponRecordEditParam) {
+        //管理员手动赠送蛋糕券
+        //当前传参id是会员id
+        CouponConfig couponConfig = couponConfigService.queryEntity(bizCouponRecordEditParam.getCouponId());
+        //添加充值记录
+        String planId = devConfigApi.getValueByKey("SNOWY_GIFT_COUPON");
+        BizRechargeRecord bizRechargeRecord = new BizRechargeRecord();
+        bizRechargeRecord.setUserId(bizCouponRecordEditParam.getId());
+        bizRechargeRecord.setRechargePlanId(planId);
+        bizRechargeRecord.setPlanAccountBalance(new BigDecimal(0));
+        if(ObjectUtil.isNotNull(couponConfig)){
+            bizRechargeRecord.setRechargePlanDescribe("手动赠送蛋糕券"+couponConfig.getCouponAmount()+(couponConfig.getCouponType()=="1"?"寸":"元")+
+                    couponConfig.getCouponNum()+"个");
+        }
+        bizRechargeRecord.setRechargeAmount(new BigDecimal(0));
+        bizRechargeRecord.setRechargeTime(new Date());
+        bizRechargeRecord.setCouponNum(couponConfig.getCouponNum());
+        bizRechargeRecord.setCouponAmount(couponConfig.getCouponAmount());
+        // 本系统订单号
+        String orderNumber = "BBT" + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_MS_PATTERN) + RandomUtil.randomNumbers(3);
+        bizRechargeRecord.setOrderNo(orderNumber);
+        bizRechargeRecord.setIsPay("1");
+        BizUser bizUser = bizUserService.getById(bizCouponRecordEditParam.getId());
+        if(ObjectUtil.isNotNull(bizUser)){
+            bizRechargeRecord.setOldAccountBalance(bizUser.getAccountBalance());
+            bizRechargeRecord.setOldVoucherBalance(bizUser.getVoucherBalance());
+            bizRechargeRecord.setNewAccountBalance(bizUser.getAccountBalance());
+            bizRechargeRecord.setNewVoucherBalance(bizUser.getVoucherBalance());
+        }
+        bizRechargeRecordService.save(bizRechargeRecord);
+
+        //添加蛋糕券记录
+        BizCouponRecord bizCouponRecord = new BizCouponRecord();
+        DateTime date = DateUtil.date();
+        bizCouponRecord.setCouponNo(CommonCouponGeneratorUtil.generateCouponCode());
+        bizCouponRecord.setTime(date);
+        bizCouponRecord.setStartTime(date);
+        bizCouponRecord.setEndTime(DateUtil.offset(date, DateField.YEAR,1));
+        bizCouponRecord.setRechargePlanId(bizRechargeRecord.getRechargePlanId());
+        bizCouponRecord.setRechargeRecordId(bizRechargeRecord.getId());
+        bizCouponRecord.setCouponId(couponConfig.getId());
+        bizCouponRecordService.save(bizCouponRecord);
+
+    }
 }