Browse Source

新增模块

fanzherong_v 1 month ago
parent
commit
a3bdba5c0b
46 changed files with 3415 additions and 0 deletions
  1. 28 0
      snowy-admin-web/src/api/biz/bizSupplierAccountApi.js
  2. 28 0
      snowy-admin-web/src/api/biz/bizSupplierTransportApi.js
  3. 74 0
      snowy-admin-web/src/views/biz/bizloadpoint/form.vue
  4. 109 0
      snowy-admin-web/src/views/biz/bizloadpoint/index.vue
  5. 85 0
      snowy-admin-web/src/views/biz/bizloadtime/form.vue
  6. 125 0
      snowy-admin-web/src/views/biz/bizloadtime/index.vue
  7. 76 0
      snowy-admin-web/src/views/biz/bizloaduser/form.vue
  8. 113 0
      snowy-admin-web/src/views/biz/bizloaduser/index.vue
  9. 82 0
      snowy-admin-web/src/views/biz/bizparkconfig/form.vue
  10. 121 0
      snowy-admin-web/src/views/biz/bizparkconfig/index.vue
  11. 73 0
      snowy-admin-web/src/views/biz/bizprocess/form.vue
  12. 109 0
      snowy-admin-web/src/views/biz/bizprocess/index.vue
  13. 76 0
      snowy-admin-web/src/views/biz/bizprocessnode/form.vue
  14. 113 0
      snowy-admin-web/src/views/biz/bizprocessnode/index.vue
  15. 88 0
      snowy-admin-web/src/views/biz/bizservicecustomer/form.vue
  16. 125 0
      snowy-admin-web/src/views/biz/bizservicecustomer/index.vue
  17. 91 0
      snowy-admin-web/src/views/biz/bizservicecustomeraccount/form.vue
  18. 133 0
      snowy-admin-web/src/views/biz/bizservicecustomeraccount/index.vue
  19. 85 0
      snowy-admin-web/src/views/biz/bizservicecustomerflow/form.vue
  20. 125 0
      snowy-admin-web/src/views/biz/bizservicecustomerflow/index.vue
  21. 76 0
      snowy-admin-web/src/views/biz/bizsupplieraccount/form.vue
  22. 113 0
      snowy-admin-web/src/views/biz/bizsupplieraccount/index.vue
  23. 79 0
      snowy-admin-web/src/views/biz/bizsuppliertransport/form.vue
  24. 117 0
      snowy-admin-web/src/views/biz/bizsuppliertransport/index.vue
  25. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/controller/BizSupplierAccountController.java
  26. 47 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/entity/BizSupplierAccount.java
  27. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/enums/BizSupplierAccountEnum.java
  28. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/mapper/BizSupplierAccountMapper.java
  29. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/mapper/mapping/BizSupplierAccountMapper.xml
  30. 42 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountAddParam.java
  31. 47 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountEditParam.java
  32. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountIdParam.java
  33. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountPageParam.java
  34. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/service/BizSupplierAccountService.java
  35. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/service/impl/BizSupplierAccountServiceImpl.java
  36. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/controller/BizSupplierTransportController.java
  37. 52 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/entity/BizSupplierTransport.java
  38. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/enums/BizSupplierTransportEnum.java
  39. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/mapper/BizSupplierTransportMapper.java
  40. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/mapper/mapping/BizSupplierTransportMapper.xml
  41. 46 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportAddParam.java
  42. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportEditParam.java
  43. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportIdParam.java
  44. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportPageParam.java
  45. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/service/BizSupplierTransportService.java
  46. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/service/impl/BizSupplierTransportServiceImpl.java

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizsupplieraccount/` + url, ...arg)
+
+/**
+ * 供应商账号信息Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+export default {
+	// 获取供应商账号信息分页
+	bizSupplierAccountPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交供应商账号信息表单 edit为true时为编辑,默认为新增
+	bizSupplierAccountSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除供应商账号信息
+	bizSupplierAccountDelete(data) {
+		return request('delete', data)
+	},
+	// 获取供应商账号信息详情
+	bizSupplierAccountDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizsuppliertransport/` + url, ...arg)
+
+/**
+ * 供应商运输管理Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+export default {
+	// 获取供应商运输管理分页
+	bizSupplierTransportPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交供应商运输管理表单 edit为true时为编辑,默认为新增
+	bizSupplierTransportSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除供应商运输管理
+	bizSupplierTransportDelete(data) {
+		return request('delete', data)
+	},
+	// 获取供应商运输管理详情
+	bizSupplierTransportDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 74 - 0
snowy-admin-web/src/views/biz/bizloadpoint/form.vue

@@ -0,0 +1,74 @@
+<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="loadPoint">
+				<a-input v-model:value="formData.loadPoint" 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="bizLoadPointForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizLoadPointApi from '@/api/biz/bizLoadPointApi'
+	// 抽屉状态
+	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 = {
+		loadPoint: [required('请输入装货点位')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizLoadPointApi
+					.bizLoadPointSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 109 - 0
snowy-admin-web/src/views/biz/bizloadpoint/index.vue

@@ -0,0 +1,109 @@
+<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('bizLoadPointAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizLoadPointBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizLoadPoint"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizLoadPointEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizLoadPointEdit', 'bizLoadPointDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizLoadPoint(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizLoadPointDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizloadpoint">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizLoadPointApi from '@/api/biz/bizLoadPointApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '装货点位',
+			dataIndex: 'loadPoint'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizLoadPointEdit', 'bizLoadPointDelete'])) {
+		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 bizLoadPointApi.bizLoadPointPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizLoadPoint = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizLoadPointApi.bizLoadPointDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizLoadPoint = (params) => {
+		bizLoadPointApi.bizLoadPointDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 85 - 0
snowy-admin-web/src/views/biz/bizloadtime/form.vue

@@ -0,0 +1,85 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑装货时间配置' : '增加装货时间配置'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="装货点位id:" name="pointId">
+				<a-input v-model:value="formData.pointId" placeholder="请输入装货点位id" allow-clear />
+			</a-form-item>
+			<a-form-item label="开始时间:" name="beginTime">
+				<a-date-picker v-model:value="formData.beginTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择开始时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="结束时间:" name="endTime">
+				<a-date-picker v-model:value="formData.endTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择结束时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="可约次数:" name="availableNumber">
+				<a-input v-model:value="formData.availableNumber" placeholder="请输入可约次数" allow-clear />
+			</a-form-item>
+			<a-form-item label="已约次数:" name="alreadyNumber">
+				<a-input v-model:value="formData.alreadyNumber" 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="bizLoadTimeForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizLoadTimeApi from '@/api/biz/bizLoadTimeApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizLoadTimeApi
+					.bizLoadTimeSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 125 - 0
snowy-admin-web/src/views/biz/bizloadtime/index.vue

@@ -0,0 +1,125 @@
+<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('bizLoadTimeAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizLoadTimeBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizLoadTime"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizLoadTimeEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizLoadTimeEdit', 'bizLoadTimeDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizLoadTime(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizLoadTimeDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizloadtime">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizLoadTimeApi from '@/api/biz/bizLoadTimeApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '装货点位id',
+			dataIndex: 'pointId'
+		},
+		{
+			title: '开始时间',
+			dataIndex: 'beginTime'
+		},
+		{
+			title: '结束时间',
+			dataIndex: 'endTime'
+		},
+		{
+			title: '可约次数',
+			dataIndex: 'availableNumber'
+		},
+		{
+			title: '已约次数',
+			dataIndex: 'alreadyNumber'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizLoadTimeEdit', 'bizLoadTimeDelete'])) {
+		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 bizLoadTimeApi.bizLoadTimePage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizLoadTime = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizLoadTimeApi.bizLoadTimeDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizLoadTime = (params) => {
+		bizLoadTimeApi.bizLoadTimeDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 76 - 0
snowy-admin-web/src/views/biz/bizloaduser/form.vue

@@ -0,0 +1,76 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑装货点人员信息' : '增加装货点人员信息'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="装货点位id:" name="loadId">
+				<a-input v-model:value="formData.loadId" placeholder="请输入装货点位id" allow-clear />
+			</a-form-item>
+			<a-form-item label="点位人员信息:" name="userId">
+				<a-input v-model:value="formData.userId" 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="bizLoadUserForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizLoadUserApi from '@/api/biz/bizLoadUserApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizLoadUserApi
+					.bizLoadUserSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 113 - 0
snowy-admin-web/src/views/biz/bizloaduser/index.vue

@@ -0,0 +1,113 @@
+<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('bizLoadUserAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizLoadUserBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizLoadUser"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizLoadUserEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizLoadUserEdit', 'bizLoadUserDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizLoadUser(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizLoadUserDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizloaduser">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizLoadUserApi from '@/api/biz/bizLoadUserApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '装货点位id',
+			dataIndex: 'loadId'
+		},
+		{
+			title: '点位人员信息',
+			dataIndex: 'userId'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizLoadUserEdit', 'bizLoadUserDelete'])) {
+		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 bizLoadUserApi.bizLoadUserPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizLoadUser = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizLoadUserApi.bizLoadUserDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizLoadUser = (params) => {
+		bizLoadUserApi.bizLoadUserDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

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

@@ -0,0 +1,82 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑停车费配置' : '增加停车费配置'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="预约类型:" name="appointmentType">
+				<a-input v-model:value="formData.appointmentType" placeholder="请输入预约类型" allow-clear />
+			</a-form-item>
+			<a-form-item label="免费停留时长:" name="freeParkTime">
+				<a-input v-model:value="formData.freeParkTime" placeholder="请输入免费停留时长" allow-clear />
+			</a-form-item>
+			<a-form-item label="超出每小时费用:" name="exceedAmount">
+				<a-input v-model:value="formData.exceedAmount" placeholder="请输入超出每小时费用" allow-clear />
+			</a-form-item>
+			<a-form-item label="支付后停留时长:" name="payAfterParkTime">
+				<a-input v-model:value="formData.payAfterParkTime" 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="bizParkConfigForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizParkConfigApi from '@/api/biz/bizParkConfigApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizParkConfigApi
+					.bizParkConfigSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 121 - 0
snowy-admin-web/src/views/biz/bizparkconfig/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('bizParkConfigAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizParkConfigBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizParkConfig"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizParkConfigEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizParkConfigEdit', 'bizParkConfigDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizParkConfig(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizParkConfigDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizparkconfig">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizParkConfigApi from '@/api/biz/bizParkConfigApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '预约类型',
+			dataIndex: 'appointmentType'
+		},
+		{
+			title: '免费停留时长',
+			dataIndex: 'freeParkTime'
+		},
+		{
+			title: '超出每小时费用',
+			dataIndex: 'exceedAmount'
+		},
+		{
+			title: '支付后停留时长',
+			dataIndex: 'payAfterParkTime'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizParkConfigEdit', 'bizParkConfigDelete'])) {
+		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 bizParkConfigApi.bizParkConfigPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizParkConfig = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizParkConfigApi.bizParkConfigDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizParkConfig = (params) => {
+		bizParkConfigApi.bizParkConfigDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 73 - 0
snowy-admin-web/src/views/biz/bizprocess/form.vue

@@ -0,0 +1,73 @@
+<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="processName">
+				<a-input v-model:value="formData.processName" 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="bizProcessForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizProcessApi from '@/api/biz/bizProcessApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizProcessApi
+					.bizProcessSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 109 - 0
snowy-admin-web/src/views/biz/bizprocess/index.vue

@@ -0,0 +1,109 @@
+<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('bizProcessAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizProcessBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizProcess"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizProcessEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizProcessEdit', 'bizProcessDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizProcess(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizProcessDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizprocess">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizProcessApi from '@/api/biz/bizProcessApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '工序名称',
+			dataIndex: 'processName'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizProcessEdit', 'bizProcessDelete'])) {
+		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 bizProcessApi.bizProcessPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizProcess = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizProcessApi.bizProcessDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizProcess = (params) => {
+		bizProcessApi.bizProcessDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 76 - 0
snowy-admin-web/src/views/biz/bizprocessnode/form.vue

@@ -0,0 +1,76 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑工序节点' : '增加工序节点'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="工序id:" name="processId">
+				<a-input v-model:value="formData.processId" placeholder="请输入工序id" allow-clear />
+			</a-form-item>
+			<a-form-item label="节点名称:" name="nodeName">
+				<a-input v-model:value="formData.nodeName" 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="bizProcessNodeForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizProcessNodeApi from '@/api/biz/bizProcessNodeApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizProcessNodeApi
+					.bizProcessNodeSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 113 - 0
snowy-admin-web/src/views/biz/bizprocessnode/index.vue

@@ -0,0 +1,113 @@
+<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('bizProcessNodeAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizProcessNodeBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizProcessNode"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizProcessNodeEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizProcessNodeEdit', 'bizProcessNodeDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizProcessNode(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizProcessNodeDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizprocessnode">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizProcessNodeApi from '@/api/biz/bizProcessNodeApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '工序id',
+			dataIndex: 'processId'
+		},
+		{
+			title: '节点名称',
+			dataIndex: 'nodeName'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizProcessNodeEdit', 'bizProcessNodeDelete'])) {
+		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 bizProcessNodeApi.bizProcessNodePage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizProcessNode = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizProcessNodeApi.bizProcessNodeDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizProcessNode = (params) => {
+		bizProcessNodeApi.bizProcessNodeDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 88 - 0
snowy-admin-web/src/views/biz/bizservicecustomer/form.vue

@@ -0,0 +1,88 @@
+<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="name">
+				<a-input v-model:value="formData.name" placeholder="请输入客户名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="联系人:" name="contact">
+				<a-input v-model:value="formData.contact" placeholder="请输入联系人" allow-clear />
+			</a-form-item>
+			<a-form-item label="手机号:" name="phone">
+				<a-input v-model:value="formData.phone" placeholder="请输入手机号" allow-clear />
+			</a-form-item>
+			<a-form-item label="客户地址:" name="address">
+				<a-input v-model:value="formData.address" placeholder="请输入客户地址" allow-clear />
+			</a-form-item>
+			<a-form-item label="备注:" name="remark">
+				<a-input v-model:value="formData.remark" 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="bizServiceCustomerForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizServiceCustomerApi from '@/api/biz/bizServiceCustomerApi'
+	// 抽屉状态
+	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 = {
+		name: [required('请输入客户名称')],
+		contact: [required('请输入联系人')],
+		phone: [required('请输入手机号')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizServiceCustomerApi
+					.bizServiceCustomerSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 125 - 0
snowy-admin-web/src/views/biz/bizservicecustomer/index.vue

@@ -0,0 +1,125 @@
+<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('bizServiceCustomerAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizServiceCustomerBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizServiceCustomer"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizServiceCustomerEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizServiceCustomerEdit', 'bizServiceCustomerDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizServiceCustomer(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizServiceCustomerDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizservicecustomer">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizServiceCustomerApi from '@/api/biz/bizServiceCustomerApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '客户名称',
+			dataIndex: 'name'
+		},
+		{
+			title: '联系人',
+			dataIndex: 'contact'
+		},
+		{
+			title: '手机号',
+			dataIndex: 'phone'
+		},
+		{
+			title: '客户地址',
+			dataIndex: 'address'
+		},
+		{
+			title: '备注',
+			dataIndex: 'remark'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizServiceCustomerEdit', 'bizServiceCustomerDelete'])) {
+		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 bizServiceCustomerApi.bizServiceCustomerPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizServiceCustomer = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizServiceCustomerApi.bizServiceCustomerDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizServiceCustomer = (params) => {
+		bizServiceCustomerApi.bizServiceCustomerDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 91 - 0
snowy-admin-web/src/views/biz/bizservicecustomeraccount/form.vue

@@ -0,0 +1,91 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑服务客户账号管理' : '增加服务客户账号管理'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="客户id:" name="customerId">
+				<a-input v-model:value="formData.customerId" placeholder="请输入客户id" allow-clear />
+			</a-form-item>
+			<a-form-item label="账号:" name="loginAccount">
+				<a-input v-model:value="formData.loginAccount" placeholder="请输入账号" allow-clear />
+			</a-form-item>
+			<a-form-item label="充值总余额:" name="rechargeAmount">
+				<a-input v-model:value="formData.rechargeAmount" placeholder="请输入充值总余额" allow-clear />
+			</a-form-item>
+			<a-form-item label="消费总金额:" name="consumptionAmount">
+				<a-input v-model:value="formData.consumptionAmount" placeholder="请输入消费总金额" allow-clear />
+			</a-form-item>
+			<a-form-item label="锁定金额(占用金额):" name="lockAmount">
+				<a-input v-model:value="formData.lockAmount" placeholder="请输入锁定金额(占用金额)" allow-clear />
+			</a-form-item>
+			<a-form-item label="可用余额(账户余额):" name="accountAmount">
+				<a-input v-model:value="formData.accountAmount" placeholder="请输入可用余额(账户余额)" allow-clear />
+			</a-form-item>
+			<a-form-item label="授信额度:" name="creditAmount">
+				<a-input v-model:value="formData.creditAmount" 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="bizServiceCustomerAccountForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizServiceCustomerAccountApi from '@/api/biz/bizServiceCustomerAccountApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizServiceCustomerAccountApi
+					.bizServiceCustomerAccountSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 133 - 0
snowy-admin-web/src/views/biz/bizservicecustomeraccount/index.vue

@@ -0,0 +1,133 @@
+<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('bizServiceCustomerAccountAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizServiceCustomerAccountBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizServiceCustomerAccount"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizServiceCustomerAccountEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizServiceCustomerAccountEdit', 'bizServiceCustomerAccountDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizServiceCustomerAccount(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizServiceCustomerAccountDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizservicecustomeraccount">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizServiceCustomerAccountApi from '@/api/biz/bizServiceCustomerAccountApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '客户id',
+			dataIndex: 'customerId'
+		},
+		{
+			title: '账号',
+			dataIndex: 'loginAccount'
+		},
+		{
+			title: '充值总余额',
+			dataIndex: 'rechargeAmount'
+		},
+		{
+			title: '消费总金额',
+			dataIndex: 'consumptionAmount'
+		},
+		{
+			title: '锁定金额(占用金额)',
+			dataIndex: 'lockAmount'
+		},
+		{
+			title: '可用余额(账户余额)',
+			dataIndex: 'accountAmount'
+		},
+		{
+			title: '授信额度',
+			dataIndex: 'creditAmount'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizServiceCustomerAccountEdit', 'bizServiceCustomerAccountDelete'])) {
+		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 bizServiceCustomerAccountApi.bizServiceCustomerAccountPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizServiceCustomerAccount = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizServiceCustomerAccountApi.bizServiceCustomerAccountDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizServiceCustomerAccount = (params) => {
+		bizServiceCustomerAccountApi.bizServiceCustomerAccountDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 85 - 0
snowy-admin-web/src/views/biz/bizservicecustomerflow/form.vue

@@ -0,0 +1,85 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑服务客户资金流水' : '增加服务客户资金流水'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="服务客户id:" name="customerAccountId">
+				<a-input v-model:value="formData.customerAccountId" placeholder="请输入服务客户id" allow-clear />
+			</a-form-item>
+			<a-form-item label="操作类型  1:充值   2:消费:" name="operateType">
+				<a-input v-model:value="formData.operateType" placeholder="请输入操作类型  1:充值   2:消费" allow-clear />
+			</a-form-item>
+			<a-form-item label="操作前账户余额(充值或消费前账户余额):" name="operateAmountBegin">
+				<a-input v-model:value="formData.operateAmountBegin" placeholder="请输入操作前账户余额(充值或消费前账户余额)" allow-clear />
+			</a-form-item>
+			<a-form-item label="操作金额(充值或消费金额):" name="operateAmount">
+				<a-input v-model:value="formData.operateAmount" placeholder="请输入操作金额(充值或消费金额)" allow-clear />
+			</a-form-item>
+			<a-form-item label="操作后账户余额(充值或消费后账户余额):" name="operateAmountAfter">
+				<a-input v-model:value="formData.operateAmountAfter" 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="bizServiceCustomerFlowForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizServiceCustomerFlowApi from '@/api/biz/bizServiceCustomerFlowApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizServiceCustomerFlowApi
+					.bizServiceCustomerFlowSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 125 - 0
snowy-admin-web/src/views/biz/bizservicecustomerflow/index.vue

@@ -0,0 +1,125 @@
+<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('bizServiceCustomerFlowAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizServiceCustomerFlowBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizServiceCustomerFlow"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizServiceCustomerFlowEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizServiceCustomerFlowEdit', 'bizServiceCustomerFlowDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizServiceCustomerFlow(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizServiceCustomerFlowDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizservicecustomerflow">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizServiceCustomerFlowApi from '@/api/biz/bizServiceCustomerFlowApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '服务客户id',
+			dataIndex: 'customerAccountId'
+		},
+		{
+			title: '操作类型  1:充值   2:消费',
+			dataIndex: 'operateType'
+		},
+		{
+			title: '操作前账户余额(充值或消费前账户余额)',
+			dataIndex: 'operateAmountBegin'
+		},
+		{
+			title: '操作金额(充值或消费金额)',
+			dataIndex: 'operateAmount'
+		},
+		{
+			title: '操作后账户余额(充值或消费后账户余额)',
+			dataIndex: 'operateAmountAfter'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizServiceCustomerFlowEdit', 'bizServiceCustomerFlowDelete'])) {
+		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 bizServiceCustomerFlowApi.bizServiceCustomerFlowPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizServiceCustomerFlow = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizServiceCustomerFlowApi.bizServiceCustomerFlowDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizServiceCustomerFlow = (params) => {
+		bizServiceCustomerFlowApi.bizServiceCustomerFlowDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 76 - 0
snowy-admin-web/src/views/biz/bizsupplieraccount/form.vue

@@ -0,0 +1,76 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑供应商账号信息' : '增加供应商账号信息'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="供应商id:" name="supplierId">
+				<a-input v-model:value="formData.supplierId" placeholder="请输入供应商id" allow-clear />
+			</a-form-item>
+			<a-form-item label="供应商账号:" name="supplierAccount">
+				<a-input v-model:value="formData.supplierAccount" 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="bizSupplierAccountForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSupplierAccountApi from '@/api/biz/bizSupplierAccountApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizSupplierAccountApi
+					.bizSupplierAccountSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 113 - 0
snowy-admin-web/src/views/biz/bizsupplieraccount/index.vue

@@ -0,0 +1,113 @@
+<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('bizSupplierAccountAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizSupplierAccountBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizSupplierAccount"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSupplierAccountEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizSupplierAccountEdit', 'bizSupplierAccountDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizSupplierAccount(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizSupplierAccountDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizsupplieraccount">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizSupplierAccountApi from '@/api/biz/bizSupplierAccountApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '供应商id',
+			dataIndex: 'supplierId'
+		},
+		{
+			title: '供应商账号',
+			dataIndex: 'supplierAccount'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizSupplierAccountEdit', 'bizSupplierAccountDelete'])) {
+		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 bizSupplierAccountApi.bizSupplierAccountPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizSupplierAccount = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizSupplierAccountApi.bizSupplierAccountDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizSupplierAccount = (params) => {
+		bizSupplierAccountApi.bizSupplierAccountDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 79 - 0
snowy-admin-web/src/views/biz/bizsuppliertransport/form.vue

@@ -0,0 +1,79 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑供应商运输管理' : '增加供应商运输管理'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="供应商id:" name="supplierId">
+				<a-input v-model:value="formData.supplierId" placeholder="请输入供应商id" allow-clear />
+			</a-form-item>
+			<a-form-item label="运输类型  1:汽运  2:船运:" name="transportType">
+				<a-input v-model:value="formData.transportType" placeholder="请输入运输类型  1:汽运  2:船运" allow-clear />
+			</a-form-item>
+			<a-form-item label="运输号(车牌号或者船舶号):" name="transportNo">
+				<a-input v-model:value="formData.transportNo" 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="bizSupplierTransportForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSupplierTransportApi from '@/api/biz/bizSupplierTransportApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizSupplierTransportApi
+					.bizSupplierTransportSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 117 - 0
snowy-admin-web/src/views/biz/bizsuppliertransport/index.vue

@@ -0,0 +1,117 @@
+<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('bizSupplierTransportAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizSupplierTransportBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizSupplierTransport"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSupplierTransportEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizSupplierTransportEdit', 'bizSupplierTransportDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizSupplierTransport(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizSupplierTransportDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizsuppliertransport">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizSupplierTransportApi from '@/api/biz/bizSupplierTransportApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '供应商id',
+			dataIndex: 'supplierId'
+		},
+		{
+			title: '运输类型  1:汽运  2:船运',
+			dataIndex: 'transportType'
+		},
+		{
+			title: '运输号(车牌号或者船舶号)',
+			dataIndex: 'transportNo'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizSupplierTransportEdit', 'bizSupplierTransportDelete'])) {
+		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 bizSupplierTransportApi.bizSupplierTransportPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizSupplierTransport = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizSupplierTransportApi.bizSupplierTransportDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizSupplierTransport = (params) => {
+		bizSupplierTransportApi.bizSupplierTransportDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/controller/BizSupplierAccountController.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.bizsupplieraccount.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.bizsupplieraccount.entity.BizSupplierAccount;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountAddParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountEditParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountIdParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountPageParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.service.BizSupplierAccountService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 供应商账号信息控制器
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ */
+@Tag(name = "供应商账号信息控制器")
+@RestController
+@Validated
+public class BizSupplierAccountController {
+
+    @Resource
+    private BizSupplierAccountService bizSupplierAccountService;
+
+    /**
+     * 获取供应商账号信息分页
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "获取供应商账号信息分页")
+    @SaCheckPermission("/biz/bizsupplieraccount/page")
+    @GetMapping("/biz/bizsupplieraccount/page")
+    public CommonResult<Page<BizSupplierAccount>> page(BizSupplierAccountPageParam bizSupplierAccountPageParam) {
+        return CommonResult.data(bizSupplierAccountService.page(bizSupplierAccountPageParam));
+    }
+
+    /**
+     * 添加供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "添加供应商账号信息")
+    @CommonLog("添加供应商账号信息")
+    @PostMapping("/biz/bizsupplieraccount/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSupplierAccountAddParam bizSupplierAccountAddParam) {
+        bizSupplierAccountService.add(bizSupplierAccountAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "编辑供应商账号信息")
+    @CommonLog("编辑供应商账号信息")
+    @PostMapping("/biz/bizsupplieraccount/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSupplierAccountEditParam bizSupplierAccountEditParam) {
+        bizSupplierAccountService.edit(bizSupplierAccountEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "删除供应商账号信息")
+    @CommonLog("删除供应商账号信息")
+    @PostMapping("/biz/bizsupplieraccount/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSupplierAccountIdParam> bizSupplierAccountIdParamList) {
+        bizSupplierAccountService.delete(bizSupplierAccountIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取供应商账号信息详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "获取供应商账号信息详情")
+    @GetMapping("/biz/bizsupplieraccount/detail")
+    public CommonResult<BizSupplierAccount> detail(@Valid BizSupplierAccountIdParam bizSupplierAccountIdParam) {
+        return CommonResult.data(bizSupplierAccountService.detail(bizSupplierAccountIdParam));
+    }
+}

+ 47 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/entity/BizSupplierAccount.java

@@ -0,0 +1,47 @@
+/*
+ * 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.bizsupplieraccount.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/05/29 14:47
+ **/
+@Getter
+@Setter
+@TableName("biz_supplier_account")
+public class BizSupplierAccount extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 供应商账号 */
+    @Schema(description = "供应商账号")
+    private String supplierAccount;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/enums/BizSupplierAccountEnum.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.bizsupplieraccount.enums;
+
+import lombok.Getter;
+
+/**
+ * 供应商账号信息枚举
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+@Getter
+public enum BizSupplierAccountEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSupplierAccountEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/mapper/BizSupplierAccountMapper.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.bizsupplieraccount.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.entity.BizSupplierAccount;
+
+/**
+ * 供应商账号信息Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+public interface BizSupplierAccountMapper extends BaseMapper<BizSupplierAccount> {
+}

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

+ 42 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountAddParam.java

@@ -0,0 +1,42 @@
+/*
+ * 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.bizsupplieraccount.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierAccountAddParam {
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 供应商账号 */
+    @Schema(description = "供应商账号")
+    private String supplierAccount;
+
+}

+ 47 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountEditParam.java

@@ -0,0 +1,47 @@
+/*
+ * 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.bizsupplieraccount.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierAccountEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 供应商账号 */
+    @Schema(description = "供应商账号")
+    private String supplierAccount;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/param/BizSupplierAccountIdParam.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.bizsupplieraccount.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierAccountIdParam {
+
+    /** 主键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/bizsupplieraccount/param/BizSupplierAccountPageParam.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.bizsupplieraccount.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierAccountPageParam {
+
+    /** 当前页 */
+    @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/bizsupplieraccount/service/BizSupplierAccountService.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.bizsupplieraccount.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.entity.BizSupplierAccount;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountAddParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountEditParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountIdParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountPageParam;
+
+import java.util.List;
+
+/**
+ * 供应商账号信息Service接口
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+public interface BizSupplierAccountService extends IService<BizSupplierAccount> {
+
+    /**
+     * 获取供应商账号信息分页
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    Page<BizSupplierAccount> page(BizSupplierAccountPageParam bizSupplierAccountPageParam);
+
+    /**
+     * 添加供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void add(BizSupplierAccountAddParam bizSupplierAccountAddParam);
+
+    /**
+     * 编辑供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void edit(BizSupplierAccountEditParam bizSupplierAccountEditParam);
+
+    /**
+     * 删除供应商账号信息
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void delete(List<BizSupplierAccountIdParam> bizSupplierAccountIdParamList);
+
+    /**
+     * 获取供应商账号信息详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    BizSupplierAccount detail(BizSupplierAccountIdParam bizSupplierAccountIdParam);
+
+    /**
+     * 获取供应商账号信息详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     **/
+    BizSupplierAccount queryEntity(String id);
+}

+ 94 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplieraccount/service/impl/BizSupplierAccountServiceImpl.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.bizsupplieraccount.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.bizsupplieraccount.entity.BizSupplierAccount;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.mapper.BizSupplierAccountMapper;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountAddParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountEditParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountIdParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.param.BizSupplierAccountPageParam;
+import vip.xiaonuo.biz.modular.bizsupplieraccount.service.BizSupplierAccountService;
+
+import java.util.List;
+
+/**
+ * 供应商账号信息Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+@Service
+public class BizSupplierAccountServiceImpl extends ServiceImpl<BizSupplierAccountMapper, BizSupplierAccount> implements BizSupplierAccountService {
+
+    @Override
+    public Page<BizSupplierAccount> page(BizSupplierAccountPageParam bizSupplierAccountPageParam) {
+        QueryWrapper<BizSupplierAccount> queryWrapper = new QueryWrapper<BizSupplierAccount>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizSupplierAccountPageParam.getSortField(), bizSupplierAccountPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizSupplierAccountPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizSupplierAccountPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizSupplierAccountPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizSupplierAccount::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSupplierAccountAddParam bizSupplierAccountAddParam) {
+        BizSupplierAccount bizSupplierAccount = BeanUtil.toBean(bizSupplierAccountAddParam, BizSupplierAccount.class);
+        this.save(bizSupplierAccount);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSupplierAccountEditParam bizSupplierAccountEditParam) {
+        BizSupplierAccount bizSupplierAccount = this.queryEntity(bizSupplierAccountEditParam.getId());
+        BeanUtil.copyProperties(bizSupplierAccountEditParam, bizSupplierAccount);
+        this.updateById(bizSupplierAccount);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSupplierAccountIdParam> bizSupplierAccountIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizSupplierAccountIdParamList, BizSupplierAccountIdParam::getId));
+    }
+
+    @Override
+    public BizSupplierAccount detail(BizSupplierAccountIdParam bizSupplierAccountIdParam) {
+        return this.queryEntity(bizSupplierAccountIdParam.getId());
+    }
+
+    @Override
+    public BizSupplierAccount queryEntity(String id) {
+        BizSupplierAccount bizSupplierAccount = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSupplierAccount)) {
+            throw new CommonException("供应商账号信息不存在,id值为:{}", id);
+        }
+        return bizSupplierAccount;
+    }
+}

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/controller/BizSupplierTransportController.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.bizsuppliertransport.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.bizsuppliertransport.entity.BizSupplierTransport;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportAddParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportEditParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportIdParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportPageParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.service.BizSupplierTransportService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 供应商运输管理控制器
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ */
+@Tag(name = "供应商运输管理控制器")
+@RestController
+@Validated
+public class BizSupplierTransportController {
+
+    @Resource
+    private BizSupplierTransportService bizSupplierTransportService;
+
+    /**
+     * 获取供应商运输管理分页
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "获取供应商运输管理分页")
+    @SaCheckPermission("/biz/bizsuppliertransport/page")
+    @GetMapping("/biz/bizsuppliertransport/page")
+    public CommonResult<Page<BizSupplierTransport>> page(BizSupplierTransportPageParam bizSupplierTransportPageParam) {
+        return CommonResult.data(bizSupplierTransportService.page(bizSupplierTransportPageParam));
+    }
+
+    /**
+     * 添加供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "添加供应商运输管理")
+    @CommonLog("添加供应商运输管理")
+    @PostMapping("/biz/bizsuppliertransport/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSupplierTransportAddParam bizSupplierTransportAddParam) {
+        bizSupplierTransportService.add(bizSupplierTransportAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "编辑供应商运输管理")
+    @CommonLog("编辑供应商运输管理")
+    @PostMapping("/biz/bizsuppliertransport/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSupplierTransportEditParam bizSupplierTransportEditParam) {
+        bizSupplierTransportService.edit(bizSupplierTransportEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "删除供应商运输管理")
+    @CommonLog("删除供应商运输管理")
+    @PostMapping("/biz/bizsuppliertransport/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSupplierTransportIdParam> bizSupplierTransportIdParamList) {
+        bizSupplierTransportService.delete(bizSupplierTransportIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取供应商运输管理详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    @Operation(summary = "获取供应商运输管理详情")
+    @GetMapping("/biz/bizsuppliertransport/detail")
+    public CommonResult<BizSupplierTransport> detail(@Valid BizSupplierTransportIdParam bizSupplierTransportIdParam) {
+        return CommonResult.data(bizSupplierTransportService.detail(bizSupplierTransportIdParam));
+    }
+}

+ 52 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/entity/BizSupplierTransport.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.bizsuppliertransport.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/05/29 14:47
+ **/
+@Getter
+@Setter
+@TableName("biz_supplier_transport")
+public class BizSupplierTransport extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 运输类型  1:汽运  2:船运 */
+    @Schema(description = "运输类型  1:汽运  2:船运")
+    private String transportType;
+
+    /** 运输号(车牌号或者船舶号) */
+    @Schema(description = "运输号(车牌号或者船舶号)")
+    private String transportNo;
+
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/enums/BizSupplierTransportEnum.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.bizsuppliertransport.enums;
+
+import lombok.Getter;
+
+/**
+ * 供应商运输管理枚举
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+@Getter
+public enum BizSupplierTransportEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSupplierTransportEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/mapper/BizSupplierTransportMapper.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.bizsuppliertransport.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.entity.BizSupplierTransport;
+
+/**
+ * 供应商运输管理Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+public interface BizSupplierTransportMapper extends BaseMapper<BizSupplierTransport> {
+}

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

+ 46 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportAddParam.java

@@ -0,0 +1,46 @@
+/*
+ * 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.bizsuppliertransport.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierTransportAddParam {
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 运输类型  1:汽运  2:船运 */
+    @Schema(description = "运输类型  1:汽运  2:船运")
+    private String transportType;
+
+    /** 运输号(车牌号或者船舶号) */
+    @Schema(description = "运输号(车牌号或者船舶号)")
+    private String transportNo;
+
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportEditParam.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.bizsuppliertransport.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierTransportEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 供应商id */
+    @Schema(description = "供应商id")
+    private String supplierId;
+
+    /** 运输类型  1:汽运  2:船运 */
+    @Schema(description = "运输类型  1:汽运  2:船运")
+    private String transportType;
+
+    /** 运输号(车牌号或者船舶号) */
+    @Schema(description = "运输号(车牌号或者船舶号)")
+    private String transportNo;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/param/BizSupplierTransportIdParam.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.bizsuppliertransport.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierTransportIdParam {
+
+    /** 主键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/bizsuppliertransport/param/BizSupplierTransportPageParam.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.bizsuppliertransport.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/05/29 14:47
+ **/
+@Getter
+@Setter
+public class BizSupplierTransportPageParam {
+
+    /** 当前页 */
+    @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/bizsuppliertransport/service/BizSupplierTransportService.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.bizsuppliertransport.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.entity.BizSupplierTransport;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportAddParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportEditParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportIdParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportPageParam;
+
+import java.util.List;
+
+/**
+ * 供应商运输管理Service接口
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+public interface BizSupplierTransportService extends IService<BizSupplierTransport> {
+
+    /**
+     * 获取供应商运输管理分页
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    Page<BizSupplierTransport> page(BizSupplierTransportPageParam bizSupplierTransportPageParam);
+
+    /**
+     * 添加供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void add(BizSupplierTransportAddParam bizSupplierTransportAddParam);
+
+    /**
+     * 编辑供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void edit(BizSupplierTransportEditParam bizSupplierTransportEditParam);
+
+    /**
+     * 删除供应商运输管理
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    void delete(List<BizSupplierTransportIdParam> bizSupplierTransportIdParamList);
+
+    /**
+     * 获取供应商运输管理详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     */
+    BizSupplierTransport detail(BizSupplierTransportIdParam bizSupplierTransportIdParam);
+
+    /**
+     * 获取供应商运输管理详情
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:47
+     **/
+    BizSupplierTransport queryEntity(String id);
+}

+ 94 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsuppliertransport/service/impl/BizSupplierTransportServiceImpl.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.bizsuppliertransport.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.bizsuppliertransport.entity.BizSupplierTransport;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.mapper.BizSupplierTransportMapper;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportAddParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportEditParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportIdParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.param.BizSupplierTransportPageParam;
+import vip.xiaonuo.biz.modular.bizsuppliertransport.service.BizSupplierTransportService;
+
+import java.util.List;
+
+/**
+ * 供应商运输管理Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/05/29 14:47
+ **/
+@Service
+public class BizSupplierTransportServiceImpl extends ServiceImpl<BizSupplierTransportMapper, BizSupplierTransport> implements BizSupplierTransportService {
+
+    @Override
+    public Page<BizSupplierTransport> page(BizSupplierTransportPageParam bizSupplierTransportPageParam) {
+        QueryWrapper<BizSupplierTransport> queryWrapper = new QueryWrapper<BizSupplierTransport>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizSupplierTransportPageParam.getSortField(), bizSupplierTransportPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizSupplierTransportPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizSupplierTransportPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizSupplierTransportPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizSupplierTransport::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSupplierTransportAddParam bizSupplierTransportAddParam) {
+        BizSupplierTransport bizSupplierTransport = BeanUtil.toBean(bizSupplierTransportAddParam, BizSupplierTransport.class);
+        this.save(bizSupplierTransport);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSupplierTransportEditParam bizSupplierTransportEditParam) {
+        BizSupplierTransport bizSupplierTransport = this.queryEntity(bizSupplierTransportEditParam.getId());
+        BeanUtil.copyProperties(bizSupplierTransportEditParam, bizSupplierTransport);
+        this.updateById(bizSupplierTransport);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSupplierTransportIdParam> bizSupplierTransportIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizSupplierTransportIdParamList, BizSupplierTransportIdParam::getId));
+    }
+
+    @Override
+    public BizSupplierTransport detail(BizSupplierTransportIdParam bizSupplierTransportIdParam) {
+        return this.queryEntity(bizSupplierTransportIdParam.getId());
+    }
+
+    @Override
+    public BizSupplierTransport queryEntity(String id) {
+        BizSupplierTransport bizSupplierTransport = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSupplierTransport)) {
+            throw new CommonException("供应商运输管理不存在,id值为:{}", id);
+        }
+        return bizSupplierTransport;
+    }
+}