You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

verification.vue 13KB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. <template>
  2. <view class="oderPage">
  3. <u-form :model="form" ref="myForm" :error-type="errorType">
  4. <view class="from">
  5. <u-form-item prop="cardState">
  6. <view class="from_item">
  7. <text><text style="color: red">*</text>需要更换的设备:</text>
  8. <radio-group @change="radioChange" class="radios">
  9. <block v-for="(item, index) in radiolist1" :key="item.val">
  10. <view class="radio-box">
  11. <radio :value="item.val" :checked="form.applyType == item.val" color="#13e7c1"
  12. style="transform:scale(0.75)" />
  13. <view>{{item.name}}</view>
  14. </view>
  15. </block>
  16. </radio-group>
  17. </view>
  18. </u-form-item>
  19. <u-form-item prop="cardState">
  20. <view class="from_item">
  21. <text><text style="color: red">*</text>设备损坏类型:</text>
  22. <radio-group @change="typeChange" class="radios">
  23. <block v-for="(item, index) in radiolist2" :key="item.val">
  24. <view class="radio-box">
  25. <radio :value="item.val" :checked="form.damageMode == item.val" color="#13e7c1"
  26. style="transform:scale(0.75)" />
  27. <view>{{item.name}}</view>
  28. </view>
  29. </block>
  30. </radio-group>
  31. </view>
  32. </u-form-item>
  33. <!-- <u-form-item prop="phone">
  34. <view class="from_item" style="background-color: #f7f7f7">
  35. <text><text style="color: red"></text>手机号:</text>
  36. <u-input v-model="form.mobile" :disabled="true" class="input" />
  37. </view>
  38. </u-form-item>
  39. <u-form-item prop="code">
  40. <view class="from_item">
  41. <text><text style="color: red"></text>验证码:</text>
  42. <u-input v-model="form.code" placeholder="请输入验证码" class="input" />
  43. <view class="hint2">
  44. <view class="green">{{ codeDuration === 0 ? "" : codeDuration }}</view>
  45. <view class="grey" @click="getCode">{{
  46. codeDuration === 0 ? "发送验证码" : "秒后可重发"
  47. }}</view>
  48. </view>
  49. </view>
  50. </u-form-item> -->
  51. </view>
  52. </u-form>
  53. <view style="margin: 30rpx;" v-if="state.isPicture">
  54. <view class="please"><text style="color: red">*</text>请上传图片:</view>
  55. <uni-file-picker fileMediatype="image" mode="grid" :limit="9" @select="select"
  56. :image-styles="state.imageStyles" />
  57. </view>
  58. <view class="btn-wrapper">
  59. <!-- <button class="default button" v-if="apply.data.status" @click="changeCardQueryCancleAction()"
  60. type="default">撤回申请</button> -->
  61. <!-- <button class="submit button" v-if="apply.data.status === 'APPLY'||!apply.data.status" @click="toPage()"
  62. type="default">下一步填写资料</button> -->
  63. <button class="submit button" v-if="apply.data.status === 'APPLY'||!apply.data.status" @click="toPage()"
  64. type="default">下一步填写资料</button>
  65. </view>
  66. </view>
  67. </template>
  68. <script setup lang="ts">
  69. import navBar from "./components/nav-bar.vue";
  70. import {
  71. checkStr
  72. } from "@/utils/utils";
  73. import {
  74. ref,
  75. reactive
  76. } from "vue";
  77. import {
  78. navTo
  79. } from "@/utils/utils";
  80. import {
  81. onReady,
  82. onLoad,
  83. onShow,
  84. } from "@dcloudio/uni-app";
  85. import {
  86. request
  87. } from "@/utils/network/request.js";
  88. import {
  89. sendCode,
  90. checkCode,
  91. changeCardApply,
  92. changeCardQuery,
  93. changeCardQueryCancle,
  94. fileUpload
  95. } from "@/utils/network/api.js";
  96. import {
  97. stringToJson
  98. } from "@/utils/network/encryption";
  99. import {
  100. msg
  101. } from "@/utils/utils";
  102. import { pathToBase64 } from "@/utils/image-tools/index.js";
  103. const state = reactive({
  104. imageList: [], //图片数据
  105. imageStyles: {
  106. width: 80,
  107. height: 80,
  108. },
  109. isPicture: false, //是否上传图片
  110. })
  111. // 表单数据
  112. const form = reactive({
  113. damageMode: "0",
  114. damageModeName: '人为损坏',
  115. applyType: 'EXCHANGE_CARD',
  116. applyTypeName: '卡',
  117. mobile: "",
  118. code: '',
  119. applyRes: ''
  120. });
  121. const apply = reactive({
  122. data: {
  123. status: undefined,
  124. id: ''
  125. }
  126. });
  127. //入参
  128. const params = reactive({
  129. cardId: '',
  130. obuId: '',
  131. orderId: ''
  132. });
  133. // 单选数据列表
  134. const radiolist1 = reactive([{
  135. name: "卡",
  136. val: "EXCHANGE_CARD",
  137. },
  138. {
  139. name: "OBU",
  140. val: "EXCHANGE_OBU",
  141. }, {
  142. name: "卡和OBU",
  143. val: "EXCHANGE_ALL",
  144. },
  145. ]);
  146. // 单选数据列表
  147. const radiolist2 = reactive([{
  148. name: "人为损坏",
  149. val: "0",
  150. },
  151. {
  152. name: "自然损坏",
  153. val: "1",
  154. }
  155. ]);
  156. // 验证规则
  157. const rules = {
  158. code: [{
  159. required: true,
  160. message: "请输入验证码",
  161. trigger: ["change", "blur"],
  162. }],
  163. };
  164. // 验证提示类型(toast要版本为1.3.5才支持)
  165. const errorType = ["toast"];
  166. // 设置验证规则
  167. const myForm = ref(null);
  168. //倒计时时常
  169. const codeDuration = ref(0);
  170. let interval = null;
  171. /* 验证码倒计时 */
  172. const codeInterval = () => {
  173. codeDuration.value = 60;
  174. interval = setInterval(() => {
  175. codeDuration.value--;
  176. if (codeDuration.value === 0) {
  177. if (interval) {
  178. clearInterval(interval);
  179. interval = null;
  180. }
  181. }
  182. }, 1000);
  183. };
  184. onReady(() => {
  185. myForm.value.setRules(rules);
  186. });
  187. onLoad((option) => {
  188. form.mobile = option.mobile
  189. params.cardId = option.cardId
  190. params.orderId = option.orderId
  191. // changeCardQueryAction().then(val => {
  192. // console.log(val);
  193. // apply.data = val;
  194. // apply.data.status = val.status;
  195. // })
  196. });
  197. onShow(() => {
  198. changeCardQueryAction()
  199. })
  200. const select = (e) => {
  201. console.log('选择文件:', e)
  202. pathToBase64(e.tempFilePaths[0]).then((path) => {
  203. var data = {
  204. fileBase64: path,
  205. };
  206. const options = {
  207. type: 2,
  208. data: data,
  209. method: "POST",
  210. showLoading: true,
  211. };
  212. request(fileUpload, options).then((res) => {
  213. const data = stringToJson(res.bizContent);
  214. const imgArr = state.imageList
  215. imgArr.push(data.data.url)
  216. state.imageList = imgArr;
  217. console.log("data.data.url", state.imageList)
  218. });
  219. })
  220. .catch((error) => { });
  221. }
  222. // 单选
  223. const radioChange = (e : any) => {
  224. console.log(e);
  225. form.applyType = e.detail.value
  226. };
  227. // 单选
  228. const typeChange = (e : any) => {
  229. console.log(e);
  230. form.damageMode = e.detail.value
  231. if (e.detail.value == 1) {
  232. state.isPicture = true
  233. } else {
  234. state.isPicture = false
  235. }
  236. };
  237. const getCode = () => {
  238. if (codeDuration.value !== 0) {
  239. return;
  240. }
  241. const options = {
  242. type: 2,
  243. data: {
  244. mobile: form.mobile
  245. },
  246. method: "POST",
  247. showLoading: true,
  248. };
  249. request(sendCode, options)
  250. .then((res) => {
  251. codeInterval();
  252. msg("验证码发送成功!");
  253. })
  254. .catch((err) => {
  255. console.log(err);
  256. });
  257. }
  258. //查询申请单
  259. const changeCardQueryAction = () => {
  260. var data = {
  261. orderId: params.orderId
  262. };
  263. const options = {
  264. type: 2,
  265. data: data,
  266. method: "POST",
  267. showLoading: true,
  268. };
  269. request(changeCardQuery, options).then((res) => {
  270. const data = stringToJson(res.bizContent);
  271. if (data) {
  272. apply.data = data;
  273. apply.data.status = data.status;
  274. }
  275. })
  276. // return new Promise(async (resolve, reject) => {
  277. // const res = await request(changeCardQuery, options);
  278. // const data = stringToJson(res.bizContent);
  279. // resolve(data);
  280. // }).catch((error) => {
  281. // reject(error);
  282. // });
  283. }
  284. //撤销订单
  285. const changeCardQueryCancleAction = () => {
  286. var data = {
  287. id: apply.data.id,
  288. cancelRes: '取消申请单'
  289. };
  290. const options = {
  291. type: 2,
  292. data: data,
  293. method: "POST",
  294. showLoading: true,
  295. };
  296. return new Promise(async (resolve, reject) => {
  297. const res = await request(changeCardQueryCancle, options);
  298. const data = stringToJson(res.bizContent);
  299. msg('取消申请成功');
  300. uni.navigateBack()
  301. }).catch((error) => {
  302. reject(error);
  303. });
  304. }
  305. //申请
  306. const queryCckChangejzCardAction = () => {
  307. if (form.damageMode == "1") {
  308. if (state.imageList.length == 0) {
  309. msg('请上传图片');
  310. return;
  311. }
  312. }
  313. var data = {
  314. orderId: params.orderId,
  315. applyType: form.applyType,
  316. damageMode: form.damageMode,//0 --- 人为损坏 1 --- 自然损坏 当为换卡签的时候必传
  317. fileUrl: state.imageList.toString()
  318. };
  319. const options = {
  320. type: 2,
  321. data: data,
  322. method: "POST",
  323. showLoading: true,
  324. };
  325. return new Promise(async (resolve, reject) => {
  326. const res = await request(changeCardApply, options);
  327. if (res.bizContent.indexOf("/") !== -1) {
  328. var resultData = stringToJson(res.bizContent);
  329. } else {
  330. var resultData = res.bizContent
  331. }
  332. console.log("data88888", JSON.parse(resultData))
  333. resolve(JSON.parse(resultData));
  334. }).catch((error) => {
  335. reject(error);
  336. });
  337. }
  338. //下一步
  339. const toPage = () => {
  340. // myForm.value.validate((valid) => {
  341. // if (valid) {
  342. // const options = {
  343. // type: 2,
  344. // data: {
  345. // mobile: form.mobile,
  346. // code: form.code
  347. // },
  348. // method: "POST",
  349. // showLoading: true,
  350. // };
  351. // request(checkCode, options)
  352. // .then(() => {
  353. if (apply.data.status === 'APPLY') {
  354. navTo(
  355. `/subpackage/after-sale/replace-equipment/form?orderId=${params.orderId}&&id=${apply.data.id}`
  356. )
  357. } else {
  358. // if (form.applyTypeName === '卡') {
  359. // form.applyType = 'EXCHANGE_CARD'
  360. // } else if (form.applyTypeName === 'OBU') {
  361. // form.applyType = 'EXCHANGE_OBU'
  362. // } else if (form.applyTypeName === '卡和OBU') {
  363. // form.applyType = 'EXCHANGE_ALL'
  364. // }
  365. // if (form.damageModeName === '人为损坏') {
  366. // form.damageMode = '0'
  367. // } else if (form.damageModeName === '自然损坏') {
  368. // form.damageMode = '1'
  369. // }
  370. queryCckChangejzCardAction().then(val => {
  371. console.log("val888888", val.id)
  372. // if(!val.id){
  373. // msg("已存在对应的申请单");
  374. // }else{
  375. navTo(
  376. `/subpackage/after-sale/replace-equipment/form?orderId=${params.orderId}&&id=${val.id}`
  377. )
  378. // }
  379. })
  380. }
  381. // })
  382. // .catch((err) => {
  383. // console.log(err);
  384. // });
  385. // } else {
  386. // console.log("验证未通过");
  387. // }
  388. // });
  389. };
  390. </script>
  391. <style>
  392. page {
  393. width: 100%;
  394. height: 100%;
  395. display: flex;
  396. flex-direction: column;
  397. background-color: ##eef7f7;
  398. }
  399. </style>
  400. <style lang="scss" scoped>
  401. .radios {
  402. display: flex;
  403. }
  404. .radio-box {
  405. display: flex;
  406. align-items: center;
  407. padding-left: 20rpx;
  408. }
  409. .hint2 {
  410. display: flex;
  411. .green {
  412. font-size: 28rpx;
  413. color: #00b38b;
  414. }
  415. .grey {
  416. font-size: 24rpx;
  417. color: #000000;
  418. margin-left: 16rpx;
  419. }
  420. }
  421. .oderPage {
  422. flex: 1;
  423. width: 100%;
  424. .from1 {
  425. background-color: #fff;
  426. margin-top: 30rpx;
  427. padding: 0 30rpx;
  428. ::v-deep .uni-forms-item {
  429. border-bottom: 1rpx solid #ccc;
  430. padding: 15rpx 0;
  431. margin-bottom: 0;
  432. .uni-forms-item__label {
  433. font-size: 28rpx;
  434. height: 50rpx;
  435. }
  436. .uni-forms-item__content {
  437. display: flex;
  438. }
  439. .uni-easyinput__content-input {
  440. font-size: 28rpx;
  441. height: 50rpx;
  442. }
  443. }
  444. .btn {
  445. line-height: 38rpx;
  446. font-size: 24rpx;
  447. font-family: Microsoft YaHei;
  448. font-weight: 400;
  449. color: #ffffff;
  450. background: #00b38b;
  451. border-radius: 10rpx;
  452. padding: 10rpx 15rpx;
  453. }
  454. }
  455. .from {
  456. background-color: #fff;
  457. margin-top: 30rpx;
  458. padding: 0 30rpx;
  459. ::v-deep .u-form-item {
  460. padding: 0;
  461. line-height: normal;
  462. .u-form-item__message {
  463. margin-bottom: 12rpx;
  464. }
  465. }
  466. .from_item {
  467. display: flex;
  468. flex-wrap: nowrap;
  469. justify-content: space-between;
  470. align-items: center;
  471. height: 80rpx;
  472. border-bottom: 1rpx solid #dcdcdc;
  473. .btn {
  474. font-size: 24rpx;
  475. font-family: Microsoft YaHei;
  476. font-weight: 400;
  477. color: #ffffff;
  478. background: #00b38b;
  479. border-radius: 10rpx;
  480. padding: 10rpx 15rpx;
  481. }
  482. ::v-deep .input {
  483. text-align: left;
  484. flex: 1;
  485. background: transparent;
  486. input {
  487. text-align: left;
  488. }
  489. }
  490. }
  491. .from_item1 {
  492. display: flex;
  493. flex-wrap: nowrap;
  494. flex-direction: column;
  495. justify-content: space-between;
  496. padding: 30rpx;
  497. border-bottom: #dcdcdc 1px solid;
  498. input {
  499. text-align: right;
  500. }
  501. .textarea {
  502. background-color: #f1f1f1;
  503. width: 100%;
  504. border-radius: 20rpx;
  505. margin-top: 10rpx;
  506. text-indent: 1rem;
  507. height: 180rpx;
  508. padding: 20rpx;
  509. box-sizing: border-box;
  510. }
  511. }
  512. }
  513. }
  514. .btn-wrapper {
  515. display: flex;
  516. padding-top: 60rpx;
  517. }
  518. .button::after {
  519. border: none;
  520. }
  521. .default {
  522. height: 80rpx;
  523. background: rgba(0, 179, 139, .1);
  524. border-radius: 40rpx;
  525. font-size: 32rpx;
  526. font-weight: 400;
  527. color: #00B38B;
  528. line-height: 80rpx;
  529. width: 45%;
  530. border: 1px solid #00B38B;
  531. }
  532. .submit {
  533. background: linear-gradient(to left, #43a1e0 0%, #13e7c1 100%);
  534. height: 80rpx;
  535. line-height: 80rpx;
  536. color: #fff;
  537. border-radius: 100rpx;
  538. font-size: 32rpx;
  539. width: 45%;
  540. }
  541. .upload-img {
  542. margin-top: 10rpx;
  543. }
  544. .please {
  545. font-size: 28rpx;
  546. margin-bottom: 20rpx;
  547. }
  548. </style>