選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

transfer-page-sign.vue 13KB

4ヶ月前
3ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
3ヶ月前
3ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
3ヶ月前
4ヶ月前
3週間前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. <template>
  2. <view class="content">
  3. <view>
  4. <text>车牌号:</text>
  5. <view style="width: 60%;flex: 3;margin: 0 15rpx;">
  6. <uni-data-select style="width: 100%;" v-model="state.vehiclePlate" :localdata="state.vehicPlateRange"
  7. @change="changeColor" :clear="false"></uni-data-select>
  8. </view>
  9. <button type="default" class="ui-btn" @click="refresh()" style="flex:0.5;height: 70rpx;line-height: 70rpx;">
  10. 查询
  11. </button>
  12. </view>
  13. </view>
  14. <view class="details" v-if="state.isDetails">
  15. <view><text>车牌号</text><text class="car">{{state.details['vehiclePlate']}}</text></view>
  16. <view><text>车牌颜色</text><text class="car">{{getVehiclePlateColor(state.details['vehiclePlateColor'])}}</text>
  17. </view>
  18. <view><text>车主姓名</text><text class="car">{{state.details['ownerName']}}</text></view>
  19. <view v-if="state.details['handlerName']"><text>办理人</text><text
  20. class="car">{{state.details['handlerName']}}</text></view>
  21. <view><text>产品名称</text><text class="car">{{state.details['productName']}}</text></view>
  22. <view><text style="width:60%;">权益说明</text><text class="car">{{state.details['rightsDesc']}}</text></view>
  23. <view><text>产品金额</text><text class="car">¥{{state.details['productAmount']*0.01}}</text></view>
  24. <view><text>应付金额</text><text class="car">¥{{state.details['productAmount']*0.01}}</text></view>
  25. <view v-if="state.details['orderStep']==7"><text>订单状态</text><text class="car">{{state.words}}</text></view>
  26. <view v-if="state.details['orderStep']==7"><text>不通过原因</text><text class="car">{{state.details['auditReason']}}</text></view>
  27. <view class="noborder other-free">无其他费用</view>
  28. <view class="noborder yansghi">
  29. <checkbox-group @change="checkboxChange">
  30. <checkbox :checked="state.checked" style="transform: scale(0.65)" />
  31. <text class='txt'>我已阅读并同意</text>
  32. </checkbox-group>
  33. <text v-for="(item,index) in state.agreeURL" class="txt xieyi"
  34. @click="downAuthD(item)">《{{item.name}}》</text>
  35. </view>
  36. <view class="action" style="margin-bottom: 30rpx;" v-if="state.details['orderStep']!=7">
  37. <button type="default" class="ui-btn" @click="savaHandle()" v-if="state.isSign">
  38. {{state.words}}
  39. </button>
  40. <button type="default" class="ui-btn" @click="sign()" v-else>
  41. 去签署协议
  42. </button>
  43. </view>
  44. </view>
  45. </template>
  46. <script setup lang="ts">
  47. import carNumberInput from "./components/car-number-input.vue";
  48. import { reactive } from "vue";
  49. import { onShow} from "@dcloudio/uni-app";
  50. import {
  51. navTo, hasLogin
  52. } from "@/utils/utils"
  53. import { agreementInSertOrder, contractQuery, orderQuery, accountSign, agreeOrderProdcut, envs, queryKey,orderQueryDetail } from "@/utils/network/api.js";
  54. import {
  55. getItem,
  56. StorageKeys,
  57. setItem
  58. } from "@/utils/storage";
  59. import { requestNew } from "@/utils/network/request.js";
  60. import { msg } from "@/utils/utils";
  61. import { vehiclePlateColorPai } from "@/datas/vehiclePlateColor.js";
  62. import {
  63. getVehiclePlateColor
  64. } from "@/datas/vehiclePlateColor";
  65. import {
  66. OrderStatus
  67. } from "@/datas/enum";
  68. import useOrderSkip from "@/composables/order/useOrderSkip";
  69. const tools = require("../../static/etcUtil/tools.js");
  70. const { gotoActiveOrder } = useOrderSkip();
  71. const state = reactive({
  72. checked: false,
  73. agreeURL: [],
  74. agreements: [],
  75. isSign: false,
  76. vehicPlateRange: [],
  77. idCard: "",
  78. mobile: "",
  79. vehiclePlate: "",
  80. vehiclePlateColor: "",
  81. details: {},
  82. isDetails: false,
  83. orderId: "",
  84. words: "",
  85. carAll:"",
  86. });
  87. onShow(() => {
  88. if (state.orderId) {
  89. // 签约完回来
  90. orderDetail(state.orderId)
  91. }else{
  92. // 没登录情况
  93. if (!hasLogin()) {
  94. quanKeyAction()
  95. navTo(`/login/login?back=1`)
  96. } else {
  97. uni.getLocation({
  98. type: 'gcj02',
  99. success: function (res) {
  100. },
  101. })
  102. query()
  103. }
  104. }
  105. })
  106. // 从其他签约回来点查询,虽然一进来刷新了,但是可能状态没更新回来,需要再次点击查询
  107. const refresh=()=>{
  108. if (state.orderId) {
  109. // 签约完回来
  110. orderDetail(state.orderId)
  111. }else{
  112. // 没登录情况
  113. if (!hasLogin()) {
  114. quanKeyAction()
  115. navTo(`/login/login?back=1`)
  116. } else {
  117. query()
  118. }
  119. }
  120. }
  121. const quanKeyAction = () => {
  122. var data = {};
  123. const options = {
  124. type: 2,
  125. data: data,
  126. method: "POST",
  127. };
  128. requestNew(queryKey, options).then((res) => {
  129. const data = res
  130. console.log("枚举", data)
  131. setItem('key', data.dictTypeAndItem)
  132. })
  133. .catch((err) => {
  134. console.log(err);
  135. });
  136. }
  137. const query = () => {
  138. const options = {
  139. type: 2,
  140. data: {},
  141. method: "POST",
  142. showLoading: true,
  143. };
  144. requestNew(orderQuery, options).then((res) => {
  145. console.log("擦寻", res,res.vehicPlateOrderList[0]['vehicPlate'])
  146. state.carAll=res.vehicPlateOrderList
  147. for (var k = 0; k < res.vehicPlateOrderList.length; k++) {
  148. let obj = {};
  149. obj['value'] = res.vehicPlateOrderList[k]['vehicPlate']
  150. obj['text'] = res.vehicPlateOrderList[k]['vehicPlate']
  151. state.vehicPlateRange.push(obj)
  152. }
  153. state.vehiclePlate=res.vehicPlateOrderList[0]['vehicPlate']
  154. orderDetail(res.vehicPlateOrderList[0]['orderNo'])
  155. })
  156. }
  157. // 车辆详情
  158. const orderDetail = (orderNo) => {
  159. const options = {
  160. type: 2,
  161. data: {
  162. orderNo
  163. },
  164. method: "POST",
  165. showLoading: true,
  166. };
  167. requestNew(orderQueryDetail, options).then((res) => {
  168. console.log("orderQueryDetail", res)
  169. state.details = res
  170. setItem('orderQueryActivate', res)
  171. state.isDetails = true
  172. state.orderId = res.orderNo
  173. queryAgreement()
  174. })
  175. }
  176. const getWrlds = () => {
  177. if (state.details['orderStatus'] != OrderStatus.已取消) {
  178. // 去支付
  179. if (state.details['orderStep'] == OrderStatus['完成车辆信息上传/待支付'] || state.details['orderStep'] == OrderStatus['待支付2']) {
  180. state.words = "去支付"
  181. } else if (state.details['orderStep'] == OrderStatus['已支付/待签约']) {
  182. // 去签约
  183. state.words = "去签约"
  184. } else if (state.details['orderStep'] == OrderStatus['待激活']) {
  185. // 待激活
  186. state.words = "去激活"
  187. } else if (state.details['orderStep'] == OrderStatus['待审核']) {
  188. // 待审核
  189. state.words = "待审核"
  190. } else if (state.details['orderStep'] == OrderStatus['审核不通过']) {
  191. // 待激活
  192. state.words = "审核不通过"
  193. }
  194. }
  195. }
  196. const savaHandle = () => {
  197. if(state.words == "待审核" || state.words == "审核不通过"){
  198. return;
  199. }else{
  200. if (state.checked) {
  201. if (state.details['orderStatus'] != OrderStatus.已取消) {
  202. // 去支付
  203. if (state.details['orderStep'] == OrderStatus['完成车辆信息上传/待支付'] || state.details['orderStep'] == OrderStatus['待支付2']) {
  204. agreementConfirm().then((value) => {
  205. console.log("协议确认", value)
  206. let vehicleId = state.details['vehiclePlate'] + "_" + state.details['vehiclePlateColor']
  207. // qtSign 1 去签约
  208. // orderQuery 1 订单查询 0正常订单
  209. // cardType2:储值卡 1:记账卡 3:预存卡
  210. navTo(`/subpackage/orders/order_payment?orderId=${state.orderId}&&qtSign=${state.details['qtSign']}&vehicleId=${vehicleId}&orderQuery=1&qdSignUrl=${state.details['qdSignUrl']}&qdSignAppId=${state.details['qdSignAppId']}&xianxia=1&cardType=${state.details['cardType']}`);
  211. })
  212. } else if (state.details['orderStep'] == OrderStatus['已支付/待签约']) {
  213. // 去签约
  214. if (state.details['qtSign'] == 0) {
  215. if(state.details['qdSignAppId']){
  216. uni.navigateToMiniProgram({
  217. appId: state.details['qdSignAppId'],
  218. path: state.details['qdSignUrl'],
  219. extraData: {},
  220. envVersion:'trial',
  221. success(res) {
  222. console.log(res);
  223. },
  224. complete(res) {
  225. console.log(res);
  226. },
  227. fail(res) {
  228. console.log(res);
  229. // 未成功跳转到车主小程序
  230. },
  231. });
  232. }else{
  233. const params = encodeURIComponent(JSON.stringify(state.details['qdSignUrl']))
  234. tools.toUrl(`/subpackage/personal-center/webview?url=` + params)
  235. }
  236. } else {
  237. navTo(`/subpackage/orders/release-products?orderId=${state.orderId}&orderQuery=1`);
  238. }
  239. } else if (state.details['orderStep'] == OrderStatus['待激活']) {
  240. // 待激活
  241. gotoActiveOrder(state.details)
  242. }
  243. }
  244. } else {
  245. msg("请勾选协议");
  246. }
  247. }
  248. }
  249. // 协议确认接口
  250. const agreementConfirm = () => {
  251. const options = {
  252. type: 2,
  253. data: {
  254. orderId: state.orderId,
  255. protocol: state.checked ? 1 : 0,
  256. agreements: state.agreements
  257. },
  258. method: "POST",
  259. showLoading: true,
  260. };
  261. return new Promise(async (resolve, reject) => {
  262. const res = await requestNew(agreeOrderProdcut, options);
  263. const data = res;
  264. console.log("确认协议", data)
  265. resolve(data);
  266. }).catch((error) => {
  267. reject(error);
  268. });
  269. };
  270. const checkboxChange = (e) => {
  271. state.checked = !state.checked;
  272. console.log(state.checked);
  273. };
  274. // 查协议
  275. const queryAgreement = () => {
  276. const options = {
  277. type: 2,
  278. data: {
  279. orderId: state.orderId, //订单编号
  280. status: 1
  281. },
  282. method: "POST",
  283. showLoading: true,
  284. };
  285. requestNew(agreementInSertOrder, options).then((res) => {
  286. let data = res;
  287. let supAgreeArr = data.data
  288. // 每次点击先清空
  289. state.agreeURL = []
  290. state.agreements = []
  291. console.log("data==", supAgreeArr)
  292. for (var m = 0; m < supAgreeArr.length; m++) {
  293. let obj = {}
  294. obj['name'] = supAgreeArr[m]['name']
  295. for (var k = 0; k < supAgreeArr[m]['address'].length; k++) {
  296. state.agreements.push(supAgreeArr[m]['address'][k]['id'])
  297. obj['url'] = envs[process.env.NODE_ENV].baseUrl + supAgreeArr[m]['address'][k]['url']
  298. state.agreeURL.push(obj)
  299. }
  300. }
  301. contractRequest()
  302. console.log("查协议", state.agreeURL)
  303. });
  304. }
  305. const downAuthD = (item) => {
  306. console.log('=======123', item)
  307. console.log("uni.env.USER_DATA_PATH '", uni.env.USER_DATA_PATH + '/' + '产品协议.docx')
  308. // 文件后缀截取
  309. var index = item.url.lastIndexOf("\.");
  310. let fileType = item.url.substring(index + 1, item.url.length);
  311. console.log("fileType", fileType)
  312. uni.downloadFile({
  313. url: item.url,
  314. filePath: uni.env.USER_DATA_PATH + '/' + item.name + '.' + fileType,
  315. success(res) {
  316. const filePath = res.filePath
  317. console.log("filePath", filePath)
  318. uni.openDocument({
  319. filePath: filePath,
  320. fileType: fileType,
  321. showMenu: true, //关键点
  322. success: function (res) {
  323. },
  324. fail: function (err) {
  325. msg("打开文档失败");
  326. }
  327. });
  328. },
  329. fail: function (err) {
  330. msg("下载文档失败");
  331. console.log("err", err)
  332. },
  333. complete(res) {
  334. }
  335. })
  336. }
  337. // 查询是否签署协议
  338. const contractRequest = () => {
  339. const options = {
  340. type: 2,
  341. data: {
  342. orderId: state.orderId, //订单编号
  343. },
  344. method: "POST",
  345. showLoading: true,
  346. };
  347. requestNew(contractQuery, options).then((res) => {
  348. if (res.contractState == 1) {
  349. state.isSign = true
  350. // 协议签署了复选框选上
  351. state.checked = true
  352. } else {
  353. state.isSign = false
  354. state.checked = false
  355. }
  356. getWrlds()
  357. console.log("查询是否签署协议", res)
  358. });
  359. }
  360. // 去签署协议
  361. const sign = () => {
  362. const options = {
  363. type: 2,
  364. data: {
  365. orderId: state.orderId, //订单编号
  366. },
  367. method: "POST",
  368. showLoading: true,
  369. };
  370. requestNew(accountSign, options).then((res) => {
  371. uni.navigateToMiniProgram({
  372. appId: 'wxeee4ac6e61915479',
  373. path: `/pages/externel/view/view?random=${res.random}&envType=product`,
  374. envVersion: 'release',
  375. fail: (error) => {
  376. console.log(error);
  377. }
  378. })
  379. console.log("去签署协议", res)
  380. });
  381. }
  382. const changeColor = (e) => {
  383. state.vehiclePlateColor = e
  384. for(var i=0;i<state.carAll.length;i++){
  385. if(e==state.carAll[i]['vehicPlate']){
  386. state.orderId=state.carAll[i]['orderNo']
  387. return
  388. }
  389. }
  390. console.log(e)
  391. }
  392. </script>
  393. <style scoped lang="scss">
  394. .content {
  395. font-size: 30rpx;
  396. background-color: white;
  397. box-sizing: border-box;
  398. padding: 20rpx 30rpx 40rpx 30rpx;
  399. view {
  400. display: flex;
  401. margin-bottom: 4rpx;
  402. align-items: center;
  403. height: 76rpx;
  404. text {
  405. width: 30%;
  406. flex: 1;
  407. }
  408. }
  409. }
  410. .details {
  411. font-size: 30rpx;
  412. background-color: white;
  413. box-sizing: border-box;
  414. padding: 20rpx 30rpx;
  415. margin-top: 30rpx;
  416. view {
  417. border-bottom: 1rpx solid #ccc;
  418. padding: 6rpx 0;
  419. line-height: 62rpx;
  420. display: flex;
  421. justify-content: space-between;
  422. .car {
  423. font-weight: bold;
  424. }
  425. }
  426. .noborder {
  427. border-bottom: none;
  428. }
  429. .other-free {
  430. display: flex;
  431. justify-content: flex-end;
  432. }
  433. .sure {
  434. margin: 30rpx 0;
  435. }
  436. }
  437. .action {
  438. margin-top: 30rpx;
  439. }
  440. ::v-deep .uni-select {
  441. box-sizing: border-box !important;
  442. padding-left: 10rpx !important;
  443. border: 1rpx solid #ccc;
  444. height: 60rpx !important;
  445. }
  446. ::v-deep .uni-select__input-text {
  447. font-size: 30rpx !important;
  448. }
  449. .yansghi {
  450. height: auto !important;
  451. line-height: normal !important;
  452. display: flex !important;
  453. justify-content: flex-start !important;
  454. flex-shrink: 1 !important;
  455. flex-wrap: wrap !important;
  456. align-items: center !important;
  457. }
  458. </style>