Apply.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <template>
  2. <div class="apply">
  3. <van-form ref="form">
  4. <van-field
  5. v-model="username"
  6. label="姓名"
  7. readonly
  8. placeholder="姓名"
  9. :rules="[{ required: true, message: '请填写姓名' }]"
  10. />
  11. <van-field
  12. v-model="userphone"
  13. readonly
  14. type="tel"
  15. label="联系电话"
  16. placeholder="联系电话"
  17. :rules="[{ required: true, message: '请填写联系电话' }]"
  18. />
  19. <van-field
  20. @click="() => (program = true)"
  21. v-model="radioname"
  22. label="套餐"
  23. placeholder="请选择套餐"
  24. readonly
  25. :rules="[{ required: true, message: '未选择套餐' }]"
  26. />
  27. <!-- <van-radio-group v-model="radio" direction="horizontal">
  28. <van-radio v-for="(item, i) in goodsLi" :key="i" :name="item.id"
  29. >{{ item.name }}({{ item.price }}元)</van-radio
  30. >
  31. </van-radio-group> -->
  32. <van-field
  33. @click="() => (dateInput = true)"
  34. v-model="selectTime"
  35. label="预定时间"
  36. placeholder="请选择预定时间"
  37. readonly
  38. :rules="[{ required: true, message: '未选择预定时间' }]"
  39. />
  40. </van-form>
  41. <br />
  42. <br />
  43. <div style="margin: 0 16px">
  44. <van-button color="#e42417" round block type="info" @click="onSubmit">
  45. 确认预约
  46. </van-button>
  47. <br />
  48. <van-button round block type="default" @click="toAppointment">
  49. 查看预约列表
  50. </van-button>
  51. <br />
  52. <!-- <van-button round block type="info" @click="price">
  53. 查看价目表
  54. </van-button> -->
  55. </div>
  56. <!-- #2a7ef4 -->
  57. <van-popup round v-model="dateInput" position="bottom">
  58. <van-picker
  59. title="选择预约时间"
  60. @cancel="dateInput = false"
  61. @confirm="onConfirm"
  62. value-key="startTime"
  63. show-toolbar
  64. :columns="tagList"
  65. />
  66. </van-popup>
  67. <!-- #2a7ef4 -->
  68. <van-popup round v-model="program" position="bottom">
  69. <van-picker
  70. title="选择套餐"
  71. @cancel="program = false"
  72. @confirm="onConfirmpro"
  73. value-key="name"
  74. show-toolbar
  75. :columns="goodsLi"
  76. />
  77. </van-popup>
  78. </div>
  79. </template>
  80. <script>
  81. // @ is an alias to /src
  82. import {
  83. Form as vanForm,
  84. Field as vanField,
  85. Button as vanButton,
  86. Popup as vanPopup,
  87. // RadioGroup as vanRadioGroup,
  88. // Radio as vanRadio,
  89. Picker as vanPicker,
  90. ImagePreview,
  91. } from "vant";
  92. import "vant/lib/form/style/index";
  93. import "vant/lib/tag/style/index";
  94. import "vant/lib/field/style/index";
  95. import "vant/lib/button/style/index";
  96. import "vant/lib/popup/style/index";
  97. import "vant/lib/picker/style/index";
  98. import { urlSearchData } from "../utils/tool";
  99. import {
  100. getAPPUser,
  101. apply,
  102. getAPPToken,
  103. getAPPUserDetail,
  104. goodsList,
  105. applyrang,
  106. } from "../api/index";
  107. // import { goodsList, apply, applyrang } from "../api/index";
  108. // import { isIphone, isAndroid } from "@/utils/isTerminal.js";
  109. export default {
  110. name: "Apply",
  111. data() {
  112. return {
  113. program: false,
  114. username: "",
  115. userphone: "",
  116. date: "",
  117. currentDate: "",
  118. dateInput: false,
  119. minDate: new Date(Date.now()),
  120. maxDate: new Date(Date.now() + 86400000),
  121. radio: "",
  122. radioname: "",
  123. finished: false,
  124. loading: false,
  125. goodsLi: [],
  126. tagList: [],
  127. };
  128. },
  129. mounted() {
  130. let search = urlSearchData(),
  131. that = this;
  132. if (!search.ticket) return;
  133. getAPPUser({
  134. ticket: search.ticket,
  135. }).then(r => {
  136. getAPPToken("rest/63bada00-7d01-4acc-ab2b-df8061eeeb8f").then(res => {
  137. const t = JSON.parse(res || "{}");
  138. localStorage.token = t.id;
  139. getAPPUserDetail({
  140. loginName: r,
  141. }).then(detail => {
  142. const obj = JSON.parse(detail || "{}");
  143. that.userphone = obj.telNumber;
  144. that.username = obj.name;
  145. goodsList({
  146. userPhone: that.userphone || "",
  147. }).then(res => {
  148. this.goodsLi = (res || []).map(v => {
  149. v.name = v.name + "(" + v.price + "元)";
  150. return v;
  151. });
  152. this.radio = (this.goodsLi[0] || {}).id;
  153. });
  154. applyrang().then(res => {
  155. let l = res || [],
  156. nl = [],
  157. o = {};
  158. for (let i = 0; i < l.length; i++) {
  159. const v = l[i];
  160. if (v.isOrder === 1) continue;
  161. let keys = v.startTime.split(" "),
  162. key = keys[0],
  163. val = keys[1];
  164. v.startTime = val.replace(/:00$/, "");
  165. if (o[key] >= 0) {
  166. nl[o[key]].children.push(v);
  167. } else {
  168. o[key] = nl.length;
  169. nl[o[key]] = {
  170. startTime: key,
  171. children: [v],
  172. };
  173. }
  174. }
  175. this.tagList = nl;
  176. });
  177. });
  178. });
  179. });
  180. // window.voteNext = () => {
  181. // let user = "";
  182. // var payload = {
  183. // type: "JSbridge",
  184. // functionName: "getUserInfo",
  185. // arguments: {},
  186. // };
  187. // if (isAndroid && window.H5Listener && window.H5Listener.getUserInfo)
  188. // user = window.H5Listener.getUserInfo();
  189. // if (isIphone) user = window.prompt(JSON.stringify(payload));
  190. // user && (user = JSON.parse(user || "{}"));
  191. // this.userphone = user.phone || "";
  192. // this.username = user.realName || "";
  193. // if (!this.userphone) {
  194. // if (isAndroid && window.H5Listener && window.H5Listener.getUserInfo)
  195. // window.H5Listener.doLogin();
  196. // if (isIphone && window.webkit && window.webkit.messageHandlers)
  197. // window.webkit.messageHandlers.doLogin.postMessage("{}");
  198. // }
  199. // goodsList().then(res => {
  200. // this.goodsLi = (res || []).map(v => {
  201. // v.name = v.name + "(" + v.price + "元)";
  202. // return v;
  203. // });
  204. // this.radio = (this.goodsLi[0] || {}).id;
  205. // });
  206. // applyrang().then(res => {
  207. // let l = res || [],
  208. // nl = [],
  209. // o = {};
  210. // for (let i = 0; i < l.length; i++) {
  211. // const v = l[i];
  212. // if (v.isOrder === 1) continue;
  213. // let keys = v.startTime.split(" "),
  214. // key = keys[0],
  215. // val = keys[1];
  216. // v.startTime = val.replace(/:00$/, "");
  217. // if (o[key] >= 0) {
  218. // nl[o[key]].children.push(v);
  219. // } else {
  220. // o[key] = nl.length;
  221. // nl[o[key]] = {
  222. // startTime: key,
  223. // children: [v],
  224. // };
  225. // }
  226. // }
  227. // this.tagList = nl;
  228. // });
  229. // };
  230. // window.voteNext();
  231. },
  232. computed: {
  233. selectTime() {
  234. return this.date;
  235. },
  236. },
  237. methods: {
  238. price() {
  239. ImagePreview([
  240. "https://djweb.smcic.net/miniProgrammeData/img/price.jpg?v=" +
  241. Date.now(),
  242. ]);
  243. },
  244. toAppointment() {
  245. this.$router.push({
  246. name: "Appointment",
  247. query: {
  248. userName: this.username,
  249. phone: this.userphone,
  250. },
  251. });
  252. },
  253. filter(type, options) {
  254. if (type === "minute") {
  255. return options.filter(option => option % 5 === 0);
  256. }
  257. return options;
  258. },
  259. onSubmit() {
  260. this.$refs.form.validate().then(() => {
  261. apply({
  262. userName: this.username,
  263. userPhone: this.userphone,
  264. goodsId: this.radio,
  265. orderTime: this.date + ":00",
  266. }).then(() => {
  267. this.toAppointment();
  268. });
  269. });
  270. },
  271. onConfirm(date) {
  272. this.dateInput = false;
  273. this.date = date.join(" ");
  274. },
  275. onConfirmpro(date) {
  276. this.program = false;
  277. this.radio = date.id;
  278. this.radioname = date.name;
  279. },
  280. },
  281. beforeUnmount: function () {},
  282. components: {
  283. vanForm,
  284. vanField,
  285. vanPopup,
  286. vanButton,
  287. // vanRadioGroup,
  288. // vanRadio,
  289. vanPicker,
  290. },
  291. };
  292. </script>
  293. <style>
  294. .apply {
  295. height: 100%;
  296. background-color: #fff;
  297. }
  298. .apply .van-tag {
  299. white-space: nowrap;
  300. overflow: hidden;
  301. text-overflow: ellipsis;
  302. }
  303. .apply .van-radio {
  304. margin-bottom: 3px;
  305. }
  306. .apply .van-button--default {
  307. border-color: #c7c8c8;
  308. }
  309. </style>