AddNewRule.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. <template>
  2. <div>
  3. <crumbs :title="title" :param="$route.params" linkTo="ZskRuleManager"></crumbs>
  4. <div class="contents">
  5. <div class="content">
  6. <el-form ref="form" :label-position="labelPosition" class="add-new-form" label-width="130px" :model="form" :rules="rules">
  7. <el-form-item label="规则名称:" prop="parDescription">
  8. <el-input v-model.trim = "form.parDescription"></el-input>
  9. </el-form-item>
  10. <el-form-item label="规则类型:" prop="parRuleType">
  11. <el-select v-model="form.parRuleType"
  12. placeholder="请选择"
  13. size="small"
  14. @change="ruleTypeChange"
  15. >
  16. <el-option
  17. v-for="item in ruleTypeList"
  18. :key="item.id"
  19. :label="item.name"
  20. :value="item.id">
  21. </el-option>
  22. </el-select>
  23. <span class="tip-text">注:更改规则类型,将会清空已填写的规则内容~</span>
  24. </el-form-item>
  25. <el-form-item label="规则术语类型:" prop="parLenCode">
  26. <el-select v-model="form.parLenCode"
  27. placeholder="请选择"
  28. size="small" @change="ruleTermChange">
  29. <el-option
  30. v-for="item in ruleTermTypeList"
  31. :key="item.id"
  32. :label="item.name"
  33. :value="item.code">
  34. </el-option>
  35. </el-select>
  36. <span class="tip-text">注:更改规则术语类型,将会清空已填写的规则内容~</span>
  37. </el-form-item>
  38. <el-form-item class="addDepartFormItem" label="医学标准术语:" prop="parConceptId">
  39. <el-select clearable filterable remote :remote-method="searchConcept" v-model.trim="form.parConceptId">
  40. <el-option
  41. v-for="item in conceptList"
  42. :key="item.conceptId"
  43. :label="item.conceptName"
  44. :value="item.conceptId">
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item v-if="showHasSub" label="有无子条件:" prop="parHasSub">
  49. <el-select v-model="form.parHasSub"
  50. placeholder="请选择"
  51. size="small" @change="hasSubChange">
  52. <el-option
  53. v-for="item in hasSub"
  54. :key="item.id"
  55. :label="item.name"
  56. :value="item.id">
  57. </el-option>
  58. </el-select>
  59. </el-form-item>
  60. <el-form-item v-if="showMsg" label="附加信息:" prop="parMsg" class="parMsg">
  61. <el-input type="textarea" :rows="3" placeholder="请输入附加信息" v-model.trim="form.parMsg"></el-input>
  62. </el-form-item>
  63. <el-form-item v-if="form.parHasSub===1" label="规则内容:" prop="remind" class="discDesc">
  64. <SubRulesGroup v-for="(group,i) in subGroups"
  65. ref="groups"
  66. :key="i"
  67. :data="group"
  68. :baseTypes="baseTypeList"
  69. :inx="i"
  70. :maxNum="subRuleMaxNum"
  71. :firstPlace="firstPlace"
  72. :isLast="subGroups.length===1"
  73. @addGroup="addGroup"
  74. @delGroup="delGroup"></SubRulesGroup>
  75. </el-form-item>
  76. <el-button class="disclButn" size="small" type="primary" @click="confirm">保存</el-button>
  77. </el-form>
  78. </div>
  79. </div>
  80. </div>
  81. </template>
  82. <script type="text/javascript">
  83. import api from '@api/knowledgeLib.js';
  84. import SubRulesGroup from './SubRulesGroup'
  85. export default {
  86. name:'AddRule',
  87. data(){
  88. return{
  89. labelPosition:'left',
  90. isFirst:true,
  91. isCopy:false,
  92. dict:'', //规则内容固定的类型
  93. msgDict:'', //显示附加信息的类型
  94. title:'规则维护-添加规则',
  95. ruleTermTypeList:[],
  96. ruleTypeList:[],
  97. conceptList:[],
  98. baseTypeList:[],
  99. conceptName:'',
  100. subRuleMaxNum:null, //规则内容中规则的限制个数
  101. firstPlace:null,
  102. subGroups:[[{
  103. subDescription:'',
  104. parRuleType:'',
  105. subConceptId:'',
  106. subType:'',
  107. subMaxOperator:'',
  108. subMaxUnit:'',
  109. subMaxValue:'',
  110. subMinOperator:'',
  111. subMinUnit:'',
  112. subMinValue:'',
  113. subEqValue:'',
  114. subLenCode:'',
  115. dataType:'',
  116. }]],
  117. form:{
  118. parDescription:'',
  119. parRuleType:'',
  120. parConceptId:'',
  121. parlibName:'',
  122. parLenName:'',
  123. parHasSub:undefined,
  124. parLenCode:'',
  125. parMsg:'',
  126. klRuleInfoSaveSub:[],
  127. },
  128. parId:null,
  129. rules:{
  130. parDescription:[{ required: true, message: '请输入规则名称',trigger: ['blur'] },{
  131. validator: (rule,value,callback)=>{
  132. if(value.length>100){
  133. callback(new Error('规则名称不能超过100字'));
  134. }else{
  135. callback();
  136. }}, trigger: 'change'
  137. }],
  138. parRuleType:[{ required: true, message: '请选择规则类型',trigger: ['change'] }],
  139. parLenCode:[{ required: true, message: '请选择规则术语类型',trigger: ['change'] }],
  140. parConceptId:[{ required: true, message: '请输入医学标准术语',trigger: ['blur'] }],
  141. parHasSub:[{ required: true, message: '请选择有无子条件',trigger: ['change'] }],
  142. parMsg:[{ required: true, message: '请输入附加信息',trigger: ['change'] },{
  143. validator: (rule,value,callback)=>{
  144. if(value.length>100){
  145. callback(new Error('附加信息不能超过100字'));
  146. }else{
  147. callback();
  148. }}, trigger: 'change'
  149. }]
  150. },
  151. hasSub:[{name:'有',id:1},{name:'无',id:0},
  152. ]
  153. }
  154. },
  155. created(){
  156. this.getTypeList();
  157. this.setDict();
  158. const param = this.$route.params;
  159. let info = param.data;
  160. if(info){
  161. this.parId = info.parId;
  162. this.isCopy=param.copy;
  163. this.title = "规则维护-"+(this.isCopy?'复制':'修改')+"规则";
  164. this.form=Object.assign({},this.form,info);
  165. this.conceptList=[{conceptName:this.form.parlibName,conceptId:this.form.parConceptId}];
  166. this.subGroups=this.formatGroupDatas(info.klRuleByIdSub);
  167. }
  168. },
  169. watch:{
  170. 'form.parRuleType':function(val){
  171. const obj = this.ruleTypeList.find((it)=>it.id===val);
  172. this.ruleTermTypeList = obj.subMenuList;
  173. },
  174. 'form.parLenCode':function(val){
  175. if(!val){
  176. this.baseTypeList = [];
  177. return ;
  178. }
  179. const obj = this.ruleTermTypeList.find((it)=>it.code===val);
  180. this.baseTypeList = obj.subMenuList;
  181. this.subRuleMaxNum=obj.number;
  182. },
  183. 'form.parConceptId':function(val){
  184. if(val&&this.checkFirstPlace&&this.conceptList) {
  185. this.firstPlace = this.conceptList.find((it) => it.conceptId === val);
  186. this.firstPlace['checkedType']=this.ruleTermCodeStr;
  187. }else if(!val){
  188. this.setInitGroupData();
  189. this.firstPlace =null;
  190. }else{
  191. this.firstPlace =null;
  192. }
  193. }
  194. },
  195. components:{
  196. SubRulesGroup
  197. },
  198. computed:{
  199. ruleTermCodeStr:function(){
  200. return this.form.parRuleType+"-"+this.form.parLenCode
  201. },
  202. checkFirstPlace:function(){
  203. return this.dict.indexOf(this.ruleTermCodeStr)>-1;
  204. },
  205. showMsg:function(){
  206. return this.ruleTermCodeStr.length>1&&this.msgDict.indexOf(this.ruleTermCodeStr)>-1;
  207. },
  208. showHasSub:function(){
  209. return this.subDict.indexOf(this.ruleTermCodeStr)>-1;
  210. }
  211. },
  212. methods:{
  213. hasSubChange(val){
  214. if(val){
  215. this.subGroups = [[{
  216. subDescription:'',
  217. parRuleType:'',
  218. subConceptId:'',
  219. subType:'',
  220. subMaxOperator:'',
  221. subMaxUnit:'',
  222. subMaxValue:'',
  223. subMinOperator:'',
  224. subMinUnit:'',
  225. subMinValue:'',
  226. subEqValue:'',
  227. subLenCode:'',
  228. dataType:'',
  229. }]];
  230. }
  231. },
  232. setDict(){
  233. this.dict = localStorage.getItem("zskDicts");
  234. this.msgDict = localStorage.getItem("zskMsgDict");
  235. this.subDict = localStorage.getItem("zskSubDict");
  236. },
  237. showConfirmDialog(msg,resolve){
  238. this.$alert(msg, '提示', {
  239. confirmButtonText: '确定',
  240. type: 'warning'
  241. }).then(() => {
  242. resolve();
  243. }).catch(() => {});
  244. },
  245. formatGroupDatas(data){
  246. let arr=[];
  247. data.map((it)=>{
  248. if(!arr[it.groupType]){arr[it.groupType]=[];}
  249. if(it.subMaxOperator||it.subMinOperator){
  250. it.dataType='1';
  251. }else if(it.subEqValue){
  252. it.dataType='2';
  253. }
  254. arr[it.groupType].push(it);
  255. });
  256. arr = arr.filter((it)=>{if(it)return it});
  257. return arr;
  258. },
  259. searchConcept(val){
  260. const param = {
  261. excludedConceptIds:[this.form.parRuleType],
  262. libType:this.form.parLenCode,
  263. name:val,
  264. };
  265. api.searchConcept(param).then((res) => {
  266. if (res.data.code == '0') {
  267. const data = res.data.data;
  268. this.conceptList = data;
  269. }
  270. }).catch((error) => {
  271. console.log(error);
  272. });
  273. },
  274. ruleTypeChange(val){ //规则类型选中
  275. this.form.parRuleType=val;
  276. this.form.parLenCode='';
  277. this.form.parMsg="";
  278. const obj = this.ruleTypeList.find((it)=>it.id===val);//console.log(val)
  279. this.ruleTermTypeList = obj.subMenuList;
  280. this.setInitGroupData();
  281. },
  282. ruleTermChange(val){ //规则术语类型选中
  283. this.form.parLenCode=val;
  284. this.form.parMsg="";
  285. const obj = this.ruleTermTypeList.find((it)=>it.code===val);
  286. this.form.parLenName=obj.name;
  287. this.baseTypeList = obj.subMenuList;
  288. this.subRuleMaxNum = obj.number;
  289. this.setInitGroupData();
  290. this.form.parHasSub=obj.subMenuList.length?1:0;
  291. },
  292. getTypeList(){
  293. const typeListData = JSON.parse(localStorage.getItem("zskTypesList"));
  294. this.ruleTypeList = typeListData;
  295. },
  296. setInitGroupData(){
  297. this.subGroups = [[{
  298. subDescription:'',
  299. parRuleType:'',
  300. subConceptId:'',
  301. subType:'',
  302. subMaxOperator:'',
  303. subMaxUnit:'',
  304. subMaxValue:'',
  305. subMinOperator:'',
  306. subMinUnit:'',
  307. subMinValue:'',
  308. subEqValue:'',
  309. subLenCode:'',
  310. dataType:'',
  311. }]];
  312. this.form.parConceptId='';//医学标准术语清空
  313. this.conceptList=[]; //下拉列表清空
  314. },
  315. addGroup(){
  316. let temp = {
  317. subDescription:'',
  318. subConceptId:'',
  319. subType:'',
  320. subLenCode:'',
  321. dataType:'',
  322. subMaxOperator:'',
  323. subMaxUnit:'',
  324. subMaxValue:'',
  325. subMinOperator:'',
  326. subMinUnit:'',
  327. subMinValue:'',
  328. subEqValue:'',
  329. };
  330. if(this.checkFirstPlace){
  331. const obj=this.subGroups[0][0];
  332. temp = {
  333. subDescription:obj.subConceptName,
  334. subConceptId:obj.subConceptId,
  335. subConceptName:obj.subConceptName,
  336. subLenCode:this.form.parLenCode,
  337. subLenName: this.form.parLenName,
  338. subLibName: this.form.parlibName,
  339. subType:obj.subType,
  340. dataType:'',
  341. subMaxOperator:'',
  342. subMaxUnit:'',
  343. subMaxValue:'',
  344. subMinOperator:'',
  345. subMinUnit:'',
  346. subMinValue:'',
  347. subEqValue:'',
  348. };
  349. }
  350. this.subGroups.push([temp]);
  351. },
  352. delGroup(i){
  353. //this.subGroups.splice(i,1);
  354. this.$set(this.subGroups,i,null);
  355. },
  356. saveRule(params){
  357. api.saveRule(params).then((res)=>{
  358. if(res.data.code==0){
  359. this.$message({
  360. message:"操作成功",
  361. type:'success'
  362. });
  363. this.$router.push({name: 'ZskRuleManager',params: Object.assign({}, this.$route.params, { currentPage: 1 })});
  364. }else{
  365. this.$message({
  366. message:res.data.msg,
  367. type:'warning'
  368. });
  369. }
  370. })
  371. },
  372. formatGroups(){
  373. let obj = [];
  374. this.subGroups.map((item,i)=>{
  375. item&&item.map((it)=>{
  376. obj.push({...it,groupType:i+1});
  377. })
  378. });
  379. return obj
  380. },
  381. validateForms(callBack){
  382. this.$refs['form'].validate((valid) => {
  383. if (valid) {
  384. const groupsRef = this.$refs['groups'];
  385. if(!groupsRef||groupsRef.length===0){
  386. callBack();
  387. return;
  388. }
  389. let groupRef=null,goOn=true;
  390. for(let i=0;i<groupsRef.length;i++){
  391. groupRef=groupsRef[i].$refs['group'];
  392. for(let j=0;j<groupRef.length;j++){
  393. groupRef[j].$refs['groupData'].validate((valid)=>{
  394. if(!valid){
  395. goOn=false;
  396. }
  397. })
  398. }
  399. }
  400. if(goOn){
  401. callBack();
  402. }
  403. } else {
  404. return false;
  405. }
  406. });
  407. },
  408. confirm(){
  409. const _this=this;
  410. this.validateForms(function(){
  411. delete _this.form.klRuleByIdSub;
  412. _this.form.klRuleInfoSaveSub = _this.form.parHasSub?_this.formatGroups():undefined;
  413. let params = _this.form;
  414. if(_this.parId){//修改/复制
  415. params = Object.assign({},_this.form,{parId:_this.isCopy?undefined:_this.parId,parStatus:_this.isCopy?1:_this.form.parStatus})
  416. }
  417. console.log(params)
  418. _this.saveRule(params);
  419. });
  420. },
  421. }
  422. }
  423. </script>
  424. <style lang="less">
  425. @import "../../less/admin.less";
  426. .content{
  427. background: #fff;
  428. // padding: 20px 20px 30px;
  429. padding: 20px 20px 50px;
  430. color: #545455;
  431. min-width: 980px;
  432. position: relative;
  433. .tip-text{
  434. color:#F56C6C;
  435. margin-left: 10px;
  436. }
  437. .conceptItem{
  438. padding: 0 10px;
  439. cursor: pointer;
  440. height: 32px;
  441. line-height: 32px;
  442. &:hover{
  443. background: #ebedf1;
  444. }
  445. }
  446. .discDesc{
  447. margin-bottom: 20px;
  448. }
  449. .disclButn{
  450. position: absolute;
  451. right: 80px;
  452. bottom: 10px;
  453. }
  454. }
  455. .add-new-form{
  456. .el-form-item__label{
  457. text-align: right;
  458. }
  459. .addDepartFormItem {
  460. position: relative;
  461. }
  462. .itemList {
  463. position: absolute;
  464. // display: none;
  465. background: #fff;
  466. width: 188px;
  467. max-height: 160px;
  468. border: 1px solid #DCDFE6;
  469. left: 0;
  470. top: 37px;
  471. z-index: 2;
  472. overflow-y: auto;
  473. }
  474. .indexList {
  475. left: 42px;
  476. top: 78px;
  477. }
  478. .el-input__prefix, .el-input__suffix{
  479. /*top:-2px;*/
  480. right: 3px;
  481. }
  482. .el-input--suffix .el-input__inner{
  483. padding-right: 22px;
  484. }
  485. .el-input,.el-input__inner{
  486. width: 190px;
  487. line-height: 32px;
  488. height: 32px;
  489. }
  490. .el-input__icon{
  491. line-height: 32px;
  492. }
  493. }
  494. </style>