fanzherong_v 1 ماه پیش
والد
کامیت
ac4ee1ba5d
27فایلهای تغییر یافته به همراه2322 افزوده شده و 7 حذف شده
  1. 28 0
      snowy-admin-web/src/api/biz/bizAccessRecordApi.js
  2. 8 0
      snowy-admin-web/src/api/biz/bizAppointmentRecordApi.js
  3. 116 0
      snowy-admin-web/src/views/biz/bizaccessrecord/detail.vue
  4. 148 0
      snowy-admin-web/src/views/biz/bizaccessrecord/form.vue
  5. 184 0
      snowy-admin-web/src/views/biz/bizaccessrecord/index.vue
  6. 0 1
      snowy-admin-web/src/views/biz/bizappointmentrecord/form.vue
  7. 116 0
      snowy-admin-web/src/views/biz/bizqueuerecord/detail.vue
  8. 122 0
      snowy-admin-web/src/views/biz/bizqueuerecord/editOrder.vue
  9. 121 0
      snowy-admin-web/src/views/biz/bizqueuerecord/form.vue
  10. 404 0
      snowy-admin-web/src/views/biz/bizqueuerecord/index.vue
  11. 119 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/controller/BizAccessRecordController.java
  12. 143 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/entity/BizAccessRecord.java
  13. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/enums/BizAccessRecordEnum.java
  14. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/mapper/BizAccessRecordMapper.java
  15. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/mapper/mapping/BizAccessRecordMapper.xml
  16. 138 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordAddParam.java
  17. 143 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordEditParam.java
  18. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordIdParam.java
  19. 58 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordPageParam.java
  20. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/service/BizAccessRecordService.java
  21. 109 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/service/impl/BizAccessRecordServiceImpl.java
  22. 48 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/controller/BizAppointmentRecordController.java
  23. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/entity/BizAppointmentRecord.java
  24. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/param/BizAppointmentRecordPageParam.java
  25. 6 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/BizAppointmentRecordService.java
  26. 120 5
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java
  27. 5 1
      snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java

+ 28 - 0
snowy-admin-web/src/api/biz/bizAccessRecordApi.js

@@ -0,0 +1,28 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizaccessrecord/` + url, ...arg)
+
+/**
+ * 门禁记录表Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+export default {
+	// 获取门禁记录表分页
+	bizAccessRecordPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交门禁记录表表单 edit为true时为编辑,默认为新增
+	bizAccessRecordSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除门禁记录表
+	bizAccessRecordDelete(data) {
+		return request('delete', data)
+	},
+	// 获取门禁记录表详情
+	bizAccessRecordDetail(data) {
+		return request('detail', data, 'get')
+	}
+}

+ 8 - 0
snowy-admin-web/src/api/biz/bizAppointmentRecordApi.js

@@ -35,4 +35,12 @@ export default {
 			responseType: 'blob'
 		})
 	},
+	//取消排队
+	cancelAppointmentRecord(data){
+		return request('cancelAppointmentRecord',data)
+	},
+	//调整订单
+	adjustOrder(data){
+		return request('adjustOrder',data)
+	}
 }

+ 116 - 0
snowy-admin-web/src/views/biz/bizaccessrecord/detail.vue

@@ -0,0 +1,116 @@
+<template>
+	<xn-form-container title="详情" :width="900" :visible="visible" :destroy-on-close="true" @close="onClose">
+		<a-form ref="formRef" :model="formData" :label-col="labelCol4" :wrapper-col="wrapperCol20">
+			<a-descriptions :column="4" size="middle" bordered class="mb-2" :label-style="labelStyle" :contentStyle="contentStyle">
+				<a-descriptions-item label="车牌号码" :span="2">{{ formData.licensePlate }}</a-descriptions-item>
+				<a-descriptions-item label="车牌颜色" :span="2">{{ formData.licensePlateColor }}</a-descriptions-item>
+				<a-descriptions-item label="进出类型" :span="2">
+					<a-tag
+						:color="
+							formData.inOutFactory === '1'
+								? 'volcano'
+								: formData.inOutFactory === '2'
+								  ? 'processing'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('in_out_factory', formData.inOutFactory) }}
+					</a-tag>
+				</a-descriptions-item>
+				<a-descriptions-item label="进出时间" :span="2">{{ formData.inOutTime }}</a-descriptions-item>
+				<a-descriptions-item label="放行方式" :span="4">
+					<a-tag
+						:color="
+							formData.releaseType.toString() === '1'
+								? 'volcano'
+								: formData.releaseType.toString() === '2'
+								  ? 'processing'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('release_type', formData.releaseType.toString()) }}
+					</a-tag>
+				</a-descriptions-item>
+
+
+				<a-descriptions-item label="过磅图片" :span="4">
+					<div class="imgDiv">
+						<a-image :width="200" :src="formData.cloudPlateName"  v-if="formData.cloudPlateName!=null"/>
+						<a-image :width="200" :src="formData.cloudLicenseName" v-if="formData.cloudLicenseName!=null"/>
+					</div>
+				</a-descriptions-item>
+
+				<a-descriptions-item label="抓拍图片" :span="4">
+					<div class="imgDiv">
+						<a-image :width="200" :src="formData.cloudCapturePic1"  v-if="formData.cloudCapturePic1!=null"/>
+						<a-image :width="200" :src="formData.cloudCapturePic2" v-if="formData.cloudCapturePic2!=null"/>
+						<a-image :width="200" :src="formData.cloudCapturePic3" v-if="formData.cloudCapturePic3!=null"/>
+						<a-image :width="200" :src="formData.cloudCapturePic4" v-if="formData.cloudCapturePic4!=null"/>
+						<a-image :width="200" :src="formData.cloudCapturePic5" v-if="formData.cloudCapturePic5!=null"/>
+					</div>
+				</a-descriptions-item>
+			</a-descriptions>
+		</a-form>
+	</xn-form-container>
+</template>
+
+<script setup name="recordDoubleForm">
+	import { cloneDeep } from 'lodash-es'
+	// 默认是关闭状态
+	const visible = ref(false)
+	const formData = ref({})
+	const table = ref()
+	const resultJson = ref()
+
+	const labelStyle = {
+		width: '20%'
+	}
+	const contentStyle = {
+		width: '30%'
+	}
+
+	const labelCol4 = ref({span: 4, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const labelCol8 = ref({span: 8, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const wrapperCol20 = ref({span: 20})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+		//getRecordDoubleDetail(record)
+		if(record){
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+
+	}
+	const getRecordDoubleDetail = (record) => {
+		const param = {
+			id: record.id
+		}
+		tbRecordDoubleApi.recordDoubleDetailPic(param).then((data) => {
+			Object.assign(record, data)
+			formData.value = record
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		resultJson.value = ''
+		visible.value = false
+	}
+
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style scoped>
+	.imgDiv ::v-deep .ant-image {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+	.imgDiv ::v-deep .ant-image-mask-info {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+</style>

+ 148 - 0
snowy-admin-web/src/views/biz/bizaccessrecord/form.vue

@@ -0,0 +1,148 @@
+<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="车牌号码:" name="licensePlate">
+				<a-input v-model:value="formData.licensePlate" placeholder="请输入车牌号码" allow-clear />
+			</a-form-item>
+			<a-form-item label="车牌颜色:" name="licensePlateColor">
+				<a-input v-model:value="formData.licensePlateColor" placeholder="请输入车牌颜色" allow-clear />
+			</a-form-item>
+			<a-form-item label="进出时间:" name="inOutTime">
+				<a-input v-model:value="formData.inOutTime" placeholder="请输入进出时间" allow-clear />
+			</a-form-item>
+			<a-form-item label="车牌图片:" name="licensePlatePicture">
+				<a-input v-model:value="formData.licensePlatePicture" placeholder="请输入车牌图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="车图片:" name="carPicture">
+				<a-input v-model:value="formData.carPicture" placeholder="请输入车图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="进出类型  1-进厂  2-出厂:" name="inOutFactory">
+				<a-input v-model:value="formData.inOutFactory" placeholder="请输入进出类型  1-进厂  2-出厂" allow-clear />
+			</a-form-item>
+			<a-form-item label="车辆类型:" name="vehicleType">
+				<a-input v-model:value="formData.vehicleType" placeholder="请输入车辆类型" allow-clear />
+			</a-form-item>
+			<a-form-item label="地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束:" name="bindStatus">
+				<a-input v-model:value="formData.bindStatus" placeholder="请输入地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束" allow-clear />
+			</a-form-item>
+			<a-form-item label="预约ID:" name="appointmentRegisterId">
+				<a-input v-model:value="formData.appointmentRegisterId" placeholder="请输入预约ID" allow-clear />
+			</a-form-item>
+			<a-form-item label="订单id:" name="orderId">
+				<a-input v-model:value="formData.orderId" placeholder="请输入订单id" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端车牌图片:" name="cloudPlateName">
+				<a-input v-model:value="formData.cloudPlateName" placeholder="请输入云端车牌图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端车图片:" name="cloudLicenseName">
+				<a-input v-model:value="formData.cloudLicenseName" placeholder="请输入云端车图片" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端抓拍1:" name="cloudCapturePic1">
+				<a-input v-model:value="formData.cloudCapturePic1" placeholder="请输入云端抓拍1" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端抓拍2:" name="cloudCapturePic2">
+				<a-input v-model:value="formData.cloudCapturePic2" placeholder="请输入云端抓拍2" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端抓拍3:" name="cloudCapturePic3">
+				<a-input v-model:value="formData.cloudCapturePic3" placeholder="请输入云端抓拍3" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端抓拍4:" name="cloudCapturePic4">
+				<a-input v-model:value="formData.cloudCapturePic4" placeholder="请输入云端抓拍4" allow-clear />
+			</a-form-item>
+			<a-form-item label="云端抓拍5:" name="cloudCapturePic5">
+				<a-input v-model:value="formData.cloudCapturePic5" placeholder="请输入云端抓拍5" allow-clear />
+			</a-form-item>
+			<a-form-item label="放行形式  1-自动放行  2-人工放行:" name="releaseType">
+				<a-input v-model:value="formData.releaseType" placeholder="请输入放行形式  1-自动放行  2-人工放行" allow-clear />
+			</a-form-item>
+			<a-form-item label="所属设备分类 1-门禁端设备 2-签样区设备:" name="weighbridgeType">
+				<a-input v-model:value="formData.weighbridgeType" placeholder="请输入所属设备分类 1-门禁端设备 2-签样区设备" allow-clear />
+			</a-form-item>
+			<a-form-item label="设备组(1:一组,2:二组):" name="deviceGroup">
+				<a-input v-model:value="formData.deviceGroup" placeholder="请输入设备组(1:一组,2:二组)" allow-clear />
+			</a-form-item>
+			<a-form-item label="抓拍1:" name="capturePic1">
+				<a-input v-model:value="formData.capturePic1" placeholder="请输入抓拍1" allow-clear />
+			</a-form-item>
+			<a-form-item label="抓拍2:" name="capturePic2">
+				<a-input v-model:value="formData.capturePic2" placeholder="请输入抓拍2" allow-clear />
+			</a-form-item>
+			<a-form-item label="抓拍3:" name="capturePic3">
+				<a-input v-model:value="formData.capturePic3" placeholder="请输入抓拍3" allow-clear />
+			</a-form-item>
+			<a-form-item label="抓拍4:" name="capturePic4">
+				<a-input v-model:value="formData.capturePic4" placeholder="请输入抓拍4" allow-clear />
+			</a-form-item>
+			<a-form-item label="抓拍5:" name="capturePic5">
+				<a-input v-model:value="formData.capturePic5" placeholder="请输入抓拍5" allow-clear />
+			</a-form-item>
+			<a-form-item label="推送状态(0-推送失败 1-推送成功):" name="pushStatus">
+				<a-input v-model:value="formData.pushStatus" placeholder="请输入推送状态(0-推送失败 1-推送成功)" 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="bizAccessRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizAccessRecordApi from '@/api/biz/bizAccessRecordApi'
+	// 抽屉状态
+	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 = {
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizAccessRecordApi
+					.bizAccessRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 184 - 0
snowy-admin-web/src/views/biz/bizaccessrecord/index.vue

@@ -0,0 +1,184 @@
+<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="licensePlate">
+						<a-input v-model:value="searchFormState.licensePlate" placeholder="车牌号码查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="进出时间:" name="inOutTime">
+						<a-range-picker v-model:value="searchFormState.inOutTime" value-format="YYYY-MM-DD" show-date />
+					</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-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('bizAccessRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<xn-batch-button
+						v-if="hasPerm('bizAccessRecordBatchDelete')"
+						buttonName="批量删除"
+                        icon="DeleteOutlined"
+						:selectedRowKeys="selectedRowKeys"
+						@batchCallBack="deleteBatchBizAccessRecord"
+					/>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<template v-if="column.dataIndex === 'inOutFactory'">
+					<a-tag
+						:color="
+							record.inOutFactory === '1'
+								? 'volcano'
+								: record.inOutFactory === '2'
+								  ? 'processing'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('in_out_factory', record.inOutFactory) }}
+					</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'releaseType'">
+					<a-tag
+						:color="
+							record.releaseType.toString() === '1'
+								? 'volcano'
+								: record.releaseType.toString() === '2'
+								  ? 'processing'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('release_type', record.releaseType.toString()) }}
+					</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a-space>
+						<a @click="detailRef.onOpen(record)" >详情</a>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizaccessrecord">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import Detail from './detail.vue'
+	import bizAccessRecordApi from '@/api/biz/bizAccessRecordApi'
+	const tableRef = ref()
+	const detailRef = ref()
+	const formRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+	//查询数据
+	const searchFormState = ref({appointmentFlag:'1'})
+	const searchFormRef = ref()
+
+	const columns = [
+		{
+			title: '车牌号码',
+			dataIndex: 'licensePlate',
+			align:'center'
+		},
+		{
+			title: '车牌颜色',
+			dataIndex: 'licensePlateColor',
+			align:'center'
+		},
+		{
+			title: '进出类型',
+			dataIndex: 'inOutFactory',
+			align:'center'
+		},
+		{
+			title: '进出时间',
+			dataIndex: 'inOutTime',
+			align:'center'
+		},
+
+		{
+			title: '放行方式',
+			dataIndex: 'releaseType',
+			align:'center'
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		width: 150
+	})
+
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		// inOutTime范围查询条件重载
+		if (searchFormParam.inOutTime) {
+			searchFormParam.inOutTimeBegin = searchFormParam.inOutTime[0]
+			searchFormParam.inOutTimeEnd = searchFormParam.inOutTime[1]
+			delete searchFormParam.inOutTime
+		}
+		return bizAccessRecordApi.bizAccessRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizAccessRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizAccessRecordApi.bizAccessRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchBizAccessRecord = (params) => {
+		bizAccessRecordApi.bizAccessRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+</script>

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

@@ -62,7 +62,6 @@
 			let recordData = cloneDeep(record)
 			formData.value = Object.assign({}, recordData)
 		}
-
 		//查询订单信息
 		bizOrderApi.getList().then((res)=>{
 			orderIdList.value = res.map((item)=>{

+ 116 - 0
snowy-admin-web/src/views/biz/bizqueuerecord/detail.vue

@@ -0,0 +1,116 @@
+<template>
+	<xn-form-container title="详情" :width="900" :visible="visible" :destroy-on-close="true" @close="onClose">
+		<a-form ref="formRef" :model="formData" :label-col="labelCol4" :wrapper-col="wrapperCol20">
+			<a-descriptions :column="4" size="middle" bordered class="mb-2" :label-style="labelStyle" :contentStyle="contentStyle">
+				<a-descriptions-item label="订单编号" :span="2">{{ formData.orderNumber }}</a-descriptions-item>
+				<a-descriptions-item label="订单名称" :span="2">{{ formData.orderName }}</a-descriptions-item>
+				<a-descriptions-item label="车牌号" :span="2">{{ formData.licenseNumber }}</a-descriptions-item>
+				<a-descriptions-item label="预约时段" :span="2">{{ formData.beginTime + '~' + formData.endTime }}</a-descriptions-item>
+				<a-descriptions-item label="客户名称" :span="2">{{ formData.customerName }}</a-descriptions-item>
+				<a-descriptions-item label="联系人" :span="2">{{ formData.customerContactName }}</a-descriptions-item>
+				<a-descriptions-item label="货品名称" :span="2">{{ formData.goodsName }}</a-descriptions-item>
+				<a-descriptions-item label="货品规格" :span="2">{{ formData.goodsModel }}</a-descriptions-item>
+				<a-descriptions-item label="司机姓名" :span="2">{{ formData.driverName }}</a-descriptions-item>
+				<a-descriptions-item label="司机电话" :span="2">{{ formData.driverPhone }}</a-descriptions-item>
+
+				<a-descriptions-item label="预约状态" :span="4">
+					<a-tag
+						:color="
+							formData.status === '1'
+								? 'volcano'
+								: formData.status === '2'
+								  ? 'red'
+								  : formData.status === '3'
+								  ? 'processing'
+								  : formData.status === '4'
+								  ? 'warning'
+								  : formData.status === '5'
+								  ? 'magenta'
+								  : formData.status === '6'
+								  ? 'orange'
+								  : formData.status === '7'
+								  ? 'gold'
+								   : formData.status === '8'
+								  ? 'lime'
+								   : formData.status === '9'
+								  ? 'green'
+								  : formData.status === '10'
+								  ? 'cyan'
+								  : formData.status === '11'
+								  ? 'success'
+								  : formData.status === '12'
+								  ? 'blue'
+								  : formData.status === '13'
+								  ? 'geekblue'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('appointment_status', formData.status) }}
+					</a-tag>
+				</a-descriptions-item>
+				<a-descriptions-item label="审核备注" :span="2">{{ formData.appointmentReason }}</a-descriptions-item>
+			</a-descriptions>
+		</a-form>
+	</xn-form-container>
+</template>
+
+<script setup name="recordDoubleForm">
+	import { cloneDeep } from 'lodash-es'
+	// 默认是关闭状态
+	const visible = ref(false)
+	const formData = ref({})
+	const table = ref()
+	const resultJson = ref()
+
+	const labelStyle = {
+		width: '20%'
+	}
+	const contentStyle = {
+		width: '30%'
+	}
+
+	const labelCol4 = ref({span: 4, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const labelCol8 = ref({span: 8, style: 'width: 26%; line-height: 20px; white-space: normal',})
+	const wrapperCol20 = ref({span: 20})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+		//getRecordDoubleDetail(record)
+		if(record){
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+
+	}
+	const getRecordDoubleDetail = (record) => {
+		const param = {
+			id: record.id
+		}
+		tbRecordDoubleApi.recordDoubleDetailPic(param).then((data) => {
+			Object.assign(record, data)
+			formData.value = record
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		resultJson.value = ''
+		visible.value = false
+	}
+
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>
+
+<style scoped>
+	.imgDiv ::v-deep .ant-image {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+	.imgDiv ::v-deep .ant-image-mask-info {
+		margin-left: 20px;
+		margin-top: 10px;
+	}
+</style>

+ 122 - 0
snowy-admin-web/src/views/biz/bizqueuerecord/editOrder.vue

@@ -0,0 +1,122 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '调整订单' : '调整订单'"
+		:width="700"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" :wrapper-col="wrapperCol" :label-col="labelCol">
+			<a-form-item label="订单信息:" name="orderId">
+				<a-select v-model:value="formData.orderId" placeholder="请选择订单信息"
+						  :options="orderIdList"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="车牌号:" name="licenseNumber">
+				<a-input v-model:value="formData.licenseNumber" placeholder="请输入车牌号" allow-clear  disabled/>
+			</a-form-item>
+			<a-form-item label="预约时段:" name="timeId">
+<!--				<a-select v-model:value="formData.timeId" placeholder="请选择预约时段"
+						  :options="timeIdList"
+				> </a-select>-->
+				<a-input v-model:value="formData.timeInfo" placeholder="请选择预约时段" allow-clear  disabled/>
+			</a-form-item>
+			<a-form-item label="司机姓名:" name="driverName">
+				<a-input v-model:value="formData.driverName" placeholder="请输入司机姓名" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="司机电话:" name="driverPhone">
+				<a-input v-model:value="formData.driverPhone" placeholder="请输入司机电话" allow-clear disabled/>
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizAppointmentRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizAppointmentRecordApi from '@/api/biz/bizAppointmentRecordApi'
+	import bizAppointmentTimeApi from "@/api/biz/bizAppointmentTimeApi";
+	import bizOrderApi from '@/api/biz/bizOrderApi'
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const orderIdList = ref()
+	const timeIdList = ref()
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+			formData.value.timeInfo = formData.value.beginTime + '~' + formData.value.endTime
+		}
+
+		//查询订单信息
+		bizOrderApi.getList().then((res)=>{
+			orderIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.orderName + '-' + item.orderNumber
+				}
+			})
+		})
+
+		//查询预约时段下拉
+		bizAppointmentTimeApi.getDownList().then((res)=>{
+			timeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime + '-' + item.endTime
+				}
+			})
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		orderId: [required('请选择订单信息')],
+		licenseNumber: [required('请输入车牌号')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizAppointmentRecordApi
+					.adjustOrder(formDataParam)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 121 - 0
snowy-admin-web/src/views/biz/bizqueuerecord/form.vue

@@ -0,0 +1,121 @@
+<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="orderId">
+				<a-select v-model:value="formData.orderId" placeholder="请选择订单信息"
+						  :options="orderIdList" disabled
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="车牌号:" name="licenseNumber">
+				<a-input v-model:value="formData.licenseNumber" placeholder="请输入车牌号" allow-clear  disabled/>
+			</a-form-item>
+			<a-form-item label="预约时段:" name="timeId">
+				<a-select v-model:value="formData.timeId" placeholder="请选择预约时段"
+						  :options="timeIdList"
+				> </a-select>
+			</a-form-item>
+			<a-form-item label="司机姓名:" name="driverName">
+				<a-input v-model:value="formData.driverName" placeholder="请输入司机姓名" allow-clear disabled/>
+			</a-form-item>
+			<a-form-item label="司机电话:" name="driverPhone">
+				<a-input v-model:value="formData.driverPhone" placeholder="请输入司机电话" allow-clear disabled/>
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="bizAppointmentRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizAppointmentRecordApi from '@/api/biz/bizAppointmentRecordApi'
+	import bizAppointmentTimeApi from "@/api/biz/bizAppointmentTimeApi";
+	import bizOrderApi from '@/api/biz/bizOrderApi'
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const orderIdList = ref()
+	const timeIdList = ref()
+
+	//设置表单样式
+	const labelCol = ref({ span: 5})
+	const wrapperCol = ref({ span: 16})
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+
+		//查询订单信息
+		bizOrderApi.getList().then((res)=>{
+			orderIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.orderName + '-' + item.orderNumber
+				}
+			})
+		})
+
+		//查询预约时段下拉
+		bizAppointmentTimeApi.getDownList().then((res)=>{
+			timeIdList.value = res.map((item)=>{
+				return{
+					value:item.id,
+					label:item.beginTime + '-' + item.endTime
+				}
+			})
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		orderId: [required('请选择订单信息')],
+		licenseNumber: [required('请输入车牌号')],
+		timeId: [required('请选择预约时段')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				bizAppointmentRecordApi
+					.bizAppointmentRecordSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 404 - 0
snowy-admin-web/src/views/biz/bizqueuerecord/index.vue

@@ -0,0 +1,404 @@
+<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="orderNumber">
+						<a-input v-model:value="searchFormState.orderNumber" placeholder="订单编号查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="订单名称" name="orderName">
+						<a-input v-model:value="searchFormState.orderName" placeholder="订单名称查询" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="车牌号" name="licenseNumber">
+						<a-input v-model:value="searchFormState.licenseNumber" placeholder="车牌号码查询" />
+					</a-form-item>
+				</a-col>
+				<template v-if="advanced">
+					<a-col :span="6">
+						<a-form-item label="客户名称" name="customerName">
+							<a-input v-model:value="searchFormState.customerName" placeholder="客户名称查询" />
+						</a-form-item>
+					</a-col>
+					<a-col :span="6">
+						<a-form-item label="货品名称" name="goodsName">
+							<a-input v-model:value="searchFormState.goodsName" placeholder="货品名称查询" />
+						</a-form-item>
+					</a-col>
+					<a-col :span="6">
+						<a-form-item label="司机名称" name="driverName">
+							<a-input v-model:value="searchFormState.driverName" placeholder="司机名称查询" />
+						</a-form-item>
+					</a-col>
+					<a-col :span="6">
+						<a-form-item label="司机电话" name="driverPhone">
+							<a-input v-model:value="searchFormState.driverPhone" placeholder="司机电话查询" />
+						</a-form-item>
+					</a-col>
+
+					<a-col :span="6">
+						<a-form-item label="预约状态" name="status">
+							<a-select v-model:value="searchFormState.status" placeholder="预约状态查询"
+									  :options="statusList"
+							> </a-select>
+						</a-form-item>
+					</a-col>
+				</template>
+				<a-col :span="6">
+					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
+					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
+					<a @click="toggleAdvanced" style="margin-left: 8px">
+						{{ advanced ? '收起' : '展开' }}
+						<component :is="advanced ? 'up-outlined' : 'down-outlined'" />
+					</a>
+				</a-col>
+			</a-row>
+		</a-form>
+	</a-card>
+	<a-card :bordered="false">
+		<s-table
+			ref="tableRef"
+			:columns="columns"
+			:data="loadData"
+			bordered
+			:row-key="(record) => record.id"
+		>
+			<template #operator class="table-operator">
+				<a-space>
+<!--					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizAppointmentRecordAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>-->
+<!--					<a-button @click="exportTotal" v-if="hasPerm('bizAppointmentExport')">
+						<template #icon>
+							<export-outlined/>
+						</template>
+						导出
+					</a-button>-->
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+				<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 === 'timeInfo'">
+					<span>{{record.beginTime + '~' + record.endTime}}</span>
+				</template>
+				<template v-if="column.dataIndex === 'customerInfo'">
+					<span>{{record.customerName}}</span>
+				</template>
+				<template v-if="column.dataIndex === 'driverInfo'">
+					<div class="time-list">
+						<p>姓名:{{ record.driverName }}</p>
+						<p style="margin-bottom: 0">电话:{{ record.driverPhone }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'goodsInfo'">
+					<div class="time-list">
+						<p>名称:{{ record.goodsName }}</p>
+						<p style="margin-bottom: 0">规格:{{ record.goodsModel }}</p>
+					</div>
+				</template>
+				<template v-if="column.dataIndex === 'status'">
+					<a-tag
+						:color="
+							record.status === '1'
+								? 'volcano'
+								: record.status === '2'
+								  ? 'red'
+								  : record.status === '3'
+								  ? 'processing'
+								  : record.status === '4'
+								  ? 'warning'
+								  : record.status === '5'
+								  ? 'magenta'
+								  : record.status === '6'
+								  ? 'orange'
+								  : record.status === '7'
+								  ? 'gold'
+								   : record.status === '8'
+								  ? 'lime'
+								   : record.status === '9'
+								  ? 'green'
+								  : record.status === '10'
+								  ? 'cyan'
+								  : record.status === '11'
+								  ? 'success'
+								  : record.status === '12'
+								  ? 'blue'
+								  : record.status === '13'
+								  ? 'geekblue'
+								  : 'error'
+						"
+					>
+						{{ $TOOL.dictTypeData('appointment_status', record.status) }}
+					</a-tag>
+				</template>
+				<template v-if="column.dataIndex === 'action'">
+					<a style="color: #ffaa00" @click="orderRef.onOpen(record)" v-if="hasPerm('bizAppointmentRecordOrder') && (record.status == '3' || record.status == '4' || record.status == '5' || record.status == '6'|| record.status == '7'|| record.status == '8'|| record.status == '9')">调整订单</a>
+					<a-divider type="vertical"  v-if="(hasPerm('bizAppointmentRecordOrder') && (record.status == '3' || record.status == '4' || record.status == '5' || record.status == '6'|| record.status == '7'|| record.status == '8'|| record.status == '9')) && (hasPerm('bizAppointmentRecordTime') && (record.status == '3' || record.status == '4'))" />
+					<a style="color:blue" @click="formRef.onOpen(record)" v-if="hasPerm('bizAppointmentRecordTime') && (record.status == '3' || record.status == '4')">调整时段</a>
+					<a-divider type="vertical"  v-if="(hasPerm('bizAppointmentRecordTime') && (record.status == '3' || record.status == '4')) && (hasPerm('bizAppointmentRecordCancel') && (record.status == '3' || record.status == '4'))" />
+					<a style="color:red" type="link" danger size="small" @click="cancelConfig(record)" v-if="hasPerm('bizAppointmentRecordCancel') && (record.status == '3' || record.status == '4')">取消排队</a>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Order ref="orderRef" @successful="tableRef.refresh()" />
+	<Review ref="reviewRef" @successful="tableRef.refresh(true)" />
+	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+</template>
+
+<script setup name="bizappointmentrecord">
+	import { cloneDeep } from 'lodash-es'
+	import bizAppointmentRecordApi from '@/api/biz/bizAppointmentRecordApi'
+	import tool from '@/utils/tool'
+	import downloadUtil from '@/utils/downloadUtil'
+	import Detail from './detail.vue'
+	import Order from './editOrder.vue'
+	import Form from './form.vue'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+
+	const submitLoading = ref(false)
+	const tableRef = ref()
+	const formRef = ref()
+	const orderRef = ref()
+	const reviewRef = ref()
+	const detailRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+	const nowRecord = ref()
+
+	//查询数据
+	const searchFormState = ref({appointmentFlag:'1'})
+	const searchFormRef = ref()
+	const statusList = tool.dictList('appointment_status')
+
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+
+	const columns = [
+		{
+			title: '订单信息',
+			dataIndex: 'orderInfo',
+			width:200
+		},
+		{
+			title: '车牌号',
+			dataIndex: 'licenseNumber',
+			width:130,
+			align: 'center'
+		},
+		{
+			title: '预约时段',
+			dataIndex: 'timeInfo',
+			align:'center',
+			width:130
+		},
+		{
+			title: '客户信息',
+			dataIndex: 'customerInfo',
+			align:'center',
+			width:150
+		},
+		{
+			title: '货品信息',
+			dataIndex: 'goodsInfo',
+			width:150
+		},
+		{
+			title: '司机信息',
+			dataIndex: 'driverInfo',
+			width: 150
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			align: 'center',
+			width:100
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	columns.push({
+		title: '操作',
+		dataIndex: 'action',
+		align: 'center',
+		fixed: 'right',
+		width: 240
+	})
+
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		return bizAppointmentRecordApi.bizAppointmentRecordPage(Object.assign(parameter, searchFormParam)).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteBizAppointmentRecord = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		bizAppointmentRecordApi.bizAppointmentRecordDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 删除
+	const deleteConfig = (record) => {
+
+		Modal.confirm({
+			title: '确定删除该数据吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params = [
+					{
+						id: record.id
+					}
+				]
+
+				bizAppointmentRecordApi
+					.bizAppointmentRecordDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	//取消排队
+	const cancelConfig = (record)=>{
+		Modal.confirm({
+			title: '确定要取消排队吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizAppointmentRecordApi
+					.cancelAppointmentRecord(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 批量删除
+	const deleteBatchBizAppointmentRecord = (params) => {
+		bizAppointmentRecordApi.bizAppointmentRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+
+
+	//导出
+	const exportTotal = () => {
+		const searchFormParam = cloneDeep(searchFormState.value)
+		bizAppointmentRecordApi.exportRecord(Object.assign(searchFormParam)).then((res)=>{
+			downloadUtil.resultDownload(res)
+		})
+	}
+</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;
+		}
+	}
+}
+</style>

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

@@ -0,0 +1,119 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.bizaccessrecord.entity.BizAccessRecord;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordAddParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordEditParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordIdParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordPageParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.service.BizAccessRecordService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 门禁记录表控制器
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ */
+@Tag(name = "门禁记录表控制器")
+@RestController
+@Validated
+public class BizAccessRecordController {
+
+    @Resource
+    private BizAccessRecordService bizAccessRecordService;
+
+    /**
+     * 获取门禁记录表分页
+     *
+     * @author fanzherong
+     * @date  2025/03/25 16:48
+     */
+    @Operation(summary = "获取门禁记录表分页")
+    @SaCheckPermission("/biz/bizaccessrecord/page")
+    @GetMapping("/biz/bizaccessrecord/page")
+    public CommonResult<Page<BizAccessRecord>> page(BizAccessRecordPageParam bizAccessRecordPageParam) {
+        return CommonResult.data(bizAccessRecordService.page(bizAccessRecordPageParam));
+    }
+
+    /**
+     * 添加门禁记录表
+     *
+     * @author fanzherong
+     * @date  2025/03/25 16:48
+     */
+    @Operation(summary = "添加门禁记录表")
+    @CommonLog("添加门禁记录表")
+    @PostMapping("/biz/bizaccessrecord/add")
+    public CommonResult<String> add(@RequestBody @Valid BizAccessRecordAddParam bizAccessRecordAddParam) {
+        bizAccessRecordService.add(bizAccessRecordAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑门禁记录表
+     *
+     * @author fanzherong
+     * @date  2025/03/25 16:48
+     */
+    @Operation(summary = "编辑门禁记录表")
+    @CommonLog("编辑门禁记录表")
+    @PostMapping("/biz/bizaccessrecord/edit")
+    public CommonResult<String> edit(@RequestBody @Valid BizAccessRecordEditParam bizAccessRecordEditParam) {
+        bizAccessRecordService.edit(bizAccessRecordEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除门禁记录表
+     *
+     * @author fanzherong
+     * @date  2025/03/25 16:48
+     */
+    @Operation(summary = "删除门禁记录表")
+    @CommonLog("删除门禁记录表")
+    @PostMapping("/biz/bizaccessrecord/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<BizAccessRecordIdParam> bizAccessRecordIdParamList) {
+        bizAccessRecordService.delete(bizAccessRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取门禁记录表详情
+     *
+     * @author fanzherong
+     * @date  2025/03/25 16:48
+     */
+    @Operation(summary = "获取门禁记录表详情")
+    @GetMapping("/biz/bizaccessrecord/detail")
+    public CommonResult<BizAccessRecord> detail(@Valid BizAccessRecordIdParam bizAccessRecordIdParam) {
+        return CommonResult.data(bizAccessRecordService.detail(bizAccessRecordIdParam));
+    }
+}

+ 143 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/entity/BizAccessRecord.java

@@ -0,0 +1,143 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门禁记录表实体
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+@Setter
+@TableName("biz_access_record")
+public class BizAccessRecord extends CommonEntity {
+
+    /** 主键id */
+    @TableId
+    @Schema(description = "主键id")
+    private String id;
+
+    /** 车牌号码 */
+    @Schema(description = "车牌号码")
+    private String licensePlate;
+
+    /** 车牌颜色 */
+    @Schema(description = "车牌颜色")
+    private String licensePlateColor;
+
+    /** 进出时间 */
+    @Schema(description = "进出时间")
+    private String inOutTime;
+
+    /** 车牌图片 */
+    @Schema(description = "车牌图片")
+    private String licensePlatePicture;
+
+    /** 车图片 */
+    @Schema(description = "车图片")
+    private String carPicture;
+
+    /** 进出类型  1-进厂  2-出厂 */
+    @Schema(description = "进出类型  1-进厂  2-出厂")
+    private String inOutFactory;
+
+    /** 车辆类型 */
+    @Schema(description = "车辆类型")
+    private String vehicleType;
+
+    /** 地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束 */
+    @Schema(description = "地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束")
+    private String bindStatus;
+
+    /** 预约ID */
+    @Schema(description = "预约ID")
+    private String appointmentRegisterId;
+
+    /** 订单id */
+    @Schema(description = "订单id")
+    private String orderId;
+
+    /** 云端车牌图片 */
+    @Schema(description = "云端车牌图片")
+    private String cloudPlateName;
+
+    /** 云端车图片 */
+    @Schema(description = "云端车图片")
+    private String cloudLicenseName;
+
+    /** 云端抓拍1 */
+    @Schema(description = "云端抓拍1")
+    private String cloudCapturePic1;
+
+    /** 云端抓拍2 */
+    @Schema(description = "云端抓拍2")
+    private String cloudCapturePic2;
+
+    /** 云端抓拍3 */
+    @Schema(description = "云端抓拍3")
+    private String cloudCapturePic3;
+
+    /** 云端抓拍4 */
+    @Schema(description = "云端抓拍4")
+    private String cloudCapturePic4;
+
+    /** 云端抓拍5 */
+    @Schema(description = "云端抓拍5")
+    private String cloudCapturePic5;
+
+    /** 放行形式  1-自动放行  2-人工放行 */
+    @Schema(description = "放行形式  1-自动放行  2-人工放行")
+    private Integer releaseType;
+
+    /** 所属设备分类 1-门禁端设备 2-签样区设备 */
+    @Schema(description = "所属设备分类 1-门禁端设备 2-签样区设备")
+    private Boolean weighbridgeType;
+
+    /** 设备组(1:一组,2:二组) */
+    @Schema(description = "设备组(1:一组,2:二组)")
+    private Boolean deviceGroup;
+
+    /** 抓拍1 */
+    @Schema(description = "抓拍1")
+    private String capturePic1;
+
+    /** 抓拍2 */
+    @Schema(description = "抓拍2")
+    private String capturePic2;
+
+    /** 抓拍3 */
+    @Schema(description = "抓拍3")
+    private String capturePic3;
+
+    /** 抓拍4 */
+    @Schema(description = "抓拍4")
+    private String capturePic4;
+
+    /** 抓拍5 */
+    @Schema(description = "抓拍5")
+    private String capturePic5;
+
+    /** 推送状态(0-推送失败 1-推送成功) */
+    @Schema(description = "推送状态(0-推送失败 1-推送成功)")
+    private Integer pushStatus;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/enums/BizAccessRecordEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.enums;
+
+import lombok.Getter;
+
+/**
+ * 门禁记录表枚举
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+public enum BizAccessRecordEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    BizAccessRecordEnum(String value) {
+        this.value = value;
+    }
+}

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

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

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

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

+ 138 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordAddParam.java

@@ -0,0 +1,138 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门禁记录表添加参数
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+@Setter
+public class BizAccessRecordAddParam {
+
+    /** 车牌号码 */
+    @Schema(description = "车牌号码")
+    private String licensePlate;
+
+    /** 车牌颜色 */
+    @Schema(description = "车牌颜色")
+    private String licensePlateColor;
+
+    /** 进出时间 */
+    @Schema(description = "进出时间")
+    private String inOutTime;
+
+    /** 车牌图片 */
+    @Schema(description = "车牌图片")
+    private String licensePlatePicture;
+
+    /** 车图片 */
+    @Schema(description = "车图片")
+    private String carPicture;
+
+    /** 进出类型  1-进厂  2-出厂 */
+    @Schema(description = "进出类型  1-进厂  2-出厂")
+    private String inOutFactory;
+
+    /** 车辆类型 */
+    @Schema(description = "车辆类型")
+    private String vehicleType;
+
+    /** 地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束 */
+    @Schema(description = "地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束")
+    private String bindStatus;
+
+    /** 预约ID */
+    @Schema(description = "预约ID")
+    private String appointmentRegisterId;
+
+    /** 订单id */
+    @Schema(description = "订单id")
+    private String orderId;
+
+    /** 云端车牌图片 */
+    @Schema(description = "云端车牌图片")
+    private String cloudPlateName;
+
+    /** 云端车图片 */
+    @Schema(description = "云端车图片")
+    private String cloudLicenseName;
+
+    /** 云端抓拍1 */
+    @Schema(description = "云端抓拍1")
+    private String cloudCapturePic1;
+
+    /** 云端抓拍2 */
+    @Schema(description = "云端抓拍2")
+    private String cloudCapturePic2;
+
+    /** 云端抓拍3 */
+    @Schema(description = "云端抓拍3")
+    private String cloudCapturePic3;
+
+    /** 云端抓拍4 */
+    @Schema(description = "云端抓拍4")
+    private String cloudCapturePic4;
+
+    /** 云端抓拍5 */
+    @Schema(description = "云端抓拍5")
+    private String cloudCapturePic5;
+
+    /** 放行形式  1-自动放行  2-人工放行 */
+    @Schema(description = "放行形式  1-自动放行  2-人工放行")
+    private Integer releaseType;
+
+    /** 所属设备分类 1-门禁端设备 2-签样区设备 */
+    @Schema(description = "所属设备分类 1-门禁端设备 2-签样区设备")
+    private Boolean weighbridgeType;
+
+    /** 设备组(1:一组,2:二组) */
+    @Schema(description = "设备组(1:一组,2:二组)")
+    private Boolean deviceGroup;
+
+    /** 抓拍1 */
+    @Schema(description = "抓拍1")
+    private String capturePic1;
+
+    /** 抓拍2 */
+    @Schema(description = "抓拍2")
+    private String capturePic2;
+
+    /** 抓拍3 */
+    @Schema(description = "抓拍3")
+    private String capturePic3;
+
+    /** 抓拍4 */
+    @Schema(description = "抓拍4")
+    private String capturePic4;
+
+    /** 抓拍5 */
+    @Schema(description = "抓拍5")
+    private String capturePic5;
+
+    /** 推送状态(0-推送失败 1-推送成功) */
+    @Schema(description = "推送状态(0-推送失败 1-推送成功)")
+    private Integer pushStatus;
+
+}

+ 143 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordEditParam.java

@@ -0,0 +1,143 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门禁记录表编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+@Setter
+public class BizAccessRecordEditParam {
+
+    /** 主键id */
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 车牌号码 */
+    @Schema(description = "车牌号码")
+    private String licensePlate;
+
+    /** 车牌颜色 */
+    @Schema(description = "车牌颜色")
+    private String licensePlateColor;
+
+    /** 进出时间 */
+    @Schema(description = "进出时间")
+    private String inOutTime;
+
+    /** 车牌图片 */
+    @Schema(description = "车牌图片")
+    private String licensePlatePicture;
+
+    /** 车图片 */
+    @Schema(description = "车图片")
+    private String carPicture;
+
+    /** 进出类型  1-进厂  2-出厂 */
+    @Schema(description = "进出类型  1-进厂  2-出厂")
+    private String inOutFactory;
+
+    /** 车辆类型 */
+    @Schema(description = "车辆类型")
+    private String vehicleType;
+
+    /** 地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束 */
+    @Schema(description = "地磅绑定状态 0-未绑定 1-单次过磅完成 2-一次过磅完成  3-二次过磅完成  4-已结束")
+    private String bindStatus;
+
+    /** 预约ID */
+    @Schema(description = "预约ID")
+    private String appointmentRegisterId;
+
+    /** 订单id */
+    @Schema(description = "订单id")
+    private String orderId;
+
+    /** 云端车牌图片 */
+    @Schema(description = "云端车牌图片")
+    private String cloudPlateName;
+
+    /** 云端车图片 */
+    @Schema(description = "云端车图片")
+    private String cloudLicenseName;
+
+    /** 云端抓拍1 */
+    @Schema(description = "云端抓拍1")
+    private String cloudCapturePic1;
+
+    /** 云端抓拍2 */
+    @Schema(description = "云端抓拍2")
+    private String cloudCapturePic2;
+
+    /** 云端抓拍3 */
+    @Schema(description = "云端抓拍3")
+    private String cloudCapturePic3;
+
+    /** 云端抓拍4 */
+    @Schema(description = "云端抓拍4")
+    private String cloudCapturePic4;
+
+    /** 云端抓拍5 */
+    @Schema(description = "云端抓拍5")
+    private String cloudCapturePic5;
+
+    /** 放行形式  1-自动放行  2-人工放行 */
+    @Schema(description = "放行形式  1-自动放行  2-人工放行")
+    private Integer releaseType;
+
+    /** 所属设备分类 1-门禁端设备 2-签样区设备 */
+    @Schema(description = "所属设备分类 1-门禁端设备 2-签样区设备")
+    private Boolean weighbridgeType;
+
+    /** 设备组(1:一组,2:二组) */
+    @Schema(description = "设备组(1:一组,2:二组)")
+    private Boolean deviceGroup;
+
+    /** 抓拍1 */
+    @Schema(description = "抓拍1")
+    private String capturePic1;
+
+    /** 抓拍2 */
+    @Schema(description = "抓拍2")
+    private String capturePic2;
+
+    /** 抓拍3 */
+    @Schema(description = "抓拍3")
+    private String capturePic3;
+
+    /** 抓拍4 */
+    @Schema(description = "抓拍4")
+    private String capturePic4;
+
+    /** 抓拍5 */
+    @Schema(description = "抓拍5")
+    private String capturePic5;
+
+    /** 推送状态(0-推送失败 1-推送成功) */
+    @Schema(description = "推送状态(0-推送失败 1-推送成功)")
+    private Integer pushStatus;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 门禁记录表Id参数
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+@Setter
+public class BizAccessRecordIdParam {
+
+    /** 主键id */
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 58 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizaccessrecord/param/BizAccessRecordPageParam.java

@@ -0,0 +1,58 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门禁记录表查询参数
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Getter
+@Setter
+public class BizAccessRecordPageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+    /**车牌号码*/
+    private String licensePlate;
+
+    private String inOutTimeBegin;
+
+    private String inOutTimeEnd;
+
+}

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

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

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

@@ -0,0 +1,109 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.bizaccessrecord.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.service.BizAppointmentRecordService;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.bizaccessrecord.entity.BizAccessRecord;
+import vip.xiaonuo.biz.modular.bizaccessrecord.mapper.BizAccessRecordMapper;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordAddParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordEditParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordIdParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.param.BizAccessRecordPageParam;
+import vip.xiaonuo.biz.modular.bizaccessrecord.service.BizAccessRecordService;
+
+import java.util.List;
+
+/**
+ * 门禁记录表Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/03/25 16:48
+ **/
+@Service
+public class BizAccessRecordServiceImpl extends ServiceImpl<BizAccessRecordMapper, BizAccessRecord> implements BizAccessRecordService {
+
+    @Resource
+    private BizAppointmentRecordService bizAppointmentRecordService;
+
+    @Override
+    public Page<BizAccessRecord> page(BizAccessRecordPageParam bizAccessRecordPageParam) {
+        QueryWrapper<BizAccessRecord> queryWrapper = new QueryWrapper<BizAccessRecord>().checkSqlInjection();
+        if(ObjectUtil.isNotEmpty(bizAccessRecordPageParam.getLicensePlate())){
+            queryWrapper.lambda().like(BizAccessRecord::getLicensePlate,bizAccessRecordPageParam.getLicensePlate());
+        }
+        if(ObjectUtil.isNotEmpty(bizAccessRecordPageParam.getInOutTimeBegin()) && ObjectUtil.isNotEmpty(bizAccessRecordPageParam.getInOutTimeEnd())){
+            queryWrapper.lambda().between(BizAccessRecord::getInOutTime,bizAccessRecordPageParam.getInOutTimeBegin()+ " 00:00:00",
+                    bizAccessRecordPageParam.getInOutTimeEnd()+ " 23:59:59");
+        }
+        queryWrapper.lambda().orderByDesc(BizAccessRecord::getCreateTime);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(BizAccessRecordAddParam bizAccessRecordAddParam) {
+        //地磅端推送门禁记录
+        BizAccessRecord bizAccessRecord = BeanUtil.toBean(bizAccessRecordAddParam, BizAccessRecord.class);
+        this.save(bizAccessRecord);
+
+        //修改预约记录状态,待入场->已入场
+        BizAppointmentRecord appointmentRecord = bizAppointmentRecordService.getById(bizAccessRecord.getAppointmentRegisterId());
+        if(ObjectUtil.isNotNull(appointmentRecord)){
+            appointmentRecord.setStatus("5");
+            bizAppointmentRecordService.updateById(appointmentRecord);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(BizAccessRecordEditParam bizAccessRecordEditParam) {
+        BizAccessRecord bizAccessRecord = this.queryEntity(bizAccessRecordEditParam.getId());
+        BeanUtil.copyProperties(bizAccessRecordEditParam, bizAccessRecord);
+        this.updateById(bizAccessRecord);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<BizAccessRecordIdParam> bizAccessRecordIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(bizAccessRecordIdParamList, BizAccessRecordIdParam::getId));
+    }
+
+    @Override
+    public BizAccessRecord detail(BizAccessRecordIdParam bizAccessRecordIdParam) {
+        return this.queryEntity(bizAccessRecordIdParam.getId());
+    }
+
+    @Override
+    public BizAccessRecord queryEntity(String id) {
+        BizAccessRecord bizAccessRecord = this.getById(id);
+        if(ObjectUtil.isEmpty(bizAccessRecord)) {
+            throw new CommonException("门禁记录表不存在,id值为:{}", id);
+        }
+        return bizAccessRecord;
+    }
+}

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

@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -148,4 +149,51 @@ public class BizAppointmentRecordController {
     public void exportRecord(BizAppointmentRecordPageParam bizAppointmentRecordPageParam, HttpServletResponse response) throws IOException {
         bizAppointmentRecordService.exportRecord(bizAppointmentRecordPageParam,response);
     }
+
+    /**
+     * 地磅端校验是否有预约
+     */
+    @Operation(summary = "地磅端校验是否有预约")
+    @GetMapping(value = "/biz/bizappointmentrecord/checkAppointmentRecord")
+    public CommonResult<BizAppointmentRecord> checkAppointmentRecord(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
+        BizAppointmentRecord bizAppointmentRecord = bizAppointmentRecordService.checkAppointmentRecord(bizAppointmentRecordPageParam);
+        if(StringUtils.equals(bizAppointmentRecord.getIsFlag(),"4")){
+            return CommonResult.get(201,"没有待入场记录,不可过门禁!",null);
+        }else if(StringUtils.equals(bizAppointmentRecord.getIsFlag(),"5")){
+            return CommonResult.get(202,"没有已入场记录,不可一次过磅!",null);
+        }else if(StringUtils.equals(bizAppointmentRecord.getIsFlag(),"7")){
+            return CommonResult.get(203,"没有完成装货记录,不可二次过磅!",null);
+        }else if(StringUtils.equals(bizAppointmentRecord.getIsFlag(),"9")){
+            return CommonResult.get(204,"没有待出场记录,不可出门禁!",null);
+        }
+        return CommonResult.get(200,"操作成功",bizAppointmentRecord);
+    }
+
+    /**
+     * 取消排队
+     *
+     * @author fanzherong
+     * @date  2025/03/24 14:47
+     */
+    @Operation(summary = "取消排队")
+    @CommonLog("取消排队")
+    @PostMapping("/biz/bizappointmentrecord/cancelAppointmentRecord")
+    public CommonResult<String> cancelAppointmentRecord(@RequestBody @Valid BizAppointmentRecordIdParam bizAppointmentRecordIdParam) {
+        bizAppointmentRecordService.cancelAppointmentRecord(bizAppointmentRecordIdParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 调整订单
+     *
+     * @author fanzherong
+     * @date  2025/03/24 14:47
+     */
+    @Operation(summary = "调整订单")
+    @CommonLog("调整订单")
+    @PostMapping("/biz/bizappointmentrecord/adjustOrder")
+    public CommonResult<String> adjustOrder(@RequestBody @Valid BizAppointmentRecordEditParam bizAppointmentRecordEditParam) {
+        bizAppointmentRecordService.adjustOrder(bizAppointmentRecordEditParam);
+        return CommonResult.ok();
+    }
 }

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

@@ -93,4 +93,8 @@ public class BizAppointmentRecord extends CommonEntity {
     /**结束时间段*/
     @TableField(exist = false)
     private String endTime;
+
+    /**标识*/
+    @TableField(exist = false)
+    private String isFlag;
 }

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

@@ -72,4 +72,7 @@ public class BizAppointmentRecordPageParam {
     /**状态*/
     private String status;
 
+    /**标识,判断车辆排队还是预约记录*/
+    private String appointmentFlag;
+
 }

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

@@ -89,4 +89,10 @@ public interface BizAppointmentRecordService extends IService<BizAppointmentReco
 
     /**地磅端门禁和过磅校验*/
     BizAppointmentRecord checkAppointmentRecord(BizAppointmentRecordPageParam bizAppointmentRecordPageParam);
+
+    /**取消排队**/
+    void cancelAppointmentRecord(BizAppointmentRecordIdParam bizAppointmentRecordIdParam);
+
+    /**调整订单*/
+    void adjustOrder(BizAppointmentRecordEditParam bizAppointmentRecordEditParam);
 }

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

@@ -32,7 +32,11 @@ import vip.xiaonuo.biz.modular.bizappointmenttime.entity.BizAppointmentTime;
 import vip.xiaonuo.biz.modular.bizappointmenttime.service.BizAppointmentTimeService;
 import vip.xiaonuo.biz.modular.bizconfig.entity.BizConfig;
 import vip.xiaonuo.biz.modular.bizconfig.service.BizConfigService;
+import vip.xiaonuo.biz.modular.bizorder.entity.BizOrder;
 import vip.xiaonuo.biz.modular.bizorder.param.BizOrderExportResult;
+import vip.xiaonuo.biz.modular.bizorder.service.BizOrderService;
+import vip.xiaonuo.biz.modular.goods.entity.BizGoods;
+import vip.xiaonuo.biz.modular.goods.service.BizGoodsService;
 import vip.xiaonuo.biz.modular.utils.CommonExportUtil;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
@@ -60,6 +64,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
     private BizAppointmentTimeService bizAppointmentTimeService;
     @Resource
     private TransService transService;
+    @Resource
+    private BizOrderService bizOrderService;
+    @Resource
+    private BizGoodsService bizGoodsService;
 
     @Override
     public Page<BizAppointmentRecord> page(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
@@ -93,6 +101,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
         if(ObjectUtil.isNotEmpty(bizAppointmentRecordPageParam.getStatus())){
             queryWrapper.eq("bar.status",bizAppointmentRecordPageParam.getStatus());
         }
+        //车辆排队去除审核状态
+        if(ObjectUtil.isNotEmpty(bizAppointmentRecordPageParam.getAppointmentFlag())){
+            queryWrapper.notIn("bar.status","1","2");
+        }
         queryWrapper.eq("bar.delete_flag","NOT_DELETE");
         queryWrapper.orderByDesc("bar.create_time");
         return queryWrapper;
@@ -118,8 +130,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
 
         //更新时间段内已预约数
         BizAppointmentTime bizAppointmentTime = bizAppointmentTimeService.getById(bizAppointmentRecordAddParam.getTimeId());
-        bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()+1);
-        bizAppointmentTimeService.updateById(bizAppointmentTime);
+        if(ObjectUtil.isNotNull(bizAppointmentTime)){
+            bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()+1);
+            bizAppointmentTimeService.updateById(bizAppointmentTime);
+        }
     }
 
     public void checkParam(BizAppointmentRecordAddParam bizAppointmentRecordAddParam){
@@ -203,6 +217,17 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
     public void edit(BizAppointmentRecordEditParam bizAppointmentRecordEditParam) {
         BizAppointmentRecord bizAppointmentRecord = this.queryEntity(bizAppointmentRecordEditParam.getId());
         checkParam(bizAppointmentRecordEditParam,bizAppointmentRecord);
+        if(!StringUtils.equals(bizAppointmentRecord.getTimeId(),bizAppointmentRecordEditParam.getTimeId())){
+            //调整了预约时段,释放之前预约时段的预约次数
+            BizAppointmentTime bizAppointmentTime = bizAppointmentTimeService.getById(bizAppointmentRecord.getTimeId());
+            bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()-1);
+            bizAppointmentTimeService.updateById(bizAppointmentTime);
+
+            //新的预约时段,增加已约次数
+            BizAppointmentTime time = bizAppointmentTimeService.getById(bizAppointmentRecordEditParam.getTimeId());
+            time.setApplyNumberAlready(time.getApplyNumberAlready()+1);
+            bizAppointmentTimeService.updateById(time);
+        }
         BeanUtil.copyProperties(bizAppointmentRecordEditParam, bizAppointmentRecord);
         if(StringUtils.equals(bizAppointmentRecord.getStatus(),"2")){
             //如果当前状态是审核不通过的状态,修改后重新提交审核
@@ -218,8 +243,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
         for(BizAppointmentRecordIdParam bizAppointmentRecordIdParam : bizAppointmentRecordIdParamList){
             BizAppointmentRecord bizAppointmentRecord = this.queryEntity(bizAppointmentRecordIdParam.getId());
             BizAppointmentTime bizAppointmentTime = bizAppointmentTimeService.getById(bizAppointmentRecord.getTimeId());
-            bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()-1);
-            bizAppointmentTimeService.updateById(bizAppointmentTime);
+            if(ObjectUtil.isNotNull(bizAppointmentTime)){
+                bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()-1);
+                bizAppointmentTimeService.updateById(bizAppointmentTime);
+            }
         }
         // 执行删除
         this.removeByIds(CollStreamUtil.toList(bizAppointmentRecordIdParamList, BizAppointmentRecordIdParam::getId));
@@ -272,7 +299,95 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
 
     @Override
     public BizAppointmentRecord checkAppointmentRecord(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
-        return null;
+        //根据车牌号和状态查询
+        BizAppointmentRecord bizAppointmentRecord = this.getOne(new QueryWrapper<BizAppointmentRecord>().lambda().
+                eq(BizAppointmentRecord::getLicenseNumber, bizAppointmentRecordPageParam.getLicenseNumber()).
+                eq(BizAppointmentRecord::getStatus, bizAppointmentRecordPageParam.getStatus()).
+                last("limit 1"));
+        if(StringUtils.equals(bizAppointmentRecordPageParam.getStatus(),"4")){
+            //待入场,如果为空,没有待入场的记录,不可进门禁
+            if(ObjectUtil.isNull(bizAppointmentRecord)){
+                bizAppointmentRecord = new BizAppointmentRecord();
+                bizAppointmentRecord.setIsFlag("4");
+            }else{
+                bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
+            }
+        }else if(StringUtils.equals(bizAppointmentRecordPageParam.getStatus(),"5")){
+            //已入场,如果为空,没有已入场的记录,不可一次过磅
+            if(ObjectUtil.isNull(bizAppointmentRecord)){
+                bizAppointmentRecord = new BizAppointmentRecord();
+                bizAppointmentRecord.setIsFlag("5");
+            }else{
+                bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
+            }
+        }else if(StringUtils.equals(bizAppointmentRecordPageParam.getStatus(),"7")){
+            //完成装货,如果为空,没有完成装货的记录,不可二次过磅
+            if(ObjectUtil.isNull(bizAppointmentRecord)){
+                bizAppointmentRecord = new BizAppointmentRecord();
+                bizAppointmentRecord.setIsFlag("7");
+            }else{
+                bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
+            }
+        }else if(StringUtils.equals(bizAppointmentRecordPageParam.getStatus(),"9")){
+            //待出场,如果为空,没有待出场的记录,不可出门禁
+            if(ObjectUtil.isNull(bizAppointmentRecord)){
+                bizAppointmentRecord = new BizAppointmentRecord();
+                bizAppointmentRecord.setIsFlag("9");
+            }else{
+                bizAppointmentRecord = setBizAppointmentRecord(bizAppointmentRecord);
+            }
+        }
+        return bizAppointmentRecord;
+    }
+
+    @Override
+    public void cancelAppointmentRecord(BizAppointmentRecordIdParam bizAppointmentRecordIdParam) {
+        BizAppointmentRecord bizAppointmentRecord = this.queryEntity(bizAppointmentRecordIdParam.getId());
+        //设置已取消
+        bizAppointmentRecord.setStatus("14");
+        this.updateById(bizAppointmentRecord);
+
+        //释放预约数
+        BizAppointmentTime bizAppointmentTime = bizAppointmentTimeService.getById(bizAppointmentRecord.getTimeId());
+        if(ObjectUtil.isNotNull(bizAppointmentTime)){
+            bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()-1);
+            bizAppointmentTimeService.updateById(bizAppointmentTime);
+        }
+    }
+
+    @Override
+    public void adjustOrder(BizAppointmentRecordEditParam bizAppointmentRecordEditParam) {
+        BizAppointmentRecord bizAppointmentRecord = this.queryEntity(bizAppointmentRecordEditParam.getId());
+        if(!StringUtils.equals(bizAppointmentRecord.getOrderId(),bizAppointmentRecordEditParam.getOrderId())){
+            //调整过订单
+            if(StringUtils.equals(bizAppointmentRecord.getStatus(),"8") || StringUtils.equals(bizAppointmentRecord.getStatus(),"9")){
+                //当前状态已完成二次过磅,重量已经添加到订单中,要扣去添加的重量
+                BizOrder bizOrder = bizOrderService.getById(bizAppointmentRecord.getOrderId());
+                if(ObjectUtil.isNotNull(bizOrder)){
+                    //bizOrder.setNetWeight(bi);
+                }
+            }else{
+                bizAppointmentRecord.setOrderId(bizAppointmentRecordEditParam.getOrderId());
+            }
+            this.updateById(bizAppointmentRecord);
+        }
+    }
+
+    public BizAppointmentRecord setBizAppointmentRecord(BizAppointmentRecord bizAppointmentRecord){
+        bizAppointmentRecord.setIsFlag("1");
+        if(ObjectUtil.isNotEmpty(bizAppointmentRecord.getOrderId())){
+            BizOrder bizOrder = bizOrderService.getById(bizAppointmentRecord.getOrderId());
+            if(ObjectUtil.isNotNull(bizOrder)){
+                if(ObjectUtil.isNotEmpty(bizOrder.getGoodId())){
+                    BizGoods bizGoods = bizGoodsService.getById(bizOrder.getGoodId());
+                    if(ObjectUtil.isNotNull(bizGoods)){
+                        bizAppointmentRecord.setGoodsName(bizGoods.getName());
+                        bizAppointmentRecord.setGoodsModel(bizGoods.getModel());
+                    }
+                }
+            }
+        }
+        return bizAppointmentRecord;
     }
 
     /**

+ 5 - 1
snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java

@@ -149,7 +149,11 @@ public class GlobalConfigure implements WebMvcConfigurer {
             "/sys/userCenter/findPasswordGetPhoneValidCode",
             "/sys/userCenter/findPasswordGetEmailValidCode",
             "/sys/userCenter/findPasswordByPhone",
-            "/sys/userCenter/findPasswordByEmail"
+            "/sys/userCenter/findPasswordByEmail",
+
+            /*地磅端预约记录校验*/
+            "/biz/bizappointmentrecord/checkAppointmentRecord",
+            "/biz/bizaccessrecord/add"
     };
 
     /**