fanzherong_v 3 miesięcy temu
rodzic
commit
9126c06814
15 zmienionych plików z 465 dodań i 91 usunięć
  1. 112 13
      snowy-admin-web/src/views/biz/consumptionrecord/index.vue
  2. 48 20
      snowy-admin-web/src/views/biz/member/consumption.vue
  3. 119 0
      snowy-admin-web/src/views/biz/member/form.vue
  4. 21 8
      snowy-admin-web/src/views/biz/member/index.vue
  5. 4 0
      snowy-common/src/main/java/vip/xiaonuo/common/util/CommonCryptogramUtil.java
  6. 2 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/controller/ConsumptionRecordController.java
  7. 21 30
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/entity/ConsumptionRecord.java
  8. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/mapper/ConsumptionRecordMapper.java
  9. 21 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/mapper/mapping/ConsumptionRecordMapper.xml
  10. 8 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/param/ConsumptionRecordAddParam.java
  11. 13 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/param/ConsumptionRecordPageParam.java
  12. 76 16
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/service/impl/ConsumptionRecordServiceImpl.java
  13. 3 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml
  14. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizMemberUserResult.java
  15. 9 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java

+ 112 - 13
snowy-admin-web/src/views/biz/consumptionrecord/index.vue

@@ -1,4 +1,57 @@
 <template>
+	<a-card :bordered="false" style="margin-bottom: 10px" class="mb-2">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="会员姓名" name="userName">
+						<a-input v-model:value="searchFormState.userName" placeholder="会员姓名查询" allow-clear />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="消费操作" name="consumptionOperate">
+						<a-select v-model:value="searchFormState.consumptionOperate" placeholder="消费操作查询" :options="consumptionOperateList">
+						</a-select>
+					</a-form-item>
+				</a-col>
+
+				<a-col :span="6">
+					<a-form-item label="消费门店" name="orgId">
+						<a-tree-select
+							v-model:value="searchFormState.orgId"
+							style="width: 100%"
+							:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
+							placeholder="请选择消费门店"
+							allow-clear
+							tree-default-expand-all
+							:tree-data="treeData"
+							:field-names="{
+									children: 'children',
+									label: 'name',
+									value: 'id'
+								}"
+							selectable="false"
+							tree-line
+						/>
+					</a-form-item>
+				</a-col>
+				<template v-if="advanced">
+					<a-col :span="6">
+						<a-form-item label="消费日期:" name="consumptionTime">
+							<a-range-picker v-model:value="searchFormState.consumptionTime" value-format="YYYY-MM-DD" show-date />
+						</a-form-item>
+					</a-col>
+				</template>
+				<a-col :span="6">
+					<a-button type="primary" html-type="submit" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @click="toggleAdvanced" style="margin-left: 8px">
+						{{ advanced ? '收起' : '展开' }}
+						<component :is="advanced ? 'up-outlined' : 'down-outlined'" />
+					</a>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
 	<a-card :bordered="false">
 		<s-table
 			ref="tableRef"
@@ -13,13 +66,6 @@
 						<template #icon><plus-outlined /></template>
 						新增
 					</a-button>
-					<xn-batch-button
-						v-if="hasPerm('consumptionRecordBatchDelete')"
-						buttonName="批量删除"
-                        icon="DeleteOutlined"
-						:selectedRowKeys="selectedRowKeys"
-						@batchCallBack="deleteBatchConsumptionRecord"
-					/>
 				</a-space>
 			</template>
 			<template #bodyCell="{ column, record }">
@@ -32,6 +78,21 @@
 						</a-popconfirm>
 					</a-space>
 				</template>
+				<template v-if="column.dataIndex === 'consumptionOperate'">
+					<a-tag
+						:color="
+							record.consumptionOperate === '1'
+								? 'orange'
+								: record.consumptionOperate === '2'
+								  ? 'green'
+								  : record.consumptionOperate === '3'
+								    ? 'cyan'
+								      : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('consumption_operate', record.consumptionOperate) }}
+					</a-tag>
+				</template>
 			</template>
 		</s-table>
 	</a-card>
@@ -42,13 +103,28 @@
 	import { cloneDeep } from 'lodash-es'
 	import Form from './form.vue'
 	import consumptionRecordApi from '@/api/biz/consumptionRecordApi'
+	import tool from '@/utils/tool'
+	import bizOrgApi from '@/api/biz/bizOrgApi'
+
 	const tableRef = ref()
 	const formRef = ref()
+
+	const searchFormRef = ref()
+	let searchFormState = reactive({})
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+
+	const consumptionOperateList = tool.dictList('consumption_operate')
+	const treeData = ref([])
+
 	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
 	const columns = [
 		{
-			title: '用户id',
-			dataIndex: 'userId',
+			title: '会员姓名',
+			dataIndex: 'userName',
 			align: 'center',
 		},
 		{
@@ -56,23 +132,33 @@
 			dataIndex: 'consumptionOperate',
 			align: 'center',
 		},
+		{
+			title: '原账户余额',
+			dataIndex: 'accountBalance',
+			align: 'center',
+		},
+		{
+			title: '原代金券余额',
+			dataIndex: 'voucherBalance',
+			align: 'center',
+		},
 		{
 			title: '消费金额',
 			dataIndex: 'consumptionMoney',
 			align: 'center',
 		},
 		{
-			title: '消费时间',
+			title: '消费日期',
 			dataIndex: 'consumptionTime',
 			align: 'center',
 		},
 		{
 			title: '消费门店',
-			dataIndex: 'consumptionOrg',
+			dataIndex: 'orgName',
 			align: 'center',
 		},
 		{
-			title: '备注',
+			title: '说明',
 			dataIndex: 'consumptionRemark',
 			align: 'center',
 		},
@@ -86,6 +172,12 @@
 			width: 150
 		})
 	}*/
+
+	// 获取机构树并加入顶级
+	bizOrgApi.orgTreeSelector().then((res) => {
+		treeData.value = res
+	})
+
 	const selectedRowKeys = ref([])
 	// 列表选择配置
 	const options = {
@@ -103,7 +195,14 @@
 		}
 	}
 	const loadData = (parameter) => {
-		return consumptionRecordApi.consumptionRecordPage(parameter).then((data) => {
+		const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
+		// planTime范围查询条件重载
+		if (searchFormParam.consumptionTime) {
+			searchFormParam.consumptionTimeBegin = searchFormParam.consumptionTime[0]
+			searchFormParam.consumptionTimeEnd = searchFormParam.consumptionTime[1]
+			delete searchFormParam.consumptionTime
+		}
+		return consumptionRecordApi.consumptionRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})
 	}

+ 48 - 20
snowy-admin-web/src/views/biz/member/consumption.vue

@@ -1,36 +1,35 @@
 <template>
 	<xn-form-container
-		:title="formData.id ? '编辑消费记录' : '增加消费记录'"
+		: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 ref="formRef" :model="formData" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol">
+			<a-form-item label="会员姓名:" name="name">
+				<a-input v-model:value="formData.name" placeholder="请输入会员姓名" disabled allow-clear />
 			</a-form-item>
-			<a-form-item label="消费方式 1:代金券消费   2:余额消费  3:代金券+余额:" name="consumptionType">
-				<a-input v-model:value="formData.consumptionType" placeholder="请输入消费方式 1:代金券消费   2:余额消费  3:代金券+余额" allow-clear />
+			<a-form-item label="账户余额:" name="accountBalance">
+				<a-input v-model:value="formData.accountBalance" placeholder="请输入账户余额" disabled allow-clear />
 			</a-form-item>
-			<a-form-item label="代金券消费金额:" name="voucherMoney">
-				<a-input v-model:value="formData.voucherMoney" placeholder="请输入代金券消费金额" allow-clear />
+			<a-form-item label="代金券余额:" name="voucherBalance">
+				<a-input v-model:value="formData.voucherBalance" placeholder="请输入代金券余额" disabled allow-clear />
 			</a-form-item>
-			<a-form-item label="账户消费金额:" name="accountMoney">
-				<a-input v-model:value="formData.accountMoney" placeholder="请输入账户消费金额" allow-clear />
+			<a-form-item label="消费金额:" name="consumptionMoney">
+				<a-input-number v-model:value="formData.consumptionMoney" placeholder="请输入消费金额" allow-clear :min="0.1" :max="formData.accountBalance+formData.voucherBalance" style="width:100%"/>
 			</a-form-item>
-			<a-form-item label="消费时间:" name="consumptionTime">
-				<a-date-picker v-model:value="formData.consumptionTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择消费时间" style="width: 100%" />
+			<a-form-item label="手机号:" name="phoneNumber">
+				<a-input v-model:value="formData.phoneNumber" placeholder="请输入手机号" disabled allow-clear style="width:100%"/>
 			</a-form-item>
-			<a-form-item label="消费门店:" name="consumptionOrg">
-				<a-input v-model:value="formData.consumptionOrg" placeholder="请输入消费门店" allow-clear />
-			</a-form-item>
-			<a-form-item label="备注:" name="consumptionRemark">
-				<a-input v-model:value="formData.consumptionRemark" placeholder="请输入备注" allow-clear />
-			</a-form-item>
-			<a-form-item label="操作:1:赠送  2:扣减  3:消费:" name="consumptionOperate">
-				<a-input v-model:value="formData.consumptionOperate" placeholder="请输入操作:1:赠送  2:扣减  3:消费" allow-clear />
+			<a-form-item label="验证码:" name="phoneCode">
+				<a-input v-model:value="formData.phoneCode" placeholder="请输入验证码" allow-clear style="width:73%"/>
+				<a-button style="margin-left:20px;" type="primary" @click="sendMessage()">
+<!--					<template #icon></template>-->
+					发送验证码
+				</a-button>
 			</a-form-item>
+
 		</a-form>
 		<template #footer>
 			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
@@ -43,6 +42,10 @@
 	import { cloneDeep } from 'lodash-es'
 	import { required } from '@/utils/formRules'
 	import consumptionRecordApi from '@/api/biz/consumptionRecordApi'
+	import bizUserApi from "@/api/biz/bizUserApi";
+	import bizAuthApi from "@/api/biz/bizAuthApi";
+
+	import {message, Modal} from 'ant-design-vue';
 	// 抽屉状态
 	const open = ref(false)
 	const emit = defineEmits({ successful: null })
@@ -51,12 +54,19 @@
 	const formData = ref({})
 	const submitLoading = ref(false)
 
+	const labelCol = ref({ span: 5 })
+	const wrapperCol = ref({ span: 18 })
+
 	// 打开抽屉
 	const onOpen = (record) => {
 		open.value = true
 		if (record) {
 			let recordData = cloneDeep(record)
 			formData.value = Object.assign({}, recordData)
+			formData.value.userId = formData.value.id
+			formData.value.id = ''
+			formData.value.consumptionOperate = '3'
+			formData.value.phoneNumber = formData.value.account
 		}
 	}
 	// 关闭抽屉
@@ -67,6 +77,12 @@
 	}
 	// 默认要校验的
 	const formRules = {
+		name: [required('请输入消费者姓名')],
+		consumptionMoney: [required('请输入消费金额')],
+		accountBalance:  [required('请输入账户余额')],
+		voucherBalance:  [required('请输入代金券余额')],
+		phoneNumber:  [required('请输入手机号')],
+		phoneCode:  [required('请输入验证码')],
 	}
 	// 验证并提交数据
 	const onSubmit = () => {
@@ -87,6 +103,18 @@
 			})
 			.catch(() => {})
 	}
+
+	const sendMessage = () => {
+		console.log("1111")
+		debugger
+		if(!formData.value.phoneNumber){
+			message.error('请先输入手机号!')
+			return
+		}
+		bizAuthApi.sendMessage({phone:formData.value.phoneNumber}).then((res)=>{
+
+		})
+	}
 	// 抛出函数
 	defineExpose({
 		onOpen

+ 119 - 0
snowy-admin-web/src/views/biz/member/form.vue

@@ -0,0 +1,119 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '余额调整' : '余额调整'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol">
+			<a-form-item label="会员姓名:" name="name">
+				<a-input v-model:value="formData.name" placeholder="请输入会员姓名" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="账户余额:" name="accountBalance">
+				<a-input v-model:value="formData.accountBalance" placeholder="请输入账户余额" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="代金券余额:" name="voucherBalance">
+				<a-input v-model:value="formData.voucherBalance" placeholder="请输入代金券余额" disabled allow-clear />
+			</a-form-item>
+			<a-form-item label="调整方式:" name="consumptionOperate">
+				<a-radio-group button-style="solid" v-model:value="formData.consumptionOperate">
+					<a-radio-button value="1">
+						赠送
+					</a-radio-button>
+					<a-radio-button value="2">
+						扣减
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="调整类型:" name="consumptionType">
+				<a-radio-group button-style="solid" v-model:value="formData.consumptionType">
+					<a-radio-button value="1">
+						代金券
+					</a-radio-button>
+					<a-radio-button value="2">
+						余额
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="调整金额:" name="consumptionMoney">
+				<a-input-number v-model:value="formData.consumptionMoney" placeholder="请输入调整金额" allow-clear :min="0.1" :max="99999999" style="width:100%"/>
+			</a-form-item>
+			<a-form-item label="说明:" name="consumptionRemark">
+				<a-input v-model:value="formData.consumptionRemark" 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="consumptionRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import consumptionRecordApi from '@/api/biz/consumptionRecordApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	const labelCol = ref({ span: 5 })
+	const wrapperCol = ref({ span: 18 })
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.consumptionOperate = ref('1')
+			formData.value.consumptionType = ref('1')
+			formData.value.userId = formData.value.id
+			formData.value.id = ''
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		name: [required('请输入消费者姓名')],
+		consumptionOperate:  [required('请选择调整操作')],
+		consumptionType: [required('调整方式')],
+		consumptionMoney: [required('请输入调整金额')],
+		consumptionRemark: [required('请输入说明')],
+		accountBalance:  [required('请输入账户余额')],
+		voucherBalance:  [required('请输入代金券余额')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				consumptionRecordApi
+					.consumptionRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 21 - 8
snowy-admin-web/src/views/biz/member/index.vue

@@ -55,12 +55,13 @@
 			</template>
 		</s-table>
 	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
 	<Consumption ref="consumptionRef" @successful="tableRef.refresh()" />
 </template>
 <script setup name="bizUser">
 	import tool from '@/utils/tool'
 	import bizUserApi from '@/api/biz/bizUserApi'
-	import Form from "@/views/biz/consumptionrecord/form.vue";
+	import Form from "./form.vue";
 	import Consumption from './consumption.vue'
 
 	const consumptionRef = ref()
@@ -70,39 +71,51 @@
 			title: '序号',
 			dataIndex: 'serial',
 			align: 'center',
-			width: '50px'
+			width: 50
 		},
 		{
 			title: '账号',
 			dataIndex: 'account',
+			align: 'center',
+			width: 100,
 			ellipsis: true
 		},
 		{
 			title: '姓名',
-			dataIndex: 'name'
+			dataIndex: 'name',
+			width: 120,
+			align: 'center',
 		},
 		{
 			title: '性别',
 			dataIndex: 'gender',
-			width: '50px'
+			align: 'center',
+			width: 80
 		},
 		{
 			title: '手机',
 			dataIndex: 'phone',
+			align: 'center',
+			width: 120,
 			ellipsis: true
 		},
 		{
 			title: '账户余额',
-			dataIndex: 'accountBalance'
+			dataIndex: 'accountBalance',
+			width: 80,
+			align: 'center',
 		},
 		{
 			title: '代金券余额',
-			dataIndex: 'voucherBalance'
+			dataIndex: 'voucherBalance',
+			width: 80,
+			align: 'center',
 		},
 		{
 			title: '状态',
 			dataIndex: 'userStatus',
-			width: '80px'
+			align: 'center',
+			width: 80
 		}
 	]
 	if (hasPerm(['balanceAdjustment'])) {
@@ -110,7 +123,7 @@
 			title: '操作',
 			dataIndex: 'action',
 			align: 'center',
-			width: '150px'
+			width: 150
 		})
 	}
 	const statusData = tool.dictList('COMMON_STATUS')

+ 4 - 0
snowy-common/src/main/java/vip/xiaonuo/common/util/CommonCryptogramUtil.java

@@ -103,6 +103,10 @@ public class CommonCryptogramUtil {
         }
     }
 
+    public static void main(String[] args) {
+        System.out.printf(doSm4CbcDecrypt(doSm4CbcDecrypt("2963b0080c667173ef63d9f1b4d8159c84fb889274361a2f04f3ca1438a601c6002a8a4efa863ccad024ac0300bb40d2")));
+    }
+
     /**
      * 纯签名
      *

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/controller/ConsumptionRecordController.java

@@ -22,6 +22,7 @@ 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.annotation.CommonNoRepeat;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.biz.modular.consumptionrecord.entity.ConsumptionRecord;
 import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordAddParam;
@@ -72,6 +73,7 @@ public class ConsumptionRecordController {
     @CommonLog("消费结算&会员管理赠送消费")
     @SaCheckPermission("/biz/consumptionrecord/add")
     @PostMapping("/biz/consumptionrecord/add")
+    @CommonNoRepeat
     public CommonResult<String> add(@RequestBody @Valid ConsumptionRecordAddParam consumptionRecordAddParam) {
         consumptionRecordService.add(consumptionRecordAddParam);
         return CommonResult.ok();

+ 21 - 30
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/entity/ConsumptionRecord.java

@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -27,8 +29,8 @@ import java.util.Date;
  **/
 @Getter
 @Setter
-@TableName("consumption_record")
-public class ConsumptionRecord {
+@TableName("biz_consumption_record")
+public class ConsumptionRecord extends CommonEntity {
 
     /** 主键ID */
     @TableId
@@ -44,11 +46,11 @@ public class ConsumptionRecord {
     private String consumptionType;
 
     /** 代金券消费金额 */
-    @Schema(description = "代金券消费金额")
+    @Schema(description = "代金券金额")
     private BigDecimal voucherMoney;
 
     /** 账户消费金额 */
-    @Schema(description = "账户消费金额")
+    @Schema(description = "账户金额")
     private BigDecimal accountMoney;
 
     /** 消费时间 */
@@ -63,32 +65,6 @@ public class ConsumptionRecord {
     @Schema(description = "备注")
     private String consumptionRemark;
 
-    /** 删除标识 */
-    @Schema(description = "删除标识")
-    @TableLogic
-    @TableField(fill = FieldFill.INSERT)
-    private String deleteFlag;
-
-    /** 创建时间 */
-    @Schema(description = "创建时间")
-    @TableField(fill = FieldFill.INSERT)
-    private Date createTime;
-
-    /** 创建人 */
-    @Schema(description = "创建人")
-    @TableField(fill = FieldFill.INSERT)
-    private String createUser;
-
-    /** 修改时间 */
-    @Schema(description = "修改时间")
-    @TableField(fill = FieldFill.UPDATE)
-    private Date updateTime;
-
-    /** 修改人 */
-    @Schema(description = "修改人")
-    @TableField(fill = FieldFill.UPDATE)
-    private String updateUser;
-
     /** 操作:1:赠送  2:扣减  3:消费 */
     @Schema(description = "操作:1:赠送  2:扣减  3:消费")
     private String consumptionOperate;
@@ -96,4 +72,19 @@ public class ConsumptionRecord {
     /**总金额*/
     @Schema(description = "总金额")
     private BigDecimal consumptionMoney;
+
+    /**消费者姓名*/
+    @TableField(exist = false)
+    private String userName;
+    /**消费门店*/
+    @TableField(exist = false)
+    private String orgName;
+
+    /**原代金券余额*/
+    @Schema(description = "原代金券余额")
+    private BigDecimal voucherBalance;
+
+    /**原账户余额*/
+    @Schema(description = "原账户余额")
+    private BigDecimal accountBalance;
 }

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/mapper/ConsumptionRecordMapper.java

@@ -12,7 +12,10 @@
  */
 package vip.xiaonuo.biz.modular.consumptionrecord.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import vip.xiaonuo.biz.modular.consumptionrecord.entity.ConsumptionRecord;
 
 /**
@@ -22,4 +25,5 @@ import vip.xiaonuo.biz.modular.consumptionrecord.entity.ConsumptionRecord;
  * @date  2025/02/06 08:56
  **/
 public interface ConsumptionRecordMapper extends BaseMapper<ConsumptionRecord> {
+    Page<ConsumptionRecord> getPageList(@Param("page") Page<ConsumptionRecord> page, @Param("ew") QueryWrapper<ConsumptionRecord> ew);
 }

+ 21 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/mapper/mapping/ConsumptionRecordMapper.xml

@@ -2,4 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.biz.modular.consumptionrecord.mapper.ConsumptionRecordMapper">
 
+    <select id="getPageList" resultType="vip.xiaonuo.biz.modular.consumptionrecord.entity.ConsumptionRecord">
+        select
+            cr.id,
+            su.name userName,
+            cr.consumption_type,
+            IFNULL(cr.voucher_money,0) voucher_money,
+            IFNULL(cr.account_money,0) account_money,
+            cr.consumption_time,
+            so.name orgName,
+            cr.consumption_remark,
+            cr.consumption_operate,
+            IFNULL(cr.consumption_money,0) consumption_money,
+            IFNULL(cr.voucher_balance,0) voucher_balance,
+            IFNULL(cr.account_balance,0) account_balance
+        from biz_consumption_record cr
+        left join SYS_USER su on cr.user_id = su.id
+        left join SYS_ORG so on so.id = cr.consumption_org
+        <where>
+            ${ew.sqlSegment}
+        </where>
+    </select>
 </mapper>

+ 8 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/param/ConsumptionRecordAddParam.java

@@ -67,4 +67,12 @@ public class ConsumptionRecordAddParam {
     @Schema(description = "总金额")
     private BigDecimal consumptionMoney;
 
+    /**手机号*/
+    @Schema(description = "手机号")
+    private String phoneNumber;
+
+    /**验证码*/
+    @Schema(description = "验证码")
+    private String phoneCode;
+
 }

+ 13 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/param/ConsumptionRecordPageParam.java

@@ -48,4 +48,17 @@ public class ConsumptionRecordPageParam {
     @Schema(description = "关键词")
     private String searchKey;
 
+    /**姓名*/
+    private String userName;
+
+    /**消费操作*/
+    private String consumptionOperate;
+
+    /**消费门店*/
+    private String orgId;
+
+    /**消费日期*/
+    private String consumptionTimeBegin;
+    private String consumptionTimeEnd;
+
 }

+ 76 - 16
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/consumptionrecord/service/impl/ConsumptionRecordServiceImpl.java

@@ -15,6 +15,7 @@ package vip.xiaonuo.biz.modular.consumptionrecord.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.PhoneUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -23,8 +24,10 @@ import jakarta.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.biz.modular.user.entity.BizUser;
 import vip.xiaonuo.biz.modular.user.service.BizUserService;
+import vip.xiaonuo.common.cache.CommonCacheOperator;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
@@ -37,6 +40,7 @@ import vip.xiaonuo.biz.modular.consumptionrecord.param.ConsumptionRecordPagePara
 import vip.xiaonuo.biz.modular.consumptionrecord.service.ConsumptionRecordService;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -51,17 +55,48 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
     @Resource
     private BizUserService bizUserService;
 
+    @Resource
+    private CommonCacheOperator commonCacheOperator;
+
     @Override
     public Page<ConsumptionRecord> page(ConsumptionRecordPageParam consumptionRecordPageParam) {
         QueryWrapper<ConsumptionRecord> queryWrapper = new QueryWrapper<ConsumptionRecord>().checkSqlInjection();
-        if(ObjectUtil.isAllNotEmpty(consumptionRecordPageParam.getSortField(), consumptionRecordPageParam.getSortOrder())) {
-            CommonSortOrderEnum.validate(consumptionRecordPageParam.getSortOrder());
-            queryWrapper.orderBy(true, consumptionRecordPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
-                    StrUtil.toUnderlineCase(consumptionRecordPageParam.getSortField()));
+        if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getUserName())){
+            queryWrapper.like("su.name",consumptionRecordPageParam.getUserName());
+        }
+        if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getConsumptionOperate())){
+            queryWrapper.eq("cr.consumption_operate",consumptionRecordPageParam.getConsumptionOperate());
+        }
+        if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getOrgId())){
+            queryWrapper.eq("cr.consumption_org",consumptionRecordPageParam.getOrgId());
+        }
+        if(ObjectUtil.isNotEmpty(consumptionRecordPageParam.getConsumptionTimeBegin()) &&
+                ObjectUtil.isNotEmpty(consumptionRecordPageParam.getConsumptionTimeEnd())){
+            queryWrapper.between("cr.consumption_time",consumptionRecordPageParam.getConsumptionTimeBegin()+" 00:00:00",consumptionRecordPageParam.getConsumptionTimeEnd()+" 23:59:59");
+        }
+        // 校验数据范围
+        List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
+        if (ObjectUtil.isNotEmpty(loginUserDataScope)) {
+            queryWrapper.in("cr.consumption_org", loginUserDataScope);
         } else {
-            queryWrapper.lambda().orderByAsc(ConsumptionRecord::getId);
+            queryWrapper.in("cr.user_id", StpLoginUserUtil.getLoginUser().getId());
         }
-        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        Page<ConsumptionRecord> pageList = this.getBaseMapper().getPageList(CommonPageRequest.defaultPage(), queryWrapper);
+        for(ConsumptionRecord consumptionRecord : pageList.getRecords()){
+            if(StringUtils.equals(consumptionRecord.getConsumptionOperate(),"3")){
+                //消费结算,设置下说明
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"1")){
+                    consumptionRecord.setConsumptionRemark("代金券消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"元");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"2")){
+                    consumptionRecord.setConsumptionRemark("账户余额消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"元");
+                }
+                if(StringUtils.equals(consumptionRecord.getConsumptionType(),"3")){
+                    consumptionRecord.setConsumptionRemark("代金券消费"+consumptionRecord.getVoucherMoney().stripTrailingZeros().toPlainString()+"元"+",账户余额消费"+consumptionRecord.getAccountMoney().stripTrailingZeros().toPlainString()+"元");
+                }
+            }
+        }
+        return pageList;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -72,38 +107,55 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
         ConsumptionRecord consumptionRecord = BeanUtil.toBean(consumptionRecordAddParam, ConsumptionRecord.class);
         //获取用户信息
         BizUser bizUser = bizUserService.getById(consumptionRecordAddParam.getUserId());
+        consumptionRecord.setVoucherBalance(bizUser.getVoucherBalance());
+        consumptionRecord.setAccountBalance(bizUser.getAccountBalance());
         if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"1")){
             //会员赠送
             if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"1")){
                 //判断当前选择的是代金券还是余额 1:代金券   2:余额
                 //选择代金券,用户原有代金券金额+本地赠送金额
-                bizUser.setVoucherBalance(bizUser.getVoucherBalance().add(consumptionRecordAddParam.getVoucherMoney()));
-                consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getVoucherMoney());
+                bizUser.setVoucherBalance(bizUser.getVoucherBalance().add(consumptionRecordAddParam.getConsumptionMoney()));
+                consumptionRecord.setVoucherMoney(consumptionRecordAddParam.getConsumptionMoney());
             }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"2")){
                 //选择余额,用户原有余额+本次赠送余额金额
-                bizUser.setAccountBalance(bizUser.getAccountBalance().add(consumptionRecordAddParam.getAccountMoney()));
-                consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getAccountMoney());
+                bizUser.setAccountBalance(bizUser.getAccountBalance().add(consumptionRecordAddParam.getConsumptionMoney()));
+                consumptionRecord.setAccountMoney(consumptionRecordAddParam.getConsumptionMoney());
             }
         }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"2")){
             //会员扣减
             if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"1")){
                 //选择代金券,用户原有代金券金额-本次扣减金额
-                bizUser.setVoucherBalance(bizUser.getVoucherBalance().subtract(consumptionRecordAddParam.getVoucherMoney()));
-                consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getVoucherMoney());
+                bizUser.setVoucherBalance(bizUser.getVoucherBalance().subtract(consumptionRecordAddParam.getConsumptionMoney()));
+                consumptionRecord.setVoucherMoney(consumptionRecordAddParam.getConsumptionMoney());
             }else if(StringUtils.equals(consumptionRecordAddParam.getConsumptionType(),"2")){
                 //选择账户余额,用户原有余额-本次扣减余额
-                bizUser.setAccountBalance(bizUser.getAccountBalance().subtract(consumptionRecordAddParam.getAccountMoney()));
-                consumptionRecord.setConsumptionMoney(consumptionRecordAddParam.getAccountMoney());
+                bizUser.setAccountBalance(bizUser.getAccountBalance().subtract(consumptionRecordAddParam.getConsumptionMoney()));
+                consumptionRecord.setAccountMoney(consumptionRecordAddParam.getConsumptionMoney());
             }
-        }else {
+        }else{
             //正常消费结算
+            //人工结算需要短信校验,获取手机验证码
+            if(StringUtils.equals(consumptionRecordAddParam.getConsumptionOperate(),"3")){
+                Object code = commonCacheOperator.get(consumptionRecordAddParam.getPhoneNumber());
+                if(!StringUtils.equals(code.toString(),consumptionRecordAddParam.getPhoneCode())){
+                    throw new CommonException("验证码不正确!");
+                }else{
+                    commonCacheOperator.remove(consumptionRecordAddParam.getPhoneNumber());
+                }
+            }
             //判断当前消费金额是否大于代金券金额,优先扣减代金券金额
             if(consumptionRecordAddParam.getConsumptionMoney().compareTo(bizUser.getVoucherBalance()) > 0){
+                //判断代金券金额是否大于0
+                if(bizUser.getVoucherBalance().compareTo(BigDecimal.ZERO) > 0){
+                    consumptionRecord.setConsumptionType("3");
+                }else{
+                    consumptionRecord.setConsumptionType("2");
+                }
                 //计算本次消费和代金券差额
                 BigDecimal subtract = consumptionRecordAddParam.getConsumptionMoney().subtract(bizUser.getVoucherBalance());
                 //如果差额大于账户余额,表示账户余额不足
                 if(subtract.compareTo(bizUser.getAccountBalance()) > 0){
-                    throw new CommonException("账户余额不足!");
+                    throw new CommonException("账户余额不足,请先充值!");
                 }
                 //记录消费信息
                 consumptionRecord.setVoucherMoney(bizUser.getVoucherBalance());
@@ -116,9 +168,12 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
                 //直接扣减代金券
                 bizUser.setVoucherBalance(bizUser.getVoucherBalance().subtract(consumptionRecordAddParam.getConsumptionMoney()));
                 consumptionRecord.setVoucherMoney(consumptionRecordAddParam.getConsumptionMoney());
+                consumptionRecord.setConsumptionType("1");
             }
         }
         //保存消费记录
+        consumptionRecord.setConsumptionOrg(StpLoginUserUtil.getLoginUser().getOrgId());
+        consumptionRecord.setConsumptionTime(new Date());
         this.save(consumptionRecord);
         //修改账户余额
         bizUserService.updateById(bizUser);
@@ -148,6 +203,11 @@ public class ConsumptionRecordServiceImpl extends ServiceImpl<ConsumptionRecordM
         if(ObjectUtil.isEmpty(consumptionRecordAddParam.getUserId())){
             throw new CommonException("用户userId不能为空!");
         }
+        if(ObjectUtil.isNotEmpty(consumptionRecordAddParam.getPhoneNumber())){
+            if (!PhoneUtil.isMobile(consumptionRecordAddParam.getPhoneNumber())) {
+                throw new CommonException("手机号码:{}格式错误", consumptionRecordAddParam.getPhoneNumber());
+            }
+        }
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 3 - 2
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/mapper/mapping/BizUserMapper.xml

@@ -13,8 +13,9 @@
             USER_TYPE,
             ACCOUNT_BALANCE,
             VOUCHER_BALANCE,
-            CREATE_TIME
+            CREATE_TIME,
+            PHONE
         FROM SYS_USER
         ${ew.customSqlSegment}
     </select>
-</mapper>
+</mapper>

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/result/BizMemberUserResult.java

@@ -83,4 +83,8 @@ public class BizMemberUserResult extends CommonEntity {
     @Schema(description = "用户状态")
     private String userStatus;
 
+    /** 手机号 */
+    @Schema(description = "手机号")
+    private String phone;
+
 }

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

@@ -183,7 +183,13 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
         queryWrapper.lambda().eq(BizUser::getUserType, 3);
         queryWrapper.lambda().eq(CommonEntity::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
         queryWrapper.lambda().orderByDesc(CommonEntity::getCreateTime);
-        return baseMapper.memberPage(CommonPageRequest.defaultPage(), queryWrapper);
+        Page<BizMemberUserResult> bizMemberUserResultPage = baseMapper.memberPage(CommonPageRequest.defaultPage(), queryWrapper);
+        for(BizMemberUserResult bizMemberUserResult : bizMemberUserResultPage.getRecords()){
+            if(ObjectUtil.isNotEmpty(bizMemberUserResult.getPhone())){
+                bizMemberUserResult.setPhone(CommonCryptogramUtil.doSm4CbcDecrypt(bizMemberUserResult.getPhone()));
+            }
+        }
+        return bizMemberUserResultPage;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -831,7 +837,8 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
             throw new CommonException("该手机号已注册,请勿重复注册");
         }
         bizUser.setAccount(wxUserRegisterParam.getPhone());
-        bizUser.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(wxUserRegisterParam.getPhone()));
+        //bizUser.setPhone(CommonCryptogramUtil.doSm4CbcEncrypt(wxUserRegisterParam.getPhone()));
+        bizUser.setPhone(wxUserRegisterParam.getPhone());
         // 设置默认密码
         bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
         // 设置状态