zengyf vor 2 Jahren
Ursprung
Commit
913052a7c7

+ 1 - 1
build/utils.js

@@ -15,7 +15,7 @@ const devPathSrc = path.resolve(__dirname, '../../../src') // node_modules应用
 // ['index','appoint','configManager','homepage',''inward,'queue','RMS','sale','serviceManager','SporadicManage'
 //       统计报表       组织机构/系统管理 采购  仓储
 //  'statisticalReport','systemConfig','TMS','WMS','workFlow','ADMINISTRATORS']
-// let devModules = ['index', 'statisticalReport', 'queue']
+//let devModules = ['index', 'statisticalReport', 'queue','inward','appoint','sale','RMS','AMS']
 let devModules = ['all']
 //let devModules=['index']
 if (pathSrc.indexOf('node_modules') > -1) {

+ 1 - 1
config/index.js

@@ -73,7 +73,7 @@ let proxyTable = {
   // 所有数据的请求域名地址r
   '/api/v1': {
     target: 'http://172.16.33.166:80',
-    // target: 'http://localhost:8080',
+    //target: 'http://localhost:8080',
     // target: 'http://192.168.1.104:8080',
     ws: true,
     pathRewrite: {

+ 2981 - 0
src/views/sale/components/transportFreight/saleTruckSettlement/bmsTruckDetailsOrderNew.vue

@@ -0,0 +1,2981 @@
+//钢材统计报表
+<template>
+  <div class="purchasFuelNewMonitor">
+    <div class="tableTop">
+      <el-form :inline="true" style="margin-top :5px">
+        <el-form-item>
+          <el-select
+            v-model="screen"
+            placeholder="请选择需筛选的内容"
+            clearable
+            @change="changeScreen"
+            style="width:100px"
+          >
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+          <el-input
+            style="width:170px"
+            v-model="input"
+            placeholder="请输入查询条件"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model="screen1"
+            placeholder="请选择需筛选的内容"
+            clearable
+            style="width:100px"
+          >
+            <el-option
+              v-for="item in options1"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+          <el-input
+            style="width:170px"
+            v-model="input1"
+            placeholder="请输入查询条件"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <label class="el-form-item__label" style="width: auto;"
+            >订单日期:</label
+          >
+          <el-date-picker
+            v-model="startTime"
+            type="date"
+            placeholder="选择日期"
+            style="width:150px"
+          >
+          </el-date-picker>
+          <span>至</span>
+          <el-date-picker
+            v-model="endTime"
+            type="date"
+            placeholder="选择日期"
+            style="width:150px"
+          >
+          </el-date-picker>
+          <el-button type="primary" class="btn" @click="onclick">
+            <i class="el-icon-search"></i>
+          </el-button>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="exportAllReportToExcel"
+            >下载Excel</el-button
+          >
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="refresh">
+            <i class="el-icon-refresh"></i>
+          </el-button>
+        </el-form-item>
+        <el-form-item v-if="isShowOperate">
+          <el-button type="primary" @click="checkTrans()"
+            ><i class="el-icon-truck"></i>轨迹</el-button
+          >
+          <el-button type="primary" @click="operation()"
+            ><i class="el-icon-edit"></i>更改</el-button
+          >
+          <!-- <el-button type="primary" @click="batchoperation()"
+            ><i class="el-icon-edit"></i>批量更改</el-button
+          > -->
+          <el-button
+            type="primary"
+            @click="checkPoint()"
+            v-if="!notRoutList.includes('checkPoint')"
+            ><i class="el-icon-map-location"></i>实时路径</el-button
+          >
+        </el-form-item>
+        <el-form-item v-if="isShowOperate">
+          <el-button type="primary" @click="openReceive()">
+            <i class="el-icon-document"></i>签收抵达</el-button
+          >
+        </el-form-item>
+        <el-form-item>
+          <label
+            class="el-form-item__label"
+            style="width: auto;font-size: 16px;line-height: auto;"
+            >车数/件数: {{ totalCapacity }}/{{ totalNumber }}
+          </label>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="table">
+      <el-table
+        :data="visibleList"
+        :span-method="objectSpanMethod"
+        ref="tableRef"
+        border
+        style="width: 100%; margin-top: 20px"
+        :height="maxHeight"
+        :row-class-name="tableRowClassName"
+        @cell-click="cellClik"
+        @cell-mouse-enter="cellMouse1"
+        @cell-mouse-leave="cellLeave1"
+        @row-click="rowClick"
+        :cell-style="cellStyle"
+        @filter-change="filterChange"
+        :key="saleSteelKey"
+        id="salesLogisticsStat_saleSteelReports_table"
+        individual-panel
+        @resetTable="reset"
+      >
+        <el-table-column
+          width="50"
+          label="序号"
+          align="center"
+          :resizable="false"
+        >
+          <template slot-scope="scope">{{ scope.row.group + 1 }}</template>
+        </el-table-column>
+        <el-table-column
+          prop="orderTime"
+          label="订单日期"
+          width="110px"
+          align="center"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="consigneeName"
+          label="客户"
+          width="160px"
+          align="center"
+          column-key="consigneeName"
+          :filters="filterConsigneeList"
+          sortable
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="areaName"
+          label="销售片区"
+          width="150px"
+          align="center"
+          column-key="saleAreaList"
+          :filters="filterSaleAreaList"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="carrierName"
+          label="承运商"
+          align="center"
+          width="80px"
+          column-key="carrierList"
+          sortable
+          show-overflow-tooltip
+          :filters="filterCarrierList"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="capacityNo"
+          column-key="capacityNo"
+          label="车牌号"
+          align="center"
+          width="90px"
+          sortable
+          show-overflow-tooltip
+          :filters="filterCapacityList"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="materialName"
+          column-key="materialNameList"
+          label="物资名称"
+          align="center"
+          width="150px"
+          sortable
+          :filters="filtermaterialNameList"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="materialSpe"
+          label="物资规格"
+          column-key="materialSpe"
+          align="center"
+          sortable
+          :filters="filtermaterialSpe"
+          width="120px"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="materialNum"
+          label="物资件数"
+          align="center"
+          width="50px"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="addressPlace"
+          label="收货地址"
+          width="250px"
+          sortable
+          column-key="addressPlace"
+          :filters="filteraddressPlace"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="saleRemark"
+          column-key="saleRemark"
+          label="摘要"
+          width="150px"
+          align="center"
+          :filters="filterSaleRemark"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="capacityTel"
+          label="司机电话"
+          width="120px"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="tareWeightTime"
+          label="皮重时间"
+          width="130px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column prop="tareWeight" label="皮重" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column
+          prop="grossWeightTime"
+          label="毛重时间"
+          width="130px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column prop="grossWeight" label="毛重" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column prop="netWeight" label="净重" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column
+          prop="isPrintDelivery"
+          label="送货单打印"
+          align="center"
+          width="100px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="outGateTime"
+          column-key="outGateTimeList"
+          label="出厂时间"
+          width="130px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column
+          prop="arrivalAddress"
+          label="抵达地址"
+          width="280px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column prop="arrivalTime" label="抵达时间" width="150px">
+        </el-table-column>
+        <el-table-column
+          prop="receiptAddress"
+          label="签收地址"
+          width="280px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+        <el-table-column prop="receiptTime" label="签收时间" width="150px">
+        </el-table-column>
+        <el-table-column prop="priceValue" label="系统建议运价" width="100px">
+        </el-table-column>
+        <el-table-column
+          prop="detailsAmount"
+          label="系统建议运费"
+          width="100px"
+        ></el-table-column>
+        <el-table-column
+          prop="orderNo"
+          label="运输订单号"
+          width="180px"
+          align="center"
+        >
+        </el-table-column>
+
+        <el-table-column prop="saler" label="业务员" align="center">
+        </el-table-column>
+        <el-table-column
+          prop="shipperName"
+          label="发货单位"
+          width="170px"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="consigneeTel"
+          label="收货客户电话"
+          width="120px"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column prop="isSelfMention" label="是否自提" align="center">
+        </el-table-column>
+
+        <el-table-column
+          prop="saleOrderNo"
+          label="销售订单号"
+          width="200px"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          prop="closeEntryId"
+          label="金蝶分录ID"
+          width="120px"
+          show-overflow-tooltip
+        >
+        </el-table-column>
+      </el-table>
+    </div>
+    <div>
+      <vxe-modal
+        width="80%"
+        height="80%"
+        v-model="isShow3"
+        show-footer
+        show-zoom
+        class="vxeModal"
+      >
+        <div class="demo-image__preview" v-for="(item, i) in srcList" :key="i">
+          <span>{{ item.title }}</span>
+          <el-image
+            :src="item.src"
+            fit="fill"
+            @click.prevent.right="receiveClick(item.src, '抵达')"
+          >
+            <div slot="error" class="image-slot">
+              <span>司机未上传图片</span>
+            </div>
+          </el-image>
+        </div>
+      </vxe-modal>
+      <vxe-modal width="80%" height="80%" v-model="isShow4" show-zoom>
+        <div class="demo-image__preview" v-for="(item, i) in srcList2" :key="i">
+          <el-image
+            :src="item.src"
+            fit="fill"
+            @click.prevent.right="receiveClick(item.src, '签收')"
+          >
+            <div slot="error" class="image-slot">
+              <span>司机未上传图片</span>
+            </div>
+          </el-image>
+        </div>
+      </vxe-modal>
+    </div>
+    <div class="dialog">
+      <el-dialog
+        title="运单详情"
+        :visible.sync="centerDialogVisible"
+        width="90%"
+        center
+      >
+        <div class="steelMapClass">
+          <div class="steelMapClass1">
+            <div class="steelMapClass12">
+              <span>销售订单号:</span>
+              <span>{{ steelMap.saleOrderNo }}</span>
+            </div>
+            <div class="steelMapClass12">
+              <span>订单状态:</span>
+              <span>{{ steelMap.saleOrderStatus }}</span>
+            </div>
+            <div class="steelMapClass12">
+              <span>业务员:</span>
+              <span>{{ steelMap.saler }}</span>
+            </div>
+            <div class="steelMapClass12">
+              <span>客户:</span>
+              <span>{{ steelMap.consigneeName }}</span>
+            </div>
+          </div>
+          <div class="steelMapClass2">
+            <div class="steelMapClass22">
+              <span>收货地址:</span>
+              <el-select
+                v-model="steelMap.addressProvince"
+                filterable
+                placeholder="请选择"
+                @change="onchangeProvince"
+                style="width:120px"
+                :disabled="notRoutList.includes('province')"
+              >
+                <el-option
+                  v-for="item in provinceList"
+                  :key="item.id"
+                  :label="item.addressProvince"
+                  :value="item.id"
+                ></el-option>
+              </el-select>
+              <el-select
+                v-model="steelMap.addressDistrict"
+                filterable
+                placeholder="请选择"
+                @change="onchangeCity"
+                style="width:120px"
+                :disabled="notRoutList.includes('city')"
+              >
+                <el-option
+                  v-for="item in cityList"
+                  :key="item.id"
+                  :label="item.addressDistrict"
+                  :value="item.id"
+                ></el-option>
+              </el-select>
+              <el-select
+                v-model="steelMap.addressTown"
+                filterable
+                placeholder="请选择"
+                @change="onchangeCounty"
+                style="width:120px"
+                :disabled="notRoutList.includes('country')"
+              >
+                <el-option
+                  v-for="item in countyList"
+                  :key="item.id"
+                  :label="item.addressTown"
+                  :value="item.id"
+                ></el-option>
+              </el-select>
+              <el-autocomplete
+                class="inline-input"
+                v-model="steelMap.place"
+                :fetch-suggestions="querySearch1"
+                placeholder="请输入具体收货地址"
+                :trigger-on-focus="false"
+                @select="handleSelect1"
+                style="width:250px"
+                :disabled="notRoutList.includes('place')"
+              >
+              </el-autocomplete>
+              <el-button
+                type="success"
+                circle
+                @click="addAddressClick"
+                v-if="!notRoutList.includes('addressClick')"
+                >提交</el-button
+              >
+            </div>
+            <!-- <div
+              class="steelMapClass23"
+              v-if="
+                (steelMap.carStatus == 4 ||
+                  steelMap.carStatus == 5 ||
+                  steelMap.carStatus == null) &&
+                  !notRoutList.includes('closeOrder')
+              "
+            >
+              <el-button type="danger" round @click="deleteEasEntryId"
+                >关闭运单</el-button
+              >
+            </div> -->
+            <!-- <div
+              class="steelMapClass23"
+              v-if="
+                steelMap.carStatus == 7 && !notRoutList.includes('closeOrder')
+              "
+            >
+              <el-button type="danger" round @click="reverseCloseOrder"
+                >反关闭运单</el-button
+              >
+            </div> -->
+          </div>
+          
+          <div class="steelMapClass3">
+            <div class="steelMapClass32">
+              <span>收货客户电话:</span>
+              <el-input
+                v-model="steelMap.consigneeTel"
+                style="width:150px"
+                :disabled="notRoutList.includes('consigeeTel')"
+              ></el-input>
+              <el-button
+                type="success"
+                circle
+                @click="updateconsigneeTel"
+                v-if="!notRoutList.includes('consigeeTel')"
+                >提交</el-button
+              >
+            </div>
+            <div class="steelMapClass33">
+              <span>承运商:</span>
+              <el-autocomplete
+                style="width:120px"
+                v-model="steelMap.carrierName"
+                :fetch-suggestions="querySearchCarrier"
+                placeholder="请输入承运商"
+                @select="handleSelectCarrier"
+                :disabled="notRoutList.includes('carrierName')"
+              >
+              </el-autocomplete>
+              <el-button
+                type="success"
+                circle
+                @click="updateTruckCarrierDebounce"
+                v-if="!notRoutList.includes('carrierName')"
+                >提交</el-button
+              >
+            </div>
+            <div class="steelMapClass33">
+              <span>车牌号:</span>
+              <el-autocomplete
+                style="width:120px"
+                v-model="steelMap.capacityNo"
+                :fetch-suggestions="querySearch"
+                placeholder="请输入车牌号"
+                @select="handleSelect()"
+                :disabled="
+                  notRoutList.includes('capacityNo') &&
+                    steelMap.capacityId != null
+                "
+              ></el-autocomplete>
+              <el-button
+                type="success"
+                circle
+                @click="updateCapacityDebounce"
+                v-if="
+                  !(
+                    notRoutList.includes('capacityNo') &&
+                    steelMap.capacityId != null
+                  )
+                "
+                >提交</el-button
+              >
+            </div>
+            <div class="steelMapClass33">
+              <span>司机电话:</span>
+              <el-input
+                style="width:120px"
+                v-model="steelMap.capacityTel"
+                placeholder="请输入电话号码"
+              ></el-input>
+              <el-button type="success" circle @click="updateDriverTel"
+                >提交</el-button
+              >
+            </div>
+          </div>
+          <div class="steelMapClass4">
+            <div class="steelMapClass42" v-if="steelMap.orderNo != null">
+              <span>运输订单号:</span>
+              <span>{{ steelMap.orderNo }}</span>
+            </div>
+            <div class="steelMapClass43">
+              <span>运单状态:</span>
+              <span>{{ steelMap.orderStatus }}</span>
+            </div>
+            <div
+              class="steelMapClass43"
+              v-if="steelMap.orderStatusTime != null"
+            >
+              <span>状态更新时间:</span>
+              <span>{{ steelMap.orderStatusTime }}</span>
+            </div>
+          </div>
+          <div class="steelMapClass5">
+            <div class="steelMapClass52" v-if="steelMap.arrivalAddress != null">
+              <span>抵达地址:</span>
+              <span>{{ steelMap.arrivalAddress }}</span>
+            </div>
+          </div>
+          <div class="steelMapClass6">
+            <div class="steelMapClass62" v-if="steelMap.receiptAddress != null">
+              <span>签收地址:</span>
+              <span>{{ steelMap.receiptAddress }}</span>
+            </div>
+          </div>
+          <div class="steelMapClass7">
+            <div class="steelMapClass72" v-if="steelMap.priceValue != null">
+              <span>系统建议运价:</span>
+              <span>{{ steelMap.priceValue }}</span>
+              <el-button
+                type="success"
+                circle
+                @click="updateDetailsOrderPrice"
+                v-if="!notRoutList.includes('capacityNo')"
+                >修改</el-button
+              >
+            </div>
+          </div>
+        </div>
+        <div class="table1">
+          <el-table
+            :data="steelMap.mapList"
+            border
+            style="width: 100%; margin-top: 20px"
+          >
+            <el-table-column
+              prop="materialName"
+              label="物资名称"
+              align="center"
+              width="150px"
+            >
+            </el-table-column>
+            <el-table-column
+              prop="materialSpe"
+              label="物资规格"
+              align="center"
+              sortable
+            >
+            </el-table-column>
+            <el-table-column
+              prop="materialNum"
+              label="物资件数"
+              align="center"
+              width="200px"
+            >
+              <template slot-scope="scope">
+                <button
+                  type="primary"
+                  @click="scope.row.materialNum--"
+                  style="height:40px"
+                  v-if="!notRoutList.includes('materialNum')"
+                >
+                  -
+                </button>
+                <input
+                  v-model="scope.row.materialNum"
+                  style="width:40px;height: 40px;font-size:16px;line-height: 40px;text-align: center;"
+                  :disabled="notRoutList.includes('materialNum')"
+                />
+                <button
+                  type="primary"
+                  @click="scope.row.materialNum++"
+                  style="height:40px"
+                  v-if="!notRoutList.includes('materialNum')"
+                >
+                  +
+                </button>
+                <el-button
+                  type="primary"
+                  @click="updateBillOrder(scope.row)"
+                  v-if="!notRoutList.includes('materialNum')"
+                  >提交</el-button
+                >
+              </template>
+            </el-table-column>
+            <el-table-column prop="grossWeight" label="毛重"> </el-table-column>
+            <el-table-column
+              prop="grossWeightTime"
+              label="毛重时间"
+              width="130px"
+            >
+            </el-table-column>
+            <el-table-column prop="tareWeight" label="皮重"> </el-table-column>
+            <el-table-column
+              prop="tareWeightTime"
+              label="皮重时间"
+              width="130px"
+            >
+            </el-table-column>
+            <el-table-column prop="netWeight" label="净重"> </el-table-column>
+            <el-table-column prop="loadTime" label="装货时间" width="130px">
+            </el-table-column>
+            <el-table-column prop="detailsAmount" label="运费" width="130px">
+            </el-table-column>
+            <el-table-column
+              prop="closeEntryId"
+              label="金蝶分录ID"
+              width="100px"
+            >
+            </el-table-column>
+            <el-table-column
+              label="分录操作"
+              fixed="right"
+              width="120px"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  type="text"
+                  size="small"
+                  @click="closeEasEntryId(scope.row)"
+                  v-if="
+                    scope.row.deletedStatus == null &&
+                      !notRoutList.includes('closeEntry')
+                  "
+                  >关闭分录</el-button
+                >
+                <el-button
+                  type="text"
+                  size="small"
+                  @click="adverseCloseSaleMaterial(scope.row)"
+                  v-if="
+                    scope.row.deletedStatus != null &&
+                      !notRoutList.includes('closeEntry')
+                  "
+                  >反关闭分录</el-button
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="centerDialogVisible = false">返 回</el-button>
+        </span>
+        <div>
+          <vxe-modal
+            width="549px"
+            height="731px"
+            v-model="isShow"
+            show-zoom
+            show-footer
+            class="vxeModal"
+            title="抵达上传照片"
+          >
+            <div class="demo-image__preview">
+              <div
+                class="demo-image__preview"
+                v-for="(item, index) in srcList"
+                :key="index"
+              >
+                <span>{{ item.title }}</span>
+                <el-image
+                  style="height:731px;text-align:center"
+                  :src="item.src"
+                >
+                  <div slot="error" class="image-slot">
+                    <span>司机未上传抵达图片</span>
+                  </div>
+                </el-image>
+              </div>
+            </div>
+          </vxe-modal>
+          <vxe-modal
+            width="549px"
+            height="731px"
+            v-model="isShow2"
+            show-zoom
+            show-footer
+            title="签收上传照片"
+          >
+            <div
+              class="demo-image__preview"
+              v-for="(item, index) in srcList2"
+              :key="index"
+            >
+              <span>{{ item.title }}</span>
+              <el-image style="height:731px;text-align:center" :src="item.src">
+                <div slot="error" class="image-slot">
+                  <span>司机未上传签收图片</span>
+                </div>
+              </el-image>
+            </div>
+          </vxe-modal>
+        </div>
+      </el-dialog>
+    </div>
+    <div style="height: 100%">
+      <vxe-modal
+        width="1237"
+        height="731"
+        v-model="value7"
+        show-zoom
+        resize
+        title="轨迹查询"
+      >
+        <template #default>
+          <PathView v-bind.sync="pathOption"></PathView>
+        </template>
+      </vxe-modal>
+    </div>
+    <div style="height:100%">
+      <vxe-modal
+        width="1237"
+        height="731"
+        v-model="value8"
+        show-zoom
+        resize
+        title="实时路径"
+        ><currentLocation :carNumber="carNumber"></currentLocation
+      ></vxe-modal>
+    </div>
+    <el-drawer
+      title="修改详单地址"
+      :visible.sync="dialogFormVisible"
+      size="40%"
+    >
+      原详单地址
+      <el-input
+        style="width:250px;height: 30px"
+        v-model="originalAddress"
+        disabled
+      ></el-input>
+      <label>原单价</label>
+      <el-input
+        style="width:100px;height: 30px"
+        v-model="originalPriceValue"
+        disabled
+      ></el-input>
+      <el-input
+        v-model="addresText"
+        placeholder="请输入内容"
+        style="margin-top: 10px; margin-left: 20px; width: 250px"
+        @keyup.native.enter="selectAddresClick"
+      ></el-input>
+      <el-button type="primary" @click="selectAddresClick"
+        ><i class="el-icon-search"></i>查询</el-button
+      >
+      <div>
+        <!-- 查询所有的运输单价 -->
+          <dilTable
+            v-bind.sync="Address"
+            @radio-change="currentRadioChange2"
+            :drawer="aaadrawer"
+          ></dilTable>
+      </div>
+      <div class="opreation">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="makeSure">确 定</el-button>
+      </div>
+    </el-drawer>
+    <el-dialog
+      title="抵达签收"
+      :visible.sync="arrivalReceiving"
+      :before-close="closeUpload"
+    >
+      <el-form style="margin-left:20%">
+        <el-form-item label="车牌号码">
+          <el-input
+            v-model="capacityNumber"
+            disabled
+            style="width:300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="签收地址">
+          <el-input v-model="location" style="width:400px"></el-input>
+        </el-form-item>
+        <el-form-item label="抵达图片(车头、满货箱)" style="">
+          <el-upload
+            ref="arrival"
+            list-type="picture-card"
+            action="/api/v1/otms/addtmstruckArrivalResult"
+            :limit="2"
+            :on-change="fileChange1"
+            :on-preview="handlePictureCardPreview"
+            :on-exceed="exceed"
+            accept=".jpg,.jpeg,.png,.gif,.bmp,.pdf,.JPG,.JPEG,.PBG,.GIF,.BMP,.PDF"
+            :auto-upload="false"
+          >
+            <i class="el-icon-plus"></i>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="签收图片(空货箱、质保书、签收单)">
+          <el-upload
+            ref="receive"
+            list-type="picture-card"
+            action="null"
+            :limit="11"
+            :on-change="fileChange2"
+            :on-preview="handlePictureCardPreview"
+            :on-exceed="exceed"
+            accept=".jpg,.jpeg,.png,.gif,.bmp,.pdf,.JPG,.JPEG,.PBG,.GIF,.BMP,.PDF"
+            :auto-upload="false"
+          >
+            <i class="el-icon-plus"></i>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <el-button
+        type="primary"
+        @click="arrivalAndReceive"
+        :loading="isLoading"
+        style="margin-left:40%"
+        >确定</el-button
+      >
+    </el-dialog>
+    <el-dialog :visible.sync="dialogVisible" width="80%">
+      <img width="100%" :src="dialogImageUrl" alt="" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { sjTime, isVehicleNumber } from '@/utils/sharedJsFile'
+import { getCookie } from '@/utils/util.js'
+import PathView from './mapTest.vue'
+import currentLocation from './currentLocation.vue'
+import { downloadFile } from '@/utils/base64ToBlob.js'
+export default {
+  components: {
+    PathView,
+    currentLocation
+  },
+  data() {
+    return {
+      batchAddressProvince: '',
+      batchAddressDistrict: '',
+      batchAddressTown: '',
+      batchPlace: '',
+      centerDialogVisibleBatch: false,
+      reallyList: [],
+      visibleList: [],
+      itemHeight: 30,
+      scrollTop: 0,
+      totalHeight: 0,
+      debounceS: false,
+      carNumber: '',
+      //弹出框
+      centerDialogVisible: false,
+      //根据车序号查询的值
+      steelMap: {},
+      //钢材子表数据
+      steelList: [],
+      drawer: false,
+      isShow3: false,
+      isShow4: false,
+      input: null,
+      screen: '',
+      screen1: '',
+      options: [
+        {
+          value: '客户',
+          lable: '客户'
+        },
+        {
+          value: '承运商',
+          lable: '承运商'
+        },
+        {
+          value: '车牌号',
+          lable: '车牌号'
+        },
+        {
+          value: '分录ID',
+          lable: '分录ID'
+        }
+      ],
+      options1: [
+        {
+          value: '客户',
+          lable: '客户'
+        },
+        {
+          value: '承运商',
+          lable: '承运商'
+        },
+        {
+          value: '车牌号',
+          lable: '车牌号'
+        }
+      ],
+      startTime: null,
+      endTime: null,
+      //合计净重
+      totalNumber: 0,
+      //合计车数
+      totalCapacity: 0,
+      tableTitle: '销售统计报表',
+      capacityList: [],
+      carrierList: [],
+      tableData: [],
+      //筛选条件1(客户)
+      filters1: [],
+      spanArr: [],
+      pos: 0,
+      //需要合并列的名称
+      mergeList: [
+        '选择',
+        '序号',
+        '整车操作',
+        '销售订单状态',
+        '销售订单号',
+        '发货单位',
+        '司机电话',
+        '运输订单号',
+        '签收地址',
+        '签收时间',
+        '抵达地址',
+        '抵达时间',
+        '出厂时间',
+        '进厂时间',
+        '运单状态',
+        '车牌号',
+        '承运商',
+        '客户',
+        '收货地址',
+        '业务员',
+        '送货单打印',
+        '收货客户电话',
+        '是否自提',
+        '订单日期',
+        '短信发送',
+        '销售片区',
+        '抵达时间',
+        '签收时间',
+        '系统建议运价',
+        '摘要'
+      ],
+      //钢材多拼车辆线路ID
+      //索引从1-10为1-10拼路线ID
+      lineSpelling: [
+        0,
+        110001,
+        110002,
+        110003,
+        110004,
+        110005,
+        110006,
+        110007,
+        110008,
+        110009,
+        110010
+      ],
+      tableTitle: '销售钢材统计报表',
+      //所有省
+      provinceList: [],
+      //选中的省
+      province: '',
+      //所有市
+      cityList: [],
+      //选中的市
+      city: '',
+      //所有的县(区)
+      countyList: [],
+      //选中的县
+      county: '',
+      //地址输入框的值
+      addresText: '',
+      //已选中省市县
+      address: null,
+      //具体地址
+      place: null,
+      //暂存具体地址
+      place1: null,
+      //省市县Id
+      addressId: null,
+      addressRow: {},
+      srcList: [],
+      src: '',
+      isShow: false,
+      srcList2: [],
+      src2: '',
+      isShow2: false,
+      input1: '',
+      maxHeight: 700,
+      //轨迹窗口
+      value7: false,
+      //实时路径窗口
+      value8: false,
+      pathOption: {
+        orderNumber: '',
+        capacityNumber: '',
+        startPointName: '',
+        endPointName: ''
+      },
+      saleSteelKey: false,
+      tableRowIndex: '',
+      isRowClick: 0,
+      orgCodeList: [
+        'wuliuyunshubu',
+        'dagangadmin',
+        'shichangxinxibu',
+        'zidonghuabu',
+        'chengyunshang'
+      ],
+      isShowOperate: false,
+      filterConsigneeList: [],
+      filterCarrierList: [],
+      filterCapacityList: [],
+      filtermaterialNameList: [],
+      filterSaleAreaList: [],
+      filterorderStatus: [],
+      filteraddressPlace: [],
+      filtermaterialSpe: [],
+      filterSaleRemark: [],
+      filterSaleOrderStatus: [],
+      filterMap: {},
+      //权限控制
+      notRoutList: [],
+      location: null,
+      orderNumber: null,
+      capacityNumber: null,
+      arrivalReceiving: false,
+      fileListArrival: [],
+      fileListReceive: [],
+      dialogImageUrl: '',
+      dialogVisible: false,
+      isLoading: false,
+      batchList: [],
+      Address: {
+        requestUrl: '',
+        selectionType: 'radio'
+      },
+      dialogFormVisible: false,
+      addresText: null,
+      originalPriceValue: null,
+      originalAddress: null,
+      aaadrawer: false,
+      downloadCapacityNo: null,
+      ops: {
+        vuescroll: {},
+        scrollPanel: {},
+        rail: {
+          keepShow: true
+        },
+        bar: {
+          hoverStyle: true,
+          onlyShowBarOnScroll: false, //是否只有滚动的时候才显示滚动条
+          background: '#5f9ea0', //滚动条颜色
+          opacity: 0.8, //滚动条透明度
+          'overflow-x': 'hidden'
+        }
+      }
+    }
+  },
+  created() {
+    if (this.orgCodeList.includes(getCookie('orgCode'))) {
+      this.isShowOperate = true
+    }
+    if (getCookie('orgCode') == 'chengyunshang') {
+      this.notRoutList = [
+        'checkPoint',
+        'checkTrans',
+        'carrierName',
+        'consigeeTel',
+        'province',
+        'city',
+        'country',
+        'place',
+        'addressClick',
+        'closeOrder',
+        'materialNum',
+        'closeEntry',
+        'capacityNo'
+      ]
+    }
+    //只要涉及提交即必须设计防抖,在初始化时绑定防抖函数
+    this.updateCapacityDebounce = this.debounce(() => {
+      this.updateCapacity()
+    }, 3000)
+    this.updateTruckCarrierDebounce = this.debounce(() => {
+      this.updateTruckCarrier()
+    }, 3000)
+    this.cellMouse1 = this.debounce((row, column, cell) => {
+      this.cellMouse(row, column, cell)
+    }, 100)
+    this.cellLeave1 = this.debounce((row, column, cell) => {
+      this.cellLeave(row, column, cell)
+    }, 100)
+    this.getSteelReport()
+  },
+  watch: {
+    tableData: {
+      handler(oldVal, newVal) {
+        this.filterListChange()
+      },
+      deep: true,
+      immediate: true
+    },
+    scrollTop: {
+      immediate: true,
+      deep: true,
+      handler(val) {
+        this.$nextTick(() => {
+          if (
+            val >=
+            this.tableData.length * 30 -
+              document.querySelector('.el-table__body-wrapper').offsetHeight -
+              20
+          ) {
+            val =
+              this.tableData.length * 30 -
+              document.querySelector('.el-table__body-wrapper').offsetHeight
+          }
+          if (val <= 0) {
+            val = 0
+          }
+          document.querySelector(
+            '.el-table__body-wrapper .el-table__body'
+          ).style.transform = `translateY(${val}px)`
+          const start = Math.floor(val / this.itemHeight)
+          this.visibleList = this.tableData.slice(
+            start,
+            start + Math.floor(this.maxHeight / this.itemHeight) + 1
+          )
+          this.getSpanArr(this.visibleList)
+        })
+      }
+    }
+  },
+  computed: {},
+  mounted() {
+    let that = this
+    this.$nextTick(() => {
+      window.onresize = () => {
+        return (() => {
+          this.maxHeight = window.innerHeight - 150
+        })()
+      }
+    })
+    this.$refs.tableRef.bodyWrapper.addEventListener('scroll', e => {
+      // console.log(e)
+      if (this.debounceS) return
+      this.debounceS = true
+      this.scrollTop = e.target.scrollTop
+      setTimeout(() => {
+        this.debounceS = false
+      }, 70)
+    })
+  },
+  activated() {
+    this.maxHeight = window.innerHeight - 150
+  },
+  computed: {},
+  methods: {
+    receiveClick(src, title) {
+      // this.dialogImageUrl = src
+      downloadFile(src, `${this.downloadCapacityNo}${title}照片`, '.jpg')
+      // this.dialogVisible = true
+    },
+    selectAddresClick() {
+      if (this.addresText) {
+        this.Address.requestUrl =
+          '/api/v1/ams/getAddressDeliveryAddress?apiId=511&con=' +
+          this.addresText
+      } else {
+        this.Address.requestUrl =
+          '/api/v1/ams/getAddressDeliveryAddress?apiId=511&i=' + new Date()
+      }
+    },
+    updateDetailsOrderPrice() {
+      this.originalAddress = this.steelMap.addressPlace
+      this.originalPriceValue = this.steelMap.priceValue
+      console.log("数据是否正确")
+      console.log(this.originalAddress)
+      console.log(this.originalPriceValue)
+      this.Address.requestUrl =
+        '/api/v1/ams/getAddressDeliveryAddress?apiId=511&i=' + new Date()
+      this.dialogFormVisible = true
+    },
+    currentRadioChange2(val) {
+      //若具体地址有值,清空值
+      if (this.place != null) {
+        this.place = null
+      }
+      this.steelMap.placeId = val.placeId
+      this.steelMap.address = val.address
+      this.steelMap.addressId = val.addressId
+      this.steelMap.priceId = val.priceid
+    },
+    makeSure() {
+      //若没有单价Id
+      let mapValue = {
+        orderId: this.steelMap.orderId,
+        priceId: this.steelMap.priceId,
+        placeId: this.steelMap.placeId
+      }
+      //是否确定修改详单地址!
+      this.$confirm('确定修改', '提示', {
+        confirmButtonText: '仅修改单价',
+        cancelButtonText: '修改下货地址和单价',
+        distinguishCancelAndClose: true,
+        type: 'warning',
+        center: true
+      })
+        .then(() => {
+          //初始化修改详单地址对话框的信息
+          this.axios
+            .post('/api/v1/bms/updateDetailsOrder', mapValue)
+            .then(res => {
+              if (res.data.code == '0') {
+                this.$message.success('修改详单单价成功!')
+                //重置未结算详单表单信息
+                this.operation(this.steelMap)
+                this.getSteelReport()
+                this.dialogFormVisible = false
+              } else {
+                this.$message.error('修改详单单价失败,请联系管理员!')
+                this.dialogFormVisible = false
+              }
+            })
+        })
+        .catch(action => {
+          if (action === 'cancel') {
+            mapValue.updatePlace = 1
+            this.axios
+              .post('/api/v1/bms/updateDetailsOrder', mapValue)
+              .then(res => {
+                if (res.data.code == '0') {
+                  this.$message.success('修改详单单价和地址成功!')
+                  this.operation(this.steelMap)
+                  this.getSteelReport()
+                  this.dialogFormVisible = false
+                }
+              })
+          }
+          //初始化修改详单地址对话框的信息
+        })
+    },
+    hanleScroll() {
+      console.log('我滚动了')
+    },
+    // batchAddressClick() {
+    //   const loading = this.$loading({
+    //     lock: true,
+    //     text: '正在修改收货地址',
+    //     spinner: 'el-icon-loading',
+    //     background: 'rgba(0, 0, 0, 0.7)'
+    //   })
+    //   this.batchList.forEach(e => {
+    //     e.addressProvince = this.batchAddressProvince
+    //     e.addressDistrict = this.batchAddressDistrict
+    //     e.place = this.batchPlace
+    //     e.isCloseEas = Number(1)
+    //     e.isNewCar = Number(1)
+    //     e.shipperAddressId = this.addressId
+    //     this.axios
+    //       .post('/api/v1/ams/updateCarAddress', e)
+    //       .then(res => {
+    //         if (res.data.code == '200') {
+    //           this.$message.success('修改收货地址成功!')
+    //           this.getSteelReport()
+    //         } else {
+    //           this.$message.error('修改失败,请联系管理员!')
+    //           this.getSteelReport()
+    //         }
+    //       })
+    //       .catch(() => {
+    //         this.$message.error('修改失败,请联系管理员!')
+    //         this.getSteelReport()
+    //       })
+    //   })
+    // },
+    // batchoperation() {
+    //   if (this.batchList.length > 0) {
+    //     console.log(this.batchList)
+    //     this.getAllProvince()
+    //     this.onchangeProvince()
+    //     this.onchangeCity()
+    //     this.centerDialogVisibleBatch = true
+    //   } else {
+    //     this.$message({
+    //       type: 'info',
+    //       offset: '250',
+    //       message: '请先选择'
+    //     })
+    //   }
+    // },
+    openReceive() {
+      if (Object.values(this.steelMap).length == 0) {
+        this.$message.warning('请选择需要补录的实绩')
+        return
+      }
+      let row = this.steelMap
+      if (!row.outGateTime) {
+        this.$message.warning('该车未出厂,不允许签收')
+        return
+      }
+      if (row.arrivalAddress) {
+        this.location = row.arrivalAddress
+      } else {
+        this.location = row.addressPlace
+      }
+      this.orderNumber = row.orderNo
+      this.capacityNumber = row.capacityNo
+      this.arrivalReceiving = true
+    },
+    arrivalAndReceive() {
+      if (!this.location) {
+        this.$message.warning('请填写签收地址')
+        return
+      }
+      if (this.fileListArrival.length < 2) {
+        this.$message.warning('抵达图至少两张')
+        return
+      }
+      if (this.fileListReceive.length < 3) {
+        this.$message.warning('签收图最少三张')
+        return
+      }
+      this.isLoading = true
+      //上传抵达
+      let formData = new window.FormData()
+      formData.append('file1', this.fileListArrival[0].raw)
+      formData.append('file2', this.fileListArrival[1].raw)
+      formData.append('orderNumber', this.orderNumber)
+      formData.append('resultArrivalAddress', this.location)
+      let options = {
+        // 设置axios的参数
+        url: '/api/v1/otms/addtmstruckArrivalResult',
+        data: formData,
+        method: 'post',
+        headers: {
+          'Content-Type': 'multipart/form-data'
+        }
+      }
+      this.axios(options).then(res => {
+        console.log('arrivalRes:', res)
+        //上传签收
+        let formData = new window.FormData()
+        let request = ''
+        this.fileListReceive.forEach((item, index) => {
+          formData.append('file' + index, item.raw)
+        })
+        formData.append('orderNumber', this.orderNumber)
+        formData.append('resultArrivalAddress', this.location)
+        formData.append('num', request.length)
+        let options = {
+          url: '/api/v1/otms/addTmstruckReceiptResult',
+          data: formData,
+          method: 'post',
+          headers: {
+            'Content-Type': 'multipart/form-data'
+          }
+        }
+        this.axios(options).then(res => {
+          console.log('receiveRes:', res)
+          if (res.data.data == 4) {
+            this.$message.error('新增抵达失败!')
+            this.isLoading = false
+          } else {
+            this.$message.success('上传成功!')
+            this.closeUpload()
+            this.$router.go(0)
+          }
+        })
+      })
+    },
+    fileChange1(file, fileList) {
+      this.fileListArrival = fileList
+    },
+    fileChange2(file, fileList) {
+      this.fileListReceive = fileList
+    },
+    exceed() {
+      this.$message.warning('超出上传数量!')
+    },
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url
+      this.dialogVisible = true
+    },
+    closeUpload() {
+      this.arrivalReceiving = false
+      this.isLoading = false
+      this.$refs.arrival.clearFiles()
+      this.$refs.receive.clearFiles()
+    },
+    //防抖函数--防止用户重复点击
+    debounce(func, delay) {
+      let timer = null
+      return function(...args) {
+        if (timer !== null) {
+          clearTimeout(timer)
+        }
+        timer = setTimeout(function() {
+          func.apply(this, args)
+        }, delay)
+      }
+    },
+    // handleSelectionChange(selection) {
+    //   this.batchList = selection
+    //   console.log(selection)
+    // },
+    //筛选
+    filterChange(obj) {
+      //承运商筛选,后续有待优化
+      if (typeof obj.carrierList != 'undefined' && obj.carrierList.length > 0) {
+        this.filterMap.carrierList = obj.carrierList
+      }
+      if (
+        typeof obj.carrierList != 'undefined' &&
+        obj.carrierList.length == 0
+      ) {
+        delete this.filterMap.carrierList
+      }
+      //物资名称筛选,后续有待优化
+      if (
+        typeof obj.materialNameList != 'undefined' &&
+        obj.materialNameList.length > 0
+      ) {
+        this.filterMap.materialNameList = obj.materialNameList
+      }
+      if (
+        typeof obj.materialNameList != 'undefined' &&
+        obj.materialNameList.length == 0
+      ) {
+        delete this.filterMap.materialNameList
+      }
+      //车牌号筛选,后续有待优化
+      if (typeof obj.capacityNo != 'undefined' && obj.capacityNo.length > 0) {
+        this.filterMap.capacityList = obj.capacityNo
+      }
+      if (typeof obj.capacityNo != 'undefined' && obj.capacityNo.length == 0) {
+        delete this.filterMap.capacityList
+      }
+      //客户筛选,后续有待优化
+      if (
+        typeof obj.consigneeName != 'undefined' &&
+        obj.consigneeName.length > 0
+      ) {
+        this.filterMap.consigneeNameList = obj.consigneeName
+      }
+      if (
+        typeof obj.consigneeName != 'undefined' &&
+        obj.consigneeName.length == 0
+      ) {
+        delete this.filterMap.consigneeNameList
+      }
+      //销售片区筛选,后续有待优化
+      if (
+        typeof obj.saleAreaList != 'undefined' &&
+        obj.saleAreaList.length > 0
+      ) {
+        this.filterMap.saleAreaList = obj.saleAreaList
+      }
+      if (
+        typeof obj.saleAreaList != 'undefined' &&
+        obj.saleAreaList.length == 0
+      ) {
+        delete this.filterMap.saleAreaList
+      }
+      //物资规格筛选
+      if (typeof obj.materialSpe != 'undefined' && obj.materialSpe.length > 0) {
+        this.filterMap.materialSpeList = obj.materialSpe
+      }
+      if (
+        typeof obj.materialSpe != 'undefined' &&
+        obj.materialSpe.length == 0
+      ) {
+        delete this.filterMap.materialSpeList
+      }
+      //收货地址筛选
+      if (
+        typeof obj.addressPlace != 'undefined' &&
+        obj.addressPlace.length > 0
+      ) {
+        this.filterMap.addressPlaceList = obj.addressPlace
+      }
+      if (
+        typeof obj.addressPlace != 'undefined' &&
+        obj.addressPlace.length == 0
+      ) {
+        delete this.filterMap.addressPlaceList
+      }
+      if (typeof obj.orderStatus != 'undefined' && obj.orderStatus.length > 0) {
+        this.filterMap.orderStatusList = obj.orderStatus
+      }
+      if (
+        typeof obj.orderStatus != 'undefined' &&
+        obj.orderStatus.length == 0
+      ) {
+        delete this.filterMap.orderStatusList
+      }
+      if (
+        typeof obj.saleOrderStatus != 'undefined' &&
+        obj.saleOrderStatus.length > 0
+      ) {
+        this.filterMap.saleOrderStatusList = obj.saleOrderStatus
+      }
+      if (
+        typeof obj.saleOrderStatus != 'undefined' &&
+        obj.saleOrderStatus.length == 0
+      ) {
+        delete this.filterMap.saleOrderStatusList
+      }
+      if (typeof obj.saleRemark != 'undefined' && obj.saleRemark.length > 0) {
+        this.filterMap.saleRemarkList = obj.saleRemark
+      }
+      if (typeof obj.saleRemark != 'undefined' && obj.saleRemark.length == 0) {
+        delete this.filterMap.saleRemarkList
+      }
+      // if (obj)
+      this.onclick(this.filterMap)
+    },
+    //控制筛选数组变化
+    filterListChange() {
+      //客户筛选数组
+      let consigneeNameList = this.tableData.map(e => {
+        return e.consigneeName
+      })
+      //承运商筛选数组
+      let carrierNameList = this.tableData.map(e => {
+        return e.carrierName
+      })
+      //车牌号筛选数组
+      let capacityList = this.tableData.map(e => {
+        return e.newCapacityNo
+      })
+      //物资筛选数组
+      let materialNameList = this.tableData
+        .map(e => {
+          return e.materialName
+        })
+        .filter(e => {
+          return e != null
+        })
+      //销售片区筛选数组
+      let saleAreaList = this.tableData
+        .map(e => {
+          return e.areaName
+        })
+        .filter(e => {
+          return e != null
+        })
+      let addressPlaceList = this.tableData
+        .map(e => {
+          return e.addressPlace
+        })
+        .filter(e => {
+          return e != null
+        })
+      let orderStatusList = this.tableData
+        .map(e => {
+          return e.orderStatus
+        })
+        .filter(e => {
+          return e != null
+        })
+      let materialSpeList = this.tableData
+        .map(e => {
+          return e.materialSpe
+        })
+        .filter(e => {
+          return e != null
+        })
+      let saleOrderStatusList = this.tableData.map(e => {
+        return e.saleOrderStatus
+      })
+      let saleRemarkList = this.tableData.map(e => {
+        return e.saleRemark
+      })
+      this.filterConsigneeList = []
+      this.filterCarrierList = []
+      this.filterCapacityList = []
+      this.filtermaterialNameList = []
+      this.filterSaleAreaList = []
+      this.filterorderStatus = []
+      this.filteraddressPlace = []
+      this.filtermaterialSpe = []
+      this.filterSaleOrderStatus = []
+      this.filterSaleRemark = []
+      Array.from(new Set(consigneeNameList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterConsigneeList.push(map)
+      })
+      Array.from(new Set(carrierNameList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterCarrierList.push(map)
+      })
+      Array.from(new Set(capacityList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterCapacityList.push(map)
+      })
+      Array.from(new Set(materialNameList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filtermaterialNameList.push(map)
+      })
+      Array.from(new Set(saleAreaList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterSaleAreaList.push(map)
+      })
+      Array.from(new Set(addressPlaceList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filteraddressPlace.push(map)
+      })
+      Array.from(new Set(orderStatusList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterorderStatus.push(map)
+      })
+      Array.from(new Set(materialSpeList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filtermaterialSpe.push(map)
+      })
+      Array.from(new Set(saleOrderStatusList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterSaleOrderStatus.push(map)
+      })
+      Array.from(new Set(saleRemarkList)).forEach(e => {
+        let map = {}
+        map.text = e
+        map.value = e
+        this.filterSaleRemark.push(map)
+      })
+    },
+    cellStyle({ row, column, rowIndex, columnIndex }) {
+      if (
+        column.property == 'arrivalAddress' ||
+        column.property == 'receiptAddress'
+      ) {
+        return { color: 'blue', height: '30px' }
+      } else {
+        return { height: '30px' }
+      }
+    },
+    rowClick(row, column, event) {
+      this.steelMap = {}
+      this.tableRowIndex = row.group
+      this.isRowClick = 1
+      this.steelMap = row
+    },
+    tableRowClassName({ row, rowIndex }) {
+      if (row.group == this.tableRowIndex && this.tableRowIndex !== '') {
+        return 'warning-row'
+      }
+    },
+    cellMouse(row, column, cell, event) {
+      if (this.isRowClick == 0) {
+        this.tableRowIndex = row.group
+      }
+    },
+    cellLeave(row, column, cell, event) {
+      if (this.isRowClick == 0) {
+        this.tableRowIndex = ''
+      }
+    },
+    reset() {
+      var that = this
+      that.$nextTick(() => {
+        that.saleSteelKey = !that.saleSteelKey
+      })
+    },
+    checkTrans(row) {
+      this.isRowClick = 0
+      if (Object.values(this.steelMap).length == 0) {
+        this.$message.error('请点击需要查看轨迹的行!')
+        return
+      }
+      if (typeof row === 'undefined') {
+        row = this.steelMap
+      }
+      if (row.outGateTime == null) {
+        this.$message.error('该车还未出厂,暂无轨迹')
+        return
+      }
+      let that = this
+      that.axios
+        .post('/api/v1/otms/fullPath?orderNumber=' + row.orderNo)
+        .then(res => {
+          console.log(res.data)
+          if (res.data.data == '-1') {
+            this.$message.error('运输订单未关闭的自提车辆无权查看!')
+          } else if (res.data.data.startAndEndRoutes != null) {
+            that.pathOption.orderNumber = row.orderNo
+            that.pathOption.capacityNumber = row.capacityNo
+            that.pathOption.startPointName = '达钢集团小东门'
+            that.pathOption.endPointName = row.arrivalAddress
+            that.value7 = true
+          } else {
+            this.$message.error('车辆没有开启GPS')
+          }
+        })
+    },
+    cellClik(row, column, cell, event) {
+      console.log(row)
+      if (column.property == 'arrivalAddress') {
+        if (row.orderNo && row.arrivalAddress) {
+          this.downloadCapacityNo = row.capacityNo
+          this.toPhotoClick(row.orderNo, 1)
+        }
+      }
+      if (column.property == 'receiptAddress') {
+        if (row.orderNo && row.receiptAddress) {
+          this.downloadCapacityNo = row.capacityNo
+          this.receipctPhotoClick(row.orderNo, 1)
+        }
+      }
+    },
+    //反关闭运单
+    reverseCloseOrder() {
+      this.axios
+        .post('/api/v1/ams/reverseCloseOrder', this.steelMap)
+        .then(res => {
+          this.operation(this.steelMap)
+          this.getSteelReport()
+        })
+    },
+    //筛选
+    //筛选客户
+    //点击操作弹出框
+    operation(row) {
+      this.isRowClick = 0
+      if (Object.values(this.steelMap).length == 0) {
+        this.$message.error('请点击需要执行更改操作的行!')
+        return
+      }
+      if (typeof row === 'undefined') {
+        row = this.steelMap
+      }
+      this.axios
+        .post(
+          '/api/v1/tms/getSteelReportDetailsBySmId?saleOrderMaterialId=' +
+            row.saleOrderMaterialId
+        )
+        .then(res => {
+          this.steelMap = res.data.data
+          this.addressId = row.shipperAddressId
+          this.getAllProvince()
+          this.onchangeProvince()
+          this.onchangeCity()
+          this.centerDialogVisible = true
+        })
+    },
+    //查看抵达图
+    toPhotoClick(orderNo, num) {
+      this.axios
+        .post('/api/v1/otms/getArrivalPhoto?orderNumber=' + orderNo)
+        .then(res => {
+          this.srcList = []
+          this.srcList.push({
+            title: '车头照片',
+            src: res.data[0]
+          })
+          this.srcList.push({
+            title: '满货箱照片',
+            src: res.data[1]
+          })
+          if (num == 1) {
+            this.isShow3 = true
+          } else {
+            this.isShow = true
+          }
+        })
+    },
+    //查看实时路径
+    checkPoint() {
+      if (this.input || this.input1 || this.steelMap.capacityNo) {
+        this.carNumber = this.input || this.input1 || this.steelMap.capacityNo
+        this.value8 = true
+      } else {
+        this.$message.error('请输入或者点击有车牌号的行查询车牌号的实时路径')
+      }
+    },
+    //查看签收图
+    receipctPhotoClick(orderNo, num) {
+      this.axios
+        .post('/api/v1/otms/getReceivingPhotoByUrl?orderNumber=' + orderNo)
+        .then(res => {
+          console.log(res.data)
+          if (num == 1) {
+            this.isShow4 = true
+          } else {
+            this.isShow2 = true
+          }
+          this.srcList2 = []
+          if (res.data && res.data.length > 0) {
+            res.data.forEach(item => {
+              this.srcList2.push({
+                title: '',
+                src: item
+              })
+            })
+          }
+        })
+    },
+    //反关闭整条分录
+    adverseCloseSaleMaterial(row) {
+      console.log(row.saleMaterialId)
+      this.$confirm('确定反关闭该条分录?', '提示', {
+        cancelButtonText: '取消',
+        confirmButtonText: '确定',
+        center: true
+      }).then(() => {
+        this.axios
+          .post(
+            '/api/v1/ams/adverseCloseSaleMaterial?saleMaterialId=' +
+              row.saleMaterialId
+          )
+          .then(res => {
+            if (res.data.code == '200') {
+              this.$message.success('反关闭成功')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+            } else {
+              this.$message.error('反关闭失败')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+            }
+          })
+          .catch(() => {
+            this.$message.error('反关闭失败')
+            this.getSteelReport()
+          })
+      })
+    },
+    //销售钢材报表导出excel
+    exportAllReportToExcel() {
+      const loading = this.$loading({
+        lock: true,
+        text: '正在导出Excel',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      var title = this.tableTitle
+      let tHeader = []
+      let filterVal = []
+      console.log(this.$refs.tableRef)
+      this.$refs.tableRef.$children.forEach(item => {
+        if (item.label != undefined && item.prop != undefined) {
+          if (tHeader.indexOf(item.label) === -1) {
+            tHeader.push(item.label)
+          }
+          if (filterVal.indexOf(item.prop) === -1) {
+            filterVal.push(item.prop)
+          }
+        }
+      })
+      this.downloadLoading = true
+      require.ensure([], () => {
+        const {
+          export_json_to_excel
+        } = require('@/assets/excel/Export2Excel.js') //这里必须使用绝对路径,使用@/+存放export2Excel的路径
+        let data = this.tableData.map(v => filterVal.map(j => v[j])) //3.formatJson格式转换
+        export_json_to_excel(tHeader, data, title) // (title)导出的表格名称
+      })
+      loading.close()
+    },
+    changeScreen() {},
+    //承运商弹出层
+    handleSelectCarrier() {
+      this.carrierList.forEach(item => {
+        if (item.carrierName == this.steelMap.carrierName) {
+          this.steelMap.newCarrierId = item.carrierId
+          this.steelMap.carrierId = item.carrierId
+        }
+      })
+    },
+    //承运商边输边查
+    querySearchCarrier(queryString, cb) {
+      if (queryString != null && queryString != '' && queryString.length > 1) {
+        this.axios
+          .post('/api/v1/uc/getCarrierMesByLike?index=' + queryString)
+          .then(res => {
+            if (res.data.code == '200') {
+              this.carrierList = []
+              if (res.data.data.length == 0) {
+                this.$message.info('承运商不存在,请前往注册')
+                return
+              }
+              var restaurants = res.data.data
+              this.carrierList = res.data.data
+              var results = queryString
+                ? restaurants.filter(this.createFilterCarrier(queryString))
+                : restaurants
+              cb(results)
+            }
+          })
+      }
+    },
+    createFilterCarrier(queryString) {
+      return restaurants => {
+        return (
+          restaurants.value1.toLowerCase().indexOf(queryString.toLowerCase()) >
+          -1
+        )
+      }
+    },
+    //以下是车牌号边输边查搜索
+    querySearch(queryString, cb) {
+      console.log(queryString)
+      if (
+        (queryString != null && queryString != '' && queryString.length > 3) ||
+        queryString == '取消' ||
+        queryString == '待定'
+      ) {
+        this.axios
+          .post('/api/v1/uc/getCapacityByLike?index=' + queryString)
+          .then(res => {
+            this.capacityList = []
+            if (res.data.code == '200') {
+              if (res.data.data.length == 0) {
+                this.$message.info('车牌号不存在,请前往注册')
+                return
+              }
+              var restaurants = res.data.data
+              this.capacityList = res.data.data
+              var results = queryString
+                ? restaurants.filter(this.createFilter(queryString))
+                : restaurants
+              // 调用 callback 返回建议列表的数据
+              cb(results)
+            }
+          })
+      }
+    },
+    createFilter(queryString) {
+      return restaurants => {
+        return (
+          restaurants.value.toLowerCase().indexOf(queryString.toLowerCase()) >
+          -1
+        )
+      }
+    },
+    //车牌号弹出层
+    handleSelect() {
+      this.capacityList.forEach(item => {
+        if (item.capacityNumber === this.steelMap.capacityNo) {
+          this.steelMap.newsCapacityId = item.capacityId
+        }
+      })
+    },
+    updateCapacity() {
+      console.log('我只想测')
+      this.steelMap.capacityId = this.steelMap.newsCapacityId
+      if (this.steelMap.newsCapacityId == null) {
+        this.$message.warning('请先注册车牌号或者选中弹出后再提交!')
+        return
+      }
+      if (
+        !(
+          isVehicleNumber(this.steelMap.capacityNo) ||
+          this.steelMap.capacityNo == '取消' ||
+          this.steelMap.capacityNo == '待定'
+        )
+      ) {
+        this.$message.error('请输入正确格式的车牌号!')
+        return
+      }
+      if (this.steelMap.capacityIds != 0) {
+        const loading = this.$loading({
+          lock: true,
+          text: '正在变更车牌号',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        this.axios
+          .post('/api/v1/ams/updateCapacityNumberInFactory', this.steelMap)
+          .then(res => {
+            if (res.data.code == 200) {
+              this.$message.success('变更车牌号成功!')
+              this.operation(this.steelMap)
+              console.log('更改车牌号之后的变化')
+              console.log(res.data)
+              if (res.data.data.capacityTel != 0) {
+                console.log('进入了这个界面')
+                this.steelMap.capacityTel = res.data.data.capacityTel
+              } else {
+                this.axios
+                  .post(
+                    '/api/v1/ams/matchingDriverTelRecently?capacityNumber=' +
+                      this.steelMap.capacityNo
+                  )
+                  .then(res => {
+                    if (res.data.data != null) {
+                      this.steelMap.capacityTel = res.data.data
+                    }
+                  })
+              }
+              this.updateDriverTel()
+              this.getSteelReport()
+              loading.close()
+            } else {
+              this.$message.success('变更失败,请联系管理员')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            }
+          })
+          .catch(() => {
+            this.$message.success('变更失败,请联系管理员')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          })
+      } else {
+        if (this.steelMap.carrierIds == 0) {
+          this.$message.error('请先选择承运商!')
+          return
+        }
+        this.steelMap.lineId = this.lineSpelling[this.steelMap.mapList.length]
+        this.steelMap.driverTel = this.steelMap.capacityTel
+        this.steelMap.capacityNumber = this.steelMap.capacityNo
+        let arr = []
+        arr.push(this.steelMap)
+        const loading = this.$loading({
+          lock: true,
+          text: '正在派车,请稍候',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        this.axios
+          .post('/api/v1/ams/dispatchSteelOrder', arr)
+          .then(res => {
+            if (res.data.code == '200') {
+              this.$message.success('派车成功!')
+              this.operation(this.steelMap)
+              this.axios
+                .post(
+                  '/api/v1/ams/matchingDriverTelRecently?capacityNumber=' +
+                    this.steelMap.capacityNo
+                )
+                .then(res => {
+                  if (res.data.data != null) {
+                    this.steelMap.capacityTel = res.data.data
+                    this.updateDriverTel()
+                  }
+                })
+              this.getSteelReport()
+              loading.close()
+            } else {
+              this.$message.error(res.data.data)
+              this.getSteelReport()
+              this.operation(this.steelMap)
+              loading.close()
+            }
+          })
+          .catch(() => {
+            this.$message.error(res.data.data)
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          })
+      }
+    },
+    //修改司机电话号码
+    updateDriverTel() {
+      const loading = this.$loading({
+        lock: true,
+        text: '修改电话号码中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      if (
+        this.steelMap.capacityTel == null ||
+        this.steelMap.capacityTel == ''
+      ) {
+        this.$message.error('电话号码不能为空')
+        loading.close()
+        return
+      }
+      var regex = /^[1][2,3,4,5,6,7,8,9][0-9]{9}$/
+      if (!regex.test(this.steelMap.capacityTel)) {
+        this.$message.error('电话号码不符合规则')
+        loading.close()
+        return
+      }
+      this.axios
+        .post('/api/v1/uc/updateDriverTel', {
+          orderId: parseInt(this.steelMap.orderId),
+          saleOrderMaterialId: parseInt(this.steelMap.saleOrderMaterialId),
+          driverTel: this.steelMap.capacityTel
+        })
+        .then(res => {
+          if (res.data.code == '200') {
+            this.$message({
+              type: 'success',
+              duration: 2000,
+              message: '修改电话号码成功',
+              offset: 250
+            })
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          } else {
+            this.$message.error('修改失败')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          }
+        })
+        .catch(() => {
+          this.$message.error('修改失败')
+          this.operation(this.steelMap)
+          this.getSteelReport()
+          loading.close()
+        })
+    },
+    //修改收货客户电话
+    updateconsigneeTel() {
+      const loading = this.$loading({
+        lock: true,
+        text: '修改电话号码中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      if (
+        this.steelMap.consigneeTel == null ||
+        this.steelMap.consigneeTel == ''
+      ) {
+        this.$message.error('电话号码不能为空')
+        return
+      }
+      this.axios
+        .post('/api/v1/ams/updateConsigneeTel', {
+          saleOrderNo: this.steelMap.saleOrderNo,
+          saleOrderMaterialId: this.steelMap.saleOrderMaterialId,
+          consigneeTel: this.steelMap.consigneeTel
+        })
+        .then(res => {
+          if (res.data.code == '200') {
+            this.$message.success('修改成功')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          } else {
+            this.$message.error('修改失败')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          }
+        })
+        .catch(() => {
+          this.$message.error('修改失败')
+          this.operation(this.steelMap)
+          this.getSteelReport()
+          loading.close()
+        })
+    },
+    //关闭车辆金蝶分录
+    deleteEasEntryId() {
+      this.$confirm('确定关闭该车金蝶分录吗?', '提示', {
+        confirmButtonText: '是',
+        cancelButtonText: '否',
+        center: true,
+        type: 'warning'
+      })
+        .then(() => {
+          let map = this.steelMap
+          map.operateName = getCookie('loginName')
+          map.isCloseEas = Number(0)
+          const loading = this.$loading({
+            lock: true,
+            text: '正在关闭车辆',
+            spinner: 'el-icon-loading',
+            background: 'rgba(0, 0, 0, 0.7)'
+          })
+          this.axios
+            .post('/api/v1/ams/updateCarAddress', map)
+            .then(res => {
+              if (res.data.code == '200') {
+                this.$message.success('关闭车辆成功')
+                this.getSteelReport()
+                this.operation(this.steelMap)
+                loading.close()
+              } else {
+                this.$message.error('关闭车辆失败')
+                this.operation(this.steelMap)
+                this.getSteelReport()
+                loading.close()
+              }
+            })
+            .catch(() => {
+              this.$message.error('关闭车辆失败')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            })
+        })
+        .catch(() => {
+          this.$message.info('取消关闭')
+        })
+    },
+    //修改承运商授权
+    updateTruckCarrier() {
+      if (this.steelMap.newCarrierId == null) {
+        this.$message.warning('请注册承运商或者选中弹出层之后再提交!')
+        this.getSteelReport()
+        return
+      }
+      if (this.steelMap.carrierIds != 0) {
+        const loading = this.$loading({
+          lock: true,
+          text: '正在修改承运商授权',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        this.axios
+          .post('/api/v1/ams/updateTruckNoCarrier', this.steelMap)
+          .then(res => {
+            if (res.data.code == '200') {
+              this.$message.success('修改承运商授权成功')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            } else {
+              this.$message.error('修改失败,请联系管理员!')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            }
+          })
+          .catch(() => {
+            this.$message.error('修改失败,请联系管理员!')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          })
+      } else {
+        //授权承运商
+        let arr = []
+        arr.push(this.steelMap)
+        const loading = this.$loading({
+          lock: true,
+          text: '正在授权承运商',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        this.axios
+          .post('/api/v1/ams/dispatchToCarrier', arr)
+          .then(res => {
+            if (res.data.code == '0') {
+              this.$message.success('授权承运商成功')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            } else {
+              this.$message.error('授权失败,请联系管理员')
+              this.operation(this.steelMap)
+              this.getSteelReport()
+              loading.close()
+            }
+          })
+          .catch(() => {
+            this.$message.error('授权失败,请联系管理员')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          })
+      }
+    },
+    updateAddress(row) {
+      this.drawer = true
+      this.addressRow = row
+      this.province = row.addressProvince
+      this.city = row.addressDistrict
+      this.county = row.addressTown
+      this.addressId = row.shipperAddressId
+      this.getAllProvince()
+      this.onchangeProvince()
+      this.onchangeCity()
+    },
+    //获取所有省数据
+    getAllProvince() {
+      this.axios.post('/api/v1/uc/getAllProvince').then(res => {
+        this.provinceList = res.data.data
+      })
+    },
+    //省改变
+    onchangeProvince() {
+      this.axios
+        .post(
+          '/api/v1/uc/getDistrictByProvince?addressProvince=' +
+            this.steelMap.addressProvince +
+            '&i=' +
+            new Date()
+        )
+        .then(res => {
+          this.cityList = res.data.data
+          // this.city = "";
+          // this.county = "";
+        })
+    },
+    //市改变
+    onchangeCity() {
+      this.axios
+        .post(
+          '/api/v1/uc/getTownByDistrict?addressDistrict=' +
+            this.steelMap.addressDistrict +
+            '&i=' +
+            new Date()
+        )
+        .then(res => {
+          this.countyList = res.data.data
+        })
+    },
+    //县(区)改变
+    onchangeCounty() {
+      let mapValue = {
+        addressProvince: this.steelMap.addressProvince,
+        addressDistrict: this.steelMap.addressDistrict,
+        addressTown: this.steelMap.addressTown
+      }
+      this.axios.post('/api/v1/uc/getPlaceByAllAddress', mapValue).then(res => {
+        this.addressId = res.data.data[0].addressId
+      })
+    },
+    //收货地址弹出层
+    handleSelect1(item) {
+      console.log('获取所有下拉值!')
+    },
+    //以下是收货地址边输边查搜索
+    querySearch1(queryString, cb) {
+      this.axios
+        .post(
+          '/api/v1/ams/getRealAddressByLike?addressId=' +
+            this.addressId +
+            '&index=' +
+            queryString
+        )
+        .then(res => {
+          if (res.data.code == '200') {
+            var restaurants = res.data.data
+            var results = queryString
+              ? restaurants.filter(this.createFilter1(queryString))
+              : restaurants
+            // 调用 callback 返回建议列表的数据
+            cb(results)
+          }
+        })
+    },
+    createFilter1(queryString) {
+      return restaurants => {
+        return (
+          restaurants.value.toLowerCase().indexOf(queryString.toLowerCase()) >
+          -1
+        )
+      }
+    },
+    //修改收货地址
+    addAddressClick() {
+      const loading = this.$loading({
+        lock: true,
+        text: '正在修改收货地址',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      let map = this.steelMap
+      map.isCloseEas = Number(1)
+      map.isNewCar = Number(1)
+      map.shipperAddressId = this.addressId
+      this.axios
+        .post('/api/v1/ams/updateCarAddress', map)
+        .then(res => {
+          if (res.data.code == '200') {
+            this.$message.success('修改收货地址成功!')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          } else {
+            this.$message.error('修改失败,请联系管理员!')
+            this.operation(this.steelMap)
+            this.getSteelReport()
+            loading.close()
+          }
+        })
+        .catch(() => {
+          this.$message.error('修改失败,请联系管理员!')
+          this.operation(this.steelMap)
+          this.getSteelReport()
+          loading.close()
+        })
+    },
+    //记录每一行的合并数
+    getSpanArr(data) {
+      //每次调用方法初始化
+      this.spanArr = []
+      for (var i = 0; i < data.length; i++) {
+        if (i === 0) {
+          this.spanArr.push(1)
+          data[i].group = i
+          this.pos = 0
+        } else {
+          // 判断当前元素与上一个元素是否相同
+          if (data[i].saleOrderMaterialId === data[i - 1].saleOrderMaterialId) {
+            this.spanArr[this.pos] += 1
+            data[i].group = data[i - 1].group
+            this.spanArr.push(0)
+          } else {
+            this.spanArr.push(1)
+            this.pos = i
+            data[i].group = data[i - 1].group + 1
+          }
+        }
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (this.mergeList.indexOf(column.label) != -1) {
+        const _row = this.spanArr[rowIndex]
+        const _col = _row > 0 ? 1 : 0
+        return {
+          rowspan: _row,
+          colspan: _col
+        }
+      }
+    },
+    //计算总件数和总车数
+    getTotalNum(data) {
+      //通过车序号的个数来计算车数
+      let arr = []
+      arr = data.map(e => {
+        return e.saleOrderMaterialId
+      })
+      this.totalCapacity = Array.from(new Set(arr)).length
+      this.totalNumber = data.reduce(function(prev, item) {
+        return prev + item.materialNum
+      }, 0)
+    },
+    //减少物资件数
+    updateBillOrder(row) {
+      const loading = this.$loading({
+        lock: true,
+        text: '修改物资件数中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      let map = {
+        materialId: row.materialId,
+        materialNum: row.materialNum
+      }
+      let arr = []
+      arr.push(map)
+      let updateMap = {
+        orderId: this.steelMap.orderId,
+        saleOrderId: this.steelMap.saleOrderId,
+        saleOrderMaterialId: this.steelMap.saleOrderMaterialId,
+        mapList: arr
+      }
+      this.axios
+        .post('/api/v1/oms/updateMaterialMes', updateMap)
+        .then(res => {
+          if (res.data.code == '200') {
+            this.$message.success('修改物资数量成功')
+            this.getSteelReport()
+            loading.close()
+          } else {
+            this.$message.error('修改物资数量失败,请联系管理员')
+            this.getSteelReport()
+            loading.close()
+          }
+        })
+        .catch(() => {
+          this.$message.error('修改物资数量失败,请联系管理员')
+          this.getSteelReport()
+          loading.close()
+        })
+    },
+    //关闭单条分录
+    closeEasEntryId(row) {
+      if (this.steelMap.mapList.length == 1) {
+        this.deleteEasEntryId()
+        return
+      }
+      this.$prompt('确定关闭该条分录吗?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        center: true,
+        inputPlaceholder: '请输入关闭理由'
+      })
+        .then(({ value }) => {
+          if (value != null || value != '') {
+            const loading = this.$loading({
+              lock: true,
+              text: '正在关闭该条分录',
+              spinner: 'el-icon-loading',
+              background: 'rgba(0, 0, 0, 0.7)'
+            })
+            let map = {
+              orderId: this.steelMap.orderId,
+              saleOrderMaterialId: this.steelMap.saleOrderMaterialId,
+              saleMaterialId: row.saleMaterialId,
+              reason: value,
+              number: this.steelMap.saleOrderNo,
+              closeEntryId: row.closeEntryId
+            }
+            this.axios
+              .post('/api/v1/ams/closeSteelMaterialId', map)
+              .then(res => {
+                if (res.data.code == '200') {
+                  this.$message.success('关闭成功')
+                  this.operation(this.steelMap)
+                  this.getSteelReport()
+                  loading.close()
+                } else {
+                  this.$message.error('关闭失败,请联系管理员')
+                  this.operation(this.steelMap)
+                  this.getSteelReport()
+                  loading.close()
+                }
+              })
+              .catch(() => {
+                this.$message.error('关闭失败,请联系管理员')
+                this.operation(this.steelMap)
+                this.getSteelReport()
+                loading.close()
+              })
+          }
+        })
+        .catch(() => {
+          this.$message.info('取消输入')
+        })
+    },
+    //查询,输入查询条件
+    onclick(obj) {
+      this.isRowClick = 0
+      const loading = this.$loading({
+        lock: true,
+        text: '正在获取数据',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      let startTime = null
+      let endTime = null
+      let carrierSsoId = null
+      let carrierName = null
+      let consigneeName = null
+      let capacityNo = null
+      let remark = null
+      let saler = null
+      let easPrimaryId = null
+      let consigneeSsoId = null
+      if (this.startTime && this.endTime) {
+        startTime = sjTime(this.startTime)
+        endTime = sjTime(this.endTime)
+      }
+      if (getCookie('orgCode') == 'chengyunshang') {
+        carrierSsoId = getCookie('userId')
+      }
+      if (getCookie('orgCode') == 'xiaoshouyewuyuan') {
+        saler = getCookie('loginName')
+      }
+      if (getCookie('orgCode') == 'shouhuokehu') {
+        consigneeSsoId = getCookie('userId')
+        obj.consigneeSsoId = consigneeSsoId
+      }
+      if (this.screen == '客户') {
+        consigneeName = this.input
+      } else if (this.screen == '承运商') {
+        carrierName = this.input
+      } else if (this.screen == '车牌号') {
+        capacityNo = this.input
+      } else if (this.screen == '分录ID') {
+        easPrimaryId = this.input
+      } else {
+        remark = this.input
+      }
+      if (this.screen1 == '客户') {
+        consigneeName = this.input1
+      } else if (this.screen1 == '承运商') {
+        carrierName = this.input1
+      } else if (this.screen1 == '车牌号') {
+        capacityNo = this.input1
+      } else {
+        remark = this.input1
+      }
+      this.axios
+        .post(
+          '/api/v1/tms/getSaleSteelReportNew?startTime=' +
+            startTime +
+            '&endTime=' +
+            endTime +
+            '&carrierSsoId=' +
+            carrierSsoId +
+            '&i=' +
+            new Date() +
+            '&remark=' +
+            remark +
+            '&consigneeName=' +
+            consigneeName +
+            '&carrierName=' +
+            carrierName +
+            '&capacityNo=' +
+            capacityNo +
+            '&saler=' +
+            saler +
+            '&easPrimaryId=' +
+            easPrimaryId,
+          obj
+        )
+        .then(res => {
+          this.tableData = res.data.data
+          this.totalHeight += this.itemHeight
+          this.visibleList = res.data.data
+          console.log(this.visibleList, 'this.visibleList')
+          this.getSpanArr(this.visibleList)
+          this.getTotalNum(this.tableData)
+          loading.close()
+          console.log(this.visibleList)
+        })
+    },
+    //重新获取表格数据
+    refresh() {
+      this.getSteelReport()
+    },
+    //获取钢材统计报表
+    getSteelReport() {
+      const loading = this.$loading({
+        lock: true,
+        text: '正在获取数据,请稍候',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      this.isRowClick = 0
+      let startTime = null
+      let endTime = null
+      let carrierSsoId = null
+      let carrierName = null
+      let consigneeName = null
+      let consigneeSsoId = null
+      let capacityNo = null
+      let remark = null
+      let saler = null
+      if (this.startTime && this.endTime) {
+        startTime = sjTime(this.startTime)
+        endTime = sjTime(this.endTime)
+      }
+      if (getCookie('orgCode') == 'chengyunshang') {
+        carrierSsoId = getCookie('userId')
+      }
+      if (getCookie('orgCode') == 'xiaoshouyewuyuan') {
+        saler = getCookie('loginName')
+      }
+      if (getCookie('orgCode') == 'shouhuokehu') {
+        consigneeSsoId = getCookie('userId')
+        this.filterMap.consigneeSsoId = consigneeSsoId
+      }
+      if (this.screen == '客户') {
+        consigneeName = this.input
+      } else if (this.screen == '承运商') {
+        carrierName = this.input
+      } else if (this.screen == '车牌号') {
+        capacityNo = this.input
+      } else {
+        remark = this.input
+      }
+      if (this.screen1 == '下单客户') {
+        consigneeName = this.input1
+      } else if (this.screen == '承运商') {
+        carrierName = this.input1
+      } else if (this.screen == '车牌号') {
+        capacityNo = this.input1
+      } else {
+        remark = this.input1
+      }
+      if (getCookie('orgCode') == 'chengyunshang') {
+        carrierSsoId = getCookie('userId')
+      }
+      if (getCookie('orgCode') == 'xiaoshouyewuyuan') {
+        saler = getCookie('loginName')
+      }
+
+      this.axios
+        .post(
+          '/api/v1/tms/getSaleSteelReportNew?startTime=' +
+            startTime +
+            '&endTime=' +
+            endTime +
+            '&carrierSsoId=' +
+            carrierSsoId +
+            '&saler=' +
+            saler +
+            '&i=' +
+            new Date() +
+            '&remark=' +
+            remark +
+            '&consigneeName=' +
+            consigneeName +
+            '&carrierName=' +
+            carrierName +
+            '&capacityNo=' +
+            capacityNo,
+          this.filterMap
+        )
+        .then(res => {
+          this.tableData = res.data.data
+          this.totalHeight += this.itemHeight
+          this.visibleList = []
+          this.visibleList = this.tableData.slice(
+            0,
+            Math.floor(this.maxHeight / this.itemHeight) + 1
+          )
+          console.log(this.visibleList)
+          this.getSpanArr(this.visibleList)
+          this.getTotalNum(this.tableData)
+          loading.close()
+        })
+        .catch(() => {
+          loading.close()
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.purchasFuelNewMonitor {
+  .tableTop {
+    margin-left: 20px;
+    margin-top: 20px;
+  }
+  .table {
+    margin-left: 20px;
+    margin-top: 20px;
+    .el-tooltip {
+      width: auto !important;
+    }
+    /deep/ .el-table__body {
+      overflow-y: auto;
+      position: absolute !important;
+      tr:hover > td {
+        background-color: #fff;
+      }
+    }
+
+    ::-webkit-scrollbar {
+      height: 20px;
+      background-color: transparent;
+    }
+  }
+
+  .dialog {
+    .steelMapClass {
+      .steelMapClass1 {
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+        .steelMapClass12 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+      }
+      .steelMapClass2 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+        .steelMapClass22 {
+          margin-left: 50px;
+          margin-right: 10px;
+          .el-select {
+            .el-input .el-input--suffix {
+              .el-input__inner {
+                border: 0px solid !important;
+              }
+            }
+          }
+        }
+      }
+      .steelMapClass3 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+        .steelMapClass32 {
+          margin-left: 50px;
+          // margin-right: 10px;
+        }
+        .steelMapClass33 {
+          margin-left: 20px;
+          // margin-right: 10px;
+        }
+      }
+      .steelMapClass4 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+
+        .steelMapClass42 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+        .steelMapClass43 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+        .steelMapClass44 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+      }
+      .steelMapClass5 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+
+        .steelMapClass52 {
+          margin-left: 50px;
+          margin-right: 10px;
+          .steelMapClass521 {
+            margin-left: 20px;
+          }
+        }
+      }
+      .steelMapClass6 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+        .steelMapClass62 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+      }
+
+      .steelMapClass7 {
+        margin-top: 20px;
+        display: flex;
+        flex-direction: row;
+        justify-content: flex-start;
+        align-items: flex-start;
+        font-size: 16px;
+        .steelMapClass72 {
+          margin-left: 50px;
+          margin-right: 10px;
+        }
+      }
+    }
+    .table1 {
+      margin-left: 20px;
+      margin-top: 20px;
+      .el-tooltip {
+        width: auto !important;
+      }
+    }
+  }
+  .address {
+    .button-box {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+  }
+}
+</style>
+<!-- <style lang="scss">
+.el-table__body-wrapper {
+  overflow-y: auto;
+  .el-table__body {
+    position: absolute;
+  }
+}
+</style> -->

+ 426 - 0
src/views/sale/components/transportFreight/saleTruckSettlement/currentLocation.vue

@@ -0,0 +1,426 @@
+<template>
+  <div class="container">
+    <!-- 实时路径 -->
+    <div class="btnx">
+      <el-button type="primary" class="" @click="openInfo"
+        >打开信息窗体</el-button
+      >
+      <el-button type="primary" class="" @click="closeinfo"
+        >关闭信息窗口</el-button
+      >
+    </div>
+    <div id="amap-container"></div>
+  </div>
+</template>
+<script>
+import { shallowRef } from '@vue/reactivity'
+import { lazyAMapApiLoaderInstance } from 'vue-amap'
+import Slider from './slider.vue'
+Vue.use(Slider)
+import Vue from 'vue'
+var infoWindow
+export default {
+  name: 'currentLocation',
+  props: {
+    carNumber: ''
+  },
+  setup() {
+    const map = shallowRef(null)
+    return {
+      map
+    }
+  },
+  watch: {
+    speedVal: {
+      deep: true,
+      handler(val, oldVal) {
+        let that = this
+        if (that.pathNavigator != null) {
+          that.pathNavigator.setSpeed(100 * val)
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      //查询车牌号
+      //开始时间和结束时间
+      startTime: '',
+      endTime: '',
+      //地图组件
+      map: null,
+      path: [],
+      pointmarker: null,
+      //定时器
+      timer: null,
+      //是否关闭信息窗体
+      infoClose: false
+    }
+  },
+  created() {
+    let that = this
+    this.initData()
+    this.initTimer()
+    that.initMap(105.602725, 37.076636)
+  },
+  mounted() {},
+  methods: {
+    //初始化数据
+    initData() {
+      let that = this
+      let regExp = /(^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$)/
+      if (that.carNumber == '') {
+        this.$message.error('车牌号不能为空!')
+        //清除旧的定时器
+        clearTimeout(this.timer)
+        return
+      } else if (!regExp.test(that.carNumber)) {
+        this.$message.error('请输入正确的车牌号!')
+        //清除旧的定时器
+        clearTimeout(this.timer)
+        return
+      }
+      that.axios
+        .get('/api/v1/otms/getCurrentLocation?capcityNumber=' + that.carNumber)
+        .then(res => {
+          console.log(res.data.data)
+          if (res.data.data == '-1') {
+            this.$message.error('运输订单未关闭,自提车辆无权查看!')
+          } else if (res.data.data.status != '1006') {
+            that.map.setCenter([
+              res.data.data.result.lon,
+              res.data.data.result.lat
+            ])
+            //画车
+            that.initMarkes(
+              45,
+              60,
+              require('@/assets/img/car1.png'),
+              res.data.data.result.lon,
+              res.data.data.result.lat,
+              '现在所在位置'
+            )
+            //给路径加点
+            let point = new AMap.LngLat(
+              res.data.data.result.lon,
+              res.data.data.result.lat
+            )
+            if (
+              that.path.length <= 0 ||
+              !that.path[that.path.length - 1].equals(point)
+            ) {
+              that.path.push(point)
+            }
+            console.log(that.path)
+            //初始化轨迹
+            that.initPolyline()
+            //显示窗体
+            if (this.infoClose == false) {
+              that.initCustomMarkes(
+                that.carNumber,
+                res.data.data.result.adr,
+                res.data.data.result.lon,
+                res.data.data.result.lat
+              )
+            }
+            this.lon = res.data.data.result.lon
+            this.lat = res.data.data.result.lat
+          } else {
+            this.$message.error('车辆暂时无GPS')
+            //清除定时器
+            clearTimeout(this.timer)
+          }
+        })
+    },
+
+    //初始化地图
+    initMap(lon, lat) {
+      lazyAMapApiLoaderInstance.load().then(() => {
+        let that = this
+        that.map = new AMap.Map('amap-container', {
+          //设置地图容器id
+          viewMode: '2D', //是否为2D地图模式
+          zoom: 18, //初始化地图级别
+          center: [lon, lat] //初始化地图中心点位置105.602725,37.076636
+        })
+      })
+    },
+
+    //创建简单的标记
+    initMarkes(weight, height, image, lon, lat, title) {
+      let that = this
+      //图标标记点
+      let pointicon = new AMap.Icon({
+        size: new AMap.Size(weight, height), // 图标尺寸
+        image: image, // Icon的图像
+        imageOffset: new AMap.Pixel(2, 10), // 图像相对展示区域的偏移量,适于雪碧图等
+        imageSize: new AMap.Size(weight, height) // 根据所设置的大小拉伸或压缩图片
+      })
+      // 创建一个 Marker 实例:
+      var pointmarker = new AMap.Marker({
+        position: new AMap.LngLat(lon, lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+        icon: pointicon,
+        title: title
+      })
+      // 将创建的点标记添加到已有的地图实例:
+      that.pointmarker = pointmarker
+      that.map.add(pointmarker)
+    },
+    initPoint(weight, height, image, lon, lat, title) {
+      let that = this
+      //图标标记点
+      let pointicon = new AMap.Icon({
+        //size: new AMap.Size(weight, height), // 图标尺寸
+        image: image, // Icon的图像
+        imageOffset: new AMap.Pixel(0, 10), // 图像相对展示区域的偏移量,适于雪碧图等
+        imageSize: new AMap.Size(weight, height) // 根据所设置的大小拉伸或压缩图片
+      })
+      // 创建一个 Marker 实例:
+      var pointmarker = new AMap.Marker({
+        position: new AMap.LngLat(lon, lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+        icon: pointicon,
+        title: title,
+        label: {
+          direction: 'top',
+          content: title,
+          offset: new AMap.Pixel(-2, 10)
+        }
+      })
+      // 将创建的点标记添加到已有的地图实例:
+      that.pointmarker = pointmarker
+      that.map.add(pointmarker)
+    },
+    //初始化轨迹
+    initPolyline() {
+      let that = this
+      // 创建一个 Polyline 实例:
+      var polyline = new AMap.BezierCurve({
+        path: that.path,
+        borderWeight: 2, // 线条宽度,默认为 1
+        strokeColor: '#18BFA6', // 线条颜色
+        lineJoin: 'round' // 折线拐点连接处样式
+      })
+      // 将创建的线路添加到已有的线路中去:
+      that.map.add(polyline)
+    },
+    //时间格式转换
+    formatDate(date, fmt) {
+      if (/(y+)/.test(fmt)) {
+        fmt = fmt.replace(
+          RegExp.$1,
+          (date.getFullYear() + '').substr(4 - RegExp.$1.length)
+        )
+      }
+      let o = {
+        'M+': date.getMonth() + 1,
+        'd+': date.getDate(),
+        'h+': date.getHours(),
+        'm+': date.getMinutes(),
+        's+': date.getSeconds()
+      }
+      for (let k in o) {
+        if (new RegExp(`(${k})`).test(fmt)) {
+          let str = o[k] + ''
+          fmt = fmt.replace(
+            RegExp.$1,
+            RegExp.$1.length === 1 ? str : ('00' + str).substr(str.length)
+          )
+        }
+      }
+      return fmt
+    },
+    //定时取得当前位置并加入轨迹中去,点击查询时触发,同时清除path和旧的定时器
+    initTimer() {
+      let that = this
+      //清除旧的定时器
+      clearTimeout(this.timer)
+      that.startTime = that.formatDate(new Date(), 'yyyy年MM月dd日 hh:mm:ss')
+      that.endTime = that.formatDate(new Date(), 'yyyy年MM月dd日 hh:mm:ss')
+      console.log(that.startTime + '至' + that.endTime)
+      //清除path
+      that.path = []
+      //清除所有覆盖物
+      // that.map.clearMap()
+      //设置所有的门岗和汽车衡
+      that.setPoints()
+      //设置定时器
+      that.timer = setInterval(() => {
+        //清除之前车的图标
+        that.map.remove(that.pointmarker)
+        that.initData()
+        that.endTime = that.formatDate(new Date(), 'yyyy年MM月dd日 hh:mm:ss')
+      }, 5000)
+    },
+    //初始化厂内标记点
+    setPoints() {
+      //请求所有汽车衡和门岗
+      let that = this
+      that.axios.get('/api/v1/otms/mapvertexs/findSelections').then(res => {
+        console.log(res.data.data)
+        if (res.data.data) {
+          res.data.data.forEach(vertex => {
+            that.initPoint(
+              20,
+              25,
+              require('@/assets/img/map_site.png'),
+              vertex.longitude,
+              vertex.latitude,
+              vertex.addressName
+            )
+          })
+        }
+      })
+    },
+    //初始化窗体
+    initCustomMarkes(title, details, lon, lat) {
+      let that = this
+      //自定义窗体内容
+      var content = [
+        "<div  style='top:1px;width: 180px; background-color:rgba(22, 160, 133, 1);' ><font color='white'>" +
+          title +
+          '</font>',
+        "<div style='background-color:rgba(22, 160, 133, 1);'><font color='white'>" +
+          details +
+          '<br>' +
+          '时间范围:' +
+          that.startTime +
+          '至' +
+          that.endTime +
+          '<br>' +
+          '</font></div></div>'
+      ]
+      // 创建 infoWindow 实例
+      infoWindow = new AMap.InfoWindow({
+        content: content.join('<br>'), //传入 dom 对象,或者 html 字符串
+        offset: new AMap.Pixel(0, -20) //修改信息差窗体偏移
+      })
+      // 打开信息窗体
+      infoWindow.open(that.map, [lon, lat])
+    },
+    // 关闭信息窗口
+    closeinfo() {
+      this.infoClose = true
+      infoWindow.close()
+    },
+    openInfo() {
+      console.log(this.lon)
+      console.log(this.lat)
+      this.infoClose = false
+      infoWindow.open(this.map, [this.lon, this.lat])
+    }
+  }
+}
+</script>
+<style>
+.inputStyle {
+  position: absolute;
+  width: 200px;
+  left: 50px;
+}
+
+.controller {
+  width: 100%;
+  height: 70px;
+  background: white;
+  position: absolute;
+  z-index: 99;
+  top: 0;
+  left: 0;
+}
+.in_transit_information {
+  width: 320px;
+  float: left;
+  height: 40px;
+}
+
+.container {
+  width: 100%;
+  height: 100%;
+}
+span.item_details2 {
+  position: relative;
+  top: 20px;
+}
+.date_picker_style {
+  position: relative;
+  left: 50px;
+}
+.item_details {
+  position: relative;
+  top: 5px;
+  height: 0px;
+  left: 0px;
+}
+#amap-container {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  margin: 0;
+  font-family: '微软雅黑';
+}
+
+/* 进度条 */
+.mySlider {
+  width: 150px;
+  height: 20px;
+  display: inline-block;
+  position: relative;
+  left: 32px;
+}
+/* 进度条 */
+.mySlider2 {
+  width: 400px;
+  height: 20px;
+  display: inline-block;
+  position: relative;
+  left: 32px;
+}
+.play {
+  position: relative;
+  left: 28px;
+}
+.quickly {
+  float: right;
+  position: relative;
+  left: -20px;
+  top: 10px;
+}
+.pause {
+  position: relative;
+  left: 28px;
+}
+.passed-time {
+  position: relative;
+  left: 5px;
+}
+.end-time {
+  position: relative;
+  left: 5px;
+}
+.map-times {
+  position: relative;
+  width: 40px;
+}
+.searchstyle {
+  position: relative;
+  left: 45px;
+}
+.map-control {
+  float: left;
+  width: 270px;
+}
+.driving_information {
+  height: 40px;
+  width: 240px;
+  float: left;
+}
+</style>
+<style lang="scss" scoped>
+.btnx {
+  z-index: 1000;
+  position: fixed;
+  bottom: 10px;
+  right: 10px;
+}
+</style>

+ 847 - 0
src/views/sale/components/transportFreight/saleTruckSettlement/mapTest.vue

@@ -0,0 +1,847 @@
+<template>
+  <div class="container">
+    <div id="amap-container"></div>
+    <div class="mapcontroller">
+      <div class="in_transit_information">
+        <label class="item_details">起点:{{ startPointName }}</label>
+        <br />
+        <label class="item_details">收货地址:{{ endPointName }}</label>
+        <br />
+      </div>
+      <div class="driving_information2">
+        <label class="item_details">时间:{{ runRoute.gtm }}</label>
+        <br />
+        <label class="item_details">车速:{{ runRoute.spd }}千米/小时</label>
+        <br />
+        <br />
+        <!--控制条-->
+        <div class="map-control" v-show="isActual">
+          <!--播放暂停按钮-->
+          <Icon
+            v-if="!isPlay"
+            class="play-icon play"
+            type="ios-play"
+            @click="
+              isPlay = true
+              play()
+              navgControl(playIcon)
+            "
+          />
+          <Icon
+            v-else
+            class="play-icon pause"
+            type="ios-pause"
+            @click="
+              isPlay = false
+              stop()
+              navgControl('pause')
+            "
+          />
+          <Icon class="play-icon quickly" type="ios-play" @click="addIndex()" />
+          <!--已播放时间-->
+          <!--进度条-->
+          <div class="mySlider">
+            <Slider
+              class="map-slider"
+              v-model="sliderVal"
+              :tip-format="hideFormat"
+              :step="0.0001"
+            ></Slider>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-row>
+      <el-button type="primary" @click="slow">慢速</el-button>
+      <el-button type="success" @click="middle">中速</el-button>
+      <el-button type="danger" @click="fast">快速</el-button>
+      <el-button type="success" @click="addIndex" plain>快进</el-button>
+      <el-button type="danger" @click="stop" plain>暂停</el-button>
+      <el-button type="success" @click="play" plain>开始</el-button>
+      <el-select
+        style="width:100px"
+        @change="changeParkingTime"
+        v-model="parkingTime"
+        placeholder="停车"
+      >
+        <el-option
+          v-for="item in parkingOptions"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        style="width:100px"
+        @change="changeLeaveTime"
+        v-model="leaveTime"
+        placeholder="离线"
+      >
+        <el-option
+          v-for="item in parkingOptions"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value"
+        >
+        </el-option>
+      </el-select>
+    </el-row>
+    <div class="btnx">
+      <el-button type="primary" class="" @click="openInfo"
+        >打开信息窗体</el-button
+      >
+      <el-button type="primary" class="" @click="closeinfo"
+        >关闭信息窗口</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { shallowRef } from '@vue/reactivity'
+import { lazyAMapApiLoaderInstance } from 'vue-amap'
+import Slider from './slider.vue'
+Vue.use(Slider)
+import Vue from 'vue'
+var infoWindow
+export default {
+  name: 'PathView',
+  props: {
+    orderNumber: '',
+    capacityNumber: '',
+    startPointName: '',
+    endPointName: ''
+  },
+  setup() {
+    const map = shallowRef(null)
+    return {
+      map
+    }
+  },
+  watch: {
+    //监听车牌号变化
+    orderNumber: {
+      deep: true,
+      handler(val, oldVal) {
+        console.log(val)
+        this.initData(val)
+      }
+    }
+  },
+  data() {
+    return {
+      ///che
+      isTimesChoose: false,
+      isActual: true,
+      isPlay: false,
+      passedTime: '12:02:10',
+      sliderVal: 0,
+      times: 1,
+      totalTime: '11',
+      speed: 10000,
+      startTime: '',
+      endTime: '',
+      //选择停车时长
+      parkingTime: null,
+      //停车时长选择区间
+      parkingOptions: [
+        {
+          value: 600000,
+          label: '10分钟'
+        },
+        {
+          value: 1200000,
+          label: '20分钟'
+        },
+        {
+          value: 1800000,
+          label: '30分钟'
+        },
+        {
+          value: 2400000,
+          label: '40分钟'
+        },
+        {
+          value: 3000000,
+          label: '50分钟'
+        },
+        {
+          value: 3600000,
+          label: '60分钟'
+        },
+        {
+          value: 36000000,
+          label: '关闭'
+        }
+      ],
+      //离线图标
+      leaveMark: [],
+      //停车图标
+      parkMark: [],
+      //选择离线时长
+      leaveTime: null,
+      //离线时长选择区间
+      leaveOptions: [
+        {
+          value: 600000,
+          label: '10分钟'
+        },
+        {
+          value: 1200000,
+          label: '20分钟'
+        },
+        {
+          value: 1800000,
+          label: '30分钟'
+        },
+        {
+          value: 2400000,
+          label: '40分钟'
+        },
+        {
+          value: 3000000,
+          label: '50分钟'
+        },
+        {
+          value: 3600000,
+          label: '60分钟'
+        },
+        {
+          value: 36000000,
+          label: '关闭'
+        }
+      ],
+      //已行驶轨迹
+      runRoute: {
+        agl: '',
+        gtm: '',
+        hgt: '',
+        lat: '',
+        lon: '',
+        mil: '',
+        spd: ''
+      },
+      point: '',
+      pointNext: '',
+      loading: null,
+      navgtrSpeed: 1,
+      //地图中心位置
+      centerPoint: {
+        pointLat: '',
+        pointLon: ''
+      },
+      //自定义窗体信息
+      ctmarkes: {
+        lat: '33.015888071433764',
+        lon: '115.96995235868168',
+        title: '豫SE8888',
+        details: '安徽省阜阳市颍东区阜阳舜岳水泥公司,西北方向,155.1米'
+      },
+      //运输详情
+      transportDetail: {
+        //车牌号
+        capacityNumber: '',
+        //规划路线
+        estimateRoute: [
+          {
+            lat: '33.015888071433764',
+            lon: '115.96995235868168'
+          }
+        ],
+        //规划线路
+        estimatePath: [[114.03046212985384, 32.49786984660489]],
+        //已行驶轨迹
+        runRoute: [
+          {
+            agl: '44',
+            gtm: '2022年03月09日 16:47:24',
+            hgt: '13',
+            lat: '32.906411535084985',
+            lon: '115.76177868692135',
+            mil: '429409.2',
+            spd: '17.0'
+          }
+        ],
+        runPath: [[114.03922119568348, 32.49746162481379]],
+        //当前位置
+        currentPointName: '中国达州市通川区',
+        //当前位置经纬度
+        currentPoint: {
+          lat: '',
+          lon: ''
+        },
+        //起点位置
+        startPointName: '中国达州市通川区',
+        //起点位置经纬度
+        startPoint: {
+          lon: '114.03922119568348',
+          lat: '32.49746162481379'
+        },
+        //终点位置
+        endPointName: '中国成都萧山',
+        //终点位置经纬度
+        endPoint: {
+          lon: '115.96995737755431',
+          lat: '33.01595479752097'
+        },
+        //自定义标记
+        content: [],
+        //异常位置
+        abnormalLocation: []
+      },
+      listPath: [],
+      //组件
+      pathSimplifierIns: {},
+      pathNavigator: {},
+      //地图解析
+      geocoder: null,
+      currentPointName: ''
+    }
+  },
+  created() {
+    let that = this
+    that.initData(that.orderNumber)
+  },
+  mounted() {},
+  methods: {
+    //停车时间改变
+    changeParkingTime() {
+      let that = this
+      //清除之前的停车点
+      that.hideParkingMark()
+      //计算时间的点
+      let calculationPoint = null
+      that.listPath[0].runRoute.forEach(function(item, indexOf) {
+        if (indexOf + 1 < that.listPath[0].runRoute.length) {
+          //判断calculationPoint是否为空,如果是空的说明当前没有在计算停车时间
+          if (calculationPoint == null && item.spd == '0.0') {
+            calculationPoint = item
+          } else if (calculationPoint != null && item.spd != '0.0') {
+            let beforeTime = that.stringToDate(calculationPoint.gtm)
+            let item2 = that.listPath[0].runRoute[indexOf]
+            let afterTime = that.stringToDate(item2.gtm)
+            let second = afterTime - beforeTime
+            if (second > that.parkingTime) {
+              let message = '停车:' + second / 60000
+              that.initParkingMarkes(
+                20,
+                35,
+                require('@/assets/img/park.png'),
+                calculationPoint.lon,
+                calculationPoint.lat,
+                message.split('.')[0] + '分钟'
+              )
+            }
+            calculationPoint = null
+          }
+        }
+      })
+    },
+    //字符串转为Date
+    stringToDate(dateString) {
+      console.log(dateString)
+      let dateStr = dateString
+        .replace('年', '-')
+        .replace('月', '-')
+        .replace('日', '')
+      return Date.parse(dateStr)
+    },
+    //停车所有离线图标
+    hideParkingMark() {
+      let that = this
+
+      that.parkMark.forEach(function(item, indexOf) {
+        item.hide()
+      })
+    },
+    //离线时间改变时获得超过时间的点信息
+    changeLeaveTime() {
+      let that = this
+      //关闭所有图标
+      that.hideLeaveMark()
+      that.listPath[0].runRoute.forEach(function(item, indexOf) {
+        if (indexOf + 1 < that.listPath[0].runRoute.length) {
+          let beforeTime = that.stringToDate(item.gtm)
+          let item2 = that.listPath[0].runRoute[indexOf + 1]
+          let afterTime = that.stringToDate(item2.gtm)
+          let second = afterTime - beforeTime
+          if (second > that.leaveTime) {
+            let message = '离线:' + second / 60000
+            that.initLeaveMarkes(
+              20,
+              35,
+              require('@/assets/img/leave.png'),
+              item2.lon,
+              item2.lat,
+              message.split('.')[0] + '分钟'
+            )
+          }
+        }
+      })
+    },
+    //关闭所有离线图标
+    hideLeaveMark() {
+      let that = this
+      that.leaveMark.forEach(function(item, indexOf) {
+        item.hide()
+      })
+    },
+    slow() {
+      console.log('slow')
+      let that = this
+      that.pathNavigator.setSpeed(1000)
+    },
+    middle() {
+      console.log('middle')
+      let that = this
+      that.pathNavigator.setSpeed(10000)
+    },
+    fast() {
+      console.log('fast')
+      let that = this
+      that.pathNavigator.setSpeed(100000)
+    },
+    play() {
+      let that = this
+      that.pathNavigator.resume()
+    },
+    stop() {
+      let that = this
+      that.pathNavigator.pause()
+    },
+    addIndex() {
+      let that = this
+      let increment = that.listPath[0].runPath.length * 0.1
+      that.pathNavigator.start(
+        (that.point + increment) % that.listPath[0].runPath.length
+      )
+    },
+    ///che
+    navgControl() {},
+    hideFormat(value) {
+      let that = this
+      that.sliderVal = value
+    },
+    initParkingMarkes(weight, height, image, lon, lat, title) {
+      let that = this
+      //图标标记点
+      let pointicon = new AMap.Icon({
+        size: new AMap.Size(weight, height), // 图标尺寸
+        image: image, // Icon的图像
+        imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等
+        imageSize: new AMap.Size(weight, height) // 根据所设置的大小拉伸或压缩图片
+      })
+      // 创建一个 Marker 实例:
+      var pointmarker = new AMap.Marker({
+        position: new AMap.LngLat(lon, lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+        icon: pointicon,
+        title: title
+      })
+      that.parkMark.push(pointmarker)
+      // 将创建的点标记添加到已有的地图实例:
+      that.map.add(pointmarker)
+    },
+    //创建离线和停车的标记
+    initLeaveMarkes(weight, height, image, lon, lat, title) {
+      let that = this
+      //图标标记点
+      let pointicon = new AMap.Icon({
+        size: new AMap.Size(weight, height), // 图标尺寸
+        image: image, // Icon的图像
+        imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等
+        imageSize: new AMap.Size(weight, height) // 根据所设置的大小拉伸或压缩图片
+      })
+      // 创建一个 Marker 实例:
+      var pointmarker = new AMap.Marker({
+        position: new AMap.LngLat(lon, lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+        icon: pointicon,
+        title: title
+      })
+      that.leaveMark.push(pointmarker)
+      // 将创建的点标记添加到已有的地图实例:
+      that.map.add(pointmarker)
+    },
+    initData(orderNumber) {
+      let that = this
+      that.axios
+        .post('/api/v1/otms/fullPath?orderNumber=' + orderNumber)
+        .then(res => {
+          console.log(res.data)
+          if (res.data.data == '-1') {
+            this.$message.error('运输订单未关闭的自提车辆无权查看!')
+          } else if (res.data.data.startAndEndRoutes != null) {
+            that.listPath = res.data.data.startAndEndRoutes
+            that.startTime = res.data.data.startAndEndRoutes[0].runRoute[0].gtm
+            that.endTime =
+              res.data.data.startAndEndRoutes[0].runRoute[
+                res.data.data.startAndEndRoutes[0].runRoute.length - 1
+              ].gtm
+            that.initMap()
+          } else {
+            that.listPath = []
+            this.$message.error('车辆没有开启GPS')
+          }
+        })
+    },
+    endline() {
+      let that = this
+      that.initPolyline(that.listPath[0].estimatePath, '#FF0000')
+    },
+    //创建起点终点当前点
+    threeMarker() {
+      let that = this
+      that.listPath.forEach((element, index) => {
+        //开始标记点
+        if (element.startPoint.lon != '' && element.startPoint.lat != '') {
+          that.initMarkes(
+            20,
+            35,
+            require('@/assets/img/start.png'),
+            element.startPoint.lon,
+            element.startPoint.lat,
+            '起点'
+          )
+        }
+        //当前点
+        that.getCurrentPointName([
+          element.runRoute[element.runRoute.length - 1].lon,
+          element.runRoute[element.runRoute.length - 1].lat
+        ])
+        //结束标记点
+        // if (element.endPoint.lon != '' && element.endPoint.lat != '') {
+        //   that.initMarkes(
+        //     20,
+        //     35,
+        //     require('@/assets/img/end.png'),
+        //     element.endPoint.lon,
+        //     element.endPoint.lat,
+        //     '终点'
+        //   )
+        // }
+      })
+    },
+    //获得结束地址
+    getCurrentPointName(lnglatXY) {
+      let that = this
+      that.geocoder.getAddress(lnglatXY, function(status, result) {
+        if (status === 'complete' && result.info === 'OK') {
+          that.currentPointName = result.regeocode.formattedAddress
+          that.initCustomMarkes(
+            that.capacityNumber,
+            '位置:' +
+              that.currentPointName +
+              '<br/>' +
+              '距离:' +
+              that.listPath[0].miled +
+              '<br/>' +
+              '时间范围:' +
+              that.startTime +
+              ' 至 ' +
+              that.endTime,
+
+            lnglatXY[0],
+            lnglatXY[1]
+          )
+        }
+      })
+    },
+    //defualt数据
+    defaultDate() {
+      // let that=this;
+      // that.pathNavigator.start(that.listPath[0].runPath.length)
+      // that.pathNavigator.pause();
+    },
+    //初始化地图
+    initMap() {
+      lazyAMapApiLoaderInstance.load().then(() => {
+        let that = this
+        that.map = new AMap.Map('amap-container', {
+          //设置地图容器id
+          viewMode: '2D', //是否为2D地图模式
+          zoom: 10, //初始化地图级别
+          center: [105.602725, 37.076636] //初始化地图中心点位置
+        })
+        that.initGeocoder()
+        that.initPathSimplifier()
+        that.threeMarker()
+        //that.initCustomMarkes(that.capacityNumber+"("+that.listPath[0].miled+")",that.listPath[0].currentPointName,that.listPath[0].currentPoint.lon,that.listPath[0].currentPoint.lat)
+        //that.endline()//预估路径
+      })
+    },
+    initCustomMarkes(title, details, lon, lat) {
+      let that = this
+      //自定义窗体内容
+      var content = [
+        "<div  style='top:1px;width: 200px; background-color: rgba(22, 160, 133, 1);' ><font color='white'>" +
+          title +
+          '</font>',
+        "<div style='background-color:(22, 160, 133, 1); ;'><font color='white'>" +
+          details +
+          '</font></div></div>'
+      ]
+      // 创建 infoWindow 实例
+      infoWindow = new AMap.InfoWindow({
+        content: content.join('<br>') //传入 dom 对象,或者 html 字符串
+      })
+      // 打开信息窗体
+      infoWindow.open(that.map, [lon, lat])
+    },
+    // 关闭信息窗口
+    closeinfo() {
+      infoWindow.close()
+    },
+    openInfo() {
+      let lon = null
+      let lat = null
+      console.log(this.listPath)
+      this.listPath.forEach(e => {
+        if (e.endPoint != {} && e.endPoint != '' && e.endPoint != null) {
+          lon = e.endPoint.lon
+          lat = e.endPoint.lat
+        } else {
+          lon = e.runRoute[e.runRoute.length - 1].lon
+          lat = e.runRoute[e.runRoute.length - 1].lat
+        }
+      })
+      infoWindow.open(this.map, [lon, lat])
+    },
+    initPolyline(path, color) {
+      let that = this
+      //预计轨迹
+      var endLine = new AMap.Polyline({
+        map: that.map,
+        path: path,
+        isOutline: true,
+        outlineColor: color,
+        borderWeight: 0,
+        strokeColor: '#FF0000',
+        strokeOpacity: 1,
+        strokeWeight: 5,
+        // 折线样式还支持 'dashed'
+        strokeStyle: 'solid',
+        // strokeStyle是dashed时有效
+        strokeDasharray: [10, 5],
+        lineJoin: 'round',
+        lineCap: 'round',
+        zIndex: 50
+      })
+      that.map.setFitView([[endLine]])
+    },
+    //创建简单的标记
+    initMarkes(weight, height, image, lon, lat, title) {
+      let that = this
+      //图标标记点
+      let pointicon = new AMap.Icon({
+        size: new AMap.Size(weight, height), // 图标尺寸
+        image: image, // Icon的图像
+        imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等
+        imageSize: new AMap.Size(weight, height) // 根据所设置的大小拉伸或压缩图片
+      })
+      // 创建一个 Marker 实例:
+      var pointmarker = new AMap.Marker({
+        position: new AMap.LngLat(lon, lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+        icon: pointicon,
+        title: title
+      })
+      // 将创建的点标记添加到已有的地图实例:
+      that.map.add(pointmarker)
+    },
+    //创建轨迹和巡航器
+    initPathSimplifier() {
+      let that = this
+      // ...你的操作
+      new AMapUI.load(['ui/misc/PathSimplifier'], PathSimplifier => {
+        if (!PathSimplifier.supportCanvas) {
+          alert('当前环境不支持 Canvas!')
+          return
+        }
+        //创建轨迹和巡航器
+        // 创建组件实例
+        that.pathSimplifierIns = new PathSimplifier({
+          map: that.map,
+          zIndex: 100, // 图层叠加顺序
+          data: that.listPath, // 巡航路径
+          // 获取巡航路径中的路径坐标数组
+          getPath: (pathData, pathIndex) => {
+            return pathData.runPath
+          },
+          //鼠标悬浮停时显示消息
+          getHoverTitle: function(pathData, pathIndex, pointIndex) {
+            //返回鼠标悬停时显示的信息
+            if (pointIndex >= 0) {
+              if (pathData.runRoute[pointIndex].gtm !== 'undefined') {
+                //鼠标悬停在某个轨迹节点上
+                return (
+                  pathData.runRoute[pointIndex].gtm +
+                  ',速度' +
+                  pathData.runRoute[pointIndex].spd +
+                  '千米/小时'
+                )
+              }
+            }
+          },
+          //设置轨迹样式
+          renderOptions: {
+            //轨迹线的样式
+            pathLineStyle: {
+              strokeStyle: 'black',
+              lineWidth: 6,
+              dirArrowStyle: true
+            }
+          }
+        })
+        // 创建巡航器
+        that.pathNavigator = that.pathSimplifierIns.createPathNavigator(0, {
+          loop: true, // 是否循环
+          speed: that.speed, // 速度(km/h)
+          pathNavigatorStyle: {
+            width: 20,
+            height: 40,
+            content: PathSimplifier.Render.Canvas.getImageContent(
+              require('@/assets/img/smallcar.png'),
+              onload,
+              onerror
+            ),
+            strokeStyle: null,
+            fillStyle: null
+          }
+        })
+        //开启巡航
+        that.pathNavigator.start()
+        that.defaultDate()
+
+        //开始事件
+        that.pathNavigator.on('start resume', function() {
+          // that.navgtr._startTime = Date.now();
+          // that.navgtr._startDist = this.getMovedDistance();
+        })
+        //暂停
+        that.pathNavigator.on('stop pause', function() {
+          // that.navgtr._movedTime = Date.now() - that.navgtr._startTime;
+          // that.navgtr._movedDist = this.getMovedDistance() - that.navgtr._startDist;
+        })
+        that.pathNavigator.on('move', function(data, value) {
+          that.updateLable(value)
+        })
+      })
+    },
+    updateLable(value) {
+      let that = this
+      that.point = value.dataItem.pointIndex
+      that.runRoute = value.dataItem.pathData.runRoute[that.point]
+      that.sliderVal =
+        (value.dataItem.pointIndex / value.dataItem.pathData.runRoute.length) *
+        100
+    },
+    changeSpeed(value) {
+      // console.log(value)
+      // let that=this;
+      // that.times=value;
+    },
+    playIcon() {
+      console.log('nihoa')
+    },
+    //逆解码函数
+    initGeocoder() {
+      let that = this
+      console.log('initGeocoder')
+      AMap.plugin('AMap.Geocoder', function() {
+        that.geocoder = new AMap.Geocoder({
+          radius: 1000,
+          extensions: 'all'
+        })
+
+        console.log(that.geocoder)
+      })
+    }
+  }
+}
+</script>
+<style>
+.mapcontroller {
+  width: 250px;
+  height: 260px;
+  background: white;
+  position: absolute;
+  z-index: 99;
+  top: 0;
+  left: 0;
+}
+.container {
+  width: 100%;
+  height: 100%;
+}
+.item_details {
+  display: block;
+  margin-top: 20px;
+  position: relative;
+  left: 30px;
+  width: 200px;
+  height: 0px;
+}
+#amap-container {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  margin: 0;
+  font-family: '微软雅黑';
+}
+.driving_information2 {
+  position: relative;
+  top: 70px;
+}
+.driving_information3 {
+  position: absolute;
+  z-index: 99;
+  top: 0;
+  left: 0;
+  position: relative;
+  top: 50px;
+}
+
+/* 进度条 */
+.mySlider {
+  width: 150px;
+  height: 20px;
+  display: inline-block;
+  position: relative;
+  left: 32px;
+}
+.play {
+  position: relative;
+  left: 28px;
+}
+.quickly {
+  float: right;
+  position: relative;
+  left: -20px;
+  top: 10px;
+}
+.pause {
+  position: relative;
+  left: 28px;
+}
+.passed-time {
+  position: relative;
+  left: 5px;
+}
+.end-time {
+  position: relative;
+  left: 5px;
+}
+.map-times {
+  position: relative;
+  background-color: red;
+  width: 40px;
+}
+</style>
+<style lang="scss" scoped>
+.btnx {
+  z-index: 1000;
+  position: fixed;
+  bottom: 10px;
+  right: 10px;
+}
+</style>

+ 151 - 0
src/views/sale/components/transportFreight/saleTruckSettlement/slider.vue

@@ -0,0 +1,151 @@
+<template>
+  <div class="slider" ref="slider">
+    <div class="process" :style="{ width }"></div>
+    <div class="thunk" ref="trunk" :style="{ left }">
+      <div class="block"></div>
+      <div class="tips">
+        <span>{{ scale * 100 }}</span>
+        <i class="fas fa-caret-down"></i>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+/*
+ * min 进度条最小值
+ * max 进度条最大值
+ * v-model 对当前值进行双向绑定实时显示拖拽进度
+ * */
+export default {
+  name: 'slider',
+  props: ['min', 'max', 'value'],
+  data() {
+    return {
+      slider: null, //滚动条DOM元素
+      thunk: null, //拖拽DOM元素
+      per: this.value //当前值
+    }
+  },
+  //渲染到页面的时候
+  mounted() {
+    this.slider = this.$refs.slider
+    this.thunk = this.$refs.trunk
+    var _this = this
+    this.thunk.onmousedown = function(e) {
+      var width = parseInt(_this.width)
+      var disX = e.clientX
+      document.onmousemove = function(e) {
+        // value, left, width
+        // 当value变化的时候,会通过计算属性修改left,width
+
+        // 拖拽的时候获取的新width
+        var newWidth = e.clientX - disX + width
+        // 拖拽的时候得到新的百分比
+        var scale = newWidth / _this.slider.offsetWidth
+        _this.per = Math.ceil((_this.max - _this.min) * scale + _this.min)
+        _this.per = Math.max(_this.per, _this.min)
+        _this.per = Math.min(_this.per, _this.max)
+        _this.$emit('input', _this.per)
+      }
+      document.onmouseup = function() {
+        document.onmousemove = document.onmouseup = null
+      }
+      return false
+    }
+  },
+  computed: {
+    // 设置一个百分比,提供计算slider进度宽度和trunk的left值
+    // 对应公式为  当前值-最小值/最大值-最小值 = slider进度width / slider总width
+    // trunk left =  slider进度width + trunk宽度/2
+    scale() {
+      return (this.per - this.min) / (this.max - this.min)
+    },
+    width() {
+      if (this.slider) {
+        return this.slider.offsetWidth * this.scale + 'px'
+      } else {
+        return 0 + 'px'
+      }
+    },
+    left() {
+      if (this.slider) {
+        return (
+          this.slider.offsetWidth * this.scale -
+          this.thunk.offsetWidth / 2 +
+          'px'
+        )
+      } else {
+        return 0 + 'px'
+      }
+    }
+  }
+}
+</script>
+<style>
+.box {
+  margin: 100px auto 0;
+  width: 80%;
+}
+.clear:after {
+  content: '';
+  display: block;
+  clear: both;
+}
+.slider {
+  position: relative;
+  margin: 20px 0;
+  width: 400px;
+  height: 10px;
+  background: #e4e7ed;
+  border-radius: 5px;
+  cursor: pointer;
+}
+.slider .process {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 112px;
+  height: 10px;
+  border-radius: 5px;
+  background: #409eff;
+}
+.slider .thunk {
+  position: absolute;
+  left: 100px;
+  top: -7px;
+  width: 20px;
+  height: 20px;
+}
+.slider .block {
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  border: 2px solid #409eff;
+  background: rgba(255, 255, 255, 1);
+  transition: 0.2s all;
+}
+.slider .tips {
+  position: absolute;
+  left: -7px;
+  bottom: 30px;
+  min-width: 15px;
+  text-align: center;
+  padding: 4px 8px;
+  background: #000;
+  border-radius: 5px;
+  height: 24px;
+  color: #fff;
+}
+.slider .tips i {
+  position: absolute;
+  margin-left: -5px;
+  left: 50%;
+  bottom: -9px;
+  font-size: 16px;
+  color: #000;
+}
+.slider .block:hover {
+  transform: scale(1.1);
+  opacity: 0.6;
+}
+</style>

+ 7 - 0
src/views/sale/router/index.js

@@ -103,6 +103,7 @@ import addBmsTruckInvoice from "../components/transportFreight/saleTruckSettleme
 import addBmsTruckStatement from "../components/transportFreight/saleTruckSettlement/addBmsTruckStatement.vue";
 import bmsTruckAudit from "../components/transportFreight/saleTruckSettlement/bmsTruckAudit.vue";
 import bmsTruckDetailOrder from "../components/transportFreight/saleTruckSettlement/bmsTruckDetailOrder.vue";
+import bmsTruckDetailsOrderNew from "../components/transportFreight/saleTruckSettlement/bmsTruckDetailsOrderNew.vue";
 import bmsTruckFormula from "../components/transportFreight/saleTruckSettlement/bmsTruckFormula.vue";
 import bmsTruckInvoice from "../components/transportFreight/saleTruckSettlement/bmsTruckInvoice.vue";
 import bmsTruckStatement from "../components/transportFreight/saleTruckSettlement/bmsTruckStatement.vue";
@@ -699,6 +700,12 @@ const constantRouterMap = [
         meta: { code: "xtpzgl-yhgl" },
         component: bmsTruckDetailOrder
       },
+      {
+        path: "bmsTruckDetailsOrderNew",
+        name: "bmsTruckDetailsOrderNew",
+        meta: { code: "xtpzgl-yhgl" },
+        component: bmsTruckDetailsOrderNew
+      },
       {
         path: "bmsTruckFormula",
         name: "bmsTruckFormula",