AddCombineFeild.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. <template>
  2. <div>
  3. <crumbs :title="title" :param="$route.params" linkTo="CombineFeild"></crumbs>
  4. <div class="contents">
  5. <div class="content">
  6. <el-form ref="form" :label-position="labelPosition" label-width="118px" :model="form" :rules="rules">
  7. <el-form-item label="所属医院:" prop="hospitalId">
  8. <el-select v-model="form.hospitalId"
  9. placeholder="请选择"
  10. :disabled="isCopy || isEdit"
  11. size="small">
  12. <el-option
  13. v-for="item in hisTypes"
  14. :key="item.val"
  15. :label="item.name"
  16. :value="Number(item.val)">
  17. </el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="所属模块:" prop="modeId">
  21. <el-select v-model="form.modeId"
  22. placeholder="请选择"
  23. :disabled="isCopy || isEdit"
  24. size="small">
  25. <el-option
  26. v-for="item in fieldTypes"
  27. :key="item.val"
  28. :label="item.name"
  29. :value="Number(item.val)">
  30. </el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item label="备注:" prop="tagName">
  34. <el-input type="text" placeholder="请输入备注" v-model.trim="form.tagName"></el-input>
  35. </el-form-item>
  36. <el-form-item label="显示名称:" prop="name">
  37. <el-input type="text" placeholder="请输入显示名称" v-model.trim="form.name"></el-input>
  38. </el-form-item>
  39. <el-form-item label="组合内容:" prop="moduleInfo" class="formItem isRequired">
  40. <div class="moduleInfoItem" v-for="(item,index) in combineInfoList">
  41. <div class="searchBox">
  42. <el-input v-model.trim="item.searchName" placeholder="搜索字段单元" @input="searchFiled(index)">
  43. </el-input>
  44. <ul v-if="searchIndex == index && item.searchResult.length > 0" class="searchResultBox">
  45. <li class="searchItem"
  46. v-for="searchItem in item.searchResult"
  47. :title="searchItem.tagName"
  48. @click="selectSearchFiled(searchItem,index)"
  49. >
  50. {{searchItem.tagName}}
  51. </li>
  52. </ul>
  53. </div>
  54. <div>
  55. <p>已选择字段:</p>
  56. <div class="selectFiledBox">
  57. <div class="orderBox">
  58. <span class="el-icon-arrow-up order" @click="upFiled(index)"></span>
  59. <span class="el-icon-arrow-down order" @click="downFiled(index)"></span>
  60. </div>
  61. <div class="selectFiled" v-for="(it,ii) in item.selectFiled">
  62. <span class="filedName" :class="{activeFiledName: item.activeIndex == ii}" @click="setActiveIndex(index,ii)">{{it.tagName}}
  63. <span class="el-icon-circle-close delFiled" @click="delSelected(ii,index)"></span>
  64. </span>
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. </el-form-item>
  70. <el-button class="disclButn" size="small" type="primary" :disabled = 'saveDisable' @click="comfirn('form')">确定</el-button>
  71. </el-form>
  72. </div>
  73. </div>
  74. </div>
  75. </template>
  76. <script type="text/javascript">
  77. import api from '@api/qualityControl.js';
  78. export default {
  79. name:'FieldMatch',
  80. data(){
  81. return{
  82. // data:{},
  83. list:[],
  84. labelPosition:'left',
  85. isFirst:true,
  86. isEdit: false,
  87. isCopy:false,
  88. title:'组合字段维护-添加组合字段',
  89. form:{
  90. modeId:"",
  91. hospitalId:"",
  92. name:'',
  93. tagType:4, //固定
  94. controlType: 0,
  95. name:'',
  96. val:'',
  97. tagName:'',
  98. addLine:0,
  99. bold:0,
  100. position:0,
  101. retract:0,
  102. casesEntryIds:'',
  103. questionMappings:[]
  104. },
  105. id:null,
  106. rules:{
  107. hospitalId:{ required: true, message: '请选择所属医院', trigger: ['blur', 'change']},
  108. modeId:{ required: true, message: '请选择所属模块', trigger: ['blur', 'change']},
  109. tagName:{ required: true, message: '请输入备注', trigger: ['blur', 'change']},
  110. /*name:[{ required: true, message: '请输入显示名称',trigger: ['blur', 'change'] }],*/
  111. },
  112. saveDisable: false, //保存按钮禁止点击
  113. fieldTypes:[],
  114. hisTypes:[],
  115. searchIndex: -1,
  116. combineInfoList:[
  117. {
  118. searchName:"",
  119. activeIndex: -1,
  120. searchResult:[
  121. ],
  122. selectFiled:[
  123. ]
  124. }
  125. ]
  126. }
  127. },
  128. created(){
  129. this.getAllTypes();
  130. let {isCopy,isEdit,data} = this.$route.params;
  131. if(isEdit || isCopy){
  132. if(isEdit){
  133. this.title='组合字段维护-修改组合字段';
  134. this.id = data.id
  135. this.isEdit = isEdit
  136. }
  137. this.form = Object.assign({},data);
  138. if(isCopy){
  139. this.title='组合字段维护-复制组合字段';
  140. this.isCopy = isCopy
  141. this.form.tagName = ""
  142. this.form.id=""
  143. }
  144. let questionMappings = this.form.questionMapping ||[]
  145. let selectFiled = []
  146. for(let i = 0; i < questionMappings.length; i++){
  147. selectFiled.push(questionMappings[i])
  148. }
  149. this.combineInfoList[0].selectFiled = selectFiled
  150. this.form.questionMapping = []
  151. }
  152. },
  153. methods:{
  154. getAllTypes(){
  155. /*if(localStorage.getItem("qcModuleTypes")){
  156. this.hisTypes = JSON.parse(localStorage.getItem("qcHospitalTypes"));
  157. this.fieldTypes = JSON.parse(localStorage.getItem("qcModuleTypes"));
  158. return ;
  159. }*/
  160. //获取枚举信息
  161. api.getQcTypes().then((res)=>{
  162. if(res.data.code==="0"){
  163. const data = res.data.data;
  164. /*localStorage.setItem("qcFieldTypes",JSON.stringify(data[11]));
  165. localStorage.setItem("qcModuleTypes",JSON.stringify(data[12]));
  166. localStorage.setItem("qcHospitalTypes",JSON.stringify(data[13]));*/
  167. this.hisTypes = data[13];
  168. this.fieldTypes =data[12];
  169. }else{
  170. this.warning("获取枚举信息失败");
  171. }
  172. });
  173. },
  174. searchFiled(index){
  175. this.searchIndex = index
  176. const searchName = this.combineInfoList[index].searchName
  177. if(!searchName){
  178. return
  179. }
  180. if(this.form.hospitalId === ''){
  181. this.warning("请选择所属医院")
  182. return
  183. }
  184. if(this.form.modeId === ''){
  185. this.warning("请选择所属模块")
  186. return
  187. }
  188. const param = {
  189. tagName: searchName,
  190. hospitalId: this.form.hospitalId,
  191. modeId: [this.form.modeId],
  192. tagType: [1]
  193. }
  194. api.getQCName(param).then(res =>{
  195. if(res.data.code == '0'){
  196. this.combineInfoList[index].searchResult = []
  197. this.combineInfoList[index].searchResult.push(...res.data.data)
  198. }
  199. }).catch(e =>{
  200. console.log(e)
  201. })
  202. },
  203. selectSearchFiled(searchItem,index){
  204. this.combineInfoList[index].selectFiled.push(searchItem)
  205. this.searchIndex = -1
  206. this.combineInfoList[index].searchName=""
  207. this.combineInfoList[index].searchResult = []
  208. },
  209. upFiled(index){
  210. let activeIndex = this.combineInfoList[index].activeIndex
  211. if(activeIndex == 0 || activeIndex == -1){
  212. return
  213. }
  214. const current = this.combineInfoList[index].selectFiled[activeIndex]
  215. const currentPre = this.combineInfoList[index].selectFiled[activeIndex-1]
  216. this.combineInfoList[index].selectFiled.splice(activeIndex-1,2,current,currentPre)
  217. this.combineInfoList[index].activeIndex--
  218. },
  219. downFiled(index){
  220. let activeIndex = this.combineInfoList[index].activeIndex
  221. if(activeIndex == this.combineInfoList[index].selectFiled.length -1 || activeIndex == -1){
  222. return
  223. }
  224. const current = this.combineInfoList[index].selectFiled[activeIndex]
  225. const currentNext = this.combineInfoList[index].selectFiled[activeIndex+1]
  226. this.combineInfoList[index].selectFiled.splice(activeIndex,2,currentNext,current)
  227. this.combineInfoList[index].activeIndex++
  228. },
  229. setActiveIndex(index, ii){
  230. let activeIndex = this.combineInfoList[index].activeIndex
  231. if( ii === activeIndex) {
  232. this.combineInfoList[index].activeIndex = -1
  233. } else {
  234. this.combineInfoList[index].activeIndex = ii
  235. }
  236. },
  237. delSelected(ii,index){
  238. this.combineInfoList[index].selectFiled.splice(ii,1)
  239. },
  240. comfirn(form){
  241. /*if(!this.form.name.trim() || !this.form.refreshTime.trim()){
  242. this.$message({
  243. message:'请填写相关内容',
  244. type:'warning'
  245. });
  246. return
  247. }*/
  248. const {hospitalId,modeId,tagName} = this.form
  249. if(!hospitalId){
  250. this.warning("请选择所属医院");
  251. return
  252. }
  253. if(!modeId){
  254. this.warning("请选择所属模块");
  255. return
  256. }
  257. if(!tagName){
  258. this.warning("请输入备注");
  259. return
  260. }
  261. // this.$refs[form].validate((valid) => {
  262. // if (valid) {
  263. let questionMappings = []
  264. const combineInfoList = this.combineInfoList
  265. for(let i = 0; i < combineInfoList.length; i++){
  266. const selectFiledList = combineInfoList[i].selectFiled
  267. for(let j = 0; j < selectFiledList.length; j++){
  268. questionMappings.push({
  269. sonQuestion: selectFiledList[j].id
  270. })
  271. }
  272. }
  273. if(questionMappings.length === 0){
  274. this.warning('请添加组合内容')
  275. return
  276. }
  277. this.form = Object.assign({}, this.form,{questionMappings: questionMappings})
  278. if(this.id && !this.isCopy){//修改
  279. const param = Object.assign({},this.form,{id:this.id})
  280. this.saveDisable = true //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
  281. api.addFieldMatch({questionWrapper:param}).then((res)=>{
  282. if(res.data.code==0){
  283. this.$message({
  284. message:"修改成功",
  285. type:'success'
  286. });
  287. //返回带搜索条件的首页
  288. this.$router.push({
  289. name: 'CombineFeild',
  290. params: Object.assign({}, this.$route.params, {currentPage: 1})
  291. });
  292. }else{
  293. this.$message({
  294. message:res.data.msg,
  295. type:'warning'
  296. });
  297. }
  298. this.saveDisable = false
  299. })
  300. }else{//添加
  301. const params = Object.assign({},this.form);
  302. this.saveDisable = true; //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
  303. api.addFieldMatch({questionWrapper:params}).then((res)=>{
  304. if(res.data.code==0){
  305. this.$message({
  306. message:"添加成功",
  307. type:'success'
  308. })
  309. this.$router.push({name: 'CombineFeild'});
  310. }else{
  311. this.$message({
  312. message:res.data.msg,
  313. type:'warning'
  314. });
  315. }
  316. this.saveDisable = false
  317. })
  318. }
  319. // } else {
  320. // return false;
  321. // }
  322. // });
  323. },
  324. warning(msg, type,time) {
  325. this.$message({
  326. showClose: true,
  327. message: msg,
  328. type: type || 'warning',
  329. duration:time || '3000'
  330. })
  331. },
  332. }
  333. }
  334. </script>
  335. <style lang="less" scoped>
  336. .content {
  337. background: #fff;
  338. padding: 20px 20px 50px;
  339. color: #545455;
  340. min-width: 980px;
  341. position: relative;
  342. }
  343. .el-form-item{
  344. width: 600px;
  345. }
  346. /deep/.el-input__inner {
  347. height: 30px;
  348. line-height: 30px;
  349. }
  350. .moduleInfoItem{
  351. width: 500px;
  352. min-height: 200px;
  353. padding: 0 50px 0 50px;
  354. border: 1px solid #dcdfe6;
  355. border-radius: 5px;
  356. margin-bottom: 20px;
  357. position: relative;
  358. }
  359. .searchBox{
  360. width: 500px;
  361. position: relative;
  362. }
  363. .searchResultBox{
  364. position: absolute;
  365. width: 500px;
  366. box-sizing: border-box;
  367. max-height: 200px;
  368. overflow-y: auto;
  369. background: #fff;
  370. z-index: 2;
  371. border: 1px solid #48c5d7;
  372. }
  373. .searchItem{
  374. height: 40px;
  375. line-height: 40px;
  376. padding: 0 20px;
  377. cursor: pointer;
  378. overflow: hidden;
  379. white-space: nowrap;
  380. text-overflow: ellipsis;
  381. }
  382. .searchItem:hover{
  383. background-color: #F5F7FA;
  384. }
  385. .selectFiled{
  386. position: relative;
  387. }
  388. .orderBox{
  389. position: absolute;
  390. left: -50px;
  391. top: 50%;
  392. width: 50px;
  393. height: 84px;
  394. margin-top: -42px;
  395. }
  396. .selectFiledBox{
  397. position: relative;
  398. min-height: 120px;
  399. }
  400. .order{
  401. display: inline-block;
  402. width: 30px;
  403. height: 30px;
  404. font-size: 30px;
  405. margin-left: 5px;
  406. border: 1px solid #dcdfe6;
  407. cursor: pointer;
  408. }
  409. .delFiled{
  410. position: absolute;
  411. top: -8px;
  412. right: -6px;
  413. cursor: pointer;
  414. }
  415. .delFiled{
  416. top: -7px;
  417. right: -9px;
  418. }
  419. .filedName{
  420. position: relative;
  421. border: 1px solid #dcdfe6;
  422. border-radius: 4px;
  423. padding: 5px 10px;
  424. }
  425. .activeFiledName{
  426. border: 1px solid #48C5D7;
  427. }
  428. .isRequired::before{
  429. content: '*';
  430. color: #F56C6C;
  431. margin-right: 4px;
  432. float: left;
  433. line-height: 36px;
  434. font-size: 14px;
  435. position: relative;
  436. top: 2px;
  437. }
  438. </style>