Sfoglia il codice sorgente

系统配置模块

fanzherong_v 3 mesi fa
parent
commit
b878a6cae9
59 ha cambiato i file con 3759 aggiunte e 25 eliminazioni
  1. 28 0
      snowy-admin-web/src/api/biz/bizAppointmentTimeApi.js
  2. 28 0
      snowy-admin-web/src/api/biz/bizConfigApi.js
  3. 28 0
      snowy-admin-web/src/api/biz/bizExcessConfigApi.js
  4. 28 0
      snowy-admin-web/src/api/biz/bizSupplierApi.js
  5. 87 0
      snowy-admin-web/src/views/biz/bizappointmenttime/form.vue
  6. 146 0
      snowy-admin-web/src/views/biz/bizappointmenttime/index.vue
  7. 123 0
      snowy-admin-web/src/views/biz/bizconfig/form.vue
  8. 174 0
      snowy-admin-web/src/views/biz/bizconfig/index.vue
  9. 94 0
      snowy-admin-web/src/views/biz/bizexcessconfig/form.vue
  10. 157 0
      snowy-admin-web/src/views/biz/bizexcessconfig/index.vue
  11. 84 0
      snowy-admin-web/src/views/biz/bizsupplier/form.vue
  12. 121 0
      snowy-admin-web/src/views/biz/bizsupplier/index.vue
  13. 5 1
      snowy-admin-web/src/views/biz/goods/form.vue
  14. 46 24
      snowy-admin-web/src/views/biz/goods/index.vue
  15. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/controller/BizAppointmentTimeController.java
  16. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/entity/BizAppointmentTime.java
  17. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/enums/BizAppointmentTimeEnum.java
  18. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/mapper/BizAppointmentTimeMapper.java
  19. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/mapper/mapping/BizAppointmentTimeMapper.xml
  20. 53 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeAddParam.java
  21. 58 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeEditParam.java
  22. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeIdParam.java
  23. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimePageParam.java
  24. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/service/BizAppointmentTimeService.java
  25. 216 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/service/impl/BizAppointmentTimeServiceImpl.java
  26. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/controller/BizConfigController.java
  27. 63 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/entity/BizConfig.java
  28. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/enums/BizConfigEnum.java
  29. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/mapper/BizConfigMapper.java
  30. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/mapper/mapping/BizConfigMapper.xml
  31. 64 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigAddParam.java
  32. 69 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigEditParam.java
  33. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigIdParam.java
  34. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigPageParam.java
  35. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/service/BizConfigService.java
  36. 98 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/service/impl/BizConfigServiceImpl.java
  37. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/controller/BizExcessConfigController.java
  38. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/entity/BizExcessConfig.java
  39. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/enums/BizExcessConfigEnum.java
  40. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/mapper/BizExcessConfigMapper.java
  41. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/mapper/mapping/BizExcessConfigMapper.xml
  42. 48 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigAddParam.java
  43. 53 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigEditParam.java
  44. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigIdParam.java
  45. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigPageParam.java
  46. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/service/BizExcessConfigService.java
  47. 103 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/service/impl/BizExcessConfigServiceImpl.java
  48. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/controller/BizSupplierController.java
  49. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/entity/BizSupplier.java
  50. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/enums/BizSupplierEnum.java
  51. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/mapper/BizSupplierMapper.java
  52. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/mapper/mapping/BizSupplierMapper.xml
  53. 52 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierAddParam.java
  54. 57 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierEditParam.java
  55. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierIdParam.java
  56. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierPageParam.java
  57. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/service/BizSupplierService.java
  58. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/service/impl/BizSupplierServiceImpl.java
  59. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/goods/service/impl/BizGoodsServiceImpl.java

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizappointmenttime/` + url, ...arg)
+
+/**
+ * 预约时段配置Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+export default {
+	// 获取预约时段配置分页
+	bizAppointmentTimePage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交预约时段配置表单 edit为true时为编辑,默认为新增
+	bizAppointmentTimeSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除预约时段配置
+	bizAppointmentTimeDelete(data) {
+		return request('delete', data)
+	},
+	// 获取预约时段配置详情
+	bizAppointmentTimeDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizconfig/` + url, ...arg)
+
+/**
+ * 系统配置Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+export default {
+	// 获取系统配置分页
+	bizConfigPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交系统配置表单 edit为true时为编辑,默认为新增
+	bizConfigSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除系统配置
+	bizConfigDelete(data) {
+		return request('delete', data)
+	},
+	// 获取系统配置详情
+	bizConfigDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizexcessconfig/` + url, ...arg)
+
+/**
+ * 超限配置Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+export default {
+	// 获取超限配置分页
+	bizExcessConfigPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交超限配置表单 edit为true时为编辑,默认为新增
+	bizExcessConfigSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除超限配置
+	bizExcessConfigDelete(data) {
+		return request('delete', data)
+	},
+	// 获取超限配置详情
+	bizExcessConfigDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizsupplier/` + url, ...arg)
+
+/**
+ * 供货商Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+export default {
+	// 获取供货商分页
+	bizSupplierPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交供货商表单 edit为true时为编辑,默认为新增
+	bizSupplierSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除供货商
+	bizSupplierDelete(data) {
+		return request('delete', data)
+	},
+	// 获取供货商详情
+	bizSupplierDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 87 - 0
snowy-admin-web/src/views/biz/bizappointmenttime/form.vue

@@ -0,0 +1,87 @@
+<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" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="开始时段:" name="beginTime">
+<!--				<a-input v-model:value="formData.beginTime" placeholder="请输入开始时段" allow-clear />-->
+				<a-time-picker v-model:value="formData.beginTime" valueFormat="HH:mm" format = "HH:mm"  placeholder="请选择预约开始时间段" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="结束时段:" name="endTime">
+				<a-time-picker v-model:value="formData.endTime" valueFormat="HH:mm" format = "HH:mm"  placeholder="请选择预约结束时间段" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="申请数量:" name="applyNumber">
+				<a-input v-model:value="formData.applyNumber" 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="bizAppointmentTimeForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizAppointmentTimeApi from '@/api/biz/bizAppointmentTimeApi'
+	// 抽屉状态
+	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: 16})
+
+	// 打开抽屉
+	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 = {
+		beginTime: [required('请输入开始时段')],
+		endTime: [required('请输入结束时段')],
+		applyNumber: [required('请输入申请数量')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizAppointmentTimeApi
+					.bizAppointmentTimeSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 146 - 0
snowy-admin-web/src/views/biz/bizappointmenttime/index.vue

@@ -0,0 +1,146 @@
+<template>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizAppointmentTimeAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record, index }">
+				<template v-if="column.dataIndex === 'serial'">
+					{{ index + 1 }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizAppointmentTimeEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizAppointmentTimeEdit', 'bizAppointmentTimeDelete'], 'and')" />
+						<a-button type="link" danger size="small" v-if="hasPerm('bizAppointmentTimeDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+				<template v-if="column.dataIndex === 'appointment'">
+					<span>{{record.beginTime+'~'+record.endTime}}</span>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizappointmenttime">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizAppointmentTimeApi from '@/api/biz/bizAppointmentTimeApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	const tableRef = ref()
+	const formRef = ref()
+	const submitLoading = ref(false)
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '序号',
+			width: 80,
+			dataIndex: 'serial',
+			align:'center'
+		},
+		{
+			title: '预约时段',
+			dataIndex: 'appointment',
+			align:'center'
+		},
+		{
+			title: '申请数量',
+			dataIndex: 'applyNumber',
+			align:'center'
+		},
+
+	]
+	// 操作栏通过权限判断是否显示
+	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) => {
+		return bizAppointmentTimeApi.bizAppointmentTimePage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizAppointmentTime = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizAppointmentTimeApi.bizAppointmentTimeDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizAppointmentTimeApi
+					.bizAppointmentTimeDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizAppointmentTime = (params) => {
+		bizAppointmentTimeApi.bizAppointmentTimeDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 123 - 0
snowy-admin-web/src/views/biz/bizconfig/form.vue

@@ -0,0 +1,123 @@
+<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" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="排队时效:" name="queueEfficiency">
+				<a-input-number v-model:value="formData.queueEfficiency" style="width:90%"  :precision="0" :min="1" :max="99999" placeholder="请输入排队时效" allow-clear /><span style="margin-left:10px;">分钟</span>
+			</a-form-item>
+			<a-form-item label="时段下拉个数:" name="pullNumber">
+				<a-input-number v-model:value="formData.pullNumber" style="width:90%"  :precision="0" :min="1" :max="99999" placeholder="请输入时段下拉个数" allow-clear /><span style="margin-left:10px;">个</span>
+			</a-form-item>
+			<a-form-item label="停留时长:" name="stopDuration">
+				<a-input-number v-model:value="formData.stopDuration" style="width:90%" :precision="0" :min="1" :max="99999" placeholder="请输入停留时长" allow-clear /><span style="margin-left:10px;">分钟</span>
+			</a-form-item>
+			<a-form-item label="预约审核开关:" name="auditSwitch">
+				<a-radio-group button-style="solid" v-model:value="formData.auditSwitch">
+					<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="orderWeightSwitch">
+				<a-radio-group button-style="solid" v-model:value="formData.orderWeightSwitch">
+					<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="accessControlSwitch">
+				<a-radio-group button-style="solid" v-model:value="formData.accessControlSwitch">
+					<a-radio-button value="1">
+						开启
+					</a-radio-button>
+					<a-radio-button value="2">
+						关闭
+					</a-radio-button>
+				</a-radio-group>
+			</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="bizConfigForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizConfigApi from '@/api/biz/bizConfigApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 6})
+	const wrapperCol = ref({ span: 16})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}else{
+			formData.value.auditSwitch = '2'
+			formData.value.orderWeightSwitch = '2'
+			formData.value.accessControlSwitch = '2'
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		queueEfficiency: [required('请输入排队时效')],
+		pullNumber: [required('请输入时段下拉个数')],
+		stopDuration: [required('请输入停留时长')],
+		auditSwitch: [required('请输入预约审核开关(1:开启   2:关闭)')],
+		orderWeightSwitch: [required('请输入订单重量校验开关(1:开启   2:关闭)')],
+		accessControlSwitch: [required('请输入门禁强制校验开关')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizConfigApi
+					.bizConfigSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 174 - 0
snowy-admin-web/src/views/biz/bizconfig/index.vue

@@ -0,0 +1,174 @@
+<template>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizConfigAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizConfigEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizConfigEdit', 'bizConfigDelete'], 'and')" />
+						<a-button type="link" danger size="small" v-if="hasPerm('bizConfigDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+				<template v-if="column.dataIndex === 'queueEfficiency'">
+					{{record.queueEfficiency}}分钟
+				</template>
+				<template v-if="column.dataIndex === 'pullNumber'">
+					{{record.pullNumber}}个
+				</template>
+				<template v-if="column.dataIndex === 'stopDuration'">
+					{{record.stopDuration}}分钟
+				</template>
+				<template v-if="column.dataIndex === 'auditSwitch'">
+					{{ $TOOL.dictTypeData('biz_switch', record.auditSwitch) }}
+				</template>
+				<template v-if="column.dataIndex === 'orderWeightSwitch'">
+					{{ $TOOL.dictTypeData('biz_switch', record.orderWeightSwitch) }}
+				</template>
+				<template v-if="column.dataIndex === 'accessControlSwitch'">
+					{{ $TOOL.dictTypeData('biz_switch', record.accessControlSwitch) }}
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizconfig">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizConfigApi from '@/api/biz/bizConfigApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const loading = ref(false)
+	const submitLoading = ref(false)
+	const columns = [
+		{
+			title: '排队时效',
+			dataIndex: 'queueEfficiency',
+			align:'center'
+		},
+		{
+			title: '时段下拉个数',
+			dataIndex: 'pullNumber',
+			align:'center'
+		},
+		{
+			title: '停留时长',
+			dataIndex: 'stopDuration',
+			align:'center'
+		},
+		{
+			title: '预约审核开关',
+			dataIndex: 'auditSwitch',
+			align:'center'
+		},
+		{
+			title: '订单重量校验开关',
+			dataIndex: 'orderWeightSwitch',
+			align:'center'
+		},
+		{
+			title: '门禁强制校验开关',
+			dataIndex: 'accessControlSwitch',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	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) => {
+		return bizConfigApi.bizConfigPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizConfig = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizConfigApi.bizConfigDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizConfigApi
+					.bizConfigDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizConfig = (params) => {
+		bizConfigApi.bizConfigDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 94 - 0
snowy-admin-web/src/views/biz/bizexcessconfig/form.vue

@@ -0,0 +1,94 @@
+<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" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="车辆轴数:" name="vehicleAxleNumber">
+				<a-input-number v-model:value="formData.vehicleAxleNumber" style="width:90%"  :precision="0" :min="1" :max="99999" placeholder="请输入车辆轴数" allow-clear /><span style="margin-left:10px;">个</span>
+			</a-form-item>
+			<a-form-item label="超限重量:" name="excessWeight">
+				<a-input-number v-model:value="formData.excessWeight" style="width:90%"  :precision="0" :min="1" :max="999999" placeholder="请输入超限重量" allow-clear /><span style="margin-left:10px;">KG</span>
+			</a-form-item>
+			<a-form-item label="是否启用:" name="status">
+				<a-radio-group button-style="solid" v-model:value="formData.status">
+					<a-radio-button value="1">
+						启用
+					</a-radio-button>
+					<a-radio-button value="2">
+						关闭
+					</a-radio-button>
+				</a-radio-group>
+			</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="bizExcessConfigForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizExcessConfigApi from '@/api/biz/bizExcessConfigApi'
+	// 抽屉状态
+	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: 16})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}else{
+			formData.value.status = '2'
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		vehicleAxleNumber: [required('请输入车辆轴数')],
+		excessWeight: [required('请输入超限重量')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizExcessConfigApi
+					.bizExcessConfigSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 157 - 0
snowy-admin-web/src/views/biz/bizexcessconfig/index.vue

@@ -0,0 +1,157 @@
+<template>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizExcessConfigAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record, index  }">
+				<template v-if="column.dataIndex === 'serial'">
+					{{ index + 1 }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizExcessConfigEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizExcessConfigEdit', 'bizExcessConfigDelete'], 'and')" />
+						<a-button type="link" danger size="small" v-if="hasPerm('bizExcessConfigDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					<span v-if="record.status=='1'">启用</span>
+					<span v-else>关闭</span>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizexcessconfig">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizExcessConfigApi from '@/api/biz/bizExcessConfigApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	const tableRef = ref()
+	const formRef = ref()
+	const submitLoading = ref(false)
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '序号',
+			width: 80,
+			dataIndex: 'serial',
+			align:'center'
+		},
+		{
+			title: '车辆轴数',
+			dataIndex: 'vehicleAxleNumber',
+			align:'center'
+		},
+		{
+			title: '超限重量',
+			dataIndex: 'excessWeight',
+			align:'center'
+		},
+		{
+			title: '是否启用',
+			dataIndex: 'status',
+			align:'center'
+		},
+		{
+			title: '创建时间',
+			dataIndex: 'createTime',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	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) => {
+		return bizExcessConfigApi.bizExcessConfigPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizExcessConfig = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizExcessConfigApi.bizExcessConfigDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizExcessConfigApi
+					.bizExcessConfigDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizExcessConfig = (params) => {
+		bizExcessConfigApi.bizExcessConfigDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 84 - 0
snowy-admin-web/src/views/biz/bizsupplier/form.vue

@@ -0,0 +1,84 @@
+<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="supplierName">
+				<a-input v-model:value="formData.supplierName" placeholder="请输入供货商名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="供货商手机号:" name="supplierPhone">
+				<a-input v-model:value="formData.supplierPhone" placeholder="请输入供货商手机号" allow-clear />
+			</a-form-item>
+			<a-form-item label="供货商地址:" name="supplierAddress">
+				<a-input v-model:value="formData.supplierAddress" placeholder="请输入供货商地址" allow-clear />
+			</a-form-item>
+			<a-form-item label="备注:" name="supplierRemark">
+				<a-input v-model:value="formData.supplierRemark" 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="bizSupplierForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSupplierApi from '@/api/biz/bizSupplierApi'
+	// 抽屉状态
+	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 = {
+		supplierName: [required('请输入供货商名称')],
+		supplierPhone: [required('请输入供货商手机号')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizSupplierApi
+					.bizSupplierSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 121 - 0
snowy-admin-web/src/views/biz/bizsupplier/index.vue

@@ -0,0 +1,121 @@
+<template>
+	<a-card :bordered="false">
+		<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('bizSupplierAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizSupplierBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizSupplier"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSupplierEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizSupplierEdit', 'bizSupplierDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizSupplier(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizSupplierDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizsupplier">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizSupplierApi from '@/api/biz/bizSupplierApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '供货商名称',
+			dataIndex: 'supplierName'
+		},
+		{
+			title: '供货商手机号',
+			dataIndex: 'supplierPhone'
+		},
+		{
+			title: '供货商地址',
+			dataIndex: 'supplierAddress'
+		},
+		{
+			title: '备注',
+			dataIndex: 'supplierRemark'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizSupplierEdit', 'bizSupplierDelete'])) {
+		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) => {
+		return bizSupplierApi.bizSupplierPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizSupplier = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizSupplierApi.bizSupplierDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizSupplier = (params) => {
+		bizSupplierApi.bizSupplierDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 5 - 1
snowy-admin-web/src/views/biz/goods/form.vue

@@ -6,7 +6,7 @@
 		:destroy-on-close="true"
 		@close="onClose"
 	>
-		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
 			<a-form-item label="货品名称:" name="name">
 				<a-input v-model:value="formData.name" placeholder="请输入货品名称" allow-clear />
 			</a-form-item>
@@ -33,6 +33,10 @@
 	const formData = ref({})
 	const submitLoading = ref(false)
 
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
 	// 打开抽屉
 	const onOpen = (record) => {
 		open.value = true

+ 46 - 24
snowy-admin-web/src/views/biz/goods/index.vue

@@ -22,11 +22,8 @@
 			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>
@@ -34,13 +31,6 @@
 						<template #icon><plus-outlined /></template>
 						新增
 					</a-button>
-					<xn-batch-button
-						v-if="hasPerm('bizGoodsBatchDelete')"
-						buttonName="批量删除"
-						icon="DeleteOutlined"
-						:selectedRowKeys="selectedRowKeys"
-						@batchCallBack="deleteBatchBizGoods"
-					/>
 				</a-space>
 			</template>
 			<template #bodyCell="{ column, record, index }">
@@ -51,9 +41,7 @@
 					<a-space>
 						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizGoodsEdit')">编辑</a>
 						<a-divider type="vertical" v-if="hasPerm(['bizGoodsEdit', 'bizGoodsDelete'], 'and')" />
-						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizGoods(record)">
-							<a-button type="link" danger size="small" v-if="hasPerm('bizGoodsDelete')">删除</a-button>
-						</a-popconfirm>
+						<a-button type="link" danger size="small" v-if="hasPerm('bizGoodsDelete')" @click="deleteConfig(record)">删除</a-button>
 					</a-space>
 				</template>
 			</template>
@@ -66,35 +54,42 @@
 	import { cloneDeep } from 'lodash-es'
 	import Form from './form.vue'
 	import bizGoodsApi from '@/api/biz/bizGoodsApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
 	const searchFormState = ref({})
 	const searchFormRef = ref()
 	const tableRef = ref()
 	const formRef = ref()
+	const submitLoading = ref(false)
 	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
 	const columns = [
 		{
 			title: '序号',
 			width: 80,
-			dataIndex: 'serial'
+			dataIndex: 'serial',
+			align:'center'
 		},
 		{
 			title: '货品名称',
-			dataIndex: 'name'
+			dataIndex: 'name',
+			align:'center'
 		},
 		{
 			title: '货品规格',
-			dataIndex: 'model'
+			dataIndex: 'model',
+			align:'center'
 		}
 	]
 	// 操作栏通过权限判断是否显示
-	if (hasPerm(['bizGoodsEdit', 'bizGoodsDelete'])) {
-		columns.push({
-			title: '操作',
-			dataIndex: 'action',
-			align: 'center',
-			width: 150
-		})
-	}
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
 	const selectedRowKeys = ref([])
 	// 列表选择配置
 	const options = {
@@ -133,6 +128,33 @@
 			tableRef.value.refresh(true)
 		})
 	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizGoodsApi
+					.bizGoodsDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
 	// 批量删除
 	const deleteBatchBizGoods = (params) => {
 		bizGoodsApi.bizGoodsDelete(params).then(() => {

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/controller/BizAppointmentTimeController.java

@@ -0,0 +1,119 @@
+/*
+ * 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.bizappointmenttime.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.bizappointmenttime.entity.BizAppointmentTime;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeAddParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeEditParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeIdParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimePageParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.service.BizAppointmentTimeService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 预约时段配置控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ */
+@Tag(name = "预约时段配置控制器")
+@RestController
+@Validated
+public class BizAppointmentTimeController {
+
+    @Resource
+    private BizAppointmentTimeService bizAppointmentTimeService;
+
+    /**
+     * 获取预约时段配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    @Operation(summary = "获取预约时段配置分页")
+    @SaCheckPermission("/biz/bizappointmenttime/page")
+    @GetMapping("/biz/bizappointmenttime/page")
+    public CommonResult<Page<BizAppointmentTime>> page(BizAppointmentTimePageParam bizAppointmentTimePageParam) {
+        return CommonResult.data(bizAppointmentTimeService.page(bizAppointmentTimePageParam));
+    }
+
+    /**
+     * 添加预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    @Operation(summary = "添加预约时段配置")
+    @CommonLog("添加预约时段配置")
+    @PostMapping("/biz/bizappointmenttime/add")
+    public CommonResult<String> add(@RequestBody @Valid BizAppointmentTimeAddParam bizAppointmentTimeAddParam) {
+        bizAppointmentTimeService.add(bizAppointmentTimeAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    @Operation(summary = "编辑预约时段配置")
+    @CommonLog("编辑预约时段配置")
+    @PostMapping("/biz/bizappointmenttime/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizAppointmentTimeEditParam bizAppointmentTimeEditParam) {
+        bizAppointmentTimeService.edit(bizAppointmentTimeEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    @Operation(summary = "删除预约时段配置")
+    @CommonLog("删除预约时段配置")
+    @PostMapping("/biz/bizappointmenttime/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizAppointmentTimeIdParam> bizAppointmentTimeIdParamList) {
+        bizAppointmentTimeService.delete(bizAppointmentTimeIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取预约时段配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    @Operation(summary = "获取预约时段配置详情")
+    @GetMapping("/biz/bizappointmenttime/detail")
+    public CommonResult<BizAppointmentTime> detail(@Valid BizAppointmentTimeIdParam bizAppointmentTimeIdParam) {
+        return CommonResult.data(bizAppointmentTimeService.detail(bizAppointmentTimeIdParam));
+    }
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/entity/BizAppointmentTime.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.bizappointmenttime.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预约时段配置实体
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+@Setter
+@TableName("biz_appointment_time")
+public class BizAppointmentTime extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 开始时段 */
+    @Schema(description = "开始时段")
+    private String beginTime;
+
+    /** 结束时段 */
+    @Schema(description = "结束时段")
+    private String endTime;
+
+    /** 申请数量 */
+    @Schema(description = "申请数量")
+    private Integer applyNumber;
+
+    /** 已经申请数量 */
+    @Schema(description = "已经申请数量")
+    private Integer applyNumberAlready;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/enums/BizAppointmentTimeEnum.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.bizappointmenttime.enums;
+
+import lombok.Getter;
+
+/**
+ * 预约时段配置枚举
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+public enum BizAppointmentTimeEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizAppointmentTimeEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/mapper/BizAppointmentTimeMapper.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.bizappointmenttime.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizappointmenttime.entity.BizAppointmentTime;
+
+/**
+ * 预约时段配置Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+public interface BizAppointmentTimeMapper extends BaseMapper<BizAppointmentTime> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/mapper/mapping/BizAppointmentTimeMapper.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.bizappointmenttime.mapper.BizAppointmentTimeMapper">
+
+</mapper>

+ 53 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeAddParam.java

@@ -0,0 +1,53 @@
+/*
+ * 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.bizappointmenttime.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预约时段配置添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+@Setter
+public class BizAppointmentTimeAddParam {
+
+    /** 开始时段 */
+    @Schema(description = "开始时段", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "beginTime不能为空")
+    private String beginTime;
+
+    /** 结束时段 */
+    @Schema(description = "结束时段", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "endTime不能为空")
+    private String endTime;
+
+    /** 申请数量 */
+    @Schema(description = "申请数量", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "applyNumber不能为空")
+    private Integer applyNumber;
+
+    /** 已经申请数量 */
+    @Schema(description = "已经申请数量")
+    private Integer applyNumberAlready;
+
+}

+ 58 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeEditParam.java

@@ -0,0 +1,58 @@
+/*
+ * 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.bizappointmenttime.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预约时段配置编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+@Setter
+public class BizAppointmentTimeEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 开始时段 */
+    @Schema(description = "开始时段", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "beginTime不能为空")
+    private String beginTime;
+
+    /** 结束时段 */
+    @Schema(description = "结束时段", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "endTime不能为空")
+    private String endTime;
+
+    /** 申请数量 */
+    @Schema(description = "申请数量", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "applyNumber不能为空")
+    private Integer applyNumber;
+
+    /** 已经申请数量 */
+    @Schema(description = "已经申请数量")
+    private Integer applyNumberAlready;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimeIdParam.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.bizappointmenttime.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 预约时段配置Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+@Setter
+public class BizAppointmentTimeIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/param/BizAppointmentTimePageParam.java

@@ -0,0 +1,51 @@
+/*
+ * 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.bizappointmenttime.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预约时段配置查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Getter
+@Setter
+public class BizAppointmentTimePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/service/BizAppointmentTimeService.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.bizappointmenttime.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizappointmenttime.entity.BizAppointmentTime;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeAddParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeEditParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeIdParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimePageParam;
+
+import java.util.List;
+
+/**
+ * 预约时段配置Service接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+public interface BizAppointmentTimeService extends IService<BizAppointmentTime> {
+
+    /**
+     * 获取预约时段配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    Page<BizAppointmentTime> page(BizAppointmentTimePageParam bizAppointmentTimePageParam);
+
+    /**
+     * 添加预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    void add(BizAppointmentTimeAddParam bizAppointmentTimeAddParam);
+
+    /**
+     * 编辑预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    void edit(BizAppointmentTimeEditParam bizAppointmentTimeEditParam);
+
+    /**
+     * 删除预约时段配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    void delete(List<BizAppointmentTimeIdParam> bizAppointmentTimeIdParamList);
+
+    /**
+     * 获取预约时段配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     */
+    BizAppointmentTime detail(BizAppointmentTimeIdParam bizAppointmentTimeIdParam);
+
+    /**
+     * 获取预约时段配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 17:46
+     **/
+    BizAppointmentTime queryEntity(String id);
+}

+ 216 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmenttime/service/impl/BizAppointmentTimeServiceImpl.java

@@ -0,0 +1,216 @@
+/*
+ * 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.bizappointmenttime.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 lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+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.bizappointmenttime.entity.BizAppointmentTime;
+import vip.xiaonuo.biz.modular.bizappointmenttime.mapper.BizAppointmentTimeMapper;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeAddParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeEditParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimeIdParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.param.BizAppointmentTimePageParam;
+import vip.xiaonuo.biz.modular.bizappointmenttime.service.BizAppointmentTimeService;
+
+import java.time.LocalTime;
+import java.util.List;
+
+/**
+ * 预约时段配置Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/20 17:46
+ **/
+@Service
+@Slf4j
+public class BizAppointmentTimeServiceImpl extends ServiceImpl<BizAppointmentTimeMapper, BizAppointmentTime> implements BizAppointmentTimeService {
+
+    @Override
+    public Page<BizAppointmentTime> page(BizAppointmentTimePageParam bizAppointmentTimePageParam) {
+        QueryWrapper<BizAppointmentTime> queryWrapper = new QueryWrapper<BizAppointmentTime>().checkSqlInjection();
+        queryWrapper.lambda().orderByAsc(BizAppointmentTime::getBeginTime);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizAppointmentTimeAddParam bizAppointmentTimeAddParam) {
+        checkAddParam(bizAppointmentTimeAddParam);
+        BizAppointmentTime bizAppointmentTime = BeanUtil.toBean(bizAppointmentTimeAddParam, BizAppointmentTime.class);
+        this.save(bizAppointmentTime);
+    }
+
+    public void checkAddParam(BizAppointmentTimeAddParam bizAppointmentTimeAddParam){
+        //根据时间段查询
+        List<BizAppointmentTime> appointmentTimeList = this.list(new QueryWrapper<BizAppointmentTime>().lambda().
+                eq(BizAppointmentTime::getBeginTime, bizAppointmentTimeAddParam.getBeginTime()).
+                eq(BizAppointmentTime::getEndTime, bizAppointmentTimeAddParam.getEndTime()));
+        if(ObjectUtil.isNotEmpty(appointmentTimeList)){
+            throw new CommonException("当前时间段已经存在,不可添加!");
+        }
+
+        //新增时选择的时间段
+        Integer beginTimeAddone = Integer.parseInt(bizAppointmentTimeAddParam.getBeginTime().split(":")[0]);
+        Integer beginTimeAddTwo = Integer.parseInt(bizAppointmentTimeAddParam.getBeginTime().split(":")[1]);
+
+        Integer endTimeAddOne = Integer.parseInt(bizAppointmentTimeAddParam.getEndTime().split(":")[0]);
+        Integer endTimeAddTwo = Integer.parseInt(bizAppointmentTimeAddParam.getEndTime().split(":")[1]);
+
+        //校验添加结束时间段可能大于等于开始时间段
+        if(checkAddTime(LocalTime.of(beginTimeAddone,beginTimeAddTwo),LocalTime.of(endTimeAddOne,endTimeAddTwo))){
+            throw new CommonException("开始时间段不能大于等于结束时间段且不能添加跨天的时间段!");
+        }
+        List<BizAppointmentTime> list = this.list();
+        for(BizAppointmentTime appointmentTime : list){
+            //开始时间段
+            Integer beginTimeOne = Integer.parseInt(appointmentTime.getBeginTime().split(":")[0]);
+            Integer beginTimeTwo = Integer.parseInt(appointmentTime.getBeginTime().split(":")[1]);
+
+            Integer endTimeOne = Integer.parseInt(appointmentTime.getEndTime().split(":")[0]);
+            Integer endTimeTwo = Integer.parseInt(appointmentTime.getEndTime().split(":")[1]);
+
+
+            if(hasIntersection(LocalTime.of(beginTimeAddone,beginTimeAddTwo),LocalTime.of(endTimeAddOne,endTimeAddTwo),
+                    LocalTime.of(beginTimeOne,beginTimeTwo),LocalTime.of(endTimeOne,endTimeTwo))
+            ){
+                throw new CommonException("当前时间段和添加过的时间段有交集,不可添加!");
+            }
+        }
+    }
+
+    public void checkEditParam(BizAppointmentTimeEditParam bizAppointmentTimeEditParam){
+        //根据时间段查询
+        List<BizAppointmentTime> appointmentTimeList = this.list(new QueryWrapper<BizAppointmentTime>().lambda().
+                eq(BizAppointmentTime::getBeginTime, bizAppointmentTimeEditParam.getBeginTime()).
+                eq(BizAppointmentTime::getEndTime, bizAppointmentTimeEditParam.getEndTime()));
+        if(ObjectUtil.isNotEmpty(appointmentTimeList)){
+            throw new CommonException("当前时间段已经存在,不可添加!");
+        }
+
+        //新增时选择的时间段
+        Integer beginTimeAddone = Integer.parseInt(bizAppointmentTimeEditParam.getBeginTime().split(":")[0]);
+        Integer beginTimeAddTwo = Integer.parseInt(bizAppointmentTimeEditParam.getBeginTime().split(":")[1]);
+
+        Integer endTimeAddOne = Integer.parseInt(bizAppointmentTimeEditParam.getEndTime().split(":")[0]);
+        Integer endTimeAddTwo = Integer.parseInt(bizAppointmentTimeEditParam.getEndTime().split(":")[1]);
+
+        //校验添加结束时间段可能大于等于开始时间段
+        if(checkAddTime(LocalTime.of(beginTimeAddone,beginTimeAddTwo),LocalTime.of(endTimeAddOne,endTimeAddTwo))){
+            throw new CommonException("开始时间段不能大于等于结束时间段且不能添加跨天的时间段!");
+        }
+        List<BizAppointmentTime> list = this.list();
+        for(BizAppointmentTime appointmentTime : list){
+            //开始时间段
+            Integer beginTimeOne = Integer.parseInt(appointmentTime.getBeginTime().split(":")[0]);
+            Integer beginTimeTwo = Integer.parseInt(appointmentTime.getBeginTime().split(":")[1]);
+
+            Integer endTimeOne = Integer.parseInt(appointmentTime.getEndTime().split(":")[0]);
+            Integer endTimeTwo = Integer.parseInt(appointmentTime.getEndTime().split(":")[1]);
+
+
+            if(hasIntersection(LocalTime.of(beginTimeAddone,beginTimeAddTwo),LocalTime.of(endTimeAddOne,endTimeAddTwo),
+                    LocalTime.of(beginTimeOne,beginTimeTwo),LocalTime.of(endTimeOne,endTimeTwo))
+            ){
+                throw new CommonException("当前时间段和添加过的时间段有交集,不可添加!");
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizAppointmentTimeEditParam bizAppointmentTimeEditParam) {
+        BizAppointmentTime bizAppointmentTime = this.queryEntity(bizAppointmentTimeEditParam.getId());
+        if(!StringUtils.equals(bizAppointmentTime.getBeginTime(),bizAppointmentTimeEditParam.getBeginTime()) ||
+            !StringUtils.equals(bizAppointmentTime.getEndTime(),bizAppointmentTimeEditParam.getEndTime())){
+            checkEditParam(bizAppointmentTimeEditParam);
+        }
+        BeanUtil.copyProperties(bizAppointmentTimeEditParam, bizAppointmentTime);
+        this.updateById(bizAppointmentTime);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizAppointmentTimeIdParam> bizAppointmentTimeIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizAppointmentTimeIdParamList, BizAppointmentTimeIdParam::getId));
+    }
+
+    @Override
+    public BizAppointmentTime detail(BizAppointmentTimeIdParam bizAppointmentTimeIdParam) {
+        return this.queryEntity(bizAppointmentTimeIdParam.getId());
+    }
+
+    @Override
+    public BizAppointmentTime queryEntity(String id) {
+        BizAppointmentTime bizAppointmentTime = this.getById(id);
+        if(ObjectUtil.isEmpty(bizAppointmentTime)) {
+            throw new CommonException("预约时段配置不存在,id值为:{}", id);
+        }
+        return bizAppointmentTime;
+    }
+
+
+    public static boolean checkAddTime(LocalTime startA, LocalTime endA){
+        if(startA.isAfter(endA)){
+            if(endA == LocalTime.of(0,0)){
+                return false;
+            }
+            return true;
+        }else if(startA.isBefore(endA)){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+    public static boolean hasIntersection(LocalTime startA, LocalTime endA, LocalTime startB, LocalTime endB) {
+        // 如果时间段 B 结束于次日,则需要特殊处理,A 没有跨天
+        if (endB.isBefore(startB) && endA.isAfter(startA)) {
+            if(startA.isAfter(endB) && startB.isBefore(endA)){
+                return true;
+            }else{
+                return false;
+            }
+        } else if(endA.isBefore(startA) && endB.isAfter(startB)){
+            // 时段A 跨午夜 b 没有跨天
+            if(startA.isBefore(endB) && startB.isAfter(endA)){
+                return true;
+            }else{
+                return false;
+            }
+        } else if(endA.isBefore(startA) && endB.isBefore(startB)){
+            //时段A跨天  时段b跨天
+            if(startA.isAfter(endB) && startB.isAfter(endA)){
+                return true;
+            }else{
+                return false;
+            }
+        }else {
+            // 时间段 B 没有跨越午夜
+            // 使用常规的交集判断逻辑
+            return startA.isBefore(endB) && startB.isBefore(endA);
+        }
+    }
+}

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/controller/BizConfigController.java

@@ -0,0 +1,119 @@
+/*
+ * 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.bizconfig.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.bizconfig.entity.BizConfig;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigAddParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigEditParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigIdParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigPageParam;
+import vip.xiaonuo.biz.modular.bizconfig.service.BizConfigService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 系统配置控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ */
+@Tag(name = "系统配置控制器")
+@RestController
+@Validated
+public class BizConfigController {
+
+    @Resource
+    private BizConfigService bizConfigService;
+
+    /**
+     * 获取系统配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    @Operation(summary = "获取系统配置分页")
+    @SaCheckPermission("/biz/bizconfig/page")
+    @GetMapping("/biz/bizconfig/page")
+    public CommonResult<Page<BizConfig>> page(BizConfigPageParam bizConfigPageParam) {
+        return CommonResult.data(bizConfigService.page(bizConfigPageParam));
+    }
+
+    /**
+     * 添加系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    @Operation(summary = "添加系统配置")
+    @CommonLog("添加系统配置")
+    @PostMapping("/biz/bizconfig/add")
+    public CommonResult<String> add(@RequestBody @Valid BizConfigAddParam bizConfigAddParam) {
+        bizConfigService.add(bizConfigAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    @Operation(summary = "编辑系统配置")
+    @CommonLog("编辑系统配置")
+    @PostMapping("/biz/bizconfig/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizConfigEditParam bizConfigEditParam) {
+        bizConfigService.edit(bizConfigEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    @Operation(summary = "删除系统配置")
+    @CommonLog("删除系统配置")
+    @PostMapping("/biz/bizconfig/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizConfigIdParam> bizConfigIdParamList) {
+        bizConfigService.delete(bizConfigIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取系统配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    @Operation(summary = "获取系统配置详情")
+    @GetMapping("/biz/bizconfig/detail")
+    public CommonResult<BizConfig> detail(@Valid BizConfigIdParam bizConfigIdParam) {
+        return CommonResult.data(bizConfigService.detail(bizConfigIdParam));
+    }
+}

+ 63 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/entity/BizConfig.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.bizconfig.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 系统配置实体
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+@Setter
+@TableName("biz_config")
+public class BizConfig extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 排队时效 */
+    @Schema(description = "排队时效")
+    private Integer queueEfficiency;
+
+    /** 时段下拉个数 */
+    @Schema(description = "时段下拉个数")
+    private Integer pullNumber;
+
+    /** 停留时长 */
+    @Schema(description = "停留时长")
+    private Integer stopDuration;
+
+    /** 预约审核开关(1:开启   2:关闭) */
+    @Schema(description = "预约审核开关(1:开启   2:关闭)")
+    private String auditSwitch;
+
+    /** 订单重量校验开关(1:开启   2:关闭) */
+    @Schema(description = "订单重量校验开关(1:开启   2:关闭)")
+    private String orderWeightSwitch;
+
+    /** 门禁强制校验开关 */
+    @Schema(description = "门禁强制校验开关")
+    private String accessControlSwitch;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/enums/BizConfigEnum.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.bizconfig.enums;
+
+import lombok.Getter;
+
+/**
+ * 系统配置枚举
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+public enum BizConfigEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizConfigEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/mapper/BizConfigMapper.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.bizconfig.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizconfig.entity.BizConfig;
+
+/**
+ * 系统配置Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+public interface BizConfigMapper extends BaseMapper<BizConfig> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/mapper/mapping/BizConfigMapper.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.bizconfig.mapper.BizConfigMapper">
+
+</mapper>

+ 64 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigAddParam.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 系统配置添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+@Setter
+public class BizConfigAddParam {
+
+    /** 排队时效 */
+    @Schema(description = "排队时效", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "queueEfficiency不能为空")
+    private Integer queueEfficiency;
+
+    /** 时段下拉个数 */
+    @Schema(description = "时段下拉个数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "pullNumber不能为空")
+    private Integer pullNumber;
+
+    /** 停留时长 */
+    @Schema(description = "停留时长", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "stopDuration不能为空")
+    private Integer stopDuration;
+
+    /** 预约审核开关(1:开启   2:关闭) */
+    @Schema(description = "预约审核开关(1:开启   2:关闭)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "auditSwitch不能为空")
+    private String auditSwitch;
+
+    /** 订单重量校验开关(1:开启   2:关闭) */
+    @Schema(description = "订单重量校验开关(1:开启   2:关闭)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "orderWeightSwitch不能为空")
+    private String orderWeightSwitch;
+
+    /** 门禁强制校验开关 */
+    @Schema(description = "门禁强制校验开关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "accessControlSwitch不能为空")
+    private String accessControlSwitch;
+
+}

+ 69 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigEditParam.java

@@ -0,0 +1,69 @@
+/*
+ * 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.bizconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 系统配置编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+@Setter
+public class BizConfigEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 排队时效 */
+    @Schema(description = "排队时效", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "queueEfficiency不能为空")
+    private Integer queueEfficiency;
+
+    /** 时段下拉个数 */
+    @Schema(description = "时段下拉个数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "pullNumber不能为空")
+    private Integer pullNumber;
+
+    /** 停留时长 */
+    @Schema(description = "停留时长", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "stopDuration不能为空")
+    private Integer stopDuration;
+
+    /** 预约审核开关(1:开启   2:关闭) */
+    @Schema(description = "预约审核开关(1:开启   2:关闭)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "auditSwitch不能为空")
+    private String auditSwitch;
+
+    /** 订单重量校验开关(1:开启   2:关闭) */
+    @Schema(description = "订单重量校验开关(1:开启   2:关闭)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "orderWeightSwitch不能为空")
+    private String orderWeightSwitch;
+
+    /** 门禁强制校验开关 */
+    @Schema(description = "门禁强制校验开关", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "accessControlSwitch不能为空")
+    private String accessControlSwitch;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigIdParam.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.bizconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 系统配置Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+@Setter
+public class BizConfigIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * 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.bizconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 系统配置查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Getter
+@Setter
+public class BizConfigPageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/service/BizConfigService.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.bizconfig.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizconfig.entity.BizConfig;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigAddParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigEditParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigIdParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigPageParam;
+
+import java.util.List;
+
+/**
+ * 系统配置Service接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+public interface BizConfigService extends IService<BizConfig> {
+
+    /**
+     * 获取系统配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    Page<BizConfig> page(BizConfigPageParam bizConfigPageParam);
+
+    /**
+     * 添加系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    void add(BizConfigAddParam bizConfigAddParam);
+
+    /**
+     * 编辑系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    void edit(BizConfigEditParam bizConfigEditParam);
+
+    /**
+     * 删除系统配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    void delete(List<BizConfigIdParam> bizConfigIdParamList);
+
+    /**
+     * 获取系统配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     */
+    BizConfig detail(BizConfigIdParam bizConfigIdParam);
+
+    /**
+     * 获取系统配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 15:40
+     **/
+    BizConfig queryEntity(String id);
+}

+ 98 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/service/impl/BizConfigServiceImpl.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.bizconfig.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.bizconfig.entity.BizConfig;
+import vip.xiaonuo.biz.modular.bizconfig.mapper.BizConfigMapper;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigAddParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigEditParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigIdParam;
+import vip.xiaonuo.biz.modular.bizconfig.param.BizConfigPageParam;
+import vip.xiaonuo.biz.modular.bizconfig.service.BizConfigService;
+
+import java.util.List;
+
+/**
+ * 系统配置Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/20 15:40
+ **/
+@Service
+public class BizConfigServiceImpl extends ServiceImpl<BizConfigMapper, BizConfig> implements BizConfigService {
+
+    @Override
+    public Page<BizConfig> page(BizConfigPageParam bizConfigPageParam) {
+        QueryWrapper<BizConfig> queryWrapper = new QueryWrapper<BizConfig>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizConfigPageParam.getSortField(), bizConfigPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizConfigPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizConfigPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizConfigPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizConfig::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizConfigAddParam bizConfigAddParam) {
+        long count = this.count();
+        if(count>0){
+            throw new CommonException("已添加过配置信息!");
+        }
+        BizConfig bizConfig = BeanUtil.toBean(bizConfigAddParam, BizConfig.class);
+        this.save(bizConfig);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizConfigEditParam bizConfigEditParam) {
+        BizConfig bizConfig = this.queryEntity(bizConfigEditParam.getId());
+        BeanUtil.copyProperties(bizConfigEditParam, bizConfig);
+        this.updateById(bizConfig);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizConfigIdParam> bizConfigIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizConfigIdParamList, BizConfigIdParam::getId));
+    }
+
+    @Override
+    public BizConfig detail(BizConfigIdParam bizConfigIdParam) {
+        return this.queryEntity(bizConfigIdParam.getId());
+    }
+
+    @Override
+    public BizConfig queryEntity(String id) {
+        BizConfig bizConfig = this.getById(id);
+        if(ObjectUtil.isEmpty(bizConfig)) {
+            throw new CommonException("系统配置不存在,id值为:{}", id);
+        }
+        return bizConfig;
+    }
+}

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/controller/BizExcessConfigController.java

@@ -0,0 +1,119 @@
+/*
+ * 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.bizexcessconfig.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.bizexcessconfig.entity.BizExcessConfig;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigAddParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigEditParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigIdParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigPageParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.service.BizExcessConfigService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 超限配置控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ */
+@Tag(name = "超限配置控制器")
+@RestController
+@Validated
+public class BizExcessConfigController {
+
+    @Resource
+    private BizExcessConfigService bizExcessConfigService;
+
+    /**
+     * 获取超限配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    @Operation(summary = "获取超限配置分页")
+    @SaCheckPermission("/biz/bizexcessconfig/page")
+    @GetMapping("/biz/bizexcessconfig/page")
+    public CommonResult<Page<BizExcessConfig>> page(BizExcessConfigPageParam bizExcessConfigPageParam) {
+        return CommonResult.data(bizExcessConfigService.page(bizExcessConfigPageParam));
+    }
+
+    /**
+     * 添加超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    @Operation(summary = "添加超限配置")
+    @CommonLog("添加超限配置")
+    @PostMapping("/biz/bizexcessconfig/add")
+    public CommonResult<String> add(@RequestBody @Valid BizExcessConfigAddParam bizExcessConfigAddParam) {
+        bizExcessConfigService.add(bizExcessConfigAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    @Operation(summary = "编辑超限配置")
+    @CommonLog("编辑超限配置")
+    @PostMapping("/biz/bizexcessconfig/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizExcessConfigEditParam bizExcessConfigEditParam) {
+        bizExcessConfigService.edit(bizExcessConfigEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    @Operation(summary = "删除超限配置")
+    @CommonLog("删除超限配置")
+    @PostMapping("/biz/bizexcessconfig/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizExcessConfigIdParam> bizExcessConfigIdParamList) {
+        bizExcessConfigService.delete(bizExcessConfigIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取超限配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    @Operation(summary = "获取超限配置详情")
+    @GetMapping("/biz/bizexcessconfig/detail")
+    public CommonResult<BizExcessConfig> detail(@Valid BizExcessConfigIdParam bizExcessConfigIdParam) {
+        return CommonResult.data(bizExcessConfigService.detail(bizExcessConfigIdParam));
+    }
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/entity/BizExcessConfig.java

@@ -0,0 +1,51 @@
+/*
+ * 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.bizexcessconfig.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 超限配置实体
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+@Setter
+@TableName("biz_excess_config")
+public class BizExcessConfig extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 车辆轴数 */
+    @Schema(description = "车辆轴数")
+    private Integer vehicleAxleNumber;
+
+    /** 超限重量 */
+    @Schema(description = "超限重量")
+    private Integer excessWeight;
+
+    /** 是否启用 */
+    @Schema(description = "是否启用")
+    private String status;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/enums/BizExcessConfigEnum.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.bizexcessconfig.enums;
+
+import lombok.Getter;
+
+/**
+ * 超限配置枚举
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+public enum BizExcessConfigEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizExcessConfigEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/mapper/BizExcessConfigMapper.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.bizexcessconfig.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizexcessconfig.entity.BizExcessConfig;
+
+/**
+ * 超限配置Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+public interface BizExcessConfigMapper extends BaseMapper<BizExcessConfig> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/mapper/mapping/BizExcessConfigMapper.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.bizexcessconfig.mapper.BizExcessConfigMapper">
+
+</mapper>

+ 48 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigAddParam.java

@@ -0,0 +1,48 @@
+/*
+ * 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.bizexcessconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 超限配置添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+@Setter
+public class BizExcessConfigAddParam {
+
+    /** 车辆轴数 */
+    @Schema(description = "车辆轴数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "vehicleAxleNumber不能为空")
+    private Integer vehicleAxleNumber;
+
+    /** 超限重量 */
+    @Schema(description = "超限重量", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "excessWeight不能为空")
+    private Integer excessWeight;
+
+    /** 是否启用 */
+    @Schema(description = "是否启用")
+    private String status;
+
+}

+ 53 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigEditParam.java

@@ -0,0 +1,53 @@
+/*
+ * 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.bizexcessconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 超限配置编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+@Setter
+public class BizExcessConfigEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 车辆轴数 */
+    @Schema(description = "车辆轴数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "vehicleAxleNumber不能为空")
+    private Integer vehicleAxleNumber;
+
+    /** 超限重量 */
+    @Schema(description = "超限重量", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "excessWeight不能为空")
+    private Integer excessWeight;
+
+    /** 是否启用 */
+    @Schema(description = "是否启用")
+    private String status;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigIdParam.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.bizexcessconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 超限配置Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+@Setter
+public class BizExcessConfigIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/param/BizExcessConfigPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * 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.bizexcessconfig.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 超限配置查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Getter
+@Setter
+public class BizExcessConfigPageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/service/BizExcessConfigService.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.bizexcessconfig.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizexcessconfig.entity.BizExcessConfig;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigAddParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigEditParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigIdParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigPageParam;
+
+import java.util.List;
+
+/**
+ * 超限配置Service接口
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+public interface BizExcessConfigService extends IService<BizExcessConfig> {
+
+    /**
+     * 获取超限配置分页
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    Page<BizExcessConfig> page(BizExcessConfigPageParam bizExcessConfigPageParam);
+
+    /**
+     * 添加超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    void add(BizExcessConfigAddParam bizExcessConfigAddParam);
+
+    /**
+     * 编辑超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    void edit(BizExcessConfigEditParam bizExcessConfigEditParam);
+
+    /**
+     * 删除超限配置
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    void delete(List<BizExcessConfigIdParam> bizExcessConfigIdParamList);
+
+    /**
+     * 获取超限配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     */
+    BizExcessConfig detail(BizExcessConfigIdParam bizExcessConfigIdParam);
+
+    /**
+     * 获取超限配置详情
+     *
+     * @author fanzherong
+     * @date  2025/03/20 16:46
+     **/
+    BizExcessConfig queryEntity(String id);
+}

+ 103 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizexcessconfig/service/impl/BizExcessConfigServiceImpl.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.bizexcessconfig.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.apache.commons.lang3.StringUtils;
+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.bizexcessconfig.entity.BizExcessConfig;
+import vip.xiaonuo.biz.modular.bizexcessconfig.mapper.BizExcessConfigMapper;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigAddParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigEditParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigIdParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.param.BizExcessConfigPageParam;
+import vip.xiaonuo.biz.modular.bizexcessconfig.service.BizExcessConfigService;
+
+import java.util.List;
+
+/**
+ * 超限配置Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/20 16:46
+ **/
+@Service
+public class BizExcessConfigServiceImpl extends ServiceImpl<BizExcessConfigMapper, BizExcessConfig> implements BizExcessConfigService {
+
+    @Override
+    public Page<BizExcessConfig> page(BizExcessConfigPageParam bizExcessConfigPageParam) {
+        QueryWrapper<BizExcessConfig> queryWrapper = new QueryWrapper<BizExcessConfig>().checkSqlInjection();
+        queryWrapper.lambda().orderByDesc(BizExcessConfig::getCreateTime);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizExcessConfigAddParam bizExcessConfigAddParam) {
+        //根据车辆轴数查询,相同的轴数不能重复创建
+        long count = this.count(new QueryWrapper<BizExcessConfig>().lambda().
+                eq(BizExcessConfig::getVehicleAxleNumber, bizExcessConfigAddParam.getVehicleAxleNumber()));
+        if(count>0){
+            throw new CommonException("该轴数已经添加过超限重量!");
+        }
+        BizExcessConfig bizExcessConfig = BeanUtil.toBean(bizExcessConfigAddParam, BizExcessConfig.class);
+        this.save(bizExcessConfig);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizExcessConfigEditParam bizExcessConfigEditParam) {
+        BizExcessConfig bizExcessConfig = this.queryEntity(bizExcessConfigEditParam.getId());
+        //判断是否修改过轴数,如果修改过,则校验该轴数是否添加过超限配置
+        if(bizExcessConfig.getVehicleAxleNumber()!=bizExcessConfigEditParam.getVehicleAxleNumber()){
+            long count = this.count(new QueryWrapper<BizExcessConfig>().lambda().
+                    eq(BizExcessConfig::getVehicleAxleNumber, bizExcessConfigEditParam.getVehicleAxleNumber()));
+            if(count>0){
+                throw new CommonException("该轴数已经添加过超限重量!");
+            }
+        }
+        BeanUtil.copyProperties(bizExcessConfigEditParam, bizExcessConfig);
+        this.updateById(bizExcessConfig);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizExcessConfigIdParam> bizExcessConfigIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizExcessConfigIdParamList, BizExcessConfigIdParam::getId));
+    }
+
+    @Override
+    public BizExcessConfig detail(BizExcessConfigIdParam bizExcessConfigIdParam) {
+        return this.queryEntity(bizExcessConfigIdParam.getId());
+    }
+
+    @Override
+    public BizExcessConfig queryEntity(String id) {
+        BizExcessConfig bizExcessConfig = this.getById(id);
+        if(ObjectUtil.isEmpty(bizExcessConfig)) {
+            throw new CommonException("超限配置不存在,id值为:{}", id);
+        }
+        return bizExcessConfig;
+    }
+}

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/controller/BizSupplierController.java

@@ -0,0 +1,119 @@
+/*
+ * 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.bizsupplier.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.bizsupplier.entity.BizSupplier;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierPageParam;
+import vip.xiaonuo.biz.modular.bizsupplier.service.BizSupplierService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 供货商控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ */
+@Tag(name = "供货商控制器")
+@RestController
+@Validated
+public class BizSupplierController {
+
+    @Resource
+    private BizSupplierService bizSupplierService;
+
+    /**
+     * 获取供货商分页
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    @Operation(summary = "获取供货商分页")
+    @SaCheckPermission("/biz/bizsupplier/page")
+    @GetMapping("/biz/bizsupplier/page")
+    public CommonResult<Page<BizSupplier>> page(BizSupplierPageParam bizSupplierPageParam) {
+        return CommonResult.data(bizSupplierService.page(bizSupplierPageParam));
+    }
+
+    /**
+     * 添加供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    @Operation(summary = "添加供货商")
+    @CommonLog("添加供货商")
+    @PostMapping("/biz/bizsupplier/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSupplierAddParam bizSupplierAddParam) {
+        bizSupplierService.add(bizSupplierAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    @Operation(summary = "编辑供货商")
+    @CommonLog("编辑供货商")
+    @PostMapping("/biz/bizsupplier/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSupplierEditParam bizSupplierEditParam) {
+        bizSupplierService.edit(bizSupplierEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    @Operation(summary = "删除供货商")
+    @CommonLog("删除供货商")
+    @PostMapping("/biz/bizsupplier/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSupplierIdParam> bizSupplierIdParamList) {
+        bizSupplierService.delete(bizSupplierIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取供货商详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    @Operation(summary = "获取供货商详情")
+    @GetMapping("/biz/bizsupplier/detail")
+    public CommonResult<BizSupplier> detail(@Valid BizSupplierIdParam bizSupplierIdParam) {
+        return CommonResult.data(bizSupplierService.detail(bizSupplierIdParam));
+    }
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/entity/BizSupplier.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.bizsupplier.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 供货商实体
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+@Setter
+@TableName("biz_supplier")
+public class BizSupplier extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 供货商名称 */
+    @Schema(description = "供货商名称")
+    private String supplierName;
+
+    /** 供货商手机号 */
+    @Schema(description = "供货商手机号")
+    private String supplierPhone;
+
+    /** 供货商地址 */
+    @Schema(description = "供货商地址")
+    private String supplierAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String supplierRemark;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/enums/BizSupplierEnum.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.bizsupplier.enums;
+
+import lombok.Getter;
+
+/**
+ * 供货商枚举
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+public enum BizSupplierEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSupplierEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/mapper/BizSupplierMapper.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.bizsupplier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizsupplier.entity.BizSupplier;
+
+/**
+ * 供货商Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+public interface BizSupplierMapper extends BaseMapper<BizSupplier> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/mapper/mapping/BizSupplierMapper.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.bizsupplier.mapper.BizSupplierMapper">
+
+</mapper>

+ 52 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierAddParam.java

@@ -0,0 +1,52 @@
+/*
+ * 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.bizsupplier.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 供货商添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+@Setter
+public class BizSupplierAddParam {
+
+    /** 供货商名称 */
+    @Schema(description = "供货商名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "supplierName不能为空")
+    private String supplierName;
+
+    /** 供货商手机号 */
+    @Schema(description = "供货商手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "supplierPhone不能为空")
+    private String supplierPhone;
+
+    /** 供货商地址 */
+    @Schema(description = "供货商地址")
+    private String supplierAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String supplierRemark;
+
+}

+ 57 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierEditParam.java

@@ -0,0 +1,57 @@
+/*
+ * 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.bizsupplier.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 供货商编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+@Setter
+public class BizSupplierEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 供货商名称 */
+    @Schema(description = "供货商名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "supplierName不能为空")
+    private String supplierName;
+
+    /** 供货商手机号 */
+    @Schema(description = "供货商手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "supplierPhone不能为空")
+    private String supplierPhone;
+
+    /** 供货商地址 */
+    @Schema(description = "供货商地址")
+    private String supplierAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String supplierRemark;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierIdParam.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.bizsupplier.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 供货商Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+@Setter
+public class BizSupplierIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * 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.bizsupplier.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 供货商查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Getter
+@Setter
+public class BizSupplierPageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/service/BizSupplierService.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.bizsupplier.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsupplier.entity.BizSupplier;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierPageParam;
+
+import java.util.List;
+
+/**
+ * 供货商Service接口
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+public interface BizSupplierService extends IService<BizSupplier> {
+
+    /**
+     * 获取供货商分页
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    Page<BizSupplier> page(BizSupplierPageParam bizSupplierPageParam);
+
+    /**
+     * 添加供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    void add(BizSupplierAddParam bizSupplierAddParam);
+
+    /**
+     * 编辑供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    void edit(BizSupplierEditParam bizSupplierEditParam);
+
+    /**
+     * 删除供货商
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    void delete(List<BizSupplierIdParam> bizSupplierIdParamList);
+
+    /**
+     * 获取供货商详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     */
+    BizSupplier detail(BizSupplierIdParam bizSupplierIdParam);
+
+    /**
+     * 获取供货商详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 10:38
+     **/
+    BizSupplier queryEntity(String id);
+}

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

@@ -0,0 +1,94 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsupplier.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.bizsupplier.entity.BizSupplier;
+import vip.xiaonuo.biz.modular.bizsupplier.mapper.BizSupplierMapper;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizsupplier.param.BizSupplierPageParam;
+import vip.xiaonuo.biz.modular.bizsupplier.service.BizSupplierService;
+
+import java.util.List;
+
+/**
+ * 供货商Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/21 10:38
+ **/
+@Service
+public class BizSupplierServiceImpl extends ServiceImpl<BizSupplierMapper, BizSupplier> implements BizSupplierService {
+
+    @Override
+    public Page<BizSupplier> page(BizSupplierPageParam bizSupplierPageParam) {
+        QueryWrapper<BizSupplier> queryWrapper = new QueryWrapper<BizSupplier>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizSupplierPageParam.getSortField(), bizSupplierPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizSupplierPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizSupplierPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizSupplierPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizSupplier::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSupplierAddParam bizSupplierAddParam) {
+        BizSupplier bizSupplier = BeanUtil.toBean(bizSupplierAddParam, BizSupplier.class);
+        this.save(bizSupplier);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSupplierEditParam bizSupplierEditParam) {
+        BizSupplier bizSupplier = this.queryEntity(bizSupplierEditParam.getId());
+        BeanUtil.copyProperties(bizSupplierEditParam, bizSupplier);
+        this.updateById(bizSupplier);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSupplierIdParam> bizSupplierIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizSupplierIdParamList, BizSupplierIdParam::getId));
+    }
+
+    @Override
+    public BizSupplier detail(BizSupplierIdParam bizSupplierIdParam) {
+        return this.queryEntity(bizSupplierIdParam.getId());
+    }
+
+    @Override
+    public BizSupplier queryEntity(String id) {
+        BizSupplier bizSupplier = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSupplier)) {
+            throw new CommonException("供货商不存在,id值为:{}", id);
+        }
+        return bizSupplier;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/goods/service/impl/BizGoodsServiceImpl.java

@@ -19,6 +19,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
@@ -65,6 +66,17 @@ public class BizGoodsServiceImpl extends ServiceImpl<BizGoodsMapper, BizGoods> i
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(BizGoodsAddParam bizGoodsAddParam) {
+        QueryWrapper<BizGoods> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(bizGoodsAddParam.getName())){
+            queryWrapper.lambda().eq(BizGoods::getName,bizGoodsAddParam.getName());
+        }
+        if(ObjectUtil.isNotEmpty(bizGoodsAddParam.getModel())){
+            queryWrapper.lambda().eq(BizGoods::getModel,bizGoodsAddParam.getModel());
+        }
+        long count = this.count(queryWrapper);
+        if(count>0){
+            throw new CommonException("该货品已经存在!");
+        }
         BizGoods bizGoods = BeanUtil.toBean(bizGoodsAddParam, BizGoods.class);
         this.save(bizGoods);
     }
@@ -73,6 +85,19 @@ public class BizGoodsServiceImpl extends ServiceImpl<BizGoodsMapper, BizGoods> i
     @Override
     public void edit(BizGoodsEditParam bizGoodsEditParam) {
         BizGoods bizGoods = this.queryEntity(bizGoodsEditParam.getId());
+        if(!StringUtils.equals(bizGoods.getName(),bizGoodsEditParam.getName()) || !StringUtils.equals(bizGoods.getModel(),bizGoodsEditParam.getModel())){
+            QueryWrapper<BizGoods> queryWrapper = new QueryWrapper<>();
+            if(ObjectUtil.isNotEmpty(bizGoodsEditParam.getName())){
+                queryWrapper.lambda().eq(BizGoods::getName,bizGoodsEditParam.getName());
+            }
+            if(ObjectUtil.isNotEmpty(bizGoodsEditParam.getModel())){
+                queryWrapper.lambda().eq(BizGoods::getModel,bizGoodsEditParam.getModel());
+            }
+            long count = this.count(queryWrapper);
+            if(count>0){
+                throw new CommonException("该货品已经存在!");
+            }
+        }
         BeanUtil.copyProperties(bizGoodsEditParam, bizGoods);
         this.updateById(bizGoods);
     }