AddNewRule.vue 18 KB

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