refundApplicationForm.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. <template>
  2. <view class="container">
  3. <view class="content">
  4. <view class="content_box cardInfoBoxList">
  5. <view class="cardInfoBox border_bottom">
  6. <text class="input_tit">收款户名</text>
  7. <view class="input_con">
  8. <input class="moneyStyle" maxlength="20" placeholder-class="colorRed" placeholder="收款户名应与短信通知一致" type='text' @input="setVal" :value="querData.HandlerReName" data-name="querData.HandlerReName"></input>
  9. </view>
  10. </view>
  11. <view class="cardInfoBox border_bottom">
  12. <text class="input_tit">身份证号</text>
  13. <view class="input_con">
  14. <input class="moneyStyle" placeholder="请输入身份证件号码" type='idcard' @input="setVal" :value="querData.IdCardNo" data-name="querData.IdCardNo"></input>
  15. </view>
  16. </view>
  17. <view class="cardInfoBox border_bottom">
  18. <text class="input_tit">手机号码</text>
  19. <view class="input_con">
  20. <input class="moneyStyle" placeholder="请输入手机号码" type='number' @input="setVal" :value="querData.HandlerMobile" data-name="querData.HandlerMobile"></input>
  21. </view>
  22. </view>
  23. <view class="border_bottom">
  24. <view class="listTip"><image :src="iconUrl.icon_refundTip" class="icon_refundTip" mode="widthFix"></image> 收款户名、身份证、手机号码填写完成后再选择就诊卡</view>
  25. <view class="cardInfoBox displayFlexBetween">
  26. <text class="input_tit">选择就诊卡</text>
  27. <view style="padding-right: 30upx;" @click="getCardList" >
  28. <view v-if="querData.CardNo">{{querData.CardNo}}</view>
  29. <view class="colorCustom" v-else>点击选择就诊卡</view>
  30. <image class="public_right_img" :src="iconUrl.icon_right"></image>
  31. </view>
  32. </view>
  33. </view>
  34. <view class="cardInfoBox border_bottom">
  35. <text class="input_tit">退款金额</text>
  36. <view class="input_con">
  37. <input class="moneyStyle" placeholder-class="colorRed" placeholder="退款金额应与短信通知一致" type='digit' @input="setVal" :value="querData.RefundMoney" data-name="querData.RefundMoney"></input>
  38. </view>
  39. </view>
  40. <view class="cardInfoBox border_bottom">
  41. <text class="input_tit">银行卡号</text>
  42. <view class="input_con">
  43. <input class="moneyStyle" maxlength="20" placeholder="请输入银行卡号" type='number' @input="setVal" :value="querData.HandlerBankCardNo" data-name="querData.HandlerBankCardNo" @blur="getBankCard"></input>
  44. </view>
  45. </view>
  46. <view class="cardInfoBox border_bottom">
  47. <text class="input_tit">收款银行</text>
  48. <view class="input_con">
  49. <input class="moneyStyle" maxlength="20" placeholder="请输入收款银行" @input="setVal" :value="querData.HanderReBankName" data-name="querData.HanderReBankName"></input>
  50. </view>
  51. </view>
  52. <view class="cardInfoBox border_bottom">
  53. <text class="input_tit">开户银行</text>
  54. <view class="input_con">
  55. <input class="moneyStyle" maxlength="20" placeholder="请输入具体开户行名称" type='text' @input="setVal" :value="querData.HandlerBankName" data-name="querData.HandlerBankName"></input>
  56. </view>
  57. </view>
  58. <view class="cardInfoBox">
  59. <text class="input_tit">验证码</text>
  60. <view class="input_con">
  61. <input class="moneyStyle" maxlength="8" placeholder="请输入验证码" type='number' @input="setVal" :value="provingCode" data-name="provingCode"></input>
  62. <view class="code_con_txt" :class="{'colorCustom': disabledBtn}" @click="getCode" v-if="seconds<=0">获取验证码</view>
  63. <view class="code_con_txt colorCustom" v-else>{{seconds}}秒后重新获取</view>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="tip"><text class="colorRed">*</text> 请上传退费材料</view>
  68. <view class="content_box mainBox">
  69. <view class="displayFlexBetween">
  70. <view class='front displayFlexCol' @click='imgcliack("oneselfFrontIdCard")'>
  71. <image :src='getImg(reviewImages,"oneselfFrontIdCard") ? getImg(reviewImages,"oneselfFrontIdCard") : iconUrl.front' class='identity'></image>
  72. <view class='pb10'><text class='colorRed'>*</text>患者本人身份证人像面</view>
  73. </view>
  74. <view class='front displayFlexCol' @click='imgcliack("oneselfBackIdCard")'>
  75. <image :src='getImg(reviewImages,"oneselfBackIdCard") ? getImg(reviewImages,"oneselfBackIdCard") : iconUrl.bankCard' class='identity'></image>
  76. <view class='pb10'><text class='colorRed'>*</text>退款银行卡正面</view>
  77. </view>
  78. </view>
  79. </view>
  80. <view class="public_tip">
  81. <view class="public_tip_box displayFlexRow">
  82. <image class="tips_icon" :src="iconUrl.spot_left" />
  83. <text class="colorCustom">温馨提示</text>
  84. <image class="tips_icon" :src="iconUrl.spot_right" />
  85. </view>
  86. <view class="public_tip_text">为了保障您预交金的资金安全,线上转账退款登记完成后,医院会进行基本信息审核,校验无误后为您办理退款,办理时间约7个工作日,请您耐心等待,有疑问欢迎在工作时间拨打电话0591-83947288</view>
  87. </view>
  88. <view class="public_btn_con bg_white">
  89. <view class="public_btn backgroundCustom" @click="jumpConfirmaPay">提交材料</view>
  90. </view>
  91. <!-- 信息确认 -->
  92. <view class="InfoDialog" v-if="showInfoDialog">
  93. <view class="dialog_con">
  94. <view class="dialogCon_tit">收款信息确认</view>
  95. <view class="dialogCon_inner">
  96. <view class="innerBox displayFlexLeft">
  97. <view class="input_tit">收款户名</view>
  98. <view class="input_con">{{querData.HandlerReName}}</view>
  99. </view>
  100. <view class="innerBox displayFlexLeft">
  101. <view class="input_tit">收款银行</view>
  102. <view class="input_con">{{querData.HanderReBankName}}</view>
  103. </view>
  104. <view class="innerBox displayFlexLeft">
  105. <view class="input_tit">开户银行</view>
  106. <view class="input_con">{{querData.HandlerBankName}}</view>
  107. </view>
  108. <view class="innerBox displayFlexLeft">
  109. <view class="input_tit">银行卡号</view>
  110. <view class="input_con">{{querData.HandlerBankCardNo}}</view>
  111. </view>
  112. </view>
  113. <view class="dialogCon_btnList">
  114. <view class="dialogCon_btn backgroundCustom_D9" @click="closeInfoDialog">取消申请</view>
  115. <view class="dialogCon_btn backgroundCustom" @click="diyRefundRegister">继续申请</view>
  116. </view>
  117. </view>
  118. </view>
  119. <!-- 选择就诊卡 -->
  120. <view class="select_card_mask displayFlexRow" v-if="showSelectCard">
  121. <view class="select_card_box displayFlexCol">
  122. <text class="select_card_title">请选择需要退费的就诊卡</text>
  123. <view class="page-section">
  124. <radio-group @change="radioChange">
  125. <radio class="addCardMask_radio displayFlexCol" :value="index.toString()" v-for="(item, index) in selectCardList" :key="index" color="var(--dominantColor)" :checked="querData.CardNo==item.ClinicCard">就诊卡:{{item.ClinicCard}}</radio>
  126. </radio-group>
  127. </view>
  128. <view class="select_card_footer_btn displayFlexRow">
  129. <text class="backgroundCustom" @click="selectCards('close')" >取消</text>
  130. <text class="backgroundCustom_F08" @click="selectCards('confirm')" >确定</text>
  131. </view>
  132. </view>
  133. </view>
  134. </view>
  135. </view>
  136. </template>
  137. <script setup lang="ts">
  138. import { ref } from 'vue';
  139. import { onLoad } from '@dcloudio/uni-app';
  140. import { common } from '@/utils';
  141. import icon from '@/utils/icon';
  142. import { REQUEST_CONFIG } from '@/config';
  143. import { getBankName, sendVerificationCode_V3, idCardVerification, refundSelectNew, refundRegister, checkVerificationCode_V3, getPatInfo } from '@/pagesPatient/service/refund/index';
  144. const app = getApp();
  145. const iconUrl = ref(icon);
  146. const seconds = ref(0);
  147. const disabledBtn = ref(false);
  148. const provingCode = ref('');
  149. const pcId = ref('');
  150. const showInfoDialog = ref(false);
  151. const reviewImages = ref<any[]>([]);
  152. const querData = ref<any>({
  153. HandlerReName: '',
  154. HandlerBankName: '',
  155. HandlerBankCardNo: '',
  156. HanderReBankName: '',
  157. RefundMoney: '',
  158. HandlerMobile: '',
  159. IdCardNo: '',
  160. CardNo: '',
  161. PatientId: ''
  162. });
  163. const selectCardList = ref<any[]>([]);
  164. const showSelectCard = ref(false);
  165. const changCardIndex = ref<any>('');
  166. const subDisabledBtn = ref(false);
  167. let timer: any = null;
  168. onLoad((options: any) => {
  169. let refunInfo = options.refunInfo ? JSON.parse(decodeURIComponent(options.refunInfo)) : {};
  170. if (common.isNotEmpty(refunInfo)) {
  171. querData.value = {
  172. HandlerReName: refunInfo.HandlerReName,
  173. HandlerBankName: refunInfo.HandlerBankName,
  174. HandlerBankCardNo: refunInfo.HandlerBankCardNo,
  175. HanderReBankName: refunInfo.HanderReBankName,
  176. RefundMoney: common.div(refunInfo.RefundMoney, 100),
  177. HandlerMobile: refunInfo.HandlerMobile,
  178. IdCardNo: refunInfo.IdCardNo,
  179. };
  180. reviewImages.value = JSON.parse(refunInfo.ReviewImages);
  181. disabledBtn.value = true;
  182. getBankCard();
  183. }
  184. });
  185. const setVal = (e: any) => {
  186. let name = e.currentTarget.dataset.name;
  187. let value = e.detail.value;
  188. if (name == 'querData.RefundMoney') {
  189. value = common.validateNumber(value);
  190. querData.value.RefundMoney = value;
  191. } else if (name == 'querData.HandlerMobile') {
  192. let reg = new RegExp('^[1][3,4,5,7,8,9][0-9]{9}$');
  193. disabledBtn.value = reg.test(value);
  194. querData.value.HandlerMobile = value;
  195. } else if (name == 'querData.HandlerReName') {
  196. querData.value.HandlerReName = value;
  197. } else if (name == 'querData.IdCardNo') {
  198. querData.value.IdCardNo = value;
  199. } else if (name == 'querData.HandlerBankCardNo') {
  200. querData.value.HandlerBankCardNo = value;
  201. } else if (name == 'querData.HanderReBankName') {
  202. querData.value.HanderReBankName = value;
  203. } else if (name == 'querData.HandlerBankName') {
  204. querData.value.HandlerBankName = value;
  205. } else if (name == 'provingCode') {
  206. provingCode.value = value;
  207. }
  208. // Clear card selection when related fields change
  209. if (['querData.HandlerReName', 'querData.IdCardNo', 'querData.HandlerMobile'].includes(name)) {
  210. selectCardList.value = [];
  211. changCardIndex.value = '';
  212. querData.value.CardNo = '';
  213. querData.value.PatientId = '';
  214. }
  215. };
  216. const getBankCard = async () => {
  217. if (!common.isEmpty(querData.value.HandlerBankCardNo)) {
  218. let resp = await getBankName({
  219. HandlerBankCardNo: querData.value.HandlerBankCardNo
  220. });
  221. if (resp && resp[0]) {
  222. if (resp[0].BankName.indexOf("建设") == -1) {
  223. common.showModal('如您输入非建行卡卡号请务必明确开户行具体信息');
  224. }
  225. querData.value.HanderReBankName = resp[0].BankName;
  226. } else {
  227. querData.value.HanderReBankName = '未知';
  228. }
  229. }
  230. };
  231. const getCode = async () => {
  232. if (!disabledBtn.value) return;
  233. let queryData = {
  234. mobile: querData.value.HandlerMobile,
  235. };
  236. let resp = await sendVerificationCode_V3(queryData);
  237. if (!common.isEmpty(resp)) {
  238. pcId.value = resp[0].pcId;
  239. common.showModal('发送成功!');
  240. countDown();
  241. }
  242. };
  243. const countDown = () => {
  244. seconds.value = 60;
  245. timer = setInterval(() => {
  246. seconds.value--;
  247. if (seconds.value <= 0) {
  248. clearInterval(timer);
  249. }
  250. }, 1000);
  251. };
  252. const chooseImage = () => {
  253. return new Promise(resolve => {
  254. uni.chooseImage({
  255. count: 1,
  256. sourceType: ['album', 'camera'],
  257. success: (res) => {
  258. resolve(res);
  259. }
  260. });
  261. });
  262. };
  263. const upLoad = (resp: any) => {
  264. uni.showLoading({ mask: true });
  265. return new Promise(resolve => {
  266. // Simple compression replacement
  267. uni.compressImage({
  268. src: resp.tempFilePaths[0],
  269. quality: 80,
  270. success: (compressedRes) => {
  271. uni.uploadFile({
  272. url: `${REQUEST_CONFIG.BASE_URL}upload/uploadFileAndWatermark.do`,
  273. filePath: compressedRes.tempFilePath,
  274. name: 'newsFile',
  275. formData: {
  276. user: 'test',
  277. watermarkText: "照片仅用于退款审核"
  278. },
  279. header: {
  280. token: uni.getStorageSync('token')
  281. },
  282. success(res) {
  283. uni.hideLoading();
  284. let data = JSON.parse(res.data.replace(/\\/g, "/"));
  285. if (data.RespCode == '10000') {
  286. resolve(data);
  287. } else {
  288. common.showModal('图片上传失败');
  289. resolve(false);
  290. }
  291. },
  292. fail(err) {
  293. uni.hideLoading();
  294. common.showModal('图片上传失败');
  295. resolve(false);
  296. }
  297. });
  298. },
  299. fail: (err) => {
  300. // Fallback to original if compression fails
  301. uni.uploadFile({
  302. url: `${REQUEST_CONFIG.BASE_URL}upload/uploadFileAndWatermark.do`,
  303. filePath: resp.tempFilePaths[0],
  304. name: 'newsFile',
  305. formData: {
  306. user: 'test',
  307. watermarkText: "照片仅用于退款审核"
  308. },
  309. header: {
  310. token: uni.getStorageSync('token')
  311. },
  312. success(res) {
  313. uni.hideLoading();
  314. let data = JSON.parse(res.data.replace(/\\/g, "/"));
  315. if (data.RespCode == '10000') {
  316. resolve(data);
  317. } else {
  318. common.showModal('图片上传失败');
  319. resolve(false);
  320. }
  321. }
  322. });
  323. }
  324. });
  325. });
  326. };
  327. const imgcliack = async (key: string) => {
  328. let resp: any = await chooseImage();
  329. if (!common.isEmpty(resp)) {
  330. let data: any = await upLoad(resp);
  331. if (!common.isEmpty(data)) {
  332. if (key == 'oneselfFrontIdCard') {
  333. let queryData = {
  334. filePath: data.url,
  335. type: 1, //1身份证 2户口本
  336. };
  337. let idCardInfo = await idCardVerification(queryData);
  338. if (common.isEmpty(idCardInfo)) return;
  339. }
  340. let img = REQUEST_CONFIG.BASE_URL + data.url;
  341. let tempReviewImages = [...reviewImages.value];
  342. let reviewImagesFiter = tempReviewImages.filter(ele => ele.key == key);
  343. if (common.isNotEmpty(reviewImagesFiter)) {
  344. tempReviewImages.forEach((item) => {
  345. if (item.key == key) item.value = img;
  346. });
  347. } else {
  348. tempReviewImages.push({
  349. key: key,
  350. value: img
  351. });
  352. }
  353. reviewImages.value = tempReviewImages;
  354. }
  355. }
  356. };
  357. const getImg = (list: any[], key: string) => {
  358. for (let i = 0; i < list.length; i++) {
  359. let item = list[i];
  360. if (item.key == key) {
  361. return item.value;
  362. }
  363. }
  364. return '';
  365. };
  366. const jumpConfirmaPay = async () => {
  367. if (subDisabledBtn.value) return;
  368. subDisabledBtn.value = true;
  369. setTimeout(() => {
  370. subDisabledBtn.value = false;
  371. }, 3000);
  372. if (await chenForm(querData.value)) return;
  373. if (await checkVerificationCode_V3()) return;
  374. let queryData = {
  375. Status: 1,
  376. OpenId: uni.getStorageSync('openid'),
  377. StartTime: common.aFewDaysago(7),
  378. EndTime: common.newDay(),
  379. Page: { PIndex: 0, PSize: 10 }
  380. };
  381. let { resp, resData } = await refundSelectNew(queryData);
  382. if (common.isNotEmpty(resp)) {
  383. let filtered = resp.filter((item: any) => {
  384. return (item.IdCardNo == querData.value.IdCardNo &&
  385. item.HandlerReName == querData.value.HandlerReName &&
  386. item.HandlerMobile == querData.value.HandlerMobile &&
  387. item.CardNo == querData.value.CardNo);
  388. });
  389. if (filtered.length) {
  390. common.showModal('您近期已提交过退款申请,请勿进行重复申请', () => {}, {
  391. title: '温馨提示',
  392. confirmText: '确定',
  393. confirmColor: '#AD2E27',
  394. });
  395. return;
  396. }
  397. }
  398. closeInfoDialog();
  399. };
  400. const closeInfoDialog = () => {
  401. showInfoDialog.value = !showInfoDialog.value;
  402. };
  403. const diyRefundRegister = async () => {
  404. let queryData = {
  405. OpenId: uni.getStorageSync('openid'),
  406. HosId: app.globalData.districtId || app.globalData.hosId,
  407. ReviewImages: JSON.stringify(reviewImages.value),
  408. ...querData.value,
  409. };
  410. let { resp, resData } = await refundRegister(queryData);
  411. if (resData.RespCode == 10000) {
  412. common.goToUrl(`/pagesPatient/st1/business/refund/refundApplicationState/refundApplicationState`, { skipWay: 'redirectTo' });
  413. } else {
  414. common.showModal("尊敬的患者您好,经核实,您填写的退款信息与医院数据不一致,请根据收到的短信通知核实退款信息后重新提交申请,如多次提交依然失败,请您前往我院门诊收费窗口办理退款,谢谢!");
  415. }
  416. };
  417. const chenForm = async (queryData: any) => {
  418. var namereg = /[^\u4e00-\u9fa5]/ig;
  419. if (common.isEmpty(queryData.HandlerReName) || namereg.test(queryData.HandlerReName)) {
  420. common.showModal('收款户名为空或格式不正确');
  421. return true;
  422. }
  423. let check = common.idCodeValid(queryData.IdCardNo);
  424. if (common.isEmpty(queryData.IdCardNo) || !check.pass) {
  425. common.showModal('身份证号码为空或格式不正确');
  426. return true;
  427. }
  428. let reg = new RegExp('^[1][3,4,5,7,8,9][0-9]{9}$');
  429. if (common.isEmpty(queryData.HandlerMobile) || !reg.test(queryData.HandlerMobile)) {
  430. common.showModal('手机号为空或格式不正确');
  431. return true;
  432. }
  433. if (common.isEmpty(queryData.CardNo) || common.isEmpty(queryData.PatientId)) {
  434. common.showModal('请选择就诊卡');
  435. return true;
  436. }
  437. if (common.isEmpty(queryData.HandlerBankCardNo)) {
  438. common.showModal('银行卡卡号为空或格式不正确');
  439. return true;
  440. }
  441. if (common.isEmpty(queryData.HanderReBankName)) {
  442. common.showModal('请输入收款银行');
  443. return true;
  444. }
  445. if (queryData.HanderReBankName.indexOf("建设") == -1 && common.isEmpty(queryData.HandlerBankName)) {
  446. common.showModal('开户银行地址不能为空');
  447. return true;
  448. }
  449. if (common.isEmpty(queryData.RefundMoney)) {
  450. common.showModal('退款金额不能为空');
  451. return true;
  452. }
  453. if (queryData.RefundMoney > 10000) {
  454. common.showModal('退款金额不能大于10000');
  455. return true;
  456. }
  457. // Check if both images are present
  458. // Legacy used indices 0 and 1, but reviewImages is an array of {key, value}
  459. // So we should check if we have the keys
  460. let hasFront = reviewImages.value.some(item => item.key == 'oneselfFrontIdCard');
  461. let hasBack = reviewImages.value.some(item => item.key == 'oneselfBackIdCard');
  462. if (!hasFront) {
  463. common.showModal('请上传患者本人身份证人像面');
  464. return true;
  465. }
  466. if (!hasBack) {
  467. common.showModal('请上传退款银行卡正面');
  468. return true;
  469. }
  470. return false;
  471. };
  472. const checkVerificationCode_V3 = () => {
  473. return new Promise(async (resolve, reject) => {
  474. if (common.isEmpty(pcId.value) || common.isEmpty(provingCode.value)) {
  475. common.showModal(common.isEmpty(pcId.value) ? '请先获取验证码' : '请输入验证码');
  476. resolve(true); // Return true to indicate error
  477. } else {
  478. let reqData = {
  479. pcId: pcId.value || '',
  480. verificationCode: provingCode.value,
  481. };
  482. let { resp, resData } = await checkVerificationCode_V3(reqData);
  483. if (resData.RespCode == 10000) {
  484. resolve(false); // No error
  485. } else {
  486. resolve(true); // Error
  487. }
  488. }
  489. });
  490. };
  491. const getCardList = async () => {
  492. var namereg = /[^\u4e00-\u9fa5]/ig;
  493. if (common.isEmpty(querData.value.HandlerReName) || namereg.test(querData.value.HandlerReName)) {
  494. common.showModal('收款户名为空或格式不正确');
  495. return;
  496. }
  497. let check = common.idCodeValid(querData.value.IdCardNo);
  498. if (common.isEmpty(querData.value.IdCardNo) || !check.pass) {
  499. common.showModal('身份证号码为空或格式不正确');
  500. return;
  501. }
  502. let reg = new RegExp('^[1][3,4,5,7,8,9][0-9]{9}$');
  503. if (common.isEmpty(querData.value.HandlerMobile) || !reg.test(querData.value.HandlerMobile)) {
  504. common.showModal('手机号为空或格式不正确');
  505. return;
  506. }
  507. let queryData = {
  508. MemberName: querData.value.HandlerReName,
  509. Mobile: querData.value.HandlerMobile,
  510. IdCardNo: querData.value.IdCardNo,
  511. };
  512. let { resp, resData } = await getPatInfo(queryData);
  513. if (resData.RespCode == 10000) {
  514. if (common.isNotEmpty(resp)) {
  515. showSelectCard.value = true;
  516. selectCardList.value = resp;
  517. } else {
  518. common.showModal("尊敬的患者您好,经核实,您填写的退款信息与医院数据库不一致,请根据收到的短信通知核实修改退款信息后重新提交申请。如仍未成功,请您前往我院门诊收费窗口办理退款,谢谢!", () => {}, { title: '温馨提示' });
  519. }
  520. }
  521. };
  522. const radioChange = (e: any) => {
  523. changCardIndex.value = e.detail.value;
  524. };
  525. const selectCards = (type: string) => {
  526. if (type == 'confirm') {
  527. if (common.isEmpty(changCardIndex.value)) {
  528. common.showModal('请选择要绑定的卡');
  529. return;
  530. }
  531. let selected = selectCardList.value[changCardIndex.value];
  532. querData.value.CardNo = selected.ClinicCard;
  533. querData.value.PatientId = selected.PatientId;
  534. }
  535. showSelectCard.value = false;
  536. };
  537. </script>
  538. <style lang="scss" scoped>
  539. .content{
  540. padding-bottom: 200upx;
  541. }
  542. .content_box{
  543. background:rgba(255,255,255,1);
  544. border-radius:30upx;
  545. margin: 30upx 30upx 0 30upx
  546. }
  547. .listTip{
  548. color: #62626D;
  549. padding-top: 30upx;
  550. display: flex;
  551. }
  552. .icon_refundTip{
  553. width: 55upx;
  554. height: 55upx;
  555. }
  556. .cardInfoBoxList {
  557. margin-top: 20upx;
  558. padding: 0 30upx ;
  559. position: relative;
  560. }
  561. .cardInfoBox {
  562. height: 110upx;
  563. font-size:32upx;
  564. font-weight:400;
  565. display: flex;
  566. justify-content: space-between;
  567. align-items: center;
  568. position: relative;
  569. }
  570. .cardInfoBox .input_tit{
  571. width: 26%;
  572. color:#333;
  573. }
  574. .cardInfoBox .input_con{
  575. width: 74%;
  576. color: #222326;
  577. display: flex;
  578. align-items: center;
  579. justify-content: space-between;
  580. }
  581. .cardInfoBox .input_con input{
  582. text-align: right;
  583. }
  584. .selectionBtn {
  585. width:170upx;
  586. height:58upx;
  587. font-size:26upx;
  588. font-weight:400;
  589. line-height:60upx;
  590. display: flex;
  591. justify-content: center;
  592. align-items: center;
  593. position: absolute;
  594. top: 26upx;
  595. right: 30upx;
  596. }
  597. .tip {
  598. font-size: 30upx;
  599. font-family: Source Han Sans CN;
  600. font-weight: 500;
  601. color: rgba(1, 1, 1, 1);
  602. padding:30upx 30upx 0;
  603. background-color: #F1F1F6;
  604. position: relative;
  605. }
  606. .mainBox {
  607. padding: 0upx 30upx 28upx;
  608. background: white;
  609. }
  610. .mainBox .front{
  611. width: 50%;
  612. margin-top: 28upx;
  613. }
  614. .mainBox image.identity{
  615. width: 90%;
  616. height: 200upx;
  617. border: 1px solid #ddd;
  618. border-radius: 10upx;
  619. display: block;
  620. margin: 0 auto 20upx;
  621. }
  622. .code_con_txt {
  623. font-size: 28upx;
  624. white-space: nowrap;
  625. padding: 20upx 0 20upx 20upx;
  626. color: #999;
  627. }
  628. .InfoDialog{
  629. width: 100%;
  630. height: 100%;
  631. background: rgba(0, 0, 0, 0.6);
  632. position: fixed;
  633. top: 0;
  634. left: 0;
  635. z-index: 20;
  636. display: flex;
  637. align-items: center;
  638. justify-content: center;
  639. }
  640. .dialog_con{
  641. background: #FFFFFF;
  642. border-radius: 30upx;
  643. width: 80%;
  644. }
  645. .dialogCon_tit{
  646. position: relative;
  647. padding: 40upx 30upx 30upx;
  648. font-size: 36upx;
  649. font-weight: 500;
  650. color: #000000;
  651. text-align: center;
  652. }
  653. .dialogCon_inner{
  654. padding: 20upx 48upx;
  655. }
  656. .dialogCon_inner .innerBox:first-child{
  657. margin-top: 0;
  658. }
  659. .dialogCon_inner .innerBox{
  660. font-size: 32upx;
  661. align-items: baseline;
  662. margin-top: 30upx;
  663. }
  664. .dialogCon_inner .input_tit{
  665. width: 28%;
  666. color: #333;
  667. }
  668. .dialogCon_inner .input_con{
  669. width: 72%;
  670. }
  671. .dialogCon_btnList {
  672. padding: 20upx 30upx 20upx;
  673. display: flex;
  674. justify-content: space-between;
  675. align-items: center;
  676. }
  677. .dialogCon_btn {
  678. width: 100%;
  679. height: 90upx;
  680. background: #FFFFFF;
  681. border-radius: 50px;
  682. font-size: 34upx;
  683. display: flex;
  684. align-items: center;
  685. justify-content: center;
  686. }
  687. .dialogCon_btn:last-child:not(:first-child){
  688. margin-left: 20upx;
  689. }
  690. .public_tip {
  691. margin: 30upx 30upx 0 30upx;
  692. border-radius: 24upx;
  693. background: white;
  694. }
  695. .public_tip .tips_icon {
  696. width: 75upx;
  697. height: 23upx;
  698. }
  699. .public_tip_box {
  700. margin-bottom: 28upx;
  701. }
  702. .public_tip_box text {
  703. font-size: 32upx;
  704. font-weight: bold;
  705. padding: 0 24upx;
  706. box-sizing: border-box;
  707. color: #222326;
  708. }
  709. .public_tip_text {
  710. font-size: 28upx;
  711. color: #62626D;
  712. padding-bottom: 28upx;
  713. line-height: 44upx;
  714. text-align: justify;
  715. }
  716. .public_tip_text:last-child {
  717. padding-bottom: 0;
  718. }
  719. /* 选择就诊卡弹窗 */
  720. .select_card_mask {
  721. width: 100%;
  722. height: 100%;
  723. background-color: rgba(0,0,0,0.6);
  724. position: fixed;
  725. top: 0;
  726. left: 0;
  727. z-index: 100;
  728. }
  729. .select_card_box {
  730. width: 620upx;
  731. padding: 48upx;
  732. box-sizing: border-box;
  733. background: white;
  734. border-radius: 20upx;
  735. }
  736. .select_card_box .addCardMask_radio{
  737. margin-top: 28upx;
  738. width: 100%;
  739. font-size: 32upx;
  740. align-items: flex-start;
  741. z-index: 10;
  742. overflow: hidden;
  743. text-overflow:ellipsis;
  744. white-space: nowrap;
  745. }
  746. .select_card_title {
  747. font-size: 36upx;
  748. font-weight: bold;
  749. color: #222326;
  750. }
  751. .select_card_tips {
  752. font-size: 28upx;
  753. color: #8A8A99;
  754. margin-top: 27upx;
  755. }
  756. .select_card_input {
  757. width: 100%;
  758. height: 100upx;
  759. line-height: 100upx;
  760. font-size: 32upx;
  761. color: #8A8A99;
  762. padding-left: 53upx;
  763. box-sizing: border-box;
  764. background: #F0F1F6;
  765. margin-top: 40upx;
  766. border-radius: 100upx;
  767. }
  768. .select_card_footer_btn {
  769. width: 100%;
  770. height: 88upx;
  771. margin-top: 81upx;
  772. justify-content: space-between;
  773. }
  774. .select_card_footer_btn text {
  775. width: 49%;
  776. line-height: 88upx;
  777. font-size: 34upx;
  778. font-weight: bold;
  779. color: #43434A;
  780. text-align: center;
  781. border-radius: 88upx;
  782. }
  783. .select_card_footer_btn text:nth-child(1) {
  784. border: 1upx solid #E6E6E6;
  785. }
  786. .page-section{
  787. padding-top: 40upx;
  788. width: 100%;
  789. }
  790. .select_card_mask .select_card_nothing{
  791. margin-top: 40upx;
  792. }
  793. .colorRed {
  794. color: red;
  795. }
  796. .colorCustom {
  797. color: var(--dominantColor);
  798. }
  799. .backgroundCustom {
  800. background: var(--dominantColor);
  801. color: white;
  802. }
  803. .backgroundCustom_D9 {
  804. background: #D9D9D9;
  805. color: #333;
  806. }
  807. .backgroundCustom_F08 {
  808. background: var(--dominantColor);
  809. color: white;
  810. }
  811. .bg_white {
  812. background: white;
  813. }
  814. .pb10 {
  815. padding-bottom: 10upx;
  816. }
  817. .public_right_img {
  818. width: 30upx;
  819. height: 30upx;
  820. }
  821. </style>