fanzherong_v 1 هفته پیش
والد
کامیت
0bdd76dd72
32فایلهای تغییر یافته به همراه2686 افزوده شده و 0 حذف شده
  1. 42 0
      snowy-admin-web/src/api/biz/bizLoadAppointApi.js
  2. 32 0
      snowy-admin-web/src/api/biz/bizLoadAppointSupplierApi.js
  3. 4 0
      snowy-admin-web/src/api/biz/bizServiceCustomerApi.js
  4. 172 0
      snowy-admin-web/src/views/biz/bizloadappoint/detail.vue
  5. 194 0
      snowy-admin-web/src/views/biz/bizloadappoint/form.vue
  6. 469 0
      snowy-admin-web/src/views/biz/bizloadappoint/index.vue
  7. 164 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/controller/BizLoadAppointController.java
  8. 125 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/entity/BizLoadAppoint.java
  9. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/enums/BizLoadAppointEnum.java
  10. 33 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/mapper/BizLoadAppointMapper.java
  11. 36 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/mapper/mapping/BizLoadAppointMapper.xml
  12. 78 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointAddParam.java
  13. 86 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointEditParam.java
  14. 78 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointExportResult.java
  15. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointIdParam.java
  16. 67 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointPageParam.java
  17. 97 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/BizLoadAppointService.java
  18. 249 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/impl/BizLoadAppointServiceImpl.java
  19. 131 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/controller/BizLoadAppointSupplierController.java
  20. 64 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/entity/BizLoadAppointSupplier.java
  21. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/enums/BizLoadAppointSupplierEnum.java
  22. 31 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/mapper/BizLoadAppointSupplierMapper.java
  23. 16 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/mapper/mapping/BizLoadAppointSupplierMapper.xml
  24. 54 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierAddParam.java
  25. 59 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierEditParam.java
  26. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierIdParam.java
  27. 54 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierPageParam.java
  28. 85 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/service/BizLoadAppointSupplierService.java
  29. 105 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/service/impl/BizLoadAppointSupplierServiceImpl.java
  30. 12 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizservicecustomer/controller/BizServiceCustomerController.java
  31. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizservicecustomer/service/BizServiceCustomerService.java
  32. 8 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizservicecustomer/service/impl/BizServiceCustomerServiceImpl.java

+ 42 - 0
snowy-admin-web/src/api/biz/bizLoadAppointApi.js

@@ -0,0 +1,42 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizloadappoint/` + url, ...arg)
+
+/**
+ * 起卸预约Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+export default {
+	// 获取起卸预约分页
+	bizLoadAppointPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交起卸预约表单 edit为true时为编辑,默认为新增
+	bizLoadAppointSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除起卸预约
+	bizLoadAppointDelete(data) {
+		return request('delete', data)
+	},
+	// 获取起卸预约详情
+	bizLoadAppointDetail(data) {
+		return request('detail', data, 'get')
+	},
+	//提交起卸预约
+	submit(data){
+		return request('submit',data)
+	},
+	//客户签名
+	updateCustomerSign(data){
+		return request('updateCustomerSign',data)
+	},
+	//导出
+	exportRecord(data){
+		return request('exportRecord', data, 'get', {
+			responseType: 'blob'
+		})
+	},
+}

+ 32 - 0
snowy-admin-web/src/api/biz/bizLoadAppointSupplierApi.js

@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizloadappointsupplier/` + url, ...arg)
+
+/**
+ * 起卸汽运供应商Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ **/
+export default {
+	// 获取起卸汽运供应商分页
+	bizLoadAppointSupplierPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交起卸汽运供应商表单 edit为true时为编辑,默认为新增
+	bizLoadAppointSupplierSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除起卸汽运供应商
+	bizLoadAppointSupplierDelete(data) {
+		return request('delete', data)
+	},
+	// 获取起卸汽运供应商详情
+	bizLoadAppointSupplierDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 获取起卸汽运供应商列表
+	getList(data){
+		return request('getList',data,'get')
+	}
+}

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

@@ -24,5 +24,9 @@ export default {
 	// 获取服务客户管理详情
 	bizServiceCustomerDetail(data) {
 		return request('detail', data, 'get')
+	},
+	// 获取服务客户管理列表
+	getList(data){
+		return request('getList',data,'get')
 	}
 }

+ 172 - 0
snowy-admin-web/src/views/biz/bizloadappoint/detail.vue

@@ -0,0 +1,172 @@
+<template>
+	<xn-form-container title="详情" :width="900" :visible="visible" :destroy-on-close="true" @close="onClose">
+		<a-form ref="formRef" :model="formData" :label-col="labelCol4" :wrapper-col="wrapperCol20">
+			<a-divider dashed style="border-color: gray">起卸预约</a-divider>
+			<a-descriptions :column="4" size="middle" bordered class="mb-2" :label-style="labelStyle" :contentStyle="contentStyle">
+				<a-descriptions-item label="预约单号" :span="2">{{ formData.loadNumber }}</a-descriptions-item>
+				<a-descriptions-item label="订单类型" :span="2">
+					<a-tag
+						:color="
+							formData.orderType === '1'
+								? 'orange'
+								: formData.orderType === '2'
+								  ? 'green'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('load_appoint_type', formData.orderType) }}
+					</a-tag>
+				</a-descriptions-item>
+				<a-descriptions-item label="客户名称" :span="2">{{ formData.customerName }}</a-descriptions-item>
+				<a-descriptions-item label="联系人" :span="2">{{ formData.customerContact }}</a-descriptions-item>
+				<a-descriptions-item label="手机号" :span="2">{{ formData.customerPhone }}</a-descriptions-item>
+				<a-descriptions-item label="客户地址" :span="2">{{ formData.customerAddress }}</a-descriptions-item>
+				<a-descriptions-item label="货品名称" :span="2">{{ formData.goodsName }}</a-descriptions-item>
+				<a-descriptions-item label="货品编码" :span="2">{{ formData.goodsCode }}</a-descriptions-item>
+				<a-descriptions-item label="订单重量" :span="2">{{ formData.orderWeight +'吨'}}</a-descriptions-item>
+				<a-descriptions-item label="单价" :span="2">{{ formData.orderPrice +'元/吨'}}</a-descriptions-item>
+				<a-descriptions-item label="订单总额" :span="2">{{ formData.orderAmount +'元'}}</a-descriptions-item>
+				<a-descriptions-item label="运费单价" :span="2">{{ formData.freightPrice +'元/吨'}}</a-descriptions-item>
+				<a-descriptions-item label="订单状态" :span="2">
+					<a-tag
+						:color="
+							formData.status === '1'
+								? 'blue'
+								: formData.status === '2'
+								  ? 'warning'
+								  : formData.status === '3'
+								  ? 'processing'
+								  : formData.status === '4'
+								  ? 'volcano'
+								  : formData.status === '5'
+								  ? 'purple'
+								  : formData.status === '6'
+								  ? 'error'
+								  : formData.status === '7'
+								  ? 'red'
+								  : '#f50'
+						"
+					>
+						{{ $TOOL.dictTypeData('load_appoint_status', formData.status) }}
+					</a-tag>
+				</a-descriptions-item>
+				<a-descriptions-item label="船运供应商" :span="2">{{ formData.supplierName}}</a-descriptions-item>
+				<a-descriptions-item label="创建时间" :span="2">{{ formData.createTime}}</a-descriptions-item>
+				<a-descriptions-item label="创建人" :span="2">{{ formData.createUserName}}</a-descriptions-item>
+
+				<a-descriptions-item label="签名" :span="4">
+					<a-image v-if="formData.customerSign != null" :width="200" :src="formData.customerSign" />
+				</a-descriptions-item>
+				<a-descriptions-item label="签名时间" :span="4">
+					{{formData.signTime}}
+				</a-descriptions-item>
+<!--				<a-descriptions-item label="结束备注" :span="4">{{ formData.endReason}}</a-descriptions-item>
+				<a-descriptions-item label="审核备注" :span="4">{{ formData.orderReason}}</a-descriptions-item>-->
+			</a-descriptions>
+
+			<a-divider dashed style="border-color: gray" >汽运供应商</a-divider>
+			<a-table
+				:dataSource="supplierDataSource"
+				:columns="supplierDataColumns"
+				:pagination="false"
+				:bordered="true"
+			>
+				<template #bodyCell="{ column, record }">
+					<template v-if="column.dataIndex === 'status'">
+						<a-tag :color="record.status === '1' ? 'green' : 'red'">{{
+								$TOOL.dictTypeData('examine_status', record.status)
+							}}</a-tag>
+					</template>
+				</template>
+			</a-table>
+		</a-form>
+	</xn-form-container>
+</template>
+
+<script setup name="recordDoubleForm">
+	import { cloneDeep } from 'lodash-es'
+	import bizOrderSupplierApi from '@/api/biz/bizOrderSupplierApi'
+	import bizLoadAppointSupplierApi from '@/api/biz/bizLoadAppointSupplierApi'
+
+	// 默认是关闭状态
+	const visible = ref(false)
+	const formData = ref({})
+	const table = ref()
+	const resultJson = ref()
+
+	const labelStyle = {
+		width: '20%'
+	}
+	const contentStyle = {
+		width: '30%'
+	}
+
+	const labelCol4 = ref({span: 4, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const labelCol8 = ref({span: 8, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const wrapperCol20 = ref({span: 20})
+
+
+	const supplierDataSource = ref([])
+
+	const supplierDataColumns = [
+		{
+			title: '供应商名称',
+			dataIndex: 'supplierName',
+			align: 'center'
+		},
+		{
+			title: '过磅重量(吨)',
+			dataIndex: 'netWeight',
+			align: 'center'
+		},
+		{
+			title: '卸货重量(吨)',
+			dataIndex: 'shippingWeight',
+			align: 'center'
+		},
+	]
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+		//getRecordDoubleDetail(record)
+		if(record){
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+
+			bizLoadAppointSupplierApi.getList({appointId:formData.value.id}).then((res)=>{
+				supplierDataSource.value = res
+			})
+		}
+
+	}
+	const getRecordDoubleDetail = (record) => {
+		const param = {
+			id: record.id
+		}
+		tbRecordDoubleApi.recordDoubleDetailPic(param).then((data) => {
+			Object.assign(record, data)
+			formData.value = record
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		resultJson.value = ''
+		visible.value = false
+	}
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style scoped>
+	.imgDiv ::v-deep .ant-image {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+	.imgDiv ::v-deep .ant-image-mask-info {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+</style>

+ 194 - 0
snowy-admin-web/src/views/biz/bizloadappoint/form.vue

@@ -0,0 +1,194 @@
+<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="customerId">
+				<a-select v-model:value="formData.customerId" placeholder="请选择服务客户信息"
+						  :options="customerIdList"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="货品信息:" name="goodsId">
+				<a-select v-model:value="formData.goodsId" placeholder="请选择货品信息"
+						  :options="goodsIdList"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="订单数量:" name="orderWeight">
+				<a-input-number v-model:value="formData.orderWeight" style="width:90%"  :precision="2" :min="0.01" :max="9999999"  placeholder="请输入订单数量" @blur="getTotalAmount" allow-clear/><span style="margin-left:10px;">吨</span>
+			</a-form-item>
+			<a-form-item label="单价:" name="orderPrice">
+				<a-input-number v-model:value="formData.orderPrice" style="width:90%"  :precision="2" :min="0.01" :max="999999"  placeholder="请输入单价" @blur="getTotalAmount" allow-clear/><span style="margin-left:10px;">元/吨</span>
+			</a-form-item>
+			<a-form-item label="订单总额:" name="orderAmount">
+				<a-input-number v-model:value="formData.orderAmount" style="width:90%"  :precision="2" :min="0.01" :max="9999999"  placeholder="请输入订单总额" allow-clear/><span style="margin-left:10px;">元</span>
+			</a-form-item>
+			<a-form-item label="船运供应商:" name="supplierId">
+				<a-select v-model:value="formData.supplierId" placeholder="请选择船运供应商"
+						  :options="supplierIds"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="运费单价:" name="freightPrice">
+				<a-input-number v-model:value="formData.freightPrice" style="width:90%"  :precision="2" :min="0.01" :max="999999"  placeholder="请输入运费单价" allow-clear/><span style="margin-left:10px;">元/吨</span>
+			</a-form-item>
+			<a-form-item label="支付方式:" name="payType">
+				<a-radio-group button-style="solid" v-model:value="formData.payType">
+					<a-radio-button value="1">
+						预付
+					</a-radio-button>
+					<a-radio-button value="2">
+						授信
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="订单类型:" name="orderType">
+				<a-radio-group button-style="solid" v-model:value="formData.orderType">
+					<a-radio-button value="1">
+						配送订单
+					</a-radio-button>
+					<a-radio-button value="2">
+						自提订单
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="汽运供应商:" name="supplierIdList">
+				<a-select v-model:value="formData.supplierIdList" placeholder="请选择汽运供应商"
+						  :options="supplierIdLists" mode="tags"
+				> </a-select>
+			</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="bizLoadAppointForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizLoadAppointApi from '@/api/biz/bizLoadAppointApi'
+	import bizServiceCustomerApi from '@/api/biz/bizServiceCustomerApi'
+	import bizGoodsApi from "@/api/biz/bizGoodsApi";
+	import bizSupplierApi from "@/api/biz/bizSupplierApi";
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const customerIdList = ref()
+	const goodsIdList = ref()
+	const supplierIds = ref()
+	const supplierIdLists = 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)
+		}
+
+		//查询服务客户信息
+		bizServiceCustomerApi.getList().then((res)=>{
+			customerIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.name
+				}
+			})
+		})
+
+		//查询货品信息
+		bizGoodsApi.getList().then((res)=>{
+			goodsIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.goodsName+'-'+item.goodsCode
+				}
+			})
+		})
+
+		//查询船运供货商信息
+		bizSupplierApi.getList({transportType:'2'}).then((res)=>{
+			supplierIds.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.supplierName
+				}
+			})
+		})
+
+		//查询汽运供货商信息
+		bizSupplierApi.getList({transportType:'1'}).then((res)=>{
+			supplierIdLists.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.supplierName
+				}
+			})
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		customerId:[required('请选择服务客户信息')],
+		goodsId:[required('请选择货品信息')],
+		orderWeight:[required('请输入订单数量')],
+		orderPrice:[required('请输入单价')],
+		orderAmount:[required('请输入订单总额')],
+		supplierId:[required('请选择船运供应商')],
+		freightPrice:[required('请输入运费单价')],
+		payType:[required('请选择支付方式')],
+		orderType:[required('请选择订单类型')],
+		supplierIdList:[required('请选择汽运供应商')],
+	}
+
+	//获取订单总额
+	const getTotalAmount = () => {
+		console.log("gfdlkgjkfl")
+		if(formData.value.orderWeight!=null && formData.value.orderWeight!='' &&
+			formData.value.orderPrice!=null && formData.value.orderPrice!=''){
+			formData.value.orderAmount = (formData.value.orderWeight * formData.value.orderPrice).toFixed(2)
+		}
+	}
+
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizLoadAppointApi
+					.bizLoadAppointSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 469 - 0
snowy-admin-web/src/views/biz/bizloadappoint/index.vue

@@ -0,0 +1,469 @@
+<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="loadNumber">
+						<a-input v-model:value="searchFormState.loadNumber" placeholder="预约单号查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="客户名称" name="customerName">
+						<a-input v-model:value="searchFormState.customerName" placeholder="客户名称查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="货品名称" name="goodsName">
+						<a-input v-model:value="searchFormState.goodsName" placeholder="货品名称查询" />
+					</a-form-item>
+				</a-col>
+				<template v-if="advanced">
+
+					<a-col :span="6">
+						<a-form-item label="支付方式" name="payType">
+							<a-select v-model:value="searchFormState.payType" placeholder="支付方式查询"
+									  :options="payTypeList"
+							> </a-select>
+						</a-form-item>
+					</a-col>
+
+					<a-col :span="6">
+						<a-form-item label="创建时间" name="createTime">
+							<a-range-picker
+								v-model:value="searchFormState.createTime"
+								value-format="YYYY-MM-DD"
+							/>
+						</a-form-item>
+					</a-col>
+				</template>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @click="toggleAdvanced" style="margin-left: 8px">
+						{{ advanced ? '收起' : '展开' }}
+						<component :is="advanced ? 'up-outlined' : 'down-outlined'" />
+					</a>
+				</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('bizLoadAppointAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<a-button @click="exportTotal" v-if="hasPerm('bizLoadAppointExport')">
+						<template #icon>
+							<export-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('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-divider type="vertical" v-if="record.status == '2' "/>
+
+					<a-dropdown>
+						<a class="ant-dropdown-link">
+							更多
+							<DownOutlined />
+						</a>
+						<template #overlay>
+							<a-menu>
+								<a-menu-item>
+									<a size="small" type="link" @click="detailRef.onOpen(record)" >详情</a>
+								</a-menu-item>
+								<a-menu-item  v-if="hasPerm('bizLoadAppointSubmit') && record.status=='0'">
+									<a style="color:orangered" size="small" type="link" @click="bizLoadAppointsubmit(record.id)">提交</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizLoadAppointSign') && record.status == '1'">
+									<a style="color:orange" @click="XnSignNameRef.show(record.id)">签名</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizLoadAppointEdit') && (record.status == '0')">
+									<a style="color:blue" size="small" type="link" @click="formRef.onOpen(record)" >编辑</a>
+								</a-menu-item>
+								<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>
+						</template>
+					</a-dropdown>
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					<a-tag
+						:color="
+							record.status === '1'
+								? 'blue'
+								: record.status === '2'
+								  ? 'warning'
+								  : record.status === '3'
+								  ? 'processing'
+								  : record.status === '4'
+								  ? 'volcano'
+								  : record.status === '5'
+								  ? 'purple'
+								  : record.status === '6'
+								  ? 'error'
+								  : record.status === '7'
+								  ? 'red'
+								  : record.status === '8'
+								  ? 'cyan'
+								  : '#f50'
+						"
+					>
+						{{ $TOOL.dictTypeData('load_appoint_status', record.status) }}
+					</a-tag>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+	<XnSignName ref="XnSignNameRef" @successful="signSuccess" />
+
+	<a-modal v-model:visible="open" title="二维码" width="600px" style="height: 700px">
+		<div id="qrcode" style="text-align: center; margin:  15px 5px 15px 5px">
+			<a-row>
+				<a-col :span="13" id="colFlag">
+					<div style="margin-top:10px;font-size:16px;">
+						<p id="projectCodeFlag">预约单号:{{ nowRecord.loadNumber }}</p>
+						<p id="projectCodeFlag">服务客户名称:{{ nowRecord.customerName }}</p>
+						<p id="projectCodeFlag">货品名称:{{ nowRecord.goodsName }}</p>
+						<p id="projectCodeFlag">货品编码:{{ nowRecord.goodsCode }}</p>
+						<p id="projectCodeFlag">船运供应商:{{ nowRecord.supplierName }}</p>
+					</div>
+				</a-col>
+				<a-col :span="11">
+					<a-image width="250"  height="100%" :src="qrCodeUrl.codeUrl"></a-image>
+				</a-col>
+			</a-row>
+		</div>
+		<template #footer>
+			<a-button @click="closeQrCode">关闭</a-button>
+			<a-button type="primary" @click="downloadFile">下载</a-button>
+		</template>
+	</a-modal>
+</template>
+
+<script setup name="bizloadappoint">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizLoadAppointApi from '@/api/biz/bizLoadAppointApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import tool from '@/utils/tool'
+	import Detail from "./detail.vue";
+	import QRCode from 'qrcode'
+	import html2canvas from 'html2canvas'
+	import downloadUtil from '@/utils/downloadUtil'
+
+
+	const tableRef = ref()
+	const formRef = ref()
+	const detailRef = ref()
+	const XnSignNameRef = ref()
+	const nowRecord = ref()
+	const submitLoading = ref(false)
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+	//查询数据
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const payTypeList = tool.dictList('pay_type')
+
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+
+
+	const columns = [
+		{
+			title: '预约单号',
+			dataIndex: 'loadNumber',
+			align:'center'
+		},
+		{
+			title: '服务客户名称',
+			dataIndex: 'customerName',
+			align:'center'
+		},
+		{
+			title: '货品名称',
+			dataIndex: 'goodsName',
+			align:'center'
+		},
+		{
+			title: '订单数量(吨)',
+			dataIndex: 'orderWeight',
+			align:'center'
+		},
+		{
+			title: '单价(元/吨)',
+			dataIndex: 'orderPrice',
+			align:'center'
+		},
+		{
+			title: '订单总额(元)',
+			dataIndex: 'orderAmount',
+			align:'center'
+		},
+		{
+			title: '船运供应商',
+			dataIndex: 'supplierName',
+			align:'center'
+		},
+		{
+			title: '运费单价(元/吨)',
+			dataIndex: 'freightPrice',
+			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)
+		// 创建时间范围查询条件重载
+		if (searchFormParam.createTime) {
+			searchFormParam.createTimeBegin = searchFormParam.createTime[0]
+			searchFormParam.createTimeEnd = searchFormParam.createTime[1]
+			delete searchFormParam.createTime
+		}
+		return bizLoadAppointApi.bizLoadAppointPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+
+	//提交
+	const bizLoadAppointsubmit = (id) =>{
+		Modal.confirm({
+			title: '提示',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '是否提交该数据?',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: id
+					}
+
+				bizLoadAppointApi
+					.submit(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 签名板组件回调
+	const signSuccess = (value) => {
+		const param = {
+			id:value.id,
+			customerSign: value.value
+		}
+		bizLoadAppointApi.updateCustomerSign(param).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+
+
+	//导出
+	const exportTotal = () => {
+		Modal.confirm({
+			title: '确定要导出记录吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				const searchFormParam = cloneDeep(searchFormState.value)
+				// 创建时间范围查询条件重载
+				if (searchFormParam.createTime) {
+					searchFormParam.createTimeBegin = searchFormParam.createTime[0]
+					searchFormParam.createTimeEnd = searchFormParam.createTime[1]
+					delete searchFormParam.createTime
+				}
+				bizLoadAppointApi
+					.exportRecord(Object.assign(searchFormParam))
+					.then((res) => {
+						downloadUtil.resultDownload(res)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+
+	//二维码
+	const open = ref(false);
+	const qrCodeUrl = ref({})
+	const showModal = (record) => {
+		nowRecord.value = record
+		open.value = true;
+		getQrCode(record)
+
+	};
+
+	const getQrCode = (record) => {
+		//QRCode.toDataURL("id:"+record.id+"saleCode:"+record.saleCode, {
+		let param = {
+			id:record.id,
+			loadNumber:record.loadNumber
+		}
+		QRCode.toDataURL(JSON.stringify(param), {
+			errorCorrectionLevel: 'H',
+			margin: 1,
+			height: 206,
+			width: 206,
+			type: '10',
+			scal: 177,
+			color: {
+				dark: '#000' // 二维码背景颜色
+			},
+			rendererOpts: {
+				quality: 0.9
+			}
+		})
+			.then((url) => {
+				qrCodeUrl.value.codeUrl = url
+			})
+			.catch((err) => {
+				console.error(err)
+			})
+	}
+
+	const closeQrCode = () => {
+		open.value = false;
+	}
+
+	// 下载二维码
+	const downloadFile = () => {
+		const qrcodeDiv = document.getElementById('qrcode');
+		html2canvas(qrcodeDiv, {
+			logging: false,
+			allowTaint: true,
+			scale: window.devicePixelRatio,
+			scrollY: 0,
+			scrollX: 0,
+			useCORS: true,
+			backgroundColor: '#ffffff'
+		})
+			.then(function (canvas) {
+				const a = window.document.createElement('a')
+				a.href = canvas.toDataURL('image/png')
+				a.download = '二维码'
+				a.click()
+				this.$message.success('正在进行下载保存')
+			})
+			.catch((err) => {
+				console.log(err)
+			})
+	}
+
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizLoadAppoint = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizLoadAppointApi.bizLoadAppointDelete(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
+					}
+				]
+
+				bizLoadAppointApi
+					.bizLoadAppointDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizLoadAppoint = (params) => {
+		bizLoadAppointApi.bizLoadAppointDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 164 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/controller/BizLoadAppointController.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.bizloadappoint.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 jakarta.servlet.http.HttpServletResponse;
+import org.springframework.http.MediaType;
+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.biz.modular.bizorder.param.BizOrderPageParam;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.annotation.CommonNoRepeat;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.bizloadappoint.entity.BizLoadAppoint;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointAddParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointEditParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointIdParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointPageParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.service.BizLoadAppointService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 起卸预约控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ */
+@Tag(name = "起卸预约控制器")
+@RestController
+@Validated
+public class BizLoadAppointController {
+
+    @Resource
+    private BizLoadAppointService bizLoadAppointService;
+
+    /**
+     * 获取起卸预约分页
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "获取起卸预约分页")
+    @SaCheckPermission("/biz/bizloadappoint/page")
+    @GetMapping("/biz/bizloadappoint/page")
+    public CommonResult<Page<BizLoadAppoint>> page(BizLoadAppointPageParam bizLoadAppointPageParam) {
+        return CommonResult.data(bizLoadAppointService.page(bizLoadAppointPageParam));
+    }
+
+    /**
+     * 添加起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "添加起卸预约")
+    @CommonLog("添加起卸预约")
+    @PostMapping("/biz/bizloadappoint/add")
+    @CommonNoRepeat
+    public CommonResult<String> add(@RequestBody @Valid BizLoadAppointAddParam bizLoadAppointAddParam) {
+        bizLoadAppointService.add(bizLoadAppointAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "编辑起卸预约")
+    @CommonLog("编辑起卸预约")
+    @PostMapping("/biz/bizloadappoint/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizLoadAppointEditParam bizLoadAppointEditParam) {
+        bizLoadAppointService.edit(bizLoadAppointEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "删除起卸预约")
+    @CommonLog("删除起卸预约")
+    @PostMapping("/biz/bizloadappoint/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizLoadAppointIdParam> bizLoadAppointIdParamList) {
+        bizLoadAppointService.delete(bizLoadAppointIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取起卸预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "获取起卸预约详情")
+    @GetMapping("/biz/bizloadappoint/detail")
+    public CommonResult<BizLoadAppoint> detail(@Valid BizLoadAppointIdParam bizLoadAppointIdParam) {
+        return CommonResult.data(bizLoadAppointService.detail(bizLoadAppointIdParam));
+    }
+
+    /**
+     * 提交起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "提交起卸预约")
+    @CommonLog("提交起卸预约")
+    @PostMapping("/biz/bizloadappoint/submit")
+    public CommonResult<String> submit(@RequestBody @Valid BizLoadAppointEditParam bizLoadAppointEditParam) {
+        bizLoadAppointService.submit(bizLoadAppointEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 客户签名
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    @Operation(summary = "客户签名")
+    @CommonLog("客户签名")
+    @PostMapping("/biz/bizloadappoint/updateCustomerSign")
+    public CommonResult<String> updateCustomerSign(@RequestBody @Valid BizLoadAppointEditParam bizLoadAppointEditParam) {
+        bizLoadAppointService.updateCustomerSign(bizLoadAppointEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 导出起卸预约报表
+     */
+    @Operation(summary = "导出起卸预约报表")
+    @SaCheckPermission("/biz/bizloadappoint/exportRecord")
+    @GetMapping(value = "/biz/bizloadappoint/exportRecord", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+    public void exportRecord(BizLoadAppointPageParam bizLoadAppointPageParam, HttpServletResponse response) throws IOException {
+        bizLoadAppointService.exportRecord(bizLoadAppointPageParam,response);
+    }
+}

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

@@ -0,0 +1,125 @@
+/*
+ * 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.bizloadappoint.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+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;
+import java.util.List;
+
+/**
+ * 起卸预约实体
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+@Getter
+@Setter
+@TableName("biz_load_appoint")
+public class BizLoadAppoint extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /**起卸预约单号*/
+    @Schema(description = "起卸预约单号")
+    private String loadNumber;
+
+    /** 服务客户id */
+    @Schema(description = "服务客户id")
+    private String customerId;
+
+    /** 货物id */
+    @Schema(description = "货物id")
+    private String goodsId;
+
+    /** 订单数量 */
+    @Schema(description = "订单数量")
+    private BigDecimal orderWeight;
+
+    /** 单价 */
+    @Schema(description = "单价")
+    private BigDecimal orderPrice;
+
+    /** 订单总额 */
+    @Schema(description = "订单总额")
+    private BigDecimal orderAmount;
+
+    /** 船运供应商 */
+    @Schema(description = "船运供应商")
+    private String supplierId;
+
+    /**汽运供应商*/
+    @TableField(exist = false)
+    private List<String> supplierIdList;
+
+    /** 运费单价 */
+    @Schema(description = "运费单价")
+    private BigDecimal freightPrice;
+
+    /** 支付方式  1:预付(先付后执行)  2:授信 (先执行后付) */
+    @Schema(description = "支付方式  1:预付(先付后执行)  2:授信 (先执行后付)")
+    private String payType;
+
+    /** 订单类型  1:配送   2:自提 */
+    @Schema(description = "订单类型  1:配送   2:自提")
+    private String orderType;
+
+    /** 状态   1:待提交  2:客户确认 */
+    @Schema(description = "状态   1:待提交  2:客户确认")
+    @Trans(type = TransType.DICTIONARY, key = "load_appoint_status")
+    private String status;
+
+
+    /**服务客户名称*/
+    @TableField(exist = false)
+    private String customerName;
+
+    /**货品名称*/
+    @TableField(exist = false)
+    private String goodsName;
+
+    /**供应商名称*/
+    @TableField(exist = false)
+    private String supplierName;
+
+    /**客户联系人*/
+    @TableField(exist = false)
+    private String customerContact;
+
+    /**客户电话**/
+    @TableField(exist = false)
+    private String customerPhone;
+
+    /**客户地址*/
+    @TableField(exist = false)
+    private String customerAddress;
+
+    /***货品编码*/
+    @TableField(exist = false)
+    private String goodsCode;
+
+    /**客户签名*/
+    private String customerSign;
+    /**签名时间*/
+    private Date signTime;
+}

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

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

@@ -0,0 +1,33 @@
+/*
+ * 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.bizloadappoint.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.bizloadappoint.entity.BizLoadAppoint;
+
+import java.util.List;
+
+/**
+ * 起卸预约Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+public interface BizLoadAppointMapper extends BaseMapper<BizLoadAppoint> {
+    Page<BizLoadAppoint> getPage(@Param("page") Page<BizLoadAppoint> page, @Param("ew") QueryWrapper<BizLoadAppoint> ew);
+
+    List<BizLoadAppoint> getPage(@Param("ew") QueryWrapper<BizLoadAppoint> ew);
+}

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

@@ -0,0 +1,36 @@
+<?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.bizloadappoint.mapper.BizLoadAppointMapper">
+
+    <select id="getPage" resultType="vip.xiaonuo.biz.modular.bizloadappoint.entity.BizLoadAppoint">
+        select
+            bla.id,
+            bla.load_number,
+            bsc.`name` customerName,
+            bsc.contact customerContact,
+            bsc.phone customerPhone,
+            bsc.address customerAddress,
+            bla.customer_id,
+            bla.goods_id,
+            bg.GOODS_NAME goodsName,
+            bg.GOODS_CODE goodsCode,
+            ifnull(bla.order_weight/1000,0) order_weight,
+            bla.order_price,
+            bla.order_amount,
+            bs.supplier_name,
+            bla.supplier_id,
+            bla.freight_price,
+            bla.pay_type,
+            bla.order_type,
+            bla.status,
+            bla.create_user,
+            bla.create_time,
+            bla.customer_sign,
+            bla.sign_time
+        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
+         ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 78 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointAddParam.java

@@ -0,0 +1,78 @@
+/*
+ * 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.bizloadappoint.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;
+import java.util.List;
+
+/**
+ * 起卸预约添加参数
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+@Getter
+@Setter
+public class BizLoadAppointAddParam {
+
+    /** 服务客户id */
+    @Schema(description = "服务客户id")
+    private String customerId;
+
+    /** 货物id */
+    @Schema(description = "货物id")
+    private String goodsId;
+
+    /** 订单数量 */
+    @Schema(description = "订单数量")
+    private BigDecimal orderWeight;
+
+    /** 单价 */
+    @Schema(description = "单价")
+    private BigDecimal orderPrice;
+
+    /** 订单总额 */
+    @Schema(description = "订单总额")
+    private BigDecimal orderAmount;
+
+    /** 船运供应商 */
+    @Schema(description = "船运供应商")
+    private String supplierId;
+
+    /** 运费单价 */
+    @Schema(description = "运费单价")
+    private BigDecimal freightPrice;
+
+    /** 支付方式  1:预付(先付后执行)  2:授信 (先执行后付) */
+    @Schema(description = "支付方式  1:预付(先付后执行)  2:授信 (先执行后付)")
+    private String payType;
+
+    /** 订单类型  1:配送   2:自提 */
+    @Schema(description = "订单类型  1:配送   2:自提")
+    private String orderType;
+
+    /** 状态   1:待提交  2:客户确认 */
+    @Schema(description = "状态   1:待提交  2:客户确认")
+    private String status;
+
+    /**汽运供应商*/
+    private List<String> supplierIdList;
+
+}

+ 86 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointEditParam.java

@@ -0,0 +1,86 @@
+/*
+ * 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.bizloadappoint.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;
+import java.util.List;
+
+/**
+ * 起卸预约编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+@Getter
+@Setter
+public class BizLoadAppointEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 服务客户id */
+    @Schema(description = "服务客户id")
+    private String customerId;
+
+    /** 货物id */
+    @Schema(description = "货物id")
+    private String goodsId;
+
+    /** 订单数量 */
+    @Schema(description = "订单数量")
+    private BigDecimal orderWeight;
+
+    /** 单价 */
+    @Schema(description = "单价")
+    private BigDecimal orderPrice;
+
+    /** 订单总额 */
+    @Schema(description = "订单总额")
+    private BigDecimal orderAmount;
+
+    /** 船运供应商 */
+    @Schema(description = "船运供应商")
+    private String supplierId;
+
+    /** 运费单价 */
+    @Schema(description = "运费单价")
+    private BigDecimal freightPrice;
+
+    /** 支付方式  1:预付(先付后执行)  2:授信 (先执行后付) */
+    @Schema(description = "支付方式  1:预付(先付后执行)  2:授信 (先执行后付)")
+    private String payType;
+
+    /** 订单类型  1:配送   2:自提 */
+    @Schema(description = "订单类型  1:配送   2:自提")
+    private String orderType;
+
+    /** 状态   1:待提交  2:客户确认 */
+    @Schema(description = "状态   1:待提交  2:客户确认")
+    private String status;
+
+    /**汽运供应商*/
+    private List<String> supplierIdList;
+
+    /**客户签名*/
+    private String customerSign;
+
+}

+ 78 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointExportResult.java

@@ -0,0 +1,78 @@
+/*
+ * 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.bizloadappoint.param;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadStyle;
+import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 起卸预约实体
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+@Data
+public class BizLoadAppointExportResult {
+
+    /**起卸预约单号*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "预约单号"})
+    private String loadNumber;
+
+    /**服务客户名称*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "服务客户名称"})
+    private String customerName;
+
+    /**货品名称*/
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "货品名称"})
+    private String goodsName;
+
+    /** 订单数量 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "订单数量(吨)"})
+    private BigDecimal orderWeight;
+
+    /** 单价 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "单价(元/吨)"})
+    private BigDecimal orderPrice;
+
+    /** 订单总额 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "订单总额(元)"})
+    private BigDecimal orderAmount;
+
+    /** 船运供应商 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "船运供应商"})
+    private String supplierName;
+
+    /** 运费单价 */
+    @ColumnWidth(30)
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "运费单价(元/吨)"})
+    private BigDecimal freightPrice;
+
+    /** 状态   1:待提交  2:客户确认 */
+    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 120)
+    @ExcelProperty({"起卸预约报表", "状态"})
+    private String status;
+
+}

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

+ 67 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/param/BizLoadAppointPageParam.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.bizloadappoint.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/25 14:51
+ **/
+@Getter
+@Setter
+public class BizLoadAppointPageParam {
+
+    /** 当前页 */
+    @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 loadNumber;
+
+    /**客户名称*/
+    private String customerName;
+
+    /**货物名称*/
+    private String goodsName;
+
+    /**支付方式*/
+    private String payType;
+
+    /**创建时间*/
+    private String createTimeBegin;
+    private String createTimeEnd;
+
+}

+ 97 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappoint/service/BizLoadAppointService.java

@@ -0,0 +1,97 @@
+/*
+ * 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.bizloadappoint.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.servlet.http.HttpServletResponse;
+import vip.xiaonuo.biz.modular.bizloadappoint.entity.BizLoadAppoint;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointAddParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointEditParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointIdParam;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.BizLoadAppointPageParam;
+
+import java.util.List;
+
+/**
+ * 起卸预约Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+public interface BizLoadAppointService extends IService<BizLoadAppoint> {
+
+    /**
+     * 获取起卸预约分页
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    Page<BizLoadAppoint> page(BizLoadAppointPageParam bizLoadAppointPageParam);
+
+    /**
+     * 添加起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    void add(BizLoadAppointAddParam bizLoadAppointAddParam);
+
+    /**
+     * 编辑起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    void edit(BizLoadAppointEditParam bizLoadAppointEditParam);
+
+    /**
+     * 删除起卸预约
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    void delete(List<BizLoadAppointIdParam> bizLoadAppointIdParamList);
+
+    /**
+     * 获取起卸预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     */
+    BizLoadAppoint detail(BizLoadAppointIdParam bizLoadAppointIdParam);
+
+    /**
+     * 获取起卸预约详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 14:51
+     **/
+    BizLoadAppoint queryEntity(String id);
+
+    /**
+     * 提交
+     * @param bizLoadAppointEditParam
+     */
+    void submit(BizLoadAppointEditParam bizLoadAppointEditParam);
+
+    /**
+     * 客户签名
+     */
+    void updateCustomerSign(BizLoadAppointEditParam bizLoadAppointEditParam);
+
+    /**
+     * 导出
+     */
+    void exportRecord(BizLoadAppointPageParam bizLoadAppointPageParam,HttpServletResponse response);
+}

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

@@ -0,0 +1,249 @@
+/*
+ * 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.bizloadappoint.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.img.ImgUtil;
+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 com.fhs.trans.service.impl.TransService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.compress.utils.Lists;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizloadappoint.param.*;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.entity.BizLoadAppointSupplier;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.service.BizLoadAppointSupplierService;
+import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
+import vip.xiaonuo.biz.modular.bizorder.param.BizOrderExportResult;
+import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
+import vip.xiaonuo.biz.modular.utils.CommonExportUtil;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizloadappoint.entity.BizLoadAppoint;
+import vip.xiaonuo.biz.modular.bizloadappoint.mapper.BizLoadAppointMapper;
+import vip.xiaonuo.biz.modular.bizloadappoint.service.BizLoadAppointService;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 起卸预约Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/25 14:51
+ **/
+@Service
+public class BizLoadAppointServiceImpl extends ServiceImpl<BizLoadAppointMapper, BizLoadAppoint> implements BizLoadAppointService {
+
+    private final ReentrantLock lock = new ReentrantLock();
+
+    @Resource
+    private BizLoadAppointSupplierService bizLoadAppointSupplierService;
+
+    @Resource
+    private TransService transService;
+
+    @Override
+    public Page<BizLoadAppoint> page(BizLoadAppointPageParam bizLoadAppointPageParam) {
+        QueryWrapper<BizLoadAppoint> queryWrapper = getQueryWrapper(bizLoadAppointPageParam);
+        Page<BizLoadAppoint> page = this.getBaseMapper().getPage(CommonPageRequest.defaultPage(), queryWrapper);
+        for(BizLoadAppoint bizLoadAppoint : page.getRecords()){
+            //查询汽运供应商
+            List<String> idList = Lists.newArrayList();
+            bizLoadAppointSupplierService.list(new QueryWrapper<BizLoadAppointSupplier>().lambda().
+                    eq(BizLoadAppointSupplier::getAppointId,bizLoadAppoint.getId()))
+                    .forEach(supplier->idList.add(supplier.getSupplierId()));
+            bizLoadAppoint.setSupplierIdList(idList);
+        }
+        return page;
+    }
+
+    public QueryWrapper<BizLoadAppoint> getQueryWrapper(BizLoadAppointPageParam bizLoadAppointPageParam){
+        QueryWrapper<BizLoadAppoint> queryWrapper = new QueryWrapper<BizLoadAppoint>().checkSqlInjection();
+        //预约单号查询
+        if(ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getLoadNumber())){
+            queryWrapper.like("bla.load_number",bizLoadAppointPageParam.getLoadNumber());
+        }
+        //客户名称查询
+        if(ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getCustomerName())){
+            queryWrapper.like("bsc.`name`",bizLoadAppointPageParam.getCustomerName());
+        }
+        //货品名称查询
+        if(ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getGoodsName())){
+            queryWrapper.like("bg.GOODS_NAME",bizLoadAppointPageParam.getGoodsName());
+        }
+        //支付方式
+        if(ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getPayType())){
+            queryWrapper.eq("bla.pay_type",bizLoadAppointPageParam.getPayType());
+        }
+        //创建时间
+        if(ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getCreateTimeBegin()) &&
+                ObjectUtil.isNotEmpty(bizLoadAppointPageParam.getCreateTimeEnd())){
+            queryWrapper.between("bla.create_time",bizLoadAppointPageParam.getCreateTimeBegin()+" 00:00:00",
+                    bizLoadAppointPageParam.getCreateTimeEnd()+" 23:59:59");
+        }
+        queryWrapper.eq("bla.delete_flag","NOT_DELETE");
+        queryWrapper.orderByDesc("bla.create_time");
+        return queryWrapper;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizLoadAppointAddParam bizLoadAppointAddParam) {
+        //新增起卸预约信息
+        BizLoadAppoint bizLoadAppoint = BeanUtil.toBean(bizLoadAppointAddParam, BizLoadAppoint.class);
+        bizLoadAppoint.setLoadNumber(getNumber());
+        bizLoadAppoint.setOrderWeight(bizLoadAppoint.getOrderWeight().multiply(new BigDecimal(1000)));
+        this.save(bizLoadAppoint);
+
+        //新增起卸预约汽运供应商
+        if(ObjectUtil.isNotEmpty(bizLoadAppointAddParam.getSupplierIdList())){
+            for(String supplierId : bizLoadAppointAddParam.getSupplierIdList()){
+                BizLoadAppointSupplier bizLoadAppointSupplier = new BizLoadAppointSupplier();
+                bizLoadAppointSupplier.setAppointId(bizLoadAppoint.getId());
+                bizLoadAppointSupplier.setSupplierId(supplierId);
+                bizLoadAppointSupplierService.save(bizLoadAppointSupplier);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizLoadAppointEditParam bizLoadAppointEditParam) {
+        BizLoadAppoint bizLoadAppoint = this.queryEntity(bizLoadAppointEditParam.getId());
+        BeanUtil.copyProperties(bizLoadAppointEditParam, bizLoadAppoint);
+        //吨转kg
+        bizLoadAppoint.setOrderWeight(bizLoadAppointEditParam.getOrderWeight().multiply(new BigDecimal(1000)));
+        this.updateById(bizLoadAppoint);
+
+        //删除原有汽运供应商
+        List<BizLoadAppointSupplier> list = bizLoadAppointSupplierService.list(new QueryWrapper<BizLoadAppointSupplier>().lambda().
+                eq(BizLoadAppointSupplier::getAppointId, bizLoadAppointEditParam.getId()));
+        bizLoadAppointSupplierService.removeByIds(CollStreamUtil.toList(list,BizLoadAppointSupplier::getId));
+
+        //新增汽运供应商
+        if(ObjectUtil.isNotEmpty(bizLoadAppointEditParam.getSupplierIdList())){
+            for(String supplierId : bizLoadAppointEditParam.getSupplierIdList()){
+                BizLoadAppointSupplier bizLoadAppointSupplier = new BizLoadAppointSupplier();
+                bizLoadAppointSupplier.setAppointId(bizLoadAppoint.getId());
+                bizLoadAppointSupplier.setSupplierId(supplierId);
+                bizLoadAppointSupplierService.save(bizLoadAppointSupplier);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizLoadAppointIdParam> bizLoadAppointIdParamList) {
+        // 执行删除
+        //删除供应商
+        for(BizLoadAppointIdParam bizLoadAppointIdParam : bizLoadAppointIdParamList){
+            List<BizLoadAppointSupplier> list = bizLoadAppointSupplierService.list(new QueryWrapper<BizLoadAppointSupplier>().lambda().
+                    eq(BizLoadAppointSupplier::getAppointId, bizLoadAppointIdParam.getId()));
+            bizLoadAppointSupplierService.removeByIds(CollStreamUtil.toList(list,BizLoadAppointSupplier::getId));
+
+            this.removeById(bizLoadAppointIdParam.getId());
+        }
+        //this.removeByIds(CollStreamUtil.toList(bizLoadAppointIdParamList, BizLoadAppointIdParam::getId));
+    }
+
+    @Override
+    public BizLoadAppoint detail(BizLoadAppointIdParam bizLoadAppointIdParam) {
+        return this.queryEntity(bizLoadAppointIdParam.getId());
+    }
+
+    @Override
+    public BizLoadAppoint queryEntity(String id) {
+        BizLoadAppoint bizLoadAppoint = this.getById(id);
+        if(ObjectUtil.isEmpty(bizLoadAppoint)) {
+            throw new CommonException("起卸预约不存在,id值为:{}", id);
+        }
+        return bizLoadAppoint;
+    }
+
+    @Override
+    public void submit(BizLoadAppointEditParam bizLoadAppointEditParam) {
+        BizLoadAppoint bizLoadAppoint = this.queryEntity(bizLoadAppointEditParam.getId());
+        bizLoadAppoint.setStatus("1");
+        this.updateById(bizLoadAppoint);
+    }
+
+    @Override
+    public void updateCustomerSign(BizLoadAppointEditParam bizLoadAppointEditParam) {
+        BizLoadAppoint bizLoadAppoint = this.queryEntity(bizLoadAppointEditParam.getId());
+        if(ObjectUtil.isEmpty(bizLoadAppointEditParam.getCustomerSign())){
+            throw new CommonException("签名不能为空!");
+        }
+        String customerSign = bizLoadAppointEditParam.getCustomerSign();
+        if(bizLoadAppointEditParam.getCustomerSign().contains(StrUtil.COMMA)) {
+            customerSign = StrUtil.split(customerSign, StrUtil.COMMA).get(1);
+        }
+        String base64 = ImgUtil.toBase64DataUri(ImgUtil.scale(ImgUtil.toImage(customerSign),
+                100, 50, null), ImgUtil.IMAGE_TYPE_PNG);
+
+        bizLoadAppoint.setCustomerSign(base64);
+        bizLoadAppoint.setStatus("2");
+        bizLoadAppoint.setSignTime(new Date());
+        this.updateById(bizLoadAppoint);
+    }
+
+    @Override
+    public void exportRecord(BizLoadAppointPageParam bizLoadAppointPageParam, HttpServletResponse response) {
+        QueryWrapper<BizLoadAppoint> queryWrapper = getQueryWrapper(bizLoadAppointPageParam);
+        List<BizLoadAppoint> appointList = this.getBaseMapper().getPage(queryWrapper);
+        if(ObjectUtil.isEmpty(appointList)){
+            throw new CommonException("无数据可导出!");
+        }
+        String fileName = "起卸预约报表.xlsx";
+        List<BizLoadAppointExportResult> list = Lists.newArrayList();
+        transService.transBatch(appointList);
+        for(BizLoadAppoint bizLoadAppoint : appointList){
+            BizLoadAppointExportResult bizLoadAppointExportResult = new BizLoadAppointExportResult();
+            BeanUtil.copyProperties(bizLoadAppoint, bizLoadAppointExportResult);
+            bizLoadAppointExportResult.setStatus((String) bizLoadAppoint.getTransMap().get("statusName"));
+            list.add(bizLoadAppointExportResult);
+        }
+        CommonExportUtil.export(fileName, BizLoadAppointExportResult.class,list,response,"起卸预约报表");
+    }
+
+
+    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<BizLoadAppoint>().lambda().between(BizLoadAppoint::getCreateTime, time + " 00:00:00", time + " 23:59:59"));
+            String settleNo = "QX" + format + generateCode((int)count);
+            return settleNo;
+        }finally {
+            lock.unlock(); // 释放锁
+        }
+
+    }
+
+    public static String generateCode(Integer counter) {
+        counter++;
+        return String.format("%03d", counter);
+    }
+}

+ 131 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/controller/BizLoadAppointSupplierController.java

@@ -0,0 +1,131 @@
+/*
+ * 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.bizloadappointsupplier.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.bizloadappointsupplier.entity.BizLoadAppointSupplier;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierPageParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.service.BizLoadAppointSupplierService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 起卸汽运供应商控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ */
+@Tag(name = "起卸汽运供应商控制器")
+@RestController
+@Validated
+public class BizLoadAppointSupplierController {
+
+    @Resource
+    private BizLoadAppointSupplierService bizLoadAppointSupplierService;
+
+    /**
+     * 获取起卸汽运供应商分页
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "获取起卸汽运供应商分页")
+    @SaCheckPermission("/biz/bizloadappointsupplier/page")
+    @GetMapping("/biz/bizloadappointsupplier/page")
+    public CommonResult<Page<BizLoadAppointSupplier>> page(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam) {
+        return CommonResult.data(bizLoadAppointSupplierService.page(bizLoadAppointSupplierPageParam));
+    }
+
+    /**
+     * 添加起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "添加起卸汽运供应商")
+    @CommonLog("添加起卸汽运供应商")
+    @PostMapping("/biz/bizloadappointsupplier/add")
+    public CommonResult<String> add(@RequestBody @Valid BizLoadAppointSupplierAddParam bizLoadAppointSupplierAddParam) {
+        bizLoadAppointSupplierService.add(bizLoadAppointSupplierAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "编辑起卸汽运供应商")
+    @CommonLog("编辑起卸汽运供应商")
+    @PostMapping("/biz/bizloadappointsupplier/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizLoadAppointSupplierEditParam bizLoadAppointSupplierEditParam) {
+        bizLoadAppointSupplierService.edit(bizLoadAppointSupplierEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "删除起卸汽运供应商")
+    @CommonLog("删除起卸汽运供应商")
+    @PostMapping("/biz/bizloadappointsupplier/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizLoadAppointSupplierIdParam> bizLoadAppointSupplierIdParamList) {
+        bizLoadAppointSupplierService.delete(bizLoadAppointSupplierIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取起卸汽运供应商详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "获取起卸汽运供应商详情")
+    @GetMapping("/biz/bizloadappointsupplier/detail")
+    public CommonResult<BizLoadAppointSupplier> detail(@Valid BizLoadAppointSupplierIdParam bizLoadAppointSupplierIdParam) {
+        return CommonResult.data(bizLoadAppointSupplierService.detail(bizLoadAppointSupplierIdParam));
+    }
+
+    /**
+     * 获取起卸汽运供应商列表
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    @Operation(summary = "获取起卸汽运供应商列表")
+    @GetMapping("/biz/bizloadappointsupplier/getList")
+    public CommonResult<List<BizLoadAppointSupplier>> getList(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam) {
+        return CommonResult.data(bizLoadAppointSupplierService.getList(bizLoadAppointSupplierPageParam));
+    }
+}

+ 64 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/entity/BizLoadAppointSupplier.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizloadappointsupplier.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/25 16:25
+ **/
+@Getter
+@Setter
+@TableName("biz_load_appoint_supplier")
+public class BizLoadAppointSupplier extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 起卸预约id */
+    @Schema(description = "起卸预约id")
+    private String appointId;
+
+    /** 汽运供应商 */
+    @Schema(description = "汽运供应商")
+    private String supplierId;
+
+    /** 场内重量 */
+    @Schema(description = "场内重量")
+    private BigDecimal netWeight;
+
+    /** 卸货重量 */
+    @Schema(description = "卸货重量")
+    private BigDecimal shippingWeight;
+
+    /** 状态:0:待结算   1:已结算   */
+    @Schema(description = "状态:0:待结算   1:已结算  ")
+    private String status;
+
+
+    /**供应商名称*/
+    @TableField(exist = false)
+    private String supplierName;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/enums/BizLoadAppointSupplierEnum.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.bizloadappointsupplier.enums;
+
+import lombok.Getter;
+
+/**
+ * 起卸汽运供应商枚举
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ **/
+@Getter
+public enum BizLoadAppointSupplierEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizLoadAppointSupplierEnum(String value) {
+        this.value = value;
+    }
+}

+ 31 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/mapper/BizLoadAppointSupplierMapper.java

@@ -0,0 +1,31 @@
+/*
+ * 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.bizloadappointsupplier.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.entity.BizLoadAppointSupplier;
+
+import java.util.List;
+
+/**
+ * 起卸汽运供应商Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ **/
+public interface BizLoadAppointSupplierMapper extends BaseMapper<BizLoadAppointSupplier> {
+
+    List<BizLoadAppointSupplier> getList(@Param("ew") QueryWrapper<BizLoadAppointSupplier> ew);
+}

+ 16 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/mapper/mapping/BizLoadAppointSupplierMapper.xml

@@ -0,0 +1,16 @@
+<?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.bizloadappointsupplier.mapper.BizLoadAppointSupplierMapper">
+
+    <select id="getList"
+            resultType="vip.xiaonuo.biz.modular.bizloadappointsupplier.entity.BizLoadAppointSupplier">
+        select
+            blas.id,
+            bs.supplier_name,
+            blas.net_weight,
+            blas.shipping_weight
+        from biz_load_appoint_supplier blas
+        left join biz_supplier bs on bs.id = blas.supplier_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 54 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierAddParam.java

@@ -0,0 +1,54 @@
+/*
+ * 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.bizloadappointsupplier.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/25 16:25
+ **/
+@Getter
+@Setter
+public class BizLoadAppointSupplierAddParam {
+
+    /** 起卸预约id */
+    @Schema(description = "起卸预约id")
+    private String appointId;
+
+    /** 汽运供应商 */
+    @Schema(description = "汽运供应商")
+    private String supplierId;
+
+    /** 场内重量 */
+    @Schema(description = "场内重量")
+    private BigDecimal netWeight;
+
+    /** 卸货重量 */
+    @Schema(description = "卸货重量")
+    private BigDecimal shippingWeight;
+
+    /** 状态:0:待结算   1:已结算   */
+    @Schema(description = "状态:0:待结算   1:已结算  ")
+    private String status;
+
+}

+ 59 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierEditParam.java

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

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

+ 54 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/param/BizLoadAppointSupplierPageParam.java

@@ -0,0 +1,54 @@
+/*
+ * 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.bizloadappointsupplier.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/25 16:25
+ **/
+@Getter
+@Setter
+public class BizLoadAppointSupplierPageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 85 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/service/BizLoadAppointSupplierService.java

@@ -0,0 +1,85 @@
+/*
+ * 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.bizloadappointsupplier.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.entity.BizLoadAppointSupplier;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierPageParam;
+
+import java.util.List;
+
+/**
+ * 起卸汽运供应商Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ **/
+public interface BizLoadAppointSupplierService extends IService<BizLoadAppointSupplier> {
+
+    /**
+     * 获取起卸汽运供应商分页
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    Page<BizLoadAppointSupplier> page(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam);
+
+    /**
+     * 添加起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    void add(BizLoadAppointSupplierAddParam bizLoadAppointSupplierAddParam);
+
+    /**
+     * 编辑起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    void edit(BizLoadAppointSupplierEditParam bizLoadAppointSupplierEditParam);
+
+    /**
+     * 删除起卸汽运供应商
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    void delete(List<BizLoadAppointSupplierIdParam> bizLoadAppointSupplierIdParamList);
+
+    /**
+     * 获取起卸汽运供应商详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     */
+    BizLoadAppointSupplier detail(BizLoadAppointSupplierIdParam bizLoadAppointSupplierIdParam);
+
+    /**
+     * 获取起卸汽运供应商详情
+     *
+     * @author fanzherong
+     * @date  2025/06/25 16:25
+     **/
+    BizLoadAppointSupplier queryEntity(String id);
+
+    /**
+     * 获取起卸汽运供应商列表
+     */
+    List<BizLoadAppointSupplier> getList(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam);
+}

+ 105 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadappointsupplier/service/impl/BizLoadAppointSupplierServiceImpl.java

@@ -0,0 +1,105 @@
+/*
+ * 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.bizloadappointsupplier.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.entity.BizLoadAppointSupplier;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.mapper.BizLoadAppointSupplierMapper;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierAddParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierEditParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierIdParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.param.BizLoadAppointSupplierPageParam;
+import vip.xiaonuo.biz.modular.bizloadappointsupplier.service.BizLoadAppointSupplierService;
+
+import java.util.List;
+
+/**
+ * 起卸汽运供应商Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/25 16:25
+ **/
+@Service
+public class BizLoadAppointSupplierServiceImpl extends ServiceImpl<BizLoadAppointSupplierMapper, BizLoadAppointSupplier> implements BizLoadAppointSupplierService {
+
+    @Override
+    public Page<BizLoadAppointSupplier> page(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam) {
+        QueryWrapper<BizLoadAppointSupplier> queryWrapper = new QueryWrapper<BizLoadAppointSupplier>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizLoadAppointSupplierPageParam.getSortField(), bizLoadAppointSupplierPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizLoadAppointSupplierPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizLoadAppointSupplierPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizLoadAppointSupplierPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizLoadAppointSupplier::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizLoadAppointSupplierAddParam bizLoadAppointSupplierAddParam) {
+        BizLoadAppointSupplier bizLoadAppointSupplier = BeanUtil.toBean(bizLoadAppointSupplierAddParam, BizLoadAppointSupplier.class);
+        this.save(bizLoadAppointSupplier);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizLoadAppointSupplierEditParam bizLoadAppointSupplierEditParam) {
+        BizLoadAppointSupplier bizLoadAppointSupplier = this.queryEntity(bizLoadAppointSupplierEditParam.getId());
+        BeanUtil.copyProperties(bizLoadAppointSupplierEditParam, bizLoadAppointSupplier);
+        this.updateById(bizLoadAppointSupplier);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizLoadAppointSupplierIdParam> bizLoadAppointSupplierIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizLoadAppointSupplierIdParamList, BizLoadAppointSupplierIdParam::getId));
+    }
+
+    @Override
+    public BizLoadAppointSupplier detail(BizLoadAppointSupplierIdParam bizLoadAppointSupplierIdParam) {
+        return this.queryEntity(bizLoadAppointSupplierIdParam.getId());
+    }
+
+    @Override
+    public BizLoadAppointSupplier queryEntity(String id) {
+        BizLoadAppointSupplier bizLoadAppointSupplier = this.getById(id);
+        if(ObjectUtil.isEmpty(bizLoadAppointSupplier)) {
+            throw new CommonException("起卸汽运供应商不存在,id值为:{}", id);
+        }
+        return bizLoadAppointSupplier;
+    }
+
+    @Override
+    public List<BizLoadAppointSupplier> getList(BizLoadAppointSupplierPageParam bizLoadAppointSupplierPageParam) {
+        QueryWrapper<BizLoadAppointSupplier> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(bizLoadAppointSupplierPageParam.getAppointId())){
+            queryWrapper.eq("blas.appoint_id",bizLoadAppointSupplierPageParam.getAppointId());
+        }
+        queryWrapper.eq("blas.delete_flag","NOT_DELETE");
+        List<BizLoadAppointSupplier> list = this.getBaseMapper().getList(queryWrapper);
+        return list;
+    }
+}

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

@@ -118,4 +118,16 @@ public class BizServiceCustomerController {
     public CommonResult<BizServiceCustomer> detail(@Valid BizServiceCustomerIdParam bizServiceCustomerIdParam) {
         return CommonResult.data(bizServiceCustomerService.detail(bizServiceCustomerIdParam));
     }
+
+    /**
+     * 获取服务客户管理列表
+     *
+     * @author fanzherong
+     * @date  2025/05/29 14:27
+     */
+    @Operation(summary = "获取服务客户管理列表")
+    @GetMapping("/biz/bizservicecustomer/getList")
+    public CommonResult<List<BizServiceCustomer>> getList(BizServiceCustomerPageParam bizServiceCustomerPageParam) {
+        return CommonResult.data(bizServiceCustomerService.getList(bizServiceCustomerPageParam));
+    }
 }

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

@@ -77,4 +77,7 @@ public interface BizServiceCustomerService extends IService<BizServiceCustomer>
      * @date  2025/05/29 14:27
      **/
     BizServiceCustomer queryEntity(String id);
+
+
+    List<BizServiceCustomer> getList(BizServiceCustomerPageParam bizServiceCustomerPageParam);
 }

+ 8 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizservicecustomer/service/impl/BizServiceCustomerServiceImpl.java

@@ -219,4 +219,12 @@ public class BizServiceCustomerServiceImpl extends ServiceImpl<BizServiceCustome
         }
         return bizServiceCustomer;
     }
+
+    @Override
+    public List<BizServiceCustomer> getList(BizServiceCustomerPageParam bizServiceCustomerPageParam) {
+        QueryWrapper<BizServiceCustomer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().orderByDesc(BizServiceCustomer::getCreateTime);
+        List<BizServiceCustomer> list = this.list(queryWrapper);
+        return list;
+    }
 }