<template> <div class="institution"> <!-- 请选择服务地区 --> <div class="area"> <div class="title"> <div class="type"><span class="point"></span> 请选择服务地区</div> </div> <ul class="area_box"> <li> <label>省:</label> <a-select style="width: 120px" @change="handleSelectProvince" allowClear > <a-select-option v-for="item in provinceList" :key="item.id" v-model="item.provinceCode" >{{ item.provinceName }}</a-select-option > </a-select> </li> <li> <label>市:</label> <a-select style="width: 120px" @change="handleSelectCity"> <a-select-option v-for="item in cityList" :key="item.id" v-model="item.cityCode" >{{ item.cityName }}</a-select-option > </a-select> </li> <li> <label>区:</label> <a-select style="width: 120px" @change="handleSelectDistrict"> <a-select-option v-for="item in areaList" :key="item.id" v-model="item.districtCode" >{{ item.districtName }}</a-select-option > </a-select> </li> </ul> </div> <!-- 请选择服务机构 --> <div class="mechanism"> <div class="title"> <div class="type"><span class="point"></span> 请选择服务机构</div> </div> <div class="mechanism_box"> <span v-for="(item, index) in mechanismList" :key="index" :class="index === selectIndex ? 'active' : ''" @click="clickTab(index, item.id)" >{{ item.supplierName }}</span > <!-- -{{ item.id }} --> </div> </div> <!-- 请选择服务地区 --> <div class="hospital"> <div class="title"> <div class="type"><span class="point"></span> 请选择服务中心</div> </div> <ul class="hospital_box" v-if="isShowHospitalList"> <li v-for="(item, index) in pageData" :key="index"> <div> <p class="top">{{ item.checkUnitName }}</p> <p class="bottom">{{ item.address }}</p> </div> <button :class="item.isDisabled ? 'btn disabled' : 'btn'" @click="openDatePicker(item)" > 选择服务日期 </button> <!-- -{{ item.supplierId }}-{{ item.id }} --> </li> </ul> <div v-else class="hospital_none">暂无可选分院</div> <a-pagination style="text-align: right; position: relative; bottom: 10px" v-if="hospitalList.length > 5" v-model="current" :pageSize="5" :total="hospitalList.length" show-less-items @change="pagechange" /> </div> <div class="mask" v-if="datePickShow && showDatemask"> <reserve-date ref="reserveDate1" :scheduleList="getScheduleList" @confirmDate="getConfirm" @cancleDate="getCancle" @changeDay=" (date) => { return dateChange(date, 0); } " @changeMonth=" (date) => { return changeM(date); } " /> </div> </div> </template> <script> import api from "@/api/customer"; import reserveDate from "../../../components/reserve-date"; import moment from "moment"; export default { name: "selectInstitution", components: { reserveDate, }, props: { id: { type: String | Number, default: "", }, }, data() { return { pageData: [], current: 1, showDatemask: false, datePickShow: false, selectIndex: 0, provinceList: [], //省 cityList: [], //市 areaList: [], //区 provinceCode: "", //选择省 cityCode: "", //选择市 areaCode: "", //选择区 mechanismList: [], //服务机构列表 hospitalList: [], //服务机构对应下的服务中心列表 isShowHospitalList: true, //是否显示服务中心列表 supplierIds: "", //服务中心ids,默认显示全部 servicepackageId: "", //产品id serviceDate: "", //预约的时间 hospitalId: "", //医院id supplierId: "", //选择服务中id getScheduleList: [], // 排期列表 appointmentId: "", // 追加的套餐的id }; }, created() { const { servicepackageId, id } = this.$route.query; this.servicepackageId = servicepackageId ? servicepackageId : ""; this.id = id; this.getProvinceList(); //获取省 this.getSupplierList(); //获取服务机构 // 获取门店排期 }, methods: { // 获取门店排期 getScheduleByCode(beginDate, endDate) { const query = { code: JSON.stringify(this.hospitalId), //门店编码 beginDate, //开始时间 endDate, //结束时间 supplierId: this.supplierId, //机构id chooseList: JSON.parse(window.localStorage.getItem("chooseList")), // 服务 payList: [], // 付费 servicepackageId: this.servicepackageId, // 服务包 customerId: this.id, // 客户id }; api.getScheduleByCode(query).then((res) => { if (res.content) { this.getScheduleList = res.content; } this.showDatemask = true; }); }, // 获取省 async getProvinceList() { const query = { chooseList: JSON.parse(window.localStorage.getItem("chooseList")), servicepackageId: this.servicepackageId, }; await api.getProvinceList(query).then((res) => { if (res.returnCode === "0000") { this.provinceList = res.content; } else { this.$message.error(res.returnMsg); } }); }, changeM(month) { // 根据月份查可预约 this.getScheduleByCode(month.min, month.max); console.log("下个月", month); }, // 获取市 getCityListByProvinceCode() { const query = { provinceCode: this.provinceCode, chooseList: JSON.parse(window.localStorage.getItem("chooseList")), servicepackageId: this.servicepackageId, }; api.getCityListByProvinceCode(query).then((res) => { if (res.returnCode === "0000") { this.cityList = res.content; } else { this.$message.error(res.returnMsg); } }); }, // 获取区/城市 getDistrictListByCityCode() { const query = { cityCode: this.cityCode, chooseList: JSON.parse(window.localStorage.getItem("chooseList")), servicepackageId: this.servicepackageId, }; api.getDistrictListByCityCode(query).then((res) => { if (res.returnCode === "0000") { this.areaList = res.content; } else { this.$message.error(res.returnMsg); } }); }, // 选择省 handleSelectProvince(value) { console.log(`选择省provinceCode= ${value}`); this.provinceCode = value || ""; this.cityCode = ""; this.areaCode = ""; this.getCityListByProvinceCode(); // 根据省-获取市 this.getSupplierList(); }, // 选择市 handleSelectCity(value) { console.log(`选择市CityCode= ${value}`); this.cityCode = value; this.areaCode = ""; this.getDistrictListByCityCode(); // 根据市-获取区 this.getSupplierList(); }, // 选择区 handleSelectDistrict(value) { this.areaCode = value; console.log(`选择区DistrictCode= ${value}`); this.getSupplierList(); }, // 获取服务机构 async getSupplierList() { // 测试id1043 api .getSupplierList({ servicepackageId: this.servicepackageId }) .then((res) => { if (res.returnCode == "0000") { const data = res.content; // 提取所有的服务机构ids,并用逗号隔开,比如:1004,1007 this.supplierIds = data .map(function (e, i) { return e.id; }) .join(","); this.mechanismList = [ { status: "0", supplierName: "全部", id: this.supplierIds, }, ...res.content, ]; console.log("this.supplierIds===", this.supplierIds); this.getShopByDistrictCode(); //根据服务结构-显示可选择的服务中心,默认显示全部 } else { this.$message.error(res.returnMsg); } }); }, // 选择服务机构 clickTab(index, id) { this.selectIndex = index; this.supplierIds = id; this.current = 1; // 点击选择服务机构,显示该机构下的服务中心 this.getShopByDistrictCode(); }, // 根据服务机构-获取服务中心列表 getShopByDistrictCode() { const params = { // customerSex: 'M', //性别 // customerMaritalStatus: '02', //婚姻状况 chooseList: JSON.parse(window.localStorage.getItem("chooseList")), payList: [], provinceCode: this.provinceCode, //省编号 cityCode: this.cityCode, //市编号 areaCode: this.areaCode, //区号 supplierIds: this.supplierIds, //服务机构d location: ",", //经纬度 servicepackageId: this.servicepackageId, //产品id }; api.getShopByDistrictCode(params).then((res) => { if (res.returnCode === "0000") { this.isShowHospitalList = true; this.hospitalList = res.content; console.log("数量", this.hospitalList); console.log("total"); if (res.content.length > 5) { this.pagechange(1, 5); } else { this.pageData = res.content; } console.log("根据服务机构-获取服务中心列表=", this.hospitalList); } else { this.hospitalList = 0; this.isShowHospitalList = false; // this.$message.error(res.returnMsg) } }); }, // 分页 pagechange(current, size) { var skipNum = (current - 1) * size; this.pageData = skipNum + size >= this.hospitalList.length ? this.hospitalList.slice(skipNum, this.hospitalList.length) : this.hospitalList.slice(skipNum, skipNum + size); }, // 打开日期弹框 openDatePicker(item) { if (item.isDisabled) { return; } this.supplierId = item.supplierId; this.hospitalId = item.id; this.datePickShow = true; // 查看排期 let month = moment().startOf("month").format("yyyyMM"); let start = month + "01"; let end = month + moment().daysInMonth(); this.getScheduleByCode(start, end); }, // 确认选择-"立即预约" getConfirm(val) { this.datePickShow = false; this.showDatemask = false; const _this = this; const query = { dataSource: "M", //数据来源P电脑PC ,M 手机 customerId: this.id, //客户id servicepackageId: this.servicepackageId, //套餐id checkUnitCode: JSON.stringify(this.hospitalId), //预约门店code serviceDate: this.serviceDate, //预约使用服务时间 chooseList: JSON.parse(window.localStorage.getItem("chooseList")), //选择服务列表 payList: [], supplierId: this.supplierId, //供应商id hospitalId: this.hospitalId, //医院id }; console.log("立即预约=", query); // 弹窗-"你预约的日期为:xxxxxx" this.$confirm({ title: "预约时间确认", content: `您预约的日期为: ${this.serviceDate}`, okText: "确认", cancelText: "取消", onOk() { api.addAppointment(query).then((res) => { if (res.returnCode === "0000") { _this.$message.success("预约成功"); _this.appointmentId = res.content; // 提示预约成功,之后跳转到预约详情页面 setTimeout(() => { // 需要获取用户id _this.$router.push({ name: "Detail", query: { id: _this.id, appointmentId: _this.appointmentId, }, }); }, 1000); } else { _this.$message.error(res.returnMsg); } }); }, onCancel() {}, }); }, getCancle(val) { this.datePickShow = false; this.showDatemask = false; }, dateChange(date, type) { console.log(date); if (date.length != 0) { this.serviceDate = date[0].date; } }, }, }; </script> <style lang="less" scoped> .mask { width: 100vw; height: 100vh; position: fixed; top: 0; left: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; } .institution { padding: 19.5px 14.5px 33.5px 14.5px; background-color: white; width: 760px; margin: 0 auto; font-size: 14px; color: #333; .title { .point { display: inline-block; border-radius: 5px; width: 6px; height: 6px; background-color: #3f7ffb; margin-right: 6px; position: relative; top: -1px; } .type { font-size: 14px; font-weight: bold; } .item-container { margin-top: 8.5px; } } .area_box { display: flex; justify-content: space-between; margin: 25px 0px 45px 0px; label { color: #aaa; } } .mechanism_box { display: flex; flex-wrap: wrap; margin: 25px 0px 45px 0px; align-items: center; span { display: inline-block; height: 42px; line-height: 42px; padding: 0 38px; background: #fafafa; border-radius: 4px; margin-right: 20px; } span.active { background: #d2d2d2; } } .hospital_box { margin: 25px 0px 45px 0px; li { display: flex; height: 98px; align-items: center; justify-content: space-between; background: #fafafa; padding: 28px 24px; margin-bottom: 12px; .top { font-size: 14px; color: #333; } .bottom { color: #999; font-size: 13px; } .btn { outline: none; border: none; background: linear-gradient(87deg, #ffcb00, #ffb219); width: 110px; height: 40px; border-radius: 4px; color: #fff; } .btn.disabled { background: #e2e2e2; } } } .hospital_none { text-align: center; padding: 20px; } } .ant-btn.ant-btn-primary { background: #3f7ffb; } </style>