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

transfer-page-sign.vue 12KB

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