AddCommonSymptom.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <!-- 添加常见科室症状 -->
  2. <template>
  3. <div class="addCommonSymptomWrapper">
  4. <div class="groupTitle"><i
  5. class="el-icon-back"
  6. @click="back"
  7. ></i> 常见症状维护系统--{{titleText}}</div>
  8. <el-form :model="form" ref="ruleForm" :rules="rules" class="addDepartForm">
  9. <!-- 一期 -->
  10. <el-form-item label="选择科室" prop="department">
  11. <el-select :disabled="isEdit || isDetail" v-model="form.department" placeholder="请添加科室" @change="changeDept" class="selectDepart">
  12. <el-option v-for="item in departList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item label="选择类型" prop="type">
  16. <el-select :disabled="isEdit || isDetail" v-model="form.type" placeholder="请选择类型" @change="changeType" class="selectDepart">
  17. <!-- 一期 -->
  18. <el-option v-for="item in typeList" :key="item.type" :label="item.typeName" :value="item.type"></el-option>
  19. <!-- 二期 -->
  20. <!-- <el-option v-for="item in typeList" :key="item.key" :label="item.name" :value="item.key"></el-option> -->
  21. </el-select>
  22. </el-form-item>
  23. <!-- 二期 -->
  24. <!-- <el-form-item label="选择科室" prop="department">
  25. <el-select :disabled="isEdit || isDetail || !form.type" v-model="form.department" placeholder="请添加科室" @change="changeDept" class="selectDepart">
  26. <el-option v-for="item in departList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  27. </el-select>
  28. </el-form-item> -->
  29. </el-form>
  30. <div class="symptomList">
  31. <div class="bottomPartLeft fl" v-if="!isDetail">
  32. <p class="symptomPoolTitle">症状池</p>
  33. <div class="symptomPool">
  34. <el-input
  35. placeholder="请输入搜索内容"
  36. v-model="searchVal"
  37. >
  38. <i
  39. slot="prefix"
  40. class="el-input__icon el-icon-search"
  41. ></i>
  42. </el-input>
  43. <ul class="tagList tagPool">
  44. <li v-for="(item, index) in leftTagsList"
  45. class = "tagItem"
  46. :key='item.id'
  47. :title="'[ '+item.tagName+' ]'"
  48. :style="getStyle(item)?styles:null"
  49. @click='selectLeftTag(item, index)'
  50. >
  51. <p class="tagName ellipsis" >{{item.tagName}} </p>
  52. </li>
  53. </ul>
  54. </div>
  55. </div>
  56. <div class="bottomPartMid fl" v-if="!isDetail">
  57. <p><span class="el-icon-arrow-right" @click="toRightList"></span></p>
  58. <p><span class="el-icon-arrow-left" @click="toLeftList"></span></p>
  59. </div>
  60. <div class="bottomPartRight fl">
  61. <p class="symptomPoolTitle">常见症状:</p>
  62. <ul class="tagList operationPool">
  63. <li class = "tagItem"
  64. v-for="(item,index) in rightTagsList"
  65. :key='item.id'
  66. :style="index === selectRightTagIndex?styles:null"
  67. @click='isDetail ? "":selectRightTag(index)'
  68. >
  69. <p v-if="item.tagName" class="tagName ellipsis" :title="'[ '+item.tagName+' ]'">{{item.tagName}} </p>
  70. </li>
  71. </ul>
  72. </div>
  73. <div class="bottomPartMid fl" v-if="!isDetail">
  74. <p><span class="el-icon-arrow-up" @click="toUp"></span></p>
  75. <p><span class="el-icon-arrow-down" @click="toDown"></span></p>
  76. </div>
  77. </div>
  78. <div class="btn">
  79. <el-button
  80. type="primary"
  81. @click="submitForm('ruleForm')"
  82. >确 定</el-button>
  83. </div>
  84. </div>
  85. </template>
  86. <script>
  87. import api from '@api/icss.js';
  88. export default {
  89. name: 'AddCommonSymptom',
  90. data() {
  91. return{
  92. rules: {
  93. department:[{required: true, message: '请选择科室', trigger: ['blur']}],
  94. type:[{required: true, message: '请选择类型', trigger: ['blur']}]
  95. },
  96. form: {
  97. department: '',
  98. type:''
  99. },
  100. titleText: '添加科室常见症状',
  101. departList: [],
  102. typeList:[
  103. {
  104. "name": "症状",
  105. "key": 1
  106. },
  107. ],
  108. searchVal: '',
  109. isEdit: false,
  110. isDetail: false,
  111. leftTagsList:[],
  112. rightTagsList:[],
  113. selectLeftTagsList: [],
  114. selectRightTagIndex: -1,
  115. styles:{
  116. background:'#eae7e7'
  117. },
  118. }
  119. },
  120. created(){
  121. const { isEdit, isDetail, data } = this.$route.params;
  122. if(isEdit || isDetail) {
  123. if(isEdit) {
  124. this.titleText = '修改科室常见症状'
  125. } else {
  126. this.titleText = '科室常见症状详情'
  127. }
  128. this.isEdit = isEdit
  129. this.isDetail = isDetail
  130. this.rightTagsList = data.data
  131. this.departList.push({name: data.name, id: data.id})
  132. this.typeList.push({typeName: data.typeName, type: data.type})
  133. this.form.department =data.id
  134. this.form.type =data.type
  135. this.getSymptomList()
  136. } else {
  137. this.getDepartmentList()
  138. //二期
  139. // this.getIcssEnumsData()
  140. }
  141. },
  142. watch: {
  143. searchVal(newVal, preVal) {
  144. if(newVal.trim() == ''){
  145. this.getSymptomList()
  146. }else if(newVal.trim() != preVal.trim()){
  147. this.getSymptomList()
  148. }
  149. }
  150. },
  151. methods: {
  152. back(){
  153. this.$router.go(-1);
  154. },
  155. // 二期
  156. // getIcssEnumsData() {
  157. // api.getIcssEnumsData().then((res) => {
  158. // if(res.data.code === '0') {
  159. // this.typeList = res.data.data.questionUsualTypeEnum
  160. // }
  161. // })
  162. // },
  163. getDepartmentList() {
  164. // 二期
  165. // const param = {
  166. // "type": this.form.type
  167. // }
  168. // api.getDepartmentList(param).then((res)=>{
  169. // 一期
  170. api.getDepartmentList({}).then((res)=>{
  171. if(res.data.code === '0') {
  172. this.departList = res.data.data
  173. }
  174. })
  175. },
  176. getSymptomList() {
  177. let noIds = []
  178. for (let i =0; i < this.rightTagsList.length; i++) {
  179. noIds.push(this.rightTagsList[i].id)
  180. }
  181. const param = {
  182. "deptId": this.form.department,
  183. "tagName": this.searchVal,
  184. "noIds": noIds,
  185. "type": this.form.type,
  186. "notTagType": [8],
  187. }
  188. api.getSymptomList(param).then((res)=>{
  189. if(res.data.code === '0') {
  190. this.leftTagsList = res.data.data
  191. }
  192. })
  193. },
  194. changeDept() {
  195. //一期
  196. this.form.type = ''
  197. this.typeList = this.departList.filter(item => this.form.department == item.id)[0].typeDTOList
  198. //二期
  199. // this.getSymptomList()
  200. this.clearData()
  201. },
  202. changeType() {
  203. // 一期
  204. this.getSymptomList()
  205. // 二期
  206. // this.form.department = ''
  207. // this.getDepartmentList()
  208. this.clearData()
  209. },
  210. clearData() {
  211. this.leftTagsList = [];
  212. this.rightTagsList = [];
  213. this.selectLeftTagsList = [];
  214. this.selectRightTagIndex = -1;
  215. },
  216. selectLeftTag(tag, index, e) {
  217. const hasTag = this.isHasTag(tag, this.selectLeftTagsList)
  218. if (hasTag) {
  219. this.selectLeftTagsList = this.selectLeftTagsList.filter(item => item.id !== tag.id)
  220. } else {
  221. this.selectLeftTagsList.push(tag);
  222. }
  223. },
  224. selectRightTag(index) {
  225. this.selectRightTagIndex = this.selectRightTagIndex === index ? -1 : index
  226. },
  227. toRightList(){
  228. this.rightTagsList.push(...this.selectLeftTagsList);
  229. this.selectLeftTagsList = [];
  230. this.selectRightTagIndex = -1;
  231. this.getSymptomList()
  232. },
  233. toLeftList(){
  234. if(this.selectRightTagIndex == -1) {
  235. return
  236. }
  237. this.rightTagsList.splice(this.selectRightTagIndex, 1)
  238. this.selectLeftTagsList = [];
  239. this.selectRightTagIndex -= 1;
  240. this.getSymptomList()
  241. },
  242. toUp(){
  243. if(this.selectRightTagIndex === 0 || this.selectRightTagIndex === -1) {
  244. return
  245. }
  246. const tempItem = this.rightTagsList[this.selectRightTagIndex]
  247. this.rightTagsList.splice(this.selectRightTagIndex, 1)
  248. this.rightTagsList.splice(this.selectRightTagIndex-1, 0,tempItem)
  249. this.selectRightTagIndex -= 1
  250. },
  251. toDown(){
  252. if(this.selectRightTagIndex === this.rightTagsList.length-1 || this.selectRightTagIndex === -1) {
  253. return
  254. }
  255. const tempItem = this.rightTagsList[this.selectRightTagIndex]
  256. this.rightTagsList.splice(this.selectRightTagIndex, 1)
  257. this.rightTagsList.splice(this.selectRightTagIndex+1, 0,tempItem)
  258. this.selectRightTagIndex += 1
  259. },
  260. isHasTag(item, arr) {
  261. for ( let i = 0; i <arr.length; i++) {
  262. if(arr[i].id === item.id) {
  263. return true;
  264. }
  265. }
  266. return false;
  267. },
  268. getStyle(item){ //左侧选中状态
  269. return this.isHasTag(item, this.selectLeftTagsList)
  270. },
  271. getStyle2(item) {
  272. return this.isHasTag(item, this.selectRightTagsList)
  273. },
  274. submitForm(formName) {
  275. if(this.isDetail) {
  276. this.$router.push({
  277. path:'/admin/LT-YXSJWH-CJZZWH'
  278. })
  279. return;
  280. }
  281. const valided = this.$refs[formName].validate((valid, callback) => {
  282. if (valid) {
  283. return
  284. } else {
  285. console.log('error submit!!');
  286. return false;
  287. }
  288. });
  289. if(!this.form.department || !this.form.type) {
  290. return
  291. }
  292. if(this.rightTagsList.length === 0) {
  293. this.warning('请选择常见选项标签')
  294. return
  295. }
  296. this.showDelDialog()
  297. },
  298. showDelDialog() {
  299. let questionId = []
  300. for (let i =0; i < this.rightTagsList.length; i++) {
  301. questionId.push(this.rightTagsList[i].id)
  302. }
  303. const param ={
  304. "deptId": this.form.department,
  305. "questionId": questionId,
  306. "type": this.form.type,
  307. }
  308. this.showConfirmDialog('是否保存常见选项内容?', () => {
  309. api.addCommonSymptom(param).then((res) => {
  310. if (res.data.code === '0') {
  311. this.warning(res.data.msg || '保存成功', 'success','1000')
  312. setTimeout(() => {
  313. this.$router.push({
  314. path:'/admin/LT-YXSJWH-CJZZWH'
  315. })
  316. }, 1000);
  317. } else {
  318. this.warning(res.data.msg)
  319. }
  320. }).catch((err) => {
  321. this.warning(err);
  322. })
  323. });
  324. },
  325. showConfirmDialog(msg, resolve) {
  326. this.$alert(msg, '提示', {
  327. confirmButtonText: '确定',
  328. type: 'warning'
  329. }).then(() => {
  330. resolve();
  331. }).catch(() => {});
  332. },
  333. warning(msg, type,time) {
  334. this.$message({
  335. showClose: true,
  336. message: msg,
  337. type: type || 'warning',
  338. duration:time || '3000'
  339. })
  340. },
  341. }
  342. }
  343. </script>
  344. <style lang="less">
  345. @import '../../less/common.less';
  346. .addCommonSymptomWrapper {
  347. .groupTitle {
  348. background-color: #fff;
  349. height: 40px;
  350. line-height: 40px;
  351. padding-left: 20px;
  352. }
  353. .addDepartForm {
  354. background-color: #fff;
  355. padding: 20px;
  356. margin: 20px 20px 0px 20px;
  357. }
  358. .symptomList {
  359. background-color: #fff;
  360. padding: 20px;
  361. margin: 20px 20px 0px 20px;
  362. height: 500px;
  363. }
  364. .bottomPartLeft {
  365. width: 32%;
  366. }
  367. .symptomPoolTitle {
  368. height: 40px;
  369. line-height: 40px;
  370. }
  371. .symptomPool {
  372. width: 100%;
  373. }
  374. .tagList {
  375. width: 100%;
  376. height: 300px;
  377. border: 1px solid @icssBorder;
  378. box-sizing: border-box;
  379. }
  380. .tagList {
  381. border: 1px solid @icssBorder;
  382. }
  383. .tagPool {
  384. height: 300px;
  385. overflow-y: auto;
  386. }
  387. .tagItem {
  388. position: relative;
  389. line-height: 30px;
  390. cursor: pointer;
  391. padding: 0 10px;
  392. }
  393. .tagName:before {
  394. content: '['
  395. }
  396. .tagName::after {
  397. content: ']'
  398. }
  399. .bottomPartMid {
  400. width: 8%;
  401. margin-top: 60px;
  402. p {
  403. width: 100%;
  404. text-align: center;
  405. span {
  406. cursor: pointer;
  407. display: inline-block;
  408. width: 30px;
  409. height: 40px;
  410. line-height: 40px;
  411. margin: 0 auto;
  412. border: 1px solid @icssBorder;
  413. margin-bottom: 15px;
  414. font-size: 18px;
  415. }
  416. }
  417. }
  418. .bottomPartRight {
  419. width: 32%;
  420. }
  421. .operationPool {
  422. position: relative;
  423. width: 100%;
  424. height: 340px;
  425. padding: 10px 0;
  426. overflow-y: auto;
  427. }
  428. .btn {
  429. position: relative;
  430. background-color: #fff;
  431. margin: 0px 20px;
  432. padding: 20px;
  433. .el-button {
  434. position: absolute;
  435. right: 20px;
  436. top: -20px;
  437. }
  438. }
  439. .selectDepart {
  440. }
  441. }
  442. </style>