diff --git a/src/api/consigner/vehicle.js b/src/api/consigner/vehicle.js index 9bdb547..7010f22 100644 --- a/src/api/consigner/vehicle.js +++ b/src/api/consigner/vehicle.js @@ -39,3 +39,26 @@ export const selectNameList = params => { return axios.get(`${baseServiceURL}/ma //多车定位 export const queryMulVel = params => { return axios.get(`${baseServiceURL}/map/location/queryMulVel`, { params: params }); }; + +//车载运单查询列表 +export const selectNewInventroyrecords = params => { return axios.get(`${baseServiceURL}/wms/vehicleWaybill/selectNewInventroyrecords`, { params: params }); }; +//车载运单新增 +export const addVehicleWaybill = params => { return http.post(`${baseServiceURL}/wms/vehicleWaybill/addVehicleWaybill`, params); }; +//车载运单删除 +export const delVehicleWaybill = params => { return axios.get(`${baseServiceURL}/wms/vehicleWaybill/delVehicleWaybill`, { params: params }); }; +//车载运单更新 +export const ediVehicleWaybill = params => { return http.post(`${baseServiceURL}/wms/vehicleWaybill/ediVehicleWaybill`, params); }; +//车辆派单 +export const paidan = params => { return http.post(`${baseServiceURL}/wms/vehicleWaybill/paidan`, params); }; +//查询车载派单记录列表 +export const selectByDispatchList = params => { return axios.get(`${baseServiceURL}/wms/tracker/selectByDispatchList`, { params: params }); }; +//手动新增车载派单记录 +export const addTracker = params => { return http.post(`${baseServiceURL}/wms/tracker/addTracker`, params); }; +//根据派单号查询运单列表 +export const selectListByDispatch = params => { return axios.get(`${baseServiceURL}/wms/vehicleWaybill/selectListByDispatch`, { params: params }); }; +//上传EXCEL +export const UploadExcel = params => { return http.postExcelData(`${baseServiceURL}/wms/vehicleWaybill/upload`, params); }; +//车载货物图片上传 +export const uploadGoodsImage = params => { return http.postExcelData(`${baseServiceURL}/wms/vehicleWaybill/uploadGoodsImage`, params); }; +//查询货物图片列表 +export const selectPicsByDispatch = params => { return axios.get(`${baseServiceURL}/wms/vehicleWaybill/selectPicsByDispatch`, { params: params }); }; diff --git a/src/api/http.js b/src/api/http.js index 9bfdda0..3b24a01 100644 --- a/src/api/http.js +++ b/src/api/http.js @@ -48,6 +48,16 @@ export default { } }) }, + postExcelData(url, data) { + return axios({ + method: 'POST', // 请求协议 + url: url, // 请求的地址 + data: data, // post 请求的数据 + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + }, get(url, params) { return axios({ method: 'GET', diff --git a/src/api/minio-config.js b/src/api/minio-config.js new file mode 100644 index 0000000..8f58af5 --- /dev/null +++ b/src/api/minio-config.js @@ -0,0 +1,11 @@ +import Minio from 'minio'; + +const minioClient = new Minio.Client({ + endPoint: 'http://47.99.102.169', + port: 9000, + useSSL: false, + accessKey: 'ruitai', + secretKey: 'vmvnv1v2', +}); + +export default minioClient; diff --git a/src/routes.js b/src/routes.js index 57d391a..e239f20 100755 --- a/src/routes.js +++ b/src/routes.js @@ -112,6 +112,8 @@ import myTask from './views/technological/myTask.vue' import definition from './views/technological/definition.vue' //仓库场站管理 +import Tracker from './views/deploy/Tracker.vue' +import VehicleWaybill from './views/deploy/VehicleWaybill.vue' import vehicle from './views/deploy/vehicle.vue' import trajectory from './views/deploy/trajectory.vue' import attendance from './views/deploy/attendance.vue' @@ -573,6 +575,8 @@ let routes = [ name: '仓库场站管理', iconCls:'el-icon-goods', children:[ + {path:'/Tracker',component:Tracker,name:'派单记录'}, + {path:'/VehicleWaybill',component:VehicleWaybill,name:'车载运单'}, {path:'/vehicle',component:vehicle,name:'车辆定位'}, {path:'/trajectory',component:trajectory,name:'车辆轨迹'}, {path:'/attendance',component:attendance,name:'出勤历史'}, diff --git a/src/views/deploy/Tracker.vue b/src/views/deploy/Tracker.vue new file mode 100644 index 0000000..97a501e --- /dev/null +++ b/src/views/deploy/Tracker.vue @@ -0,0 +1,365 @@ +<template> + <div> + <div> + <el-descriptions class="margin-top" title="车辆信息" :column="3" :size="size" border> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-user"></i> + 司机 + </template> + {{carinfo.veOwnerName}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-mobile-phone"></i> + 手机号 + </template> + {{carinfo.ownerInsideTel}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-truck"></i> + 车号 + </template> + {{carinfo.domesticLisenceNo}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-tickets"></i> + 驾驶证有效期 + </template> + <el-tag size="small">{{carinfo.veFactoryDate}}</el-tag> + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-shopping-cart-full"></i> + 车自重 + </template> + {{carinfo.selfWt}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-office-building"></i> + 地址 + </template> + {{carinfo.proposer}} + </el-descriptions-item> + </el-descriptions> + </div> + <div style="margin-top: 10px"> + <el-descriptions class="margin-top" title="派单列表" :column="3" :size="size" border></el-descriptions> + <el-table + ref="multipleTable" + :data="tableData" + tooltip-effect="dark" + style="width: 100%" + > + <el-table-column + prop="dispatch" + label="派单号" + width="150"> + </el-table-column> + <el-table-column + prop="awba" + label="主单号" + width="105"> + </el-table-column> + <el-table-column + prop="awbh" + label="分单号" + width="140"> + </el-table-column> + <el-table-column + prop="deststation" + label="目的港" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="pcs" + label="件数" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="weight" + label="毛重" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="vol" + label="体积" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="charge" + label="应收" + show-overflow-tooltip> + </el-table-column> + </el-table> + </div> + <div style="margin-top: 10px"> + <el-descriptions class="margin-top" title="车辆跟踪" :column="3" :size="size" border> + <template slot="extra"> + <el-button type="primary" size="small" @click="addRecords">添加记录</el-button> + </template> + </el-descriptions> + <div> + <el-timeline :reverse="reverse"> + <el-timeline-item + v-for="(activity, index) in activities" + :key="index" + :timestamp="activity.opertime"> + <span style="color: #5BB75B;font-weight: bold">状态:</span>{{activity.status}}--<span style="color: #5BB75B;font-weight: bold">跟踪信息:</span>{{activity.info}} + </el-timeline-item> + </el-timeline> + </div> + </div> + <div> + <el-dialog + title="添加车辆跟进信息" + :visible.sync="dialogVisible" + width="30%" + :before-close="handleClose"> + <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> + <el-form-item label="派单号" prop="dispatch"> + <el-input v-model="ruleForm.dispatch" disabled></el-input> + </el-form-item> + <el-form-item label="跟进状态" prop="status"> + <el-select v-model="ruleForm.status" placeholder="请选择状态" style="width: 100%"> + <el-option label="待装" value="待装"></el-option> + <el-option label="在途" value="在途"></el-option> + <el-option label="已到未卸" value="已到未卸"></el-option> + <el-option label="已完成" value="已完成"></el-option> + </el-select> + </el-form-item> + <el-form-item label="跟进信息" prop="info"> + <el-input v-model="ruleForm.info"></el-input> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="submitForm('ruleForm')">保存</el-button> + <el-button @click="resetForm('ruleForm')">取消</el-button> + </el-form-item> + </el-form> + </el-dialog> + </div> + <div> + <el-descriptions class="margin-top" title="货物照片" :column="3" :size="size" border> + <template slot="extra"> + <el-upload + class="upload-demo" + action="" + :http-request="uploadRequest" + :on-change="handleChange" + :on-success="handleSuccess" + :on-error="handleError" + :before-upload="beforeUpload" + multiple + accept="image/*" + > + <el-button size="small" type="success">上传照片</el-button> + </el-upload> + </template> + </el-descriptions> + <div> + <el-image + v-for="(url, index) in validUrls" + :key="index" + :src="url" + style="width: 200px; height: 200px; margin: 10px;" + :preview-src-list="validUrls" + /> + </div> + </div> + </div> +</template> +<script> + import {list} from "../../api/road_verecord/verecord"; + import { + selectListByDispatch, + selectByDispatchList, + addTracker, + uploadGoodsImage, + selectPicsByDispatch + } from "../../api/consigner/vehicle"; + export default { + data() { + return{ + ruleForm:{ + dispatch: "", + id: "", + info: "", + opertime: "", + status: "" + }, + rules:{ + status: [ + { required: true, message: '请选择跟进状态', trigger: 'change' } + ], + }, + reverse: false, + activities: [], + validUrls:[], + routerinfo:{}, + carinfo:{}, + size: 'medium', + tableData:[], + dialogVisible: false + } + }, + methods:{ + getImgList(){ + selectPicsByDispatch({dispatch:this.routerinfo.dispatch}).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('获取消息收发记录,失败!') + } + if(res.data.urls && res.data.urls.trim() !== ''){ + this.validUrls= res.data.urls + .split(',') + .filter(url => url.trim() !== ''); + } + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + }) + }, + + beforeUpload(file) { + const isImage = file.type.startsWith('image/'); + if (!isImage) { + this.$message.error('只能上传图片文件!'); + } + return isImage; + }, + handleChange(file, fileList) { + console.log(file, fileList); + }, + handleSuccess(response, file, fileList) { + console.log('Upload successful:', response); + }, + handleError(err, file, fileList) { + console.error('Upload failed:', err); + }, + uploadRequest({ file, onSuccess, onError }) { + const formData = new FormData(); + formData.append('file', file); + formData.append('dispatch',this.routerinfo.dispatch); + uploadGoodsImage(formData).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error(res.msg); + } + this.$message.success(res.msg); + this.getImgList(); + onSuccess(response.data); // 调用 onSuccess 回调通知上传成功 + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + onError(error); // 调用 onError 回调通知上传失败 + }) + }, + //添加跟踪记录 + addRecords(){ + this.ruleForm.dispatch=this.routerinfo.dispatch; + this.dialogVisible=true; + }, + submitForm(formName) { + this.$refs[formName].validate((valid) => { + if (valid) { + addTracker(this.ruleForm).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('跟进信息添加,失败!') + } + this.$message.success('跟进信息添加,成功!') + this.dialogVisible = false; + this.getRecords(); + }).catch(error => { + // 关闭加载 + this.$message.warning('跟进信息添加,失败!') + }) + } else { + console.log('error submit!!'); + return false; + } + }); + }, + resetForm(formName) { + this.dialogVisible = false; + this.$refs[formName].resetFields(); + }, + //查询跟踪记录 + getRecords(){ + selectByDispatchList({dispatch:this.routerinfo.dispatch}).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('获取消息收发记录,失败!') + } + // 获取列表数据 + this.activities=res.data; + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + }) + }, + //查询派单列表 + getLists() { + selectListByDispatch({dispatch:this.routerinfo.dispatch}).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('获取消息收发记录,失败!') + } + // 获取列表数据 + this.tableData=res.data; + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + }) + }, + getDefault(){ + if(this.$route.query!=null){ + this.routerinfo=this.$route.query.jilu; + } + }, + //查询车辆信息 + getReCord() { + let para = { + pageSize: 1, + limitSize: 10, + trailerFrameNo: this.$route.query.jilu.licenseno, + veState: '', + veClassFlag: '', + userId: '' + }; + list(para).then((res) => { + if(res.data.data.list.length!==0){ + this.carinfo = res.data.data.list[0]; + }else{ + this.$message.warning('无对应车辆信息!') + } + }).catch((error) => { + this.$message.warning('车辆查询,失败!') + }); + }, + getMess(){ + if(this.routerinfo!=null && this.routerinfo.length!==0){ + this.getReCord(); + this.getLists(); + } + }, + handleClose(done) { + this.$confirm('确认关闭?') + .then(_ => { + done(); + }) + .catch(_ => {}); + }, + + }, + activated() { + this.getDefault(); + this.getMess(); + this.getRecords(); + this.getImgList(); + } + } +</script> diff --git a/src/views/deploy/VehicleWaybill.vue b/src/views/deploy/VehicleWaybill.vue new file mode 100644 index 0000000..255d060 --- /dev/null +++ b/src/views/deploy/VehicleWaybill.vue @@ -0,0 +1,754 @@ +<template> + <div> + <div> + <el-form :inline="true" :model="formInline" class="demo-form-inline"> + <el-form-item label="主单号"> + <el-input v-model="formInline.awba" placeholder="主单号"></el-input> + </el-form-item> + <el-form-item label="车号"> + <el-input v-model="formInline.licenseno" placeholder="车号"></el-input> + </el-form-item> + <el-form-item> + <div class="block"> + <span class="demonstration">日期</span> + <el-date-picker + v-model="value2" + type="daterange" + align="right" + unlink-panels + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + value-format="yyyy-MM-dd HH:mm:ss" + :picker-options="pickerOptions"> + </el-date-picker> + </div> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="getLists">查询</el-button> + </el-form-item> + <el-form-item> + <el-button type="success" @click="addVehicle">新增</el-button> + </el-form-item> + <el-form-item> + <el-button type="danger" @click="onPaidan">派单</el-button> + </el-form-item> + <el-form-item> + <el-form-item> + <el-upload + class="upload-demo" + action="" + :before-upload="beforeUpload" + :http-request="uploadFile" + :show-file-list="false" + > + <el-button size="small" type="primary">导入运单</el-button> + </el-upload> + </el-form-item> + + <el-button type="success" @click="exportToExcel">导出 Excel</el-button> + </el-form-item> + </el-form> + </div> + <div> + <el-table + ref="multipleTable" + :data="tableData" + tooltip-effect="dark" + style="width: 100%" + @selection-change="handleSelectionChange"> + <el-table-column + type="selection" + width="55"> + </el-table-column> + <el-table-column + prop="customer" + label="客户名称" + width="120"> + </el-table-column> + <el-table-column + prop="taketime" + label="日期" + width="120"> + </el-table-column> + <el-table-column + prop="orig" + label="始发地" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="dest" + label="目的地" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="licenseno" + label="车号" + width="90"> + <template slot-scope="scope"> + <a type="text" style="color: #409eff;text-decoration: underline" class="tableInline" + @click="getReCord(scope.row)">{{scope.row.licenseno}}</a> + </template> + </el-table-column> + <el-table-column + prop="dispatch" + label="派单号" + width="150"> + <template slot-scope="scope"> + <router-link :to="{name:'派单记录', query:{jilu:scope.row}}"> + <a> + {{scope.row.dispatch}} + </a> + </router-link> + </template> + </el-table-column> + <el-table-column + prop="awbh" + label="分单号" + width="140"> + </el-table-column> + <el-table-column + prop="awba" + label="主单号" + width="110"> + </el-table-column> + <el-table-column + prop="deststation" + label="目的港" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="pcs" + label="件数" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="weight" + label="毛重" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="vol" + label="体积" + show-overflow-tooltip> + </el-table-column> + <el-table-column + prop="charge" + label="应收" + show-overflow-tooltip> + </el-table-column> + <el-table-column + fixed="right" + label="操作" + width="100"> + <template slot-scope="scope"> + <el-button @click="ediVehicle(scope.row)" type="text" size="small">编辑</el-button> + <el-button @click="delVehicleWaybill(scope.row.id)" type="text" size="small">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div> + <div class="block"> + <el-row> + <el-col :span="14"> + <el-pagination + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="formInline.pageNum" + :page-sizes="[20, 30, 40, 100]" + :page-size="formInline.pageSize" + layout="total, sizes, prev, pager, next, jumper" + :total="total"> + </el-pagination> + </el-col> + </el-row> + </div> + </div> + <div> + <el-dialog + :title="'车载运单'+textMap[dialogStatus]" + :visible.sync="dialogVisible" + width="75%" + :before-close="handleClose"> + <el-form :inline="true" label-width="80px" :model="submitForm" + class="demo-form-inline"> + <el-form-item label="客户名称"> + <el-select v-model="submitForm.customer" + @click.native="getUsers" + default-first-option + :loading="loading" clearable placeholder="请选择" + style="width: 157px"> + <el-option + v-for="item in usernames" + :key="item.roleName" + :label="item.roleName" + :value="item.roleName" + :disabled="item.disabled"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="日期"> + <div class="block"> + <el-date-picker + style="width: 157px" + v-model="submitForm.taketime" + type="date" + format="yyyy-MM-dd" + placeholder="选择日期"> + </el-date-picker> + </div> + </el-form-item> + <el-form-item label="始发地"> + <el-input v-model="submitForm.orig" placeholder="始发地"></el-input> + </el-form-item> + <el-form-item label="目的地"> + <el-input v-model="submitForm.dest" placeholder="目的地"></el-input> + </el-form-item> + <el-form-item label="车号"> + <el-input v-model="submitForm.licenseno" placeholder="车号"></el-input> + </el-form-item> + <el-form-item label="派单号"> + <el-input v-model="submitForm.dispatch" placeholder="派单号"></el-input> + </el-form-item> + <el-form-item label="分单号"> + <el-input v-model="submitForm.awbh" placeholder="分单号"></el-input> + </el-form-item> + <el-form-item label="主单号"> + <el-input v-model="submitForm.awba" placeholder="主单号"></el-input> + </el-form-item> + <el-form-item label="目的港"> + <el-input v-model="submitForm.deststation" placeholder="目的港"></el-input> + </el-form-item> + <el-form-item label="件数"> + <el-input v-model="submitForm.pcs" placeholder="件数"></el-input> + </el-form-item> + <el-form-item label="毛重"> + <el-input v-model="submitForm.weight" placeholder="毛重"></el-input> + </el-form-item> + <el-form-item label="体积"> + <el-input v-model="submitForm.vol" placeholder="体积"></el-input> + </el-form-item> + <el-form-item label="应收"> + <el-input v-model="submitForm.charge" placeholder="应收"></el-input> + </el-form-item> + <el-form-item label="危险品"> + <el-select v-model="submitForm.isdangerous" style="width: 157px"> + <el-option + v-for="item in options" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="尺寸"> + <el-input v-model="submitForm.means" placeholder="尺寸"></el-input> + </el-form-item> + <el-form-item label="备注"> + <el-input v-model="submitForm.remark" placeholder="备注"></el-input> + </el-form-item> + + </el-form> + <span slot="footer" class="dialog-footer" style="margin-right: 50px"> + <el-button @click="dialogVisible = false">取 消</el-button> + <el-button type="primary" @click="dialogStatus==='create'?addVehicleWaybill():ediVehicleWaybill()">确 定</el-button> + </span> + </el-dialog> + </div> + <div> + <el-dialog + title="派单申请" + :visible.sync="PDdialogVisible" + width="30%" + :before-close="handleClose"> + <el-form :model="PDForm" :rules="rules" ref="PDForm" label-width="100px" :label-position="labelPosition" + class="demo-ruleForm"> + <el-form-item label="车号" prop="licenseno"> + <el-input v-model="PDForm.licenseno"></el-input> + </el-form-item> + <el-form-item label="派单号" prop="dispatch"> + <el-input v-model="PDForm.dispatch"></el-input> + </el-form-item> + <el-form-item label="始发地" prop="orig"> + <el-input v-model="PDForm.orig"></el-input> + </el-form-item> + <el-form-item label="目的地" prop="dest"> + <el-input v-model="PDForm.dest"></el-input> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="submitPDForm('PDForm')">派单</el-button> + <el-button @click="resetForm('PDForm')">取消</el-button> + </el-form-item> + </el-form> + + </el-dialog> + </div> + <div> + <el-dialog + :visible.sync="CardialogVisible" + width="65%" + :before-close="handleClose"> + <el-descriptions class="margin-top" title="车辆信息" :column="3" :size="size" border> + <template slot="extra"> + <el-button type="primary" @click="CardialogVisible = false">关闭</el-button> + </template> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-user"></i> + 司机 + </template> + {{carinfo.veOwnerName}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-mobile-phone"></i> + 手机号 + </template> + {{carinfo.ownerInsideTel}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-truck"></i> + 车号 + </template> + {{carinfo.domesticLisenceNo}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-tickets"></i> + 驾驶证有效期 + </template> + <el-tag size="small">{{carinfo.veFactoryDate}}</el-tag> + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-shopping-cart-full"></i> + 车自重 + </template> + {{carinfo.selfWt}} + </el-descriptions-item> + <el-descriptions-item> + <template slot="label"> + <i class="el-icon-office-building"></i> + 地址 + </template> + {{carinfo.proposer}} + </el-descriptions-item> + </el-descriptions> + </el-dialog> + </div> + </div> +</template> +<script> + import { + getUserList, + addVehicleWaybill, + delVehicleWaybill, + ediVehicleWaybill, + selectNewInventroyrecords, + paidan, + UploadExcel + } from "../../api/consigner/vehicle"; + import {list} from "../../api/road_verecord/verecord"; + import XLSX from 'xlsx'; + import { saveAs } from 'file-saver'; + + export default { + data() { + return { + size: 'medium', + PDForm: { + licenseno: '', + orig: '', + dest: '', + dispatch: '' + }, + rules: { + licenseno: [ + {required: true, message: '请输入车号', trigger: 'blur'}, + {min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur'} + ], + dispatch: [ + {required: true, message: '请输入派单号', trigger: 'blur'}, + {min: 3, max: 17, message: '长度在 3 到 17 个字符', trigger: 'blur'} + ], + orig: [ + {required: true, message: '请输入始发地', trigger: 'blur'}, + {min: 2, max: 100, message: '长度在 2 到 100 个字符', trigger: 'blur'} + ], + dest: [ + {required: true, message: '请输入目的地', trigger: 'blur'}, + {min: 2, max: 100, message: '长度在 3 到 100 个字符', trigger: 'blur'} + ], + }, + labelPosition: 'left', + tableData: [], + multipleSelection: [], + formInline: { + awba: '', + licenseno: '', + starttime: '', + endtime: '', + pageNum: 1, + pageSize: 20 + }, + dialogStatus: '', + loading: false, + listLoading: false, + value2: '', + total: 0, + pickerOptions: { + shortcuts: [{ + text: '最近一周', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近一个月', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近三个月', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); + picker.$emit('pick', [start, end]); + } + }] + }, + currentPage4: 4, + submitForm: { + awba: "", + awbh: "", + charge: 0, + createtime: "", + customer: "", + dest: "", + deststation: "", + dispatch: "", + id: "", + isdangerous: 0, + licenseno: "", + means: "", + orig: "", + pcs: 0, + pic: "", + relevance: "", + remark: "", + remark1: "", + remark2: "", + taketime: "", + vol: 0, + weight: 0 + }, + dialogVisible: false, + PDdialogVisible: false, + CardialogVisible: false, + usernames: [], + options: [ + { + value: 0, + label: '否' + }, { + value: 1, + label: '是' + } + ], + textMap: { + update: '编辑', + create: '新增' + }, + carinfo: { + domesticLisenceNo: '', + veOwnerName: '', + ownerInsideTel: '', + proposer: '', + selfWt: '', + veFactoryDate: '', + veTon: '', + trailerLicenseNo: '', + trailerFrameNo: '' + }, + } + }, + + methods: { + //导入运单excel + beforeUpload(file) { + // 检查文件类型 + const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type === 'application/vnd.ms-excel'; + if (!isExcel) { + this.$message.error('上传文件只能是 Excel 格式!'); + return false; // 取消文件上传 + } + return true; // 允许上传 + + }, + uploadFile({ file, onSuccess, onError }){ + // 生成 FormData 对象 + const formData = new FormData(); + formData.append('file', file); + UploadExcel(formData).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error(res.msg); + } + this.$message.success(res.msg); + this.getLists(); + onSuccess(response.data); // 调用 onSuccess 回调通知上传成功 + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + onError(error); // 调用 onError 回调通知上传失败 + }) + }, + //导出excel + exportToExcel() { + if(this.multipleSelection.length!==0){ + const headers = { + customer: '客户名称', + taketime: '日期', + orig: '始发地', + dest: '目的地', + licenseno: '车号', + awba: '主单', + awbh: '分单', + deststation: '目的港', + pcs: '件数', + weight: '毛重', + vol: '体积', + means: '尺寸', + charge: '应收' + }; + + // Filter data to include only specified columns + const filteredData = this.multipleSelection.map(row => { + const newRow = {}; + for (const key in headers) { + newRow[headers[key]] = row[key]; + } + return newRow; + }); + + // Convert to worksheet and workbook + const ws = XLSX.utils.json_to_sheet(filteredData, { header: Object.values(headers) }); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); + const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); + + saveAs(new Blob([wbout], { type: 'application/octet-stream' }), new Date().toLocaleString()+'.xlsx'); + }else{ + this.$message.warning('请先勾选要导出的数据!'); + } + + }, + //查询车牌号 + getReCord(row) { + let para = { + pageSize: 1, + limitSize: 10, + trailerFrameNo: row.licenseno, + veState: '', + veClassFlag: '', + userId: '' + }; + list(para).then((res) => { + if(res.data.data.list.length!==0){ + this.carinfo = res.data.data.list[0]; + this.CardialogVisible=true; + }else{ + this.$message.warning('无对应车辆信息!') + } + }).catch((error) => { + this.$message.warning('车辆查询,失败!') + }); + }, + //提交派单表单申请 + submitPDForm(formName) { + this.$refs[formName].validate((valid) => { + if (valid) { + this.multipleSelection.forEach(item => { + item.licenseno = this.PDForm.licenseno; + item.orig = this.PDForm.orig; + item.dest = this.PDForm.dest; + item.dispatch = this.PDForm.dispatch; + }); + paidan(this.multipleSelection).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('车辆派单,失败!') + } + this.$message.success('车辆派单,成功!') + this.PDdialogVisible = false; + }).catch(error => { + // 关闭加载 + this.$message.warning('车辆派单,失败!') + }) + } else { + return false; + } + }); + }, + //生成派单号 + getCurrentFormattedDate() { + const now = new Date(); + const pad = (num) => num.toString().padStart(2, '0'); + + const yyyy = now.getFullYear(); + const MM = pad(now.getMonth() + 1); + const dd = pad(now.getDate()); + const HH = pad(now.getHours()); + const mm = pad(now.getMinutes()); + const ss = pad(now.getSeconds()); + const SSS = now.getMilliseconds().toString().padStart(3, '0'); + + return `${yyyy}${MM}${dd}${HH}${mm}${ss}${SSS}`; + }, + + //派单取消提交 + resetForm(formName) { + this.$refs[formName].resetFields(); + this.PDdialogVisible = false; + }, + //更新车载运单 + ediVehicleWaybill() { + ediVehicleWaybill(this.submitForm).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('更新车载运单,失败!') + } + this.$message.success('更新车载运单,成功!') + this.dialogVisible = false; + this.getLists(); + }).catch(error => { + // 关闭加载 + this.$message.warning('更新车载运单,失败!') + }) + }, + //删除车载运单 + delVehicleWaybill(id) { + // 弹框询问是否删除? + this.$confirm('此操作永久删除该消息收发记录, 是否继续?', '警告', { + confirmButtonText: '确定删除', + cancelButtonText: '取消', + type: 'warning' + } + ).then(() => { + delVehicleWaybill({id: id}).then((response) => { + const res = response.data + this.$message.success(res.msg) + this.getLists(); + }).catch(error => { + this.$message.error('删除车载运单,失败!') + }) + }).catch(() => { + }) + }, + //新增车载运单 + addVehicleWaybill() { + addVehicleWaybill(this.submitForm).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('新增车载运单,失败!') + } + this.$message.success('新增车载运单,成功!') + this.dialogVisible = false; + this.getLists(); + }).catch(error => { + // 关闭加载 + this.$message.warning('新增车载运单,失败!') + }) + }, + //查询列表 + getLists() { + if (this.value2 !== null) { + this.formInline.starttime = this.value2[0]; + this.formInline.endtime = this.value2[1]; + } + selectNewInventroyrecords(this.formInline).then((response) => { + const res = response.data + if (res.code !== '200') { + return this.$message.error('获取消息收发记录,失败!') + } + // 获取列表数据 + this.tableData = res.data.list + // 获取列表的总记录数 + this.total = res.data.total + this.$message.success('获取消息收发记录,成功!'); + this.formInline.endtime = ''; + this.formInline.starttime = ''; + }).catch(error => { + // 关闭加载 + this.$message.error(error.toString()) + }) + }, + onPaidan() { + if (this.multipleSelection.length !== 0) { + this.PDdialogVisible = true; + this.PDForm.dispatch = this.getCurrentFormattedDate(); + } else { + this.$message.error('请选勾取要派车的运单信息!'); + } + }, + //新增 + addVehicle() { + this.dialogVisible = true; + this.dialogStatus = 'create'; + this.getUsers(); + }, + //编辑 + ediVehicle(row) { + this.dialogVisible = true; + this.dialogStatus = 'update'; + this.submitForm = row; + }, + //翻页 + handleSizeChange(val) { + this.formInline.pageSize = val; + this.getLists(); + }, + handleCurrentChange(val) { + this.formInline.pageNum = val; + this.getLists(); + }, + //多选选中 + handleSelectionChange(val) { + this.multipleSelection = val; + console.log(this.multipleSelection) + }, + //Dialog关闭提示 + handleClose(done) { + this.$confirm('确认关闭?') + .then(_ => { + done(); + }) + .catch(_ => { + }); + }, + //获取用户名列表 + getUsers() { + let para = {orgtype: "C", pageSize: 1, pageNum: 10000}; + this.listLoading = true; + getUserList(para).then((res) => { + this.usernames = res.data.data.list; + }).catch((error) => { + this.$message.error(error.toString()); + }).finally(() => { + this.listLoading = false; + }); + }, + }, + mounted() { + this.getLists(); + } + } +</script>