Apply.vue 6.0 KB

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