Prechádzať zdrojové kódy

其他预约代码提交

fanzherong 1 deň pred
rodič
commit
e020d3933f

+ 66 - 0
snowy-admin-web/src/api/biz/bizOtherAppointmentApi.js

@@ -0,0 +1,66 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/bizotherappointment/` + url, ...arg)
+
+/**
+ * 预约记录Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/03/24 14:47
+ **/
+export default {
+	// 获取预约记录分页
+	bizOtherAppointmentPage(data) {
+		return request('page', data, 'get')
+	},
+	// 其他预约
+	bizOtherAppointmentSubmitForm(data, edit = false) {
+		return request(edit ? 'editOtherAppointment' : 'addOtherAppointment', data)
+	},
+	// 删除预约记录
+	bizOtherAppointmentDelete(data) {
+		return request('deleteOtherAppointment', data)
+	},
+	//强制结束
+	bizOtherAppointmentExit(data){
+		return request('bizOtherAppointmentExit',data)
+	},
+	//授权出场
+	bizAppointmentExit(data){
+		return request('exit',data)
+	},
+	//临时预约授权出场
+	bizAppointmentExitTemp(data){
+		return request('exitTemp',data)
+	},
+	// 获取预约记录详情
+	bizAppointmentRecordDetail(data) {
+		return request('detail', data, 'get')
+	},
+	//审核
+	auditRecord(data){
+		return request('auditRecord',data)
+	},
+	//审核临时预约
+	auditTemp(data){
+		return request('auditTemp',data)
+	},
+	//导出
+	exportRecord(data){
+		return request('exportRecord', data, 'get', {
+			responseType: 'blob'
+		})
+	},
+	//取消排队
+	cancelAppointmentRecord(data){
+		return request('cancelAppointmentRecord',data)
+	},
+	//调整订单
+	adjustOrder(data){
+		return request('adjustOrder',data)
+	},
+	//车辆执行状态分析
+	gerVehicleTotal(data){
+		return request('gerVehicleTotal',data,'get')
+	}
+}

+ 125 - 0
snowy-admin-web/src/views/biz/bizotherappoint/detail.vue

@@ -0,0 +1,125 @@
+<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.licenseNumber }}</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.driverName }}</a-descriptions-item>
+				<a-descriptions-item label="司机电话" :span="2">{{ formData.driverMobile }}</a-descriptions-item>
+				<a-descriptions-item label="创建人" :span="2">{{ formData.createUserName }}</a-descriptions-item>
+				<a-descriptions-item label="创建时间" :span="2">{{ formData.createTime }}</a-descriptions-item>
+
+				<a-descriptions-item label="预约状态" :span="4">
+					<a-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="4">{{ formData.remark }}</a-descriptions-item>
+
+			</a-descriptions>
+		</a-form>
+	</xn-form-container>
+</template>
+
+<script setup name="recordDoubleForm">
+	import { cloneDeep } from 'lodash-es'
+	import sysConfig from "@/config";
+	// 默认是关闭状态
+	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 fileList = ref([])
+	// 打开抽屉
+	const onOpen = (record) => {
+		visible.value = true
+		//getRecordDoubleDetail(record)
+		if(record){
+			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]
+					})
+				}
+			}
+		}
+
+	}
+	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>

+ 134 - 0
snowy-admin-web/src/views/biz/bizotherappoint/form.vue

@@ -0,0 +1,134 @@
+<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="licenseNumber">
+				<a-input v-model:value="formData.licenseNumber" placeholder="请输入车牌号" allow-clear />
+			</a-form-item>
+
+			<a-form-item label="司机信息:" name="driverId">
+				<xn-user-selector
+					:org-tree-api="selectorApiFunction.orgTreeApi"
+					:user-page-api="selectorApiFunction.userPageApi"
+					:radio-model="true"
+					placeholder="请选择司机"
+					v-model:value="formData.driverId"
+				/>
+			</a-form-item>
+
+			<a-form-item label="是否过磅:" name="isWeigh">
+				<a-radio-group button-style="solid" v-model:value="formData.isWeigh">
+					<a-radio-button value="1">
+						是
+					</a-radio-button>
+					<a-radio-button value="2">
+						否
+					</a-radio-button>
+				</a-radio-group>
+			</a-form-item>
+
+			<a-form-item label="备注:" name="remark">
+				<a-textarea v-model:value="formData.remark" placeholder="请输入备注" 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="bizAppointmentRecordForm">
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import bizOtherAppointmentApi from '@/api/biz/bizOtherAppointmentApi'
+	import userApi from '@/api/biz/bizUserApi'
+	// 抽屉状态
+	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 overIdList = ref()
+	const loadPointIdList = ref()
+	const loadTimeIdList = 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)
+		}
+
+
+	}
+
+	// 传递设计器需要的API
+	const selectorApiFunction = {
+		orgTreeApi: (param) => {
+			return userApi.userOrgTreeSelector(param).then((data) => {
+				return Promise.resolve(data)
+			})
+		},
+		userPageApi: (param) => {
+			param.roleName = '司机'
+			return userApi.userSelectorByRole(param).then((data) => {
+				debugger
+				return Promise.resolve(data)
+			})
+		}
+	}
+
+
+
+
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		licenseNumber: [required('请输入车牌号')],
+		driverId: [required('请选择司机')],
+		isWeigh: [required('请选择是否过磅')]
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				debugger
+				bizOtherAppointmentApi
+					.bizOtherAppointmentSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

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

@@ -0,0 +1,544 @@
+<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="licenseNumber">
+						<a-input v-model:value="searchFormState.licenseNumber" placeholder="车牌号" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="司机名称" name="customerName">
+						<a-input v-model:value="searchFormState.customerName" placeholder="司机名称" />
+					</a-form-item>
+				</a-col>
+				<a-col :span="6">
+					<a-form-item label="司机电话" name="customerName">
+						<a-input v-model:value="searchFormState.customerName" placeholder="司机电话" />
+					</a-form-item>
+				</a-col>
+				<template v-if="advanced">
+					<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('bizOtherAppointmentAdd')">
+						<template #icon><plus-outlined /></template>
+						新增
+					</a-button>
+					<a-button @click="exportTotal" v-if="hasPerm('bizOtherAppointmentExport')">
+						<template #icon>
+							<export-outlined/>
+						</template>
+						导出
+					</a-button>
+				</a-space>
+			</template>
+			<template #bodyCell="{ column, record }">
+
+				<template v-if="column.dataIndex === 'driverInfo'">
+					<div class="time-list">
+						<p>姓名:{{ record.driverName }}</p>
+						<p style="margin-bottom: 0">电话:{{ record.driverMobile }}</p>
+					</div>
+				</template>
+
+				<template v-if="column.dataIndex === 'isWeigh'">
+					{{ $TOOL.dictTypeData('is_weigh', record.isWeigh) }}
+				</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-space>
+						<a-dropdown>
+							<a class="ant-dropdown-link">
+								更多
+								<DownOutlined />
+							</a>
+
+							<template #overlay>
+								<a-menu>
+									<a-menu-item>
+										<a @click="detailRef.onOpen(record)">详情</a>
+									</a-menu-item>
+
+									<a-menu-item v-if="hasPerm('bizOtherAppointmentEdit') && (record.status == '2' || record.status == '4')">
+										<a style="color:blue" @click="formRef.onOpen(record)" >编辑</a>
+									</a-menu-item>
+									<a-menu-item v-if="hasPerm('bizOtherAppointmentDelete') && (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('bizOtherAppointmentExit') && (record.status=='5' || record.status=='6' || record.status=='7'
+									|| record.status=='8' || record.status=='9' || record.status=='16' )">
+										<a style="color:green"  @click="cancel(record)" >强制结束</a>
+									</a-menu-item>
+									<a-menu-item v-if="hasPerm('bizOtherAppointmentAuthorize') && (record.status=='17' )">
+										<a style="color:orange"  @click="exit(record)" >授权离场</a>
+									</a-menu-item>
+
+
+								</a-menu>
+							</template>
+						</a-dropdown>
+					</a-space>
+				</template>
+			</template>
+		</s-table>
+	</a-card>
+	<Form ref="formRef" @successful="tableRef.refresh()" />
+	<Review ref="reviewRef" @successful="tableRef.refresh(true)" />
+	<Detail ref="detailRef" @successful="tableRef.refresh()" />
+	<Sign ref="signRef" @successful="tableRef.refresh(true)" />
+
+	<XnSignName ref="XnSignNameRef" :image="searchFormState.driverSign" @successful="signSuccess" />
+	<a-modal v-model:visible="open" title="二维码" width="600px" style="height: 700px">
+		<div id="qrcode" style="text-align: center; margin:  15px 5px 15px 5px">
+			<a-row>
+				<a-col :span="13" id="colFlag">
+					<div style="margin-top:10px;font-size:16px;">
+<!--						<p id="projectNameFlag">订单名称:{{nowRecord.orderName}}</p>-->
+						<p id="projectCodeFlag">客户名称:{{ nowRecord.customerName }}</p>
+						<p id="projectCodeFlag">货品名称:{{ nowRecord.goodsName }}</p>
+						<p id="projectCodeFlag">司机姓名:{{ nowRecord.driverName }}</p>
+						<p id="projectCodeFlag">预约状态:{{ $TOOL.dictTypeData('appointment_status', nowRecord.status) }}</p>
+					</div>
+				</a-col>
+				<a-col :span="11">
+					<a-image width="250"  height="100%" :src="qrCodeUrl.codeUrl"></a-image>
+				</a-col>
+			</a-row>
+		</div>
+		<template #footer>
+			<a-button @click="closeQrCode">关闭</a-button>
+			<a-button type="primary" @click="downloadFile">下载</a-button>
+		</template>
+	</a-modal>
+</template>
+
+<script setup name="bizappointmentrecord">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import Detail from './detail.vue'
+	import bizOtherAppointmentApi from '@/api/biz/bizOtherAppointmentApi'
+	import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
+	import {Modal} from 'ant-design-vue';
+	import {createVNode} from 'vue';
+	import tool from '@/utils/tool'
+	import downloadUtil from '@/utils/downloadUtil'
+	import bizRecordApi from '@/api/biz/bizRecordApi'
+
+	const submitLoading = ref(false)
+	const tableRef = ref()
+	const signRef = ref()
+	const formRef = ref()
+	const reviewRef = ref()
+	const detailRef = ref()
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+
+	const nowRecord = ref()
+	const XnSignNameRef = ref()
+
+	//查询数据
+	const searchFormState = ref({})
+	const searchFormRef = ref()
+	const statusList = tool.dictList('appointment_status')
+
+	// 查询区域显示更多控制
+	const advanced = ref(false)
+	const toggleAdvanced = () => {
+		advanced.value = !advanced.value
+	}
+
+	const columns = [
+		{
+			title: '车牌号',
+			dataIndex: 'licenseNumber',
+			width:150,
+			align: 'center'
+		},
+
+
+		{
+			title: '司机信息',
+			dataIndex: 'driverInfo',
+			width: 160
+		},
+
+		{
+			title: '是否过磅',
+			dataIndex: 'isWeigh',
+			width: 110,
+			align:'center'
+		},
+		{
+			title: '状态',
+			dataIndex: 'status',
+			align: 'center',
+			width:130
+		},
+		{
+			title: '备注',
+			dataIndex: 'remark',
+			align: 'center',
+			width:130
+		},
+	]
+	// 操作栏通过权限判断是否显示
+	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)
+		searchFormParam.type = '6'
+		return bizOtherAppointmentApi.bizOtherAppointmentPage(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
+			}
+		]
+		bizOtherAppointmentApi.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
+					}
+				]
+
+				bizOtherAppointmentApi
+					.bizOtherAppointmentDelete(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	//取消预约
+	const cancel = (record) => {
+
+		Modal.confirm({
+			title: '确定要取消吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizOtherAppointmentApi
+					.bizOtherAppointmentExit(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+
+	//授权出场
+	const exit = (record) => {
+
+		Modal.confirm({
+			title: '确定要授权出场吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: record.id
+					}
+
+
+				bizOtherAppointmentApi
+					.bizAppointmentExit(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 批量删除
+	const deleteBatchBizAppointmentRecord = (params) => {
+		bizOtherAppointmentApi.bizAppointmentRecordDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+
+	//二维码
+	const open = ref(false);
+	const qrCodeUrl = ref({})
+	const showModal = (record) => {
+		nowRecord.value = record
+		open.value = true;
+		getQrCode(record)
+
+	};
+
+	const getQrCode = (record) => {
+		//QRCode.toDataURL("id:"+record.id+"saleCode:"+record.saleCode, {
+		let param = {
+			id:record.id,
+			licenseNumber:record.licenseNumber
+		}
+		QRCode.toDataURL(JSON.stringify(param), {
+			errorCorrectionLevel: 'H',
+			margin: 1,
+			height: 206,
+			width: 206,
+			type: '10',
+			scal: 177,
+			color: {
+				dark: '#000' // 二维码背景颜色
+			},
+			rendererOpts: {
+				quality: 0.9
+			}
+		})
+			.then((url) => {
+				qrCodeUrl.value.codeUrl = url
+			})
+			.catch((err) => {
+				console.error(err)
+			})
+	}
+
+	const closeQrCode = () => {
+		open.value = false;
+	}
+
+	// 下载二维码
+	const downloadFile = () => {
+		const qrcodeDiv = document.getElementById('qrcode');
+		html2canvas(qrcodeDiv, {
+			logging: false,
+			allowTaint: true,
+			scale: window.devicePixelRatio,
+			scrollY: 0,
+			scrollX: 0,
+			useCORS: true,
+			backgroundColor: '#ffffff'
+		})
+			.then(function (canvas) {
+				const a = window.document.createElement('a')
+				a.href = canvas.toDataURL('image/png')
+				a.download = '二维码'
+				a.click()
+				this.$message.success('正在进行下载保存')
+			})
+			.catch((err) => {
+				console.log(err)
+			})
+	}
+
+
+	//导出
+	const exportTotal = () => {
+		/*const searchFormParam = cloneDeep(searchFormState.value)
+		bizOtherAppointmentApi.exportRecord(Object.assign(searchFormParam)).then((res)=>{
+			downloadUtil.resultDownload(res)
+		})*/
+		Modal.confirm({
+			title: '确定要导出记录吗?',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '',
+			onOk() {
+				submitLoading.value = true
+				const searchFormParam = cloneDeep(searchFormState.value)
+
+				bizOtherAppointmentApi
+					.exportRecord(Object.assign(searchFormParam))
+					.then((res) => {
+						downloadUtil.resultDownload(res)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
+
+	// 签名板组件回调
+	const signSuccess = (value) => {
+		const param = {
+			id:value.id,
+			driverSign: value.value
+		}
+		bizRecordApi.updateDriverSign(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;
+		}
+	}
+}
+</style>

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

@@ -24,15 +24,12 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.param.*;
 import vip.xiaonuo.biz.modular.bizorder.param.BizOrderPageParam;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.annotation.CommonNoRepeat;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordAddParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordEditParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordIdParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordPageParam;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.service.BizAppointmentRecordService;
 
 import jakarta.annotation.Resource;
@@ -328,4 +325,74 @@ public class BizAppointmentRecordController {
     public CommonResult<Page<BizAppointmentRecord>> getLoadPage(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
         return CommonResult.data(bizAppointmentRecordService.getLoadPage(bizAppointmentRecordPageParam));
     }
+
+    /**
+     * 其他预约_记录分页
+     *
+     * @author fanzherong
+     * @date  2025/03/24 14:47
+     */
+    @Operation(summary = "其他预约_记录分页")
+    @SaCheckPermission("/biz/bizotherappointment/page")
+    @GetMapping("/biz/bizotherappointment/page")
+    public CommonResult<Page<BizAppointmentRecord>> bizOtherAppointmentPage(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
+        return CommonResult.data(bizAppointmentRecordService.page(bizAppointmentRecordPageParam));
+    }
+
+
+    /**
+     * 其他预约_添加
+     *
+     * @author xumudong
+     * @date  2025/07/02 11:47
+     */
+    @Operation(summary = "其他预约_添加")
+    @CommonLog("其他预约_添加")
+    @CommonNoRepeat
+    @PostMapping("/biz/bizotherappointment/addOtherAppointment")
+    public CommonResult<String> addOtherAppointment(@RequestBody @Valid BizOtherAppointmentAddParam bizOtherAppointmentAddParam) {
+        bizAppointmentRecordService.addOtherAppointment(bizOtherAppointmentAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 其他预约_编辑
+     *
+     * @author xumudong
+     * @date  2025/07/02 11:47
+     */
+    @Operation(summary = "其他预约_编辑")
+    @CommonLog("其他预约_编辑")
+    @PostMapping("/biz/bizotherappointment/editOtherAppointment")
+    public CommonResult<String> editOtherAppointment(@RequestBody @Valid BizOtherAppointmentEditParam bizOtherAppointmentEditParam) {
+        bizAppointmentRecordService.editOtherAppointment(bizOtherAppointmentEditParam);
+        return CommonResult.ok();
+    }
+    /**
+     * 临时预约_删除
+     *
+     * @author fanzherong
+     * @date  2025/03/24 14:47
+     */
+    @Operation(summary = "临时预约_删除")
+    @CommonLog("临时预约_删除")
+    @PostMapping("/biz/bizotherappointment/deleteOtherAppointment")
+    public CommonResult<String> deleteOtherAppointment(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                               List<BizAppointmentRecordIdParam> bizAppointmentRecordIdParamList) {
+        bizAppointmentRecordService.delete(bizAppointmentRecordIdParamList);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 临时预约_强制结束
+     */
+    @Operation(summary = "临时预约_强制结束")
+    @CommonLog("临时预约_强制结束")
+    @PostMapping("/biz/bizotherappointment/bizOtherAppointmentExit")
+    public CommonResult<String> bizOtherAppointmentExit(@RequestBody BizAppointmentRecordIdParam bizAppointmentRecordIdParam){
+        bizAppointmentRecordService.bizOtherAppointmentExit(bizAppointmentRecordIdParam);
+        return CommonResult.ok();
+    }
+
 }

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

@@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.annotation.*;
 import com.fhs.core.trans.anno.Trans;
 import com.fhs.core.trans.constant.TransType;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
 import lombok.Setter;
 import vip.xiaonuo.common.pojo.CommonEntity;
@@ -58,6 +59,11 @@ public class BizAppointmentRecord extends CommonEntity {
     /** 司机电话 */
     @Schema(description = "司机电话")
     private String driverMobile;
+    /**
+     * 司机用户ID
+     */
+    @Schema(description = "司机用户ID")
+    private String driverId;
 
     /** 状态(1:待审核  2:审核不通过   3:排队中  4:可入场  5:已入场  6:一次过磅  7:完成装货   8:二次过磅   9:待出场  10:已出场   11:已签收   12:自动审核   13:销售已审核   14:已取消) */
     @Trans(type = TransType.DICTIONARY, key = "appointment_status")
@@ -172,6 +178,12 @@ public class BizAppointmentRecord extends CommonEntity {
     /**装卸时间ID**/
     private String loadTimeId;
 
+    /**是否过磅 1-是 2-否**/
+    private String isWeigh;
+
+    /**备注**/
+    private String remark;
+
     /**装卸点位*/
     @TableField(exist = false)
     private String loadPoint;
@@ -203,4 +215,28 @@ public class BizAppointmentRecord extends CommonEntity {
     /**起卸单号*/
     @TableField(exist = false)
     private String loadNumber;
+
+
+    /**
+     * 其他预约_强制结束操作人
+     */
+    @Schema(description = "操作人")
+    private String exitOperator;
+    /**
+     * 其他预约_强制结束操作时间
+     */
+    @Schema(description = "操作时间")
+    private String exitTime;
+
+    /**
+     * 其他预约_授权离场操作人
+     */
+    @Schema(description = "操作人")
+    private String authorizeOperator;
+    /**
+     * 其他预约_授权离场操作时间
+     */
+    @Schema(description = "操作时间")
+    private String authorizeTime;
+
 }

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

@@ -5,7 +5,13 @@
     <select id="getPage" resultType="vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord">
         select
             bar.id,
-            bar.order_id,
+            bar.is_weigh,
+            bar.remark,
+            bar.driver_id,
+            bar.exit_operator,
+            bar.exit_time,
+            bar.authorize_operator,
+            bar.authorize_time,
             bar.license_number,
             bo.order_number,
             bo.order_name,

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

@@ -0,0 +1,71 @@
+/*
+ * 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.bizappointmentrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 其他预约记录添加参数
+ *
+ * @author xumudong
+ * @date 2025/07/02 09:50
+ **/
+@Getter
+@Setter
+public class BizOtherAppointmentAddParam {
+
+
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "licenseNumber不能为空")
+    private String licenseNumber;
+
+    /**
+     * 是否过磅
+     */
+    @Schema(description = "是否过磅", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "isWeigh不能为空")
+    private String isWeigh;
+
+    /**
+     * 司机姓名
+     */
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    /**
+     * 司机电话
+     */
+    @Schema(description = "司机电话")
+    private String driverMobile;
+
+
+    /**
+     * 司机用户ID
+     */
+    @Schema(description = "司机用户ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "司机不能为空")
+    private String driverId;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+}

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

@@ -0,0 +1,74 @@
+/*
+ * 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.bizappointmentrecord.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 其他预约记录添加参数
+ *
+ * @author xumudong
+ * @date 2025/07/02 09:50
+ **/
+@Getter
+@Setter
+public class BizOtherAppointmentEditParam {
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "licenseNumber不能为空")
+    private String licenseNumber;
+
+    /**
+     * 是否过磅
+     */
+    @Schema(description = "是否过磅", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "isWeigh不能为空")
+    private String isWeigh;
+
+    /**
+     * 司机姓名
+     */
+    @Schema(description = "司机姓名")
+    private String driverName;
+
+    /**
+     * 司机电话
+     */
+    @Schema(description = "司机电话")
+    private String driverMobile;
+
+
+    /**
+     * 司机用户ID
+     */
+    @Schema(description = "司机用户ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "司机不能为空")
+    private String driverId;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+}

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

@@ -16,10 +16,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.servlet.http.HttpServletResponse;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordAddParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordEditParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordIdParam;
-import vip.xiaonuo.biz.modular.bizappointmentrecord.param.BizAppointmentRecordPageParam;
+import vip.xiaonuo.biz.modular.bizappointmentrecord.param.*;
 import vip.xiaonuo.biz.modular.bizorder.param.BizOrderPageParam;
 
 import java.io.IOException;
@@ -134,4 +131,25 @@ public interface BizAppointmentRecordService extends IService<BizAppointmentReco
 
     /**起卸预约编辑*/
     void editLoad(BizAppointmentRecordEditParam bizAppointmentRecordEditParam);
+
+
+
+    /**
+     * 其他预约_新增
+     * @param bizOtherAppointmentAddParam
+     */
+    void addOtherAppointment(BizOtherAppointmentAddParam bizOtherAppointmentAddParam);
+    /**
+     * 其他预约_编辑
+     * @param bizOtherAppointmentEditParam
+     */
+    void editOtherAppointment(BizOtherAppointmentEditParam bizOtherAppointmentEditParam);
+
+
+    /**
+     * 其他预约_强制结束
+     * @param bizAppointmentRecordIdParam
+     */
+    void bizOtherAppointmentExit(BizAppointmentRecordIdParam bizAppointmentRecordIdParam);
+
 }

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 244 - 242
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java


+ 1 - 1
snowy-web-app/src/main/resources/application-local.properties

@@ -102,7 +102,7 @@ spring.jackson.serialization.write-dates-as-timestamps=false
 spring.data.redis.database=9
 spring.data.redis.host=127.0.0.1
 spring.data.redis.port=6379
-spring.data.redis.password=lease
+spring.data.redis.password=
 spring.data.redis.timeout=10s
 
 spring.data.redis.lettuce.pool.max-active=200

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov