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 11KB

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