tools.js 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815
  1. import store from '@store';
  2. import {CLEAR_MAIN_SUIT,CLEAR_SEARCH} from '@store/types/mainSuit';
  3. import {CLEAR_CURRENT_ILL,CURRENT_CLEAR} from '@store/types/currentIll';
  4. import {CLEAROTHERHISTORY,OTHERHIS_CLEAR} from '@store/types/otherHistory';
  5. import {CLEARCHECKBODY,SET,CHECKBODY_CLEAR} from '@store/types/checkBody';
  6. import {clearAssistData,addAssistLabel} from '@store/actions/assistCheck';
  7. import {clearAllLabel,addLabel} from '@store/actions/inspect';
  8. import {CLEAR_ALL_DIAG} from '@store/types/diagnosticList';
  9. import {CLEAR_ALL_PUSH_MESSAGE, SET_TIPS,BILLING_ADVICE,PUSHCHANGE,SET_MR_ANALYSE} from '@store/types/pushMessage';
  10. import {ISREAD, SETREADDITEMS,SET_SELECTED_AREA,SET_CURRENT_MODULE} from "../store/types/homePage";
  11. import {CLEAR_FIRST_MAIN_DIAG, CLEAR_ALL_TREAT} from "../store/types/treat";
  12. import {tabChange} from '@store/actions/tabTemplate';
  13. import {CLEAR_ASSESS_RESULT_VALUE} from '@types/assessResult';
  14. import {CLEARMSG,CHANGECOVER} from '@types/patInfo';
  15. import { SET_READ_MODE } from "@store/types/typeConfig";
  16. import config from '@config/index';
  17. import up from '@images/up.png';
  18. import down from '@images/down.png';
  19. import $ from 'jquery';
  20. import {CLEAR_SEARCH_PARAM} from "../store/types/print";
  21. /***
  22. * 工具函数
  23. *
  24. * ***/
  25. const qs = require('qs');
  26. //localStorage方法封装
  27. const storageLocal = {
  28. set: function (name, data) {
  29. if(!data) {
  30. return;
  31. }
  32. if(typeof data !== 'string') {
  33. data = JSON.stringify(data);
  34. }
  35. localStorage.setItem(name, data);
  36. },
  37. get: function (name) {
  38. return localStorage.getItem(name);
  39. },
  40. remove: function (name) {
  41. localStorage.removeItem(name);
  42. },
  43. clear: function () {
  44. localStorage.clear();
  45. }
  46. };
  47. //是否为空
  48. const isNull = (item)=>{
  49. return String(item)=== "" || String(item)==="null" || String(item)==="undefined";
  50. };
  51. const isNotNull = (item)=>{
  52. return !(isNull(item));
  53. };
  54. //判断是否为ie浏览器
  55. const isIE = () => { //ie?
  56. if (!!window.ActiveXObject || "ActiveXObject" in window){
  57. return true;
  58. } else{
  59. return false;
  60. }
  61. }
  62. const deepClone = (data)=>{
  63. return JSON.parse(JSON.stringify(data)||null)||{};
  64. };
  65. const getUrlArgObject = (parm) => {
  66. let query = window.location.search;
  67. let args = qs.parse(query.substr(1));
  68. return args[parm];//返回对象
  69. }
  70. const getAllDataList =(baseList) =>{ //获取所有模块结构化的数据
  71. let jsonData = {};//console.log(111,baseList)
  72. //月经史公式
  73. const other = baseList.otherHistory;
  74. jsonData.lis = {};
  75. jsonData.chief = baseList.mainSuit.data; //主诉
  76. jsonData.present = baseList.currentIll.data; //现病史
  77. jsonData.other = other.data; //其他史
  78. jsonData.otherHistoryIsEmpty = other.isEmpty;
  79. jsonData['yjs_1'] = other['yjs_1'];
  80. jsonData['yjs_2'] = other['yjs_2'];
  81. jsonData['yjs_3'] = other['yjs_3'];
  82. jsonData['yjs_4'] = other['yjs_4'];
  83. jsonData.vital = baseList.checkBody.data; //查体
  84. jsonData.checkBodyIsEmpty = baseList.checkBody.isEmpty;
  85. jsonData.lis.labelList = baseList.inspect.labelList; //化验
  86. jsonData.lis.getExcelDataList = baseList.inspect.getExcelDataList; //化验导入
  87. jsonData.checkedListImport = baseList.assistCheck.checkedListImport; //辅检导入
  88. jsonData.pacs = baseList.assistCheck.assistLabel; //辅检
  89. jsonData.diag = baseList.diagnosticList.diagnosticList; //诊断
  90. jsonData.advice = baseList.pushMessage.advice; //医嘱
  91. jsonData.addItems = baseList.homePage.addItems||{};
  92. jsonData.mainsuitIds = baseList.mainSuit.mainIds; //主诉去重
  93. jsonData.mainChronicDesease = baseList.mainSuit.chronicDesease; //主诉慢病{}
  94. jsonData.diagChronicMagItem = baseList.diagnosticList.chronicMagItem; //诊断慢病{}
  95. jsonData.currentIds = baseList.currentIll.symptomIds; //现病史去重
  96. jsonData.isFirstMainDiag = baseList.treat.isFirstMainDiag; //治疗方案
  97. jsonData.mainReadSonM = baseList.mainSuit.addSmoduleData; //主诉-子模板
  98. jsonData.currReadSonM = baseList.currentIll.useEmpty?baseList.currentIll.currentEmptySon:baseList.currentIll.processModule; //现病史-子模板
  99. // console.log(jsonData,'结构化数据获取')
  100. return jsonData;
  101. }
  102. const getAllDataStringList =(baseList) =>{ //获取所有模块文本的数据
  103. let jsonDataString = {};
  104. jsonDataString.lis = {};
  105. let chiefData = [],presentData=[],otherData=[],vitalData=[];
  106. if(baseList.mainSuit.saveText.length == 1 && baseList.mainSuit.saveText[0].trim() == ''){
  107. chiefData = []
  108. }else{
  109. chiefData = baseList.mainSuit.saveText
  110. }
  111. if(baseList.currentIll.saveText.length == 1 && baseList.currentIll.saveText[0].trim() == ''){
  112. presentData = []
  113. }else{
  114. presentData = baseList.currentIll.saveText
  115. }
  116. const oText = baseList.otherHistory.saveText;
  117. if(oText.length == 1 && oText[0] && oText[0].trim() == ''){
  118. otherData = []
  119. }else{
  120. otherData = baseList.otherHistory.saveText
  121. }
  122. if(baseList.checkBody.saveText.length == 1 && baseList.checkBody.saveText[0].trim() == ''){
  123. vitalData = []
  124. }else{
  125. vitalData = baseList.checkBody.saveText
  126. }
  127. jsonDataString = {
  128. 'chief' : JSON.stringify(chiefData),
  129. 'present' : JSON.stringify(presentData),
  130. 'other' : JSON.stringify(otherData),
  131. 'vital' : JSON.stringify(vitalData),
  132. 'lis' : baseList.inspect.inspectStrPlus,
  133. 'pacs' : baseList.assistCheck.dataString,
  134. 'diag' : baseList.diagnosticList.diagnosticStr,
  135. 'advice' : baseList.pushMessage.AdviceStr
  136. }
  137. // console.log(JSON.stringify(chiefData),chiefData,'文本模式数据获取')
  138. return jsonDataString;
  139. }
  140. /**
  141. *
  142. * @param {回读数据} reData
  143. * @param {回读数据是历史病历'history',还是模板'template',预问诊引用'preIcss'} type
  144. * @param {什么操作,回读'push'还是清空'clear'} action
  145. * @param {引用的话是保存时候的文本类型,编辑的时候是当前页面设置的文本类型} whichSign
  146. */
  147. const pushAllDataList =(whichSign,action,reData,type) =>{ //回读清空所有的数据
  148. store.getState().inspect.context.scrollArea&&store.getState().inspect.context.scrollArea.scrollTop()
  149. if(action == 'clear'){ //清空
  150. const block = Object.assign(JSON.parse(config.textLabel),{full:true});//空白时保留一个自由文本标签
  151. //清除已删除标签记录
  152. localStorage.removeItem('deletedTags');
  153. store.dispatch({type: SET_READ_MODE, readMode: -1,readConfig:-1,isPreIcss:false}); //清除回读模式值
  154. store.dispatch({type: CLEAR_MAIN_SUIT,data:[],saveText:[],editClear:true,mainIds:[],mainTailIds:[],clearAction:true,symptomFeature:[],chronicDesease:null,mainReadSonM:[]});
  155. store.dispatch({type: CLEAR_CURRENT_ILL,data:[],saveText:[],editClear:true,symptomIds:[],currReadSonM:[]});
  156. store.dispatch({type: CLEAROTHERHISTORY,data:[block],isEmpty:true,saveText:[],editClear:true,yjs_1:'',yjs_2:'',yjs_3:'',yjs_4:''});
  157. store.dispatch({type: CLEARCHECKBODY,data:[block],isEmpty:true,saveText:[]});
  158. store.dispatch({type:SETREADDITEMS}); //清空已存的血压加号项
  159. store.dispatch(clearAssistData([],'',[]));
  160. store.dispatch(clearAllLabel([],[],''));
  161. //右侧搜索条件清空
  162. store.dispatch({
  163. type: CLEAR_SEARCH_PARAM,
  164. data: Math.random()
  165. });
  166. //tab跳回辅助信息
  167. store.dispatch(tabChange('0'));
  168. store.dispatch({
  169. type: SET_TIPS,
  170. tips: {}
  171. })
  172. store.dispatch({
  173. type:CLEARMSG
  174. });
  175. store.dispatch({
  176. type: CLEAR_ALL_DIAG,
  177. data:[],
  178. saveText:'',
  179. mainSuitStr: '',
  180. chronicMagItem:null
  181. });
  182. store.dispatch({
  183. type: CLEAR_ALL_PUSH_MESSAGE,
  184. data:{},
  185. saveText:'',
  186. });
  187. store.dispatch({
  188. type:CLEAR_FIRST_MAIN_DIAG,
  189. flag:true
  190. });
  191. store.dispatch({
  192. type: CLEAR_ALL_TREAT,
  193. });
  194. //清空已选的指标推送数据及填的值
  195. store.dispatch({
  196. type: CLEAR_ASSESS_RESULT_VALUE,
  197. });
  198. store.dispatch({//推送重置
  199. type: BILLING_ADVICE,
  200. determine:[],
  201. doubt:[],
  202. possible:[],
  203. vigilant: [],
  204. likely:[],
  205. lab: [],
  206. pacs:[],
  207. setPushEmergency:{},
  208. setPushEmergencyIdx:''
  209. });
  210. store.dispatch({
  211. type: SET_CURRENT_MODULE,
  212. moduleName: ''
  213. })
  214. store.dispatch({
  215. type: SET_MR_ANALYSE,
  216. MRAnalyseResult: []
  217. })
  218. store.dispatch({
  219. type:CHANGECOVER,
  220. flg:true
  221. })
  222. storageLocal.remove('emrParam');
  223. document.getElementById('addScrollEvent').scrollTop = 0
  224. // Notify.success('页面已清空')
  225. }else if(type == 'preIcss'){
  226. store.dispatch({type: SET_READ_MODE, readMode: whichSign,isPreIcss:true});
  227. store.dispatch({ //主诉文本框
  228. type: CLEAR_MAIN_SUIT,
  229. data:[],
  230. saveText:reData.chief
  231. });
  232. store.dispatch({
  233. type: CLEAR_CURRENT_ILL,
  234. data:[],
  235. saveText:reData.current
  236. });
  237. store.dispatch({
  238. type: CLEAROTHERHISTORY,
  239. data:[],
  240. isEmpty:false,
  241. saveText:reData.other
  242. });
  243. store.dispatch({
  244. type: SET,
  245. isEmpty:reData.checkBody?false:true,
  246. data:reData.checkBody,
  247. isText:true, //查体只显示文本
  248. });
  249. store.dispatch({type:SETREADDITEMS}); //清空已存的血压加号项
  250. store.dispatch(clearAssistData([],'',[]));
  251. store.dispatch(clearAllLabel([],[],''));
  252. store.dispatch({
  253. type: SET_TIPS,
  254. tips: {}
  255. })
  256. store.dispatch({
  257. type: CLEAR_ALL_DIAG,
  258. data:[],
  259. saveText:'',
  260. mainSuitStr: '',
  261. chronicMagItem:null
  262. });
  263. store.dispatch({
  264. type: CLEAR_ALL_PUSH_MESSAGE,
  265. data:{},
  266. saveText:'',
  267. });
  268. store.dispatch({
  269. type:CLEAR_FIRST_MAIN_DIAG,
  270. flag:true
  271. });
  272. store.dispatch({
  273. type: CLEAR_ALL_TREAT,
  274. });
  275. //清空已选的指标推送数据及填的值
  276. store.dispatch({
  277. type: CLEAR_ASSESS_RESULT_VALUE,
  278. });
  279. store.dispatch({//推送重置
  280. type: BILLING_ADVICE,
  281. determine:[],
  282. doubt:[],
  283. possible:[],
  284. vigilant: [],
  285. likely:[],
  286. lab: [],
  287. pacs:[],
  288. setPushEmergency:{},
  289. setPushEmergencyIdx:''
  290. });
  291. storageLocal.remove('emrParam');
  292. }else{
  293. let dataJson = JSON.parse(reData.dataJson);
  294. const docConfig = dataJson.docConfigs;
  295. //回读/引用设置回读模式值(主诉-其他史使用)
  296. store.dispatch({type: SET_READ_MODE, readMode: whichSign,readConfig:docConfig});
  297. if (whichSign == 0) {
  298. //其他史data
  299. const oData = dataJson.other;
  300. const onlyOneText = oData.length==1&&oData[0].tagType==8&&!(oData[0].name||oData[0].value);
  301. if(type == 'template'){ //结构化模板回读
  302. let dataJsonStr = JSON.parse(reData.preview);
  303. // console.log(dataJson,dataJsonStr,'结构化模板引用')
  304. //清空已选的指标推送数据及填的值
  305. store.dispatch({
  306. type: CLEAR_ASSESS_RESULT_VALUE,
  307. });
  308. store.dispatch({
  309. type: CLEAR_MAIN_SUIT,
  310. data:dataJson.chief,
  311. saveText:JSON.parse(dataJsonStr.chief),
  312. mainIds:dataJson.mainsuitIds?dataJson.mainsuitIds:[],
  313. chronicDesease:dataJson.mainChronicDesease,
  314. mainReadSonM:dataJson.mainReadSonM,
  315. });
  316. store.dispatch({
  317. type: CLEAR_CURRENT_ILL,
  318. data:dataJson.present,
  319. saveText:JSON.parse(dataJsonStr.present),
  320. symptomIds:dataJson.currentIds?dataJson.currentIds:[],
  321. currReadSonM:dataJson.currReadSonM
  322. });
  323. store.dispatch({
  324. type: CLEAROTHERHISTORY,
  325. data:dataJson.other,
  326. yjs_1:dataJson.yjs_1,
  327. yjs_2:dataJson.yjs_2,
  328. yjs_3:dataJson.yjs_3,
  329. yjs_4:dataJson.yjs_4,
  330. isEmpty:onlyOneText?true:false,//dataJson.otherHistoryIsEmpty,
  331. saveText:JSON.parse(dataJsonStr.other),
  332. editClear:dataJson.other.length>0?false:true
  333. });
  334. store.dispatch({
  335. type: CLEARCHECKBODY,
  336. data:dataJson.vital,
  337. isEmpty:dataJson.checkBodyIsEmpty,
  338. saveText:JSON.parse(dataJsonStr.vital)
  339. });
  340. store.dispatch(clearAllLabel(
  341. dataJson.lis.labelList,
  342. dataJson.lis.getExcelDataList,
  343. dataJsonStr.lis.split('-')[0],
  344. dataJsonStr.lis.split('-')[1]
  345. ));
  346. store.dispatch(clearAssistData(dataJson.pacs,dataJsonStr.pacs,dataJson.checkedListImport||[]));
  347. store.dispatch({
  348. type: CLEAR_ALL_DIAG,
  349. data:dataJson.diag,
  350. saveText:dataJsonStr.diag,
  351. chronicMagItem:dataJson.diagChronicMagItem
  352. });
  353. store.dispatch({
  354. type: CLEAR_ALL_PUSH_MESSAGE,
  355. data:dataJson.advice,
  356. saveText:dataJsonStr.advice
  357. });
  358. store.dispatch({
  359. type:SETREADDITEMS,
  360. data:dataJson.addItems
  361. });
  362. store.dispatch({
  363. type:CLEAR_FIRST_MAIN_DIAG,
  364. flag:dataJson.isFirstMainDiag
  365. });
  366. //tab跳回辅助信息
  367. store.dispatch(tabChange('0'));
  368. }else{ //结构化历史病历回读
  369. let dataJsonStr = reData.detailList;
  370. //清空已选的指标推送数据及填的值
  371. store.dispatch({
  372. type: CLEAR_ASSESS_RESULT_VALUE,
  373. });
  374. store.dispatch({
  375. type: CLEAR_MAIN_SUIT,
  376. data:dataJson.chief,
  377. saveText:dataJsonStr[0].content ? JSON.parse(dataJsonStr[0].content) :[],
  378. mainIds:dataJson.mainsuitIds?dataJson.mainsuitIds:[],
  379. chronicDesease:dataJson.mainChronicDesease,
  380. mainReadSonM:dataJson.mainReadSonM,
  381. });
  382. store.dispatch({
  383. type: CLEAR_CURRENT_ILL,
  384. data:dataJson.present,
  385. saveText:dataJsonStr[1].content ? JSON.parse(dataJsonStr[1].content):[],
  386. symptomIds:dataJson.currentIds?dataJson.currentIds:[],
  387. currReadSonM:dataJson.currReadSonM
  388. });
  389. store.dispatch({
  390. type: CLEAROTHERHISTORY,
  391. data:dataJson.other,
  392. yjs_1:dataJson.yjs_1,
  393. yjs_2:dataJson.yjs_2,
  394. yjs_3:dataJson.yjs_3,
  395. yjs_4:dataJson.yjs_4,
  396. saveText:dataJsonStr[2].content ? JSON.parse(dataJsonStr[2].content):[],
  397. isEmpty:onlyOneText?true:false,//dataJson.otherHistoryIsEmpty,回读回来后判断是否只有一个空标签,是的话要使用模板
  398. editClear:dataJson.other.length>0?false:true
  399. });
  400. store.dispatch({
  401. type: CLEARCHECKBODY,
  402. data:dataJson.vital,
  403. isEmpty:dataJson.checkBodyIsEmpty,
  404. saveText:dataJsonStr[3].content ? JSON.parse(dataJsonStr[3].content):[]
  405. });
  406. store.dispatch(clearAllLabel(
  407. dataJson.lis.labelList,
  408. dataJson.lis.getExcelDataList,
  409. dataJsonStr[4].content ? dataJsonStr[4].content.split('-')[0] :'',
  410. dataJsonStr[4].content ? dataJsonStr[4].content.split('-')[1] :''
  411. ));
  412. store.dispatch(clearAssistData(
  413. dataJson.pacs,
  414. dataJsonStr[5].content ? dataJsonStr[5].content:'',
  415. dataJson.checkedListImport||[]
  416. ));
  417. store.dispatch({
  418. type: CLEAR_ALL_DIAG,
  419. data:dataJson.diag,
  420. saveText:dataJsonStr[6].content ? dataJsonStr[6].content:'',
  421. chronicMagItem:dataJson.diagChronicMagItem
  422. });
  423. store.dispatch({
  424. type: CLEAR_ALL_PUSH_MESSAGE,
  425. data:dataJson.advice,
  426. saveText:dataJsonStr[7].content ? dataJsonStr[7].content:''
  427. });
  428. store.dispatch({
  429. type:SETREADDITEMS,
  430. data:dataJson.addItems
  431. });
  432. store.dispatch({
  433. type:CLEAR_FIRST_MAIN_DIAG,
  434. flag:dataJson.isFirstMainDiag
  435. });
  436. }
  437. } else {
  438. if(type == 'template'){ //纯文本模板回读
  439. //let dataJson = JSON.parse(reData.dataJson);
  440. let dataJsonStr = JSON.parse(reData.preview);
  441. // console.log(dataJson,dataJsonStr,'纯文本模板引用')
  442. store.dispatch({ //主诉文本框
  443. type: CLEAR_MAIN_SUIT,
  444. data:[],
  445. saveText:JSON.parse(dataJsonStr.chief)
  446. });
  447. store.dispatch({
  448. type: CLEAR_CURRENT_ILL,
  449. data:[],
  450. saveText:JSON.parse(dataJsonStr.present)
  451. });
  452. store.dispatch({
  453. type: CLEAROTHERHISTORY,
  454. data:[],
  455. isEmpty:dataJson.otherHistoryIsEmpty,
  456. saveText:JSON.parse(dataJsonStr.other)
  457. });
  458. store.dispatch({
  459. type: CLEARCHECKBODY,
  460. data:dataJson.vital,
  461. isEmpty:dataJson.checkBodyIsEmpty,
  462. flg:true,
  463. saveText:JSON.parse(dataJsonStr.vital)
  464. });
  465. store.dispatch(clearAllLabel(
  466. dataJson.lis.labelList,
  467. dataJson.lis.getExcelDataList,
  468. dataJsonStr.lis.split('-')[0],
  469. dataJsonStr.lis.split('-')[1]
  470. ));
  471. store.dispatch(clearAssistData(dataJson.pacs,dataJsonStr.pacs,dataJson.checkedListImport||[]));
  472. store.dispatch({
  473. type: CLEAR_ALL_DIAG,
  474. data:dataJson.diag,
  475. saveText:dataJsonStr.diag
  476. });
  477. store.dispatch({
  478. type: CLEAR_ALL_PUSH_MESSAGE,
  479. data:dataJson.advice,
  480. saveText:dataJsonStr.advice,
  481. });
  482. store.dispatch({
  483. type:SETREADDITEMS,
  484. data:dataJson.addItems
  485. });
  486. store.dispatch({
  487. type:CLEAR_FIRST_MAIN_DIAG,
  488. flag:dataJson.isFirstMainDiag
  489. });
  490. //tab跳回辅助信息
  491. store.dispatch(tabChange('0'));
  492. }else{ //纯文本历史病历回读
  493. //let dataJson = JSON.parse(reData.dataJson);
  494. let dataJsonStr = reData.detailList;
  495. // console.log(dataJson,dataJsonStr,'纯文本历史病历回读')
  496. if(!dataJson && !dataJsonStr && !reData.sign){
  497. return;
  498. }
  499. store.dispatch({
  500. type: CLEAR_MAIN_SUIT,
  501. data:[],
  502. saveText:dataJsonStr[0].content ? JSON.parse(dataJsonStr[0].content) :[]
  503. });
  504. store.dispatch({
  505. type: CLEAR_CURRENT_ILL,
  506. data:[],
  507. saveText:dataJsonStr[1].content ? JSON.parse(dataJsonStr[1].content) :[]
  508. });
  509. store.dispatch({
  510. type: CLEAROTHERHISTORY,
  511. data:[],
  512. isEmpty:dataJson.otherHistoryIsEmpty,
  513. saveText:dataJsonStr[2].content ? JSON.parse(dataJsonStr[2].content) :[]
  514. });
  515. store.dispatch({
  516. type: CLEARCHECKBODY,
  517. data:dataJson.vital,
  518. flg:true,
  519. isEmpty:dataJson.checkBodyIsEmpty,
  520. saveText:dataJsonStr[3].content ? JSON.parse(dataJsonStr[3].content):[]
  521. });
  522. store.dispatch(clearAllLabel(
  523. dataJson.lis.labelList,
  524. dataJson.lis.getExcelDataList,
  525. dataJsonStr[4].content ? dataJsonStr[4].content.split('-')[0] :'',
  526. dataJsonStr[4].content ? dataJsonStr[4].content.split('-')[1]:''
  527. ));
  528. store.dispatch(clearAssistData(
  529. dataJson.pacs,
  530. dataJsonStr[5].content ? dataJsonStr[5].content:'',
  531. dataJson.checkedListImport||[]
  532. ));
  533. store.dispatch({
  534. type: CLEAR_ALL_DIAG,
  535. data:dataJson.diag,
  536. saveText:dataJsonStr[6].content ? dataJsonStr[6].content:''
  537. });
  538. store.dispatch({
  539. type: CLEAR_ALL_PUSH_MESSAGE,
  540. data:dataJson.advice,
  541. saveText:dataJsonStr[7].content ? dataJsonStr[7].content:''
  542. });
  543. store.dispatch({
  544. type:SETREADDITEMS,
  545. data:dataJson.addItems
  546. });
  547. store.dispatch({
  548. type:CLEAR_FIRST_MAIN_DIAG,
  549. flag:dataJson.isFirstMainDiag
  550. });
  551. }
  552. }
  553. }
  554. store.dispatch({
  555. type:ISREAD
  556. });
  557. }
  558. function filterArr(arr){
  559. let tmpArr = arr.filter((item)=>{
  560. if(item){
  561. return item
  562. }
  563. });
  564. return tmpArr.join("").replace(/\s/g,'');
  565. }
  566. function filterDataArr(arrTmp){ //数据处理
  567. if(!Array.isArray(arrTmp)){
  568. return
  569. }
  570. let tmpArr = [];
  571. tmpArr = arrTmp.map((it,i)=>{ //连续的标点符号保留第一个
  572. if(!it)return '';
  573. if(!it.match(config.punctuationReg)&&!arrTmp[i-1]){ //只有标点符号或者前一个标签无值是(说明本标点灰显,不显示在预览中)
  574. return '';
  575. }
  576. return it.replace(config.punReg,function(word){
  577. return word.substr(0,1);
  578. });
  579. });
  580. return trimDots(tmpArr.join('')); //去掉开头的标点符号,最后的标点保留第一个,中间连续的保留第一个
  581. }
  582. //其他史预览数据处理-月经史
  583. function filterOtherDataArr(arrTmp,jsonArr){
  584. let tmpArr = [];
  585. let index1 = jsonArr.findIndex((item)=>{
  586. return item.formulaCode=='yjs_1';
  587. });
  588. let index2 = jsonArr.findIndex((item)=>{
  589. return item.formulaCode=='yjs_2';
  590. });
  591. let index3 = jsonArr.findIndex((item)=>{
  592. return item.formulaCode=='yjs_3';
  593. });
  594. let index4 = jsonArr.findIndex((item)=>{
  595. return item.formulaCode=='yjs_4';
  596. });
  597. if(index1==-1&&index2==-1&&index3==-1&&index4==-1){//无月经史
  598. return {str1:filterDataArr(arrTmp),str2:''};
  599. }
  600. tmpArr = arrTmp.map((it,i)=>{ //连续的标点符号保留第一个
  601. if(!it.match(config.punctuationReg)&&!arrTmp[i-1]||[index1,index2,index3,index4].includes(i)){ //只有标点符号或者前一个标签无值是(说明本标点灰显,不显示在预览中)
  602. return '';
  603. }
  604. return it.replace(config.punReg,function(word){
  605. return word.substr(0,1);
  606. });
  607. });
  608. const splitNum = [index1,index2,index3,index4].find((i)=>i!=-1);
  609. const str1 = [...tmpArr].splice(0,splitNum).join("");
  610. const str2 = [...tmpArr].splice(splitNum).join("");
  611. return {str1:trimDots(str1),str2:trimDots(str2),index:index1};
  612. }
  613. //去掉开头的标点符号,最后的标点保留第一个,中间连续的保留第一个
  614. function trimDots(str){
  615. if(!str)return'' ;
  616. return str.replace(config.punReg,function(word){
  617. return word.substr(0,1);
  618. }).replace(/^[,,.。::"“??”;;、!!\s]+/,'').replace(/[,,.。::"“??”;;、!!\s]*$/,'。');
  619. }
  620. //标签间连续标点只保留一个,保留前面一个
  621. function formatContinueDots(data){
  622. let arr=[];
  623. arr=data&&data.filter((it,i)=>{
  624. if(i==0||(it.name&&(it.name.match(config.punctuationReg))||(data[i-1].name&&data[i-1].name.match(config.punctuationReg)))){
  625. return it;
  626. }
  627. if(!it.name){ //主诉现病史病情变化
  628. return it;
  629. }
  630. });
  631. return arr;
  632. }
  633. // 取消默认行为
  634. function preventDefault(event) {
  635. if (event.preventDefault) {
  636. event.preventDefault();
  637. } else {
  638. event.returnValue = false;
  639. }
  640. }
  641. //ie8添加解除事件兼容
  642. function windowEventHandler(type,func,dom){
  643. let win = dom?dom:window;
  644. if(win.addEventListener){
  645. win.addEventListener(type, func);
  646. }else{
  647. win.attachEvent('on'+type,func);
  648. }
  649. }
  650. function windowRemoveEventHandler(type,func,dom){
  651. let win = dom?dom:window;
  652. if(win.addEventListener){
  653. win.removeEventListener(type, func);
  654. }else{
  655. win.detachEvent('on'+type,func);
  656. }
  657. }
  658. //禁止回车事件
  659. function handleEnter(event){
  660. event = event?event:window.event;
  661. if(event.keyCode==13){return false;}
  662. }
  663. //获取病例输入的内容
  664. // function getEMRParams(){
  665. // const state = store.getState();
  666. // const {message} = state.patInfo;
  667. // const {mainSuit,currentIll,otherHistory,checkBody,inspect,assistCheck,diagnosticList} = state;
  668. // //console.log('message', message)
  669. // const main = filterDataArr(mainSuit.saveText)||'',
  670. // current=filterDataArr(currentIll.saveText)||'',
  671. // other = filterDataArr(otherHistory.saveText)||'',
  672. // vital = filterDataArr(checkBody.saveText)||'',
  673. // lis = inspect.pushItem, //化验推送所需数据
  674. // pacs = assistCheck.dataString||'',
  675. // dis=diagnosticList.diagnosticStrNoType||'',
  676. // advice = '',
  677. // diseaeId = [];
  678. // const age = message.patientAge;
  679. // const sex = message.sex;
  680. // const patientId = message.patientId //病人id,取上次用药
  681. // const hosCode = message.hospitalCode
  682. // return {main,current,other,vital,lis,pacs,dis,advice,diseaeId,sex,age, patientId, hosCode};
  683. // };
  684. function getEMRParams(){
  685. const state = store.getState();
  686. const {message} = state.patInfo;
  687. const {mainSuit,currentIll,otherHistory,checkBody,inspect,assistCheck,diagnosticList} = state;
  688. const diag = []
  689. for(let i = 0; i < diagnosticList.diagnosticList.length; i++) {
  690. diag.push({"dateValue": "","name": "","uniqueName": diagnosticList.diagnosticList[i].name})
  691. }
  692. const obj = {
  693. "hosCode": message.hospitalCode,
  694. "age": message.patientAge||18,
  695. "sex": message.sex||1,
  696. "chief": filterDataArr(mainSuit.saveText)||'',
  697. "symptom": filterDataArr(currentIll.saveText)||'',
  698. "vital": filterDataArr(checkBody.saveText)||'',
  699. "pasts": filterDataArr(otherHistory.saveText)||'',
  700. "infectious": "",
  701. "operation": "",
  702. "allergy": "",
  703. "vaccination": "",
  704. "personal": "",
  705. "marital": "",
  706. "family": "",
  707. "menstrual": "",
  708. "other": filterDataArr(otherHistory.saveText)||'',
  709. "lisString": "",
  710. "pacsString": "",
  711. "diagString": "",
  712. "drugString": "",
  713. "lis": inspect.pushItem,
  714. "pacs": assistCheck.dataArr||[],
  715. "diag": [],
  716. "lisOrder": [],
  717. "pacsOrder": [],
  718. "diagOrder": diag,
  719. "drugOrder": [],
  720. "operationOrder": [],
  721. "otherOrder": [],
  722. "patientId": message.patientId,
  723. "drug": [],
  724. "marriage": ""
  725. }
  726. return obj;
  727. };
  728. function getMRInfo() {
  729. const state = store.getState();
  730. const {message} = state.patInfo;
  731. const {mainSuit,currentIll,otherHistory,checkBody,inspect,assistCheck,diagnosticList} = state;
  732. let diagStr = ""
  733. for(let i = 0; i < diagnosticList.diagnosticList.length; i++) {
  734. if(i == 0) {
  735. diagStr +=diagnosticList.diagnosticList[i].name
  736. } else {
  737. diagStr += ',' + diagnosticList.diagnosticList[i].name
  738. }
  739. }
  740. let str = `姓名: ${message.patientName}
  741. 性别:${message.patientSex}
  742. 年龄:${message.patientAge}
  743. 主诉:${filterDataArr(mainSuit.saveText)}
  744. 现病史:${filterDataArr(currentIll.saveText)}
  745. 其他史:${filterDataArr(otherHistory.saveText)}
  746. 查体:${filterDataArr(checkBody.saveText)}
  747. 化验:${inspect.inspectStrPlus}
  748. 辅检:${assistCheck.dataString}
  749. 诊断:${diagStr}
  750. 医师签名:${message.doctorName}`
  751. //let str = "姓  名:姜** /r/n性   别:女/r/n年 龄:34岁/r/n民 族:汉族/r/n职 业:经商/r/n出 生 地:浙江省长兴县/r/n婚 姻:已婚/r/n联系地址:*** /r/n病史陈述者:患者本人/r/n入院日期:2019-12-04 10:12/r/n /r/n记录日期:2019-12-04 14:37/r/n /r/n主 诉: 腹痛1周 /r/n现 病 史: 患者1周前饮食辛辣食物后出现腹痛,主要为脐以上为主,呈持续性钝痛,无明显恶心呕吐,无肩背部疼痛,无咳嗽咳痰,无腹泻腹痛,无胸闷气促,无头晕头痛,无视物旋转,无异常阴道流血流液等情况,自诉近一周感下腹坠胀感,为求进一步诊治拟\"腹痛待查\"收住入院。/r/n患病来,神志清,精神软,胃纳差,睡眠一步,大小便如常,近期体重无明显改变。 /r/n既 往 史: 否认\"高血压,糖尿病,冠心病\"病史,否认\"肝炎,结核\"等传染病史,否认重大外伤史,否认手术史,否认输血史,既往存在头孢过敏,具体不详,否认长期药物使用史,否认药物成瘾,预防接种史不详。 /r/n个 人 史: 出生并生长于浙江省长兴县,经商,初中文化,否认疫区居住史,否认放射物、毒物、粉尘接触史,否认吸烟,否认饮酒,否认特殊嗜好,否认不洁性交史。 /r/n月 经 史: ,经量中等,颜色正常,无痛经,经期规律;白带量一般,性状无殊。 /r/n婚 育 史: 27岁结婚,否认近亲结婚,配偶健康状况良好,夫妻关系和睦,育有1女,均健康。/r/n家 族 史: 父亲体健,母已故(死因不详),有2哥,均体健,家族中无传染病及遗传病史,否认两系三代内遗传性、家族性疾病史,否认家族中有\"肝炎、结核\"等传染病史,否认两系三代内\"胃癌、肺癌\"等肿瘤病史,否认类似疾病史。 /r/n体格检查(一)/r/n /r/n一般状况:/r/n体温36.3℃,脉搏68次/分,呼吸19次/分,血压133/81mmHg。/r/n意识清晰,自主体位,面容无殊,体重56Kg,身高163cm,查体合作。 /r/n皮 肤:/r/n皮肤色泽正常,弹性好,未见明显水肿,未见皮疹,未见皮下出血,未见肝掌及蜘蛛痣。/r/n淋 巴 结:/r/n未触及明显浅表淋巴结肿大 /r/n头 部:/r/n外形大小正常,无畸形。听力粗测正常。眼睑正常,结膜正常,巩膜无黄染,瞳孔等大等圆,直径3mm,对光反射灵敏。鼻部外形正常,通气顺畅,副鼻窦区无压痛,乳突无压痛。口腔粘膜正常,扁桃体无肿大。/r/n颈  部:/r/n颈软,无抵抗感,气管位置居中,颈静脉无怒张。/r/n胸  部:/r/n外形正常,肋间隙正常,双侧乳房正常对称。/r/n肺 部:/r/n呼吸运动正常对称,双肺叩诊呈清音,呼吸音清晰,未闻及干、湿啰音。/r/n心 脏:/r/n心率68次/分,心律齐,心音有力,P2<A2,各瓣膜听诊区未闻及杂音。 /r/n血 管:/r/n周围血管征阴性。 /r/n腹  部:/r/n外形正常,未见肠形及蠕动波,腹壁松软,脐以上及下腹存在轻压痛,无反跳痛,/r/n包块未触及,肝脏肋下未触及,胆囊肋下未触及,脾脏肋下未触及,双肾区无叩痛,肠鸣音正常,3~5次/分,移动性浊音阴性。/r/n外生殖器:/r/n未见明显畸形 /r/n直肠肛门:/r/n未见明显畸形 /r/n四肢脊柱:/r/n脊柱无畸形,无压痛叩击痛,无放射痛,活动自如,四肢正常。/r/n神经系统:/r/n四肢肌张力正常,肌力V级,膝腱反射双侧正常,Babinski征双侧阴性。/r/n其 他:/r/n详见专科检查。/r/n/r/n体格检查(二)/r/n补 充 及 专 科 情 况/r/n体温36.3℃,脉搏68次/分,呼吸19次/分,血压133/81mmHg神志清,呼吸平稳,浅表淋巴结未及肿大,两肺呼吸音清,双下肺未闻及湿罗音,心率68次/分,律齐,未闻及病理性杂音,腹平软,脐以上及下腹存在轻压痛,无反跳痛,肝脾肋下未触及,双下肢无浮肿。/r/n /r/n /r/n心脏相对浊音界/r/n /r/n右界cm/r/n肋间/r/n左界cm/r/n/r/n 2/r/nⅡ/r/n 2/r/n/r/n 2/r/nⅢ/r/n 4/r/n/r/n 3/r/nⅣ/r/n 6/r/n/r/n /r/nⅤ/r/n 8/r/n/r/n左锁骨中线距胸骨中线 8 cm/r/n辅助检查: 2019-12-4 心电图未见明显异常。 /r/n /r/n初步诊断:1、腹痛待查 2.盆腔炎/r/n修正诊断: /r/n 医师签名:李勇 /r/n /r/n2019-12-04 /r/n /r/n补充诊断:"
  752. let label = ["姓名","性别","年龄",
  753. "主诉","现病史","其他史","查体","化验","辅检",
  754. "诊断","医师签名"]
  755. const param = {
  756. "cid":0,
  757. "medrec":
  758. [
  759. {
  760. "content": {
  761. "content":str
  762. },
  763. "label": label,
  764. "title": "入院记录"
  765. }
  766. ],
  767. "token": ""
  768. }
  769. return param
  770. }
  771. function didPushParamChange(){
  772. const emrData = getEMRParams();
  773. const oldParams = storageLocal.get('emrParam');
  774. const newParams = JSON.stringify(emrData);
  775. if(newParams === oldParams){
  776. return false;
  777. }
  778. return true;
  779. }
  780. //判断模板保存时文本数据是否为空
  781. function isAllClear(jsonStr){
  782. if ( //结构化和文本数据都为空
  783. filterDataArr(JSON.parse(jsonStr.chief)) == '' &&
  784. filterDataArr(JSON.parse(jsonStr.present)) == '' &&
  785. filterDataArr(JSON.parse(jsonStr.other)) == '' && //这里都是filterDataArr不是filterArr,要去符号的
  786. filterDataArr(JSON.parse(jsonStr.vital)) == '' &&
  787. jsonStr.diag == '' &&
  788. jsonStr.lis == '' &&
  789. jsonStr.pacs == '' &&
  790. jsonStr.advice == ''
  791. ) {
  792. return false;
  793. }else{
  794. return true;
  795. }
  796. }
  797. //判断页面所有数据是否为空,包括空标签
  798. function isAllPartClear(jsonData,jsonStr,baseList){
  799. const {patInfo:{message:{sex,patientAge,patientName,patientSex}}}=baseList
  800. if ( //结构化和文本数据都为空
  801. JSON.stringify(jsonData.advice) == '{}' &&
  802. jsonData.chief.length < 1 &&
  803. jsonData.present.length < 1 &&
  804. // jsonData.other.length < 1 &&
  805. (jsonData.other.length > 0 ? baseList.otherHistory.isEmpty : true) &&
  806. //jsonData.vital.length < 1 &&
  807. (jsonData.vital.length > 0 ? baseList.checkBody.isEmpty : true) &&
  808. jsonData.diag.length < 1 &&
  809. jsonData.checkedListImport.length < 1 &&
  810. jsonData.pacs.length < 1 &&
  811. jsonData.lis.labelList.length < 1 &&
  812. jsonData.lis.getExcelDataList.length < 1 &&
  813. filterDataArr(JSON.parse(jsonStr.chief)) == '' &&
  814. filterDataArr(JSON.parse(jsonStr.present)) == '' &&
  815. filterDataArr(JSON.parse(jsonStr.other)) == '' && //这里都是filterDataArr不是filterArr,要去符号的
  816. filterDataArr(JSON.parse(jsonStr.vital)) == '' &&
  817. !sex&&!patientSex&&!patientName&&!patientAge
  818. ) {
  819. return false;
  820. }else{
  821. return true;
  822. }
  823. }
  824. //判断除主诉外页面数据是否为空--慢病模板
  825. function ifOtherClear(jsonData,jsonStr,baseList){
  826. if ( //结构化和文本数据都为空
  827. JSON.stringify(jsonData.advice) == '{}' &&
  828. jsonData.present.length < 1 &&
  829. (jsonData.other.length > 0 ? baseList.otherHistory.isEmpty : true) &&
  830. (jsonData.vital.length > 0 ? baseList.checkBody.isEmpty : true) &&
  831. jsonData.diag.length < 1 &&
  832. jsonData.pacs.length < 1 &&
  833. jsonData.lis.labelList.length < 1 &&
  834. jsonData.lis.getExcelDataList.length < 1 &&
  835. filterDataArr(JSON.parse(jsonStr.present)) == '' &&
  836. filterDataArr(JSON.parse(jsonStr.other)) == '' && //这里都是filterDataArr不是filterArr,要去符号的
  837. filterDataArr(JSON.parse(jsonStr.vital)) == ''
  838. ) {
  839. return false;
  840. }else{
  841. return true;
  842. }
  843. }
  844. function normalVal(min,max){//添加正常值0处理
  845. if(!min&&!max){
  846. return null;
  847. }else if(min&&max){
  848. return `正常值:(${min}~${max})`
  849. }else if(!min && max){
  850. if(min == 0){
  851. return `正常值:(${min}~${max})`
  852. }
  853. return `正常值:(<${max})`
  854. }else if(min && !max){
  855. if(max == 0){
  856. return `正常值:(${min}~${max})`
  857. }
  858. return `正常值:(>${min})`
  859. }
  860. }
  861. /**
  862. *
  863. * @param {弹窗显示位置是否往下设置} stic
  864. */
  865. function getPageCoordinate(event,stic){//获取鼠标点击的位置
  866. let e = event || window.event;
  867. var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
  868. var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
  869. var x = e.pageX || (e.clientX + scrollX);
  870. var y = (e.pageY+(stic?25:0)) || (e.clientY + scrollY + (stic?25:0));//弹窗位置偏下25
  871. let obj = {
  872. boxLeft : x ,
  873. boxTop : y+18
  874. }
  875. return obj;
  876. }
  877. function timestampToTime(timestamp) { //excel导入2019年5月1日会转换成时间戳
  878. var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  879. var Y = date.getFullYear() + '-';
  880. var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
  881. var D = date.getDate() + ' ';
  882. var h = date.getHours() + ':';
  883. var m = date.getMinutes() + ':';
  884. var s = date.getSeconds();
  885. return Y+M+D+h+m+s;
  886. }
  887. /**
  888. *
  889. * @param {需要年月日传个true,不需要不传或者false} flg
  890. */
  891. function getCurrentDate(flg,con){
  892. let link = con?con:'-'
  893. let myDate = new Date();
  894. let year = myDate.getFullYear(); //获取完整的年份(4位,1970-????)
  895. let mon = myDate.getMonth()-0+1; //获取当前月份(0-11,0代表1月)
  896. let day = myDate.getDate(); //获取当前日(1-31)
  897. let date = '';
  898. if(flg){
  899. var h = myDate.getHours();
  900. var m = myDate.getMinutes();
  901. var s = myDate.getSeconds();
  902. date = year+link+(mon<10?"0"+mon:mon)+link+(day<10?"0"+day:day)+' '+(h<10&&h!=0?"0"+h:h)+':'+(m<10&&m!=0?"0"+m:m)+':'+(s<10&&s!=0?"0"+s:s);
  903. }else{
  904. date = year+link+(mon<10?"0"+mon:mon)+link+(day<10?"0"+day:day);
  905. }
  906. return date;
  907. }
  908. function inspectAndAssist(){
  909. const state = store.getState();
  910. let mainType = state.typeConfig.mode
  911. if(mainType == 1){return}//文本模式不放化验辅检的模板
  912. let tmpAll = state.homePage.allModules;
  913. let tmpInspected = state.inspect.labelList;
  914. let tmpAssisted = state.assistCheck.assistLabel;
  915. let tmpInspect = [],tmpAssist = [],assayArr = [],tmpDetail=[],checkArr = [];
  916. for(let i = 0;i < tmpAll.length;i++){
  917. let tmpItem = tmpAll[i];
  918. if(tmpItem.type == 5){
  919. tmpInspect = tmpItem.moduleDetailDTOList || []
  920. }else if(tmpItem.type == 6){
  921. tmpAssist = tmpItem.moduleDetailDTOList || []
  922. }
  923. }
  924. for(let i = 0;i < tmpInspect.length;i++){//化验数据处理
  925. let tmpObj = { //添加化验
  926. details: [],
  927. name: '',
  928. questionId: '',
  929. showType: 1,
  930. uniqueName:''
  931. }
  932. if (tmpInspect[i].controlType == 0) {
  933. tmpDetail = tmpInspect[i].questionMapping
  934. }else if(tmpInspect[i].controlType == 1 || tmpInspect[i].controlType == 6){
  935. tmpDetail = new Array(tmpInspect[i])
  936. }
  937. tmpObj.questionId = tmpInspect[i].id
  938. tmpObj.name = tmpInspect[i].name
  939. tmpObj.details = tmpDetail
  940. tmpObj.uniqueName = tmpInspect[i].uniqueName || ''
  941. assayArr.push(tmpObj)
  942. }
  943. for(let i = 0;i < tmpAssist.length;i++){//辅检数据处理
  944. let tmpObj = { //添加辅检
  945. name: '',
  946. questionId: '',
  947. showType: 1,
  948. time:getCurrentDate(1),
  949. value:''
  950. }
  951. tmpObj.questionId = tmpAssist[i].id
  952. tmpObj.name = tmpAssist[i].name
  953. checkArr.push(tmpObj)
  954. }
  955. if(assayArr.length>0 && tmpInspected.length == 0){//化验
  956. store.dispatch(addLabel(assayArr))
  957. }
  958. if(checkArr.length > 0 && tmpAssisted.length == 0){//辅检
  959. store.dispatch(addAssistLabel(checkArr))
  960. }
  961. }
  962. function readyKeepHistory(){
  963. let baseList = store.getState();
  964. let jsonStr = getAllDataStringList(baseList);
  965. if(filterDataArr(JSON.parse(jsonStr.chief)) == ''){
  966. return 1;//主诉不能为空
  967. }else if(!jsonStr.diag || jsonStr.diag.trim().length < 1){
  968. return 2;//诊断不能为空
  969. }else{
  970. return 3;
  971. }
  972. }
  973. //评估图表数据转换
  974. function parseChartData(indexData){
  975. let arr=[],obj={},temp={};
  976. let nameArr=[],nameObj={};
  977. if(!indexData){
  978. return [];
  979. }
  980. indexData.indexData.map((it)=>{
  981. temp=indexData.indexConfigData.find((i)=>{return it.uniqueId==i.uniqueId});
  982. arr=obj[temp.groupType]||[];
  983. nameArr=nameObj[temp.groupType]||[];
  984. obj[temp.groupType]=[...arr,it];
  985. nameObj[temp.groupType]=[...nameArr,it.itemName];
  986. });
  987. //nameObj,obj;
  988. return {nameObj,obj};
  989. }
  990. // 时间戳转换日期
  991. function dateParser(timestamp,link = '-'){
  992. let time = new Date(timestamp);
  993. let year = time.getFullYear();
  994. let month = time.getMonth()+1;
  995. let date = time.getDate();
  996. let hour = time.getHours();
  997. let minute = time.getMinutes();
  998. let second = time.getSeconds();
  999. // let result = year+link+month+link+date;
  1000. let result = year+link+(month<10?"0"+month:month)+link+(date<10?"0"+date:date)+' '+(hour<10&&hour!=0?"0"+hour:hour)+':'+(minute<10&&minute!=0?"0"+minute:minute)+':'+(second<10&&second!=0?"0"+second:second);
  1001. return result;
  1002. }
  1003. //获取组合组件已填文字填入saveText
  1004. function getSaveText(data){//console.log(data)
  1005. const hasValue = data.questionMapping.findIndex((it)=>it.value!==undefined)!==-1; //有值时血压类型中文本标签要加入值
  1006. const arr = data.questionMapping.map((it)=>{
  1007. return it.value?(it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||''):(hasValue&&!notTextLabel(it)?it.name:'');
  1008. });
  1009. return arr.join('');
  1010. }
  1011. //添加自由文本标签
  1012. function notTextLabel(label){
  1013. return +label.tagType!==8;
  1014. }
  1015. /*
  1016. * 给标签组添加自由文本标签
  1017. * 入参:arr源数组,
  1018. * noPre是否不添加前置文本标签,默认false即添加
  1019. * noEnd是否不添加后置文本标签,默认false即添加
  1020. * 出参:newArr添加自由文本标签后的数据Array,
  1021. * saveText添加自由文本后对应的预览数据Array,
  1022. * */
  1023. function fullfillText(arr,noPre=false,noEnd=false,boxMark){
  1024. let newArr =[],
  1025. pre={},
  1026. textLabel={},
  1027. notText = true,
  1028. saveText=[],
  1029. tempText = '',
  1030. value = '',
  1031. cNum = 0;
  1032. Array.isArray(arr)&&arr.map((it,i)=>{
  1033. notText = notTextLabel(it);
  1034. cNum = i;
  1035. value = it.value||'';
  1036. textLabel = JSON.parse(config.textLabel);
  1037. //n个显示的标签最后一个标签后面要落关标,所以+1
  1038. if(i===0){
  1039. //第一个标签不是文本标签时在前面添加文本标签
  1040. if(!noPre&&notText){
  1041. newArr.push(textLabel);
  1042. saveText.push('');
  1043. }
  1044. newArr.push(it);
  1045. if(it.tagType == 6||it.tagType == 2){
  1046. tempText = getDefaultedSaveText(it,boxMark);
  1047. }else if(it.tagType == 3){
  1048. tempText = getSaveText(it);
  1049. }else{ //非血压类组合标签
  1050. tempText = value?it.labelPrefix+value+it.labelSuffix:'';
  1051. tempText = notText?tempText:it.value||it.name;
  1052. }
  1053. saveText.push(tempText);
  1054. // 模板只有一个标签时第一项后面也要加空标签
  1055. if(arr.length==1&&notText){
  1056. newArr.push(JSON.parse(config.textLabel));
  1057. saveText.push('');
  1058. }
  1059. }else{
  1060. pre = arr[i-1];
  1061. //如果本身不是文本标签且前面一个也不是文本标签,该标签前面添加文本标签
  1062. if(notTextLabel(pre)&&notText){
  1063. newArr.push(textLabel,it);
  1064. if(it.tagType == 6||it.tagType == 2){
  1065. tempText = getDefaultedSaveText(it,boxMark);
  1066. }else if(it.tagType == 3){
  1067. tempText = getSaveText(it);
  1068. }else{
  1069. tempText = value ? it.labelPrefix + value + it.labelSuffix : '';
  1070. }
  1071. saveText.push("",tempText);
  1072. }else{ //本身是或者前面是文本标签时,前面不添加文本标签
  1073. newArr.push(it);
  1074. if(it.tagType == 6||it.tagType == 2){
  1075. tempText = getDefaultedSaveText(it,boxMark);
  1076. }else if(it.tagType == 3){
  1077. tempText = getSaveText(it);
  1078. } else{
  1079. tempText = value ? it.labelPrefix + value + it.labelSuffix : '';
  1080. tempText = notText ? tempText : (it.value || it.value == "" ? it.value : it.name);
  1081. }
  1082. saveText.push(tempText);
  1083. }
  1084. if(notText&&!noEnd&&i===arr.length-1){//最后一个非文本标签,后面添加一个文本标签
  1085. //不能用上面的变量textLabel,因为上一个if可能也进了,这样就是同一个对象,值改变时会同步
  1086. newArr.push(JSON.parse(config.textLabel));
  1087. saveText.push("");
  1088. }
  1089. }
  1090. });
  1091. return {newArr,saveText};
  1092. };
  1093. function getDefaultedSaveText(it,boxMark){
  1094. const state = store.getState();
  1095. const {readConfig,typeConfig}=state.typeConfig;
  1096. const hasReadMode = readConfig!==-1;
  1097. const curOtherMode =hasReadMode&&readConfig[2]!==null?readConfig[2]:typeConfig[2];
  1098. const curMode =hasReadMode&&readConfig[1]!==null?readConfig[1]:typeConfig[1];
  1099. const otherDefault=+curOtherMode===1;
  1100. const curDefault=+curMode===1;
  1101. const defaulted = (((boxMark=='2'&&curDefault)||(boxMark=='3'&&otherDefault)))&&it.selFlag=='1'&&it.value===undefined;
  1102. const ext = it.questionMapping.filter((i)=>{
  1103. return +i.exclusionType===1;
  1104. });
  1105. const text = ext.length>0&&defaulted?ext[0].questionDetailList[0].name:'';
  1106. //console.log(state);
  1107. return text;
  1108. }
  1109. /*
  1110. * 查体添加自由文本标签函数
  1111. * 默认标签直接添加,
  1112. * 前config.showCheckNum个源数据标签默认显示,剩余隐藏收起
  1113. * 入参:arr源数组,
  1114. * noPre是否不添加前置文本标签,默认false即添加
  1115. * noEnd是否不添加后置文本标签,默认false即添加
  1116. * showInCheck是否默认在查体中展开
  1117. * 出参:newArr添加自由文本标签后的数据Array,
  1118. * saveText添加自由文本后对应的预览数据Array,
  1119. * checkHiddenDefault查体是否全部标签展开
  1120. *
  1121. * */
  1122. function checkFullfillText(arr,noPre=false,noEnd=false){
  1123. let newArr =[],
  1124. pre={},
  1125. textLabel={},
  1126. notText = true,
  1127. saveText=[],
  1128. tempText = '',
  1129. value = '',
  1130. item={},
  1131. checkHiddenDefault=false;
  1132. arr&&arr.map((it,i)=>{
  1133. notText = notTextLabel(it);
  1134. value = it.value||'';
  1135. //textLabel = i==0?JSON.parse(config.textLabel):Object.assign({},JSON.parse(config.textLabel),{showInCheck:true});
  1136. //n个显示的标签最后一个标签后面要落关标,所以+1
  1137. //_textLabel = !ifEmpty&&cNum<config.showCheckNum+1?Object.assign({},JSON.parse(config._textLabel),{showInCheck:true}):JSON.parse(config._textLabel);
  1138. if(i===0){
  1139. textLabel = Object.assign({},JSON.parse(config.textLabel),{showInCheck:true});
  1140. //第一个标签不是文本标签时在前面添加文本标签
  1141. if(!noPre&&notText){
  1142. newArr.push(textLabel);
  1143. saveText.push('');
  1144. }
  1145. item = Object.assign({},it,{showInCheck:true});
  1146. newArr.push(item);
  1147. if(it.tagType != 3){
  1148. tempText = value?it.labelPrefix+value+it.labelSuffix:'';
  1149. tempText = notText?tempText:it.value||it.name;
  1150. }else{
  1151. tempText = getSaveText(it);
  1152. }
  1153. saveText.push(tempText);
  1154. // 模板只有一个标签时第一项后面也要加空标签
  1155. if(arr.length==1&&notText){
  1156. newArr.push(textLabel);
  1157. saveText.push('');
  1158. }
  1159. }else{
  1160. pre = arr[i-1];
  1161. item = i<config.showCheckNum?Object.assign({},it,{showInCheck:true}):it;
  1162. //判断单选项是否有默认选中,位置在隐藏区域时,查体所有标签展示
  1163. if(!checkHiddenDefault&&i>config.showCheckNum&&+it.tagType===1&&(+it.controlType===0||+it.controlType===1)){
  1164. if(it.questionDetailList.find((it)=>it.defaultSelect=='1')){
  1165. checkHiddenDefault=true;
  1166. }
  1167. }
  1168. //如果本身不是文本标签且前面一个也不是文本标签,该标签前面添加文本标签
  1169. if(notTextLabel(pre)&&notText){
  1170. textLabel = Object.assign(JSON.parse(config._textLabel),{showInCheck:i-1<config.showCheckNum?true:false});
  1171. newArr.push(textLabel,item);
  1172. if(it.tagType != 3) {
  1173. tempText = value ? it.labelPrefix + value + it.labelSuffix : '';
  1174. }else{
  1175. tempText = getSaveText(it);
  1176. }
  1177. saveText.push("",tempText);
  1178. }else{ //本身是或者前面是文本标签时,前面不添加文本标签
  1179. newArr.push(item);
  1180. if(it.tagType != 3) {
  1181. tempText = value ? it.labelPrefix + value + it.labelSuffix : '';
  1182. tempText = notText ? tempText : (it.value || it.value == "" ? it.value : it.name);
  1183. }else{
  1184. tempText = getSaveText(it);
  1185. }
  1186. saveText.push(tempText);
  1187. }
  1188. if(notText&&!noEnd&&i===arr.length-1){//最后一个非文本标签,后面添加一个文本标签
  1189. const _text = Object.assign(JSON.parse(config.textLabel),{showInCheck:arr.length>config.showCheckNum?false:true});
  1190. newArr.push(_text);
  1191. saveText.push("");
  1192. }
  1193. }
  1194. });
  1195. return {newArr,saveText,checkHiddenDefault};
  1196. }
  1197. //获取标签index,入参:病例项index+标签index+标签内index
  1198. function getLabelIndex(index){
  1199. let ikey = index.split('-')[1];
  1200. return ikey;
  1201. };
  1202. function getWindowInnerHeight(){
  1203. if(window.innerHeight!=undefined){
  1204. return window.innerHeight;
  1205. }else{
  1206. let by = document.body, ele = document.documentElement;
  1207. return Math.min(by.clientHeight,ele.clientHeight);
  1208. }
  1209. };
  1210. function getWindowInnerWidth(){
  1211. let width = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth
  1212. return width
  1213. };
  1214. function getIds(data){
  1215. let ids = [];
  1216. data&&data.forEach((it,i)=>{
  1217. ids.push(it.id);
  1218. })
  1219. return ids;
  1220. }
  1221. /**
  1222. *
  1223. * @param {日期相关} info
  1224. * @param {时间是否包含时分秒} flg
  1225. * @param {连接符} con
  1226. */
  1227. function getCalendarDate(info) {
  1228. let conect = '-';
  1229. let date = info.year + conect + (info.month < 10 ? '0' + info.month : info.month) + conect + (info.day < 10 ? '0' + info.day : info.day) + ' '+ (info.hour != 0&&(info.hour).toString().length<2 ? '0' + info.hour : info.hour)+':'+ (info.minute != 0&&(info.minute).toString().length<2 ? '0' + info.minute : info.minute)+':'+ (info.second&&(info.second).toString().length<2 ? '0' + info.second : info.second);
  1230. return date;
  1231. }
  1232. // 导出
  1233. function downloadExportedData(data, fileName) {
  1234. // var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'}); //type表示xlsx类型
  1235. var blob = new Blob([data], {type: 'application/vnd.ms-excel;charset=UTF-8'}); //type表示xlsx类型
  1236. var href = window.URL.createObjectURL(blob);//创建下载的链接
  1237. // 为兼容FF26 (不支持a标签的模拟点击事件)
  1238. if (navigator.userAgent.indexOf("Firefox") > -1){
  1239. //window.open(requestUrl);
  1240. window.location.href = href;
  1241. }else {
  1242. var downloadElement = document.createElement('a');
  1243. downloadElement.href = href;
  1244. downloadElement.download = fileName; //下载后文件名
  1245. document.body.appendChild(downloadElement);
  1246. downloadElement.click(); //点击下载
  1247. document.body.removeChild(downloadElement); //下载完成移除元素
  1248. window.URL.revokeObjectURL(href);
  1249. }
  1250. }
  1251. function getStatusImg(type,val,status){
  1252. if(type == 0){//正常
  1253. return <span>{val} </span>
  1254. }else if(type == 1){//异常(表单输入的话非数字显示为异常)
  1255. return <span className={'red'}>{val} </span>
  1256. }
  1257. if(status == 1){
  1258. if(type == 2){
  1259. return <span style={{color:'#FF5D5D'}}>{val}<img src={up} alt=""/> </span>
  1260. }else if(type == 3){
  1261. return <span style={{color:"#D949FF"}}>{val}<img src={down} alt=""/> </span>
  1262. }
  1263. }else{
  1264. if(type == 2){
  1265. return <span>{val}<img src={up} alt=""/> </span>
  1266. }else if(type == 3){
  1267. return <span>{val}<img src={down} alt=""/> </span>
  1268. }
  1269. }
  1270. }
  1271. function getDomUpDown(min,max,value){
  1272. let dom = '';
  1273. if(min == null&&max == null||min == undefined&&max == undefined||min == ''&&max == ''){
  1274. dom = getStatusImg(0, value, 1)
  1275. }else if (!isNaN(min) && !isNaN(max) &&min!=null&&max!=null) {//有最大值最小值
  1276. if (isNaN(value)) {//输入的不是数据
  1277. dom = getStatusImg(1, value, 1)
  1278. } else if (value <= min) {//下降
  1279. dom = getStatusImg(3, value, 1)
  1280. } else if (value >= max) {//上升
  1281. dom = getStatusImg(2, value, 1)
  1282. } else {//正常
  1283. dom = getStatusImg(0, value, 1)
  1284. }
  1285. } else if (min==null && !isNaN(max)&&max!=null) {//有最大值无最小值
  1286. if (value >= max) {//上升
  1287. dom = getStatusImg(2, value, 1)
  1288. } else if(isNaN(value)){
  1289. dom = getStatusImg(1, value, 1)
  1290. }else {//正常
  1291. dom = getStatusImg(0, value, 1)
  1292. }
  1293. } else if (!isNaN(min) && max==null&&min!=null) {//有最小值无最大值
  1294. if (value <= min) {//下降
  1295. dom = getStatusImg(3, value, 1)
  1296. } else if(isNaN(value)){
  1297. dom = getStatusImg(1, value, 1)
  1298. }else {//正常
  1299. dom = getStatusImg(0, value, 1)
  1300. }
  1301. } else {//无最大最小值(中文))
  1302. dom = getStatusImg(1, value, 1)
  1303. }
  1304. return dom;
  1305. }
  1306. //键值对转换
  1307. function parseNameVal(arr){
  1308. let obj = {};
  1309. Array.isArray(arr)&&arr.map((it)=>{
  1310. obj[it.code]=it.value;
  1311. });
  1312. return obj;
  1313. }
  1314. //化验数据处理
  1315. function getStringPlus(dataList){
  1316. let strPlus = '';
  1317. dataList && dataList.map((item)=>{
  1318. if(item.detailName){
  1319. let strTmp = item.name + ','+ item.detailName + ',' + (item.otherValue ? item.otherValue : (item.value + item.units)) +';'
  1320. // let strTmp = item.name + ','+(item.inpValue?(item.inpValue+','):'') + item.detailName + ',' + (item.otherValue ? item.otherValue : (item.value + item.units)) +';'
  1321. strPlus += strTmp;
  1322. }else{
  1323. // let strTmp = item.name+ (item.inpValue?(','+item.inpValue):';')
  1324. let strTmp = item.name+ ';'
  1325. strPlus += strTmp;
  1326. }
  1327. })
  1328. return strPlus;
  1329. }
  1330. /**
  1331. *
  1332. * @param {data1} excel导入的数据 getExcelDataList
  1333. * @param {data2} 填写单数据 labelList
  1334. */
  1335. function getPushList(data1,data2){ //推送数据
  1336. let tmpArr1 = [];
  1337. let tmpArr2 = [];
  1338. let totalTmpArr = [];
  1339. const now = dateParser(new Date());
  1340. data1.length>0 && data1.map((items)=>{ //excel导入的数据拼接
  1341. items.lisExcelRes.map((item)=>{
  1342. item.lisExcelItem.map((part)=>{
  1343. let tmpObj = {};
  1344. tmpObj.name = part.mealName || '';//套餐名
  1345. tmpObj.detailName = part.itemName || '';//化验项名
  1346. tmpObj.uniqueName = part.uniqueName || '';//公表名称
  1347. tmpObj.source = '1';//数据来源
  1348. tmpObj.maxValue = part.max || '';
  1349. tmpObj.minValue = part.min || '';
  1350. tmpObj.dateValue = part.time ||now;
  1351. tmpObj.units = part.unit || '';//单位
  1352. tmpObj.value = (part.value-0) === (part.value-0) ? part.value:'';//值
  1353. tmpObj.otherValue = (part.value-0) === (part.value-0) ?'':part.value; //阴性阳性
  1354. tmpArr1.push(tmpObj);
  1355. })
  1356. })
  1357. })
  1358. data2.length>0 && data2.map((item)=>{ //填写单数据拼接
  1359. item.details && item.details.map((val)=>{
  1360. if(val.value != undefined && val.value != ''){
  1361. let tmpObj = {};
  1362. tmpObj.name = item.name || '';
  1363. tmpObj.detailName = val.name || '';
  1364. tmpObj.uniqueName = val.uniqueName || '';//公表名称
  1365. tmpObj.source = '0'; //数据来源
  1366. tmpObj.maxValue = val.maxValue ? val.maxValue : '';
  1367. tmpObj.minValue = val.minValue ? val.minValue : '';
  1368. tmpObj.dateValue = val.time || now;
  1369. tmpObj.units = val.labelSuffix || '';
  1370. tmpObj.value = (val.value-0) === (val.value-0) ? val.value:'';
  1371. tmpObj.otherValue = (val.value-0) === (val.value-0) ?'':val.value;
  1372. tmpArr2.push(tmpObj);
  1373. }
  1374. })
  1375. })
  1376. totalTmpArr = tmpArr1.concat(tmpArr2);
  1377. return totalTmpArr;
  1378. }
  1379. function getPushLists(data1,data2){ //推送数据
  1380. let tmpArr1 = [];
  1381. let tmpArr2 = [];
  1382. let totalTmpArr = [];
  1383. data1.length>0 && data1.map((items)=>{ //excel导入的数据拼接
  1384. items.lisExcelRes.map((item)=>{
  1385. item.lisExcelItem.map((part)=>{
  1386. let tmpObj = {};
  1387. tmpObj.name = part.mealName || '';//套餐名
  1388. tmpObj.detailName = part.itemName || '';//化验项名
  1389. tmpObj.uniqueName = part.uniqueName || '';//公表名称
  1390. tmpObj.source = '1';//数据来源
  1391. tmpObj.maxValue = part.max || '';
  1392. tmpObj.minValue = part.min || '';
  1393. tmpObj.units = part.unit || '';//单位
  1394. tmpObj.value = (part.value-0) === (part.value-0) ? part.value:'';//值
  1395. tmpObj.otherValue = (part.value-0) === (part.value-0) ?'':part.value; //阴性阳性
  1396. tmpArr1.push(tmpObj);
  1397. })
  1398. })
  1399. })
  1400. data2.length>0 && data2.map((item)=>{ //填写单数据拼接
  1401. if(item.show){
  1402. item.details.map((val)=>{
  1403. if(val.value != undefined && val.value != ''){
  1404. let tmpObj = {};
  1405. tmpObj.name = item.name || '';
  1406. tmpObj.inpValue = item.inpValue || '';//套餐名
  1407. tmpObj.detailName = val.name || '';
  1408. tmpObj.uniqueName = val.uniqueName || '';//公表名称
  1409. tmpObj.source = '0'; //数据来源
  1410. tmpObj.maxValue = val.maxValue ? val.maxValue : '';
  1411. tmpObj.minValue = val.minValue ? val.minValue : '';
  1412. tmpObj.units = val.labelSuffix || '';
  1413. tmpObj.value = (val.value-0) === (val.value-0) ? val.value:'';
  1414. tmpObj.otherValue = (val.value-0) === (val.value-0) ?'':val.value;
  1415. tmpArr2.push(tmpObj);
  1416. }
  1417. })
  1418. }else{
  1419. let tmpObj = {};
  1420. tmpObj.name = item.name;
  1421. tmpObj.inpValue = item.inpValue;
  1422. tmpArr2.push(tmpObj);
  1423. }
  1424. })
  1425. totalTmpArr = tmpArr1.concat(tmpArr2);
  1426. return totalTmpArr;
  1427. }
  1428. function getAllString(checkedListImport,assistLabel,flg){
  1429. let tmpImportLis = [],tmpString='',tmpArr=[],tmpObj={};
  1430. for(let i = 0;i < checkedListImport.length;i++){
  1431. for(let j = 0;j < checkedListImport[i].length;j++){
  1432. tmpImportLis.push(checkedListImport[i][j])
  1433. }
  1434. }
  1435. let tempArr = tmpImportLis.concat(assistLabel)
  1436. for (let i = 0; i < tempArr.length; i++) {
  1437. let tmpVal = tempArr[i].value ? tempArr[i].value.trim() : tempArr[i].value;
  1438. let obj = {
  1439. "dateValue": tempArr[i].time||"",
  1440. "name": "",
  1441. "uniqueName": tempArr[i].name||"",
  1442. "desc": tempArr[i].value||"",
  1443. "result": tempArr[i].value||"",
  1444. }
  1445. tmpArr.push(obj)
  1446. tmpString += (tempArr[i].name + (tmpVal ? (':' + tmpVal) + ', ' : ':') + (tempArr[i].time ? '报告日期:' + tempArr[i].time : '') + '^;')
  1447. }
  1448. return tmpObj = {
  1449. arr:tmpArr,
  1450. str:tmpString
  1451. }
  1452. // if(flg){
  1453. // return tmpArr;
  1454. // }else{
  1455. // return tmpString;
  1456. // }
  1457. }
  1458. // 模板中处理tagType==4的数据
  1459. function resetTagtype(data){
  1460. let newDataArr = [];
  1461. if(data&&data.length>0){
  1462. for(let i=0; i<data.length;i++){
  1463. if(data[i].tagType==4){
  1464. newDataArr.push(...data[i].questionMapping);
  1465. }else{
  1466. newDataArr.push(data[i]);
  1467. }
  1468. }
  1469. }
  1470. return newDataArr;
  1471. }
  1472. //记录最近3次被删除的标签
  1473. function handleLocalDelTag(mark,index,tag){
  1474. const deledTag = localStorage.getItem('deletedTags')?JSON.parse(localStorage.getItem('deletedTags')):[];
  1475. if(tag.tagType){
  1476. deledTag.unshift(Object.assign({},tag,{delIndex:mark+'-'+index}));
  1477. }else{
  1478. deledTag.unshift({tags:tag,delIndex:mark+'-'+index});
  1479. }
  1480. deledTag.length = deledTag.length>config.recoverTagNum?config.recoverTagNum:deledTag.length;
  1481. localStorage.setItem('deletedTags',JSON.stringify(deledTag));
  1482. }
  1483. //删除被恢复的标签
  1484. function shiftLocalDelTag(){
  1485. const deledTags = localStorage.getItem('deletedTags')?JSON.parse(localStorage.getItem('deletedTags')):[];
  1486. deledTags.shift();
  1487. localStorage.setItem('deletedTags',JSON.stringify(deledTags));
  1488. }
  1489. //弹窗显示问题
  1490. function setPosition (e,dom,setHighter){
  1491. setTimeout(()=>{
  1492. const contHt =$(dom).height();
  1493. const wrapHt = $("#EmrContainer").height();//滚动区域高度
  1494. const clickHt = getPageCoordinate(e).boxTop;//点击高度
  1495. const scrollHt = Math.abs(parseFloat($("#EmrContainer").parent('.scrollarea-content').css('margin-top'))) //滚动区滚动的距离
  1496. let btmHt = wrapHt-(clickHt-111)-scrollHt;//点击位置距离底部的距离
  1497. // console.log(wrapHt,clickHt,scrollHt,btmHt,contHt)
  1498. if(btmHt<contHt){
  1499. setHighter&&setHighter(contHt-btmHt+20);
  1500. }else{
  1501. setHighter&&setHighter(48); //标签填写单连续点击弹出,未超出需要恢复
  1502. }
  1503. // $(e.target)[0].scrollIntoView(true);
  1504. },10);
  1505. }
  1506. function moveEnd(obj,flg) {
  1507. if(window.getSelection){//ie11 10 9 ff safari
  1508. setTimeout(() => {
  1509. obj.focus(); //解决ff不获取焦点无法定位问题
  1510. var range = window.getSelection();//创建range
  1511. range.selectAllChildren(obj);//range 选择obj下所有子内容
  1512. if(flg){
  1513. range.collapseToStart();//光标移至开头
  1514. }else{
  1515. range.collapseToEnd();//光标移至最后
  1516. }
  1517. }, 0);
  1518. }
  1519. else if (document.selection) {//ie10 9 8 7 6 5
  1520. var range = document.selection.createRange();//创建选择对象
  1521. range.moveToElementText(obj);//range定位到obj
  1522. if(flg){
  1523. range.collapse(true);//光标移至开头
  1524. }else{
  1525. range.collapse(false);//光标移至最后
  1526. }
  1527. range.select();
  1528. }
  1529. }
  1530. /**
  1531. * 获取样式类名
  1532. * largeFontSize 18px middleFontSize 16px(暂无) simpleFontSize 14px
  1533. * flg 1标准字体时颜色加深,可以让选中的字体加粗
  1534. * 2体征颜色单独处理不需要设置
  1535. */
  1536. const setFontColorSize = (flg,pacs) => {
  1537. const classNameSelect = ['largeFontSize','middleFontSize','simpleFontSize','simpleLightColor','simpleColor','selectColor']
  1538. const state = store.getState();
  1539. let readConfig = state.typeConfig.readConfig
  1540. let mainType = readConfig==-1?state.typeConfig.typeConfig:readConfig;
  1541. let font = mainType[3],colour = mainType[4],classStr = '';
  1542. if(font == 1&&colour == 1){//字体加大颜色加深
  1543. if(flg == 2){
  1544. if(pacs == 1){
  1545. classStr = `largeFontSize pdright`
  1546. }else if(pacs == 2){
  1547. classStr = `largeFontSize widthChangeed`
  1548. }else if(pacs == 3){
  1549. classStr = `largeFontSize middleImg`
  1550. }else if(pacs == 4){
  1551. classStr = `largeFontSize titleWidth`
  1552. }else if(pacs == 5){
  1553. classStr = `largeFontSize specialSize`
  1554. }else if(pacs == 6){
  1555. classStr = `largeFontSize selectColor`
  1556. }else if(pacs == 7){
  1557. classStr = `largeFontSize fontWeight selectColor`
  1558. }else if(pacs == 8){
  1559. classStr = `largeFontSize selectColor`
  1560. }else{
  1561. classStr = `largeFontSize`
  1562. }
  1563. }else if(flg == 1){
  1564. classStr = `selectColor largeFontSize`
  1565. }else{
  1566. classStr = `selectColor largeFontSize`
  1567. }
  1568. }else if(font == 0&&colour == 1){//标准字体颜色加黑
  1569. if(flg == 2){
  1570. if(pacs == 6){
  1571. classStr = `simpleFontSize selectColor`
  1572. }else if(pacs == 7){
  1573. classStr = `simpleFontSize fontWeight selectColor`
  1574. }else if(pacs == 8){
  1575. classStr = `simpleFontSize selectColor`
  1576. }else{
  1577. classStr = `simpleFontSize`
  1578. }
  1579. }else if(flg == 1){
  1580. classStr = `selectColor simpleFontSize`
  1581. }else{
  1582. classStr = `selectColor simpleFontSize`
  1583. }
  1584. }else if(font == 1&&colour == 0){//大字体标准颜色
  1585. if(flg == 2){
  1586. if(pacs == 1){
  1587. classStr = `largeFontSize pdright`
  1588. }else if(pacs == 2){
  1589. classStr = `largeFontSize widthChangeed`
  1590. }else if(pacs == 3){
  1591. classStr = `largeFontSize middleImg`
  1592. }else if(pacs == 4){
  1593. classStr = `largeFontSize titleWidth`
  1594. }else if(pacs == 5){
  1595. classStr = `largeFontSize specialSize`
  1596. }else if(pacs == 6){
  1597. classStr = `largeFontSize`
  1598. }else if(pacs == 8){
  1599. classStr = `simpleColor largeFontSize`
  1600. }else if(pacs == 7){
  1601. classStr = `largeFontSize fontWeight`
  1602. }else{
  1603. classStr = `largeFontSize`
  1604. }
  1605. }else if(flg == 1){
  1606. classStr = `simpleLightColor largeFontSize`
  1607. }else{
  1608. classStr = `simpleColor largeFontSize`
  1609. }
  1610. }else{//都是标准的
  1611. if(flg == 2){
  1612. if(pacs == 7){
  1613. classStr = `simpleFontSize fontWeight`
  1614. }else if(pacs == 6){
  1615. classStr = `simpleFontSize`
  1616. }else if(pacs == 8){
  1617. classStr = `simpleColor simpleFontSize`
  1618. }else if(pacs == 7){
  1619. classStr = `simpleFontSize fontWeight`
  1620. }else{
  1621. classStr = `simpleFontSize`
  1622. }
  1623. }else if(flg == 1){
  1624. classStr = `simpleLightColor simpleFontSize`
  1625. }else{
  1626. classStr = `simpleColor simpleFontSize`
  1627. }
  1628. }
  1629. return classStr;
  1630. }
  1631. //获取生命体征或非生命体征标签
  1632. function getLifeLabels(arr,flag){ //flag=true获取非生命体征
  1633. const newArr = arr.filter((it)=>{
  1634. return flag?+it.specFlag!==4:+it.specFlag===4;
  1635. });
  1636. return newArr;
  1637. }
  1638. //获取已选中的标签
  1639. function getValuedLabels(arr){
  1640. const newArr = arr.filter((it)=>{
  1641. if(it.tagType=='3'){ //血压类型
  1642. if(+it.specFlag!==4&&it.questionMapping.findIndex((i)=>i.value!==undefined)!==-1){
  1643. return true;
  1644. }
  1645. return false;
  1646. }
  1647. return +it.specFlag!==4&&it.value;
  1648. });
  1649. return newArr;
  1650. }
  1651. //对象数组去重
  1652. function removeRepeat(arr1,arr2){ //arr1被完全保留的数组
  1653. const arr = arr2.reduce(function(newArr,item,inx){
  1654. const it = newArr.findIndex((i)=>i.id===item.id);
  1655. const firstInx = arr2.findIndex((i)=>i.id===item.id);
  1656. //旧体征标签比新体征标签多出的标签,已填值的保留,未填值的舍弃
  1657. if(it!==-1){
  1658. //多个相同标签,保留已填值的
  1659. if(firstInx!==inx&&(item.value!==undefined||(item.tagType=='3'&&item.questionMapping.findIndex((i)=>i.value!==undefined)!==-1))){ //重复的已填值标签
  1660. newArr.splice(inx-firstInx+it,0,item);
  1661. }
  1662. if(firstInx===inx){
  1663. newArr.splice(it,1,item);
  1664. }
  1665. }else if(item.value!==undefined||(it.tagType=='3'&&it.questionMapping.findIndex((i)=>i.value!==undefined)!==-1)){
  1666. newArr.push(item);
  1667. }
  1668. return newArr;
  1669. },[...arr1]);
  1670. return arr;
  1671. }
  1672. function handleMouseUp(param){
  1673. const {select_start,i,boxMark}= param;
  1674. if(select_start!==undefined){
  1675. store.dispatch({
  1676. type:SET_SELECTED_AREA,
  1677. data:{i,boxMark,dir:'end'}
  1678. });
  1679. //清空搜索结果以关闭搜索弹窗
  1680. const map = {
  1681. '1':CLEAR_SEARCH,
  1682. '2':CURRENT_CLEAR,
  1683. '3':OTHERHIS_CLEAR,
  1684. '4':CHECKBODY_CLEAR
  1685. };
  1686. store.dispatch({
  1687. type:map[boxMark]
  1688. });
  1689. window.getSelection().empty();
  1690. }
  1691. }
  1692. //判断不同科室内容是否相同
  1693. function checkDeptContent(jsonStr,tmpLis){
  1694. for(let i = 0;i <tmpLis.length;i++){
  1695. let dataStr = tmpLis[i].preview;
  1696. if(
  1697. filterDataArr(JSON.parse(jsonStr.chief)) == filterDataArr(eval('('+JSON.parse(dataStr).chief+')')) &&
  1698. filterDataArr(JSON.parse(jsonStr.present)) == filterDataArr(eval('('+JSON.parse(dataStr).present+')')) &&
  1699. filterDataArr(JSON.parse(jsonStr.other)) == filterDataArr(eval('('+JSON.parse(dataStr).other+')')) &&
  1700. filterDataArr(JSON.parse(jsonStr.vital)) == filterDataArr(eval('('+JSON.parse(dataStr).vital+')')) &&
  1701. jsonStr.lis == JSON.parse(dataStr).lis &&
  1702. jsonStr.pacs == JSON.parse(dataStr).pacs &&
  1703. jsonStr.diag == JSON.parse(dataStr).diag &&
  1704. jsonStr.advice == JSON.parse(dataStr).advice
  1705. ){
  1706. // Notify.info('该模板已保存');
  1707. return false;
  1708. }
  1709. }
  1710. }
  1711. module.exports = {
  1712. getIds,
  1713. getWindowInnerWidth,
  1714. getWindowInnerHeight,
  1715. getLabelIndex,
  1716. fullfillText,
  1717. checkFullfillText,
  1718. dateParser,
  1719. isNotNull,
  1720. isNull,
  1721. deepClone,
  1722. isIE,
  1723. storageLocal,
  1724. getUrlArgObject,
  1725. getAllDataList,
  1726. getAllDataStringList,
  1727. pushAllDataList,
  1728. filterArr,
  1729. filterDataArr,
  1730. filterOtherDataArr,
  1731. preventDefault,
  1732. handleEnter,
  1733. didPushParamChange,
  1734. getEMRParams,
  1735. getMRInfo,
  1736. windowEventHandler,
  1737. isAllClear,
  1738. normalVal,
  1739. getPageCoordinate,
  1740. windowRemoveEventHandler,
  1741. timestampToTime,
  1742. formatContinueDots,
  1743. inspectAndAssist,
  1744. getCurrentDate,
  1745. ifOtherClear,
  1746. readyKeepHistory,
  1747. parseChartData,
  1748. getCalendarDate,
  1749. downloadExportedData,
  1750. getStatusImg,
  1751. parseNameVal,
  1752. getStringPlus,
  1753. getPushLists,
  1754. getPushList,
  1755. getAllString,
  1756. resetTagtype,
  1757. handleLocalDelTag,
  1758. shiftLocalDelTag,
  1759. setPosition,
  1760. isAllPartClear,
  1761. getDomUpDown,
  1762. setFontColorSize,
  1763. moveEnd,
  1764. getLifeLabels,
  1765. getValuedLabels,
  1766. removeRepeat,
  1767. handleMouseUp,
  1768. checkDeptContent
  1769. };