AddRecordItem.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. <template>
  2. <div class="addRecordItemWrapper">
  3. <crumbs :title="title" :param="$route.params" minWidth="1120px" linkTo="RecordItemList"></crumbs>
  4. <div class="contents">
  5. <div class="content">
  6. <el-form :rules="rules" ref="form" :label-position="labelPosition" label-width="125px" class="add-record-form" :model="form">
  7. <el-form-item label="条目名称:" prop="itemName">
  8. <el-input v-model.trim="form.itemName" maxlength="200" placeholder="请输入条目名称"></el-input>
  9. </el-form-item>
  10. <el-form-item label="所属模块:" prop="brbaxx">
  11. <el-select v-model="form.casesId"
  12. placeholder="请选择模块"
  13. @change="changeModule"
  14. >
  15. <el-option
  16. v-for="item in caseLIst"
  17. :key="item.id"
  18. :label="item.name"
  19. :value="item.id">
  20. </el-option>
  21. </el-select>
  22. </el-form-item>
  23. <!-- <el-form-item label="条目编码:" prop="brbarh">
  24. <el-input v-model="form.itemCode" placeholder="请输入条目编码"></el-input>
  25. </el-form-item> -->
  26. <!-- <el-form-item label="层级定义:" prop="remark">
  27. <el-input v-model="form.levelNo" placeholder="请输入层级定义"></el-input>
  28. </el-form-item> -->
  29. <el-form-item label="医院数据模块:" prop="remark">
  30. <el-select v-model="form.hospitalModuleId"
  31. placeholder="请选择医院数据模块"
  32. >
  33. <el-option
  34. v-for="item in hospitalModuleList"
  35. :key="item.id"
  36. :label="item.name"
  37. :value="item.id">
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="条目类型:" prop="ruleType">
  42. <el-select v-model="form.ruleType"
  43. placeholder="请选择条目类型"
  44. >
  45. <el-option
  46. v-for="item in ruleTypeList"
  47. :key="item.val"
  48. :label="item.name"
  49. :value="Number(item.val)">
  50. </el-option>
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item label="开发状态:" prop="ruleType">
  54. <el-select v-model="form.devType"
  55. placeholder="请选择开发状态"
  56. >
  57. <el-option
  58. v-for="item in devTypeList"
  59. :key="item.val"
  60. :label="item.name"
  61. :value="Number(item.val)">
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item label="准确率:" prop="ruleType">
  66. <el-select v-model="form.accuracyType"
  67. placeholder="请选择准确率"
  68. >
  69. <el-option
  70. v-for="item in accuracyTypeList"
  71. :key="item.val"
  72. :label="item.name"
  73. :value="Number(item.val)">
  74. </el-option>
  75. </el-select>
  76. </el-form-item>
  77. <el-form-item label="备注:" prop="remark">
  78. <el-input v-model="form.remark" maxlength="200" placeholder="请输入备注"></el-input>
  79. </el-form-item>
  80. <el-form-item label="前置条件:" prop="remark" class="procent">
  81. <el-input v-model="form.precond" maxlength="200" placeholder="请输入前置条件"></el-input>
  82. </el-form-item>
  83. <el-form-item label="医院列表:" prop="hospitalList">
  84. <div>
  85. <el-table
  86. ref="multipleTable"
  87. :data="tableData"
  88. tooltip-effect="light"
  89. style="width: 100%"
  90. @selection-change="handleSelectionChange">
  91. <el-table-column
  92. type="selection"
  93. width="120">
  94. </el-table-column>
  95. <el-table-column
  96. label="医院名称"
  97. prop="hospitalName"
  98. width="240">
  99. </el-table-column>
  100. <el-table-column
  101. prop="name"
  102. label="扣分值"
  103. width="120">
  104. <template slot-scope="scope">
  105. <el-input class="scoreInp" v-model.trim="scope.row.value" oninput="if(value.length>5)value=value.slice(0,5)" type="number" placeholder=""></el-input>
  106. </template>
  107. </el-table-column>
  108. <el-table-column
  109. prop="address"
  110. label="提示信息"
  111. width="240"
  112. show-overflow-tooltip>
  113. <template slot-scope="scope">
  114. <el-input class="tipsMsg" v-model.trim="scope.row.tipMsg" maxlength="200" placeholder="请输入提示信息"></el-input>
  115. </template>
  116. </el-table-column>
  117. <el-table-column
  118. prop="address"
  119. label="是否启用"
  120. width="120"
  121. show-overflow-tooltip>
  122. <template slot-scope="scope">
  123. <el-checkbox v-model="scope.row.isUsed" :checked="scope.row.isUsed=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
  124. </template>
  125. </el-table-column>
  126. <el-table-column
  127. prop="address"
  128. label="单项否决"
  129. width="120"
  130. show-overflow-tooltip>
  131. <template slot-scope="scope">
  132. <el-checkbox v-model="scope.row.isReject" :checked="scope.row.isReject=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
  133. </template>
  134. </el-table-column>
  135. </el-table>
  136. </div>
  137. </el-form-item>
  138. <p class="oper">
  139. <el-button style="margin-right: 30px" size="small" type="primary" :style="{'opacity':canSave?1:0.5}" @click="comfirn('form')">确定</el-button>
  140. <el-button size="small" @click="cancel">取消</el-button>
  141. </p>
  142. </el-form>
  143. </div>
  144. </div>
  145. </div>
  146. </template>
  147. <script type="text/javascript">
  148. import api from '@api/records.js';
  149. export default {
  150. name:'AddRecordItem',
  151. data(){
  152. return{
  153. // data:{},
  154. labelPosition:'left',
  155. canSave:true,
  156. /*zybljlList:[
  157. {name:'aaa',content:'333333'},
  158. {name:'vvv',content:'333sa'}
  159. ],*/
  160. modifier:'',
  161. hospitalList:[],
  162. ruleTypeList:[],
  163. devTypeList:[],
  164. accuracyTypeList:[],
  165. caseLIst:[],
  166. hospitalModuleList:[], //医院数据模块列表
  167. title:'质控条目-新增',
  168. form:{
  169. itemName:'',
  170. casesId:'',
  171. itemCode:'',
  172. ruleType:'',
  173. devType:[],
  174. accuracyType:[],
  175. remark:'',
  176. levelNo:'',
  177. precond:'',
  178. hospitalModuleId:''
  179. },
  180. tableData:[],
  181. selectHospital:[],
  182. multipleSelection: [],
  183. id:null,
  184. isEdit: false,
  185. rules: {
  186. itemName: [
  187. { required: true, message: ' ', trigger: 'change' }
  188. ],
  189. brbaxx: [
  190. { required: true, message: ' ', trigger: 'change' }
  191. ]
  192. },
  193. }
  194. },
  195. created(){
  196. let {isEdit, data,ruleTypeList,devTypeList,accuracyTypeList} = this.$route.params;
  197. const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
  198. this.modifier = userLoginDTO && userLoginDTO.linkman
  199. this.ruleTypeList=ruleTypeList;
  200. this.devTypeList=devTypeList;
  201. this.accuracyTypeList=accuracyTypeList;
  202. this.devTypeList.shift();
  203. this.accuracyTypeList.shift();
  204. if(isEdit){
  205. this.title = '质控条目-修改'
  206. this.isEdit = isEdit
  207. this.id = data.id
  208. this.form.itemName = data.name
  209. this.form.ruleType = data.ruleType
  210. this.form.devType = data.devType
  211. this.form.accuracyType = data.accuracyType
  212. this.form.itemCode = data.code
  213. this.form.casesId = data.casesId
  214. this.form.remark = data.remark
  215. // this.form.levelNo = data.levelNo
  216. this.form.hospitalModuleId = data.modeId
  217. this.form.precond = data.precond
  218. this.selectHospital = data.getUpdateInfoDetialDTOS || []
  219. }
  220. this.getRecordInpModule()
  221. this.getRecordHopitalList()
  222. this.gethospitalModuleList()
  223. },
  224. methods:{
  225. handleSelectionChange(val) {
  226. this.multipleSelection = val;
  227. },
  228. toggleSelection(rows) {
  229. setTimeout(()=>{
  230. if (rows) {
  231. rows.forEach(row => {
  232. this.$refs.multipleTable.toggleRowSelection(row);
  233. });
  234. } else {
  235. this.$refs.multipleTable.clearSelection();
  236. }
  237. })
  238. },
  239. getIsUsed(row){
  240. if(this.multipleSelection.findIndex(it => it.hospitalId ==row.hospitalId) > -1){
  241. return false
  242. } else{
  243. return true
  244. }
  245. },
  246. changeModule(val){
  247. this.form.itemCode = this.caseLIst.find(item => item.id === val).prefix
  248. },
  249. getRecordHopitalList(){
  250. return api.getRecordHopitalList({}).then((res)=>{
  251. const result = res.data;
  252. if(result.code==0){
  253. this.hospitalList = result.data
  254. const tableData = []
  255. for(let i = 0; i < this.hospitalList.length; i++){
  256. tableData.push({
  257. hospitalId: this.hospitalList[i].id,
  258. hospitalName: this.hospitalList[i].name,
  259. value: '',
  260. tipMsg:'',
  261. isUsed: '0',
  262. isReject:'0'
  263. })
  264. }
  265. for(let i = 0; i < this.selectHospital.length; i++){
  266. const selectItem = this.selectHospital[i]
  267. let item = tableData.find(item => item.hospitalName === selectItem.hospitalName)
  268. if(item) {
  269. item.value = selectItem.score
  270. item.tipMsg = selectItem.msg
  271. item.isUsed = selectItem.isUsed
  272. item.isReject = selectItem.isReject
  273. this.multipleSelection.push(item)
  274. }
  275. }
  276. this.tableData = tableData
  277. this.toggleSelection(this.multipleSelection)
  278. }else{
  279. this.$message({
  280. message:result.msg,
  281. type:'warning',
  282. showClose: true
  283. });
  284. }
  285. })
  286. },
  287. gethospitalModuleList(){
  288. return api.gethospitalModuleList({}).then((res)=>{
  289. const result = res.data;
  290. if(result.code==0){
  291. this.hospitalModuleList = result.data
  292. }else{
  293. this.$message({
  294. message:result.msg,
  295. type:'warning',
  296. showClose: true
  297. });
  298. }
  299. })
  300. },
  301. getRecordInpModule(){
  302. return api.getRecordCases({}).then((res)=>{
  303. const result = res.data;
  304. if(result.code==0){
  305. this.caseLIst = result.data
  306. }else{
  307. this.$message({
  308. message:result.msg,
  309. type:'warning',
  310. showClose: true
  311. });
  312. }
  313. })
  314. },
  315. cancel(){
  316. this.$router.push({
  317. name: 'RecordItemList',
  318. params: Object.assign({}, this.$route.params)
  319. });
  320. },
  321. comfirn(form){
  322. if(!this.canSave){
  323. return
  324. }
  325. this.canSave = false
  326. const {itemName,casesId,itemCode,remark,levelNo,precond,hospitalModuleId,ruleType,devType,accuracyType} = this.form
  327. if(!itemName){
  328. this.$message({
  329. message:"请输入条目名称",
  330. type:'warning',
  331. showClose: true
  332. })
  333. this.canSave = true
  334. return
  335. }
  336. if(!itemCode){
  337. this.$message({
  338. message:"请选择所属模块",
  339. type:'warning',
  340. showClose: true
  341. })
  342. this.canSave = true
  343. return
  344. }
  345. let casesEntryHospitals = []
  346. for(let i = 0; i < this.multipleSelection.length; i++){
  347. const item = this.multipleSelection[i]
  348. if(item.value ===''){
  349. this.$message({
  350. message:"请填写所选医院扣分值",
  351. type:'warning',
  352. showClose: true
  353. })
  354. this.canSave = true
  355. returnxiaoyudengy
  356. }
  357. var reg = new RegExp(/^\d+(\.\d)?$/);
  358. if(!reg.test(item.value) || item.value > 100){
  359. this.$message({
  360. message:'扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
  361. type:'warning',
  362. showClose: true
  363. });
  364. this.canSave = true
  365. return
  366. }
  367. if(item.tipMsg ===''){
  368. this.$message({
  369. message:"请填写所选医院提示信息",
  370. type:'warning',
  371. showClose: true
  372. })
  373. this.canSave = true
  374. return
  375. }
  376. casesEntryHospitals.push({
  377. creator: '0',
  378. score: item.value,
  379. remark: '',
  380. modifier:this.modifier,
  381. hospitalId: item.hospitalId,
  382. msg: item.tipMsg,
  383. isUsed: item.isUsed,
  384. isReject: item.isReject,
  385. })
  386. }
  387. let params = {
  388. id:this.id,
  389. name:itemName,
  390. modeId: hospitalModuleId,
  391. ruleType:ruleType,
  392. devType:devType,
  393. accuracyType:accuracyType,
  394. remark: remark,
  395. code: itemCode,
  396. precond:precond,
  397. casesId: casesId,
  398. casesName: this.caseLIst.find(item => item.id === casesId).name,
  399. modifier:this.modifier,
  400. creator: '0',
  401. casesEntryHospitals:casesEntryHospitals
  402. }
  403. api.addRecordItem(params).then((res)=>{
  404. this.canSave = true
  405. if(res.data.code==0){
  406. this.$message({
  407. message:this.isEdit?"修改成功":"添加成功",
  408. type:'success',
  409. showClose: true
  410. })
  411. // this.$router.push({path: 'LT-GBBXXWH-BBXXWH'});
  412. this.$router.push({name: 'RecordItemList'});
  413. }else{
  414. this.$message({
  415. message:res.data.msg,
  416. type:'warning',
  417. showClose: true
  418. });
  419. }
  420. }).catch(()=>{
  421. this.canSave = true
  422. })
  423. // return
  424. // if(this.basyid){//修改
  425. // const param = Object.assign({},this.form,{basyid:this.basyid,brzyid:this.brzyid});
  426. // api.saveRecord(param).then((res)=>{
  427. // if(res.data.code==0){
  428. // this.$message({
  429. // message:"修改成功",
  430. // type:'success'
  431. // });
  432. // //返回带搜索条件的首页
  433. // this.$router.push({
  434. // name: 'RecordManager',
  435. // params: Object.assign({}, this.$route.params)
  436. // });
  437. // }else{
  438. // this.$message({
  439. // message:res.data.msg,
  440. // type:'warning'
  441. // });
  442. // }
  443. // })
  444. // }else{//添加
  445. // // 复制时把list多余字段过滤掉,如id等
  446. // const detail = this.list;
  447. // let copyDetail=[];
  448. // let item={};
  449. // if(detail && detail.length>0){
  450. // for(let i=0; i<detail.length; i++){
  451. // item.title = detail[i].title;
  452. // item.description = detail[i].description;
  453. // copyDetail.push(item);
  454. // item={};
  455. // }
  456. // }
  457. // const params = Object.assign({},this.form);
  458. // // api.addVersInfo(this.form).then((res)=>{
  459. // api.saveRecord(params).then((res)=>{
  460. // if(res.data.code==0){
  461. // this.$message({
  462. // message:"添加成功",
  463. // type:'success'
  464. // })
  465. // // this.$router.push({path: 'LT-GBBXXWH-BBXXWH'});
  466. // this.$router.push({name: 'RecordManager'});
  467. // }else{
  468. // this.$message({
  469. // message:res.data.msg,
  470. // type:'warning'
  471. // });
  472. // }
  473. // })
  474. // }
  475. },
  476. }
  477. }
  478. </script>
  479. <style lang="less" scoped>
  480. @import "../../less/admin.less";
  481. .addRecordItemWrapper{
  482. .content{
  483. background: #fff;
  484. padding: 20px 20px 50px;
  485. color: #545455;
  486. min-width: 1100px;
  487. position: relative;
  488. .short-inp{
  489. width: 200px;
  490. }
  491. .sub-title{
  492. font-weight: bold;
  493. font-size: 16px;
  494. margin-bottom: 20px;
  495. }
  496. .oper{
  497. text-align: right;
  498. }
  499. /deep/.el-input{
  500. width: 200px;
  501. .el-input__inner{
  502. border: 1px solid #333;
  503. color: #000;
  504. height: 30px;
  505. line-height: 30px;
  506. }
  507. }
  508. .procent{
  509. /deep/.el-input{
  510. width: 800px;
  511. }
  512. }
  513. /deep/.el-form-item{
  514. margin: 20px 0 0 0;
  515. }
  516. // /deep/.el-checkbox__inner{
  517. // border: 1px solid #333;
  518. // }
  519. /deep/.el-table{
  520. min-width: 0;
  521. }
  522. /deep/.el-input.tipsMsg{
  523. .el-input__inner{
  524. width:200px;
  525. height: 30px;
  526. display: inline-block;
  527. }
  528. }
  529. /deep/.scoreInp.el-input{
  530. width:80px;
  531. .el-input__inner{
  532. width:80px;
  533. height: 30px;
  534. display: inline-block;
  535. box-sizing: border-box;
  536. }
  537. }
  538. /deep/.el-table .cell, .el-table th div, .el-table--border td:first-child .cell, .el-table--border th:first-child .cell {
  539. padding: 0;
  540. }
  541. /deep/.el-input input::-webkit-outer-spin-button,
  542. /deep/.el-input input::-webkit-inner-spin-button {
  543. -webkit-appearance: none;
  544. }
  545. /deep/.el-input input[type="number"]{
  546. -moz-appearance: textfield;
  547. line-height: 20px;
  548. }
  549. }
  550. }
  551. </style>