fanzherong_v 1 mesiac pred
rodič
commit
72eadbbe7d

+ 1 - 0
snowy-admin-web/package.json

@@ -38,6 +38,7 @@
 		"fuse.js": "7.0.0",
 		"highlight.js": "11.10.0",
 		"hotkeys-js": "3.13.7",
+		"html2canvas": "^1.4.1",
 		"js-pinyin": "0.2.7",
 		"lodash-es": "4.17.21",
 		"moment": "^2.30.1",

+ 17 - 0
snowy-admin-web/src/views/biz/bizappointmentrecord/detail.vue

@@ -54,6 +54,12 @@
 				<a-descriptions-item label="司机确认" :span="4">
 					<a-image :width="200" :src="formData.driverSign" />
 				</a-descriptions-item>
+				<a-descriptions-item label="卸货重量(吨)" :span="4">{{ formData.unloadWeight }}</a-descriptions-item>
+				<a-descriptions-item label="司机回签" :span="4">
+					<div v-for="(item,index) in fileList " :key="item.value">
+						<a-image :width="200" :src="item.url" />
+					</div>
+				</a-descriptions-item>
 			</a-descriptions>
 		</a-form>
 	</xn-form-container>
@@ -61,6 +67,7 @@
 
 <script setup name="recordDoubleForm">
 	import { cloneDeep } from 'lodash-es'
+	import sysConfig from "@/config";
 	// 默认是关闭状态
 	const visible = ref(false)
 	const formData = ref({})
@@ -78,6 +85,7 @@
 	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
@@ -85,6 +93,15 @@
 		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]
+					})
+				}
+			}
 		}
 
 	}

+ 7 - 0
snowy-admin-web/src/views/biz/bizappointmentrecord/index.vue

@@ -182,6 +182,10 @@
 									<a-menu-item v-if="hasPerm('bizAppointmentDriverConfim') && record.status == '8'">
 										<a @click="XnSignNameRef.show(record.recordId)" >确认</a>
 									</a-menu-item>
+									<a-menu-item v-if="hasPerm('bizAppointmentDriverSign') && record.status=='10' && record.orderType=='1'">
+										<a  @click="signRef.onOpen(record)" >回签</a>
+									</a-menu-item>
+
 
 								</a-menu>
 							</template>
@@ -194,6 +198,7 @@
 	<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">
@@ -235,9 +240,11 @@
 	import html2canvas from 'html2canvas'
 	import downloadUtil from '@/utils/downloadUtil'
 	import bizRecordApi from '@/api/biz/bizRecordApi'
+	import Sign from './sign.vue'
 
 	const submitLoading = ref(false)
 	const tableRef = ref()
+	const signRef = ref()
 	const formRef = ref()
 	const reviewRef = ref()
 	const detailRef = ref()

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

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

+ 4 - 4
snowy-admin-web/src/views/biz/bizsendrecord/detail.vue

@@ -10,9 +10,9 @@
 			<a-descriptions-item span="3" label="车次编码">{{ formData.carNumber }}</a-descriptions-item>
 			<a-descriptions-item label="车牌号码">{{ formData.licensePlate }}</a-descriptions-item>
 			<a-descriptions-item span="2" label="车牌颜色">{{ formData.plateColor }}</a-descriptions-item>
-			<a-descriptions-item label="发货单位">{{ formData.shippingCompany }}</a-descriptions-item>
+<!--			<a-descriptions-item label="发货单位">{{ formData.shippingCompany }}</a-descriptions-item>
 			<a-descriptions-item label="收货单位">{{ formData.receiptCompany }}</a-descriptions-item>
-			<a-descriptions-item label="运输单位">{{ formData.transportCompany }}</a-descriptions-item>
+			<a-descriptions-item label="运输单位">{{ formData.transportCompany }}</a-descriptions-item>-->
 			<!-- <a-descriptions-item label="运输路线">{{ formData.transportRoute }}</a-descriptions-item> -->
 			<a-descriptions-item label="货品名称">{{ formData.goodsName }}</a-descriptions-item>
 			<a-descriptions-item label="货品规格">{{ formData.goodsModel }}</a-descriptions-item>
@@ -21,8 +21,8 @@
 			<a-descriptions-item label="订单编号">{{ formData.orderNumber }}</a-descriptions-item>
 			<a-descriptions-item label="客户名称">{{ formData.customerName }}</a-descriptions-item>
 			<a-descriptions-item label="司机电话">{{ formData.driverMobile }}</a-descriptions-item>
-			<a-descriptions-item label="过磅人">{{ formData.extKey1 }}</a-descriptions-item>
-			<a-descriptions-item label="打印时间">{{ formData.extKey2 }}</a-descriptions-item>
+<!--			<a-descriptions-item label="过磅人">{{ formData.extKey1 }}</a-descriptions-item>
+			<a-descriptions-item label="打印时间">{{ formData.extKey2 }}</a-descriptions-item>-->
 		</a-descriptions>
 		<a-divider></a-divider>
 		<a-descriptions>

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

@@ -70,6 +70,13 @@
 						<a-input v-model:value="searchFormState.customerName" placeholder="请输入客户名称" />
 					</a-form-item>
 				</a-col>
+				<a-col :span="6" v-show="advanced">
+					<a-form-item label="确认状态" name="sendRecordStatus">
+						<a-select v-model:value="searchFormState.sendRecordStatus" placeholder="确认状态查询"
+								  :options="sendRecordStatusList"
+						> </a-select>
+					</a-form-item>
+				</a-col>
 				<a-col :span="6">
 					<a-button type="primary" @click="tableRef.refresh()">查询</a-button>
 					<a-button style="margin: 0 8px" @click="reset">重置</a-button>
@@ -90,11 +97,14 @@
 			:row-key="(record) => record.id"
 		>
 			<template #operator class="table-operator">
-				<a-space>
-<!--					<a-button type="dashed" class="snowy-buttom-left" @click="exportData()" v-if="hasPerm('bizRecordBatchExport')"
-						><export-outlined />记录导出</a-button
-					>-->
-				</a-space>
+<!--				<a-space>
+					<a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizRecordToConfirm')">
+						待确认
+					</a-button>
+					<a-button style="background-color: orange;" type="primary" @click="formRef.onOpen()" v-if="hasPerm('bizRecordAlreadyConfirm')">
+						已确认
+					</a-button>
+				</a-space>-->
 			</template>
 			<template #bodyCell="{ column, record }">
 				<template v-if="column.dataIndex === 'licensePlate'">
@@ -187,6 +197,8 @@
 	import {createVNode} from "vue";
 	import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
 	import bizAppointmentRecordApi from "@/api/biz/bizAppointmentRecordApi";
+	import tool from '@/utils/tool'
+
 	const searchFormState = ref({isFlag:1})
 	const searchFormRef = ref()
 	const tableRef = ref()
@@ -197,6 +209,7 @@
 	const advanced = ref(false)
 
 	const submitLoading = ref(false)
+	const sendRecordStatusList = tool.dictList('send_record_status')
 
 	const toggleAdvanced = () => {
 		advanced.value = !advanced.value

+ 13 - 3
snowy-admin-web/src/views/biz/record/detail.vue

@@ -71,14 +71,14 @@
 			<a-image v-if="formData.tareCapturePoundRoom != null" :width="200" :src="formData.tareCapturePoundRoom" />
 		</a-space>
 		<a-divider></a-divider>
-		<a-descriptions title="司机签名" style="margin-top: 15px">
+		<a-descriptions title="司机确认" style="margin-top: 15px">
 		</a-descriptions>
 		<a-space>
 			<a-image :width="200" :src="formData.driverSign" />
 		</a-space>
 		<a-divider></a-divider>
 		<a-descriptions title="司机回签" style="margin-top: 15px">
-			<a-descriptions-item label="卸货重量"><a-tag color="green">{{ formData.unloadWeight }} KG</a-tag></a-descriptions-item>
+			<a-descriptions-item label="卸货重量"><a-tag color="green">{{ formData.unloadWeight }} </a-tag></a-descriptions-item>
 		</a-descriptions>
 		<a-space>
 			<div v-for="(item,index) in fileList " :key="item.value">
@@ -87,7 +87,7 @@
 
 		</a-space>
 		<a-divider></a-divider>
-		<a-descriptions title="平台手签" style="margin-top: 15px">
+		<a-descriptions title="签收审核" style="margin-top: 15px">
 		</a-descriptions>
 		<a-space>
 			<a-image :width="200" :src="formData.auditSign" />
@@ -113,6 +113,7 @@
 	// const submitLoading = ref(false)
 	const tareTypeOptions = ref([])
 
+	const fileList = ref([])
 	// 打开抽屉
 	const onOpen = (record) => {
 		open.value = true
@@ -126,6 +127,15 @@
 			})*/
 			let recordData = cloneDeep(record)
 			formData.value = Object.assign({}, recordData)
+			fileList.value = []
+			if(formData.value.unloadImg!=null){
+				for (var i=0;i<formData.value.unloadImg.split(',').length;i++){
+					fileList.value.push({
+						name: formData.value.unloadName.split(',')[i],
+						url:sysConfig.PREVIEW_PATH + formData.value.unloadImg.split(',')[i]
+					})
+				}
+			}
 			if(formData.value.grossPlateName.includes("http://218.2.6.74:8065")){
 				console.log("str:"+formData.value.grossPlateName.indexOf("preview/"))
 				formData.value.grossPlateName = formData.value.grossPlateName.replace("http://218.2.6.74:8065/preview/",sysConfig.PREVIEW_PATH)

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

@@ -127,4 +127,18 @@ public class BizAppointmentRecord extends CommonEntity {
     @TableField(exist = false)
     /**司机签名*/
     private String driverSign;
+
+    @TableField(exist = false)
+    /**订单类型*/
+    private String orderType;
+
+    @TableField(exist = false)
+    /**卸货重量*/
+    private BigDecimal unloadWeight;
+
+    /**单据图片*/
+    @TableField(exist = false)
+    private String unloadImg;
+    @TableField(exist = false)
+    private String unloadName;
 }

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

@@ -9,6 +9,7 @@
             bar.license_number,
             bo.order_number,
             bo.order_name,
+            bo.order_type,
             bc.name customerName,
             bg.GOODS_NAME goodsName,
             bg.GOODS_MODEL goodsModel,
@@ -23,7 +24,10 @@
             bec.vehicle_axle_number axleNumber,
             br.id recordId,
             bar.queue_number,
-            br.driver_sign
+            br.driver_sign,
+            br.unload_weight/1000 unload_weight,
+            br.unload_img,
+            br.unload_name
         from biz_appointment_record bar
          left join biz_order bo on bar.order_id = bo.id
          left join biz_goods bg on bg.id = bo.good_id

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

@@ -314,7 +314,7 @@
             br.confirm_user,
             br.appointment_user,
             br.driver_sign,
-            br.unload_weight,
+            br.unload_weight/1000 unload_weight,
             br.unload_img,
             br.unload_name,
             br.audit_sign,

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

@@ -118,4 +118,7 @@ public class BizRecordPageParam {
     /**签收审核标识*/
     private String signFlag;
 
+    /**发货确认状态*/
+    private String sendRecordStatus;
+
 }

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

@@ -149,6 +149,16 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
             queryWrapper.in("bar.status","10","11","12","13");
             queryWrapper.eq("bo.order_type","1");
         }
+        //发货确认状态查询
+        if (ObjectUtil.isNotEmpty(bizRecordPageParam.getSendRecordStatus())){
+            if(StringUtils.equals(bizRecordPageParam.getSendRecordStatus(),"1")){
+                //待确认
+                queryWrapper.isNull("br.confirm_user");
+            }else{
+                //已确认
+                queryWrapper.isNotNull("br.confirm_user");
+            }
+        }
         if (ObjectUtil.isNotEmpty(bizRecordPageParam.getOrderName())){
             queryWrapper.like("bo.order_name",bizRecordPageParam.getOrderName());
         }
@@ -629,7 +639,7 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
                 appointmentRecord.setStatus("11");
             }else{
                 //计算差值百分比
-                BigDecimal decimal = weight.divide(bizRecord.getNetWeight()).multiply(new BigDecimal(100));
+                BigDecimal decimal = weight.divide(bizRecord.getNetWeight(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
                 BizConfig bizConfig = bizConfigService.getOne(new QueryWrapper<BizConfig>().lambda().last("limit 1"));
                 if(decimal.compareTo(bizConfig.getLossWarn()) > 0){
                     appointmentRecord.setStatus("12");