腾讯地图web端签名校验方法

打印 上一主题 下一主题

主题 1535|帖子 1535|积分 4605

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. <template>
  2.     <el-dialog v-model="dialogVisible" title="" width="900" :before-close="handleClose">
  3.         <div class="leftForm">
  4.             <div class="leftCard">
  5.                 <div class="leftTitle">代客下单</div>
  6.                 <el-form ref="formRef" id="formRef" :model="form" :rules="rules" label-width="0px">
  7.                     <el-form-item label="" prop="passengerPhone">
  8.                         <el-input :prefix-icon="Memo" class="completeDiv" v-model="form.passengerPhone"
  9.                             placeholder="请输入乘车人手机号" />
  10.                     </el-form-item>
  11.                     <el-form-item label="" prop="start">
  12.                         <el-input disabled :prefix-icon="Edit" class="partDiv" v-model="form.start"
  13.                             placeholder="请选择乘客起点" />
  14.                         <el-button @click="handleChooseAdd('start')" type="primary" class="choosePoint" round>
  15.                             地图选点
  16.                         </el-button>
  17.                     </el-form-item>
  18.                     <el-form-item label="" prop="end">
  19.                         <el-input disabled :prefix-icon="Edit" class="partDiv" v-model="form.end"
  20.                             placeholder="请选择乘客终点" />
  21.                         <el-button @click="handleChooseAdd('end')" type="primary" class="choosePoint" round>
  22.                             地图选点
  23.                         </el-button>
  24.                     </el-form-item>
  25.                     <el-form-item label="" prop="datetime">
  26.                         <el-date-picker @change="dateChange" v-model="form.datetime" type="datetimerange"
  27.                             range-separator="-" start-placeholder="最早时间" end-placeholder="最迟时间" />
  28.                     </el-form-item>
  29.                     <el-form-item label="" prop="passengerCount">
  30.                         <el-select v-model="form.passengerCount" class="completeDiv" placeholder="请选择乘客人数">
  31.                             <el-option v-for="item in options" :key="item.value" :label="item.label"
  32.                                 :value="item.value" />
  33.                         </el-select>
  34.                     </el-form-item>
  35.                     <el-form-item label="" prop="passengerRemark">
  36.                         <el-input :prefix-icon="Edit" maxlength="50" type="textarea" class="completeDiv"
  37.                             v-model="form.passengerRemark" placeholder="请输入乘客备注" />
  38.                     </el-form-item>
  39.                 </el-form>
  40.                 <div class="tips">
  41.                     温馨提示:
  42.                     <div>1.下单成功后,系统将向乘客发送支付提醒短信,请乘客尽快完成支付</div>
  43.                     <div>2.如果乘客未及时支付订单,请主动联系乘客完成支付</div>
  44.                 </div>
  45.             </div>
  46.             <div class="mt-2 text-gray-600 text-sm">
  47.                 <div class="rightTop">
  48.                     <span class="rightTitle">接单司机</span>
  49.                     <span class="rightText">未指定司机,订单进入抢单池,其他司机可接单</span>
  50.                 </div>
  51.                 <div><el-input class="partDiv" v-model="form.phone" placeholder="请输入乘车人手机号" />
  52.                     <el-button type="primary" @click="chooseDriver" class="choosePoint" round>
  53.                         选择司机
  54.                     </el-button>
  55.                 </div>
  56.                 <div class="rightTitle mt-2 mb-2">出行方式</div>
  57.                 <div v-if="isAccord == 0">
  58.                     <div v-for="item, index in priceDtoList" :key="index" @click="selectPay(index, item)"
  59.                         :class="selectPayIndex === index ? 'priceBox activeBox' : 'priceBox'">
  60.                         <div class="priceTitle">{{ item.productCode == 'fit' ? '舒适' : '拼车' }}</div>
  61.                         <div>
  62.                             <div class="priceContent">
  63.                                 <div class="priceLabel">订单价格</div>
  64.                                 <div class="priceValue">
  65.                                     <el-input v-if="item.productCode == 'fit'" v-model="item.totalPrice"
  66.                                         @change="fitChange" style="width: 200px;" placeholder="请输入"
  67.                                         class="input-with-select">
  68.                                         <template #prepend>
  69.                                             ¥
  70.                                         </template>
  71.                                     </el-input>
  72.                                     <el-input v-else v-model="item.totalPrice" @change="rentChange"
  73.                                         style="width: 200px;" placeholder="请输入" class="input-with-select">
  74.                                         <template #prepend>
  75.                                             ¥
  76.                                         </template>
  77.                                     </el-input>
  78.                                 </div>
  79.                             </div>
  80.                             <div class="priceDesc">您可以在<span class="redText">{{ setMoney('min', item.totalPrice)
  81.                                     }}</span>元至<span class="redText">{{ setMoney('max',
  82.         item.totalPrice) }}</span>元之间调整订单金额</div>
  83.                         </div>
  84.                     </div>
  85.                     <!-- <div @click="selectPay(2)" :class="selectPayIndex === 2 ? 'priceBox activeBox' : 'priceBox'">
  86.                         <div class="priceTitle">独享</div>
  87.                         <div>
  88.                             <div class="priceContent">
  89.                                 <div class="priceLabel">订单价格</div>
  90.                                 <div class="priceValue">
  91.                                     <el-input v-model="input3" style="width: 200px;" placeholder="Please input"
  92.                                         class="input-with-select">
  93.                                         <template #prepend>
  94.                                             ¥
  95.                                         </template>
  96.                                     </el-input>
  97.                                 </div>
  98.                             </div>
  99.                             <div class="priceDesc">您可以在<span class="redText">899.99</span>元至<span
  100.                                     class="redText">1111.99</span>元之间调整订单金额
  101.                             </div>
  102.                         </div>
  103.                     </div> -->
  104.                 </div>
  105.                 <div v-else-if="isAccord == 1" class="noAccord">
  106.                     当前线路不在您的运营范围,暂无法提供服务
  107.                 </div>
  108.                 <div v-else-if="isAccord == 3">
  109.                     <div v-for=" i in 2 " class=" blankBorder">
  110.                         <div class="blankLeft">
  111.                             <div class="leftBlank"></div>
  112.                         </div>
  113.                         <div style="padding: 20px;">
  114.                             <div class="leftTop"></div>
  115.                             <div class="leftBottom"></div>
  116.                         </div>
  117.                     </div>
  118.                 </div>
  119.                 <div class="dialog-footer">
  120.                     <el-button @click="cancel">取消</el-button>
  121.                     <el-button type="primary" @click="submit">立即下单</el-button>
  122.                 </div>
  123.             </div>
  124.         </div>
  125.         <map-modal ref="mapRef" @change="handelChangeAddress" />
  126.         <el-dialog v-model="driverDialogVisible" title="选择司机" width="800">
  127.             <div class="driver-list">
  128.                 <!-- 这里可以添加搜索框 -->
  129.                 <el-input v-model="searchKeyword" style="width: 200px;" placeholder="请输入司机姓名/手机号" class="mr-4 ">
  130.                     <template #prefix>
  131.                         <el-icon>
  132.                             <Search />
  133.                         </el-icon>
  134.                     </template>
  135.                 </el-input>
  136.                 <el-button type="primary" @click="searchDriver">搜索</el-button>
  137.                 <!-- 司机列表表格 -->
  138.                 <el-table :data="driverList" style="width: 100%;margin-top: 10px;">
  139.                     <el-table-column prop="name" label="司机姓名" />
  140.                     <el-table-column prop="phone" label="手机号" />
  141.                     <el-table-column prop="carNumber" label="车牌号" />
  142.                     <el-table-column label="操作">
  143.                         <template #default="scope">
  144.                             <el-button type="text" @click="selectDriver(scope.row)">
  145.                                 选择
  146.                             </el-button>
  147.                         </template>
  148.                     </el-table-column>
  149.                 </el-table>
  150.                 <div class="pagination-container" style="margin-top: 20px; text-align: right;">
  151.                     <el-pagination v-model:current-page="pagination.currentPage" v-model:page-size="pagination.pageSize"
  152.                         :page-sizes="[10, 20, 30, 50]" :total="pagination.total" @size-change="handleSizeChange"
  153.                         @current-change="handleCurrentChange" layout="total, sizes, prev, pager, next" />
  154.                 </div>
  155.             </div>
  156.         </el-dialog>
  157.     </el-dialog>
  158.     <TXMap ref="txMap" :dialogVisible="mapVisible" @update="mapUpdate" />
  159. </template>
  160. <script setup name="Dialog" lang="ts">
  161. import { ref, reactive, watch } from 'vue'
  162. import { listDriver } from '@/api/power/driver'
  163. import { getPriceTemplate, setPrice, orderSubmission } from '@/api/order/operate'
  164. import { ArrowDown, Search, Memo, Edit } from '@element-plus/icons-vue'
  165. import { getConfigKey } from '@/api/system/config'
  166. import mapModal from '@/components/Map/map.vue'
  167. import md5 from './md5'
  168. import TXMap from './TXMap.vue'
  169. import { func } from 'vue-types'
  170. let latitude = ref(39.913818)
  171. let longitude = ref(116.363625)
  172. const addressInfo = (e) => {
  173.     console.log(e)
  174. }
  175. let startTime = ref(0)
  176. let endTime = ref(0)
  177. function dateChange(value: any) {
  178.     console.log(value);
  179.     startTime.value = new Date(value[0]).getTime() / 1000;
  180.     endTime.value = new Date(value[1]).getTime() / 1000;
  181. }
  182. const txMap = ref('')
  183. function selectAddress(address, lat, lng) {
  184.     console.log(address, lat, lng);
  185.     // this.formData.address = address
  186.     // this.formData.latitude = lat
  187.     // this.formData.longitude = lng
  188. }
  189. // 定义组件的props
  190. const props = defineProps({
  191.     dialogVisible: {
  192.         type: Boolean,
  193.         default: false,
  194.     },
  195. })
  196. const value = ref('')
  197. let selectPayIndex = ref(0)
  198. let outWayType = ref('')
  199. function selectPay(index: number, item: any) {
  200.     selectPayIndex.value = index;
  201.     outWayType.value = item.productCode;
  202.     console.log(outWayType, 'outWayType');
  203. }
  204. let mapVisible = ref(false)
  205. function mapUpdate(e) {
  206.     console.log(11);
  207.     mapVisible.value = e
  208. }
  209. const mapRef = ref()
  210. async function fitChange(val) {
  211.     if (val.toString().split('.')[1].length > 2) {
  212.         ElMessage.error('最多两位小数')
  213.         return
  214.     } else {
  215.         let param = {
  216.             'price': parseFloat((val * 100).toFixed(2)),
  217.             'productCode': 'fit',
  218.             'estimateKey': estimateKey.value
  219.         }
  220.         const res = await setPrice(param)
  221.         console.log(res, 'rent');
  222.     }
  223. }
  224. const driverDialogVisible = ref(false)
  225. // 添加分页相关的响应式数据
  226. const pagination = reactive({
  227.     total: 0,
  228.     currentPage: 1,
  229.     pageSize: 10
  230. })
  231. const selectDriver = (driver) => {
  232.     form.phone = driver.phone
  233.     driverDialogVisible.value = false
  234.     console.log(driver.phone, 'driver');
  235. }
  236. // 修改 chooseDriver 方法
  237. async function chooseDriver() {
  238.     driverDialogVisible.value = true
  239.     await getDriverList()
  240. }
  241. let driverList = ref([])
  242. function searchDriver() {
  243.     pagination.currentPage = 1
  244.     getDriverList()
  245. }
  246. // 添加搜索关键字的响应式数据
  247. const searchKeyword = ref('')
  248. // 添加获取司机列表的方法
  249. async function getDriverList() {
  250.     try {
  251.         const res = await listDriver({
  252.             name: searchKeyword.value,
  253.             pageNum: pagination.currentPage,
  254.             pageSize: pagination.pageSize
  255.         })
  256.         if (res.code === 0) {
  257.             driverList.value = res.rows
  258.             pagination.total = res.total
  259.         }
  260.     } catch (error) {
  261.         console.error('获取司机列表失败:', error)
  262.         ElMessage.error('获取司机列表失败')
  263.     }
  264. }
  265. // 添加分页变化处理方法
  266. function handleCurrentChange(val: number) {
  267.     pagination.currentPage = val
  268.     getDriverList()
  269. }
  270. let startData = ref({})
  271. let endData = ref({})
  272. //地址逆解析
  273. async function getAddress(e) {
  274.     if (e.lat && e.lon) {
  275.         let res = await getGeoCoder({
  276.             location: e.lat + ',' + e.lon,
  277.             key: '自己的key',
  278.             SK: '自己的SK'
  279.         })
  280.         console.log(res, 'res腾讯地图返回');
  281.         // from = 39.915285, 116.403857 & to=39.915285, 116.803857
  282.         if (mode.value === 'start') {
  283.             form.start = res.result.formatted_addresses.recommend
  284.             startData.value = {
  285.                 lat: res.result.location.lat,
  286.                 lng: res.result.location.lng, // 经度
  287.                 address: res.result.address, // 地址
  288.                 shortAddress: res.result.formatted_addresses.recommend,
  289.                 cityCode: res.result.ad_info.phone_area_code,
  290.                 adCode: res.result.ad_info.adcode, // 城市编码
  291.             }
  292.         } else if (mode.value === 'end') {
  293.             form.end = res.result.formatted_addresses.standard_address + res.result.formatted_addresses.recommend;
  294.             endData.value = {
  295.                 lat: res.result.location.lat,
  296.                 lng: res.result.location.lng, // 经度
  297.                 address: res.result.address, // 地址
  298.                 shortAddress: res.result.formatted_addresses.recommend,
  299.                 cityCode: res.result.ad_info.phone_area_code,
  300.                 adCode: res.result.ad_info.adcode, // 城市编码
  301.             }
  302.         }
  303.         // if (res.status === 0) {
  304.         //     let locationName = res.result.address
  305.         // } else {
  306.         //     showToast(res.message, 'warning')
  307.         // }
  308.     }
  309. }
  310. function getInstance(param) {
  311.     // https://apis.map.qq.com/ws/direction/v1/driving/?
  312.     // // from=39.915285,116.403857&to=39.915285,116.803857&output=json&callback=cb&key=[你的key]
  313.     let sig = md5(
  314.         `/ws/direction/v1/driving?callback=jsonpCallback&from=${param.slat},${param.slng}&key=${param.key}&output=jsonp&to=${param.elat},${param.elng}${param.SK}`
  315.     )
  316.     console.log(`/ws/direction/v1/driving?callback=jsonpCallback&from=${param.slat},${param.slng}&key=${param.key}&output=jsonp&to=${param.elat},${param.elat}${param.SK}`, sig);
  317.     let getData = {
  318.         callbackQuery: 'callback', // 设置callback参数的key  不设置的话callback参数会自动被赋予一个随机值  md5校验无法通过
  319.         callbackName: 'jsonpCallback', // 设置callback 参数的值
  320.         from: param.slat + ',' + param.slng,
  321.         key: param.key,
  322.         output: 'jsonp',
  323.         to: param.elat + ',' + param.elng,
  324.         sig
  325.     }
  326.     return jsonp('https://apis.map.qq.com/ws/direction/v1/driving', getData)
  327. }
  328. function getGeoCoder(param: any) {
  329.     let sig = md5(
  330.         `/ws/geocoder/v1?callback=jsonpCallback&key=${param.key}&location=${param.location}&output=jsonp${param.SK}`
  331.     )
  332.     // sig = encodeURI(sig) //url化一下
  333.     let getData = {
  334.         callbackQuery: 'callback', // 设置callback参数的key  不设置的话callback参数会自动被赋予一个随机值  md5校验无法通过
  335.         callbackName: 'jsonpCallback', // 设置callback 参数的值
  336.         key: param.key,
  337.         location: param.location,
  338.         output: 'jsonp',
  339.         sig
  340.     }
  341.     //签名失败的解决办法 https://lbs.qq.com/faq/serverFaq/webServiceKey
  342.     return jsonp('https://apis.map.qq.com/ws/geocoder/v1', getData)
  343. }
  344. function handleSizeChange(val: number) {
  345.     pagination.pageSize = val
  346.     pagination.currentPage = 1
  347.     getDriverList()
  348. }
  349. async function rentChange(val) {
  350.     //判断小数是否最多两位
  351.     if (val.toString().split('.')[1].length > 2) {
  352.         ElMessage.error('最多两位小数')
  353.         return
  354.     } else {
  355.         let param = {
  356.             'price': parseFloat((val * 100).toFixed(2)),
  357.             'productCode': 'rent',
  358.             'estimateKey': estimateKey.value
  359.         }
  360.         const res = await setPrice(param)
  361.         console.log(res, 'rent');
  362.     }
  363. }
  364. import { jsonp } from "vue-jsonp";
  365. import { el, sl } from 'element-plus/es/locale'
  366. async function handelChangeAddress(e) {
  367.     const {
  368.         adcode,
  369.         province,
  370.         city,
  371.         district,
  372.         address,
  373.         lon,
  374.         lat
  375.     } = e
  376.     console.log(e)
  377.     getAddress(e);
  378.     // jsonp(url, {
  379.     //     output: "jsonp",
  380.     //     cache: true,
  381.     // }).then((res) => {
  382.     //     console.log(res);
  383.     // }).catch((err) => {
  384.     //     console.error(err, 'err');
  385.     // });
  386.     // form.value = {
  387.     //     ...form.value,
  388.     //     [mode.value + 'AdCode']: adcode,
  389.     //     [mode.value + 'Province']: province,
  390.     //     [mode.value + 'City']: city,
  391.     //     [mode.value + 'District']: district,
  392.     //     [mode.value + 'Latitude']: lat,
  393.     //     [mode.value + 'Longitude']: lon,
  394.     //     [mode.value + 'Address']: address,
  395.     // }
  396. };
  397. let mode = ref('')
  398. // function handleChooseAdd(_mode = 'start') {
  399. //     mapVisible.value = true
  400. // }
  401. const initFormData: RobForm = {
  402.     id: undefined,
  403.     robNo: undefined,
  404.     agentId: undefined,
  405.     lineId: undefined,
  406.     startProvinceId: undefined,
  407.     startProvince: undefined,
  408.     startCityId: undefined,
  409.     startCityCode: undefined,
  410.     startCity: undefined,
  411.     startDistrictId: undefined,
  412.     startAdCode: undefined,
  413.     startDistrict: undefined,
  414.     startAddress: undefined,
  415.     startLongitude: undefined,
  416.     startLatitude: undefined,
  417.     startRadius: undefined,
  418.     endProvinceId: undefined,
  419.     endProvince: undefined,
  420.     endCityId: undefined,
  421.     endCityCode: undefined,
  422.     endCity: undefined,
  423.     endDistrictId: undefined,
  424.     endAdCode: undefined,
  425.     endDistrict: undefined,
  426.     endAddress: undefined,
  427.     endLongitude: undefined,
  428.     endLatitude: undefined,
  429.     endRadius: undefined,
  430.     startTime: undefined,
  431.     endTime: undefined,
  432.     sortTime: undefined,
  433.     seat: undefined,
  434.     surplusSeat: undefined,
  435.     robProduct: undefined,
  436.     userType: 'agent_user',
  437.     userId: undefined,
  438.     status: '0',
  439.     plan: 'PART',
  440.     driverJson: undefined,
  441.     renewal: 0,
  442.     remark: undefined,
  443. }
  444. function handleChooseAdd(_mode = 'start') {
  445.     mode.value = _mode;
  446.     mapRef.value.open({
  447.         adcode: form[_mode + 'AdCode'],
  448.         lat: form[_mode + 'Latitude'],
  449.         lon: form[_mode + 'Longitude'],
  450.         province: form[_mode + 'Province'],
  451.         city: form[_mode + 'City'],
  452.         district: form[_mode + 'District'],
  453.         address: form[_mode + 'Address'],
  454.     });
  455. }
  456. //判断是否符合打车条件
  457. let isAccord = ref(0)
  458. const options = [
  459.     {
  460.         value: 1,
  461.         label: '1人',
  462.     },
  463.     {
  464.         value: 2,
  465.         label: '2人',
  466.     },
  467.     {
  468.         value: 3,
  469.         label: '3人',
  470.     },
  471.     {
  472.         value: 4,
  473.         label: '4人',
  474.     },
  475.     {
  476.         value: 5,
  477.         label: '5人',
  478.     }, {
  479.         value: 6,
  480.         label: '6人',
  481.     },
  482. ]
  483. // 定义组件的emits
  484. const emits = defineEmits(['update'])
  485. // 解构props
  486. let { dialogVisible } = toRefs(props)
  487. // 表单ref
  488. const formRef = ref()
  489. // 表单数据
  490. const form = reactive({
  491.     phone: '',
  492.     passengerPhone: '', // 乘车人手机号
  493.     start: '', // 起点
  494.     end: '', // 终点
  495.     datetime: '', // 用车时间
  496.     passengerCount: '', // 乘客人数
  497.     passengerRemark: '', // 备注
  498. })
  499. // 表单校验规则
  500. const rules = {
  501.     passengerPhone: [
  502.         { required: true, message: '请输入乘车人手机号', trigger: 'blur' },
  503.         { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
  504.     ],
  505.     start: [
  506.         { required: true, message: '请选择乘客起点', trigger: 'change' }
  507.     ],
  508.     end: [
  509.         { required: true, message: '请选择乘客终点', trigger: 'change' }
  510.     ],
  511.     datetime: [
  512.         { required: true, message: '请选择用车时间', trigger: 'change' }
  513.     ],
  514.     passengerCount: [
  515.         { required: true, message: '请选择乘客人数', trigger: 'change' }
  516.     ],
  517.     // passengerRemark: [
  518.     //     { required: true, message: '请输入乘客备注', trigger: 'blur' }
  519.     // ]
  520. }
  521. //   "startTime": 1743560580,
  522. //   "endTime": 1743560580,
  523. //   "passengerCount": 1,
  524. //   "startCityCode":"0571",
  525. //   "endCityCode":"0571",
  526. //   "mileage": 60000,
  527. //   "platformCode":"SELF",
  528. //   "startAdCode": "330109",
  529. //   "startLongitude": 116.353531,
  530. //   "startLatitude": 116.353531,
  531. //   "endAdCode": "330106",
  532. //   "endLongitude": 120.087667,
  533. //   "startAddress": "智力大厦",
  534. //   "startShortAddress": "智力大厦",
  535. //   "endAddress":"三墩",
  536. //   "endShortAddress": "三墩",
  537. //   "endLatitude": 30.322948
  538. watch(
  539.     [
  540.         () => form.start,
  541.         () => form.end,
  542.         () => form.datetime,
  543.         () => form.passengerCount
  544.     ],
  545.     ([start, end, datetime, count]) => {
  546.         if (start && end && datetime && count) {
  547.             // 所有值都不为空时触发事件
  548.             getDict();
  549.         }
  550.     },
  551.     { deep: true }
  552. )
  553. let estimateKey = ref('')
  554. let priceDtoList = ref([])
  555. const setMoney = (type, price) => {
  556.     if (type == 'min') {
  557.         return Number(((price * ((100 - rateOver.value) / 100))).toFixed(2))
  558.     } else if (type == 'max') {
  559.         return Number(((price * ((100 + rateOver.value) / 100))).toFixed(2))
  560.     }
  561. }
  562. let overallMileage = ref(0)
  563. async function checkRoute() {
  564.     // 发起请求,检查行程是否符合条件
  565.     let params = {
  566.         "startTime": startTime.value,
  567.         "endTime": endTime.value,
  568.         "passengerCount": form.passengerCount,
  569.         "startCityCode": startData.value.cityCode,
  570.         "endCityCode": endData.value.cityCode,
  571.         "mileage": overallMileage.value,
  572.         "platformCode": "SELF",
  573.         "startAdCode": startData.value.adCode,
  574.         "startLongitude": startData.value.lng,
  575.         "startLatitude": startData.value.lat,
  576.         "endAdCode": endData.value.adCode,
  577.         "endLongitude": endData.value.lng,
  578.         "startAddress": startData.value.address,
  579.         "startShortAddress": startData.value.shortAddress,
  580.         "endAddress": endData.value.address,
  581.         "endShortAddress": endData.value.shortAddress,
  582.         "endLatitude": endData.value.lat,
  583.     }
  584.     const res = await getPriceTemplate(params);
  585.     if (res.code == 500) {
  586.         isAccord.value = 1;
  587.         return;
  588.     } else if (res.code == 200) {
  589.         isAccord.value = 0;
  590.         estimateKey.value = res.data.estimateKey;
  591.         priceDtoList.value = res.data.priceDtoList;
  592.         // totalPrice
  593.         priceDtoList.value.forEach((item) => {
  594.             item.totalPrice = Number(item.totalPrice) / 100
  595.         })
  596.     }
  597. }
  598. //获取金额波动范围
  599. let rateOver = ref(0)
  600. async function getDict() {
  601.     const res = await getConfigKey('proxy_order_price_fluctuation_rate')
  602.     console.log(res, 'proxy_order_price_fluctuation_rate');
  603.     if (res.code == 200) {
  604.         rateOver.value = Number(res.data);
  605.         console.log(rateOver.value);
  606.         let ser = await getInstance({
  607.             slat: startData.value.lat,
  608.             slng: startData.value.lng,
  609.             elat: endData.value.lat,
  610.             elng: endData.value.lng,
  611.             key: 'NSBBZ-SPQLZ-63RXY-7BIAG-DKBGH-B2FUE',
  612.             SK: 'PrvmRwHoIFtYslLE3u2kSdF49GxcW1ZT'
  613.         })
  614.         overallMileage.value = ser.result.routes[0].distance
  615.         console.log(ser.result.routes[0].distance, 'res距离腾讯地图返回');
  616.         checkRoute()
  617.     }
  618. }
  619. function submit() {
  620.     formRef.value?.validate(async (valid: boolean) => {
  621.         if (valid) {
  622.             let params = {
  623.                 estimateKey: estimateKey.value,
  624.                 //备注
  625.                 passengerRemark: form.passengerRemark,
  626.                 highwayType: '2',
  627.                 productCode: outWayType.value,
  628.                 createModel: '4',
  629.                 //乘客手机号
  630.                 passengerPhone: form.passengerPhone,
  631.                 //司机手机号
  632.                 driverPhone: form.phone,
  633.             }
  634.             const res = await orderSubmission(params)
  635.             console.log(res, '代下单提交返回res');
  636.             if (res.code == 200) {
  637.                 ElMessage.success('下单成功')
  638.                 emits('update', false)
  639.             }
  640.         }
  641.     })
  642. }
  643. function cancel() {
  644.     emits('update', false)
  645. }
  646. function handleClose() {
  647.     emits('update', false)
  648. }
  649. </script>
  650. <style scoped>
  651. .el-dialog {
  652.     border-radius: 8px;
  653. }
  654. .leftForm {
  655.     display: grid;
  656.     grid-template-columns: 1fr 1fr;
  657.     gap: 20px;
  658.     position: relative;
  659. }
  660. .leftCard {
  661.     padding: 10px;
  662.     border: 1px solid #e6e6e6;
  663.     border-radius: 10px;
  664. }
  665. #formRef {
  666.     margin-left: 10px;
  667. }
  668. .leftTitle {
  669.     font-weight: 600;
  670.     font-size: 16px;
  671.     margin-bottom: 10px;
  672. }
  673. .tips {
  674.     font-size: 12px;
  675.     margin-left: 10px;
  676.     color: #999;
  677.     margin-top: 10px;
  678. }
  679. .completeDiv {
  680.     width: 350px;
  681. }
  682. .partDiv {
  683.     width: 249px;
  684. }
  685. .choosePoint {
  686.     width: 80px;
  687.     margin-left: 10px;
  688. }
  689. .rightTitle {
  690.     font-weight: 600;
  691.     font-size: 16px;
  692.     margin-right: 10px;
  693. }
  694. .rightTop {
  695.     margin-bottom: 10px;
  696. }
  697. .rightText {
  698.     font-size: 12px;
  699.     color: #999;
  700. }
  701. .priceBox {
  702.     border: 1px solid #e6e6e6;
  703.     border-radius: 8px;
  704.     padding: 10px;
  705.     margin-bottom: 15px;
  706.     display: grid;
  707.     grid-template-columns: 1fr 4fr;
  708.     cursor: pointer;
  709. }
  710. .activeBox {
  711.     border: 1px solid black;
  712. }
  713. .noAccord {
  714.     width: 100%;
  715.     height: 100px;
  716.     display: flex;
  717.     align-items: center;
  718.     justify-content: center;
  719. }
  720. .priceTitle {
  721.     font-size: 18px;
  722.     font-weight: 600;
  723.     /* margin-bottom: 10px; */
  724.     display: flex;
  725.     align-items: center;
  726.     justify-content: center;
  727. }
  728. .priceContent {
  729.     display: flex;
  730.     align-items: center;
  731.     margin-bottom: 10px;
  732.     background-color: #f5f5f5;
  733.     border-radius: 5px;
  734. }
  735. .priceLabel {
  736.     color: #666;
  737.     margin-right: 10px;
  738.     padding: 10px;
  739. }
  740. .priceValue {
  741.     font-size: 20px;
  742.     font-weight: 600;
  743. }
  744. .priceDesc {
  745.     font-size: 12px;
  746.     color: #999;
  747. }
  748. .redText {
  749.     color: red;
  750. }
  751. .dialog-footer {
  752.     position: absolute;
  753.     bottom: 0;
  754.     right: 0;
  755.     padding: 10px;
  756.     /* text-align: center;
  757.     width: 350px; */
  758. }
  759. .blankBorder {
  760.     border: 1px solid #efefef;
  761.     width: 100%;
  762.     height: 100px;
  763.     border-radius: 15px;
  764.     display: grid;
  765.     grid-template-columns: 1fr 4fr;
  766.     margin-bottom: 10px;
  767. }
  768. .blankLeft {
  769.     display: flex;
  770.     align-items: center;
  771.     justify-content: center
  772. }
  773. .leftBlank {
  774.     width: 50px;
  775.     height: 50px;
  776.     border-right: 1px solid #e6e6e6;
  777.     background-color: #efefef;
  778.     border-radius: 10px;
  779. }
  780. .leftTop {
  781.     width: 100%;
  782.     height: 40px;
  783.     background-color: #efefef;
  784.     border-radius: 10px;
  785.     margin-bottom: 5px;
  786. }
  787. .leftBottom {
  788.     width: 100%;
  789.     height: 20px;
  790.     background-color: #efefef;
  791.     border-radius: 5px;
  792. }
  793. </style>
复制代码
常见问题 | 腾讯位置服务  看文档一步一步来

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表