Browse Source

充值方案优化

fanzherong_v 2 months ago
parent
commit
310b882021
29 changed files with 1102 additions and 29 deletions
  1. 28 0
      snowy-admin-web/src/api/biz/bizActivateApi.js
  2. 2 1
      snowy-admin-web/src/components/HomeCard/BizSlideshowCard/index.vue
  3. 1 0
      snowy-admin-web/src/layout/index.vue
  4. 82 0
      snowy-admin-web/src/views/biz/bizactivate/form.vue
  5. 151 0
      snowy-admin-web/src/views/biz/bizactivate/index.vue
  6. 6 0
      snowy-admin-web/src/views/biz/couponrecord/index.vue
  7. 49 10
      snowy-admin-web/src/views/biz/rechargeplanconfig/form.vue
  8. 19 1
      snowy-admin-web/src/views/biz/rechargeplanconfig/index.vue
  9. 2 1
      snowy-admin-web/src/views/dev/slideshow/index.vue
  10. 13 0
      snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java
  11. 123 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/controller/BizActivateController.java
  12. 64 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/entity/BizActivate.java
  13. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/enums/BizActivateEnum.java
  14. 29 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/mapper/BizActivateMapper.java
  15. 18 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/mapper/mapping/BizActivateMapper.xml
  16. 50 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateAddParam.java
  17. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateEditParam.java
  18. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateIdParam.java
  19. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivatePageParam.java
  20. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/service/BizActivateService.java
  21. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/service/impl/BizActivateServiceImpl.java
  22. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/entity/BizRechargePlanConfig.java
  23. 2 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/mapper/mapping/BizRechargePlanConfigMapper.xml
  24. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/param/BizRechargePlanConfigAddParam.java
  25. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/param/BizRechargePlanConfigEditParam.java
  26. 7 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/service/impl/BizRechargePlanConfigServiceImpl.java
  27. 10 3
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/service/impl/BizRechargeRecordServiceImpl.java
  28. 74 12
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/wx/WxPayNotifyController.java
  29. 1 1
      snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/impl/DevFileServiceImpl.java

+ 28 - 0
snowy-admin-web/src/api/biz/bizActivateApi.js

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizactivate/` + url, ...arg)
+
+/**
+ * 用户充值待激活记录Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+export default {
+	// 获取用户充值待激活记录分页
+	bizActivatePage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交用户充值待激活记录表单 edit为true时为编辑,默认为新增
+	bizActivateSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除用户充值待激活记录
+	bizActivateDelete(data) {
+		return request('delete', data)
+	},
+	// 获取用户充值待激活记录详情
+	bizActivateDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 2 - 1
snowy-admin-web/src/components/HomeCard/BizSlideshowCard/index.vue

@@ -12,7 +12,7 @@
 			<img
 				v-for="item in slideshowList"
 				:key="item.id"
-				:src="item.image"
+				:src="sysConfig.API_URL+item.image"
 				class="carousel-images"
 				@click="leaveForOpen(item.pathDetails)"
 			/>
@@ -23,6 +23,7 @@
 
 <script setup name="carousel">
 	import bizIndexApi from '@/api/biz/bizIndexApi'
+	import sysConfig from "@/config";
 	import { Empty } from 'ant-design-vue'
 	import { isEmpty, cloneDeep } from 'lodash-es'
 	import router from '@/router'

+ 1 - 0
snowy-admin-web/src/layout/index.vue

@@ -276,6 +276,7 @@
 				let localVersion = getLocalHash()
 				// 线上
 				let onlineVersion = await checkHash()
+				console.log('localVersion:',localVersion,",onlineVersion:",onlineVersion)
 				// 如果不一样,提示更新
 				if (localVersion !== onlineVersion) {
 					if (document.querySelector('.notification-update-version')) {

+ 82 - 0
snowy-admin-web/src/views/biz/bizactivate/form.vue

@@ -0,0 +1,82 @@
+<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" layout="vertical">
+			<a-form-item label="用户id:" name="userId">
+				<a-input v-model:value="formData.userId" placeholder="请输入用户id" allow-clear />
+			</a-form-item>
+			<a-form-item label="账户糕点:" name="accountBalance">
+				<a-input v-model:value="formData.accountBalance" placeholder="请输入账户糕点" allow-clear />
+			</a-form-item>
+			<a-form-item label="状态1:待激活    2:已激活:" name="status">
+				<a-input v-model:value="formData.status" placeholder="请输入状态1:待激活    2:已激活" allow-clear />
+			</a-form-item>
+			<a-form-item label="帮助激活人数:" name="helpCount">
+				<a-input v-model:value="formData.helpCount" placeholder="请输入帮助激活人数" allow-clear />
+			</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="bizActivateForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizActivateApi from '@/api/biz/bizActivateApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizActivateApi
+					.bizActivateSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 151 - 0
snowy-admin-web/src/views/biz/bizactivate/index.vue

@@ -0,0 +1,151 @@
+<template>
+	<a-card :bordered="false" style="margin-bottom: 10px" class="mb-2">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="姓名" name="userName">
+						<a-input v-model:value="searchFormState.userName" placeholder="姓名查询" allow-clear />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="状态" name="status">
+						<a-select v-model:value="searchFormState.status" placeholder="状态查询" :options="statusList">
+						</a-select>
+					</a-form-item>
+				</a-col>
+
+				<a-col :span="6">
+					<a-button type="primary" html-type="submit" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizActivateAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizActivateEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizActivateEdit', 'bizActivateDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizActivate(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizActivateDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					<a-tag
+						:color="
+							record.status === '1'
+								? '#f50'
+								: record.status === '2'
+								  ? '#87d068'
+								      : '#f50'
+						"
+					>
+						{{ $TOOL.dictTypeData('activate_status', record.status) }}
+					</a-tag>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizactivate">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizActivateApi from '@/api/biz/bizActivateApi'
+	import tool from '@/utils/tool'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const searchFormRef = ref()
+	let searchFormState = reactive({})
+	const statusList = tool.dictList('activate_status')
+	const columns = [
+		{
+			title: '姓名',
+			dataIndex: 'userName',
+			align: 'center',
+		},
+		{
+			title: '糕点',
+			dataIndex: 'accountBalance',
+			align: 'center',
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			align: 'center',
+		},
+		{
+			title: '激活需要人数',
+			dataIndex: 'successCount',
+			align: 'center',
+		},
+		{
+			title: '帮助激活人数',
+			dataIndex: 'helpCount',
+			align: 'center',
+		},
+		{
+			title: '充值时间',
+			dataIndex: 'createTime',
+			align: 'center',
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	/*if (hasPerm(['bizActivateEdit', 'bizActivateDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		})
+	}*/
+
+	const loadData = (parameter) => {
+		const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
+		return bizActivateApi.bizActivatePage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizActivate = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizActivateApi.bizActivateDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizActivate = (params) => {
+		bizActivateApi.bizActivateDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 6 - 0
snowy-admin-web/src/views/biz/couponrecord/index.vue

@@ -85,6 +85,12 @@
 			align: 'center',
 			width: 50
 		},
+		{
+			title: '会员姓名',
+			dataIndex: 'userName',
+			align: 'center',
+			width: 120
+		},
 		{
 			title: '蛋糕券编码',
 			dataIndex: 'couponNo',

+ 49 - 10
snowy-admin-web/src/views/biz/rechargeplanconfig/form.vue

@@ -29,21 +29,35 @@
 				<a-input-number v-model:value="formData.rechargeAmount" style="width: 100%" :min="0" :max="99999999"
 								:precision="2" placeholder="请输入充值金额及以上" allow-clear/>
 			</a-form-item>
-			<a-form-item label="优惠券金额:" name="couponAmount">
+			<a-form-item label="蛋糕券金额:" name="couponAmount">
 				<a-input-number v-model:value="formData.couponAmount" style="width: 100%" :min="0" :max="99999999"
 								:precision="2" placeholder="请输入优惠券金额" allow-clear/>
 			</a-form-item>
-			<a-form-item label="优惠券数量:" name="couponNum">
+			<a-form-item label="蛋糕券数量:" name="couponNum">
 				<a-input-number v-model:value="formData.couponNum" style="width: 100%" :min="0" :max="99999999"
 								:precision="0" placeholder="请输入优惠券数量" allow-clear/>
 			</a-form-item>
-			<a-form-item label="账户到账金额:" name="accountBalance">
+			<a-form-item label="账户到账糕点:" name="accountBalance">
 				<a-input-number v-model:value="formData.accountBalance" style="width: 100%" :min="0" :max="99999999"
-								:precision="2" placeholder="请输入账户到账金额" allow-clear/>
+								:precision="2" placeholder="请输入账户到账糕点" allow-clear/>
 			</a-form-item>
-			<a-form-item label="返点比例(代金券):" name="rebateRatio">
+			<a-form-item label="是否立即到账:" name="isAccount" >
+				<a-radio-group button-style="solid" v-model:value="formData.isAccount" @change="onOperateChange">
+					<a-radio-button value="1">
+						是
+					</a-radio-button>
+					<a-radio-button value="0">
+						否
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="帮助激活人数:" name="helpCount" v-show="helpFlag" :rules="helpRules">
+				<a-input-number v-model:value="formData.helpCount" style="width: 100%" :min="1" :max="99999999"
+								:precision="0" placeholder="请输入帮助激活糕点到账人数" allow-clear/>
+			</a-form-item>
+			<a-form-item label="返点比例(积分):" name="rebateRatio">
 				<a-input-number v-model:value="formData.rebateRatio" style="width: 100%" :min="0" :max="100"
-								:precision="2" placeholder="请输入返点比例(代金券)" addon-after="%" allow-clear/>
+								:precision="2" placeholder="请输入返点比例(积分)" addon-after="%" allow-clear/>
 			</a-form-item>
 		</a-form>
 		<template #footer>
@@ -66,13 +80,24 @@ const formRef = ref()
 const formData = ref({})
 const submitLoading = ref(false)
 const treeData = ref([])
+const helpFlag = ref(false)
+const helpRules = ref([])
 
 // 打开抽屉
 const onOpen = (record) => {
 	open.value = true
+	formData.value.isAccount = ref('1')
 	if (record) {
 		let recordData = cloneDeep(record)
 		formData.value = Object.assign({}, recordData)
+		if(formData.value.isAccount == '1'){
+			helpFlag.value = false
+			helpRules.value = []
+		}else{
+			helpFlag.value = true
+			helpRules.value.push({required:true,message: '请输入帮助激活糕点到账人数'})
+		}
+
 	}
 }
 // 关闭抽屉
@@ -89,11 +114,12 @@ bizOrgApi.orgTreeSelector().then((res) => {
 // 默认要校验的
 const formRules = {
 	rechargeAmount: [required('请输入充值金额及以上')],
-	couponAmount: [required('请输入优惠券金额')],
-	couponNum: [required('请输入优惠券数量')],
-	accountBalance: [required('请输入账户到账金额')],
-	rebateRatio: [required('请输入返点比例(代金券)')],
+	couponAmount: [required('请输入蛋糕券金额')],
+	couponNum: [required('请输入蛋糕券数量')],
+	accountBalance: [required('请输入账户到账糕点')],
+	rebateRatio: [required('请输入返点比例(积分)')],
 	orgId: [required('请选择充值门店')],
+	isAccount: [required('请选择是否立即到账')],
 }
 // 验证并提交数据
 const onSubmit = () => {
@@ -115,6 +141,19 @@ const onSubmit = () => {
 		.catch(() => {
 		})
 }
+//选择是否立即到账
+const onOperateChange = (e) => {
+	console.log("value:"+e.target.value)
+	if(e.target.value == '1'){
+		//选择了是
+		helpFlag.value = false
+		helpRules.value=[]
+	}else{
+		//选择了否
+		helpFlag.value = true
+		helpRules.value.push({required:true,message: '请输入帮助激活糕点到账人数'})
+	}
+}
 // 抛出函数
 defineExpose({
 	onOpen

+ 19 - 1
snowy-admin-web/src/views/biz/rechargeplanconfig/index.vue

@@ -78,6 +78,19 @@
 					/>
 					<span v-else>{{ $TOOL.dictTypeData('COMMON_STATUS', record.userStatus) }}</span>
 				</template>
+				<template v-if="column.dataIndex === 'isAccount'">
+					<a-tag
+						:color="
+							record.isAccount === '0'
+								? '#87d068'
+								: record.isAccount === '1'
+								  ? '#f50'
+								      : '#f50'
+						"
+					>
+						{{ $TOOL.dictTypeData('is_destroy', record.isAccount) }}
+					</a-tag>
+				</template>
 				<template v-if="column.dataIndex === 'action'">
 					<a-space>
 						<a
@@ -150,10 +163,15 @@
 			align: 'center',
 		},
 		{
-			title: '账户增加糕点(个)',
+			title: '账户到账糕点(个)',
 			dataIndex: 'accountBalance',
 			align: 'center',
 		},
+		{
+			title: '是否立即到账',
+			dataIndex: 'isAccount',
+			align: 'center',
+		},
 		{
 			title: '返点比例(积分)',
 			dataIndex: 'rebateRatio',

+ 2 - 1
snowy-admin-web/src/views/dev/slideshow/index.vue

@@ -81,7 +81,7 @@
 					}}</a-tag>
 				</template>
 				<template v-if="column.dataIndex === 'image'">
-					<a-image :src="record.image" style="width: 50px; height: 30px" />
+					<a-image :src="sysConfig.API_URL+record.image" style="width: 50px; height: 30px" />
 				</template>
 				<template v-if="column.dataIndex === 'status'">
 					<a-switch
@@ -111,6 +111,7 @@
 	import { cloneDeep } from 'lodash-es'
 	import Form from './form.vue'
 	import slideshowApi from '@/api/dev/slideshowApi'
+	import sysConfig from "@/config";
 	const searchFormState = ref({})
 	const searchFormRef = ref()
 	const tableRef = ref()

+ 13 - 0
snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java

@@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -242,6 +243,18 @@ public abstract class SaBaseLoginUser {
     @Schema(description = "数据范围集合", hidden = true)
     private List<DataScope> dataScopeList;
 
+    /** 用户类型: 1. 管理员 2.门店 3.消费者*/
+    private String userType;
+
+    /**账户糕点*/
+    private BigDecimal accountBalance;
+
+    /**账户积分*/
+    private BigDecimal voucherBalance;
+
+    /**用户推荐码*/
+    private String userReferralCode;
+
     /** 用户密码hash值 */
     @JsonIgnore
     @Schema(description = "用户密码hash值")

+ 123 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/controller/BizActivateController.java

@@ -0,0 +1,123 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateAddParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateEditParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateIdParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivatePageParam;
+import vip.xiaonuo.biz.modular.bizactivate.service.BizActivateService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 用户充值待激活记录控制器
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ */
+@Tag(name = "用户充值待激活记录控制器")
+@RestController
+@Validated
+public class BizActivateController {
+
+    @Resource
+    private BizActivateService bizActivateService;
+
+    /**
+     * 获取用户充值待激活记录分页
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    @Operation(summary = "获取用户充值待激活记录分页")
+    @SaCheckPermission("/biz/bizactivate/page")
+    @GetMapping("/biz/bizactivate/page")
+    public CommonResult<Page<BizActivate>> page(BizActivatePageParam bizActivatePageParam) {
+        return CommonResult.data(bizActivateService.page(bizActivatePageParam));
+    }
+
+    /**
+     * 添加用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    @Operation(summary = "添加用户充值待激活记录")
+    @CommonLog("添加用户充值待激活记录")
+    @SaCheckPermission("/biz/bizactivate/add")
+    @PostMapping("/biz/bizactivate/add")
+    public CommonResult<String> add(@RequestBody @Valid BizActivateAddParam bizActivateAddParam) {
+        bizActivateService.add(bizActivateAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    @Operation(summary = "编辑用户充值待激活记录")
+    @CommonLog("编辑用户充值待激活记录")
+    @SaCheckPermission("/biz/bizactivate/edit")
+    @PostMapping("/biz/bizactivate/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizActivateEditParam bizActivateEditParam) {
+        bizActivateService.edit(bizActivateEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    @Operation(summary = "删除用户充值待激活记录")
+    @CommonLog("删除用户充值待激活记录")
+    @SaCheckPermission("/biz/bizactivate/delete")
+    @PostMapping("/biz/bizactivate/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizActivateIdParam> bizActivateIdParamList) {
+        bizActivateService.delete(bizActivateIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取用户充值待激活记录详情
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    @Operation(summary = "获取用户充值待激活记录详情")
+    @SaCheckPermission("/biz/bizactivate/detail")
+    @GetMapping("/biz/bizactivate/detail")
+    public CommonResult<BizActivate> detail(@Valid BizActivateIdParam bizActivateIdParam) {
+        return CommonResult.data(bizActivateService.detail(bizActivateIdParam));
+    }
+}

+ 64 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/entity/BizActivate.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值待激活记录实体
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+@Setter
+@TableName("biz_activate")
+public class BizActivate extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 账户糕点 */
+    @Schema(description = "账户糕点")
+    private BigDecimal accountBalance;
+
+    /** 状态1:待激活    2:已激活 */
+    @Schema(description = "状态1:待激活    2:已激活")
+    private String status;
+
+    /** 帮助激活人数 */
+    @Schema(description = "帮助激活人数")
+    private Integer helpCount;
+
+    /**充值方案id*/
+    private String planConfigId;
+
+    @TableField(exist = false)
+    private String userName;
+
+    /**成功激活需要人数*/
+    private Integer successCount;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/enums/BizActivateEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.enums;
+
+import lombok.Getter;
+
+/**
+ * 用户充值待激活记录枚举
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+public enum BizActivateEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizActivateEnum(String value) {
+        this.value = value;
+    }
+}

+ 29 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/mapper/BizActivateMapper.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate;
+
+/**
+ * 用户充值待激活记录Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+public interface BizActivateMapper extends BaseMapper<BizActivate> {
+    Page<BizActivate> getPageList(@Param("page") Page<BizActivate> page, @Param("ew") QueryWrapper<BizActivate> ew) ;
+}

+ 18 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/mapper/mapping/BizActivateMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.bizactivate.mapper.BizActivateMapper">
+
+    <select id="getPageList" resultType="vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate">
+        select
+            su.name userName,
+            ba.account_balance,
+            ba.status,
+            ba.help_count,
+            ba.create_time,
+            brpc.help_count successCount
+        from biz_activate ba
+        left join SYS_USER su on su.id = ba.user_id
+        left join biz_recharge_plan_config brpc on brpc.id = ba.plan_config_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 50 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateAddParam.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值待激活记录添加参数
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+@Setter
+public class BizActivateAddParam {
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 账户糕点 */
+    @Schema(description = "账户糕点")
+    private BigDecimal accountBalance;
+
+    /** 状态1:待激活    2:已激活 */
+    @Schema(description = "状态1:待激活    2:已激活")
+    private String status;
+
+    /** 帮助激活人数 */
+    @Schema(description = "帮助激活人数")
+    private Integer helpCount;
+
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateEditParam.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值待激活记录编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+@Setter
+public class BizActivateEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 账户糕点 */
+    @Schema(description = "账户糕点")
+    private BigDecimal accountBalance;
+
+    /** 状态1:待激活    2:已激活 */
+    @Schema(description = "状态1:待激活    2:已激活")
+    private String status;
+
+    /** 帮助激活人数 */
+    @Schema(description = "帮助激活人数")
+    private Integer helpCount;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivateIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 用户充值待激活记录Id参数
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+@Setter
+public class BizActivateIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/param/BizActivatePageParam.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值待激活记录查询参数
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Getter
+@Setter
+public class BizActivatePageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+    private String userName;
+
+    private String status;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/service/BizActivateService.java

@@ -0,0 +1,80 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateAddParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateEditParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateIdParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivatePageParam;
+
+import java.util.List;
+
+/**
+ * 用户充值待激活记录Service接口
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+public interface BizActivateService extends IService<BizActivate> {
+
+    /**
+     * 获取用户充值待激活记录分页
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    Page<BizActivate> page(BizActivatePageParam bizActivatePageParam);
+
+    /**
+     * 添加用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    void add(BizActivateAddParam bizActivateAddParam);
+
+    /**
+     * 编辑用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    void edit(BizActivateEditParam bizActivateEditParam);
+
+    /**
+     * 删除用户充值待激活记录
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    void delete(List<BizActivateIdParam> bizActivateIdParamList);
+
+    /**
+     * 获取用户充值待激活记录详情
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     */
+    BizActivate detail(BizActivateIdParam bizActivateIdParam);
+
+    /**
+     * 获取用户充值待激活记录详情
+     *
+     * @author fanzherong
+     * @date  2025/02/27 16:36
+     **/
+    BizActivate queryEntity(String id);
+}

+ 94 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizactivate/service/impl/BizActivateServiceImpl.java

@@ -0,0 +1,94 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizactivate.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+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 org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate;
+import vip.xiaonuo.biz.modular.bizactivate.mapper.BizActivateMapper;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateAddParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateEditParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivateIdParam;
+import vip.xiaonuo.biz.modular.bizactivate.param.BizActivatePageParam;
+import vip.xiaonuo.biz.modular.bizactivate.service.BizActivateService;
+
+import java.util.List;
+
+/**
+ * 用户充值待激活记录Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/02/27 16:36
+ **/
+@Service
+public class BizActivateServiceImpl extends ServiceImpl<BizActivateMapper, BizActivate> implements BizActivateService {
+
+    @Override
+    public Page<BizActivate> page(BizActivatePageParam bizActivatePageParam) {
+        QueryWrapper<BizActivate> queryWrapper = new QueryWrapper<BizActivate>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizActivatePageParam.getUserName())){
+            queryWrapper.like("su.name",bizActivatePageParam.getUserName());
+        }
+        if(ObjectUtil.isNotEmpty(bizActivatePageParam.getStatus())){
+            queryWrapper.eq("ba.status",bizActivatePageParam.getStatus());
+        }
+        queryWrapper.orderByDesc("ba.create_time");
+        return this.getBaseMapper().getPageList(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizActivateAddParam bizActivateAddParam) {
+        BizActivate bizActivate = BeanUtil.toBean(bizActivateAddParam, BizActivate.class);
+        this.save(bizActivate);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizActivateEditParam bizActivateEditParam) {
+        BizActivate bizActivate = this.queryEntity(bizActivateEditParam.getId());
+        BeanUtil.copyProperties(bizActivateEditParam, bizActivate);
+        this.updateById(bizActivate);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizActivateIdParam> bizActivateIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizActivateIdParamList, BizActivateIdParam::getId));
+    }
+
+    @Override
+    public BizActivate detail(BizActivateIdParam bizActivateIdParam) {
+        return this.queryEntity(bizActivateIdParam.getId());
+    }
+
+    @Override
+    public BizActivate queryEntity(String id) {
+        BizActivate bizActivate = this.getById(id);
+        if(ObjectUtil.isEmpty(bizActivate)) {
+            throw new CommonException("用户充值待激活记录不存在,id值为:{}", id);
+        }
+        return bizActivate;
+    }
+}

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/entity/BizRechargePlanConfig.java

@@ -67,5 +67,11 @@ public class BizRechargePlanConfig extends CommonEntity {
     @TableField(exist = false)
     private String orgName;
 
+    /**是否立即到账*/
+    private String isAccount;
+
+    /**帮助激活人数*/
+    private Integer helpCount;
+
 
 }

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/mapper/mapping/BizRechargePlanConfigMapper.xml

@@ -13,6 +13,8 @@
             brpc.rebate_ratio,
             brpc.status,
             brpc.org_id,
+            brpc.is_account,
+            brpc.help_count,
             so.name orgName
         from biz_recharge_plan_config brpc
         left join SYS_ORG so on brpc.org_id = so.ID

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/param/BizRechargePlanConfigAddParam.java

@@ -54,4 +54,10 @@ public class BizRechargePlanConfigAddParam {
     /**门店id*/
     private String orgId;
 
+    /**是否立即到账*/
+    private String isAccount;
+
+    /**帮助激活人数*/
+    private Integer helpCount;
+
 }

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/param/BizRechargePlanConfigEditParam.java

@@ -59,4 +59,10 @@ public class BizRechargePlanConfigEditParam {
     /**门店id*/
     private String orgId;
 
+    /**是否立即到账*/
+    private String isAccount;
+
+    /**帮助激活人数*/
+    private Integer helpCount;
+
 }

+ 7 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/service/impl/BizRechargePlanConfigServiceImpl.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 org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.biz.modular.user.enums.BizUserStatusEnum;
@@ -62,6 +63,9 @@ public class BizRechargePlanConfigServiceImpl extends ServiceImpl<BizRechargePla
     @Override
     public void add(BizRechargePlanConfigAddParam bizRechargePlanConfigAddParam) {
         BizRechargePlanConfig bizRechargePlanConfig = BeanUtil.toBean(bizRechargePlanConfigAddParam, BizRechargePlanConfig.class);
+        if(ObjectUtil.isEmpty(bizRechargePlanConfigAddParam.getHelpCount())){
+            bizRechargePlanConfig.setHelpCount(1);
+        }
         this.save(bizRechargePlanConfig);
     }
 
@@ -70,6 +74,9 @@ public class BizRechargePlanConfigServiceImpl extends ServiceImpl<BizRechargePla
     public void edit(BizRechargePlanConfigEditParam bizRechargePlanConfigEditParam) {
         BizRechargePlanConfig bizRechargePlanConfig = this.queryEntity(bizRechargePlanConfigEditParam.getId());
         BeanUtil.copyProperties(bizRechargePlanConfigEditParam, bizRechargePlanConfig);
+        if(StringUtils.equals(bizRechargePlanConfigEditParam.getIsAccount(),"1")){
+            bizRechargePlanConfig.setHelpCount(1);
+        }
         this.updateById(bizRechargePlanConfig);
     }
 

+ 10 - 3
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/service/impl/BizRechargeRecordServiceImpl.java

@@ -152,9 +152,16 @@ public class BizRechargeRecordServiceImpl extends ServiceImpl<BizRechargeRecordM
                         .append(" x ").append(bizRechargePlanConfig.getCouponNum())
                         .append("(线下核销领蛋糕)");
             }
-            content.append(",账户余额到账").append(bizRechargePlanConfig.getAccountBalance())
-                    .append("元,返利").append(bizRechargePlanConfig.getRebateRatio())
-                    .append("%到推荐人代金券");
+            if(StringUtils.equals(bizRechargePlanConfig.getIsAccount(),"1")){
+                content.append(",账户余额到账").append(bizRechargePlanConfig.getAccountBalance())
+                        .append("元,返利").append(bizRechargePlanConfig.getRebateRatio())
+                        .append("%到推荐人代金券");
+            }else{
+                content.append(",账户余额到账").append(bizRechargePlanConfig.getAccountBalance())
+                        .append("元(待激活),返利").append(bizRechargePlanConfig.getRebateRatio())
+                        .append("%到推荐人代金券");
+            }
+
             bizRechargeRecord.setRechargePlanDescribe(content.toString());
             bizRechargeRecord.setRechargePlanId(bizRechargeRecordAddParam.getRechargePlanId());
             bizRechargeRecord.setPlanAccountBalance(bizRechargePlanConfig.getAccountBalance());

+ 74 - 12
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/wx/WxPayNotifyController.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.wechat.pay.java.core.RSAAutoCertificateConfig;
 import com.wechat.pay.java.core.notification.NotificationParser;
 import com.wechat.pay.java.core.notification.RequestParam;
@@ -15,6 +16,7 @@ import com.wechat.pay.java.service.partnerpayments.app.model.Transaction;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,10 +25,14 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.biz.api.BizUserApi;
 import vip.xiaonuo.biz.core.enums.FundChangeTypeEnum;
+import vip.xiaonuo.biz.modular.bizactivate.entity.BizActivate;
+import vip.xiaonuo.biz.modular.bizactivate.service.BizActivateService;
 import vip.xiaonuo.biz.modular.couponrecord.entity.BizCouponRecord;
 import vip.xiaonuo.biz.modular.couponrecord.service.BizCouponRecordService;
 import vip.xiaonuo.biz.modular.rebaterecord.entity.BizRebateRecord;
 import vip.xiaonuo.biz.modular.rebaterecord.service.BizRebateRecordService;
+import vip.xiaonuo.biz.modular.rechargeplanconfig.entity.BizRechargePlanConfig;
+import vip.xiaonuo.biz.modular.rechargeplanconfig.service.BizRechargePlanConfigService;
 import vip.xiaonuo.biz.modular.rechargerecord.entity.BizRechargeRecord;
 import vip.xiaonuo.biz.modular.rechargerecord.service.BizRechargeRecordService;
 import vip.xiaonuo.biz.modular.user.entity.BizUser;
@@ -73,6 +79,10 @@ public class WxPayNotifyController {
     private BizUserFundChangeRecordService bizUserFundChangeRecordService;
     @Resource
     private PlatformTransactionManager transactionManager;
+    @Resource
+    private BizRechargePlanConfigService bizRechargePlanConfigService;
+    @Resource
+    private BizActivateService bizActivateService;
 
     /**
      * 微信支付回调通知
@@ -138,10 +148,71 @@ public class WxPayNotifyController {
             log.info("=========== 更新用户:{},账户余额 ========", bizUser.getName());
             bizRechargeRecord.setOldAccountBalance(bizUser.getAccountBalance());
             bizRechargeRecord.setOldVoucherBalance(bizUser.getVoucherBalance());
+            BizRechargePlanConfig planConfig = null;
             //计算新金额
             if (ObjectUtil.isNotEmpty(bizRechargeRecord.getRechargePlanId())) {
-                //有充值计划
-                bizUser.setAccountBalance(bizUser.getAccountBalance().add(bizRechargeRecord.getPlanAccountBalance()));
+                planConfig = bizRechargePlanConfigService.getById(bizRechargeRecord.getRechargePlanId());
+                if(StringUtils.equals(planConfig.getIsAccount(),"1")){
+                    //有充值计划,立即到账
+                    bizUser.setAccountBalance(bizUser.getAccountBalance().add(bizRechargeRecord.getPlanAccountBalance()));
+
+                    // 记录用户账户资金变动记录
+                    log.info("=========== 记录用户账户资金变动记录 ========");
+                    BizUserFundChangeRecord bizUserFundChangeRecord = new BizUserFundChangeRecord();
+                    bizUserFundChangeRecord.setChangeType(FundChangeTypeEnum.RECHARGE.getValue());
+                    bizUserFundChangeRecord.setUserId(bizRechargeRecord.getUserId());
+                    bizUserFundChangeRecord.setOldAccountBalance(bizRechargeRecord.getOldAccountBalance());
+                    bizUserFundChangeRecord.setOldVoucherBalance(bizRechargeRecord.getOldVoucherBalance());
+                    bizUserFundChangeRecord.setNewAccountBalance(bizUser.getAccountBalance());
+                    bizUserFundChangeRecord.setNewVoucherBalance(bizUser.getVoucherBalance());
+                    bizUserFundChangeRecordService.save(bizUserFundChangeRecord);
+                }else{
+                    //插入一条待激活的记录
+                    BizActivate bizActivate = new BizActivate();
+                    bizActivate.setUserId(bizUser.getId());
+                    bizActivate.setAccountBalance(planConfig.getAccountBalance());
+                    bizActivate.setStatus("1");
+                    bizActivate.setHelpCount(0);
+                    bizActivate.setPlanConfigId(planConfig.getId());
+                    bizActivateService.save(bizActivate);
+
+
+                    if (ObjectUtil.isNotEmpty(bizUser.getReferralUser())) {
+                        //查询推荐人最早的一条待激活的记录,帮助激活人数+1
+                        BizUser user = bizUserMapper.selectById(bizUser.getReferralUser());
+                        BizActivate activate = bizActivateService.getOne(new QueryWrapper<BizActivate>().lambda().eq(BizActivate::getUserId, user.getId())
+                                .eq(BizActivate::getPlanConfigId, planConfig.getId())
+                                .eq(BizActivate::getStatus,"1")
+                                .orderByAsc(BizActivate::getCreateTime)
+                                .last("limit 1"));
+                        if(ObjectUtil.isNotNull(activate)){
+                            if(activate.getHelpCount()+1 == planConfig.getHelpCount()){
+
+                                // 记录用户账户资金变动记录
+                                log.info("=========== 记录用户账户资金变动记录 ========");
+                                BizUserFundChangeRecord bizUserFundChangeRecord = new BizUserFundChangeRecord();
+                                bizUserFundChangeRecord.setChangeType(FundChangeTypeEnum.RECHARGE.getValue());
+                                bizUserFundChangeRecord.setUserId(user.getId());
+                                bizUserFundChangeRecord.setOldAccountBalance(user.getAccountBalance());
+                                bizUserFundChangeRecord.setOldVoucherBalance(user.getVoucherBalance());
+
+                                //帮助激活人数等于配置的帮助激活人数,账户糕点可激活
+                                user.setAccountBalance(user.getAccountBalance().add(activate.getAccountBalance()));
+
+                                bizUserFundChangeRecord.setNewAccountBalance(user.getAccountBalance());
+                                bizUserFundChangeRecord.setNewVoucherBalance(user.getVoucherBalance());
+                                bizUserFundChangeRecordService.save(bizUserFundChangeRecord);
+
+                                //修改推荐人账户余额
+                                bizUserMapper.updateById(user);
+
+                                activate.setStatus("2");
+                            }
+                            activate.setHelpCount(activate.getHelpCount()+1);
+                            bizActivateService.updateById(activate);
+                        }
+                    }
+                }
             } else {
                 bizUser.setAccountBalance(bizUser.getAccountBalance().add(realPayAmount));
             }
@@ -179,16 +250,7 @@ public class WxPayNotifyController {
                 bizRebateRecord.setRecommendUserId(bizUser.getReferralUser());
                 bizRebateRecordService.save(bizRebateRecord);
             }
-            // 记录用户账户资金变动记录
-            log.info("=========== 记录用户账户资金变动记录 ========");
-            BizUserFundChangeRecord bizUserFundChangeRecord = new BizUserFundChangeRecord();
-            bizUserFundChangeRecord.setChangeType(FundChangeTypeEnum.RECHARGE.getValue());
-            bizUserFundChangeRecord.setUserId(bizRechargeRecord.getUserId());
-            bizUserFundChangeRecord.setOldAccountBalance(bizRechargeRecord.getOldAccountBalance());
-            bizUserFundChangeRecord.setOldVoucherBalance(bizRechargeRecord.getOldVoucherBalance());
-            bizUserFundChangeRecord.setNewAccountBalance(bizRechargeRecord.getNewAccountBalance());
-            bizUserFundChangeRecord.setNewVoucherBalance(bizRechargeRecord.getNewVoucherBalance());
-            bizUserFundChangeRecordService.save(bizUserFundChangeRecord);
+
             //手动提交事务
             transactionManager.commit(transactionStatus);
             log.info("微信订单回调成功------------------");

+ 1 - 1
snowy-plugin/snowy-plugin-dev/src/main/java/vip/xiaonuo/dev/modular/file/service/impl/DevFileServiceImpl.java

@@ -212,7 +212,7 @@ public class DevFileServiceImpl extends ServiceImpl<DevFileMapper, DevFile> impl
             if(ObjectUtil.isEmpty(apiUrl)) {
                 throw new CommonException("后端域名地址未正确配置:snowy.config.common.backend-url为空");
             }
-            downloadUrl= apiUrl + "/dev/file/download?id=" + fileId;
+            downloadUrl= "/dev/file/download?id=" + fileId;
             devFile.setDownloadPath(downloadUrl);
         } else {
             // 阿里云、腾讯云、MINIO可以直接使用存储地址(公网)作为下载地址