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

transfer-page-sign.vue 12KB

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