fanzherong_v 2 днів тому
батько
коміт
391f2abfee
21 змінених файлів з 2198 додано та 34 видалено
  1. 35 3
      snowy-admin-web/src/views/biz/bizappointload/index.vue
  2. 159 0
      snowy-admin-web/src/views/biz/bizappointload/sign.vue
  3. 1 1
      snowy-admin-web/src/views/biz/bizappointmentrecord/sign.vue
  4. 1 1
      snowy-admin-web/src/views/biz/bizotherappoint/index.vue
  5. 163 0
      snowy-admin-web/src/views/biz/bizsendload/detail.vue
  6. 177 0
      snowy-admin-web/src/views/biz/bizsendload/form.vue
  7. 528 0
      snowy-admin-web/src/views/biz/bizsendload/index.vue
  8. 1 0
      snowy-admin-web/src/views/biz/bizsendrecord/index.vue
  9. 195 0
      snowy-admin-web/src/views/biz/bizsignLoad/detail.vue
  10. 158 0
      snowy-admin-web/src/views/biz/bizsignLoad/form.vue
  11. 536 0
      snowy-admin-web/src/views/biz/bizsignLoad/index.vue
  12. 66 0
      snowy-admin-web/src/views/biz/bizsignLoad/review.vue
  13. 1 0
      snowy-admin-web/src/views/biz/bizsignrecord/index.vue
  14. 18 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/service/impl/BizAccessRecordServiceImpl.java
  15. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/controller/BizAppointmentRecordController.java
  16. 2 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/mapper/BizAppointmentRecordMapper.java
  17. 23 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/mapper/mapping/BizAppointmentRecordMapper.xml
  18. 111 27
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java
  19. 1 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/mapper/mapping/BizRecordMapper.xml
  20. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/param/BizRecordPageParam.java
  21. 14 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/service/impl/BizRecordServiceImpl.java

+ 35 - 3
snowy-admin-web/src/views/biz/bizappointload/index.vue

@@ -177,8 +177,11 @@
 									<a-menu-item v-if="hasPerm('bizAppointLoadDelete') && (record.status == '2' || record.status == '4')">
 										<a style="color:red" type="link" danger size="small" @click="deleteConfig(record)">删除</a>
 									</a-menu-item>
-									<a-menu-item v-if="hasPerm('bizAppointLoadconfirm') && record.status == '8'">
-										<a @click="XnSignNameRef.show(record.recordId)" >确认</a>
+									<a-menu-item v-if="hasPerm('bizAppointmentDriverConfim') && record.status == '8'">
+										<a @click="XnSignNameRef.show(record.recordId)" >司机确认</a>
+									</a-menu-item>
+									<a-menu-item v-if="record.status=='8' && hasPerm('bizAppointmentDriverCancel') ">
+										<a style="color:green"  @click="driverCancel(record)" >司机取消</a>
 									</a-menu-item>
 									<a-menu-item v-if="hasPerm('bizAppointLoadDriverSign') && record.status=='10' && record.orderType=='1'">
 										<a  @click="signRef.onOpen(record)" >回签</a>
@@ -243,7 +246,7 @@
 	import html2canvas from 'html2canvas'
 	import downloadUtil from '@/utils/downloadUtil'
 	import bizRecordApi from '@/api/biz/bizRecordApi'
-	//import Sign from './sign.vue'
+	import Sign from './sign.vue'
 	import bizOrderApi from "@/api/biz/bizOrderApi";
 
 	const submitLoading = ref(false)
@@ -427,6 +430,35 @@
 	}
 
 
+	//司机取消
+	const driverCancel = (record) => {
+
+		Modal.confirm({
+			title: '确定要取消吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizAppointmentRecordApi
+					.cloudCancel(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+
 	//授权出场
 	const exit = (record) => {
 

+ 159 - 0
snowy-admin-web/src/views/biz/bizappointload/sign.vue

@@ -0,0 +1,159 @@
+<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="unloadWeight">
+				<a-input-number v-model:value="formData.unloadWeight" style="width:90%"  :precision="2" :min="0.01" :max="999999"  placeholder="请输入卸货重量" allow-clear /><span style="margin-left:10px;">吨</span>
+			</a-form-item>
+<!--			<a-form-item label="单据图片:" name="licensePlate">
+				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号码" allow-clear />
+			</a-form-item>-->
+			<a-form-item label="上传图片:" name="filePathList" :rules="[{ required: true, message: '请上传图片' }]">
+				<a-upload
+					v-model:file-list="fileList"
+					class="avatar-uploader"
+					list-type="picture"
+					:show-upload-list="true"
+					:custom-request="customRequest"
+					:remove="file => removeOtherFile(file,index)"
+					:before-upload="beforeUpload"
+					accept="image/png, image/jpeg, image/jpg"
+
+				>
+					<a-button>
+						<upload-outlined></upload-outlined>
+						upload
+					</a-button>
+				</a-upload>
+			</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="bizRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import fileApi from '@/api/dev/fileApi'
+	import sysConfig from "@/config";
+	import {message, Modal, Upload } from 'ant-design-vue';
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({filePathList:[],fileNameList:[]})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	const fileList = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.id = record.recordId
+			formData.value.filePathList = []
+			formData.value.fileNameList = []
+			fileList.value = []
+			if(formData.value.unloadImg!=null){
+				for (var i=0;i<formData.value.unloadImg.split(',').length;i++){
+					fileList.value.push({
+						name: formData.value.unloadName.split(',')[i],
+						url:sysConfig.PREVIEW_PATH + formData.value.unloadImg.split(',')[i]
+					})
+					formData.value.filePathList.push(formData.value.unloadImg.split(",")[i])
+					formData.value.fileNameList.push(formData.value.unloadName.split(",")[i])
+				}
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		formData.value.fileNameList = []
+		formData.value.filePathList = []
+		fileList.value = []
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		unloadWeight: [required('请输入卸货重量')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				console.log("formData:"+formDataParam.filePahList)
+				bizRecordApi
+					.updateWeight(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+
+	const customRequest = (data) => {
+		console.log("data:"+JSON.stringify(data.file.name))
+		//保存图片
+		const fileData = new FormData()
+		fileData.append('file', data.file)
+		fileApi
+			.uploadImgMap(fileData)
+			.then((result) => {
+				formData.value.filePathList.push(result.imageFile)
+				formData.value.fileNameList.push(data.file.name)
+			}).finally(()=>{
+			data.onSuccess()
+		})
+
+	}
+
+	//文件删除
+	const removeOtherFile = (file) => {
+		fileList.value.forEach((item,index)=>{
+			console.log(item.name+"======="+file.name)
+			if(item.name === file.name){
+
+				fileList.value.splice(index, 1);
+				formData.value.filePathList.splice(index,1)
+				formData.value.fileNameList.splice(index,1)
+			}
+		})
+	}
+
+	const beforeUpload = (file) => {
+		const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
+		if (!isJpgOrPng) {
+			message.error('请上传JPG/PNG格式的图片!')
+		}
+		return isJpgOrPng || Upload.LIST_IGNORE
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

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

@@ -8,7 +8,7 @@
 	>
 		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
 			<a-form-item label="卸货重量:" name="unloadWeight">
-				<a-input-number v-model:value="formData.unloadWeight" style="width:90%"  :precision="2" :min="1" :max="999999"  placeholder="请输入卸货重量" allow-clear /><span style="margin-left:10px;">吨</span>
+				<a-input-number v-model:value="formData.unloadWeight" style="width:90%"  :precision="2" :min="0.01" :max="999999"  placeholder="请输入卸货重量" allow-clear /><span style="margin-left:10px;">吨</span>
 			</a-form-item>
 <!--			<a-form-item label="单据图片:" name="licensePlate">
 				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号码" allow-clear />

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

@@ -141,7 +141,7 @@
 										<a style="color:orange"  @click="exit(record)" >授权离场</a>
 									</a-menu-item>
 
-									<a-menu-item v-if="hasPerm('bizOtherComplete') && (record.status=='6' )">
+									<a-menu-item v-if="hasPerm('bizOtherComplete') && ((record.isWeigh == '2' && record.status=='5') || (record.isWeigh == '1' && record.status=='6'))">
 										<a style="color:orange"  @click="completeOther(record)" >完成装货</a>
 									</a-menu-item>
 

+ 163 - 0
snowy-admin-web/src/views/biz/bizsendload/detail.vue

@@ -0,0 +1,163 @@
+<template>
+	<xn-form-container
+		:title="'详情'"
+		:width="1200"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-descriptions>
+			<a-descriptions-item span="3" label="车次编码">{{ formData.carNumber }}</a-descriptions-item>
+			<a-descriptions-item label="车牌号码">{{ formData.licensePlate }}</a-descriptions-item>
+			<a-descriptions-item span="2" label="车牌颜色">{{ formData.plateColor }}</a-descriptions-item>
+<!--			<a-descriptions-item label="发货单位">{{ formData.shippingCompany }}</a-descriptions-item>
+			<a-descriptions-item label="收货单位">{{ formData.receiptCompany }}</a-descriptions-item>
+			<a-descriptions-item label="运输单位">{{ formData.transportCompany }}</a-descriptions-item>-->
+			<!-- <a-descriptions-item label="运输路线">{{ formData.transportRoute }}</a-descriptions-item> -->
+			<a-descriptions-item label="货品名称">{{ formData.goodsName }}</a-descriptions-item>
+			<a-descriptions-item label="货品编码">{{ formData.goodsModel }}</a-descriptions-item>
+			<a-descriptions-item label="司机姓名">{{ formData.driverName }}</a-descriptions-item>
+			<a-descriptions-item label="订单名称">{{ formData.orderName }}</a-descriptions-item>
+			<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.supplierName }}</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>
+			<a-descriptions-item label="毛重"
+				><a-tag color="blue">{{ formData.grossWeight }} 吨</a-tag></a-descriptions-item
+			>
+			<a-descriptions-item label="皮重"
+				><a-tag color="orange">{{ formData.tareWeight }} 吨</a-tag></a-descriptions-item
+			>
+			<a-descriptions-item label="净重"
+				><a-tag color="green">{{ formData.netWeight }} 吨</a-tag></a-descriptions-item
+			>
+		</a-descriptions>
+		<a-divider></a-divider>
+		<a-descriptions title="过毛">
+			<a-descriptions-item label="过磅时间">{{ formData.grossTime }}</a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.grossPlateName" />
+			<a-image :width="200" :src="formData.grossLicenseName" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.grossCaptureHead != null" :width="200" :src="formData.grossCaptureHead" />
+			<a-image v-if="formData.grossCaptureTail != null" :width="200" :src="formData.grossCaptureTail" />
+			<a-image v-if="formData.grossCaptureBody != null" :width="200" :src="formData.grossCaptureBody" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.grossCaptureWare != null" :width="200" :src="formData.grossCaptureWare" />
+			<a-image v-if="formData.grossCapturePoundRoom != null" :width="200" :src="formData.grossCapturePoundRoom" />
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="过皮" style="margin-top: 15px">
+			<a-descriptions-item label="过磅时间">{{ formData.tareTime }}</a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.tarePlateName" />
+			<a-image :width="200" :src="formData.tareLicenseName" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.tareCaptureHead != null" :width="200" :src="formData.tareCaptureHead" />
+			<a-image v-if="formData.tareCaptureTail != null" :width="200" :src="formData.tareCaptureTail" />
+			<a-image v-if="formData.tareCaptureBody != null" :width="200" :src="formData.tareCaptureBody" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.tareCaptureWare != null" :width="200" :src="formData.tareCaptureWare" />
+			<a-image v-if="formData.tareCapturePoundRoom != null" :width="200" :src="formData.tareCapturePoundRoom" />
+		</a-space>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizRecordForm">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import sysConfig from "@/config";
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	// const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	// const submitLoading = ref(false)
+	const tareTypeOptions = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		tareTypeOptions.value = tool.dictList('TARE_TYPE')
+		if (record) {
+			/*const param = {
+				id: record.id
+			}
+			bizRecordApi.bizRecordDetail(param).then((data) => {
+				formData.value = Object.assign({}, data)
+			})*/
+			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)
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		// formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 177 - 0
snowy-admin-web/src/views/biz/bizsendload/form.vue

@@ -0,0 +1,177 @@
+<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" layout="vertical">
+			<a-form-item label="关联本地数据ID:" name="relationId">
+				<a-input v-model:value="formData.relationId" placeholder="请输入关联本地数据ID" allow-clear />
+			</a-form-item>
+			<a-form-item label="车牌号码:" name="licensePlate">
+				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号码" allow-clear />
+			</a-form-item>
+			<a-form-item label="车牌颜色:" name="plateColor">
+				<a-input v-model:value="formData.plateColor" placeholder="请输入车牌颜色" allow-clear />
+			</a-form-item>
+			<a-form-item label="车次编码:" name="carNumber">
+				<a-input v-model:value="formData.carNumber" placeholder="请输入车次编码" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛时间:" name="grossTime">
+				<a-date-picker v-model:value="formData.grossTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择过毛时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="过皮时间:" name="tareTime">
+				<a-date-picker v-model:value="formData.tareTime" value-format="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择过皮时间" style="width: 100%" />
+			</a-form-item>
+			<a-form-item label="皮重类型:" name="tareType">
+				<a-input v-model:value="formData.tareType" placeholder="请输入皮重类型" allow-clear />
+			</a-form-item>
+			<a-form-item label="毛量:" name="grossWeight">
+				<a-input v-model:value="formData.grossWeight" placeholder="请输入毛量" allow-clear />
+			</a-form-item>
+			<a-form-item label="皮重:" name="tareWeight">
+				<a-input v-model:value="formData.tareWeight" placeholder="请输入皮重" allow-clear />
+			</a-form-item>
+			<a-form-item label="净重:" name="netWeight">
+				<a-input v-model:value="formData.netWeight" placeholder="请输入净重" allow-clear />
+			</a-form-item>
+			<a-form-item label="矿发重量:" name="kfWeight">
+				<a-input v-model:value="formData.kfWeight" placeholder="请输入矿发重量" allow-clear />
+			</a-form-item>
+			<a-form-item label="司机姓名:" name="driverName">
+				<a-input v-model:value="formData.driverName" placeholder="请输入司机姓名" allow-clear />
+			</a-form-item>
+			<a-form-item label="司机电话:" name="driverMobile">
+				<a-input v-model:value="formData.driverMobile" placeholder="请输入司机电话" allow-clear />
+			</a-form-item>
+			<a-form-item label="货品名称:" name="goodsName">
+				<a-input v-model:value="formData.goodsName" placeholder="请输入货品名称" allow-clear />
+			</a-form-item>
+			<a-form-item label="规格型号:" name="goodsModel">
+				<a-input v-model:value="formData.goodsModel" placeholder="请输入规格型号" allow-clear />
+			</a-form-item>
+			<a-form-item label="收货单位:" name="receiptCompany">
+				<a-input v-model:value="formData.receiptCompany" placeholder="请输入收货单位" allow-clear />
+			</a-form-item>
+			<a-form-item label="发货单位:" name="shippingCompany">
+				<a-input v-model:value="formData.shippingCompany" placeholder="请输入发货单位" allow-clear />
+			</a-form-item>
+			<a-form-item label="运输路线:" name="transportCompany">
+				<a-input v-model:value="formData.transportCompany" placeholder="请输入运输路线" allow-clear />
+			</a-form-item>
+			<a-form-item label="运输单位:" name="transportRoute">
+				<a-input v-model:value="formData.transportRoute" placeholder="请输入运输单位" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车牌图片:" name="grossPlateName">
+				<a-input v-model:value="formData.grossPlateName" placeholder="请输入过毛车牌图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车图片:" name="grossLicenseName">
+				<a-input v-model:value="formData.grossLicenseName" placeholder="请输入过毛车图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车头相机抓拍:" name="grossCaptureHead">
+				<a-input v-model:value="formData.grossCaptureHead" placeholder="请输入过毛车头相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车尾相机抓拍:" name="grossCaptureTail">
+				<a-input v-model:value="formData.grossCaptureTail" placeholder="请输入过毛车尾相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车仓相机抓拍:" name="grossCaptureWare">
+				<a-input v-model:value="formData.grossCaptureWare" placeholder="请输入过毛车仓相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛车身相机抓拍:" name="grossCaptureBody">
+				<a-input v-model:value="formData.grossCaptureBody" placeholder="请输入过毛车身相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过毛磅房相机抓拍:" name="grossCapturePoundRoom">
+				<a-input v-model:value="formData.grossCapturePoundRoom" placeholder="请输入过毛磅房相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车牌图片:" name="tarePlateName">
+				<a-input v-model:value="formData.tarePlateName" placeholder="请输入过皮车牌图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车图片:" name="tareLicenseName">
+				<a-input v-model:value="formData.tareLicenseName" placeholder="请输入过皮车图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车头相机抓拍:" name="tareCaptureHead">
+				<a-input v-model:value="formData.tareCaptureHead" placeholder="请输入过皮车头相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车尾相机抓拍:" name="tareCaptureTail">
+				<a-input v-model:value="formData.tareCaptureTail" placeholder="请输入过皮车尾相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车仓相机抓拍:" name="tareCaptureWare">
+				<a-input v-model:value="formData.tareCaptureWare" placeholder="请输入过皮车仓相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮车身相机抓拍:" name="tareCaptureBody">
+				<a-input v-model:value="formData.tareCaptureBody" placeholder="请输入过皮车身相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="过皮磅房相机抓拍:" name="tareCapturePoundRoom">
+				<a-input v-model:value="formData.tareCapturePoundRoom" placeholder="请输入过皮磅房相机抓拍" allow-clear />
+			</a-form-item>
+			<a-form-item label="备注1:" name="extKey1">
+				<a-input v-model:value="formData.extKey1" placeholder="请输入备注1" allow-clear />
+			</a-form-item>
+			<a-form-item label="备注2:" name="extKey2">
+				<a-input v-model:value="formData.extKey2" placeholder="请输入备注2" allow-clear />
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		relationId: [required('请输入关联本地数据ID')],
+		licensePlate: [required('请输入车牌号码')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizRecordApi
+					.bizRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 528 - 0
snowy-admin-web/src/views/biz/bizsendload/index.vue

@@ -0,0 +1,528 @@
+<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="carNumber">
+						<a-input v-model:value="searchFormState.carNumber" placeholder="请输入车次编码" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="车牌号码" name="licensePlate">
+						<a-input v-model:value="searchFormState.licensePlate" placeholder="请输入车牌号码" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="过毛时间" name="grossTime">
+						<a-range-picker
+							v-model:value="searchFormState.grossTime"
+							value-format="YYYY-MM-DD"
+						/>
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="司机姓名" name="driverName">
+						<a-input v-model:value="searchFormState.driverName" placeholder="请输入司机姓名" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="司机电话" name="driverMobile">
+						<a-input v-model:value="searchFormState.driverMobile" placeholder="请输入司机电话" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="货品名称" name="goodsName">
+						<a-input v-model:value="searchFormState.goodsName" placeholder="请输入货品名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="规格型号" name="goodsModel">
+						<a-input v-model:value="searchFormState.goodsModel" placeholder="请输入规格型号" />
+					</a-form-item>
+				</a-col>
+<!--				<a-col :span="6" v-show="advanced">
+					<a-form-item label="收货单位" name="receiptCompany">
+						<a-input v-model:value="searchFormState.receiptCompany" placeholder="请输入收货单位" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="发货单位" name="shippingCompany">
+						<a-input v-model:value="searchFormState.shippingCompany" placeholder="请输入发货单位" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="运输单位" name="transportCompany">
+						<a-input v-model:value="searchFormState.transportCompany" placeholder="请输入运输单位" />
+					</a-form-item>
+				</a-col>-->
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="订单编号" name="orderNumber">
+						<a-input v-model:value="searchFormState.orderNumber" placeholder="请输入订单编号" />
+					</a-form-item>
+				</a-col>
+<!--				<a-col :span="6" v-show="advanced">
+					<a-form-item label="订单名称" name="orderName">
+						<a-input v-model:value="searchFormState.orderName" placeholder="请输入订单名称" />
+					</a-form-item>
+				</a-col>-->
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="客户名称" name="customerName">
+						<a-input v-model:value="searchFormState.customerName" placeholder="请输入客户名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="确认状态" name="sendRecordStatus">
+						<a-select v-model:value="searchFormState.sendRecordStatus" placeholder="确认状态查询"
+								  :options="sendRecordStatusList"
+						> </a-select>
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="供应商名称" name="supplierName">
+						<a-input v-model:value="searchFormState.supplierName" placeholder="请输入供应商名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @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('bizRecordToConfirm')">
+						待确认
+					</a-button>
+					<a-button style="background-color: orange;" type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizRecordAlreadyConfirm')">
+						已确认
+					</a-button>
+				</a-space>-->
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'licensePlate'">
+					<span v-if="record.plateColor === '蓝色'" class="blue-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '黄色'" class="yellow-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '绿色'" class="green-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '白色'" class="white-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '黑色'" class="black-background">{{ record.licensePlate }}</span>
+					<span v-else class="blue-background">{{ record.licensePlate }}</span>
+				</template>
+
+				<template v-if="column.dataIndex === 'enterTime'">
+					<div class="time-list">
+						<p>
+							<span class="blueTag">过毛</span>
+							<span style="font-weight: normal">{{ record.grossTime }}</span>
+						</p>
+						<p style="margin-bottom: 0">
+							<span class="orangeTag">过皮</span>
+							<span style="font-weight: normal">{{ record.tareTime }}</span>
+						</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'weight'">
+					<div class="time-list">
+						<p>
+							<span class="blueTag">毛重</span>
+							<span class="showNum">{{ record.grossWeight }} </span>
+						</p>
+						<p>
+							<span class="orangeTag">皮重</span>
+							<span class="showNum">{{ record.tareWeight }}</span>
+						</p>
+						<p>
+							<span class="greenTag">净重</span>
+							<span class="showNum">{{ record.netWeight }}</span>
+						</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'company'">
+					<div class="company-list">
+						<p>收货:{{ record.receiptCompany }}</p>
+						<p>发货:{{ record.shippingCompany }}</p>
+						<p style="margin-bottom: 0">运输:{{ record.transportCompany }}</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'goods'">
+					<div class="time-list">
+						<p>名称:{{ record.goodsName }}</p>
+						<p style="margin-bottom: 0">编码:{{ record.goodsModel }}</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'driver'">
+					<div class="time-list">
+						<p>姓名:{{ record.driverName }}</p>
+						<p style="margin-bottom: 0">电话:{{ record.driverMobile }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'orderInfo'">
+					<div class="time-list">
+						<p>名称:{{ record.orderName }}</p>
+						<p style="margin-bottom: 0">编号:{{ record.orderNumber }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="detailRef.onOpen(record)">详情</a>
+						<a-divider type="vertical"  v-if="hasPerm('bizRecordConfirm') && record.status=='6' " />
+						<a  @click="confirmRecord(record)" v-if="hasPerm('bizLoadConfirm') && record.status=='6' ">确认</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Detail ref="detailRef" />
+</template>
+
+<script setup name="record">
+	import { message, Modal } from 'ant-design-vue'
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import Detail from './detail.vue'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import downloadUtil from '@/utils/downloadUtil'
+	import {createVNode} from "vue";
+	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
+	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()
+	const formRef = ref()
+	const detailRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+
+	const submitLoading = ref(false)
+	const sendRecordStatusList = tool.dictList('send_record_status')
+
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+	const columns = [
+		{
+			title: '车次编码',
+			dataIndex: 'carNumber',
+			width: 120,
+			align: 'center'
+		},
+		{
+			title: '车牌号码',
+			dataIndex: 'licensePlate',
+			width: '130px',
+			align: 'center'
+		},
+		{
+			title: '过车时间',
+			dataIndex: 'enterTime',
+			width: '130px'
+		},
+		{
+			title: '重量(吨)',
+			dataIndex: 'weight',
+			align: 'center'
+		},
+		/*{
+			title: '订单信息',
+			dataIndex: 'orderInfo'
+		},*/
+		{
+			title: '订单编号',
+			dataIndex: 'orderNumber',
+			align:'center'
+		},
+		{
+			title: '客户名称',
+			dataIndex: 'customerName',
+			align:'center'
+		},
+		{
+			title: '货品',
+			dataIndex: 'goods'
+		},
+		{
+			title: '司机信息',
+			dataIndex: 'driver',
+			width: '150px'
+		},
+		/*{
+			title: '供应商',
+			dataIndex: 'supplierName',
+			width: '150px'
+		}*/
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		// grossTime范围查询条件重载
+		if (searchFormParam.grossTime) {
+			searchFormParam.startGrossTime = searchFormParam.grossTime[0]
+			searchFormParam.endGrossTime = searchFormParam.grossTime[1]
+			delete searchFormParam.grossTime
+		}
+		// tareTime范围查询条件重载
+		if (searchFormParam.tareTime) {
+			searchFormParam.startTareTime = searchFormParam.tareTime[0]
+			searchFormParam.endTareTime = searchFormParam.tareTime[1]
+			delete searchFormParam.tareTime
+		}
+		console.log("userInfo:"+JSON.stringify(userInfo.roleCodeList))
+		if(userInfo.roleCodeList.includes('send')){
+			if(searchFormParam.sendRecordStatus == null || searchFormParam.sendRecordStatus==''){
+				searchFormParam.sendRecordStatus = '3'
+			}
+		}
+		searchFormParam.appointmentType = '3'
+		return bizRecordApi.bizRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	const dateRangeOnChange = (date, dateString) => {
+		searchFormState.startGrossTime = dateString[0]
+		searchFormState.endGrossTime = dateString[1]
+	}
+	const dateRangeOnChangeTare = (date, dateString) => {
+		searchFormState.startTareTime = dateString[0]
+		searchFormState.endTareTime = dateString[1]
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		searchFormState.startGrossTime = null
+		searchFormState.endGrossTime = null
+		searchFormState.startTareTime = null
+		searchFormState.endTareTime = null
+		tableRef.value.refresh(true)
+	}
+	const exportData = () => {
+		const paramData = {
+			licensePlate: searchFormState.value.licensePlate,
+			carNumber: searchFormState.value.carNumber,
+			goodsName: searchFormState.value.goodsName,
+			goodsModel: searchFormState.value.goodsModel,
+			receiptCompany: searchFormState.value.receiptCompany,
+			shippingCompany: searchFormState.value.shippingCompany,
+			transportCompany: searchFormState.value.transportCompany,
+			driverName: searchFormState.value.driverName,
+			driverMobile: searchFormState.value.driverMobile,
+			startGrossTime: searchFormState.startGrossTime,
+			endGrossTime: searchFormState.endGrossTime,
+			startTareTime: searchFormState.startTareTime,
+			endTareTime: searchFormState.endTareTime
+		}
+		Modal.confirm({
+			title: '提示',
+			content: '确定要导出过磅记录?',
+			maskClosable: true,
+			onOk: () => {
+				bizRecordApi.bizRecordExport(paramData).then((res) => {
+					downloadUtil.resultDownload(res)
+					tableRef.value.clearSelected()
+				})
+			}
+		})
+	}
+
+	//确认
+	const confirmRecord = (record) => {
+
+		Modal.confirm({
+			title: '提示',
+			content: '确定完成发货吗?',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizRecordApi
+					.confirmRecord(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+</script>
+
+<style lang="less" scoped>
+	/** 表头居中 */
+	:deep .ant-table-thead > tr > th {
+		text-align: center;
+	}
+
+	.time-list {
+		-webkit-text-size-adjust: none;
+		font-size: 13px;
+		display: flex;
+		flex-direction: column;
+
+		p {
+			white-space: nowrap;
+			span {
+				display: inline-block;
+				font-weight: 600;
+				height: 16px;
+				line-height: 16px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				padding: 0 5px;
+			}
+			.blueTag {
+				color: #1890ff;
+				background: rgba(24, 144, 255, 0.1);
+			}
+			.orangeTag {
+				color: #ff7c18;
+				background: rgba(24, 144, 255, 0.1);
+			}
+			.greenTag {
+				color: rgb(82, 196, 26);
+				background: rgba(82, 196, 26, 0.1);
+			}
+			.purpleTag {
+				color: rgb(77, 26, 196);
+				background: rgba(82, 196, 26, 0.1);
+			}
+			.showNum {
+				display: inline-block;
+				height: 16px;
+				line-height: 16px;
+				width: 45px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				text-align: right;
+			}
+		}
+	}
+
+	.order-list,
+	.company-list {
+		-webkit-text-size-adjust: none;
+		font-size: 13px;
+		display: flex;
+		flex-direction: column;
+		p {
+			white-space: nowrap;
+			margin-bottom: 5px;
+			.weightSpan,
+			.company {
+				display: inline-block;
+				width: 17px;
+				height: 17px;
+				line-height: 16px;
+				border-radius: 50%;
+				color: #fff;
+				text-align: center;
+			}
+			.company {
+				margin-right: 5px;
+			}
+			.weight,
+			.receiptCompany {
+				background-color: #1890ff;
+			}
+			.tare {
+				background-color: #2f54eb;
+			}
+			.netWeight,
+			.shippingCompany {
+				background-color: #52c41a;
+			}
+			.transportCompany {
+				background-color: #c61263;
+			}
+			.showNum {
+				display: inline-block;
+				height: 16px;
+				line-height: 16px;
+				width: 45px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				text-align: right;
+			}
+			em {
+				font-style: normal;
+			}
+		}
+	}
+	.blue-background {
+		background-color: #0d84ff;
+		border-radius: 5px; /* 你可以根据需要调整圆角的大小 */
+		padding: 5px; /* 可选:添加一些内边距 */
+		color: white; /* 可选:设置文字颜色 */
+		font-size: large;
+	}
+	.yellow-background {
+		background-color: yellow;
+		border-radius: 5px;
+		padding: 5px;
+		color: black;
+		font-size: large;
+	}
+	.green-background {
+		background: linear-gradient(to bottom, white, #39b54a);
+		border-radius: 5px;
+		padding: 5px;
+		color: black; /* 文字颜色改为黑色以便在渐变背景上更清晰 */
+		font-size: large;
+		border: 1px solid #ccc; /* 增加边框 */
+		box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 增加阴影 */
+	}
+
+	.white-background {
+		background-color: white;
+		border-radius: 5px;
+		padding: 5px;
+		color: black;
+		font-size: large;
+		border: 1px solid #ccc; /* 增加边框 */
+		box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 增加阴影 */
+	}
+
+	.black-background {
+		background-color: black;
+		border-radius: 5px;
+		padding: 5px;
+		color: white;
+		font-size: large;
+	}
+</style>

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

@@ -301,6 +301,7 @@
 				searchFormParam.sendRecordStatus = '3'
 			}
 		}
+		searchFormParam.appointmentType = '1'
 		return bizRecordApi.bizRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})

+ 195 - 0
snowy-admin-web/src/views/biz/bizsignLoad/detail.vue

@@ -0,0 +1,195 @@
+<template>
+	<xn-form-container
+		:title="'详情'"
+		:width="1200"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-descriptions>
+			<a-descriptions-item span="3" label="车次编码">{{ formData.carNumber }}</a-descriptions-item>
+			<a-descriptions-item label="车牌号码">{{ formData.licensePlate }}</a-descriptions-item>
+			<a-descriptions-item span="2" label="车牌颜色">{{ formData.plateColor }}</a-descriptions-item>
+<!--			<a-descriptions-item label="发货单位">{{ formData.shippingCompany }}</a-descriptions-item>
+			<a-descriptions-item label="收货单位">{{ formData.receiptCompany }}</a-descriptions-item>
+			<a-descriptions-item label="运输单位">{{ formData.transportCompany }}</a-descriptions-item>-->
+			<!-- <a-descriptions-item label="运输路线">{{ formData.transportRoute }}</a-descriptions-item> -->
+			<a-descriptions-item label="货品名称">{{ formData.goodsName }}</a-descriptions-item>
+			<a-descriptions-item label="货品编码">{{ formData.goodsModel }}</a-descriptions-item>
+			<a-descriptions-item label="司机姓名">{{ formData.driverName }}</a-descriptions-item>
+			<a-descriptions-item label="订单名称">{{ formData.orderName }}</a-descriptions-item>
+			<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.supplierName }}</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>
+			<a-descriptions-item label="毛重"
+				><a-tag color="blue">{{ formData.grossWeight }} 吨</a-tag></a-descriptions-item
+			>
+			<a-descriptions-item label="皮重"
+				><a-tag color="orange">{{ formData.tareWeight }} 吨</a-tag></a-descriptions-item
+			>
+			<a-descriptions-item label="净重"
+				><a-tag color="green">{{ formData.netWeight }} 吨</a-tag></a-descriptions-item
+			>
+		</a-descriptions>
+		<a-divider></a-divider>
+		<a-descriptions title="过毛">
+			<a-descriptions-item label="过磅时间">{{ formData.grossTime }}</a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.grossPlateName" />
+			<a-image :width="200" :src="formData.grossLicenseName" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.grossCaptureHead != null" :width="200" :src="formData.grossCaptureHead" />
+			<a-image v-if="formData.grossCaptureTail != null" :width="200" :src="formData.grossCaptureTail" />
+			<a-image v-if="formData.grossCaptureBody != null" :width="200" :src="formData.grossCaptureBody" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.grossCaptureWare != null" :width="200" :src="formData.grossCaptureWare" />
+			<a-image v-if="formData.grossCapturePoundRoom != null" :width="200" :src="formData.grossCapturePoundRoom" />
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="过皮" style="margin-top: 15px">
+			<a-descriptions-item label="过磅时间">{{ formData.tareTime }}</a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.tarePlateName" />
+			<a-image :width="200" :src="formData.tareLicenseName" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.tareCaptureHead != null" :width="200" :src="formData.tareCaptureHead" />
+			<a-image v-if="formData.tareCaptureTail != null" :width="200" :src="formData.tareCaptureTail" />
+			<a-image v-if="formData.tareCaptureBody != null" :width="200" :src="formData.tareCaptureBody" />
+		</a-space>
+		<a-space style="margin-top: 15px; margin-left: 10px">
+			<a-image v-if="formData.tareCaptureWare != null" :width="200" :src="formData.tareCaptureWare" />
+			<a-image v-if="formData.tareCapturePoundRoom != null" :width="200" :src="formData.tareCapturePoundRoom" />
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="司机确认" style="margin-top: 15px">
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.driverSign" />
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="司机回签" style="margin-top: 15px">
+			<a-descriptions-item label="卸货重量"><a-tag color="green">{{ formData.unloadWeight }} 吨</a-tag></a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<div v-for="(item,index) in fileList " :key="item.value">
+				<a-image :width="200" :src="item.url" />
+			</div>
+
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="签收审核" style="margin-top: 15px">
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.auditSign" />
+		</a-space>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizRecordForm">
+	import tool from '@/utils/tool'
+	import { cloneDeep } from 'lodash-es'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import sysConfig from "@/config";
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	// const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	// const submitLoading = ref(false)
+	const tareTypeOptions = ref([])
+
+	const fileList = ref([])
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		tareTypeOptions.value = tool.dictList('TARE_TYPE')
+		if (record) {
+			/*const param = {
+				id: record.id
+			}
+			bizRecordApi.bizRecordDetail(param).then((data) => {
+				formData.value = Object.assign({}, data)
+			})*/
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			fileList.value = []
+			if(formData.value.unloadImg!=null){
+				for (var i=0;i<formData.value.unloadImg.split(',').length;i++){
+					fileList.value.push({
+						name: formData.value.unloadName.split(',')[i],
+						url:sysConfig.PREVIEW_PATH + formData.value.unloadImg.split(',')[i]
+					})
+				}
+			}
+			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)
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		// formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 158 - 0
snowy-admin-web/src/views/biz/bizsignLoad/form.vue

@@ -0,0 +1,158 @@
+<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="unloadWeight">
+				<a-input-number v-model:value="formData.unloadWeight" style="width:90%"  :precision="2" :min="1" :max="999999"  placeholder="请输入卸货重量" allow-clear /><span style="margin-left:10px;">吨</span>
+			</a-form-item>
+<!--			<a-form-item label="单据图片:" name="licensePlate">
+				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号码" allow-clear />
+			</a-form-item>-->
+			<a-form-item label="上传图片:" name="filePathList" :rules="[{ required: true, message: '请上传图片' }]">
+				<a-upload
+					v-model:file-list="fileList"
+					class="avatar-uploader"
+					list-type="picture"
+					:show-upload-list="true"
+					:custom-request="customRequest"
+					:remove="file => removeOtherFile(file,index)"
+					:before-upload="beforeUpload"
+					accept="image/png, image/jpeg, image/jpg"
+
+				>
+					<a-button>
+						<upload-outlined></upload-outlined>
+						upload
+					</a-button>
+				</a-upload>
+			</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="bizRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import fileApi from '@/api/dev/fileApi'
+	import sysConfig from "@/config";
+	import {message, Modal, Upload } from 'ant-design-vue';
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({filePathList:[],fileNameList:[]})
+	const submitLoading = ref(false)
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	const fileList = ref([])
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.filePathList = []
+			formData.value.fileNameList = []
+			fileList.value = []
+			if(formData.value.unloadImg!=null){
+				for (var i=0;i<formData.value.unloadImg.split(',').length;i++){
+					fileList.value.push({
+						name: formData.value.unloadName.split(',')[i],
+						url:sysConfig.PREVIEW_PATH + formData.value.unloadImg.split(',')[i]
+					})
+					formData.value.filePathList.push(formData.value.unloadImg.split(",")[i])
+					formData.value.fileNameList.push(formData.value.unloadName.split(",")[i])
+				}
+			}
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		formData.value.fileNameList = []
+		formData.value.filePathList = []
+		fileList.value = []
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		unloadWeight: [required('请输入卸货重量')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				console.log("formData:"+formDataParam.filePahList)
+				bizRecordApi
+					.updateWeight(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+
+	const customRequest = (data) => {
+		console.log("data:"+JSON.stringify(data.file.name))
+		//保存图片
+		const fileData = new FormData()
+		fileData.append('file', data.file)
+		fileApi
+			.uploadImgMap(fileData)
+			.then((result) => {
+				formData.value.filePathList.push(result.imageFile)
+				formData.value.fileNameList.push(data.file.name)
+			}).finally(()=>{
+			data.onSuccess()
+		})
+
+	}
+
+	//文件删除
+	const removeOtherFile = (file) => {
+		fileList.value.forEach((item,index)=>{
+			console.log(item.name+"======="+file.name)
+			if(item.name === file.name){
+
+				fileList.value.splice(index, 1);
+				formData.value.filePathList.splice(index,1)
+				formData.value.fileNameList.splice(index,1)
+			}
+		})
+	}
+
+	const beforeUpload = (file) => {
+		const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
+		if (!isJpgOrPng) {
+			message.error('请上传JPG/PNG格式的图片!')
+		}
+		return isJpgOrPng || Upload.LIST_IGNORE
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 536 - 0
snowy-admin-web/src/views/biz/bizsignLoad/index.vue

@@ -0,0 +1,536 @@
+<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="carNumber">
+						<a-input v-model:value="searchFormState.carNumber" placeholder="请输入车次编码" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="车牌号码" name="licensePlate">
+						<a-input v-model:value="searchFormState.licensePlate" placeholder="请输入车牌号码" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="过毛时间" name="grossTime">
+						<a-range-picker
+							v-model:value="searchFormState.grossTime"
+							value-format="YYYY-MM-DD"
+						/>
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="过皮时间" name="tareTime">
+						<a-range-picker
+							v-model:value="searchFormState.tareTime"
+							value-format="YYYY-MM-DD"
+						/>
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="司机姓名" name="driverName">
+						<a-input v-model:value="searchFormState.driverName" placeholder="请输入司机姓名" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="司机电话" name="driverMobile">
+						<a-input v-model:value="searchFormState.driverMobile" placeholder="请输入司机电话" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="货品名称" name="goodsName">
+						<a-input v-model:value="searchFormState.goodsName" placeholder="请输入货品名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="规格型号" name="goodsModel">
+						<a-input v-model:value="searchFormState.goodsModel" placeholder="请输入规格型号" />
+					</a-form-item>
+				</a-col>
+<!--				<a-col :span="6" v-show="advanced">
+					<a-form-item label="收货单位" name="receiptCompany">
+						<a-input v-model:value="searchFormState.receiptCompany" placeholder="请输入收货单位" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="发货单位" name="shippingCompany">
+						<a-input v-model:value="searchFormState.shippingCompany" placeholder="请输入发货单位" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="运输单位" name="transportCompany">
+						<a-input v-model:value="searchFormState.transportCompany" placeholder="请输入运输单位" />
+					</a-form-item>
+				</a-col>-->
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="订单编号" name="orderNumber">
+						<a-input v-model:value="searchFormState.orderNumber" placeholder="请输入订单编号" />
+					</a-form-item>
+				</a-col>
+<!--				<a-col :span="6" v-show="advanced">
+					<a-form-item label="订单名称" name="orderName">
+						<a-input v-model:value="searchFormState.orderName" placeholder="请输入订单名称" />
+					</a-form-item>
+				</a-col>-->
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="客户名称" name="customerName">
+						<a-input v-model:value="searchFormState.customerName" placeholder="请输入客户名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="供应商名称" name="supplierName">
+						<a-input v-model:value="searchFormState.supplierName" placeholder="请输入供应商名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @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="dashed" class="snowy-buttom-left" @click="exportData()" v-if="hasPerm('bizRecordBatchExport')"
+						><export-outlined />记录导出</a-button
+					>-->
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'licensePlate'">
+					<span v-if="record.plateColor === '蓝色'" class="blue-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '黄色'" class="yellow-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '绿色'" class="green-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '白色'" class="white-background">{{ record.licensePlate }}</span>
+					<span v-else-if="record.plateColor === '黑色'" class="black-background">{{ record.licensePlate }}</span>
+					<span v-else class="blue-background">{{ record.licensePlate }}</span>
+				</template>
+
+				<template v-if="column.dataIndex === 'enterTime'">
+					<div class="time-list">
+						<p>
+							<span class="blueTag">过毛</span>
+							<span style="font-weight: normal">{{ record.grossTime }}</span>
+						</p>
+						<p style="margin-bottom: 0">
+							<span class="orangeTag">过皮</span>
+							<span style="font-weight: normal">{{ record.tareTime }}</span>
+						</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'weight'">
+					<div class="time-list">
+						<p>
+							<span class="blueTag">毛重</span>
+							<span class="showNum">{{ record.grossWeight }} </span>
+						</p>
+						<p>
+							<span class="orangeTag">皮重</span>
+							<span class="showNum">{{ record.tareWeight }}</span>
+						</p>
+						<p>
+							<span class="greenTag">净重</span>
+							<span class="showNum">{{ record.netWeight }}</span>
+						</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'company'">
+					<div class="company-list">
+						<p>收货:{{ record.receiptCompany }}</p>
+						<p>发货:{{ record.shippingCompany }}</p>
+						<p style="margin-bottom: 0">运输:{{ record.transportCompany }}</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'goods'">
+					<div class="time-list">
+						<p>名称:{{ record.goodsName }}</p>
+						<p style="margin-bottom: 0">编码:{{ record.goodsModel }}</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'driver'">
+					<div class="time-list">
+						<p>姓名:{{ record.driverName }}</p>
+						<p style="margin-bottom: 0">电话:{{ record.driverMobile }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'orderInfo'">
+					<div class="time-list">
+						<p>名称:{{ record.orderName }}</p>
+						<p style="margin-bottom: 0">编号:{{ record.orderNumber }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="detailRef.onOpen(record)">详情</a>
+<!--						<a-divider type="vertical"  v-if="hasPerm('bizRecordSign') && record.status=='10' " />
+						<a  @click="formRef.onOpen(record)" v-if="hasPerm('bizRecordSign') && record.status=='10' ">签收</a>-->
+						<a-divider type="vertical"  v-if="hasPerm('bizRecordAudit') && record.status=='12' " />
+						<a  @click="XnSignNameRef.show(record.id)" v-if="hasPerm('bizRecordAudit') && record.status=='12' ">审核</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Review ref="reviewRef" @successful="tableRef.refresh(true)" />
+	<Detail ref="detailRef" />
+	<XnSignName ref="XnSignNameRef" :image="searchFormState.driverSign" @successful="signSuccess" />
+</template>
+
+<script setup name="record">
+	import { message, Modal } from 'ant-design-vue'
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import Detail from './detail.vue'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import downloadUtil from '@/utils/downloadUtil'
+	import {createVNode} from "vue";
+	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
+	import bizAppointmentRecordApi from "@/api/biz/bizAppointmentRecordApi";
+	import Review from './review.vue'
+
+	const reviewRef = ref()
+	const searchFormState = ref({signLoad:1})
+	const searchFormRef = ref()
+	const tableRef = ref()
+	const formRef = ref()
+	const detailRef = ref()
+	const XnSignNameRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+
+	const submitLoading = ref(false)
+
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+	const columns = [
+		{
+			title: '车次编码',
+			dataIndex: 'carNumber',
+			width: 120,
+			align: 'center'
+		},
+		{
+			title: '车牌号码',
+			dataIndex: 'licensePlate',
+			width: '130px',
+			align: 'center'
+		},
+		{
+			title: '过车时间',
+			dataIndex: 'enterTime',
+			width: '130px'
+		},
+		{
+			title: '重量(吨)',
+			dataIndex: 'weight',
+			align: 'center'
+		},
+		/*{
+			title: '订单信息',
+			dataIndex: 'orderInfo'
+		},*/
+		{
+			title: '订单编号',
+			dataIndex: 'orderNumber',
+			align:'center'
+		},
+		{
+			title: '客户名称',
+			dataIndex: 'customerName',
+			align:'center'
+		},
+		{
+			title: '货品',
+			dataIndex: 'goods'
+		},
+		{
+			title: '司机信息',
+			dataIndex: 'driver',
+			width: '150px'
+		},
+		/*{
+			title: '供应商',
+			dataIndex: 'supplierName',
+			width: '150px'
+		}*/
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		// grossTime范围查询条件重载
+		if (searchFormParam.grossTime) {
+			searchFormParam.startGrossTime = searchFormParam.grossTime[0]
+			searchFormParam.endGrossTime = searchFormParam.grossTime[1]
+			delete searchFormParam.grossTime
+		}
+		// tareTime范围查询条件重载
+		if (searchFormParam.tareTime) {
+			searchFormParam.startTareTime = searchFormParam.tareTime[0]
+			searchFormParam.endTareTime = searchFormParam.tareTime[1]
+			delete searchFormParam.tareTime
+		}
+		searchFormParam.appointmentType = '3'
+		return bizRecordApi.bizRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	const dateRangeOnChange = (date, dateString) => {
+		searchFormState.startGrossTime = dateString[0]
+		searchFormState.endGrossTime = dateString[1]
+	}
+	const dateRangeOnChangeTare = (date, dateString) => {
+		searchFormState.startTareTime = dateString[0]
+		searchFormState.endTareTime = dateString[1]
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		searchFormState.startGrossTime = null
+		searchFormState.endGrossTime = null
+		searchFormState.startTareTime = null
+		searchFormState.endTareTime = null
+		tableRef.value.refresh(true)
+	}
+	const exportData = () => {
+		const paramData = {
+			licensePlate: searchFormState.value.licensePlate,
+			carNumber: searchFormState.value.carNumber,
+			goodsName: searchFormState.value.goodsName,
+			goodsModel: searchFormState.value.goodsModel,
+			receiptCompany: searchFormState.value.receiptCompany,
+			shippingCompany: searchFormState.value.shippingCompany,
+			transportCompany: searchFormState.value.transportCompany,
+			driverName: searchFormState.value.driverName,
+			driverMobile: searchFormState.value.driverMobile,
+			startGrossTime: searchFormState.startGrossTime,
+			endGrossTime: searchFormState.endGrossTime,
+			startTareTime: searchFormState.startTareTime,
+			endTareTime: searchFormState.endTareTime
+		}
+		Modal.confirm({
+			title: '提示',
+			content: '确定要导出过磅记录?',
+			maskClosable: true,
+			onOk: () => {
+				bizRecordApi.bizRecordExport(paramData).then((res) => {
+					downloadUtil.resultDownload(res)
+					tableRef.value.clearSelected()
+				})
+			}
+		})
+	}
+
+	//确认
+	const confirmRecord = (record) => {
+
+		Modal.confirm({
+			title: '提示',
+			content: '确定完成发货吗?',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizRecordApi
+					.confirmRecord(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+
+	// 签名板组件回调
+	const signSuccess = (value) => {
+		const param = {
+			id:value.id,
+			auditSign: value.value
+		}
+		bizRecordApi.auditRecord(param).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+</script>
+
+<style lang="less" scoped>
+	/** 表头居中 */
+	:deep .ant-table-thead > tr > th {
+		text-align: center;
+	}
+
+	.time-list {
+		-webkit-text-size-adjust: none;
+		font-size: 13px;
+		display: flex;
+		flex-direction: column;
+
+		p {
+			white-space: nowrap;
+			span {
+				display: inline-block;
+				font-weight: 600;
+				height: 16px;
+				line-height: 16px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				padding: 0 5px;
+			}
+			.blueTag {
+				color: #1890ff;
+				background: rgba(24, 144, 255, 0.1);
+			}
+			.orangeTag {
+				color: #ff7c18;
+				background: rgba(24, 144, 255, 0.1);
+			}
+			.greenTag {
+				color: rgb(82, 196, 26);
+				background: rgba(82, 196, 26, 0.1);
+			}
+			.purpleTag {
+				color: rgb(77, 26, 196);
+				background: rgba(82, 196, 26, 0.1);
+			}
+			.showNum {
+				display: inline-block;
+				height: 16px;
+				line-height: 16px;
+				width: 45px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				text-align: right;
+			}
+		}
+	}
+
+	.order-list,
+	.company-list {
+		-webkit-text-size-adjust: none;
+		font-size: 13px;
+		display: flex;
+		flex-direction: column;
+		p {
+			white-space: nowrap;
+			margin-bottom: 5px;
+			.weightSpan,
+			.company {
+				display: inline-block;
+				width: 17px;
+				height: 17px;
+				line-height: 16px;
+				border-radius: 50%;
+				color: #fff;
+				text-align: center;
+			}
+			.company {
+				margin-right: 5px;
+			}
+			.weight,
+			.receiptCompany {
+				background-color: #1890ff;
+			}
+			.tare {
+				background-color: #2f54eb;
+			}
+			.netWeight,
+			.shippingCompany {
+				background-color: #52c41a;
+			}
+			.transportCompany {
+				background-color: #c61263;
+			}
+			.showNum {
+				display: inline-block;
+				height: 16px;
+				line-height: 16px;
+				width: 45px;
+				border-radius: 5px;
+				text-align: center;
+				margin-right: 2px;
+				text-align: right;
+			}
+			em {
+				font-style: normal;
+			}
+		}
+	}
+	.blue-background {
+		background-color: #0d84ff;
+		border-radius: 5px; /* 你可以根据需要调整圆角的大小 */
+		padding: 5px; /* 可选:添加一些内边距 */
+		color: white; /* 可选:设置文字颜色 */
+		font-size: large;
+	}
+	.yellow-background {
+		background-color: yellow;
+		border-radius: 5px;
+		padding: 5px;
+		color: black;
+		font-size: large;
+	}
+	.green-background {
+		background: linear-gradient(to bottom, white, #39b54a);
+		border-radius: 5px;
+		padding: 5px;
+		color: black; /* 文字颜色改为黑色以便在渐变背景上更清晰 */
+		font-size: large;
+		border: 1px solid #ccc; /* 增加边框 */
+		box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 增加阴影 */
+	}
+
+	.white-background {
+		background-color: white;
+		border-radius: 5px;
+		padding: 5px;
+		color: black;
+		font-size: large;
+		border: 1px solid #ccc; /* 增加边框 */
+		box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 增加阴影 */
+	}
+
+	.black-background {
+		background-color: black;
+		border-radius: 5px;
+		padding: 5px;
+		color: white;
+		font-size: large;
+	}
+</style>

+ 66 - 0
snowy-admin-web/src/views/biz/bizsignLoad/review.vue

@@ -0,0 +1,66 @@
+<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.auditReason" placeholder="请输入审核备注"
+                            :auto-size="{ minRows: 3, maxRows: 5 }"/>
+            </a-form-item>
+        </a-form>
+        <template #footer>
+            <a-spin :spinning="submitLoading">
+                <a-button style="margin-right: 8px" @click="onsubmit(true)" type="primary" danger>审核驳回</a-button>
+                <a-button type="primary" @click="onsubmit(false)">审核通过</a-button>
+            </a-spin>
+        </template>
+    </a-modal>
+</template>
+<script setup>
+import {message} from 'ant-design-vue';
+import bizOrderApi from '@/api/biz/bizOrderApi'
+import bizRecordApi from "@/api/biz/bizRecordApi";
+
+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.auditReason) {
+            message.error('审核驳回时,备注信息不能为空')
+            return
+        }
+    }
+    submitLoading.value = true
+	formData.value.auditFlag = flag
+	bizRecordApi.auditRecord(formData.value).then(() => {
+        onClose()
+        emit('successful', null)
+    }).finally(() => {
+        submitLoading.value = false
+    })
+}
+// 抛出函数
+defineExpose({
+    showModal
+})
+</script>
+<style scoped>
+
+</style>

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

@@ -297,6 +297,7 @@
 			searchFormParam.endTareTime = searchFormParam.tareTime[1]
 			delete searchFormParam.tareTime
 		}
+		searchFormParam.appointmentType = '1'
 		return bizRecordApi.bizRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
 			return data
 		})

+ 18 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/service/impl/BizAccessRecordServiceImpl.java

@@ -78,10 +78,27 @@ public class BizAccessRecordServiceImpl extends ServiceImpl<BizAccessRecordMappe
                 //进场 待入场->已入场
                 if(StringUtils.equals(appointmentRecord.getAppointmentType(),"1")){
                     appointmentRecord.setStatus("5");
-                }else{
+                }
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"2")){
                     //临时预约
                     appointmentRecord.setStatus("9");
                 }
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"5")){
+                    //临时预约
+                    appointmentRecord.setStatus("5");
+                }
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"6")){
+                    //其他预约
+                    appointmentRecord.setStatus("5");
+                }
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"4")){
+                    //充电预约
+                    appointmentRecord.setStatus("5");
+                }
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"3")){
+                    //起卸预约
+                    appointmentRecord.setStatus("5");
+                }
 
             }else{
                 //出场 待出场->已出场

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/controller/BizAppointmentRecordController.java

@@ -13,6 +13,7 @@
 package vip.xiaonuo.biz.modular.bizappointmentrecord.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -222,6 +223,8 @@ public class BizAppointmentRecordController {
             return CommonResult.get(203,"没有完成装货记录,不可二次过磅!",null);
         }else if(StringUtils.equals(bizAppointmentRecord.getIsFlag(),"9")){
             return CommonResult.get(204,"没有待出场记录,不可出门禁!",null);
+        }else if(ObjectUtil.isEmpty(bizAppointmentRecord.getIsFlag())){
+            return CommonResult.get(205,"流程异常,请联系管理员",null);
         }
         return CommonResult.get(200,"操作成功",bizAppointmentRecord);
     }

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

@@ -38,6 +38,8 @@ public interface BizAppointmentRecordMapper extends BaseMapper<BizAppointmentRec
 
     List<BizAppointmentRecord> getRecordList(@Param("ew") QueryWrapper<BizAppointmentRecord> ew);
 
+    List<BizAppointmentRecord> getLoadList(@Param("ew") QueryWrapper<BizAppointmentRecord> ew);
+
     Page<BizAppointmentRecord> getLoadPage(@Param("page") Page<BizAppointmentRecord> page,@Param("ew") QueryWrapper<BizAppointmentRecord> ew);
 
     List<BizAppointmentRecord> getLoadPage(@Param("ew") QueryWrapper<BizAppointmentRecord> ew);

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

@@ -118,6 +118,7 @@
             ) b ON a.DICT_VALUE = b.STATUS
     </select>
 
+    <!--校验沙石预约是否回签-->
     <select id="getRecordList"
             resultType="vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord">
         SELECT
@@ -137,6 +138,28 @@
                 left join biz_order bo on bo.id = bar.order_id
             ${ew.customSqlSegment}
     </select>
+
+    <!--校验起卸预约是否回签-->
+    <select id="getLoadList"
+            resultType="vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord">
+        SELECT
+            bar.id,
+            bar.order_id,
+            bar.license_number,
+            bar.time_id,
+            bar.driver_name,
+            bar.driver_mobile,
+            bar.STATUS,
+            bar.appointment_reason,
+            bar.create_user,
+            bar.queue_number
+        FROM
+            biz_appointment_record bar
+                LEFT JOIN biz_record br ON br.appointment_id = bar.id
+                left join biz_load_appoint bla on bla.id = bar.order_id
+            ${ew.customSqlSegment}
+    </select>
+
     <select id="getLoadPage"
             resultType="vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord">
         SELECT

+ 111 - 27
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java

@@ -239,15 +239,28 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
         BizAppointmentRecord bizAppointmentRecord = BeanUtil.toBean(bizAppointmentRecordAddParam, BizAppointmentRecord.class);
         bizAppointmentRecord.setTimeId(bizOrderService.queryEntity(bizAppointmentRecordAddParam.getOrderId()).getDeliveryTimeId());
         bizAppointmentRecord.setAppointmentType("1");
-        if (ObjectUtil.isNotNull(bizConfig)) {
-            if (StringUtils.equals(bizConfig.getAuditSwitch(), "1")) {
-                //开启审核,设置待审核状态
-                bizAppointmentRecord.setStatus("1");
-            } else {
-                //未开启审核,设置排队中状态
-                //bizAppointmentRecord.setStatus("3");
-                //未开启审核,设置待入场状态,可直接过门禁
-                bizAppointmentRecord.setStatus("4");
+        //查询是否有充电结束的预约记录
+        BizAppointmentRecord appointmentRecord = this.getOne(new QueryWrapper<BizAppointmentRecord>().lambda().
+                eq(BizAppointmentRecord::getLicenseNumber, bizAppointmentRecordAddParam.getLicenseNumber()).
+                eq(BizAppointmentRecord::getAppointmentType, "4").
+                eq(BizAppointmentRecord::getStatus, "18").
+                last("limit 1"));
+        if(ObjectUtil.isNotNull(appointmentRecord)){
+            //存在充电结束的充电预约
+            bizAppointmentRecord.setStatus("5");
+            appointmentRecord.setStatus("19");
+            this.updateById(appointmentRecord);
+        }else{
+            if (ObjectUtil.isNotNull(bizConfig)) {
+                if (StringUtils.equals(bizConfig.getAuditSwitch(), "1")) {
+                    //开启审核,设置待审核状态
+                    bizAppointmentRecord.setStatus("1");
+                } else {
+                    //未开启审核,设置排队中状态
+                    //bizAppointmentRecord.setStatus("3");
+                    //未开启审核,设置待入场状态,可直接过门禁
+                    bizAppointmentRecord.setStatus("4");
+                }
             }
         }
         if(ObjectUtil.isNotEmpty(bizAppointmentRecordAddParam.getDriverId())){
@@ -384,7 +397,7 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
             //校验车牌号是否添加过预约,排除11:已签收、 13:销售已审核  、 14:已取消
             long count = this.count(new QueryWrapper<BizAppointmentRecord>().lambda().
                     eq(BizAppointmentRecord::getLicenseNumber, bizAppointmentRecordAddParam.getLicenseNumber()).
-                    notIn(BizAppointmentRecord::getStatus, "10", "11", "12", "13", "14", "15"));
+                    notIn(BizAppointmentRecord::getStatus, "10", "11", "12", "13", "14", "15","18","19"));
             if (count > 0) {
                 throw new CommonException("车牌号:{}已经添加过预约!", bizAppointmentRecordAddParam.getLicenseNumber());
             }
@@ -812,7 +825,25 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
                     if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "1")) {
                         //订单预约
                         bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
-                    } else {
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "5")){
+                        //管桩预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "2")){
+                        //临时预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if  (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"6")){
+                        //其他预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"4")){
+                        //充电预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"3")){
+                        //起卸预约
                         bizAppointmentRecord.setIsFlag("1");
                     }
                 } else {
@@ -828,9 +859,19 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
                 if (StringUtils.equals(bizAppointmentRecord.getStatus(), "5")) {
                     if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "1")) {
                         bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
-                    } else {
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "2")){
+                        //临时预约
                         bizAppointmentRecord.setIsFlag("5");
                     }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"6")){
+                        //其他预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"3")){
+                        //起卸预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
                 } else {
                     bizAppointmentRecord.setIsFlag("5");
                 }
@@ -844,9 +885,18 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
                 if (StringUtils.equals(bizAppointmentRecord.getStatus(), "7")) {
                     if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "1")) {
                         bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
-                    } else {
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "2")){
                         bizAppointmentRecord.setIsFlag("7");
                     }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "6")){
+                        //其他预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "3")){
+                        //起卸预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
                 } else if (StringUtils.equals(bizAppointmentRecord.getStatus(), "8")) {
                     if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "1")) {
                         bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
@@ -866,11 +916,35 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
                 if (StringUtils.equals(bizAppointmentRecord.getStatus(), "9")) {
                     if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "1")) {
                         bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
-                    } else {
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "2")){
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(), "5")){
+                        //临时预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"6")){
+                        //其他预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"4")){
+                        //充电预约
+                        bizAppointmentRecord.setIsFlag("1");
+                    }
+                    if (StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"3")){
+                        //起卸预约
                         bizAppointmentRecord.setIsFlag("1");
                     }
                 } else {
-                    bizAppointmentRecord.setIsFlag("9");
+                    if(StringUtils.equals(bizAppointmentRecord.getAppointmentType(),"4")){
+                        //充电预约
+                        if(StringUtils.equals(bizAppointmentRecord.getStatus(),"5")){
+                            bizAppointmentRecord.setIsFlag("1");
+                        }
+                    }else{
+                        bizAppointmentRecord.setIsFlag("9");
+                    }
                 }
 
             }
@@ -1152,14 +1226,19 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
         //获取流程配置判断预约是否需要审核
         BizConfig bizConfig = bizConfigService.getOne(new QueryWrapper<BizConfig>().lambda().last("limit 1"));
         BizAppointmentRecord bizAppointmentRecord = BeanUtil.toBean(bizAppointmentRecordAddParam, BizAppointmentRecord.class);
-        if (ObjectUtil.isNotNull(bizConfig)) {
-            if (StringUtils.equals(bizConfig.getTemporaryAuditSwitch(), "1")) {
-                //开启审核,设置待审核状态
-                bizAppointmentRecord.setStatus("1");
-            } else {
-                //未开启审核,设置待入场状态
-                bizAppointmentRecord.setStatus("4");
-            }
+        //查询车辆是否存在充电结束的预约记录
+        BizAppointmentRecord appointmentRecord = this.getOne(new QueryWrapper<BizAppointmentRecord>().lambda().
+                eq(BizAppointmentRecord::getLicenseNumber, bizAppointmentRecordAddParam.getLicenseNumber()).
+                eq(BizAppointmentRecord::getAppointmentType, "4").
+                eq(BizAppointmentRecord::getStatus, "18").
+                last("limit 1"));
+        if(ObjectUtil.isNotNull(appointmentRecord)){
+            //存在充电结束的充电预约
+            bizAppointmentRecord.setStatus("5");
+            appointmentRecord.setStatus("19");
+            this.updateById(appointmentRecord);
+        }else{
+            bizAppointmentRecord.setStatus("4");
         }
         bizAppointmentRecord.setAppointmentType("3");
         this.save(bizAppointmentRecord);
@@ -1196,7 +1275,7 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
             //校验车牌号是否添加过预约,排除11:已签收、 13:销售已审核  、 14:已取消
             long count = this.count(new QueryWrapper<BizAppointmentRecord>().lambda().
                     eq(BizAppointmentRecord::getLicenseNumber, bizAppointmentRecordAddParam.getLicenseNumber()).
-                    notIn(BizAppointmentRecord::getStatus, "10", "11", "12", "13", "14", "15"));
+                    notIn(BizAppointmentRecord::getStatus, "10", "11", "12", "13", "14", "15","18","19"));
             if (count > 0) {
                 throw new CommonException("车牌号:{}已经添加过预约!", bizAppointmentRecordAddParam.getLicenseNumber());
             }
@@ -1205,10 +1284,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
             QueryWrapper<BizAppointmentRecord> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("bar.delete_flag", "NOT_DELETE");
             queryWrapper.isNull("br.unload_weight");
-            queryWrapper.eq("bo.order_type", "1");
+            queryWrapper.eq("bla.order_type", "1");
             queryWrapper.eq("bar.`status`", "10");
             queryWrapper.eq("bar.license_number", bizAppointmentRecordAddParam.getLicenseNumber());
-            List<BizAppointmentRecord> recordList = this.getBaseMapper().getRecordList(queryWrapper);
+            List<BizAppointmentRecord> recordList = this.getBaseMapper().getLoadList(queryWrapper);
             if (ObjectUtil.isNotEmpty(recordList)) {
                 throw new CommonException("请先填写回签信息,再进行预约!");
             }
@@ -1754,7 +1833,12 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
     @Override
     public void bizOtherAppointmentComplete(BizAppointmentRecordIdParam bizAppointmentRecordIdParam) {
         BizAppointmentRecord bizAppointmentRecord = this.queryEntity(bizAppointmentRecordIdParam.getId());
-        bizAppointmentRecord.setStatus("7");
+        if(StringUtils.equals(bizAppointmentRecord.getIsWeigh(),"1")){
+            bizAppointmentRecord.setStatus("7");
+        }else{
+            bizAppointmentRecord.setStatus("9");
+        }
+
         this.updateById(bizAppointmentRecord);
     }
 

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

@@ -330,6 +330,7 @@
          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
          left join biz_supplier bs on bs.id = br.supplier_id
+         left join biz_load_appoint bla on bla.id = bar.order_id
         ${ew.customSqlSegment}
     </select>
 </mapper>

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/param/BizRecordPageParam.java

@@ -124,4 +124,9 @@ public class BizRecordPageParam {
     /**供应商名称*/
     private String supplierName;
 
+    /**预约类型*/
+    private String appointmentType;
+
+    private String signLoad;
+
 }

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

@@ -179,6 +179,10 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
             queryWrapper.in("bar.status","10","11","12","13");
             queryWrapper.eq("bo.order_type","1");
         }
+        if (ObjectUtil.isNotEmpty(bizRecordPageParam.getSignLoad())){
+            queryWrapper.in("bar.status","10","11","12","13");
+            queryWrapper.eq("bla.order_type","1");
+        }
         //发货确认状态查询
         if (ObjectUtil.isNotEmpty(bizRecordPageParam.getSendRecordStatus())){
             if(StringUtils.equals(bizRecordPageParam.getSendRecordStatus(),"1")){
@@ -215,6 +219,10 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
         if(ObjectUtil.isEmpty(loginUserDataScope)) {
             queryWrapper.eq("br.appointment_user", StpUtil.getLoginIdAsString());
         }
+        //类型查询
+        if (ObjectUtil.isNotEmpty(bizRecordPageParam.getAppointmentType())){
+            queryWrapper.eq("bar.appointment_type",bizRecordPageParam.getAppointmentType());
+        }
         queryWrapper.eq("br.DELETE_FLAG","NOT_DELETE");
         queryWrapper.orderByDesc("br.create_time");
         return queryWrapper;
@@ -265,7 +273,12 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
             //修改预约状态
             BizAppointmentRecord appointmentRecord = bizAppointmentRecordService.getById(bizRecord.getAppointmentId());
             if(ObjectUtil.isNotNull(appointmentRecord)){
-                appointmentRecord.setStatus("8");
+                if(StringUtils.equals(appointmentRecord.getAppointmentType(),"6")){
+                    //其他预约
+                    appointmentRecord.setStatus("9");
+                }else{
+                    appointmentRecord.setStatus("8");
+                }
                 bizAppointmentRecordService.updateById(appointmentRecord);
             }