ManageItemBatch.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <template>
  2. <div class="ManageItemBatchWrapper">
  3. <crumbs :title="title" :param="$route.params" linkTo="RecordItemList" minWidth="1210px"></crumbs>
  4. <div class="contents">
  5. <div class="content">
  6. <el-form ref="form" :label-position="labelPosition" label-width="125px" class="add-record-form" >
  7. <el-form-item label="选择医院:" prop="brbaxx">
  8. <el-select v-model="hospitalId"
  9. placeholder="请选择医院"
  10. size="small"
  11. @change="changeHospital">
  12. <el-option
  13. v-for="item in hospitalList"
  14. :key="item.id"
  15. :label="item.name"
  16. :value="item.id">
  17. </el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="条目列表:" prop="hospitalList">
  21. <!-- <el-table
  22. ref="multipleTable"
  23. :data="tableData"
  24. tooltip-effect="light"
  25. style="width: 100%"
  26. @selection-change="handleSelectionChange">
  27. <el-table-column
  28. type="selection"
  29. width="120">
  30. </el-table-column>
  31. <el-table-column
  32. label="医院名称"
  33. prop="hospitalName"
  34. width="240">
  35. </el-table-column>
  36. <el-table-column
  37. prop="name"
  38. label="扣分值"
  39. width="240">
  40. <template slot-scope="scope">
  41. <el-input class="tipsMsg" v-model="scope.row.value" placeholder="请输入扣分值"></el-input>
  42. </template>
  43. </el-table-column>
  44. <el-table-column
  45. prop="address"
  46. label="提示语"
  47. width="240"
  48. show-overflow-tooltip>
  49. <template slot-scope="scope">
  50. <el-input class="tipsMsg" v-model="scope.row.tipMsg" placeholder="请输入提示语"></el-input>
  51. </template>
  52. </el-table-column>
  53. </el-table> -->
  54. <el-collapse v-model="activeLeftNames" @change="handleChange" v-if="caseLIst.length > 0">
  55. <el-collapse-item v-for="(item, index) in caseLIst" :title="item.name" :name="item.id" :key="item.id">
  56. <!-- <el-checkbox-group v-model="checkAllMap[item.remark]" >
  57. <el-checkbox v-for=" casesEntry in item.qcCasesEntry" :label="casesEntry.id" :key="casesEntry.id">{{casesEntry.name}}
  58. <el-input placeholder="请输入扣分值"></el-input>
  59. </el-checkbox>
  60. </el-checkbox-group> -->
  61. <el-table
  62. ref="multipleTable"
  63. :data="item.qcCasesEntry"
  64. tooltip-effect="light"
  65. style="width: 100%"
  66. @selection-change="handleSelectionChange($event,item.remark)">
  67. <el-table-column
  68. type="selection"
  69. width="60">
  70. </el-table-column>
  71. <el-table-column
  72. label="条目编码"
  73. prop="code"
  74. width="120">
  75. </el-table-column>
  76. <el-table-column
  77. label="条目名称"
  78. prop="name"
  79. width="240">
  80. </el-table-column>
  81. <el-table-column
  82. label="医院数据模块"
  83. prop="modeName"
  84. width="120">
  85. </el-table-column>
  86. <el-table-column
  87. prop=""
  88. label="扣分值"
  89. width="120">
  90. <template slot-scope="scope">
  91. <el-input class="scoreInp" oninput="if(value.length>5)value=value.slice(0,5)" v-model.trim="scope.row.score" type="number" placeholder=""></el-input>
  92. </template>
  93. </el-table-column>
  94. <el-table-column
  95. prop="address"
  96. label="提示信息"
  97. width="240"
  98. show-overflow-tooltip>
  99. <template slot-scope="scope">
  100. <el-input class="tipsMsg" v-model.trim="scope.row.msg" placeholder="请输入提示信息"></el-input>
  101. </template>
  102. </el-table-column>
  103. <el-table-column
  104. prop="address"
  105. label="是否启用"
  106. width="120"
  107. show-overflow-tooltip>
  108. <template slot-scope="scope">
  109. <span class="checkUsed" :class="{'active': scope.row.isUsed == 1,'disabled': getDisabled(scope.row,item.remark)}" @click="checkUsed(scope.row,index,scope.$index,item.remark)"></span>
  110. <!-- <el-checkbox v-model="scope.row.isUsed" :value ="scope.row.isUsed" :disabled="getIsUsed(scope.row)" true-label="1" false-label="0">{{scope.row.isUsed}}</el-checkbox> -->
  111. </template>
  112. </el-table-column>
  113. </el-table>
  114. </el-collapse-item>
  115. </el-collapse>
  116. </el-form-item>
  117. <p class="oper">
  118. <el-button style="margin-right: 30px" size="small" type="primary" @click="comfirn('form')">确定</el-button>
  119. <el-button size="small" @click="cancel">取消</el-button>
  120. </p>
  121. </el-form>
  122. </div>
  123. </div>
  124. </div>
  125. </template>
  126. <script type="text/javascript">
  127. import api from '@api/records.js';
  128. import $ from 'jquery';
  129. export default {
  130. name:'ManageItemBatch',
  131. data(){
  132. return{
  133. // data:{},
  134. labelPosition:'left',
  135. /*zybljlList:[
  136. {name:'aaa',content:'333333'},
  137. {name:'vvv',content:'333sa'}
  138. ],*/
  139. hospitalList:[],
  140. caseLIst:[],
  141. sexType:[],
  142. bloodType:[],
  143. rhType:[],
  144. title:'病历条目-批量管理',
  145. hospitalId:'',
  146. tableData:[],
  147. checkAllMap:{
  148. },
  149. multipleSelection: [],
  150. id:null,
  151. activeLeftNames: [],
  152. modifier:''
  153. }
  154. },
  155. created(){
  156. const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
  157. this.modifier = userLoginDTO && userLoginDTO.linkman
  158. this.getRecordHopitalList()
  159. // this.getRecordInpModule()
  160. },
  161. methods:{
  162. toggleSelection(values) {
  163. setTimeout(()=>{
  164. // this.$refs.multipleTable[6].toggleRowSelection(this.caseLIst[6].qcCasesEntry[0]);
  165. // this.$refs.multipleTable[6].toggleRowSelection(this.caseLIst[6].qcCasesEntry[1]);
  166. for(let i = 0; i < values.length; i++){
  167. if(values[i].length > 0){
  168. values[i].forEach(value=>{
  169. const index = this.caseLIst[i].qcCasesEntry.findIndex(item =>item.id === value.id)
  170. this.$refs.multipleTable[i].toggleRowSelection(this.caseLIst[i].qcCasesEntry[index]);
  171. })
  172. }
  173. }
  174. // if (rows) {
  175. // rows.forEach(row => {
  176. // this.$refs.multipleTable.toggleRowSelection(row);
  177. // // console.log('this.$refs.multipleTabl',this.$refs.multipleTable)
  178. // // const domLen = this.$refs.multipleTable.length
  179. // // const values = Object.values(this.checkAllMap)
  180. // // console.log('values,',values)
  181. // // for(let i = 0; i < values.length; i++){
  182. // // if(values[i].length > 0){
  183. // // console.length('aaaaaaaaaaa')
  184. // // this.$refs.multipleTable[i].toggleRowSelection(value[i]);
  185. // // }
  186. // // }
  187. // });
  188. // } else {
  189. // console.log('bbbb')
  190. // const domLen = this.$refs.multipleTabl.length
  191. // for(let i = 0; i < domLen; i++){
  192. // // this.$refs.multipleTable[i].clearSelection();
  193. // }
  194. // }
  195. })
  196. },
  197. checkUsed(row,index,ii,remark){
  198. if(this.getDisabled(row,remark)){
  199. return
  200. }
  201. let isUsed = this.caseLIst[index].qcCasesEntry[ii].isUsed
  202. const caseLIstCopy = JSON.parse(JSON.stringify(this.caseLIst))
  203. if(isUsed == 1){
  204. caseLIstCopy[index].qcCasesEntry[ii].isUsed = 0
  205. }else{
  206. caseLIstCopy[index].qcCasesEntry[ii].isUsed = 1
  207. }
  208. this.caseLIst = caseLIstCopy
  209. const values = Object.values(this.checkAllMap)
  210. this.toggleSelection(values)
  211. },
  212. handleSelectionChange(val,remark) {
  213. this.checkAllMap[remark] = val;
  214. },
  215. getIsUsed(row){
  216. // if(this.multipleSelection.findIndex(it => it.hospitalId ==row.hospitalId) > -1){
  217. // return false
  218. // } else{
  219. // return true
  220. // }
  221. },
  222. getDisabled(row,remark){
  223. const hasChecked = this.checkAllMap[remark].findIndex(item => item.id === row.id) === -1
  224. return hasChecked
  225. },
  226. handleChange(val) {
  227. },
  228. changeHospital(val){
  229. this.getRecordInpModule().then(()=>{
  230. this.getRecordByHospital(val)
  231. }
  232. )
  233. },
  234. getRecordInpModule(){
  235. return api.getRecordInpModule({}).then((res)=>{
  236. const result = res.data;
  237. if(result.code==0){
  238. let caseLIstCopy = result.data
  239. for(let i = 0; i < caseLIstCopy.length; i++){
  240. for(let j = 0; j < caseLIstCopy[i].qcCasesEntry.length; j++){
  241. caseLIstCopy[i].qcCasesEntry[j].isUsed = 0
  242. }
  243. }
  244. this.caseLIst = caseLIstCopy //提醒每项加分值和备注
  245. const checkAllMap = {}
  246. for(let i = 0; i < this.caseLIst.length; i++){
  247. checkAllMap[this.caseLIst[i].remark] = []
  248. }
  249. this.checkAllMap = checkAllMap
  250. }else{
  251. this.$message({
  252. message:result.msg,
  253. type:'warning',
  254. showClose: true
  255. });
  256. }
  257. })
  258. },
  259. getRecordHopitalList(){
  260. return api.getRecordHopitalList({}).then((res)=>{
  261. const result = res.data;
  262. if(result.code==0){
  263. this.hospitalList = result.data
  264. const tableData = []
  265. for(let i = 0; i < this.hospitalList.length; i++){
  266. tableData.push({
  267. hospitalId: this.hospitalList[i].id,
  268. hospitalName: this.hospitalList[i].name,
  269. value: '',
  270. tipMsg:''
  271. })
  272. }
  273. this.tableData = tableData
  274. }else{
  275. this.$message({
  276. message:result.msg,
  277. type:'warning',
  278. showClose: true
  279. });
  280. }
  281. })
  282. },
  283. getRecordByHospital(hospitalId){
  284. const param = {
  285. hospitalId: hospitalId
  286. }
  287. return api.getRecordByHospital(param).then((res)=>{
  288. const result = res.data;
  289. if(result.code==0){
  290. this.hospitalItemList = result.data
  291. for (let i = 0; i< this.hospitalItemList.length; i++){
  292. const hospitalItem = this.hospitalItemList[i]
  293. let caseItem = this.caseLIst.find(item =>item.id === hospitalItem.casesId)
  294. for(let j = 0; j < hospitalItem.getAllByHospitalDetialDTOS.length; j++){
  295. const checkedItem = hospitalItem.getAllByHospitalDetialDTOS[j]
  296. let recordItem = caseItem.qcCasesEntry.find(item => item.id === checkedItem.casesEntryId)
  297. recordItem.score = checkedItem.score
  298. recordItem.msg = checkedItem.msg
  299. recordItem.isUsed = checkedItem.isUsed
  300. recordItem.modeName = checkedItem.modeName
  301. this.checkAllMap[caseItem.remark].push(recordItem)
  302. }
  303. }
  304. this.caseLIst = JSON.parse(JSON.stringify(this.caseLIst))
  305. const values = Object.values(this.checkAllMap)
  306. this.toggleSelection(values)
  307. }else{
  308. this.$message({
  309. message:result.msg,
  310. type:'warning',
  311. showClose: true
  312. });
  313. }
  314. })
  315. },
  316. cancel(){
  317. this.$router.push({
  318. name: 'RecordItemList',
  319. params: Object.assign({}, this.$route.params)
  320. });
  321. },
  322. comfirn(form){
  323. if(!this.hospitalId){
  324. this.$message({
  325. message:"请选择医院",
  326. type:'warning',
  327. showClose: true
  328. });
  329. }
  330. const values = Object.values(this.checkAllMap);
  331. let casesEntryHospitals = [],requiredValNull=[],valueTypeWr=[],tempItemIdx={};
  332. $(".el-collapse .wrong").removeClass("wrong");
  333. for(let i = 0; i < values.length; i++){
  334. for(let j = 0; j < values[i].length;j++){
  335. const value = values[i][j];
  336. if(!valueTypeWr.length&&(!value.msg||value.score==="")){
  337. tempItemIdx=this.caseLIst[i].qcCasesEntry.findIndex(item =>item.id === value.id);
  338. requiredValNull.push(value.casesId);
  339. $(".el-collapse .el-collapse-item:eq("+i+") table tr:eq("+(+tempItemIdx+1)+")").addClass("wrong");
  340. }
  341. var reg = new RegExp(/^\d+(\.\d)?$/);
  342. if(!requiredValNull.length&&(!reg.test(value.score) || value.score >100)){
  343. tempItemIdx=this.caseLIst[i].qcCasesEntry.findIndex(item =>item.id === value.id);
  344. $(".el-collapse .el-collapse-item:eq("+i+") table tr:eq("+(+tempItemIdx+1)+")").addClass("wrong");
  345. valueTypeWr.push(value.casesId);
  346. }
  347. let item = {
  348. "casesEntryId": value.id,
  349. "creator": "0",
  350. "hospitalId": this.hospitalId,
  351. "modifier": this.modifier,
  352. "msg": value.msg||"",
  353. "remark": value.remark,
  354. "score": Number(value.score),
  355. "isUsed":value.isUsed||0
  356. }
  357. casesEntryHospitals.push(item)
  358. }
  359. }
  360. if(requiredValNull.length>0){
  361. this.$message({
  362. message:'勾选项扣分值和提示信息不能为空',
  363. type:'warning',
  364. showClose: true
  365. });
  366. this.activeLeftNames = requiredValNull;
  367. return
  368. }else if(valueTypeWr.length>0){
  369. this.$message({
  370. message:'扣分值请输入≥0且≤100的数字,最多保留小数点后1位',
  371. type:'warning',
  372. showClose: true
  373. });
  374. this.activeLeftNames = valueTypeWr;
  375. return
  376. }
  377. let param = {
  378. "casesEntryHospitals": casesEntryHospitals,
  379. "hospitalIds": [
  380. this.hospitalId
  381. ]
  382. }
  383. api.updateRecordByHospital(param).then((res)=>{
  384. if(res.data.code==0){
  385. this.$message({
  386. message:"修改成功",
  387. type:'success',
  388. showClose: true
  389. });
  390. //返回带搜索条件的首页
  391. this.$router.push({
  392. name: 'RecordItemList',
  393. params: Object.assign({}, this.$route.params)
  394. });
  395. }else{
  396. this.$message({
  397. message:res.data.msg,
  398. type:'warning',
  399. showClose: true
  400. });
  401. }
  402. })
  403. return
  404. /*if(!this.form.name.trim() || !this.form.refreshTime.trim()){
  405. this.$message({
  406. message:'请填写相关内容',
  407. type:'warning'
  408. });
  409. return
  410. }*/
  411. /*this.$refs[form].validate((valid) => {
  412. if (valid) {*/
  413. // if(this.basyid){//修改
  414. // const param = Object.assign({},this.form,{basyid:this.basyid,brzyid:this.brzyid});
  415. // api.saveRecord(param).then((res)=>{
  416. // if(res.data.code==0){
  417. // this.$message({
  418. // message:"修改成功",
  419. // type:'success'
  420. // });
  421. // //返回带搜索条件的首页
  422. // this.$router.push({
  423. // name: 'RecordManager',
  424. // params: Object.assign({}, this.$route.params)
  425. // });
  426. // }else{
  427. // this.$message({
  428. // message:res.data.msg,
  429. // type:'warning'
  430. // });
  431. // }
  432. // })
  433. // }else{//添加
  434. // // 复制时把list多余字段过滤掉,如id等
  435. // const detail = this.list;
  436. // let copyDetail=[];
  437. // let item={};
  438. // if(detail && detail.length>0){
  439. // for(let i=0; i<detail.length; i++){
  440. // item.title = detail[i].title;
  441. // item.description = detail[i].description;
  442. // copyDetail.push(item);
  443. // item={};
  444. // }
  445. // }
  446. // const params = Object.assign({},this.form);
  447. // // api.addVersInfo(this.form).then((res)=>{
  448. // api.saveRecord(params).then((res)=>{
  449. // if(res.data.code==0){
  450. // this.$message({
  451. // message:"添加成功",
  452. // type:'success'
  453. // })
  454. // // this.$router.push({path: 'LT-GBBXXWH-BBXXWH'});
  455. // this.$router.push({name: 'RecordManager'});
  456. // }else{
  457. // this.$message({
  458. // message:res.data.msg,
  459. // type:'warning'
  460. // });
  461. // }
  462. // })
  463. // }
  464. /*} else {
  465. return false;
  466. }
  467. });*/
  468. },
  469. }
  470. }
  471. </script>
  472. <style lang="less">
  473. @import "../../less/admin.less";
  474. .ManageItemBatchWrapper{
  475. .content{
  476. background: #fff;
  477. padding: 20px 20px 50px;
  478. color: #545455;
  479. min-width: 1200px;
  480. position: relative;
  481. .short-inp{
  482. width: 200px;
  483. }
  484. .sub-title{
  485. font-weight: bold;
  486. font-size: 16px;
  487. margin-bottom: 20px;
  488. }
  489. .oper{
  490. text-align: right;
  491. }
  492. .checkUsed{
  493. cursor: pointer;
  494. position: relative;
  495. // color: #fff;
  496. display: inline-block;
  497. width: 14px;
  498. height: 14px;
  499. background: #fff;
  500. border: 1px solid #333;
  501. box-sizing: border-box;
  502. border-radius: 2px;
  503. -webkit-transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
  504. transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
  505. }
  506. .active{
  507. position: relative;
  508. // color: #fff;
  509. display: inline-block;
  510. width: 14px;
  511. height: 14px;
  512. background: #48C5D7;
  513. border: 1px solid #333;
  514. box-sizing: border-box;
  515. border-radius: 2px;
  516. -webkit-transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
  517. transition: border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);
  518. }
  519. .wrong td{
  520. border:1px #ff0000 solid;
  521. border-right:none;
  522. border-left:none;
  523. &:last-child{
  524. border-right:1px #ff0000 solid;
  525. }
  526. &:first-child{
  527. border-left:1px #ff0000 solid;
  528. }
  529. }
  530. .active::after{
  531. -webkit-box-sizing: content-box;
  532. box-sizing: content-box;
  533. content: "";
  534. border: 1px solid #FFF;
  535. border-left: 0;
  536. border-top: 0;
  537. height: 7px;
  538. left: 4px;
  539. position: absolute;
  540. top: 1px;
  541. -webkit-transform: rotate(45deg) scaleY(0);
  542. transform: rotate(45deg) scaleY(0);
  543. width: 3px;
  544. -webkit-transition: -webkit-transform .15s ease-in .05s;
  545. transition: -webkit-transform .15s ease-in .05s;
  546. transition: transform .15s ease-in .05s;
  547. transition: transform .15s ease-in .05s, -webkit-transform .15s ease-in .05s;
  548. transition: transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;
  549. -webkit-transform-origin: center;
  550. transform-origin: center;
  551. -webkit-transform: rotate(45deg) scaleY(1);
  552. transform: rotate(45deg) scaleY(1);
  553. }
  554. .active.disabled::after{
  555. -webkit-box-sizing: content-box;
  556. box-sizing: content-box;
  557. content: "";
  558. border: 1px solid #c9cdd5;
  559. border-left: 0;
  560. border-top: 0;
  561. height: 7px;
  562. left: 4px;
  563. position: absolute;
  564. top: 1px;
  565. -webkit-transform: rotate(45deg) scaleY(0);
  566. transform: rotate(45deg) scaleY(0);
  567. width: 3px;
  568. -webkit-transition: -webkit-transform .15s ease-in .05s;
  569. transition: -webkit-transform .15s ease-in .05s;
  570. transition: transform .15s ease-in .05s;
  571. transition: transform .15s ease-in .05s, -webkit-transform .15s ease-in .05s;
  572. transition: transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;
  573. -webkit-transform-origin: center;
  574. transform-origin: center;
  575. -webkit-transform: rotate(45deg) scaleY(1);
  576. transform: rotate(45deg) scaleY(1);
  577. }
  578. .disabled{
  579. cursor: not-allowed;
  580. background-color: #edf2fc;
  581. }
  582. /deep/.el-table__row td:nth-child(3){
  583. text-align: left;
  584. }
  585. /deep/.el-input{
  586. .el-input__inner{
  587. border: 1px solid #333;
  588. color: #000;
  589. }
  590. }
  591. /deep/.el-checkbox__inner{
  592. border: 1px solid #333;
  593. }
  594. /deep/.tipsMsg{
  595. .el-input__inner{
  596. width:200px;
  597. height: 30px;
  598. display: inline-block;
  599. border: 1px solid #333;
  600. color: #000;
  601. }
  602. }
  603. /deep/.el-table .cell, .el-table th div, .el-table--border td:first-child .cell, .el-table--border th:first-child .cell {
  604. padding: 0;
  605. }
  606. /deep/.el-input input::-webkit-outer-spin-button,
  607. /deep/.el-input input::-webkit-inner-spin-button {
  608. -webkit-appearance: none;
  609. }
  610. /deep/.el-input input[type="number"]{
  611. -moz-appearance: textfield;
  612. line-height: 20px;
  613. }
  614. /deep/.scoreInp.el-input{
  615. width:50px;
  616. .el-input__inner{
  617. width:50px;
  618. height: 30px;
  619. display: inline-block;
  620. }
  621. }
  622. }
  623. }
  624. </style>