PubIndeptQa.vue 19 KB

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