PubIndeptQa.vue 23 KB

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