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

verification.vue 12KB

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