Ver Fonte

起卸订单

fanzherong_v há 4 dias atrás
pai
commit
a712f6f900
31 ficheiros alterados com 2028 adições e 22 exclusões
  1. 44 0
      snowy-admin-web/src/api/biz/bizLoadDispatchApi.js
  2. 4 0
      snowy-admin-web/src/api/biz/bizLoadTimeApi.js
  3. 290 0
      snowy-admin-web/src/views/biz/bizloadappoint/dispatch.vue
  4. 290 0
      snowy-admin-web/src/views/biz/bizloadappoint/dispatchload.vue
  5. 14 9
      snowy-admin-web/src/views/biz/bizloadappoint/index.vue
  6. 231 0
      snowy-admin-web/src/views/biz/bizloadappoint/replace.vue
  7. 231 0
      snowy-admin-web/src/views/biz/bizloadappoint/replaceload.vue
  8. 1 0
      snowy-admin-web/src/views/biz/bizloadpoint/form.vue
  9. 4 3
      snowy-admin-web/src/views/biz/bizloadpoint/index.vue
  10. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/entity/BizLoadAppoint.java
  11. 3 2
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/mapper/mapping/BizLoadAppointMapper.xml
  12. 0 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/impl/BizLoadAppointServiceImpl.java
  13. 9 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadarrive/service/impl/BizLoadArriveServiceImpl.java
  14. 174 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/controller/BizLoadDispatchController.java
  15. 76 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/entity/BizLoadDispatch.java
  16. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/enums/BizLoadDispatchEnum.java
  17. 30 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/mapper/BizLoadDispatchMapper.java
  18. 20 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/mapper/mapping/BizLoadDispatchMapper.xml
  19. 50 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchAddParam.java
  20. 55 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchEditParam.java
  21. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchIdParam.java
  22. 57 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchPageParam.java
  23. 112 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/service/BizLoadDispatchService.java
  24. 216 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/service/impl/BizLoadDispatchServiceImpl.java
  25. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/entity/BizLoadPoint.java
  26. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/param/BizLoadPointAddParam.java
  27. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/param/BizLoadPointPageParam.java
  28. 6 7
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/service/impl/BizLoadPointServiceImpl.java
  29. 12 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/controller/BizLoadTimeController.java
  30. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/service/BizLoadTimeService.java
  31. 14 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/service/impl/BizLoadTimeServiceImpl.java

+ 44 - 0
snowy-admin-web/src/api/biz/bizLoadDispatchApi.js

@@ -0,0 +1,44 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizloaddispatch/` + url, ...arg)
+
+/**
+ * 起卸预约分配Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ **/
+export default {
+	// 获取起卸预约分配分页
+	bizLoadDispatchPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交起卸预约分配表单 edit为true时为编辑,默认为新增
+	bizLoadDispatchSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 提交起卸预约分配表单 edit为true时为编辑,默认为新增
+	bizLoadDispatchSubmitDispatch(data, edit = false) {
+		return request(edit ? 'edit' : 'addDispatch', data)
+	},
+	// 提交起卸预约分配表单 edit为true时为编辑,默认为新增
+	bizLoadDispatchSubmitLoad(data, edit = false) {
+		return request(edit ? 'edit' : 'addLoad', data)
+	},
+	// 删除起卸预约分配
+	bizLoadDispatchDelete(data) {
+		return request('delete', data)
+	},
+	//删除装货分配
+	deleteDispatch(data){
+		return request('deleteDispatch',data)
+	},
+	// 获取起卸预约分配详情
+	bizLoadDispatchDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 获取起卸预约分配列表
+	getPageList(data){
+		return request('getPageList',data,'get')
+	}
+}

+ 4 - 0
snowy-admin-web/src/api/biz/bizLoadTimeApi.js

@@ -28,5 +28,9 @@ export default {
 	// 获取装卸点位时间
 	search(data){
 		return request('search',data,'get')
+	},
+	// 获取装卸点位时间
+	searchNow(data){
+		return request('searchNow',data,'get')
 	}
 }

+ 290 - 0
snowy-admin-web/src/views/biz/bizloadappoint/dispatch.vue

@@ -0,0 +1,290 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '装载车调度' : '装载车调度'"
+		:width="900"
+		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="loadNumber">
+				<a-input v-model:value="formData.loadNumber" placeholder="请输入预约单号" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="装卸点位:" name="loadPointId">
+				<a-select v-model:value="formData.loadPointId" placeholder="请选择装卸点位"
+						  :options="loadPointIdList" @change="onChangePoint"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="装卸时间:" name="loadTimeId" >
+				<a-select v-model:value="formData.loadTimeId" placeholder="请选择装卸时间"
+						  :options="loadTimeIdList" @change="onChangeLoadTime"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="可约次数:" name="availableNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.availableNumber" placeholder="请输入可约次数" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="已约次数:" name="alreadyNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.alreadyNumber" placeholder="请输入已约次数" allow-clear disabled/>
+			</a-form-item>
+		</a-form>
+
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a-button type="link" size="small" v-if="hasPerm('bizDispatchReplace')" @click="replaceRef.onOpen(record)">更换</a-button>
+					</a-space>
+					<a-space>
+						<a-button type="link" danger size="small" v-if="hasPerm('bizOrderDispatchDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+
+		<Replace ref="replaceRef" @successful="tableRef.refresh(true)" />
+	</xn-form-container>
+</template>
+
+<script setup name="bizOrderForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import tool from '@/utils/tool'
+	import goodsConfApi from '@/api/biz/goodsConfApi'
+	import bizSaleOrderApi from "@/api/biz/bizSaleOrderApi";
+	import bizLoadPointApi from "@/api/biz/bizLoadPointApi";
+	import bizLoadTimeApi from "@/api/biz/bizLoadTimeApi"
+	import bizOrderLoadApi from "@/api/biz/bizOrderLoadApi";
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import Replace from './replace.vue'
+	import bizLoadDispatchApi from "@/api/biz/bizLoadDispatchApi";
+
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const tableRef = ref()
+	const replaceRef = ref()
+
+	const numberFlag = ref(false)
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	//订单类型
+	const orderTypeList = tool.dictList('order_type')
+	const goodIdList = ref()
+	const customerIdList = ref()
+	const saleOrderInfoList = ref()
+	const deliveryTimeIdList = ref()
+	const supplierIdList = ref()
+	const loadPointIdList = ref()
+	const loadTimeIdList = ref()
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+
+		//装货点位查询
+		bizLoadPointApi.getList({loadType:'2'}).then((res)=>{
+			loadPointIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.loadPoint
+				}
+			})
+		})
+
+		if(formData.value.saleOrderInfo){
+			bizSaleOrderApi.detailById({id:formData.value.saleOrderInfo}).then((res)=>{
+				//根据货品名称和重量查询提货时间段
+				goodsConfApi.getList({goodsName:res.saleGoodsName,goodsCode:res.goodsCode,needWeight:res.saleOrderWeight}).then((res)=>{
+					deliveryTimeIdList.value = res.map((item)=>{
+						return{
+							value:item.id,
+							label:item.confStartTime+'~'+item.confEndTime
+						}
+					})
+				})
+			})
+		}
+
+
+	}
+
+	//卸货点位点击事件
+	const onChangePoint =(value)=>{
+		formData.value.loadTimeId = ''
+		loadTimeIdList.value = ''
+		formData.value.availableNumber = ''
+		formData.value.alreadyNumber = ''
+		bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+			loadTimeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime+'~'+item.endTime
+				}
+			})
+		})
+	}
+
+	const onChangeLoadTime = (value) => {
+		bizLoadTimeApi.bizLoadTimeDetail({id:value}).then((res)=>{
+			formData.value.availableNumber = res.availableNumber
+			formData.value.alreadyNumber = res.alreadyNumber
+			numberFlag.value = true
+		})
+	}
+
+	const loadData = (parameter) => {
+		return bizLoadDispatchApi.getPageList({appointId:formData.value.id,loadType:'2'}).then((data) => {
+			return data
+		})
+	}
+
+	const columns = [
+		{
+			title: '装卸点位',
+			dataIndex: 'loadPoint',
+			align:'center'
+		},
+		{
+			title: '开始时间',
+			dataIndex: 'beginTime',
+			align:'center'
+		},
+		{
+			title: '结束时间',
+			dataIndex: 'endTime',
+			align:'center'
+		},
+		{
+			title: '可约次数',
+			dataIndex: 'availableNumber',
+			align:'center'
+		},
+		{
+			title: '已约次数',
+			dataIndex: 'alreadyNumber',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+
+
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+		loadTimeIdList.value = ''
+		numberFlag.value = false
+		emit('successful')
+
+	}
+	// 默认要校验的
+	const formRules = {
+		//orderNumber: [required('请输入订单编号')],
+		//orderName: [required('请输入订单名称')],
+		//customerId:[required('请选择客户信息')],
+		loadPointId:[required('请选择装卸点位')],
+		loadTimeId: [required('请选择装卸时间')],
+	}
+
+
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizLoadDispatchApi
+					.deleteDispatch(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				formDataParam.appointId = formDataParam.id
+				formDataParam.id = ''
+				bizLoadDispatchApi
+					.bizLoadDispatchSubmitDispatch(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style>
+/* 修改禁用状态下的颜色 */
+.ant-radio-button-wrapper-disabled {
+	color: black !important; /* 设置文字颜色 */
+	background-color: #f0f0f0 !important; /* 设置背景颜色 */
+}
+
+/* 修改禁用状态下选中项的颜色 */
+.ant-radio-button-wrapper-checked.ant-radio-button-wrapper-disabled {
+	color: white !important; /* 设置文字颜色 */
+	background-color: blue !important; /* 设置选中项的背景颜色 */
+}
+</style>

+ 290 - 0
snowy-admin-web/src/views/biz/bizloadappoint/dispatchload.vue

@@ -0,0 +1,290 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '起卸调度' : '起卸调度'"
+		:width="900"
+		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="loadNumber">
+				<a-input v-model:value="formData.loadNumber" placeholder="请输入预约单号" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="起卸点位:" name="loadPointId">
+				<a-select v-model:value="formData.loadPointId" placeholder="请选择装卸点位"
+						  :options="loadPointIdList" @change="onChangePoint"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="起卸时间:" name="loadTimeId" >
+				<a-select v-model:value="formData.loadTimeId" placeholder="请选择装卸时间"
+						  :options="loadTimeIdList" @change="onChangeLoadTime"
+				> </a-select>
+			</a-form-item>
+<!--			<a-form-item label="可约次数:" name="availableNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.availableNumber" placeholder="请输入可约次数" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="已约次数:" name="alreadyNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.alreadyNumber" placeholder="请输入已约次数" allow-clear disabled/>
+			</a-form-item>-->
+		</a-form>
+
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a-button type="link" size="small" v-if="hasPerm('bizLoadReplace')" @click="replaceRef.onOpen(record)">更换</a-button>
+					</a-space>
+					<a-space>
+						<a-button type="link" danger size="small" v-if="hasPerm('bizOrderDispatchDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+
+		<Replace ref="replaceRef" @successful="tableRef.refresh(true)" />
+	</xn-form-container>
+</template>
+
+<script setup name="bizOrderForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import tool from '@/utils/tool'
+	import goodsConfApi from '@/api/biz/goodsConfApi'
+	import bizSaleOrderApi from "@/api/biz/bizSaleOrderApi";
+	import bizLoadPointApi from "@/api/biz/bizLoadPointApi";
+	import bizLoadTimeApi from "@/api/biz/bizLoadTimeApi"
+	import bizOrderLoadApi from "@/api/biz/bizOrderLoadApi";
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import Replace from './replaceload.vue'
+	import bizLoadDispatchApi from "@/api/biz/bizLoadDispatchApi";
+
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const tableRef = ref()
+	const replaceRef = ref()
+
+	const numberFlag = ref(false)
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	//订单类型
+	const orderTypeList = tool.dictList('order_type')
+	const goodIdList = ref()
+	const customerIdList = ref()
+	const saleOrderInfoList = ref()
+	const deliveryTimeIdList = ref()
+	const supplierIdList = ref()
+	const loadPointIdList = ref()
+	const loadTimeIdList = ref()
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+
+		//装货点位查询
+		bizLoadPointApi.getList({loadType:'1'}).then((res)=>{
+			loadPointIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.loadPoint
+				}
+			})
+		})
+
+		if(formData.value.saleOrderInfo){
+			bizSaleOrderApi.detailById({id:formData.value.saleOrderInfo}).then((res)=>{
+				//根据货品名称和重量查询提货时间段
+				goodsConfApi.getList({goodsName:res.saleGoodsName,goodsCode:res.goodsCode,needWeight:res.saleOrderWeight}).then((res)=>{
+					deliveryTimeIdList.value = res.map((item)=>{
+						return{
+							value:item.id,
+							label:item.confStartTime+'~'+item.confEndTime
+						}
+					})
+				})
+			})
+		}
+
+
+	}
+
+	//卸货点位点击事件
+	const onChangePoint =(value)=>{
+		formData.value.loadTimeId = ''
+		loadTimeIdList.value = ''
+		formData.value.availableNumber = ''
+		formData.value.alreadyNumber = ''
+		bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+			loadTimeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime+'~'+item.endTime
+				}
+			})
+		})
+	}
+
+	const onChangeLoadTime = (value) => {
+		bizLoadTimeApi.bizLoadTimeDetail({id:value}).then((res)=>{
+			formData.value.availableNumber = res.availableNumber
+			formData.value.alreadyNumber = res.alreadyNumber
+			//numberFlag.value = true
+		})
+	}
+
+	const loadData = (parameter) => {
+		return bizLoadDispatchApi.getPageList({appointId:formData.value.id,loadType:'1'}).then((data) => {
+			return data
+		})
+	}
+
+	const columns = [
+		{
+			title: '装卸点位',
+			dataIndex: 'loadPoint',
+			align:'center'
+		},
+		{
+			title: '开始时间',
+			dataIndex: 'beginTime',
+			align:'center'
+		},
+		{
+			title: '结束时间',
+			dataIndex: 'endTime',
+			align:'center'
+		},
+		/*{
+			title: '可约次数',
+			dataIndex: 'availableNumber',
+			align:'center'
+		},
+		{
+			title: '已约次数',
+			dataIndex: 'alreadyNumber',
+			align:'center'
+		},*/
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+
+
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+		loadTimeIdList.value = ''
+		numberFlag.value = false
+		emit('successful')
+
+	}
+	// 默认要校验的
+	const formRules = {
+		//orderNumber: [required('请输入订单编号')],
+		//orderName: [required('请输入订单名称')],
+		//customerId:[required('请选择客户信息')],
+		loadPointId:[required('请选择装卸点位')],
+		loadTimeId: [required('请选择装卸时间')],
+	}
+
+
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizLoadDispatchApi
+					.bizLoadDispatchDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				formDataParam.appointId = formDataParam.id
+				formDataParam.id = ''
+				bizLoadDispatchApi
+					.bizLoadDispatchSubmitLoad(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style>
+/* 修改禁用状态下的颜色 */
+.ant-radio-button-wrapper-disabled {
+	color: black !important; /* 设置文字颜色 */
+	background-color: #f0f0f0 !important; /* 设置背景颜色 */
+}
+
+/* 修改禁用状态下选中项的颜色 */
+.ant-radio-button-wrapper-checked.ant-radio-button-wrapper-disabled {
+	color: white !important; /* 设置文字颜色 */
+	background-color: blue !important; /* 设置选中项的背景颜色 */
+}
+</style>

+ 14 - 9
snowy-admin-web/src/views/biz/bizloadappoint/index.vue

@@ -71,17 +71,10 @@
 			</template>
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'action'">
-<!--					<a-space>
-						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizLoadAppointEdit')">编辑</a>
-						<a-divider type="vertical" v-if="hasPerm(['bizLoadAppointEdit', 'bizLoadAppointDelete'], 'and')" />
-						<a-popconfirm title="确定要删除吗?" @confirm="deleteBizLoadAppoint(record)">
-							<a-button type="link" danger size="small" v-if="hasPerm('bizLoadAppointDelete')">删除</a-button>
-						</a-popconfirm>
-					</a-space>-->
 
-					<a @click="showModal(record)" v-if="record.status == '2'">二维码</a>
+					<a @click="showModal(record)" v-if="record.status == '5'">二维码</a>
 
-					<a-divider type="vertical" v-if="record.status == '2' "/>
+					<a-divider type="vertical" v-if="record.status == '5' "/>
 
 					<a-dropdown>
 						<a class="ant-dropdown-link">
@@ -105,6 +98,12 @@
 								<a-menu-item v-if="hasPerm('bizLoadAppointDelete') && (record.status == '0')">
 									<a style="color:red" size="small" type="link" @click="deleteConfig(record)">删除</a>
 								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizLoadDispatch') && (record.status == '4' || record.status=='5') && record.arriveStatus == '2'">
+									<a style="color:blue" size="small" type="link" @click="dispatchRef.onOpen(record)">装货调度</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizDispatchLoad') && (record.status == '4' || record.status=='5') && record.arriveStatus == '2'">
+									<a style="color:green" size="small" type="link" @click="dispatchLoadRef.onOpen(record)">起卸调度</a>
+								</a-menu-item>
 							</a-menu>
 						</template>
 					</a-dropdown>
@@ -139,6 +138,8 @@
 	</a-card>
 	<Form ref="formRef" @successful="tableRef.refresh()" />
 	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+	<Dispatch ref="dispatchRef" @successful="tableRef.refresh()" />
+	<DispatchLoad ref="dispatchLoadRef" @successful="tableRef.refresh()" />
 	<XnSignName ref="XnSignNameRef" @successful="signSuccess" />
 
 	<a-modal v-model:visible="open" title="二维码" width="600px" style="height: 700px">
@@ -177,10 +178,14 @@
 	import QRCode from 'qrcode'
 	import html2canvas from 'html2canvas'
 	import downloadUtil from '@/utils/downloadUtil'
+	import Dispatch from './dispatch.vue'
+	import DispatchLoad from './dispatchload.vue'
 
 
 	const tableRef = ref()
 	const formRef = ref()
+	const dispatchRef = ref()
+	const dispatchLoadRef = ref()
 	const detailRef = ref()
 	const XnSignNameRef = ref()
 	const nowRecord = ref()

+ 231 - 0
snowy-admin-web/src/views/biz/bizloadappoint/replace.vue

@@ -0,0 +1,231 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '装卸点更换' : '装卸点更换'"
+		:width="900"
+		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="loadPointId">
+				<a-select v-model:value="formData.loadPointId" placeholder="请选择装卸点位"
+						  :options="loadPointIdList" @change="onChangePoint"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="装卸时间:" name="loadTimeId" >
+				<a-select v-model:value="formData.loadTimeId" placeholder="请选择装卸时间"
+						  :options="loadTimeIdList" @change="onChangeLoadTime"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="可约次数:" name="availableNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.availableNumber" placeholder="请输入可约次数" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="已约次数:" name="alreadyNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.alreadyNumber" placeholder="请输入已约次数" allow-clear disabled/>
+			</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="bizOrderForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizOrderApi from '@/api/biz/bizOrderApi'
+	import tool from '@/utils/tool'
+	import bizGoodsApi from '@/api/biz/bizGoodsApi'
+	import customerApi from '@/api/biz/customerApi'
+	import goodsConfApi from '@/api/biz/goodsConfApi'
+	import bizSaleOrderApi from "@/api/biz/bizSaleOrderApi";
+	import bizSupplierApi from "@/api/biz/bizSupplierApi";
+	import bizLoadPointApi from "@/api/biz/bizLoadPointApi";
+	import bizLoadTimeApi from "@/api/biz/bizLoadTimeApi"
+	import bizOrderLoadApi from "@/api/biz/bizOrderLoadApi";
+	import bizLoadUserApi from "@/api/biz/bizLoadUserApi";
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const tableRef = ref()
+
+	const numberFlag = ref(false)
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	//订单类型
+	const orderTypeList = tool.dictList('order_type')
+	const goodIdList = ref()
+	const customerIdList = ref()
+	const saleOrderInfoList = ref()
+	const deliveryTimeIdList = ref()
+	const supplierIdList = ref()
+	const loadPointIdList = ref()
+	const loadTimeIdList = ref()
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+		//查询客户信息
+		customerApi.getList().then((res)=>{
+			customerIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.name
+				}
+			})
+		})
+
+		//装货点位查询
+		bizLoadPointApi.getList({loadType:'2'}).then((res)=>{
+			loadPointIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.loadPoint
+				}
+			})
+		})
+
+		if(formData.value.loadPointId){
+			bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+				loadTimeIdList.value = res.map((item)=>{
+					return{
+						value:item.id,
+						label:item.beginTime+'~'+item.endTime
+					}
+				})
+			})
+		}
+
+
+	}
+
+	//卸货点位点击事件
+	const onChangePoint =(value)=>{
+		formData.value.loadTimeId = ''
+		loadTimeIdList.value = ''
+		formData.value.availableNumber = ''
+		formData.value.alreadyNumber = ''
+		bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+			loadTimeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime+'~'+item.endTime
+				}
+			})
+		})
+	}
+
+	const onChangeLoadTime = (value) => {
+		bizLoadTimeApi.bizLoadTimeDetail({id:value}).then((res)=>{
+			formData.value.availableNumber = res.availableNumber
+			formData.value.alreadyNumber = res.alreadyNumber
+			numberFlag.value = true
+		})
+	}
+
+
+
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+		loadTimeIdList.value = ''
+		numberFlag.value = false
+		emit('successful')
+
+	}
+	// 默认要校验的
+	const formRules = {
+		//orderNumber: [required('请输入订单编号')],
+		//orderName: [required('请输入订单名称')],
+		//customerId:[required('请选择客户信息')],
+		loadPointId:[required('请选择装卸点位')],
+		loadTimeId: [required('请选择装卸时间')],
+	}
+
+
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizOrderLoadApi
+					.bizOrderLoadDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizOrderLoadApi
+					.bizOrderReplace(formDataParam)
+					.then(() => {
+						onClose()
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style>
+/* 修改禁用状态下的颜色 */
+.ant-radio-button-wrapper-disabled {
+	color: black !important; /* 设置文字颜色 */
+	background-color: #f0f0f0 !important; /* 设置背景颜色 */
+}
+
+/* 修改禁用状态下选中项的颜色 */
+.ant-radio-button-wrapper-checked.ant-radio-button-wrapper-disabled {
+	color: white !important; /* 设置文字颜色 */
+	background-color: blue !important; /* 设置选中项的背景颜色 */
+}
+</style>

+ 231 - 0
snowy-admin-web/src/views/biz/bizloadappoint/replaceload.vue

@@ -0,0 +1,231 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '装卸点更换' : '装卸点更换'"
+		:width="900"
+		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="loadPointId">
+				<a-select v-model:value="formData.loadPointId" placeholder="请选择装卸点位"
+						  :options="loadPointIdList" @change="onChangePoint"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="装卸时间:" name="loadTimeId" >
+				<a-select v-model:value="formData.loadTimeId" placeholder="请选择装卸时间"
+						  :options="loadTimeIdList" @change="onChangeLoadTime"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="可约次数:" name="availableNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.availableNumber" placeholder="请输入可约次数" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="已约次数:" name="alreadyNumber" v-show="numberFlag">
+				<a-input v-model:value="formData.alreadyNumber" placeholder="请输入已约次数" allow-clear disabled/>
+			</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="bizOrderForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizOrderApi from '@/api/biz/bizOrderApi'
+	import tool from '@/utils/tool'
+	import bizGoodsApi from '@/api/biz/bizGoodsApi'
+	import customerApi from '@/api/biz/customerApi'
+	import goodsConfApi from '@/api/biz/goodsConfApi'
+	import bizSaleOrderApi from "@/api/biz/bizSaleOrderApi";
+	import bizSupplierApi from "@/api/biz/bizSupplierApi";
+	import bizLoadPointApi from "@/api/biz/bizLoadPointApi";
+	import bizLoadTimeApi from "@/api/biz/bizLoadTimeApi"
+	import bizOrderLoadApi from "@/api/biz/bizOrderLoadApi";
+	import bizLoadUserApi from "@/api/biz/bizLoadUserApi";
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const tableRef = ref()
+
+	const numberFlag = ref(false)
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	//订单类型
+	const orderTypeList = tool.dictList('order_type')
+	const goodIdList = ref()
+	const customerIdList = ref()
+	const saleOrderInfoList = ref()
+	const deliveryTimeIdList = ref()
+	const supplierIdList = ref()
+	const loadPointIdList = ref()
+	const loadTimeIdList = ref()
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+		//查询客户信息
+		customerApi.getList().then((res)=>{
+			customerIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.name
+				}
+			})
+		})
+
+		//装货点位查询
+		bizLoadPointApi.getList({loadType:'1'}).then((res)=>{
+			loadPointIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.loadPoint
+				}
+			})
+		})
+
+		if(formData.value.loadPointId){
+			bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+				loadTimeIdList.value = res.map((item)=>{
+					return{
+						value:item.id,
+						label:item.beginTime+'~'+item.endTime
+					}
+				})
+			})
+		}
+
+
+	}
+
+	//卸货点位点击事件
+	const onChangePoint =(value)=>{
+		formData.value.loadTimeId = ''
+		loadTimeIdList.value = ''
+		formData.value.availableNumber = ''
+		formData.value.alreadyNumber = ''
+		bizLoadTimeApi.searchNow({pointId:formData.value.loadPointId}).then((res)=>{
+			loadTimeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime+'~'+item.endTime
+				}
+			})
+		})
+	}
+
+	const onChangeLoadTime = (value) => {
+		bizLoadTimeApi.bizLoadTimeDetail({id:value}).then((res)=>{
+			formData.value.availableNumber = res.availableNumber
+			formData.value.alreadyNumber = res.alreadyNumber
+			numberFlag.value = true
+		})
+	}
+
+
+
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+		loadTimeIdList.value = ''
+		numberFlag.value = false
+		emit('successful')
+
+	}
+	// 默认要校验的
+	const formRules = {
+		//orderNumber: [required('请输入订单编号')],
+		//orderName: [required('请输入订单名称')],
+		//customerId:[required('请选择客户信息')],
+		loadPointId:[required('请选择装卸点位')],
+		loadTimeId: [required('请选择装卸时间')],
+	}
+
+
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizOrderLoadApi
+					.bizOrderLoadDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizOrderLoadApi
+					.bizOrderReplace(formDataParam)
+					.then(() => {
+						onClose()
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style>
+/* 修改禁用状态下的颜色 */
+.ant-radio-button-wrapper-disabled {
+	color: black !important; /* 设置文字颜色 */
+	background-color: #f0f0f0 !important; /* 设置背景颜色 */
+}
+
+/* 修改禁用状态下选中项的颜色 */
+.ant-radio-button-wrapper-checked.ant-radio-button-wrapper-disabled {
+	color: white !important; /* 设置文字颜色 */
+	background-color: blue !important; /* 设置选中项的背景颜色 */
+}
+</style>

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

@@ -59,6 +59,7 @@
 			.then(() => {
 				submitLoading.value = true
 				const formDataParam = cloneDeep(formData.value)
+				formDataParam.loadType = '2'
 				bizLoadPointApi
 					.bizLoadPointSubmitForm(formDataParam, formDataParam.id)
 					.then(() => {

+ 4 - 3
snowy-admin-web/src/views/biz/bizloadpoint/index.vue

@@ -10,7 +10,7 @@
 				<a-col :span="6">
 					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
 					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
-					
+
 					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizLoadPointAdd')">
 						<template #icon><plus-outlined /></template>
 						新增
@@ -47,7 +47,7 @@
 			</template>
 		</s-table>
 	</a-card>
-	
+
 	<Form ref="formRef" @successful="tableRef.refresh()" />
 	<UserIndex ref="userIndexRef" @successful="tableRef.refresh()" />
 	<TimeIndex ref="timeIndexRef" @successful="tableRef.refresh()" />
@@ -72,7 +72,7 @@
 	const formRef = ref()
 	const userIndexRef = ref()
 	const timeIndexRef = ref()
-	
+
 	const columns = [
 		{
 			title: '序号',
@@ -118,6 +118,7 @@
 	}
 	const loadData = (parameter) => {
 		const searchFormParam = cloneDeep(searchFormState.value)
+		searchFormParam.loadType = '2'
 		return bizLoadPointApi.bizLoadPointPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})

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

@@ -122,4 +122,8 @@ public class BizLoadAppoint extends CommonEntity {
     private String customerSign;
     /**签名时间*/
     private Date signTime;
+
+    /**报港预约状态**/
+    @TableField(exist = false)
+    private String arriveStatus;
 }

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

@@ -26,12 +26,13 @@
             bla.create_user,
             bla.create_time,
             bla.customer_sign,
-            bla.sign_time
+            bla.sign_time,
+            ba.status arriveStatus
         from biz_load_appoint bla
          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
+         left join biz_load_arrive ba on ba.appoint_id = bla.id and ba.delete_flag = 'NOT_DELETE'
          ${ew.customSqlSegment}
     </select>
 

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

@@ -112,7 +112,6 @@ 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;
     }

+ 9 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadarrive/service/impl/BizLoadArriveServiceImpl.java

@@ -317,6 +317,15 @@ public class BizLoadArriveServiceImpl extends ServiceImpl<BizLoadArriveMapper, B
         bizAuditLog.setStatus(auditStatus);
         bizAuditLog.setRemark(bizLoadArriveEditParam.getArriveReason());
         bizAuditLogService.save(bizAuditLog);
+
+        //修改起卸预约状态
+        if(StringUtils.equals(auditStatus,"1")){
+            BizLoadAppoint loadAppoint = bizLoadAppointService.getById(bizLoadArrive.getAppointId());
+            if(ObjectUtil.isNotNull(loadAppoint)){
+                loadAppoint.setStatus("4");
+                bizLoadAppointService.updateById(loadAppoint);
+            }
+        }
     }
 
     @Override

+ 174 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/controller/BizLoadDispatchController.java

@@ -0,0 +1,174 @@
+/*
+ * 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.bizloaddispatch.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.bizloaddispatch.entity.BizLoadDispatch;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchAddParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchEditParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchIdParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchPageParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.service.BizLoadDispatchService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 起卸预约分配控制器
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ */
+@Tag(name = "起卸预约分配控制器")
+@RestController
+@Validated
+public class BizLoadDispatchController {
+
+    @Resource
+    private BizLoadDispatchService bizLoadDispatchService;
+
+    /**
+     * 获取起卸预约分配分页
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "获取起卸预约分配分页")
+    @SaCheckPermission("/biz/bizloaddispatch/page")
+    @GetMapping("/biz/bizloaddispatch/page")
+    public CommonResult<Page<BizLoadDispatch>> page(BizLoadDispatchPageParam bizLoadDispatchPageParam) {
+        return CommonResult.data(bizLoadDispatchService.page(bizLoadDispatchPageParam));
+    }
+
+    /**
+     * 添加起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "添加起卸预约分配")
+    @CommonLog("添加起卸预约分配")
+    @PostMapping("/biz/bizloaddispatch/add")
+    public CommonResult<String> add(@RequestBody @Valid BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        bizLoadDispatchService.add(bizLoadDispatchAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 添加装货调度分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "添加装货调度分配")
+    @CommonLog("添加装货调度分配")
+    @PostMapping("/biz/bizloaddispatch/addDispatch")
+    public CommonResult<String> addDispatch(@RequestBody @Valid BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        bizLoadDispatchService.addDispatch(bizLoadDispatchAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 添加起卸调度分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "添加起卸调度分配")
+    @CommonLog("添加起卸调度分配")
+    @PostMapping("/biz/bizloaddispatch/addLoad")
+    public CommonResult<String> addLoad(@RequestBody @Valid BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        bizLoadDispatchService.addLoad(bizLoadDispatchAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "编辑起卸预约分配")
+    @CommonLog("编辑起卸预约分配")
+    @PostMapping("/biz/bizloaddispatch/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizLoadDispatchEditParam bizLoadDispatchEditParam) {
+        bizLoadDispatchService.edit(bizLoadDispatchEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "删除起卸预约分配")
+    @CommonLog("删除起卸预约分配")
+    @PostMapping("/biz/bizloaddispatch/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList) {
+        bizLoadDispatchService.delete(bizLoadDispatchIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除装货分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "删除装货分配")
+    @CommonLog("删除装货分配")
+    @PostMapping("/biz/bizloaddispatch/deleteDispatch")
+    public CommonResult<String> deleteDispatch(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                       List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList) {
+        bizLoadDispatchService.deleteDispatch(bizLoadDispatchIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取起卸预约分配详情
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "获取起卸预约分配详情")
+    @GetMapping("/biz/bizloaddispatch/detail")
+    public CommonResult<BizLoadDispatch> detail(@Valid BizLoadDispatchIdParam bizLoadDispatchIdParam) {
+        return CommonResult.data(bizLoadDispatchService.detail(bizLoadDispatchIdParam));
+    }
+
+    /**
+     * 获取起卸预约分配分页
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    @Operation(summary = "获取起卸预约分配分页")
+    @GetMapping("/biz/bizloaddispatch/getPageList")
+    public CommonResult<Page<BizLoadDispatch>> getPageList(BizLoadDispatchPageParam bizLoadDispatchPageParam) {
+        return CommonResult.data(bizLoadDispatchService.getPageList(bizLoadDispatchPageParam));
+    }
+}

+ 76 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/entity/BizLoadDispatch.java

@@ -0,0 +1,76 @@
+/*
+ * 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.bizloaddispatch.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/07/01 09:47
+ **/
+@Getter
+@Setter
+@TableName("biz_load_dispatch")
+public class BizLoadDispatch extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 类型  1:起卸分配   2:装货分配 */
+    @Schema(description = "类型  1:起卸分配   2:装货分配")
+    private String loadType;
+
+    /** 起卸预约id */
+    @Schema(description = "起卸预约id")
+    private String appointId;
+
+    /** 装卸点位id */
+    @Schema(description = "装卸点位id")
+    private String loadPointId;
+
+    /** 装卸时间ID */
+    @Schema(description = "装卸时间ID")
+    private String loadTimeId;
+
+    /**装货点位*/
+    @TableField(exist = false)
+    private String loadPoint;
+
+    /**开始时间*/
+    @TableField(exist = false)
+    private Date beginTime;
+
+    /**结束时间*/
+    @TableField(exist = false)
+    private Date endTime;
+
+    /**可约次数*/
+    @TableField(exist = false)
+    private Integer availableNumber;
+
+    /**已约次数*/
+    @TableField(exist = false)
+    private Integer alreadyNumber;
+
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/enums/BizLoadDispatchEnum.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.bizloaddispatch.enums;
+
+import lombok.Getter;
+
+/**
+ * 起卸预约分配枚举
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ **/
+@Getter
+public enum BizLoadDispatchEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizLoadDispatchEnum(String value) {
+        this.value = value;
+    }
+}

+ 30 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/mapper/BizLoadDispatchMapper.java

@@ -0,0 +1,30 @@
+/*
+ * 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.bizloaddispatch.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.bizloaddispatch.entity.BizLoadDispatch;
+
+/**
+ * 起卸预约分配Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ **/
+public interface BizLoadDispatchMapper extends BaseMapper<BizLoadDispatch> {
+
+    Page<BizLoadDispatch> getPageList(@Param("page") Page<BizLoadDispatch> page, @Param("ew") QueryWrapper<BizLoadDispatch> ew);
+}

+ 20 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/mapper/mapping/BizLoadDispatchMapper.xml

@@ -0,0 +1,20 @@
+<?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.bizloaddispatch.mapper.BizLoadDispatchMapper">
+
+    <select id="getPageList" resultType="vip.xiaonuo.biz.modular.bizloaddispatch.entity.BizLoadDispatch">
+        select
+            bld.id,
+            blp.load_point,
+            bld.load_point_id,
+            bld.load_time_id,
+            blt.begin_time,
+            blt.end_time,
+            blt.available_number,
+            blt.already_number
+        from biz_load_dispatch bld
+         left join biz_load_point blp on blp.id = bld.load_point_id
+         left join biz_load_time blt on blt.id = bld.load_time_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 50 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchAddParam.java

@@ -0,0 +1,50 @@
+/*
+ * 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.bizloaddispatch.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/07/01 09:47
+ **/
+@Getter
+@Setter
+public class BizLoadDispatchAddParam {
+
+    /** 类型  1:起卸分配   2:装货分配 */
+    @Schema(description = "类型  1:起卸分配   2:装货分配")
+    private String loadType;
+
+    /** 起卸预约id */
+    @Schema(description = "起卸预约id")
+    private String appointId;
+
+    /** 装卸点位id */
+    @Schema(description = "装卸点位id")
+    private String loadPointId;
+
+    /** 装卸时间ID */
+    @Schema(description = "装卸时间ID")
+    private String loadTimeId;
+
+}

+ 55 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchEditParam.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizloaddispatch.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/07/01 09:47
+ **/
+@Getter
+@Setter
+public class BizLoadDispatchEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 类型  1:起卸分配   2:装货分配 */
+    @Schema(description = "类型  1:起卸分配   2:装货分配")
+    private String loadType;
+
+    /** 起卸预约id */
+    @Schema(description = "起卸预约id")
+    private String appointId;
+
+    /** 装卸点位id */
+    @Schema(description = "装卸点位id")
+    private String loadPointId;
+
+    /** 装卸时间ID */
+    @Schema(description = "装卸时间ID")
+    private String loadTimeId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/param/BizLoadDispatchIdParam.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.bizloaddispatch.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/07/01 09:47
+ **/
+@Getter
+@Setter
+public class BizLoadDispatchIdParam {
+
+    /** 主键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/bizloaddispatch/param/BizLoadDispatchPageParam.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.bizloaddispatch.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/07/01 09:47
+ **/
+@Getter
+@Setter
+public class BizLoadDispatchPageParam {
+
+    /** 当前页 */
+    @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;
+
+    /**起卸预约id*/
+    private String appointId;
+
+    /**类型*/
+    private String loadType;
+
+}

+ 112 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloaddispatch/service/BizLoadDispatchService.java

@@ -0,0 +1,112 @@
+/*
+ * 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.bizloaddispatch.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizloaddispatch.entity.BizLoadDispatch;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchAddParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchEditParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchIdParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchPageParam;
+
+import java.util.List;
+
+/**
+ * 起卸预约分配Service接口
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ **/
+public interface BizLoadDispatchService extends IService<BizLoadDispatch> {
+
+    /**
+     * 获取起卸预约分配分页
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    Page<BizLoadDispatch> page(BizLoadDispatchPageParam bizLoadDispatchPageParam);
+
+    /**
+     * 添加起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    void add(BizLoadDispatchAddParam bizLoadDispatchAddParam);
+
+    /**
+     * 添加装货调度
+     * @param bizLoadDispatchAddParam
+     */
+    void addDispatch(BizLoadDispatchAddParam bizLoadDispatchAddParam);
+
+    /**
+     * 添加起卸调度
+     */
+    void addLoad(BizLoadDispatchAddParam bizLoadDispatchAddParam);
+
+    /**
+     * 编辑起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    void edit(BizLoadDispatchEditParam bizLoadDispatchEditParam);
+
+    /**
+     * 删除起卸预约分配
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    void delete(List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList);
+
+    void deleteDispatch(List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList);
+
+    /**
+     * 获取起卸预约分配详情
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     */
+    BizLoadDispatch detail(BizLoadDispatchIdParam bizLoadDispatchIdParam);
+
+    /**
+     * 获取起卸预约分配详情
+     *
+     * @author fanzherong
+     * @date  2025/07/01 09:47
+     **/
+    BizLoadDispatch queryEntity(String id);
+
+    /**
+     * 获取起卸预约调度分配列表
+     * @param bizLoadDispatchPageParam
+     * @return
+     */
+    Page<BizLoadDispatch> getPageList(BizLoadDispatchPageParam bizLoadDispatchPageParam);
+
+    /**
+     * 起卸分配替换
+     * @param bizLoadDispatchEditParam
+     */
+    void replaceLoad(BizLoadDispatchEditParam bizLoadDispatchEditParam);
+
+    /**
+     * 装货分配替换
+     * @param bizLoadDispatchEditParam
+     */
+    void replaceDispatch(BizLoadDispatchEditParam bizLoadDispatchEditParam);
+}

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

@@ -0,0 +1,216 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizloaddispatch.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.bizloadappoint.entity.BizLoadAppoint;
+import vip.xiaonuo.biz.modular.bizloadappoint.service.BizLoadAppointService;
+import vip.xiaonuo.biz.modular.bizloadtime.entity.BizLoadTime;
+import vip.xiaonuo.biz.modular.bizloadtime.service.BizLoadTimeService;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizloaddispatch.entity.BizLoadDispatch;
+import vip.xiaonuo.biz.modular.bizloaddispatch.mapper.BizLoadDispatchMapper;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchAddParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchEditParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchIdParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.param.BizLoadDispatchPageParam;
+import vip.xiaonuo.biz.modular.bizloaddispatch.service.BizLoadDispatchService;
+
+import java.util.List;
+
+/**
+ * 起卸预约分配Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/07/01 09:47
+ **/
+@Service
+public class BizLoadDispatchServiceImpl extends ServiceImpl<BizLoadDispatchMapper, BizLoadDispatch> implements BizLoadDispatchService {
+
+    @Resource
+    private BizLoadAppointService bizLoadAppointService;
+
+    @Resource
+    private BizLoadTimeService bizLoadTimeService;
+
+    @Override
+    public Page<BizLoadDispatch> page(BizLoadDispatchPageParam bizLoadDispatchPageParam) {
+        QueryWrapper<BizLoadDispatch> queryWrapper = new QueryWrapper<BizLoadDispatch>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizLoadDispatchPageParam.getSortField(), bizLoadDispatchPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizLoadDispatchPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizLoadDispatchPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizLoadDispatchPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizLoadDispatch::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        BizLoadDispatch bizLoadDispatch = BeanUtil.toBean(bizLoadDispatchAddParam, BizLoadDispatch.class);
+        this.save(bizLoadDispatch);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addDispatch(BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        checkParam(bizLoadDispatchAddParam,"2");
+        BizLoadDispatch bizLoadDispatch = BeanUtil.toBean(bizLoadDispatchAddParam, BizLoadDispatch.class);
+        bizLoadDispatch.setLoadType("2");
+        this.save(bizLoadDispatch);
+
+        //查询是否存在起卸分配
+        long count = this.count(new QueryWrapper<BizLoadDispatch>().lambda().
+                eq(BizLoadDispatch::getAppointId, bizLoadDispatch.getAppointId()).
+                eq(BizLoadDispatch::getLoadType, "1"));
+        if(count>0){
+            BizLoadAppoint loadAppoint = bizLoadAppointService.getById(bizLoadDispatch.getAppointId());
+            if(ObjectUtil.isNotNull(loadAppoint)){
+                if(StringUtils.equals(loadAppoint.getStatus(),"4")){
+                    loadAppoint.setStatus("5");
+                    bizLoadAppointService.updateById(loadAppoint);
+                }
+            }
+        }
+    }
+
+    public void checkParam(BizLoadDispatchAddParam bizLoadDispatchAddParam,String type){
+        long count = this.count(new QueryWrapper<BizLoadDispatch>().lambda().
+                eq(BizLoadDispatch::getAppointId, bizLoadDispatchAddParam.getAppointId()).
+                eq(BizLoadDispatch::getLoadPointId, bizLoadDispatchAddParam.getLoadPointId()).
+                eq(BizLoadDispatch::getLoadTimeId, bizLoadDispatchAddParam.getLoadTimeId()).
+                eq(BizLoadDispatch::getLoadType,type));
+        if(count>0){
+            if(StringUtils.equals(type,"1")){
+                throw new CommonException("起卸点位和时间已经添加过!");
+            }else{
+                throw new CommonException("装卸点位和时间已经添加过!");
+            }
+
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addLoad(BizLoadDispatchAddParam bizLoadDispatchAddParam) {
+        checkParam(bizLoadDispatchAddParam,"1");
+        BizLoadDispatch bizLoadDispatch = BeanUtil.toBean(bizLoadDispatchAddParam, BizLoadDispatch.class);
+        bizLoadDispatch.setLoadType("1");
+        this.save(bizLoadDispatch);
+
+        //查询是否存在装卸分配
+        long count = this.count(new QueryWrapper<BizLoadDispatch>().lambda().
+                eq(BizLoadDispatch::getAppointId, bizLoadDispatch.getAppointId()).
+                eq(BizLoadDispatch::getLoadType, "2"));
+        if(count>0){
+            BizLoadAppoint loadAppoint = bizLoadAppointService.getById(bizLoadDispatch.getAppointId());
+            if(ObjectUtil.isNotNull(loadAppoint)){
+                if(StringUtils.equals(loadAppoint.getStatus(),"4")){
+                    loadAppoint.setStatus("5");
+                    bizLoadAppointService.updateById(loadAppoint);
+                }
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizLoadDispatchEditParam bizLoadDispatchEditParam) {
+        BizLoadDispatch bizLoadDispatch = this.queryEntity(bizLoadDispatchEditParam.getId());
+        BeanUtil.copyProperties(bizLoadDispatchEditParam, bizLoadDispatch);
+        this.updateById(bizLoadDispatch);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizLoadDispatchIdParamList, BizLoadDispatchIdParam::getId));
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void deleteDispatch(List<BizLoadDispatchIdParam> bizLoadDispatchIdParamList) {
+        for(BizLoadDispatchIdParam bizLoadDispatchIdParam : bizLoadDispatchIdParamList){
+            BizLoadDispatch loadDispatch = this.getById(bizLoadDispatchIdParam.getId());
+            if(ObjectUtil.isNotNull(loadDispatch)){
+                BizLoadTime bizLoadTime = bizLoadTimeService.getById(loadDispatch.getLoadTimeId());
+                if(ObjectUtil.isNotNull(bizLoadTime)){
+                    if(bizLoadTime.getAlreadyNumber()>0){
+                        throw new CommonException("装货点位添加过预约不可删除");
+                    }
+                }
+                this.removeById(loadDispatch);
+            }
+        }
+    }
+
+    @Override
+    public BizLoadDispatch detail(BizLoadDispatchIdParam bizLoadDispatchIdParam) {
+        return this.queryEntity(bizLoadDispatchIdParam.getId());
+    }
+
+    @Override
+    public BizLoadDispatch queryEntity(String id) {
+        BizLoadDispatch bizLoadDispatch = this.getById(id);
+        if(ObjectUtil.isEmpty(bizLoadDispatch)) {
+            throw new CommonException("起卸预约分配不存在,id值为:{}", id);
+        }
+        return bizLoadDispatch;
+    }
+
+    @Override
+    public Page<BizLoadDispatch> getPageList(BizLoadDispatchPageParam bizLoadDispatchPageParam) {
+        QueryWrapper<BizLoadDispatch> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(bizLoadDispatchPageParam.getAppointId())){
+            queryWrapper.eq("bld.appoint_id",bizLoadDispatchPageParam.getAppointId());
+        }
+        if(ObjectUtil.isNotEmpty(bizLoadDispatchPageParam.getLoadType())){
+            queryWrapper.eq("bld.load_type",bizLoadDispatchPageParam.getLoadType());
+        }
+        queryWrapper.eq("bld.delete_flag","NOT_DELETE");
+        queryWrapper.orderByDesc("bld.create_time");
+        Page<BizLoadDispatch> pageList = this.getBaseMapper().getPageList(CommonPageRequest.defaultPage(), queryWrapper);
+        return pageList;
+    }
+
+    @Override
+    public void replaceLoad(BizLoadDispatchEditParam bizLoadDispatchEditParam) {
+        //起卸分配替换
+        BizLoadDispatch bizLoadDispatch = this.queryEntity(bizLoadDispatchEditParam.getId());
+        bizLoadDispatch.setLoadPointId(bizLoadDispatchEditParam.getLoadPointId());
+        bizLoadDispatch.setLoadTimeId(bizLoadDispatchEditParam.getLoadTimeId());
+        this.updateById(bizLoadDispatch);
+    }
+
+    @Override
+    public void replaceDispatch(BizLoadDispatchEditParam bizLoadDispatchEditParam) {
+        //装卸分配替换
+        BizLoadDispatch bizLoadDispatch = this.queryEntity(bizLoadDispatchEditParam.getId());
+    }
+}

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/entity/BizLoadPoint.java

@@ -40,4 +40,7 @@ public class BizLoadPoint extends CommonEntity {
     /** 装货点位 */
     @Schema(description = "装货点位")
     private String loadPoint;
+
+    /**类型  1:起卸   2:装货*/
+    private String loadType;
 }

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/param/BizLoadPointAddParam.java

@@ -36,4 +36,7 @@ public class BizLoadPointAddParam {
     @NotBlank(message = "loadPoint不能为空")
     private String loadPoint;
 
+    /**类型*/
+    private String loadType;
+
 }

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/param/BizLoadPointPageParam.java

@@ -52,4 +52,7 @@ public class BizLoadPointPageParam {
     @Schema(description = "装货点位")
     private String loadPoint;
 
+    /**类型1:起卸   2:装货*/
+    private String loadType;
+
 }

+ 6 - 7
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadpoint/service/impl/BizLoadPointServiceImpl.java

@@ -50,14 +50,10 @@ public class BizLoadPointServiceImpl extends ServiceImpl<BizLoadPointMapper, Biz
         if(ObjectUtil.isNotEmpty(bizLoadPointPageParam.getLoadPoint())) {
             queryWrapper.lambda().like(BizLoadPoint::getLoadPoint, bizLoadPointPageParam.getLoadPoint());
         }
-        queryWrapper.lambda().eq(BizLoadPoint::getDeleteFlag, "NOT_DELETE");
-        if(ObjectUtil.isAllNotEmpty(bizLoadPointPageParam.getSortField(), bizLoadPointPageParam.getSortOrder())) {
-            CommonSortOrderEnum.validate(bizLoadPointPageParam.getSortOrder());
-            queryWrapper.orderBy(true, bizLoadPointPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
-                    StrUtil.toUnderlineCase(bizLoadPointPageParam.getSortField()));
-        } else {
-            queryWrapper.lambda().orderByDesc(BizLoadPoint::getCreateTime);
+        if(ObjectUtil.isNotEmpty(bizLoadPointPageParam.getLoadType())){
+            queryWrapper.lambda().eq(BizLoadPoint::getLoadType,bizLoadPointPageParam.getLoadType());
         }
+        queryWrapper.lambda().eq(BizLoadPoint::getDeleteFlag, "NOT_DELETE");
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
@@ -103,6 +99,9 @@ public class BizLoadPointServiceImpl extends ServiceImpl<BizLoadPointMapper, Biz
         if(ObjectUtil.isNotEmpty(bizLoadPointPageParam.getLoadPoint())) {
             queryWrapper.lambda().like(BizLoadPoint::getLoadPoint, bizLoadPointPageParam.getLoadPoint());
         }
+        if(ObjectUtil.isNotEmpty(bizLoadPointPageParam.getLoadType())){
+            queryWrapper.lambda().eq(BizLoadPoint::getLoadType,bizLoadPointPageParam.getLoadType());
+        }
         queryWrapper.lambda().eq(BizLoadPoint::getDeleteFlag, "NOT_DELETE");
         queryWrapper.lambda().orderByDesc(BizLoadPoint::getCreateTime);
         return this.list(queryWrapper);

+ 12 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/controller/BizLoadTimeController.java

@@ -131,4 +131,16 @@ public class BizLoadTimeController {
         return CommonResult.data(bizLoadTimeService.search(bizLoadTimePageParam));
     }
 
+    /**
+     * 根据装货点位ID获取装货时间配置
+     *
+     * @author sandy
+     * @date  2025/05/30 14:20
+     */
+    @Operation(summary = "根据装货点位ID获取装货时间配置")
+    @GetMapping("/biz/bizloadtime/searchNow")
+    public CommonResult<List<BizLoadTime>> searchNow(@Valid BizLoadTimePageParam bizLoadTimePageParam) {
+        return CommonResult.data(bizLoadTimeService.searchNow(bizLoadTimePageParam));
+    }
+
 }

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/service/BizLoadTimeService.java

@@ -82,6 +82,9 @@ public interface BizLoadTimeService extends IService<BizLoadTime> {
     // 根据提货时间配置ID和装货点位ID获取装货时间配置
     List<BizLoadTime> search(BizLoadTimePageParam bizLoadTimePageParam);
 
+    //根据装卸点位查询当前时间装货时间配置
+    List<BizLoadTime> searchNow(BizLoadTimePageParam bizLoadTimePageParam);
+
     // 增加预约次数
     void addAlready(BizLoadTimeIdParam bizLoadTimeIdParam);
 

+ 14 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/service/impl/BizLoadTimeServiceImpl.java

@@ -174,6 +174,20 @@ public class BizLoadTimeServiceImpl extends ServiceImpl<BizLoadTimeMapper, BizLo
         }
     }
 
+    @Override
+    public List<BizLoadTime> searchNow(BizLoadTimePageParam bizLoadTimePageParam) {
+        /** 点位ID */
+        String pointId = bizLoadTimePageParam.getPointId();
+        if(ObjectUtil.isEmpty(pointId)){
+            throw new CommonException("点位不能为空!");
+        }
+        Date date = new Date();
+        List<BizLoadTime> list = this.list(new QueryWrapper<BizLoadTime>().lambda().
+                eq(BizLoadTime::getPointId, pointId).
+                gt(BizLoadTime::getEndTime, date));
+        return list;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void addAlready(BizLoadTimeIdParam bizLoadTimeIdParam) {