ソースを参照

物流订单优化

fanzherong_v 3 週間 前
コミット
82bf0c28aa
54 ファイル変更2525 行追加11 行削除
  1. 4 0
      snowy-admin-web/src/api/biz/bizOrderLoadApi.js
  2. 32 0
      snowy-admin-web/src/api/biz/bizSettleApi.js
  3. 2 1
      snowy-admin-web/src/views/biz/bizappointmentrecord/detail.vue
  4. 4 0
      snowy-admin-web/src/views/biz/bizconfig/form.vue
  5. 9 1
      snowy-admin-web/src/views/biz/bizconfig/index.vue
  6. 9 1
      snowy-admin-web/src/views/biz/bizorder/dispatch.vue
  7. 1 1
      snowy-admin-web/src/views/biz/bizorder/index.vue
  8. 231 0
      snowy-admin-web/src/views/biz/bizorder/replace.vue
  9. 5 0
      snowy-admin-web/src/views/biz/bizsendrecord/index.vue
  10. 226 0
      snowy-admin-web/src/views/biz/bizsettle/form.vue
  11. 145 0
      snowy-admin-web/src/views/biz/bizsettle/index.vue
  12. 302 0
      snowy-admin-web/src/views/biz/bizsettle/orderItem.vue
  13. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/entity/BizAppointmentRecord.java
  14. 2 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/mapper/mapping/BizAppointmentRecordMapper.xml
  15. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/entity/BizConfig.java
  16. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigAddParam.java
  17. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizconfig/param/BizConfigEditParam.java
  18. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/param/BizLoadTimePageParam.java
  19. 6 3
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizloadtime/service/impl/BizLoadTimeServiceImpl.java
  20. 2 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/mapper/BizOrderMapper.java
  21. 47 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/mapper/mapping/BizOrderMapper.xml
  22. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/param/BizOrderPageParam.java
  23. 2 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/BizOrderService.java
  24. 12 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/impl/BizOrderServiceImpl.java
  25. 14 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/controller/BizOrderLoadController.java
  26. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/entity/BizOrderLoad.java
  27. 2 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/mapper/mapping/BizOrderLoadMapper.xml
  28. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/service/BizOrderLoadService.java
  29. 104 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/service/impl/BizOrderLoadServiceImpl.java
  30. 131 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/controller/BizSettleController.java
  31. 56 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/entity/BizSettle.java
  32. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/enums/BizSettleEnum.java
  33. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/mapper/BizSettleMapper.java
  34. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/mapper/mapping/BizSettleMapper.xml
  35. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAddParam.java
  36. 56 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleEditParam.java
  37. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleIdParam.java
  38. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettlePageParam.java
  39. 85 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/BizSettleService.java
  40. 213 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/impl/BizSettleServiceImpl.java
  41. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/controller/BizSettleOrderController.java
  42. 47 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/entity/BizSettleOrder.java
  43. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/enums/BizSettleOrderEnum.java
  44. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/mapper/BizSettleOrderMapper.java
  45. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/mapper/mapping/BizSettleOrderMapper.xml
  46. 42 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/param/BizSettleOrderAddParam.java
  47. 47 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/param/BizSettleOrderEditParam.java
  48. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/param/BizSettleOrderIdParam.java
  49. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/param/BizSettleOrderPageParam.java
  50. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/service/BizSettleOrderService.java
  51. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/service/impl/BizSettleOrderServiceImpl.java
  52. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/entity/BizRecord.java
  53. 1 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/mapper/mapping/BizRecordMapper.xml
  54. 8 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/service/impl/BizRecordServiceImpl.java

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

@@ -17,6 +17,10 @@ export default {
 	bizOrderLoadSubmitForm(data, edit = false) {
 		return request(edit ? 'edit' : 'add', data)
 	},
+	// 更换装卸点位
+	bizOrderReplace(data){
+		return request('replace',data)
+	},
 	// 删除订单装卸点位
 	bizOrderLoadDelete(data) {
 		return request('delete', data)

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

@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizsettle/` + url, ...arg)
+
+/**
+ * 运费结算Api接口管理器
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+export default {
+	// 获取运费结算分页
+	bizSettlePage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交运费结算表单 edit为true时为编辑,默认为新增
+	bizSettleSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除运费结算
+	bizSettleDelete(data) {
+		return request('delete', data)
+	},
+	// 获取运费结算详情
+	bizSettleDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 编辑获取明细
+	detailOrder(data){
+		return request('detailOrder',data,'get')
+	}
+}

+ 2 - 1
snowy-admin-web/src/views/biz/bizappointmentrecord/detail.vue

@@ -21,7 +21,7 @@
 				<a-descriptions-item label="创建人" :span="2">{{ formData.createUserName }}</a-descriptions-item>
 				<a-descriptions-item label="创建时间" :span="2">{{ formData.createTime }}</a-descriptions-item>
 
-				<a-descriptions-item label="预约状态" :span="4">
+				<a-descriptions-item label="预约状态" :span="2">
 					<a-tag
 						:color="
 							formData.status === '1'
@@ -56,6 +56,7 @@
 						{{ $TOOL.dictTypeData('appointment_status', formData.status) }}
 					</a-tag>
 				</a-descriptions-item>
+				<a-descriptions-item label="完成装货时间" :span="2">{{ formData.completeSendTime }}</a-descriptions-item>
 				<a-descriptions-item label="审核备注" :span="4">{{ formData.appointmentReason }}</a-descriptions-item>
 				<a-descriptions-item label="司机确认" :span="4">
 					<a-image :width="200" :src="formData.driverSign" />

+ 4 - 0
snowy-admin-web/src/views/biz/bizconfig/form.vue

@@ -25,6 +25,9 @@
 			<a-form-item label="车辆装载量:" name="loadWeight">
 				<a-input-number v-model:value="formData.loadWeight" style="width:90%"  :precision="2" :min="0.01" :max="99999" placeholder="请输入车辆装载量" allow-clear /><span style="margin-left:10px;">吨</span>
 			</a-form-item>
+			<a-form-item label="结算基础金额:" name="settleAccount">
+				<a-input-number v-model:value="formData.settleAccount" 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="auditSwitch">
 				<a-radio-group button-style="solid" v-model:value="formData.auditSwitch">
 					<a-radio-button value="1">
@@ -129,6 +132,7 @@
 		applyCount: [required('请输入预约申请数量')],
 		lineNoticeSwitch: [required('请选择排队通知开关')],
 		loadWeight: [required('请输入车辆装载量')],
+		settleAccount:[required('请输入结算基础金额')],
 	}
 	// 验证并提交数据
 	const onSubmit = () => {

+ 9 - 1
snowy-admin-web/src/views/biz/bizconfig/index.vue

@@ -53,6 +53,9 @@
 				<template v-if="column.dataIndex === 'temporaryAuditSwitch'">
 					{{ $TOOL.dictTypeData('biz_switch', record.temporaryAuditSwitch) }}
 				</template>
+				<template v-if="column.dataIndex === 'loadWeight'">
+					{{record.loadWeight + '吨'}}
+				</template>
 			</template>
 		</s-table>
 	</a-card>
@@ -108,10 +111,15 @@
 			dataIndex: 'lossWarn',
 			align:'center'
 		},
-		{
+		/*{
 			title: '预约申请数量',
 			dataIndex: 'applyCount',
 			align:'center'
+		},*/
+		{
+			title: '车辆装载量',
+			dataIndex: 'loadWeight',
+			align:'center'
 		},
 		{
 			title: '排队通知开关',

+ 9 - 1
snowy-admin-web/src/views/biz/bizorder/dispatch.vue

@@ -50,6 +50,9 @@
 		>
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a-button type="link" size="small" v-if="hasPerm('bizOrderReplace')" @click="replaceRef.onOpen(record)">更换</a-button>
+					</a-space>
 					<a-space>
 						<a-button type="link" danger size="small" v-if="hasPerm('bizOrderDispatchDelete')" @click="deleteConfig(record)">删除</a-button>
 					</a-space>
@@ -61,6 +64,8 @@
 			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
 			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
 		</template>
+
+		<Replace ref="replaceRef" @successful="tableRef.refresh(true)" />
 	</xn-form-container>
 </template>
 
@@ -81,12 +86,15 @@
 	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
 	import {Modal} from 'ant-design-vue';
 	import {createVNode} from 'vue';
+	import Review from "@/views/biz/bizorder/review.vue";
+	import Replace from './replace.vue'
 
 	// 抽屉状态
 	const open = ref(false)
 	const emit = defineEmits({ successful: null })
 	const formRef = ref()
 	const tableRef = ref()
+	const replaceRef = ref()
 
 	const numberFlag = ref(false)
 	// 表单数据
@@ -157,7 +165,7 @@
 		loadTimeIdList.value = ''
 		formData.value.availableNumber = ''
 		formData.value.alreadyNumber = ''
-		bizLoadTimeApi.search({pointId:formData.value.loadPointId,goodsConfId:formData.value.deliveryTimeId,orderId:formData.value.id}).then((res)=>{
+		bizLoadTimeApi.search({pointId:formData.value.loadPointId,goodsConfId:formData.value.deliveryTimeId,orderId:formData.value.id,orderFlag:'1'}).then((res)=>{
 			loadTimeIdList.value = res.map((item)=>{
 				return{
 					value:item.id,

+ 1 - 1
snowy-admin-web/src/views/biz/bizorder/index.vue

@@ -287,7 +287,7 @@
 			<a-table ref="tableRef" :columns="columns1" :data-source="data1" bordered :row-key="(record) => record.id">
 				<template #bodyCell="{ column, record }">
 					<template v-if="column.dataIndex === 'action'">
-						<a @click="editAccount(record)">编辑</a>
+						<a @click="editAccount(record)"   v-if="hasPerm('BizApplyNumber')">编辑</a>
 <!--						<a-divider type="vertical" />
 						<a-popconfirm title="确定要删除吗?" @confirm="removeUser(record)">
 							<a-button type="link" danger size="small">删除</a-button>

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

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

+ 5 - 0
snowy-admin-web/src/views/biz/bizsendrecord/index.vue

@@ -199,6 +199,7 @@
 	import bizAppointmentRecordApi from "@/api/biz/bizAppointmentRecordApi";
 	import tool from '@/utils/tool'
 
+	const userInfo = tool.data.get('USER_INFO')
 	const searchFormState = ref({isFlag:1})
 	const searchFormRef = ref()
 	const tableRef = ref()
@@ -284,6 +285,10 @@
 			searchFormParam.endTareTime = searchFormParam.tareTime[1]
 			delete searchFormParam.tareTime
 		}
+		console.log("userInfo:"+JSON.stringify(userInfo.roleCodeList))
+		if(userInfo.roleCodeList.includes('send')){
+			searchFormParam.sendRecordStatus = '3'
+		}
 		return bizRecordApi.bizRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})

+ 226 - 0
snowy-admin-web/src/views/biz/bizsettle/form.vue

@@ -0,0 +1,226 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑运费结算' : '增加运费结算'"
+		:width="width"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol">
+			<a-form-item label="结算类型:" name="settleType" v-show="isShow">
+				<a-input v-model:value="formData.settleType" placeholder="请输入结算类型" allow-clear />
+			</a-form-item>
+			<a-form-item label="结算金额:" name="settleAccount" v-show="isShow">
+				<a-input v-model:value="formData.settleAccount" placeholder="请输入结算金额" allow-clear />
+			</a-form-item>
+			<a-tooltip title="点击添加物流订单">
+				<a-button size="small" @click="itemRef.showModal('checkbox', 'orderItem')"> 选择物流订单 </a-button>
+			</a-tooltip>
+			<table class="table">
+				<tr>
+					<td>订单编号</td>
+					<td>客户名称</td>
+					<td>货品名称</td>
+					<td>货品编码</td>
+					<td>供应商名称</td>
+					<td>订单重量</td>
+					<td>实际托运重量</td>
+					<td>运费单价</td>
+					<td>操作</td>
+				</tr>
+				<tr v-for="(order, index) in formData.orderList">
+					<td>
+						<a-tooltip :title="order.orderNumber">
+							{{ order.orderNumber }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.customerName">
+							{{ order.customerName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.goodsName">
+							{{ order.goodsName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.goodsCode">
+							{{ order.goodsCode }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.supplierName">
+							{{ order.supplierName }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.orderWeight">
+							{{ order.orderWeight }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.orderWeight">
+							{{ order.orderType == '1'? order.shippingWeight:order.netWeight }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-tooltip :title="order.freightPrice">
+							{{ order.freightPrice }}
+						</a-tooltip>
+					</td>
+					<td>
+						<a-button
+							danger
+							size="small"
+							type="link"
+							@click="deleteCount(index)"
+
+						>
+							<delete-outlined />
+						</a-button>
+					</td>
+				</tr>
+				<tr v-if="formData.orderList.length>0">
+					<th colspan="1">合计</th>
+					<td colspan="8">
+						{{amountTotal}}
+					</td>
+				</tr>
+			</table>
+		</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>
+
+		<OrderItem ref="itemRef" @orderItemCallBack="orderItemCallBack" />
+	</xn-form-container>
+</template>
+
+<script setup name="bizSettleForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import { message, Modal } from 'ant-design-vue'
+	import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
+	import { createVNode } from 'vue'
+	import bizSettleApi from '@/api/biz/bizSettleApi'
+	import OrderItem from './orderItem.vue'
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	const itemRef = ref()
+	const amountTotal = ref()
+	const isShow = ref(false)
+	// 表单数据
+	const formData = ref({orderList:[]})
+	const submitLoading = ref(false)
+	const width = ref('calc(70%)')
+	const labelCol = ref({ span: 3 })
+	const wrapperCol = ref({ span: 21 })
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			//let recordData = cloneDeep(record)
+			//formData.value = Object.assign({}, recordData)
+			bizSettleApi.detailOrder({id:record.id}).then((res)=>{
+				formData.value = res
+				amountTotal.value = 0
+				formData.value.orderList.forEach((item) => {
+					amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
+				})
+				formData.value.settleAccount = amountTotal.value
+			})
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {orderList:[]}
+		open.value = false
+	}
+
+	//删除明细
+	const deleteCount = (index) =>{
+		formData.value.orderList.splice(index, 1)
+		amountTotal.value = 0
+		formData.value.orderList.forEach((item) => {
+			amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
+		})
+		formData.value.settleAccount = amountTotal.value
+	}
+
+	// 默认要校验的
+	const formRules = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizSettleApi
+					.bizSettleSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+
+	const orderItemCallBack = (value) => {
+		if (value && value.length > 0) {
+			console.log('---this.value--->' + JSON.stringify(value))
+			if (formData.value.orderList && formData.value.orderList.length > 0) {
+				let map = new Map()
+				const array = ref([])
+				formData.value.orderList = formData.value.orderList.concat(value)
+				formData.value.orderList.forEach((item) => {
+					if (!map.has(item.id)) {
+						map.set(item.id, item)
+						array.value = array.value.concat(item)
+					}
+				})
+				formData.value.orderList = array.value
+			} else {
+				formData.value.orderList = value
+			}
+			amountTotal.value = 0
+			formData.value.orderList.forEach((item) => {
+				amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
+			})
+
+			formData.value.settleType = '1'
+			formData.value.settleAccount = amountTotal.value
+		}
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style scoped>
+table {
+	margin-top: 10px;
+	text-align: center;
+	width: 100%;
+}
+
+table td {
+	border: 1px solid #f0f2f5;
+	padding: 10px 0;
+}
+tr:hover {
+	background-color: #f5f5f5;
+}
+</style>

+ 145 - 0
snowy-admin-web/src/views/biz/bizsettle/index.vue

@@ -0,0 +1,145 @@
+<template>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizSettleAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="formRef.onOpen(record)" v-if="hasPerm('bizSettleEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizSettleEdit', 'bizSettleDelete'], 'and')" />
+						<a style="color:red" size="small" type="link" @click="deleteConfig(record)">删除</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizsettle">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizSettleApi from '@/api/biz/bizSettleApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	const submitLoading = ref(false)
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '结算单号',
+			dataIndex: 'settleNo',
+			align:'center',
+		},
+		{
+			title: '结算类型',
+			dataIndex: 'settleType',
+			align:'center',
+		},
+		{
+			title: '结算金额',
+			dataIndex: 'settleAccount',
+			align:'center',
+		},
+		{
+			title: '创建日期',
+			dataIndex: 'createTime',
+			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) => {
+		return bizSettleApi.bizSettlePage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizSettle = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizSettleApi.bizSettleDelete(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
+					}
+				]
+
+				bizSettleApi
+					.bizSettleDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizSettle = (params) => {
+		bizSettleApi.bizSettleDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 302 - 0
snowy-admin-web/src/views/biz/bizsettle/orderItem.vue

@@ -0,0 +1,302 @@
+<template>
+	<a-modal
+		ref="modalRef"
+		v-model:visible="visible"
+		width="1350px"
+		:body-style="{
+			height: 'calc(100vh - 200px)',
+			overflow: 'auto'
+		}"
+		centered
+		:destoryOnClose="true"
+		:afterClose="handleAfterClose"
+		@ok="handleOk"
+	>
+		<a-row>
+			<a-col :span="23" style="margin-left:20px;">
+				<a-spin :spinning="submitLoading">
+					<a-form ref="searchFormRef" :model="searchFormState" class="ant-advanced-search-form" name="advanced_search" style="margin-top:20px;margin-left:20px;">
+						<a-row :gutter="24">
+							<a-col :span="6">
+								<a-form-item label="订单编号" name="orderNumber">
+									<a-input v-model:value="searchFormState.orderNumber" 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>
+							<a-col :span="6">
+								<a-button type="primary" @click="table.refresh(true)">查询</a-button>
+								<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+							</a-col>
+						</a-row>
+					</a-form>
+					<s-table
+						ref="table"
+						:alert="options.alert.show"
+						:columns="columns"
+						:data="loadData"
+						:rowKey="(record) => record.id"
+						:row-selection="options.rowSelection"
+						bordered
+						sticky
+					>
+					</s-table>
+				</a-spin>
+			</a-col>
+		</a-row>
+		<template #title>
+			<div ref="modalTitleRef" style="width: 100%; cursor: move">选择物流订单</div>
+		</template>
+		<template #modalRender="{ originVNode }">
+			<div :style="transformStyle">
+				<component :is="originVNode" />
+			</div>
+		</template>
+	</a-modal>
+</template>
+<script name="orderItem" setup>
+	import { computed, watch, watchEffect } from 'vue'
+	import { useDraggable } from '@vueuse/core'
+	import { Empty, message } from 'ant-design-vue'
+	import bizOrderApi from "@/api/biz/bizOrderApi";
+
+	// 默认展开的节点
+	let defaultExpandedKeys = ref([])
+	const treeData = ref([])
+	// 替换treeNode 中 title,key,children
+	const treeFieldNames = { children: 'children', title: 'name', key: 'id' }
+	const cardLoading = ref(true)
+
+	const submitLoading = ref(false)
+	let searchFormState = reactive({})
+	const searchFormRef = ref()
+	const table = ref()
+	const storeDatas = ref([])
+
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const columns = [
+		{
+			title: '订单编号',
+			width: 100,
+			dataIndex: 'orderNumber',
+			ellipsis: true
+		},
+		{
+			title: '客户名称',
+			width: 100,
+			dataIndex: 'customerName',
+			ellipsis: true
+		},
+		{
+			title: '货品名称',
+			width: 90,
+			dataIndex: 'goodsName',
+			ellipsis: true
+		},
+		{
+			title: '货品编码',
+			width: 80,
+			dataIndex: 'goodsCode',
+			ellipsis: true
+		},
+		{
+			title: '供应商名称',
+			width: 100,
+			dataIndex: 'supplierName',
+			ellipsis: true
+		},
+		{
+			title: '订单重量(吨)',
+			width: 80,
+			dataIndex: 'orderWeight',
+			ellipsis: true
+		},
+		{
+			title: '过磅重量(吨)',
+			width: 80,
+			dataIndex: 'netWeight',
+			ellipsis: true
+		},
+		{
+			title: '托运重量(吨)',
+			width: 80,
+			dataIndex: 'shippingWeight',
+			ellipsis: true
+		},
+		{
+			title: '运费单价(元/吨)',
+			width: 80,
+			dataIndex: 'freightPrice',
+			ellipsis: true
+		}
+	]
+
+	const selectedRowKeys = ref([])
+	const selectedRecords = ref([])
+	const selectedCallBack = ref('bom')
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+				selectedRecords.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+				selectedRecords.value = selectedRows
+			}
+		}
+	}
+
+	const loadData = (parameter) => {
+		const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
+		searchFormParam.orderStatus = '7'
+		return bizOrderApi.bizOrderPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+
+	// 仓库下拉框
+	/*baseStoreApi.baseStoreSelector().then((res) => {
+		storeDatas.value = res
+	})
+
+	// 加载左侧的树
+	baseItemKindApi.baseItemKindTree().then((res) => {
+		cardLoading.value = false
+		if (res !== null) {
+			treeData.value = [
+				{
+					id: '',
+					pId: '-1',
+					name: '全部分类',
+					children: res
+				}
+			]
+			// 默认展开2级
+			treeData.value.forEach((item) => {
+				// 因为0的顶级
+				if (item.pId === '-1') {
+					defaultExpandedKeys.value.push(item.id)
+					// 取到下级ID
+					if (item.children) {
+						item.children.forEach((items) => {
+							defaultExpandedKeys.value.push(items.id)
+						})
+					}
+				}
+			})
+		}
+	})*/
+	// 点击树查询
+	const treeSelect = (selectedKeys) => {
+		if (selectedKeys.length > 0) {
+			searchFormState.kindId = selectedKeys.toString()
+		} else {
+			delete searchFormState.kindId
+		}
+		table.value.refresh(true)
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		table.value.refresh(true)
+	}
+
+	const visible = ref(false)
+	const modalTitleRef = ref(null)
+	const showModal = (selectType, callBackType) => {
+		console.log("111")
+		options.rowSelection.type = selectType === 'radio' ? 'radio' : 'checkbox'
+		selectedCallBack.value = callBackType
+		visible.value = true
+	}
+	const { x, y, isDragging } = useDraggable(modalTitleRef)
+
+	const emit = defineEmits(['bomItemCallBack', 'bomCallBack'])
+
+	const handleOk = (e) => {
+		if (selectedRecords.value && selectedRecords.value.length > 0) {
+			if (selectedCallBack.value === 'orderItem') {
+				emit('orderItemCallBack', JSON.parse(JSON.stringify(selectedRecords.value)))
+			}
+			visible.value = false
+			selectedRowKeys.value = []
+			selectedRecords.value = []
+			table.value.clearSelected()
+		} else {
+			message.error('物流订单不能为空!')
+		}
+	}
+	const startX = ref(0)
+	const startY = ref(0)
+	const startedDrag = ref(false)
+	const transformX = ref(0)
+	const transformY = ref(0)
+	const preTransformX = ref(0)
+	const preTransformY = ref(0)
+	const dragRect = ref({
+		left: 0,
+		right: 0,
+		top: 0,
+		bottom: 0
+	})
+	watch([x, y], () => {
+		if (!startedDrag.value) {
+			startX.value = x.value
+			startY.value = y.value
+			const bodyRect = document.body.getBoundingClientRect()
+			const titleRect = modalTitleRef.value.getBoundingClientRect()
+			dragRect.value.right = bodyRect.width - titleRect.width
+			dragRect.value.bottom = bodyRect.height - titleRect.height
+			preTransformX.value = transformX.value
+			preTransformY.value = transformY.value
+		}
+		startedDrag.value = true
+	})
+	watch(isDragging, () => {
+		if (!isDragging) {
+			startedDrag.value = false
+		}
+	})
+	watchEffect(() => {
+		if (startedDrag.value) {
+			transformX.value =
+				preTransformX.value + Math.min(Math.max(dragRect.value.left, x.value), dragRect.value.right) - startX.value
+			transformY.value =
+				preTransformY.value + Math.min(Math.max(dragRect.value.top, y.value), dragRect.value.bottom) - startY.value
+		}
+	})
+	const transformStyle = computed(() => {
+		return {
+			transform: `translate(${transformX.value}px, ${transformY.value}px)`
+		}
+	})
+
+	const handleAfterClose = () => {
+		console.log('handleAfterClose')
+		searchFormState = reactive({})
+	}
+	// 抛出函数
+	defineExpose({
+		showModal
+	})
+</script>
+
+<style lang="less" scoped>
+	.cardImp {
+		margin-right: 10px;
+	}
+</style>

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

@@ -195,4 +195,8 @@ public class BizAppointmentRecord extends CommonEntity {
     /**供应商*/
     @TableField(exist = false)
     private String supplierName;
+
+    /**完成装货时间*/
+    @TableField(exist = false)
+    private Date completeSendTime;
 }

+ 2 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/mapper/mapping/BizAppointmentRecordMapper.xml

@@ -42,7 +42,8 @@
             blt.end_time loadEndTime,
             blt.available_number,
             blt.already_number,
-            bs.supplier_name
+            bs.supplier_name,
+            br.complete_send_time
         from biz_appointment_record bar
          left join biz_order bo on bar.order_id = bo.id
          left join biz_supplier bs on bs.id = bo.supplier_id

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

@@ -75,4 +75,7 @@ public class BizConfig extends CommonEntity {
 
     /**车辆装载量**/
     private BigDecimal loadWeight;
+
+    /**结算金额*/
+    private BigDecimal settleAccount;
 }

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

@@ -76,4 +76,7 @@ public class BizConfigAddParam {
     /**车辆装载量**/
     private BigDecimal loadWeight;
 
+    /**结算金额*/
+    private BigDecimal settleAccount;
+
 }

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

@@ -81,4 +81,7 @@ public class BizConfigEditParam {
     /**车辆装载量**/
     private BigDecimal loadWeight;
 
+    /**结算金额*/
+    private BigDecimal settleAccount;
+
 }

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

@@ -79,6 +79,9 @@ public class BizLoadTimePageParam {
     /**物流订单id*/
     private String orderId;
 
+    /**标识*/
+    private String orderFlag;
+
 
 
 }

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

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.biz.modular.bizorderload.entity.BizOrderLoad;
@@ -160,9 +161,11 @@ public class BizLoadTimeServiceImpl extends ServiceImpl<BizLoadTimeMapper, BizLo
             Date endTime = bizGoodsConf.getConfEndTime();
             //查询物流订单已经添加过的装卸时段
             List<String> timeIdList = Lists.newArrayList();
-            bizOrderLoadService.list(new QueryWrapper<BizOrderLoad>().lambda().
-                    eq(BizOrderLoad::getOrderId, bizLoadTimePageParam.getOrderId())).
-                    forEach(time->timeIdList.add(time.getLoadTimeId()));
+            if(StringUtils.equals(bizLoadTimePageParam.getOrderFlag(),"1")){
+                bizOrderLoadService.list(new QueryWrapper<BizOrderLoad>().lambda().
+                                eq(BizOrderLoad::getOrderId, bizLoadTimePageParam.getOrderId())).
+                        forEach(time->timeIdList.add(time.getLoadTimeId()));
+            }
             // 根据时间段和装货点位ID过滤装货时间配置
             List<BizLoadTime> list = this.baseMapper.getSearch(null, pointId, startTime, endTime,timeIdList);
             return list;

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/mapper/BizOrderMapper.java

@@ -31,6 +31,8 @@ public interface BizOrderMapper extends BaseMapper<BizOrder> {
 
     List<BizOrder> getPage(@Param("ew") QueryWrapper<BizOrder> ew);
 
+    BizOrder getDetailOrder(@Param("ew") QueryWrapper<BizOrder> ew);
+
     Page<BizOrder> getOrderTotal(@Param("page") Page<BizOrder> page,@Param("ew") QueryWrapper<BizOrder> ew);
 
     List<BizOrder> getOrderTotal(@Param("ew") QueryWrapper<BizOrder> ew);

+ 47 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/mapper/mapping/BizOrderMapper.xml

@@ -75,4 +75,51 @@
         ) a
         order by a.create_time desc
     </select>
+
+    <select id="getDetailOrder" resultType="vip.xiaonuo.biz.modular.bizorder.entity.BizOrder">
+        select
+            bo.id,
+            bo.order_number,
+            bo.order_name,
+            bo.customer_id,
+            bc.name customerName,
+            bc.contact customerContactName,
+            bc.phone customerPhone,
+            bc.address customerAddress,
+            bo.good_id,
+            bg.`GOODS_NAME` goodsName,
+            bg.GOODS_MODEL goodsModel,
+            bg.GOODS_CODE goodsCode,
+            bo.order_type,
+            bo.order_source,
+            bo.order_status,
+            bo.order_weight/1000 order_weight,
+            bo.net_weight/1000 net_weight,
+            ifnull(bo.shipping_weight/1000,0) shipping_weight,
+            bgc.CONF_START_TIME,
+            bgc.CONF_END_TIME,
+            bo.sale_order_info,
+            bo.delivery_time_id,
+            bo.order_sign,
+            bo.order_reason,
+            bo.end_reason,
+            bo.ship_address,
+            bo.create_time,
+            bo.create_user,
+            bo.supplier_id,
+            bo.freight_price,
+            bso.sale_price price,
+            bso.business_name,
+            bs.supplier_name,
+            bo.freight_price,
+            boc.apply_number
+        from biz_order bo
+                 left join biz_customer bc on bo.customer_id = bc.id
+                 left join biz_goods bg on bg.id = bo.good_id
+                 left join biz_goods_conf bgc on bgc.id = bo.delivery_time_id
+                 left join biz_sale_order bso on bso.id = bo.sale_order_info
+                 left join biz_supplier bs on bs.id = bo.supplier_id
+                 left join biz_order_config boc on boc.order_id = bo.id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>

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

@@ -66,4 +66,7 @@ public class BizOrderPageParam {
     /**订单来源*/
     private String orderSource;
 
+    /**订单id*/
+    private String orderId;
+
 }

+ 2 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/BizOrderService.java

@@ -117,4 +117,6 @@ public interface BizOrderService extends IService<BizOrder> {
 
     /**导出报表*/
     void exportRecordTotal(BizOrderPageParam bizOrderPageParam, HttpServletResponse response) throws IOException;
+
+    BizOrder getDetailOrder(BizOrderPageParam bizOrderPageParam);
 }

+ 12 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/impl/BizOrderServiceImpl.java

@@ -500,6 +500,7 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
                 queryWrapper.eq("bar.order_id",bizOrder.getId());
                 queryWrapper.eq("bar.delete_flag","NOT_DELETE");
                 queryWrapper.isNull("br.unload_weight");
+                queryWrapper.notIn("bar.status","14","15");
                 List<BizAppointmentRecord> recordList = bizAppointmentRecordMapper.getRecordList(queryWrapper);
                 if(recordList.size()>0){
                     throw new CommonException("该订单下还有未完成回签的预约记录,不可以结束!");
@@ -569,6 +570,17 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         CommonExportUtil.export(fileName, BizOrderExportTotal.class,list,response,"订单计划统计");
     }
 
+    @Override
+    public BizOrder getDetailOrder(BizOrderPageParam bizOrderPageParam) {
+        QueryWrapper<BizOrder> queryWrapper = new QueryWrapper<>();
+        //订单id查询
+        if(ObjectUtil.isNotEmpty(bizOrderPageParam.getOrderId())){
+            queryWrapper.eq("bo.id",bizOrderPageParam.getOrderId());
+        }
+        BizOrder detailOrder = this.getBaseMapper().getDetailOrder(queryWrapper);
+        return detailOrder;
+    }
+
     public QueryWrapper<BizOrder> getTotalQueryWrapper(BizOrderPageParam bizOrderPageParam){
         QueryWrapper<BizOrder> queryWrapper = new QueryWrapper<>();
         if(ObjectUtil.isNotEmpty(bizOrderPageParam.getOrderName())){

+ 14 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/controller/BizOrderLoadController.java

@@ -90,6 +90,20 @@ public class BizOrderLoadController {
         return CommonResult.ok();
     }
 
+    /**
+     * 更换装卸点位
+     *
+     * @author fanzherong
+     * @date  2025/05/30 14:05
+     */
+    @Operation(summary = "更换装卸点位")
+    @CommonLog("更换装卸点位")
+    @PostMapping("/biz/bizorderload/replace")
+    public CommonResult<String> replace(@RequestBody @Valid BizOrderLoadEditParam bizOrderLoadEditParam) {
+        bizOrderLoadService.replace(bizOrderLoadEditParam);
+        return CommonResult.ok();
+    }
+
     /**
      * 删除订单装卸点位
      *

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

@@ -63,4 +63,7 @@ public class BizOrderLoad extends CommonEntity {
 
     @TableField(exist = false)
     private Integer alreadyNumber;
+
+    @TableField(exist = false)
+    private String deliveryTimeId;
 }

+ 2 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/mapper/mapping/BizOrderLoadMapper.xml

@@ -12,7 +12,8 @@
             blt.begin_time,
             blt.end_time,
             blt.available_number,
-            blt.already_number
+            blt.already_number,
+            bo.delivery_time_id
         from biz_order_load bol
          left join biz_order bo on bo.id = bol.order_id
          left join biz_load_point blp on blp.id = bol.load_point_id

+ 6 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/service/BizOrderLoadService.java

@@ -54,6 +54,12 @@ public interface BizOrderLoadService extends IService<BizOrderLoad> {
      */
     void edit(BizOrderLoadEditParam bizOrderLoadEditParam);
 
+    /**
+     * 替换装卸点位和时间
+     * @param bizOrderLoadEditParam
+     */
+    void replace(BizOrderLoadEditParam bizOrderLoadEditParam);
+
     /**
      * 删除订单装卸点位
      *

+ 104 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorderload/service/impl/BizOrderLoadServiceImpl.java

@@ -23,6 +23,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.service.BizAppointmentRecordService;
 import vip.xiaonuo.biz.modular.bizloadtime.entity.BizLoadTime;
 import vip.xiaonuo.biz.modular.bizloadtime.service.BizLoadTimeService;
 import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
@@ -58,6 +60,8 @@ public class BizOrderLoadServiceImpl extends ServiceImpl<BizOrderLoadMapper, Biz
     private BizLoadTimeService bizLoadTimeService;
     @Resource
     private BizOrderConfigService bizOrderConfigService;
+    @Resource
+    private BizAppointmentRecordService bizAppointmentRecordService;
 
     @Override
     public Page<BizOrderLoad> page(BizOrderLoadPageParam bizOrderLoadPageParam) {
@@ -130,6 +134,105 @@ public class BizOrderLoadServiceImpl extends ServiceImpl<BizOrderLoadMapper, Biz
         this.updateById(bizOrderLoad);
     }
 
+    @Transactional
+    @Override
+    public void replace(BizOrderLoadEditParam bizOrderLoadEditParam) {
+        BizOrderLoad bizOrderLoad = this.queryEntity(bizOrderLoadEditParam.getId());
+        //校验
+        checkParam(bizOrderLoad,bizOrderLoadEditParam);
+        //修改预约记录的装卸点位和装卸时间
+        updateAppointment(bizOrderLoad,bizOrderLoadEditParam);
+        //修改已约次数
+        updateAlreadyNumber(bizOrderLoad,bizOrderLoadEditParam);
+
+        BeanUtil.copyProperties(bizOrderLoadEditParam, bizOrderLoad);
+        //修改装卸点位和装卸时间
+        this.updateById(bizOrderLoad);
+    }
+
+    public void checkParam(BizOrderLoad bizOrderLoad,BizOrderLoadEditParam bizOrderLoadEditParam){
+        //校验是否在物流订单添加过
+        QueryWrapper<BizOrderLoad> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(BizOrderLoad::getOrderId,bizOrderLoadEditParam.getOrderId()).
+                eq(BizOrderLoad::getLoadPointId,bizOrderLoadEditParam.getLoadPointId()).
+                eq(BizOrderLoad::getLoadTimeId,bizOrderLoadEditParam.getLoadTimeId());
+        long count = this.count(queryWrapper);
+        if(count>0){
+            throw new CommonException("装卸点位和时间已经添加过,不可更换!");
+        }
+
+        //校验新的装卸时间段预约次数是否大于旧的已经预约数
+        //查询旧的装卸点位已约次数
+        Integer oldApplyNumber= 0;
+        BizLoadTime bizLoadTime = bizLoadTimeService.getById(bizOrderLoad.getLoadTimeId());
+        if(ObjectUtil.isNotNull(bizLoadTime)){
+            oldApplyNumber = bizLoadTime.getAlreadyNumber();
+        }
+        //查询新的装卸点位可约次数
+        Integer applyNumber = 0;
+        BizLoadTime loadTime = bizLoadTimeService.getById(bizOrderLoadEditParam.getLoadTimeId());
+        if(ObjectUtil.isNotNull(loadTime)){
+            applyNumber = loadTime.getAvailableNumber();
+        }
+        if(applyNumber<oldApplyNumber){
+            throw new CommonException("该装卸点位预约次数不足,不可更换!");
+        }
+
+        //判断物流订单提货时段的总预约次数
+        BizOrder bizOrder = bizOrderService.getById(bizOrderLoadEditParam.getOrderId());
+        if(ObjectUtil.isNotNull(bizOrder)){
+            QueryWrapper<BizOrderLoad> wrapper = new QueryWrapper<>();
+            wrapper.eq("bol.delete_flag","NOT_DELETE");
+            wrapper.eq("blt.delete_flag","NOT_DELETE");
+            wrapper.eq("bol.order_id",bizOrder.getId());
+            wrapper.notIn("bol.load_time_id",bizOrderLoad.getLoadTimeId());
+            Integer avaNumber = this.getBaseMapper().getAvaNumber(wrapper);
+            Integer orderNumber = 0;
+            //查询物流订单申请数量
+            BizOrderConfig bizOrderConfig = bizOrderConfigService.getOne(new QueryWrapper<BizOrderConfig>().lambda().
+                    eq(BizOrderConfig::getOrderId, bizOrder.getId()).
+                    last("limit 1"));
+            if(ObjectUtil.isNotNull(bizOrderConfig)){
+                orderNumber = bizOrderConfig.getApplyNumber();
+            }
+            if(applyNumber+avaNumber > orderNumber){
+                throw new CommonException("物流订单申请预约数量:"+bizOrderConfig.getApplyNumber()+",装卸时段已添加预约:"+avaNumber+",还可添加预约:"+(orderNumber-avaNumber));
+            }
+
+        }
+    }
+
+    public void updateAppointment(BizOrderLoad bizOrderLoad,BizOrderLoadEditParam bizOrderLoadEditParam){
+        //查询所有未装货的且是旧装卸点位的预约记录
+        List<BizAppointmentRecord> recordList = bizAppointmentRecordService.list(new QueryWrapper<BizAppointmentRecord>().lambda().
+                eq(BizAppointmentRecord::getOrderId, bizOrderLoad.getOrderId()).
+                eq(BizAppointmentRecord::getLoadPointId, bizOrderLoad.getLoadPointId()).
+                eq(BizAppointmentRecord::getLoadTimeId, bizOrderLoad.getLoadTimeId()).
+                in(BizAppointmentRecord::getStatus, "1", "2", "3", "4", "5", "6"));
+        for(BizAppointmentRecord bizAppointmentRecord : recordList){
+            bizAppointmentRecord.setLoadPointId(bizOrderLoadEditParam.getLoadPointId());
+            bizAppointmentRecord.setLoadTimeId(bizOrderLoadEditParam.getLoadTimeId());
+            bizAppointmentRecordService.updateById(bizAppointmentRecord);
+        }
+    }
+
+    public void updateAlreadyNumber(BizOrderLoad bizOrderLoad,BizOrderLoadEditParam bizOrderLoadEditParam){
+        Integer alreadyNumber = 0;
+        BizLoadTime bizLoadTime = bizLoadTimeService.getById(bizOrderLoad.getLoadTimeId());
+        if(ObjectUtil.isNotNull(bizLoadTime)){
+            alreadyNumber = bizLoadTime.getAlreadyNumber();
+            bizLoadTime.setAlreadyNumber(0);
+            bizLoadTimeService.updateById(bizLoadTime);
+        }
+
+        BizLoadTime loadTime = bizLoadTimeService.getById(bizOrderLoadEditParam.getLoadTimeId());
+        if(ObjectUtil.isNotNull(loadTime)){
+            loadTime.setAlreadyNumber(alreadyNumber);
+            bizLoadTimeService.updateById(loadTime);
+        }
+
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(List<BizOrderLoadIdParam> bizOrderLoadIdParamList) {
@@ -188,7 +291,7 @@ public class BizOrderLoadServiceImpl extends ServiceImpl<BizOrderLoadMapper, Biz
         queryWrapper.and(wrapper-> wrapper.le("blt.begin_time",date).gt("blt.end_time",date).or().
                 ge("blt.begin_time",date));
         queryWrapper.eq("bol.delete_flag","NOT_DELETE");
-        queryWrapper.orderByDesc("bol.create_time");
+        queryWrapper.orderByAsc("bol.create_time");
         List<BizOrderLoad> loadList = this.getBaseMapper().getPage(queryWrapper);
         return loadList;
     }

+ 131 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/controller/BizSettleController.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.bizsettle.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.bizsettle.entity.BizSettle;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
+import vip.xiaonuo.biz.modular.bizsettle.service.BizSettleService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 运费结算控制器
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ */
+@Tag(name = "运费结算控制器")
+@RestController
+@Validated
+public class BizSettleController {
+
+    @Resource
+    private BizSettleService bizSettleService;
+
+    /**
+     * 获取运费结算分页
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "获取运费结算分页")
+    @SaCheckPermission("/biz/bizsettle/page")
+    @GetMapping("/biz/bizsettle/page")
+    public CommonResult<Page<BizSettle>> page(BizSettlePageParam bizSettlePageParam) {
+        return CommonResult.data(bizSettleService.page(bizSettlePageParam));
+    }
+
+    /**
+     * 添加运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "添加运费结算")
+    @CommonLog("添加运费结算")
+    @PostMapping("/biz/bizsettle/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSettleAddParam bizSettleAddParam) {
+        bizSettleService.add(bizSettleAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "编辑运费结算")
+    @CommonLog("编辑运费结算")
+    @PostMapping("/biz/bizsettle/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSettleEditParam bizSettleEditParam) {
+        bizSettleService.edit(bizSettleEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "删除运费结算")
+    @CommonLog("删除运费结算")
+    @PostMapping("/biz/bizsettle/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSettleIdParam> bizSettleIdParamList) {
+        bizSettleService.delete(bizSettleIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取运费结算详情
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "获取运费结算详情")
+    @GetMapping("/biz/bizsettle/detail")
+    public CommonResult<BizSettle> detail(@Valid BizSettleIdParam bizSettleIdParam) {
+        return CommonResult.data(bizSettleService.detail(bizSettleIdParam));
+    }
+
+    /**
+     * 编辑获取明细
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    @Operation(summary = "编辑获取明细")
+    @GetMapping("/biz/bizsettle/detailOrder")
+    public CommonResult<BizSettle> detailOrder(@Valid BizSettleIdParam bizSettleIdParam) {
+        return CommonResult.data(bizSettleService.detailOrder(bizSettleIdParam));
+    }
+}

+ 56 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/entity/BizSettle.java

@@ -0,0 +1,56 @@
+/*
+ * 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.bizsettle.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 运费结算实体
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+@Setter
+@TableName("biz_settle")
+public class BizSettle extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 结算单号 */
+    @Schema(description = "结算单号")
+    private String settleNo;
+
+    /** 结算类型 */
+    @Schema(description = "结算类型")
+    private String settleType;
+
+    /** 结算金额 */
+    @Schema(description = "结算金额")
+    private BigDecimal settleAccount;
+
+    @TableField(exist = false)
+    private List<BizOrder> orderList;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/enums/BizSettleEnum.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.bizsettle.enums;
+
+import lombok.Getter;
+
+/**
+ * 运费结算枚举
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+public enum BizSettleEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSettleEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/mapper/BizSettleMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettle.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
+
+/**
+ * 运费结算Mapper接口
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+public interface BizSettleMapper extends BaseMapper<BizSettle> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/mapper/mapping/BizSettleMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.bizsettle.mapper.BizSettleMapper">
+
+</mapper>

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleAddParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettle.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 vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 运费结算添加参数
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+@Setter
+public class BizSettleAddParam {
+
+    /** 结算单号 */
+    @Schema(description = "结算单号")
+    private String settleNo;
+
+    /** 结算类型 */
+    @Schema(description = "结算类型")
+    private String settleType;
+
+    /** 结算金额 */
+    @Schema(description = "结算金额")
+    private BigDecimal settleAccount;
+
+    private List<BizOrder> orderList;
+
+}

+ 56 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleEditParam.java

@@ -0,0 +1,56 @@
+/*
+ * 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.bizsettle.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 vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 运费结算编辑参数
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+@Setter
+public class BizSettleEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 结算单号 */
+    @Schema(description = "结算单号")
+    private String settleNo;
+
+    /** 结算类型 */
+    @Schema(description = "结算类型")
+    private String settleType;
+
+    /** 结算金额 */
+    @Schema(description = "结算金额")
+    private BigDecimal settleAccount;
+
+    private List<BizOrder> orderList;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettleIdParam.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.bizsettle.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 运费结算Id参数
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+@Setter
+public class BizSettleIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/param/BizSettlePageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettle.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 运费结算查询参数
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Getter
+@Setter
+public class BizSettlePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 85 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/BizSettleService.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.bizsettle.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
+
+import java.util.List;
+
+/**
+ * 运费结算Service接口
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+public interface BizSettleService extends IService<BizSettle> {
+
+    /**
+     * 获取运费结算分页
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    Page<BizSettle> page(BizSettlePageParam bizSettlePageParam);
+
+    /**
+     * 添加运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    void add(BizSettleAddParam bizSettleAddParam);
+
+    /**
+     * 编辑运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    void edit(BizSettleEditParam bizSettleEditParam);
+
+    /**
+     * 删除运费结算
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    void delete(List<BizSettleIdParam> bizSettleIdParamList);
+
+    /**
+     * 获取运费结算详情
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     */
+    BizSettle detail(BizSettleIdParam bizSettleIdParam);
+
+    /**
+     * 获取运费结算详情
+     *
+     * @author xiaofan
+     * @date  2025/06/12 09:54
+     **/
+    BizSettle queryEntity(String id);
+
+    /**
+     * 编辑查询明细
+     */
+    BizSettle detailOrder(BizSettleIdParam bizSettleIdParam);
+}

+ 213 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettle/service/impl/BizSettleServiceImpl.java

@@ -0,0 +1,213 @@
+/*
+ * 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.bizsettle.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.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
+import vip.xiaonuo.biz.modular.bizorder.param.BizOrderPageParam;
+import vip.xiaonuo.biz.modular.bizorder.service.BizOrderService;
+import vip.xiaonuo.biz.modular.bizsettleorder.entity.BizSettleOrder;
+import vip.xiaonuo.biz.modular.bizsettleorder.service.BizSettleOrderService;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizsettle.entity.BizSettle;
+import vip.xiaonuo.biz.modular.bizsettle.mapper.BizSettleMapper;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleAddParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleEditParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettleIdParam;
+import vip.xiaonuo.biz.modular.bizsettle.param.BizSettlePageParam;
+import vip.xiaonuo.biz.modular.bizsettle.service.BizSettleService;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 运费结算Service接口实现类
+ *
+ * @author xiaofan
+ * @date  2025/06/12 09:54
+ **/
+@Service
+public class BizSettleServiceImpl extends ServiceImpl<BizSettleMapper, BizSettle> implements BizSettleService {
+    private final ReentrantLock lock = new ReentrantLock();
+
+    @Resource
+    private BizSettleOrderService bizSettleOrderService;
+    @Resource
+    private BizOrderService bizOrderService;
+
+    @Override
+    public Page<BizSettle> page(BizSettlePageParam bizSettlePageParam) {
+        QueryWrapper<BizSettle> queryWrapper = new QueryWrapper<BizSettle>().checkSqlInjection();
+        Page<BizSettle> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        return page;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSettleAddParam bizSettleAddParam) {
+        BizSettle bizSettle = BeanUtil.toBean(bizSettleAddParam, BizSettle.class);
+        String settleNo = getNumber();
+        bizSettle.setSettleNo(settleNo);
+        this.save(bizSettle);
+
+        if(ObjectUtil.isNotEmpty(bizSettleAddParam.getOrderList())){
+            for(BizOrder bizOrder : bizSettleAddParam.getOrderList()){
+                //新增数据关联表
+                BizSettleOrder bizSettleOrder = new BizSettleOrder();
+                bizSettleOrder.setSettleId(bizSettle.getId());
+                bizSettleOrder.setOrderId(bizOrder.getId());
+                bizSettleOrderService.save(bizSettleOrder);
+
+                UpdateWrapper<BizOrder> updateWrapper = new UpdateWrapper<>();
+                //修改订单状态
+                updateWrapper.set("order_status","9").eq("id",bizOrder.getId());
+                bizOrderService.update(updateWrapper);
+            }
+        }
+    }
+
+    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<BizSettle>().lambda().between(BizSettle::getCreateTime, time + " 00:00:00", time + " 23:59:59"));
+            String settleNo = "GSD" + format + generateCode((int)count);
+            return settleNo;
+        }finally {
+            lock.unlock(); // 释放锁
+        }
+
+    }
+
+    public static String generateCode(Integer counter) {
+        counter++;
+        return String.format("%03d", counter);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSettleEditParam bizSettleEditParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleEditParam.getId());
+        BeanUtil.copyProperties(bizSettleEditParam, bizSettle);
+        this.updateById(bizSettle);
+
+        //删除之前关联信息
+        List<BizSettleOrder> list = bizSettleOrderService.list(new QueryWrapper<BizSettleOrder>().lambda().
+                eq(BizSettleOrder::getSettleId, bizSettle.getId()));
+        //修改订单状态
+        for(BizSettleOrder bizSettleOrder: list){
+            BizOrder bizOrder = bizOrderService.getById(bizSettleOrder.getOrderId());
+            if(ObjectUtil.isNotNull(bizOrder)){
+                UpdateWrapper<BizOrder> updateWrapper = new UpdateWrapper<>();
+                //修改订单状态
+                updateWrapper.set("order_status","7").eq("id",bizOrder.getId());
+                bizOrderService.update(updateWrapper);
+            }
+        }
+        //删除关联信息表
+        bizSettleOrderService.removeByIds(CollStreamUtil.toList(list,BizSettleOrder::getId));
+
+        //新增新的关联信息
+        if(ObjectUtil.isNotEmpty(bizSettleEditParam.getOrderList())){
+            for(BizOrder bizOrder : bizSettleEditParam.getOrderList()){
+                //新增数据关联表
+                BizSettleOrder bizSettleOrder = new BizSettleOrder();
+                bizSettleOrder.setSettleId(bizSettle.getId());
+                bizSettleOrder.setOrderId(bizOrder.getId());
+                bizSettleOrderService.save(bizSettleOrder);
+
+                UpdateWrapper<BizOrder> updateWrapper = new UpdateWrapper<>();
+                //修改订单状态
+                updateWrapper.set("order_status","9").eq("id",bizOrder.getId());
+                bizOrderService.update(updateWrapper);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSettleIdParam> bizSettleIdParamList) {
+        // 执行删除
+        //this.removeByIds(CollStreamUtil.toList(bizSettleIdParamList, BizSettleIdParam::getId));
+
+        for(BizSettleIdParam bizSettleIdParam : bizSettleIdParamList){
+            //删除关联表信息
+            List<BizSettleOrder> list = bizSettleOrderService.list(new QueryWrapper<BizSettleOrder>().lambda().
+                    eq(BizSettleOrder::getSettleId, bizSettleIdParam.getId()));
+            //修改订单状态
+            for(BizSettleOrder bizSettleOrder: list){
+                BizOrder bizOrder = bizOrderService.getById(bizSettleOrder.getOrderId());
+                if(ObjectUtil.isNotNull(bizOrder)){
+                    UpdateWrapper<BizOrder> updateWrapper = new UpdateWrapper<>();
+                    //修改订单状态
+                    updateWrapper.set("order_status","7").eq("id",bizOrder.getId());
+                    bizOrderService.update(updateWrapper);
+                }
+            }
+            //删除关联信息表
+            bizSettleOrderService.removeByIds(CollStreamUtil.toList(list,BizSettleOrder::getId));
+
+
+            //删除运费结算信息
+            this.removeById(bizSettleIdParam.getId());
+        }
+    }
+
+    @Override
+    public BizSettle detail(BizSettleIdParam bizSettleIdParam) {
+        return this.queryEntity(bizSettleIdParam.getId());
+    }
+
+    @Override
+    public BizSettle queryEntity(String id) {
+        BizSettle bizSettle = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSettle)) {
+            throw new CommonException("运费结算不存在,id值为:{}", id);
+        }
+        return bizSettle;
+    }
+
+    @Override
+    public BizSettle detailOrder(BizSettleIdParam bizSettleIdParam) {
+        BizSettle bizSettle = this.queryEntity(bizSettleIdParam.getId());
+        List<BizSettleOrder> list = bizSettleOrderService.list(new QueryWrapper<BizSettleOrder>().lambda().
+                eq(BizSettleOrder::getSettleId, bizSettleIdParam.getId()));
+        List<BizOrder> orderList = Lists.newArrayList();
+        for(BizSettleOrder bizSettleOrder : list){
+            BizOrderPageParam bizOrderPageParam = new BizOrderPageParam();
+            bizOrderPageParam.setOrderId(bizSettleOrder.getOrderId());
+            BizOrder detailOrder = bizOrderService.getDetailOrder(bizOrderPageParam);
+            if(ObjectUtil.isNotNull(detailOrder)){
+                orderList.add(detailOrder);
+            }
+        }
+        bizSettle.setOrderList(orderList);
+        return bizSettle;
+    }
+}

+ 119 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/controller/BizSettleOrderController.java

@@ -0,0 +1,119 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.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.bizsettleorder.entity.BizSettleOrder;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderPageParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.service.BizSettleOrderService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 运费订单关联表控制器
+ *
+ * @author fanzherong
+ * @date  2025/06/12 15:02
+ */
+@Tag(name = "运费订单关联表控制器")
+@RestController
+@Validated
+public class BizSettleOrderController {
+
+    @Resource
+    private BizSettleOrderService bizSettleOrderService;
+
+    /**
+     * 获取运费订单关联表分页
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    @Operation(summary = "获取运费订单关联表分页")
+    @SaCheckPermission("/biz/bizsettleorder/page")
+    @GetMapping("/biz/bizsettleorder/page")
+    public CommonResult<Page<BizSettleOrder>> page(BizSettleOrderPageParam bizSettleOrderPageParam) {
+        return CommonResult.data(bizSettleOrderService.page(bizSettleOrderPageParam));
+    }
+
+    /**
+     * 添加运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    @Operation(summary = "添加运费订单关联表")
+    @CommonLog("添加运费订单关联表")
+    @PostMapping("/biz/bizsettleorder/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSettleOrderAddParam bizSettleOrderAddParam) {
+        bizSettleOrderService.add(bizSettleOrderAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    @Operation(summary = "编辑运费订单关联表")
+    @CommonLog("编辑运费订单关联表")
+    @PostMapping("/biz/bizsettleorder/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSettleOrderEditParam bizSettleOrderEditParam) {
+        bizSettleOrderService.edit(bizSettleOrderEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    @Operation(summary = "删除运费订单关联表")
+    @CommonLog("删除运费订单关联表")
+    @PostMapping("/biz/bizsettleorder/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSettleOrderIdParam> bizSettleOrderIdParamList) {
+        bizSettleOrderService.delete(bizSettleOrderIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取运费订单关联表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    @Operation(summary = "获取运费订单关联表详情")
+    @GetMapping("/biz/bizsettleorder/detail")
+    public CommonResult<BizSettleOrder> detail(@Valid BizSettleOrderIdParam bizSettleOrderIdParam) {
+        return CommonResult.data(bizSettleOrderService.detail(bizSettleOrderIdParam));
+    }
+}

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

@@ -0,0 +1,47 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.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/12 15:02
+ **/
+@Getter
+@Setter
+@TableName("biz_settle_order")
+public class BizSettleOrder extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 运费结算id */
+    @Schema(description = "运费结算id")
+    private String settleId;
+
+    /** 订单id */
+    @Schema(description = "订单id")
+    private String orderId;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/enums/BizSettleOrderEnum.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.bizsettleorder.enums;
+
+import lombok.Getter;
+
+/**
+ * 运费订单关联表枚举
+ *
+ * @author fanzherong
+ * @date  2025/06/12 15:02
+ **/
+@Getter
+public enum BizSettleOrderEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSettleOrderEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/mapper/BizSettleOrderMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.bizsettleorder.entity.BizSettleOrder;
+
+/**
+ * 运费订单关联表Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/06/12 15:02
+ **/
+public interface BizSettleOrderMapper extends BaseMapper<BizSettleOrder> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/mapper/mapping/BizSettleOrderMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.bizsettleorder.mapper.BizSettleOrderMapper">
+
+</mapper>

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

@@ -0,0 +1,42 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.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/12 15:02
+ **/
+@Getter
+@Setter
+public class BizSettleOrderAddParam {
+
+    /** 运费结算id */
+    @Schema(description = "运费结算id")
+    private String settleId;
+
+    /** 订单id */
+    @Schema(description = "订单id")
+    private String orderId;
+
+}

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

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

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

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/param/BizSettleOrderPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.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/12 15:02
+ **/
+@Getter
+@Setter
+public class BizSettleOrderPageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/service/BizSettleOrderService.java

@@ -0,0 +1,80 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsettleorder.entity.BizSettleOrder;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderPageParam;
+
+import java.util.List;
+
+/**
+ * 运费订单关联表Service接口
+ *
+ * @author fanzherong
+ * @date  2025/06/12 15:02
+ **/
+public interface BizSettleOrderService extends IService<BizSettleOrder> {
+
+    /**
+     * 获取运费订单关联表分页
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    Page<BizSettleOrder> page(BizSettleOrderPageParam bizSettleOrderPageParam);
+
+    /**
+     * 添加运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    void add(BizSettleOrderAddParam bizSettleOrderAddParam);
+
+    /**
+     * 编辑运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    void edit(BizSettleOrderEditParam bizSettleOrderEditParam);
+
+    /**
+     * 删除运费订单关联表
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    void delete(List<BizSettleOrderIdParam> bizSettleOrderIdParamList);
+
+    /**
+     * 获取运费订单关联表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     */
+    BizSettleOrder detail(BizSettleOrderIdParam bizSettleOrderIdParam);
+
+    /**
+     * 获取运费订单关联表详情
+     *
+     * @author fanzherong
+     * @date  2025/06/12 15:02
+     **/
+    BizSettleOrder queryEntity(String id);
+}

+ 94 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsettleorder/service/impl/BizSettleOrderServiceImpl.java

@@ -0,0 +1,94 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsettleorder.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.bizsettleorder.entity.BizSettleOrder;
+import vip.xiaonuo.biz.modular.bizsettleorder.mapper.BizSettleOrderMapper;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.param.BizSettleOrderPageParam;
+import vip.xiaonuo.biz.modular.bizsettleorder.service.BizSettleOrderService;
+
+import java.util.List;
+
+/**
+ * 运费订单关联表Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/06/12 15:02
+ **/
+@Service
+public class BizSettleOrderServiceImpl extends ServiceImpl<BizSettleOrderMapper, BizSettleOrder> implements BizSettleOrderService {
+
+    @Override
+    public Page<BizSettleOrder> page(BizSettleOrderPageParam bizSettleOrderPageParam) {
+        QueryWrapper<BizSettleOrder> queryWrapper = new QueryWrapper<BizSettleOrder>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(bizSettleOrderPageParam.getSortField(), bizSettleOrderPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(bizSettleOrderPageParam.getSortOrder());
+            queryWrapper.orderBy(true, bizSettleOrderPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(bizSettleOrderPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(BizSettleOrder::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSettleOrderAddParam bizSettleOrderAddParam) {
+        BizSettleOrder bizSettleOrder = BeanUtil.toBean(bizSettleOrderAddParam, BizSettleOrder.class);
+        this.save(bizSettleOrder);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSettleOrderEditParam bizSettleOrderEditParam) {
+        BizSettleOrder bizSettleOrder = this.queryEntity(bizSettleOrderEditParam.getId());
+        BeanUtil.copyProperties(bizSettleOrderEditParam, bizSettleOrder);
+        this.updateById(bizSettleOrder);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSettleOrderIdParam> bizSettleOrderIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizSettleOrderIdParamList, BizSettleOrderIdParam::getId));
+    }
+
+    @Override
+    public BizSettleOrder detail(BizSettleOrderIdParam bizSettleOrderIdParam) {
+        return this.queryEntity(bizSettleOrderIdParam.getId());
+    }
+
+    @Override
+    public BizSettleOrder queryEntity(String id) {
+        BizSettleOrder bizSettleOrder = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSettleOrder)) {
+            throw new CommonException("运费订单关联表不存在,id值为:{}", id);
+        }
+        return bizSettleOrder;
+    }
+}

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

@@ -227,4 +227,10 @@ public class BizRecord extends CommonEntity {
 
     @TableField(exist = false)
     private String goodsCode;
+
+    /**完成装货时间*/
+    private Date completeSendTime;
+
+    /**司机确认时间*/
+    private Date driverConfirmTime;
 }

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

@@ -327,6 +327,7 @@
          left join biz_appointment_record bar on bar.id = br.appointment_id
          left join biz_order bo on bo.id = br.order_id
          left join biz_customer bc on bo.customer_id = bc.id
+         left join biz_load_user blu on blu.point_id = bar.load_point_id
         ${ew.customSqlSegment}
     </select>
 </mapper>

+ 8 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/service/impl/BizRecordServiceImpl.java

@@ -75,6 +75,7 @@ import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -161,10 +162,14 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
             if(StringUtils.equals(bizRecordPageParam.getSendRecordStatus(),"1")){
                 //待确认
                 queryWrapper.isNull("br.confirm_user");
-            }else{
+            }else if(StringUtils.equals(bizRecordPageParam.getSendRecordStatus(),"2")){
                 //已确认
                 queryWrapper.isNotNull("br.confirm_user");
             }
+
+            //if(StringUtils.equals(StpLoginUserUtil.getLoginUser().getRoleCodeList())){}
+            //查询装卸地点
+            queryWrapper.eq("blu.user_id",StpLoginUserUtil.getLoginUser().getId());
         }
         if (ObjectUtil.isNotEmpty(bizRecordPageParam.getOrderName())){
             queryWrapper.like("bo.order_name",bizRecordPageParam.getOrderName());
@@ -565,6 +570,7 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
         //设置确认人
         BizRecord bizRecord = this.queryEntity(bizRecordIdParam.getId());
         bizRecord.setConfirmUser(StpLoginUserUtil.getLoginUser().getName());
+        bizRecord.setCompleteSendTime(new Date());
         this.updateById(bizRecord);
 
         //预约记录修改成完成装货
@@ -591,6 +597,7 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
                 100, 50, null), ImgUtil.IMAGE_TYPE_PNG);
 
         bizRecord.setDriverSign(base64);
+        bizRecord.setDriverConfirmTime(new Date());
         this.updateById(bizRecord);
 
         //修改预约记录状态