fanzherong_v 1 月之前
父節點
當前提交
462bb584c0
共有 31 個文件被更改,包括 1429 次插入36 次删除
  1. 36 0
      snowy-admin-web/src/api/biz/bizSaleOrderApi.js
  2. 3 1
      snowy-admin-web/src/views/biz/bizappointmentrecord/detail.vue
  3. 25 9
      snowy-admin-web/src/views/biz/bizappointmentrecord/index.vue
  4. 4 0
      snowy-admin-web/src/views/biz/bizconfig/form.vue
  5. 8 0
      snowy-admin-web/src/views/biz/bizconfig/index.vue
  6. 64 0
      snowy-admin-web/src/views/biz/bizorder/end.vue
  7. 24 12
      snowy-admin-web/src/views/biz/bizorder/form.vue
  8. 8 5
      snowy-admin-web/src/views/biz/bizorder/index.vue
  9. 9 3
      snowy-admin-web/src/views/biz/bizqueuerecord/index.vue
  10. 122 0
      snowy-admin-web/src/views/biz/bizsaleorder/form.vue
  11. 237 0
      snowy-admin-web/src/views/biz/bizsaleorder/index.vue
  12. 46 2
      snowy-admin-web/src/views/biz/record/detail.vue
  13. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/entity/BizAppointmentRecord.java
  14. 3 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/bizorder/entity/BizOrder.java
  19. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/param/BizOrderEditParam.java
  20. 65 3
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/impl/BizOrderServiceImpl.java
  21. 144 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/controller/BizSaleOrderController.java
  22. 70 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/entity/BizSaleOrder.java
  23. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/enums/BizSaleOrderEnum.java
  24. 30 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/mapper/BizSaleOrderMapper.java
  25. 20 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/mapper/mapping/BizSaleOrderMapper.xml
  26. 62 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderAddParam.java
  27. 67 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderEditParam.java
  28. 37 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderIdParam.java
  29. 63 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderPageParam.java
  30. 85 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/service/BizSaleOrderService.java
  31. 144 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/service/impl/BizSaleOrderServiceImpl.java

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

@@ -0,0 +1,36 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizsaleorder/` + url, ...arg)
+
+/**
+ * 销售订单Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/04/10 09:31
+ **/
+export default {
+	// 获取销售订单分页
+	bizSaleOrderPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交销售订单表单 edit为true时为编辑,默认为新增
+	bizSaleOrderSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除销售订单
+	bizSaleOrderDelete(data) {
+		return request('delete', data)
+	},
+	// 获取销售订单详情
+	bizSaleOrderDetail(data) {
+		return request('detail', data, 'get')
+	},
+	//根据客户id查询销售订单信息
+	queryByCustomerId(data){
+		return request('queryByCustomerId',data,'get')
+	},
+	//详情
+	detailById(data){
+		return request('detailById',data,'get')
+	}
+}

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

@@ -5,7 +5,9 @@
 				<a-descriptions-item label="订单编号" :span="2">{{ formData.orderNumber }}</a-descriptions-item>
 				<a-descriptions-item label="订单名称" :span="2">{{ formData.orderName }}</a-descriptions-item>
 				<a-descriptions-item label="车牌号" :span="2">{{ formData.licenseNumber }}</a-descriptions-item>
-				<a-descriptions-item label="提货时段" :span="2">{{ formData.beginTime + '~' + formData.endTime }}</a-descriptions-item>
+				<a-descriptions-item label="车辆轴数" :span="2">{{ formData.axleNumber+'轴' }}</a-descriptions-item>
+				<a-descriptions-item label="提货开始时间" :span="2">{{ formData.beginTime }}</a-descriptions-item>
+				<a-descriptions-item label="提货结束时间" :span="2">{{formData.endTime }}</a-descriptions-item>
 				<a-descriptions-item label="客户名称" :span="2">{{ formData.customerName }}</a-descriptions-item>
 				<a-descriptions-item label="联系人" :span="2">{{ formData.customerContactName }}</a-descriptions-item>
 				<a-descriptions-item label="货品名称" :span="2">{{ formData.goodsName }}</a-descriptions-item>

+ 25 - 9
snowy-admin-web/src/views/biz/bizappointmentrecord/index.vue

@@ -87,6 +87,12 @@
 						<p style="margin-bottom: 0">编号:{{ record.orderNumber }}</p>
 					</div>
 				</template>
+				<template v-if="column.dataIndex === 'carInfo'">
+					<div class="time-list">
+						<p>车牌号:{{ record.licenseNumber }}</p>
+						<p style="margin-bottom: 0">车轴数:{{ record.axleNumber + '轴' }}</p>
+					</div>
+				</template>
 				<template v-if="column.dataIndex === 'timeInfo'">
 					<span>{{record.beginTime + '~' + record.endTime}}</span>
 				</template>
@@ -105,6 +111,9 @@
 						<p style="margin-bottom: 0">规格:{{ record.goodsModel }}</p>
 					</div>
 				</template>
+				<template v-if="column.dataIndex === 'axleNumber'">
+					{{record.axleNumber+'轴'}}
+				</template>
 				<template v-if="column.dataIndex === 'status'">
 					<a-tag
 						:color="
@@ -243,7 +252,7 @@
 		{
 			title: '订单信息',
 			dataIndex: 'orderInfo',
-			width:230
+			width:200
 		},
 		{
 			title: '车牌号',
@@ -252,32 +261,38 @@
 			align: 'center'
 		},
 		{
-			title: '提货时段',
-			dataIndex: 'timeInfo',
+			title: '提货开始时间',
+			dataIndex: 'beginTime',
+			align:'center',
+			width:180
+		},
+		{
+			title: '提货结束时间',
+			dataIndex: 'endTime',
 			align:'center',
-			width:360
+			width:180
 		},
 		{
 			title: '客户信息',
 			dataIndex: 'customerInfo',
 			align:'center',
-			width:200
+			width:180
 		},
 		{
 			title: '货品信息',
 			dataIndex: 'goodsInfo',
-			width:180
+			width:160
 		},
 		{
 			title: '司机信息',
 			dataIndex: 'driverInfo',
-			width: 180
+			width: 160
 		},
 		{
 			title: '状态',
 			dataIndex: 'status',
 			align: 'center',
-			width:120
+			width:150
 		},
 	]
 	// 操作栏通过权限判断是否显示
@@ -285,7 +300,8 @@
 		title: '操作',
 		dataIndex: 'action',
 		align: 'center',
-		width: 150
+		width: 150,
+
 	})
 
 	const selectedRowKeys = ref([])

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

@@ -19,6 +19,9 @@
 			<a-form-item label="装卸损耗预警值:" name="lossWarn">
 				<a-input-number v-model:value="formData.lossWarn" style="width:90%"  :precision="0" :min="1" :max="99999" placeholder="请输入装卸损耗预警值" allow-clear /><span style="margin-left:10px;">%</span>
 			</a-form-item>
+			<a-form-item label="预约申请数量:" name="applyCount">
+				<a-input-number v-model:value="formData.applyCount" style="width:90%"  :precision="0" :min="1" :max="99999" 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">
@@ -100,6 +103,7 @@
 		orderWeightSwitch: [required('请输入订单重量校验开关(1:开启   2:关闭)')],
 		accessControlSwitch: [required('请输入门禁强制校验开关')],
 		lossWarn: [required('请输入装卸损耗预警值')],
+		applyCount: [required('请输入预约申请数量')],
 	}
 	// 验证并提交数据
 	const onSubmit = () => {

+ 8 - 0
snowy-admin-web/src/views/biz/bizconfig/index.vue

@@ -44,6 +44,9 @@
 				<template v-if="column.dataIndex === 'lossWarn'">
 					{{record.lossWarn}}%
 				</template>
+				<template v-if="column.dataIndex === 'applyCount'">
+					{{record.applyCount}}个
+				</template>
 			</template>
 		</s-table>
 	</a-card>
@@ -99,6 +102,11 @@
 			dataIndex: 'lossWarn',
 			align:'center'
 		},
+		{
+			title: '预约申请数量',
+			dataIndex: 'applyCount',
+			align:'center'
+		},
 	]
 	// 操作栏通过权限判断是否显示
 	columns.push({

+ 64 - 0
snowy-admin-web/src/views/biz/bizorder/end.vue

@@ -0,0 +1,64 @@
+<template>
+    <a-modal v-model:visible="visible" title="结束">
+
+        <a-form ref="formRef" :label-col="labelCol" :model="formData" layout="horizontal">
+            <a-form-item v-show="false">
+                <a-input v-model:value="formData.id"></a-input>
+            </a-form-item>
+            <a-form-item
+                    label="结束说明"
+                    name="auditingRemark"
+            >
+                <a-textarea v-model:value="formData.endReason" placeholder="请输入结束说明"
+                            :auto-size="{ minRows: 3, maxRows: 5 }"/>
+            </a-form-item>
+        </a-form>
+        <template #footer>
+            <a-spin :spinning="submitLoading">
+                <a-button type="primary" @click="onsubmit(true)">结束</a-button>
+            </a-spin>
+        </template>
+    </a-modal>
+</template>
+<script setup>
+import {message} from 'ant-design-vue';
+import bizOrderApi from '@/api/biz/bizOrderApi'
+
+const emit = defineEmits({successful: null})
+const visible = ref(false);
+const submitLoading = ref(false)
+const labelCol = ref({span: 4})
+// 表单数据
+const formData = ref({})
+const showModal = (id) => {
+    formData.value.id = id
+    visible.value = true;
+};
+const onClose = () => {
+    formData.value = {}
+    visible.value = false
+};
+const onsubmit = (flag) => {
+    if (flag === true) {
+        if (!formData.value.endReason) {
+            message.error('结束时,说明信息不能为空')
+            return
+        }
+    }
+    submitLoading.value = true
+	formData.value.auditFlag = flag
+	bizOrderApi.endOrder(formData.value).then(() => {
+        onClose()
+        emit('successful', null)
+    }).finally(() => {
+        submitLoading.value = false
+    })
+}
+// 抛出函数
+defineExpose({
+    showModal
+})
+</script>
+<style scoped>
+
+</style>

+ 24 - 12
snowy-admin-web/src/views/biz/bizorder/form.vue

@@ -21,7 +21,7 @@
 						  :options="customerIdList" @change="onChangeCustomer"
 				> </a-select>
 			</a-form-item>
-			<a-form-item label="订单信息:" name="saleOrderInfo">
+			<a-form-item label="销售订单信息:" name="saleOrderInfo">
 				<a-select v-model:value="formData.saleOrderInfo" placeholder="请选择订单信息"
 						  :options="saleOrderInfoList" @change="onChangeSaleOrder"
 				> </a-select>
@@ -55,6 +55,7 @@
 	import bizGoodsApi from '@/api/biz/bizGoodsApi'
 	import customerApi from '@/api/biz/customerApi'
 	import goodsConfApi from '@/api/biz/goodsConfApi'
+	import bizSaleOrderApi from "@/api/biz/bizSaleOrderApi";
 	// 抽屉状态
 	const open = ref(false)
 	const emit = defineEmits({ successful: null })
@@ -91,7 +92,7 @@
 			})
 		})
 
-		if(formData.value.customerId){
+		/*if(formData.value.customerId){
 			customerApi.getOrderByCustomerId({id:formData.value.customerId}).then((res)=>{
 				saleOrderInfoList.value = res.orderList.map((item)=>{
 					return{
@@ -100,6 +101,16 @@
 					}
 				})
 			})
+		}*/
+		if(formData.value.customerId){
+			bizSaleOrderApi.queryByCustomerId({id:formData.value.customerId,flag:formData.value.id?"edit":"add"}).then((res)=>{
+				saleOrderInfoList.value = res.map((item)=>{
+					return{
+						value:item.id,
+						label:item.saleOrderName
+					}
+				})
+			})
 		}
 
 		if(formData.value.saleOrderInfo){
@@ -119,11 +130,11 @@
 	const onChangeCustomer =(value)=>{
 		formData.value.saleOrderInfo = ''
 		formData.value.deliveryTimeId = ''
-		customerApi.getOrderByCustomerId({id:value}).then((res)=>{
-			saleOrderInfoList.value = res.orderList.map((item)=>{
+		bizSaleOrderApi.queryByCustomerId({id:formData.value.customerId,flag:formData.value.id?"edit":"add"}).then((res)=>{
+			saleOrderInfoList.value = res.map((item)=>{
 				return{
-					value:item.orderName+'-'+item.orderNumber+'-'+item.goodsName+'-'+item.orderWeight+'-'+item.orderType,
-					label:item.orderName
+					value:item.id,
+					label:item.saleOrderName
 				}
 			})
 		})
@@ -131,12 +142,13 @@
 
 	//订单点击时间
 	const onChangeSaleOrder = (value) =>{
-		formData.value.orderName = value.split('-')[0]
-		formData.value.orderNumber= value.split('-')[1]
-		formData.value.goodsName = value.split('-')[2]
-		formData.value.orderWeight = value.split('-')[3]
-		formData.value.orderType = value.split('-')[4]
-
+		bizSaleOrderApi.detailById({id:value}).then((res)=>{
+			formData.value.orderName = res.saleOrderName
+			formData.value.orderNumber= res.saleOrderNumber
+			formData.value.goodsName = res.saleGoodsName
+			formData.value.orderWeight = res.saleOrderWeight
+			formData.value.orderType = res.saleOrderType
+		})
 		formData.value.deliveryTimeId = ''
 		//根据货品名称和重量查询提货时间段
 		goodsConfApi.getList({goodsName:value.split('-')[2],needWeight:value.split('-')[3]}).then((res)=>{

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

@@ -178,7 +178,7 @@
 								</a-menu-item>
 
 								<a-menu-item v-if="hasPerm('bizOrderEnd') && (record.orderStatus != '5' && record.orderStatus != '6' && record.orderStatus != '7')">
-									<a style="color:red" @click="endOrder(record)">结束</a>
+									<a style="color:red" @click="endRef.showModal(record.id)">结束</a>
 								</a-menu-item>
 							</a-menu>
 						</template>
@@ -198,6 +198,7 @@
 	<Detail ref="detailRef" @successful="tableRef.refresh()" />
 	<Flow ref="flowRef" @successful="tableRef.refresh()" />
 	<Review ref="reviewRef" @successful="tableRef.refresh(true)" />
+	<End ref="endRef" @successful="tableRef.refresh(true)" />
 	<XnSignName ref="XnSignNameRef" :image="searchFormState.orderSign" @successful="signSuccess" />
 
 
@@ -246,18 +247,18 @@
 		@cancel="onCloseAccount"
 	>
 		<a-card :bordered="false">
-			<a-button type="primary" @click="addAccount()" style="margin-bottom:10px;">
+<!--			<a-button type="primary" @click="addAccount()" style="margin-bottom:10px;">
 				<template #icon><plus-outlined /></template>
 				新增
-			</a-button>
+			</a-button>-->
 			<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-divider type="vertical" />
+<!--						<a-divider type="vertical" />
 						<a-popconfirm title="确定要删除吗?" @confirm="removeUser(record)">
 							<a-button type="link" danger size="small">删除</a-button>
-						</a-popconfirm>
+						</a-popconfirm>-->
 					</template>
 					<template v-if="column.dataIndex === 'remain'">
 						{{record.applyNumber-record.applyNumberAlready}}
@@ -308,6 +309,7 @@
 	import Flow from './flow.vue'
 	import bizOrderConfigApi from "@/api/biz/bizOrderConfigApi";
 	import { required } from '@/utils/formRules'
+	import End from './end.vue'
 
 	const editAccountFlag = ref(false)
 	const moreFlag = ref(false)
@@ -319,6 +321,7 @@
 	const configRef = ref()
 	const flowRef = ref()
 	const reviewRef = ref()
+	const endRef = ref()
 	const detailRef = ref()
 	const XnSignNameRef = ref()
 	const submitLoading = ref(false)

+ 9 - 3
snowy-admin-web/src/views/biz/bizqueuerecord/index.vue

@@ -202,10 +202,16 @@
 			align: 'center'
 		},
 		{
-			title: '提货时段',
-			dataIndex: 'timeInfo',
+			title: '提货开始时间',
+			dataIndex: 'beginTime',
 			align:'center',
-			width:360
+			width:180
+		},
+		{
+			title: '提货结束时间',
+			dataIndex: 'endTime',
+			align:'center',
+			width:180
 		},
 		{
 			title: '客户信息',

+ 122 - 0
snowy-admin-web/src/views/biz/bizsaleorder/form.vue

@@ -0,0 +1,122 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑销售订单' : '增加销售订单'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="订单编号:" name="saleOrderNumber">
+				<a-input v-model:value="formData.saleOrderNumber" placeholder="请输入销售订单编号" allow-clear />
+			</a-form-item>
+			<a-form-item label="订单名称:" name="saleOrderName">
+				<a-input v-model:value="formData.saleOrderName" placeholder="请输入销售订单名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="客户信息:" name="customerId">
+				<a-select v-model:value="formData.customerId" placeholder="请选择客户信息"
+						  :options="customerIdList" @change="onChangeCustomer"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="订单类型:" name="saleOrderType">
+				<a-radio-group button-style="solid" v-model:value="formData.saleOrderType">
+					<a-radio-button value="1">
+						常规订单
+					</a-radio-button>
+					<a-radio-button value="2">
+						服务订单
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+			<a-form-item label="货品名称:" name="saleGoodsName">
+				<a-input v-model:value="formData.saleGoodsName" placeholder="请输入货品名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="订单重量:" name="saleOrderWeight">
+				<a-input-number v-model:value="formData.saleOrderWeight" style="width:90%"  :precision="0" :min="1" :max="999999"  placeholder="请输入订单重量" allow-clear /><span style="margin-left:10px;">吨</span>
+			</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="bizSaleOrderForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizSaleOrderApi from '@/api/biz/bizSaleOrderApi'
+	import customerApi from '@/api/biz/customerApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	const customerIdList = ref()
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}else{
+			formData.value.saleOrderType = '1'
+		}
+
+		//查询客户信息
+		customerApi.getList().then((res)=>{
+			customerIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.name
+				}
+			})
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		saleOrderNumber: [required('请输入销售订单编号')],
+		saleOrderName: [required('请输入销售订单名称')],
+		saleOrderType: [required('请选择订单类型')],
+		saleGoodsName: [required('请输入货品名称')],
+		saleOrderWeight: [required('请输入销售订单重量')],
+		customerId: [required('请选择客户信息')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizSaleOrderApi
+					.bizSaleOrderSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 237 - 0
snowy-admin-web/src/views/biz/bizsaleorder/index.vue

@@ -0,0 +1,237 @@
+<template>
+	<a-card :bordered="false" style="margin-bottom: 10px" class="mb-2">
+		<a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+			<a-row :gutter="24">
+				<a-col :span="6">
+					<a-form-item label="订单编号" name="saleOrderNumber">
+						<a-input v-model:value="searchFormState.saleOrderNumber" placeholder="订单编号查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="订单名称" name="saleOrderName">
+						<a-input v-model:value="searchFormState.saleOrderName" placeholder="订单名称查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="订单类型" name="saleOrderType">
+						<a-select v-model:value="searchFormState.saleOrderType" placeholder="订单状态查询"
+								  :options="orderTypeList"
+						> </a-select>
+					</a-form-item>
+				</a-col>
+
+				<template v-if="advanced">
+					<a-col :span="6">
+						<a-form-item label="货品名称" name="saleGoodsName">
+							<a-input v-model:value="searchFormState.saleGoodsName" placeholder="货品名称查询" />
+						</a-form-item>
+					</a-col>
+				</template>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @click="toggleAdvanced" style="margin-left: 8px">
+						{{ advanced ? '收起' : '展开' }}
+						<component :is="advanced ? 'up-outlined' : 'down-outlined'" />
+					</a>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizSaleOrderAdd')">
+						<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('bizSaleOrderEdit')">编辑</a>
+						<a-divider type="vertical" v-if="hasPerm(['bizSaleOrderEdit', 'bizSaleOrderDelete'], 'and')" />
+						<a-button style="color:red" type="link" danger size="small" v-if="hasPerm('bizSaleOrderDelete')" @click="deleteConfig(record)">删除</a-button>
+					</a-space>
+				</template>
+				<template v-if="column.dataIndex === 'saleOrderType'">
+					<a-tag
+						:color="
+							record.saleOrderType === '1'
+								? 'orange'
+								: record.saleOrderType === '2'
+								  ? 'green'
+								  : 'purple'
+						"
+					>
+						{{ $TOOL.dictTypeData('order_type', record.saleOrderType) }}
+					</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'saleStatus'">
+					<a-tag
+						:color="
+							record.saleStatus === '1'
+								? 'processing'
+								: record.saleStatus === '2'
+								  ? 'volcano'
+								  : 'red'
+						"
+					>
+						{{ $TOOL.dictTypeData('sale_order_status', record.saleStatus) }}
+					</a-tag>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizsaleorder">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import bizSaleOrderApi from '@/api/biz/bizSaleOrderApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import tool from '@/utils/tool'
+
+	const tableRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const submitLoading = ref(false)
+
+	//查询数据
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+	const orderTypeList = tool.dictList('order_type')
+
+	const columns = [
+		{
+			title: '订单编号',
+			dataIndex: 'saleOrderNumber',
+			align:'center'
+		},
+		{
+			title: '订单名称',
+			dataIndex: 'saleOrderName',
+			align:'center'
+		},
+		{
+			title: '订单类型',
+			dataIndex: 'saleOrderType',
+			align:'center'
+		},
+		{
+			title: '客户名称',
+			dataIndex: 'customerName',
+			align:'center'
+		},
+		{
+			title: '货品名称',
+			dataIndex: 'saleGoodsName',
+			align:'center'
+		},
+		{
+			title: '订单重量(吨)',
+			dataIndex: 'saleOrderWeight',
+			align:'center'
+		},
+		{
+			title: '状态',
+			dataIndex: 'saleStatus',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizSaleOrderApi.bizSaleOrderPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizSaleOrder = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizSaleOrderApi.bizSaleOrderDelete(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
+					}
+				]
+
+				bizSaleOrderApi
+					.bizSaleOrderDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+	// 批量删除
+	const deleteBatchBizSaleOrder = (params) => {
+		bizSaleOrderApi.bizSaleOrderDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

+ 46 - 2
snowy-admin-web/src/views/biz/record/detail.vue

@@ -21,8 +21,8 @@
 			<a-descriptions-item label="订单编号">{{ formData.orderNumber }}</a-descriptions-item>
 			<a-descriptions-item label="客户名称">{{ formData.customerName }}</a-descriptions-item>
 			<a-descriptions-item label="司机电话">{{ formData.driverMobile }}</a-descriptions-item>
-			<a-descriptions-item label="过磅人">{{ formData.extKey1 }}</a-descriptions-item>
-			<a-descriptions-item label="打印时间">{{ formData.extKey2 }}</a-descriptions-item>
+<!--			<a-descriptions-item label="过磅人">{{ formData.extKey1 }}</a-descriptions-item>
+			<a-descriptions-item label="打印时间">{{ formData.extKey2 }}</a-descriptions-item>-->
 		</a-descriptions>
 		<a-divider></a-divider>
 		<a-descriptions>
@@ -86,6 +86,7 @@
 	import tool from '@/utils/tool'
 	import { cloneDeep } from 'lodash-es'
 	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import sysConfig from '@/config/index'
 
 	// 抽屉状态
 	const open = ref(false)
@@ -109,6 +110,49 @@
 			})*/
 			let recordData = cloneDeep(record)
 			formData.value = Object.assign({}, recordData)
+			if(formData.value.grossPlateName.includes("http://218.2.6.74:8065")){
+				console.log("str:"+formData.value.grossPlateName.indexOf("preview/"))
+				formData.value.grossPlateName = formData.value.grossPlateName.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossLicenseName.includes("http://218.2.6.74:8065")){
+				formData.value.grossLicenseName = formData.value.grossLicenseName.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossCaptureHead.includes("http://218.2.6.74:8065")){
+				formData.value.grossCaptureHead = formData.value.grossCaptureHead.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossCaptureTail.includes("http://218.2.6.74:8065")){
+				formData.value.grossCaptureTail = formData.value.grossCaptureTail.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossCaptureBody.includes("http://218.2.6.74:8065")){
+				formData.value.grossCaptureBody = formData.value.grossCaptureBody.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossCaptureWare.includes("http://218.2.6.74:8065")){
+				formData.value.grossCaptureWare = formData.value.grossCaptureWare.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.grossCapturePoundRoom.includes("http://218.2.6.74:8065")){
+				formData.value.grossCapturePoundRoom = formData.value.grossCapturePoundRoom.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tarePlateName.includes("http://218.2.6.74:8065")){
+				formData.value.tarePlateName = formData.value.tarePlateName.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareLicenseName.includes("http://218.2.6.74:8065")){
+				formData.value.tareLicenseName = formData.value.tareLicenseName.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareCaptureHead.includes("http://218.2.6.74:8065")){
+				formData.value.tareCaptureHead = formData.value.tareCaptureHead.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareCaptureTail.includes("http://218.2.6.74:8065")){
+				formData.value.tareCaptureTail = formData.value.tareCaptureTail.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareCaptureBody.includes("http://218.2.6.74:8065")){
+				formData.value.tareCaptureBody = formData.value.tareCaptureBody.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareCaptureWare.includes("http://218.2.6.74:8065")){
+				formData.value.tareCaptureWare = formData.value.tareCaptureWare.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
+			if(formData.value.tareCapturePoundRoom.includes("http://218.2.6.74:8065")){
+				formData.value.tareCapturePoundRoom = formData.value.tareCapturePoundRoom.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)
+			}
 		}
 	}
 	// 关闭抽屉

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

@@ -112,4 +112,8 @@ public class BizAppointmentRecord extends CommonEntity {
     /**订单重量校验*/
     @TableField(exist = false)
     private String orderWeightSwitch;
+
+    @TableField(exist = false)
+    /**车辆轴数*/
+    private Integer axleNumber;
 }

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

@@ -19,12 +19,14 @@
             bar.driver_mobile,
             bar.status,
             bar.appointment_reason,
-            bar.over_id
+            bar.over_id,
+            bec.vehicle_axle_number axleNumber
         from biz_appointment_record bar
          left join biz_order bo on bar.order_id = bo.id
          left join biz_goods bg on bg.id = bo.good_id
          left join biz_goods_conf bgc on bgc.id = bar.time_id
          left join biz_customer bc on bc.id = bo.customer_id
+         left join biz_excess_config bec on bec.id = bar.over_id
         ${ew.customSqlSegment}
     </select>
     <select id="getRecord"

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

@@ -63,4 +63,7 @@ public class BizConfig extends CommonEntity {
 
     /**装卸损耗预警值配置(百分比)*/
     private BigDecimal lossWarn;
+
+    /**预约申请次数*/
+    private Integer applyCount;
 }

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

@@ -64,4 +64,7 @@ public class BizConfigAddParam {
     /**装卸损耗预警值配置(百分比)*/
     private Integer lossWarn;
 
+    /**预约申请次数*/
+    private Integer applyCount;
+
 }

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

@@ -69,4 +69,7 @@ public class BizConfigEditParam {
     /**装卸损耗预警值配置(百分比)*/
     private Integer lossWarn;
 
+    /**预约申请次数*/
+    private Integer applyCount;
+
 }

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

@@ -128,4 +128,7 @@ public class BizOrder extends CommonEntity{
     /**审核备注*/
     private String orderReason;
 
+    /**结束备注**/
+    private String endReason;
+
 }

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

@@ -91,4 +91,7 @@ public class BizOrderEditParam {
     /**审核标识*/
     private String auditFlag;
 
+    /**结束备注**/
+    private String endReason;
+
 }

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

@@ -27,6 +27,12 @@ import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizconfig.entity.BizConfig;
+import vip.xiaonuo.biz.modular.bizconfig.service.BizConfigService;
+import vip.xiaonuo.biz.modular.bizorderconfig.entity.BizOrderConfig;
+import vip.xiaonuo.biz.modular.bizorderconfig.service.BizOrderConfigService;
+import vip.xiaonuo.biz.modular.bizsaleorder.entity.BizSaleOrder;
+import vip.xiaonuo.biz.modular.bizsaleorder.service.BizSaleOrderService;
 import vip.xiaonuo.biz.modular.customer.entity.BizCustomer;
 import vip.xiaonuo.biz.modular.customer.service.BizCustomerService;
 import vip.xiaonuo.biz.modular.bizorder.param.*;
@@ -64,6 +70,15 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
     @Resource
     private BizGoodsConfService bizGoodsConfService;
 
+    @Resource
+    private BizOrderConfigService orderConfigService;
+
+    @Resource
+    private BizConfigService bizConfigService;
+
+    @Resource
+    private BizSaleOrderService bizSaleOrderService;
+
     @Override
     public Page<BizOrder> page(BizOrderPageParam bizOrderPageParam) {
         QueryWrapper<BizOrder> queryWrapper = getQueryWrapper(bizOrderPageParam);
@@ -123,6 +138,15 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
 
         //修改时段配置内物品重量
         bizGoodsConfService.editUsedWeight(bizGoodsConf.getId(),bizOrderAddParam.getOrderWeight().multiply(new BigDecimal(1000)).doubleValue());
+
+        //修改销售订单状态
+        if(ObjectUtil.isNotEmpty(bizOrderAddParam.getSaleOrderInfo())){
+            BizSaleOrder bizSaleOrder = bizSaleOrderService.getById(bizOrderAddParam.getSaleOrderInfo());
+            if(ObjectUtil.isNotNull(bizSaleOrder)){
+                bizSaleOrder.setSaleStatus("2");
+                bizSaleOrderService.updateById(bizSaleOrder);
+            }
+        }
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -161,6 +185,26 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
                 bizGoodsConfService.editUsedWeight(bizGoodsConf.getId(),bizOrderEditParam.getOrderWeight().multiply(new BigDecimal(1000)).doubleValue());
             }
         }
+        //判断是否修改订单
+        if(!StringUtils.equals(bizOrder.getSaleOrderInfo(),bizOrderEditParam.getSaleOrderInfo())){
+            long count = this.count(new QueryWrapper<BizOrder>().lambda().eq(BizOrder::getSaleOrderInfo, bizOrderEditParam.getSaleOrderInfo()));
+            if(count>0){
+                throw new CommonException("销售订单已经添加过!");
+            }
+            //修改之前订单状态
+            BizSaleOrder bizSaleOrder = bizSaleOrderService.getById(bizOrder.getSaleOrderInfo());
+            if(ObjectUtil.isNotNull(bizSaleOrder)){
+                bizSaleOrder.setSaleStatus("1");
+                bizSaleOrderService.updateById(bizSaleOrder);
+            }
+
+            //修改现在订单状态
+            BizSaleOrder saleOrder = bizSaleOrderService.getById(bizOrderEditParam.getSaleOrderInfo());
+            if(ObjectUtil.isNotNull(saleOrder)){
+                saleOrder.setSaleStatus("2");
+                bizSaleOrderService.updateById(saleOrder);
+            }
+        }
         BeanUtil.copyProperties(bizOrderEditParam, bizOrder);
         bizOrder.setGoodId(bizGoodsConf.getGoodsId());
         //设置订单重量
@@ -183,6 +227,13 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
                 //修改时段配置内物品重量
                 bizGoodsConfService.editUsedWeight(bizGoodsConf.getId(),bizOrder.getOrderWeight().negate().doubleValue());
             }
+
+            //查询销售订单信息
+            BizSaleOrder bizSaleOrder = bizSaleOrderService.getById(bizOrder.getSaleOrderInfo());
+            if(ObjectUtil.isNotNull(bizSaleOrder)){
+                bizSaleOrder.setSaleStatus("1");
+                bizSaleOrderService.updateById(bizSaleOrder);
+            }
         }
         // 执行删除
         this.removeByIds(CollStreamUtil.toList(bizOrderIdParamList, BizOrderIdParam::getId));
@@ -267,11 +318,21 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         this.updateById(bizOrder);
     }
 
+    @Transactional
     @Override
     public void orderConfirm(BizOrderEditParam bizOrderEditParam) {
         BizOrder bizOrder = this.queryEntity(bizOrderEditParam.getId());
         bizOrder.setOrderStatus("3");
         this.updateById(bizOrder);
+
+        //存取预约次数配置
+        BizOrderConfig bizOrderConfig = new BizOrderConfig();
+        bizOrderConfig.setOrderId(bizOrder.getId());
+        BizConfig bizConfig = bizConfigService.getOne(new QueryWrapper<BizConfig>().lambda().last("limit 1"));
+        if(ObjectUtil.isNotNull(bizConfig)){
+            bizOrderConfig.setApplyNumber(bizConfig.getApplyCount());
+        }
+        orderConfigService.save(bizOrderConfig);
     }
 
     @Override
@@ -280,15 +341,16 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         if(bizOrder.getNetWeight().compareTo(BigDecimal.ZERO) != 0){
             BigDecimal orderBalance = bizOrder.getOrderWeight().subtract(bizOrder.getNetWeight());
             BigDecimal result = orderBalance.divide(bizOrder.getOrderWeight()).multiply(new BigDecimal(100));
-            if(result.compareTo(new BigDecimal(80)) >= 0){
+            if(result.compareTo(new BigDecimal(20)) <= 0){
                 //大于80%不需要审核
                 bizOrder.setOrderStatus("7");
             }else{
                 bizOrder.setOrderStatus("5");
             }
         }else{
-            bizOrder.setOrderStatus("7");
+            bizOrder.setOrderStatus("5");
         }
+        bizOrder.setEndReason(bizOrderEditParam.getEndReason());
         this.updateById(bizOrder);
     }
 
@@ -298,7 +360,7 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         if(ObjectUtil.isNotEmpty(bizOrderEditParam.getAuditFlag())){
             if(StringUtils.equals(bizOrderEditParam.getAuditFlag(),"true")){
                 //驳回
-                bizOrder.setOrderStatus("6");
+                bizOrder.setOrderStatus("4");
                 bizOrder.setOrderReason(bizOrderEditParam.getOrderReason());
             }else{
                 bizOrder.setOrderStatus("7");

+ 144 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/controller/BizSaleOrderController.java

@@ -0,0 +1,144 @@
+/*
+ * 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.bizsaleorder.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.bizsaleorder.entity.BizSaleOrder;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderPageParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.service.BizSaleOrderService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 销售订单控制器
+ *
+ * @author fanzherong
+ * @date  2025/04/10 09:31
+ */
+@Tag(name = "销售订单控制器")
+@RestController
+@Validated
+public class BizSaleOrderController {
+
+    @Resource
+    private BizSaleOrderService bizSaleOrderService;
+
+    /**
+     * 获取销售订单分页
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "获取销售订单分页")
+    @SaCheckPermission("/biz/bizsaleorder/page")
+    @GetMapping("/biz/bizsaleorder/page")
+    public CommonResult<Page<BizSaleOrder>> page(BizSaleOrderPageParam bizSaleOrderPageParam) {
+        return CommonResult.data(bizSaleOrderService.page(bizSaleOrderPageParam));
+    }
+
+    /**
+     * 添加销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "添加销售订单")
+    @CommonLog("添加销售订单")
+    @PostMapping("/biz/bizsaleorder/add")
+    public CommonResult<String> add(@RequestBody @Valid BizSaleOrderAddParam bizSaleOrderAddParam) {
+        bizSaleOrderService.add(bizSaleOrderAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "编辑销售订单")
+    @CommonLog("编辑销售订单")
+    @PostMapping("/biz/bizsaleorder/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizSaleOrderEditParam bizSaleOrderEditParam) {
+        bizSaleOrderService.edit(bizSaleOrderEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "删除销售订单")
+    @CommonLog("删除销售订单")
+    @PostMapping("/biz/bizsaleorder/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizSaleOrderIdParam> bizSaleOrderIdParamList) {
+        bizSaleOrderService.delete(bizSaleOrderIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取销售订单详情
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "获取销售订单详情")
+    @GetMapping("/biz/bizsaleorder/detail")
+    public CommonResult<BizSaleOrder> detail(@Valid BizSaleOrderIdParam bizSaleOrderIdParam) {
+        return CommonResult.data(bizSaleOrderService.detail(bizSaleOrderIdParam));
+    }
+
+
+    /**
+     * 根据客户id查询销售订单信息
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "根据客户id查询销售订单信息")
+    @GetMapping("/biz/bizsaleorder/queryByCustomerId")
+    public CommonResult<List<BizSaleOrder>> queryByCustomerId(@Valid BizSaleOrderIdParam bizSaleOrderIdParam) {
+        return CommonResult.data(bizSaleOrderService.queryByCustomerId(bizSaleOrderIdParam));
+    }
+
+    /**
+     * 详情(重量转换)
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    @Operation(summary = "详情(重量转换)")
+    @GetMapping("/biz/bizsaleorder/detailById")
+    public CommonResult<BizSaleOrder> detailById(@Valid BizSaleOrderIdParam bizSaleOrderIdParam) {
+        return CommonResult.data(bizSaleOrderService.detailById(bizSaleOrderIdParam));
+    }
+}

+ 70 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/entity/BizSaleOrder.java

@@ -0,0 +1,70 @@
+/*
+ * 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.bizsaleorder.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/04/10 09:31
+ **/
+@Getter
+@Setter
+@TableName("biz_sale_order")
+public class BizSaleOrder extends CommonEntity {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 销售订单编号 */
+    @Schema(description = "销售订单编号")
+    private String saleOrderNumber;
+
+    /** 销售订单名称 */
+    @Schema(description = "销售订单名称")
+    private String saleOrderName;
+
+    /** 订单类型(1:常规订单   2:服务订单) */
+    @Schema(description = "订单类型(1:常规订单   2:服务订单)")
+    private String saleOrderType;
+
+    /** 货品名称 */
+    @Schema(description = "货品名称")
+    private String saleGoodsName;
+
+    /** 销售订单重量 */
+    @Schema(description = "销售订单重量")
+    private BigDecimal saleOrderWeight;
+
+    /**状态(1:待执行  2:执行中   3:结束)*/
+    private String saleStatus;
+
+    /***客户id*/
+    private String customerId;
+
+    @TableField(exist = false)
+    /**客户名称*/
+    private String customerName;
+
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/enums/BizSaleOrderEnum.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.bizsaleorder.enums;
+
+import lombok.Getter;
+
+/**
+ * 销售订单枚举
+ *
+ * @author fanzherong
+ * @date  2025/04/10 09:31
+ **/
+@Getter
+public enum BizSaleOrderEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizSaleOrderEnum(String value) {
+        this.value = value;
+    }
+}

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

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

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

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.bizsaleorder.mapper.BizSaleOrderMapper">
+
+    <select id="getPage" resultType="vip.xiaonuo.biz.modular.bizsaleorder.entity.BizSaleOrder">
+        select
+            bso.id,
+            bso.sale_order_number,
+            bso.sale_order_name,
+            bso.sale_order_type,
+            bso.sale_goods_name,
+            bso.sale_order_weight/1000 sale_order_weight,
+            bso.sale_status,
+            bso.customer_id,
+            bc.name customerName
+        from biz_sale_order bso
+        left join biz_customer bc on bc.id = bso.customer_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

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

@@ -0,0 +1,62 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizsaleorder.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/04/10 09:31
+ **/
+@Getter
+@Setter
+public class BizSaleOrderAddParam {
+
+    /** 销售订单编号 */
+    @Schema(description = "销售订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "saleOrderNumber不能为空")
+    private String saleOrderNumber;
+
+    /** 销售订单名称 */
+    @Schema(description = "销售订单名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "saleOrderName不能为空")
+    private String saleOrderName;
+
+    /** 订单类型(1:常规订单   2:服务订单) */
+    @Schema(description = "订单类型(1:常规订单   2:服务订单)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "saleOrderType不能为空")
+    private String saleOrderType;
+
+    /** 货品名称 */
+    @Schema(description = "货品名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "saleGoodsName不能为空")
+    private String saleGoodsName;
+
+    /** 销售订单重量 */
+    @Schema(description = "销售订单重量", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "saleOrderWeight不能为空")
+    private BigDecimal saleOrderWeight;
+
+    /***客户id*/
+    private String customerId;
+
+}

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

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

+ 37 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderIdParam.java

@@ -0,0 +1,37 @@
+/*
+ * 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.bizsaleorder.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/04/10 09:31
+ **/
+@Getter
+@Setter
+public class BizSaleOrderIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    private String flag;
+}

+ 63 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/param/BizSaleOrderPageParam.java

@@ -0,0 +1,63 @@
+/*
+ * 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.bizsaleorder.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/04/10 09:31
+ **/
+@Getter
+@Setter
+public class BizSaleOrderPageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+    /**订单编号*/
+    private String saleOrderNumber;
+
+    /**订单名称*/
+    private String saleOrderName;
+
+    /**订单类型**/
+    private String saleOrderType;
+
+    /**货品名称*/
+    private String saleGoodsName;
+
+}

+ 85 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/service/BizSaleOrderService.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.bizsaleorder.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.bizsaleorder.entity.BizSaleOrder;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderPageParam;
+
+import java.util.List;
+
+/**
+ * 销售订单Service接口
+ *
+ * @author fanzherong
+ * @date  2025/04/10 09:31
+ **/
+public interface BizSaleOrderService extends IService<BizSaleOrder> {
+
+    /**
+     * 获取销售订单分页
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    Page<BizSaleOrder> page(BizSaleOrderPageParam bizSaleOrderPageParam);
+
+    /**
+     * 添加销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    void add(BizSaleOrderAddParam bizSaleOrderAddParam);
+
+    /**
+     * 编辑销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    void edit(BizSaleOrderEditParam bizSaleOrderEditParam);
+
+    /**
+     * 删除销售订单
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    void delete(List<BizSaleOrderIdParam> bizSaleOrderIdParamList);
+
+    /**
+     * 获取销售订单详情
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     */
+    BizSaleOrder detail(BizSaleOrderIdParam bizSaleOrderIdParam);
+
+    /**
+     * 获取销售订单详情
+     *
+     * @author fanzherong
+     * @date  2025/04/10 09:31
+     **/
+    BizSaleOrder queryEntity(String id);
+
+    /**根据客户id查询销售订单信息*/
+    List<BizSaleOrder> queryByCustomerId(BizSaleOrderIdParam bizSaleOrderIdParam);
+
+    BizSaleOrder detailById(BizSaleOrderIdParam bizSaleOrderIdParam);
+}

+ 144 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizsaleorder/service/impl/BizSaleOrderServiceImpl.java

@@ -0,0 +1,144 @@
+/*
+ * 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.bizsaleorder.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.toolkit.StringUtils;
+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.bizsaleorder.entity.BizSaleOrder;
+import vip.xiaonuo.biz.modular.bizsaleorder.mapper.BizSaleOrderMapper;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderAddParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderEditParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderIdParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.param.BizSaleOrderPageParam;
+import vip.xiaonuo.biz.modular.bizsaleorder.service.BizSaleOrderService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 销售订单Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/04/10 09:31
+ **/
+@Service
+public class BizSaleOrderServiceImpl extends ServiceImpl<BizSaleOrderMapper, BizSaleOrder> implements BizSaleOrderService {
+
+    @Override
+    public Page<BizSaleOrder> page(BizSaleOrderPageParam bizSaleOrderPageParam) {
+        QueryWrapper<BizSaleOrder> queryWrapper = new QueryWrapper<BizSaleOrder>().checkSqlInjection();
+        //订单编号查询
+        if(ObjectUtil.isNotEmpty(bizSaleOrderPageParam.getSaleOrderNumber())){
+            queryWrapper.like("bso.sale_order_number",bizSaleOrderPageParam.getSaleOrderNumber());
+        }
+        //订单名称查询
+        if(ObjectUtil.isNotEmpty(bizSaleOrderPageParam.getSaleOrderName())){
+            queryWrapper.like("bso.sale_order_name",bizSaleOrderPageParam.getSaleOrderName());
+        }
+        //订单类型查询
+        if(ObjectUtil.isNotEmpty(bizSaleOrderPageParam.getSaleOrderType())){
+            queryWrapper.eq("bso.sale_order_type",bizSaleOrderPageParam.getSaleOrderType());
+        }
+        //货品名称查询
+        if(ObjectUtil.isNotEmpty(bizSaleOrderPageParam.getSaleGoodsName())){
+            queryWrapper.like("bso.sale_goods_name",bizSaleOrderPageParam.getSaleGoodsName());
+        }
+        queryWrapper.eq("bso.delete_flag","NOT_DELETE");
+        queryWrapper.orderByDesc("bso.create_time");
+        return this.getBaseMapper().getPage(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizSaleOrderAddParam bizSaleOrderAddParam) {
+        long count = this.count(new QueryWrapper<BizSaleOrder>().lambda().
+                eq(BizSaleOrder::getSaleOrderNumber, bizSaleOrderAddParam.getSaleOrderNumber()));
+        if(count>0){
+            throw new CommonException("订单编号已经存在!");
+        }
+        BizSaleOrder bizSaleOrder = BeanUtil.toBean(bizSaleOrderAddParam, BizSaleOrder.class);
+        bizSaleOrder.setSaleOrderWeight(bizSaleOrderAddParam.getSaleOrderWeight().multiply(new BigDecimal(1000)));
+        this.save(bizSaleOrder);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizSaleOrderEditParam bizSaleOrderEditParam) {
+        BizSaleOrder bizSaleOrder = this.queryEntity(bizSaleOrderEditParam.getId());
+        if(!StringUtils.equals(bizSaleOrder.getSaleOrderNumber(),bizSaleOrderEditParam.getSaleOrderNumber())){
+            long count = this.count(new QueryWrapper<BizSaleOrder>().lambda().
+                    eq(BizSaleOrder::getSaleOrderNumber, bizSaleOrderEditParam.getSaleOrderNumber()));
+            if(count>0){
+                throw new CommonException("订单编号已经存在!");
+            }
+        }
+        BeanUtil.copyProperties(bizSaleOrderEditParam, bizSaleOrder);
+        bizSaleOrder.setSaleOrderWeight(bizSaleOrderEditParam.getSaleOrderWeight().multiply(new BigDecimal(1000)));
+        this.updateById(bizSaleOrder);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizSaleOrderIdParam> bizSaleOrderIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizSaleOrderIdParamList, BizSaleOrderIdParam::getId));
+    }
+
+    @Override
+    public BizSaleOrder detail(BizSaleOrderIdParam bizSaleOrderIdParam) {
+        BizSaleOrder bizSaleOrder = this.queryEntity(bizSaleOrderIdParam.getId());
+        return bizSaleOrder;
+    }
+
+    @Override
+    public BizSaleOrder queryEntity(String id) {
+        BizSaleOrder bizSaleOrder = this.getById(id);
+        if(ObjectUtil.isEmpty(bizSaleOrder)) {
+            throw new CommonException("销售订单不存在,id值为:{}", id);
+        }
+        return bizSaleOrder;
+    }
+
+    @Override
+    public List<BizSaleOrder> queryByCustomerId(BizSaleOrderIdParam bizSaleOrderIdParam) {
+        QueryWrapper<BizSaleOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(BizSaleOrder::getCustomerId, bizSaleOrderIdParam.getId());
+        if(StringUtils.equals(bizSaleOrderIdParam.getFlag(),"add")){
+            queryWrapper.lambda().eq(BizSaleOrder::getSaleStatus, "1");
+        }
+        //根据客户id查询待执行状态的销售订单
+        List<BizSaleOrder> list = this.list(queryWrapper);
+        for(BizSaleOrder bizSaleOrder : list){
+            bizSaleOrder.setSaleOrderWeight(bizSaleOrder.getSaleOrderWeight().divide(new BigDecimal(1000)));
+        }
+        return list;
+    }
+
+    @Override
+    public BizSaleOrder detailById(BizSaleOrderIdParam bizSaleOrderIdParam) {
+        BizSaleOrder bizSaleOrder = this.queryEntity(bizSaleOrderIdParam.getId());
+        bizSaleOrder.setSaleOrderWeight(bizSaleOrder.getSaleOrderWeight().divide(new BigDecimal(1000)));
+        return bizSaleOrder;
+    }
+}