yyghClinicMsg.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. <template>
  2. <view class="container">
  3. <view class="content" v-if="showCon">
  4. <view class="userInfoTopFixe">
  5. <userInfo :userInfo="currentUser" :type="withoutCard ? 'member' : 'card'" bgClass="bgLinGra"></userInfo>
  6. </view>
  7. <view class="content_inner" v-if="doctorItem.DoctorName">
  8. <view class="content_inner_item">
  9. <view class="doctor_item">
  10. <view class="doctor_item_nav" @click="doctorInfoClick">
  11. <view class="doctor_item_nav_img">
  12. <image :src="doctorItem.PhotoUrl || iconUrl.icon_doctor" mode="widthFix"></image>
  13. </view>
  14. <view class="doctor_item_nav_tit">
  15. <view class="doctor_item_nav_subtit">
  16. <text class="doctor_item_nav_subtit_val">{{ doctorItem.DoctorName }}</text>
  17. <text v-if="doctorItem.DoctorTitle || doctorItem.Title" class="doctor_item_nav_subtit_txt">{{ doctorItem.DoctorTitle || doctorItem.Title }}</text>
  18. </view>
  19. <view v-if="doctorItem.Spec" class="doctor_item_nav_info">
  20. {{ doctorItem.Spec }}
  21. </view>
  22. </view>
  23. </view>
  24. <view class="other_dept_box" v-if="!doctorItem.ShowDeptSwitch">
  25. <view class="displayFlexRow border_top displayFlexBetween">
  26. <text>本院所有科室排班</text>
  27. <switch color="var(--dominantColor)" class="public_switch" @change="queryScheduleList" />
  28. </view>
  29. </view>
  30. </view>
  31. </view>
  32. <view class="content_inner_item" v-for="(schedulItem, schedulIndex) in doctorItem.Scheduling" :key="schedulIndex">
  33. <view class="scheduling_dept_box displayFlexBetween" @click="foldList(schedulIndex)">
  34. <view class="scheduling_deptName_box displayFlexRow">
  35. <view class="backgroundCustom "></view>
  36. <text>{{ schedulItem.DeptName }}</text>
  37. </view>
  38. <image class="arrow" :class="{ 'transform_rotate_90': schedulItem.Check }" :src="iconUrl.icon_right"></image>
  39. </view>
  40. <block v-if="schedulItem.Check">
  41. <view class="time_list">
  42. <view v-for="(item, index) in schedulItem.Data_1" :key="index" @click="timeClick(item, index, schedulIndex)" class="time_item displayFlexCol" :class="{ 'backgroundCustom': item.ScheduleId == dateInfoSelected.ScheduleId, 'time_item_stop': item.IsHalt == 7 || item.IsHalt == 2 }">
  43. <view>{{ item.RegDateDiy }}</view>
  44. <view style="margin-top: 12upx;">{{ item.WeekName }} {{ item.TimeSliceStr }}</view>
  45. <image v-if="item.IsHalt == 7" class="time_item_img" :src="iconUrl.full2"></image>
  46. <image v-if="item.IsHalt == 2" class="time_item_img" :src="iconUrl.stop"></image>
  47. <image v-if="item.IsHalt == 7 && item.WaitLeaveCount > 0" class="time_item_img" :src="iconUrl.yyghWait"></image>
  48. </view>
  49. </view>
  50. <view class="content_inner_item_tit">
  51. <view style="margin-right: 18upx;">诊查费:
  52. <text class="colorCustom_F08">{{ (dateInfoSelected.RegFee - 0) / 100 }}元</text>
  53. </view>
  54. <view v-if="numberList.length > 0">剩余号源数
  55. <text class="colorCustom_F08"> {{ numberList.length }}</text>
  56. </view>
  57. </view>
  58. <!-- 候补 -->
  59. <block v-if="dateInfoSelected.IsHalt == 7 && dateInfoSelected.WaitStatus == 1">
  60. <view class="wait_con">
  61. <view class="wait_head_con">
  62. <view class="wait_head">当前排班支持候补登记,剩余候补名额{{ dateInfoSelected.WaitLeaveCount }}个</view>
  63. </view>
  64. <view class="wait_list">
  65. <view class="wait_item">1、当医生排班标识为“候补”状态时,表明该医生当前 排班已被约满,但支持候补登记,而且当前尚存在候补 名额;</view>
  66. <view class="wait_item">2、当约满排班存在候补名额时,患者可进行候补登记,系统将根据补登记时间自动生成候补队列次序;</view>
  67. <view class="wait_item">3、候补登陆成功后,如果在候补截止期前,出现预约 成功患者退号,则系统将根据候补队列次序,为候补者 自动完成预约挂号,并短信通知候补者如期就诊;
  68. </view>
  69. <view class="wait_item">4、用户可在“我的”-“候补记录”中,取消候补登记。</view>
  70. </view>
  71. </view>
  72. <view class="public_btn" :class="dateInfoSelected.WaitLeaveCount > 0 ? 'backgroundCustom' : 'backgroundCustom_D9'" @click="waitRegistration">候补登记</view>
  73. </block>
  74. <block v-else>
  75. <!-- 方块 -->
  76. <view class="number_list" v-if="pageConfig.numberType == 1">
  77. <view class="number_item" :class="{ 'backgroundCustom': item.SourceCode == numberInfoSelected.SourceCode && item.CommendTime == numberInfoSelected.CommendTime }" v-for="(item, index) in numberList" :key="index" @click="numberClick(index)">
  78. <view>{{ item.SqNo ? item.SqNo + '号' : '' }}</view>
  79. <view class="number_item_time">{{ item.StartTime ? item.StartTime : item.StartTime + '-' + item.EndTime }}</view>
  80. </view>
  81. </view>
  82. <!-- 列表 -->
  83. <view class="number_list_sec" v-else>
  84. <view class="number_item_sec border_top" v-for="(item, index) in numberList" :key="index" @click="numberClick(index)">
  85. <view class="flexCenter">
  86. <image class="circle" :src="item.SourceCode == numberInfoSelected.SourceCode && item.CommendTime == numberInfoSelected.CommendTime ? iconUrl.circle_active : iconUrl.circle"></image>
  87. {{ item.EndTime ? item.StartTime + '-' + item.EndTime : item.StartTime }}
  88. </view>
  89. <view class="number_item_time">余号:{{ dateInfoSelected.LeaveCount }}</view>
  90. </view>
  91. </view>
  92. <view class="public_btn" :class="numberList.length > 0 ? 'backgroundCustom_F08' : 'backgroundCustom_D9'" @click="confirmClick">立即预约</view>
  93. </block>
  94. </block>
  95. </view>
  96. </view>
  97. </view>
  98. <view v-if="showNoData" class="noData">
  99. <noData :value="noDataValue"></noData>
  100. </view>
  101. <overduePerson :currentUser="currentUser" BusinessType="1101"></overduePerson>
  102. <doctorInfo :doctorInfoIsShow="doctorInfoIsShow" :doctorInfo="doctorInfo"></doctorInfo>
  103. <!-- AI数智客服入口-->
  104. <aiCustomerEntry :currentUser="currentUser"></aiCustomerEntry>
  105. </view>
  106. </template>
  107. <script setup lang="ts">
  108. import { ref, reactive, toRefs } from 'vue';
  109. import { onShow } from '@dcloudio/uni-app';
  110. import { common, pagesPatientFn, publicFn } from '@/utils';
  111. import icon from '@/utils/icon';
  112. import { REQUEST_CONFIG } from '@/config';
  113. import {
  114. queryClinicBaseDoctor,
  115. queryNumbers,
  116. queryClinicDoctorSchedule,
  117. lockOrder,
  118. bookService,
  119. unlock,
  120. queryScheduleList,
  121. checkBeforeAddWaitList
  122. } from '@/pagesPatient/service/yygh';
  123. import { addOrderLocal } from '@/pagesPatient/service/pay';
  124. import { useGetMember } from '@/utils/hooks/useGetMember';
  125. const app = getApp();
  126. const iconUrl = ref(icon);
  127. const withoutCard = ref(false); //是否可以无卡预约
  128. const noDataValue = ref('当前医生暂无排班'); //医生是否有排班
  129. const doctorItem = ref<any>({});
  130. const dateInfoSelected = ref<any>({}); //当前选择的排班时间
  131. const showCon = ref(false);
  132. const showNoData = ref(false);
  133. const numberList = ref<any[]>([]); //预约时段
  134. const numberInfoSelected = ref<any>({}); //当前选中的预约时段
  135. const currentUser = ref<any>({});
  136. const doctorInfoIsShow = ref(false);
  137. const doctorInfo = ref<any>({}); //医生详情信息
  138. const doctorListConfig = ref<any>({}); //医生列表页配置
  139. const serviceId = ref('');
  140. const options = ref<any>({});
  141. const queryBean = ref<any>({});
  142. const pageConfig = ref<any>({});
  143. const reducibleOnly = ref(false);
  144. onLoad(async (opt: any) => {
  145. let qBean = app.globalData.queryBean || {};
  146. /**医生列表页配置 */
  147. let dListConfig = common.deepCopy(app.globalData.config.pageConfiguration.yyghDoctorList_config);
  148. /**当前页面配置 */
  149. let pConfig = common.deepCopy(app.globalData.config.pageConfiguration.yyghClinicMsg_config);
  150. let dInfoSelected = {};
  151. /**通过上级页面传的item和点击的排班Index 取到当前点击的排班时间 如果是从预约挂号页面进来的 则取挂号排班时间*/
  152. if (opt?.schedule) {
  153. dInfoSelected = common.parse(opt?.schedule);
  154. } else if (qBean.Data_1 && opt.selectedIndex) {
  155. dInfoSelected = qBean.Data_1[opt.selectedIndex];
  156. }
  157. opt?.deptCode && (qBean.DeptCode = opt?.deptCode);
  158. opt?.doctorCode && (qBean.DoctorCode = opt?.doctorCode);
  159. options.value = opt;
  160. serviceId.value = opt.serviceId || '';
  161. queryBean.value = qBean;
  162. dateInfoSelected.value = dInfoSelected;
  163. doctorListConfig.value = dListConfig;
  164. pageConfig.value = pConfig;
  165. withoutCard.value = app.globalData.withoutCard;
  166. });
  167. useOnShow(() => {
  168. main();
  169. });
  170. const main = async () => {
  171. currentUser.value = app.globalData.currentUser;
  172. let sNoData = true;
  173. /**获取医生信息 */
  174. await setterDoctorList();
  175. if (!common.isEmpty(doctorItem.value)) {
  176. sNoData = false;
  177. /**获取预约时间段 */
  178. await queryNumbersFn();
  179. }
  180. showCon.value = true;
  181. showNoData.value = sNoData;
  182. };
  183. /**
  184. * 医生详情点击
  185. */
  186. const doctorInfoClick = async () => {
  187. let dItem = doctorItem.value;
  188. let queryData = {
  189. HosId: app.globalData.districtId || app.globalData.hosId,
  190. DeptCode: dItem.DeptCode || '',
  191. DoctorCode: dItem.DoctorCode || '',
  192. DoctorName: ''
  193. };
  194. let resp = await queryClinicBaseDoctor(queryData);
  195. if (!common.isEmpty(resp)) {
  196. doctorInfoIsShow.value = true;
  197. doctorInfo.value = resp[0];
  198. }
  199. };
  200. /**
  201. * 预约时段点击
  202. */
  203. const numberClick = (index: number) => {
  204. numberInfoSelected.value = numberList.value[index];
  205. };
  206. /**
  207. * 日期选择
  208. */
  209. const timeClick = (item: any, index: number, schedulIndex: number) => {
  210. if ((item.IsHalt == 7 && item.WaitLeaveCount <= 0) || item.IsHalt == '2') {
  211. return;
  212. }
  213. numberList.value = [];
  214. dateInfoSelected.value = item;
  215. // 判断不等于约满或者不等于停诊查询号源
  216. if (item.IsHalt != 7 && item.IsHalt != '2') {
  217. queryNumbersFn();
  218. }
  219. };
  220. /**
  221. * 获取号源列表
  222. */
  223. const queryNumbersFn = async () => {
  224. let dInfoSelected = dateInfoSelected.value;
  225. let queryData = {
  226. HosId: app.globalData.districtId || app.globalData.hosId,
  227. DeptCode: dInfoSelected.DeptCode,
  228. DoctorCode: dInfoSelected.DoctorCode,
  229. RegDate: dInfoSelected.RegDate,
  230. TimeSlice: dInfoSelected.TimeSlice,
  231. ScheduleId: dInfoSelected.ScheduleId,
  232. TransactionCode: 2002,
  233. };
  234. let nList = await queryNumbers(queryData);
  235. let nInfoSelected = {};
  236. if (!common.isEmpty(options.value?.number)) {
  237. nInfoSelected = common.parse(options.value?.number);
  238. } else {
  239. nInfoSelected = nList && nList[0] || {};
  240. }
  241. numberList.value = nList || [];
  242. numberInfoSelected.value = nInfoSelected; //默认选中第一个号源
  243. };
  244. /**
  245. * 处理医生列表返回值
  246. */
  247. const setterDoctorList = async () => {
  248. let qBean = queryBean.value;
  249. let dInfoSelected = dateInfoSelected.value;
  250. let hasAllSchedules = doctorListConfig.value.hasAllSchedules;
  251. let queryData: any = {
  252. HosId: app.globalData.districtId || app.globalData.hosId,
  253. DeptCode: qBean.DeptCode,
  254. DoctorCode: qBean.DoctorCode,
  255. WorkDateStart: hasAllSchedules ? "" : dInfoSelected.RegDate,
  256. WorkDateEnd: hasAllSchedules ? "" : dInfoSelected.RegDate,
  257. TitleCode: "",
  258. OrderByDoc: '1',
  259. WaitRule: '1'
  260. };
  261. // 判断为当日挂号
  262. if (serviceId.value == '009') {
  263. queryData.WorkDateStart = common.getDate();
  264. queryData.WorkDateEnd = common.getDate();
  265. queryData.ServiceId = serviceId.value;
  266. }
  267. let resp = await queryClinicDoctorSchedule(queryData);
  268. if (!common.isEmpty(resp)) {
  269. let dItem = resp[0];
  270. /**如果医生头像没有域名 添加域名 */
  271. if (dItem.PhotoUrl && dItem.PhotoUrl.indexOf('http') == '-1') {
  272. dItem.PhotoUrl = REQUEST_CONFIG.BASE_URL + dItem.PhotoUrl;
  273. }
  274. if (dItem.PhotoUrl) {
  275. dItem.PhotoUrl = dItem.PhotoUrl.replace(/\\/g, '/');
  276. }
  277. dItem.Data_1.map((item: any) => {
  278. item.RegDateDiy = item.RegDate.substring(5);
  279. item.WeekName = item.RegDate == common.newDay() ? '今天' : item.WeekName;
  280. item.DeptName = dItem.DeptName;
  281. item.DeptCode = dItem.DeptCode;
  282. item.DoctorName = dItem.DoctorName;
  283. item.DoctorCode = dItem.DoctorCode;
  284. });
  285. // 数据处理 医生多科室
  286. let obj = [{
  287. Check: true,
  288. DeptName: dItem.DeptName,
  289. DeptCode: dItem.DeptCode,
  290. DoctorName: dItem.DoctorName,
  291. DoctorCode: dItem.DoctorCode,
  292. Data_1: dItem.Data_1,
  293. }];
  294. dItem.Scheduling = obj;
  295. /**重新赋值当前项 否则提交订单后后退不刷新值 */
  296. let dInfoSelectedNew = resp.filter((item: any) => item && item.ScheduleId == dateInfoSelected.value.ScheduleId)[0] || dateInfoSelected.value;
  297. doctorItem.value = dItem;
  298. /**历史医生进入 无ScheduleId 重新赋值 */
  299. dateInfoSelected.value = dateInfoSelected.value.ScheduleId ? dInfoSelectedNew : dItem && dItem.Data_1 && dItem.Data_1[0] || {};
  300. }
  301. };
  302. const switchChange = (e: any) => {
  303. let value = e.detail.value;
  304. reducibleOnly.value = value;
  305. main();
  306. };
  307. /**
  308. * 立即预约点击
  309. */
  310. const confirmClick = async (e: any) => {
  311. // 注意:Vue 中没有 formId
  312. let formId = ''; // e.detail.formId
  313. let dInfoSelected = dateInfoSelected.value;
  314. let nInfoSelected = numberInfoSelected.value;
  315. let dItem = doctorItem.value;
  316. // 查询当前用户 是否被授权
  317. if (await publicFn.isCurrentUserAuth(currentUser.value, 'Book', true)) return;
  318. /**是否存在待支付订单 */
  319. if (await pagesPatientFn.hasOrderToBePaid('0,009')) return;
  320. common.throttle(async () => {
  321. if (common.isEmpty(dateInfoSelected.value)) {
  322. common.showToast('请选择预约日期');
  323. return;
  324. }
  325. if (common.isEmpty(numberInfoSelected.value)) {
  326. common.showToast('请选择预约时间');
  327. return;
  328. }
  329. /**锁号 */
  330. let queryData: any = {
  331. HosId: app.globalData.districtId || app.globalData.hosId,
  332. ScheduleId: dInfoSelected.ScheduleId,
  333. DeptCode: dInfoSelected.DeptCode,
  334. DoctorCode: dInfoSelected.DoctorCode,
  335. RegType: '1',
  336. RegDate: dInfoSelected.RegDate,
  337. TimeSlice: dInfoSelected.TimeSlice,
  338. SqNo: nInfoSelected.SqNo,
  339. CommendTime: nInfoSelected.EndTime ? `${nInfoSelected.StartTime}-${nInfoSelected.EndTime}` : nInfoSelected.StartTime,
  340. SourceCode: nInfoSelected.SourceCode,
  341. MemberId: currentUser.value.memberId,
  342. CardType: '1',
  343. CardNo: currentUser.value.cardNo || '',
  344. MemberStore: {
  345. cardEncryptionStore: currentUser.value.encryptionStore || '',
  346. baseMemberEncryptionStore: currentUser.value.baseMemberEncryptionStore
  347. },
  348. Store: {
  349. cardEncryptionStore: currentUser.value.encryptionStore || '',
  350. baseMemberEncryptionStore: currentUser.value.baseMemberEncryptionStore
  351. }
  352. };
  353. let lockResp = await lockOrder(queryData);
  354. if (!common.isEmpty(lockResp)) {
  355. /**锁号成功 */
  356. /**本地下单 */
  357. let addorderData = {
  358. HosId: app.globalData.hosId,
  359. OrderId: lockResp[0].OrderId,
  360. PrescNo: '',
  361. PayMoney: lockResp[0].Fee,
  362. TotalMoney: lockResp[0].Fee,
  363. IsOnlinePay: lockResp[0].IsOnlinePay,
  364. PriceName: '挂号支付',
  365. OperatorId: uni.getStorageSync('openid'),
  366. ServiceId: '0',
  367. PayFeeItem: '0',
  368. EqptType: '1',
  369. BankCardNo: '',
  370. BankSeqNo: '',
  371. ChargeSource: '',
  372. MemberId: currentUser.value.memberId,
  373. OperatorName: currentUser.value.MemberName,
  374. Store: {
  375. cardEncryptionStore: currentUser.value.encryptionStore || '',
  376. baseMemberEncryptionStore: currentUser.value.baseMemberEncryptionStore
  377. },
  378. Data_1: {
  379. DoctorCode: dInfoSelected.DoctorCode || dItem.DoctorCode,
  380. DoctorName: dInfoSelected.DoctorName || dItem.DoctorName,
  381. DeptCode: dInfoSelected.DeptCode || dItem.DeptCode,
  382. DeptName: dInfoSelected.DeptName || dItem.DeptName,
  383. RegDate: dInfoSelected.RegDate,
  384. CommendTime: nInfoSelected.CommendTime,
  385. scene_id: formId,
  386. FeeInfo: lockResp[0].FeeInfo,
  387. scene_type: '1',
  388. TransactionCode: '6001'
  389. }
  390. };
  391. let addOrderResp = await addOrderLocal(addorderData);
  392. if (!common.isEmpty(addOrderResp)) {
  393. /**本地下单成功 */
  394. let url = `/pagesPatient/st1/business/pay/payState/payState?pageType=yygh&orderId=${lockResp[0].OrderId}`;
  395. if (lockResp[0].IsOnlinePay == '1') {
  396. /**在线支付 */
  397. url = `/pagesPatient/st1/business/pay/payMent/payMent?orderId=${lockResp[0].OrderId}`;
  398. } else if (lockResp[0].IsOnlinePay == '2') {
  399. /**不支付 boockService挂号 */
  400. let queryData = {
  401. HosId: app.globalData.districtId || app.globalData.hosId,
  402. OrderId: lockResp[0].OrderId,
  403. OperatorId: uni.getStorageSync('openid'),
  404. TransactionCode: "3003",
  405. MemberId: currentUser.value.memberId,
  406. SourceType: 0,
  407. Store: {
  408. cardEncryptionStore: currentUser.value.encryptionStore || '',
  409. baseMemberEncryptionStore: currentUser.value.baseMemberEncryptionStore
  410. },
  411. };
  412. let { resp, resData } = await yygh.bookService(queryData);
  413. if (resData.RespCode != 10000) {
  414. await yygh.unlock({ OrderId: lockResp[0].OrderId });
  415. return;
  416. }
  417. }
  418. common.goToUrl(url);
  419. }
  420. }
  421. });
  422. };
  423. /**
  424. * 查询医生其它科室排班
  425. */
  426. const queryScheduleList = async (e: any) => {
  427. let hasAllSchedules = doctorListConfig.value.hasAllSchedules;
  428. let dInfoSelected = dateInfoSelected.value;
  429. let dItem = doctorItem.value;
  430. let querData = {
  431. workDateEnd: hasAllSchedules ? "" : dInfoSelected.RegDate,
  432. workDateStart: hasAllSchedules ? "" : dInfoSelected.RegDate,
  433. doctorCode: dItem.DoctorCode,
  434. deptCode: dItem.DeptCode,
  435. hosId: app.globalData.districtId || app.globalData.hosId,
  436. WaitRule: '1'
  437. };
  438. let res = await queryScheduleList(querData);
  439. if (common.isNotEmpty(res)) {
  440. let scheduleList: any[] = [];
  441. res.map(async (item: any, index: number) => {
  442. // 转换返回数据 小写转大写
  443. item.hisQueryClinicSchedules = common.changeObj(item.hisQueryClinicSchedules);
  444. item.hisQueryBaseDoctor = common.changeObj(item.hisQueryBaseDoctor);
  445. if (item.hisQueryClinicSchedules.length > 0) {
  446. // 判断是否多数据处理 星期 时间 上下午
  447. if (item.hisQueryClinicSchedules.length > 0) {
  448. item.hisQueryClinicSchedules.map((ele: any) => {
  449. ele.WeekName = ele.RegDate == common.newDay() ? '今天' : common.weekDay(ele.RegDate, 1);
  450. ele.RegDateDiy = ele.RegDate.substring(5);
  451. ele.TimeSliceStr = ele.TimeSlice == 1 ? '上午' : ele.TimeSlice == 2 ? '下午' : '全天';
  452. });
  453. }
  454. scheduleList.push({
  455. Check: item.hisQueryBaseDoctor.DeptCode == dItem.DeptCode ? true : false,
  456. DeptName: item.hisQueryBaseDoctor.DeptName,
  457. DeptCode: item.hisQueryBaseDoctor.DeptCode,
  458. DoctorName: dItem.DoctorName,
  459. DoctorCode: dItem.DoctorCode,
  460. Data_1: item.hisQueryClinicSchedules,
  461. showAllSchedu: item.showAllSchedu,
  462. });
  463. }
  464. });
  465. // 给当前查询的医生新加列表
  466. dItem.Scheduling = scheduleList;
  467. }
  468. // 查询过的医生 不展示switch
  469. dItem.ShowDeptSwitch = true;
  470. doctorItem.value = dItem;
  471. };
  472. /**
  473. * 折叠列表
  474. */
  475. const foldList = (schedulIndex: number) => {
  476. let dItem = doctorItem.value;
  477. // 当前点击的科室是打开的状态,则进行关闭,不查号源
  478. if (dItem.Scheduling[schedulIndex].Check) {
  479. dItem.Scheduling[schedulIndex].Check = false;
  480. doctorItem.value = dItem;
  481. } else {
  482. let dInfoSelected = {};
  483. // 全部遍历关闭展开数据信息
  484. dItem.Scheduling.map((item: any) => item.Check = false);
  485. // 当前打开
  486. dItem.Scheduling[schedulIndex].Check = true;
  487. // 过滤当前打开的排班信息 获取到未满未停诊的排班
  488. let dateInfoSelecteds = dItem.Scheduling[schedulIndex].Data_1.filter((item: any) => item.IsHalt != '7' || item.IsHalt != '2');
  489. // 判断过滤条件是否为空 为空踢提示
  490. if (common.isEmpty(dateInfoSelecteds)) {
  491. common.showToast("查询号源失败,请选择一个排班信息");
  492. } else {
  493. // 否者查询号源
  494. dInfoSelected = dateInfoSelecteds[0];
  495. }
  496. dateInfoSelected.value = dInfoSelected;
  497. doctorItem.value = dItem;
  498. queryNumbersFn();
  499. }
  500. };
  501. // 候补登记
  502. const waitRegistration = async () => {
  503. let cUser = currentUser.value;
  504. let dInfoSelected = dateInfoSelected.value;
  505. let dItem = doctorItem.value;
  506. if (dInfoSelected.WaitLeaveCount <= 0) return;
  507. let queryData = {
  508. HosId: app.globalData.districtId || app.globalData.hosId,
  509. OpenId: uni.getStorageSync("openid"),
  510. MemberId: cUser.memberId,
  511. ScheduleId: dInfoSelected.ScheduleId,
  512. DeptCode: dItem.DeptCode,
  513. DoctorCode: dItem.DoctorCode,
  514. RegDate: dInfoSelected.RegDate,
  515. WeekId: dInfoSelected.WeekId,
  516. TimeId: dInfoSelected.TimeSlice,
  517. Store: {
  518. cardEncryptionStore: cUser.encryptionStore || '',
  519. baseMemberEncryptionStore: cUser.baseMemberEncryptionStore
  520. }
  521. };
  522. let { resp, resData } = await checkBeforeAddWaitList(queryData);
  523. if (resData.RespCode == '10000') {
  524. dItem.Intro = '';
  525. dItem.Data_1 = '';
  526. dItem.Scheduling = '';
  527. let querBen = encodeURIComponent(JSON.stringify({
  528. doctorItem: dItem,
  529. dateInfoSelected: dInfoSelected
  530. }));
  531. common.goToUrl(`/pagesPatient/st1/business/yygh/waitRegistration/waitRegistration?querBen=${querBen}`);
  532. }
  533. };
  534. </script>
  535. <style scoped>
  536. .container {
  537. /* background-color: #F8F8F8; */
  538. min-height: 100vh;
  539. }
  540. .content_inner {
  541. padding: 200upx 30upx 0;
  542. display: inline-block;
  543. width: 100%;
  544. }
  545. .content_inner_item {
  546. margin: 30upx 0;
  547. padding: 30upx 0;
  548. border-radius: 24upx;
  549. background: #fff;
  550. overflow: hidden;
  551. }
  552. .content_inner_item_tit {
  553. height: 110upx;
  554. display: flex;
  555. align-items: center;
  556. padding: 0 30upx;
  557. font-size: 32upx;
  558. }
  559. .doctor_item {
  560. padding: 0 30upx;
  561. }
  562. .doctor_item_nav {
  563. display: flex;
  564. position: relative;
  565. padding: 20upx 0;
  566. }
  567. .doctor_item_nav_img {
  568. width: 110upx;
  569. height: 103upx;
  570. border-radius: 50%;
  571. margin-right: 23upx;
  572. overflow: hidden;
  573. }
  574. .doctor_item_nav_tit {
  575. width: 82%;
  576. }
  577. .doctor_item_nav_subtit_val {
  578. font-size: 32upx;
  579. font-family: PingFang SC;
  580. font-weight: 800;
  581. color: #222326;
  582. margin-right: 12upx;
  583. }
  584. .doctor_item_nav_subtit_txt {
  585. height: 36upx;
  586. line-height: 28upx;
  587. font-size: 24upx;
  588. font-family: PingFang SC;
  589. color: var(--auxiliaryColor);
  590. padding: 0upx 7upx;
  591. position: relative;
  592. display: inline-block;
  593. background: #FFFBF4;
  594. border: 1upx solid #FADAB2;
  595. }
  596. .doctor_item_nav_info {
  597. font-size: 28upx;
  598. font-family: Source Han Sans CN;
  599. font-weight: 500;
  600. color: #62626D;
  601. line-height: 40upx;
  602. margin-top: 10upx;
  603. overflow: hidden;
  604. text-overflow: ellipsis;
  605. display: -webkit-box;
  606. -webkit-line-clamp: 2;
  607. line-clamp: 2;
  608. -webkit-box-orient: vertical;
  609. }
  610. .time_list {
  611. display: flex;
  612. flex-wrap: wrap;
  613. align-items: center;
  614. padding: 0 30upx;
  615. }
  616. .time_item {
  617. margin: 23upx 2% 0 0;
  618. width: 32%;
  619. height: 110upx;
  620. line-height: 110upx;
  621. background: #F1F1F6;
  622. border-radius: 20upx;
  623. font-size: 28upx;
  624. color: #222326;
  625. text-align: center;
  626. position: relative;
  627. }
  628. .time_item:nth-child(3n){
  629. margin-right: 0;
  630. }
  631. .time_item_img {
  632. width: 61upx;
  633. height: 54upx;
  634. position: absolute;
  635. right: 0;
  636. top: 0;
  637. }
  638. .time_item_stop view{
  639. color: #8A8A99;
  640. }
  641. .price {
  642. font-size: 32upx;
  643. color: #fa4844;
  644. }
  645. .subtit {
  646. color: #a6a6a6;
  647. font-size: 28upx;
  648. }
  649. .number_list {
  650. display: flex;
  651. align-items: center;
  652. flex-wrap: wrap;
  653. padding: 0 30upx 12upx;
  654. -webkit-overflow-scrolling: touch;
  655. }
  656. .number_item {
  657. font-size: 28upx;
  658. font-family: PingFang SC;
  659. font-weight: 500;
  660. color: #43434A;
  661. width: 23%;
  662. height: 110upx;
  663. margin: 0 2.5% 22upx 0;
  664. background: #F1F1F6;
  665. border-radius: 20upx;
  666. display: flex;
  667. flex-direction: column;
  668. align-items: center;
  669. justify-content: center;
  670. }
  671. .number_item:nth-child(4n){
  672. margin-right: 0;
  673. }
  674. .number_item_time {
  675. margin-top: 6upx;
  676. text-align: center;
  677. }
  678. /* 列表号源 */
  679. .number_list_sec{
  680. -webkit-overflow-scrolling: touch;
  681. }
  682. .number_item_sec {
  683. display: flex;
  684. align-items: center;
  685. justify-content: space-between;
  686. padding: 0 30upx;
  687. height: 100upx;
  688. font-size: 32upx;
  689. color: rgba(85, 85, 85, 1);
  690. }
  691. .circle {
  692. margin-right: 22upx;
  693. width: 42upx;
  694. height: 42upx;
  695. }
  696. .border:before{
  697. border-radius: 0;
  698. }
  699. /* 查询 switch*/
  700. .other_dept_box view {
  701. width: 100%;
  702. padding-top: 28upx ;
  703. margin-top: 23upx;
  704. box-sizing: border-box;
  705. justify-content: space-between;
  706. }
  707. .other_dept_box view text {
  708. font-size: 32upx;
  709. color: #333;
  710. }
  711. /* 多科室 */
  712. .scheduling_dept_box {
  713. margin: 8upx 0 12upx;
  714. padding-left: 30upx;
  715. }
  716. .scheduling_deptName_box view {
  717. width: 14upx;
  718. height: 14upx;
  719. border-radius: 14upx;
  720. margin-right: 20upx;
  721. }
  722. .scheduling_deptName_box text {
  723. font-size: 32upx;
  724. color: #333;
  725. }
  726. .scheduling_dept_box image {
  727. transform: rotate(270deg);
  728. }
  729. .scheduling_list {
  730. flex-wrap: wrap;
  731. justify-content: flex-start;
  732. }
  733. .transform_rotate_90 {
  734. transform: rotate(90deg) !important;
  735. }
  736. .transform_rotate_180 {
  737. transform: rotate(180deg) !important;
  738. }
  739. .public_btn{
  740. margin: 0 30upx;
  741. height: 88upx;
  742. line-height: 88upx;
  743. }
  744. /* 候补 */
  745. .wait_con{
  746. padding:0 30upx;
  747. }
  748. .wait_head {
  749. margin: 0 auto;
  750. background: #f8f4ea;
  751. border-radius: 10upx 10upx 0px 0px;
  752. padding: 30upx 45upx;
  753. font-size: 30upx;
  754. font-family: PingFang SC;
  755. color: #d18e09;
  756. line-height: 40upx;
  757. position: relative;
  758. transform-style: preserve-3d;
  759. }
  760. .wait_head::before,
  761. .wait_head::after {
  762. content: "";
  763. display: block;
  764. width: 16upx;
  765. height: 16upx;
  766. border-radius: 50px;
  767. background-color: #f6e8ce;
  768. position: absolute;
  769. bottom: 0;
  770. transform: translateZ(-1px);
  771. }
  772. .wait_head::before {
  773. left: -8upx;
  774. }
  775. .wait_head::after {
  776. right: -8upx;
  777. }
  778. .wait_list {
  779. padding: 20upx 0;
  780. background-color: #fff;
  781. }
  782. .wait_item {
  783. font-size: 28upx;
  784. font-family: PingFang SC;
  785. color: #999;
  786. line-height: 54upx;
  787. }
  788. </style>