PubIndeptQa.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. <template>
  2. <div class="PubTagGroupWrapper"
  3. @click="closeNameLis(1)"
  4. >
  5. <el-form
  6. class="groups"
  7. :rules="rules"
  8. ref="groups"
  9. :model="form"
  10. label-width="150px"
  11. >
  12. <el-form-item
  13. label="选择归属:"
  14. prop="region1"
  15. >
  16. <span class="changeTips">改变归属后,填写单明细将会恢复到默认状态</span>
  17. <el-select
  18. v-model="form.region1"
  19. placeholder="请选择归属"
  20. :disabled="!!editData.id"
  21. @change="readyChangeSelect(1)"
  22. >
  23. <el-option
  24. v-for="item in Adscriptions"
  25. :label="item.name"
  26. :value="item.val"
  27. :key="item.val"
  28. ></el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item
  32. label="选择类型:"
  33. prop="region2">
  34. <span class="changeTips">改变类型后,填写单明细将会恢复到默认状态</span>
  35. <el-select
  36. v-model="form.region2"
  37. placeholder="请选择类型"
  38. :disabled="!!editData.id || !form.region1"
  39. @change="readyChangeSelect(2)"
  40. >
  41. <el-option
  42. v-for="item in labelTypes"
  43. :label="item.name"
  44. :value="item.val"
  45. :key="item.val"
  46. ></el-option>
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item
  50. v-if="qaType==2"
  51. :label="'是否为主要内容'"
  52. prop="region12"
  53. >
  54. <el-select
  55. v-model="form.region12"
  56. :disabled="!form.region1||isEdit"
  57. @change="sendData"
  58. >
  59. <el-option
  60. label="是"
  61. value="0"
  62. ></el-option>
  63. <el-option
  64. label="不是"
  65. value="1"
  66. ></el-option>
  67. </el-select>
  68. </el-form-item>
  69. <el-form-item
  70. label="填写单系统名称:"
  71. prop="region3">
  72. <div @click.stop style="display:inline-block;">
  73. <el-input
  74. v-model="form.region3"
  75. :disabled="!form.region1"
  76. placeholder="请输入填写单系统名称"
  77. @change="sendData"
  78. @input="focusSystemName"></el-input>
  79. <ul class="systemNames"
  80. v-if="isNeedSearch&&systemNameShow">
  81. <li v-for="item in systemNameLis"
  82. class="ellipsis"
  83. :key="item.conceptId"
  84. @click="pushSystemName(item.name)">{{item.name}}</li>
  85. </ul>
  86. </div>
  87. <span class="changeTips changeTipsName">
  88. 当为症状时,填写单系统名称需要与医学标准术语内容相对应,如果没有可以先在医学标准术语中建立相关信息!未建立相关信息可能会影响系统使用!
  89. </span>
  90. </el-form-item>
  91. <el-form-item
  92. :label="qaType==2?'填写单医生界面展示标准内容:':'填写单界面描述名称:'"
  93. prop="region4"
  94. >
  95. <el-input
  96. :disabled="!form.region1"
  97. v-model="form.region4"
  98. :placeholder="qaType==2?'请输入填写单医生界面展示标准内容':'请输入填写单界面描述名称'"
  99. @change="sendData"
  100. ></el-input>
  101. </el-form-item>
  102. <el-form-item v-if="qaType =='1'&& form.region1 == '1' && form.region2 != '4'">
  103. <span
  104. v-if="qaType =='1' && form.region1 == '1' && form.region2 != '4'"
  105. >
  106. <el-checkbox v-model="form.required" label="必填" true-label="1" false-label="0" @change="sendData"></el-checkbox>
  107. </span>
  108. <span
  109. class = "flagBox"
  110. v-if="qaType =='1' &&form.region1=='1'&&form.region2=='1'"
  111. >
  112. <el-checkbox v-model="form.specFlag" label="拼接到主诉" true-label="1" false-label="0" @change="sendData"></el-checkbox>
  113. </span>
  114. </el-form-item>
  115. <el-form-item
  116. v-if="qaType==2"
  117. label="填写单患者界面展示通俗内容:"
  118. prop="region5"
  119. >
  120. <el-input
  121. :disabled="!form.region1"
  122. v-model="form.region5"
  123. placeholder="请输入填写单患者界面展示通俗内容"
  124. @change="sendData"
  125. ></el-input>
  126. </el-form-item>
  127. <el-form-item
  128. label="性别:"
  129. prop="region7"
  130. >
  131. <span class="changeTips">改变性别后,填写单明细将会恢复到默认状态</span>
  132. <el-select
  133. v-model="form.region7"
  134. :disabled="!!editData.id || !form.region1"
  135. @change="readyChangeSelect(3)"
  136. >
  137. <el-option
  138. label="通用"
  139. value="3"
  140. ></el-option>
  141. <el-option
  142. label="男"
  143. value="1"
  144. ></el-option>
  145. <el-option
  146. label="女"
  147. value="2"
  148. ></el-option>
  149. </el-select>
  150. </el-form-item>
  151. <el-form-item
  152. label="年龄:"
  153. prop="region8"
  154. class="ages"
  155. >
  156. <el-input
  157. v-model.number="form.region8"
  158. :disabled="!form.region1"
  159. type="number"
  160. ref="valage1"
  161. @input="sendData"
  162. ></el-input>
  163. </el-form-item> ~
  164. <el-form-item
  165. prop="region9"
  166. class="ages maxAges"
  167. >
  168. <el-input
  169. v-model.number="form.region9"
  170. :disabled="!form.region1"
  171. type="number"
  172. ref="valage2"
  173. @input="sendData"
  174. ></el-input>
  175. </el-form-item>
  176. <el-form-item label="填写单图片内容:"
  177. v-if="qaType==1&&form.region2!=4"
  178. prop="region13">
  179. <el-upload
  180. :class="form.region13?'upload-hide':''"
  181. :limit="1"
  182. :action="uploadUrl"
  183. list-type="picture"
  184. :file-list="imgList"
  185. :show-file-list="showFileList"
  186. :on-remove="handleRemove"
  187. :on-success="handleSuccess"
  188. :on-error="handleError"
  189. accept="image/*"
  190. name="upfile">
  191. <el-button slot="trigger" size="small" type="primary">上传图片</el-button>
  192. </el-upload>
  193. </el-form-item>
  194. <el-form-item
  195. v-if="qaType==2&&form.region1=='1'&&form.region2=='4'"
  196. label="医学教育说明:"
  197. prop="explains"
  198. >
  199. <el-input type="textarea" @input="sendData" v-model="form.explains" maxLength ='100' style="width: 500px;"></el-input>
  200. </el-form-item>
  201. </el-form>
  202. </div>
  203. </template>
  204. <script>
  205. import api from '@api/preTreat.js';
  206. import utils from '@api/utils.js';
  207. import config from '@api/config.js';
  208. /**
  209. * titlePar 顶部显示左(有默认值可不填)
  210. * titleSub 顶部显示右(有默认值可不填)
  211. * form 当前页面传到父组件的数据(region10,region11暂时不用)
  212. * submitForm 基本信息验证必填项
  213. * validatePass 基本信息必填项验证成功回调
  214. * 父组件根据form.region2改变底部组件操作项
  215. */
  216. // 归属和填写单类型限制:
  217. // 症状情况(val:1):单选(val:1)、多选(val:2)、多列填写(val:3)、输入框(val:6)、数字输入框(val:7)、文本域(val:5)
  218. // 诊疗情况(val:51):单选(val:1)、多选(val:2)、多列填写(val:3)、输入框(val:6)、数字输入框(val:7)、文本域(val:5)、上传图片(val:4)
  219. // 其他史(val:3):单选(val:1)、多选(val:2)、多列填写(val:3)、输入框(val:6)、数字输入框(val:7)、文本域(val:5)
  220. // 补充内容(val:52):单选(val:1)、多选(val:2)、多列填写(val:3)、输入框(val:6)、数字输入框(val:7)、文本域(val:5)
  221. export default {
  222. props:['editData','qaType','isEdit','isCopy'], //qaType:独立1/组合2填写单
  223. data() {
  224. var validatePass1 = (rule, value, callback) => {
  225. this.validateSystomName(value,callback,1)
  226. };
  227. var validateNameLength = (value,callback,type)=>{
  228. const limit = (type===2||type===3)&&(this.qaType==2&&this.form.region1==1)?7:30;
  229. let name = '';
  230. switch (type){
  231. case 1:
  232. name='系统名称';
  233. break;
  234. case 2:
  235. name=this.qaType==1?'界面描述名称':'医生界面标准内容';
  236. break;
  237. case 3:
  238. name='患者界面通俗内容';
  239. break;
  240. }
  241. if(value.length>limit){
  242. callback(new Error(name+'不能超过'+limit+'个字'));
  243. }
  244. };
  245. var validatePass2 = (rule, value, callback) => {
  246. const editData = this.$props.editData;
  247. if(editData.id && value == editData.tagName){ //修改系统名称没变就不再校验
  248. callback();
  249. }else{
  250. validateNameLength(value,callback,1);
  251. this.validateSystomName(value,callback,2);
  252. }
  253. };
  254. var validatePass11 = (rule, value, callback) => {
  255. validateNameLength(value,callback,2);
  256. this.validateSystomName(value,callback,11)
  257. };
  258. var validatePass12 = (rule, value, callback) => {
  259. validateNameLength(value,callback,3);
  260. this.validateSystomName(value,callback,1)
  261. };
  262. var validateLength = (rule, value, callback) => {
  263. if(value.length>29){
  264. callback(new Error('不能超过30字'));
  265. }else{
  266. callback();
  267. }
  268. };
  269. var validateNum = (rule, value, callback)=>{
  270. if(value<0||(''+value).indexOf('.')>-1){
  271. callback(new Error('请输入正整数'));
  272. }else{
  273. callback();
  274. }
  275. };
  276. return {
  277. form: {
  278. region1: '', //归属
  279. region2: '', //填写单类型
  280. region3: '', //系统名称
  281. region4: '', //医生界面名称
  282. region5: '', //患者界面名称
  283. region6: '', //填写单界面描述问题名称
  284. region7: '3', //性别
  285. region8: '0', //最小年龄
  286. region9: '200', //最大年龄
  287. region12: '0', //是否为主要内容
  288. region13:'', //上传图片
  289. specFlag:'0', //拼接到主诉
  290. required: '0', //必填
  291. },
  292. //isNeedSearch: false, //是否需要查询(系统名称)
  293. imgList:[],
  294. showFileList:false,
  295. uploadUrl:config.urls.uploadImg, //图片上传地址
  296. labelTypesMaps: { // 归属和填写单类型限制
  297. '1':['1','2','3','5','6','7','8'], //症状情况
  298. '51':['1','2','3','4','5','6','7'], //诊疗情况
  299. '3':['1','2','3','5','6','7'], //其他史
  300. '52':['1','2','3','5','6','7'] //补充内容
  301. },
  302. combinLabelMaps:{
  303. '1':['4'], //症状情况
  304. '51':['4','6'], //诊疗情况
  305. '3':['4','6'], //其他史
  306. '52':['4','6'] //补充内容
  307. },
  308. rules: {
  309. region1: [
  310. { required: true, message: '请选择归属', trigger: 'change' }
  311. ],
  312. region2: [
  313. { required: true, message: '请选择类型', trigger: 'change' }
  314. ],
  315. region3: [
  316. { required: true, message: '请输入填写单系统名称', trigger: 'change' },
  317. { validator: validatePass2, trigger: 'blur' },
  318. ],
  319. region4: [
  320. { required: true, message: '请输入填写单医生界面名称', trigger: 'change' },
  321. { validator: validatePass11, trigger: 'blur' },
  322. ],
  323. region5: [
  324. { required: true, message: '请输入填写单患者界面名称', trigger: 'change' },
  325. { validator: validatePass12, trigger: 'blur' },
  326. ],
  327. region6: [
  328. { required: true, message: '请输入填写单界面描述名称', trigger: 'change' },
  329. { validator: validatePass1, trigger: 'blur' },
  330. ],
  331. region7: [
  332. { required: true, message: '请选择性别', trigger: 'change' }
  333. ],
  334. region8: [
  335. { required: true, message: '请输入最小年龄', trigger: 'change' },
  336. { validator: validateNum, trigger: 'blur' },
  337. ],
  338. region9: [
  339. { required: true, message: '请输入最大年龄', trigger: 'change' },
  340. { validator: validateNum, trigger: 'blur' },
  341. ],
  342. region12: [
  343. { required: true, message: '请选择是否为主要内容', trigger: 'change' }
  344. ],
  345. },
  346. Adscriptions: [],
  347. labelTypes: [],
  348. labelTypesList: [],
  349. systemNameShow: false,//系统名称列表显示
  350. systom:null, //填写单系统名称存在与否
  351. }
  352. },
  353. computed: {
  354. isNeedSearch() {
  355. return this.qaType==2&&this.form.region1==1;
  356. },
  357. },
  358. mounted() {
  359. this.getDropList();
  360. //编辑时赋值
  361. const editData = this.$props.editData;
  362. if(editData.id){
  363. const trans = utils.transPretreatKeys(editData,this.qaType==1);
  364. this.form = Object.assign({},this.form,trans);
  365. if(this.isCopy){ //复制时系统名称界面名称置空
  366. this.form.region3='';
  367. this.form.region4='';
  368. this.form.region5='';
  369. }
  370. const imgUrl = trans.region13;
  371. if(imgUrl){
  372. this.imgList = [{name:'',url:imgUrl.replace('{imageUrlPrefix}',config.imgHost)}];
  373. this.showFileList = true;
  374. }
  375. };
  376. this.$emit('changeVal', this.form, false);
  377. },
  378. /*watch: {
  379. newName(nextVal, prevVal) {
  380. if (this.isNeedSearch && nextVal != prevVal && (this.form.region12 == 0)) {
  381. this.focusSystemName()
  382. }
  383. },
  384. },*/
  385. methods: {
  386. handleRemove(){
  387. this.showFileList=false;
  388. this.form.region13 = '';
  389. this.imgList=[];
  390. },
  391. handleSuccess(response){
  392. if(response.code==='0'){
  393. this.showFileList = true;
  394. this.form.region13 = '{imageUrlPrefix}'+response.data.url;
  395. this.sendData();
  396. }else{
  397. this.imgList = [];
  398. this.showFileList=false;
  399. this.warning(response.msg);
  400. }
  401. },
  402. handleError(err, file, fileList){
  403. this.showFileList=false;
  404. },
  405. getDropList() {
  406. return api.getPreTypeList().then((res) => {
  407. if (res.data.code === '0') {
  408. this.Adscriptions = res.data.data[1];
  409. this.labelTypesList = this.qaType==1?res.data.data[2]:res.data.data[3];
  410. this.labelTypes = this.labelTypesList;
  411. }
  412. })
  413. },
  414. validateSystomName(name,callback,flg) {
  415. if(flg == 1){
  416. let tmpVal = this.form.region5;
  417. if(tmpVal.trim() == ''){
  418. callback(new Error('填写单界面描述名称不能为空'));
  419. }else{
  420. this.form.region5 = tmpVal.trim();
  421. callback();
  422. }
  423. }else if(flg == 2){
  424. let tmpVal = this.form.region3;
  425. if(tmpVal.trim() == ''){
  426. callback(new Error('填写单系统名称不能为空'));
  427. }else{
  428. this.form.region3 = tmpVal.trim();
  429. callback();
  430. }
  431. }else if(flg == 11){
  432. let tmpVal = this.form.region4;
  433. if(tmpVal.trim() == ''){
  434. callback(new Error('填写单医生界面名称不能为空'));
  435. }else{
  436. this.form.region4 = tmpVal.trim();
  437. callback();
  438. }
  439. }
  440. },
  441. sendData() {
  442. this.$emit('changeVal', Object.assign({},this.form), false)
  443. },
  444. readyChangeSelect(type) {
  445. if(type === 1) {
  446. this.initForm();
  447. const maps = this.qaType==1?this.labelTypesMaps:this.combinLabelMaps;
  448. this.labelTypes = this.labelTypesList.filter(item => maps[this.form.region1].includes(item.val));
  449. }
  450. //if(type === 2||type === 3) {
  451. this.sendData();
  452. //}
  453. },
  454. submitForm(formName) {
  455. this.$refs[formName].validate((valid) => {
  456. if (valid) {
  457. this.$emit('validatePass', this.form, false);
  458. } else {
  459. console.log('error submit!!');
  460. return false;
  461. }
  462. });
  463. },
  464. focusSystemName() { //系统名称搜索标准词
  465. if(!this.isNeedSearch){
  466. return;
  467. }
  468. if (this.form.region3.trim() == '') {
  469. this.systemNameShow = false;
  470. this.systemNameLis = [];
  471. return;
  472. }
  473. let params = {
  474. "libType": [1],
  475. "name": this.form.region3
  476. };
  477. api.indexByLexicon(params).then((res) => {
  478. if (res.data.code === '0') {
  479. this.systemNameLis = res.data.data;
  480. if (res.data.data.length > 0) {
  481. this.systemNameShow = true;
  482. } else {
  483. this.systemNameShow = false;
  484. }
  485. }
  486. })
  487. },
  488. pushSystemName(val) {
  489. this.form.region3 = val;
  490. this.systemNameShow = false;
  491. this.sendData();
  492. },
  493. closeNameLis(flg) {
  494. if (flg == 1) {
  495. this.systemNameShow = false;
  496. } else if (flg == 2) {
  497. if (this.systemNameLis.length > 0) {
  498. this.systemNameShow = true;
  499. } else {
  500. this.systemNameShow = false;
  501. }
  502. }
  503. },
  504. warning(msg, type) {
  505. this.$message({
  506. showClose: true,
  507. message: msg,
  508. type: type || 'warning'
  509. })
  510. },
  511. initForm() {
  512. this.form.region2 = '';
  513. this.form.region7 = '3';
  514. this.form.region12 = '0';
  515. this.form.region13 = '';
  516. //this.form.region5 = '';
  517. //this.form.region12 = '1';
  518. },
  519. }
  520. }
  521. </script>
  522. <style lang="less">
  523. .normalVal .el-input{
  524. width: auto;
  525. display: inline-block;
  526. .el-input__inner {
  527. width: 40px;
  528. padding: 0 5px;
  529. }
  530. }
  531. .el-upload-list--picture .el-upload-list__item-name{
  532. display: none;
  533. }
  534. .PubTagGroupWrapper .fix-inp .el-col .el-input__inner{
  535. width: 100%;
  536. display: inline-block;
  537. }
  538. .PubTagGroupWrapper .fix-inp .el-col-4{
  539. text-align: center;
  540. }
  541. .PubTagGroupWrapper .fix-inp .el-col-8{
  542. text-align: center;
  543. }
  544. .groups {
  545. background-color: #fff;
  546. padding: 20px;
  547. margin: 20px 20px -20px 20px;
  548. .el-form-item__content,
  549. .el-input__inner {
  550. height: 30px;
  551. line-height: 30px;
  552. width: 200px;
  553. }
  554. .el-form-item {
  555. margin-bottom: 20px;
  556. }
  557. .el-form-item__error {
  558. width: 200px;
  559. top: 28px;
  560. }
  561. .el-form-item__label {
  562. line-height: 30px;
  563. text-align: left;
  564. }
  565. .el-input__icon {
  566. line-height: 30px;
  567. }
  568. .ages .el-input {
  569. display: inline-block;
  570. width: auto;
  571. .el-input__inner {
  572. width: 40px;
  573. padding: 0 5px;
  574. }
  575. .el-input__inner::-webkit-outer-spin-button,
  576. .el-input__inner::-webkit-inner-spin-button {
  577. -webkit-appearance: none;
  578. }
  579. .el-input__inner[type="number"] {
  580. -moz-appearance: textfield;
  581. }
  582. }
  583. .el-message-box__btns .el-button--default {
  584. color: #606266 !important;
  585. }
  586. }
  587. .el-upload-list{
  588. float: left;
  589. }
  590. .upload-hide .el-upload--picture{
  591. display: none;
  592. }
  593. .flagBox {
  594. margin-left: 20px;
  595. }
  596. </style>