LocalExpertTech.vue 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. <template>
  2. <div class="local-expert-tech">
  3. <!-- 顶部筛选 -->
  4. <div class="screening">
  5. <div class="screening-title flex-vertical-center-l">
  6. <img src="~@/assets/filters.png" alt />
  7. </div>
  8. <div class="screening-form flex-vertical-center-l flex-wrap">
  9. <div class="screening-item flex-vertical-center-l">
  10. <span>方名:</span>
  11. <div class="input">
  12. <el-input size="mini" v-model="searchData.name" placeholder="请输入" clearable></el-input>
  13. </div>
  14. </div>
  15. <div class="screening-item flex-vertical-center-l">
  16. <span>涵盖项目:</span>
  17. <div class="input">
  18. <el-select size="mini" v-model="searchData.includeItem" placeholder="请搜索选择" clearable filterable :loading="projectLoading" loading-text="搜索中..." :filter-method="searchProject" @focus="searchProject('')">
  19. <el-option v-for="item in projectOptions" :key="item.pid" :label="item.itemName" :value="item.pid"></el-option>
  20. </el-select>
  21. </div>
  22. </div>
  23. <div class="screening-item flex-vertical-center-l">
  24. <span>中医病名:</span>
  25. <div class="input">
  26. <el-select size="mini" v-model="searchData.chineseDisease" placeholder="请搜索选择" clearable filterable :loading="diseaseLoading" loading-text="搜索中..." :filter-method="searchDisease" @focus="searchDisease('')">
  27. <el-option v-for="(item, idx) in diseaseOptions" :key="idx" :label="item.disname" :value="String(item.disid)"></el-option>
  28. </el-select>
  29. </div>
  30. </div>
  31. <div class="screening-item flex-vertical-center-l">
  32. <span>西医病名:</span>
  33. <div class="input">
  34. <el-select size="mini" v-model="searchData.westernDisease" placeholder="请搜索选择" clearable filterable :loading="westernDiseaseLoading" loading-text="搜索中..." :filter-method="searchWesternDisease" @focus="searchWesternDisease('')">
  35. <el-option v-for="(item, idx) in westernDiseaseOptions" :key="idx" :label="item.westname" :value="String(item.westcode)"></el-option>
  36. </el-select>
  37. </div>
  38. </div>
  39. <div class="screening-item flex-vertical-center-l">
  40. <span>专家:</span>
  41. <div class="input">
  42. <el-input size="mini" v-model="searchData.expert" placeholder="请输入" clearable></el-input>
  43. </div>
  44. </div>
  45. <div class="screening-btn-group">
  46. <el-button type="primary" size="mini" @click="search()">搜索</el-button>
  47. <el-button type="warning" size="mini" @click="clearFilter()">清空</el-button>
  48. <el-button type="primary" size="mini" @click="openEditDialog()">新增</el-button>
  49. </div>
  50. </div>
  51. </div>
  52. <!-- 底部表格数据 -->
  53. <div class="table">
  54. <div class="today-table">
  55. <div class="table-container">
  56. <el-table
  57. :data="tableData"
  58. stripe
  59. style="width: 100%"
  60. border
  61. height="100%"
  62. row-key="pid"
  63. :expand-row-keys="expandRows"
  64. @expand-change="handleExpandChange"
  65. v-loading="tableLoading"
  66. >
  67. <el-table-column type="expand">
  68. <template slot-scope="props">
  69. <div class="expand-table">
  70. <el-table :data="props.row.subList" border size="mini" style="width: 100%">
  71. <el-table-column prop="index" label="序号" width="60" align="center"></el-table-column>
  72. <el-table-column prop="treatItemName" label="项目名称" align="center"></el-table-column>
  73. <el-table-column label="穴位/部位/耳穴/经络" align="center">
  74. <template slot-scope="scope">
  75. {{ formatDetailList(scope.row) }}
  76. </template>
  77. </el-table-column>
  78. <el-table-column prop="isUpdate" label="是否可修改" width="100" align="center">
  79. <template slot-scope="scope">
  80. {{ scope.row.isUpdate === '1' ? '是' : '否' }}
  81. </template>
  82. </el-table-column>
  83. </el-table>
  84. </div>
  85. </template>
  86. </el-table-column>
  87. <el-table-column prop="index" label="序号" width="60" align="center"></el-table-column>
  88. <el-table-column prop="name" label="方名" min-width="120" align="center"></el-table-column>
  89. <el-table-column prop="efficacy" label="功效与适应症" min-width="180" align="center" show-overflow-tooltip></el-table-column>
  90. <el-table-column prop="chineseDisease" label="中医病名" width="120" align="center"></el-table-column>
  91. <el-table-column prop="cardType" label="证型" width="120" align="center"></el-table-column>
  92. <el-table-column prop="westernDisease" label="西医病名" width="120" align="center"></el-table-column>
  93. <el-table-column prop="expert" label="专家" width="100" align="center"></el-table-column>
  94. <el-table-column prop="status" label="应用" width="90" align="center">
  95. <template slot-scope="scope">
  96. <el-switch
  97. :value="scope.row.status === 0"
  98. :disabled="scope.row.createUser != currentUserId"
  99. active-color="#5386f6"
  100. inactive-color="#dcdfe6"
  101. @change="handleStatusChange(scope.row, $event)"
  102. ></el-switch>
  103. </template>
  104. </el-table-column>
  105. <el-table-column label="操作" width="180" align="center">
  106. <template slot-scope="scope">
  107. <div class="flex-center">
  108. <div class="find-detail find-fill" @click="openEditDialog(scope.row)">编辑</div>
  109. <div class="find-detail find-fill1" @click="handleDelete(scope.row)">删除</div>
  110. <div class="find-detail find-fill2" @click="handleView(scope.row)">查看</div>
  111. </div>
  112. </template>
  113. </el-table-column>
  114. </el-table>
  115. </div>
  116. <div class="flex-vertical-center-r today-page">
  117. <el-pagination
  118. background
  119. layout=" prev, pager, next, jumper, total"
  120. :total="total"
  121. :page-size="limit"
  122. @current-change="sizeC($event)"
  123. ></el-pagination>
  124. </div>
  125. </div>
  126. </div>
  127. <!-- 新增/编辑弹窗 -->
  128. <popup
  129. distanceTop="5vh"
  130. fullscreen
  131. :showBtns="false"
  132. :showDialog.sync="showEditDialog"
  133. :loading="editLoading"
  134. :title="editData.pid ? '编辑本地专家适宜技术' : '新增本地专家适宜技术'"
  135. >
  136. <div slot="body" class="dialog-body-wrapper">
  137. <div class="dialog-back-btn" @click="handleEditBack">返回</div>
  138. <div class="dialog-scroll-area">
  139. <div class="dialog-form flex-wrap">
  140. <div class="form-item flex flex-col-center">
  141. <div class="name"><span style="color: red">*</span> 方名:</div>
  142. <div class="input">
  143. <el-input size="mini" v-model="editData.name" placeholder="请输入"></el-input>
  144. </div>
  145. </div>
  146. <div class="form-item flex flex-col-center">
  147. <span style="opacity:0">*</span>
  148. <div class="name">专家:</div>
  149. <div class="input">
  150. <el-input size="mini" v-model="editData.expert" placeholder="请输入"></el-input>
  151. </div>
  152. </div>
  153. <div class="form-item flex flex-col-center">
  154. <span style="opacity:0">*</span>
  155. <div class="name">专家名衔:</div>
  156. <div class="input">
  157. <el-select size="mini" v-model="editData.expertTitle" placeholder="请选择" clearable>
  158. <el-option
  159. :label="item.value"
  160. :value="item.value"
  161. v-for="(item,index) in titlesList"
  162. :key="index"
  163. ></el-option>
  164. </el-select>
  165. </div>
  166. </div>
  167. <div class="form-item flex flex-col-center">
  168. <span style="opacity:0">*</span>
  169. <div class="name">功效与适应症:</div>
  170. <div class="input">
  171. <el-input size="mini" v-model="editData.efficacy" placeholder="请输入"></el-input>
  172. </div>
  173. </div>
  174. <div class="form-item flex flex-col-center">
  175. <span style="opacity:0">*</span>
  176. <div class="name">中医病名:</div>
  177. <div class="input">
  178. <el-popover placement="bottom" width="180" trigger="focus" :close-delay="100">
  179. <el-input
  180. :class="{invalid: editData.chineseDiseaseName && (!editData.disCode)}"
  181. size="mini"
  182. slot="reference"
  183. :placeholder="key1?key1:'中医病名'"
  184. v-model="key1"
  185. ref="zybm"
  186. @input="getDiseaseList(key1)"
  187. @focus="handleFocus('bm')"
  188. @keydown.enter.native="handleEnter('bm')"
  189. >
  190. <div slot="suffix" class="suffix">
  191. <i class="el-icon-arrow-down" v-if="!key1"></i>
  192. <i class="el-icon-circle-close" v-else @click="clearBm"></i>
  193. </div>
  194. </el-input>
  195. <ul class="option-list">
  196. <li
  197. v-for="item in diseaseList"
  198. :key="item.$uid"
  199. :class="{ active: editData.chineseDiseaseName === item.$name }"
  200. @click="handleBm(item)"
  201. >{{ item.$name }}</li>
  202. </ul>
  203. </el-popover>
  204. </div>
  205. </div>
  206. <div class="form-item flex flex-col-center">
  207. <span style="opacity:0">*</span>
  208. <div class="name">证型:</div>
  209. <div class="input">
  210. <el-popover placement="bottom" width="180" trigger="focus" :close-delay="100">
  211. <el-input
  212. :class="{invalid: editData.symptomName && !editData.symptomCode}"
  213. size="mini"
  214. slot="reference"
  215. :placeholder="key2?key2:'中医证型'"
  216. v-model="key2"
  217. ref="zhengxing"
  218. @input="getSymptomList(key2)"
  219. @focus="handleFocus('zx')"
  220. @keydown.enter.native="handleEnter('zx')"
  221. >
  222. <div slot="suffix" class="suffix">
  223. <i class="el-icon-arrow-down" v-if="!key2"></i>
  224. <i class="el-icon-circle-close" v-else @click="clearZx"></i>
  225. </div>
  226. </el-input>
  227. <ul class="option-list">
  228. <li
  229. v-for="item in symptomList"
  230. :key="item.$uid"
  231. :class="{ active: editData.symptomName === item.$name, matched: item.isMatched }"
  232. @click="handleZx(item)"
  233. >{{ item.$name }}</li>
  234. </ul>
  235. </el-popover>
  236. </div>
  237. </div>
  238. <div class="form-item flex flex-col-center">
  239. <span style="opacity:0">*</span>
  240. <div class="name">治法:</div>
  241. <div class="input">
  242. <el-popover placement="bottom" width="180" trigger="focus" :close-delay="100" v-model="popoverZF">
  243. <el-input
  244. :class="{invalid: editData.therapyName && !editData.therapyCode}"
  245. size="mini"
  246. slot="reference"
  247. :placeholder="key3?key3:'中医治法'"
  248. v-model="key3"
  249. ref="zhifa"
  250. @input="getTherapyList(key3)"
  251. @focus="handleFocus('zf')"
  252. @keydown.enter.native="handleEnter('zf')"
  253. >
  254. <div slot="suffix" class="suffix">
  255. <i class="el-icon-arrow-down" v-if="!key3"></i>
  256. <i class="el-icon-circle-close" v-else @click="clearZf"></i>
  257. </div>
  258. </el-input>
  259. <ul class="option-list">
  260. <li
  261. v-for="item in therapyList"
  262. :key="item.$uid"
  263. :class="{ active: editData.therapyName === item.$name, matched: item.isMatched }"
  264. @click="handleZf(item)"
  265. >{{ item.$name }}</li>
  266. </ul>
  267. </el-popover>
  268. </div>
  269. </div>
  270. <div class="form-item flex flex-col-center">
  271. <span style="opacity:0">*</span>
  272. <div class="name">西医诊断:</div>
  273. <div class="input">
  274. <div class="western-disease-input-wrapper" @click="$refs.wdAutocomplete.focus()">
  275. <el-tag
  276. v-for="code in editData.westernDisease"
  277. :key="code"
  278. size="mini"
  279. closable
  280. @close="removeWesternDisease(code)"
  281. >{{ westernDiseaseNameMap[code] || code }}</el-tag>
  282. <el-autocomplete
  283. ref="wdAutocomplete"
  284. size="mini"
  285. v-model="westernDiseaseSearch"
  286. :fetch-suggestions="queryWesternDisease"
  287. value-key="westname"
  288. :placeholder="editData.westernDisease.length ? '' : '请搜索选择'"
  289. clearable
  290. :trigger-on-focus="true"
  291. @select="onWesternDiseaseSelect"
  292. >
  293. <template slot-scope="{ item }">
  294. <div :class="{ 'autocomplete-disabled': item._disabled }">
  295. {{ item.westname }}
  296. </div>
  297. </template>
  298. </el-autocomplete>
  299. </div>
  300. </div>
  301. </div>
  302. <div class="form-item flex flex-col-center" style="width: 100%">
  303. <span style="opacity:0">*</span>
  304. <div class="name">方解:</div>
  305. <div class="input">
  306. <el-input size="mini" type="textarea" v-model="editData.mechanismPre" placeholder="请输入"></el-input>
  307. </div>
  308. </div>
  309. </div>
  310. <!-- 配穴表格 -->
  311. <AcupointTable
  312. ref="acupointTable"
  313. v-model="editData.acupoints"
  314. :isEditable.sync="editData.isEditable"
  315. :detailTypes.sync="editData.detailTypes"
  316. :statistics.sync="editData.statistics"
  317. :showGuide="false"
  318. @save="onAcupointSave"
  319. />
  320. </div>
  321. </div>
  322. </popup>
  323. <!-- 查看详情弹窗 -->
  324. <popup
  325. distanceTop="5vh"
  326. fullscreen
  327. :showBtns="false"
  328. :showDialog.sync="showViewDialog"
  329. :loading="viewLoading"
  330. title="查看本地专家适宜技术"
  331. >
  332. <div slot="body" class="dialog-body-wrapper">
  333. <div class="dialog-back-btn" @click="showViewDialog = false">返回</div>
  334. <div class="dialog-scroll-area">
  335. <div class="dialog-form flex-wrap">
  336. <div class="form-item flex flex-col-center">
  337. <div class="name">方名:</div>
  338. <div class="input">
  339. <el-input size="mini" v-model="viewData.name" placeholder="-" disabled></el-input>
  340. </div>
  341. </div>
  342. <div class="form-item flex flex-col-center">
  343. <div class="name">专家:</div>
  344. <div class="input">
  345. <el-input size="mini" v-model="viewData.expert" placeholder="-" disabled></el-input>
  346. </div>
  347. </div>
  348. <div class="form-item flex flex-col-center">
  349. <div class="name">专家名衔:</div>
  350. <div class="input">
  351. <el-input size="mini" v-model="viewData.expertTitle" placeholder="-" disabled></el-input>
  352. </div>
  353. </div>
  354. <div class="form-item flex flex-col-center">
  355. <div class="name">功效与适应症:</div>
  356. <div class="input">
  357. <el-input size="mini" v-model="viewData.effect" placeholder="-" disabled></el-input>
  358. </div>
  359. </div>
  360. <div class="form-item flex flex-col-center">
  361. <div class="name">中医病名:</div>
  362. <div class="input">
  363. <el-input size="mini" v-model="viewData.disName" placeholder="-" disabled></el-input>
  364. </div>
  365. </div>
  366. <div class="form-item flex flex-col-center">
  367. <div class="name">证型:</div>
  368. <div class="input">
  369. <el-input size="mini" v-model="viewData.synName" placeholder="-" disabled></el-input>
  370. </div>
  371. </div>
  372. <div class="form-item flex flex-col-center">
  373. <div class="name">治法:</div>
  374. <div class="input">
  375. <el-input size="mini" v-model="viewData.theName" placeholder="-" disabled></el-input>
  376. </div>
  377. </div>
  378. <div class="form-item flex flex-col-center">
  379. <div class="name">西医诊断:</div>
  380. <div class="input">
  381. <el-input size="mini" v-model="viewData.westernDiag" placeholder="-" disabled></el-input>
  382. </div>
  383. </div>
  384. <div class="form-item flex flex-col-center" style="width: 100%">
  385. <div class="name">方解:</div>
  386. <div class="input">
  387. <el-input size="mini" type="textarea" v-model="viewData.mechanismPre" placeholder="-" disabled></el-input>
  388. </div>
  389. </div>
  390. </div>
  391. <SuitableTechDetail ref="techDetail" :detailData="viewData" />
  392. </div>
  393. </div>
  394. </popup>
  395. </div>
  396. </template>
  397. <script>
  398. import popup from "@/components/Propup.vue";
  399. import AcupointTable from "./components/AcupointTable.vue";
  400. import {
  401. getDiseaseListMethod,
  402. getSymptomListMethod,
  403. getTherapyListMethod,
  404. } from "@/request/api.illness.js";
  405. import {
  406. getDiseaseListMethod as getDiseaseListMethodApi,
  407. getSymptomListMethod as getSymptomListMethodApi,
  408. getTherapyListMethod as getTherapyListMethodApi,
  409. } from "@/request/api";
  410. import { getLocalSuitableTechList, deleteLocalSuitableTech, saveLocalSuitableTech, getLocalSuitableTechInfo, getMappedNondrugItemList, changeLocalExpertTechStatus } from "@/api/technology.js";
  411. import { getXDiseaseName } from "@/api/knowledge.js";
  412. import SuitableTechDetail from "./components/SuitableTechDetail.vue";
  413. export default {
  414. name: 'LocalExpertTech',
  415. components: { popup, AcupointTable, SuitableTechDetail },
  416. data() {
  417. return {
  418. searchData: {
  419. name: '',
  420. includeItem: '',
  421. chineseDisease: '',
  422. westernDisease: '',
  423. expert: ''
  424. },
  425. // 搜索区域下拉
  426. diseaseOptions: [],
  427. westernDiseaseOptions: [],
  428. westernDiseasePage: 1,
  429. westernDiseaseHasMore: true,
  430. projectOptions: [],
  431. // 弹窗内下拉(popover 方式)
  432. diseaseList: [],
  433. symptomList: [],
  434. therapyList: [],
  435. popoverZF: false,
  436. key1: "",
  437. key2: "",
  438. key3: "",
  439. westernDiseaseSearch: "",
  440. westernDiseaseNameMap: {},
  441. titlesList: [
  442. { key: "1", value: "国医大师" },
  443. { key: "2", value: "国家级名老中医" },
  444. { key: "3", value: "省级名老中医" },
  445. { key: "4", value: "名医" }
  446. ],
  447. // 下拉加载状态
  448. diseaseLoading: false,
  449. westernDiseaseLoading: false,
  450. projectLoading: false,
  451. // 表格数据
  452. tableData: [],
  453. tableLoading: false,
  454. expandRows: [],
  455. page: 1,
  456. limit: 10,
  457. total: 0,
  458. // 弹窗相关
  459. showEditDialog: false,
  460. editLoading: false,
  461. editData: {
  462. statistics: {},
  463. westernDisease: [],
  464. chineseDiseaseName: "",
  465. symptomName: "",
  466. therapyName: "",
  467. },
  468. // 查看详情弹窗
  469. showViewDialog: false,
  470. viewLoading: false,
  471. viewData: {},
  472. }
  473. },
  474. computed: {
  475. currentUserId() {
  476. const userInfo = this.$store.state.user.userInfo || {};
  477. return userInfo.pid;
  478. },
  479. },
  480. created() {
  481. this.getList()
  482. },
  483. watch: {
  484. key1: {
  485. handler(value, oldVal) {
  486. if (this.key1 === "") {
  487. this.editData.chineseDisease = ""
  488. this.editData.chineseDiseaseName = ""
  489. this.editData.disCode = ""
  490. }
  491. if (!value && oldVal) {
  492. this.getSymptomList()
  493. this.getTherapyList()
  494. }
  495. }
  496. },
  497. key2: {
  498. handler(value, oldVal) {
  499. if (this.key2 === "") {
  500. this.editData.symptomName = ""
  501. this.editData.symptomid = ""
  502. this.editData.symptomCode = ""
  503. }
  504. if (!value && oldVal) {
  505. this.getSymptomList()
  506. this.getTherapyList()
  507. }
  508. }
  509. },
  510. key3: {
  511. handler(value, oldVal) {
  512. if (this.key3 === "") {
  513. this.editData.therapyName = ""
  514. this.editData.therapyCode = ""
  515. }
  516. if (!value && oldVal) {
  517. this.getTherapyList()
  518. }
  519. }
  520. },
  521. },
  522. methods: {
  523. // ========== 搜索区域:中医病名 ==========
  524. async searchDisease(query) {
  525. this.diseaseLoading = true
  526. try {
  527. const { list } = await getDiseaseListMethod(1, 9999, { keyword: query || '' })
  528. this.diseaseOptions = list || []
  529. } catch (e) {
  530. console.error('搜索中医病名失败', e)
  531. } finally {
  532. this.diseaseLoading = false
  533. }
  534. },
  535. // ========== 弹窗:focus/enter ==========
  536. handleFocus(type) {
  537. if (type === 'bm' && this.diseaseList.length === 0) this.getDiseaseList(this.key1);
  538. else if (type === 'zx' && this.symptomList.length === 0) this.getSymptomList(this.key2);
  539. else if (type === 'zf' && this.therapyList.length === 0) this.getTherapyList(this.key3);
  540. },
  541. handleEnter(type) {
  542. if (type === 'bm' && this.diseaseList.length) this.handleBm(this.diseaseList[0]);
  543. else if (type === 'zx' && this.symptomList.length) this.handleZx(this.symptomList[0]);
  544. else if (type === 'zf' && this.therapyList.length) this.handleZf(this.therapyList[0]);
  545. },
  546. // ========== 弹窗:中医病名(popover) ==========
  547. async getDiseaseList(keyword = '') {
  548. const { total, list } = await getDiseaseListMethodApi(1, 9999, { keyword }).catch(() => ({ total: 0, list: [] }));
  549. this.diseaseList = list;
  550. },
  551. async handleBm(item) {
  552. this.editData.chineseDisease = String(item.disid);
  553. this.editData.chineseDiseaseName = item.$name;
  554. this.editData.disCode = item.$code;
  555. this.key1 = item.$name;
  556. this.$refs.zybm.blur();
  557. this.clearZx();
  558. if (!this.key1) return;
  559. this.$refs.zhengxing && this.$refs.zhengxing.focus();
  560. await this.getSymptomList();
  561. },
  562. clearBm() {
  563. this.editData.chineseDisease = "";
  564. this.editData.chineseDiseaseName = "";
  565. this.editData.disCode = "";
  566. this.key1 = "";
  567. this.clearZx();
  568. },
  569. // ========== 弹窗:证型(popover) ==========
  570. async getSymptomList(keyword = '') {
  571. const { total, list } = await getSymptomListMethodApi(1, 9999, {
  572. keyword,
  573. disid: this.editData.chineseDisease,
  574. disCode: this.editData.disCode,
  575. }).catch(() => ({ total: 0, list: [] }));
  576. this.symptomList = list;
  577. },
  578. async handleZx(item) {
  579. this.editData.symptomName = item.$name;
  580. this.editData.symptomid = item.$code;
  581. this.editData.symptomCode = item.$code;
  582. this.key2 = item.$name;
  583. this.$refs.zhengxing.blur();
  584. this.clearZf();
  585. this.$refs.zhifa && this.$refs.zhifa.focus();
  586. await this.getTherapyList();
  587. },
  588. clearZx() {
  589. this.editData.symptomName = "";
  590. this.editData.symptomid = "";
  591. this.editData.symptomCode = "";
  592. this.key2 = "";
  593. this.clearZf();
  594. },
  595. // ========== 弹窗:治法(popover) ==========
  596. async getTherapyList(keyword = '') {
  597. const { total, list } = await getTherapyListMethodApi(1, 9999, {
  598. keyword,
  599. disCode: this.editData.disCode,
  600. symptomCode: this.editData.symptomid,
  601. symid: this.editData.symptomid,
  602. }).catch(() => ({ total: 0, list: [] }));
  603. this.therapyList = list;
  604. },
  605. handleZf(item) {
  606. this.editData.therapyName = item.$name;
  607. this.editData.therapyCode = item.$code;
  608. this.key3 = item.$name;
  609. this.$nextTick(() => {
  610. this.$refs.zhifa && this.$refs.zhifa.blur();
  611. this.popoverZF = false;
  612. });
  613. },
  614. clearZf() {
  615. this.editData.therapyName = "";
  616. this.editData.therapyCode = "";
  617. this.key3 = "";
  618. },
  619. // ========== 西医诊断搜索(搜索区域 + 弹窗共用) ==========
  620. async searchWesternDisease(query) {
  621. this.westernDiseasePage = 1
  622. this.westernDiseaseHasMore = true
  623. this._wdQuery = query || ''
  624. this.westernDiseaseLoading = true
  625. try {
  626. const pinyin = /^[A-Za-z]+$/g
  627. const serchtype = query && pinyin.test(query) ? '1' : ''
  628. const res = await getXDiseaseName({
  629. pageid: 1,
  630. pagesize: 200,
  631. keyword: query || '',
  632. serchtype,
  633. })
  634. if (res.code == 0) {
  635. const list = res.data?.wests || []
  636. // 保留已选中但不在搜索结果中的选项
  637. const selectedCodes = Array.isArray(this.editData.westernDisease)
  638. ? this.editData.westernDisease
  639. : []
  640. const resultCodes = new Set(list.map(i => i.westcode))
  641. const preserved = selectedCodes
  642. .filter(code => !resultCodes.has(code))
  643. .map(code => ({
  644. westcode: code,
  645. westname: this.westernDiseaseNameMap[code] || code,
  646. }))
  647. this.westernDiseaseOptions = [...preserved, ...list]
  648. this.westernDiseaseHasMore = list.length >= 200
  649. list.forEach((item) => {
  650. if (item.westcode && item.westname) {
  651. this.westernDiseaseNameMap[item.westcode] = item.westname
  652. }
  653. })
  654. }
  655. } catch (e) {
  656. console.error('搜索西医诊断失败', e)
  657. } finally {
  658. this.westernDiseaseLoading = false
  659. }
  660. },
  661. // 弹窗:西医诊断 autocomplete 回调
  662. async queryWesternDisease(queryString, cb) {
  663. await this.searchWesternDisease(queryString)
  664. if (this.westernDiseaseOptions.length > 0) {
  665. cb(this.westernDiseaseOptions)
  666. } else {
  667. cb([{ westname: "暂无数据", _disabled: true }])
  668. }
  669. },
  670. onWesternDiseaseSelect(item) {
  671. if (item._disabled) {
  672. this.$nextTick(() => {
  673. this.westernDiseaseSearch = ""
  674. })
  675. return
  676. }
  677. const code = String(item.westcode)
  678. if (!this.editData.westernDisease.includes(code)) {
  679. this.editData.westernDisease.push(code)
  680. this.westernDiseaseNameMap[code] = item.westname
  681. this.updateWesternDiseaseName()
  682. }
  683. this.westernDiseaseSearch = ""
  684. this.$nextTick(() => {
  685. this.searchWesternDisease("")
  686. })
  687. },
  688. removeWesternDisease(code) {
  689. this.editData.westernDisease = this.editData.westernDisease.filter((c) => c !== code)
  690. this.updateWesternDiseaseName()
  691. },
  692. updateWesternDiseaseName() {
  693. const names = this.editData.westernDisease
  694. .map((code) => this.westernDiseaseNameMap[code] || "")
  695. .filter(Boolean)
  696. this.editData.westernDiseaseName = names.join(",")
  697. },
  698. // 涵盖项目远程模糊搜索
  699. async searchProject(query) {
  700. this.projectLoading = true
  701. try {
  702. const res = await getMappedNondrugItemList({
  703. pageNum: 1,
  704. pageSize: 100,
  705. itemName: query || undefined,
  706. })
  707. if (res.ResultCode === 0) {
  708. this.projectOptions = res.Data?.Items || res.Data || []
  709. }
  710. } catch (e) {
  711. console.error('搜索涵盖项目失败', e)
  712. } finally {
  713. this.projectLoading = false
  714. }
  715. },
  716. search() {
  717. this.page = 1
  718. this.getList()
  719. },
  720. clearFilter() {
  721. this.searchData = {
  722. name: '',
  723. includeItem: '',
  724. chineseDisease: '',
  725. westernDisease: '',
  726. expert: ''
  727. }
  728. this.getList()
  729. },
  730. sizeC(e) {
  731. this.page = e
  732. this.getList()
  733. },
  734. handleExpandChange(row, expandedRows) {
  735. this.expandRows = expandedRows.map(item => item.pid)
  736. },
  737. async handleStatusChange(row, val) {
  738. const status = val ? 0 : 1;
  739. try {
  740. const res = await changeLocalExpertTechStatus({ pid: row.pid, status });
  741. if (res.ResultCode === 0) {
  742. this.$message.success(status === 0 ? '已启用' : '已禁用');
  743. row.status = status;
  744. }
  745. } catch (e) {
  746. this.$message.error('操作失败');
  747. }
  748. },
  749. formatDetailList(row) {
  750. const parts = []
  751. const extractNames = (arr) => {
  752. if (!Array.isArray(arr) || !arr.length) return ''
  753. return arr.map(item => item.name || '').filter(Boolean).join('、')
  754. }
  755. const pointNames = extractNames(row.detailPoint)
  756. if (pointNames) parts.push('穴位: ' + pointNames)
  757. const meridianNames = extractNames(row.detailMeridian)
  758. if (meridianNames) parts.push('经络: ' + meridianNames)
  759. const earNames = extractNames(row.detailEarPoint)
  760. if (earNames) parts.push('耳穴: ' + earNames)
  761. const bodyNames = extractNames(row.detailBodyPart)
  762. if (bodyNames) parts.push('部位: ' + bodyNames)
  763. const otherNames = extractNames(row.detailOther)
  764. if (otherNames) parts.push('其他: ' + otherNames)
  765. return parts.join(';') || '-'
  766. },
  767. handleEditBack() {
  768. if (!this.editData.pid) {
  769. this.$confirm("协定方未保存,返回则会清空当前编辑内容", "提示", {
  770. confirmButtonText: "确定",
  771. cancelButtonText: "取消",
  772. type: "warning",
  773. })
  774. .then(() => {
  775. this.showEditDialog = false;
  776. })
  777. .catch(() => {});
  778. } else {
  779. this.showEditDialog = false;
  780. }
  781. },
  782. async openEditDialog(row) {
  783. if (row) {
  784. this.editLoading = true
  785. let detail = row
  786. try {
  787. const res = await getLocalSuitableTechInfo(row.pid)
  788. if (res.ResultCode === 0) {
  789. detail = res.Data || row
  790. }
  791. } catch (e) {
  792. console.error('获取详情失败', e)
  793. } finally {
  794. this.editLoading = false
  795. }
  796. // 初始化搜索关键字,用于回显
  797. this.key1 = detail.disName || ""
  798. this.key2 = detail.synName || ""
  799. this.key3 = detail.theName || ""
  800. // 加载下拉列表数据
  801. if (this.key1) this.getDiseaseList(this.key1)
  802. if (this.key2) this.getSymptomList(this.key2)
  803. if (this.key3) this.getTherapyList(this.key3)
  804. if (detail.westernCode) {
  805. const codes = String(detail.westernCode).split(",")
  806. const names = detail.westernDiag
  807. ? String(detail.westernDiag).split(",")
  808. : []
  809. this.westernDiseaseOptions = codes.map((code, idx) => ({
  810. westcode: code.trim(),
  811. westname: (names[idx] || "").trim() || code.trim(),
  812. }))
  813. } else {
  814. this.westernDiseaseOptions = []
  815. }
  816. // 同步到名称映射
  817. this.westernDiseaseNameMap = {}
  818. this.westernDiseaseOptions.forEach((item) => {
  819. if (item.westcode && item.westname) {
  820. this.westernDiseaseNameMap[item.westcode] = item.westname
  821. }
  822. })
  823. this.editData = {
  824. ...detail,
  825. efficacy: detail.effect || '',
  826. chineseDisease: detail.disId != null ? String(detail.disId) : '',
  827. chineseDiseaseName: detail.disName || '',
  828. disCode: detail.disCode || '',
  829. symptomid: detail.synCode != null ? String(detail.synCode) : '',
  830. symptomName: detail.synName || '',
  831. symptomCode: detail.synCode || '',
  832. therapyCode: detail.theCode != null ? String(detail.theCode) : '',
  833. therapyName: detail.theName || '',
  834. westernDisease: detail.westernCode
  835. ? String(detail.westernCode).split(',').map(s => s.trim())
  836. : [],
  837. westernDiseaseName: detail.westernDiag || '',
  838. acupoints: detail.acupoints || [],
  839. detailTypes: detail.detailTypes || ['穴位'],
  840. statistics: detail.statistics || {},
  841. }
  842. this.showEditDialog = true
  843. // 弹窗显示后回填 treatmentList 到 AcupointTable
  844. this.$nextTick(() => {
  845. if (this.$refs.acupointTable && detail.treatmentList) {
  846. this.$refs.acupointTable.loadFromServerData(detail.treatmentList)
  847. }
  848. })
  849. } else {
  850. this.editData = {
  851. name: '',
  852. treater: '',
  853. expert: '',
  854. expertTitle: '',
  855. efficacy: '',
  856. chineseDisease: '',
  857. chineseDiseaseName: '',
  858. disCode: '',
  859. symptomid: '',
  860. symptomName: '',
  861. symptomCode: '',
  862. therapyCode: '',
  863. therapyName: '',
  864. westernDisease: [],
  865. westernDiseaseName: '',
  866. mechanismPre: '',
  867. isEditable: '1',
  868. detailTypes: ['穴位'],
  869. acupoints: [],
  870. statistics: {},
  871. }
  872. this.key1 = ""
  873. this.key2 = ""
  874. this.key3 = ""
  875. this.diseaseList = []
  876. this.symptomList = []
  877. this.therapyList = []
  878. this.showEditDialog = true
  879. }
  880. },
  881. async submitEditData() {
  882. // 保存
  883. this.$refs.acupointTable.handleSave()
  884. },
  885. async onAcupointSave(treatmentList, institutionInfo) {
  886. // 从下拉选项中查找选中项的名称
  887. const selectedDisease = this.diseaseList.find(
  888. (o) => String(o.disid) === this.editData.chineseDisease,
  889. )
  890. const selectedSymptom = this.symptomList.find(
  891. (o) => o.$code === this.editData.symptomid,
  892. )
  893. const selectedTherapy = this.therapyList.find(
  894. (o) => o.$code === this.editData.therapyCode,
  895. )
  896. const params = {
  897. name: this.editData.name,
  898. // 本地专家特有字段
  899. treater: this.editData.treater || '',
  900. expert: this.editData.expert || '',
  901. expertTitle: this.editData.expertTitle || '',
  902. mechanismPre: this.editData.mechanismPre || '',
  903. // 基本信息
  904. effect: this.editData.efficacy || '',
  905. // 疾病信息
  906. disId: this.editData.chineseDisease || undefined,
  907. disName: selectedDisease
  908. ? selectedDisease.$name
  909. : this.editData.chineseDiseaseName || '',
  910. disCode: this.editData.disCode || '',
  911. // 证型信息
  912. synName: selectedSymptom
  913. ? selectedSymptom.$name
  914. : this.editData.symptomName || '',
  915. synCode: this.editData.symptomid || '',
  916. // 治法信息
  917. theCode: this.editData.therapyCode || '',
  918. theName: selectedTherapy
  919. ? selectedTherapy.$name
  920. : this.editData.therapyName || '',
  921. // 西医诊断
  922. westernCode: Array.isArray(this.editData.westernDisease)
  923. ? this.editData.westernDisease.join(',')
  924. : (this.editData.westernDisease || ''),
  925. westernDiag: this.editData.westernDiseaseName || '',
  926. // 总金额
  927. totalAmount: parseFloat(this.editData.statistics?.totalPrice) || 0,
  928. // 机构信息
  929. ygtid: institutionInfo?.ygtid || this.editData.ygtid || '',
  930. departmentId: institutionInfo?.departmentId || this.editData.departmentId || '',
  931. stitutionsId: institutionInfo?.stitutionsId || this.editData.stitutionsId || '',
  932. stitutionsName: institutionInfo?.stitutionsName || this.editData.stitutionsName || '',
  933. // 治疗明细项列表
  934. treatmentList,
  935. }
  936. if (this.editData.pid) {
  937. params.pid = this.editData.pid
  938. }
  939. try {
  940. const res = await saveLocalSuitableTech(params)
  941. if (res.ResultCode === 0) {
  942. this.$message.success(this.editData.pid ? '编辑成功' : '新增成功')
  943. this.showEditDialog = false
  944. this.getList()
  945. }
  946. } catch (e) {
  947. console.error('保存失败', e)
  948. } finally {
  949. if (this.$refs.acupointTable) {
  950. this.$refs.acupointTable.saveDone()
  951. }
  952. }
  953. },
  954. handleDelete(row) {
  955. this.$confirm('确认删除该条记录?', '提示', {
  956. confirmButtonText: '确定',
  957. cancelButtonText: '取消',
  958. type: 'warning'
  959. }).then(async () => {
  960. try {
  961. const res = await deleteLocalSuitableTech({ pid: row.pid })
  962. if (res.ResultCode === 0) {
  963. this.$message.success('删除成功')
  964. this.getList()
  965. } else {
  966. this.$message.error(res.ResultInfo || '删除失败')
  967. }
  968. } catch (e) {
  969. console.error('删除失败', e)
  970. this.$message.error('删除失败')
  971. }
  972. }).catch(() => {})
  973. },
  974. async handleView(row) {
  975. this.viewLoading = true
  976. this.showViewDialog = true
  977. this.viewData = {}
  978. try {
  979. const res = await getLocalSuitableTechInfo(row.pid)
  980. if (res.ResultCode === 0) {
  981. this.viewData = res.Data || {}
  982. }
  983. } catch (e) {
  984. console.error('获取详情失败', e)
  985. } finally {
  986. this.viewLoading = false
  987. }
  988. },
  989. async getList() {
  990. this.tableLoading = true
  991. try {
  992. const params = {
  993. pageNum: this.page,
  994. pageSize: this.limit,
  995. name: this.searchData.name || undefined,
  996. coverageContent: this.searchData.includeItem || undefined,
  997. disId: this.searchData.chineseDisease || undefined,
  998. disName: this.searchData.chineseDisease
  999. ? (this.diseaseOptions.find(o => String(o.disid) === this.searchData.chineseDisease)?.disname || undefined)
  1000. : undefined,
  1001. expert: this.searchData.expert || undefined,
  1002. westernCode: this.searchData.westernDisease || undefined,
  1003. westernDiag: this.searchData.westernDisease
  1004. ? (this.westernDiseaseOptions.find(o => String(o.westcode) === this.searchData.westernDisease)?.westname || undefined)
  1005. : undefined,
  1006. }
  1007. const res = await getLocalSuitableTechList(params)
  1008. if (res.ResultCode === 0) {
  1009. const list = res.Data?.Items || []
  1010. this.total = res.Data?.totalRecordCount || 0
  1011. this.tableData = list.map((item, index) => ({
  1012. ...item,
  1013. index: (this.page - 1) * this.limit + index + 1,
  1014. efficacy: item.effect || '',
  1015. chineseDisease: item.disName || '',
  1016. cardType: item.synName || '',
  1017. westernDisease: item.westernDiag || '',
  1018. expert: item.expert || '',
  1019. subList: (item.treatmentList || []).map((sub, sIdx) => ({
  1020. ...sub,
  1021. index: sIdx + 1,
  1022. })),
  1023. }))
  1024. }
  1025. } catch (e) {
  1026. console.error('获取列表失败', e)
  1027. } finally {
  1028. this.tableLoading = false
  1029. }
  1030. }
  1031. }
  1032. }
  1033. </script>
  1034. <style lang="scss" scoped>
  1035. @import "../../style/common.scss";
  1036. @import "../../style/base.scss";
  1037. .local-expert-tech {
  1038. width: 100%;
  1039. height: 100%;
  1040. }
  1041. .local-expert-tech ::v-deep .popup-container {
  1042. display: flex;
  1043. flex-direction: column;
  1044. overflow: hidden !important;
  1045. height: calc(100vh - 60px) !important;
  1046. }
  1047. .dialog-body-wrapper {
  1048. display: flex;
  1049. flex-direction: column;
  1050. height: 100%;
  1051. }
  1052. .dialog-back-btn {
  1053. display: flex;
  1054. align-items: center;
  1055. justify-content: center;
  1056. font-size: 14px;
  1057. color: #333;
  1058. background: #fff;
  1059. border: 1px solid #ccc;
  1060. border-radius: 4px;
  1061. padding: 4px 16px;
  1062. cursor: pointer;
  1063. margin-bottom: 10px;
  1064. width: fit-content;
  1065. &:hover {
  1066. opacity: 0.8;
  1067. }
  1068. }
  1069. .dialog-form {
  1070. display: flex;
  1071. flex-wrap: wrap;
  1072. flex-shrink: 0;
  1073. .form-item {
  1074. width: 25%;
  1075. box-sizing: border-box;
  1076. padding: 0 10px;
  1077. margin-bottom: 10px;
  1078. .name {
  1079. width: 110px;
  1080. min-width: 110px;
  1081. font-size: 14px;
  1082. white-space: nowrap;
  1083. text-align: right;
  1084. margin-right: 5px;
  1085. }
  1086. .input {
  1087. flex: 1;
  1088. min-width: 0;
  1089. .el-input,
  1090. .el-select,
  1091. .el-autocomplete {
  1092. width: 100%;
  1093. }
  1094. .el-popover__reference-wrapper {
  1095. display: block !important;
  1096. width: 100%;
  1097. .el-input {
  1098. width: 100%;
  1099. }
  1100. }
  1101. }
  1102. }
  1103. }
  1104. .dialog-scroll-area {
  1105. flex: 1;
  1106. min-height: 0;
  1107. overflow: hidden;
  1108. display: flex;
  1109. flex-direction: column;
  1110. }
  1111. .autocomplete-disabled {
  1112. color: #999 !important;
  1113. cursor: not-allowed !important;
  1114. pointer-events: none;
  1115. }
  1116. .el-input.invalid::v-deep {
  1117. input {
  1118. color: #ff0000;
  1119. }
  1120. }
  1121. .option-list {
  1122. margin: -12px -12px;
  1123. max-height: 300px;
  1124. overflow: auto;
  1125. .active {
  1126. color: #5386f6;
  1127. }
  1128. li {
  1129. padding: 8px 12px;
  1130. list-style: none;
  1131. font-size: 14px;
  1132. box-sizing: border-box;
  1133. width: 100%;
  1134. color: #606266;
  1135. font-weight: 500;
  1136. cursor: pointer;
  1137. }
  1138. li:hover {
  1139. background: #f5f7fa;
  1140. }
  1141. }
  1142. .suffix {
  1143. height: 100%;
  1144. padding-right: 5px;
  1145. display: flex;
  1146. align-items: center;
  1147. i {
  1148. cursor: pointer;
  1149. color: #c0c4cc;
  1150. }
  1151. i:hover {
  1152. color: #909399;
  1153. }
  1154. }
  1155. .western-disease-input-wrapper {
  1156. border: 1px solid #dcdfe6;
  1157. border-radius: 4px;
  1158. padding: 2px 4px;
  1159. display: flex;
  1160. flex-wrap: wrap;
  1161. align-items: center;
  1162. min-height: 28px;
  1163. cursor: text;
  1164. .el-tag {
  1165. margin: 2px 4px 2px 0;
  1166. max-width: 200px;
  1167. overflow: hidden;
  1168. text-overflow: ellipsis;
  1169. }
  1170. .el-autocomplete {
  1171. flex: 1;
  1172. min-width: 80px;
  1173. }
  1174. ::v-deep .el-input__inner {
  1175. border: none !important;
  1176. padding: 0 4px;
  1177. height: 24px;
  1178. line-height: 24px;
  1179. background: transparent;
  1180. }
  1181. ::v-deep .el-input__suffix {
  1182. display: flex;
  1183. align-items: center;
  1184. }
  1185. &:hover {
  1186. border-color: #c0c4cc;
  1187. }
  1188. &:focus-within {
  1189. border-color: #409eff;
  1190. }
  1191. }
  1192. .dialog-scroll-area ::v-deep .recipe-acupoint-wrapper {
  1193. flex: 1;
  1194. display: flex;
  1195. flex-direction: column;
  1196. min-height: 0;
  1197. }
  1198. .dialog-scroll-area ::v-deep .recipe-acupoint {
  1199. flex: 1;
  1200. min-height: 0;
  1201. }
  1202. .screening-btn-group {
  1203. display: flex;
  1204. align-items: center;
  1205. margin: 5px 0;
  1206. }
  1207. .expand-table {
  1208. padding: 10px 20px;
  1209. }
  1210. .table {
  1211. padding: 10px 10px;
  1212. background: #ffffff;
  1213. border-radius: 5px;
  1214. margin-top: 10px;
  1215. height: 70vh;
  1216. .table-container {
  1217. height: 90%;
  1218. }
  1219. .today-table {
  1220. height: 100%;
  1221. .find-detail {
  1222. width: 60px;
  1223. height: 24px;
  1224. border: 1px solid #ffae45;
  1225. border-radius: 2px;
  1226. text-align: center;
  1227. color: #fff;
  1228. font-size: 14px;
  1229. cursor: pointer;
  1230. margin: 0 2px;
  1231. background: #ffae45;
  1232. }
  1233. .find-fill {
  1234. background: #5386f6 !important;
  1235. color: #fff !important;
  1236. border: 1px solid #5386f6;
  1237. }
  1238. .find-fill1 {
  1239. background: #ff6245;
  1240. color: #fff !important;
  1241. border: 1px solid #ff6245;
  1242. }
  1243. .find-fill2 {
  1244. background: #68a8ff !important;
  1245. color: #fff !important;
  1246. border: 1px solid #68a8ff;
  1247. }
  1248. }
  1249. }
  1250. </style>
  1251. <style lang="scss" scoped>
  1252. @media screen and (min-width: 1681px) and (max-width: 1920px) {
  1253. .table {
  1254. height: 81vh;
  1255. .table-container {
  1256. height: 94%;
  1257. }
  1258. }
  1259. .today-table::v-deep .el-table td {
  1260. padding: 18px 0;
  1261. }
  1262. .today-table::v-deep .el-table th {
  1263. padding: 18px 0;
  1264. }
  1265. }
  1266. @media screen and (min-width: 1601px) and (max-width: 1680px) {
  1267. .table {
  1268. height: 80vh;
  1269. .table-container {
  1270. height: 94%;
  1271. }
  1272. }
  1273. .today-table::v-deep .el-table td {
  1274. padding: 18px 0;
  1275. }
  1276. .today-table::v-deep .el-table th {
  1277. padding: 18px 0;
  1278. }
  1279. }
  1280. @media screen and (min-width: 1361px) and (max-width: 1600px) {
  1281. .table {
  1282. height: 72vh;
  1283. .table-container {
  1284. height: 90%;
  1285. }
  1286. }
  1287. .today-table::v-deep .el-table td {
  1288. padding: 5px 0;
  1289. }
  1290. .today-table::v-deep .el-table th {
  1291. padding: 5px 0;
  1292. }
  1293. }
  1294. @media screen and (min-width: 1281px) and (max-width: 1360px) {
  1295. .table {
  1296. height: 72vh;
  1297. .table-container {
  1298. height: 90%;
  1299. }
  1300. }
  1301. .today-table::v-deep .el-table td {
  1302. padding: 5px 0;
  1303. }
  1304. .today-table::v-deep .el-table th {
  1305. padding: 5px 0;
  1306. }
  1307. }
  1308. </style>