west_pharmacy_send.js 165 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849
  1. //@ sourceURL=west_pharmacy_send.js
  2. var LODOP; //声明为全局变量
  3. var printIndex;
  4. var mzCfPrintIndex = window.localStorage["mzCfPrintIndex"];
  5. var ekCfPrintIndex = window.localStorage["ekCfPrintIndex"];
  6. var jzCfPrintIndex = window.localStorage["jzCfPrintIndex"];
  7. var zsdPrintIndex = window.localStorage["zsdPrintIndex"];
  8. var bqPrintIndex = window.localStorage["bqPrintIndex"];
  9. var fskPrintIndex = window.localStorage["fskPrintIndex"];
  10. var winNo = window.localStorage["winNo"];
  11. var groupNo = window.localStorage["groupNo"];
  12. let coreId // 病人id
  13. let mzHistoryDays = 30 // 门诊历史处方前置天数
  14. let isTyOk = false;
  15. var hospitalName ='沭阳铭和医院';
  16. let yf;
  17. $(function () {
  18. getAjaxRequst("/thmz/queryHospitalName",{},true,function (res) {
  19. hospitalName = res.data
  20. $('.hospitalName').text(hospitalName)
  21. })
  22. init_daterangepicker();
  23. // 查看门诊历史处方前置天数
  24. mzHistoryDays = parseInt(!initSysParametersByCode('mzHistoryDays') ? '30' : initSysParametersByCode('mzHistoryDays'))
  25. $(".selectpicker").selectpicker({
  26. dropuAuto: false
  27. });
  28. if (groupNo == null || winNo == null) {
  29. return errorMesageSimaple('药房参数未设置,请在发药参数设置中设置');
  30. }
  31. yf = selectYfInfo(groupNo)
  32. // if (yf.xyFlag === '1') {
  33. // $('#autoCellNumberDiv').hide();
  34. // }
  35. openSocket("FY");
  36. $("input").each(function () {
  37. this.onkeydown = function (e) { // 监听键盘事件
  38. let theEvent = window.event || e;
  39. let code = theEvent.keyCode || theEvent.which;
  40. if (code == 13) {//回车事件
  41. $("#btn_query").click(); //触发搜索按钮点击事件
  42. }
  43. }
  44. });
  45. initTbTable();
  46. initDynamicSelect("allMzUnitCode", "unitCode");
  47. //重置查询参数
  48. $('#btn_clean').click(function () {
  49. cleanParams();
  50. });
  51. $('#btn_clean_history').click(function () {
  52. $('#reportRangeList span').html(moment().subtract(mzHistoryDays, 'days').format('YYYY-MM-DD') + ' - ' + moment().format('YYYY-MM-DD'));
  53. });
  54. $("#btn_query_history").click(function (t) {
  55. callHistoryDetail();
  56. });
  57. $("#btn_query").click(function (t) {
  58. initTbTable();
  59. });
  60. $("#sendAndMatch").click(function (t) {
  61. initTbTable();
  62. });
  63. $("#btn_radiology_send").click(function (t) {
  64. initRadiologyTable();
  65. });
  66. $("#btn_batch_send").click(function (t) {
  67. var rows = $("#tb_table").bootstrapTable('getSelections');
  68. if (rows.length == 0) {
  69. return errorMesageSimaple('请选择你要进行发药处理的处方');
  70. }
  71. var tem = [];
  72. for (let i = 0; i < rows.length; i++) {
  73. let item = rows[i];
  74. item.groupNo = groupNo;
  75. item.chargeDate = null;//后台转换异常,临时赋空
  76. tem.push({
  77. mzChargeDetail: item,
  78. winNo: winNo
  79. });
  80. if (item.confirmFlag != 5 && item.confirmFlag != 0) {
  81. return errorMesageSimaple('包含非未发药处方,发药失败');
  82. }
  83. }
  84. if (!confirm("确定要对选中的处方进行发药处理吗?")) {
  85. return;
  86. }
  87. batchSendMedicineProcessing(tem);
  88. });
  89. $("#btn_ty").click(function (t) {
  90. saveRefundMedicine();
  91. });
  92. $("#btn_cancel_ty").click(function (t) {
  93. saveCancelRefundMedicine();
  94. });
  95. $("#sendDispose").click(function (t) {
  96. let orderNo = $("#orderNoLabel").val();
  97. let receiptNo = $("#receiptNoLabel").val();
  98. let times = $("#timesLabel").val();
  99. let name = $("#nameLabel").val();
  100. let patientId = $("#patientIdLabel").val();
  101. let realNo = $("#realNoLabel").val();
  102. // 从全局变量获取药师执业资格证号
  103. let pharPracCertNo = window.currentPharPracCertNo || '';
  104. // 先验证追溯码数量,再决定是否发药
  105. validateTracCodgQuantity(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
  106. });
  107. // 追溯码数量确认弹框的确认发药按钮
  108. $("#confirmTracCodgSend").click(function (t) {
  109. // ================= 新增:确认发药时再次验证追溯码数量 =================
  110. // 目的:确保追溯码数量与处方数量完全匹配才能发药
  111. // 获取处方明细表格数据
  112. let tableData = $("#tb_table_right").bootstrapTable('getData');
  113. let hasMismatch = false;
  114. let mismatchMessage = '';
  115. console.log('确认发药时验证追溯码数量,表格数据:', tableData);
  116. // 遍历每种药品,检查追溯码数量
  117. for (let i = 0; i < tableData.length; i++) {
  118. let drug = tableData[i];
  119. let prescriptionQuantity = parseInt(drug.quantity) || 0; // 处方数量
  120. let tracCodgCount = 0; // 追溯码数量
  121. // 计算该药品的追溯码数量
  122. if (!isEmpty(drug.drugTracCodg)) {
  123. // 按<br>分割追溯码,过滤空值
  124. let tracCodgList = drug.drugTracCodg.split('<br>').filter(code => code.length > 0);
  125. tracCodgCount = tracCodgList.length;
  126. }
  127. console.log('药品:', drug.drugname, '处方数量:', prescriptionQuantity, '追溯码数量:', tracCodgCount);
  128. // 检查数量是否匹配
  129. if (tracCodgCount !== prescriptionQuantity) {
  130. hasMismatch = true;
  131. let difference = tracCodgCount - prescriptionQuantity;
  132. let differenceText = '';
  133. if (difference > 0) {
  134. differenceText = '多输入 ' + difference + ' 个';
  135. } else {
  136. differenceText = '缺少 ' + Math.abs(difference) + ' 个';
  137. }
  138. mismatchMessage += '药品【' + drug.drugname + '】: 处方数量 ' + prescriptionQuantity + ',追溯码数量 ' + tracCodgCount + ',' + differenceText + ';\n';
  139. }
  140. }
  141. // 如果数量不匹配,阻止发药并显示错误提示
  142. if (hasMismatch) {
  143. console.error('追溯码数量不匹配,阻止发药:', mismatchMessage);
  144. errorMesageSimaple('追溯码数量与处方数量不匹配,无法发药!\n\n' + mismatchMessage);
  145. return; // 阻止后续操作
  146. }
  147. // ================= 新增结束 =================
  148. // ================= 原代码(已隐藏,可能复用) =================
  149. /*
  150. // 获取存储的发药参数
  151. let sendParams = window.pendingSendParams;
  152. if (sendParams) {
  153. // 隐藏确认弹框
  154. $('#tracCodgConfirmModal').modal('hide');
  155. // 执行发药处理
  156. sendMedicineProcessing(sendParams.realNo, sendParams.orderNo, sendParams.receiptNo,
  157. sendParams.times, sendParams.patientId, sendParams.name, sendParams.pharPracCertNo);
  158. // 清除存储的参数
  159. window.pendingSendParams = null;
  160. }
  161. */
  162. // ================= 原代码结束 =================
  163. // ================= 新增:数量匹配时的处理逻辑 =================
  164. // 获取存储的发药参数
  165. let sendParams = window.pendingSendParams;
  166. if (sendParams) {
  167. // 隐藏确认弹框
  168. $('#tracCodgConfirmModal').modal('hide');
  169. // 执行发药处理
  170. sendMedicineProcessing(sendParams.realNo, sendParams.orderNo, sendParams.receiptNo,
  171. sendParams.times, sendParams.patientId, sendParams.name, sendParams.pharPracCertNo);
  172. // 清除存储的参数
  173. window.pendingSendParams = null;
  174. console.log('追溯码数量验证通过,执行发药处理');
  175. }
  176. // ================= 新增结束 =================
  177. });
  178. $("#printSend").click(function (t) {
  179. $('#zydybqModal').modal('hide');
  180. $("#zyypbq_name").attr("value", $("#zydyNameLabel").val());
  181. $("#zyypbq_sex").attr("value", $("#sexLabel").val());
  182. $("#zyypbq_age").attr("value", $("#ageLabel").val());
  183. $("#zyypbq_date").attr("value", $("#dateLabel").val());
  184. $("#zyypbq_comm").text($("#yfLabel").val());
  185. if ($("#syfsLabel").val() == 0) {
  186. $("#zybq_title").text("中药【口服】标签");
  187. } else {
  188. $("#zybq_title").text("中药【外用】标签");
  189. }
  190. LODOP = getLodop();
  191. LODOP.PRINT_INITA(6, 0, "50mm", "30mm", "中药标签");
  192. //设置默认打印机
  193. LODOP.SET_PRINTER_INDEX(bqPrintIndex);
  194. LODOP.SET_PRINT_PAGESIZE(1, '50mm', '30mm', "CreateCustomPage");
  195. LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "50mm");
  196. LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "30mm");
  197. LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "中药标签");//对新建的纸张重命名
  198. LODOP.SET_PRINT_COPIES(parseInt($("#dyslLabel").val()));
  199. LODOP.ADD_PRINT_HTM("2mm", "2mm", "50mm", "30mm", $('#print_view_zybq').html());
  200. LODOP.PREVIEW();
  201. //LODOP.PREVIEW();
  202. });
  203. });
  204. /**
  205. * 批量发药处理
  206. */
  207. function batchSendMedicineProcessing(tem) {
  208. $("#btn_batch_send").attr("disabled", true);
  209. $.ajax({
  210. type: "POST",
  211. url: '/thmz/batchSendMedicineProcessing',
  212. contentType: "application/json;charset=UTF-8",
  213. dataType: "json",
  214. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  215. data: JSON.stringify(tem),
  216. success: function (res) {
  217. $("#btn_batch_send").attr("disabled", false);
  218. if (res == '401' || res == 401) {
  219. window.location.href = '/thmz/login/view'
  220. return;
  221. }
  222. initTbTable($('#tb_table').bootstrapTable('getOptions').pageNumber);
  223. if (res.code == 0) {
  224. successMesage(res);
  225. } else {
  226. errorMesage(res);
  227. }
  228. },
  229. error: function () {
  230. $("#btn_batch_send").attr("disabled", false);
  231. }
  232. });
  233. }
  234. /**
  235. * 获取按钮组选择的下标
  236. * @param id
  237. * @returns {number}
  238. */
  239. function getIndex(id) {
  240. var index = 0;
  241. var item = $("#" + id).find("button");
  242. for (var i = 0; i <= item.length; i++) {
  243. if ($(item[i]).hasClass("btn-primary")) {
  244. index = i;
  245. break;
  246. }
  247. }
  248. return index;
  249. }
  250. /**
  251. * 设置病人id
  252. */
  253. function setPatientId() {
  254. var patientId_or_cardNo = $("#patientId_or_cardNo").val();
  255. if (patientId_or_cardNo == '') {
  256. return $("#patientId").val("");
  257. }
  258. $.ajax({
  259. type: "GET",
  260. url: '/thmz/getByIcCardNo?icCardNo=' + patientId_or_cardNo,
  261. contentType: "application/json;charset=UTF-8",
  262. dataType: "json",
  263. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  264. success: function (res) {
  265. if (res == '401' || res == 401) {
  266. window.location.href = '/thmz/login/view'
  267. return;
  268. }
  269. if (res.code == 0) {
  270. if (res.data != null) {
  271. $("#patientId").val(res.data.patientId);
  272. } else {
  273. $("#patientId").val(patientId_or_cardNo);
  274. }
  275. }
  276. }
  277. });
  278. }
  279. /**
  280. * 列表类型按钮切换事件
  281. * @param object
  282. * @param realIndex 下标
  283. */
  284. function sendRefundButtonChange(object, realIndex) {
  285. $("#send_refund_group").find("button").each(function (index, element) {
  286. if ($(element).hasClass("btn-primary")) {
  287. $(element).removeClass("btn-primary").addClass("btn-default");
  288. }
  289. });
  290. if (realIndex == 0) {
  291. $("#confirmFlagSearch").empty();
  292. $("#confirmFlagSearch").append("<option value='0' selected>未发药</option>");
  293. $("#confirmFlagSearch").append("<option value='1'>已发药</option>");
  294. $("#confirmFlagSearch").selectpicker('refresh');
  295. $("#tb_table_right_ty").css("display", "none");
  296. $("#return_total_amount").css("display", "none");
  297. $("#btn_ty").addClass("hidden");
  298. $("#btn_cancel_ty").addClass("hidden");
  299. $("#btn_radiology_send").removeClass("hidden");
  300. $("#btn_batch_send").removeClass("hidden");
  301. } else {
  302. $("#confirmFlagSearch").empty();
  303. $("#confirmFlagSearch").append("<option value='2' selected>待退药</option>");
  304. $("#confirmFlagSearch").append("<option value='3'>已退药</option>");
  305. $("#confirmFlagSearch").selectpicker('refresh');
  306. $("#tb_table_right_ty").css("display", "");
  307. $("#btn_ty").removeClass("hidden");
  308. $("#btn_cancel_ty").removeClass("hidden");
  309. $("#btn_radiology_send").addClass("hidden");
  310. $("#btn_batch_send").addClass("hidden");
  311. }
  312. $(object).removeClass("btn-default").addClass("btn-primary");
  313. initTbTable();
  314. }
  315. /**
  316. * 发药处理
  317. */
  318. function sendMedicineProcessing(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo) {
  319. $("#sendDispose").attr("disabled", true);
  320. $("#sendDrug").attr("disabled", true);
  321. // 收集药品追溯码数据
  322. let tableData = $("#tb_table_right").bootstrapTable('getData');
  323. let drugTracCodgData = [];
  324. for (let i = 0; i < tableData.length; i++) {
  325. if (!isEmpty(tableData[i].drugTracCodg)) {
  326. drugTracCodgData.push({
  327. drugTracCodg: tableData[i].drugTracCodg,
  328. patientId: tableData[i].patientId,
  329. times: tableData[i].times,
  330. receiptNo: tableData[i].receiptNo,
  331. orderNo: tableData[i].orderNo,
  332. itemNo: tableData[i].itemNo,
  333. chargeItemCode: tableData[i].chargeItemCode,
  334. serial: tableData[i].serial,
  335. groupNo: tableData[i].groupNo,
  336. realNo: tableData[i].realNo,
  337. specification: tableData[i].specification,
  338. drugName: tableData[i].drugname,
  339. abbrName: tableData[i].abbrName,
  340. unitPrice: tableData[i].unitPrice,
  341. flag: '0'
  342. });
  343. }
  344. }
  345. var temp = {
  346. winNo: winNo,
  347. mzChargeDetail: {
  348. groupNo: groupNo,
  349. realNo: realNo,
  350. orderNo: orderNo,
  351. receiptNo: receiptNo,
  352. times: times,
  353. patientId: patientId,
  354. name: name,
  355. windowsNoYf: winNo
  356. },
  357. drugTracCodgList: drugTracCodgData // 添加药品追溯码数据
  358. };
  359. console.log("sendMedicineProcessing1111111111111",temp)
  360. $.ajax({
  361. type: "POST",
  362. url: '/thmz/sendMedicineProcessing',
  363. contentType: "application/json;charset=UTF-8",
  364. dataType: "json",
  365. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  366. data: JSON.stringify(temp),
  367. success: function (res) {
  368. $("#sendDispose").attr("disabled", false);
  369. $("#sendDrug").attr("disabled", false);
  370. if (res == '401' || res == 401) {
  371. window.location.href = '/thmz/login/view'
  372. return;
  373. }
  374. if (res.code == 0) {
  375. // 发药成功后,调用医保接口
  376. callYbSaleGoodsItem(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
  377. successMesage(res);
  378. $('#cfxxModal').modal('hide');
  379. $("#patientId").val('');
  380. initTbTable($('#tb_table').bootstrapTable('getOptions').pageNumber);
  381. // 发药成功后打印处方
  382. printPrescription(patientId, times, orderNo)
  383. } else {
  384. errorMesage(res);
  385. }
  386. },
  387. error: function () {
  388. $("#sendDispose").attr("disabled", false);
  389. $("#sendDrug").attr("disabled", false);
  390. }
  391. });
  392. }
  393. /**
  394. * 查询处方信息
  395. */
  396. function initTbTable(pageIndex) {
  397. // sendRefundGroup: 0: 发药; 1: 退药
  398. var sendRefundGroup = getIndex("send_refund_group");
  399. var visible = false;
  400. var qrsjVisible = false;
  401. var tysjVisible = false;
  402. var url = "/thmz/getSendMedicinePrescription";
  403. if (sendRefundGroup == 1) {
  404. visible = true;
  405. if ($("#confirmFlagSearch").val() == 2) {
  406. qrsjVisible = true;
  407. } else {
  408. tysjVisible = true;
  409. }
  410. url = "/thmz/getYfRefundMedicine";
  411. $("#tb_table_div").attr("class", "col-md-7 col-sm-7 col-xs-12");
  412. } else {
  413. $("#tb_table_div").attr("class", "");
  414. }
  415. $('#tb_table').bootstrapTable("destroy");
  416. $('#tb_table').bootstrapTable({
  417. url: url, //请求后台的URL(*)
  418. method: 'post', //请求方式(*)
  419. striped: true, //是否显示行间隔色
  420. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  421. pagination: true, //是否显示分页(*)
  422. sortable: true, //是否启用排序
  423. sortOrder: "asc", //排序方式
  424. queryParams: queryParams, //传递参数(*)
  425. sidePagination: $("#confirmFlagSearch").val() == 0 ? 'client' : 'server', //分页方式:client客户端分页,server服务端分页(*)
  426. pageNumber: pageIndex || 1, //初始化加载第一页,默认第一页
  427. pageSize: 15, //每页的记录行数(*)
  428. pageList: [25, 50, 100], //可供选择的每页的行数(*)
  429. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  430. singleSelect: sendRefundGroup == 1 ? true : false, // 多选checkbox
  431. strictSearch: true,
  432. showColumns: false, //是否显示所有的列
  433. showRefresh: false, //是否显示刷新按钮
  434. minimumCountColumns: 2, //最少允许的列数
  435. clickToSelect: true, //是否启用点击选中行
  436. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  437. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  438. cardView: false, //是否显示详细视图
  439. detailView: false,
  440. //rowStyle:rowStyle,//通过自定义函数设置行样式
  441. ajaxOptions: {
  442. headers: {
  443. 'Accept': 'application/json',
  444. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  445. }
  446. },
  447. columns: [
  448. {
  449. field: 'checked',
  450. checkbox: true,
  451. align: "center",
  452. valign: 'middle',
  453. //visible: visible,
  454. formatter: function (value, row, index) {
  455. if (index == 0 && sendRefundGroup == 1) {
  456. $("#return_total_amount").css("display", "");
  457. fitfymx(row.patientId, row.times, row.receiptNo, row.orderNo, row.groupNo);
  458. return {
  459. checked: true//设置选中
  460. };
  461. }
  462. }
  463. }, {
  464. title: '操作',
  465. align: "center",
  466. valign: 'middle',
  467. visible: !visible,
  468. formatter: function (value, row, index) {
  469. var str = "";
  470. if (sendRefundGroup == 0) {
  471. str = '<button type="button" class="btn btn-primary btn-sm" title="打印" onclick="printInjectionOralMedicine(\'' + row.patientId + '\',\'' + row.orderNo + '\',\'' + row.realNo + '\',\'' + row.times + '\',\'' + row.receiptNo + '\',\'' + row.confirmFlag + '\');" style="color: #35D082;">打印 <i class="fa fa-print"></i></button>';
  472. // if (yf.xyFlag === '1') {
  473. // str += '<button type="button" class="btn btn-primary btn-sm" title="叫号" onclick="callNumber(\'' + row.patientId + '\',\'' + row.name + '\')">叫号 <i class="glyphicon glyphicon-bullhorn"></i></button>';
  474. // }
  475. // if (row.confirmFlag == 5 || row.confirmFlag == 0) {
  476. // let pharPracCertNoForSend = (row.pharPracCertNo || '').replace(/'/g, '\\\'');
  477. // str += '<button type="button" class="btn btn-primary btn-sm" title="发药" id="sendDrug" onclick="sendMedicineProcessing(\'' + row.realNo + '\',\'' + row.orderNo + '\',\'' + row.receiptNo + '\',\'' + row.times + '\',\'' + row.patientId + '\',\'' + row.name + '\',\'' + pharPracCertNoForSend + '\')">发药 <i class="fa fa-check-square-o"></i></button>';
  478. // }
  479. let pharPracCertNo = (row.pharPracCertNo || '').replace(/'/g, '\\\'');
  480. str += '<button type="button" class="btn btn-primary btn-sm" title="详细" onclick="prescriptionDetail(\'' + row.realNo + '\',\'' + row.orderNo + '\',\'' + row.receiptNo + '\',\'' + row.times + '\',\'' + row.patientId + '\',\'' + row.confirmFlag + '\',\'' + pharPracCertNo + '\')">详细 <i class="fa fa-plus"></i></button>';
  481. str += '<button type="button" class="btn btn-primary btn-sm" title="历史处方" onclick="prescriptionHistoryDetail(\'' + row.patientId + '\',\'' + 0 +'\')">历史处方 <i class="fa fa-eye"></i></button>';
  482. str += '<button type="button" class="btn btn-primary btn-sm" title="打印处方" onclick="printPrescription(\'' + row.patientId + '\',\'' + row.times + '\',\'' + row.orderNo +'\')">打印处方 <i class="fa fa-print"></i></button>';
  483. }
  484. return str;
  485. }
  486. }, {
  487. title: '操作',
  488. align: "center",
  489. valign: 'middle',
  490. visible: visible,
  491. formatter: function (value, row, index) {
  492. return '<button type="button" class="btn btn-primary btn-sm" title="匹配" onclick="matchingDrugCodg(\'' + row.patientId + '\',\'' + row.times + '\',\'' + row.receiptNo + '\',\'' + row.orderNo + '\',\'' + row.realNo + '\');" style="color: #35D082;">匹配药品</button>';
  493. }
  494. }, {
  495. field: 'confirmFlag',
  496. title: '状态',
  497. align: "center",
  498. valign: 'middle',
  499. width: 80,
  500. formatter: function (value, row, index) {
  501. if(value == '5') {
  502. return "<div style='background: #087f5b'><span>已配药</span></div>";
  503. } else if(value == '1') {
  504. return "<div style='background: #4dabf7'><span>已发药</span></div>";
  505. } else if(value == '0') {
  506. if(row.printFlag == '1'){
  507. return "<div style='background: #c3d94e'><span>配药中</span></div>";
  508. }
  509. return "<div style='background: #f59f00'><span>待配药</span></div>";
  510. } else if(value == '3') {
  511. return "<div style='background: #868e96'><span>已取消</span></div>";
  512. }
  513. return "<div style='background: #d9480f'><span>其他</span></div>";
  514. }
  515. }, {
  516. field: 'pdStatus',
  517. title: '排队状态',
  518. align: "center",
  519. valign: 'middle',
  520. visible: !visible,
  521. width: 80,
  522. formatter: function (value, row, index) {
  523. if(value == '0') {
  524. return "<div style='background: #087f5b'><span>已排队</span></div>";
  525. } else if(row.confirmFlag == '1') {
  526. return "<div style='background: #4dabf7'><span>已完成</span></div>";
  527. } else {
  528. return "<div style='background: #d9480f'><span>未排队</span></div>";
  529. }
  530. }
  531. }, {
  532. field: 'pdSort',
  533. title: '排队序号',
  534. align: "center",
  535. valign: 'middle',
  536. visible: !visible,
  537. }, {
  538. field: 'patientId',
  539. title: '病人ID',
  540. align: "center",
  541. valign: 'middle'
  542. }, {
  543. field: 'name',
  544. title: '姓名',
  545. align: "center",
  546. valign: 'middle'
  547. // formatter: function (value, row, index) {
  548. // if (sendRefundGroup == 0) {
  549. // for (let i = 0; i < pastList.length; i++) {
  550. // if (pastList[i].patient_id == row.patientId) {
  551. // return (row.lineUp !== 10000 ? '<span class="number-name" style="background: red">&nbsp;' + row.lineUp + '&nbsp;</span>&nbsp;' : '') + '<span style="color: red">' + value + '</span>';
  552. // }
  553. // }
  554. // }
  555. // return (row.lineUp !== 10000 ? '<span class="number-name">&nbsp;' + row.lineUp + '&nbsp;</span>&nbsp;' : '') + value;
  556. // }
  557. }, {
  558. field: 'orderNo',
  559. title: '处方号',
  560. align: "center",
  561. valign: 'middle'
  562. }, {
  563. field: 'warnDeptName',
  564. title: '申请科室',
  565. align: "center",
  566. valign: 'middle',
  567. }, {
  568. field: 'employeeName',
  569. title: '医生',
  570. align: "center",
  571. valign: 'middle',
  572. formatter: function (value, row, index) {
  573. if (value == null) {
  574. return row.doctorName;
  575. }
  576. return value;
  577. }
  578. }, {
  579. field: 'chargeDate',
  580. title: '缴费日期',
  581. align: "center",
  582. valign: 'middle',
  583. formatter: function (value, row, index) {
  584. if (value != null && value != "") {
  585. return format(value, "yyyy-MM-dd HH:mm:ss");
  586. }
  587. return "";
  588. }
  589. }, {
  590. field: 'realNo',
  591. title: '流水号',
  592. align: "center",
  593. valign: 'middle',
  594. }, {
  595. field: 'confirmTime',
  596. title: '确认日期',
  597. align: "center",
  598. valign: 'middle',
  599. visible: qrsjVisible,
  600. formatter: function (value, row, index) {
  601. if (value != null && value != "") {
  602. return format(value, "yyyy-MM-dd HH:mm:ss");
  603. }
  604. return "";
  605. }
  606. }, {
  607. field: 'inputTime',
  608. title: '退药日期',
  609. align: "center",
  610. valign: 'middle',
  611. visible: tysjVisible,
  612. formatter: function (value, row, index) {
  613. if (value != null && value != "") {
  614. return format(value, "yyyy-MM-dd HH:mm:ss");
  615. }
  616. return "";
  617. }
  618. }
  619. ],
  620. onClickRow: function (row) {
  621. if (sendRefundGroup == 1) {
  622. fitfymx(row.patientId, row.times, row.receiptNo, row.orderNo, row.groupNo);
  623. }
  624. },
  625. onDblClickRow: function (row) {
  626. if (sendRefundGroup === 0 && yf.xyFlag === '1') {
  627. printInjectionOralMedicine(row.patientId, row.orderNo, row.realNo, row.times, row.receiptNo, row.confirmFlag);
  628. }
  629. // 打印处方
  630. printPrescription(row.patientId, row.times, row.orderNo)
  631. },
  632. responseHandler: function (res) {
  633. console.log(res);
  634. if (res == '401' || res == 401) {
  635. window.location.href = '/thmz/login/view'
  636. return;
  637. }
  638. var ress = eval(res);
  639. // let reverse = getLineUpData(ress.data);
  640. // $('#tb_table').bootstrapTable('load', reverse);
  641. if (ress.code == -1) {
  642. if (ress.message != null && ress.message != '') {
  643. new PNotify({
  644. title: '错误提示',
  645. text: ress.message,
  646. type: 'error',
  647. hide: true,
  648. styling: 'bootstrap3'
  649. });
  650. }
  651. return {
  652. "total": 0,//总页数
  653. "rows": {} //数据
  654. };
  655. }
  656. return {
  657. "total": ress.total,//总页数
  658. "rows": ress.data //数据
  659. };
  660. },
  661. });
  662. }
  663. /**
  664. * 加载放射科发药记录
  665. */
  666. function initRadiologyTable() {
  667. $('#rad_send_record_table').bootstrapTable("destroy");
  668. $('#rad_send_record_table').bootstrapTable({
  669. url: "/thmz/getRadSendRecord", //请求后台的URL(*)
  670. method: 'post', //请求方式(*)
  671. striped: true, //是否显示行间隔色
  672. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  673. pagination: true, //是否显示分页(*)
  674. sortable: true, //是否启用排序
  675. sortOrder: "asc", //排序方式
  676. queryParams: radSendRecordQueryParams, //传递参数(*)
  677. sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
  678. pageNumber: 1, //初始化加载第一页,默认第一页
  679. pageSize: 5, //每页的记录行数(*)
  680. pageList: [5], //可供选择的每页的行数(*)
  681. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  682. singleSelect: true, // 单选checkbox
  683. strictSearch: true,
  684. showColumns: false, //是否显示所有的列
  685. showRefresh: false, //是否显示刷新按钮
  686. minimumCountColumns: 2, //最少允许的列数
  687. clickToSelect: true, //是否启用点击选中行
  688. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  689. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  690. cardView: false, //是否显示详细视图
  691. detailView: false,
  692. paginationDetailHAlign: ' hidden',//隐藏左侧分页信息
  693. toolbar: '#rad_send_record_toolbar',
  694. //rowStyle:rowStyle,//通过自定义函数设置行样式
  695. ajaxOptions: {
  696. headers: {
  697. 'Accept': 'application/json',
  698. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  699. }
  700. },
  701. columns: [
  702. {
  703. field: 'startDate',
  704. title: '起始时间',
  705. align: "center",
  706. valign: 'middle',
  707. formatter: function (value, row, index) {
  708. if (index == 0) {
  709. initRadiologyStatTable(row.sendDate);
  710. }
  711. if (value != null && value != "") {
  712. return format(value, "yyyy-MM-dd");
  713. }
  714. return "";
  715. }
  716. }, {
  717. field: 'endDate',
  718. title: '截止时间',
  719. align: "center",
  720. valign: 'middle',
  721. formatter: function (value, row, index) {
  722. if (index == 0) {
  723. initRadiologyStatTable(row.sendDate);
  724. }
  725. if (value != null && value != "") {
  726. return format(value, "yyyy-MM-dd");
  727. }
  728. return "";
  729. }
  730. }, {
  731. field: 'name',
  732. title: '发药人',
  733. align: "center",
  734. valign: 'middle'
  735. }, {
  736. field: 'sendDate',
  737. title: '发药时间',
  738. align: "center",
  739. valign: 'middle',
  740. formatter: function (value, row, index) {
  741. if (value != null && value != "") {
  742. return format(value, "yyyy-MM-dd");
  743. }
  744. return "-";
  745. }
  746. }
  747. , {
  748. title: '操作',
  749. align: "center",
  750. valign: 'middle',
  751. formatter: function (value, row, index) {
  752. row.sendDate = (row.sendDate == null) ? '' : row.sendDate;
  753. var str = '<button type="button" class="registration-no-color-foot-button" title="打印" onclick="printRadSendMedicineStat(\'' + row.sendDate + '\',\'' + row.startDate + '\',\'' + row.endDate + '\');" style="color: #35D082;background:#fff"><i class="fa fa-print"></i></button>';
  754. if (index == 0 && row.pageIndex == 0) {
  755. str += '<button type="button" class="registration-no-color-foot-button" title="发药" id="sendRad" onclick="sendMedicineProcessingRad()" style="background:#fff"><i class="fa fa-check-square-o"></i></button>';
  756. }
  757. return str;
  758. }
  759. }
  760. ],
  761. onClickRow: function (row) {
  762. initRadiologyStatTable(row.sendDate);
  763. },
  764. onDblClickRow: function (row) {
  765. printRadSendMedicineStat(row.sendDate, row.startDate, row.endDate);
  766. },
  767. responseHandler: function (res) {
  768. if (res == '401' || res == 401) {
  769. window.location.href = '/thmz/login/view'
  770. return;
  771. }
  772. var ress = eval(res);
  773. if (ress.code == -1) {
  774. if (ress.message != null && ress.message != '') {
  775. new PNotify({
  776. title: '错误提示',
  777. text: ress.message,
  778. type: 'error',
  779. hide: true,
  780. styling: 'bootstrap3'
  781. });
  782. }
  783. return {
  784. "total": 0,//总页数
  785. "rows": {} //数据
  786. };
  787. }
  788. return {
  789. "total": ress.total,//总页数
  790. "rows": ress.data //数据
  791. };
  792. },
  793. });
  794. $("#radiologySendModal").modal();
  795. }
  796. /**
  797. * 加载放射科发药统计表格数据
  798. * @param sendDate
  799. */
  800. function initRadiologyStatTable(sendDate) {
  801. sendDate = (sendDate == null) ? '' : sendDate;
  802. $('#rad_send_stat_table').bootstrapTable("destroy");
  803. $('#rad_send_stat_table').bootstrapTable({
  804. url: "/thmz/getRadSendStat?confirmTime=" + sendDate, //请求后台的URL(*)
  805. method: 'GET', //请求方式(*)
  806. striped: true, //是否显示行间隔色
  807. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  808. pagination: true, //是否显示分页(*)
  809. sortable: true, //是否启用排序
  810. sortOrder: "asc", //排序方式
  811. queryParams: {}, //传递参数(*)
  812. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  813. pageNumber: 1, //初始化加载第一页,默认第一页
  814. pageSize: 10, //每页的记录行数(*)
  815. pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
  816. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  817. singleSelect: true, // 单选checkbox
  818. strictSearch: true,
  819. showColumns: false, //是否显示所有的列
  820. showRefresh: false, //是否显示刷新按钮
  821. minimumCountColumns: 2, //最少允许的列数
  822. clickToSelect: true, //是否启用点击选中行
  823. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  824. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  825. cardView: false, //是否显示详细视图
  826. detailView: false,
  827. paginationDetailHAlign: ' hidden',//隐藏左侧分页信息
  828. toolbar: '#rad_send_stat_toolbar',
  829. //rowStyle:rowStyle,//通过自定义函数设置行样式
  830. ajaxOptions: {
  831. headers: {
  832. 'Accept': 'application/json',
  833. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  834. }
  835. },
  836. columns: [
  837. {
  838. field: 'location',
  839. title: '货位号',
  840. align: "center",
  841. valign: 'middle'
  842. }, {
  843. field: 'name',
  844. title: '品名',
  845. align: "center",
  846. valign: 'middle'
  847. }, {
  848. field: 'manuName',
  849. title: '厂商',
  850. align: "center",
  851. valign: 'middle'
  852. }, {
  853. field: 'specification',
  854. title: '规格',
  855. align: "center",
  856. valign: 'middle'
  857. }, {
  858. field: 'quantity',
  859. title: '<span style="color: green">数量</span>',
  860. align: "center",
  861. valign: 'middle',
  862. formatter: function (value, row, index) {
  863. return '<span style="color: green">' + value + '</span>'
  864. }
  865. }, {
  866. field: 'stockAmount',
  867. title: '库存',
  868. align: "center",
  869. valign: 'middle'
  870. }
  871. ],
  872. responseHandler: function (res) {
  873. if (res == '401' || res == 401) {
  874. window.location.href = '/thmz/login/view'
  875. return;
  876. }
  877. var ress = eval(res);
  878. if (ress.code == -1) {
  879. if (ress.message != null && ress.message != '') {
  880. new PNotify({
  881. title: '错误提示',
  882. text: ress.message,
  883. type: 'error',
  884. hide: true,
  885. styling: 'bootstrap3'
  886. });
  887. }
  888. return {
  889. "total": 0,//总页数
  890. "rows": {} //数据
  891. };
  892. }
  893. return {
  894. "total": ress.total,//总页数
  895. "rows": ress.data //数据
  896. };
  897. },
  898. });
  899. }
  900. /**
  901. * 放射科发药处理
  902. */
  903. function sendMedicineProcessingRad() {
  904. if (!confirm("确定要进行发药处理吗?")) {
  905. return;
  906. }
  907. $("#sendRad").attr("disabled", true);
  908. $.ajax({
  909. type: "GET",
  910. url: '/thmz/sendMedicineProcessingRad',
  911. contentType: "application/json;charset=UTF-8",
  912. dataType: "json",
  913. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  914. data: {},
  915. success: function (res) {
  916. $("#sendRad").attr("disabled", false);
  917. if (res == '401' || res == 401) {
  918. window.location.href = '/thmz/login/view'
  919. return;
  920. }
  921. if (res.code == 0) {
  922. successMesage(res);
  923. initRadiologyTable();
  924. } else {
  925. errorMesage(res);
  926. }
  927. },
  928. error: function () {
  929. $("#sendRad").attr("disabled", false);
  930. }
  931. });
  932. }
  933. /**
  934. * 打印注射卡口服药品
  935. */
  936. function printInjectionOralMedicine(patientId, orderNo, realNo, times, receiptNo, confirmFlag) {
  937. if (yf.xyFlag === '1') {
  938. prescriptionDetail(realNo, orderNo, receiptNo, times, patientId, confirmFlag);
  939. }
  940. var tem = {
  941. mzChargeDetail: {
  942. patientId: patientId,
  943. orderNo: orderNo,
  944. realNo: realNo,
  945. times: times,
  946. receiptNo: receiptNo,
  947. groupNo: groupNo,
  948. },
  949. autoCellNumber: $('#autoCellNumber').prop('checked') ? 1 : 0,
  950. winNo: winNo
  951. };
  952. $.ajax({
  953. type: "POST",
  954. url: '/thmz/getPrintInjectionData',
  955. contentType: "application/json;charset=UTF-8",
  956. dataType: "json",
  957. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  958. data: JSON.stringify(tem),
  959. success: function (res) {
  960. if (res == '401' || res == 401) {
  961. window.location.href = '/thmz/login/view'
  962. return;
  963. }
  964. console.log(res);
  965. if (res.code === 0) {
  966. if (yf.zcyFlag === '1') {
  967. zyfdy(res.data);
  968. } else {
  969. xyfdy(res);
  970. successMesage(res);
  971. }
  972. } else {
  973. errorMesage(res);
  974. }
  975. }
  976. });
  977. }
  978. /**
  979. * 中药房打印
  980. * @param data
  981. */
  982. function zyfdy(data) {
  983. $('#zydybqform')[0].reset();
  984. if (bqPrintIndex == null) {
  985. return errorMesageSimaple('未设置标签打印机,请在发药参数设置中设置');
  986. }
  987. $('#zydyNameLabel').val(data[0].name);
  988. $('#sexLabel').val(getSex(data[0].sex));
  989. $('#ageLabel').val(data[0].age);
  990. $('#dyslLabel').val(data[0].drugWin*2);
  991. $('#dateLabel').val(format(new Date(), "MM-dd"));
  992. $('#zydybqModal').modal();
  993. }
  994. /**
  995. * 西药房打印
  996. */
  997. function xyfdy(res) {
  998. var injections = new Array();//注射液
  999. var drugs = new Array();//普通药品
  1000. for (let i = 0; i < res.data.length; i++) {
  1001. if (res.data[i].classCode == 2 || res.data[i].classCode == 7) {//给药方式 2:输液、雾化吸入、副药等等 7:注射、皮试、副药等等
  1002. injections[injections.length] = res.data[i];
  1003. } else if (res.data[i].classCode != 6) {//给药方式 6:领药 9:外用、局麻、喷用等等
  1004. drugs[drugs.length] = res.data[i];
  1005. }
  1006. }
  1007. if (injections.length == 0 && drugs.length == 0) {
  1008. return errorMesageSimaple('当前处方,无需打印注射单和标签');
  1009. }
  1010. let age = getBirthSlot(res.data[0].birthDay, res.data[0].priceTime);
  1011. //setPrint();
  1012. if (injections.length > 0) {
  1013. if (zsdPrintIndex == null) {
  1014. return errorMesageSimaple('未设置注射单打印机,请在发药参数设置中设置');
  1015. }
  1016. $(".zsd_two_tr").remove();
  1017. $(".zsd_one_tr_1").remove();
  1018. $(".zsd_one_tr_2").remove();
  1019. var patientInfoHtm = '<tr class="zsd_one_tr_1">\n' +
  1020. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;"\n' +
  1021. ' valign="top">姓名\n' +
  1022. ' </td>\n' +
  1023. ' <td style="vertical-align: middle !important;width: 100px;">\n' + res.data[0].name +
  1024. ' </td>\n' +
  1025. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;">\n' +
  1026. ' 性别\n' +
  1027. ' </td>\n' +
  1028. ' <td style="vertical-align: middle !important;width: 100px;text-align: left;">\n' + getSex(res.data[0].sex) +
  1029. ' </td>\n' +
  1030. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;">\n' +
  1031. ' 年龄\n' +
  1032. ' </td>\n' +
  1033. ' <td style="vertical-align: middle !important;width: 100px;text-align: left;">\n' + age +
  1034. ' </td>\n' +
  1035. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;">\n' +
  1036. ' ID号\n' +
  1037. ' </td>\n' +
  1038. ' <td style="vertical-align: middle !important;width: 100px;text-align: left;">\n' + res.data[0].patientId +
  1039. ' </td>\n' +
  1040. ' </tr>\n' +
  1041. ' <tr class="zsd_one_tr_2">\n' +
  1042. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;">\n' +
  1043. ' 医生\n' +
  1044. ' </td>\n' +
  1045. ' <td style="vertical-align: middle !important;width: 100px;text-align: left;">\n' + res.data[0].employeeName +
  1046. ' </td>\n' +
  1047. ' <td style="vertical-align: middle !important;width: 75px;text-align: center;">\n' +
  1048. ' 诊断\n' +
  1049. ' </td>\n' +
  1050. ' <td colspan="5" style="vertical-align: middle !important;width: 250px;text-align: left;">\n' + res.data[0].icdText +
  1051. ' </td>\n' +
  1052. ' </tr>';
  1053. $(".zsd_yp_tr").remove();
  1054. $("#dateTime").html(format(new Date(), "yyyy-MM-dd HH:mm:ss"));
  1055. $('#zsd_one').prepend(patientInfoHtm);
  1056. var zsdYpHtm = '';
  1057. for (let i = 0; i < injections.length; i++) {
  1058. let data = injections[i];
  1059. let manufactoryName = (data.manufactoryName == null || data.manufactoryName == '') ? '' : '(' + data.manufactoryName + ')';
  1060. let groupOrder = (data.groupOrder == '' || data.groupOrder == null) ? data.chargeItemCode : data.groupOrder;
  1061. let psFlag = '';
  1062. if (data.groupOrder != '' || data.groupOrder != null) {
  1063. for (let j = 0; j < injections.length; j++) {
  1064. if (groupOrder === injections[j].groupOrder && injections[j].tryFlag === '1') {
  1065. psFlag = '(需皮试)';
  1066. break
  1067. }
  1068. }
  1069. }
  1070. zsdYpHtm += '<tr class="zsd_yp_tr">\n' +
  1071. ' <td>&nbsp;&nbsp;</td>\n' +
  1072. ' <td style="vertical-align: middle !important;width: 10px;text-align: center;">\n' + groupOrder +
  1073. ' </td>\n' +
  1074. ' <td style="vertical-align: middle !important;width: 200px;text-align: left;">\n' + data.drugname + manufactoryName +
  1075. ' </td>\n' +
  1076. ' <td style="vertical-align: middle !important;width: 60px;text-align: center;">\n' + data.drugQuan +
  1077. ' </td>\n' +
  1078. ' <td style="vertical-align: middle !important;width: 60px;text-align: center;">\n' + data.drugUnitName +
  1079. ' </td>\n' +
  1080. ' <td style="vertical-align: middle !important;width: 130px;text-align: left;">\n' + data.printName + psFlag +
  1081. ' </td>\n' +
  1082. ' <td style="vertical-align: middle !important;width: 60px;text-align: center;">\n' + data.frequency +
  1083. ' </td>\n' +
  1084. ' <td style="vertical-align: middle !important;width: 60px;text-align: center;">\n' + data.orderDays +
  1085. ' </td>\n' +
  1086. ' <td style="vertical-align: middle !important;width: 120px;text-align: left;">\n' + data.specification +
  1087. ' </td>\n' +
  1088. ' </tr>';
  1089. }
  1090. $('#zsd_yp').append(zsdYpHtm);
  1091. var htm = '';
  1092. for (let i = 0; i < 14; i++) {
  1093. htm += '<tr class="zsd_two_tr">\n' +
  1094. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">&nbsp;&nbsp;月&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;日</td>\n' +
  1095. ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1096. ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1097. ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1098. ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1099. // ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">&nbsp;&nbsp;月&nbsp;&nbsp;日</td>\n' +
  1100. // ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1101. // ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1102. // ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1103. // ' <td style="vertical-align: middle !important;width: 30px;text-align: right;"></td>\n' +
  1104. ' </tr>';
  1105. }
  1106. $('#zsd_two').append(htm);
  1107. LODOP = getLodop();
  1108. // LODOP.PRINT_INITA(6, 0, "210mm", "148mm", "铭和医院门、急诊注射单");
  1109. // LODOP.SET_PRINT_STYLE("FontSize", 9); //字体大小
  1110. LODOP.PRINT_INITA(6, 0, "140mm", "202mm", "铭和医院门、急诊注射单");
  1111. LODOP.SET_PRINT_STYLE("FontSize", 9); //字体大小
  1112. //设置默认打印机
  1113. LODOP.SET_PRINTER_INDEX(zsdPrintIndex);
  1114. // LODOP.SET_PRINT_PAGESIZE(1, '210mm', '148mm', "CreateCustomPage");
  1115. // LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "210mm");
  1116. // LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "148mm");
  1117. LODOP.SET_PRINT_PAGESIZE(1, '140mm', '202mm', "CreateCustomPage");
  1118. LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
  1119. LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "140mm");
  1120. LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "202mm");
  1121. LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "铭和医院门、急诊注射单");//对新建的纸张重命名
  1122. // LODOP.ADD_PRINT_HTM("5mm", "3mm", "210mm", "148mm", $("div[id='print_view_zsd']").html());
  1123. LODOP.ADD_PRINT_HTM("2mm", "4mm", "140mm", "202mm", $("div[id='print_view_zsd']").html());
  1124. LODOP.PREVIEW();
  1125. //LODOP.PREVIEW();
  1126. }
  1127. if (drugs.length > 0) {
  1128. if (bqPrintIndex == null) {
  1129. return errorMesageSimaple('未设置标签打印机,请在发药参数设置中设置');
  1130. }
  1131. LODOP = getLodop();
  1132. LODOP.PRINT_INITA(6, 0, "80mm", "60mm", "患者药品标签");
  1133. LODOP.SET_PRINT_STYLE("FontSize", 9); //字体大小
  1134. //设置默认打印机
  1135. LODOP.SET_PRINTER_INDEX(bqPrintIndex);
  1136. LODOP.SET_PRINT_PAGESIZE(1, '80mm', '60mm', "CreateCustomPage");
  1137. LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "80mm");
  1138. LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "60mm");
  1139. LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "患者药品标签");//对新建的纸张重命名
  1140. for (let j = 0; j < drugs.length; j++) {
  1141. for (var key in drugs[j]) {
  1142. $("#ypbq_" + key + "").attr("value", drugs[j][key]);
  1143. $("#ypbq_quantity").attr("value", parseInt(drugs[j]['quantity']));
  1144. }
  1145. $("#dataTime").attr("value", format(new Date(), "yyyy-MM-dd HH:mm"));
  1146. $("#ypbq_sex").attr("value", getSex(drugs[0].sex));
  1147. $("#ypbq_age").attr("value", age);
  1148. $("#NO").attr("value", j + 1 + "/" + drugs.length);
  1149. //用法
  1150. let yf = drugs[j].printName + ',';
  1151. if (drugs[j].drugUnitName == '粒' || drugs[j].drugUnitName == '片' || drugs[j].drugUnitName == '支' || drugs[j].drugUnitName == '袋' || drugs[j].drugUnitName == '包' || drugs[j].drugUnitName == '丸') {
  1152. $("#ypbq_comm").attr("value", yf + drugs[j].comm + ',每次' + (drugs[j].drugQuan == 0.5 ? '半' : drugs[j].drugQuan) + drugs[j].drugUnitName);
  1153. } else if ((drugs[j].weight == null && drugs[j].volum == null) || (drugs[j].weight != null && drugs[j].volum != null)) {
  1154. $("#ypbq_comm").attr("value", yf + drugs[j].comm + ',每次' + drugs[j].drugQuan + drugs[j].drugUnitName);
  1155. } else {
  1156. let weight = (drugs[j].weight == '' || drugs[j].weight == null) ? drugs[j].volum : drugs[j].weight;
  1157. var drugQuan = (drugs[j].drugQuan / weight).toFixed(2);
  1158. if (drugQuan == 0.5) {
  1159. $("#ypbq_comm").attr("value", yf + drugs[j].comm + ',每次半' + drugs[j].miniUnitName);
  1160. } else if (drugQuan < 1) {
  1161. $("#ypbq_comm").attr("value", yf + drugs[j].comm + ',每次' + drugs[j].drugQuan + drugs[j].drugUnitName);
  1162. } else {
  1163. drugQuan = Math.round(drugQuan * 100) / 100;
  1164. $("#ypbq_comm").attr("value", yf + drugs[j].comm + ',每次' + drugQuan + drugs[j].miniUnitName);
  1165. }
  1166. }
  1167. LODOP.ADD_PRINT_HTM("5mm", "2mm", "80mm", "60mm", $("div[id='print_view_bq']").html());
  1168. LODOP.NewPage();//下一页
  1169. }
  1170. LODOP.PREVIEW();
  1171. //LODOP.PREVIEW();
  1172. }
  1173. }
  1174. /**
  1175. * 打印放射科发药药品统计
  1176. */
  1177. function printRadSendMedicineStat(sendDate, startDate, endDate) {
  1178. $.ajax({
  1179. type: "GET",
  1180. url: "/thmz/getPrintRadSendStat?confirmTime=" + sendDate, //请求后台的URL(*)
  1181. contentType: "application/json;charset=UTF-8",
  1182. dataType: "json",
  1183. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  1184. data: {},
  1185. success: function (res) {
  1186. if (res == '401' || res == 401) {
  1187. window.location.href = '/thmz/login/view'
  1188. return;
  1189. }
  1190. if (res.code == 0) {
  1191. var list = res.data;
  1192. if (list.length == 0) {
  1193. return errorMesageSimaple('当前记录无发药药品统计数据');
  1194. }
  1195. if (fskPrintIndex == null) {
  1196. return errorMesageSimaple('未设置放射科发药清单打印机,请在发药参数设置中设置');
  1197. }
  1198. $(".fsk_tr").remove();
  1199. var htm = '';
  1200. for (let i = 0; i < list.length; i++) {
  1201. var data = list[i];
  1202. htm += '<tr class="fsk_tr">' +
  1203. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">' + (data.location == null ? '-' : data.location) +
  1204. ' </td>' +
  1205. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">' + data.name +
  1206. ' </td>' +
  1207. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">' + data.manuName +
  1208. ' </td>' +
  1209. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">' + data.specification +
  1210. ' </td>' +
  1211. ' <td style="vertical-align: middle !important;width: 30px;text-align: center;">' + data.quantity +
  1212. ' </td>' +
  1213. ' </tr>';
  1214. }
  1215. $('#fsk_tbody').append(htm);
  1216. $('#startDate').html(format(startDate, "yyyy-MM-dd"));
  1217. $('#endDate').html(format(endDate, "yyyy-MM-dd"));
  1218. //setPrint();
  1219. LODOP = getLodop();
  1220. LODOP.PRINT_INITA(6, 0, "241mm", "93.3mm", "放射科发药记录单");
  1221. LODOP.SET_PRINT_STYLE("FontSize", 9); //字体大小
  1222. //设置默认打印机
  1223. LODOP.SET_PRINTER_INDEX(fskPrintIndex);
  1224. LODOP.SET_PRINT_PAGESIZE(1, '241mm', '93.3mm', "CreateCustomPage");
  1225. LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "241mm");
  1226. LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "93.3mm");
  1227. LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "放射科发药记录单");//对新建的纸张重命名
  1228. LODOP.ADD_PRINT_HTM("5mm", "20%", "60%", "93.3mm", $("div[id='print_view_fsk']").html());
  1229. LODOP.PREVIEW();
  1230. //LODOP.PREVIEW();
  1231. successMesage(res);
  1232. } else {
  1233. errorMesage(res);
  1234. }
  1235. }
  1236. });
  1237. }
  1238. /**
  1239. * 已发药和未发药记录构建列表查询参数
  1240. * @param params
  1241. */
  1242. function queryParams(params) {
  1243. var rePortRangeArr = getRePortRangeArr();
  1244. let warnDept;
  1245. if ($("#unitCode").val() == null) {
  1246. warnDept = null;
  1247. } else {
  1248. warnDept = $("#unitCode").val()[0]
  1249. }
  1250. var temp = {
  1251. pageSize: params.limit, //页面大小
  1252. pageIndex: params.offset / params.limit, //页码
  1253. beginDate: rePortRangeArr[0],
  1254. endDate: rePortRangeArr[1],
  1255. name: $("#nameSearch").val() == "" ? null : $("#nameSearch").val(),
  1256. patientId: $("#patientId").val() == "" ? null : $("#patientId").val(),
  1257. confirmFlag: $("#confirmFlagSearch").val(),
  1258. realNo: $("#realNoSearch").val() == "" ? null : $("#realNoSearch").val(),
  1259. warnDept: warnDept,
  1260. groupNoOut: groupNo,
  1261. winNo: winNo,
  1262. isSendAndMatch: 1,
  1263. sortType: $("#sortType option:selected").val()
  1264. };
  1265. return temp;
  1266. };
  1267. /**
  1268. * 放射科发药记录构建列表查询参数
  1269. * @param params
  1270. */
  1271. function radSendRecordQueryParams(params) {
  1272. var temp = {
  1273. pageSize: params.limit, //页面大小
  1274. pageIndex: params.offset / params.limit //页码
  1275. };
  1276. return temp;
  1277. };
  1278. /**
  1279. * 获取时间选择器的时间数组
  1280. * @returns {string[]}
  1281. */
  1282. function getRePortRangeArr() {
  1283. var rePortRange = $('#reportrange span').html();
  1284. var rePortRangeArr = rePortRange.split(" - ");
  1285. rePortRangeArr[0] = rePortRangeArr[0] + " 00:00:00"
  1286. rePortRangeArr[1] = rePortRangeArr[1] + " 23:59:59"
  1287. return rePortRangeArr;
  1288. }
  1289. /**
  1290. * 清空查询条件
  1291. */
  1292. function cleanParams() {
  1293. $('#reportrange span').html(moment().format('YYYY-MM-DD') + ' - ' + moment().format('YYYY-MM-DD'));
  1294. $("#nameSearch").val('');
  1295. $("#patientId_or_cardNo").val('');
  1296. $("#patientId").val('');
  1297. $("#realNoSearch").val('');
  1298. $("#unitCode").html('');
  1299. $("#unitCode").selectpicker('refresh');
  1300. var sendRefundGroup = getIndex("send_refund_group");
  1301. sendRefundGroup == 0 ? $("#confirmFlagSearch").selectpicker('val', 0) : $("#confirmFlagSearch").selectpicker('val', 2);
  1302. $("#confirmFlagSearch").selectpicker('refresh');
  1303. $("#patientId_or_cardNo").focus();
  1304. }
  1305. /**
  1306. * 查询病人处方明细
  1307. */
  1308. var $table;
  1309. function prescriptionDetail(realNo, orderNo, receiptNo, times, patientId, confirmFlag, pharPracCertNo) {
  1310. // 设置全局变量,供发药按钮使用
  1311. window.currentPharPracCertNo = pharPracCertNo || '';
  1312. let isXy = yf.xyFlag === '1';
  1313. if (confirmFlag == 5 || confirmFlag == 0) {
  1314. $("#sendDispose").show();//显示
  1315. } else {
  1316. $("#sendDispose").hide();//隐藏
  1317. }
  1318. var temp = {
  1319. groupNo: groupNo,
  1320. realNo: realNo,
  1321. orderNo: orderNo,
  1322. receiptNo: receiptNo,
  1323. times: times,
  1324. patientId: patientId
  1325. };
  1326. $('#tb_table_right').bootstrapTable("destroy");
  1327. $('#tb_table_allergen').bootstrapTable("destroy");
  1328. $table = $('#tb_table_right').bootstrapTable({
  1329. url: '/thmz/getFyclPrescriptionDetail', //请求后台的URL(*)
  1330. method: 'POST', //请求方式(*)
  1331. striped: true, //是否显示行间隔色
  1332. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  1333. pagination: true, //是否显示分页(*)
  1334. sortable: true, //是否启用排序
  1335. sortOrder: "asc", //排序方式
  1336. queryParams: JSON.stringify(temp), //传递参数(*)
  1337. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  1338. pageNumber: 1, //初始化加载第一页,默认第一页
  1339. pageSize: 10, //每页的记录行数(*)
  1340. pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
  1341. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  1342. strictSearch: true,
  1343. showColumns: false, //是否显示所有的列
  1344. showRefresh: false, //是否显示刷新按钮
  1345. minimumCountColumns: 2, //最少允许的列数
  1346. clickToSelect: true, //是否启用点击选中行
  1347. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  1348. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  1349. cardView: false, //是否显示详细视图
  1350. detailView: false,
  1351. //rowStyle:rowStyle,//通过自定义函数设置行样式
  1352. ajaxOptions: {
  1353. headers: {
  1354. 'Accept': 'application/json',
  1355. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  1356. }
  1357. },
  1358. columns: [
  1359. {
  1360. field: 'manuNo',
  1361. title: '批号',
  1362. align: "center",
  1363. valign: 'middle'
  1364. },{
  1365. field: 'location',
  1366. title: '货位号',
  1367. align: "center",
  1368. valign: 'middle'
  1369. }, {
  1370. field: 'drugname',
  1371. title: '品名',
  1372. align: "center",
  1373. valign: 'middle',
  1374. }, {
  1375. field: 'specification',
  1376. title: '规格',
  1377. align: "center",
  1378. valign: 'middle',
  1379. }, {
  1380. field: 'quantity',
  1381. title: '<span style="color: green">数量</span>',
  1382. align: "center",
  1383. valign: 'middle',
  1384. formatter: function (value, row, index) {
  1385. return '<span style="color: green">' + value + '</span>'
  1386. }
  1387. }, {
  1388. field: 'ypUnitName',
  1389. title: '单位',
  1390. align: "center",
  1391. valign: 'middle',
  1392. }, {
  1393. field: 'abbrName',
  1394. title: '生产厂家',
  1395. align: "center",
  1396. valign: 'middle',
  1397. visible: isXy
  1398. }, {
  1399. field: 'drugQuan',
  1400. title: '一次剂量',
  1401. align: "center",
  1402. valign: 'middle',
  1403. }, {
  1404. field: 'drugUnitName',
  1405. title: '单位',
  1406. align: "center",
  1407. valign: 'middle',
  1408. }, {
  1409. field: 'frequency',
  1410. title: '频率',
  1411. align: "center",
  1412. valign: 'middle',
  1413. visible: isXy
  1414. }, {
  1415. field: 'decAmount',
  1416. title: '<span style="color: red">退药量</span>',
  1417. align: "center",
  1418. valign: 'middle',
  1419. formatter: function (value, row, index) {
  1420. return value == null ? '<span style="color: red">-</span>' : '<span style="color: red">' + value + '</span>'
  1421. }
  1422. }, {
  1423. field: 'printName',
  1424. title: '给药方式',
  1425. align: "center",
  1426. valign: 'middle',
  1427. visible: isXy
  1428. }, {
  1429. field: 'unitPrice',
  1430. title: '单价',
  1431. align: "center",
  1432. valign: 'middle',
  1433. }
  1434. , {
  1435. field: 'drugFlag',//毒麻标志:1:毒;2:麻;3:精神1;4:精神2
  1436. title: '<span style="color: red">毒麻</span>',
  1437. align: "center",
  1438. valign: 'middle',
  1439. formatter: function (value, row, index) {
  1440. if (value == 1) {
  1441. return '<span style="color: red">毒</span>'
  1442. } else if (value == 2) {
  1443. return '<span style="color: red">麻</span>'
  1444. } else if (value == 3) {
  1445. return '<span style="color: red">精神1</span>'
  1446. } else if (value == 4) {
  1447. return '<span style="color: red">精神2</span>'
  1448. } else {
  1449. return '<span style="color: red">-</span>'
  1450. }
  1451. }
  1452. }
  1453. , {
  1454. field: 'stockAmount',
  1455. title: '当前库存',
  1456. align: "center",
  1457. valign: 'middle',
  1458. }
  1459. , {
  1460. field: 'drugWin',
  1461. title: '副数',
  1462. align: "center",
  1463. valign: 'middle',
  1464. visible: !isXy
  1465. }
  1466. , {
  1467. field: 'nationalCode',
  1468. title: '医保编码',
  1469. align: ";left",
  1470. valign: 'middle',
  1471. formatter: function (value, row, index) {
  1472. return value == null ? "-" : value;
  1473. }
  1474. }
  1475. , {
  1476. field: 'employeeName',
  1477. title: '医生姓名',
  1478. visible: false // 隐藏列,仅用于数据传递
  1479. }, {
  1480. field: 'mdtrtSetlType',
  1481. title: '结算类型',
  1482. align: "center",
  1483. valign: 'middle',
  1484. width: 80,
  1485. formatter: function (value, row, index) {
  1486. // 根据处方类型判断:普通处方(1)、特门处方(3)、GCP实验(4)为自费,门诊统筹(2)为医保
  1487. if (value == 1) {
  1488. return '<span style="color: #007bff; font-weight: bold;">医保</span>';
  1489. } else {
  1490. return '<span style="color: #28a745; font-weight: bold;">自费</span>';
  1491. }
  1492. }
  1493. }, {
  1494. field: 'serial',
  1495. title: '拆零状态',
  1496. align: "center",
  1497. valign: 'middle',
  1498. width: 80,
  1499. formatter: function (value, row, index) {
  1500. if (value === '01') {
  1501. return '<span style="color: #dc3545; font-weight: bold;">拆零</span>';
  1502. } else if (value === '99') {
  1503. return '<span style="color: #6c757d;">不拆零</span>';
  1504. } else {
  1505. return '<span style="color: #6c757d;">-</span>';
  1506. }
  1507. }
  1508. }, {
  1509. field: 'drugTracCodg',
  1510. title: '药品追溯码',
  1511. width: '270',
  1512. align: "left",
  1513. valign: 'middle',
  1514. formatter: function (value, row, index) {
  1515. return isEmpty(value)?'':value
  1516. }
  1517. }
  1518. ],
  1519. /**
  1520. * @param {点击列的 field 名称} field
  1521. * @param {点击列的 value 值} value
  1522. * @param {点击列的整行数据} row
  1523. * @param {td 元素} $element
  1524. */
  1525. // onClickCell: function (field, value, row, $element) {
  1526. // if (field === 'drugTracCodg') {
  1527. // $element.attr('contenteditable', true);
  1528. // $element.focus();
  1529. // $element.blur(function () {
  1530. // let index = $element.parent().data('index');
  1531. // let tdValue = $element.html();
  1532. // saveCellData($('#tb_table_right'), index, field, tdValue);
  1533. // })
  1534. // }
  1535. // },
  1536. onClickCell: function (field, value, row, $element) {
  1537. if (field === 'drugTracCodg') {
  1538. $element.attr('contenteditable', true);
  1539. $element.focus();
  1540. // 添加扫码输入监听(带防抖)
  1541. let inputTimer = null;
  1542. let lastInputValue = '';
  1543. $element.off('input.scan').on('input.scan', function(e) {
  1544. // 使用innerHTML获取包含<br>的完整内容
  1545. let inputValue = e.target.innerHTML;
  1546. console.log('扫码输入事件触发,输入值:', inputValue);
  1547. console.log('输入值长度:', inputValue ? inputValue.length : 0);
  1548. console.log('输入值是否包含<br>:', inputValue ? inputValue.includes('<br>') : false);
  1549. // 清除之前的定时器
  1550. if (inputTimer) {
  1551. clearTimeout(inputTimer);
  1552. }
  1553. // 设置防抖定时器,0.5秒后触发验证
  1554. inputTimer = setTimeout(function() {
  1555. if (inputValue && inputValue.length > 0) {
  1556. // 直接按<br>分割,获取所有追溯码
  1557. let codes = inputValue.split('<br>').filter(code => code.length > 0);
  1558. console.log('分割后的追溯码列表:', codes);
  1559. // 检查最后一个追溯码是否为20位或以上
  1560. if (codes.length > 0) {
  1561. let lastCode = codes[codes.length - 1];
  1562. console.log('最后一个追溯码:', lastCode);
  1563. console.log('最后一个追溯码长度:', lastCode.length);
  1564. if (lastCode.length >= 20) {
  1565. console.log('防抖触发,准备验证追溯码:', lastCode);
  1566. // 验证最后一个完整的追溯码
  1567. validateAndAddTracCodg(lastCode, row, $element);
  1568. } else {
  1569. console.log('最后一个追溯码长度不正确,不进行验证:', lastCode.length);
  1570. // 添加报错提示
  1571. errorMesageSimaple('追溯码长度不正确,应为20位或以上,当前为' + lastCode.length + '位');
  1572. // 去掉长度不正确的追溯码
  1573. codes.pop();
  1574. // 重新设置单元格内容
  1575. let newContent = codes.join('<br>');
  1576. if (newContent) {
  1577. newContent += '<br>';
  1578. }
  1579. $element.html(newContent);
  1580. // 保持焦点在单元格末尾,让用户可以继续扫码
  1581. $element.focus();
  1582. // 将光标移动到内容末尾
  1583. let range = document.createRange();
  1584. let selection = window.getSelection();
  1585. range.selectNodeContents($element[0]);
  1586. range.collapse(false); // false表示移动到末尾
  1587. selection.removeAllRanges();
  1588. selection.addRange(range);
  1589. }
  1590. } else {
  1591. console.log('没有找到有效的追溯码');
  1592. }
  1593. }
  1594. }, 500);
  1595. });
  1596. // 保持原有的失去焦点保存逻辑
  1597. $element.off('blur.save').on('blur.save', function () {
  1598. let index = $element.parent().data('index');
  1599. let tdValue = $element.html();
  1600. saveCellData($('#tb_table_right'), index, field, tdValue);
  1601. });
  1602. }
  1603. },
  1604. responseHandler: function (res) {
  1605. if (res == '401' || res == 401) {
  1606. window.location.href = '/thmz/login/view'
  1607. return;
  1608. }
  1609. var ress = eval(res);
  1610. if (ress.data.length > 0) {
  1611. $("#employeeNameLabel").val(ress.data[0].employeeName);
  1612. $("#warnDeptNameLabel").val(ress.data[0].warnDeptName);
  1613. $("#chargeDateLabel").val(format(ress.data[0].chargeDate, "yyyy-MM-dd HH:mm:ss"));
  1614. $("#icdTextLabel").val(ress.data[0].icdText);
  1615. $("#orderNoLabel").val(ress.data[0].orderNo);
  1616. $("#receiptNoLabel").val(ress.data[0].receiptNo);
  1617. $("#timesLabel").val(ress.data[0].times);
  1618. $("#nameLabel").val(ress.data[0].name);
  1619. $("#patientIdLabel").val(ress.data[0].patientId);
  1620. $("#realNoLabel").val(ress.data[0].realNo);
  1621. }
  1622. if(ress.patientAllergenInfoList){
  1623. callAllergenInfo(ress.patientAllergenInfoList)
  1624. }
  1625. if (ress.code == -1) {
  1626. if (ress.message != null && ress.message != '') {
  1627. new PNotify({
  1628. title: '错误提示',
  1629. text: ress.message,
  1630. type: 'error',
  1631. hide: true,
  1632. styling: 'bootstrap3'
  1633. });
  1634. }
  1635. return {
  1636. "total": 0,//总页数
  1637. "rows": {} //数据
  1638. };
  1639. }
  1640. return {
  1641. "total": ress.data.length,//总页数
  1642. "rows": ress.data //数据
  1643. };
  1644. },
  1645. onLoadSuccess: function (res) { //加载成功时执行
  1646. var sendTotalAmount = 0;
  1647. for (var i = 0; i < res.rows.length; i++) {
  1648. sendTotalAmount += parseFloat(res.rows[i].quantity * res.rows[i].unitPrice * res.rows[i].drugWin);
  1649. }
  1650. $('#sendTotalAmount').html(sendTotalAmount.toFixed(2));//toFixed(2),保留2位小数,避免js中小数相加小数点后面多出很多位
  1651. },
  1652. });
  1653. $("#cfxxModal").modal();
  1654. }
  1655. /**
  1656. * 查询病人处方药品明细
  1657. */
  1658. function fitfymx(patientId, times, receiptNo, orderNo, groupNoOut) {
  1659. var temp = {
  1660. patientId: patientId,
  1661. times: times,
  1662. receiptNo: receiptNo,
  1663. orderNo: orderNo,
  1664. groupNoOut: groupNoOut,
  1665. confirmFlag: $("#confirmFlagSearch").val()
  1666. };
  1667. $('#tb_table_right_ty').bootstrapTable("destroy");
  1668. $table = $('#tb_table_right_ty').bootstrapTable({
  1669. url: '/thmz/getRefundYpMx', //请求后台的URL(*)
  1670. method: 'post', //请求方式(*)
  1671. striped: true, //是否显示行间隔色
  1672. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  1673. pagination: true, //是否显示分页(*)
  1674. sortable: true, //是否启用排序
  1675. sortOrder: "asc", //排序方式
  1676. queryParams: temp, //传递参数(*)
  1677. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  1678. pageNumber: 1, //初始化加载第一页,默认第一页
  1679. pageSize: 10, //每页的记录行数(*)
  1680. pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
  1681. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  1682. strictSearch: true,
  1683. showColumns: false, //是否显示所有的列
  1684. showRefresh: false, //是否显示刷新按钮
  1685. minimumCountColumns: 2, //最少允许的列数
  1686. clickToSelect: true, //是否启用点击选中行
  1687. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  1688. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  1689. cardView: false, //是否显示详细视图
  1690. detailView: false,
  1691. paginationDetailHAlign: ' hidden',//隐藏左侧分页信息
  1692. //rowStyle:rowStyle,//通过自定义函数设置行样式
  1693. ajaxOptions: {
  1694. headers: {
  1695. 'Accept': 'application/json',
  1696. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  1697. }
  1698. },
  1699. columns: [
  1700. {
  1701. field: 'charge_item_code',
  1702. title: '编码',
  1703. align: "center",
  1704. valign: 'middle'
  1705. },{
  1706. field: 'drugname',
  1707. title: '品名',
  1708. align: "center",
  1709. valign: 'middle',
  1710. formatter: function (value, row, index) {
  1711. if (value != null && value != "") {
  1712. return value.replace("()", "");
  1713. }
  1714. return "";
  1715. }
  1716. }, {
  1717. field: 'specification',
  1718. title: '规格',
  1719. align: "center",
  1720. valign: 'middle',
  1721. }, {
  1722. field: 'quantity',
  1723. title: '数量',
  1724. align: "center",
  1725. valign: 'middle',
  1726. }, {
  1727. field: 'unit_price',
  1728. title: '单价',
  1729. align: "center",
  1730. valign: 'middle',
  1731. }, {
  1732. field: 'dec_amount',
  1733. title: '<span style="color: red">退药量</span>',
  1734. align: "center",
  1735. valign: 'middle',
  1736. formatter: function (value, row, index) {
  1737. return '<span style="color: red">' + value + '</span>'
  1738. }
  1739. }, {
  1740. field: 'refund_medicine_remark',
  1741. title: '退药原因',
  1742. align: "center",
  1743. valign: 'middle',
  1744. formatter: function (value, row, index) {
  1745. if(row.dec_amount > 0){
  1746. return value;
  1747. } else {
  1748. return ''
  1749. }
  1750. }
  1751. }
  1752. ],
  1753. responseHandler: function (res) {
  1754. if (res == '401' || res == 401) {
  1755. window.location.href = '/thmz/login/view'
  1756. return;
  1757. }
  1758. var ress = eval(res);
  1759. if (ress.code == -1) {
  1760. if (ress.message != null && ress.message != '') {
  1761. new PNotify({
  1762. title: '错误提示',
  1763. text: ress.message,
  1764. type: 'error',
  1765. hide: true,
  1766. styling: 'bootstrap3'
  1767. });
  1768. }
  1769. return {
  1770. "total": 0,//总页数
  1771. "rows": {} //数据
  1772. };
  1773. }
  1774. return {
  1775. "total": ress.data.length,//总页数
  1776. "rows": ress.data //数据
  1777. };
  1778. },
  1779. onLoadSuccess: function (res) { //加载成功时执行
  1780. var returnTotalAmount = 0;
  1781. var returnAmount = 0;
  1782. for (var i = 0; i < res.rows.length; i++) {
  1783. returnTotalAmount += parseFloat(res.rows[i].quantity * res.rows[i].unit_price);
  1784. returnAmount += parseFloat(res.rows[i].dec_amount * res.rows[i].unit_price);
  1785. }
  1786. $('#returnTotalAmount').html(returnTotalAmount.toFixed(2));//toFixed(2),保留2位小数,避免js中小数相加小数点后面多出很多位
  1787. $('#returnAmount').html(returnAmount.toFixed(2));//toFixed(2),保留2位小数,避免js中小数相加小数点后面多出很多位
  1788. },
  1789. });
  1790. }
  1791. /**
  1792. * 退药处理
  1793. */
  1794. function saveRefundMedicine() {
  1795. let zt = $("#confirmFlagSearch").val()
  1796. // 检查是否需要进行追溯码匹配
  1797. if (zt === '2') {
  1798. // 检查是否已经完成匹配
  1799. if (!isTyOk) {
  1800. return errorMesageSimaple('请先匹配退药药品追溯码!');
  1801. }
  1802. // 获取退药表格数据,检查是否所有需要退药的药品都已匹配
  1803. let tyTable = $('#ty_table_detail').bootstrapTable("getData");
  1804. let refundData = window.currentRefundData || $table.bootstrapTable('getData');
  1805. // ========== 调试日志开始 ==========
  1806. console.log('=== saveRefundMedicine 调试信息 ===');
  1807. console.log('refundData 样本:', refundData.length > 0 ? refundData[0] : '空数组');
  1808. console.log('tyTable 样本:', tyTable.length > 0 ? tyTable[0] : '空数组');
  1809. console.log('refundData 总数量:', refundData.length);
  1810. console.log('tyTable 总数量:', tyTable.length);
  1811. // ========== 调试日志结束 ==========
  1812. let needRefundItems = [];
  1813. // 找出需要退药的药品
  1814. refundData.forEach(function (item, index, arr) {
  1815. if (item.dec_amount != 0) {
  1816. needRefundItems.push({
  1817. chargeItemCode: item.charge_item_code,
  1818. serial: item.serial,
  1819. itemNo: item.item_no
  1820. });
  1821. }
  1822. });
  1823. // ========== 调试日志开始 ==========
  1824. console.log('needRefundItems:', needRefundItems);
  1825. console.log('第一个需要退药的药品字段信息:');
  1826. if (needRefundItems.length > 0) {
  1827. console.log('- chargeItemCode:', needRefundItems[0].chargeItemCode);
  1828. console.log('- serial:', needRefundItems[0].serial);
  1829. console.log('- itemNo:', needRefundItems[0].itemNo);
  1830. }
  1831. // ========== 调试日志结束 ==========
  1832. // 检查每个需要退药的药品是否都已匹配
  1833. let allMatched = true;
  1834. let unmatchedItems = [];
  1835. for (let i = 0; i < tyTable.length; i++) {
  1836. let item = tyTable[i];
  1837. // 检查这个药品是否需要退药
  1838. let needRefund = needRefundItems.some(function(refundItem) {
  1839. return refundItem.chargeItemCode === item.chargeItemCode &&
  1840. refundItem.serial === item.serial &&
  1841. refundItem.itemNo === item.itemNo;
  1842. });
  1843. if (needRefund) {
  1844. // 检查是否已匹配
  1845. if (isEmpty(item.matchOk) || item.matchOk.indexOf('已匹配') === -1) {
  1846. allMatched = false;
  1847. unmatchedItems.push(item.drugName || '未知药品');
  1848. }
  1849. }
  1850. }
  1851. if (!allMatched) {
  1852. return errorMesageSimaple('还有药品未匹配追溯码:' + unmatchedItems.join('、') + ',请完成匹配后再退药!');
  1853. }
  1854. }
  1855. var row = $("#tb_table").bootstrapTable('getSelections');
  1856. if (row.length != 1) {
  1857. return errorMesageSimaple('请选择一条处方数据');
  1858. }
  1859. if (row[0].confirmFlag == 3) {
  1860. return errorMesageSimaple('请勿重复退药');
  1861. }
  1862. var data = $table.bootstrapTable('getData');
  1863. var datas = [];
  1864. var i = 0;
  1865. data.forEach(function (item, index, arr) {
  1866. if (item.dec_amount != 0) {
  1867. // 调试日志
  1868. console.log('=== 退药参数调试 ===');
  1869. console.log('item.patient_id:', item.patient_id);
  1870. console.log('item.times:', item.times);
  1871. console.log('item.receipt_no:', item.receipt_no);
  1872. console.log('item.order_no:', item.order_no);
  1873. console.log('item.real_no:', item.real_no);
  1874. console.log('item.dec_amount:', item.dec_amount);
  1875. console.log('item.unit_price:', item.unit_price);
  1876. console.log('item.charge_item_code:', item.charge_item_code);
  1877. console.log('item.serial:', item.serial);
  1878. console.log('item.group_no:', item.group_no);
  1879. console.log('item.item_no:', item.item_no);
  1880. console.log('item.serial_no:', item.serial_no);
  1881. var tem = {
  1882. "patientId": item.patient_id,
  1883. "times": item.times,
  1884. "receiptNo": item.receipt_no,
  1885. "orderNo": item.order_no,
  1886. "realNo": item.real_no,
  1887. "decAmount": item.dec_amount,
  1888. "unitPrice": item.unit_price,
  1889. "chargeCode": item.charge_item_code,
  1890. "serial": item.serial,
  1891. "groupNo": item.group_no,
  1892. "itemNo": item.item_no,
  1893. "serialNo": item.serial_no
  1894. }
  1895. datas[i] = tem;
  1896. i++;
  1897. }
  1898. })
  1899. if (datas.length == 0) {
  1900. return errorMesageSimaple('退药处方可退药药品为空');
  1901. }
  1902. if (!confirm("确定要对当前处方的药品进行退药处理吗?")) {
  1903. return;
  1904. }
  1905. $("#btn_ty").attr("disabled", true);
  1906. $.ajax({
  1907. type: "POST",
  1908. url: '/thmz/refundMedicineProcessing',
  1909. contentType: "application/json;charset=UTF-8",
  1910. dataType: "json",
  1911. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  1912. data: JSON.stringify(datas),
  1913. success: function (res) {
  1914. // ========== 调试日志:AJAX成功响应 ==========
  1915. console.log('=== AJAX成功响应 ===');
  1916. console.log('响应状态: 成功');
  1917. console.log('响应数据:', res);
  1918. $("#btn_ty").attr("disabled", false);
  1919. if (res == '401' || res == 401) {
  1920. console.error('认证失败,跳转到登录页面');
  1921. window.location.href = '/thmz/login/view'
  1922. return;
  1923. }
  1924. if (res.code == 0) {
  1925. console.log('退药处理成功');
  1926. successMesage(res);
  1927. // ========== 调用退药医保接口 ==========
  1928. console.log('=== 开始调用退药医保接口 ===');
  1929. // 获取退药记录的基本信息
  1930. let refundData = $table.bootstrapTable('getData');
  1931. if (refundData && refundData.length > 0) {
  1932. let firstItem = refundData[0];
  1933. let patientId = firstItem.patient_id;
  1934. let times = firstItem.times;
  1935. let receiptNo = firstItem.receipt_no;
  1936. let orderNo = firstItem.order_no;
  1937. let realNo = Math.abs(firstItem.real_no); // 保证 realNo 为正数
  1938. let name = firstItem.name;
  1939. console.log('退药医保接口参数:', {
  1940. patientId: patientId,
  1941. times: times,
  1942. receiptNo: receiptNo,
  1943. orderNo: orderNo,
  1944. realNo: realNo,
  1945. name: name
  1946. });
  1947. // 调用退药医保接口
  1948. callYbReturnGoodsItem(realNo, orderNo, receiptNo, times, patientId, name);
  1949. } else {
  1950. console.warn('没有退药数据,跳过医保接口调用');
  1951. }
  1952. // 退药成功后重置匹配状态和全局数据
  1953. isTyOk = false;
  1954. window.currentRefundData = null;
  1955. initTbTable();
  1956. } else {
  1957. console.error('退药处理失败:', res.message);
  1958. errorMesage(res);
  1959. }
  1960. },
  1961. error: function () {
  1962. $("#btn_ty").attr("disabled", false);
  1963. }
  1964. });
  1965. }
  1966. /**
  1967. * 撤销退药处理
  1968. */
  1969. function saveCancelRefundMedicine() {
  1970. var row = $("#tb_table").bootstrapTable('getSelections');
  1971. console.log("row11111111111111111111111111111111",row)
  1972. if (row.length != 1) {
  1973. return errorMesageSimaple('请选择一条处方数据');
  1974. }
  1975. if (row[0].confirmFlag != 3) {
  1976. return errorMesageSimaple('请选择已退药记录');
  1977. }
  1978. if (!confirm("确定要撤销当前处方的退药吗?")) {
  1979. return;
  1980. }
  1981. $("#btn_cancel_ty").attr("disabled", true);
  1982. request({
  1983. url: '/cancelRefundMedicineProcessing',
  1984. method: 'GET',
  1985. data: {
  1986. realNo: row[0].realNo,
  1987. groupNo: groupNo,
  1988. receiptNo: row[0].receiptNo,
  1989. orderNo: row[0].orderNo,
  1990. patientId: row[0].patientId,
  1991. times: row[0].times
  1992. }
  1993. }).then((res) => {
  1994. $("#btn_cancel_ty").attr("disabled", false);
  1995. successMesage(res);
  1996. // ========== 调用撤销退药医保接口 ==========
  1997. console.log('=== 开始调用撤销退药医保接口 ===');
  1998. // 获取撤销退药记录的基本信息
  1999. let patientId = row[0].patientId;
  2000. let times = row[0].times;
  2001. let receiptNo = row[0].receiptNo;
  2002. let orderNo = row[0].orderNo;
  2003. let realNo = row[0].realNo;
  2004. let name = row[0].name;
  2005. let doctorName = row[0].doctorName;
  2006. console.log('撤销退药医保接口参数:', {
  2007. patientId: patientId,
  2008. times: times,
  2009. receiptNo: receiptNo,
  2010. orderNo: orderNo,
  2011. realNo: realNo,
  2012. name: name
  2013. });
  2014. // 调用撤销退药医保接口
  2015. callYbSaleGoodsItemForCancelRefund(realNo, orderNo, receiptNo, times, patientId, name, doctorName);
  2016. initTbTable();
  2017. },err =>{
  2018. $("#btn_cancel_ty").attr("disabled",false);
  2019. })
  2020. }
  2021. /**
  2022. * 叫号
  2023. * @param patientId
  2024. * @param name
  2025. */
  2026. function callNumber(patientId, name) {
  2027. $.ajax({
  2028. type: "GET",
  2029. url: '/thmz/callNumber?patientId=' + patientId + "&winNo=" + winNo,
  2030. contentType: "application/json;charset=UTF-8",
  2031. dataType: "json",
  2032. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  2033. success: function (res) {
  2034. if (res == '401' || res == 401) {
  2035. window.location.href = '/thmz/login/view'
  2036. return;
  2037. }
  2038. if (res.code == 0) {
  2039. //jhRecord.push(patientId);
  2040. pastList[pastList.length] = {name: name, patient_id: patientId};
  2041. window.localStorage["pastList"] = JSON.stringify(pastList);
  2042. successMesage(res);
  2043. } else {
  2044. errorMesage(res);
  2045. }
  2046. }
  2047. });
  2048. }
  2049. // 添加门诊过敏史
  2050. var $tableAllergen;
  2051. function callAllergenInfo(allergenList){
  2052. $tableAllergen = $('#tb_table_allergen').bootstrapTable({
  2053. data:allergenList,
  2054. striped: true, //是否显示行间隔色
  2055. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  2056. pagination: false, //是否显示分页(*)
  2057. sortable: false, //是否启用排序
  2058. sortOrder: "asc", //排序方式
  2059. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  2060. pageNumber: 1, //初始化加载第一页,默认第一页
  2061. pageSize: 10, //每页的记录行数(*)
  2062. pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
  2063. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  2064. strictSearch: true,
  2065. showColumns: false, //是否显示所有的列
  2066. showRefresh: false, //是否显示刷新按钮
  2067. minimumCountColumns: 2, //最少允许的列数
  2068. clickToSelect: true, //是否启用点击选中行
  2069. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  2070. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  2071. cardView: false, //是否显示详细视图
  2072. detailView: false,
  2073. //rowStyle:rowStyle,//通过自定义函数设置行样式
  2074. ajaxOptions: {
  2075. headers: {
  2076. 'Accept': 'application/json',
  2077. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  2078. }
  2079. },
  2080. columns: [
  2081. {
  2082. field: 'patNo',
  2083. title: '门诊号',
  2084. align: "center",
  2085. valign: 'middle'
  2086. },{
  2087. field: 'allergenCode',
  2088. title: '过敏源编码',
  2089. align: "center",
  2090. valign: 'middle'
  2091. }, {
  2092. field: 'allergenName',
  2093. title: '过敏源',
  2094. align: "center",
  2095. valign: 'middle',
  2096. }
  2097. ],
  2098. responseHandler: function (res) {
  2099. if (res == '401' || res == 401) {
  2100. window.location.href = '/thmz/login/view'
  2101. return;
  2102. }
  2103. if (ress.code == -1) {
  2104. if (ress.message != null && ress.message != '') {
  2105. new PNotify({
  2106. title: '错误提示',
  2107. text: ress.message,
  2108. type: 'error',
  2109. hide: true,
  2110. styling: 'bootstrap3'
  2111. });
  2112. }
  2113. return {
  2114. "total": 0,//总页数
  2115. "rows": {} //数据
  2116. };
  2117. }
  2118. return {
  2119. "total": ress.data.length,//总页数
  2120. "rows": ress.data //数据
  2121. };
  2122. }
  2123. });
  2124. }
  2125. function callHistoryDetail() {
  2126. if(coreId){
  2127. prescriptionHistoryDetail(coreId, '1');
  2128. }
  2129. }
  2130. // 查看历史处方
  2131. let $historyTable
  2132. function prescriptionHistoryDetail(patientId, type){
  2133. coreId = patientId
  2134. if(type === '0'){
  2135. daterangepickerNew('reportRangeList', 'center');
  2136. initSelectHistory();
  2137. }
  2138. $('#tb_table_history').bootstrapTable("destroy");
  2139. $historyTable = $('#tb_table_history').bootstrapTable({
  2140. url: '/thmz/getMzBlRecordList', //请求后台的URL(*)
  2141. method: 'post', //请求方式(*)
  2142. toolbar: '#toolbar', //工具按钮用哪个容器
  2143. striped: true, //是否显示行间隔色
  2144. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  2145. pagination: true, //是否显示分页(*)
  2146. sortable: true, //是否启用排序
  2147. sortOrder: "desc", //排序方式
  2148. queryParams: queryDataS, //传递参数(*)
  2149. sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
  2150. pageNumber: 1, //初始化加载第一页,默认第一页
  2151. pageSize: 5, //每页的记录行数(*)
  2152. pageList: [5, 10, 15, 25, 30], //可供选择的每页的行数(*)
  2153. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  2154. strictSearch: true,
  2155. showColumns: false, //是否显示所有的列
  2156. showRefresh: false, //是否显示刷新按钮
  2157. minimumCountColumns: 2, //最少允许的列数
  2158. clickToSelect: true, //是否启用点击选中行
  2159. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  2160. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  2161. cardView: false, //是否显示详细视图
  2162. detailView: false,
  2163. //rowStyle:rowStyle,//通过自定义函数设置行样式
  2164. ajaxOptions: {
  2165. headers: {
  2166. 'Accept': 'application/json',
  2167. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  2168. }
  2169. },
  2170. columns: [
  2171. {
  2172. title: '操作',
  2173. field: 'op',
  2174. align: "center",
  2175. valign: 'middle',
  2176. formatter: function (value, row, index) {
  2177. var str = '<button type="button" class="btn btn-primary btn-sm" onclick="showMzBlRecordModal(\'' + row.patientId + '\',' + row.times + ',3)">查看</button>';
  2178. return [str].join('');
  2179. }
  2180. },
  2181. {
  2182. field: 'patientId',
  2183. title: '门诊ID',
  2184. align: "center",
  2185. valign: 'middle'
  2186. }, {
  2187. field: 'patientName',
  2188. title: '患者姓名',
  2189. align: "center",
  2190. valign: 'middle'
  2191. }, {
  2192. field: 'deptCode',
  2193. title: '就诊科室',
  2194. align: "center",
  2195. valign: 'middle'
  2196. }, {
  2197. field: 'doctorCode',
  2198. title: '接诊医师',
  2199. align: "center",
  2200. valign: 'middle'
  2201. }, {
  2202. field: 'firstOrNot',
  2203. title: '初/复诊',
  2204. align: "center",
  2205. valign: 'middle',
  2206. formatter: function (value, row, index) {
  2207. if (value == '1') {
  2208. return "复诊";
  2209. }
  2210. return "初诊";
  2211. }
  2212. }
  2213. , {
  2214. field: 'visitDate',
  2215. title: '就诊时间',
  2216. align: "center",
  2217. valign: 'middle',
  2218. formatter: function (value, row, index) {
  2219. if (value == null || value == "") {
  2220. return "";
  2221. }
  2222. return format(value, "yyyy-MM-dd HH:mm:ss");
  2223. }
  2224. }
  2225. ],
  2226. responseHandler: function (res) {
  2227. if (res == '401' || res == 401) {
  2228. window.location.href = '/thmz/login/view'
  2229. return;
  2230. }
  2231. var ress = eval(res);
  2232. if (ress.code == -1) {
  2233. if (ress.message != null && ress.message != '') {
  2234. errorMesage(ress);
  2235. }
  2236. return {
  2237. "total": 0,//总页数
  2238. "rows": {} //数据
  2239. };
  2240. }
  2241. return {
  2242. "total": ress.total,//总页数
  2243. "rows": ress.data //数据
  2244. };
  2245. },
  2246. });
  2247. $("#historyModal").modal();
  2248. }
  2249. function showMzBlRecordModal(patientId, times, type) {
  2250. $.ajax({
  2251. type: "GET",
  2252. url: '/thmz/getMzBlrecord?patientId=' + patientId + '&times=' + times,
  2253. contentType: "application/json;charset=UTF-8",
  2254. dataType: "json",
  2255. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  2256. success: function (res) {
  2257. if (res == '401' || res == 401) {
  2258. window.location.href = '/thmz/login/view'
  2259. return;
  2260. }
  2261. if (res.code == 0) {
  2262. var mzPatientMi = res.mzPatientMi;
  2263. $("#editPatientId").text(mzPatientMi.patientId);
  2264. $("#editPatientName").text(mzPatientMi.name);
  2265. $("#editPatientGender").text(mzPatientMi.gender);
  2266. $("#editPatientAge").text(mzPatientMi.ageString);
  2267. var mzBlRecord = res.mzBlRecord;
  2268. $("#editEmrChiefComplaint").val(mzBlRecord.emrChiefComplaint == null ? "" : mzBlRecord.emrChiefComplaint);
  2269. $("#editEmrHpi").val(mzBlRecord.emrHpi == null ? "" : mzBlRecord.emrHpi);
  2270. $("#editEmrPs").val(mzBlRecord.emrPs == null ? "" : mzBlRecord.emrPs);
  2271. $("#editPersonalHistory").val(mzBlRecord.personalHistory == null ? "" : mzBlRecord.personalHistory);
  2272. $("#editFzZl").val(mzBlRecord.fzZl == null ? "" : mzBlRecord.fzZl);
  2273. $("#editCrbHistory").val(mzBlRecord.crbHistory == null ? "" : mzBlRecord.crbHistory);
  2274. $("#editFamilyHistory").val(mzBlRecord.familyHistory == null ? "" : mzBlRecord.familyHistory);
  2275. $("#editObstericalHistory").val(mzBlRecord.obstericalHistory == null ? "" : mzBlRecord.obstericalHistory);
  2276. $("#editQtjc").val(mzBlRecord.emrPe == null ? "" : mzBlRecord.emrPe);
  2277. setSelectedAttr("editZd", mzBlRecord.icdCode, mzBlRecord.icdText);
  2278. var patientAllergenInfoList = res.patientAllergenInfoList;
  2279. if (patientAllergenInfoList != null && patientAllergenInfoList.length > 0) {
  2280. var zdAllergen = [];
  2281. var ypDitList = [];
  2282. var zdAllergenHtml = '';
  2283. var ypDitListHtml = '';
  2284. var zdAllergeCodes = null;
  2285. var zdAllergeTexts = null;
  2286. var ypDitListodes = null;
  2287. var ypDitListTexts = null;
  2288. for (var i = 0; i < patientAllergenInfoList.length; i++) {
  2289. var patientAllergenInfo = patientAllergenInfoList[i];
  2290. if (patientAllergenInfo.type == 0 || patientAllergenInfo.type == '0') {
  2291. zdAllergen[zdAllergen.length] = patientAllergenInfo.allergenCode;
  2292. zdAllergenHtml += '<option value="' + patientAllergenInfo.allergenCode + '">' + patientAllergenInfo.allergenName + '</option>';
  2293. if (zdAllergeCodes == null) {
  2294. zdAllergeCodes = patientAllergenInfo.allergenCode;
  2295. zdAllergeTexts = patientAllergenInfo.allergenName;
  2296. } else {
  2297. zdAllergeCodes += "," + patientAllergenInfo.allergenCode;
  2298. zdAllergeTexts += "," + patientAllergenInfo.allergenName;
  2299. }
  2300. } else if (patientAllergenInfo.type == 1 || patientAllergenInfo.type == '1') {
  2301. ypDitList[ypDitList.length] = patientAllergenInfo.allergenCode;
  2302. ypDitListHtml += '<option value="' + patientAllergenInfo.allergenCode + '">' + patientAllergenInfo.allergenName + '</option>';
  2303. if (zdAllergeCodes == null) {
  2304. ypDitListodes = patientAllergenInfo.allergenCode;
  2305. ypDitListTexts = patientAllergenInfo.allergenName;
  2306. } else {
  2307. ypDitListodes += "," + patientAllergenInfo.allergenCode;
  2308. ypDitListTexts += "," + patientAllergenInfo.allergenName;
  2309. }
  2310. }
  2311. }
  2312. $("#editZdAllergen").empty();
  2313. $('#editZdAllergen').append(zdAllergenHtml);
  2314. $('#editZdAllergen').selectpicker('refresh');
  2315. $("#editYpDitList").empty();
  2316. $('#editYpDitList').append(ypDitListHtml);
  2317. $('#editYpDitList').selectpicker('refresh');
  2318. $("#editZdAllergen").selectpicker('val', zdAllergen);
  2319. $("#editZdAllergen").selectpicker('refresh');
  2320. $("#editYpDitList").selectpicker('val', ypDitList);
  2321. $("#editYpDitList").selectpicker('refresh');
  2322. $("#editZdAllergen").attr("selectedCodes", zdAllergeCodes);
  2323. $("#editZdAllergen").attr("selectedTexts", zdAllergeTexts);
  2324. $("#editYpDitList").attr("selectedCodes", ypDitListodes);
  2325. $("#editYpDitList").attr("selectedTexts", ypDitListTexts);
  2326. }
  2327. var tentativeDiagnosis = mzBlRecord.tentativeDiagnosis == null ? "" : mzBlRecord.tentativeDiagnosis;
  2328. if ((mzBlRecord.icdCode == null || mzBlRecord.icdCode == "") && mzBlRecord.icdText != null && mzBlRecord.icdText != "") {
  2329. if (tentativeDiagnosis == null || tentativeDiagnosis == "") {
  2330. tentativeDiagnosis = mzBlRecord.icdText;
  2331. } else {
  2332. tentativeDiagnosis = mzBlRecord.icdText + " " + tentativeDiagnosis;
  2333. }
  2334. }
  2335. $("#edittentativeDiagnosis").val(tentativeDiagnosis);
  2336. $("#editEmrJkjy").val(mzBlRecord.emrJkjy == null ? "" : mzBlRecord.emrJkjy);
  2337. $("#bl_weight").val(mzBlRecord.weight == 0 ? null : mzBlRecord.weight);
  2338. $("#bl_temperature").val(mzBlRecord.temperature == 0 ? null : mzBlRecord.temperature);
  2339. $("#bl_sphygmus").val(mzBlRecord.sphygmus == 0 ? null : mzBlRecord.sphygmus);
  2340. $("#bl_breathe").val(mzBlRecord.breathe == 0 ? null : mzBlRecord.breathe);
  2341. $("#bl_pressure_high").val(mzBlRecord.pressureHigh == 0 ? null : mzBlRecord.pressureHigh);
  2342. $("#bl_pressure_floor").val(mzBlRecord.pressureFloor == 0 ? null : mzBlRecord.pressureFloor);
  2343. $("#bl_pressure_high_left").val(mzBlRecord.pressureHighLeft == 0 ? null : mzBlRecord.pressureHighLeft);
  2344. $("#bl_pressure_floor_left").val(mzBlRecord.pressureFloorLeft == 0 ? null : mzBlRecord.pressureFloorLeft);
  2345. if (mzBlRecord.emrProcess != null && mzBlRecord.emrProcess != "") {
  2346. var reg = new RegExp("</br>", "g");//g,表示全部替换。
  2347. var editEmrProcess = mzBlRecord.emrProcess.replace(reg, "\n");
  2348. reg = new RegExp("&nbsp;", "g");//g,表示全部替换。
  2349. editEmrProcess = editEmrProcess.replace(reg, "");
  2350. $("#editEmrProcess").val(editEmrProcess);
  2351. } else {
  2352. $("#editEmrProcess").val("");
  2353. }
  2354. if (type == 1) {
  2355. $("#mzBlRecorTitle").html("门诊病历【编辑】");
  2356. $("#setOtherEmrProcess").removeClass("in").addClass("hide");
  2357. $("#openBlRecordModel").removeClass("hide").addClass("in");
  2358. $("#setEmrProcess").removeClass("hide").addClass("in");
  2359. $("#visitingDetailModal").modal("hide");
  2360. } else if (type == 2 || type == 3) {
  2361. $("#mzBlRecorTitle").html("门诊病历【查询】");
  2362. if(type==2){
  2363. $("#setOtherEmrProcess").removeClass("hide").addClass("in");
  2364. }else {
  2365. $("#setOtherEmrProcess").removeClass("in").addClass("hide");
  2366. }
  2367. $("#openBlRecordModel").removeClass("in").addClass("hide");
  2368. $("#setEmrProcess").removeClass("in").addClass("hide");
  2369. //因为预览的时候,关闭预览框没有清空数据,且 此时基础数据的病历次数被清空
  2370. if ($("#mzBlTimes").val() != null && $("#mzBlTimes").val() != "" && ($("#baseMzBlTimes").val() == null || $("#baseMzBlTimes").val() == "")) {
  2371. $("#baseMzBlTimes").val($("#mzBlTimes").val());
  2372. }
  2373. $("#otherBlRecordModal").modal("hide");
  2374. }
  2375. $("#mzBlTimes").val(mzBlRecord.times);
  2376. $("#editMzBlRecordModal").modal();
  2377. } else {
  2378. errorMesage(res);
  2379. }
  2380. }
  2381. });
  2382. }
  2383. function queryDataS(params) {
  2384. var rePortRangeArr = getRePortRangeArr1();
  2385. var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
  2386. patientId: coreId,
  2387. times: '-1', // 这里需要根据patientId精确查找病人的病历,而不是模糊查询
  2388. beginTime: rePortRangeArr[0],
  2389. endTime: rePortRangeArr[1],
  2390. pageSize: params.limit, //页面大小
  2391. pageIndex: params.offset / params.limit, //页码
  2392. };
  2393. return temp;
  2394. }
  2395. function getRePortRangeArr1() {
  2396. var rePortRange = $('#reportRangeList span').html();
  2397. var rePortRangeArr = rePortRange.split(" - ");
  2398. rePortRangeArr[0] = rePortRangeArr[0] + " 00:00:00"
  2399. rePortRangeArr[1] = rePortRangeArr[1] + " 23:59:59"
  2400. return rePortRangeArr;
  2401. }
  2402. /**
  2403. * 清空区域
  2404. */
  2405. function clearInput() {
  2406. $("#editPatientId").text(null);
  2407. $("#editPatientName").text(null);
  2408. $("#editPatientGender").text(null);
  2409. $("#editPatientAge").text(null);
  2410. $("#editEmrChiefComplaint").val(null);
  2411. $("#editEmrHpi").val(null);
  2412. $("#editEmrPs").val(null);
  2413. $("#editPersonalHistory").val(null);
  2414. $("#editFzZl").val(null);
  2415. $("#editCrbHistory").val(null);
  2416. $("#editFamilyHistory").val(null);
  2417. $("#editObstericalHistory").val(null);
  2418. $("#bl_weight").val(null);
  2419. $("#bl_sphygmus").val(null);
  2420. $("#bl_breathe").val(null);
  2421. $("#bl_pressure_high").val(null);
  2422. $("#bl_pressure_floor").val(null);
  2423. $("#bl_pressure_high_left").val(null);
  2424. $("#bl_pressure_floor_left").val(null);
  2425. $("#editQtjc").val(null);
  2426. $("#editZd").selectpicker('val', null);
  2427. $("#editZd").selectpicker('refresh');
  2428. $("#edittentativeDiagnosis").val(null);
  2429. $("#editEmrProcess").val(null);
  2430. $("#editEmrJkjy").val(null);
  2431. $("#mzBlTimes").val(null);
  2432. }
  2433. function initSelectHistory() {
  2434. $('#reportRangeList span').html(moment().subtract(mzHistoryDays, 'days').format('YYYY-MM-DD') + ' - ' + moment().format('YYYY-MM-DD'));
  2435. //select 从后台加载数据,并保留之前选择的内容
  2436. dynamicSelectWithOri("editZd", '/thmz/getAllZdIcdCommonParams?commonParams=',false);
  2437. //过敏源
  2438. dynamicSelectWithOri("editZdAllergen", '/thmz/getZdAllergenListByCode?code=', false);
  2439. //药品列表
  2440. dynamicSelectWithOri("editYpDitList", '/thmz/getYpZdDictListByCode?code=', false);
  2441. }
  2442. // 退药药品追溯码匹配
  2443. function matchingDrugCodg(patientId, times, receiptNo, orderNo, realNo){
  2444. if(yf.xyFlag !== '1'){
  2445. errorMesage("暂时仅门诊西药房发药才进行配药处理!");
  2446. }
  2447. let isXy = yf.xyFlag === '1';
  2448. let tem = {
  2449. patientId: patientId,
  2450. times: times,
  2451. receiptNo: receiptNo,
  2452. orderNo: orderNo,
  2453. realNo: realNo,
  2454. groupNo: groupNo,
  2455. };
  2456. // 保存当前退药数据到全局变量,供匹配检查使用
  2457. window.currentRefundData = $table.bootstrapTable('getData');
  2458. $('#ty_table_detail').bootstrapTable("destroy");
  2459. $('#ty_table_detail').bootstrapTable({
  2460. url: '/thmz/getMzDrugTracCodgData', //请求后台的URL(*)
  2461. method: 'POST', //请求方式(*)
  2462. striped: true, //是否显示行间隔色
  2463. cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  2464. pagination: true, //是否显示分页(*)
  2465. sortable: true, //是否启用排序
  2466. sortOrder: "asc", //排序方式
  2467. queryParams: JSON.stringify(tem), //传递参数(*)
  2468. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  2469. pageNumber: 1, //初始化加载第一页,默认第一页
  2470. pageSize: 50, //每页的记录行数(*)
  2471. pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
  2472. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  2473. strictSearch: true,
  2474. showColumns: false, //是否显示所有的列
  2475. showRefresh: false, //是否显示刷新按钮
  2476. minimumCountColumns: 2, //最少允许的列数
  2477. clickToSelect: true, //是否启用点击选中行
  2478. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  2479. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  2480. cardView: false, //是否显示详细视图
  2481. detailView: false,
  2482. // rowStyle:rowStyleCharge,//通过自定义函数设置行样式
  2483. ajaxOptions: {
  2484. headers: {
  2485. 'Accept': 'application/json',
  2486. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  2487. }
  2488. },
  2489. columns: [
  2490. {
  2491. field: 'drugName',
  2492. title: '品名',
  2493. align: "center",
  2494. valign: 'middle',
  2495. }, {
  2496. field: 'specification',
  2497. title: '规格',
  2498. align: "center",
  2499. valign: 'middle',
  2500. }, {
  2501. field: 'abbrName',
  2502. title: '生产厂家',
  2503. align: "center",
  2504. valign: 'middle',
  2505. visible: isXy
  2506. }, {
  2507. field: 'unitPrice',
  2508. title: '单价',
  2509. align: "center",
  2510. valign: 'middle',
  2511. }, {
  2512. field: 'drugTracCodg',
  2513. title: '药品追溯码',
  2514. width: '270',
  2515. align: "left",
  2516. valign: 'middle',
  2517. formatter: function (value, row, index) {
  2518. return isEmpty(value)?'':value
  2519. }
  2520. }, {
  2521. field: 'matchOk',
  2522. title: '匹配结果',
  2523. align: "center",
  2524. valign: 'middle',
  2525. }
  2526. ],
  2527. responseHandler: function (res) {
  2528. if (res === '401' || res === 401) {
  2529. window.location.href = '/thmz/login/view'
  2530. return;
  2531. }
  2532. let re = eval(res);
  2533. if (re.data.length > 0) {
  2534. $("#patientIdTy").val(re.data[0].patientId);
  2535. $("#timesTy").val(re.data[0].times);
  2536. $("#nameTy").val(re.data[0].name);
  2537. $("#employeeNameLabelTy").val(re.data[0].employeeName);
  2538. $("#warnDeptNameLabelPy").val(re.data[0].warnDeptName);
  2539. $("#smMatchTy").val("");
  2540. }
  2541. if (re.code === -1) {
  2542. if (re.message != null && re.message !== '') {
  2543. new PNotify({
  2544. title: '错误提示',
  2545. text: re.message,
  2546. type: 'error',
  2547. hide: true,
  2548. styling: 'bootstrap3'
  2549. });
  2550. }
  2551. return {
  2552. "total": 0,//总页数
  2553. "rows": {} //数据
  2554. };
  2555. }
  2556. return {
  2557. "total": re.data.length,//总页数
  2558. "rows": re.data //数据
  2559. };
  2560. },
  2561. });
  2562. $("#tyModal").modal();
  2563. // 弹窗打开后自动聚焦到扫码输入框
  2564. $("#tyModal").on('shown.bs.modal', function () {
  2565. setTimeout(function() {
  2566. $("#smMatchTy").focus();
  2567. }, 100);
  2568. });
  2569. // 防抖定时器
  2570. let matchDebounceTimer = null;
  2571. // 支持回车键触发匹配
  2572. $("#smMatchTy").on('keypress', function(e) {
  2573. if (e.which === 13) { // 回车键
  2574. e.preventDefault();
  2575. // 清除防抖定时器
  2576. if (matchDebounceTimer) {
  2577. clearTimeout(matchDebounceTimer);
  2578. }
  2579. matchDrugCodg();
  2580. }
  2581. });
  2582. // 输入防抖处理
  2583. $("#smMatchTy").on('input', function() {
  2584. let code = $(this).val().trim();
  2585. // 清除之前的定时器
  2586. if (matchDebounceTimer) {
  2587. clearTimeout(matchDebounceTimer);
  2588. }
  2589. // 如果输入框有值,设置0.5秒防抖
  2590. if (code && code !== '') {
  2591. matchDebounceTimer = setTimeout(function() {
  2592. matchDrugCodg();
  2593. }, 500);
  2594. }
  2595. });
  2596. // 防止onchange和防抖冲突
  2597. $("#smMatchTy").on('change', function() {
  2598. // 清除防抖定时器,避免重复执行
  2599. if (matchDebounceTimer) {
  2600. clearTimeout(matchDebounceTimer);
  2601. matchDebounceTimer = null;
  2602. }
  2603. });
  2604. // 扫码输入框获得焦点时全选文本
  2605. $("#smMatchTy").on('focus', function() {
  2606. $(this).select();
  2607. });
  2608. }
  2609. // 匹配扫码
  2610. function matchDrugCodg(){
  2611. if(isTyOk){
  2612. isTyOk = false;
  2613. }
  2614. let code = $("#smMatchTy").val().trim().replace(/[\r\n]/g,"");
  2615. // 检查输入是否为空
  2616. if (!code) {
  2617. errorMesageSimaple("请输入或扫描药品追溯码!");
  2618. $("#smMatchTy").focus();
  2619. return false;
  2620. }
  2621. let tyTable = $('#ty_table_detail').bootstrapTable("getData");
  2622. let matched = false;
  2623. for (let i = 0; i < tyTable.length; i++) {
  2624. if(tyTable[i].drugTracCodg === code){
  2625. if(!isEmpty(tyTable[i].matchOk)){
  2626. warningMesageSimaple("已匹配,请勿重复扫码!");
  2627. // 重复匹配时清空输入框,准备扫描下一个
  2628. $("#smMatchTy").val("").focus();
  2629. return false;
  2630. }
  2631. $('#ty_table_detail').bootstrapTable('updateCell', {
  2632. index: i,
  2633. field: "drugTracCodg",
  2634. value: '<span style="color: green">' + tyTable[i].drugTracCodg + '</span>'
  2635. });
  2636. $('#ty_table_detail').bootstrapTable('updateCell', {
  2637. index: i,
  2638. field: "matchOk",
  2639. value: '<span style="color: green">已匹配</span>'
  2640. });
  2641. successMesageSimaple("药品追溯码匹配成功!");
  2642. matched = true;
  2643. // 匹配成功后清空输入框,准备扫描下一个
  2644. $("#smMatchTy").val("").focus();
  2645. break;
  2646. }
  2647. }
  2648. if (!matched) {
  2649. errorMesageSimaple("在退药列表未找到条码对应的药品,请核对!");
  2650. // 匹配失败时清空输入框
  2651. $("#smMatchTy").val("").focus();
  2652. }
  2653. }
  2654. // 确认匹配之后可以退药了
  2655. function matchTp(){
  2656. // 获取退药表格数据
  2657. let tyTable = $('#ty_table_detail').bootstrapTable("getData");
  2658. let refundData = window.currentRefundData || $table.bootstrapTable('getData');
  2659. // ========== 调试日志开始 ==========
  2660. console.log('=== matchTp 调试信息 ===');
  2661. console.log('refundData 样本:', refundData.length > 0 ? refundData[0] : '空数组');
  2662. console.log('tyTable 样本:', tyTable.length > 0 ? tyTable[0] : '空数组');
  2663. // ========== 调试日志结束 ==========
  2664. let needRefundItems = [];
  2665. // 找出需要退药的药品
  2666. refundData.forEach(function (item, index, arr) {
  2667. if (item.dec_amount != 0) {
  2668. needRefundItems.push({
  2669. chargeItemCode: item.charge_item_code,
  2670. serial: item.serial,
  2671. itemNo: item.item_no
  2672. });
  2673. }
  2674. });
  2675. // 检查每个需要退药的药品是否都已匹配
  2676. let allMatched = true;
  2677. let unmatchedItems = [];
  2678. for (let i = 0; i < tyTable.length; i++) {
  2679. let item = tyTable[i];
  2680. // 检查这个药品是否需要退药
  2681. let needRefund = needRefundItems.some(function(refundItem) {
  2682. let matchResult = refundItem.chargeItemCode === item.chargeItemCode &&
  2683. refundItem.serial === item.serial &&
  2684. refundItem.itemNo === item.itemNo;
  2685. // ========== 调试日志开始 ==========
  2686. if (i === 0) { // 只打印第一个匹配的调试信息
  2687. console.log('=== 匹配检查调试 ===');
  2688. console.log('tyTable item 字段信息:');
  2689. console.log('- item.chargeItemCode:', item.chargeItemCode);
  2690. console.log('- item.serial:', item.serial);
  2691. console.log('- item.itemNo:', item.itemNo);
  2692. console.log('- item.drugName:', item.drugName);
  2693. console.log('- item.matchOk:', item.matchOk);
  2694. console.log('refundItem 字段信息:');
  2695. console.log('- refundItem.chargeItemCode:', refundItem.chargeItemCode);
  2696. console.log('- refundItem.serial:', refundItem.serial);
  2697. console.log('- refundItem.itemNo:', refundItem.itemNo);
  2698. console.log('匹配结果:', matchResult);
  2699. }
  2700. // ========== 调试日志结束 ==========
  2701. return matchResult;
  2702. });
  2703. if (needRefund) {
  2704. // 检查是否已匹配
  2705. if (isEmpty(item.matchOk) || item.matchOk.indexOf('已匹配') === -1) {
  2706. allMatched = false;
  2707. unmatchedItems.push(item.drugName || '未知药品');
  2708. }
  2709. }
  2710. }
  2711. if (!allMatched) {
  2712. return errorMesageSimaple('还有药品未匹配追溯码:' + unmatchedItems.join('、') + ',请完成所有匹配后再确认!');
  2713. }
  2714. if (!confirm("确定对当前处方所有退药的药品匹配成功?")) {
  2715. return;
  2716. }
  2717. if(!isTyOk){
  2718. isTyOk = true;
  2719. }
  2720. $("#tyModal").modal('hide');
  2721. }
  2722. function printPrescription(patientId, times, orderNo) {
  2723. if (mzCfPrintIndex == null || ekCfPrintIndex == null || jzCfPrintIndex == null) {
  2724. return errorMesageSimaple('打印机参数未设置,请在发药参数设置中设置');
  2725. }
  2726. var tem = {
  2727. patientId: patientId,
  2728. times: times,
  2729. orderNo: orderNo,
  2730. groupNo: groupNo
  2731. };
  2732. $.ajax({
  2733. type: "POST",
  2734. url: '/thmz/getPrintPrescriptionData',
  2735. contentType: "application/json;charset=UTF-8",
  2736. dataType: "json",
  2737. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  2738. data: JSON.stringify(tem),
  2739. success: function (res) {
  2740. if (res == '401' || res == 401) {
  2741. window.location.href = '/thmz/login/view'
  2742. return;
  2743. }
  2744. if (res.code == 0) {
  2745. //setPrint();//初始化默认打印机
  2746. printView(res.data);
  2747. successMesage(res);
  2748. } else {
  2749. errorMesage(res);
  2750. }
  2751. }
  2752. });
  2753. }
  2754. function groupByGroupProperty(array) {
  2755. return array.reduce((acc, current) => {
  2756. const group = current.groupOrder;
  2757. acc[group] = acc[group] || [];
  2758. acc[group].push(current);
  2759. return acc;
  2760. }, {});
  2761. }
  2762. function printView(data) {
  2763. $('.sjh').remove();
  2764. $('#print_view input').attr("value", "");
  2765. var age = 0;
  2766. if (null != data) {
  2767. for (var key in data) {
  2768. $("#" + key + "").attr("value", data[key]);
  2769. }
  2770. age = getBirthSlot(data['birthDay'], data.list[0].priceTime);
  2771. $("#age").attr("value", age);
  2772. }
  2773. var list = data.list;
  2774. // console.log('list',list);
  2775. if(list.length > 0) {
  2776. let gruop = groupByGroupProperty(list);
  2777. for (const key in gruop) {
  2778. let current = gruop[key]
  2779. // console.log('current',current);
  2780. if (current) {
  2781. if(current.length == 1){
  2782. current[0].groupSign = '⊐'
  2783. } else {
  2784. current.forEach((item,index) => {
  2785. if(index == 0) {
  2786. item.groupSign = '⌝'
  2787. } else if(index == current.length - 1) {
  2788. item.groupSign = '⌟'
  2789. } else {
  2790. item.groupSign = ''
  2791. }
  2792. })
  2793. }
  2794. }
  2795. }
  2796. // console.log('gruop',gruop);
  2797. }
  2798. if (age.substring(0, age.indexOf('岁')) < 18 && yf.xyFlag === '1') {
  2799. $('#drugFlag').attr("value", "儿科");
  2800. printIndex = ekCfPrintIndex;
  2801. } else if (data.warnDeptName.indexOf("急诊") != -1 && yf.xyFlag === '1') {
  2802. $('#drugFlag').attr("value", "急诊");
  2803. printIndex = jzCfPrintIndex;
  2804. } else {
  2805. $('#drugFlag').attr("value", "普通");
  2806. printIndex = mzCfPrintIndex;
  2807. }
  2808. if (list[0].drugFlag == 2 || list[0].drugFlag == 3) {
  2809. $('#drugFlag').attr("value", "麻、精一");
  2810. } else if (list[0].drugFlag == 4) {
  2811. $('#drugFlag').attr("value", "精二");
  2812. } else if(list[0].drugFlag == 1){
  2813. $('#drugFlag').attr("value", "毒");
  2814. }
  2815. JsBarcode("#cfBarcode", data.patientId+'|'+data.times+'|'+data.orderNo, {
  2816. lineColor: '#000000', //线条颜色
  2817. width: 1, //线宽
  2818. height: 26, //条码高度
  2819. displayValue: false, //是否显示文字信息
  2820. });
  2821. $('#priceTime').attr("value", format(list[0].priceTime, "yyyy-MM-dd HH:mm"));
  2822. // 获取医生签名
  2823. getAjaxRequest("/thmz/getDoctorSignatureImage",{doctorCode:data.employeeCode},false,function (postRes) {
  2824. if(postRes.code == 0){
  2825. $("#employeeName").html("<img src='" + postRes.data + "' style='width:80px;'/>")
  2826. }else {
  2827. $('#employeeName').html(data.employeeName);
  2828. }
  2829. })
  2830. $('#sex').attr("value", getSex(data.sex));
  2831. $('#nameCf').attr("value", data.name);
  2832. $('#patientIdCf').attr("value", data.patientId);
  2833. $('#totalPrice').html(data.totalPrice + '元');
  2834. if (data.ybCardNo == null || data.ybCardNo == '') {
  2835. $('#ybCardNo').attr("value", data.icCardNo);
  2836. }
  2837. $('#tbody_yp').html(yf.xyFlag === '1' ? getXyPrintHtml(list) : getZyPrintHtml(list));
  2838. $("#patientId").val('');
  2839. // LODOP = getLodop();
  2840. // LODOP.PRINT_INITA(6, 0, "140mm", "202mm", "铭和医院处方笺");
  2841. // LODOP.SET_PRINT_STYLE("FontSize", 28); //字体大小
  2842. // //设置默认打印机
  2843. // //设置默认打印机
  2844. // LODOP.SET_PRINTER_INDEX(printIndex);
  2845. // LODOP.SET_PRINT_PAGESIZE(1, '140mm', '202mm', "CreateCustomPage");
  2846. // LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
  2847. // LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "140mm");
  2848. // LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "202mm");
  2849. // LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "铭和医院处方笺");//对新建的纸张重命名
  2850. // let strStyle='';
  2851. // let font = 'font-size: 12px;padding: 2px 2px;';
  2852. // if(yf.xyFlag !== '1'){
  2853. // strStyle = "<style>table,td,th {border-bottom: 1px dashed black;margin-bottom: 2px;";
  2854. // strStyle = "<style>table,td,th {border-bottom: 1px dashed black;margin-bottom: 2px;";
  2855. // strStyle += font;
  2856. // strStyle += font;
  2857. // strStyle += "}";
  2858. // strStyle += "}";
  2859. // strStyle += "</style>";
  2860. // }
  2861. // LODOP.ADD_PRINT_HTM("2mm", "4mm", "140mm", "202mm", strStyle + $("div[id='print_view']").html());
  2862. // LODOP.PREVIEW();
  2863. // LODOP.NewPageA();//下一页
  2864. LODOP = getLodop();
  2865. // 初始化打印区域,参数:top, left, width, height(横向打印时宽高可保持原比例)
  2866. LODOP.PRINT_INITA(6, 0, "202mm", "202mm", "铭和医院处方笺"); // 横向建议交换宽高值适配布局
  2867. // 设置字体大小
  2868. LODOP.SET_PRINT_STYLE("FontSize", 28);
  2869. // 设置默认打印机
  2870. LODOP.SET_PRINTER_INDEX(printIndex);
  2871. // 关键:设置打印方向为横向(1=横向),并保持自定义纸张尺寸
  2872. // 横向打印时,宽高参数建议按 "实际高度, 实际宽度" 传递更符合视觉习惯
  2873. LODOP.SET_PRINT_PAGESIZE(2, 0, 0, "square202");
  2874. // LODOP.SET_PRINT_PAGESIZE(2, 0, 0, "A4");
  2875. // // 整宽不变形模式(横向适配关键)
  2876. // LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true);
  2877. //
  2878. // // 背景图尺寸适配横向纸张
  2879. // LODOP.SET_SHOW_MODE("BKIMG_WIDTH", "202mm");
  2880. // LODOP.SET_SHOW_MODE("BKIMG_HEIGHT", "140mm");
  2881. // 核心配置:同时宽度和高度自适应铺满
  2882. LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOWFLOW', true); // 宽度铺满
  2883. // LODOP.SET_PRINT_MODE('FULL_HEIGHT_FOR_OVERFLOWFLOW', true); // 高度铺满
  2884. LODOP.SET_PRINT_MODE('AUTO_SCALE', true); // 自动缩放适配
  2885. // 自定义纸张重命名
  2886. LODOP.SET_PRINT_MODE("CREATE_CUSTOM_PAGE_NAME", "铭和医院处方笺");
  2887. let strStyle = '';
  2888. let font = 'font-size: 12px;padding: 2px 2px;';
  2889. if (yf.xyFlag !== '1') {
  2890. strStyle = "<style>";
  2891. strStyle += "table,td,th {border-bottom: 1px dashed black;margin-bottom: 2px;";
  2892. strStyle += font;
  2893. strStyle += "}";
  2894. strStyle += "</style>";
  2895. }
  2896. // 添加HTML内容,参数:top, left, width, height(使用横向纸张的宽高)
  2897. // 宽度设为"100%"可自动适配横向纸张宽度
  2898. let printContent = document.getElementById('print_view').innerHTML
  2899. // LODOP.ADD_PRINT_HTM("2mm", "4mm", "100%", "100%", strStyle + $("div[id='print_view']").html());
  2900. LODOP.ADD_PRINT_HTM("2mm", "4mm", "100%", "100%", strStyle + printContent);
  2901. LODOP.SET_PRINT_MODE("RESELECT_ORIENT",true);
  2902. LODOP.SET_PRINT_MODE("RESELECT_PAGESIZE", true);
  2903. // 预览打印(横向效果)
  2904. // LODOP.PREVIEW();
  2905. // LODOP.NewPageA();//下一页
  2906. // 如需多页,建议在添加内容前调用NewPageA(),此处预览后无需调用
  2907. LODOP.NewPageA();
  2908. LODOP.PREVIEW();
  2909. }
  2910. function getXyPrintHtml(list) {
  2911. let tr = '';
  2912. for (let i = 0; i < list.length; i++) {
  2913. let printName = list[i].printName == null ? "" : list[i].printName;
  2914. let tryResult = '';
  2915. let tryFlag = '';
  2916. if(list[i].paySelf == 1 || list[i].ybZfFlag == 1){
  2917. continue
  2918. }
  2919. if (list[i].tryResult !== null && list[i].tryResult.trim() === '0') {
  2920. tryResult = '(阴性)';
  2921. } else if (list[i].psFlag === '1' && list[i].tryFlag === '0') {//药品需要皮试,处方未点需要皮试
  2922. tryResult = '<span style="color: red">(免试)</span>';
  2923. }
  2924. if (list[i].tryFlag === '1') {
  2925. tryFlag = '<span style="color: red">(需皮试)</span>';
  2926. }
  2927. var number = i + 1;
  2928. let manufactoryName = list[i].manufactoryName == null || list[i].manufactoryName === '' ? '' : '(' + list[i].manufactoryName + ')';
  2929. tr += '<tr>' +
  2930. ' <td style="margin-bottom: 5px;width: 10px;font-size: 18px;" align="left" valign="top">' + number + "." +
  2931. ' </td>' +
  2932. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 260px;font-size: 13px;">' + tryResult + list[i].drugName +
  2933. ' </td>' +
  2934. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 65px;text-align: right;font-size: 13px;">' + list[i].specification +
  2935. ' </td>' +
  2936. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 5px;text-align: left;font-size: 13px;">×</td>' +
  2937. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 5px;text-align: left;font-size: 13px;">' + list[i].quantity +
  2938. ' </td>' +
  2939. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 20px;text-align: left;font-size: 13px;">' + list[i].ypUnitName +
  2940. ' </td>' +
  2941. ' <td style="vertical-align: middle !important;width: 60px;text-align: left;font-size:25px;font-weight: bold">' + list[i].groupSign +
  2942. ' </td>' +
  2943. '</tr>' +
  2944. '<tr>' +
  2945. ' <td style="margin-bottom: 5px;width: 10px;font-size: 13px;" align="left" valign="top">' +
  2946. ' </td>' +
  2947. ' <td colspan="4" style="padding-left:0;margin-bottom: 5px;width:220px;vertical-align: middle !important;text-align: left;font-size: 13px;">用法:' + list[i].drugQuan + "&nbsp;" + list[i].drugUnitName + '/次&nbsp;&nbsp;' + list[i].frequencyName + '&nbsp;&nbsp;' + printName +
  2948. ' </td>' +
  2949. ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 245px;font-size: 13px;">' + tryFlag +
  2950. ' </td>' +
  2951. '</tr>' +
  2952. '<tr>' +
  2953. ' <td style="margin-bottom: 5px;width: 10px;font-size: 13px;" align="left" valign="top">' +
  2954. ' </td>' +
  2955. ' <td colspan="5" style="margin-bottom: 5px;vertical-align: middle !important;width: 245px;font-size: 13px;">' + (list[i].instructionText == null ? '' : list[i].instructionText) +
  2956. ' </td>' +
  2957. '</tr>' +
  2958. '<tr>' +
  2959. ' <td style="margin-bottom: 5px;width: 10px;font-size: 13px;" align="left" valign="top">' +
  2960. ' </td>' +
  2961. // ' <td colspan="5" style="margin-bottom: 5px;vertical-align: middle !important;width: 245px;font-size: 13px;">' + '货位号:' + list[i].location +
  2962. // ' </td>' +
  2963. // ' <td style="margin-bottom: 5px;vertical-align: middle !important;width: 245px;font-size: 13px;">货位号:' + list[i].location +
  2964. // ' </td>' +
  2965. // ' <td colspan="4" style="padding-left:0;margin-bottom: 5px;width:220px;vertical-align: middle !important;text-align: left;font-size: 13px;">零售价:' + list[i].packRetprice + '&nbsp;元/' + list[i].ypUnitName +
  2966. // ' </td>' +
  2967. '</tr><tr style="height: 5px;"><td><img src="about:blank" width="5" height="5" /></td></tr>';
  2968. }
  2969. $('#yxwk').remove();
  2970. if (list.length < 5) {
  2971. $('#div_yp_cf').append('<span id="yxwk" style="margin-bottom: 5px;font-size: 13px;">以下为空</span>');
  2972. }
  2973. return tr;
  2974. }
  2975. function getZyPrintHtml(list) {
  2976. let tr = '';
  2977. for (let i = 0; i < list.length;) {
  2978. tr += '<tr class="sjh">' +
  2979. '<td style="width: 160px; font-size: 14px;">' + list[i].drugName + (list[i].instructionText == null || list[i].instructionText === '' ? '' : '【' + list[i].instructionText + '】') +
  2980. '</td>' +
  2981. '<td style="width: 40px;text-align: right; font-size: 14px;">' + list[i].specification +
  2982. '</td>' +
  2983. '<td style="width: 25px;text-align: right;border-right: 1px solid black; font-size: 14px;">' + list[i].quantity + list[i].ypUnitName +
  2984. '</td>';
  2985. if (i + 1 < list.length) {
  2986. tr += '<td style="width: 160px; font-size: 14px;">' + list[i + 1].drugName + (list[i + 1].instructionText == null || list[i + 1].instructionText === '' ? '' : '【' + list[i + 1].instructionText + '】') +
  2987. '</td>' +
  2988. '<td style="width: 40px;text-align: right; font-size: 14px;">' + list[i + 1].specification +
  2989. '</td>' +
  2990. '<td style="width: 25px;text-align: right; font-size: 14px;">' + list[i + 1].quantity + list[i + 1].ypUnitName +
  2991. '</td>' +
  2992. '</tr>';
  2993. }
  2994. i = i + 2;
  2995. }
  2996. let cydj = isEmpty(list[0].cyDj)?'':list[0].cyDj;
  2997. tr += '<tr class="sjh">' +
  2998. '<td colspan="6" style="border: 0 !important;text-align: right;padding: 0;">×&nbsp;' + list[0].drugWin +
  2999. '&nbsp;副&nbsp;&nbsp;'+cydj+'</td>' +
  3000. '</tr>';
  3001. let yf = '';
  3002. yf += isEmpty(list[0].cyMtjs)?'':'每天'+list[0].cyMtjs+'剂,';
  3003. yf += isEmpty(list[0].cyJsl)?'':list[0].cyJssm+list[0].cyJsl+'ml,';
  3004. yf += isEmpty(list[0].cyZql)?'':'煮取量'+list[0].cyZql+'ml,';
  3005. yf += isEmpty(list[0].cyFj)?'':'复煎'+list[0].cyFj+'次。';
  3006. yf += isEmpty(list[0].cyFfcs)?'':'分'+list[0].cyFfcs+'次,';
  3007. yf += isEmpty(list[0].cyFysm)?'':list[0].cyFysm;
  3008. tr += '<tr class="sjh">' +
  3009. '<td colspan="6" style="border: 0 !important;text-align: left;padding: 0; font-size: 14px;">'+yf+'</td>' +
  3010. '</tr>';
  3011. return tr;
  3012. }
  3013. function getAjaxRequest (url, data,async, callBack) {
  3014. requestAs(url, "GET", data, async,"application/x-www-form-urlencoded;charset=UTF-8", function(res) {
  3015. return typeof callBack == "function" && callBack(res)
  3016. })
  3017. }
  3018. function requestAs (url, method, data = {},async, contentType, back){
  3019. $.ajax({
  3020. url: url,
  3021. type: method,
  3022. data: data,
  3023. async: async,
  3024. headers:{'Accept': 'application/json','Authorization':'Bearer '+ localStorage.getItem("token")},
  3025. contentType: contentType,
  3026. dataType: "json",
  3027. success: function(res){
  3028. return typeof back == "function" && back(res);
  3029. },
  3030. error: function(error) {
  3031. console.log(error)
  3032. return typeof back == "function" && back(null);
  3033. }
  3034. });
  3035. }
  3036. /**
  3037. * 新的requestAs函数,用于药品追溯码功能
  3038. * @param url 请求URL
  3039. * @param method 请求方法
  3040. * @param data 请求数据
  3041. * @param async 是否异步
  3042. * @param contentType 内容类型
  3043. * @param back 回调函数
  3044. */
  3045. function requestAsNew (url, method, data = {},async, contentType, back){
  3046. $.ajax({
  3047. type: method,
  3048. url: url,
  3049. contentType: contentType,
  3050. dataType: "json",
  3051. async: async,
  3052. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  3053. data: data,
  3054. success: function (res) {
  3055. back(res);
  3056. },
  3057. error: function () {
  3058. back(null);
  3059. }
  3060. });
  3061. }
  3062. /**
  3063. * 保存单元格数据
  3064. * @param table 表格对象
  3065. * @param index 行索引
  3066. * @param field 字段名
  3067. * @param value 新值
  3068. */
  3069. function saveCellData(table, index, field, value) {
  3070. table.bootstrapTable('updateCell', {
  3071. index: index,
  3072. field: field,
  3073. value: value
  3074. });
  3075. }
  3076. $(document).ready(function () {
  3077. // 初始化全局变量
  3078. window.currentRefundData = null;
  3079. isTyOk = false;
  3080. initTbTable();
  3081. });
  3082. /**
  3083. * 验证并添加追溯码
  3084. * @param tracCodg 追溯码
  3085. * @param rowData 行数据
  3086. * @param $element 单元格元素
  3087. */
  3088. function validateAndAddTracCodg(tracCodg, rowData, $element) {
  3089. // 构建验证数据,只包含可以从rowData中获取的字段
  3090. let validateData = {
  3091. drugTracCodg: tracCodg, // 这是用户扫码输入的追溯码
  3092. patientId: rowData.patientId,
  3093. times: rowData.times,
  3094. receiptNo: rowData.receiptNo,
  3095. orderNo: rowData.orderNo,
  3096. itemNo: rowData.itemNo,
  3097. chargeItemCode: rowData.chargeItemCode,
  3098. drugName: rowData.drugname,
  3099. specification: rowData.specification
  3100. };
  3101. // 添加调试日志
  3102. console.log('验证追溯码参数:', validateData);
  3103. console.log('行数据:', rowData);
  3104. $.ajax({
  3105. type: "POST",
  3106. url: '/thmz/validateDrugTracCodgForDispensing',
  3107. contentType: "application/json;charset=UTF-8",
  3108. dataType: "json",
  3109. headers: {
  3110. 'Accept': 'application/json',
  3111. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  3112. },
  3113. data: JSON.stringify(validateData),
  3114. success: function (res) {
  3115. console.log('验证响应:', res);
  3116. if (res.code == 0 && res.data && res.data.isValid) {
  3117. // 验证成功,添加到追溯码集合
  3118. addTracCodgToCell(tracCodg, $element);
  3119. successMesage(res);
  3120. // 验证成功后,保持单元格可编辑状态,用户可以继续扫码
  3121. $element.focus();
  3122. } else {
  3123. // 验证失败
  3124. errorMesage(res);
  3125. // 验证失败时,清理掉无效的追溯码
  3126. let currentContent = $element.html();
  3127. let codes = currentContent.split('<br>').filter(code => code.length > 0);
  3128. // 去掉最后一个追溯码(无效的追溯码)
  3129. if (codes.length > 0) {
  3130. codes.pop();
  3131. // 重新设置单元格内容
  3132. let newContent = codes.join('<br>');
  3133. if (newContent) {
  3134. newContent += '<br>';
  3135. }
  3136. $element.html(newContent);
  3137. // 保持焦点在单元格末尾
  3138. $element.focus();
  3139. let range = document.createRange();
  3140. let selection = window.getSelection();
  3141. range.selectNodeContents($element[0]);
  3142. range.collapse(false);
  3143. selection.removeAllRanges();
  3144. selection.addRange(range);
  3145. }
  3146. }
  3147. },
  3148. error: function (xhr, status, error) {
  3149. console.error('验证请求失败:', error);
  3150. errorMesageSimaple("验证请求失败");
  3151. // 错误时也清理掉无效的追溯码
  3152. let currentContent = $element.html();
  3153. let codes = currentContent.split('<br>').filter(code => code.length > 0);
  3154. // 去掉最后一个追溯码(无效的追溯码)
  3155. if (codes.length > 0) {
  3156. codes.pop();
  3157. // 重新设置单元格内容
  3158. let newContent = codes.join('<br>');
  3159. if (newContent) {
  3160. newContent += '<br>';
  3161. }
  3162. $element.html(newContent);
  3163. // 保持焦点在单元格末尾
  3164. $element.focus();
  3165. let range = document.createRange();
  3166. let selection = window.getSelection();
  3167. range.selectNodeContents($element[0]);
  3168. range.collapse(false);
  3169. selection.removeAllRanges();
  3170. selection.addRange(range);
  3171. }
  3172. }
  3173. });
  3174. }
  3175. /**
  3176. * 添加追溯码到单元格
  3177. * @param tracCodg 追溯码(单个追溯码,不包含分隔符)
  3178. * @param $element 单元格元素
  3179. */
  3180. function addTracCodgToCell(tracCodg, $element) {
  3181. let currentValue = $element.html();
  3182. console.log('addTracCodgToCell 开始');
  3183. console.log('传入的追溯码:', tracCodg);
  3184. console.log('当前单元格内容:', currentValue);
  3185. if (isEmpty(currentValue)) {
  3186. // 如果单元格为空,直接设置追溯码
  3187. console.log('单元格为空,直接设置追溯码');
  3188. $element.html(tracCodg);
  3189. } else {
  3190. // 检查是否已存在该追溯码
  3191. let existingCodes = currentValue.split('<br>');
  3192. console.log('已存在的追溯码列表:', existingCodes);
  3193. console.log('是否已存在:', existingCodes.includes(tracCodg));
  3194. if (!existingCodes.includes(tracCodg)) {
  3195. // 如果不存在,添加<br>分隔符后追加
  3196. let newValue = currentValue + '<br>' + tracCodg;
  3197. console.log('添加追溯码,新内容:', newValue);
  3198. $element.html(newValue);
  3199. } else {
  3200. // 追溯码已存在,显示提示
  3201. console.log('追溯码已存在,显示提示');
  3202. if (typeof PNotify !== 'undefined') {
  3203. new PNotify({
  3204. title: '提示',
  3205. text: '该追溯码已添加',
  3206. type: 'info',
  3207. delay: 2000
  3208. });
  3209. }
  3210. }
  3211. }
  3212. console.log('addTracCodgToCell 结束,最终单元格内容:', $element.html());
  3213. }
  3214. /**
  3215. * 调用医保商品销售接口
  3216. * @param realNo 流水号
  3217. * @param orderNo 处方号
  3218. * @param receiptNo 发票分票号
  3219. * @param times 次数
  3220. * @param patientId 病人ID
  3221. * @param name 病人姓名
  3222. */
  3223. function callYbSaleGoodsItem(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo) {
  3224. // 获取处方明细数据
  3225. let tableData = $("#tb_table_right").bootstrapTable('getData');
  3226. console.log("callYbSaleGoodsItem11111111111111111111111",tableData)
  3227. if (!tableData || tableData.length === 0) {
  3228. console.log('没有处方明细数据,跳过医保接口调用');
  3229. return;
  3230. }
  3231. // 获取当前用户信息(药师信息)
  3232. let currentUserName = localStorage.getItem('userName') || '';
  3233. let currentUserId = localStorage.getItem('userID') || '';
  3234. // 获取当前时间
  3235. let currentTime = new Date();
  3236. let selRetnTime = currentTime.getFullYear() + '-' +
  3237. String(currentTime.getMonth() + 1).padStart(2, '0') + '-' +
  3238. String(currentTime.getDate()).padStart(2, '0') + ' ' +
  3239. String(currentTime.getHours()).padStart(2, '0') + ':' +
  3240. String(currentTime.getMinutes()).padStart(2, '0') + ':' +
  3241. String(currentTime.getSeconds()).padStart(2, '0');
  3242. // 为每个药品调用一次医保接口
  3243. for (let i = 0; i < tableData.length; i++) {
  3244. let item = tableData[i];
  3245. // 构建关联字段组合(用于关联发药记录)
  3246. let currentPatientId = item.patientId || patientId;
  3247. let currentTimes = item.times || times;
  3248. let currentReceiptNo = item.receiptNo || receiptNo;
  3249. let currentOrderNo = item.orderNo || orderNo;
  3250. let chargeItemCode = item.chargeItemCode;
  3251. let currentRealNo = item.realNo || realNo;
  3252. console.log('发药关联键:', {patientId: currentPatientId, times: currentTimes, receiptNo: currentReceiptNo, orderNo: currentOrderNo, chargeItemCode, realNo: currentRealNo});
  3253. // 参数验证
  3254. // 从处方明细数据中获取开方医师姓名
  3255. console.log('处方明细数据item:', item); // 调试日志
  3256. console.log('doctorName字段:', item.doctorName); // 调试日志
  3257. console.log('employeeName字段:', item.employeeName); // 调试日志
  3258. let doctorName = item.doctorName || item.employeeName || '';
  3259. if (!doctorName) {
  3260. console.warn('开方医师姓名为空,使用默认值,item数据:', item);
  3261. doctorName = '未知医师';
  3262. } else {
  3263. console.log('成功获取医生姓名:', doctorName);
  3264. }
  3265. if (!currentUserName) {
  3266. console.warn('药师姓名为空,使用默认值');
  3267. currentUserName = '未知药师';
  3268. }
  3269. // 构建医保接口参数
  3270. let ybData = {
  3271. // 关联字段 - 直接传递到医保接口
  3272. patientId: currentPatientId,
  3273. times: currentTimes,
  3274. receiptNo: currentReceiptNo,
  3275. orderNo: currentOrderNo,
  3276. chargeItemCode: chargeItemCode,
  3277. realNo: currentRealNo,
  3278. // 医疗目录编码(医保编码)
  3279. medListCodg: item.nationalCode,
  3280. // 开方医师姓名
  3281. prscDrName: doctorName,
  3282. // 药师姓名
  3283. pharName: currentUserName,
  3284. // 药师执业资格证号(取当前操作者的药师执业资格证号)
  3285. pharPracCertNo: localStorage.getItem('pharPracCertNo') || '',
  3286. // 销售/退货经办人姓名
  3287. selRetnOpterName: currentUserName,
  3288. // 就诊结算类型(1-医保结算 2-自费结算)
  3289. // 根据处方类型判断:普通处方(1)、特门处方(3)、GCP实验(4)为自费,门诊统筹(2)为医保
  3290. mdtrtSetlType: (item.mdtrtSetlType && item.mdtrtSetlType === 1) ? '1' : '2',
  3291. // 处方药标志
  3292. // rxFlag: item.rxFlag || '1',
  3293. rxFlag: "1",//医院默认都是处方药
  3294. // 拆零标志(0-否;1-是)
  3295. trdnFlag: (item.serial === '99') ? '0' : '1',
  3296. // 患者相关参数(医保接口需要)
  3297. // 人员证件类型
  3298. psnCertType: item.psnCertType || '01',
  3299. // 证件号码
  3300. certno: item.certno || '',
  3301. // 人员姓名
  3302. psnName: item.psnName || item.name || name || '',
  3303. };
  3304. // 追溯码信息
  3305. let drugtracinfo = []
  3306. // 处理追溯码
  3307. if (item.drugTracCodg && item.drugTracCodg !== '') {
  3308. let tracCodes = item.drugTracCodg.split('<br>').filter(code => code !== '');
  3309. for (let j = 0; j < tracCodes.length; j++) {
  3310. drugtracinfo.push({
  3311. drugTracCodg: tracCodes[j]
  3312. });
  3313. }
  3314. }
  3315. // 如果没有追溯码,添加空数组(保持数据结构一致)
  3316. if (drugtracinfo.length === 0) {
  3317. drugtracinfo = [];
  3318. }
  3319. console.log('调用医保接口,药品:', item.drugname, '参数:', ybData);
  3320. let param = {
  3321. selinfoSold: ybData,
  3322. drugtracinfo: drugtracinfo
  3323. }
  3324. // 调用医保接口
  3325. $.ajax({
  3326. type: "POST",
  3327. url: '/thmz/Yb/saleGoodsItem',
  3328. contentType: "application/json;charset=UTF-8",
  3329. dataType: "json",
  3330. headers: {
  3331. 'Accept': 'application/json',
  3332. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  3333. },
  3334. data: JSON.stringify(param),
  3335. success: function (res) {
  3336. console.log('医保接口调用成功:', res);
  3337. if (res.code !== 0) {
  3338. console.error('医保接口调用失败:', res.message);
  3339. // 医保接口失败不影响发药流程,只记录日志
  3340. }
  3341. },
  3342. error: function (xhr, status, error) {
  3343. console.error('医保接口调用失败:', error);
  3344. // 医保接口失败不影响发药流程,只记录日志
  3345. }
  3346. });
  3347. }
  3348. }
  3349. /**
  3350. * 调用医保商品退货接口
  3351. * @param realNo 流水号
  3352. * @param orderNo 处方号
  3353. * @param receiptNo 发票分票号
  3354. * @param times 次数
  3355. * @param patientId 病人ID
  3356. * @param name 病人姓名
  3357. */
  3358. function callYbReturnGoodsItem(realNo, orderNo, receiptNo, times, patientId, name) {
  3359. // 获取退药明细数据 - 直接使用退药表格数据
  3360. let tableData = window.currentRefundData || $table.bootstrapTable('getData');
  3361. if (!tableData || tableData.length === 0) {
  3362. console.log('没有退药明细数据,跳过医保接口调用');
  3363. return;
  3364. }
  3365. // 获取当前用户信息(药师信息)
  3366. let currentUserName = localStorage.getItem('userName') || '';
  3367. let currentUserId = localStorage.getItem('userID') || '';
  3368. // 获取当前时间
  3369. let currentTime = new Date();
  3370. let selRetnTime = currentTime.getFullYear() + '-' +
  3371. String(currentTime.getMonth() + 1).padStart(2, '0') + '-' +
  3372. String(currentTime.getDate()).padStart(2, '0') + ' ' +
  3373. String(currentTime.getHours()).padStart(2, '0') + ':' +
  3374. String(currentTime.getMinutes()).padStart(2, '0') + ':' +
  3375. String(currentTime.getSeconds()).padStart(2, '0');
  3376. // 为每个退药药品调用一次医保接口
  3377. console.log('开始处理退药数据,总数:', tableData.length);
  3378. for (let i = 0; i < tableData.length; i++) {
  3379. let item = tableData[i];
  3380. console.log('处理第', i + 1, '条退药记录:', {
  3381. 'drugname': item.drugname,
  3382. 'dec_amount': item.dec_amount,
  3383. 'charge_item_code': item.charge_item_code,
  3384. 'serial': item.serial,
  3385. 'item_no': item.item_no
  3386. });
  3387. // 只处理有退药数量的药品
  3388. if (item.dec_amount == 0) {
  3389. console.log('跳过数量为0的药品:', item.drugname);
  3390. continue;
  3391. }
  3392. // 获取医生姓名
  3393. let doctorName = item.doctor_name || item.name || '';
  3394. if (!doctorName) {
  3395. doctorName = '未知医生';
  3396. }
  3397. // 构建医保接口参数
  3398. let ybData = {
  3399. // 关联字段 - 直接传递到医保接口
  3400. patientId: patientId,
  3401. times: times,
  3402. receiptNo: receiptNo,
  3403. orderNo: orderNo,
  3404. chargeItemCode: item.charge_item_code,
  3405. realNo: realNo,
  3406. // // 医疗目录编码(医保编码)
  3407. // medListCodg: item.nationalCode || 'NMLC999',
  3408. // 销售/退货经办人姓名(必填参数)
  3409. selRetnOpterName: currentUserName,
  3410. // // 销售/退货数量
  3411. // selRetnCnt: item.dec_amount,
  3412. // // 销售/退货时间
  3413. // selRetnTime: selRetnTime,
  3414. // // 最终成交单价
  3415. // finlTrnsPric: item.unit_price,
  3416. // // 处方药标志
  3417. // rxFlag: item.rxFlag || '1',
  3418. // rxFlag: '1',//医院默认都是处方药
  3419. // // 拆零标志(0-否;1-是)
  3420. // trdnFlag: item.clFlag || '0',
  3421. // 追溯码信息
  3422. drugtracinfo: []
  3423. };
  3424. // 主动获取追溯码信息(退药后从退药追溯码表查询)
  3425. let tracCodgParams = {
  3426. patientId: patientId,
  3427. times: times,
  3428. receiptNo: receiptNo,
  3429. orderNo: orderNo,
  3430. chargeItemCode: item.charge_item_code,
  3431. serial: item.serial,
  3432. itemNo: item.item_no,
  3433. groupNo: item.group_no || groupNo
  3434. };
  3435. console.log("调用退药医保接口tracCodgParams000000000000000000000",tracCodgParams)
  3436. // 调用追溯码查询接口(异步方式)
  3437. // 注意:退药处理后,追溯码已转移到 mz_drug_trac_codg_ty 表
  3438. $.ajax({
  3439. type: "POST",
  3440. url: '/thmz/getMzDrugTracCodgTyData',
  3441. contentType: "application/json;charset=UTF-8",
  3442. dataType: "json",
  3443. headers: {
  3444. 'Accept': 'application/json',
  3445. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  3446. },
  3447. data: JSON.stringify(tracCodgParams),
  3448. success: function (tracRes) {
  3449. console.log('追溯码查询结果:', tracRes);
  3450. if (tracRes.code === 0 && tracRes.data && tracRes.data.length > 0) {
  3451. // 将追溯码添加到医保接口参数中
  3452. for (let k = 0; k < tracRes.data.length; k++) {
  3453. let tracItem = tracRes.data[k];
  3454. if (tracItem.drugTracCodg && tracItem.drugTracCodg !== '') {
  3455. ybData.drugtracinfo.push({
  3456. drugTracCodg: tracItem.drugTracCodg
  3457. });
  3458. }
  3459. }
  3460. console.log('成功获取追溯码:', ybData.drugtracinfo);
  3461. } else {
  3462. console.log('未找到追溯码信息');
  3463. }
  3464. // 追溯码查询完成后,调用医保接口
  3465. callYbReturnGoodsItemWithData(ybData, item);
  3466. },
  3467. error: function (xhr, status, error) {
  3468. console.error('追溯码查询失败:', error);
  3469. // 即使追溯码查询失败,也要调用医保接口
  3470. callYbReturnGoodsItemWithData(ybData, item);
  3471. }
  3472. });
  3473. }
  3474. }
  3475. /**
  3476. * 调用医保退药接口(带追溯码数据)
  3477. * @param ybData 医保接口参数
  3478. * @param item 退药药品信息
  3479. */
  3480. function callYbReturnGoodsItemWithData(ybData, item) {
  3481. // 如果没有追溯码,添加空数组(保持数据结构一致)
  3482. if (ybData.drugtracinfo.length === 0) {
  3483. ybData.drugtracinfo = [];
  3484. }
  3485. console.log('调用医保退药接口,药品:', item.drugname, '参数:', ybData);
  3486. // 调用医保接口
  3487. $.ajax({
  3488. type: "POST",
  3489. url: '/thmz/Yb/returnGoodsItem',
  3490. contentType: "application/json;charset=UTF-8",
  3491. dataType: "json",
  3492. headers: {
  3493. 'Accept': 'application/json',
  3494. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  3495. },
  3496. data: JSON.stringify(ybData),
  3497. success: function (res) {
  3498. console.log('医保退药接口调用成功:', res);
  3499. if (res.code !== 0) {
  3500. console.error('医保退药接口调用失败:', res.message);
  3501. // 医保接口失败不影响退药流程,只记录日志
  3502. }
  3503. },
  3504. error: function (xhr, status, error) {
  3505. console.error('医保退药接口调用失败:', error);
  3506. // 医保接口失败不影响退药流程,只记录日志
  3507. }
  3508. });
  3509. }
  3510. /**
  3511. * 验证追溯码数量与处方数量的匹配情况
  3512. * @param realNo 流水号
  3513. * @param orderNo 处方号
  3514. * @param receiptNo 发票分票号
  3515. * @param times 次数
  3516. * @param patientId 病人ID
  3517. * @param name 病人姓名
  3518. * @param pharPracCertNo 药师执业资格证号
  3519. */
  3520. function validateTracCodgQuantity(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo) {
  3521. // 获取处方明细表格数据
  3522. let tableData = $("#tb_table_right").bootstrapTable('getData');
  3523. let mismatchDetails = [];
  3524. let hasMismatch = false;
  3525. console.log('开始验证追溯码数量,表格数据:', tableData);
  3526. // 遍历每种药品,检查追溯码数量
  3527. for (let i = 0; i < tableData.length; i++) {
  3528. let drug = tableData[i];
  3529. let prescriptionQuantity = parseInt(drug.quantity) || 0; // 处方数量
  3530. let tracCodgCount = 0; // 追溯码数量
  3531. // 计算该药品的追溯码数量
  3532. if (!isEmpty(drug.drugTracCodg)) {
  3533. // 按<br>分割追溯码,过滤空值
  3534. let tracCodgList = drug.drugTracCodg.split('<br>').filter(code => code.length > 0);
  3535. tracCodgCount = tracCodgList.length;
  3536. }
  3537. console.log('药品:', drug.drugname, '处方数量:', prescriptionQuantity, '追溯码数量:', tracCodgCount);
  3538. // 检查数量是否匹配
  3539. if (tracCodgCount !== prescriptionQuantity) {
  3540. hasMismatch = true;
  3541. let mismatchInfo = {
  3542. drugName: drug.drugname,
  3543. prescriptionQuantity: prescriptionQuantity,
  3544. tracCodgCount: tracCodgCount,
  3545. difference: tracCodgCount - prescriptionQuantity
  3546. };
  3547. mismatchDetails.push(mismatchInfo);
  3548. }
  3549. }
  3550. // 如果有不匹配的情况,显示确认弹框
  3551. if (hasMismatch) {
  3552. // 存储发药参数,供确认后使用
  3553. window.pendingSendParams = {
  3554. realNo: realNo,
  3555. orderNo: orderNo,
  3556. receiptNo: receiptNo,
  3557. times: times,
  3558. patientId: patientId,
  3559. name: name,
  3560. pharPracCertNo: pharPracCertNo
  3561. };
  3562. // 构建不匹配详情HTML
  3563. let detailsHtml = '<div class="table-responsive"><table class="table table-bordered table-striped">';
  3564. detailsHtml += '<thead><tr><th>药品名称</th><th>处方数量</th><th>追溯码数量</th><th>差异</th></tr></thead><tbody>';
  3565. for (let i = 0; i < mismatchDetails.length; i++) {
  3566. let detail = mismatchDetails[i];
  3567. let differenceText = '';
  3568. let rowClass = '';
  3569. if (detail.difference > 0) {
  3570. differenceText = '<span style="color: orange;">多输入 ' + detail.difference + ' 个</span>';
  3571. rowClass = 'warning';
  3572. } else if (detail.difference < 0) {
  3573. differenceText = '<span style="color: red;">缺少 ' + Math.abs(detail.difference) + ' 个</span>';
  3574. rowClass = 'danger';
  3575. }
  3576. detailsHtml += '<tr class="' + rowClass + '">';
  3577. detailsHtml += '<td>' + detail.drugName + '</td>';
  3578. detailsHtml += '<td>' + detail.prescriptionQuantity + '</td>';
  3579. detailsHtml += '<td>' + detail.tracCodgCount + '</td>';
  3580. detailsHtml += '<td>' + differenceText + '</td>';
  3581. detailsHtml += '</tr>';
  3582. }
  3583. detailsHtml += '</tbody></table></div>';
  3584. // 显示确认弹框
  3585. $('#tracCodgMismatchDetails').html(detailsHtml);
  3586. $('#tracCodgConfirmModal').modal('show');
  3587. console.log('追溯码数量不匹配,显示确认弹框:', mismatchDetails);
  3588. } else {
  3589. // 数量匹配,直接发药
  3590. console.log('追溯码数量匹配,直接发药');
  3591. sendMedicineProcessing(realNo, orderNo, receiptNo, times, patientId, name, pharPracCertNo);
  3592. }
  3593. }
  3594. /**
  3595. * 调用撤销退药医保接口(销售接口)
  3596. * @param realNo 流水号
  3597. * @param orderNo 处方号
  3598. * @param receiptNo 发票分票号
  3599. * @param times 次数
  3600. * @param patientId 病人ID
  3601. * @param name 病人姓名
  3602. */
  3603. function callYbSaleGoodsItemForCancelRefund(realNo, orderNo, receiptNo, times, patientId, name, doctorName) {
  3604. console.log('=== 开始调用撤销退药医保接口 ===');
  3605. // 获取当前用户信息(药师信息)
  3606. let currentUserName = localStorage.getItem('userName') || '';
  3607. let pharPracCertNo = localStorage.getItem('pharPracCertNo') || '';
  3608. // 构建调用新接口的参数
  3609. let params = {
  3610. patientId: patientId,
  3611. times: times,
  3612. receiptNo: receiptNo,
  3613. orderNo: orderNo,
  3614. groupNoOut: groupNo,
  3615. // 添加医生姓名、药师姓名和药师执业资格证号
  3616. doctorName: doctorName, // 医生姓名,从处方明细中获取
  3617. pharName: currentUserName, // 药师姓名
  3618. pharPracCertNo: pharPracCertNo // 药师执业资格证号
  3619. };
  3620. console.log('撤销退药医保接口参数:', params);
  3621. // 调用新的撤销退药医保接口
  3622. $.ajax({
  3623. type: "POST",
  3624. url: '/thmz/cancelRefundWithYb',
  3625. contentType: "application/json;charset=UTF-8",
  3626. dataType: "json",
  3627. headers: {
  3628. 'Accept': 'application/json',
  3629. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  3630. },
  3631. data: JSON.stringify(params),
  3632. success: function (res) {
  3633. console.log('撤销退药医保接口调用结果:', res);
  3634. if (res.code === 0) {
  3635. successMesage(res);
  3636. console.log('撤销退药医保接口调用成功');
  3637. } else {
  3638. errorMesage(res);
  3639. console.error('撤销退药医保接口调用失败:', res.message);
  3640. }
  3641. },
  3642. error: function (xhr, status, error) {
  3643. console.error('撤销退药医保接口调用异常:', error);
  3644. errorMesage({message: '撤销退药医保接口调用异常:' + error});
  3645. }
  3646. });
  3647. }