AddNewRule.vue 16 KB

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