AddRecordItem.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. <template>
  2. <div class="addRecordItemWrapper">
  3. <crumbs :title="title" :param="$route.params" minWidth="1370px" 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="ruleType">
  78. <el-select v-model="form.costControl"
  79. placeholder="请选择是否控费:"
  80. >
  81. <el-option
  82. v-for="item in costControlList"
  83. :key="item.val"
  84. :label="item.name"
  85. :value="Number(item.val)">
  86. </el-option>
  87. </el-select>
  88. </el-form-item>
  89. <!-- <el-form-item label="备注:" prop="remark">
  90. <el-input v-model="form.remark" maxlength="200" placeholder="请输入备注"></el-input>
  91. </el-form-item> -->
  92. <el-form-item label="质控形式:" prop="ruleType">
  93. <el-select v-model="form.qcType"
  94. placeholder="请选择质控形式::"
  95. >
  96. <el-option
  97. v-for="item in qcTypeList"
  98. :key="item.val"
  99. :label="item.name"
  100. :value="Number(item.val)">
  101. </el-option>
  102. </el-select>
  103. </el-form-item>
  104. <el-form-item label="备注:" prop="remark">
  105. <el-input v-model="form.remark" maxlength="500" type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="请输入备注"></el-input>
  106. </el-form-item>
  107. <el-form-item label="前置条件:" prop="remark" class="procent">
  108. <el-input v-model="form.precond" maxlength="200" placeholder="请输入前置条件"></el-input>
  109. </el-form-item>
  110. <el-form-item label="医院列表:" prop="hospitalList">
  111. <div>
  112. <el-table
  113. ref="multipleTable"
  114. :data="tableData"
  115. tooltip-effect="light"
  116. style="width: 100%; minWidth:1200px"
  117. @selection-change="handleSelectionChange">
  118. <el-table-column
  119. type="selection"
  120. width="120">
  121. </el-table-column>
  122. <el-table-column
  123. label="医院名称"
  124. prop="hospitalName"
  125. width="240">
  126. </el-table-column>
  127. <el-table-column
  128. prop="name"
  129. label="终末扣分值"
  130. width="120">
  131. <template slot-scope="scope">
  132. <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>
  133. </template>
  134. </el-table-column>
  135. <el-table-column
  136. prop="name"
  137. label="运行扣分值"
  138. width="120">
  139. <template slot-scope="scope">
  140. <el-input class="scoreInp" v-model.trim="scope.row.scoreRun" oninput="if(value.length>5)value=value.slice(0,5)" type="number" placeholder=""></el-input>
  141. </template>
  142. </el-table-column>
  143. <el-table-column
  144. prop="address"
  145. label="提示信息"
  146. width="240"
  147. show-overflow-tooltip>
  148. <template slot-scope="scope">
  149. <el-input class="tipsMsg" v-model.trim="scope.row.tipMsg" maxlength="200" placeholder="请输入提示信息"></el-input>
  150. </template>
  151. </el-table-column>
  152. <el-table-column
  153. prop="address"
  154. label="单项否决"
  155. width="120"
  156. show-overflow-tooltip>
  157. <template slot-scope="scope">
  158. <el-checkbox v-model="scope.row.isReject" :checked="scope.row.isReject=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
  159. </template>
  160. </el-table-column>
  161. <el-table-column
  162. prop="address"
  163. label="终末质控"
  164. width="120"
  165. show-overflow-tooltip>
  166. <template slot-scope="scope">
  167. <el-checkbox v-model="scope.row.isUsed" :checked="scope.row.isUsed=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
  168. </template>
  169. </el-table-column>
  170. <el-table-column
  171. prop="address"
  172. label="运行质控"
  173. width="120"
  174. show-overflow-tooltip>
  175. <template slot-scope="scope">
  176. <el-checkbox v-model="scope.row.isUsedRun" :checked="scope.row.isUsedRun=='1'" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0"></el-checkbox>
  177. </template>
  178. </el-table-column>
  179. </el-table>
  180. </div>
  181. </el-form-item>
  182. <p class="oper">
  183. <el-button style="margin-right: 30px" size="small" type="primary" :style="{'opacity':canSave?1:0.5}" @click="comfirn('form')">确定</el-button>
  184. <el-button size="small" @click="cancel">取消</el-button>
  185. </p>
  186. </el-form>
  187. </div>
  188. </div>
  189. </div>
  190. </template>
  191. <script type="text/javascript">
  192. import api from '@api/records.js';
  193. export default {
  194. name:'AddRecordItem',
  195. data(){
  196. return{
  197. // data:{},
  198. labelPosition:'left',
  199. canSave:true,
  200. /*zybljlList:[
  201. {name:'aaa',content:'333333'},
  202. {name:'vvv',content:'333sa'}
  203. ],*/
  204. modifier:'',
  205. hospitalList:[],
  206. ruleTypeList:[],
  207. devTypeList:[],
  208. accuracyTypeList:[],
  209. costControlList:[],
  210. qcTypeList:[],
  211. caseLIst:[],
  212. hospitalModuleList:[], //医院数据模块列表
  213. title:'质控条目-新增',
  214. form:{
  215. itemName:'',
  216. casesId:'',
  217. itemCode:'',
  218. ruleType:0,
  219. devType:0,
  220. accuracyType:3,
  221. remark:'',
  222. levelNo:'',
  223. precond:'',
  224. hospitalModuleId:'',
  225. costControl:2,
  226. qcType:1
  227. },
  228. tableData:[],
  229. selectHospital:[],
  230. multipleSelection: [],
  231. id:null,
  232. isEdit: false,
  233. rules: {
  234. itemName: [
  235. { required: true, message: ' ', trigger: 'change' }
  236. ],
  237. brbaxx: [
  238. { required: true, message: ' ', trigger: 'change' }
  239. ]
  240. },
  241. }
  242. },
  243. created(){
  244. this.getRuleTypeModule();
  245. let {isEdit, data} = this.$route.params;
  246. const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
  247. this.modifier = userLoginDTO && userLoginDTO.linkman
  248. if(isEdit){
  249. this.title = '质控条目-修改'
  250. this.isEdit = isEdit
  251. this.id = data.id
  252. this.form.itemName = data.name
  253. this.form.ruleType = data.ruleType
  254. this.form.devType = data.devType
  255. this.form.accuracyType = data.accuracyType
  256. this.form.itemCode = data.code
  257. this.form.casesId = data.casesId
  258. this.form.remark = data.remark
  259. // this.form.levelNo = data.levelNo
  260. this.form.hospitalModuleId = data.modeId
  261. this.form.costControl = data.drgs
  262. this.form.qcType = data.type
  263. this.form.precond = data.precond
  264. this.selectHospital = data.getUpdateInfoDetialDTOS || []
  265. }
  266. this.getRecordInpModule()
  267. this.getRecordHopitalList()
  268. this.gethospitalModuleList()
  269. },
  270. methods:{
  271. handleSelectionChange(val) {
  272. this.multipleSelection = val;
  273. },
  274. toggleSelection(rows) {
  275. setTimeout(()=>{
  276. if (rows) {
  277. rows.forEach(row => {
  278. this.$refs.multipleTable.toggleRowSelection(row);
  279. });
  280. } else {
  281. this.$refs.multipleTable.clearSelection();
  282. }
  283. })
  284. },
  285. getIsUsed(row){
  286. if(this.multipleSelection.findIndex(it => it.hospitalId ==row.hospitalId) > -1){
  287. return false
  288. } else{
  289. return true
  290. }
  291. },
  292. changeModule(val){
  293. this.form.itemCode = this.caseLIst.find(item => item.id === val).prefix
  294. },
  295. getRecordHopitalList(){
  296. return api.getRecordHopitalList({}).then((res)=>{
  297. const result = res.data;
  298. if(result.code==0){
  299. this.hospitalList = result.data
  300. const tableData = []
  301. for(let i = 0; i < this.hospitalList.length; i++){
  302. tableData.push({
  303. hospitalId: this.hospitalList[i].id,
  304. hospitalName: this.hospitalList[i].name,
  305. value: '',
  306. tipMsg:'',
  307. isUsed: '0',
  308. isReject:'0',
  309. scoreRun:'',
  310. isUsedRun:'0'
  311. })
  312. }
  313. for(let i = 0; i < this.selectHospital.length; i++){
  314. const selectItem = this.selectHospital[i]
  315. let item = tableData.find(item => item.hospitalName === selectItem.hospitalName)
  316. if(item) {
  317. item.value = selectItem.score
  318. item.tipMsg = selectItem.msg
  319. item.isUsed = selectItem.isUsed
  320. item.isUsedRun = selectItem.isUsedRun
  321. item.isReject = selectItem.isReject
  322. item.scoreRun =selectItem.scoreRun
  323. this.multipleSelection.push(item)
  324. }
  325. }
  326. this.tableData = tableData
  327. this.toggleSelection(this.multipleSelection)
  328. }else{
  329. this.$message({
  330. message:result.msg,
  331. type:'warning',
  332. showClose: true
  333. });
  334. }
  335. })
  336. },
  337. gethospitalModuleList(){
  338. return api.gethospitalModuleList({}).then((res)=>{
  339. const result = res.data;
  340. if(result.code==0){
  341. this.hospitalModuleList = result.data
  342. }else{
  343. this.$message({
  344. message:result.msg,
  345. type:'warning',
  346. showClose: true
  347. });
  348. }
  349. })
  350. },
  351. getRecordInpModule(){
  352. return api.getRecordCases({}).then((res)=>{
  353. const result = res.data;
  354. if(result.code==0){
  355. this.caseLIst = result.data
  356. }else{
  357. this.$message({
  358. message:result.msg,
  359. type:'warning',
  360. showClose: true
  361. });
  362. }
  363. })
  364. },
  365. getRuleTypeModule(){
  366. return api.getRuleTypes({}).then((res)=>{
  367. const result = res.data;
  368. if(result.code==0){
  369. this.ruleTypeList = result.data["14"];
  370. this.devTypeList = res.data.data&&res.data.data["15"]
  371. this.accuracyTypeList = res.data.data&&res.data.data["16"]
  372. this.costControlList = res.data.data&&res.data.data["17"]
  373. this.qcTypeList = res.data.data&&res.data.data["18"]
  374. }else{
  375. this.$message({
  376. message:result.msg,
  377. type:'warning',
  378. showClose: true
  379. });
  380. }
  381. })
  382. },
  383. cancel(){
  384. this.$router.push({
  385. name: 'RecordItemList',
  386. params: Object.assign({}, this.$route.params)
  387. });
  388. },
  389. comfirn(form){
  390. if(!this.canSave){
  391. return
  392. }
  393. this.canSave = false
  394. const {itemName,casesId,itemCode,remark,levelNo,precond,hospitalModuleId,ruleType,devType,accuracyType,costControl,qcType} = this.form
  395. if(!itemName){
  396. this.$message({
  397. message:"请输入条目名称",
  398. type:'warning',
  399. showClose: true
  400. })
  401. this.canSave = true
  402. return
  403. }
  404. if(!itemCode){
  405. this.$message({
  406. message:"请选择所属模块",
  407. type:'warning',
  408. showClose: true
  409. })
  410. this.canSave = true
  411. return
  412. }
  413. let casesEntryHospitals = []
  414. for(let i = 0; i < this.multipleSelection.length; i++){
  415. const item = this.multipleSelection[i]
  416. console.log('item',item)
  417. if(item.value ===''&&item.isUsed =="1"){
  418. this.$message({
  419. message:`请填写${item.hospitalName}终末扣分值`,
  420. type:'warning',
  421. showClose: true
  422. })
  423. this.canSave = true
  424. return
  425. }
  426. if(item.scoreRun ===''&&item.isUsedRun =="1"){
  427. this.$message({
  428. message:`请填写请填写${item.hospitalName}运行扣分值`,
  429. type:'warning',
  430. showClose: true
  431. })
  432. this.canSave = true
  433. return
  434. }
  435. var reg = new RegExp(/^\d+(\.\d)?$/);
  436. if(item.value&&(!reg.test(item.value) || item.value > 100)){
  437. this.$message({
  438. message:'终末扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
  439. type:'warning',
  440. showClose: true
  441. });
  442. this.canSave = true
  443. return
  444. }
  445. if(item.scoreRun&&(!reg.test(item.scoreRun) || item.scoreRun > 100)){
  446. this.$message({
  447. message:'运行扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
  448. type:'warning',
  449. showClose: true
  450. });
  451. this.canSave = true
  452. return
  453. }
  454. if(item.tipMsg ===''){
  455. this.$message({
  456. message:"请填写所选医院提示信息",
  457. type:'warning',
  458. showClose: true
  459. })
  460. this.canSave = true
  461. return
  462. }
  463. casesEntryHospitals.push({
  464. creator: '0',
  465. score: item.value,
  466. remark: '',
  467. modifier:this.modifier,
  468. hospitalId: item.hospitalId,
  469. msg: item.tipMsg,
  470. isUsed: item.isUsed,
  471. isReject: item.isReject,
  472. scoreRun: item.scoreRun,
  473. isUsedRun: item.isUsedRun
  474. })
  475. }
  476. let params = {
  477. id:this.id,
  478. name:itemName,
  479. modeId: hospitalModuleId,
  480. ruleType:ruleType,
  481. devType:devType,
  482. accuracyType:accuracyType,
  483. remark: remark,
  484. code: itemCode,
  485. precond:precond,
  486. casesId: casesId,
  487. casesName: this.caseLIst.find(item => item.id === casesId).name,
  488. modifier:this.modifier,
  489. creator: '0',
  490. casesEntryHospitals:casesEntryHospitals,
  491. drgs:costControl,
  492. type:qcType
  493. }
  494. api.addRecordItem(params).then((res)=>{
  495. this.canSave = true
  496. if(res.data.code==0){
  497. this.$message({
  498. message:this.isEdit?"修改成功":"添加成功",
  499. type:'success',
  500. showClose: true
  501. })
  502. // this.$router.push({path: 'LT-GBBXXWH-BBXXWH'});
  503. this.$router.push({name: 'RecordItemList'});
  504. }else{
  505. this.$message({
  506. message:res.data.msg,
  507. type:'warning',
  508. showClose: true
  509. });
  510. }
  511. }).catch(()=>{
  512. this.canSave = true
  513. })
  514. // return
  515. // if(this.basyid){//修改
  516. // const param = Object.assign({},this.form,{basyid:this.basyid,brzyid:this.brzyid});
  517. // api.saveRecord(param).then((res)=>{
  518. // if(res.data.code==0){
  519. // this.$message({
  520. // message:"修改成功",
  521. // type:'success'
  522. // });
  523. // //返回带搜索条件的首页
  524. // this.$router.push({
  525. // name: 'RecordManager',
  526. // params: Object.assign({}, this.$route.params)
  527. // });
  528. // }else{
  529. // this.$message({
  530. // message:res.data.msg,
  531. // type:'warning'
  532. // });
  533. // }
  534. // })
  535. // }else{//添加
  536. // // 复制时把list多余字段过滤掉,如id等
  537. // const detail = this.list;
  538. // let copyDetail=[];
  539. // let item={};
  540. // if(detail && detail.length>0){
  541. // for(let i=0; i<detail.length; i++){
  542. // item.title = detail[i].title;
  543. // item.description = detail[i].description;
  544. // copyDetail.push(item);
  545. // item={};
  546. // }
  547. // }
  548. // const params = Object.assign({},this.form);
  549. // // api.addVersInfo(this.form).then((res)=>{
  550. // api.saveRecord(params).then((res)=>{
  551. // if(res.data.code==0){
  552. // this.$message({
  553. // message:"添加成功",
  554. // type:'success'
  555. // })
  556. // // this.$router.push({path: 'LT-GBBXXWH-BBXXWH'});
  557. // this.$router.push({name: 'RecordManager'});
  558. // }else{
  559. // this.$message({
  560. // message:res.data.msg,
  561. // type:'warning'
  562. // });
  563. // }
  564. // })
  565. // }
  566. },
  567. }
  568. }
  569. </script>
  570. <style lang="less" scoped>
  571. @import "../../less/admin.less";
  572. .addRecordItemWrapper{
  573. .content{
  574. background: #fff;
  575. padding: 20px 20px 50px;
  576. color: #545455;
  577. min-width: 1350px;
  578. position: relative;
  579. .short-inp{
  580. width: 200px;
  581. }
  582. .sub-title{
  583. font-weight: bold;
  584. font-size: 16px;
  585. margin-bottom: 20px;
  586. }
  587. .oper{
  588. text-align: right;
  589. }
  590. /deep/.el-input{
  591. width: 200px;
  592. .el-input__inner{
  593. border: 1px solid #333;
  594. color: #000;
  595. height: 30px;
  596. line-height: 30px;
  597. }
  598. }
  599. .procent{
  600. /deep/.el-input{
  601. width: 800px;
  602. }
  603. }
  604. /deep/.el-textarea__inner{
  605. border: 1px solid #333;
  606. resize: none;
  607. width: 800px;
  608. }
  609. /deep/.el-form-item{
  610. margin: 20px 0 0 0;
  611. }
  612. // /deep/.el-checkbox__inner{
  613. // border: 1px solid #333;
  614. // }
  615. /deep/.el-table{
  616. min-width: 0;
  617. }
  618. /deep/.el-input.tipsMsg{
  619. .el-input__inner{
  620. width:200px;
  621. height: 30px;
  622. display: inline-block;
  623. }
  624. }
  625. /deep/.scoreInp.el-input{
  626. width:80px;
  627. .el-input__inner{
  628. width:80px;
  629. height: 30px;
  630. display: inline-block;
  631. box-sizing: border-box;
  632. }
  633. }
  634. /deep/.el-table .cell, .el-table th div, .el-table--border td:first-child .cell, .el-table--border th:first-child .cell {
  635. padding: 0;
  636. }
  637. /deep/.el-input input::-webkit-outer-spin-button,
  638. /deep/.el-input input::-webkit-inner-spin-button {
  639. -webkit-appearance: none;
  640. }
  641. /deep/.el-input input[type="number"]{
  642. -moz-appearance: textfield;
  643. line-height: 20px;
  644. }
  645. }
  646. }
  647. </style>