瀏覽代碼

供货商管理、客户管理

fanzherong_v 1 月之前
父節點
當前提交
51938b107d
共有 31 個文件被更改,包括 1393 次插入72 次删除
  1. 28 0
      snowy-admin-web/src/api/biz/bizCustomerApi.js
  2. 8 0
      snowy-admin-web/src/api/biz/bizUserApi.js
  3. 13 0
      snowy-admin-web/src/views/biz/bizappointmenttime/index.vue
  4. 92 0
      snowy-admin-web/src/views/biz/bizcustomer/form.vue
  5. 371 0
      snowy-admin-web/src/views/biz/bizcustomer/index.vue
  6. 12 4
      snowy-admin-web/src/views/biz/bizsupplier/form.vue
  7. 78 30
      snowy-admin-web/src/views/biz/bizsupplier/index.vue
  8. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/controller/BizCustomerController.java
  9. 59 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/entity/BizCustomer.java
  10. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/enums/BizCustomerEnum.java
  11. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/mapper/BizCustomerMapper.java
  12. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/mapper/mapping/BizCustomerMapper.xml
  13. 61 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerAddParam.java
  14. 66 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerEditParam.java
  15. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerIdParam.java
  16. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerPageParam.java
  17. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/service/BizCustomerService.java
  18. 117 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/service/impl/BizCustomerServiceImpl.java
  19. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/entity/BizSupplier.java
  20. 4 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierAddParam.java
  21. 4 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/param/BizSupplierEditParam.java
  22. 29 6
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/service/impl/BizSupplierServiceImpl.java
  23. 1 7
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/goods/service/impl/BizGoodsServiceImpl.java
  24. 28 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/controller/BizUserController.java
  25. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java
  26. 4 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserAddParam.java
  27. 0 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserEditParam.java
  28. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserPageParam.java
  29. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/BizUserService.java
  30. 49 19
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/service/impl/BizUserServiceImpl.java
  31. 2 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizcustomer/` + url, ...arg)
+
+/**
+ * 客户Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+export default {
+	// 获取客户分页
+	bizCustomerPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交客户表单 edit为true时为编辑,默认为新增
+	bizCustomerSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除客户
+	bizCustomerDelete(data) {
+		return request('delete', data)
+	},
+	// 获取客户详情
+	bizCustomerDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 8 - 0
snowy-admin-web/src/api/biz/bizUserApi.js

@@ -30,6 +30,10 @@ export default {
 	submitForm(data, edit = false) {
 		return request(edit ? 'edit' : 'add', data)
 	},
+	// 提交表单新增客户账号
+	submitFormCustomer(data, edit = false) {
+		return request(edit ? 'edit' : 'addCustomerAccount', data)
+	},
 	// 删除人员
 	userDelete(data) {
 		return request('delete', data)
@@ -85,5 +89,9 @@ export default {
 		return request('exportUserInfo', data, 'get', {
 			responseType: 'blob'
 		})
+	},
+	//查询客户账号
+	getListByCustomerId(data){
+		return request('getListByCustomerId',data,'get')
 	}
 }

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

@@ -29,6 +29,9 @@
 				<template v-if="column.dataIndex === 'appointment'">
 					<span>{{record.beginTime+'~'+record.endTime}}</span>
 				</template>
+				<template v-if="column.dataIndex === 'applyNumberSurplus'">
+					<span>{{record.applyNumber-record.applyNumberAlready}}</span>
+				</template>
 			</template>
 		</s-table>
 	</a-card>
@@ -63,6 +66,16 @@
 			dataIndex: 'applyNumber',
 			align:'center'
 		},
+		{
+			title: '已约数量',
+			dataIndex: 'applyNumberAlready',
+			align:'center'
+		},
+		{
+			title: '可约数量',
+			dataIndex: 'applyNumberSurplus',
+			align:'center'
+		},
 
 	]
 	// 操作栏通过权限判断是否显示

+ 92 - 0
snowy-admin-web/src/views/biz/bizcustomer/form.vue

@@ -0,0 +1,92 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑客户' : '增加客户'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="客户名称:" name="customerName">
+				<a-input v-model:value="formData.customerName" placeholder="请输入客户名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="联系人:" name="customerContactName">
+				<a-input v-model:value="formData.customerContactName" placeholder="请输入联系人" allow-clear />
+			</a-form-item>
+			<a-form-item label="手机号:" name="customerPhone">
+				<a-input v-model:value="formData.customerPhone" placeholder="请输入手机号" allow-clear />
+			</a-form-item>
+			<a-form-item label="客户地址:" name="customerAddress">
+				<a-input v-model:value="formData.customerAddress" placeholder="请输入客户地址" allow-clear />
+			</a-form-item>
+			<a-form-item label="备注:" name="customerRemark">
+				<a-input v-model:value="formData.customerRemark" 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="bizCustomerForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizCustomerApi from '@/api/biz/bizCustomerApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		customerName: [required('请输入客户名称')],
+		customerContactName: [required('请输入联系人')],
+		customerPhone: [required('请输入手机号')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizCustomerApi
+					.bizCustomerSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 371 - 0
snowy-admin-web/src/views/biz/bizcustomer/index.vue

@@ -0,0 +1,371 @@
+<template>
+	<a-card :bordered="false">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="客户名称" name="searchKey">
+						<a-input v-model:value="searchFormState.searchKey" placeholder="请输入客户名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizCustomerAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record, index  }">
+				<template v-if="column.dataIndex === 'serial'">
+					{{ index + 1 }}
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizCustomerEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizCustomerEdit', 'bizCustomerDelete'], 'and')" />
+						<a-button type="link" danger size="small" v-if="hasPerm('bizCustomerDelete')" @click="deleteConfig(record)">删除</a-button>
+						<a-divider type="vertical" v-if="hasPerm(['bizCustomerDelete', 'customerAccount'], 'and')" />
+						<a @click="showMore(record)" v-if="hasPerm('customerAccount')">账号</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+
+	<a-modal
+		v-model:visible="moreFlag"
+		title="关联账号信息"
+		:footer="null"
+		width="1100px"
+		:body-style="{
+			height: 'calc(100vh - 300px)',
+			overflow: 'auto'
+		}"
+		@cancel="onCloseAccount"
+	>
+		<a-card :bordered="false">
+			<a-button type="primary" @click="addAccount()" v-if="hasPerm('customerAccountAdd')" style="margin-bottom:10px;">
+				<template #icon><plus-outlined /></template>
+				新增账号
+			</a-button>
+			<a-table ref="tableAccountRef" :columns="columns1" :data-source="data1" bordered :row-key="(record) => record.id">
+				<template #bodyCell="{ column, record }">
+					<template v-if="column.dataIndex === 'action'">
+						<a @click="editAccount(record)" v-if="hasPerm('customerAccountEdit')">编辑</a>
+						<a-divider type="vertical"  v-if="hasPerm(['customerAccountEdit','customerAccountDelete'],'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="removeUser(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('customerAccountDelete')">删除</a-button>
+						</a-popconfirm>
+						<a-divider type="vertical"  v-if="hasPerm(['projectUserDelete','customerAccountRestPassword'],'and')"/>
+						<a-popconfirm title="确定要重置密码吗?" @confirm="resetPassword(record)">
+							<a-button type="link" v-if="hasPerm('customerAccountRestPassword')">重置密码</a-button>
+						</a-popconfirm>
+					</template>
+				</template>
+			</a-table>
+		</a-card>
+	</a-modal>
+
+	<a-modal
+		v-model:visible="editAccountFlag"
+		:title="formData.id ? '编辑账号' : '添加账号'"
+		class="custom-modal"
+		width="800px"
+		@ok="handleOk"
+		@cancel="onClose"
+	>
+
+		<a-form ref="formSubmitRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="账号:" name="account">
+				<a-input v-model:value="formData.account" placeholder="请输入账号" allow-clear />
+			</a-form-item>
+			<a-form-item label="用户名称:" name="name">
+				<a-input v-model:value="formData.name" 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>
+
+	</a-modal>
+</template>
+
+<script setup name="bizcustomer">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizCustomerApi from '@/api/biz/bizCustomerApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import bizUserApi from '@/api/biz/bizUserApi'
+	import { required } from '@/utils/formRules'
+
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const tableAccountRef = ref()
+	const formRef = ref()
+	const submitLoading = ref(false)
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const moreFlag = ref(false)
+	const editAccountFlag = ref(false)
+	const data1 = ref([])
+
+	// 表单数据
+	const formData = ref({})
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+	const formSubmitRef = ref()
+
+	const columns = [
+		{
+			title: '序号',
+			width: 80,
+			dataIndex: 'serial',
+			align:'center'
+		},
+		{
+			title: '客户名称',
+			dataIndex: 'customerName',
+			width:120,
+			align:'center'
+		},
+		{
+			title: '联系人',
+			dataIndex: 'customerContactName',
+			width:120,
+			align:'center'
+		},
+		{
+			title: '手机号',
+			dataIndex: 'customerPhone',
+			width:120,
+			align:'center'
+		},
+		{
+			title: '客户地址',
+			dataIndex: 'customerAddress',
+			width:180,
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizCustomerApi.bizCustomerPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizCustomer = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizCustomerApi.bizCustomerDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizCustomerApi
+					.bizCustomerDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizCustomer = (params) => {
+		bizCustomerApi.bizCustomerDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+
+	//账号按钮点击时间
+	const customerId = ref()
+	const showMore = (record) => {
+		customerId.value = record.id
+		loadData1()
+		moreFlag.value = true
+
+	}
+
+	const loadData1 = () => {
+		let param={
+			customerId:customerId.value
+		}
+		bizUserApi.getListByCustomerId(param).then((res)=>{
+			data1.value = res
+		})
+	}
+
+
+	const columns1 = [
+		{
+			title: '账号',
+			dataIndex: 'account',
+			align: 'center',
+			resizable: true,
+			ellipsis: true,
+			width: 100
+		},
+		{
+			title: '用户名称',
+			dataIndex: 'name',
+			align: 'center',
+			resizable: true,
+			ellipsis: true,
+			width: 110
+		},
+		{
+			title: '手机号',
+			dataIndex: 'phone',
+			align: 'center',
+			resizable: true,
+			ellipsis: true,
+			width: 100
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			fixed: 'right',
+			width: 120,
+		}
+	]
+
+
+	//新增客户账号
+	const addAccount = () =>{
+		formData.value = {}
+		formData.value.customerId = customerId.value
+		editAccountFlag.value = true
+	}
+
+	const formRules = {
+		account: [required('请输入账号')],
+		name: [required('请输入用户姓名')],
+		phone:[required('请输入手机号')],
+	}
+
+	//表单提交
+	const handleOk = () => {
+		formSubmitRef.value.validate().then(() => {
+			submitLoading.value = true
+			const formDataParam = cloneDeep(formData.value)
+			bizUserApi
+				.submitFormCustomer(formDataParam, formDataParam.id)
+				.then(() => {
+					onClose()
+					emit('successful')
+				})
+				.finally(() => {
+					submitLoading.value = false
+				})
+		})
+	}
+
+	const onClose = () => {
+		formSubmitRef.value.resetFields()
+		formData.value = {}
+		editAccountFlag.value = false
+		loadData1()
+	}
+
+	const editAccount = (record) => {
+		formData.value = record
+		editAccountFlag.value = true
+	}
+
+	//删除客户账号
+	const removeUser = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizUserApi.userDelete(params).then(() => {
+			loadData1()
+		})
+	}
+
+	// 重置人员密码
+	const resetPassword = (record) => {
+		bizUserApi.userResetPassword(record).then(() => {})
+	}
+
+	const onCloseAccount = () => {
+		moreFlag.value = false
+	}
+
+</script>
+
+<style scoped>
+
+.custom-modal {
+	height: 500px; /* 设置模态框的高度 */
+	overflow: auto; /* 如果内容超出高度,显示滚动条 */
+}
+</style>

+ 12 - 4
snowy-admin-web/src/views/biz/bizsupplier/form.vue

@@ -6,12 +6,15 @@
 		:destroy-on-close="true"
 		@close="onClose"
 	>
-		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
 			<a-form-item label="供货商名称:" name="supplierName">
 				<a-input v-model:value="formData.supplierName" placeholder="请输入供货商名称" allow-clear />
 			</a-form-item>
-			<a-form-item label="供货商手机号:" name="supplierPhone">
-				<a-input v-model:value="formData.supplierPhone" placeholder="请输入供货商手机号" allow-clear />
+			<a-form-item label="联系人:" name="supplierContactName">
+				<a-input v-model:value="formData.supplierContactName" placeholder="请输入联系人" allow-clear />
+			</a-form-item>
+			<a-form-item label="手机号:" name="supplierPhone">
+				<a-input v-model:value="formData.supplierPhone" placeholder="请输入手机号" allow-clear />
 			</a-form-item>
 			<a-form-item label="供货商地址:" name="supplierAddress">
 				<a-input v-model:value="formData.supplierAddress" placeholder="请输入供货商地址" allow-clear />
@@ -39,6 +42,10 @@
 	const formData = ref({})
 	const submitLoading = ref(false)
 
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
 	// 打开抽屉
 	const onOpen = (record) => {
 		open.value = true
@@ -56,7 +63,8 @@
 	// 默认要校验的
 	const formRules = {
 		supplierName: [required('请输入供货商名称')],
-		supplierPhone: [required('请输入供货商手机号')],
+		supplierContactName:[required('请输入联系人')],
+		supplierPhone:[required('请输入手机号')],
 	}
 	// 验证并提交数据
 	const onSubmit = () => {

+ 78 - 30
snowy-admin-web/src/views/biz/bizsupplier/index.vue

@@ -1,14 +1,24 @@
 <template>
 	<a-card :bordered="false">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="供货商名称" name="searchKey">
+						<a-input v-model:value="searchFormState.searchKey" placeholder="请输入供货商名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+				</a-col>
+			</a-row>
+		</a-form>
 		<s-table
 			ref="tableRef"
 			:columns="columns"
 			:data="loadData"
-			:alert="options.alert.show"
 			bordered
 			:row-key="(record) => record.id"
-			:tool-config="toolConfig"
-			:row-selection="options.rowSelection"
 		>
 			<template #operator class="table-operator">
 				<a-space>
@@ -16,23 +26,17 @@
 						<template #icon><plus-outlined /></template>
 						新增
 					</a-button>
-					<xn-batch-button
-						v-if="hasPerm('bizSupplierBatchDelete')"
-						buttonName="批量删除"
-                        icon="DeleteOutlined"
-						:selectedRowKeys="selectedRowKeys"
-						@batchCallBack="deleteBatchBizSupplier"
-					/>
 				</a-space>
 			</template>
-			<template #bodyCell="{ column, record }">
+			<template #bodyCell="{ column, record, index }">
+				<template v-if="column.dataIndex === 'serial'">
+					{{ index + 1 }}
+				</template>
 				<template v-if="column.dataIndex === 'action'">
 					<a-space>
 						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSupplierEdit')">编辑</a>
 						<a-divider type="vertical" v-if="hasPerm(['bizSupplierEdit', 'bizSupplierDelete'], 'and')" />
-						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizSupplier(record)">
-							<a-button type="link" danger size="small" v-if="hasPerm('bizSupplierDelete')">删除</a-button>
-						</a-popconfirm>
+						<a-button type="link" danger size="small" v-if="hasPerm('bizSupplierDelete')" @click="deleteConfig(record)">删除</a-button>
 					</a-space>
 				</template>
 			</template>
@@ -45,36 +49,52 @@
 	import { cloneDeep } from 'lodash-es'
 	import Form from './form.vue'
 	import bizSupplierApi from '@/api/biz/bizSupplierApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	const searchFormState = ref({})
+	const searchFormRef = ref()
 	const tableRef = ref()
 	const formRef = ref()
+	const submitLoading = ref(false)
 	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
 	const columns = [
+		{
+			title: '序号',
+			width: 80,
+			dataIndex: 'serial',
+			align:'center'
+		},
 		{
 			title: '供货商名称',
-			dataIndex: 'supplierName'
+			dataIndex: 'supplierName',
+			align:'center'
 		},
 		{
-			title: '供货商手机号',
-			dataIndex: 'supplierPhone'
+			title: '联系人',
+			dataIndex: 'supplierContactName',
+			align:'center'
 		},
 		{
-			title: '供货商地址',
-			dataIndex: 'supplierAddress'
+			title: '手机号',
+			dataIndex: 'supplierPhone',
+			align:'center'
 		},
 		{
-			title: '备注',
-			dataIndex: 'supplierRemark'
+			title: '供货商地址',
+			dataIndex: 'supplierAddress',
+			align:'center'
 		},
 	]
 	// 操作栏通过权限判断是否显示
-	if (hasPerm(['bizSupplierEdit', 'bizSupplierDelete'])) {
-		columns.push({
-			title: '操作',
-			dataIndex: 'action',
-			align: 'center',
-			width: 150
-		})
-	}
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
 	const selectedRowKeys = ref([])
 	// 列表选择配置
 	const options = {
@@ -92,7 +112,8 @@
 		}
 	}
 	const loadData = (parameter) => {
-		return bizSupplierApi.bizSupplierPage(parameter).then((data) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizSupplierApi.bizSupplierPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})
 	}
@@ -112,6 +133,33 @@
 			tableRef.value.refresh(true)
 		})
 	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizSupplierApi
+					.bizSupplierDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
 	// 批量删除
 	const deleteBatchBizSupplier = (params) => {
 		bizSupplierApi.bizSupplierDelete(params).then(() => {

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/controller/BizCustomerController.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.bizcustomer.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.bizcustomer.entity.BizCustomer;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerAddParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerEditParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerIdParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerPageParam;
+import vip.xiaonuo.biz.modular.bizcustomer.service.BizCustomerService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 客户控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ */
+@Tag(name = "客户控制器")
+@RestController
+@Validated
+public class BizCustomerController {
+
+    @Resource
+    private BizCustomerService bizCustomerService;
+
+    /**
+     * 获取客户分页
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    @Operation(summary = "获取客户分页")
+    @SaCheckPermission("/biz/bizcustomer/page")
+    @GetMapping("/biz/bizcustomer/page")
+    public CommonResult<Page<BizCustomer>> page(BizCustomerPageParam bizCustomerPageParam) {
+        return CommonResult.data(bizCustomerService.page(bizCustomerPageParam));
+    }
+
+    /**
+     * 添加客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    @Operation(summary = "添加客户")
+    @CommonLog("添加客户")
+    @PostMapping("/biz/bizcustomer/add")
+    public CommonResult<String> add(@RequestBody @Valid BizCustomerAddParam bizCustomerAddParam) {
+        bizCustomerService.add(bizCustomerAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    @Operation(summary = "编辑客户")
+    @CommonLog("编辑客户")
+    @PostMapping("/biz/bizcustomer/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizCustomerEditParam bizCustomerEditParam) {
+        bizCustomerService.edit(bizCustomerEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    @Operation(summary = "删除客户")
+    @CommonLog("删除客户")
+    @PostMapping("/biz/bizcustomer/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizCustomerIdParam> bizCustomerIdParamList) {
+        bizCustomerService.delete(bizCustomerIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取客户详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    @Operation(summary = "获取客户详情")
+    @GetMapping("/biz/bizcustomer/detail")
+    public CommonResult<BizCustomer> detail(@Valid BizCustomerIdParam bizCustomerIdParam) {
+        return CommonResult.data(bizCustomerService.detail(bizCustomerIdParam));
+    }
+}

+ 59 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/entity/BizCustomer.java

@@ -0,0 +1,59 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizcustomer.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户实体
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Getter
+@Setter
+@TableName("biz_customer")
+public class BizCustomer extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 客户名称 */
+    @Schema(description = "客户名称")
+    private String customerName;
+
+    /** 联系人 */
+    @Schema(description = "联系人")
+    private String customerContactName;
+
+    /** 手机号 */
+    @Schema(description = "手机号")
+    private String customerPhone;
+
+    /** 客户地址 */
+    @Schema(description = "客户地址")
+    private String customerAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String customerRemark;
+}

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

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/mapper/BizCustomerMapper.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.bizcustomer.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizcustomer.entity.BizCustomer;
+
+/**
+ * 客户Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+public interface BizCustomerMapper extends BaseMapper<BizCustomer> {
+}

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

+ 61 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerAddParam.java

@@ -0,0 +1,61 @@
+/*
+ * 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.bizcustomer.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Getter
+@Setter
+public class BizCustomerAddParam {
+
+    /** 客户名称 */
+    @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerName不能为空")
+    private String customerName;
+
+    /** 联系人 */
+    @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerContactName不能为空")
+    private String customerContactName;
+
+    /** 手机号 */
+    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerPhone不能为空")
+    private String customerPhone;
+
+    /** 客户地址 */
+    @Schema(description = "客户地址")
+    private String customerAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String customerRemark;
+
+    /** 关联用户id */
+    @Schema(description = "关联用户id")
+    private String userId;
+
+}

+ 66 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerEditParam.java

@@ -0,0 +1,66 @@
+/*
+ * 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.bizcustomer.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Getter
+@Setter
+public class BizCustomerEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 客户名称 */
+    @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerName不能为空")
+    private String customerName;
+
+    /** 联系人 */
+    @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerContactName不能为空")
+    private String customerContactName;
+
+    /** 手机号 */
+    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "customerPhone不能为空")
+    private String customerPhone;
+
+    /** 客户地址 */
+    @Schema(description = "客户地址")
+    private String customerAddress;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String customerRemark;
+
+    /** 关联用户id */
+    @Schema(description = "关联用户id")
+    private String userId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/param/BizCustomerIdParam.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.bizcustomer.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 客户Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Getter
+@Setter
+public class BizCustomerIdParam {
+
+    /** 主键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/bizcustomer/param/BizCustomerPageParam.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.bizcustomer.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Getter
+@Setter
+public class BizCustomerPageParam {
+
+    /** 当前页 */
+    @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/bizcustomer/service/BizCustomerService.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.bizcustomer.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizcustomer.entity.BizCustomer;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerAddParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerEditParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerIdParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerPageParam;
+
+import java.util.List;
+
+/**
+ * 客户Service接口
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+public interface BizCustomerService extends IService<BizCustomer> {
+
+    /**
+     * 获取客户分页
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    Page<BizCustomer> page(BizCustomerPageParam bizCustomerPageParam);
+
+    /**
+     * 添加客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    void add(BizCustomerAddParam bizCustomerAddParam);
+
+    /**
+     * 编辑客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    void edit(BizCustomerEditParam bizCustomerEditParam);
+
+    /**
+     * 删除客户
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    void delete(List<BizCustomerIdParam> bizCustomerIdParamList);
+
+    /**
+     * 获取客户详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     */
+    BizCustomer detail(BizCustomerIdParam bizCustomerIdParam);
+
+    /**
+     * 获取客户详情
+     *
+     * @author fanzherong
+     * @date  2025/03/21 11:44
+     **/
+    BizCustomer queryEntity(String id);
+}

+ 117 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizcustomer/service/impl/BizCustomerServiceImpl.java

@@ -0,0 +1,117 @@
+/*
+ * 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.bizcustomer.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.PhoneUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizcustomer.entity.BizCustomer;
+import vip.xiaonuo.biz.modular.bizcustomer.mapper.BizCustomerMapper;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerAddParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerEditParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerIdParam;
+import vip.xiaonuo.biz.modular.bizcustomer.param.BizCustomerPageParam;
+import vip.xiaonuo.biz.modular.bizcustomer.service.BizCustomerService;
+
+import java.util.List;
+
+/**
+ * 客户Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/21 11:44
+ **/
+@Service
+public class BizCustomerServiceImpl extends ServiceImpl<BizCustomerMapper, BizCustomer> implements BizCustomerService {
+
+    @Override
+    public Page<BizCustomer> page(BizCustomerPageParam bizCustomerPageParam) {
+        QueryWrapper<BizCustomer> queryWrapper = new QueryWrapper<BizCustomer>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizCustomerPageParam.getSearchKey())){
+            queryWrapper.lambda().like(BizCustomer::getCustomerName,bizCustomerPageParam.getSearchKey());
+        }
+        queryWrapper.lambda().orderByDesc(BizCustomer::getCreateTime);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizCustomerAddParam bizCustomerAddParam) {
+        //校验手机号格式
+        if(ObjectUtil.isNotEmpty(bizCustomerAddParam.getCustomerPhone())){
+            if(!PhoneUtil.isMobile(bizCustomerAddParam.getCustomerPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizCustomerAddParam.getCustomerPhone());
+            }
+        }
+        //查询客户名称是否添加过
+        long count = this.count(new QueryWrapper<BizCustomer>().lambda().eq(BizCustomer::getCustomerName, bizCustomerAddParam.getCustomerName()));
+        if(count>0){
+            throw new CommonException("客户名称已存在!");
+        }
+        BizCustomer bizCustomer = BeanUtil.toBean(bizCustomerAddParam, BizCustomer.class);
+        this.save(bizCustomer);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizCustomerEditParam bizCustomerEditParam) {
+        //校验手机号格式
+        if(ObjectUtil.isNotEmpty(bizCustomerEditParam.getCustomerPhone())){
+            if(!PhoneUtil.isMobile(bizCustomerEditParam.getCustomerPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizCustomerEditParam.getCustomerPhone());
+            }
+        }
+        BizCustomer bizCustomer = this.queryEntity(bizCustomerEditParam.getId());
+        if(!StringUtils.equals(bizCustomer.getCustomerName(),bizCustomerEditParam.getCustomerName())){
+            //查询客户名称是否添加过
+            long count = this.count(new QueryWrapper<BizCustomer>().lambda().eq(BizCustomer::getCustomerName, bizCustomerEditParam.getCustomerName()));
+            if(count>0){
+                throw new CommonException("客户名称已存在!");
+            }
+        }
+        BeanUtil.copyProperties(bizCustomerEditParam, bizCustomer);
+        this.updateById(bizCustomer);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizCustomerIdParam> bizCustomerIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizCustomerIdParamList, BizCustomerIdParam::getId));
+    }
+
+    @Override
+    public BizCustomer detail(BizCustomerIdParam bizCustomerIdParam) {
+        return this.queryEntity(bizCustomerIdParam.getId());
+    }
+
+    @Override
+    public BizCustomer queryEntity(String id) {
+        BizCustomer bizCustomer = this.getById(id);
+        if(ObjectUtil.isEmpty(bizCustomer)) {
+            throw new CommonException("客户不存在,id值为:{}", id);
+        }
+        return bizCustomer;
+    }
+}

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsupplier/entity/BizSupplier.java

@@ -41,6 +41,10 @@ public class BizSupplier extends CommonEntity {
     @Schema(description = "供货商名称")
     private String supplierName;
 
+    /** 联系人 */
+    @Schema(description = "联系人")
+    private String supplierContactName;
+
     /** 供货商手机号 */
     @Schema(description = "供货商手机号")
     private String supplierPhone;

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

@@ -36,9 +36,12 @@ public class BizSupplierAddParam {
     @NotBlank(message = "supplierName不能为空")
     private String supplierName;
 
+    /** 联系人 */
+    @Schema(description = "联系人")
+    private String supplierContactName;
+
     /** 供货商手机号 */
     @Schema(description = "供货商手机号", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "supplierPhone不能为空")
     private String supplierPhone;
 
     /** 供货商地址 */

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

@@ -41,9 +41,12 @@ public class BizSupplierEditParam {
     @NotBlank(message = "supplierName不能为空")
     private String supplierName;
 
+    /** 联系人 */
+    @Schema(description = "联系人")
+    private String supplierContactName;
+
     /** 供货商手机号 */
     @Schema(description = "供货商手机号", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "supplierPhone不能为空")
     private String supplierPhone;
 
     /** 供货商地址 */

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

@@ -15,10 +15,12 @@ package vip.xiaonuo.biz.modular.bizsupplier.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.PhoneUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
@@ -46,19 +48,27 @@ public class BizSupplierServiceImpl extends ServiceImpl<BizSupplierMapper, BizSu
     @Override
     public Page<BizSupplier> page(BizSupplierPageParam bizSupplierPageParam) {
         QueryWrapper<BizSupplier> queryWrapper = new QueryWrapper<BizSupplier>().checkSqlInjection();
-        if(ObjectUtil.isAllNotEmpty(bizSupplierPageParam.getSortField(), bizSupplierPageParam.getSortOrder())) {
-            CommonSortOrderEnum.validate(bizSupplierPageParam.getSortOrder());
-            queryWrapper.orderBy(true, bizSupplierPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
-                    StrUtil.toUnderlineCase(bizSupplierPageParam.getSortField()));
-        } else {
-            queryWrapper.lambda().orderByAsc(BizSupplier::getId);
+        if(ObjectUtil.isNotEmpty(bizSupplierPageParam.getSearchKey())){
+            queryWrapper.lambda().like(BizSupplier::getSupplierName,bizSupplierPageParam.getSearchKey());
         }
+        queryWrapper.lambda().orderByDesc(BizSupplier::getCreateTime);
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(BizSupplierAddParam bizSupplierAddParam) {
+        //校验手机号格式
+        if(ObjectUtil.isNotEmpty(bizSupplierAddParam.getSupplierPhone())){
+            if(!PhoneUtil.isMobile(bizSupplierAddParam.getSupplierPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizSupplierAddParam.getSupplierPhone());
+            }
+        }
+        //判断供货商是否存在
+        long count = this.count(new QueryWrapper<BizSupplier>().lambda().eq(BizSupplier::getSupplierName, bizSupplierAddParam.getSupplierName()));
+        if(count>0){
+            throw new CommonException("供货商已存在!");
+        }
         BizSupplier bizSupplier = BeanUtil.toBean(bizSupplierAddParam, BizSupplier.class);
         this.save(bizSupplier);
     }
@@ -66,7 +76,20 @@ public class BizSupplierServiceImpl extends ServiceImpl<BizSupplierMapper, BizSu
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(BizSupplierEditParam bizSupplierEditParam) {
+        //校验手机号格式
+        if(ObjectUtil.isNotEmpty(bizSupplierEditParam.getSupplierPhone())){
+            if(!PhoneUtil.isMobile(bizSupplierEditParam.getSupplierPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizSupplierEditParam.getSupplierPhone());
+            }
+        }
         BizSupplier bizSupplier = this.queryEntity(bizSupplierEditParam.getId());
+        if(!StringUtils.equals(bizSupplier.getSupplierName(),bizSupplierEditParam.getSupplierName())){
+            //修改过供货商名称,判断供货商是否存在
+            long count = this.count(new QueryWrapper<BizSupplier>().lambda().eq(BizSupplier::getSupplierName, bizSupplierEditParam.getSupplierName()));
+            if(count>0){
+                throw new CommonException("供货商已存在!");
+            }
+        }
         BeanUtil.copyProperties(bizSupplierEditParam, bizSupplier);
         this.updateById(bizSupplier);
     }

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

@@ -53,13 +53,7 @@ public class BizGoodsServiceImpl extends ServiceImpl<BizGoodsMapper, BizGoods> i
         if(ObjectUtil.isNotEmpty(bizGoodsPageParam.getModel())) {
             queryWrapper.lambda().like(BizGoods::getModel, bizGoodsPageParam.getModel());
         }
-        if(ObjectUtil.isAllNotEmpty(bizGoodsPageParam.getSortField(), bizGoodsPageParam.getSortOrder())) {
-            CommonSortOrderEnum.validate(bizGoodsPageParam.getSortOrder());
-            queryWrapper.orderBy(true, bizGoodsPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
-                    StrUtil.toUnderlineCase(bizGoodsPageParam.getSortField()));
-        } else {
-            queryWrapper.lambda().orderByAsc(BizGoods::getId);
-        }
+        queryWrapper.lambda().orderByDesc(BizGoods::getCreateTime);
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 

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

@@ -350,4 +350,32 @@ public class BizUserController {
         bizUserService.updatePassword(bizUserUpdatePwdParam);
         return CommonResult.ok();
     }
+
+    /**
+     * 获取客户账号
+     *
+     * @author xuyuxiang
+     * @date 2021/10/13 14:01
+     **/
+    @Operation(summary = "获取客户账号")
+    @CommonLog("获取客户账号")
+    @GetMapping("/biz/user/getListByCustomerId")
+    public CommonResult<List<BizUser>> getListByCustomerId(BizUserPageParam bizUserPageParam) {
+        return CommonResult.data(bizUserService.getListByCustomerId(bizUserPageParam));
+    }
+
+
+    /**
+     * 新增客户账号
+     *
+     * @author xuyuxiang
+     * @date 2021/10/13 14:01
+     **/
+    @Operation(summary = "新增客户账号")
+    @CommonLog("新增客户账号")
+    @PostMapping("/biz/user/addCustomerAccount")
+    public CommonResult<String> addCustomerAccount(@RequestBody @Valid BizUserAddParam bizUserAddParam) {
+        bizUserService.addCustomerAccount(bizUserAddParam);
+        return CommonResult.ok();
+    }
 }

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

@@ -282,4 +282,10 @@ public class BizUser extends CommonEntity {
     @Schema(description = "角色名称")
     @TableField(exist = false)
     private String roleName;
+
+    @Schema(description = "用户类型")
+    private String userType;
+
+    @Schema(description = "客户ID")
+    private String customerId;
 }

+ 4 - 2
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/param/BizUserAddParam.java

@@ -39,12 +39,10 @@ public class BizUserAddParam {
 
     /** 机构id */
     @Schema(description = "机构id", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "orgId不能为空")
     private String orgId;
 
     /** 岗位id */
     @Schema(description = "岗位id", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "positionId不能为空")
     private String positionId;
 
     /** 岗级 */
@@ -174,4 +172,8 @@ public class BizUserAddParam {
     /** 扩展信息 */
     @Schema(description = "扩展信息")
     private String extJson;
+
+    /** 客户ID*/
+    @Schema(description = "客户ID")
+    private String customerId;
 }

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

@@ -44,12 +44,10 @@ public class BizUserEditParam {
 
     /** 机构id */
     @Schema(description = "机构id", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "orgId不能为空")
     private String orgId;
 
     /** 岗位id */
     @Schema(description = "岗位id", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "positionId不能为空")
     private String positionId;
 
     /** 岗级 */

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

@@ -53,4 +53,8 @@ public class BizUserPageParam {
     /** 所属机构 */
     @Schema(description = "所属机构")
     private String orgId;
+
+    /**客户id*/
+    @Schema(description = "客户id")
+    private String customerId;
 }

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

@@ -214,4 +214,8 @@ public interface BizUserService extends IService<BizUser> {
      * @date 2022/4/22 15:53
      **/
     void updatePassword(BizUserUpdatePwdParam bizUserUpdatePwdParam);
+
+    void addCustomerAccount(BizUserAddParam bizUserAddParam);
+
+    List<BizUser> getListByCustomerId(BizUserPageParam bizUserPageParam);
 }

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

@@ -47,6 +47,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fhs.trans.service.impl.TransService;
+import com.google.common.collect.Lists;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.poi.ss.usermodel.*;
@@ -208,15 +209,15 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 .eq(BizUser::getAccount, bizUserAddParam.getAccount())) > 0) {
             throw new CommonException("存在重复的账号,账号为:{}", bizUserAddParam.getAccount());
         }
-        //if(ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) {
-        //    if(!PhoneUtil.isMobile(bizUserAddParam.getPhone())) {
-        //        throw new CommonException("手机号码:{}格式错误", bizUserAddParam.getPhone());
-        //    }
-        //    if (this.count(new LambdaQueryWrapper<BizUser>()
-        //            .eq(BizUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(bizUserAddParam.getPhone()))) > 0) {
-        //        throw new CommonException("存在重复的手机号,手机号为:{}", bizUserAddParam.getPhone());
-        //    }
-        //}
+        if(ObjectUtil.isNotEmpty(bizUserAddParam.getPhone())) {
+            if(!PhoneUtil.isMobile(bizUserAddParam.getPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizUserAddParam.getPhone());
+            }
+            /*if (this.count(new LambdaQueryWrapper<BizUser>()
+                    .eq(BizUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(bizUserAddParam.getPhone()))) > 0) {
+                throw new CommonException("存在重复的手机号,手机号为:{}", bizUserAddParam.getPhone());
+            }*/
+        }
         if(ObjectUtil.isNotEmpty(bizUserAddParam.getEmail())) {
             if(!CommonEmailUtil.isEmail(bizUserAddParam.getEmail())) {
                 throw new CommonException("邮箱:{}格式错误", bizUserAddParam.getEmail());
@@ -262,16 +263,16 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 .ne(BizUser::getId, bizUserEditParam.getId())) > 0) {
             throw new CommonException("存在重复的账号,账号为:{}", bizUserEditParam.getAccount());
         }
-        //if(ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) {
-        //    if(!PhoneUtil.isMobile(bizUserEditParam.getPhone())) {
-        //        throw new CommonException("手机号码:{}格式错误", bizUserEditParam.getPhone());
-        //    }
-        //    if (this.count(new LambdaQueryWrapper<BizUser>()
-        //            .eq(BizUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(bizUserEditParam.getPhone()))
-        //            .ne(BizUser::getId, bizUserEditParam.getId())) > 0) {
-        //        throw new CommonException("存在重复的手机号,手机号为:{}", bizUserEditParam.getPhone());
-        //    }
-        //}
+        if(ObjectUtil.isNotEmpty(bizUserEditParam.getPhone())) {
+            if(!PhoneUtil.isMobile(bizUserEditParam.getPhone())) {
+                throw new CommonException("手机号码:{}格式错误", bizUserEditParam.getPhone());
+            }
+            /*if (this.count(new LambdaQueryWrapper<BizUser>()
+                    .eq(BizUser::getPhone, CommonCryptogramUtil.doSm4CbcEncrypt(bizUserEditParam.getPhone()))
+                    .ne(BizUser::getId, bizUserEditParam.getId())) > 0) {
+                throw new CommonException("存在重复的手机号,手机号为:{}", bizUserEditParam.getPhone());
+            }*/
+        }
         if(ObjectUtil.isNotEmpty(bizUserEditParam.getEmail())) {
             if(!CommonEmailUtil.isEmail(bizUserEditParam.getEmail())) {
                 throw new CommonException("邮箱:{}格式错误", bizUserEditParam.getEmail());
@@ -808,6 +809,35 @@ public class BizUserServiceImpl extends ServiceImpl<BizUserMapper, BizUser> impl
                 CommonCryptogramUtil.doHashValue(newPassword)));
     }
 
+    //新增客户账号
+    @Override
+    public void addCustomerAccount(BizUserAddParam bizUserAddParam) {
+        checkParam(bizUserAddParam);
+        BizUser bizUser = BeanUtil.toBean(bizUserAddParam, BizUser.class);
+        // 设置密码
+        bizUser.setPassword(CommonCryptogramUtil.doHashValue(devConfigApi.getValueByKey(SNOWY_SYS_DEFAULT_PASSWORD_KEY)));
+        // 设置状态
+        bizUser.setUserStatus(BizUserStatusEnum.ENABLE.getValue());
+        // 设置客户账号
+        bizUser.setUserType("1");
+        this.save(bizUser);
+
+        //授权客户角色
+        List<String> list = Lists.newArrayList();
+        list.add("1902983144649895938");
+        sysUserApi.grantRole(bizUser.getId(), list);
+
+        // 发布增加事件
+        CommonDataChangeEventCenter.doAddWithData(BizDataTypeEnum.USER.getValue(), JSONUtil.createArray().put(bizUser));
+    }
+
+    @Override
+    public List<BizUser> getListByCustomerId(BizUserPageParam bizUserPageParam) {
+        List<BizUser> userList = this.list(new QueryWrapper<BizUser>().lambda().
+                eq(BizUser::getCustomerId, bizUserPageParam.getCustomerId()));
+        return userList;
+    }
+
 
     private void miniCheckParam(BizUserMiniAddParam bizUserAddParam) {
         // 校验数据范围

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

@@ -286,4 +286,6 @@ public class SysUser extends CommonEntity {
     @TableField(exist = false)
     private String roleName;
 
+    @Schema(description = "用户类型 1:客户账号   2:司机账号")
+    private String userType;
 }