AddNewRule.vue 19 KB

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