AddNewRule.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  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 label="有无子条件:" prop="parHasSub">
  49. <el-select v-model="form.parHasSub"
  50. placeholder="请选择"
  51. size="small">
  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{
  187. this.firstPlace =null;
  188. }
  189. }
  190. },
  191. components:{
  192. SubRulesGroup
  193. },
  194. computed:{
  195. ruleTermCodeStr:function(){
  196. return this.form.parRuleType+"-"+this.form.parLenCode
  197. },
  198. checkFirstPlace:function(){
  199. return this.dict.indexOf(this.ruleTermCodeStr)>-1;
  200. },
  201. showMsg:function(){
  202. return this.ruleTermCodeStr.length>1&&this.msgDict.indexOf(this.ruleTermCodeStr)>-1;
  203. }
  204. },
  205. methods:{
  206. setDict(){
  207. this.dict = localStorage.getItem("zskDicts");
  208. this.msgDict = localStorage.getItem("zskMsgDict");
  209. },
  210. showConfirmDialog(msg,resolve){
  211. this.$alert(msg, '提示', {
  212. confirmButtonText: '确定',
  213. type: 'warning'
  214. }).then(() => {
  215. resolve();
  216. }).catch(() => {});
  217. },
  218. formatGroupDatas(data){
  219. let arr=[];
  220. data.map((it)=>{
  221. if(!arr[it.groupType]){arr[it.groupType]=[];}
  222. if(it.subMaxOperator||it.subMinOperator){
  223. it.dataType='1';
  224. }else if(it.subEqValue){
  225. it.dataType='2';
  226. }
  227. arr[it.groupType].push(it);
  228. });
  229. arr = arr.filter((it)=>{if(it)return it});
  230. return arr;
  231. },
  232. searchConcept(val){
  233. const param = {
  234. excludedConceptIds:[this.form.parRuleType],
  235. libType:this.form.parLenCode,
  236. name:val,
  237. };
  238. api.searchConcept(param).then((res) => {
  239. if (res.data.code == '0') {
  240. const data = res.data.data;
  241. this.conceptList = data;
  242. }
  243. }).catch((error) => {
  244. console.log(error);
  245. });
  246. },
  247. ruleTypeChange(val){ //规则类型选中
  248. this.form.parRuleType=val;
  249. this.form.parLenCode='';
  250. const obj = this.ruleTypeList.find((it)=>it.id===val);//console.log(val)
  251. this.ruleTermTypeList = obj.subMenuList;
  252. this.setInitGroupData();
  253. },
  254. ruleTermChange(val){ //规则术语类型选中
  255. this.form.parLenCode=val;
  256. const obj = this.ruleTermTypeList.find((it)=>it.code===val);
  257. this.form.parLenName=obj.name;
  258. this.baseTypeList = obj.subMenuList;
  259. this.subRuleMaxNum = obj.number;
  260. this.setInitGroupData();
  261. this.form.parHasSub=obj.subMenuList.length?1:0;
  262. },
  263. getTypeList(){
  264. const typeListData = JSON.parse(localStorage.getItem("zskTypesList"));
  265. this.ruleTypeList = typeListData;
  266. },
  267. setInitGroupData(){
  268. this.subGroups = [[{
  269. subDescription:'',
  270. parRuleType:'',
  271. subConceptId:'',
  272. subType:'',
  273. subMaxOperator:'',
  274. subMaxUnit:'',
  275. subMaxValue:'',
  276. subMinOperator:'',
  277. subMinUnit:'',
  278. subMinValue:'',
  279. subEqValue:'',
  280. subLenCode:'',
  281. dataType:'',
  282. }]];
  283. this.form.parConceptId='';//医学标准术语清空
  284. this.conceptList=[]; //下拉列表清空
  285. },
  286. addGroup(){
  287. let temp = {
  288. subDescription:'',
  289. subConceptId:'',
  290. subType:'',
  291. subLenCode:'',
  292. dataType:'',
  293. subMaxOperator:'',
  294. subMaxUnit:'',
  295. subMaxValue:'',
  296. subMinOperator:'',
  297. subMinUnit:'',
  298. subMinValue:'',
  299. subEqValue:'',
  300. };
  301. if(this.checkFirstPlace){
  302. const obj=this.subGroups[0][0];
  303. temp = {
  304. subDescription:obj.subConceptName,
  305. subConceptId:obj.subConceptId,
  306. subConceptName:obj.subConceptName,
  307. subLenCode:this.form.parLenCode,
  308. subLenName: this.form.parLenName,
  309. subLibName: this.form.parlibName,
  310. subType:obj.subType,
  311. dataType:'',
  312. subMaxOperator:'',
  313. subMaxUnit:'',
  314. subMaxValue:'',
  315. subMinOperator:'',
  316. subMinUnit:'',
  317. subMinValue:'',
  318. subEqValue:'',
  319. };
  320. }
  321. this.subGroups.push([temp]);
  322. },
  323. delGroup(i){
  324. this.subGroups.splice(i,1);
  325. },
  326. saveRule(params){
  327. api.saveRule(params).then((res)=>{
  328. if(res.data.code==0){
  329. this.$message({
  330. message:"操作成功",
  331. type:'success'
  332. });
  333. this.$router.push({name: 'ZskRuleManager'});
  334. }else{
  335. this.$message({
  336. message:res.data.msg,
  337. type:'warning'
  338. });
  339. }
  340. })
  341. },
  342. formatGroups(){
  343. let obj = [];
  344. this.subGroups.map((item,i)=>{
  345. item.map((it)=>{
  346. obj.push({...it,groupType:i});
  347. })
  348. });
  349. return obj
  350. },
  351. validateForms(callBack){
  352. this.$refs['form'].validate((valid) => {
  353. if (valid) {
  354. const groupsRef = this.$refs['groups'];
  355. if(!groupsRef||groupsRef.length===0){
  356. callBack();
  357. return;
  358. }
  359. let groupRef=null,goOn=true;
  360. for(let i=0;i<groupsRef.length;i++){
  361. groupRef=groupsRef[i].$refs['group'];
  362. for(let j=0;j<groupRef.length;j++){
  363. groupRef[j].$refs['groupData'].validate((valid)=>{
  364. if(!valid){
  365. goOn=false;
  366. }
  367. })
  368. }
  369. }
  370. if(goOn){
  371. callBack();
  372. }
  373. } else {
  374. return false;
  375. }
  376. });
  377. },
  378. confirm(){
  379. const _this=this;
  380. this.validateForms(function(){
  381. delete _this.form.klRuleByIdSub;
  382. _this.form.klRuleInfoSaveSub = _this.form.parHasSub?_this.formatGroups():undefined;
  383. let params = _this.form;
  384. if(_this.parId){//修改/复制
  385. params = Object.assign({},_this.form,{parId:_this.isCopy?undefined:_this.parId,parStatus:_this.isCopy?1:_this.form.parStatus})
  386. }
  387. console.log(params)
  388. _this.saveRule(params);
  389. });
  390. },
  391. }
  392. }
  393. </script>
  394. <style lang="less">
  395. @import "../../less/admin.less";
  396. .content{
  397. background: #fff;
  398. // padding: 20px 20px 30px;
  399. padding: 20px 20px 50px;
  400. color: #545455;
  401. min-width: 980px;
  402. position: relative;
  403. .tip-text{
  404. color:#F56C6C;
  405. margin-left: 10px;
  406. }
  407. .conceptItem{
  408. padding: 0 10px;
  409. cursor: pointer;
  410. height: 32px;
  411. line-height: 32px;
  412. &:hover{
  413. background: #ebedf1;
  414. }
  415. }
  416. .discDesc{
  417. margin-bottom: 20px;
  418. }
  419. .disclButn{
  420. position: absolute;
  421. right: 80px;
  422. bottom: 10px;
  423. }
  424. }
  425. .add-new-form{
  426. .el-form-item__label{
  427. text-align: right;
  428. }
  429. .addDepartFormItem {
  430. position: relative;
  431. }
  432. .itemList {
  433. position: absolute;
  434. // display: none;
  435. background: #fff;
  436. width: 188px;
  437. max-height: 160px;
  438. border: 1px solid #DCDFE6;
  439. left: 0;
  440. top: 37px;
  441. z-index: 2;
  442. overflow-y: auto;
  443. }
  444. .indexList {
  445. left: 42px;
  446. top: 78px;
  447. }
  448. .el-input__prefix, .el-input__suffix{
  449. /*top:-2px;*/
  450. right: 3px;
  451. }
  452. .el-input--suffix .el-input__inner{
  453. padding-right: 22px;
  454. }
  455. .el-input,.el-input__inner{
  456. width: 190px;
  457. line-height: 32px;
  458. height: 32px;
  459. }
  460. .el-input__icon{
  461. line-height: 32px;
  462. }
  463. }
  464. </style>