supplement.vue 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044
  1. <template>
  2. <view class="container" v-if="showCon">
  3. <view class="content pb150">
  4. <!-- 医生信息 -->
  5. <view class="user p_flexCenter" v-if="serviceType !== 'tdwz'">
  6. <image class="user_img" :src="queryBean.DoctorPhotourl"></image>
  7. <view class="user_box p_flexBetween">
  8. <view class="user_con p_flexCenter">
  9. <view class="user_name">{{ queryBean.DoctorName }}</view>
  10. <view class="user_tip">{{ queryBean.DeptName }} {{ queryBean.TitleName }}</view>
  11. </view>
  12. </view>
  13. </view>
  14. <!-- 团队问诊 -->
  15. <view v-if="serviceType == 'tdwz'" class="group_box displayFlexCol">
  16. <text class="group_title">{{ queryBean.GroupName }}</text>
  17. <view class="group_introduce">
  18. <text>擅长:</text>
  19. <text>{{ queryBean.GroupSkill }}</text>
  20. </view>
  21. </view>
  22. <!-- 就诊人信息 -->
  23. <view class="block">
  24. <view class="member p_flexBetween">
  25. <view class="member_con">
  26. <view class="member_info_con p_flexCenter">
  27. <view class="member_name">{{ currentUser.MemberName || currentUser.memberName }}</view>
  28. <view class="member_info">{{ currentUser.Sex == 1 || currentUser.sex == 1 ? '男' : '女' }} {{ currentUser.Age || currentUser.age }}岁</view>
  29. </view>
  30. <view class="member_id p_color_6">身份证号:{{ currentUser.CertNum || currentUser.certNum }}</view>
  31. </view>
  32. <view class="member_btn p_bgcolor p_flexCenter" @click="selectMember">换个就诊人</view>
  33. </view>
  34. <!-- 是否初诊 -->
  35. <view class="info p_format">
  36. <view class="info_box p_flexBetween p_border_top">
  37. <view class="info_tit">是否初诊</view>
  38. <view class="radios p_flexCenter">
  39. <view
  40. class="radio_item p_flexCenter"
  41. :class="followUp ? 'p_color_6' : 'p_color_9'"
  42. @click="diagnosisClick('other')"
  43. >
  44. <image class="radio_item_img" :src="diagnosisType == 'other' && !isFirstVisit ? iconUrl.circle_active : iconUrl.circle"></image>
  45. 复诊
  46. </view>
  47. </view>
  48. </view>
  49. </view>
  50. <!-- 问诊目的 -->
  51. <view class="info">
  52. <view class="info_box p_border_top p_flexBetween" @click="purSelect">
  53. <view class="info_tit">本次问诊目的</view>
  54. <view class="info_val_con p_flexBetween">
  55. <view class="info_val p_color_9">{{ purSelected.tit || '选择本次问诊目的' }}</view>
  56. <image class="info_right" :src="iconUrl.home_right"></image>
  57. </view>
  58. </view>
  59. <!-- 处方信息 -->
  60. <view class="info_box p_border_top" v-if="diagnosisType == 'other' && (purSelected.key == 'yyzx' || purSelected.key == 'fzxf')">
  61. <view class="info_box_inner p_flexBetween" @click="prescSelect">
  62. <view class="info_tit">处方信息<text class="info_subtit p_color_9">(可选项)</text></view>
  63. <view class="info_val_con p_flexBetween">
  64. <view class="info_val p_color_9">选择处方记录</view>
  65. <image class="info_right" :src="iconUrl.home_right"></image>
  66. </view>
  67. </view>
  68. <view class="info_pres" v-if="recSelected.HisOrderId">
  69. <view class="info_pres_con p_flexBetween">
  70. <view class="info_pres_inner p_flexCenter">
  71. <view class="info_pres_time p_color_9">{{ recSelected.Registerdate }}</view>
  72. <view class="info_pres_tit">{{ recSelected.DeptName }} {{ recSelected.DoctorName }}</view>
  73. <view class="info_pres_subtit p_color_6"><text class="report_item_val_titval">诊断:</text>{{ recSelected.Diagnosis }}</view>
  74. </view>
  75. <view class="info_pres_detailbtn p_bgcolor p_flexCenter" @click="setVal('showPrescDetailDialog', true)">查看详情
  76. <image class="info_doctor_arrow" :src="iconUrl.doctor_arrow_bottomf"></image>
  77. </view>
  78. </view>
  79. <view class="info_pres_btns p_flexCenter p_border_top">
  80. <view class="info_pres_btn p_flexCenter p_border p_color" @click="prescSelect">重新选择</view>
  81. <view class="info_pres_btn p_flexCenter p_border p_color" @click="clearPur">清空处方</view>
  82. </view>
  83. </view>
  84. </view>
  85. <!-- 咨询时间 -->
  86. <view class="info_box p_flexBetween p_border_top" @click="consultSelect">
  87. <view class="info_tit">咨询时间<text class="info_subtit p_color_9">(必选项)</text></view>
  88. <view class="info_val_con p_flexBetween">
  89. <view class="info_val p_color" v-if="!consultDate.Data_1">{{ earlyTime }}</view>
  90. <view class="info_val p_color" v-else>
  91. {{ consultDate.Data_1[consultDateIndSelected]?.RegDate }}
  92. {{ consultTimeList[consultTimeIndSelected]?.CommendTime }}
  93. </view>
  94. <image class="info_right" :src="iconUrl.home_right"></image>
  95. </view>
  96. </view>
  97. </view>
  98. </view>
  99. <!-- 病情采集 -->
  100. <view class="block">
  101. <view class="info">
  102. <view class="info_box p_border_bottom">
  103. <view class="info_box_inner p_flexBetween">
  104. <view class="info_tit">病情采集<text class="info_subtit p_color_9">(必选项)</text></view>
  105. </view>
  106. </view>
  107. <view class="info_box" style="padding-top: 30upx;" v-if="!illness.MedicalInfo">
  108. <textarea
  109. class="info_box_textarea"
  110. :disabled="disabledArea"
  111. placeholder-class="placeholder"
  112. auto-height
  113. maxlength="200"
  114. placeholder="请详细描述您的症状、疾病、身体状况等,越详细越好,便于医生更准确得为您分析解答..."
  115. @input="inputVal"
  116. :data-key="'illnessInfo'"
  117. :value="illnessInfo"
  118. ></textarea>
  119. <view class="text_tip_box p_flexBetween">
  120. <view class="text_tip p_border p_flexCenter p_color" @click="setVal('showExampleDialog', true)">查看示例</view>
  121. <view class="text_num p_color_9"><text class="p_color_3">{{ illnessInfo?.length || 0 }}</text>/200</view>
  122. </view>
  123. </view>
  124. </view>
  125. </view>
  126. <!-- 添加图片 -->
  127. <view class="block">
  128. <view class="info">
  129. <view class="info_box">
  130. <view class="info_tit">添加图片<text class="info_subtit p_color_9">(可选项,图片不超过8张)</text></view>
  131. <view class="coll_con">
  132. <view class="coll_img_con p_flexBetween" v-if="imgList.length > 0">
  133. <view
  134. class="coll_con_img_box"
  135. v-for="(item, index) in imgList"
  136. :key="index"
  137. @click="showImg(index)"
  138. >
  139. <image class="coll_con_img" :src="item" mode="aspectFit"></image>
  140. <image class="doctor_cha" :src="iconUrl.doctor_cha" @click.stop="delImg(index)"></image>
  141. </view>
  142. </view>
  143. </view>
  144. <view class="coll_con p_flexBetween">
  145. <view class="coll_img_box p_flexCenter" @click="addImg('imgList')">
  146. <image class="coll_img" :src="iconUrl.doctor_jia"></image>
  147. </view>
  148. <view class="coll_tip p_color_9">
  149. 为了提升医患双方的沟通效率,系统将通过AI预问诊的形式详细采集您的主诉、现病史、既往史、过敏史等病情相关信息,敬请理解与配合!(点击左侧+按钮开始采集)
  150. </view>
  151. </view>
  152. </view>
  153. </view>
  154. </view>
  155. <!-- 希望得到的帮助 -->
  156. <view class="block">
  157. <view class="info">
  158. <view class="info_box">
  159. <view class="info_tit">希望得到的帮助<text class="info_subtit p_color_9">(可选项)</text></view>
  160. <textarea
  161. class="info_box_textarea info_box_help"
  162. :disabled="disabledArea"
  163. auto-height
  164. placeholder-class="placeholder"
  165. maxlength="200"
  166. placeholder="请详细描述您的症状、疾病、身体状况等,越详细越好,便于医生更准确得为您分析解答..."
  167. :value="helpInfo"
  168. @input="inputVal"
  169. :data-key="'helpInfo'"
  170. ></textarea>
  171. <view class="text_tip_box p_flexBetween">
  172. <view></view>
  173. <view class="text_num p_color_9"><text class="text_num_now p_color_3">{{ helpInfo?.length || 0 }}</text>/200</view>
  174. </view>
  175. </view>
  176. </view>
  177. </view>
  178. <!-- 提交按钮 -->
  179. <view class="p_btn_con">
  180. <view class="p_form p_btn" @click="submitFnClick">
  181. <button
  182. class="p_form_btn p_flexCenter p_bgcolor"
  183. :class="{ 'btnBgcolor': !getNext }"
  184. v-if="!isFirstVisit"
  185. >
  186. 提交咨询({{ selectedType == 'twzx' ? queryBean.consultFeeDiy : selectedType == 'dhzx' ? queryBean.phoneFeeDiy : selectedType == 'spzx' ? queryBean.videoFeeDiy : 0 }}元)
  187. </button>
  188. <button
  189. v-if="isFirstVisit || options.serviceType == 'hzzx'"
  190. class="p_form_btn p_flexCenter"
  191. :class="[(selectedType == 'spzx' || selectedType == 'twzx') && consultDate.Data_1?.length > 0 || onlyCons ? 'backgroundCustom' : 'backgroundCustom_D9', { 'btnBgcolor': !getNext }]"
  192. >
  193. 提交咨询(免费)
  194. </button>
  195. </view>
  196. </view>
  197. <!-- 问诊目的弹窗 -->
  198. <view class="p_mask p_flexCenter p_mask_bottom" v-if="showPurDialog">
  199. <view class="p_dialog">
  200. <view class="p_dialog_tit p_flexCenter">
  201. <view class="p_dialog_tit_val">请选择问诊目的</view>
  202. <image class="p_dialog_cha" :src="iconUrl.doctor_cha" @click="setValAndClose('purClick', purSelected)"></image>
  203. </view>
  204. <view class="p_dialog_inner p_format p_scroll">
  205. <view class="pur_list">
  206. <view
  207. class="pur_item p_border_bottom p_flexCenter"
  208. v-for="(item, index) in filteredPurList"
  209. :key="index"
  210. @click="setVal('purClick', item)"
  211. >
  212. <image class="pur_icon" :src="item.key == purClick.key ? iconUrl.circle_active : iconUrl.circle"></image>
  213. <view class="pur_con">
  214. <view class="pur_tit">{{ item.tit }}</view>
  215. <view class="pur_subtit p_color_9">{{ item.subtit }}</view>
  216. </view>
  217. </view>
  218. </view>
  219. </view>
  220. <view class="p_dialog_btn_list p_flexBetween">
  221. <view class="p_dialog_btn p_border p_flexCenter" @click="setValAndClose('purClick', purSelected)">取消</view>
  222. <view class="p_dialog_btn p_flexCenter p_bgcolor" @click="purConfirm">确定</view>
  223. </view>
  224. </view>
  225. </view>
  226. <!-- 示例弹窗 -->
  227. <view class="p_mask p_flexCenter" v-if="showExampleDialog">
  228. <view class="p_dialog p_dialog_center">
  229. <view class="p_dialog_tit p_flexCenter">
  230. <view class="p_dialog_tit_val">示例</view>
  231. </view>
  232. <view class="p_dialog_inner p_format p_scroll">
  233. <view class="example_con">
  234. <view class="example_val p_color_6">
  235. 3天前崴了脚,当时感觉有点疼,但是还可以走路,所以冰敷了10分钟。昨天疼的有点厉害就涂了点红花油,今天发现有点肿了,我需要去医院拍片子看一下吗?
  236. </view>
  237. <image class="example_img" :src="iconUrl.doctor_back"></image>
  238. </view>
  239. </view>
  240. <view class="p_dialog_longbtn p_flexCenter p_color p_border_top" @click="closeDialog">我已知晓</view>
  241. </view>
  242. </view>
  243. <!-- 选择咨询时间弹窗 -->
  244. <view class="p_mask p_flexCenter p_mask_bottom" v-if="showConsultDialog">
  245. <view class="p_dialog">
  246. <view class="p_dialog_tit p_flexCenter">
  247. <view class="p_dialog_tit_val">选择咨询时间</view>
  248. <image class="p_dialog_cha" :src="iconUrl.doctor_cha" @click="closeDialog"></image>
  249. </view>
  250. <view class="p_dialog_inner p_format">
  251. <view class="date_list p_scroll">
  252. <view
  253. class="date_item p_border_right p_color"
  254. :class="[
  255. index == consultDateIndClick ? 'date_item_ac' : '',
  256. item.IsHalt == '7' || item.IsHalt == '2' ? 'p_color_9' : 'p_color_6'
  257. ]"
  258. v-for="(item, index) in consultDate.Data_1 || []"
  259. :key="index"
  260. @click="consultDateClick(index)"
  261. >
  262. <image class="date_item_icon" :src="iconUrl.doctor_stop" v-if="item.IsHalt == '7' || item.IsHalt == '2'"></image>
  263. {{ formatDate(item.RegDate) }} {{ item.WeekName }} {{ item.TimeSliceStr }}
  264. </view>
  265. </view>
  266. <view class="num_con p_format p_scroll">
  267. <view class="num_tit">
  268. 咨询费用:
  269. <text class="num_tit_price">{{ queryBean.videoFeeDiy || 0 }}元</text>
  270. </view>
  271. <view class="num_list p_flexCenter">
  272. <view
  273. class="num_item p_flexCenter"
  274. :class="[
  275. index == consultTimeIndClick ? 'p_border num_item_ac' : ''
  276. ]"
  277. v-for="(item, index) in consultTimeList"
  278. :key="index"
  279. @click="setVal('consultTimeIndClick', index)"
  280. >
  281. <image class="num_item_img" :src="iconUrl.doctor_selected" v-if="index == consultTimeIndClick"></image>
  282. <view class="num_item_ind" :class="index == consultTimeIndClick ? 'p_color' : 'p_color_6'">
  283. {{ item.SqNo }}号
  284. </view>
  285. <view class="num_item_time" :class="index == consultTimeIndClick ? 'p_color' : 'p_color_9'">
  286. {{ item.CommendTime }}
  287. </view>
  288. </view>
  289. </view>
  290. </view>
  291. </view>
  292. <view class="p_dialog_btn_list p_flexBetween">
  293. <view class="p_dialog_btn p_border p_flexCenter" @click="cinsultCancel">取消</view>
  294. <view class="p_dialog_btn p_flexCenter p_bgcolor" @click="cinsultConfirm">确定</view>
  295. </view>
  296. </view>
  297. </view>
  298. </view>
  299. <!-- 三个月内无就诊记录弹窗 -->
  300. <view class="mask displayFlexRow" v-if="!isHistory">
  301. <view class="non_record_box displayFlexCol">
  302. <text class="non_record_title">复诊须知</text>
  303. <view class="non_record_main displayFlexCol">
  304. <text>1、您暂无本院的就诊记录,建议您的健康需求均先选择我院进行线下就诊,未来移步至互联网医院进行线上复诊时将更好的享受医保待遇;</text>
  305. <text>2、若您有其他医院的病历、处方单、报告单,选择【我要上传】,上传提供给医生确认;</text>
  306. <text>3、若您无法提供就诊病历信息,建议选择【线下预约】,到院就诊,感谢您的支持!</text>
  307. </view>
  308. <view class="non_record_btn displayFlexCol">
  309. <text
  310. class="backgroundCustom_4aa7fe"
  311. v-if="serviceType == 'tdwz' && queryBean.EnableFirstApply == 1"
  312. @click="firstVisit"
  313. >
  314. 初诊咨询(免费,不可开单)
  315. </text>
  316. <text class="backgroundCustom" @click="outerHos">我要上传</text>
  317. <text class="backgroundCustom_D9" @click="toHome">返回</text>
  318. </view>
  319. </view>
  320. </view>
  321. <!-- 隐藏的 canvas 用于图片压缩 -->
  322. <canvas canvas-id="pressCanvas" class="press-canvas" :style="'width: ' + windowWidth + 'px; height: ' + windowHeight + 'px;'"></canvas>
  323. </view>
  324. </template>
  325. <script setup lang="ts">
  326. import { ref, reactive, getCurrentInstance, computed } from 'vue'
  327. import { useOnLoad } from '@/hook'
  328. import { onShow } from '@dcloudio/uni-app'
  329. import icon from '@/utils/icon'
  330. import { common } from '@/uni-app-base/utils'
  331. import {
  332. queryConsultWaterList,
  333. queryConsultRoomList,
  334. queryClinicDoctorSchedule,
  335. queryNumbers,
  336. lockOrder,
  337. unlock,
  338. applyImgTxtConsult,
  339. applyVideoConsult,
  340. applyDoctorGroupConsult,
  341. QueryOutpatientVisitList
  342. } from '@/pagesNetHos/st1/service/doctor'
  343. import { queryArticleList } from '@/pagesNetHos/st1/service/news'
  344. import { queryCardBalance_V3 } from '@/pagesNetHos/st1/service/order'
  345. import { REQUEST_CONFIG } from '@/config'
  346. const { proxy } = getCurrentInstance()
  347. const app = getApp() as any
  348. // 页面数据
  349. const showCon = ref(true)
  350. const iconUrl = ref(icon)
  351. const like = ref(false)
  352. const showPurDialog = ref(false)
  353. const currentUser = ref<any>({})
  354. const showRecDialog = ref(false)
  355. const showExampleDialog = ref(false)
  356. const showMemberDialog = ref(false)
  357. const showConsultDialog = ref(false)
  358. const consultDate = ref<any>({})
  359. const consultTimeList = ref<any[]>([])
  360. const consultDateIndClick = ref(0)
  361. const consultDateIndSelected = ref(0)
  362. const consultTimeIndClick = ref(0)
  363. const consultTimeIndSelected = ref(0)
  364. const purClick = ref<any>({})
  365. const purSelected = ref<any>({})
  366. const selectedType = ref('')
  367. const diagnosisType = ref("other")
  368. const imgList = ref<any[]>([])
  369. const imgListSave = ref<any[]>([])
  370. const imgPrescList = ref<any[]>([])
  371. const imgPrescListSave = ref<any[]>([])
  372. // 就诊记录
  373. const recQueryData = reactive({
  374. BeginDate: '',
  375. EndDate: '',
  376. ClinicCard: "",
  377. MemberId: "",
  378. })
  379. const recDateIndex = ref(3)
  380. const recList = ref<any[]>([])
  381. const recClick = ref<any>({})
  382. const recSelected = ref<any>({})
  383. const showPrescDetailDialog = ref(false)
  384. //// 创建 字符串key -> ref变量 的映射表
  385. const refMap = {
  386. showPrescDetailDialog,
  387. showExampleDialog,
  388. purClick,
  389. consultTimeIndClick,
  390. };
  391. // 问诊目的列表
  392. const purList = ref([
  393. {
  394. id: "2",
  395. tit: "在线复诊",
  396. subtit: "针对复诊患者病情情况给出诊疗建议(可开处方或检验检查的医嘱)。",
  397. type: "other",
  398. key: "zxfz",
  399. isShow: "1",
  400. value: ""
  401. }
  402. ])
  403. // 过滤后的问诊目的列表(解决 v-for 与 v-if 混用问题)
  404. const filteredPurList = computed(() => {
  405. return purList.value.filter((item: any) => item.type == diagnosisType.value && item.isShow == '1')
  406. })
  407. // 报告单
  408. const reportQueryData = reactive({
  409. CardType: "",
  410. CardNo: "",
  411. MemberId: "",
  412. PatientName: "",
  413. StartDate: "",
  414. EndDate: "",
  415. ReportType: '0',
  416. Data_1: {
  417. queryType: "1",
  418. },
  419. Page: {
  420. PIndex: 1,
  421. PSize: 10
  422. }
  423. })
  424. const reportList = ref<any[]>([])
  425. const showReportListDialog = ref(false)
  426. // 其他数据
  427. const followUp = ref(false)
  428. const article = ref("")
  429. const illness = ref<any>({})
  430. const illnessInfo = ref("")
  431. const helpInfo = ref("")
  432. const earlyTime = ref("")
  433. const loadFirst = ref(true)
  434. const getNext = ref(false)
  435. const disabledArea = ref(false)
  436. const hasRecord = ref(false)
  437. // 窗口尺寸
  438. const windowWidth = ref(375)
  439. const windowHeight = ref(667)
  440. // 页面参数
  441. const options = ref<any>({})
  442. const queryBean = ref<any>({})
  443. const serviceType = ref("")
  444. const isHistory = ref(true)
  445. const isFirstVisit = ref(false)
  446. const isOuterHos = ref(false)
  447. const onlyCons = ref(false)
  448. const netHospageConfig = ref<any>({})
  449. let timeIndex = 0
  450. let submitFnClickIs = true
  451. // 格式化日期
  452. const formatDate = (dateStr: string) => {
  453. if (!dateStr) return ''
  454. const date = new Date(dateStr)
  455. const year = date.getFullYear()
  456. const month = String(date.getMonth() + 1).padStart(2, '0')
  457. const day = String(date.getDate()).padStart(2, '0')
  458. return `${year}-${month}-${day}`
  459. }
  460. // 生命周期
  461. useOnLoad((optionsData: any) => {
  462. // 初始化参数
  463. const queryBeanStr = optionsData.queryBean ? common.parse(optionsData.queryBean) : {}
  464. queryBean.value = queryBeanStr
  465. options.value = optionsData
  466. selectedType.value = optionsData.selectedType
  467. serviceType.value = optionsData.serviceType
  468. // 获取屏幕尺寸
  469. const systemInfo = uni.getSystemInfoSync()
  470. windowWidth.value = systemInfo.windowWidth
  471. windowHeight.value = systemInfo.windowHeight
  472. netHospageConfig.value = common.deepCopy(app.globalData.config.net_pageConfiguration_patient.netHos_orderPayment_config)
  473. // 初始化日期
  474. initDateQuery()
  475. })
  476. // 初始化日期查询参数
  477. const initDateQuery = () => {
  478. const now = new Date()
  479. const sixMonthsAgo = new Date(now.getTime() - 180 * 24 * 60 * 60 * 1000)
  480. recQueryData.BeginDate = common.dateFormat(sixMonthsAgo).formatDay
  481. recQueryData.EndDate = common.dateFormat(now).formatDay
  482. reportQueryData.StartDate = common.dateFormat(now).formatDay
  483. reportQueryData.EndDate = common.dateFormat(now).formatDay
  484. }
  485. // 页面显示
  486. onShow(() => {
  487. closeDialog()
  488. initPurList()
  489. getTimeEarly()
  490. main()
  491. })
  492. // 初始化问诊目的列表
  493. const initPurList = () => {
  494. let list = purList.value
  495. const qb = queryBean.value
  496. const st = serviceType.value
  497. list.forEach((item: any) => {
  498. // 用药咨询只在图文咨询中展示
  499. if (item.key == "yyzx") {
  500. item.isShow = options.value.selectedType == "twzx" ? "1" : "0"
  501. }
  502. // 新冠入口只保留新冠咨询
  503. if (options.value.selectedType == "xgzx") {
  504. item.isShow = item.key == "xgzx" ? "1" : "0"
  505. }
  506. // 即时问诊开启后执行
  507. if (qb.doctorService1005 == 1) {
  508. item.isShow = "0"
  509. }
  510. // 团队问诊执行
  511. if (st == "tdwz") {
  512. item.isShow = item.key == "tdwz" ? "1" : "0"
  513. }
  514. })
  515. // 即时问诊
  516. if (qb.doctorService1005 == 1) {
  517. const obj = {
  518. id: "10",
  519. tit: "即时问诊",
  520. subtit: "",
  521. type: "other",
  522. key: "jswz",
  523. isShow: "1",
  524. value: ""
  525. }
  526. list = [obj]
  527. } else if (serviceType.value == "tdwz") {
  528. const obj = {
  529. id: "11",
  530. tit: "团队问诊",
  531. subtit: "",
  532. type: "other",
  533. key: "tdwz",
  534. isShow: "1",
  535. value: ""
  536. }
  537. list = [obj]
  538. }
  539. purList.value = list
  540. // 设置当前就诊人
  541. currentUser.value = app.globalData.currentUser || {}
  542. // 根据 serviceType 设置选中项
  543. if (common.isNotEmpty(serviceType.value)) {
  544. purList.value.forEach((item: any) => {
  545. if (item.key == serviceType.value) {
  546. purSelected.value = item
  547. }
  548. })
  549. }
  550. }
  551. // 主逻辑
  552. const main = async () => {
  553. submitFnClickIs = true
  554. getNext.value = true
  555. const user = currentUser.value
  556. // 检查就诊人
  557. if (common.isEmpty(user)) {
  558. return
  559. }
  560. if (!user || !user.cardNo) {
  561. common.showModal('当前就诊人暂无就诊卡,请选择其他就诊人进行咨询')
  562. getNext.value = false
  563. return
  564. }
  565. // 是否有待支付订单
  566. if (await queryConsultStatus('0')) {
  567. }
  568. // 是否有正在咨询的订单
  569. if (options.value.serviceType !== "tdwz" && await queryConsultStatus('2')) {
  570. }
  571. let followUpStatus = false
  572. // 获取互联网复诊协议
  573. const tipsRespData = {
  574. Status: 1,
  575. HosId: app.globalData.hosId,
  576. TypeClass: '99'
  577. }
  578. const { resp: queryArticleListResp } = await queryArticleList(tipsRespData)
  579. if (!common.isEmpty(queryArticleListResp)) {
  580. article.value = unescape(queryArticleListResp[0].Contents).replace(/ style=".*?"/g, '')
  581. }
  582. queryOutpatientVisitList(serviceType.value == 'tdwz' ? 'history' : '')
  583. followUpStatus = true
  584. followUp.value = followUpStatus
  585. loadFirst.value = false
  586. hasRecord.value = false
  587. isFirstVisit.value = false
  588. }
  589. // 查询咨询记录状态
  590. const queryConsultStatus = async (consultStatus: string) => {
  591. const user = currentUser.value
  592. const qb = queryBean.value
  593. const data = {
  594. ConsultStatus: consultStatus,
  595. DoctorUid: qb.DoctorUid,
  596. MemberId: user.memberId,
  597. IsHistory: '1'
  598. }
  599. let { resp } = await queryConsultWaterList(data)
  600. if (!common.isEmpty(resp)) {
  601. if (consultStatus == '0') {
  602. let url = `/pagesNetHos/st1/business/enquire/enquireList/enquireList`
  603. if (resp[0].ConsultType == '2') {
  604. url += `?consultType=2&pageType=2`
  605. }
  606. common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条待支付订单,是否马上去支付?`, () => {
  607. common.goToUrl(url)
  608. }, { confirmText: "去支付" })
  609. return true
  610. }
  611. if (resp[0].ConsultType == '2') {
  612. common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条视频咨询订单,请等待医生唤起视频`, () => {
  613. getNext.value = false
  614. }, { confirmText: "确定" })
  615. return true
  616. }
  617. common.showModal(`就诊人【${user.memberName}】与【${qb.DoctorName}】医生之间已经存在了一条咨询中订单,快去和医生沟通吧!`, async () => {
  618. const roomData = {
  619. MemberIds: user.memberId,
  620. DoctorUid: qb.DoctorUid
  621. }
  622. let { resp: roomList } = await queryConsultRoomList(roomData)
  623. if (!common.isEmpty(roomList)) {
  624. roomList[0].ConsId = resp[0].ConsId
  625. let url = `/pagesNetHos/st1/business/consult/consultChat/consultChat`
  626. let dataStr = "?conItem=" + common.stringify(roomList[0]) + "&goBottom=1&consultType=" + roomList[0].ConsultType
  627. common.goToUrl(url, { data: dataStr })
  628. }
  629. }, { cancelText: "取消", confirmText: "去沟通" })
  630. }
  631. return !common.isEmpty(resp)
  632. }
  633. // 选择就诊人
  634. const selectMember = () => {
  635. const url = `/pagesPersonal/st1/business/patientManagement/selecteCardOrHos/selecteCardOrHos?fromComponent=true&type=card`
  636. common.goToUrl(url)
  637. }
  638. // 复诊初诊点击
  639. const diagnosisClick = (value: string) => {
  640. if (!followUp.value && value == 'other') {
  641. return
  642. }
  643. diagnosisType.value = value
  644. purSelected.value = {}
  645. purClick.value = {}
  646. imgPrescList.value = []
  647. imgPrescListSave.value = []
  648. imgList.value = []
  649. imgListSave.value = []
  650. }
  651. // 选择问诊目的
  652. const purSelect = () => {
  653. if (common.isEmpty(purClick.value)) {
  654. const found = purList.value.find((item: any) => item.isShow == '1' && item.type == diagnosisType.value)
  655. if (found) {
  656. purClick.value = found
  657. }
  658. }
  659. showPurDialog.value = true
  660. }
  661. // 问诊目的确认
  662. const purConfirm = () => {
  663. if (purSelected.value.id !== purClick.value.id) {
  664. recList.value = []
  665. recClick.value = {}
  666. recSelected.value = {}
  667. }
  668. purSelected.value = purClick.value
  669. closeDialog()
  670. }
  671. // 选择复诊信息
  672. const subSelect = () => {
  673. recDateIndex.value = 3
  674. const now = new Date()
  675. const sixMonthsAgo = new Date(now.getTime() - 180 * 24 * 60 * 60 * 1000)
  676. recQueryData.BeginDate = common.dateFormat(sixMonthsAgo).formatDay
  677. recQueryData.EndDate = common.dateFormat(now).formatDay
  678. }
  679. // 选择处方
  680. const prescSelect = () => {
  681. showRecDialog.value = true
  682. }
  683. // 清空处方
  684. const clearPur = () => {
  685. recSelected.value = {}
  686. }
  687. // 处方详情弹窗显示
  688. const prescDetailDialogShow = () => {
  689. showPrescDetailDialog.value = true
  690. }
  691. // 添加图片
  692. const addImg = (key: string) => {
  693. const imgDataList = imgList.value
  694. if (imgDataList.length >= 8) {
  695. common.showToast("图片最多不超过8张")
  696. return
  697. }
  698. const count = 8 - imgDataList.length
  699. uni.chooseImage({
  700. count: count,
  701. sizeType: ['original', 'compressed'],
  702. sourceType: ['album', 'camera'],
  703. success: async (res) => {
  704. const tempFilePaths = res.tempFilePaths
  705. common.showLoading()
  706. for (let i = 0; i < tempFilePaths.length; i++) {
  707. const uploadRes = await uploadZxFile(tempFilePaths[i])
  708. if (uploadRes.RespCode == '10000') {
  709. let url = uploadRes.url.indexOf('http') == -1
  710. ? REQUEST_CONFIG.BASE_URL + uploadRes.url.replace(/\\/g, "/")
  711. : uploadRes.url.replace(/\\/g, "/")
  712. console.log(url,'urlurlurl')
  713. imgList.value.push(url)
  714. imgListSave.value.push(url)
  715. } else {
  716. common.showModal(uploadRes.RespMessage)
  717. }
  718. }
  719. common.hideLoading()
  720. }
  721. })
  722. }
  723. // 上传图片
  724. const uploadZxFile = (url: string) => {
  725. return new Promise((resolve) => {
  726. uni.uploadFile({
  727. url: REQUEST_CONFIG.BASE_URL + '/upload/uploadZxFile.do',
  728. filePath: url,
  729. name: 'newsFile',
  730. formData: {
  731. user: 'test'
  732. },
  733. header: {
  734. token: uni.getStorageSync('token')
  735. },
  736. success(res) {
  737. resolve(JSON.parse(res.data))
  738. }
  739. })
  740. })
  741. }
  742. // 获取最早可约时间
  743. const getTimeEarly = async () => {
  744. const qb = queryBean.value
  745. const user = currentUser.value
  746. const st = selectedType.value
  747. const opt = options.value
  748. const dateListData = {
  749. HosId: app.globalData.hosId,
  750. DeptCode: qb.DeptCode,
  751. DoctorCode: qb.DoctorCode,
  752. DoctorTitleCode: "",
  753. SourceType: opt.serviceType == "jswz" ? "fast" : st == "twzx" ? "019" : "006",
  754. ServiceId: '0',
  755. WeekType: '1',
  756. Store: {
  757. cardEncryptionStore: user.encryptionStore || '',
  758. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  759. },
  760. }
  761. // 团队问诊入参
  762. if (opt.serviceType == "tdwz") {
  763. dateListData.DoctorCode = `group${qb.GroupId}`
  764. dateListData.SourceType = `group`
  765. }
  766. let { resp: dateListResp, resData: resData } = await queryClinicDoctorSchedule(dateListData)
  767. if (!common.isEmpty(dateListResp)) {
  768. consultDate.value = dateListResp[0]
  769. for (let i = 0; i < consultDate.value.Data_1.length; i++) {
  770. if (consultDate.value.Data_1[i].IsHalt !== '7' && consultDate.value.Data_1[i].IsHalt !== '2') {
  771. timeIndex = i
  772. break
  773. }
  774. }
  775. } else {
  776. common.showModal(`未查询到排班(${resData.RespCode})`)
  777. return
  778. }
  779. getNextTime()
  780. }
  781. const getNextTime = async () => {
  782. const dateInfo = consultDate.value.Data_1[timeIndex]
  783. if (!dateInfo) return
  784. const qb = queryBean.value
  785. const st = selectedType.value
  786. const opt = options.value
  787. const numberListData = {
  788. HosId: app.globalData.hosId,
  789. DeptCode: consultDate.value.DeptCode,
  790. DoctorCode: consultDate.value.DoctorCode,
  791. ScheduleId: dateInfo.ScheduleId,
  792. RegDate: dateInfo.RegDate,
  793. TimeSlice: dateInfo.TimeSlice,
  794. SourceType: st == "twzx" ? "019" : "006"
  795. }
  796. if (opt.serviceType == "jswz") {
  797. numberListData.SourceType = "fast"
  798. } else if (opt.serviceType == "tdwz") {
  799. numberListData.SourceType = "group"
  800. }
  801. let { resp: timeListResp } = await queryNumbers(numberListData)
  802. if (!common.isEmpty(timeListResp)) {
  803. let date = dateInfo.RegDate
  804. if (dateInfo.RegDate == common.dateFormat(new Date()).formatYear) {
  805. date = "今天"
  806. } else if (dateInfo.RegDate == common.dateFormat(new Date(Date.now() + 24 * 60 * 60 * 1000)).formatYear) {
  807. date = "明天"
  808. } else {
  809. date = common.dateFormat(new Date(date)).formatMon_C
  810. }
  811. const earlyTimeStr = `最早 ${date} ${timeListResp[0].StartTime} 可约`
  812. earlyTime.value = earlyTimeStr
  813. consultDateIndClick.value = timeIndex
  814. } else {
  815. timeIndex += 1
  816. if (timeIndex == consultDate.value.Data_1.length) {
  817. timeIndex = 0
  818. return
  819. }
  820. getNextTime()
  821. }
  822. }
  823. // 选择咨询时间
  824. const consultSelect = async () => {
  825. const user = currentUser.value
  826. const qb = queryBean.value
  827. const st = selectedType.value
  828. const opt = options.value
  829. let consultTimeListData: any[] = []
  830. // 没有日期列表 请求列表
  831. if (common.isEmpty(consultDate.value)) {
  832. const dateListData = {
  833. HosId: app.globalData.hosId,
  834. DeptCode: qb.DeptCode,
  835. DoctorCode: qb.DoctorCode,
  836. DoctorTitleCode: "",
  837. SourceType: opt.serviceType == "jswz" ? "fast" : st == "twzx" ? "019" : "006",
  838. ServiceId: '0',
  839. WeekType: '1',
  840. Store: {
  841. cardEncryptionStore: user.encryptionStore || '',
  842. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  843. },
  844. }
  845. if (opt.serviceType == "tdwz") {
  846. dateListData.DoctorCode = `group${qb.GroupId}`
  847. dateListData.SourceType = `group`
  848. }
  849. let { resp: dateListResp, resData: resData } = await queryClinicDoctorSchedule(dateListData)
  850. if (!common.isEmpty(dateListResp)) {
  851. consultDate.value = dateListResp[0]
  852. consultDateIndSelected.value = timeIndex
  853. } else {
  854. common.showModal(`未查询到排班(${resData.RespCode})`)
  855. return
  856. }
  857. }
  858. const dateInfo = consultDate.value.Data_1[consultDateIndClick.value]
  859. if (!dateInfo) return
  860. const numberListData = {
  861. HosId: app.globalData.hosId,
  862. DeptCode: consultDate.value.DeptCode,
  863. DoctorCode: consultDate.value.DoctorCode,
  864. ScheduleId: dateInfo.ScheduleId,
  865. RegDate: dateInfo.RegDate,
  866. TimeSlice: dateInfo.TimeSlice,
  867. SourceType: selectedType.value == "twzx" ? "019" : "006"
  868. }
  869. if (opt.serviceType == "jswz") {
  870. numberListData.SourceType = "fast"
  871. } else if (opt.serviceType == "tdwz") {
  872. numberListData.SourceType = "group"
  873. }
  874. let { resp: timeListResp } = await queryNumbers(numberListData)
  875. if (!common.isEmpty(timeListResp)) {
  876. consultTimeListData = timeListResp
  877. }
  878. consultTimeList.value = consultTimeListData
  879. consultTimeIndClick.value = 0
  880. consultTimeIndSelected.value = 0
  881. showConsultDialog.value = true
  882. }
  883. // 咨询日期点击
  884. const consultDateClick = (index: number) => {
  885. consultDateIndClick.value = index
  886. consultSelect()
  887. }
  888. // 咨询时间取消
  889. const cinsultCancel = () => {
  890. consultTimeIndClick.value = consultTimeIndSelected.value
  891. consultDateIndClick.value = consultDateIndSelected.value
  892. closeDialog()
  893. }
  894. // 咨询时间确定
  895. const cinsultConfirm = () => {
  896. consultTimeIndSelected.value = consultTimeIndClick.value
  897. consultDateIndSelected.value = consultDateIndClick.value
  898. closeDialog()
  899. }
  900. // 赋值
  901. const setVal = (key: string, value: any) => {
  902. if (key.indexOf('Dialog') !== -1 && !value) {
  903. disabledArea.value = true
  904. };
  905. const targetRef = refMap[key];
  906. if (targetRef) { // 增加安全校验,避免key不存在时报错
  907. targetRef.value = value;
  908. } else {
  909. console.warn(`未找到名为 ${key} 的ref变量`);
  910. }
  911. }
  912. // 赋值并关闭弹窗
  913. const setValAndClose = (key: string, value: any) => {
  914. const targetRef = refMap[key];
  915. if (targetRef) { // 增加安全校验,避免key不存在时报错
  916. targetRef.value = value;
  917. } else {
  918. console.warn(`未找到名为 ${key} 的ref变量`);
  919. }
  920. closeDialog()
  921. }
  922. // 关闭弹窗
  923. const closeDialog = () => {
  924. showConsultDialog.value = false
  925. showPurDialog.value = false
  926. showExampleDialog.value = false
  927. showRecDialog.value = false
  928. showPrescDetailDialog.value = false
  929. showReportListDialog.value = false
  930. disabledArea.value = false
  931. }
  932. // 输入框赋值
  933. const inputVal = (e: any) => {
  934. const key = e.currentTarget?.dataset?.key
  935. const value = e.detail.value
  936. if (key == 'illnessInfo') {
  937. illnessInfo.value = value
  938. } else if (key == 'helpInfo') {
  939. helpInfo.value = value
  940. }
  941. }
  942. // 点击提交咨询
  943. const submitFnClick = async () => {
  944. if (!getNext.value) {
  945. return
  946. }
  947. if (common.isEmpty(purSelected.value)) {
  948. common.showToast("请选择本次问诊目的")
  949. return
  950. }
  951. if (common.isEmpty(recList.value) && purSelected.value.key == 'bgdjd') {
  952. common.showToast("请选择报告单")
  953. return
  954. }
  955. if (common.isEmpty(recList.value) && purSelected.value.key == 'yyzx') {
  956. common.showToast("请选择就诊记录")
  957. return
  958. }
  959. if (common.isEmpty(consultTimeList.value[consultTimeIndSelected.value])) {
  960. common.showToast("请选择咨询时间")
  961. return
  962. }
  963. if (common.isEmpty(illness.value) && common.isEmpty(illnessInfo.value)) {
  964. common.showToast("请先选择病情报告或填写症状描述")
  965. return
  966. }
  967. const reg = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig
  968. if (illnessInfo.value?.match(reg) || helpInfo.value?.match(reg)) {
  969. common.showToast('无法提交表情,请删除后重试')
  970. return
  971. }
  972. if (serviceType.value !== 'tdwz' && isOuterHos.value && imgListSave.value.length == 0) {
  973. common.showToast("请上传外院病例")
  974. return
  975. }
  976. illnessInfo.value = illnessInfo.value?.replace(/\?/g, "?") || ""
  977. helpInfo.value = helpInfo.value?.replace(/\?/g, "?") || ""
  978. if (submitFnClickIs) {
  979. submitFnClickIs = false
  980. const diyFee = selectedType.value == 'twzx'
  981. ? queryBean.value.consultFeeDiy
  982. : selectedType.value == 'dhzx'
  983. ? queryBean.value.phoneFeeDiy
  984. : selectedType.value == 'spzx'
  985. ? queryBean.value.videoFeeDiy
  986. : 0
  987. //前端控制缴费模式
  988. if(netHospageConfig.value.netHos_orderPaymentMode == 1){
  989. checkCardBalance(diyFee).then(() => {
  990. LockOrder()
  991. })
  992. }else if(netHospageConfig.value.netHos_orderPaymentMode == 2){
  993. LockOrder()
  994. }
  995. }
  996. }
  997. // 检查就诊卡余额是否充足
  998. const checkCardBalance = (Fee: number) => {
  999. return new Promise((resolve) => {
  1000. if (common.sub(Fee, 0) > 0) {
  1001. getCardBalance().then((res: any) => {
  1002. const balance = common.centToYuan(res[0]?.balance) || 0
  1003. if ((Number(balance) < Number(Fee)) && purSelected.value.id !== "12" && !isFirstVisit.value) {
  1004. uni.showModal({
  1005. title: '温馨提示',
  1006. content: '您的就诊卡余额不足(当前余额' + Number(balance) + '元),请先充值,谢谢!',
  1007. confirmText: '去充值',
  1008. success(res) {
  1009. if (res.confirm) {
  1010. common.goToUrl(`/pagesPatient/st1/business/recharge/rechargeMoney/rechargeMoney`)
  1011. } else {
  1012. return
  1013. }
  1014. },
  1015. })
  1016. } else {
  1017. resolve(true)
  1018. }
  1019. })
  1020. } else {
  1021. resolve(true)
  1022. }
  1023. })
  1024. }
  1025. // 获取卡余额
  1026. const getCardBalance = async () => {
  1027. const user = currentUser.value
  1028. const data = {
  1029. cardType: user.cardType,
  1030. cardNo: user.cardNo,
  1031. Store: {
  1032. cardEncryptionStore: user.encryptionStore || '',
  1033. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  1034. }
  1035. }
  1036. let { resp } = await queryCardBalance_V3(data)
  1037. if (common.isNotEmpty(resp)) {
  1038. return resp
  1039. } else {
  1040. return []
  1041. }
  1042. }
  1043. // 锁号
  1044. const LockOrder = async () => {
  1045. const user = currentUser.value
  1046. const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
  1047. const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
  1048. const serviceId = dateSelected.RegDate == common.dateFormat(new Date()).formatDay ? '027' : '024'
  1049. const queryData = {
  1050. HosId: app.globalData.districtId || app.globalData.hosId,
  1051. ScheduleId: dateSelected.ScheduleId,
  1052. CardType: user.cardType,
  1053. CardNo: user.cardNo,
  1054. MemberId: user.MemberId || user.memberId,
  1055. DeptCode: consultDate.value.DeptCode,
  1056. DoctorCode: consultDate.value.DoctorCode,
  1057. RegType: '1',
  1058. RegDate: dateSelected.RegDate,
  1059. TimeSlice: dateSelected.TimeSlice,
  1060. SqNo: timeSelected.SqNo,
  1061. CommendTime: timeSelected.EndTime ? `${timeSelected.StartTime}-${timeSelected.EndTime}` : timeSelected.StartTime,
  1062. SourceCode: timeSelected.SourceCode,
  1063. SourceType: selectedType.value == "twzx" ? "019" : "006",
  1064. ServiceId: serviceId,
  1065. AutoSignIn: selectedType.value == "twzx" ? 1 : 0,
  1066. MemberStore: {
  1067. "cardEncryptionStore": user.encryptionStore || '',
  1068. "baseMemberEncryptionStore": user.baseMemberEncryptionStore
  1069. },
  1070. BookMode: "1",
  1071. }
  1072. if (timeSelected.CommendTime?.indexOf(":") == -1) {
  1073. const nowTime = common.accessTimeInAnHour(3600000).time
  1074. queryData.CommendTime = nowTime
  1075. }
  1076. // 团队问诊入参
  1077. if (options.value.serviceType == "tdwz") {
  1078. queryData.SourceType = `group`
  1079. }
  1080. let { resp: lockResp, resData: lockResData } = await lockOrder(queryData)
  1081. if (lockResData.RespCode == '10000') {
  1082. if (common.isNotEmpty(lockResp)) {
  1083. // 订阅消息
  1084. if (selectedType.value == 'twzx') {
  1085. picSubmit(lockResp, serviceId)
  1086. } else if (selectedType.value == 'spzx') {
  1087. viaSubmit(lockResp, serviceId)
  1088. }
  1089. } else {
  1090. submitFnClickIs = true
  1091. }
  1092. } else {
  1093. submitFnClickIs = true
  1094. common.showModal(lockResData.RespMessage)
  1095. }
  1096. }
  1097. // 释号
  1098. const unlockOrder = async (lockResp: any) => {
  1099. const data = {
  1100. OrderId: lockResp[0].OrderId,
  1101. SourceType: selectedType.value == "twzx" ? "019" : "006",
  1102. }
  1103. await unlock(data)
  1104. }
  1105. // 图文咨询提交
  1106. const picSubmit = async (lockResp: any, serviceId: string) => {
  1107. const user = currentUser.value
  1108. const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
  1109. const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
  1110. const qb = queryBean.value
  1111. const Store = {
  1112. cardEncryptionStore: user.encryptionStore || '',
  1113. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  1114. }
  1115. const purposeType = purSelected.value.id
  1116. const tempData = JSON.stringify([
  1117. { key: "initial", value: diagnosisType.value == 'first' ? '1' : '0' },
  1118. { key: "consult", value: purSelected.value },
  1119. { key: "visit_record", value: recSelected.value },
  1120. {
  1121. key: "yy_time",
  1122. value: {
  1123. SqNo: timeSelected.SqNo,
  1124. StartTime: options.value.serviceType == "jswz" ? timeSelected.StartTime : timeSelected.CommendTime,
  1125. }
  1126. },
  1127. { key: "desc", value: helpInfo.value },
  1128. { key: "pics", value: imgListSave.value },
  1129. { key: "chief_complaint", value: common.isEmpty(illness.value) ? "" : illness.value.MedicalInfo?.chief_complaint },
  1130. { key: "illness_info", value: illnessInfo.value },
  1131. { key: "pics_presc", value: imgPrescListSave.value },
  1132. { key: "has_record", value: hasRecord.value },
  1133. { key: "cancel_cause", value: '' },
  1134. { key: "cardAndMember", value: Store },
  1135. { key: "member_info", value: currentUser.value },
  1136. { key: 'external_cases', value: isOuterHos.value },
  1137. { key: 'first_visit_free', value: isFirstVisit.value },
  1138. { key: 'transfer', value: "" }
  1139. ])
  1140. const data = {
  1141. HosId: app.globalData.districtId || app.globalData.hosId || "",
  1142. MemberId: user.memberId,
  1143. CardType: user.cardType,
  1144. CardNo: user.cardNo,
  1145. DeptId: qb.DeptId,
  1146. DeptName: qb.DeptName,
  1147. DoctorName: qb.DoctorName,
  1148. DoctorUid: qb.DoctorUid,
  1149. DcotorTitleCode: qb.TitleCode,
  1150. IllnessDesc: tempData,
  1151. PreDiagnosisId: illness.value.Id || "",
  1152. ConsultType: "1",
  1153. PurposeType: purposeType,
  1154. BookMode: "1",
  1155. OrderId: lockResp[0].OrderId,
  1156. AutoSignIn: 1,
  1157. Fee: qb.ConsultFee,
  1158. BookParam: {
  1159. OperatorName: user.memberName,
  1160. SourceType: "019",
  1161. Store: Store,
  1162. Data_1: {
  1163. DoctorName: consultDate.value.DoctorName,
  1164. DeptCode: consultDate.value.DeptCode,
  1165. DoctorCode: consultDate.value.DoctorCode,
  1166. DeptName: consultDate.value.DeptName,
  1167. TimeSlice: dateSelected.TimeSlice,
  1168. CommendTime: timeSelected.CommendTime,
  1169. RegDate: dateSelected.RegDate,
  1170. FeeInfo: "",
  1171. },
  1172. OperatorId: uni.getStorageSync('openid'),
  1173. OrderId: lockResp[0].OrderId,
  1174. ChannelId: "smallpro",
  1175. HosId: app.globalData.hosId,
  1176. PriceName: '图文咨询',
  1177. ServiceId: serviceId,
  1178. EqptType: 1,
  1179. MemberName: user.memberName,
  1180. MemberId: user.memberId,
  1181. CardNo: user.cardNo,
  1182. CardType: user.cardType,
  1183. PrescNo: "",
  1184. IsOnlinePay: lockResp[0].IsOnlinePay,
  1185. ConsultType: "1",
  1186. PayMoney: lockResp[0].Fee,
  1187. TotalMoney: lockResp[0].Fee,
  1188. },
  1189. Store: Store,
  1190. }
  1191. // 即时问诊入参
  1192. if (options.value.serviceType == "jswz") {
  1193. data.BookParam.SourceType = "fast"
  1194. }
  1195. // 团队问诊入参
  1196. else if (options.value.serviceType == "tdwz") {
  1197. data.IsNew = 1
  1198. data.GroupId = qb.GroupId
  1199. data.GroupName = qb.GroupName
  1200. data.DoctorName = qb.GroupName
  1201. data.BookParam.DoctorName = qb.GroupName
  1202. data.BookParam.SourceType = "group"
  1203. data.TimeSlot = consultDate.value.Data_1[consultDateIndClick.value].TimeSlice
  1204. }
  1205. submitFnClickIs = true
  1206. let { resp, resData } = options.value.serviceType == "tdwz"
  1207. ? await applyDoctorGroupConsult(data, { showModal: false })
  1208. : await applyImgTxtConsult(data, { showModal: false })
  1209. if (resData.RespCode == '10000') {
  1210. if (!common.isEmpty(resp)) {
  1211. // 后端控制是否线上支付
  1212. const consultIsOnlinePay = resp[0].IsOnlinePay
  1213. if (consultIsOnlinePay == '1') {
  1214. common.goToUrl(`/pagesNetHos/st1/business/pay/payment/payment?orderId=${resp[0].OrderId}`)
  1215. } else {
  1216. common.goToUrl(`/pagesNetHos/st1/business/pay/payState/payState`)
  1217. }
  1218. }
  1219. } else {
  1220. common.showModal(resData.RespMessage)
  1221. unlockOrder(lockResp)
  1222. }
  1223. }
  1224. // 视频咨询提交
  1225. const viaSubmit = async (lockResp: any, serviceId: string) => {
  1226. common.showLoading()
  1227. const user = currentUser.value
  1228. const dateSelected = consultDate.value.Data_1[consultDateIndSelected.value]
  1229. const timeSelected = consultTimeList.value[consultTimeIndSelected.value]
  1230. const qb = queryBean.value
  1231. submitFnClickIs = true
  1232. const Store = {
  1233. cardEncryptionStore: user.encryptionStore || '',
  1234. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  1235. }
  1236. const tempData = JSON.stringify([
  1237. { key: "initial", value: diagnosisType.value == 'first' ? '1' : '0' },
  1238. { key: "consult", value: purSelected.value },
  1239. { key: "visit_record", value: recSelected.value },
  1240. {
  1241. key: "yy_time",
  1242. value: {
  1243. SqNo: timeSelected.SqNo,
  1244. RegDate: dateSelected.RegDate,
  1245. CommendTime: timeSelected.CommendTime,
  1246. TimeSlice: dateSelected.TimeSlice
  1247. }
  1248. },
  1249. { key: "desc", value: helpInfo.value },
  1250. { key: "pics", value: imgListSave.value },
  1251. { key: "chief_complaint", value: common.isEmpty(illness.value) ? "" : illness.value.MedicalInfo?.chief_complaint },
  1252. { key: "illness_info", value: illnessInfo.value },
  1253. { key: "pics_presc", value: imgPrescListSave.value },
  1254. { key: "has_record", value: hasRecord.value },
  1255. { key: "cancel_cause", value: '' },
  1256. { key: "cardAndMember", value: Store },
  1257. { key: "member_info", value: currentUser.value },
  1258. { key: 'external_cases', value: isOuterHos.value }
  1259. ])
  1260. const data = {
  1261. HosId: app.globalData.hosId || "",
  1262. DeptId: qb.DeptId,
  1263. DeptName: qb.DeptName,
  1264. DoctorUid: qb.DoctorUid,
  1265. DoctorName: qb.DoctorName,
  1266. DcotorTitleCode: qb.TitleCode,
  1267. OpenId: uni.getStorageSync('openid'),
  1268. IllnessDesc: tempData,
  1269. PreDiagnosisId: illness.value.Id || "",
  1270. RegDate: dateSelected.RegDate,
  1271. BookMode: "1",
  1272. MemberId: user.memberId,
  1273. CardType: user.cardType,
  1274. CardNo: user.cardNo,
  1275. PurposeType: purClick.value.id,
  1276. OrderId: lockResp[0].OrderId,
  1277. BookParam: {
  1278. HosId: app.globalData.hosId,
  1279. OrderId: lockResp[0].OrderId,
  1280. MemberId: user.memberId,
  1281. PrescNo: "",
  1282. PayMoney: lockResp[0].Fee,
  1283. TotalMoney: lockResp[0].Fee,
  1284. PriceName: '视频咨询',
  1285. CardType: user.cardType,
  1286. CardNo: user.cardNo,
  1287. OperatorId: uni.getStorageSync('openid'),
  1288. OperatorName: user.memberName,
  1289. ServiceId: serviceId,
  1290. IsOnlinePay: lockResp[0].IsOnlinePay,
  1291. EqptType: 1,
  1292. HisMemberId: user.hisMemberId,
  1293. ChannelId: app.globalData.channelId,
  1294. MemberName: user.memberName,
  1295. SourceType: "006",
  1296. Data_1: {
  1297. DeptCode: consultDate.value.DeptCode,
  1298. DeptName: consultDate.value.DeptName,
  1299. DoctorCode: consultDate.value.DoctorCode,
  1300. DoctorName: consultDate.value.DoctorName,
  1301. FeeInfo: "",
  1302. RegDate: dateSelected.RegDate,
  1303. CommendTime: timeSelected.CommendTime,
  1304. TimeSlice: dateSelected.TimeSlice
  1305. },
  1306. Store: Store,
  1307. ConsultType: "2"
  1308. },
  1309. Store: Store,
  1310. ConsultType: "2"
  1311. }
  1312. let { resp, resData } = await applyVideoConsult(data, { showLoading: false })
  1313. common.hideLoading()
  1314. if (!common.isEmpty(resp)) {
  1315. if (resp[0].IsOnlinePay == '1') {
  1316. common.goToUrl(`/pagesNetHos/st1/business/pay/payment/payment?orderId=${resp[0].OrderId}`)
  1317. } else {
  1318. common.goToUrl(`/pagesNetHos/st1/business/pay/payState/payState`)
  1319. }
  1320. } else {
  1321. common.showModal(resData.RespMessage)
  1322. unlockOrder(lockResp)
  1323. }
  1324. }
  1325. // 展示图片详情
  1326. const showImg = (ind: number) => {
  1327. const newImgList = imgList.value.map((url: string) => {
  1328. if (url && url.includes('_scale')) {
  1329. return url.replace('_scale', '')
  1330. }
  1331. return url
  1332. })
  1333. uni.previewImage({
  1334. current: newImgList[ind],
  1335. urls: newImgList
  1336. })
  1337. }
  1338. // 删除图片
  1339. const delImg = (index: number) => {
  1340. imgList.value.splice(index, 1)
  1341. imgListSave.value.splice(index, 1)
  1342. }
  1343. // 查询就诊记录
  1344. const queryOutpatientVisitList = async (tag: string) => {
  1345. const user = currentUser.value
  1346. const params = {
  1347. CardNo: user.cardNo,
  1348. CardType: "1",
  1349. MemberId: user.memberId,
  1350. OpenId: uni.getStorageSync("openid"),
  1351. StartDate: common.dateFormat(new Date(Date.now() - (90 * 24 * 60 * 60 * 1000))).formatYear,
  1352. EndDate: common.dateFormat(new Date(Date.now() + (1 * 24 * 60 * 60 * 1000))).formatYear,
  1353. Store: {
  1354. cardEncryptionStore: user.encryptionStore || '',
  1355. baseMemberEncryptionStore: user.baseMemberEncryptionStore
  1356. }
  1357. }
  1358. let { resp, resData } = await QueryOutpatientVisitList(params, { showModal: false })
  1359. if (common.isEmpty(resp)) {
  1360. isOuterHos.value = false
  1361. } else {
  1362. isOuterHos.value = true
  1363. if (tag == "history" && imgList.value.length == 0) {
  1364. isHistory.value = false
  1365. }
  1366. }
  1367. }
  1368. // 初诊咨询
  1369. const firstVisit = () => {
  1370. isFirstVisit.value = true
  1371. isHistory.value = true
  1372. }
  1373. // 外院病例
  1374. const outerHos = () => {
  1375. isOuterHos.value = true
  1376. isHistory.value = true
  1377. }
  1378. // 返回首页
  1379. const toHome = () => {
  1380. common.goToUrl(`/pages/st1/business/tabbar/netHosIndex/netHosIndex`, {
  1381. skipWay: 'switchTab'
  1382. })
  1383. }
  1384. </script>
  1385. <style lang="scss" scoped>
  1386. @import "@/pagesNetHos/st1/static/css/common.scss";
  1387. @import "@/pagesNetHos/st1/static/css/dialog.scss";
  1388. .backgroundCustom_4aa7fe {
  1389. background-color: #4aa7fe !important;
  1390. color: #fff !important;
  1391. }
  1392. .p_content {
  1393. padding-bottom: 150upx;
  1394. }
  1395. .user {
  1396. padding: 30upx;
  1397. justify-content: flex-start;
  1398. background-color: #fff;
  1399. }
  1400. .user_img {
  1401. width: 88upx;
  1402. height: 88upx;
  1403. border-radius: 50%;
  1404. margin-right: 23upx;
  1405. flex-shrink: 0;
  1406. }
  1407. .user_box {
  1408. width: 100%;
  1409. }
  1410. .user_con {
  1411. width: 100%;
  1412. flex-direction: column;
  1413. align-items: flex-start;
  1414. }
  1415. .user_name {
  1416. font-size: 34upx;
  1417. font-weight: 500;
  1418. }
  1419. .user_tip {
  1420. font-size: 28upx;
  1421. margin-top: 6upx;
  1422. }
  1423. .group_box {
  1424. padding: 30upx;
  1425. box-sizing: border-box;
  1426. align-items: flex-start;
  1427. background: white;
  1428. margin-top: 20upx;
  1429. }
  1430. .group_title {
  1431. font-weight: bold;
  1432. margin-bottom: 14upx;
  1433. }
  1434. .group_box text {
  1435. font-size: 30upx;
  1436. }
  1437. .group_introduce {
  1438. width: 100%;
  1439. overflow: hidden;
  1440. text-overflow: ellipsis;
  1441. flex-wrap: wrap;
  1442. display: -webkit-box;
  1443. -webkit-line-clamp: 2;
  1444. -webkit-box-orient: vertical;
  1445. position: relative;
  1446. }
  1447. .group_introduce text {
  1448. color: #666;
  1449. }
  1450. .block {
  1451. width: 690upx;
  1452. margin: 30upx;
  1453. border-radius: 24upx;
  1454. background-color: #fff;
  1455. }
  1456. .member {
  1457. padding: 40upx 30upx;
  1458. }
  1459. .member_con {
  1460. width: 100%;
  1461. }
  1462. .member_info_con {
  1463. align-items: flex-start;
  1464. justify-content: flex-start;
  1465. }
  1466. .member_name {
  1467. font-size: 34upx;
  1468. font-weight: 500;
  1469. line-height: 1em;
  1470. }
  1471. .member_info {
  1472. font-size: 28upx;
  1473. margin-left: 19upx;
  1474. }
  1475. .member_id {
  1476. font-size: 28upx;
  1477. margin-top: 15upx;
  1478. }
  1479. .member_btn {
  1480. padding: 0 30upx;
  1481. height: 64upx;
  1482. background: #01BF8E;
  1483. border-radius: 32px;
  1484. flex-shrink: 0;
  1485. font-size: 28upx;
  1486. font-weight: 800;
  1487. color: #FFFFFF;
  1488. }
  1489. .info {
  1490. padding-left: 30upx;
  1491. }
  1492. .info_box {
  1493. padding: 40upx 30upx 40upx 0;
  1494. }
  1495. .info_tit {
  1496. font-size: 32upx;
  1497. }
  1498. .info_subtit {
  1499. font-size: 26upx;
  1500. }
  1501. .radio_item {
  1502. margin-right: 57upx;
  1503. font-size: 32upx;
  1504. }
  1505. .radio_item:nth-last-child(1) {
  1506. margin-right: 0;
  1507. }
  1508. .radio_item_img {
  1509. width: 36upx;
  1510. height: 36upx;
  1511. margin-right: 15upx;
  1512. }
  1513. .info_right {
  1514. width: 22upx;
  1515. height: 22upx;
  1516. margin-left: 16upx;
  1517. }
  1518. .info_pres {
  1519. margin: 22upx 0 10upx;
  1520. background-color: rgb(235, 241, 255);
  1521. border-radius: 20upx;
  1522. }
  1523. .info_pres_con {
  1524. padding: 30upx 30upx 26upx;
  1525. }
  1526. .info_pres_inner {
  1527. width: 100%;
  1528. align-items: flex-start;
  1529. flex-direction: column;
  1530. }
  1531. .info_pres_time {
  1532. font-size: 26upx;
  1533. }
  1534. .info_pres_tit {
  1535. margin: 5upx 0 3upx;
  1536. }
  1537. .info_pres_subtit {
  1538. display: flex;
  1539. }
  1540. .report_item_val_titval {
  1541. flex-shrink: 0;
  1542. }
  1543. .info_pres_detailbtn {
  1544. flex-shrink: 0;
  1545. height: 55upx;
  1546. padding: 0 16upx;
  1547. border-radius: 8px;
  1548. }
  1549. .info_doctor_arrow {
  1550. width: 24upx;
  1551. height: 24upx;
  1552. margin-left: 5upx;
  1553. }
  1554. .info_pres_btns {
  1555. justify-content: flex-end;
  1556. height: 90upx;
  1557. padding-right: 20upx;
  1558. }
  1559. .info_pres_btn {
  1560. height: 55upx;
  1561. padding: 0 19upx;
  1562. font-size: 26upx;
  1563. border-radius: 8px;
  1564. margin-right: 10upx;
  1565. }
  1566. .coll_con {
  1567. margin-top: 23upx;
  1568. }
  1569. .coll_img_con {
  1570. justify-content: flex-start;
  1571. flex-wrap: wrap;
  1572. }
  1573. .coll_con_img_box {
  1574. width: 160upx;
  1575. height: 160upx;
  1576. margin-right: 16upx;
  1577. margin-bottom: 16upx;
  1578. position: relative;
  1579. }
  1580. .coll_con_img_box:nth-child(4n) {
  1581. margin-right: 0;
  1582. }
  1583. .coll_con_img {
  1584. border-radius: 10upx;
  1585. }
  1586. .doctor_cha {
  1587. position: absolute;
  1588. right: 0;
  1589. top: 0;
  1590. z-index: 1;
  1591. width: 40upx;
  1592. height: 40upx;
  1593. width: 30upx;
  1594. height: 30upx;
  1595. background: #fff;
  1596. border-radius: 50%;
  1597. }
  1598. .coll_img_box {
  1599. width: 161upx;
  1600. height: 161upx;
  1601. background: #F6F7F8;
  1602. border: 1px solid #CCCCCC;
  1603. border-radius: 12upx;
  1604. flex-shrink: 0;
  1605. margin-right: 29upx;
  1606. }
  1607. .coll_img {
  1608. width: 62upx;
  1609. height: 62upx;
  1610. }
  1611. .coll_tip {
  1612. width: 100%;
  1613. font-size: 26upx;
  1614. line-height: 38upx;
  1615. }
  1616. .info_box_textarea {
  1617. width: 100%;
  1618. min-height: 107upx;
  1619. line-height: 40upx;
  1620. font-size: 30upx;
  1621. margin-bottom: 47upx;
  1622. }
  1623. .placeholder {
  1624. color: #CCCCCC;
  1625. font-size: 30upx;
  1626. line-height: 40upx;
  1627. }
  1628. .text_tip {
  1629. padding: 0 14upx;
  1630. height: 45upx;
  1631. background: #FFFFFF;
  1632. border-radius: 6px;
  1633. font-size: 26upx;
  1634. }
  1635. .text_num {
  1636. font-size: 26upx;
  1637. }
  1638. .info_box_help {
  1639. margin-top: 30upx;
  1640. }
  1641. /* 问诊目的 */
  1642. .pur_list {
  1643. padding-left: 30upx;
  1644. }
  1645. .pur_item {
  1646. padding: 40upx 30upx;
  1647. }
  1648. .pur_icon {
  1649. width: 38upx;
  1650. height: 38upx;
  1651. margin-right: 27upx;
  1652. flex-shrink: 0;
  1653. }
  1654. .pur_con {
  1655. width: 100%;
  1656. }
  1657. .pur_tit {
  1658. font-size: 32upx;
  1659. font-weight: 500;
  1660. }
  1661. .pur_subtit {
  1662. font-size: 28upx;
  1663. color: #8A8A99;
  1664. line-height: 38upx;
  1665. margin-top: 6upx;
  1666. }
  1667. /* 咨询时间弹窗 */
  1668. .date_list {
  1669. white-space: nowrap;
  1670. }
  1671. .date_item {
  1672. display: inline-block;
  1673. height: 80upx;
  1674. line-height: 80upx !important;
  1675. text-align: center;
  1676. width: 252upx;
  1677. background-color: #F6F7F8;
  1678. }
  1679. .date_item_ac::after {
  1680. border-color: #e6e6e6;
  1681. }
  1682. .date_item:last-child::after {
  1683. border-right: 0;
  1684. }
  1685. .date_item_ac {
  1686. position: relative;
  1687. }
  1688. .date_item_ac::before {
  1689. content: "";
  1690. display: block;
  1691. width: 32upx;
  1692. height: 6upx;
  1693. background-color: #01BF8E;
  1694. position: absolute;
  1695. left: 50%;
  1696. right: 0;
  1697. bottom: 0;
  1698. transform: translateX(-50%);
  1699. border-radius: 3px;
  1700. }
  1701. .date_item_icon {
  1702. width: 48upx;
  1703. height: 48upx;
  1704. position: absolute;
  1705. right: 4upx;
  1706. top: 0;
  1707. }
  1708. /* 选择咨询时间弹窗 */
  1709. .num_con {
  1710. padding: 0 30upx;
  1711. height: 504upx;
  1712. }
  1713. .num_tit {
  1714. font-size: 28upx;
  1715. margin: 27upx 0 24upx;
  1716. }
  1717. .num_tit_price {
  1718. color: #EE5253;
  1719. }
  1720. .num_list {
  1721. flex-wrap: wrap;
  1722. justify-content: flex-start;
  1723. }
  1724. .num_item {
  1725. width: 160upx;
  1726. height: 111upx;
  1727. background: #f6f7f8;
  1728. border-radius: 20upx;
  1729. margin: 0 16upx 16upx 0;
  1730. flex-direction: column;
  1731. }
  1732. .num_item:nth-child(4n) {
  1733. margin: 0 0 16upx 0;
  1734. }
  1735. .num_item_ac {
  1736. background-color: #F5FFFA;
  1737. }
  1738. .num_item_img {
  1739. width: 52upx;
  1740. height: 50upx;
  1741. position: absolute;
  1742. right: 0;
  1743. bottom: 0;
  1744. }
  1745. .num_item_time {
  1746. font-size: 26upx;
  1747. }
  1748. .btnBgcolor {
  1749. background-color: #ddd !important;
  1750. }
  1751. .p_mask,
  1752. .p_btn_con {
  1753. z-index: 100;
  1754. }
  1755. .press-canvas {
  1756. position: absolute;
  1757. top: -1000px;
  1758. background-color: gray;
  1759. }
  1760. .pb150 {
  1761. padding-bottom: 150upx;
  1762. }
  1763. .mask {
  1764. z-index: 999;
  1765. }
  1766. .non_record_box {
  1767. width: 80%;
  1768. background: white;
  1769. border-radius: 20upx;
  1770. padding: 30upx;
  1771. box-sizing: border-box;
  1772. }
  1773. .non_record_title {
  1774. font-size: 32upx;
  1775. font-weight: bold;
  1776. color: #333;
  1777. }
  1778. .non_record_main {
  1779. width: 100%;
  1780. margin: 30upx 0;
  1781. }
  1782. .non_record_main text {
  1783. line-height: 44upx;
  1784. font-size: 30upx;
  1785. color: #666;
  1786. margin-bottom: 15upx;
  1787. }
  1788. .non_record_btn {
  1789. width: 100%;
  1790. }
  1791. .non_record_btn text {
  1792. width: 100%;
  1793. line-height: 70upx;
  1794. text-align: center;
  1795. border-radius: 10upx;
  1796. margin-top: 20upx;
  1797. }
  1798. .example_val {
  1799. padding: 30upx;
  1800. box-sizing: border-box;
  1801. border: 1px solid #f5f5f5;
  1802. background: #f9f9f9;
  1803. margin-bottom: 30upx;
  1804. }
  1805. /* 示例 */
  1806. .example_con {
  1807. padding: 0 30upx;
  1808. line-height: 0;
  1809. }
  1810. .example_img {
  1811. height: 160upx;
  1812. width: 160upx;
  1813. border-radius: 10upx;
  1814. margin: 22upx 30upx 28upx 0;
  1815. }
  1816. </style>