AddMedicalInfo.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <template>
  2. <div class="MedicalInfoWrapper">
  3. <div class="groupTitle"><i
  4. class="el-icon-back"
  5. @click="back"
  6. ></i> 医学术语属性--{{isEdit?'修改':'添加'}}</div>
  7. <div class="info-container">
  8. <el-form :rules="rules"
  9. :model="form"
  10. label-width="130px"
  11. ref="groups">
  12. <el-form-item label="搜索概念:">
  13. <div class="conceptSearch">
  14. <input v-model="conceptText" type="text" class="searchText">
  15. <span class="searchName" @click="searchConcept">搜索</span>
  16. <ul class="conceptList" ref="conceptList">
  17. <li
  18. v-for="item in conceptList"
  19. class="conceptItem ellipsis"
  20. :title="item.nameAndType"
  21. @click="selectConcept(item)"
  22. :key="item.id">
  23. {{item.nameAndType}}
  24. </li>
  25. </ul>
  26. </div>
  27. </el-form-item>
  28. <el-form-item label="选择概念:" prop = "concept">
  29. <el-input v-model="form.concept" disabled></el-input>
  30. <!-- <el-select v-model="form.concept" filterable @change="selectConcept" placeholder="请选择" size="small">
  31. <el-option
  32. v-for="(item) in conceptList"
  33. :key="item.id"
  34. :label="item.nameAndType"
  35. :value="item.id">
  36. </el-option>
  37. </el-select> -->
  38. </el-form-item>
  39. <el-form-item label="选择类型:" prop="type">
  40. <el-input disabled v-model="form.conceptType"></el-input>
  41. </el-form-item>
  42. <!-- <el-form-item label="术语名称:" prop="termName">
  43. <el-input v-model="form.termName"></el-input>
  44. </el-form-item> -->
  45. <el-form-item label="术语标准名称:" prop="termStandardName">
  46. <el-input disabled v-model="form.stdName"></el-input>
  47. </el-form-item>
  48. <el-form-item label="搜索小类名称:">
  49. <div class="conceptSearch termMiniClassSearch">
  50. <input v-model="termMiniClassText" type="text" class="searchText">
  51. <span class="searchName" @click="searchTermMiniClass">搜索</span>
  52. <ul class="conceptList" ref="termMiniClassNameList">
  53. <li
  54. v-for="item in termMiniClassNameList"
  55. class="conceptItem ellipsis"
  56. :title="item.nameAndType"
  57. @click="selectTermMiniClass(item)"
  58. :key="item.id">
  59. {{item.nameAndType}}
  60. </li>
  61. </ul>
  62. </div>
  63. </el-form-item>
  64. <el-form-item label="术语小类名称:" prop="termMiniClassName">
  65. <el-input disabled v-model="form.termMiniClassName"></el-input>
  66. <!-- <el-select v-model="form.termMiniClassName" filterable placeholder="请选择" size="small">
  67. <el-option
  68. v-for="(item) in termClassList"
  69. :key="item.id"
  70. :label="item.nameAndType"
  71. :value="item.name">
  72. </el-option>
  73. </el-select> -->
  74. </el-form-item>
  75. <el-form-item label="搜索术语类组:">
  76. <div class="conceptSearch termClassSearch">
  77. <input v-model="termClassText" type="text" class="searchText">
  78. <span class="searchName" @click="searchTermClass">搜索</span>
  79. <ul class="conceptList" ref="termClassList">
  80. <li
  81. v-for="item in termClassList"
  82. class="conceptItem ellipsis"
  83. :title="item.nameAndType"
  84. @click="selectTermClass(item)"
  85. :key="item.id">
  86. {{item.nameAndType}}
  87. </li>
  88. </ul>
  89. </div>
  90. </el-form-item>
  91. <el-form-item label="术语类组:" prop="termClass">
  92. <el-input disabled v-model="form.termClass"></el-input>
  93. <!-- <el-select v-model="form.termClass" filterable placeholder="请选择" size="small">
  94. <el-option
  95. v-for="(item) in termClassList"
  96. :key="item.id"
  97. :label="item.nameAndType"
  98. :value="item.name">
  99. </el-option>
  100. </el-select> -->
  101. </el-form-item>
  102. <el-form-item label="性别:" prop="sex">
  103. <el-select v-model="form.sex" clearable placeholder="请选择" size="small">
  104. <el-option
  105. v-for="item in sexList"
  106. :key="item.sex"
  107. :label="item.sex"
  108. :value="item.val">
  109. </el-option>
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item
  113. label="年龄"
  114. class="fix-inp"
  115. prop="age"
  116. >
  117. <el-col :span="10">
  118. <el-form-item
  119. prop="minAge"
  120. >
  121. <el-input v-model="form.minAge"
  122. maxLength="3"
  123. type="number"
  124. ></el-input>
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="4">~</el-col>
  128. <el-col :span="10">
  129. <el-form-item
  130. prop="maxAge"
  131. >
  132. <el-input
  133. v-model="form.maxAge"
  134. type="number"
  135. maxLength="3"
  136. ></el-input>
  137. </el-form-item>
  138. </el-col>
  139. </el-form-item>
  140. <el-form-item label="一级部位:" prop="primarySite">
  141. <el-select v-model="form.primarySite" clearable placeholder="请选择" @change="selectPrimarySite" size="small">
  142. <el-option
  143. v-for="item in primarySiteList"
  144. :key="item.key"
  145. :label="item.name"
  146. :value="item.name">
  147. </el-option>
  148. </el-select>
  149. </el-form-item>
  150. <el-form-item label="二级部位:" prop="twoLevelPosition">
  151. <el-select v-model="form.twoLevelPosition" clearable placeholder="请选择" size="small">
  152. <el-option
  153. v-for="item in twoLevelPositionList"
  154. :key="item.key"
  155. :label="item.name"
  156. :value="item.name">
  157. </el-option>
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item label="显示顺序:" prop="order">
  161. <!-- <el-input v-model="form.order"></el-input> -->
  162. <el-select v-model="form.order" clearable placeholder="请选择" size="small">
  163. <el-option
  164. v-for="(item) in orderList"
  165. :key="item.key"
  166. :label="item.val"
  167. :value="item.val">
  168. </el-option>
  169. </el-select>
  170. </el-form-item>
  171. <el-form-item label="科室:" prop="department">
  172. <el-select v-model="form.department" filterable placeholder="请选择" size="small">
  173. <el-option
  174. v-for="(item) in departmentList"
  175. :key="item.id"
  176. :label="item.name"
  177. :value="item.name">
  178. </el-option>
  179. </el-select>
  180. </el-form-item>
  181. <el-form-item label="术语编码:" prop="termCode">
  182. <el-input v-model="form.termCode"></el-input>
  183. </el-form-item>
  184. <el-form-item label="备注:" prop="remark">
  185. <el-input type="textarea" v-model="form.remark"></el-input>
  186. </el-form-item>
  187. </el-form>
  188. <div class="btn">
  189. <el-button
  190. type="primary"
  191. @click="submitForm"
  192. class="confirmBtn"
  193. >确 定</el-button>
  194. </div>
  195. </div>
  196. </div>
  197. </template>
  198. <script>
  199. /**
  200. *
  201. */
  202. import api from '@api/icss.js';
  203. export default {
  204. name: 'AddMedicalInfo',
  205. components: {
  206. },
  207. data() {
  208. return {
  209. isEdit:false,
  210. conceptText: '',
  211. conceptList: [], //概念列表(标准书语列表,过滤掉已添加过的)
  212. termClassText: '',
  213. termClassList:[], //术语类组列表(未过滤)
  214. termMiniClassText:'',
  215. termMiniClassNameList:[], //术语小类名称列表(未过滤)
  216. sexList: [
  217. {
  218. sex:'男',
  219. val:'1',
  220. },
  221. {
  222. sex:'女',
  223. val:'2',
  224. },
  225. {
  226. sex:'通用',
  227. val:'3',
  228. },
  229. ],
  230. typeList:[],
  231. primarySiteList: [], //一级部位列表
  232. twoLevelPositionList: [], //二级部位列表
  233. departmentList:[
  234. {
  235. id: 1,
  236. name: '全科'
  237. }
  238. ], //科室列表
  239. orderList:[
  240. {
  241. key: 0,
  242. val: 0
  243. },
  244. {
  245. key: 1,
  246. val: 1
  247. },
  248. {
  249. key: 2,
  250. val: 2
  251. },
  252. {
  253. key: 3,
  254. val: 3
  255. },
  256. {
  257. key: 4,
  258. val: 4
  259. },
  260. {
  261. key: 5,
  262. val: 5
  263. },
  264. {
  265. key: 6,
  266. val: 6
  267. },
  268. {
  269. key: 7,
  270. val: 7
  271. },
  272. {
  273. key: 8,
  274. val: 8
  275. },
  276. {
  277. key: 9,
  278. val: 9
  279. },
  280. {
  281. key: 10,
  282. val: 10
  283. }
  284. ], //显示顺序列表
  285. concept: '',
  286. form:{
  287. concept:'', //概念名称
  288. name: '', //术语名称
  289. stdName: '', //术语标准名称
  290. conceptType: '', //概念类型
  291. termClass: '', //术语类组
  292. termMiniClassName: '', //术语小类名称
  293. sex: '', //性别
  294. minAge: '', //最小年龄
  295. maxAge: '', //最大年龄
  296. primarySite: '', //一级部位
  297. twoLevelPosition: '', //二级部位
  298. order: '', //显示顺序
  299. department: '', //科室
  300. termCode: '', //术语编码
  301. remark: '' //备注
  302. },
  303. rules: {
  304. termStandardName: [
  305. { required: true, message: '请选择标准术语', trigger: '' }
  306. ],
  307. termMiniClassName: [
  308. { required: true, message: '请选择小类名称', trigger: 'change' }
  309. ],
  310. termClass: [
  311. { required: true, message: '请选择术语类组', trigger: 'change' }
  312. ],
  313. sex: [
  314. { required: true, message: '请选择性别', trigger: 'change' }
  315. ],
  316. primarySite: [
  317. { required: true, message: '请选择一级部位', trigger: 'change' }
  318. ],
  319. twoLevelPosition: [
  320. { required: true, message: '请选择二级部位', trigger: 'change' }
  321. ],
  322. department: [
  323. { required: true, message: '请选择科室', trigger: 'change' }
  324. ],
  325. minAge: [
  326. { required: true, message: '请输入最小年龄', trigger: 'change' }
  327. ],
  328. maxAge: [
  329. { required: true, message: '请输入最大年龄', trigger: 'change' }
  330. ]
  331. }
  332. }
  333. },
  334. watch:{
  335. },
  336. created:function(){
  337. const {isEdit,data} = this.$route.params;
  338. if(isEdit){
  339. this.isEdit = isEdit;
  340. this.form.concept = data.conceptName
  341. this.form.conceptType = data.conceptType
  342. this.form.name = data.name
  343. this.form.stdName = data.stdName
  344. this.form.termClass = data.cateName
  345. this.form.termMiniClassName = data.grp
  346. this.form.sex = data.gender
  347. this.form.minAge = data.minAge
  348. this.form.maxAge = data.maxAge
  349. this.form.primarySite = data.bodypart
  350. this.form.twoLevelPosition = data.subBodypart
  351. this.form.order = data.displayOrder
  352. this.form.department = data.dept
  353. this.form.termCode = data.code
  354. this.form.remark = data.note
  355. } else {
  356. }
  357. this.getPrimarySite()
  358. },
  359. methods: {
  360. back() { this.$router.go(-1) },
  361. searchConcept() {
  362. let param1 = {
  363. "name": this.conceptText,
  364. "isMedical": 1
  365. }
  366. this.getAllConcept(1, param1)
  367. this.$refs['conceptList'].style.display = 'block'
  368. },
  369. searchTermClass() {
  370. let param1 = {
  371. "name": this.termClassText,
  372. }
  373. this.getAllConcept(2, param1)
  374. this.$refs['termClassList'].style.display = 'block'
  375. },
  376. searchTermMiniClass() {
  377. let param1 = {
  378. "name": this.termMiniClassText,
  379. }
  380. this.getAllConcept(3, param1)
  381. this.$refs['termMiniClassNameList'].style.display = 'block'
  382. },
  383. getAllConcept(type, param1) { //获取所有概念
  384. let param = {
  385. "isConcept": 1,
  386. }
  387. param = Object.assign({}, param, param1)
  388. api.getAllConcept(param).then((res) =>{
  389. if(res.data.code == '0') {
  390. if( type === 1 ) {
  391. this.conceptList = res.data.data
  392. } else if (type === 2) {
  393. this.termClassList = res.data.data
  394. } else if (type ===3) {
  395. this.termMiniClassNameList = res.data.data
  396. }
  397. } else {
  398. this.warning(res.data.msg)
  399. }
  400. })
  401. },
  402. selectConcept(item) {
  403. // const conceptItem = this.form.concept
  404. const selectedConcept = item
  405. this.form.concept = selectedConcept.name
  406. this.form.name = selectedConcept.name
  407. this.form.stdName = selectedConcept.name
  408. this.form.conceptType = selectedConcept.type
  409. this.$refs['conceptList'].style.display = 'none'
  410. this.conceptText = ''
  411. },
  412. selectTermClass(item) {
  413. this.form.termClass = item.name
  414. this.$refs['termClassList'].style.display = 'none'
  415. this.termClassText = ''
  416. },
  417. selectTermMiniClass(item) {
  418. this.form.termMiniClassName = item.name
  419. this.$refs['termMiniClassNameList'].style.display = 'none'
  420. this.termMiniClassText = ''
  421. },
  422. getPrimarySite() { //获取一级部位
  423. const param = {
  424. "level": 1
  425. }
  426. this.getAllBodypart(param, 1)
  427. },
  428. getTwoLevelPosition() {
  429. const param = {
  430. "bodypart": this.form.primarySite,
  431. "level": 2
  432. }
  433. this.getAllBodypart(param, 2)
  434. },
  435. getAllBodypart(param, type) { //获取部位
  436. api.getAllBodypart(param).then((res) =>{
  437. if(res.data.code == '0') {
  438. if (type === 1) {
  439. this.primarySiteList = res.data.data
  440. } else if(type === 2) {
  441. this.twoLevelPositionList = res.data.data
  442. }
  443. }
  444. })
  445. },
  446. getDeptInfo() {
  447. api.getDeptInfo({}).then((res) => {
  448. if(res.data.code == '0') {
  449. this.departmentList = res.data.data.records
  450. }
  451. })
  452. },
  453. selectPrimarySite() {
  454. this.form.twoLevelPosition = '';
  455. this.getTwoLevelPosition();
  456. },
  457. submitForm() {
  458. //验证外层表单
  459. let goOn=true,it=null;
  460. this.$refs.groups.validate((valid) =>{
  461. if(!valid){
  462. goOn = false;
  463. return false;
  464. }
  465. });
  466. if(!goOn){
  467. return;
  468. }
  469. //通过必填验证,提交保存
  470. const param = {
  471. "bodypart": this.form.primarySite,
  472. "cateName": this.form.termClass,
  473. "code": this.form.termCode,
  474. "conceptName": this.form.concept,
  475. "conceptType": this.form.conceptType,
  476. "dept": this.form.department,
  477. "displayOrder": this.form.order,
  478. "gender": this.form.sex,
  479. "grp": this.form.termMiniClassName,
  480. "maxAge":this.form.maxAge,
  481. "minAge": this.form.minAge,
  482. "name": this.form.name,
  483. "note": this.form.remark,
  484. "stdName": this.form.stdName,
  485. "subBodypart": this.form.twoLevelPosition,
  486. }
  487. console.log(param);
  488. this.showSaveDialog(param);
  489. },
  490. showSaveDialog(param) {
  491. this.showConfirmDialog('是否保存该医学术语属性?', () => {
  492. api.addMedicalInfo(param).then((res) => {
  493. if (res.data.code === '0') {
  494. this.warning(res.data.msg || '保存成功', 'success');
  495. this.$router.push("/admin/LT-YXSYKWH-SYYXSXWH");
  496. } else {
  497. this.warning(res.data.msg)
  498. }
  499. }).catch((err) => {
  500. this.warning(err);
  501. })
  502. });
  503. },
  504. showConfirmDialog(msg, resolve) {
  505. this.$alert(msg, '提示', {
  506. confirmButtonText: '确定',
  507. type: 'warning'
  508. }).then(() => {
  509. resolve();
  510. }).catch(() => {});
  511. },
  512. warning(msg, type) {
  513. this.$message({
  514. showClose: true,
  515. message: msg,
  516. type: type || 'warning'
  517. })
  518. },
  519. }
  520. }
  521. </script>
  522. <style lang="less">
  523. @import "../../less/common.less";
  524. .MedicalInfoWrapper {
  525. .conceptSearch {
  526. height: 30px;
  527. margin: 4px 0;
  528. position: relative;
  529. }
  530. .searchText {
  531. padding: 0 10px;
  532. width: 180px;
  533. height: 30px;
  534. line-height: 30px;
  535. border: 1px solid #dcdfe6;
  536. float: left;
  537. border-radius: 4px 0 0 4px;
  538. }
  539. .searchName {
  540. display: block;
  541. width: 40px;
  542. height: 30px;
  543. border: 1px solid #dcdfe6;
  544. border-left: none;
  545. border-radius: 0 4px 4px 0;
  546. font-size: 14px;
  547. line-height: 30px;
  548. text-align: center;
  549. float: left;
  550. }
  551. .conceptList {
  552. position: absolute;
  553. border: 1px solid #dcdfe6;
  554. top: 30px;
  555. width: 200px;
  556. max-height: 160px;
  557. z-index: 10;
  558. overflow: auto;
  559. background: #fff
  560. }
  561. .conceptItem {
  562. padding: 0 10px;
  563. height: 30px;;
  564. line-height: 30px;
  565. overflow: hidden;
  566. }
  567. .conceptItem:hover {
  568. border: 1px solid #22ccc8;
  569. }
  570. .termMiniClassSearch {
  571. z-index: 8
  572. }
  573. .termClassSearch {
  574. z-index: 6
  575. }
  576. .info-container {
  577. .fix-inp {
  578. .el-form-item__error {
  579. width: 200px;
  580. }
  581. }
  582. }
  583. .groupTitle {
  584. width: calc(100% - 50px);
  585. height: 40px;
  586. background: #fff;
  587. padding: 0 20px 0 30px;
  588. margin-bottom: 20px;
  589. line-height: 40px;
  590. position: relative;
  591. z-index: 5;
  592. }
  593. .fix-inp{
  594. width: 330px;
  595. }
  596. .fix-inp .el-col .el-input__inner{
  597. width: 100%;
  598. display: inline-block;
  599. }
  600. .fix-inp .el-col-4{
  601. text-align: center;
  602. }
  603. .fix-inp .el-col-8{
  604. text-align: center;
  605. }
  606. .el-textarea__inner {
  607. width: 400px;
  608. }
  609. .info-container{
  610. background: #fff;
  611. padding: 20px;
  612. margin: 20px 20px -20px 20px;
  613. .el-input__inner{
  614. width: 200px;
  615. height: 32px;
  616. }
  617. .el-form-item__label{
  618. text-align: left;
  619. }
  620. .add-prg .el-form-item{
  621. margin-bottom: 20px;
  622. }
  623. }
  624. .line{
  625. border-top:1px #dcdfe6 solid;
  626. margin-bottom: 25px;
  627. }
  628. .btn {
  629. position: relative;
  630. height: 50px;
  631. }
  632. .confirmBtn {
  633. position: absolute;
  634. right: 40px;
  635. }
  636. // 处理input type = number的上下箭头
  637. input::-webkit-outer-spin-button,
  638. input::-webkit-inner-spin-button {
  639. -webkit-appearance: none;
  640. text-align: center;
  641. }
  642. input[type="number"]{
  643. -moz-appearance: textfield;
  644. text-align: center;
  645. }
  646. }
  647. </style>