Browse Source

管桩计划

fanzherong_v 3 ngày trước cách đây
mục cha
commit
2d75ec0e89
30 tập tin đã thay đổi với 2191 bổ sung0 xóa
  1. 28 0
      snowy-admin-web/src/api/biz/bizPipeAppointApi.js
  2. 36 0
      snowy-admin-web/src/api/biz/bizPipePlanApi.js
  3. 103 0
      snowy-admin-web/src/views/biz/bizpipeappoint/form.vue
  4. 130 0
      snowy-admin-web/src/views/biz/bizpipeappoint/index.vue
  5. 112 0
      snowy-admin-web/src/views/biz/bizpipeplan/form.vue
  6. 267 0
      snowy-admin-web/src/views/biz/bizpipeplan/index.vue
  7. 1 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/mapper/mapping/BizLoadAppointMapper.xml
  8. 1 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/impl/BizLoadAppointServiceImpl.java
  9. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/controller/BizPipeAppointController.java
  10. 68 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/entity/BizPipeAppoint.java
  11. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/enums/BizPipeAppointEnum.java
  12. 29 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/mapper/BizPipeAppointMapper.java
  13. 8 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/mapper/mapping/BizPipeAppointMapper.xml
  14. 62 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointAddParam.java
  15. 67 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointEditParam.java
  16. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointIdParam.java
  17. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointPageParam.java
  18. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/service/BizPipeAppointService.java
  19. 190 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/service/impl/BizPipeAppointServiceImpl.java
  20. 145 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/controller/BizPipePlanController.java
  21. 75 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/entity/BizPipePlan.java
  22. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/enums/BizPipePlanEnum.java
  23. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/mapper/BizPipePlanMapper.java
  24. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/mapper/mapping/BizPipePlanMapper.xml
  25. 67 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanAddParam.java
  26. 72 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanEditParam.java
  27. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanIdParam.java
  28. 57 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanPageParam.java
  29. 91 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/service/BizPipePlanService.java
  30. 164 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/service/impl/BizPipePlanServiceImpl.java

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

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizpipeappoint/` + url, ...arg)
+
+/**
+ * 管桩预约Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ **/
+export default {
+	// 获取管桩预约分页
+	bizPipeAppointPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交管桩预约表单 edit为true时为编辑,默认为新增
+	bizPipeAppointSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除管桩预约
+	bizPipeAppointDelete(data) {
+		return request('delete', data)
+	},
+	// 获取管桩预约详情
+	bizPipeAppointDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 36 - 0
snowy-admin-web/src/api/biz/bizPipePlanApi.js

@@ -0,0 +1,36 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizpipeplan/` + url, ...arg)
+
+/**
+ * 管桩计划Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ **/
+export default {
+	// 获取管桩计划分页
+	bizPipePlanPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交管桩计划表单 edit为true时为编辑,默认为新增
+	bizPipePlanSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除管桩计划
+	bizPipePlanDelete(data) {
+		return request('delete', data)
+	},
+	// 获取管桩计划详情
+	bizPipePlanDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 结束管桩计划
+	endPlan(data){
+		return request('endPlan',data)
+	},
+	// 获取管桩统计列表
+	getList(data){
+		return request('getList',data,'get')
+	}
+}

+ 103 - 0
snowy-admin-web/src/views/biz/bizpipeappoint/form.vue

@@ -0,0 +1,103 @@
+<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="planId">
+				<a-select v-model:value="formData.planId" placeholder="请选择管桩计划"
+						  :options="planIdList"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="车牌号:" name="licensePlate">
+				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号" allow-clear />
+			</a-form-item>
+			<a-form-item label="司机姓名:" name="driverName">
+				<a-input v-model:value="formData.driverName" placeholder="请输入司机姓名" allow-clear />
+			</a-form-item>
+			<a-form-item label="司机电话:" name="driverMobile">
+				<a-input v-model:value="formData.driverMobile" 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="bizPipeAppointForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizPipeAppointApi from '@/api/biz/bizPipeAppointApi'
+	import bizPipePlanApi from "@/api/biz/bizPipePlanApi";
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const planIdList = ref([])
+
+	//设置表单样式
+	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)
+		}
+		bizPipePlanApi.getList().then((res)=>{
+			planIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.planNumber
+				}
+			})
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		planId:[required('请选择管桩计划')],
+		licensePlate:[required('请输入车牌号')],
+		driverName:[required('请输入司机姓名')],
+		driverMobile:[required('请输入司机电话')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizPipeAppointApi
+					.bizPipeAppointSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 130 - 0
snowy-admin-web/src/views/biz/bizpipeappoint/index.vue

@@ -0,0 +1,130 @@
+<template>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizPipeAppointAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizPipeAppointEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizPipeAppointEdit', 'bizPipeAppointDelete'], 'and')" />
+						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizPipeAppoint(record)">
+							<a-button type="link" danger size="small" v-if="hasPerm('bizPipeAppointDelete')">删除</a-button>
+						</a-popconfirm>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizpipeappoint">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizPipeAppointApi from '@/api/biz/bizPipeAppointApi'
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '管桩计划单号',
+			dataIndex: 'planId',
+			align:'center'
+		},
+		{
+			title: '车牌号',
+			dataIndex: 'licensePlate',
+			align:'center'
+		},
+		{
+			title: '司机姓名',
+			dataIndex: 'driverName',
+			align:'center'
+		},
+		{
+			title: '司机电话',
+			dataIndex: 'driverMobile',
+			align:'center'
+		},
+		{
+			title: '入场时间',
+			dataIndex: 'beginTime',
+			align:'center'
+		},
+		{
+			title: '出场时间',
+			dataIndex: 'endTime',
+			align:'center'
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['bizPipeAppointEdit', 'bizPipeAppointDelete'])) {
+		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 bizPipeAppointApi.bizPipeAppointPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizPipeAppoint = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizPipeAppointApi.bizPipeAppointDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizPipeAppoint = (params) => {
+		bizPipeAppointApi.bizPipeAppointDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 112 - 0
snowy-admin-web/src/views/biz/bizpipeplan/form.vue

@@ -0,0 +1,112 @@
+<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="planName">
+				<a-input v-model:value="formData.planName" placeholder="请输入计划名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="预约次数:" name="planCount">
+				<a-input v-model:value="formData.planCount" placeholder="请输入预约次数" allow-clear />
+			</a-form-item>
+			<a-form-item label="选择日期:" name="planDate">
+				<a-date-picker v-model:value="formData.planDate" value-format="YYYY-MM-DD" show-date placeholder="请选择日期" :disabled-date="disabledDate" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="开始时间:" name="startDate">
+				<a-time-picker v-model:value="formData.startDate" valueFormat="HH:mm" format = "HH:mm" placeholder="请选择开始时间"   style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="结束时间:" name="endDate">
+				<a-time-picker v-model:value="formData.endDate" valueFormat="HH:mm" format = "HH:mm" placeholder="请选择结束时间"  style="width: 100%" />
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizPipePlanForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizPipePlanApi from '@/api/biz/bizPipePlanApi'
+	import dayjs from 'dayjs'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import { message, Modal } from 'ant-design-vue'
+	import {createVNode} from 'vue';
+
+	// 抽屉状态
+	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 nowTime = ref(new Date())
+	// 禁用时间范围
+	const disabledDate = (current) => {
+		return (
+			(current && current < dayjs(nowTime.value).startOf('time'))
+		)
+	}
+
+	// 打开抽屉
+	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 = {
+		planName:[required('请输入计划名称')],
+		planCount:[required('请输入预约次数')],
+		startDate:[required('请选择开始时间')],
+		endDate:[required('请选择结束时间')],
+		planDate:[required('请选择日期')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				if(formData.value.endTime <= formData.value.beginTime){
+					message.error('结束时间不能小于开始时间!')
+					return
+				}
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizPipePlanApi
+					.bizPipePlanSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 267 - 0
snowy-admin-web/src/views/biz/bizpipeplan/index.vue

@@ -0,0 +1,267 @@
+<template>
+	<a-card :bordered="false" style="margin-bottom: 10px" class="mb-2">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="计划编号" name="planNumber">
+						<a-input v-model:value="searchFormState.planNumber" placeholder="计划编号查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="计划名称" name="planName">
+						<a-input v-model:value="searchFormState.planName" 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>
+	</a-card>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizPipePlanAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+<!--					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizPipePlanEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizPipePlanEdit', 'bizPipePlanDelete'], 'and')" />
+						<a style="color:red" size="small"  v-if="hasPerm('bizPipePlanDelete')" type="link" @click="deleteConfig(record)">删除</a>
+					</a-space>-->
+					<a-dropdown>
+						<a class="ant-dropdown-link">
+							更多
+							<DownOutlined />
+						</a>
+						<template #overlay>
+							<a-menu>
+								<a-menu-item v-if="hasPerm('bizPipePlanEdit')">
+									<a @click="formRef.onOpen(record)" >编辑</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizPipePlanDelete')">
+									<a style="color:red" size="small"   type="link" @click="deleteConfig(record)">删除</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizPipePlanEnd')">
+									<a style="color:red" size="small"   type="link" @click="endPlan(record)">结束</a>
+								</a-menu-item>
+							</a-menu>
+						</template>
+					</a-dropdown>
+				</template>
+				<template v-if="column.dataIndex === 'planSurplusCount'">
+					{{record.planCount-record.planAlreadyCount}}
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					<a-tag
+						:color="
+							record.status === '1'
+								? 'blue'
+								: record.status === '2'
+								  ? 'warning'
+								  : record.status === '3'
+								  ? 'red'
+								  : record.status === '4'
+								  ? 'volcano'
+								  : record.status === '5'
+								  ? 'purple'
+								  : record.status === '6'
+								  ? 'error'
+								  : record.status === '7'
+								  ? 'red'
+								  : record.status === '8'
+								  ? 'cyan'
+								  : '#f50'
+						"
+					>
+						{{ $TOOL.dictTypeData('pipe_plan_status', record.status) }}
+					</a-tag>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizpipeplan">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizPipePlanApi from '@/api/biz/bizPipePlanApi'
+	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: '计划编号',
+			dataIndex: 'planNumber',
+			align:'center'
+		},
+		{
+			title: '计划名称',
+			dataIndex: 'planName',
+			align:'center'
+		},
+		{
+			title: '预约次数',
+			dataIndex: 'planCount',
+			align:'center'
+		},
+		{
+			title: '已预约次数',
+			dataIndex: 'planAlreadyCount',
+			align:'center'
+		},
+		{
+			title: '剩余次数',
+			dataIndex: 'planSurplusCount',
+			align:'center'
+		},
+		{
+			title: '开始时间',
+			dataIndex: 'beginTime',
+			align:'center'
+		},
+		{
+			title: '结束时间',
+			dataIndex: 'endTime',
+			align:'center'
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			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 bizPipePlanApi.bizPipePlanPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizPipePlan = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizPipePlanApi.bizPipePlanDelete(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
+					}
+				]
+
+				bizPipePlanApi
+					.bizPipePlanDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	//结束
+	const endPlan = (record) => {
+		Modal.confirm({
+			title: '确定结束该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizPipePlanApi
+					.endPlan(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizPipePlan = (params) => {
+		bizPipePlanApi.bizPipePlanDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 1 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/mapper/mapping/BizLoadAppointMapper.xml

@@ -31,6 +31,7 @@
          left join biz_service_customer bsc on bla.customer_id = bsc.id
          left join biz_goods bg on bg.id = bla.goods_id
          left join biz_supplier bs on bs.id = bla.supplier_id
+         left join biz_load_arrive ba on ba.appoint_id = bla.id
          ${ew.customSqlSegment}
     </select>
 

+ 1 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/impl/BizLoadAppointServiceImpl.java

@@ -112,6 +112,7 @@ public class BizLoadAppointServiceImpl extends ServiceImpl<BizLoadAppointMapper,
             queryWrapper.eq("bla.customer_id", StpLoginUserUtil.getLoginUser().getCustomerId());
         }
         queryWrapper.eq("bla.delete_flag","NOT_DELETE");
+        queryWrapper.eq("ba.delete_flag","NOT_DELETE");
         queryWrapper.orderByDesc("bla.create_time");
         return queryWrapper;
     }

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/controller/BizPipeAppointController.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.bizpipeappoint.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.bizpipeappoint.entity.BizPipeAppoint;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointAddParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointEditParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointIdParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointPageParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.service.BizPipeAppointService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 管桩预约控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ */
+@Tag(name = "管桩预约控制器")
+@RestController
+@Validated
+public class BizPipeAppointController {
+
+    @Resource
+    private BizPipeAppointService bizPipeAppointService;
+
+    /**
+     * 获取管桩预约分页
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    @Operation(summary = "获取管桩预约分页")
+    @SaCheckPermission("/biz/bizpipeappoint/page")
+    @GetMapping("/biz/bizpipeappoint/page")
+    public CommonResult<Page<BizPipeAppoint>> page(BizPipeAppointPageParam bizPipeAppointPageParam) {
+        return CommonResult.data(bizPipeAppointService.page(bizPipeAppointPageParam));
+    }
+
+    /**
+     * 添加管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    @Operation(summary = "添加管桩预约")
+    @CommonLog("添加管桩预约")
+    @PostMapping("/biz/bizpipeappoint/add")
+    public CommonResult<String> add(@RequestBody @Valid BizPipeAppointAddParam bizPipeAppointAddParam) {
+        bizPipeAppointService.add(bizPipeAppointAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    @Operation(summary = "编辑管桩预约")
+    @CommonLog("编辑管桩预约")
+    @PostMapping("/biz/bizpipeappoint/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizPipeAppointEditParam bizPipeAppointEditParam) {
+        bizPipeAppointService.edit(bizPipeAppointEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    @Operation(summary = "删除管桩预约")
+    @CommonLog("删除管桩预约")
+    @PostMapping("/biz/bizpipeappoint/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizPipeAppointIdParam> bizPipeAppointIdParamList) {
+        bizPipeAppointService.delete(bizPipeAppointIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取管桩预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    @Operation(summary = "获取管桩预约详情")
+    @GetMapping("/biz/bizpipeappoint/detail")
+    public CommonResult<BizPipeAppoint> detail(@Valid BizPipeAppointIdParam bizPipeAppointIdParam) {
+        return CommonResult.data(bizPipeAppointService.detail(bizPipeAppointIdParam));
+    }
+}

+ 68 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/entity/BizPipeAppoint.java

@@ -0,0 +1,68 @@
+/*
+ * 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.bizpipeappoint.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/06/30 15:49
+ **/
+@Getter
+@Setter
+@TableName("biz_pipe_appoint")
+public class BizPipeAppoint extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 计划单id */
+    @Schema(description = "计划单id")
+    private String planId;
+
+    /** 车牌号 */
+    @Schema(description = "车牌号")
+    private String licensePlate;
+
+    /** 司机姓名 */
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    /** 司机电话 */
+    @Schema(description = "司机电话")
+    private String driverMobile;
+
+    /** 状态 */
+    @Schema(description = "状态")
+    private String status;
+
+    /** 入场时间 */
+    @Schema(description = "入场时间")
+    private Date beginTime;
+
+    /** 出场时间 */
+    @Schema(description = "出场时间")
+    private Date endTime;
+
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/enums/BizPipeAppointEnum.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.bizpipeappoint.enums;
+
+import lombok.Getter;
+
+/**
+ * 管桩预约枚举
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ **/
+@Getter
+public enum BizPipeAppointEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizPipeAppointEnum(String value) {
+        this.value = value;
+    }
+}

+ 29 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/mapper/BizPipeAppointMapper.java

@@ -0,0 +1,29 @@
+/*
+ * 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.bizpipeappoint.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import vip.xiaonuo.biz.modular.bizpipeappoint.entity.BizPipeAppoint;
+
+/**
+ * 管桩预约Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ **/
+public interface BizPipeAppointMapper extends BaseMapper<BizPipeAppoint> {
+    Page<BizPipeAppoint> getPage(@Param("page") Page<BizPipeAppoint> page, @Param("ew") QueryWrapper<BizPipeAppoint> ew);
+}

+ 8 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/mapper/mapping/BizPipeAppointMapper.xml

@@ -0,0 +1,8 @@
+<?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.bizpipeappoint.mapper.BizPipeAppointMapper">
+
+    <select id="getPage" resultType="vip.xiaonuo.biz.modular.bizpipeappoint.entity.BizPipeAppoint">
+
+    </select>
+</mapper>

+ 62 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointAddParam.java

@@ -0,0 +1,62 @@
+/*
+ * 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.bizpipeappoint.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/06/30 15:49
+ **/
+@Getter
+@Setter
+public class BizPipeAppointAddParam {
+
+    /** 计划单id */
+    @Schema(description = "计划单id")
+    private String planId;
+
+    /** 车牌号 */
+    @Schema(description = "车牌号")
+    private String licensePlate;
+
+    /** 司机姓名 */
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    /** 司机电话 */
+    @Schema(description = "司机电话")
+    private String driverMobile;
+
+    /** 状态 */
+    @Schema(description = "状态")
+    private String status;
+
+    /** 入场时间 */
+    @Schema(description = "入场时间")
+    private Date beginTime;
+
+    /** 出场时间 */
+    @Schema(description = "出场时间")
+    private Date endTime;
+
+}

+ 67 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointEditParam.java

@@ -0,0 +1,67 @@
+/*
+ * 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.bizpipeappoint.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/06/30 15:49
+ **/
+@Getter
+@Setter
+public class BizPipeAppointEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 计划单id */
+    @Schema(description = "计划单id")
+    private String planId;
+
+    /** 车牌号 */
+    @Schema(description = "车牌号")
+    private String licensePlate;
+
+    /** 司机姓名 */
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    /** 司机电话 */
+    @Schema(description = "司机电话")
+    private String driverMobile;
+
+    /** 状态 */
+    @Schema(description = "状态")
+    private String status;
+
+    /** 入场时间 */
+    @Schema(description = "入场时间")
+    private Date beginTime;
+
+    /** 出场时间 */
+    @Schema(description = "出场时间")
+    private Date endTime;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/param/BizPipeAppointIdParam.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.bizpipeappoint.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/06/30 15:49
+ **/
+@Getter
+@Setter
+public class BizPipeAppointIdParam {
+
+    /** 主键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/bizpipeappoint/param/BizPipeAppointPageParam.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.bizpipeappoint.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/06/30 15:49
+ **/
+@Getter
+@Setter
+public class BizPipeAppointPageParam {
+
+    /** 当前页 */
+    @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/bizpipeappoint/service/BizPipeAppointService.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.bizpipeappoint.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizpipeappoint.entity.BizPipeAppoint;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointAddParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointEditParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointIdParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointPageParam;
+
+import java.util.List;
+
+/**
+ * 管桩预约Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ **/
+public interface BizPipeAppointService extends IService<BizPipeAppoint> {
+
+    /**
+     * 获取管桩预约分页
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    Page<BizPipeAppoint> page(BizPipeAppointPageParam bizPipeAppointPageParam);
+
+    /**
+     * 添加管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    void add(BizPipeAppointAddParam bizPipeAppointAddParam);
+
+    /**
+     * 编辑管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    void edit(BizPipeAppointEditParam bizPipeAppointEditParam);
+
+    /**
+     * 删除管桩预约
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    void delete(List<BizPipeAppointIdParam> bizPipeAppointIdParamList);
+
+    /**
+     * 获取管桩预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     */
+    BizPipeAppoint detail(BizPipeAppointIdParam bizPipeAppointIdParam);
+
+    /**
+     * 获取管桩预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 15:49
+     **/
+    BizPipeAppoint queryEntity(String id);
+}

+ 190 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeappoint/service/impl/BizPipeAppointServiceImpl.java

@@ -0,0 +1,190 @@
+/*
+ * 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.bizpipeappoint.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 jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizpipeplan.entity.BizPipePlan;
+import vip.xiaonuo.biz.modular.bizpipeplan.service.BizPipePlanService;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizpipeappoint.entity.BizPipeAppoint;
+import vip.xiaonuo.biz.modular.bizpipeappoint.mapper.BizPipeAppointMapper;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointAddParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointEditParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointIdParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.param.BizPipeAppointPageParam;
+import vip.xiaonuo.biz.modular.bizpipeappoint.service.BizPipeAppointService;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 管桩预约Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/30 15:49
+ **/
+@Service
+public class BizPipeAppointServiceImpl extends ServiceImpl<BizPipeAppointMapper, BizPipeAppoint> implements BizPipeAppointService {
+
+    private final ReentrantLock lock = new ReentrantLock();
+
+    @Resource
+    private BizPipePlanService bizPipePlanService;
+
+    @Override
+    public Page<BizPipeAppoint> page(BizPipeAppointPageParam bizPipeAppointPageParam) {
+        QueryWrapper<BizPipeAppoint> queryWrapper = new QueryWrapper<BizPipeAppoint>().checkSqlInjection();
+        
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizPipeAppointAddParam bizPipeAppointAddParam) {
+        checkCount(bizPipeAppointAddParam);
+        checkParam(bizPipeAppointAddParam);
+        BizPipeAppoint bizPipeAppoint = BeanUtil.toBean(bizPipeAppointAddParam, BizPipeAppoint.class);
+        this.save(bizPipeAppoint);
+
+        //查询管桩计划
+        BizPipePlan pipePlan = bizPipePlanService.getById(bizPipeAppointAddParam.getPlanId());
+        if(ObjectUtil.isNotNull(pipePlan)){
+            pipePlan.setPlanAlreadyCount(pipePlan.getPlanAlreadyCount()+1);
+            bizPipePlanService.updateById(pipePlan);
+        }
+    }
+
+    //校验剩余可约次数
+    public void checkCount(BizPipeAppointAddParam bizPipeAppointAddParam){
+        lock.lock();
+        try{
+            BizPipePlan pipePlan = bizPipePlanService.getById(bizPipeAppointAddParam.getPlanId());
+            if(ObjectUtil.isNotNull(pipePlan)){
+                //判断剩余可约次数是否小于0
+                if(pipePlan.getPlanCount()-pipePlan.getPlanAlreadyCount() <=0){
+                    throw new CommonException("管桩计划单已预约满!");
+                }
+            }
+        }finally {
+            lock.unlock(); // 释放锁
+        }
+    }
+
+    //校验参数
+    public void checkParam(BizPipeAppointAddParam bizPipeAppointAddParam){
+        if(ObjectUtil.isNotEmpty(bizPipeAppointAddParam.getLicensePlate())){
+            bizPipeAppointAddParam.setLicensePlate(bizPipeAppointAddParam.getLicensePlate().toUpperCase().trim());
+            //根据车牌号查询是否有正在执行中的管桩预约
+            long count = this.count(new QueryWrapper<BizPipeAppoint>().lambda().
+                    ne(BizPipeAppoint::getStatus, "5").
+                    eq(BizPipeAppoint::getLicensePlate, bizPipeAppointAddParam.getLicensePlate()));
+            if(count>0){
+                throw new CommonException("车辆存在正在执行的管桩预约!");
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizPipeAppointEditParam bizPipeAppointEditParam) {
+        BizPipeAppoint bizPipeAppoint = this.queryEntity(bizPipeAppointEditParam.getId());
+        checkCount(bizPipeAppointEditParam,bizPipeAppoint);
+        checkParam(bizPipeAppointEditParam,bizPipeAppoint);
+        if(!StringUtils.equals(bizPipeAppointEditParam.getPlanId(),bizPipeAppoint.getPlanId())){
+            //修改老管桩订单已约次数
+            BizPipePlan oldPlan = bizPipePlanService.getById(bizPipeAppoint.getPlanId());
+            if(ObjectUtil.isNotNull(oldPlan)){
+                oldPlan.setPlanAlreadyCount(oldPlan.getPlanAlreadyCount()-1);
+                bizPipePlanService.updateById(oldPlan);
+            }
+
+            //修改新管桩订单预约次数
+            BizPipePlan newPlan = bizPipePlanService.getById(bizPipeAppointEditParam.getPlanId());
+            if(ObjectUtil.isNotNull(newPlan)){
+                newPlan.setPlanAlreadyCount(newPlan.getPlanAlreadyCount()+1);
+                bizPipePlanService.updateById(newPlan);
+            }
+        }
+        BeanUtil.copyProperties(bizPipeAppointEditParam, bizPipeAppoint);
+        this.updateById(bizPipeAppoint);
+    }
+
+    //校验剩余可约次数
+    public void checkCount(BizPipeAppointEditParam bizPipeAppointEditParam,BizPipeAppoint bizPipeAppoint){
+        if(!StringUtils.equals(bizPipeAppointEditParam.getPlanId(),bizPipeAppoint.getPlanId())){
+            lock.lock();
+            try{
+                BizPipePlan pipePlan = bizPipePlanService.getById(bizPipeAppointEditParam.getPlanId());
+                if(ObjectUtil.isNotNull(pipePlan)){
+                    //判断剩余可约次数是否小于0
+                    if(pipePlan.getPlanCount()-pipePlan.getPlanAlreadyCount() <=0){
+                        throw new CommonException("管桩计划单已预约满!");
+                    }
+                }
+            }finally {
+                lock.unlock(); // 释放锁
+            }
+        }
+    }
+
+    public void checkParam(BizPipeAppointEditParam bizPipeAppointEditParam,BizPipeAppoint bizPipeAppoint){
+        if(ObjectUtil.isNotEmpty(bizPipeAppointEditParam.getLicensePlate())){
+            bizPipeAppointEditParam.setLicensePlate(bizPipeAppointEditParam.getLicensePlate().toUpperCase().trim());
+            if(!StringUtils.equals(bizPipeAppointEditParam.getLicensePlate(),bizPipeAppoint.getLicensePlate())){
+                //根据车牌号查询是否有正在执行中的管桩预约
+                long count = this.count(new QueryWrapper<BizPipeAppoint>().lambda().
+                        ne(BizPipeAppoint::getStatus, "5").
+                        eq(BizPipeAppoint::getLicensePlate, bizPipeAppointEditParam.getLicensePlate()));
+                if(count>0){
+                    throw new CommonException("车辆存在正在执行的管桩预约!");
+                }
+            }
+        }
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizPipeAppointIdParam> bizPipeAppointIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizPipeAppointIdParamList, BizPipeAppointIdParam::getId));
+    }
+
+    @Override
+    public BizPipeAppoint detail(BizPipeAppointIdParam bizPipeAppointIdParam) {
+        return this.queryEntity(bizPipeAppointIdParam.getId());
+    }
+
+    @Override
+    public BizPipeAppoint queryEntity(String id) {
+        BizPipeAppoint bizPipeAppoint = this.getById(id);
+        if(ObjectUtil.isEmpty(bizPipeAppoint)) {
+            throw new CommonException("管桩预约不存在,id值为:{}", id);
+        }
+        return bizPipeAppoint;
+    }
+}

+ 145 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/controller/BizPipePlanController.java

@@ -0,0 +1,145 @@
+/*
+ * 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.bizpipeplan.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.bizpipeplan.entity.BizPipePlan;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanAddParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanEditParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanIdParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanPageParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.service.BizPipePlanService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 管桩计划控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ */
+@Tag(name = "管桩计划控制器")
+@RestController
+@Validated
+public class BizPipePlanController {
+
+    @Resource
+    private BizPipePlanService bizPipePlanService;
+
+    /**
+     * 获取管桩计划分页
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "获取管桩计划分页")
+    @SaCheckPermission("/biz/bizpipeplan/page")
+    @GetMapping("/biz/bizpipeplan/page")
+    public CommonResult<Page<BizPipePlan>> page(BizPipePlanPageParam bizPipePlanPageParam) {
+        return CommonResult.data(bizPipePlanService.page(bizPipePlanPageParam));
+    }
+
+    /**
+     * 添加管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "添加管桩计划")
+    @CommonLog("添加管桩计划")
+    @PostMapping("/biz/bizpipeplan/add")
+    public CommonResult<String> add(@RequestBody @Valid BizPipePlanAddParam bizPipePlanAddParam) {
+        bizPipePlanService.add(bizPipePlanAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "编辑管桩计划")
+    @CommonLog("编辑管桩计划")
+    @PostMapping("/biz/bizpipeplan/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizPipePlanEditParam bizPipePlanEditParam) {
+        bizPipePlanService.edit(bizPipePlanEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "删除管桩计划")
+    @CommonLog("删除管桩计划")
+    @PostMapping("/biz/bizpipeplan/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizPipePlanIdParam> bizPipePlanIdParamList) {
+        bizPipePlanService.delete(bizPipePlanIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取管桩计划详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "获取管桩计划详情")
+    @GetMapping("/biz/bizpipeplan/detail")
+    public CommonResult<BizPipePlan> detail(@Valid BizPipePlanIdParam bizPipePlanIdParam) {
+        return CommonResult.data(bizPipePlanService.detail(bizPipePlanIdParam));
+    }
+
+    /**
+     * 结束管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "结束管桩计划")
+    @CommonLog("结束管桩计划")
+    @PostMapping("/biz/bizpipeplan/endPlan")
+    public CommonResult<String> endPlan(@RequestBody @Valid BizPipePlanEditParam bizPipePlanEditParam) {
+        bizPipePlanService.endPlan(bizPipePlanEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取管桩计划列表
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    @Operation(summary = "获取管桩计划列表")
+    @GetMapping("/biz/bizpipeplan/getList")
+    public CommonResult<List<BizPipePlan>> getList() {
+        return CommonResult.data(bizPipePlanService.getList());
+    }
+}

+ 75 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/entity/BizPipePlan.java

@@ -0,0 +1,75 @@
+/*
+ * 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.bizpipeplan.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/06/30 10:32
+ **/
+@Getter
+@Setter
+@TableName("biz_pipe_plan")
+public class BizPipePlan extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 计划编号 */
+    @Schema(description = "计划编号")
+    private String planNumber;
+
+    /** 计划名称 */
+    @Schema(description = "计划名称")
+    private String planName;
+
+    /** 预约次数 */
+    @Schema(description = "预约次数")
+    private Integer planCount;
+
+    /** 已预约次数 */
+    @Schema(description = "已预约次数")
+    private Integer planAlreadyCount;
+
+    /** 开始时间 */
+    @Schema(description = "开始时间")
+    private Date beginTime;
+
+    /** 结束时间 */
+    @Schema(description = "结束时间")
+    private Date endTime;
+
+    /**日期**/
+    private String planDate;
+
+    /**开始时间**/
+    private String startDate;
+
+    /**结束时间**/
+    private String endDate;
+
+    /**状态**/
+    private String status;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/enums/BizPipePlanEnum.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.bizpipeplan.enums;
+
+import lombok.Getter;
+
+/**
+ * 管桩计划枚举
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ **/
+@Getter
+public enum BizPipePlanEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizPipePlanEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/mapper/BizPipePlanMapper.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.bizpipeplan.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizpipeplan.entity.BizPipePlan;
+
+/**
+ * 管桩计划Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ **/
+public interface BizPipePlanMapper extends BaseMapper<BizPipePlan> {
+}

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

+ 67 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanAddParam.java

@@ -0,0 +1,67 @@
+/*
+ * 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.bizpipeplan.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/06/30 10:32
+ **/
+@Getter
+@Setter
+public class BizPipePlanAddParam {
+
+    /** 计划编号 */
+    @Schema(description = "计划编号")
+    private String planNumber;
+
+    /** 计划名称 */
+    @Schema(description = "计划名称")
+    private String planName;
+
+    /** 预约次数 */
+    @Schema(description = "预约次数")
+    private Integer planCount;
+
+    /** 已预约次数 */
+    @Schema(description = "已预约次数")
+    private Integer planAlreadyCount;
+
+    /** 开始时间 */
+    @Schema(description = "开始时间")
+    private Date beginTime;
+
+    /** 结束时间 */
+    @Schema(description = "结束时间")
+    private Date endTime;
+
+    /**日期**/
+    private String planDate;
+
+    /**开始时间**/
+    private String startDate;
+
+    /**结束时间**/
+    private String endDate;
+
+}

+ 72 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanEditParam.java

@@ -0,0 +1,72 @@
+/*
+ * 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.bizpipeplan.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/06/30 10:32
+ **/
+@Getter
+@Setter
+public class BizPipePlanEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 计划编号 */
+    @Schema(description = "计划编号")
+    private String planNumber;
+
+    /** 计划名称 */
+    @Schema(description = "计划名称")
+    private String planName;
+
+    /** 预约次数 */
+    @Schema(description = "预约次数")
+    private Integer planCount;
+
+    /** 已预约次数 */
+    @Schema(description = "已预约次数")
+    private Integer planAlreadyCount;
+
+    /** 开始时间 */
+    @Schema(description = "开始时间")
+    private Date beginTime;
+
+    /** 结束时间 */
+    @Schema(description = "结束时间")
+    private Date endTime;
+
+    /**日期**/
+    private String planDate;
+
+    /**开始时间**/
+    private String startDate;
+
+    /**结束时间**/
+    private String endDate;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/param/BizPipePlanIdParam.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.bizpipeplan.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/06/30 10:32
+ **/
+@Getter
+@Setter
+public class BizPipePlanIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

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

@@ -0,0 +1,57 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizpipeplan.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/06/30 10:32
+ **/
+@Getter
+@Setter
+public class BizPipePlanPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /**计划编号*/
+    private String planNumber;
+
+    /**计划名称*/
+    private String planName;
+
+}

+ 91 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/service/BizPipePlanService.java

@@ -0,0 +1,91 @@
+/*
+ * 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.bizpipeplan.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizpipeplan.entity.BizPipePlan;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanAddParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanEditParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanIdParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanPageParam;
+
+import java.util.List;
+
+/**
+ * 管桩计划Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ **/
+public interface BizPipePlanService extends IService<BizPipePlan> {
+
+    /**
+     * 获取管桩计划分页
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    Page<BizPipePlan> page(BizPipePlanPageParam bizPipePlanPageParam);
+
+    /**
+     * 添加管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    void add(BizPipePlanAddParam bizPipePlanAddParam);
+
+    /**
+     * 编辑管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    void edit(BizPipePlanEditParam bizPipePlanEditParam);
+
+    /**
+     * 删除管桩计划
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    void delete(List<BizPipePlanIdParam> bizPipePlanIdParamList);
+
+    /**
+     * 获取管桩计划详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     */
+    BizPipePlan detail(BizPipePlanIdParam bizPipePlanIdParam);
+
+    /**
+     * 获取管桩计划详情
+     *
+     * @author fanzherong
+     * @date  2025/06/30 10:32
+     **/
+    BizPipePlan queryEntity(String id);
+
+    /**
+     * 结束管桩计划
+     * @param bizPipePlanEditParam
+     */
+    void endPlan(BizPipePlanEditParam bizPipePlanEditParam);
+
+    /**
+     * 查询管桩预约列表
+     */
+    List<BizPipePlan> getList();
+}

+ 164 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizpipeplan/service/impl/BizPipePlanServiceImpl.java

@@ -0,0 +1,164 @@
+/*
+ * 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.bizpipeplan.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.DateUtil;
+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.biz.modular.bizloadappoint.entity.BizLoadAppoint;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizpipeplan.entity.BizPipePlan;
+import vip.xiaonuo.biz.modular.bizpipeplan.mapper.BizPipePlanMapper;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanAddParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanEditParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanIdParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.param.BizPipePlanPageParam;
+import vip.xiaonuo.biz.modular.bizpipeplan.service.BizPipePlanService;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 管桩计划Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/30 10:32
+ **/
+@Service
+public class BizPipePlanServiceImpl extends ServiceImpl<BizPipePlanMapper, BizPipePlan> implements BizPipePlanService {
+
+    private final ReentrantLock lock = new ReentrantLock();
+
+    @Override
+    public Page<BizPipePlan> page(BizPipePlanPageParam bizPipePlanPageParam) {
+        QueryWrapper<BizPipePlan> queryWrapper = new QueryWrapper<BizPipePlan>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizPipePlanPageParam.getPlanNumber())){
+            //计划编号
+            queryWrapper.lambda().like(BizPipePlan::getPlanNumber,bizPipePlanPageParam.getPlanNumber());
+        }
+        if(ObjectUtil.isNotEmpty(bizPipePlanPageParam.getPlanName())){
+            //计划名称
+            queryWrapper.lambda().like(BizPipePlan::getPlanName,bizPipePlanPageParam.getPlanName());
+        }
+        queryWrapper.lambda().orderByDesc(BizPipePlan::getBeginTime);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizPipePlanAddParam bizPipePlanAddParam) {
+        bizPipePlanAddParam.setBeginTime(DateUtil.parse(bizPipePlanAddParam.getPlanDate()+" "+bizPipePlanAddParam.getStartDate()+":00"));
+        bizPipePlanAddParam.setEndTime(DateUtil.parse(bizPipePlanAddParam.getPlanDate()+" " +bizPipePlanAddParam.getEndDate() + ":00"));
+        checkParam(bizPipePlanAddParam);
+        BizPipePlan bizPipePlan = BeanUtil.toBean(bizPipePlanAddParam, BizPipePlan.class);
+        bizPipePlan.setPlanNumber(getNumber());
+        this.save(bizPipePlan);
+    }
+
+    public void checkParam(BizPipePlanAddParam bizPipePlanAddParam){
+        long count = this.count(new QueryWrapper<BizPipePlan>().lambda().
+                le(BizPipePlan::getBeginTime, bizPipePlanAddParam.getEndTime()).
+                ge(BizPipePlan::getEndTime, bizPipePlanAddParam.getBeginTime()));
+        if(count>0){
+            throw new CommonException("当前时间段存在交集!");
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizPipePlanEditParam bizPipePlanEditParam) {
+        bizPipePlanEditParam.setBeginTime(DateUtil.parse(bizPipePlanEditParam.getPlanDate()+" "+bizPipePlanEditParam.getStartDate()+":00"));
+        bizPipePlanEditParam.setEndTime(DateUtil.parse(bizPipePlanEditParam.getPlanDate()+" " +bizPipePlanEditParam.getEndDate() + ":00"));
+        BizPipePlan bizPipePlan = this.queryEntity(bizPipePlanEditParam.getId());
+        checkParam(bizPipePlanEditParam,bizPipePlan);
+        BeanUtil.copyProperties(bizPipePlanEditParam, bizPipePlan);
+        this.updateById(bizPipePlan);
+    }
+
+    public void checkParam(BizPipePlanEditParam bizPipePlanEditParam,BizPipePlan bizPipePlan){
+        if(bizPipePlan.getBeginTime().getTime()!=bizPipePlanEditParam.getBeginTime().getTime() ||
+                bizPipePlan.getEndTime().getTime()!=bizPipePlanEditParam.getEndTime().getTime()){
+            long count = this.count(new QueryWrapper<BizPipePlan>().lambda().
+                    le(BizPipePlan::getBeginTime, bizPipePlanEditParam.getEndTime()).
+                    ge(BizPipePlan::getEndTime, bizPipePlanEditParam.getBeginTime()).
+                    ne(BizPipePlan::getId,bizPipePlan.getId()));
+            if(count>0){
+                throw new CommonException("当前时间段存在交集!");
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizPipePlanIdParam> bizPipePlanIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizPipePlanIdParamList, BizPipePlanIdParam::getId));
+    }
+
+    @Override
+    public BizPipePlan detail(BizPipePlanIdParam bizPipePlanIdParam) {
+        return this.queryEntity(bizPipePlanIdParam.getId());
+    }
+
+    @Override
+    public BizPipePlan queryEntity(String id) {
+        BizPipePlan bizPipePlan = this.getById(id);
+        if(ObjectUtil.isEmpty(bizPipePlan)) {
+            throw new CommonException("管桩计划不存在,id值为:{}", id);
+        }
+        return bizPipePlan;
+    }
+
+    @Override
+    public void endPlan(BizPipePlanEditParam bizPipePlanEditParam) {
+        BizPipePlan bizPipePlan = this.queryEntity(bizPipePlanEditParam.getId());
+        bizPipePlan.setStatus("3");
+        this.updateById(bizPipePlan);
+    }
+
+    @Override
+    public List<BizPipePlan> getList() {
+        List<BizPipePlan> list = this.list(new QueryWrapper<BizPipePlan>().lambda().
+                in(BizPipePlan::getStatus, "1", "2"));
+        return list;
+    }
+
+    public String getNumber(){
+        lock.lock();
+        try{
+            String format = new SimpleDateFormat("yyyyMMdd").format(new Date());
+            String time = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+            long count = this.count(new QueryWrapper<BizPipePlan>().lambda().between(BizPipePlan::getCreateTime, time + " 00:00:00", time + " 23:59:59"));
+            String settleNo = "GZ" + format + generateCode((int)count);
+            return settleNo;
+        }finally {
+            lock.unlock(); // 释放锁
+        }
+    }
+
+    public static String generateCode(Integer counter) {
+        counter++;
+        return String.format("%03d", counter);
+    }
+}