瀏覽代碼

充值相关功能基础代码提交

wulei 3 月之前
父節點
當前提交
699cfe8fb5
共有 61 個文件被更改,包括 3173 次插入41 次删除
  1. 28 0
      snowy-admin-web/src/api/biz/bizCouponRecordApi.js
  2. 28 0
      snowy-admin-web/src/api/biz/bizRebateRecordApi.js
  3. 28 0
      snowy-admin-web/src/api/biz/bizRechargeRecordApi.js
  4. 100 0
      snowy-admin-web/src/views/biz/couponrecord/form.vue
  5. 158 0
      snowy-admin-web/src/views/biz/couponrecord/index.vue
  6. 82 0
      snowy-admin-web/src/views/biz/rebaterecord/form.vue
  7. 147 0
      snowy-admin-web/src/views/biz/rebaterecord/index.vue
  8. 1 1
      snowy-admin-web/src/views/biz/rechargeplanconfig/index.vue
  9. 118 0
      snowy-admin-web/src/views/biz/rechargerecord/form.vue
  10. 172 0
      snowy-admin-web/src/views/biz/rechargerecord/index.vue
  11. 0 3
      snowy-common/src/main/java/vip/xiaonuo/common/util/CommonWxUtil.java
  12. 9 0
      snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/api/SaBaseLoginUserApi.java
  13. 13 1
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java
  14. 30 0
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthIUserInfo.java
  15. 0 22
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthInfo.java
  16. 2 1
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java
  17. 25 1
      snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java
  18. 123 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/controller/BizCouponRecordController.java
  19. 103 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/entity/BizCouponRecord.java
  20. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/enums/BizCouponRecordEnum.java
  21. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/mapper/BizCouponRecordMapper.java
  22. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/mapper/mapping/BizCouponRecordMapper.xml
  23. 74 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordAddParam.java
  24. 79 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordEditParam.java
  25. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordIdParam.java
  26. 59 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordPageParam.java
  27. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/service/BizCouponRecordService.java
  28. 100 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/service/impl/BizCouponRecordServiceImpl.java
  29. 123 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/controller/BizRebateRecordController.java
  30. 79 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/entity/BizRebateRecord.java
  31. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/enums/BizRebateRecordEnum.java
  32. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/mapper/BizRebateRecordMapper.java
  33. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/mapper/mapping/BizRebateRecordMapper.xml
  34. 50 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordAddParam.java
  35. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordEditParam.java
  36. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordIdParam.java
  37. 63 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordPageParam.java
  38. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/service/BizRebateRecordService.java
  39. 103 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/service/impl/BizRebateRecordServiceImpl.java
  40. 17 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/controller/BizRechargePlanConfigController.java
  41. 123 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/controller/BizRechargeRecordController.java
  42. 127 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/entity/BizRechargeRecord.java
  43. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/enums/BizRechargeRecordEnum.java
  44. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/mapper/BizRechargeRecordMapper.java
  45. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/mapper/mapping/BizRechargeRecordMapper.xml
  46. 98 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordAddParam.java
  47. 103 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordEditParam.java
  48. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordIdParam.java
  49. 63 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordPageParam.java
  50. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/service/BizRechargeRecordService.java
  51. 100 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/service/impl/BizRechargeRecordServiceImpl.java
  52. 6 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java
  53. 1 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/WxUserRegisterParam.java
  54. 13 9
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java
  55. 5 0
      snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/provider/ClientLoginUserApiProvider.java
  56. 4 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java
  57. 5 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysLoginUserApiProvider.java
  58. 7 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/SysUserService.java
  59. 10 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java
  60. 1 0
      snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java
  61. 1 1
      snowy-web-app/src/main/resources/application.properties

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/couponrecord/` + url, ...arg)
+
+/**
+ * 优惠券记录Api接口管理器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+export default {
+	// 获取优惠券记录分页
+	bizCouponRecordPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交优惠券记录表单 edit为true时为编辑,默认为新增
+	bizCouponRecordSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除优惠券记录
+	bizCouponRecordDelete(data) {
+		return request('delete', data)
+	},
+	// 获取优惠券记录详情
+	bizCouponRecordDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/rebaterecord/` + url, ...arg)
+
+/**
+ * 返利记录Api接口管理器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+export default {
+	// 获取返利记录分页
+	bizRebateRecordPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交返利记录表单 edit为true时为编辑,默认为新增
+	bizRebateRecordSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除返利记录
+	bizRebateRecordDelete(data) {
+		return request('delete', data)
+	},
+	// 获取返利记录详情
+	bizRebateRecordDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/rechargerecord/` + url, ...arg)
+
+/**
+ * 充值记录表Api接口管理器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+export default {
+	// 获取充值记录表分页
+	bizRechargeRecordPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交充值记录表表单 edit为true时为编辑,默认为新增
+	bizRechargeRecordSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除充值记录表
+	bizRechargeRecordDelete(data) {
+		return request('delete', data)
+	},
+	// 获取充值记录表详情
+	bizRechargeRecordDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 100 - 0
snowy-admin-web/src/views/biz/couponrecord/form.vue

@@ -0,0 +1,100 @@
+<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="优惠券编码:" name="couponNo">
+				<a-input v-model:value="formData.couponNo" placeholder="请输入优惠券编码" allow-clear />
+			</a-form-item>
+			<a-form-item label="优惠券生成时间:" name="time">
+				<a-date-picker v-model:value="formData.time" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择优惠券生成时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="充值方案id:" name="rechargePlanId">
+				<a-input v-model:value="formData.rechargePlanId" placeholder="请输入充值方案id" allow-clear />
+			</a-form-item>
+			<a-form-item label="充值记录表id:" name="rechargeRecordId">
+				<a-input v-model:value="formData.rechargeRecordId" placeholder="请输入充值记录表id" allow-clear />
+			</a-form-item>
+			<a-form-item label="是否核销: 0.否 1.是:" name="couponStatus">
+				<a-input v-model:value="formData.couponStatus" placeholder="请输入是否核销: 0.否 1.是" allow-clear />
+			</a-form-item>
+			<a-form-item label="有效期开始时间:" name="startTime">
+				<a-date-picker v-model:value="formData.startTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择有效期开始时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="有效期截止时间:" name="endTime">
+				<a-date-picker v-model:value="formData.endTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择有效期截止时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="核销人:" name="destroyUser">
+				<a-input v-model:value="formData.destroyUser" placeholder="请输入核销人" allow-clear />
+			</a-form-item>
+			<a-form-item label="核销时间:" name="destroyTime">
+				<a-date-picker v-model:value="formData.destroyTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择核销时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="核销门店:" name="orgId">
+				<a-input v-model:value="formData.orgId" 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="bizCouponRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	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 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)
+				bizCouponRecordApi
+					.bizCouponRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

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

@@ -0,0 +1,158 @@
+<template>
+	<a-card :bordered="false">
+		<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="couponNo">
+						<a-input v-model:value="searchFormState.couponNo" placeholder="请输入优惠券编码" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="是否核销: 0.否 1.是" name="couponStatus">
+						<a-input v-model:value="searchFormState.couponStatus" placeholder="请输入是否核销: 0.否 1.是" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			:alert="options.alert.show"
+			bordered
+			:row-key="(record) => record.id"
+			:tool-config="toolConfig"
+			:row-selection="options.rowSelection"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizCouponRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizCouponRecordBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizCouponRecord"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizCouponRecordEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizCouponRecordEdit', 'bizCouponRecordDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizCouponRecord(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizCouponRecordDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="couponrecord">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizCouponRecordApi from '@/api/biz/bizCouponRecordApi'
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '优惠券编码',
+			dataIndex: 'couponNo'
+		},
+		{
+			title: '优惠券生成时间',
+			dataIndex: 'time'
+		},
+		{
+			title: '是否核销: 0.否 1.是',
+			dataIndex: 'couponStatus'
+		},
+		{
+			title: '有效期开始时间',
+			dataIndex: 'startTime'
+		},
+		{
+			title: '有效期截止时间',
+			dataIndex: 'endTime'
+		},
+		{
+			title: '核销人',
+			dataIndex: 'destroyUser'
+		},
+		{
+			title: '核销时间',
+			dataIndex: 'destroyTime'
+		},
+		{
+			title: '核销门店',
+			dataIndex: 'orgId'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizCouponRecordEdit', 'bizCouponRecordDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		})
+	}
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizCouponRecordApi.bizCouponRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizCouponRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizCouponRecordApi.bizCouponRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizCouponRecord = (params) => {
+		bizCouponRecordApi.bizCouponRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 82 - 0
snowy-admin-web/src/views/biz/rebaterecord/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="代金券金额:" name="rebateAmout">
+				<a-input v-model:value="formData.rebateAmout" placeholder="请输入代金券金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="推荐人:" name="recommendUserId">
+				<a-input v-model:value="formData.recommendUserId" placeholder="请输入推荐人" allow-clear />
+			</a-form-item>
+			<a-form-item label="充值人:" name="rechargeUserId">
+				<a-input v-model:value="formData.rechargeUserId" placeholder="请输入充值人" allow-clear />
+			</a-form-item>
+			<a-form-item label="代金券状态: 1. 待生效 2.已生效:" name="rebateStatus">
+				<a-input v-model:value="formData.rebateStatus" placeholder="请输入代金券状态: 1. 待生效 2.已生效" 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="bizRebateRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizRebateRecordApi from '@/api/biz/bizRebateRecordApi'
+	// 抽屉状态
+	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)
+				bizRebateRecordApi
+					.bizRebateRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 147 - 0
snowy-admin-web/src/views/biz/rebaterecord/index.vue

@@ -0,0 +1,147 @@
+<template>
+	<a-card :bordered="false">
+		<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="recommendUserId">
+						<a-input v-model:value="searchFormState.recommendUserId" placeholder="请输入推荐人" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="充值人" name="rechargeUserId">
+						<a-input v-model:value="searchFormState.rechargeUserId" placeholder="请输入充值人" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="代金券状态: 1. 待生效 2.已生效" name="rebateStatus">
+						<a-input v-model:value="searchFormState.rebateStatus" placeholder="请输入代金券状态: 1. 待生效 2.已生效" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			:alert="options.alert.show"
+			bordered
+			:row-key="(record) => record.id"
+			:tool-config="toolConfig"
+			:row-selection="options.rowSelection"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizRebateRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizRebateRecordBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizRebateRecord"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizRebateRecordEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizRebateRecordEdit', 'bizRebateRecordDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizRebateRecord(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizRebateRecordDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="rebaterecord">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizRebateRecordApi from '@/api/biz/bizRebateRecordApi'
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '代金券金额',
+			dataIndex: 'rebateAmout'
+		},
+		{
+			title: '推荐人',
+			dataIndex: 'recommendUserId'
+		},
+		{
+			title: '充值人',
+			dataIndex: 'rechargeUserId'
+		},
+		{
+			title: '代金券状态: 1. 待生效 2.已生效',
+			dataIndex: 'rebateStatus'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizRebateRecordEdit', 'bizRebateRecordDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		})
+	}
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizRebateRecordApi.bizRebateRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizRebateRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizRebateRecordApi.bizRebateRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizRebateRecord = (params) => {
+		bizRebateRecordApi.bizRebateRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

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

@@ -119,7 +119,7 @@
 			dataIndex: 'couponNum'
 			dataIndex: 'couponNum'
 		},
 		},
 		{
 		{
-			title: '账户余额增加金额(元)',
+			title: '账户增加金额(元)',
 			dataIndex: 'accountBalance'
 			dataIndex: 'accountBalance'
 		},
 		},
 		{
 		{

+ 118 - 0
snowy-admin-web/src/views/biz/rechargerecord/form.vue

@@ -0,0 +1,118 @@
+<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="充值方案id:" name="rechargePlanId">
+				<a-input v-model:value="formData.rechargePlanId" placeholder="请输入充值方案id" allow-clear />
+			</a-form-item>
+			<a-form-item label="充值金额:" name="rechargeAmount">
+				<a-input v-model:value="formData.rechargeAmount" placeholder="请输入充值金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="充值时间:" name="rechargeTime">
+				<a-date-picker v-model:value="formData.rechargeTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择充值时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="原账户余额:" name="oldAccountBalance">
+				<a-input v-model:value="formData.oldAccountBalance" placeholder="请输入原账户余额" allow-clear />
+			</a-form-item>
+			<a-form-item label="原代金券金额:" name="oldVoucherBalance">
+				<a-input v-model:value="formData.oldVoucherBalance" placeholder="请输入原代金券金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="新账户余额:" name="newAccountBalance">
+				<a-input v-model:value="formData.newAccountBalance" placeholder="请输入新账户余额" allow-clear />
+			</a-form-item>
+			<a-form-item label="新代金券金额:" name="newVoucherBalance">
+				<a-input v-model:value="formData.newVoucherBalance" placeholder="请输入新代金券金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="推荐人的返点比例:" name="rebateRatio">
+				<a-input v-model:value="formData.rebateRatio" placeholder="请输入推荐人的返点比例" allow-clear />
+			</a-form-item>
+			<a-form-item label="推荐人具体返点金额:" name="rebateAmount">
+				<a-input v-model:value="formData.rebateAmount" placeholder="请输入推荐人具体返点金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="优惠券(蛋糕券)数量:" name="couponNum">
+				<a-input v-model:value="formData.couponNum" placeholder="请输入优惠券(蛋糕券)数量" allow-clear />
+			</a-form-item>
+			<a-form-item label="优惠券金额:" name="couponAmount">
+				<a-input v-model:value="formData.couponAmount" placeholder="请输入优惠券金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="系统订单号:" name="orderNo">
+				<a-input v-model:value="formData.orderNo" placeholder="请输入系统订单号" allow-clear />
+			</a-form-item>
+			<a-form-item label="微信订单编号:" name="wxOrderNo">
+				<a-input v-model:value="formData.wxOrderNo" placeholder="请输入微信订单编号" allow-clear />
+			</a-form-item>
+			<a-form-item label="是否支付 0.未支付 1.已支付:" name="isPay">
+				<a-input v-model:value="formData.isPay" placeholder="请输入是否支付 0.未支付 1.已支付" allow-clear />
+			</a-form-item>
+			<a-form-item label="支付时间:" name="payTime">
+				<a-date-picker v-model:value="formData.payTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择支付时间" style="width: 100%" />
+			</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="bizRechargeRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizRechargeRecordApi from '@/api/biz/bizRechargeRecordApi'
+	// 抽屉状态
+	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)
+				bizRechargeRecordApi
+					.bizRechargeRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 172 - 0
snowy-admin-web/src/views/biz/rechargerecord/index.vue

@@ -0,0 +1,172 @@
+<template>
+	<a-card :bordered="false">
+		<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="用户id" name="userId">
+						<a-input v-model:value="searchFormState.userId" placeholder="请输入用户id" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="充值时间" name="rechargeTime">
+						<a-range-picker v-model:value="searchFormState.rechargeTime" value-format="YYYY-MM-DD HH:mm:ss" show-time />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			:alert="options.alert.show"
+			bordered
+			:row-key="(record) => record.id"
+			:tool-config="toolConfig"
+			:row-selection="options.rowSelection"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizRechargeRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizRechargeRecordBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizRechargeRecord"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizRechargeRecordEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizRechargeRecordEdit', 'bizRechargeRecordDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizRechargeRecord(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizRechargeRecordDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="rechargerecord">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizRechargeRecordApi from '@/api/biz/bizRechargeRecordApi'
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '用户id',
+			dataIndex: 'userId'
+		},
+		{
+			title: '充值方案id',
+			dataIndex: 'rechargePlanId'
+		},
+		{
+			title: '充值金额',
+			dataIndex: 'rechargeAmount'
+		},
+		{
+			title: '充值时间',
+			dataIndex: 'rechargeTime'
+		},
+		{
+			title: '原账户余额',
+			dataIndex: 'oldAccountBalance'
+		},
+		{
+			title: '原代金券金额',
+			dataIndex: 'oldVoucherBalance'
+		},
+		{
+			title: '系统订单号',
+			dataIndex: 'orderNo'
+		},
+		{
+			title: '微信订单编号',
+			dataIndex: 'wxOrderNo'
+		},
+		{
+			title: '是否支付 0.未支付 1.已支付',
+			dataIndex: 'isPay'
+		},
+		{
+			title: '支付时间',
+			dataIndex: 'payTime'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizRechargeRecordEdit', 'bizRechargeRecordDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		})
+	}
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		// rechargeTime范围查询条件重载
+		if (searchFormParam.rechargeTime) {
+			searchFormParam.startRechargeTime = searchFormParam.rechargeTime[0]
+			searchFormParam.endRechargeTime = searchFormParam.rechargeTime[1]
+			delete searchFormParam.rechargeTime
+		}
+		return bizRechargeRecordApi.bizRechargeRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizRechargeRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizRechargeRecordApi.bizRechargeRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizRechargeRecord = (params) => {
+		bizRechargeRecordApi.bizRechargeRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 0 - 3
snowy-common/src/main/java/vip/xiaonuo/common/util/CommonWxUtil.java

@@ -34,9 +34,6 @@ public class CommonWxUtil {
 
 
     private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
     private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
 
 
-    @Resource
-    private CommonCacheOperator commonCacheOperator;
-
     /**
     /**
      * 获取微信openId
      * 获取微信openId
      *
      *

+ 9 - 0
snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/api/SaBaseLoginUserApi.java

@@ -50,6 +50,13 @@ public interface SaBaseLoginUserApi {
      **/
      **/
     SaBaseLoginUser getUserByAccount(String account);
     SaBaseLoginUser getUserByAccount(String account);
 
 
+    /**
+     * 根据openId获取B端用户信息,查不到则返回null
+     * @param openId
+     * @return
+     */
+    SaBaseLoginUser getUserByOpenId(String openId);
+
     /**
     /**
      * 根据账号获取C端用户信息,查不到则返回null
      * 根据账号获取C端用户信息,查不到则返回null
      *
      *
@@ -121,4 +128,6 @@ public interface SaBaseLoginUserApi {
      * @date 2022/4/27 22:57
      * @date 2022/4/27 22:57
      */
      */
     void updateUserLoginInfo(String userId, String device);
     void updateUserLoginInfo(String userId, String device);
+
+
 }
 }

+ 13 - 1
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/controller/AuthClientController.java

@@ -28,7 +28,9 @@ import vip.xiaonuo.auth.core.util.StpClientUtil;
 import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
+import vip.xiaonuo.auth.modular.login.param.AuthWxParam;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
+import vip.xiaonuo.auth.modular.login.result.WxAuthIUserInfo;
 import vip.xiaonuo.auth.modular.login.service.AuthService;
 import vip.xiaonuo.auth.modular.login.service.AuthService;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.common.pojo.CommonResult;
 
 
@@ -121,7 +123,17 @@ public class AuthClientController {
         return CommonResult.data(authService.getClientLoginUser());
         return CommonResult.data(authService.getClientLoginUser());
     }
     }
 
 
-
+    /**
+     * 根据微信code码登录
+     *
+     * @author xuyuxiang
+     * @date 2021/10/15 13:12
+     **/
+    @Operation(summary = "根据微信code码登录")
+    @PostMapping("/auth/c/doLoginByCode")
+    public CommonResult<WxAuthIUserInfo> doLoginByCode(@RequestBody @Valid AuthWxParam authWxParam) {
+        return CommonResult.data(authService.doLoginByCode(authWxParam.getCode(), SaClientTypeEnum.B.getValue()));
+    }
 
 
 
 
 }
 }

+ 30 - 0
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthIUserInfo.java

@@ -0,0 +1,30 @@
+package vip.xiaonuo.auth.modular.login.result;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author wulei
+ * @date 2025/2/5
+ * @Version 1.0
+ * @Description 微信授权信息
+ */
+@Setter
+@Getter
+@AllArgsConstructor
+public class WxAuthIUserInfo {
+    /**
+     * openId
+     */
+    @Schema(description = "openId")
+    private String openId;
+    /**
+     * 登录完成返回的token
+     */
+    @Schema(description = "token")
+    private String token;
+
+}

+ 0 - 22
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/result/WxAuthInfo.java

@@ -1,22 +0,0 @@
-package vip.xiaonuo.auth.modular.login.result;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author wulei
- * @date 2025/2/5
- * @Version 1.0
- * @Description 微信授权信息
- */
-@Setter
-@Getter
-public class WxAuthInfo {
-
-    @Schema(description = "openId", requiredMode = Schema.RequiredMode.REQUIRED)
-    private String openId;
-
-
-
-}

+ 2 - 1
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/AuthService.java

@@ -18,6 +18,7 @@ import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
+import vip.xiaonuo.auth.modular.login.result.WxAuthIUserInfo;
 
 
 /**
 /**
  * 登录Service接口
  * 登录Service接口
@@ -84,5 +85,5 @@ public interface AuthService {
     String doLoginById(String userId, String device, String type);
     String doLoginById(String userId, String device, String type);
 
 
 
 
-
+    WxAuthIUserInfo doLoginByCode(String code, String type);
 }
 }

+ 25 - 1
snowy-plugin/snowy-plugin-auth/src/main/java/vip/xiaonuo/auth/modular/login/service/impl/AuthServiceImpl.java

@@ -39,12 +39,15 @@ import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthGetPhoneValidCodeParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
 import vip.xiaonuo.auth.modular.login.param.AuthPhoneValidCodeLoginParam;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
 import vip.xiaonuo.auth.modular.login.result.AuthPicValidCodeResult;
+import vip.xiaonuo.auth.modular.login.result.WxAuthIUserInfo;
 import vip.xiaonuo.auth.modular.login.service.AuthService;
 import vip.xiaonuo.auth.modular.login.service.AuthService;
 import vip.xiaonuo.common.cache.CommonCacheOperator;
 import vip.xiaonuo.common.cache.CommonCacheOperator;
 import vip.xiaonuo.common.consts.CacheConstant;
 import vip.xiaonuo.common.consts.CacheConstant;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.util.CommonCryptogramUtil;
 import vip.xiaonuo.common.util.CommonCryptogramUtil;
 import vip.xiaonuo.common.util.CommonEmailUtil;
 import vip.xiaonuo.common.util.CommonEmailUtil;
+import vip.xiaonuo.common.util.CommonWxUtil;
+import vip.xiaonuo.common.wx.WxPayConfig;
 import vip.xiaonuo.dev.api.DevConfigApi;
 import vip.xiaonuo.dev.api.DevConfigApi;
 import vip.xiaonuo.dev.api.DevSmsApi;
 import vip.xiaonuo.dev.api.DevSmsApi;
 
 
@@ -80,6 +83,10 @@ public class AuthServiceImpl implements AuthService {
 
 
     @Resource
     @Resource
     private CommonCacheOperator commonCacheOperator;
     private CommonCacheOperator commonCacheOperator;
+    @Resource
+    private CommonWxUtil commonWxUtil;
+    @Resource
+    private WxPayConfig wxPayConfig;
 
 
 
 
     @Override
     @Override
@@ -520,5 +527,22 @@ public class AuthServiceImpl implements AuthService {
         }
         }
     }
     }
 
 
-
+    @Override
+    public WxAuthIUserInfo doLoginByCode(String code, String type) {
+        // 通过code 获取openId
+        String openId = commonWxUtil.getOpenId(code, wxPayConfig.getGetOpenIdUrl(), wxPayConfig.getAppId(), wxPayConfig.getAppSecret());
+        if (ObjectUtil.isEmpty(openId)) {
+            throw new CommonException("code码错误");
+        }
+        // 通过openId查询用户信息
+        SaBaseLoginUser saBaseClientLoginUser = loginUserApi.getUserByOpenId(openId);
+        // 根据手机号获取用户信息,根据B端或C端判断
+        if (ObjectUtil.isEmpty(saBaseClientLoginUser)) {
+            // 未查询到登录用户直接返回openId
+            return new WxAuthIUserInfo(openId, null);
+        }
+        // 执行B端登录
+        String token = execLoginB(saBaseClientLoginUser, AuthDeviceTypeEnum.MINI.getValue());
+        return new WxAuthIUserInfo(openId, token);
+    }
 }
 }

+ 123 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/controller/BizCouponRecordController.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.couponrecord.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.couponrecord.entity.BizCouponRecord;
+import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordAddParam;
+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 jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 优惠券记录控制器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ */
+@Tag(name = "优惠券记录控制器")
+@RestController
+@Validated
+public class BizCouponRecordController {
+
+    @Resource
+    private BizCouponRecordService bizCouponRecordService;
+
+    /**
+     * 获取优惠券记录分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    @Operation(summary = "获取优惠券记录分页")
+    @SaCheckPermission("/biz/couponrecord/page")
+    @GetMapping("/biz/couponrecord/page")
+    public CommonResult<Page<BizCouponRecord>> page(BizCouponRecordPageParam bizCouponRecordPageParam) {
+        return CommonResult.data(bizCouponRecordService.page(bizCouponRecordPageParam));
+    }
+
+    /**
+     * 添加优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    @Operation(summary = "添加优惠券记录")
+    @CommonLog("添加优惠券记录")
+    @SaCheckPermission("/biz/couponrecord/add")
+    @PostMapping("/biz/couponrecord/add")
+    public CommonResult<String> add(@RequestBody @Valid BizCouponRecordAddParam bizCouponRecordAddParam) {
+        bizCouponRecordService.add(bizCouponRecordAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    @Operation(summary = "编辑优惠券记录")
+    @CommonLog("编辑优惠券记录")
+    @SaCheckPermission("/biz/couponrecord/edit")
+    @PostMapping("/biz/couponrecord/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizCouponRecordEditParam bizCouponRecordEditParam) {
+        bizCouponRecordService.edit(bizCouponRecordEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    @Operation(summary = "删除优惠券记录")
+    @CommonLog("删除优惠券记录")
+    @SaCheckPermission("/biz/couponrecord/delete")
+    @PostMapping("/biz/couponrecord/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizCouponRecordIdParam> bizCouponRecordIdParamList) {
+        bizCouponRecordService.delete(bizCouponRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取优惠券记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    @Operation(summary = "获取优惠券记录详情")
+    @SaCheckPermission("/biz/couponrecord/detail")
+    @GetMapping("/biz/couponrecord/detail")
+    public CommonResult<BizCouponRecord> detail(@Valid BizCouponRecordIdParam bizCouponRecordIdParam) {
+        return CommonResult.data(bizCouponRecordService.detail(bizCouponRecordIdParam));
+    }
+}

+ 103 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/entity/BizCouponRecord.java

@@ -0,0 +1,103 @@
+/*
+ * 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.couponrecord.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 优惠券记录实体
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+@Setter
+@TableName("biz_coupon_record")
+public class BizCouponRecord {
+
+    /** 优惠券记录表id */
+    @TableId
+    @Schema(description = "优惠券记录表id")
+    private String id;
+
+    /** 优惠券编码 */
+    @Schema(description = "优惠券编码")
+    private String couponNo;
+
+    /** 优惠券生成时间 */
+    @Schema(description = "优惠券生成时间")
+    private Date time;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值记录表id */
+    @Schema(description = "充值记录表id")
+    private String rechargeRecordId;
+
+    /** 是否核销: 0.否 1.是 */
+    @Schema(description = "是否核销: 0.否 1.是")
+    private Boolean couponStatus;
+
+    /** 有效期开始时间 */
+    @Schema(description = "有效期开始时间")
+    private Date startTime;
+
+    /** 有效期截止时间 */
+    @Schema(description = "有效期截止时间")
+    private Date endTime;
+
+    /** 核销人 */
+    @Schema(description = "核销人")
+    private String destroyUser;
+
+    /** 核销时间 */
+    @Schema(description = "核销时间")
+    private Date destroyTime;
+
+    /** 核销门店 */
+    @Schema(description = "核销门店")
+    private String orgId;
+
+    /** 删除标志:NOT_DELETE 正常,DELETED 已删除 */
+    @Schema(description = "删除标志:NOT_DELETE 正常,DELETED 已删除")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 创建人 */
+    @Schema(description = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 创建时间 */
+    @Schema(description = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 修改时间 */
+    @Schema(description = "修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改人 */
+    @Schema(description = "修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/enums/BizCouponRecordEnum.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.couponrecord.enums;
+
+import lombok.Getter;
+
+/**
+ * 优惠券记录枚举
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+public enum BizCouponRecordEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizCouponRecordEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/mapper/BizCouponRecordMapper.java

@@ -0,0 +1,25 @@
+/*
+ * 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.couponrecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.couponrecord.entity.BizCouponRecord;
+
+/**
+ * 优惠券记录Mapper接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+public interface BizCouponRecordMapper extends BaseMapper<BizCouponRecord> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/mapper/mapping/BizCouponRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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.couponrecord.mapper.BizCouponRecordMapper">
+
+</mapper>

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

@@ -0,0 +1,74 @@
+/*
+ * 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.couponrecord.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 wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+@Setter
+public class BizCouponRecordAddParam {
+
+    /** 优惠券编码 */
+    @Schema(description = "优惠券编码")
+    private String couponNo;
+
+    /** 优惠券生成时间 */
+    @Schema(description = "优惠券生成时间")
+    private Date time;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值记录表id */
+    @Schema(description = "充值记录表id")
+    private String rechargeRecordId;
+
+    /** 是否核销: 0.否 1.是 */
+    @Schema(description = "是否核销: 0.否 1.是")
+    private Boolean couponStatus;
+
+    /** 有效期开始时间 */
+    @Schema(description = "有效期开始时间")
+    private Date startTime;
+
+    /** 有效期截止时间 */
+    @Schema(description = "有效期截止时间")
+    private Date endTime;
+
+    /** 核销人 */
+    @Schema(description = "核销人")
+    private String destroyUser;
+
+    /** 核销时间 */
+    @Schema(description = "核销时间")
+    private Date destroyTime;
+
+    /** 核销门店 */
+    @Schema(description = "核销门店")
+    private String orgId;
+
+}

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

@@ -0,0 +1,79 @@
+/*
+ * 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.couponrecord.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 wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+@Setter
+public class BizCouponRecordEditParam {
+
+    /** 优惠券记录表id */
+    @Schema(description = "优惠券记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 优惠券编码 */
+    @Schema(description = "优惠券编码")
+    private String couponNo;
+
+    /** 优惠券生成时间 */
+    @Schema(description = "优惠券生成时间")
+    private Date time;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值记录表id */
+    @Schema(description = "充值记录表id")
+    private String rechargeRecordId;
+
+    /** 是否核销: 0.否 1.是 */
+    @Schema(description = "是否核销: 0.否 1.是")
+    private Boolean couponStatus;
+
+    /** 有效期开始时间 */
+    @Schema(description = "有效期开始时间")
+    private Date startTime;
+
+    /** 有效期截止时间 */
+    @Schema(description = "有效期截止时间")
+    private Date endTime;
+
+    /** 核销人 */
+    @Schema(description = "核销人")
+    private String destroyUser;
+
+    /** 核销时间 */
+    @Schema(description = "核销时间")
+    private Date destroyTime;
+
+    /** 核销门店 */
+    @Schema(description = "核销门店")
+    private String orgId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/param/BizCouponRecordIdParam.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.couponrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 优惠券记录Id参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+@Setter
+public class BizCouponRecordIdParam {
+
+    /** 优惠券记录表id */
+    @Schema(description = "优惠券记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

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

@@ -0,0 +1,59 @@
+/*
+ * 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.couponrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 优惠券记录查询参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+@Getter
+@Setter
+public class BizCouponRecordPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /** 优惠券编码 */
+    @Schema(description = "优惠券编码")
+    private String couponNo;
+
+    /** 是否核销: 0.否 1.是 */
+    @Schema(description = "是否核销: 0.否 1.是")
+    private Boolean couponStatus;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/couponrecord/service/BizCouponRecordService.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.couponrecord.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.couponrecord.entity.BizCouponRecord;
+import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordAddParam;
+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 java.util.List;
+
+/**
+ * 优惠券记录Service接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+public interface BizCouponRecordService extends IService<BizCouponRecord> {
+
+    /**
+     * 获取优惠券记录分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    Page<BizCouponRecord> page(BizCouponRecordPageParam bizCouponRecordPageParam);
+
+    /**
+     * 添加优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    void add(BizCouponRecordAddParam bizCouponRecordAddParam);
+
+    /**
+     * 编辑优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    void edit(BizCouponRecordEditParam bizCouponRecordEditParam);
+
+    /**
+     * 删除优惠券记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    void delete(List<BizCouponRecordIdParam> bizCouponRecordIdParamList);
+
+    /**
+     * 获取优惠券记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     */
+    BizCouponRecord detail(BizCouponRecordIdParam bizCouponRecordIdParam);
+
+    /**
+     * 获取优惠券记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:38
+     **/
+    BizCouponRecord queryEntity(String id);
+}

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

@@ -0,0 +1,100 @@
+/*
+ * 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.couponrecord.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.couponrecord.entity.BizCouponRecord;
+import vip.xiaonuo.biz.modular.couponrecord.mapper.BizCouponRecordMapper;
+import vip.xiaonuo.biz.modular.couponrecord.param.BizCouponRecordAddParam;
+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 java.util.List;
+
+/**
+ * 优惠券记录Service接口实现类
+ *
+ * @author wulei
+ * @date  2025/02/06 17:38
+ **/
+@Service
+public class BizCouponRecordServiceImpl extends ServiceImpl<BizCouponRecordMapper, BizCouponRecord> implements BizCouponRecordService {
+
+    @Override
+    public Page<BizCouponRecord> page(BizCouponRecordPageParam bizCouponRecordPageParam) {
+        QueryWrapper<BizCouponRecord> queryWrapper = new QueryWrapper<BizCouponRecord>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizCouponRecordPageParam.getCouponNo())) {
+            queryWrapper.lambda().like(BizCouponRecord::getCouponNo, bizCouponRecordPageParam.getCouponNo());
+        }
+        if(ObjectUtil.isNotEmpty(bizCouponRecordPageParam.getCouponStatus())) {
+            queryWrapper.lambda().eq(BizCouponRecord::getCouponStatus, bizCouponRecordPageParam.getCouponStatus());
+        }
+        if(ObjectUtil.isAllNotEmpty(bizCouponRecordPageParam.getSortField(), bizCouponRecordPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizCouponRecordPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizCouponRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizCouponRecordPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizCouponRecord::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizCouponRecordAddParam bizCouponRecordAddParam) {
+        BizCouponRecord bizCouponRecord = BeanUtil.toBean(bizCouponRecordAddParam, BizCouponRecord.class);
+        this.save(bizCouponRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizCouponRecordEditParam bizCouponRecordEditParam) {
+        BizCouponRecord bizCouponRecord = this.queryEntity(bizCouponRecordEditParam.getId());
+        BeanUtil.copyProperties(bizCouponRecordEditParam, bizCouponRecord);
+        this.updateById(bizCouponRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizCouponRecordIdParam> bizCouponRecordIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizCouponRecordIdParamList, BizCouponRecordIdParam::getId));
+    }
+
+    @Override
+    public BizCouponRecord detail(BizCouponRecordIdParam bizCouponRecordIdParam) {
+        return this.queryEntity(bizCouponRecordIdParam.getId());
+    }
+
+    @Override
+    public BizCouponRecord queryEntity(String id) {
+        BizCouponRecord bizCouponRecord = this.getById(id);
+        if(ObjectUtil.isEmpty(bizCouponRecord)) {
+            throw new CommonException("优惠券记录不存在,id值为:{}", id);
+        }
+        return bizCouponRecord;
+    }
+}

+ 123 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/controller/BizRebateRecordController.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.rebaterecord.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.rebaterecord.entity.BizRebateRecord;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordAddParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordEditParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordIdParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordPageParam;
+import vip.xiaonuo.biz.modular.rebaterecord.service.BizRebateRecordService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 返利记录控制器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ */
+@Tag(name = "返利记录控制器")
+@RestController
+@Validated
+public class BizRebateRecordController {
+
+    @Resource
+    private BizRebateRecordService bizRebateRecordService;
+
+    /**
+     * 获取返利记录分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    @Operation(summary = "获取返利记录分页")
+    @SaCheckPermission("/biz/rebaterecord/page")
+    @GetMapping("/biz/rebaterecord/page")
+    public CommonResult<Page<BizRebateRecord>> page(BizRebateRecordPageParam bizRebateRecordPageParam) {
+        return CommonResult.data(bizRebateRecordService.page(bizRebateRecordPageParam));
+    }
+
+    /**
+     * 添加返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    @Operation(summary = "添加返利记录")
+    @CommonLog("添加返利记录")
+    @SaCheckPermission("/biz/rebaterecord/add")
+    @PostMapping("/biz/rebaterecord/add")
+    public CommonResult<String> add(@RequestBody @Valid BizRebateRecordAddParam bizRebateRecordAddParam) {
+        bizRebateRecordService.add(bizRebateRecordAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    @Operation(summary = "编辑返利记录")
+    @CommonLog("编辑返利记录")
+    @SaCheckPermission("/biz/rebaterecord/edit")
+    @PostMapping("/biz/rebaterecord/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizRebateRecordEditParam bizRebateRecordEditParam) {
+        bizRebateRecordService.edit(bizRebateRecordEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    @Operation(summary = "删除返利记录")
+    @CommonLog("删除返利记录")
+    @SaCheckPermission("/biz/rebaterecord/delete")
+    @PostMapping("/biz/rebaterecord/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizRebateRecordIdParam> bizRebateRecordIdParamList) {
+        bizRebateRecordService.delete(bizRebateRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取返利记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    @Operation(summary = "获取返利记录详情")
+    @SaCheckPermission("/biz/rebaterecord/detail")
+    @GetMapping("/biz/rebaterecord/detail")
+    public CommonResult<BizRebateRecord> detail(@Valid BizRebateRecordIdParam bizRebateRecordIdParam) {
+        return CommonResult.data(bizRebateRecordService.detail(bizRebateRecordIdParam));
+    }
+}

+ 79 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/entity/BizRebateRecord.java

@@ -0,0 +1,79 @@
+/*
+ * 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.rebaterecord.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 返利记录实体
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+@Setter
+@TableName("biz_rebate_record")
+public class BizRebateRecord {
+
+    /** 代金券记录id */
+    @TableId
+    @Schema(description = "代金券记录id")
+    private String id;
+
+    /** 代金券金额 */
+    @Schema(description = "代金券金额")
+    private BigDecimal rebateAmout;
+
+    /** 推荐人 */
+    @Schema(description = "推荐人")
+    private String recommendUserId;
+
+    /** 充值人 */
+    @Schema(description = "充值人")
+    private String rechargeUserId;
+
+    /** 代金券状态: 1. 待生效 2.已生效 */
+    @Schema(description = "代金券状态: 1. 待生效 2.已生效")
+    private String rebateStatus;
+
+    /** 删除标志:NOT_DELETE 正常,DELETED 已删除 */
+    @Schema(description = "删除标志:NOT_DELETE 正常,DELETED 已删除")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 创建人 */
+    @Schema(description = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 创建时间 */
+    @Schema(description = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 修改时间 */
+    @Schema(description = "修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改人 */
+    @Schema(description = "修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/enums/BizRebateRecordEnum.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.rebaterecord.enums;
+
+import lombok.Getter;
+
+/**
+ * 返利记录枚举
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+public enum BizRebateRecordEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizRebateRecordEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/mapper/BizRebateRecordMapper.java

@@ -0,0 +1,25 @@
+/*
+ * 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.rebaterecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.rebaterecord.entity.BizRebateRecord;
+
+/**
+ * 返利记录Mapper接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+public interface BizRebateRecordMapper extends BaseMapper<BizRebateRecord> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/mapper/mapping/BizRebateRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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.rebaterecord.mapper.BizRebateRecordMapper">
+
+</mapper>

+ 50 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordAddParam.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.rebaterecord.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 wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+@Setter
+public class BizRebateRecordAddParam {
+
+    /** 代金券金额 */
+    @Schema(description = "代金券金额")
+    private BigDecimal rebateAmout;
+
+    /** 推荐人 */
+    @Schema(description = "推荐人")
+    private String recommendUserId;
+
+    /** 充值人 */
+    @Schema(description = "充值人")
+    private String rechargeUserId;
+
+    /** 代金券状态: 1. 待生效 2.已生效 */
+    @Schema(description = "代金券状态: 1. 待生效 2.已生效")
+    private String rebateStatus;
+
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordEditParam.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.rebaterecord.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 wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+@Setter
+public class BizRebateRecordEditParam {
+
+    /** 代金券记录id */
+    @Schema(description = "代金券记录id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 代金券金额 */
+    @Schema(description = "代金券金额")
+    private BigDecimal rebateAmout;
+
+    /** 推荐人 */
+    @Schema(description = "推荐人")
+    private String recommendUserId;
+
+    /** 充值人 */
+    @Schema(description = "充值人")
+    private String rechargeUserId;
+
+    /** 代金券状态: 1. 待生效 2.已生效 */
+    @Schema(description = "代金券状态: 1. 待生效 2.已生效")
+    private String rebateStatus;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordIdParam.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.rebaterecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 返利记录Id参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+@Setter
+public class BizRebateRecordIdParam {
+
+    /** 代金券记录id */
+    @Schema(description = "代金券记录id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 63 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/param/BizRebateRecordPageParam.java

@@ -0,0 +1,63 @@
+/*
+ * 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.rebaterecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 返利记录查询参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+@Getter
+@Setter
+public class BizRebateRecordPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /** 推荐人 */
+    @Schema(description = "推荐人")
+    private String recommendUserId;
+
+    /** 充值人 */
+    @Schema(description = "充值人")
+    private String rechargeUserId;
+
+    /** 代金券状态: 1. 待生效 2.已生效 */
+    @Schema(description = "代金券状态: 1. 待生效 2.已生效")
+    private String rebateStatus;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/service/BizRebateRecordService.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.rebaterecord.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.rebaterecord.entity.BizRebateRecord;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordAddParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordEditParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordIdParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordPageParam;
+
+import java.util.List;
+
+/**
+ * 返利记录Service接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+public interface BizRebateRecordService extends IService<BizRebateRecord> {
+
+    /**
+     * 获取返利记录分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    Page<BizRebateRecord> page(BizRebateRecordPageParam bizRebateRecordPageParam);
+
+    /**
+     * 添加返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    void add(BizRebateRecordAddParam bizRebateRecordAddParam);
+
+    /**
+     * 编辑返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    void edit(BizRebateRecordEditParam bizRebateRecordEditParam);
+
+    /**
+     * 删除返利记录
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    void delete(List<BizRebateRecordIdParam> bizRebateRecordIdParamList);
+
+    /**
+     * 获取返利记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     */
+    BizRebateRecord detail(BizRebateRecordIdParam bizRebateRecordIdParam);
+
+    /**
+     * 获取返利记录详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:39
+     **/
+    BizRebateRecord queryEntity(String id);
+}

+ 103 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rebaterecord/service/impl/BizRebateRecordServiceImpl.java

@@ -0,0 +1,103 @@
+/*
+ * 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.rebaterecord.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.rebaterecord.entity.BizRebateRecord;
+import vip.xiaonuo.biz.modular.rebaterecord.mapper.BizRebateRecordMapper;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordAddParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordEditParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordIdParam;
+import vip.xiaonuo.biz.modular.rebaterecord.param.BizRebateRecordPageParam;
+import vip.xiaonuo.biz.modular.rebaterecord.service.BizRebateRecordService;
+
+import java.util.List;
+
+/**
+ * 返利记录Service接口实现类
+ *
+ * @author wulei
+ * @date  2025/02/06 17:39
+ **/
+@Service
+public class BizRebateRecordServiceImpl extends ServiceImpl<BizRebateRecordMapper, BizRebateRecord> implements BizRebateRecordService {
+
+    @Override
+    public Page<BizRebateRecord> page(BizRebateRecordPageParam bizRebateRecordPageParam) {
+        QueryWrapper<BizRebateRecord> queryWrapper = new QueryWrapper<BizRebateRecord>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizRebateRecordPageParam.getRecommendUserId())) {
+            queryWrapper.lambda().eq(BizRebateRecord::getRecommendUserId, bizRebateRecordPageParam.getRecommendUserId());
+        }
+        if(ObjectUtil.isNotEmpty(bizRebateRecordPageParam.getRechargeUserId())) {
+            queryWrapper.lambda().eq(BizRebateRecord::getRechargeUserId, bizRebateRecordPageParam.getRechargeUserId());
+        }
+        if(ObjectUtil.isNotEmpty(bizRebateRecordPageParam.getRebateStatus())) {
+            queryWrapper.lambda().eq(BizRebateRecord::getRebateStatus, bizRebateRecordPageParam.getRebateStatus());
+        }
+        if(ObjectUtil.isAllNotEmpty(bizRebateRecordPageParam.getSortField(), bizRebateRecordPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizRebateRecordPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizRebateRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizRebateRecordPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizRebateRecord::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizRebateRecordAddParam bizRebateRecordAddParam) {
+        BizRebateRecord bizRebateRecord = BeanUtil.toBean(bizRebateRecordAddParam, BizRebateRecord.class);
+        this.save(bizRebateRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizRebateRecordEditParam bizRebateRecordEditParam) {
+        BizRebateRecord bizRebateRecord = this.queryEntity(bizRebateRecordEditParam.getId());
+        BeanUtil.copyProperties(bizRebateRecordEditParam, bizRebateRecord);
+        this.updateById(bizRebateRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizRebateRecordIdParam> bizRebateRecordIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizRebateRecordIdParamList, BizRebateRecordIdParam::getId));
+    }
+
+    @Override
+    public BizRebateRecord detail(BizRebateRecordIdParam bizRebateRecordIdParam) {
+        return this.queryEntity(bizRebateRecordIdParam.getId());
+    }
+
+    @Override
+    public BizRebateRecord queryEntity(String id) {
+        BizRebateRecord bizRebateRecord = this.getById(id);
+        if(ObjectUtil.isEmpty(bizRebateRecord)) {
+            throw new CommonException("返利记录不存在,id值为:{}", id);
+        }
+        return bizRebateRecord;
+    }
+}

+ 17 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargeplanconfig/controller/BizRechargePlanConfigController.java

@@ -13,6 +13,7 @@
 package vip.xiaonuo.biz.modular.rechargeplanconfig.controller;
 package vip.xiaonuo.biz.modular.rechargeplanconfig.controller;
 
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
@@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.annotation.CommonNoRepeat;
 import vip.xiaonuo.common.annotation.CommonNoRepeat;
+import vip.xiaonuo.common.pojo.CommonEntity;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.biz.modular.rechargeplanconfig.entity.BizRechargePlanConfig;
 import vip.xiaonuo.biz.modular.rechargeplanconfig.entity.BizRechargePlanConfig;
 import vip.xiaonuo.biz.modular.rechargeplanconfig.param.BizRechargePlanConfigAddParam;
 import vip.xiaonuo.biz.modular.rechargeplanconfig.param.BizRechargePlanConfigAddParam;
@@ -156,5 +158,20 @@ public class BizRechargePlanConfigController {
         return CommonResult.ok();
         return CommonResult.ok();
     }
     }
 
 
+    /**
+     * 获取充值方案配置分页
+     *
+     * @author wulei
+     * @date 2025/02/04 16:32
+     */
+    @Operation(summary = "获取充值方案配置分页")
+    @GetMapping("/biz/rechargeplanconfig/list")
+    public CommonResult<List<BizRechargePlanConfig>> list() {
+        List<BizRechargePlanConfig> planConfigs = bizRechargePlanConfigService.list(new LambdaQueryWrapper<BizRechargePlanConfig>()
+                .eq(BizRechargePlanConfig::getStatus, "ENABLE")
+                .orderByDesc(CommonEntity::getCreateTime));
+        return CommonResult.data(planConfigs);
+    }
+
 
 
 }
 }

+ 123 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/controller/BizRechargeRecordController.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.rechargerecord.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.rechargerecord.entity.BizRechargeRecord;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordAddParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordEditParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordIdParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordPageParam;
+import vip.xiaonuo.biz.modular.rechargerecord.service.BizRechargeRecordService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 充值记录表控制器
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ */
+@Tag(name = "充值记录表控制器")
+@RestController
+@Validated
+public class BizRechargeRecordController {
+
+    @Resource
+    private BizRechargeRecordService bizRechargeRecordService;
+
+    /**
+     * 获取充值记录表分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    @Operation(summary = "获取充值记录表分页")
+    @SaCheckPermission("/biz/rechargerecord/page")
+    @GetMapping("/biz/rechargerecord/page")
+    public CommonResult<Page<BizRechargeRecord>> page(BizRechargeRecordPageParam bizRechargeRecordPageParam) {
+        return CommonResult.data(bizRechargeRecordService.page(bizRechargeRecordPageParam));
+    }
+
+    /**
+     * 添加充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    @Operation(summary = "添加充值记录表")
+    @CommonLog("添加充值记录表")
+    @SaCheckPermission("/biz/rechargerecord/add")
+    @PostMapping("/biz/rechargerecord/add")
+    public CommonResult<String> add(@RequestBody @Valid BizRechargeRecordAddParam bizRechargeRecordAddParam) {
+        bizRechargeRecordService.add(bizRechargeRecordAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    @Operation(summary = "编辑充值记录表")
+    @CommonLog("编辑充值记录表")
+    @SaCheckPermission("/biz/rechargerecord/edit")
+    @PostMapping("/biz/rechargerecord/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizRechargeRecordEditParam bizRechargeRecordEditParam) {
+        bizRechargeRecordService.edit(bizRechargeRecordEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    @Operation(summary = "删除充值记录表")
+    @CommonLog("删除充值记录表")
+    @SaCheckPermission("/biz/rechargerecord/delete")
+    @PostMapping("/biz/rechargerecord/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizRechargeRecordIdParam> bizRechargeRecordIdParamList) {
+        bizRechargeRecordService.delete(bizRechargeRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取充值记录表详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    @Operation(summary = "获取充值记录表详情")
+    @SaCheckPermission("/biz/rechargerecord/detail")
+    @GetMapping("/biz/rechargerecord/detail")
+    public CommonResult<BizRechargeRecord> detail(@Valid BizRechargeRecordIdParam bizRechargeRecordIdParam) {
+        return CommonResult.data(bizRechargeRecordService.detail(bizRechargeRecordIdParam));
+    }
+}

+ 127 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/entity/BizRechargeRecord.java

@@ -0,0 +1,127 @@
+/*
+ * 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.rechargerecord.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 充值记录表实体
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+@Setter
+@TableName("biz_recharge_record")
+public class BizRechargeRecord {
+
+    /** 充值记录表id */
+    @TableId
+    @Schema(description = "充值记录表id")
+    private String id;
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值金额 */
+    @Schema(description = "充值金额")
+    private BigDecimal rechargeAmount;
+
+    /** 充值时间 */
+    @Schema(description = "充值时间")
+    private Date rechargeTime;
+
+    /** 原账户余额 */
+    @Schema(description = "原账户余额")
+    private BigDecimal oldAccountBalance;
+
+    /** 原代金券金额 */
+    @Schema(description = "原代金券金额")
+    private BigDecimal oldVoucherBalance;
+
+    /** 新账户余额 */
+    @Schema(description = "新账户余额")
+    private BigDecimal newAccountBalance;
+
+    /** 新代金券金额 */
+    @Schema(description = "新代金券金额")
+    private BigDecimal newVoucherBalance;
+
+    /** 推荐人的返点比例 */
+    @Schema(description = "推荐人的返点比例")
+    private BigDecimal rebateRatio;
+
+    /** 推荐人具体返点金额 */
+    @Schema(description = "推荐人具体返点金额")
+    private BigDecimal rebateAmount;
+
+    /** 优惠券(蛋糕券)数量 */
+    @Schema(description = "优惠券(蛋糕券)数量")
+    private Integer couponNum;
+
+    /** 优惠券金额 */
+    @Schema(description = "优惠券金额")
+    private BigDecimal couponAmount;
+
+    /** 系统订单号 */
+    @Schema(description = "系统订单号")
+    private String orderNo;
+
+    /** 微信订单编号 */
+    @Schema(description = "微信订单编号")
+    private String wxOrderNo;
+
+    /** 是否支付 0.未支付 1.已支付 */
+    @Schema(description = "是否支付 0.未支付 1.已支付")
+    private Boolean isPay;
+
+    /** 支付时间 */
+    @Schema(description = "支付时间")
+    private Date payTime;
+
+    /** 删除标志:NOT_DELETE 正常,DELETED 已删除 */
+    @Schema(description = "删除标志:NOT_DELETE 正常,DELETED 已删除")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 创建人 */
+    @Schema(description = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 创建时间 */
+    @Schema(description = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 修改时间 */
+    @Schema(description = "修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改人 */
+    @Schema(description = "修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/enums/BizRechargeRecordEnum.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.rechargerecord.enums;
+
+import lombok.Getter;
+
+/**
+ * 充值记录表枚举
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+public enum BizRechargeRecordEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizRechargeRecordEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/mapper/BizRechargeRecordMapper.java

@@ -0,0 +1,25 @@
+/*
+ * 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.rechargerecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.rechargerecord.entity.BizRechargeRecord;
+
+/**
+ * 充值记录表Mapper接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+public interface BizRechargeRecordMapper extends BaseMapper<BizRechargeRecord> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/mapper/mapping/BizRechargeRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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.rechargerecord.mapper.BizRechargeRecordMapper">
+
+</mapper>

+ 98 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordAddParam.java

@@ -0,0 +1,98 @@
+/*
+ * 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.rechargerecord.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 wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+@Setter
+public class BizRechargeRecordAddParam {
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值金额 */
+    @Schema(description = "充值金额")
+    private BigDecimal rechargeAmount;
+
+    /** 充值时间 */
+    @Schema(description = "充值时间")
+    private Date rechargeTime;
+
+    /** 原账户余额 */
+    @Schema(description = "原账户余额")
+    private BigDecimal oldAccountBalance;
+
+    /** 原代金券金额 */
+    @Schema(description = "原代金券金额")
+    private BigDecimal oldVoucherBalance;
+
+    /** 新账户余额 */
+    @Schema(description = "新账户余额")
+    private BigDecimal newAccountBalance;
+
+    /** 新代金券金额 */
+    @Schema(description = "新代金券金额")
+    private BigDecimal newVoucherBalance;
+
+    /** 推荐人的返点比例 */
+    @Schema(description = "推荐人的返点比例")
+    private BigDecimal rebateRatio;
+
+    /** 推荐人具体返点金额 */
+    @Schema(description = "推荐人具体返点金额")
+    private BigDecimal rebateAmount;
+
+    /** 优惠券(蛋糕券)数量 */
+    @Schema(description = "优惠券(蛋糕券)数量")
+    private Integer couponNum;
+
+    /** 优惠券金额 */
+    @Schema(description = "优惠券金额")
+    private BigDecimal couponAmount;
+
+    /** 系统订单号 */
+    @Schema(description = "系统订单号")
+    private String orderNo;
+
+    /** 微信订单编号 */
+    @Schema(description = "微信订单编号")
+    private String wxOrderNo;
+
+    /** 是否支付 0.未支付 1.已支付 */
+    @Schema(description = "是否支付 0.未支付 1.已支付")
+    private Boolean isPay;
+
+    /** 支付时间 */
+    @Schema(description = "支付时间")
+    private Date payTime;
+
+}

+ 103 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordEditParam.java

@@ -0,0 +1,103 @@
+/*
+ * 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.rechargerecord.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 wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+@Setter
+public class BizRechargeRecordEditParam {
+
+    /** 充值记录表id */
+    @Schema(description = "充值记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 充值方案id */
+    @Schema(description = "充值方案id")
+    private String rechargePlanId;
+
+    /** 充值金额 */
+    @Schema(description = "充值金额")
+    private BigDecimal rechargeAmount;
+
+    /** 充值时间 */
+    @Schema(description = "充值时间")
+    private Date rechargeTime;
+
+    /** 原账户余额 */
+    @Schema(description = "原账户余额")
+    private BigDecimal oldAccountBalance;
+
+    /** 原代金券金额 */
+    @Schema(description = "原代金券金额")
+    private BigDecimal oldVoucherBalance;
+
+    /** 新账户余额 */
+    @Schema(description = "新账户余额")
+    private BigDecimal newAccountBalance;
+
+    /** 新代金券金额 */
+    @Schema(description = "新代金券金额")
+    private BigDecimal newVoucherBalance;
+
+    /** 推荐人的返点比例 */
+    @Schema(description = "推荐人的返点比例")
+    private BigDecimal rebateRatio;
+
+    /** 推荐人具体返点金额 */
+    @Schema(description = "推荐人具体返点金额")
+    private BigDecimal rebateAmount;
+
+    /** 优惠券(蛋糕券)数量 */
+    @Schema(description = "优惠券(蛋糕券)数量")
+    private Integer couponNum;
+
+    /** 优惠券金额 */
+    @Schema(description = "优惠券金额")
+    private BigDecimal couponAmount;
+
+    /** 系统订单号 */
+    @Schema(description = "系统订单号")
+    private String orderNo;
+
+    /** 微信订单编号 */
+    @Schema(description = "微信订单编号")
+    private String wxOrderNo;
+
+    /** 是否支付 0.未支付 1.已支付 */
+    @Schema(description = "是否支付 0.未支付 1.已支付")
+    private Boolean isPay;
+
+    /** 支付时间 */
+    @Schema(description = "支付时间")
+    private Date payTime;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordIdParam.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.rechargerecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 充值记录表Id参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+@Setter
+public class BizRechargeRecordIdParam {
+
+    /** 充值记录表id */
+    @Schema(description = "充值记录表id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 63 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/param/BizRechargeRecordPageParam.java

@@ -0,0 +1,63 @@
+/*
+ * 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.rechargerecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 充值记录表查询参数
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+@Getter
+@Setter
+public class BizRechargeRecordPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /** 用户id */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /** 充值时间开始 */
+    @Schema(description = "充值时间开始")
+    private String startRechargeTime;
+
+    /** 充值时间结束 */
+    @Schema(description = "充值时间结束")
+    private String endRechargeTime;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/rechargerecord/service/BizRechargeRecordService.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.rechargerecord.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.rechargerecord.entity.BizRechargeRecord;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordAddParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordEditParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordIdParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordPageParam;
+
+import java.util.List;
+
+/**
+ * 充值记录表Service接口
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+public interface BizRechargeRecordService extends IService<BizRechargeRecord> {
+
+    /**
+     * 获取充值记录表分页
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    Page<BizRechargeRecord> page(BizRechargeRecordPageParam bizRechargeRecordPageParam);
+
+    /**
+     * 添加充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    void add(BizRechargeRecordAddParam bizRechargeRecordAddParam);
+
+    /**
+     * 编辑充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    void edit(BizRechargeRecordEditParam bizRechargeRecordEditParam);
+
+    /**
+     * 删除充值记录表
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    void delete(List<BizRechargeRecordIdParam> bizRechargeRecordIdParamList);
+
+    /**
+     * 获取充值记录表详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     */
+    BizRechargeRecord detail(BizRechargeRecordIdParam bizRechargeRecordIdParam);
+
+    /**
+     * 获取充值记录表详情
+     *
+     * @author wulei
+     * @date  2025/02/06 17:41
+     **/
+    BizRechargeRecord queryEntity(String id);
+}

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

@@ -0,0 +1,100 @@
+/*
+ * 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.rechargerecord.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.rechargerecord.entity.BizRechargeRecord;
+import vip.xiaonuo.biz.modular.rechargerecord.mapper.BizRechargeRecordMapper;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordAddParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordEditParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordIdParam;
+import vip.xiaonuo.biz.modular.rechargerecord.param.BizRechargeRecordPageParam;
+import vip.xiaonuo.biz.modular.rechargerecord.service.BizRechargeRecordService;
+
+import java.util.List;
+
+/**
+ * 充值记录表Service接口实现类
+ *
+ * @author wulei
+ * @date  2025/02/06 17:41
+ **/
+@Service
+public class BizRechargeRecordServiceImpl extends ServiceImpl<BizRechargeRecordMapper, BizRechargeRecord> implements BizRechargeRecordService {
+
+    @Override
+    public Page<BizRechargeRecord> page(BizRechargeRecordPageParam bizRechargeRecordPageParam) {
+        QueryWrapper<BizRechargeRecord> queryWrapper = new QueryWrapper<BizRechargeRecord>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizRechargeRecordPageParam.getUserId())) {
+            queryWrapper.lambda().like(BizRechargeRecord::getUserId, bizRechargeRecordPageParam.getUserId());
+        }
+        if(ObjectUtil.isNotEmpty(bizRechargeRecordPageParam.getStartRechargeTime()) && ObjectUtil.isNotEmpty(bizRechargeRecordPageParam.getEndRechargeTime())) {
+            queryWrapper.lambda().between(BizRechargeRecord::getRechargeTime, bizRechargeRecordPageParam.getStartRechargeTime(), bizRechargeRecordPageParam.getEndRechargeTime());
+        }
+        if(ObjectUtil.isAllNotEmpty(bizRechargeRecordPageParam.getSortField(), bizRechargeRecordPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizRechargeRecordPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizRechargeRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizRechargeRecordPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizRechargeRecord::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizRechargeRecordAddParam bizRechargeRecordAddParam) {
+        BizRechargeRecord bizRechargeRecord = BeanUtil.toBean(bizRechargeRecordAddParam, BizRechargeRecord.class);
+        this.save(bizRechargeRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizRechargeRecordEditParam bizRechargeRecordEditParam) {
+        BizRechargeRecord bizRechargeRecord = this.queryEntity(bizRechargeRecordEditParam.getId());
+        BeanUtil.copyProperties(bizRechargeRecordEditParam, bizRechargeRecord);
+        this.updateById(bizRechargeRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizRechargeRecordIdParam> bizRechargeRecordIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizRechargeRecordIdParamList, BizRechargeRecordIdParam::getId));
+    }
+
+    @Override
+    public BizRechargeRecord detail(BizRechargeRecordIdParam bizRechargeRecordIdParam) {
+        return this.queryEntity(bizRechargeRecordIdParam.getId());
+    }
+
+    @Override
+    public BizRechargeRecord queryEntity(String id) {
+        BizRechargeRecord bizRechargeRecord = this.getById(id);
+        if(ObjectUtil.isEmpty(bizRechargeRecord)) {
+            throw new CommonException("充值记录表不存在,id值为:{}", id);
+        }
+        return bizRechargeRecord;
+    }
+}

+ 6 - 2
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java

@@ -316,9 +316,9 @@ public class BizUserController {
      * @return
      * @return
      */
      */
     @Operation(summary = "小程序注册")
     @Operation(summary = "小程序注册")
-    @GetMapping("/auth/c/wxRegister")
+    @PostMapping("/auth/c/wxRegister")
     @CommonNoRepeat
     @CommonNoRepeat
-    public CommonResult<String> wxRegister(WxUserRegisterParam wxUserRegisterParam) {
+    public CommonResult<String> wxRegister(@RequestBody @Valid WxUserRegisterParam wxUserRegisterParam) {
         bizUserService.wxRegister(wxUserRegisterParam);
         bizUserService.wxRegister(wxUserRegisterParam);
         return CommonResult.ok();
         return CommonResult.ok();
     }
     }
@@ -337,4 +337,8 @@ public class BizUserController {
     }
     }
 
 
 
 
+
+
+
+
 }
 }

+ 1 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/WxUserRegisterParam.java

@@ -32,6 +32,7 @@ public class WxUserRegisterParam {
     private String name;
     private String name;
 
 
     @Schema(description = "短信验证码")
     @Schema(description = "短信验证码")
+    @NotBlank(message = "短信验证码不能为空")
     private String messageCode;
     private String messageCode;
 
 
     @Schema(description = "推荐人编码")
     @Schema(description = "推荐人编码")

+ 13 - 9
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java

@@ -52,6 +52,7 @@ import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
@@ -127,7 +128,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     private CommonCacheOperator commonCacheOperator;
     private CommonCacheOperator commonCacheOperator;
     @Resource
     @Resource
     private DevSmsApi devSmsApi;
     private DevSmsApi devSmsApi;
-
+    @Value("${aliyun.templateCode}")
+    private String templateCode;
 
 
     @Override
     @Override
     public Page<BizUser> page(BizUserPageParam bizUserPageParam) {
     public Page<BizUser> page(BizUserPageParam bizUserPageParam) {
@@ -772,15 +774,13 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public void wxRegister(WxUserRegisterParam wxUserRegisterParam) {
     public void wxRegister(WxUserRegisterParam wxUserRegisterParam) {
         // 校验短信验证码
         // 校验短信验证码
-        String messageCode = commonCacheOperator.get(wxUserRegisterParam.getPhone()) + "";
+        Object messageCode = commonCacheOperator.get(wxUserRegisterParam.getPhone());
         if (ObjectUtil.isEmpty(messageCode)) {
         if (ObjectUtil.isEmpty(messageCode)) {
-            throw new CommonException("验证码不存在");
+            throw new CommonException("短信验证码已过期");
         }
         }
         if (ObjectUtil.notEqual(messageCode, wxUserRegisterParam.getMessageCode())) {
         if (ObjectUtil.notEqual(messageCode, wxUserRegisterParam.getMessageCode())) {
-            throw new CommonException("验证码错误");
+            throw new CommonException("短信验证码错误");
         }
         }
-//        //校验通过删除缓存
-//        commonCacheOperator.remove(wxUserRegisterParam.getPhone());
 
 
         String roleId = "";
         String roleId = "";
         // 保存用户信息
         // 保存用户信息
@@ -816,7 +816,7 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             }
             }
         }
         }
         // 校验openId或者手机号是否存在
         // 校验openId或者手机号是否存在
-        if (ObjectUtil.isNull(baseMapper.selectOne(new LambdaQueryWrapper<BizUser>()
+        if (ObjectUtil.isNotNull(baseMapper.selectOne(new LambdaQueryWrapper<BizUser>()
                 .eq(BizUser::getOpenId, wxUserRegisterParam.getOpenId())
                 .eq(BizUser::getOpenId, wxUserRegisterParam.getOpenId())
                 .or()
                 .or()
                 .eq(BizUser::getAccount, wxUserRegisterParam.getPhone())
                 .eq(BizUser::getAccount, wxUserRegisterParam.getPhone())
@@ -829,23 +829,27 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
         bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
         // 设置状态
         // 设置状态
         bizUser.setUserStatus("ENABLE");
         bizUser.setUserStatus("ENABLE");
+        bizUser.setOpenId(wxUserRegisterParam.getOpenId());
         //生成推荐码
         //生成推荐码
         bizUser.setUserReferralCode(DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN) + RandomUtil.randomNumbers(4));
         bizUser.setUserReferralCode(DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN) + RandomUtil.randomNumbers(4));
         bizUser.setName(wxUserRegisterParam.getName());
         bizUser.setName(wxUserRegisterParam.getName());
         this.save(bizUser);
         this.save(bizUser);
         sysRoleApi.grantUserRole(bizUser.getId(), roleId);
         sysRoleApi.grantUserRole(bizUser.getId(), roleId);
+        //校验通过删除缓存
+        commonCacheOperator.remove(wxUserRegisterParam.getPhone());
     }
     }
 
 
     @Override
     @Override
     public void smsSend(SmsSendParam smsSendParam) {
     public void smsSend(SmsSendParam smsSendParam) {
         // 查询缓存是否存在
         // 查询缓存是否存在
-        String messageCode = commonCacheOperator.get(smsSendParam.getPhone()) + "";
+        Object messageCode = commonCacheOperator.get(smsSendParam.getPhone());
         if (ObjectUtil.isNotEmpty(messageCode)) {
         if (ObjectUtil.isNotEmpty(messageCode)) {
             throw new CommonException("请勿重复发送");
             throw new CommonException("请勿重复发送");
         }
         }
         String code = RandomUtil.randomNumbers(5);
         String code = RandomUtil.randomNumbers(5);
         //发送短信
         //发送短信
-        devSmsApi.sendSmsAliyun(smsSendParam.getPhone(), null, "SMS_465365543", "{\"code\":\"" + code + "\"}");
+        devSmsApi.sendSmsAliyun(smsSendParam.getPhone(), null, templateCode, "{\"code\":\"" + code + "\"}");
+        //保存5分钟
         commonCacheOperator.put(smsSendParam.getPhone(), code, 300);
         commonCacheOperator.put(smsSendParam.getPhone(), code, 300);
     }
     }
 }
 }

+ 5 - 0
snowy-plugin/snowy-plugin-client/src/main/java/vip/xiaonuo/client/modular/user/provider/ClientLoginUserApiProvider.java

@@ -71,6 +71,11 @@ public class ClientLoginUserApiProvider implements SaBaseLoginUserApi {
         return null;
         return null;
     }
     }
 
 
+    @Override
+    public SaBaseLoginUser getUserByOpenId(String openId) {
+        return null;
+    }
+
     /**
     /**
      * 根据账号获取C端用户信息,查不到则返回null
      * 根据账号获取C端用户信息,查不到则返回null
      *
      *

+ 4 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java

@@ -69,6 +69,10 @@ public class SysUser extends CommonEntity {
     @Schema(description = "姓名")
     @Schema(description = "姓名")
     private String name;
     private String name;
 
 
+    /** openId */
+    @Schema(description = "openId")
+    private String openId;
+
     /**用户推荐码*/
     /**用户推荐码*/
     @Schema(description = "用户推荐码")
     @Schema(description = "用户推荐码")
     private String userReferralCode;
     private String userReferralCode;

+ 5 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/provider/SysLoginUserApiProvider.java

@@ -70,6 +70,11 @@ public class SysLoginUserApiProvider implements SaBaseLoginUserApi {
         return sysUserService.getUserByAccount(account);
         return sysUserService.getUserByAccount(account);
     }
     }
 
 
+    @Override
+    public SaBaseLoginUser getUserByOpenId(String openId) {
+        return sysUserService.getUserByOpenId(openId);
+    }
+
     /**
     /**
      * 不实现C端用户信息
      * 不实现C端用户信息
      *
      *

+ 7 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/SysUserService.java

@@ -61,6 +61,13 @@ public interface SysUserService extends IService<SysUser> {
      */
      */
     SysLoginUser getUserByPhone(String phone);
     SysLoginUser getUserByPhone(String phone);
 
 
+    /**
+     * 根据openId获取用户信息,查不到则返回null
+     * @param phone
+     * @return
+     */
+    SysLoginUser getUserByOpenId(String phone);
+
     /**
     /**
      * 根据邮箱获取用户信息,查不到则返回null
      * 根据邮箱获取用户信息,查不到则返回null
      *
      *

+ 10 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/service/impl/SysUserServiceImpl.java

@@ -209,6 +209,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return null;
         return null;
     }
     }
 
 
+    @Override
+    public SysLoginUser getUserByOpenId(String openId) {
+        SysUser sysUser = this.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getOpenId, openId));
+        if (ObjectUtil.isNotEmpty(sysUser)) {
+            transService.transOne(sysUser);
+            return BeanUtil.copyProperties(sysUser, SysLoginUser.class);
+        }
+        return null;
+    }
+
     @Override
     @Override
     public SysLoginUser getUserByEmail(String email) {
     public SysLoginUser getUserByEmail(String email) {
         SysUser sysUser = this.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));
         SysUser sysUser = this.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));

+ 1 - 0
snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java

@@ -125,6 +125,7 @@ public class GlobalConfigure implements WebMvcConfigurer {
             /* 小程序注册使用 */
             /* 小程序注册使用 */
             "/auth/c/wxRegister",
             "/auth/c/wxRegister",
             "/auth/c/smsSend",
             "/auth/c/smsSend",
+            "/auth/c/doLoginByCode",
 
 
             "/auth/b/getPicCaptcha",
             "/auth/b/getPicCaptcha",
             "/auth/b/getPhoneValidCode",
             "/auth/b/getPhoneValidCode",

+ 1 - 1
snowy-web-app/src/main/resources/application.properties

@@ -143,4 +143,4 @@ wx.pay.apiV3Key=whzl4008809192whzl40088091924567
 wx.pay.mchSerialNo=7919E41AEB658BBE87EAA9EDBB08D20E5B6F22BA
 wx.pay.mchSerialNo=7919E41AEB658BBE87EAA9EDBB08D20E5B6F22BA
 wx.pay.privateKey=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9o423YGD1O3Go/fEuxZcY9gkfxdXWSqTpB//EE8WnODQvFanbhn2QJ8rkK9NzWXgkxIbDJvJ4VYF3KREvLfsTyOZThZs2yaXoFCATv4J8ee//ppMcVOU04R45PNCoL9nM3M/Cpr1xSlN/ehldxlD5C8+LFFj6qbqqJ1Xh0gaTW1YABAEGUcI6J7bOpcGIYu7vdEn551ARSOpyN8sJJu8eozw6cKxeRwQeEmvIzxWy125JrBPo7dllkTgqJN4XaNlDxpIZG+O4dKsDGwZsLhinS3nKdJyYB3ziWBSQYd0okvNFhAQhJRA9e/c8+KSt/3syOA8uHKtpqo7gsI0/q4A9AgMBAAECggEAQy8YW+kHMJo4sDgXJAzYdP1lSh5anaqgNfahhCPFGHLu+edg3+cLwPB4DtH//ZOq3svJOoYnzL3uOfsQnXhaxS2de+WPkZ9q6YeHvbdRUSwZ/KZU4+qnsU432OtUuOEK9mscJ8fOwb4lSrpFFlXWBgVLJ+izhUpwWSvKX1B7B+TtCdG2A7nD7PmXgtgmweHeBY4SUeE9dYkM4XtW7bRi83SEkyb7l5KpxPMvDgTir/uBROxK40tYwOskp/HRFgWBCVPUe+5m3cvgKy+3iTIUTwKm3bXBmfEuniNz4orblfujDhyljPUU9s4ERmgYB8GKysZM1/nEgZ1AMWeO/WGyQQKBgQDyBxdhYLxxcN44M9aUn4oE6Wj3SFB8EvIs5FX6BMPTw1WIWm4ubHHKJq2W9AGZHuOWkq87G01Z1rwijP/vOk7Eu7JIJNPjY5CSC4+PCer5m1PLaNzvI7YEhrdrztBaG4EV2JN8eFAw7V2t14+L4kXhJdELTGBfxmeEDPU0V7U19QKBgQDIljZBsKfdcmh42ClIoNz5BnZR7CRGp5TKLx9yZzWEuOAaxcuCLChCSME04DnoZuYAmB6y1aESMyn3eqC+LMpwdOJ0KgMJTfVi9hczdD0bSTHmQbLaYJhh+5dJcrPpUXuz0QOha6FywL+ViVnarWiOHWoVpwx+JK/ZKLjwdUjsKQKBgF1VQL3rqR/yD7AKxZAw6e+09yaNO4RtZfjL4R/2YHI0XLKldOHwLf1v5vdUh5093TQ+wtZ/U9f2SDzmtPfTO3cAjuLlWNTSm3jGfokBoRy6upixiqmp0tJyBR/M9GobOy9qgo24c+w6TSrx+shN7PbDN5csz+l/QIIa4SBbRmVVAoGBAKwfYc16toErBIT2EG73QscaCXwA45wRf3cDeruj3uPV9NBkfF5mX+GJJumlo2tOqP1Hi8gv0viYGOH5Q2gNbWWUlyHRTyuzzuatf3kyvKDmbUBFjiEgFIK37rkjCUkkF79UkwX4IuEijwPVidpBRV/106ti3jB8cL0q2Y/VRM8JAoGALVeOBQ6YYd61jAiJHHazrnQ0xnTmFjYVOlLafIHgAVPqPuebvlf/fs+03y2KVPC/cUB31AxOM/1BIfeGkgj3j/Hgn4a/UcfThw4TwSmvz1Xsw4ItWqQ17l6+4QCMhmqT+S7i9gEHn4Oc9ln/43Cr5sVfU0lgfMtmjVNjyohiKZE=
 wx.pay.privateKey=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9o423YGD1O3Go/fEuxZcY9gkfxdXWSqTpB//EE8WnODQvFanbhn2QJ8rkK9NzWXgkxIbDJvJ4VYF3KREvLfsTyOZThZs2yaXoFCATv4J8ee//ppMcVOU04R45PNCoL9nM3M/Cpr1xSlN/ehldxlD5C8+LFFj6qbqqJ1Xh0gaTW1YABAEGUcI6J7bOpcGIYu7vdEn551ARSOpyN8sJJu8eozw6cKxeRwQeEmvIzxWy125JrBPo7dllkTgqJN4XaNlDxpIZG+O4dKsDGwZsLhinS3nKdJyYB3ziWBSQYd0okvNFhAQhJRA9e/c8+KSt/3syOA8uHKtpqo7gsI0/q4A9AgMBAAECggEAQy8YW+kHMJo4sDgXJAzYdP1lSh5anaqgNfahhCPFGHLu+edg3+cLwPB4DtH//ZOq3svJOoYnzL3uOfsQnXhaxS2de+WPkZ9q6YeHvbdRUSwZ/KZU4+qnsU432OtUuOEK9mscJ8fOwb4lSrpFFlXWBgVLJ+izhUpwWSvKX1B7B+TtCdG2A7nD7PmXgtgmweHeBY4SUeE9dYkM4XtW7bRi83SEkyb7l5KpxPMvDgTir/uBROxK40tYwOskp/HRFgWBCVPUe+5m3cvgKy+3iTIUTwKm3bXBmfEuniNz4orblfujDhyljPUU9s4ERmgYB8GKysZM1/nEgZ1AMWeO/WGyQQKBgQDyBxdhYLxxcN44M9aUn4oE6Wj3SFB8EvIs5FX6BMPTw1WIWm4ubHHKJq2W9AGZHuOWkq87G01Z1rwijP/vOk7Eu7JIJNPjY5CSC4+PCer5m1PLaNzvI7YEhrdrztBaG4EV2JN8eFAw7V2t14+L4kXhJdELTGBfxmeEDPU0V7U19QKBgQDIljZBsKfdcmh42ClIoNz5BnZR7CRGp5TKLx9yZzWEuOAaxcuCLChCSME04DnoZuYAmB6y1aESMyn3eqC+LMpwdOJ0KgMJTfVi9hczdD0bSTHmQbLaYJhh+5dJcrPpUXuz0QOha6FywL+ViVnarWiOHWoVpwx+JK/ZKLjwdUjsKQKBgF1VQL3rqR/yD7AKxZAw6e+09yaNO4RtZfjL4R/2YHI0XLKldOHwLf1v5vdUh5093TQ+wtZ/U9f2SDzmtPfTO3cAjuLlWNTSm3jGfokBoRy6upixiqmp0tJyBR/M9GobOy9qgo24c+w6TSrx+shN7PbDN5csz+l/QIIa4SBbRmVVAoGBAKwfYc16toErBIT2EG73QscaCXwA45wRf3cDeruj3uPV9NBkfF5mX+GJJumlo2tOqP1Hi8gv0viYGOH5Q2gNbWWUlyHRTyuzzuatf3kyvKDmbUBFjiEgFIK37rkjCUkkF79UkwX4IuEijwPVidpBRV/106ti3jB8cL0q2Y/VRM8JAoGALVeOBQ6YYd61jAiJHHazrnQ0xnTmFjYVOlLafIHgAVPqPuebvlf/fs+03y2KVPC/cUB31AxOM/1BIfeGkgj3j/Hgn4a/UcfThw4TwSmvz1Xsw4ItWqQ17l6+4QCMhmqT+S7i9gEHn4Oc9ln/43Cr5sVfU0lgfMtmjVNjyohiKZE=
 
 
-
+aliyun.templateCode=SMS_478385625