newRecipe.html 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810
  1. <!DOCTYPE html>
  2. <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
  3. <head>
  4. <th:block th:include="include :: header('处方登记信息')" />
  5. <th:block th:include="include :: select2-css" />
  6. <th:block th:include="include :: jasny-bootstrap-css" />
  7. <th:block th:include="include :: bootstrap-fileinput-css" />
  8. <th:block th:include="include :: layout-latest-css" />
  9. </head>
  10. <body class="gray-bg">
  11. <div class="col-sm-12 search-collapse">
  12. <form id="dtp-form-hxcx" class="customize-search-form">
  13. <div class="customize-form-group-container">
  14. <div class="customize-form-group">
  15. <label>患者信息:</label>
  16. <input type="text" class="styled-input" placeholder="输入姓名,患者ID或手机号/证件号码" id="query" name="query"/>
  17. </div>
  18. <div class="customize-form-group">
  19. <a class="btn btn-primary btn-rounded btn-sm" onclick="search_hz()">&nbsp;搜索</a>
  20. <a class="btn btn-warning btn-rounded btn-sm" onclick="resetPre()">重置</a>
  21. <a class="btn btn-info btn-rounded btn-sm" onclick="bookbuilding()">&nbsp快速建档</a>
  22. <!-- bookbuilding $.operate.addSetwht('快速建档','dtp/pmService/archivesAdd',800,750)-->
  23. </div>
  24. </div>
  25. </form>
  26. <div id="patient-table-container">
  27. <table id="patient-table" class="customize-table">
  28. <thead>
  29. <tr>
  30. <th></th> <!-- 选择框 -->
  31. <th>患者ID</th>
  32. <th>患者姓名</th>
  33. <th>性别</th>
  34. <th>年龄</th>
  35. <th>证件类型</th>
  36. <th>证件号码</th>
  37. <th>临床诊断</th>
  38. <th>联系电话</th>
  39. <!-- 添加其他需要显示的列 -->
  40. </tr>
  41. </thead>
  42. <tbody>
  43. <!-- 数据行将由 JavaScript 动态插入 -->
  44. </tbody>
  45. </table>
  46. </div>
  47. </div>
  48. <div class="col-sm-12 search-collapse">
  49. <h4 class="query-condition-title">处方登记</h4>
  50. <form id="dtp-form-newcfxx" class="customize-search-form">
  51. <div class="customize-form-group-container">
  52. <div class="customize-form-group">
  53. <label class="is-required">医院:</label>
  54. <!-- <input name="hospital" placeholder="医院" id="hospital" class="styled-input" type="text">-->
  55. <select id="hospital-select" name="hospital" class="styled-input form-control select2-multiple" placeholder="请选择或输入搜索">
  56. <option value="">请选择医院</option>
  57. </select>
  58. </div>
  59. <div class="customize-form-group">
  60. <label class="is-required">处方医生:</label>
  61. <input name="prescribingDoctor" id="prescribingDoctor" placeholder="处方医生" class="styled-input" type="text">
  62. </div>
  63. <div class="customize-form-group">
  64. <label>科室:</label>
  65. <input name="department" id="department" placeholder="科室" class="styled-input" type="text">
  66. </div>
  67. <div class="customize-form-group">
  68. <label class="is-required">处方诊断:</label>
  69. <input name="prescriptionDiagnosis" id="prescriptionDiagnosis" placeholder="处方诊断" class="styled-input" type="text">
  70. </div>
  71. <div class="customize-form-group">
  72. <label>主管医生:</label>
  73. <input name="attendingDoctor" id="attendingDoctor" placeholder="主管医生" class="styled-input" type="text">
  74. </div>
  75. <div class="customize-form-group-container">
  76. </div>
  77. <!-- <div class="customize-form-group">-->
  78. <!-- <label class="is-required">临床诊断:</label>-->
  79. <!-- <input name="clinicalDiagnosis" id="clinicalDiagnosis" placeholder="临床诊断" class="styled-input" type="text">-->
  80. <!-- </div>-->
  81. <!--<div class="customize-form-group">
  82. <label>处方图片:</label>
  83. <input name="prescriptionImageUrl" id="prescriptionImageUrl" placeholder="处方图片" class="styled-input" type="text">
  84. </div>-->
  85. <div class="customize-form-group select-time">
  86. <label class="is-required">处方开具日期:</label>
  87. <input name="prescriptionIssueDate" id="prescriptionIssueDate" placeholder="处方开具日期" class="time-input time-input2" type="text">
  88. </div>
  89. <div class="customize-form-group">
  90. <label>发票编码:</label>
  91. <input name="invoiceCode" id="invoiceCode" placeholder="发票编码" class="styled-input" type="text">
  92. </div>
  93. <!--<div class="customize-form-group">
  94. <label>发票图片:</label>
  95. <input name="invoiceImageUrl" id="invoiceImageUrl" placeholder="发票图片" class="styled-input" type="text">
  96. </div>-->
  97. <!-- <div class="customize-form-group">-->
  98. <!-- <label class="is-required">登记药师姓名:</label>-->
  99. <!-- <input name="registerPharmacistName" id="registerPharmacistName" placeholder="登记药师姓名" class="styled-input" type="text">-->
  100. <!-- </div>-->
  101. <div class="customize-form-group">
  102. <label>登记人:</label>
  103. <input name="registrant" id="registrant" placeholder="未填登记人,系统默认当前用户" class="styled-input" type="text">
  104. </div>
  105. <!--<div class="customize-form-group">
  106. <label>审核药师姓名:</label>
  107. <input name="reviewingName" id="reviewingName" placeholder="审核药师姓名" class="styled-input" type="text">
  108. </div>-->
  109. <div class="customize-form-group">
  110. <label>处方类型</label>
  111. <select name="prescriptionType" th:with="type=${@dict.getType('sys_select_prescription_ype')}" class="styled-input">
  112. <option value="">全部</option>
  113. <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"
  114. ></option>
  115. </select>
  116. </div>
  117. <div class="customize-form-group">
  118. <label class="col-sm-1 control-label">临床诊断:</label>
  119. <select id="category-select" class="styled-input form-control select2-multiple" multiple placeholder="请选择或输入搜索">
  120. </select>
  121. </div>
  122. </div>
  123. <div class="customize-form-group-container">
  124. <div class="customize-form-group">
  125. <label>处方图片:</label>
  126. <div class="form-group">
  127. <div class="fileinput fileinput-new" data-provides="fileinput">
  128. <div class="fileinput-preview thumbnail" data-trigger="fileinput" style="width: 200px; height: 150px;">
  129. <img id="prescriptionImageUrl" th:if="${prescriptionImageUrl}" th:src="@{${prescriptionImageUrl}}" class="preview-image" />
  130. <div th:unless="${prescriptionImageUrl}" class="centered-content">
  131. <span class="plus-sign">+</span>
  132. </div>
  133. </div>
  134. <div>
  135. <input id="prescriptionImageUpload" name="prescriptionImageUpload" type="file">
  136. <a href="javascript:;" class="btn btn-white" data-dismiss="fileinput">清除图片</a>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="customize-form-group">
  142. <label>发票图片:</label>
  143. <div class="form-group">
  144. <div class="fileinput fileinput-new" data-provides="fileinput">
  145. <div class="fileinput-preview thumbnail" data-trigger="fileinput" style="width: 200px; height: 150px;">
  146. <img id="invoiceImageUrl" th:if="${invoiceImageUrl}" th:src="@{${invoiceImageUrl}}" class="preview-image" />
  147. <div th:unless="${invoiceImageUrl}" class="centered-content">
  148. <span class="plus-sign">+</span>
  149. </div>
  150. </div>
  151. <div>
  152. <input id="invoiceImageUpload" name="invoiceImageUpload" type="file">
  153. <a href="javascript:;" class="btn btn-white" data-dismiss="fileinput">清除图片</a>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </form>
  160. <!-- 假设这是你的 HTML 结构class="table table-bordered" -->
  161. <div class="ibox" id="data-ibox" style="overflow: auto;">
  162. <div class="ibox-title" style="width: 100%;">药品登记列表</div>
  163. <table class="fixed-layout-table table1" id="drugInfoTable">
  164. <thead>
  165. <tr>
  166. <th>操作+<a type="button" class="btn btn-primary btn-sm" onclick="selectUsersToParentCallBack2()">添加药品</a></th>
  167. <th>药品编码</th>
  168. <th>药品名</th>
  169. <th class="hidden-column">通用名</th>
  170. <th>规格</th>
  171. <th class="hidden-column">厂家简称</th>
  172. <th class="hidden-column">给药方式</th>
  173. <th class="hidden-column">是否随访管理品</th>
  174. <th class="hidden-column">是否冷链管理品</th>
  175. <th class="hidden-column">是否登记管理品</th>
  176. <th class="hidden-column">是否慈善援助管理品</th>
  177. <th class="hidden-column">包装</th>
  178. <th class="is-required">取药数量(购药数量)</th>
  179. <th class="is-required">单次剂量数</th>
  180. <th class="is-required">单次剂量单位</th>
  181. <th class="is-required">用药频次</th>
  182. <th class="is-required">购药包装单位</th>
  183. <th>D值品用药天数</th>
  184. </tr>
  185. </thead>
  186. <tbody>
  187. <!-- 数据行将被插入到这里 -->
  188. </tbody>
  189. </table>
  190. </div>
  191. <div class="center-block ibox-title" style="width: 100%;">
  192. <label class="is-required">是否开启药师审核:</label>
  193. <button type="button" class="btn btn-primary" onclick="onclickshow()">是</button>
  194. <button type="button" class="btn btn-info" onclick="onclickhide()">否</button>
  195. </div>
  196. </div>
  197. <div class="modal inmodal" id="myModal" tabindex="-1" role="dialog" aria-hidden="true">
  198. <div class="modal-dialog">
  199. <form class="form-horizontal" id="form-budan-add">
  200. <div class="modal-content animated bounceInRight">
  201. <div class="modal-header">
  202. <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">关闭</span></button>
  203. <h2 class="modal-title">药师审核</h2>
  204. </div>
  205. <div class="modal-body">
  206. <div class="customize-search-form">
  207. <div class="customize-form-group">
  208. <label>审核药师姓名:</label>
  209. <select id="pharmacistNameSelect" name="pharmacistName" class="styled-input" style="width: 200px; height: 35px;">
  210. <option value="" disabled selected>请选择</option>
  211. </select>
  212. <span id="pharmacistVerified" class="verified-symbol" style="display:none;">✓</span>
  213. </div>
  214. <div id="passwordGroup" class="customize-form-group" style="display:none;">
  215. <label>密码:</label>
  216. <input type="password" placeholder="请输入密码" class="styled-input" style="width: 200px; height: 35px;" id="password" name="password">
  217. <button type="button" class="btn btn-success btn-sm" id="verifyPasswordBtn">确定</button>
  218. </div>
  219. <div id="checkView" style="display:none;">
  220. <div class="customize-form-group">
  221. <label>审核结果:</label>
  222. <div>
  223. <label><input type="radio" name="checkResult" value="1"> 通过</label>
  224. <label><input type="radio" name="checkResult" value="0"> 不通过</label>
  225. </div>
  226. </div>
  227. <div class="customize-form-group">
  228. <label>审核意见:</label>
  229. <input type="text" placeholder="请输入说明" class="styled-input" style="width: 200px; height: 35px;" id="remarks" name="remarks">
  230. </div>
  231. </div>
  232. </div>
  233. </div>
  234. <div class="modal-footer">
  235. <button type="button" class="btn btn-white" data-dismiss="modal">关闭</button>
  236. <button type="button" class="btn btn-primary" onclick="submitReview()">提交</button>
  237. </div>
  238. </div>
  239. </form>
  240. </div>
  241. </div>
  242. <div class="main-content">
  243. <div class="col-sm-offset-5 col-sm-10">
  244. <button type="button" class="btn btn-sm btn-info" onclick="openCheckYSSH()" id="openCheckYSSid">药师审核</button>&nbsp;
  245. <button type="button" class="btn btn-sm btn-primary" onclick="submitHandler()"><i class="fa fa-check"></i>提 交</button>&nbsp;
  246. <button type="button" class="btn btn-sm btn-danger" onclick="closeItem()"><i class="fa fa-reply-all"></i>关 闭 </button>
  247. </div>
  248. </div>
  249. </div>
  250. <th:block th:include="include :: footer" />
  251. <th:block th:include="include :: select2-js" />
  252. <th:block th:include="include :: jasny-bootstrap-js" />
  253. <!--<th:block th:include="include :: bootstrap-fileinput-js" />-->
  254. <th:block th:include="include :: bootstrap-table-fixed-columns-js" />
  255. <th:block th:include="include :: layout-latest-js" />
  256. <script th:inline="javascript">
  257. var editFlag = [[${@permission.hasPermi('dtp:RecipeRegister:edit')}]];
  258. var removeFlag = [[${@permission.hasPermi('dtp:RecipeRegister:remove')}]];
  259. var prefix_recipe = ctx + "dtp/recipe";
  260. var prefix_yppz= ctx + "yppz/drugConfig";
  261. var prefix_configInfo= ctx + "dtp/configInfo";
  262. var prefix_pmService = ctx + "dtp/pmService";
  263. var hzparam =[];
  264. var hzparam1 ={};
  265. var openId='';
  266. var remarks;
  267. var reviewingName;
  268. var reviewStatus;
  269. var data;
  270. var shangci=false;
  271. var shangcigyList=[];
  272. var dataList=[];
  273. var selectdataList=[];
  274. var prescriptionNumber;
  275. var drugsLinkId;
  276. var reviewFlag=true;
  277. var reviewFormData = new FormData();
  278. document.addEventListener('DOMContentLoaded', function () {
  279. // 初始化所有 .fileinput 区域
  280. document.querySelectorAll('.fileinput').forEach(function (fileInputWrapper) {
  281. initializeImagePreview2(fileInputWrapper);
  282. });
  283. });
  284. function initializeImagePreview2(fileInputWrapper) {
  285. var fileInput = fileInputWrapper.querySelector('input[type="file"]');
  286. var previewThumbnail = fileInputWrapper.querySelector('.fileinput-preview.thumbnail');
  287. var largePreview;
  288. var clearButton = fileInputWrapper.querySelector('.btn-white[data-dismiss="fileinput"]');
  289. // 创建大图预览
  290. function createLargePreview(imageSrc) {
  291. if (largePreview) {
  292. largePreview.style.display = 'none';
  293. largePreview.remove();
  294. }
  295. largePreview = document.createElement('div');
  296. largePreview.className = 'preview-large';
  297. largePreview.style.backgroundImage = 'url(' + imageSrc + ')';
  298. largePreview.style.width = '1000px'; // 根据需要调整宽度
  299. largePreview.style.height = '900px'; // 根据需要调整高度
  300. largePreview.style.backgroundSize = 'contain';
  301. largePreview.style.backgroundRepeat = 'no-repeat';
  302. largePreview.style.backgroundPosition = 'center';
  303. largePreview.style.position = 'absolute';
  304. largePreview.style.zIndex = '1000';
  305. largePreview.style.display = 'none'; // 初始状态下不显示
  306. // 添加到DOM
  307. fileInputWrapper.appendChild(largePreview);
  308. // 为大图预览添加事件监听器
  309. largePreview.onmouseover = function () {
  310. this.style.display = 'block';
  311. };
  312. largePreview.onmousemove = function (e) {
  313. updateLargePreviewPosition(e, previewThumbnail);
  314. };
  315. largePreview.onmouseout = function (e) {
  316. if (!previewThumbnail.contains(e.relatedTarget)) {
  317. hideLargePreview();
  318. }
  319. };
  320. }
  321. // 悬停时显示大图
  322. function handleMouseOver(e) {
  323. /*if (previewThumbnail.style.backgroundImage && !largePreview) {
  324. createLargePreview(previewThumbnail.style.backgroundImage.replace(/^url$["']?/, '').replace(/["']?$$/, ''));
  325. }*/
  326. if (largePreview) {
  327. showLargePreview(e);
  328. }
  329. }
  330. // 鼠标移动时更新大图位置
  331. function handleMouseMove(e) {
  332. if (largePreview) {
  333. updateLargePreviewPosition(e, previewThumbnail);
  334. }
  335. }
  336. // 缩略图移出事件处理
  337. function handleMouseOut(e) {
  338. if (!largePreview || !largePreview.contains(e.relatedTarget)) {
  339. hideLargePreview();
  340. }
  341. }
  342. // 显示大图预览
  343. function showLargePreview(e) {
  344. largePreview.style.display = 'block';
  345. updateLargePreviewPosition(e, previewThumbnail);
  346. }
  347. // 更新大图预览位置
  348. function updateLargePreviewPosition(e, referenceElement) {
  349. const rect = referenceElement.getBoundingClientRect();
  350. const winWidth = window.innerWidth;
  351. const winHeight = window.innerHeight;
  352. const largePreviewWidth = largePreview.offsetWidth;
  353. const largePreviewHeight = largePreview.offsetHeight;
  354. let left = e.pageX ; // 尝试放置在鼠标右侧
  355. let top = e.pageY + 150; // 尝试放置在鼠标下方
  356. // 确保大图预览不超出浏览器窗口边界
  357. //if (left + largePreviewWidth > winWidth) left = e.pageX - largePreviewWidth - 150; // 如果右侧空间不足,则放在左侧
  358. if (top + largePreviewHeight > winHeight) top = e.pageY - largePreviewHeight; // 如果底部空间不足,则放在上方
  359. largePreview.style.left = left+100 + 'px';
  360. largePreview.style.top = top+300 + 'px';;
  361. }
  362. // 隐藏大图预览
  363. function hideLargePreview() {
  364. if (largePreview) {
  365. largePreview.style.display = 'none';
  366. }
  367. }
  368. // 移除图片和大图预览
  369. function removeImageAndPreview() {
  370. previewThumbnail.style.backgroundImage = ''; // 清空缩略图背景图片
  371. if (largePreview) {
  372. largePreview.style.display = 'none';
  373. largePreview.remove(); // 从 DOM 中移除 largePreview
  374. largePreview = null;
  375. }
  376. updateClearButtonVisibility(); // 更新清除按钮的可见性
  377. }
  378. // 更新清除按钮的可见性
  379. function updateClearButtonVisibility() {
  380. /*if (clearButton) {
  381. clearButton.style.display = previewThumbnail.style.backgroundImage ? 'inline-block' : 'none';
  382. }*/
  383. }
  384. // 监听文件上传变化事件
  385. fileInput.addEventListener('change', function (e) {
  386. // 清除现有的大图预览
  387. removeImageAndPreview();
  388. // 读取新文件并更新缩略图背景图片
  389. if (this.files && this.files[0]) {
  390. var reader = new FileReader();
  391. reader.onload = function (event) {
  392. previewThumbnail.style.backgroundImage = 'url(' + event.target.result + ')';
  393. // 立即创建大图预览以反映新图片
  394. createLargePreview(event.target.result);
  395. setupEventListeners(); // 重新设置事件监听器
  396. updateClearButtonVisibility(); // 更新清除按钮的可见性
  397. };
  398. reader.readAsDataURL(this.files[0]);
  399. } else {
  400. updateClearButtonVisibility(); // 更新清除按钮的可见性
  401. }
  402. });
  403. // 初始化事件监听器
  404. function setupEventListeners() {
  405. previewThumbnail.onmouseover = handleMouseOver;
  406. previewThumbnail.onmousemove = handleMouseMove;
  407. previewThumbnail.onmouseout = handleMouseOut;
  408. // 监听清除按钮点击事件
  409. if (clearButton) {
  410. clearButton.addEventListener('click', function () {
  411. removeImageAndPreview(); // 清除图片及大图预览
  412. });
  413. }
  414. }
  415. // 对于回显的图片,确保初始化时创建大图预览并更新清除按钮的可见性
  416. if (previewThumbnail.style.backgroundImage) {
  417. createLargePreview(previewThumbnail.style.backgroundImage.replace(/^url$["']?/, '').replace(/["']?$$/, ''));
  418. updateClearButtonVisibility();
  419. } else {
  420. updateClearButtonVisibility();
  421. }
  422. // 初始化事件监听器
  423. setupEventListeners();
  424. }
  425. document.addEventListener('DOMContentLoaded', function () {
  426. // 初始化所有 .fileinput 区域
  427. document.querySelectorAll('.fileinput').forEach(function (fileInputWrapper) {
  428. initializeImagePreview(fileInputWrapper);
  429. });
  430. });
  431. function initializeImagePreview(fileInputWrapper) {
  432. var previewThumbnail = fileInputWrapper.querySelector('.fileinput-preview.thumbnail');
  433. var imgElement = previewThumbnail.querySelector('.preview-image');
  434. var largePreview;
  435. var clearButton = fileInputWrapper.querySelector('.btn-white[data-dismiss="fileinput"]');
  436. if (!imgElement || !clearButton) return; // 如果没有img元素或清除按钮,则不执行后续操作
  437. // 创建大图预览
  438. function createLargePreview(img) {
  439. if (largePreview) {
  440. largePreview.style.display = 'none';
  441. largePreview.remove();
  442. }
  443. largePreview = document.createElement('div');
  444. largePreview.className = 'preview-large';
  445. largePreview.style.backgroundImage = 'url(' + img.src + ')';
  446. largePreview.style.width = '1000px'; // 根据需要调整宽度
  447. largePreview.style.height = '900px'; // 根据需要调整高度
  448. largePreview.style.backgroundSize = 'contain';
  449. largePreview.style.backgroundRepeat = 'no-repeat';
  450. largePreview.style.backgroundPosition = 'center';
  451. largePreview.style.position = 'absolute';
  452. largePreview.style.zIndex = '1000';
  453. largePreview.style.display = 'none'; // 初始状态下不显示
  454. // 添加到DOM
  455. fileInputWrapper.appendChild(largePreview);
  456. }
  457. // 悬停时显示大图
  458. function handleMouseOver(e) {
  459. if (imgElement.src && !largePreview) {
  460. createLargePreview(imgElement);
  461. }
  462. if (largePreview) {
  463. showLargePreview(e);
  464. }
  465. }
  466. // 鼠标移动时更新大图位置
  467. function handleMouseMove(e) {
  468. if (largePreview) {
  469. updateLargePreviewPosition(e, previewThumbnail);
  470. }
  471. }
  472. // 缩略图移出事件处理
  473. function handleMouseOut(e) {
  474. if (!largePreview || !largePreview.contains(e.relatedTarget)) {
  475. hideLargePreview();
  476. }
  477. }
  478. // 显示大图预览
  479. function showLargePreview(e) {
  480. largePreview.style.display = 'block';
  481. updateLargePreviewPosition(e, previewThumbnail);
  482. }
  483. // 更新大图预览位置
  484. function updateLargePreviewPosition(e, referenceElement) {
  485. const rect = referenceElement.getBoundingClientRect();
  486. const winWidth = window.innerWidth;
  487. const winHeight = window.innerHeight;
  488. const largePreviewWidth = largePreview.offsetWidth;
  489. const largePreviewHeight = largePreview.offsetHeight;
  490. let left = e.pageX + 150; // 尝试放置在鼠标右侧
  491. let top = e.pageY + 150; // 尝试放置在鼠标下方
  492. // 确保大图预览不超出浏览器窗口边界
  493. //if (left + largePreviewWidth > winWidth) left = e.pageX - largePreviewWidth - 150; // 如果右侧空间不足,则放在左侧
  494. if (top + largePreviewHeight > winHeight) top = e.pageY - largePreviewHeight; // 如果底部空间不足,则放在上方
  495. largePreview.style.left = left+100 + 'px';
  496. largePreview.style.top = top+400 + 'px'; // 保持原有的偏移量
  497. }
  498. // 隐藏大图预览
  499. function hideLargePreview() {
  500. if (largePreview) {
  501. largePreview.style.display = 'none';
  502. }
  503. }
  504. // 初始化事件监听器
  505. function setupEventListeners() {
  506. previewThumbnail.onmouseover = handleMouseOver;
  507. previewThumbnail.onmousemove = handleMouseMove;
  508. previewThumbnail.onmouseout = handleMouseOut;
  509. // 监听清除按钮点击事件
  510. clearButton.addEventListener('click', function () {
  511. removeImageAndPreview(); // 清除图片及大图预览
  512. });
  513. }
  514. // 移除事件监听器
  515. function removeEventListeners() {
  516. previewThumbnail.onmouseover = null;
  517. previewThumbnail.onmousemove = null;
  518. previewThumbnail.onmouseout = null;
  519. }
  520. // 监听文件上传变化事件
  521. function setupFileInputChange(uploadId) {
  522. let upload = fileInputWrapper.querySelector(`#${uploadId}`);
  523. if (upload) {
  524. upload.addEventListener('change', function (e) {
  525. // 清除现有的大图预览
  526. removeImageAndPreview();
  527. // 读取新文件并更新 <img> 元素的 src 属性
  528. if (this.files && this.files[0]) {
  529. var reader = new FileReader();
  530. reader.onload = function (event) {
  531. imgElement.src = event.target.result;
  532. // 立即创建大图预览以反映新图片
  533. createLargePreview(imgElement);
  534. setupEventListeners(); // 重新设置事件监听器
  535. updateClearButtonVisibility(); // 更新清除按钮的可见性
  536. };
  537. reader.readAsDataURL(this.files[0]);
  538. } else {
  539. imgElement.src = ''; // 清空图片源
  540. removeEventListeners(); // 移除事件监听器
  541. updateClearButtonVisibility(); // 更新清除按钮的可见性
  542. }
  543. });
  544. }
  545. }
  546. // 移除图片和大图预览并更新清除按钮的可见性
  547. function removeImageAndPreview() {
  548. imgElement.src = ''; // 清空图片源
  549. if (largePreview) {
  550. largePreview.style.display = 'none';
  551. largePreview.remove(); // 从 DOM 中移除 largePreview
  552. largePreview = null;
  553. }
  554. removeEventListeners(); // 移除事件监听器
  555. updateClearButtonVisibility(); // 更新清除按钮的可见性
  556. }
  557. // 更新清除按钮的可见性
  558. function updateClearButtonVisibility() {
  559. if (clearButton && imgElement) {
  560. clearButton.style.display = imgElement.src !== '' ? 'inline-block' : 'none';
  561. }
  562. }
  563. // 初始化
  564. setupEventListeners();
  565. // 对应的文件上传控件ID
  566. let fileId = fileInputWrapper.querySelector('input[type="file"]')?.id;
  567. if (fileId) {
  568. setupFileInputChange(fileId);
  569. }
  570. // 对于回显的图片,确保初始化时创建大图预览并更新清除按钮的可见性
  571. if (imgElement.src) {
  572. createLargePreview(imgElement);
  573. updateClearButtonVisibility();
  574. } else {
  575. updateClearButtonVisibility();
  576. }
  577. }
  578. $(document).ready(function() {
  579. // 获取所有的输入元素(input, textarea, select)
  580. var $inputs = $('form').find('input, textarea, select').filter(':visible');
  581. $inputs.each(function(index) {
  582. $(this).on('keydown', function(e) {
  583. if (e.key === "Enter" || e.keyCode === 13) {
  584. e.preventDefault(); // 阻止默认行为(例如提交表单)
  585. // 找到当前输入框的索引
  586. var currentIndex = $inputs.index(this);
  587. // 如果不是最后一个输入框,则聚焦下一个输入框
  588. if (currentIndex < $inputs.length - 1) {
  589. $inputs.eq(currentIndex + 1).focus();
  590. } else {
  591. // 如果是最后一个输入框,可以选择提交表单或不做任何事情
  592. // $(this).closest('form').submit();
  593. }
  594. }
  595. });
  596. });
  597. // 监听选择变化
  598. $(document).on('change', 'input[name="selectPatient"]', function() {
  599. // 移除所有行的 'selected' 类
  600. $('#patient-table tbody tr').removeClass('selected');
  601. // 获取当前选中的行并添加 'selected' 类
  602. var selectedRow = $(this).closest('tr');
  603. selectedRow.addClass('selected');
  604. // 获取选中的患者对象
  605. var selectedPatient = getSelectedPatient();
  606. if (selectedPatient) {
  607. // 调用 getLastRecipe 方法,传入患者的 ID
  608. var patientId = selectedPatient.id;
  609. getLastRecipe(patientId);
  610. }
  611. });
  612. // 初始化 Select2 插件
  613. $('#hospital-select').select2({
  614. placeholder: "请选择或直接输入搜索",
  615. //allowClear: true //在输入框最后 有一个 删除所有的X 但是会出现 第一个删除出现问题有空格
  616. });
  617. // Listen for the 'select2:select' event
  618. $('#hospital-select').on('select2:select', function(e) {
  619. var clearSpan = $('.select2-selection-clear');
  620. if (clearSpan.length > 0) {
  621. clearSpan.remove();
  622. }
  623. });
  624. // 发送 AJAX 请求获取疾病大类数据
  625. $.ajax({
  626. url: prefix_configInfo+'/dtpHospitalList',
  627. method: 'POST',
  628. dataType: 'json',
  629. success: function(data) {
  630. var options = $('#hospital-select');
  631. // 清空已有选项(除了第一个默认选项)
  632. options.find('option').not(':first').remove();
  633. $('<option>', {
  634. value: '',
  635. text : '请选择疾病医院'
  636. }).appendTo(options);
  637. // 遍历返回的数据并添加选项
  638. $.each(data.value, function(index, item) {
  639. $('<option>', {
  640. value: item.id,
  641. text : item.standardName
  642. }).appendTo(options);
  643. });
  644. // 重新初始化 Select2 以反映新的选项
  645. options.trigger('change');
  646. },
  647. error: function(xhr, status, error) {
  648. $.modal.alertError("解析疾病失败");
  649. }
  650. });
  651. // 初始化 Select2
  652. $('#category-select').select2({
  653. placeholder: '--输入疾病名称搜索--',
  654. allowClear: true,
  655. ajax: {
  656. url: prefix_recipe+'/searchICD11', // 替换为实际的搜索 URL
  657. dataType: 'json',
  658. delay: 300,
  659. method: 'POST', // 使用 POST 方法
  660. data: function (params) {
  661. return {
  662. query: params.term // search term
  663. };
  664. },
  665. processResults: function (data) {
  666. if (data.code == 0) {
  667. return {
  668. results: data.data.map(function(item) {
  669. return { id: item.id, text: item.categoryName};
  670. })
  671. };
  672. } else {
  673. return { results: [] };
  674. }
  675. },
  676. cache: true
  677. }
  678. });
  679. //药师审核选择事件 默认打开
  680. $('#openCheckYSSid').show();
  681. // 清空表单字段
  682. function clearFormFields() {
  683. $('#category-select').val('').trigger('change');
  684. }
  685. // 填充表单字段
  686. function populateFormFields(data) {
  687. $('#category-select').val(data.categoryName);//.trigger('change')
  688. }
  689. });
  690. // 监听药师审核选择事件
  691. function onclickshow() {
  692. reviewFlag=true;
  693. $('#openCheckYSSid').show();
  694. }
  695. function onclickhide() {
  696. reviewFlag=false;
  697. $('#openCheckYSSid').hide();
  698. }
  699. // 将后端返回的数据填充到表格中
  700. function populatePatientTable(datas) {
  701. var tbody = $('#patient-table tbody');
  702. tbody.empty(); // 清空现有行
  703. //var prefix = ctx + "dtp/pmService";
  704. datas.forEach(function(patient, index) {
  705. var genderText = patient.gender === 0 ? '男' : '女';
  706. var row = `
  707. <tr data-index="${index}">
  708. <td><input type="radio" name="selectPatient" value="${index}"></td>
  709. <td>${patient.id}</td>
  710. <td><a onclick="goPatient(${patient.id})" target="_blank">${patient.name}</a></td>
  711. <td>${genderText}</td>
  712. <td>${patient.age || '-'}</td>
  713. <td>${patient.documentType || '-'}</td>
  714. <td>${patient.documentNumber || '-'}</td>
  715. <td>${patient.disease || '-'}</td>
  716. <td>${patient.phoneNumber || '-'}</td>
  717. <!-- 添加其他列的数据 -->
  718. </tr>
  719. `;
  720. tbody.append(row);
  721. });
  722. }
  723. // 获取选中的患者数据并存入对象
  724. function getSelectedPatient() {
  725. var selectedRow = $('input[name="selectPatient"]:checked').closest('tr');
  726. if (selectedRow.length === 0) return null;
  727. var index = selectedRow.data('index');
  728. return dataList[index];
  729. }
  730. function getLastRecipe(patientId){
  731. var datas=[];
  732. var data = {
  733. "patientId":patientId,
  734. };
  735. // 初始化表格 getDrugPurchaseList
  736. $.ajax({
  737. cache : true,
  738. type : "POST",
  739. url : prefix_recipe + "/getLastRecipe",
  740. data : data,
  741. async : false,
  742. error : function(request) {
  743. $.modal.alertError("系统错误");
  744. },
  745. success : function(data) {
  746. var shangciObj={};
  747. shangcigyList=data.data.recipeList;
  748. if(data.data.recipeList !=null || data.data.recipeList != undefined){
  749. initTab(datas=data.data.recipeList)
  750. }
  751. if(data.data.recipe!=null){
  752. shangciObj=data.data.recipe;
  753. $('#hospital').val(shangciObj.hospital);
  754. $('#prescribingDoctor').val(shangciObj.prescribingDoctor);
  755. $('#department').val(shangciObj.department);
  756. $('#attendingDoctor').val(shangciObj.attendingDoctor);
  757. }else {
  758. shangciObj={};
  759. // $('#hospital').val('');
  760. // $('#prescribingDoctor').val('');
  761. // $('#department').val('');
  762. // $('#attendingDoctor').val('');
  763. }
  764. $.operate.successCallback(data);
  765. }
  766. });
  767. }
  768. function initTab(datas){
  769. var tableId = 'bootstrap-table';
  770. var tableElement = $('#' + tableId);
  771. tableElement.bootstrapTable({
  772. data: datas,
  773. columns : [
  774. {field: 'mdmCode', title: '药品编码', align: 'center'},
  775. {field: 'productName', title: '商品名', align: 'center'},
  776. {field: 'genericName', title: '通用名', align: 'center'},
  777. {field: 'specification', title: '规格', align: 'center'},
  778. {field: 'manufacturerShortName', title: '厂家简称', align: 'center'},
  779. {field: 'administrationMethod', title: '给药方式', align: 'center'},
  780. {field: 'realNameStatus', title: '处方取药数量(包装数)', align: 'center'},
  781. {field: 'singleDoseValue', title: '处方单次剂量数值', align: 'center'},
  782. {field: 'singleDoseUnit', title: '处方单次剂量单位', align: 'center'},
  783. {field: 'dosageFrequency', title: '规范用药频次', align: 'center'},
  784. {field: 'dosageFrequencyDays', title: '用药频次换算使用天数', align: 'center'},
  785. {field: 'dvalueDays', title: 'D值品用药天数', align: 'center'},
  786. {field: 'prescriptionNumber', title: '处方编号', align: 'center'},
  787. // {
  788. // title: '操作',
  789. // align: 'center',
  790. // formatter: function(value, row, index) {
  791. // if (row.id) {
  792. // var actions = [];
  793. // actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.view(\'' + row.id + '\')">购药详情</a> ');
  794. // return actions.join('');
  795. // } else {
  796. // return "";
  797. // }
  798. // }
  799. // }
  800. ]
  801. });
  802. }
  803. function getTableData() {
  804. var tableRows = [];
  805. $('#drugInfoTable tbody tr').each(function(index, row) {
  806. var rowData = {
  807. productId: $(row).data('product-id'),
  808. mdmCode: $(row).find('td:eq(1)').text(),
  809. productName: $(row).find('td:eq(2)').text(),
  810. genericName: $(row).find('td:eq(3)').text(),
  811. specification: $(row).find('td:eq(4)').text(),
  812. manufacturerShortName: $(row).find('td:eq(5)').text(),
  813. administrationMethod: $(row).find('td:eq(6)').text(),
  814. followUpItem: $(row).find('td:eq(7)').text(),
  815. coldChainItem: $(row).find('td:eq(8)').text(),
  816. registeredItem: $(row).find('td:eq(9)').text(),
  817. charityAidItem: $(row).find('td:eq(10)').text(),
  818. packaging: $(row).find('td:eq(11)').text(),
  819. packageQuantity: $(row).find('input[name="packageQuantity"]').val(),
  820. singleDoseValue: $(row).find('input[name="singleDoseValue"]').val(),
  821. singleDoseUnit: $(row).find('select[name="singleDoseUnit"]').val(),
  822. dosageFrequency: $(row).find('select[name="dosageFrequency"]').val(),
  823. dosageFrequencyDays: $(row).find('input[name="dosageFrequencyDays"]').val(),
  824. dvalueDays: $(row).find('input[name="dvalueDays"]').val()
  825. };
  826. if (rowData.dosageFrequencyDays == ''|| rowData.dosageFrequencyDays == null|| rowData.dosageFrequencyDays == undefined){
  827. $.modal.alertError("购药包装单位为空,请到药品库设置包装单位后再操作");
  828. return;
  829. }
  830. if (rowData.packageQuantity == ''|| rowData.packageQuantity == null|| rowData.packageQuantity == undefined){
  831. $.modal.alertError("请输入包装数量");
  832. return;
  833. }
  834. if (rowData.singleDoseValue == ''|| rowData.singleDoseValue == null|| rowData.singleDoseValue == undefined){
  835. $.modal.alertError("请输入单次剂量数值");
  836. return;
  837. }
  838. if (rowData.singleDoseUnit == ''|| rowData.singleDoseUnit == null|| rowData.singleDoseUnit == undefined){
  839. $.modal.alertError("请输入单次剂量单位");
  840. return;
  841. }
  842. if (rowData.dosageFrequency == ''|| rowData.dosageFrequency == null|| rowData.dosageFrequency == undefined){
  843. $.modal.alertError("请输入频次");
  844. return;
  845. }
  846. // 将每一行的数据对象添加到数组中
  847. tableRows.push(rowData);
  848. });
  849. return tableRows;
  850. }
  851. function submitHandler() {
  852. prescriptionNumber='';
  853. drugsLinkId='';
  854. var hospital = $("#dtp-form-newcfxx").serializeArray().find(item => item.name === 'hospital');
  855. if (hospital.value === '') {
  856. $.modal.alertWarning("请选择请选择医院!");
  857. return null;
  858. }
  859. var prescribingDoctor = $("#dtp-form-newcfxx").serializeArray().find(item => item.name === 'prescribingDoctor');
  860. if (prescribingDoctor.value === '') {
  861. $.modal.alertWarning("请输入处方医生!");
  862. return null;
  863. }
  864. var prescriptionDiagnosis = $("#dtp-form-newcfxx").serializeArray().find(item => item.name === 'prescriptionDiagnosis');
  865. if (prescriptionDiagnosis.value === '') {
  866. $.modal.alertWarning("请填写处方诊断!");
  867. return null;
  868. }
  869. var prescriptionIssueDate = $("#dtp-form-newcfxx").serializeArray().find(item => item.name === 'prescriptionIssueDate');
  870. if (prescriptionIssueDate.value === '') {
  871. $.modal.alertWarning("请选择处方开具日期!");
  872. return null;
  873. }
  874. // 创建一个 FormData 对象用于提交表单数据
  875. var formData = new FormData();
  876. // 如果有文件上传,例如处方图片和发票图片
  877. // var prescriptionImageUrlInput = $('#prescriptionImageUrl')[0];
  878. // if (prescriptionImageUrlInput.files.length > 0) {
  879. // formData.append('prescriptionImageUrl', prescriptionImageUrlInput.files[0]);
  880. // }
  881. //
  882. // var invoiceImageUrlInput = $('#invoiceImageUrl')[0];
  883. // if (invoiceImageUrlInput.files.length > 0) {
  884. // formData.append('invoiceImageUrl', invoiceImageUrlInput.files[0]);
  885. // }
  886. // 收集患者信息
  887. var patientObj = getSelectedPatient();
  888. if (patientObj) {
  889. // 添加患者信息到 FormData
  890. formData.append('patientId', patientObj.id);
  891. formData.append('patientName', patientObj.name || '');
  892. formData.append('patientPhone', patientObj.phoneNumber);
  893. let gender = patientObj.gender; // 获取表单中的性别值
  894. if (gender ===1) {
  895. gender = 1; // 如果为空,则设置默认值为 '0'
  896. }else{
  897. gender = 0;
  898. }
  899. formData.append('gender', gender);
  900. formData.append('age', patientObj.age);
  901. }else{
  902. $.modal.alertError("请先选择患者");
  903. return;
  904. }
  905. // 收集表单中的其他字段,并将其添加到 FormData 中
  906. $('#dtp-form-newcfxx').find(':input').each(function() {
  907. var $this = $(this);
  908. var name = $this.attr('name');
  909. if (name) { // 确保有 name 属性
  910. var value = $this.val();
  911. if (value !== undefined && value !== null && value !== '') { // 确保值不是空
  912. formData.append(name, value);
  913. }
  914. }
  915. });
  916. var selectedOptionsDL = $('#category-select option:selected');
  917. //var selectedOptionsXL = $('#subcategory-select option:selected');
  918. var selectedDataDL = selectedOptionsDL.map(function() {
  919. return {
  920. id: $(this).val(),
  921. name: $(this).text()
  922. };
  923. }).get();
  924. const DL = JSON.stringify(selectedDataDL);
  925. formData.append('dl', DL);
  926. formData.append('dlanme', DL);
  927. var reviewingNameInput = $('#pharmacistNameSelect option:selected');
  928. if($.common.isEmpty(reviewingName) && reviewFlag){
  929. reviewFlag=false;
  930. $.modal.alertError("请完成药师审核或选择不开启审核");
  931. return;
  932. }
  933. if(reviewFlag && $.common.isNotEmpty(reviewingName)){
  934. formData.append('remarks', remarks);
  935. formData.append('reviewingName', reviewingName);
  936. formData.append('reviewStatus', reviewStatus);
  937. formData.append('reviewFormData', reviewFormData);
  938. }
  939. var tableRows = [];
  940. var falg = true;
  941. $('#drugInfoTable tbody tr').each(function(index, row) {
  942. var rowData = {
  943. productId: $(row).data('product-id'),
  944. mdmCode: $(row).find('td:eq(1)').text(),
  945. productName: $(row).find('td:eq(2)').text(),
  946. genericName: $(row).find('td:eq(3)').text(),
  947. specification: $(row).find('td:eq(4)').text(),
  948. manufacturerShortName: $(row).find('td:eq(5)').text(),
  949. administrationMethod: $(row).find('td:eq(6)').text(),
  950. followUpItem: $(row).find('td:eq(7)').text(),
  951. coldChainItem: $(row).find('td:eq(8)').text(),
  952. registeredItem: $(row).find('td:eq(9)').text(),
  953. charityAidItem: $(row).find('td:eq(10)').text(),
  954. packaging: $(row).find('td:eq(11)').text(),
  955. packageQuantity: $(row).find('input[name="packageQuantity"]').val(),
  956. singleDoseValue: $(row).find('input[name="singleDoseValue"]').val(),
  957. singleDoseUnit: $(row).find('select[name="singleDoseUnit"]').val(),
  958. dosageFrequency: $(row).find('select[name="dosageFrequency"]').val(),
  959. dosageFrequencyDays: $(row).find('input[name="dosageFrequencyDays"]').val(),
  960. dvalueDays: $(row).find('input[name="dvalueDays"]').val(),
  961. dosageMax: $(row).find('input[name="dosageMax"]').val(),
  962. unitMax: $(row).find('input[name="unitMax"]').val(),
  963. dosageMin: $(row).find('input[name="dosageMin"]').val(),
  964. unitMin: $(row).find('input[name="unitMin"]').val(),
  965. dosageNormal: $(row).find('input[name="dosageNormal"]').val(),
  966. unitNormal: $(row).find('input[name="unitNormal"]').val(),
  967. packingValue: $(row).find('input[name="packingValue"]').val(),
  968. packingUnit: $(row).find('input[name="packingUnit"]').val(),
  969. };
  970. if (rowData.dosageFrequencyDays == ''|| rowData.dosageFrequencyDays == null|| rowData.dosageFrequencyDays == undefined){
  971. $.modal.alertError("购药包装单位为空,请到药品库设置包装单位后再操作");
  972. falg = false;
  973. return falg;
  974. }
  975. if (rowData.packageQuantity == ''|| rowData.packageQuantity == null|| rowData.packageQuantity == undefined){
  976. $.modal.alertError("请输入包装数量");
  977. falg = false;
  978. return falg;
  979. }
  980. if (rowData.singleDoseValue == ''|| rowData.singleDoseValue == null|| rowData.singleDoseValue == undefined){
  981. $.modal.alertError("请输入单次剂量数值");
  982. falg = false;
  983. return falg;
  984. }
  985. if (rowData.singleDoseUnit == ''|| rowData.singleDoseUnit == null|| rowData.singleDoseUnit == undefined){
  986. $.modal.alertError("请选择单次剂量单位");
  987. falg = false;
  988. return falg;
  989. }
  990. if (rowData.dosageFrequency == ''|| rowData.dosageFrequency == null|| rowData.dosageFrequency == undefined){
  991. $.modal.alertError("请选择频次");
  992. falg = false;
  993. return falg;
  994. }
  995. /* 计算 D 值天数*/
  996. var dcnum = rowData.singleDoseValue; // 单次用量
  997. var pcnum = rowData.dosageFrequency; // 用药频次 eg: 一天一次
  998. // 计算 D 值
  999. var num = rowData.packageQuantity; // 买药数量
  1000. var dnum = (num*rowData.dosageFrequencyDays)/(dcnum*pcnum); // 买药数量 * 包装单位数量 / 频次天数 = D 值天数
  1001. if((dcnum*pcnum)>rowData.dosageMax){
  1002. $.modal.confirm("单次剂量数值频次大于最大值 是否使用默认值?", function() {
  1003. if (rowData.dosageNormal == ''|| rowData.dosageNormal == null|| rowData.dosageNormal == undefined){
  1004. dnum = (num*rowData.dosageFrequencyDays)/rowData.dosageMax;
  1005. }else {
  1006. dnum = (num*rowData.dosageFrequencyDays)/rowData.dosageNormal;
  1007. }
  1008. });
  1009. }
  1010. if((dcnum*pcnum)<rowData.dosageMin){
  1011. $.modal.confirm("单次剂量数值频次小于最小值 是否使用默认值?", function() {
  1012. if (rowData.dosageNormal == ''|| rowData.dosageNormal == null|| rowData.dosageNormal == undefined){
  1013. dnum = (num*rowData.dosageFrequencyDays)/rowData.dosageMin;
  1014. }else {
  1015. dnum = (num*rowData.dosageFrequencyDays)/rowData.dosageNormal;
  1016. }
  1017. });
  1018. }
  1019. rowData.dvalueDays = dnum;
  1020. // 将每一行的数据对象添加到数组中
  1021. tableRows.push(rowData);
  1022. });
  1023. if (!falg){
  1024. return;
  1025. }
  1026. if (tableRows.length > 0) {
  1027. formData.append('drugData', JSON.stringify(tableRows));
  1028. }else{
  1029. $.modal.alertError("请添加药品");
  1030. return;
  1031. }
  1032. // prescriptionImageUpload 处方
  1033. let prescriptionImageUpload = document.getElementById('prescriptionImageUpload');
  1034. //invoiceImageUpload 发票
  1035. let invoiceImageUpload = document.getElementById('invoiceImageUpload');
  1036. let prescriptionImageFile = prescriptionImageUpload.files[0];
  1037. let invoiceImageFile = invoiceImageUpload.files[0];
  1038. var fd = new FormData();
  1039. var fdi = new FormData();
  1040. var prescriptionImageUrl =$("#prescriptionImageUrl").val();
  1041. var invoiceImageUrl =$("#invoiceImageUrl").val();
  1042. formData.append('prescriptionImageUrl', '');
  1043. formData.append('invoiceImageUrl', '');
  1044. if (prescriptionImageUrl!=''&&prescriptionImageUrl!=null&&prescriptionImageUrl!=undefined){
  1045. formData.append('prescriptionImageUrl', prescriptionImageUrl);
  1046. }
  1047. if (invoiceImageUrl!=''&&invoiceImageUrl!=null&&invoiceImageUrl!=undefined){
  1048. formData.append('invoiceImageUrl', invoiceImageUrl);
  1049. }
  1050. if (prescriptionImageFile && prescriptionImageFile !== '') {
  1051. fd.append('file', prescriptionImageFile); // 'file' 是服务器端用来接收文件的字段名
  1052. $.ajax({
  1053. url: prefix_recipe + "/uploadImg",
  1054. data: fd,
  1055. type: "post",
  1056. processData: false,
  1057. contentType: false,
  1058. success: function(result) {
  1059. if (result.msg) {
  1060. formData.append('prescriptionImageUrl', result.msg);
  1061. }
  1062. // 上传发票图片
  1063. if (invoiceImageFile && invoiceImageFile !== '') {
  1064. fdi.append('file', invoiceImageFile); // 'file' 是服务器端用来接收文件的字段名
  1065. $.ajax({
  1066. url: prefix_recipe + "/uploadImg",
  1067. data: fdi,
  1068. type: "post",
  1069. processData: false,
  1070. contentType: false,
  1071. success: function(result) {
  1072. if (result.msg) {
  1073. formData.append('invoiceImageUrl', result.msg);
  1074. }
  1075. // 更新 CFDJ
  1076. updateCFDJ(formData);
  1077. },
  1078. error: function(xhr, status, error) {
  1079. $.modal.alertError("上传图片失败");
  1080. }
  1081. });
  1082. } else {
  1083. // 如果没有发票图片,则直接更新 CFDJ
  1084. updateCFDJ(formData);
  1085. }
  1086. },
  1087. error: function(xhr, status, error) {
  1088. $.modal.alertError("上传图片失败");
  1089. }
  1090. });
  1091. } else if (invoiceImageFile && invoiceImageFile !== '') {
  1092. // 如果只有发票图片需要上传
  1093. fdi.append('file', invoiceImageFile); // 'file' 是服务器端用来接收文件的字段名
  1094. $.ajax({
  1095. url: prefix_recipe + "/uploadImg",
  1096. data: fdi,
  1097. type: "post",
  1098. processData: false,
  1099. contentType: false,
  1100. success: function(result) {
  1101. if (result.msg) {
  1102. formData.append('invoiceImageUrl', result.msg);
  1103. }
  1104. // 更新 CFDJ
  1105. updateCFDJ(formData);
  1106. },
  1107. error: function(xhr, status, error) {
  1108. $.modal.alertError("上传图片失败");
  1109. }
  1110. });
  1111. } else {
  1112. // 如果没有图片需要上传,则直接更新 CFDJ
  1113. updateCFDJ(formData);
  1114. }
  1115. }
  1116. function updateCFDJ(formData) {
  1117. $.ajax({
  1118. cache: false, // 设置为 false 防止缓存
  1119. type: "POST",
  1120. url: prefix_recipe + "/saveCFDJ",
  1121. data: formData,
  1122. processData: false, // 告诉 jQuery 不要处理数据(非常重要)
  1123. contentType: false, // 告诉 jQuery 不要设置 contentType(非常重要)
  1124. async: true, // 异步请求更为推荐,除非有特殊原因需要同步
  1125. error: function (request) {
  1126. $.modal.alertError("操作失败");
  1127. },
  1128. success: function (data) {
  1129. if(data.data.code==200){
  1130. prescriptionNumber = data.data.prescriptionNumber;
  1131. drugsLinkId = data.data.drugsLinkId;
  1132. $.modal.msg(data.msg);
  1133. $.modal.close();
  1134. $.modal.msgSuccessReload();
  1135. }else{
  1136. $.modal.alertError(data.data.msg);
  1137. }
  1138. }
  1139. });
  1140. }
  1141. function openCheckYSSH(){
  1142. //初始化时加载药师信息
  1143. loadPharmacists();
  1144. //$.modal.open("药师审核", prefix_pmService+'/openCheckYSJC'); findRevieForList
  1145. $('#myModal').modal('show');
  1146. // $.modal.closeTab();
  1147. }
  1148. // 异步加载所有药师信息并填充下拉框
  1149. function loadPharmacists() {
  1150. $.ajax({
  1151. url: prefix_recipe+ "/findRevieForList", // 假设这是获取所有药师的API端点
  1152. type: 'POST',
  1153. cache: false, // 设置为 false 防止缓存
  1154. processData: false, // 告诉 jQuery 不要处理数据(非常重要)
  1155. contentType: false, // 告诉 jQuery 不要设置 contentType(非常重要)
  1156. async: true, // 异步请求更为推荐,除非有特殊原因需要同步
  1157. success: function (data) {
  1158. var select = $('#pharmacistNameSelect');
  1159. // 清空除了默认选项外的所有选项
  1160. select.find('option:not(:first)').remove();
  1161. data.data.forEach(function (pharmacist) {
  1162. select.append(new Option(pharmacist.pharmacistName, pharmacist.id));
  1163. });
  1164. },
  1165. error: function () {
  1166. $.modal.alertError('加载药师信息失败');
  1167. }
  1168. });
  1169. }
  1170. // 当选择药师后显示密码输入框
  1171. $('#pharmacistNameSelect').change(function () {
  1172. var selectedValue = $(this).val();
  1173. // 如果选择了具体的药师
  1174. if (selectedValue) {
  1175. $('#passwordGroup').show();
  1176. $('#password').val(''); // 清空密码输入框
  1177. $('#checkView').hide(); // 隐藏审核结果部分
  1178. $('#pharmacistVerified').hide(); // 隐藏验证成功的符号
  1179. } else {
  1180. // 如果没有选择任何药师,隐藏所有相关元素
  1181. $('#passwordGroup').hide();
  1182. $('#checkView').hide(); // 确保在切换药师时隐藏审核结果和意见
  1183. $('#pharmacistVerified').hide(); // 隐藏验证成功的符号
  1184. $('#password').val(''); // 清空密码输入框
  1185. }
  1186. });
  1187. // 验证药师密码并显示审核结果部分
  1188. function verifyPassword() {
  1189. var formData = new FormData();
  1190. var pharmacistId = $('#pharmacistNameSelect').val();
  1191. var password = $('#password').val();
  1192. formData.append('id', pharmacistId);
  1193. formData.append('reviewPassword', password);
  1194. $.ajax({
  1195. url: prefix_recipe+"/ReviewCheckInputPassword", // 假设这是验证药师密码的API端点
  1196. type: 'POST',
  1197. data: formData,
  1198. cache: false, // 设置为 false 防止缓存
  1199. processData: false, // 告诉 jQuery 不要处理数据(非常重要)
  1200. contentType: false, // 告诉 jQuery 不要设置 contentType(非常重要)
  1201. async: true, // 异步请求更为推荐,除非有特殊原因需要同步
  1202. success: function (data) {
  1203. if (data.code === 0) {
  1204. $('#checkView').show();
  1205. $('#pharmacistVerified').show(); // 显示验证成功的符号
  1206. } else {
  1207. $.modal.alertError('密码错误');
  1208. $('#checkView').hide();
  1209. $('#pharmacistVerified').hide(); // 隐藏验证成功的符号
  1210. }
  1211. },
  1212. error: function () {
  1213. $.modal.alertError('验证失败');
  1214. }
  1215. });
  1216. }
  1217. // 添加点击事件监听器到确认按钮上,用于触发密码验证
  1218. $('#verifyPasswordBtn').click(function () {
  1219. verifyPassword();
  1220. });
  1221. // 提交审核信息
  1222. function submitReview() {
  1223. if ($('#pharmacistNameSelect').val() && $('#password').is(':visible')) {
  1224. verifyPassword();
  1225. } else {
  1226. $.modal.alert('请选择审核药师并输入密码');
  1227. }
  1228. // 如果 checkView 显示,则可以提交表单
  1229. if ($('#checkView').is(':visible')) {
  1230. // 直接从特定的输入元素中获取值
  1231. // 获取审核药师姓名
  1232. var reviewingNameOption = $('#pharmacistNameSelect option:selected');
  1233. var reviewingName1 = reviewingNameOption.text(); // 获取选中的选项文本
  1234. var reviewStatus1 = $('input[name="checkResult"]:checked').val(); // 获取选中的审核结果
  1235. var remarks1 = $('#remarks').val();
  1236. // 检查是否所有必填项都已填写
  1237. if (!reviewingName1) {
  1238. $.modal.alert('请选择审核人');
  1239. return;
  1240. }
  1241. if (!reviewStatus1) {
  1242. $.modal.alert('请选择审核结果');
  1243. return;
  1244. }
  1245. remarks= remarks1;
  1246. reviewingName=reviewingName1;
  1247. reviewStatus=reviewStatus1;
  1248. // 添加到 formData 中
  1249. reviewFormData.append("reviewingName", reviewingName1);
  1250. reviewFormData.append("reviewStatus", reviewStatus1);
  1251. // reviewFormData.append("prescriptionNumber", prescriptionNumber);
  1252. // reviewFormData.append("drugsLinkId", drugsLinkId);
  1253. reviewFormData.append("remarks", remarks1);
  1254. $.modal.msgSuccess('审核信息已保存到处方登记页');
  1255. $('#myModal').modal('hide'); // 关闭弹窗
  1256. }
  1257. }
  1258. // callBack获取父窗口方法(方式二)
  1259. function selectUsersToParentCallBack2(){
  1260. var options = {
  1261. title: '添加处方登记药品',
  1262. width: 1000,
  1263. height: 600,
  1264. url: prefix_yppz + '/getAllProduct',
  1265. callBack: doSubmit2
  1266. };
  1267. $.modal.openOptions(options);
  1268. }
  1269. function doSubmit2(index, layero) {
  1270. var rows = layero.find("iframe")[0].contentWindow.selectTableObject();
  1271. if (rows.length == 0) {
  1272. $.modal.alertWarning("请至少选择一条记录");
  1273. return;
  1274. }
  1275. var tableBody = $('#drugInfoTable tbody');
  1276. rows.forEach(function(item) {
  1277. // 动态选择所有列并映射到更具描述性的名称
  1278. var columnsData = {
  1279. productId: item.productId,
  1280. productCode: item.productCode,
  1281. productName: item.productName,
  1282. genericName: item.genericName,
  1283. specification: item.specification,
  1284. packaging: item.packaging,
  1285. manufacturer: item.manufacturer,
  1286. manufacturerAbbreviation: item.manufacturerAbbreviation,
  1287. productStatus: item.productStatus,
  1288. dtpFlag: item.dtpFlag,
  1289. isInsuranceDrug: item.isInsuranceDrug,
  1290. administrationMethod: item.administrationMethod,
  1291. registeredItem: item.registeredItem,
  1292. followUpItem: item.followUpItem,
  1293. coldChainItem: item.coldChainItem,
  1294. flowItem: item.flowItem,
  1295. charityAidItem: item.charityAidItem,
  1296. dosageMax: item.dosageMax,
  1297. unitMax: item.unitMax,
  1298. dosageMin: item.dosageMin,
  1299. unitMin: item.unitMin,
  1300. dosageNormal: item.dosageNormal,
  1301. unitNormal: item.unitNormal,
  1302. packingValue: item.packingValue,
  1303. packingUnit: item.packingUnit,
  1304. dvalueDays: item.dvalueDays,
  1305. };
  1306. // 检查是否已经存在该药品
  1307. if (!isProductExist(columnsData.productId)) {
  1308. // 向表格中添加一行
  1309. var row = `
  1310. <tr data-product-id="${columnsData.productId}">
  1311. <td><button onclick="deleteRow('${columnsData.productId}')" class="btn btn-danger">删除重选择药品</button></td>
  1312. <td>${columnsData.productCode}</td>
  1313. <td>${columnsData.productName}</td>
  1314. <td class="hidden-column">${columnsData.genericName}</td>
  1315. <td>${columnsData.specification}</td>
  1316. <td class="hidden-column">${columnsData.manufacturerAbbreviation}</td>
  1317. <td class="hidden-column">${columnsData.administrationMethod}</td>
  1318. <td class="hidden-column">${columnsData.followUpItem === 1 ? '是' : '否'}</td>
  1319. <td class="hidden-column">${columnsData.coldChainItem === 1 ? '是' : '否'}</td>
  1320. <td class="hidden-column">${columnsData.registeredItem === 1 ? '是' : '否'}</td>
  1321. <td class="hidden-column">${columnsData.charityAidItem === 1 ? '是' : '否'}</td>
  1322. <td class="hidden-column">${columnsData.packaging}</td>
  1323. <td class="hidden-column"><input name="dosageMax" value="${columnsData.dosageMax}"/></td>
  1324. <td class="hidden-column"><input name="unitMax" value="${columnsData.unitMax}"/></td>
  1325. <td class="hidden-column"><input name="dosageMin" value="${columnsData.dosageMin}"/></td>
  1326. <td class="hidden-column"><input name="unitMin" value="${columnsData.unitMin}"/></td>
  1327. <td class="hidden-column"><input name="dosageNormal" value="${columnsData.dosageNormal}"/></td>
  1328. <td class="hidden-column"><input name="unitNormal" value="${columnsData.unitNormal}"/></td>
  1329. <td class="hidden-column"><input name="packingValue" value="${columnsData.packingValue}"/></td>
  1330. <td class="hidden-column"><input name="packingUnit" value="${columnsData.packingUnit}"/></td>
  1331. <td> <input name="packageQuantity" id="packageQuantity${columnsData.productId}" placeholder="取药数量(包装数)" class="styled-input" style="width: 130px;" type="number"></td>
  1332. <td> <input name="singleDoseValue" id="singleDoseValue${columnsData.productId}" placeholder="单次剂量数值" class="styled-input" style="width: 130px;" type="number"></td>
  1333. <td>
  1334. <select name="singleDoseUnit" id="singleDoseUnit${columnsData.productId}" class="styled-input" style="width: 130px;" required>
  1335. <option value="">请选择</option>
  1336. <!--<option value="1">mg</option>
  1337. <option value="2">g</option>
  1338. <option value="3">片</option>-->
  1339. </select>
  1340. </td>
  1341. <td>
  1342. <select name="dosageFrequency" id="dosageFrequency${columnsData.productId}" class="styled-input" style="width: 130px;" required>
  1343. <option value="">请选择</option>
  1344. <!--<option value="1">一日1次</option>
  1345. <option value="2">一日2次</option>
  1346. <option value="3">每天1次</option>
  1347. <option value="4">每天隔天一次</option>
  1348. <option value="5">每周2次</option>-->
  1349. </select>
  1350. </td>
  1351. <td> <input name="dosageFrequencyDays" id="dosageFrequencyDays${columnsData.productId}" placeholder="购药包装单位" class="styled-input" disabled style="width: 100px;" type="number"><span id="ycode${columnsData.productId}"></span></td>
  1352. <td> <input name="dvalueDays" id="dvalueDays${columnsData.productId}" placeholder="系统自动计算" class="styled-input" disabled="" style="width: 100px;" type="number"></td>
  1353. </tr>
  1354. `;
  1355. tableBody.append(row);
  1356. dataInfo(columnsData.productId);
  1357. //bindDosageFrequencyChangeListener(columnsData.productId);
  1358. $('#dosageFrequencyDays'+columnsData.productId).val(columnsData.packingValue);
  1359. $('#ycode'+columnsData.productId).text(columnsData.packingUnit);
  1360. } else {
  1361. $.modal.alertWarning(`药品 [ ${columnsData.productName} ] 已经添加了`);
  1362. }
  1363. });
  1364. $.modal.close(index);
  1365. }
  1366. function dataInfo(productId){
  1367. /*<![CDATA[*/
  1368. var storeTypes = /*[[${@dict.getType('sys_gxhpz_gg_unitall')}]]*/ [];
  1369. /*]]>*/
  1370. /*<![CDATA[*/
  1371. var pcTypes = /*[[${@dict.getType('sys_select_dtp_ysfw_sfpx')}]]*/ [];
  1372. /*]]>*/
  1373. // 获取<select>元素
  1374. var selectElement = document.getElementById('singleDoseUnit' + productId);
  1375. var pcselectElement = document.getElementById('dosageFrequency' + productId);
  1376. storeTypes.forEach(function(item, index){
  1377. var option = document.createElement("option");
  1378. option.value = item.dictValue;
  1379. option.text = item.dictLabel;
  1380. selectElement.add(option);
  1381. })
  1382. pcTypes.forEach(function(item, index){
  1383. var option = document.createElement("option");
  1384. option.value = item.dictValue;
  1385. option.text = item.dictLabel;
  1386. pcselectElement.add(option);
  1387. })
  1388. }
  1389. // 动态绑定用药频次选择事件
  1390. function bindDosageFrequencyChangeListener(productId) {
  1391. $(`#dosageFrequency${productId}`).on('change', function () {
  1392. var selectedValue = $(this).val();
  1393. if (selectedValue) {
  1394. $(`#dosageFrequencyDays${productId}`).val(selectedValue);
  1395. } else {
  1396. $(`#dosageFrequencyDays${productId}`).val('');
  1397. }
  1398. });
  1399. }
  1400. function deleteRow(productId) {
  1401. $.modal.confirm("确认删除该药品吗?", function() {
  1402. // 删除对应行
  1403. $('#drugInfoTable tbody tr[data-product-id="' + productId + '"]').remove();
  1404. });
  1405. }
  1406. function isProductExist(productId) {
  1407. // 检查表格中是否已经存在该药品
  1408. return $('#drugInfoTable tbody tr[data-product-id="' + productId + '"]').length > 0;
  1409. }
  1410. /* 用户管理-新增-选择门店树 */
  1411. function selectDeptTree() {
  1412. var treeId = $("#treeId").val();
  1413. var deptId = $.common.isEmpty(treeId) ? "100" : $("#treeId").val();
  1414. var url = ctx + "system/user/selectDeptTree/" + deptId;
  1415. var options = {
  1416. title: '选择门店',
  1417. width: "380",
  1418. url: url,
  1419. callBack: doSubmit
  1420. };
  1421. $.modal.openOptions(options);
  1422. }
  1423. function doSubmit(index, layero){
  1424. var body = $.modal.getChildFrame(index);
  1425. $("#treeId").val(body.find('#treeId').val());
  1426. $("#treeName").val(body.find('#treeName').val());
  1427. $.modal.close(index);
  1428. }
  1429. function goPatient(id){
  1430. $.modal.openTab("患者档案馆", prefix_pmService+'/archivesEdit/'+id);
  1431. }
  1432. function bookbuilding(){
  1433. $.operate.addSetwht('快速建档','dtp/pmService/archivesAdd',800,800)
  1434. //$.modal.open("快速建档", prefix_pmService+'/archivesAdd');
  1435. }
  1436. function resetPre() {
  1437. resetDate();
  1438. $("#dtp-form-hxcx")[0].reset();
  1439. $("#query").val("");
  1440. }
  1441. function search_hz() {
  1442. var query = $('#query').val();
  1443. // 如果输入为空,清空 dValueId 输入框并停止进一步操作
  1444. if (!query) {
  1445. $('#query').val('');
  1446. var tbody = $('#patient-table tbody');
  1447. tbody.empty(); // 清空现有行
  1448. return;
  1449. }
  1450. // 使用防抖机制延迟发送请求
  1451. // 发送 AJAX 请求到服务器查询数据
  1452. hzparam={query:query};//模拟微信扫码获取微信openId
  1453. $.ajax({
  1454. cache: true,
  1455. type: "POST",
  1456. url: prefix_pmService+'/slectPatientByNameOrPhoneOrIdCard', // 替换为实际的搜索 URL
  1457. data: hzparam,
  1458. async: false,
  1459. success: function (data) {
  1460. if(data.code==0){
  1461. dataList=[];
  1462. populatePatientTable(data.data);
  1463. dataList=data.data;
  1464. // 如果有且只有一条记录,默认选中这条记录
  1465. if (data.data.length === 1) {
  1466. setTimeout(function() {
  1467. $('input[name="selectPatient"]').first().prop('checked', true).trigger('change');
  1468. }, 0); // 确保DOM已经完全渲染
  1469. }
  1470. if (data.data.length <=0) {
  1471. var tbody = $('#patient-table tbody');
  1472. tbody.empty(); // 清空现有行
  1473. $.modal.confirm("未找到患者 点击确定可快速建档", function() {
  1474. // 快速建档
  1475. bookbuilding();
  1476. });
  1477. }
  1478. // // 如果找到匹配的数据,更新输入框
  1479. // $('#patientId').val(data.data.id);
  1480. // $('#patientName').val(data.data.name);
  1481. // var gender = data.data.gender;
  1482. // $('#gender').val(gender === 1 ? '男' : gender === 0 ? '女' : '');
  1483. // $('#age').val(data.data.age);
  1484. // var patientId = data.data.id;
  1485. // if(patientId !='' && patientId != null){
  1486. // //查询出对应患者的上一次处方登记信息
  1487. // getLastRecipe(patientId);
  1488. // }
  1489. }else{
  1490. // // 清空表格中的所有数据行
  1491. // $('#patientId').val('');
  1492. // $('#patientName').val('');
  1493. // $('#gender').val('');
  1494. // $('#age').val('');
  1495. // $('#query').val('');
  1496. // getLastRecipe(0);
  1497. $.modal.alertWarning(`未找到患者 可快速建档`);
  1498. bookbuilding();
  1499. var tbody = $('#patient-table tbody');
  1500. tbody.empty(); // 清空现有行
  1501. }
  1502. },
  1503. error: function(error) {
  1504. var tbody = $('#patient-table tbody');
  1505. tbody.empty(); // 清空现有行
  1506. // 清空 dValueId 输入框
  1507. $('#query').val('');
  1508. }
  1509. });
  1510. }
  1511. </script>
  1512. <style>
  1513. .ibox {
  1514. width: auto;
  1515. height: 370px;
  1516. overflow: auto; /* 当内容超过指定尺寸时显示滚动条 */
  1517. }
  1518. .fixed-layout-table {
  1519. width: 100%;
  1520. border-collapse: collapse; /* 减少单元格间距 */
  1521. }
  1522. .fixed-layout-table thead th {
  1523. position: sticky;
  1524. top: 0;
  1525. background-color: #f8f9fa; /* 表头背景颜色 */
  1526. z-index: 1;
  1527. }
  1528. /* 隐藏列的样式 */
  1529. .hidden-column {
  1530. display: none;
  1531. }
  1532. .hidden {
  1533. display: none;
  1534. }
  1535. /*.ibox {*/
  1536. /* width: 700px;*/
  1537. /* margin-bottom: 20px;*/
  1538. /* border: 1px solid #e7eaec;*/
  1539. /* border-radius: 4px;*/
  1540. /*}*/
  1541. .ibox-title {
  1542. background-color: #e6e3da;
  1543. border-bottom: 1px solid #e7eaec;
  1544. padding: 10px 15px;
  1545. font-size: 16px;
  1546. width: 1540px;
  1547. }
  1548. .ibox-content {
  1549. padding: 15px;
  1550. }
  1551. .ibox-content h4 {
  1552. margin-top: 0;
  1553. }
  1554. .form-horizontal .form-group {
  1555. margin-right: 384px;
  1556. margin-left: 3px;
  1557. }
  1558. input[type=file] {
  1559. display: none;
  1560. }
  1561. .form-group {
  1562. margin-bottom: -1px;
  1563. }
  1564. /* 添加一些基础样式 */
  1565. body {
  1566. font-family: Arial, sans-serif;
  1567. }
  1568. /* 使用ID选择器来确保样式仅应用于特定表格 */
  1569. #drugInfoTable {
  1570. /*width: 500px;*/
  1571. border-collapse: collapse;
  1572. }
  1573. /* 使用后代选择器来确保样式仅应用于该表格内的th和td元素 */
  1574. #drugInfoTable th, #drugInfoTable td {
  1575. text-align: left;
  1576. padding: 5px;
  1577. border-bottom: 1px solid #ddd;
  1578. }
  1579. /* 使用后代选择器来确保样式仅应用于该表格内的tr元素 */
  1580. #drugInfoTable tr:nth-child(even) {
  1581. background-color: #f2f2f2;
  1582. }
  1583. /* 修正了宽度设置,因为宽度通常不应该应用于行(tr),而是应用于单元格(td或th) */
  1584. #drugInfoTable tr:nth-child(even) td {
  1585. width: auto; /* 根据内容自动调整宽度 */
  1586. }
  1587. .hidden-column {
  1588. display: none;
  1589. }
  1590. .customize-table {
  1591. width: 100%;
  1592. border-collapse: collapse;
  1593. }
  1594. .customize-table th, .customize-table td {
  1595. border: 1px solid #ddd;
  1596. padding: 8px;
  1597. }
  1598. .customize-table th {
  1599. background-color: #f2f2f2;
  1600. text-align: left;
  1601. }
  1602. .customize-table tr:nth-child(even) {
  1603. background-color: #f9f9f9;
  1604. }
  1605. .customize-table tr:hover {
  1606. background-color: #ddd;
  1607. }
  1608. /* 新增:选中行的样式 */
  1609. .customize-table tr.selected {
  1610. background-color: #a9a9c5;
  1611. color: white; /* 确保文字可见 */
  1612. }
  1613. .verified-symbol {
  1614. color: green;
  1615. font-size: 16px;
  1616. margin-left: 5px;
  1617. }
  1618. .fileinput-preview.thumbnail {
  1619. display: flex;
  1620. justify-content: center; /* 水平居中 */
  1621. align-items: center; /* 垂直居中 */
  1622. text-align: center; /* 确保文本内部也居中 */
  1623. position: relative;
  1624. background-color: #f5f5f5; /* 设置背景颜色以更好地区分 */
  1625. border: 2px dashed #ccc; /* 添加虚线边框 */
  1626. color: #999; /* 文字颜色 */
  1627. font-size: 14px; /* 文字大小 */
  1628. }
  1629. .centered-content {
  1630. display: flex;
  1631. flex-direction: column;
  1632. align-items: center;
  1633. }
  1634. .plus-sign {
  1635. margin-top: 5px;
  1636. font-size: 24px;
  1637. font-weight: bold;
  1638. }
  1639. /* 隐藏初始的大图 */
  1640. .preview-large {
  1641. display: none;
  1642. position: absolute;
  1643. border: 1px solid #ccc;
  1644. background-color: #fff;
  1645. z-index: 1000;
  1646. }
  1647. /* 确保预览框在特定容器内 */
  1648. .customize-form-group-container {
  1649. position: relative;
  1650. }
  1651. .fileinput .fileinput-preview {
  1652. background-image: none !important;
  1653. background-color: transparent !important;
  1654. }
  1655. </style>
  1656. </body>
  1657. </html>