Apply.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <div class="apply">
  3. <van-form @submit="onSubmit">
  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. <div style="margin: 16px">
  41. <br />
  42. <br />
  43. <van-button
  44. color="#e42417"
  45. round
  46. block
  47. type="info"
  48. native-type="submit"
  49. >
  50. 确认预约
  51. </van-button>
  52. <br />
  53. <van-button round block type="default" @click="toAppointment">
  54. 查看预约列表
  55. </van-button>
  56. <br />
  57. <!-- <van-button round block type="info" @click="price">
  58. 查看价目表
  59. </van-button> -->
  60. </div>
  61. </van-form>
  62. <!-- #2a7ef4 -->
  63. <van-popup round v-model="dateInput" position="bottom">
  64. <van-picker
  65. title="选择预约时间"
  66. @cancel="dateInput = false"
  67. @confirm="onConfirm"
  68. value-key="startTime"
  69. show-toolbar
  70. :columns="tagList"
  71. />
  72. </van-popup>
  73. <!-- #2a7ef4 -->
  74. <van-popup round v-model="program" position="bottom">
  75. <van-picker
  76. title="选择套餐"
  77. @cancel="program = false"
  78. @confirm="onConfirmpro"
  79. value-key="name"
  80. show-toolbar
  81. :columns="goodsLi"
  82. />
  83. </van-popup>
  84. </div>
  85. </template>
  86. <script>
  87. // @ is an alias to /src
  88. import {
  89. Form as vanForm,
  90. Field as vanField,
  91. Button as vanButton,
  92. Popup as vanPopup,
  93. // RadioGroup as vanRadioGroup,
  94. // Radio as vanRadio,
  95. Picker as vanPicker,
  96. ImagePreview,
  97. } from "vant";
  98. import "vant/lib/form/style/index";
  99. import "vant/lib/field/style/index";
  100. import "vant/lib/button/style/index";
  101. import "vant/lib/popup/style/index";
  102. import "vant/lib/picker/style/index";
  103. import { goodsList, apply, applyrang } from "../api/index";
  104. import { isIphone, isAndroid } from "@/utils/isTerminal.js";
  105. export default {
  106. name: "Apply",
  107. data() {
  108. return {
  109. program: false,
  110. username: "",
  111. userphone: "",
  112. date: "",
  113. currentDate: "",
  114. dateInput: false,
  115. minDate: new Date(Date.now()),
  116. maxDate: new Date(Date.now() + 86400000),
  117. radio: "",
  118. radioname: "",
  119. finished: false,
  120. loading: false,
  121. goodsLi: [],
  122. tagList: [],
  123. };
  124. },
  125. mounted() {
  126. window.voteNext = () => {
  127. let user = "";
  128. var payload = {
  129. type: "JSbridge",
  130. functionName: "getUserInfo",
  131. arguments: {},
  132. };
  133. if (isAndroid && window.H5Listener && window.H5Listener.getUserInfo)
  134. user = window.H5Listener.getUserInfo();
  135. if (isIphone) user = window.prompt(JSON.stringify(payload));
  136. user && (user = JSON.parse(user || "{}"));
  137. this.userphone = user.phone || "";
  138. this.username = user.realName || "";
  139. goodsList().then(res => {
  140. this.goodsLi = (res || []).map(v=>{
  141. v.name = v.name + '(' + v.price + '元)'
  142. return v
  143. });
  144. this.radio = (this.goodsLi[0] || {}).id;
  145. });
  146. applyrang().then(res => {
  147. let l = res || [],
  148. nl = [],
  149. o = {};
  150. for (let i = 0; i < l.length; i++) {
  151. const v = l[i];
  152. if (v.isOrder === 1) continue;
  153. let keys = v.startTime.split(" "),
  154. key = keys[0],
  155. val = keys[1];
  156. v.startTime = val.replace(/:00$/, "");
  157. if (o[key] >= 0) {
  158. nl[o[key]].children.push(v);
  159. } else {
  160. o[key] = nl.length;
  161. nl[o[key]] = {
  162. startTime: key,
  163. children: [v],
  164. };
  165. }
  166. }
  167. this.tagList = nl;
  168. });
  169. };
  170. window.voteNext();
  171. },
  172. computed: {
  173. selectTime() {
  174. return this.date;
  175. },
  176. },
  177. methods: {
  178. price() {
  179. ImagePreview([
  180. "https://djweb.smcic.net/miniProgrammeData/img/price.jpg?v=" +
  181. Date.now(),
  182. ]);
  183. },
  184. toAppointment() {
  185. this.$router.replace({
  186. name: "Appointment",
  187. query: {
  188. userName: this.username,
  189. phone: this.userphone,
  190. },
  191. });
  192. },
  193. filter(type, options) {
  194. if (type === "minute") {
  195. return options.filter(option => option % 5 === 0);
  196. }
  197. return options;
  198. },
  199. onSubmit() {
  200. apply({
  201. userName: this.username,
  202. userPhone: this.userphone,
  203. goodsId: this.radio,
  204. orderTime: this.date + ":00",
  205. }).then(() => {
  206. this.$router.replace({
  207. name: "Appointment",
  208. query: {
  209. userName: this.username,
  210. phone: this.userphone,
  211. },
  212. });
  213. });
  214. },
  215. onConfirm(date) {
  216. this.dateInput = false;
  217. this.date = date.join(" ");
  218. },
  219. onConfirmpro(date){
  220. this.program = false;
  221. this.radioname = date.name
  222. }
  223. },
  224. beforeUnmount: function () {},
  225. components: {
  226. vanForm,
  227. vanField,
  228. vanPopup,
  229. vanButton,
  230. // vanRadioGroup,
  231. // vanRadio,
  232. vanPicker,
  233. },
  234. };
  235. </script>
  236. <style>
  237. .apply {
  238. height: 100%;
  239. background-color: #fff;
  240. }
  241. .apply .van-tag {
  242. white-space: nowrap;
  243. overflow: hidden;
  244. text-overflow: ellipsis;
  245. }
  246. .apply .van-radio {
  247. margin-bottom: 3px;
  248. }
  249. .apply .van-button--default{
  250. border-color: #c7c8c8;
  251. }
  252. </style>