AddCombineFeild.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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. }else{
  168. this.warning("获取枚举信息失败");
  169. }
  170. });
  171. },
  172. searchFiled(index){
  173. this.searchIndex = index
  174. const searchName = this.combineInfoList[index].searchName
  175. if(!searchName){
  176. return
  177. }
  178. if(this.form.hospitalId === ''){
  179. this.warning("请选择所属医院")
  180. return
  181. }
  182. if(this.form.modeId === ''){
  183. this.warning("请选择所属模块")
  184. return
  185. }
  186. const param = {
  187. tagName: searchName,
  188. hospitalId: this.form.hospitalId,
  189. modeId: [this.form.modeId],
  190. tagType: [1]
  191. }
  192. api.getQCName(param).then(res =>{
  193. if(res.data.code == '0'){
  194. this.combineInfoList[index].searchResult = []
  195. this.combineInfoList[index].searchResult.push(...res.data.data)
  196. }
  197. }).catch(e =>{
  198. console.log(e)
  199. })
  200. },
  201. selectSearchFiled(searchItem,index){
  202. this.combineInfoList[index].selectFiled.push(searchItem)
  203. this.searchIndex = -1
  204. this.combineInfoList[index].searchName=""
  205. this.combineInfoList[index].searchResult = []
  206. },
  207. upFiled(index){
  208. let activeIndex = this.combineInfoList[index].activeIndex
  209. if(activeIndex == 0 || activeIndex == -1){
  210. return
  211. }
  212. const current = this.combineInfoList[index].selectFiled[activeIndex]
  213. const currentPre = this.combineInfoList[index].selectFiled[activeIndex-1]
  214. this.combineInfoList[index].selectFiled.splice(activeIndex-1,2,current,currentPre)
  215. this.combineInfoList[index].activeIndex--
  216. },
  217. downFiled(index){
  218. let activeIndex = this.combineInfoList[index].activeIndex
  219. if(activeIndex == this.combineInfoList[index].selectFiled.length -1 || activeIndex == -1){
  220. return
  221. }
  222. const current = this.combineInfoList[index].selectFiled[activeIndex]
  223. const currentNext = this.combineInfoList[index].selectFiled[activeIndex+1]
  224. this.combineInfoList[index].selectFiled.splice(activeIndex,2,currentNext,current)
  225. this.combineInfoList[index].activeIndex++
  226. },
  227. setActiveIndex(index, ii){
  228. let activeIndex = this.combineInfoList[index].activeIndex
  229. if( ii === activeIndex) {
  230. this.combineInfoList[index].activeIndex = -1
  231. } else {
  232. this.combineInfoList[index].activeIndex = ii
  233. }
  234. },
  235. delSelected(ii,index){
  236. this.combineInfoList[index].selectFiled.splice(ii,1)
  237. },
  238. comfirn(form){
  239. /*if(!this.form.name.trim() || !this.form.refreshTime.trim()){
  240. this.$message({
  241. message:'请填写相关内容',
  242. type:'warning'
  243. });
  244. return
  245. }*/
  246. const {hospitalId,modeId,tagName} = this.form
  247. if(!hospitalId){
  248. this.warning("请选择所属医院");
  249. return
  250. }
  251. if(!modeId){
  252. this.warning("请选择所属模块");
  253. return
  254. }
  255. if(!tagName){
  256. this.warning("请输入备注");
  257. return
  258. }
  259. // this.$refs[form].validate((valid) => {
  260. // if (valid) {
  261. let questionMappings = []
  262. const combineInfoList = this.combineInfoList
  263. for(let i = 0; i < combineInfoList.length; i++){
  264. const selectFiledList = combineInfoList[i].selectFiled
  265. for(let j = 0; j < selectFiledList.length; j++){
  266. questionMappings.push({
  267. sonQuestion: selectFiledList[j].id
  268. })
  269. }
  270. }
  271. if(questionMappings.length === 0){
  272. this.warning('请添加组合内容')
  273. return
  274. }
  275. this.form = Object.assign({}, this.form,{questionMappings: questionMappings})
  276. if(this.id && !this.isCopy){//修改
  277. const param = Object.assign({},this.form,{id:this.id})
  278. this.saveDisable = true //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
  279. api.addFieldMatch({questionWrapper:param}).then((res)=>{
  280. if(res.data.code==0){
  281. this.$message({
  282. message:"修改成功",
  283. type:'success'
  284. });
  285. //返回带搜索条件的首页
  286. this.$router.push({
  287. name: 'CombineFeild',
  288. params: Object.assign({}, this.$route.params, {currentPage: 1})
  289. });
  290. }else{
  291. this.$message({
  292. message:res.data.msg,
  293. type:'warning'
  294. });
  295. }
  296. this.saveDisable = false
  297. })
  298. }else{//添加
  299. const params = Object.assign({},this.form);
  300. this.saveDisable = true; //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
  301. api.addFieldMatch({questionWrapper:params}).then((res)=>{
  302. if(res.data.code==0){
  303. this.$message({
  304. message:"添加成功",
  305. type:'success'
  306. })
  307. this.$router.push({name: 'CombineFeild'});
  308. }else{
  309. this.$message({
  310. message:res.data.msg,
  311. type:'warning'
  312. });
  313. }
  314. this.saveDisable = false
  315. })
  316. }
  317. // } else {
  318. // return false;
  319. // }
  320. // });
  321. },
  322. warning(msg, type,time) {
  323. this.$message({
  324. showClose: true,
  325. message: msg,
  326. type: type || 'warning',
  327. duration:time || '3000'
  328. })
  329. },
  330. }
  331. }
  332. </script>
  333. <style lang="less" scoped>
  334. .content {
  335. background: #fff;
  336. padding: 20px 20px 50px;
  337. color: #545455;
  338. min-width: 980px;
  339. position: relative;
  340. }
  341. .el-form-item{
  342. width: 600px;
  343. }
  344. /deep/.el-input__inner {
  345. height: 30px;
  346. line-height: 30px;
  347. }
  348. .moduleInfoItem{
  349. width: 500px;
  350. min-height: 200px;
  351. padding: 0 50px 0 50px;
  352. border: 1px solid #dcdfe6;
  353. border-radius: 5px;
  354. margin-bottom: 20px;
  355. position: relative;
  356. }
  357. .searchBox{
  358. width: 500px;
  359. position: relative;
  360. }
  361. .searchResultBox{
  362. position: absolute;
  363. width: 500px;
  364. box-sizing: border-box;
  365. max-height: 200px;
  366. overflow-y: auto;
  367. background: #fff;
  368. z-index: 2;
  369. border: 1px solid #48c5d7;
  370. }
  371. .searchItem{
  372. height: 40px;
  373. line-height: 40px;
  374. padding: 0 20px;
  375. cursor: pointer;
  376. overflow: hidden;
  377. white-space: nowrap;
  378. text-overflow: ellipsis;
  379. }
  380. .searchItem:hover{
  381. background-color: #F5F7FA;
  382. }
  383. .selectFiled{
  384. position: relative;
  385. }
  386. .orderBox{
  387. position: absolute;
  388. left: -50px;
  389. top: 50%;
  390. width: 50px;
  391. height: 84px;
  392. margin-top: -42px;
  393. }
  394. .selectFiledBox{
  395. position: relative;
  396. min-height: 120px;
  397. }
  398. .order{
  399. display: inline-block;
  400. width: 30px;
  401. height: 30px;
  402. font-size: 30px;
  403. margin-left: 5px;
  404. border: 1px solid #dcdfe6;
  405. cursor: pointer;
  406. }
  407. .delFiled{
  408. position: absolute;
  409. top: -8px;
  410. right: -6px;
  411. cursor: pointer;
  412. }
  413. .delFiled{
  414. top: -7px;
  415. right: -9px;
  416. }
  417. .filedName{
  418. position: relative;
  419. border: 1px solid #dcdfe6;
  420. border-radius: 4px;
  421. padding: 5px 10px;
  422. }
  423. .activeFiledName{
  424. border: 1px solid #48C5D7;
  425. }
  426. .isRequired::before{
  427. content: '*';
  428. color: #F56C6C;
  429. margin-right: 4px;
  430. float: left;
  431. line-height: 36px;
  432. font-size: 14px;
  433. position: relative;
  434. top: 2px;
  435. }
  436. </style>