seimin hai 7 meses
pai
achega
06ce5429a5

+ 1 - 1
proxy.conf.json

@@ -1,6 +1,6 @@
1 1
 {
2 2
   "/service": {
3
-		"target": "http://192.168.3.108",
3
+		"target": "http://192.168.4.105",
4 4
     "logLevel": "debug",
5 5
     "changeOrigin": true,
6 6
     "pathRewrite": {

+ 170 - 0
src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.html

@@ -0,0 +1,170 @@
1
+<div class="modal display_flex justify-content_flex-center align-items_center" *ngIf="show">
2
+  <div class="modalBody" style="width: 1200px;">
3
+    <div class="title">业务数据查看<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <!-- 血制品 -->
6
+      <nz-table *ngIf="type === 'blood'" class="hospitalTable" [nzData]="bloodList" nzSize="middle" [nzShowPagination]="false"
7
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
8
+        <thead>
9
+          <tr class="thead">
10
+            <th nzWidth="5%">序号</th>
11
+            <th nzWidth="13%">患者姓名</th>
12
+            <th nzWidth="11%">患者ID</th>
13
+            <th nzWidth="11%">血液类型</th>
14
+            <th nzWidth="14%">血袋号</th>
15
+            <th nzWidth="11%">取血人</th>
16
+            <th nzWidth="12%">取血时间</th>
17
+            <th nzWidth="11%">接收人</th>
18
+            <th nzWidth="12%">接收时间</th>
19
+          </tr>
20
+        </thead>
21
+        <tbody>
22
+          <tr *ngFor="let data of bloodList;let i = index;">
23
+            <td>{{i+1}}</td>
24
+            <td><span>{{ data.patientName }}<span *ngIf="data.bedNum">({{ data.bedNum }})</span></span></td>
25
+            <td>{{ data.patientNo||'' }}</td>
26
+            <td>{{ data.type ? data.type.name : "" }}</td>
27
+            <td>{{ data.bloodCode||'' }}</td>
28
+            <td>{{ data.arriverDTO?data.arriverDTO.name:'' }}</td>
29
+            <td>{{ data.arriveTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
30
+            <td>{{ data.receiverDTO ? data.receiverDTO.name : '' }}</td>
31
+            <td>{{ data.receiveTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
32
+          </tr>
33
+        </tbody>
34
+      </nz-table>
35
+      <!-- 标本 -->
36
+      <div class="list-template w100" *ngIf="type === 'specimen'">
37
+        <div class="list-template__content">
38
+          <div class="list-template__top" nz-row *ngIf="type === 'specimen'">
39
+            <div nz-col nzXl='24' class="list-template__searchBox">
40
+              <div class="list-template__searchItem">
41
+                <span class="label">标本类型</span>:
42
+                <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch
43
+                  nzPlaceHolder="请选择标本类型" [(ngModel)]="searchCriteria.stype" (ngModelChange)="selectStype($event)">
44
+                  <nz-option *ngFor="let option of specimentTypeList" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
45
+                </nz-select>
46
+              </div>
47
+              <div class="list-template__searchItem">
48
+                <span class="label">检验项目</span>:
49
+                <nz-select style="width: 210px;" class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch
50
+                  nzPlaceHolder="请选择检验项目" [(ngModel)]="searchCriteria.specimenDesc" (ngModelChange)="selectDesc($event)">
51
+                  <nz-option *ngFor="let option of specimenDescList" [nzLabel]="option.nameNum" [nzValue]="option.id"></nz-option>
52
+                </nz-select>
53
+              </div>
54
+            </div>
55
+          </div>
56
+        </div>
57
+      </div>
58
+      <nz-table *ngIf="type === 'specimen'" class="hospitalTable" [nzData]="specimenList" nzSize="middle" [nzShowPagination]="false"
59
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
60
+        <thead>
61
+          <tr class="thead">
62
+            <th nzWidth="4%">序号</th>
63
+            <th nzWidth="8%">申请科室</th>
64
+            <th nzWidth="8%">患者姓名</th>
65
+            <th nzWidth="8%">标本编码</th>
66
+            <th nzWidth="8%">检验项目</th>
67
+            <th nzWidth="8%">标本类型</th>
68
+            <th nzWidth="8%">状态</th>
69
+            <th nzWidth="8%">收取时间</th>
70
+            <th nzWidth="8%">收取人</th>
71
+            <th nzWidth="8%">中转时间</th>
72
+            <th nzWidth="8%">送达时间</th>
73
+            <th nzWidth="8%">送达人</th>
74
+            <th nzWidth="8%">终点科室</th>
75
+          </tr>
76
+        </thead>
77
+        <tbody>
78
+          <tr *ngFor="let data of specimenList;let i = index;">
79
+            <td>{{ (pageIndex - 1) * pageSize + i + 1 }}</td>
80
+            <td>{{ data.sickRoom ? data.sickRoom.dept : "-" }}</td>
81
+            <td>{{ data.patientName}}<span *ngIf="data.bedNum">({{data.bedNum}})</span><br>{{data.residenceNo}}</td>
82
+            <td>{{ data.scode || "-" }}</td>
83
+            <td>{{ data.specimenDesc || "-" }}</td>
84
+            <td>{{ data.stype ? data.stype.name : "-" }}</td>
85
+            <td>{{ data.speState ? data.speState.name : "-" }}</td>
86
+            <td>{{ data.arriveTime || "-" }}</td>
87
+            <td>{{ data.receiverName || "-" }}</td>
88
+            <td>{{ data.transTime || '-' }}</td>
89
+            <td>{{ data.sendTime || '-' }}</td>
90
+            <td>{{ data.delivererName || "-" }}</td>
91
+            <td>
92
+              {{ data.checkDept ? data.checkDept.dept : "-" }}
93
+              <img *ngIf="data.urgent == 1" src="../../assets/images/icon_ji.png" alt="" class="ji" />
94
+            </td>
95
+          </tr>
96
+        </tbody>
97
+      </nz-table>
98
+      <!-- 科室检查率统计 -->
99
+      <nz-table *ngIf="type === 'deptInspectionRateStatistics' || type === 'deptInspectionStatistics'" class="hospitalTable" [nzData]="inspectionRateStatisticsList" nzSize="middle" [nzShowPagination]="false"
100
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
101
+        <thead>
102
+          <tr class="thead">
103
+            <th nzWidth="4%">序号</th>
104
+            <th nzWidth="12%">患者姓名(床号)</th>
105
+            <th nzWidth="12%">检查项目</th>
106
+            <th nzWidth="12%">预约时间</th>
107
+            <th nzWidth="12%">叫号信息</th>
108
+            <th nzWidth="12%">检查科室</th>
109
+            <th nzWidth="12%">检查状态</th>
110
+            <th nzWidth="12%">陪检人</th>
111
+            <th nzWidth="12%">是否临时急查</th>
112
+          </tr>
113
+        </thead>
114
+        <tbody>
115
+          <tr *ngFor="let data of inspectionRateStatisticsList;let i = index;">
116
+            <td>{{ (pageIndex - 1) * pageSize + i + 1 }}</td>
117
+            <td>{{ data.patientName }}<span *ngIf="data.patientBedNum">({{data.patientBedNum}})</span></td>
118
+            <td>{{ data.inspectName}}</td>
119
+            <td>{{ data.yyTime}}</td>
120
+            <td>{{ data.reservationNumber}}</td>
121
+            <td>{{ data.execDept ? data.execDept.dept : '' }}</td>
122
+            <td>{{ data.inspectState?data.inspectState.name:''}}</td>
123
+            <td>{{ data.workerName}}</td>
124
+            <td>{{ data.priority == 1 ? '是' : '否'}}</td>
125
+          </tr>
126
+        </tbody>
127
+      </nz-table>
128
+
129
+      <!-- 被服洗涤批次管理-查看视图-查看异常 -->
130
+      <nz-table *ngIf="type === 'washingException'" class="hospitalTable" [nzData]="washingExceptionList" nzSize="middle" [nzShowPagination]="false"
131
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
132
+        <thead>
133
+          <tr class="thead">
134
+            <th nzWidth="5%">序号</th>
135
+            <th nzWidth="13%">关联科室</th>
136
+            <th nzWidth="11%">被服种类</th>
137
+            <th nzWidth="5%">调整数量</th>
138
+            <th nzWidth="20%">调整原因</th>
139
+            <th nzWidth="20%">备注</th>
140
+            <th nzWidth="15%">时间</th>
141
+            <th nzWidth="11%">操作人</th>
142
+          </tr>
143
+        </thead>
144
+        <tbody>
145
+          <tr *ngFor="let data of washingExceptionList;let i = index;">
146
+            <td>{{i+1}}</td>
147
+            <td>{{ data.clothesDeptDTO?.dept }}</td>
148
+            <td>{{ data.clothesType?.name }}</td>
149
+            <td>{{ data.changeNum }}</td>
150
+            <td>{{ data.clothesExceptionRe?.name }}</td>
151
+            <td>{{ data.remarks }}</td>
152
+            <td>{{ data.changeTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
153
+            <td>{{ data.changerDTO?.name }}</td>
154
+          </tr>
155
+        </tbody>
156
+      </nz-table>
157
+
158
+      <div class="pagination" *ngIf="type !== 'blood'">
159
+        <ng-template #totalTemplate let-total> 共 {{ total }} 条 </ng-template>
160
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="total"
161
+          [(nzPageSize)]="pageSize" (nzPageIndexChange)="getList()"
162
+          (nzPageSizeChange)="getList()" [nzShowTotal]="totalTemplate">
163
+        </nz-pagination>
164
+      </div>
165
+    </div>
166
+    <div class="display_flex justify-content_flex-center">
167
+      <button class="btn know" nz-button nzType="primary" (click)="hideModal()">知道了</button>
168
+    </div>
169
+  </div>
170
+</div>

+ 201 - 0
src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.less

@@ -0,0 +1,201 @@
1
+@import "../../../../theme.less";
2
+.modal {
3
+  position: fixed;
4
+  left: 0;
5
+  top: 0;
6
+  width: 100%;
7
+  height: 100%;
8
+  background: rgba(0, 0, 0, 0.4);
9
+  z-index: 999;
10
+  .hospitalTable {
11
+    width: 100%;
12
+    td {
13
+      text-align: center !important;
14
+      position: relative;
15
+      word-break: break-all;
16
+    }
17
+    .thead {
18
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
19
+      th {
20
+        text-align: center !important;
21
+        color: #fff;
22
+        background: transparent;
23
+      }
24
+    }
25
+  }
26
+
27
+  .ji {
28
+    position: absolute;
29
+    right: 0px;
30
+    top: -3px;
31
+    width: 30px;
32
+  }
33
+
34
+  .list-template__top{
35
+    div{
36
+      text-align: left!important;
37
+    }
38
+  }
39
+
40
+  .tab {
41
+    width: 100%;
42
+    height: 60px;
43
+    border-bottom: 1px solid #e5e9ed;
44
+    background-color: #fff;
45
+
46
+    .item {
47
+      text-align: center;
48
+      line-height: 60px;
49
+      height: 100%;
50
+      border-right: 1px solid #e5e9ed;
51
+
52
+      &:nth-last-child(1) {
53
+        border: none;
54
+      }
55
+
56
+      &.checked {
57
+        background: #f0f6ed;
58
+      }
59
+    }
60
+  }
61
+
62
+  .modalBody {
63
+    width: 700px;
64
+    min-height: 220px;
65
+    background: #fff;
66
+    border-radius: 5px;
67
+    padding: 10px 20px;
68
+    color: #333;
69
+    &.modalBody-search {
70
+      width: 480px;
71
+      min-height: 250px;
72
+    }
73
+
74
+    .title {
75
+      width: 100%;
76
+      text-align: center;
77
+      font-size: 18px;
78
+      position: relative;
79
+
80
+      i {
81
+        position: absolute;
82
+        right: 0;
83
+        top: 0;
84
+        font-size: 20px;
85
+        color: #666;
86
+        cursor: pointer;
87
+        padding: 0 5px;
88
+      }
89
+    }
90
+
91
+    .content {
92
+      min-height: 117px;
93
+      background: #f9fafb;
94
+      border: 1px solid #e5e9ed;
95
+      border-radius: 5px;
96
+      overflow: hidden;
97
+      margin-top: 12px;
98
+      display: flex;
99
+      flex-direction: column;
100
+      justify-content: center;
101
+      align-items: center;
102
+      &.content-search {
103
+        min-height: 147px;
104
+        justify-content: start;
105
+        .defeat-search {
106
+          width: 100%;
107
+          height: 52px;
108
+          display: flex;
109
+          justify-content: center;
110
+          align-items: center;
111
+          border-bottom: solid 1px #e5e9ed;
112
+          em {
113
+            color: #666;
114
+            font-style: normal;
115
+          }
116
+        }
117
+        .form {
118
+          width: 100%;
119
+          padding: 0 16px;
120
+          .ant-form-item-label,
121
+          .ant-form-explain {
122
+            text-align: left !important;
123
+          }
124
+        }
125
+      }
126
+
127
+      div {
128
+        text-align: center;
129
+        margin: 0;
130
+
131
+        &.defeat {
132
+          color: #333;
133
+          font-size: 28px;
134
+        }
135
+        &.countDown {
136
+          font-size: 14px;
137
+          color: 666;
138
+          em {
139
+            font-style: normal;
140
+            color: @primary-color;
141
+          }
142
+        }
143
+
144
+        &.pagination {
145
+          font-size: 14px;
146
+          color: #666;
147
+          padding-top: 16px;
148
+          padding-bottom: 16px;
149
+        }
150
+      }
151
+    }
152
+
153
+    button {
154
+      margin-top: 10px;
155
+
156
+      &.btn {
157
+        margin-left: 8px;
158
+      }
159
+    }
160
+  }
161
+
162
+  // 新增
163
+  &.add {
164
+    .modalBody {
165
+      width: 480px;
166
+      height: auto;
167
+
168
+      .content {
169
+        width: 100%;
170
+        height: auto;
171
+        padding: 18px 14px 0 14px;
172
+
173
+        .addForm {
174
+          .ant-form-item {
175
+            margin-bottom: 15px;
176
+
177
+            .ant-form-item-label {
178
+              line-height: 0;
179
+            }
180
+          }
181
+        }
182
+
183
+        .editForm {
184
+          .ant-form-item {
185
+            margin-bottom: 15px;
186
+
187
+            .ant-form-item-label {
188
+              line-height: 0;
189
+            }
190
+          }
191
+        }
192
+      }
193
+
194
+      button {
195
+        &:nth-child(1) {
196
+          margin-right: 20px;
197
+        }
198
+      }
199
+    }
200
+  }
201
+}

+ 304 - 0
src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.ts

@@ -0,0 +1,304 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { format, startOfDay, endOfDay } from 'date-fns';
4
+import { MainService } from 'src/app/services/main.service';
5
+@Component({
6
+  selector: 'app-businessData-detail-modal',
7
+  templateUrl: './businessData-detail-modal.component.html',
8
+  styleUrls: ['./businessData-detail-modal.component.less']
9
+})
10
+export class BusinessDataDetailModalComponent implements OnInit {
11
+  // 切换科室,切换弹窗
12
+  hosId;
13
+  hsLoading = false;
14
+  bloodList: any = [];// 血制品列表
15
+  washingExceptionList: any = [];// 被服洗涤异常列表
16
+  specimenList: any = [];// 标本列表
17
+  inspectionRateStatisticsList: any = [];// 科室检查率统计列表
18
+  pageIndex: number = 1;//表格当前页码
19
+  pageSize: number = 10;//表格每页展示条数
20
+  total: number = 0;//表格总数据量
21
+  searchCriteria:any = {
22
+    stype: 0,
23
+    specimenDesc: 0,
24
+  }
25
+  @Input() show: Boolean;
26
+  @Input() orderId: String;
27
+  @Input() type: String = '';
28
+  @Input() dataInfo: any;
29
+
30
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
31
+
32
+  constructor(private mainService: MainService, private tool: ToolService) { }
33
+
34
+  ngOnInit() {
35
+    this.hosId = this.tool.getCurrentHospital().id;
36
+    this.tabType = 1;
37
+    switch(this.type){
38
+      case 'blood':
39
+        this.getBlood(1);
40
+        break;
41
+      case 'specimen':
42
+          this.getSpecimen(1);
43
+          this.getSpecimenType();
44
+          this.getSpecimenDesc();
45
+          break;
46
+      case 'deptInspectionRateStatistics':
47
+          this.getDeptInspectionRateStatistics(1);
48
+          break;
49
+      case 'deptInspectionStatistics':
50
+        this.getDeptInspectionStatistics(1);
51
+        break;
52
+      case 'washingException':
53
+          this.getWashingException(1);
54
+          break;
55
+    }
56
+  }
57
+  // 关闭弹窗
58
+  hideModal() {
59
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
60
+  }
61
+
62
+  // 切换tab栏
63
+  tabType: number = 1; //tab栏
64
+  checkTab(type) {
65
+    this.tabType = type;
66
+  }
67
+
68
+  // 切换标本类型下拉框
69
+  selectStype(e){
70
+    console.log(e);
71
+    this.searchCriteria.specimenDesc = 0;
72
+    this.getSpecimenDesc();
73
+    this.getSpecimen(1);
74
+  }
75
+
76
+  // 切换标本类型下拉框
77
+  selectDesc(e){
78
+    console.log(e);
79
+    this.getSpecimen(1);
80
+  }
81
+
82
+  // 分页获取数据
83
+  getList(){
84
+    switch(this.type){
85
+      case 'blood':
86
+        this.getBlood();
87
+        break;
88
+      case 'specimen':
89
+          this.getSpecimen();
90
+          break;
91
+      case 'deptInspectionRateStatistics':
92
+        this.getDeptInspectionRateStatistics();
93
+        break;
94
+      case 'deptInspectionStatistics':
95
+        this.getDeptInspectionStatistics();
96
+        break;
97
+      case 'washingException':
98
+        this.getWashingException();
99
+        break;
100
+    }
101
+  }
102
+
103
+  // 获取列表数据
104
+  getBlood(idx?) {
105
+    if (idx) {
106
+      this.pageIndex = 1;
107
+    }
108
+    let postData = {
109
+      "type": "blood",
110
+      "orderId": this.orderId
111
+    }
112
+    this.hsLoading = true;
113
+    this.mainService.checkData(postData).subscribe((data:any) => {
114
+      this.hsLoading = false;
115
+      this.bloodList = data.data ? data.data.all : [];
116
+      this.pageSize = this.total = data.data ? data.data.all.length : 0;
117
+    })
118
+  }
119
+
120
+  // 获取标本类型
121
+  specimentTypeList: any[] = [{ id: 0, name: '全部' }];
122
+  getSpecimenType() {
123
+    this.mainService.getDictionary("list", "specimen_type").subscribe((data:any) => {
124
+      let specimentTypeList = [{ id: 0, name: '全部' }];
125
+      this.specimentTypeList = specimentTypeList.concat(data);
126
+    })
127
+  }
128
+
129
+  // 获取检验项目
130
+  specimenDescList: any[] = [{ id: 0, name: '', nameNum: '全部' }];
131
+  id:number = 0;
132
+  getSpecimenDesc() {
133
+    let postData = {
134
+      "hosId": this.hosId,
135
+      "gdId": this.orderId,
136
+      "stype": this.searchCriteria.stype || undefined,
137
+    };
138
+    this.mainService.specimenCount(postData).subscribe((data:any) => {
139
+      data.data = data.data || [];
140
+      let specimenDescList:any = [{ id: 0, name: '全部', nameNum: '全部' }];
141
+      specimenDescList[0].nameNum = `全部(${data.total})`;
142
+      this.specimenDescList = specimenDescList.concat( data.data.map(v => ({id: --this.id, name: v[0] || '', nameNum: (v[0] ? v[0].slice(0, 15) + (v[0].length >= 15 ? '...' : '') : '') + `(${v[1]})`})));
143
+    })
144
+  }
145
+
146
+  // 获取标本列表
147
+  getSpecimen(idx?) {
148
+    if (idx) {
149
+      this.pageIndex = 1;
150
+    }
151
+    let postData = {
152
+      idx: this.pageIndex - 1,
153
+      sum: this.pageSize,
154
+      specimen: {
155
+        orderBy: 'arrive_time desc',
156
+        hosId: this.hosId,
157
+        gdid: this.orderId,
158
+        stype: this.searchCriteria.stype ? { id: this.searchCriteria.stype } : undefined,
159
+        specimenDesc: this.searchCriteria.specimenDesc ? this.specimenDescList.find(v => v.id == this.searchCriteria.specimenDesc).name: undefined,
160
+      }
161
+    }
162
+    this.hsLoading = true;
163
+    this.mainService.getFetchDataList('simple/data','specimen',postData).subscribe(data => {
164
+      this.hsLoading = false;
165
+      this.specimenList = data.list || [];
166
+      this.total = data.totalNum || 0;
167
+    })
168
+  }
169
+
170
+  // 获取被服洗涤异常列表
171
+  getWashingException(idx?) {
172
+    if (idx) {
173
+      this.pageIndex = 1;
174
+    }
175
+    let postData = {
176
+      idx: this.pageIndex - 1,
177
+      sum: this.pageSize,
178
+      clothesException: {
179
+        hosId: this.hosId,
180
+        batchId: this.orderId,
181
+      }
182
+    }
183
+    this.hsLoading = true;
184
+    this.mainService.getFetchDataList('simple/data','clothesException',postData).subscribe(data => {
185
+      this.hsLoading = false;
186
+      this.washingExceptionList = data.list || [];
187
+      this.total = data.totalNum || 0;
188
+    })
189
+  }
190
+
191
+  // 获取科室检查率统计-详情列表
192
+  getDeptInspectionRateStatistics(idx?) {
193
+    if (idx) {
194
+      this.pageIndex = 1;
195
+    }
196
+    let postData:any = {
197
+      idx: this.pageIndex - 1,
198
+      sum: this.pageSize,
199
+      canceled: this.dataInfo.canceled ? true : undefined,
200
+      priority: this.dataInfo.priority ? 0 : undefined,
201
+    }
202
+    switch(this.dataInfo.type){
203
+      case 'total':
204
+        postData.deptId = this.dataInfo.data.id;
205
+        postData.hosId = this.hosId;
206
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
207
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
208
+        break;
209
+      case 'noCheckCount':
210
+        postData.deptId = this.dataInfo.data.id;
211
+        postData.hosId = this.hosId;
212
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
213
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
214
+        postData.reportInsState = 'noCheck';
215
+        break;
216
+      case 'checkCount':
217
+        postData.deptId = this.dataInfo.data.id;
218
+        postData.hosId = this.hosId;
219
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
220
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
221
+        postData.reportInsState = 'check';
222
+        break;
223
+      case 'insCount':
224
+        postData.deptId = this.dataInfo.data.id;
225
+        postData.hosId = this.hosId;
226
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
227
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
228
+        postData.reportInsState = 'inspect';
229
+        break;
230
+    }
231
+    this.hsLoading = true;
232
+    this.mainService.listMsgByMain("listInspect", postData).subscribe((data: any) => {
233
+      this.hsLoading = false;
234
+      this.inspectionRateStatisticsList = data.list || [];
235
+      this.total = data.totalNum || 0;
236
+    })
237
+
238
+  }
239
+
240
+  // 获取科室检查统计-详情列表
241
+  getDeptInspectionStatistics(idx?) {
242
+    if (idx) {
243
+      this.pageIndex = 1;
244
+    }
245
+    let postData:any = {
246
+      idx: this.pageIndex - 1,
247
+      sum: this.pageSize,
248
+      znDeptInspect: true,
249
+    }
250
+    switch(this.dataInfo.type){
251
+      case 'total':
252
+        postData.deptId = this.dataInfo.data[10];
253
+        postData.hosId = this.hosId;
254
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
255
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
256
+        break;
257
+      case 'cancel':
258
+        postData.deptId = this.dataInfo.data[10];
259
+        postData.hosId = this.hosId;
260
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
261
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
262
+        postData.cancel = true;
263
+        break;
264
+      case 'priority':
265
+        postData.deptId = this.dataInfo.data[10];
266
+        postData.hosId = this.hosId;
267
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
268
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
269
+        postData.priority = 1;
270
+        break;
271
+      case 'noneYY':
272
+        postData.deptId = this.dataInfo.data[10];
273
+        postData.hosId = this.hosId;
274
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
275
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
276
+        postData.noneYY = true;
277
+        break;
278
+      case 'waitCheck':
279
+        postData.deptId = this.dataInfo.data[10];
280
+        postData.hosId = this.hosId;
281
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
282
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
283
+        postData.waitCheck = true;
284
+        break;
285
+      case 'doCheck':
286
+        postData.deptId = this.dataInfo.data[10];
287
+        postData.hosId = this.hosId;
288
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
289
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
290
+        postData.doCheck = true;
291
+        break;
292
+    }
293
+    this.hsLoading = true;
294
+    this.mainService.listMsgByMain("listInspect", postData).subscribe((data: any) => {
295
+      this.hsLoading = false;
296
+      this.inspectionRateStatisticsList = data.list || [];
297
+      this.total = data.totalNum || 0;
298
+    })
299
+
300
+  }
301
+}
302
+
303
+
304
+

+ 170 - 0
src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.html

@@ -0,0 +1,170 @@
1
+<div class="modal display_flex justify-content_flex-center align-items_center" *ngIf="show">
2
+  <div class="modalBody" style="width: 1200px;">
3
+    <div class="title">业务数据查看<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <!-- 血制品 -->
6
+      <nz-table *ngIf="type === 'blood'" class="hospitalTable" [nzData]="bloodList" nzSize="middle" [nzShowPagination]="false"
7
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
8
+        <thead>
9
+          <tr class="thead">
10
+            <th nzWidth="5%">序号</th>
11
+            <th nzWidth="13%">患者姓名</th>
12
+            <th nzWidth="11%">患者ID</th>
13
+            <th nzWidth="11%">血液类型</th>
14
+            <th nzWidth="14%">血袋号</th>
15
+            <th nzWidth="11%">取血人</th>
16
+            <th nzWidth="12%">取血时间</th>
17
+            <th nzWidth="11%">接收人</th>
18
+            <th nzWidth="12%">接收时间</th>
19
+          </tr>
20
+        </thead>
21
+        <tbody>
22
+          <tr *ngFor="let data of bloodList;let i = index;">
23
+            <td>{{i+1}}</td>
24
+            <td><span>{{ data.patientName }}<span *ngIf="data.bedNum">({{ data.bedNum }})</span></span></td>
25
+            <td>{{ data.patientNo||'' }}</td>
26
+            <td>{{ data.type ? data.type.name : "" }}</td>
27
+            <td>{{ data.bloodCode||'' }}</td>
28
+            <td>{{ data.arriverDTO?data.arriverDTO.name:'' }}</td>
29
+            <td>{{ data.arriveTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
30
+            <td>{{ data.receiverDTO ? data.receiverDTO.name : '' }}</td>
31
+            <td>{{ data.receiveTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
32
+          </tr>
33
+        </tbody>
34
+      </nz-table>
35
+      <!-- 标本 -->
36
+      <div class="list-template w100" *ngIf="type === 'specimen'">
37
+        <div class="list-template__content">
38
+          <div class="list-template__top" nz-row *ngIf="type === 'specimen'">
39
+            <div nz-col nzXl='24' class="list-template__searchBox">
40
+              <div class="list-template__searchItem">
41
+                <span class="label">标本类型</span>:
42
+                <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch
43
+                  nzPlaceHolder="请选择标本类型" [(ngModel)]="searchCriteria.stype" (ngModelChange)="selectStype($event)">
44
+                  <nz-option *ngFor="let option of specimentTypeList" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
45
+                </nz-select>
46
+              </div>
47
+              <div class="list-template__searchItem">
48
+                <span class="label">检验项目</span>:
49
+                <nz-select style="width: 210px;" class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch
50
+                  nzPlaceHolder="请选择检验项目" [(ngModel)]="searchCriteria.specimenDesc" (ngModelChange)="selectDesc($event)">
51
+                  <nz-option *ngFor="let option of specimenDescList" [nzLabel]="option.nameNum" [nzValue]="option.id"></nz-option>
52
+                </nz-select>
53
+              </div>
54
+            </div>
55
+          </div>
56
+        </div>
57
+      </div>
58
+      <nz-table *ngIf="type === 'specimen'" class="hospitalTable" [nzData]="specimenList" nzSize="middle" [nzShowPagination]="false"
59
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
60
+        <thead>
61
+          <tr class="thead">
62
+            <th nzWidth="4%">序号</th>
63
+            <th nzWidth="8%">申请科室</th>
64
+            <th nzWidth="8%">患者姓名</th>
65
+            <th nzWidth="8%">标本编码</th>
66
+            <th nzWidth="8%">检验项目</th>
67
+            <th nzWidth="8%">标本类型</th>
68
+            <th nzWidth="8%">状态</th>
69
+            <th nzWidth="8%">收取时间</th>
70
+            <th nzWidth="8%">收取人</th>
71
+            <th nzWidth="8%">中转时间</th>
72
+            <th nzWidth="8%">送达时间</th>
73
+            <th nzWidth="8%">送达人</th>
74
+            <th nzWidth="8%">终点科室</th>
75
+          </tr>
76
+        </thead>
77
+        <tbody>
78
+          <tr *ngFor="let data of specimenList;let i = index;">
79
+            <td>{{ (pageIndex - 1) * pageSize + i + 1 }}</td>
80
+            <td>{{ data.sickRoom ? data.sickRoom.dept : "-" }}</td>
81
+            <td>{{ data.patientName}}<span *ngIf="data.bedNum">({{data.bedNum}})</span><br>{{data.residenceNo}}</td>
82
+            <td>{{ data.scode || "-" }}</td>
83
+            <td>{{ data.specimenDesc || "-" }}</td>
84
+            <td>{{ data.stype ? data.stype.name : "-" }}</td>
85
+            <td>{{ data.speState ? data.speState.name : "-" }}</td>
86
+            <td>{{ data.arriveTime || "-" }}</td>
87
+            <td>{{ data.receiverName || "-" }}</td>
88
+            <td>{{ data.transTime || '-' }}</td>
89
+            <td>{{ data.sendTime || '-' }}</td>
90
+            <td>{{ data.delivererName || "-" }}</td>
91
+            <td>
92
+              {{ data.checkDept ? data.checkDept.dept : "-" }}
93
+              <img *ngIf="data.urgent == 1" src="../../assets/images/icon_ji.png" alt="" class="ji" />
94
+            </td>
95
+          </tr>
96
+        </tbody>
97
+      </nz-table>
98
+      <!-- 科室检查率统计 -->
99
+      <nz-table *ngIf="type === 'deptInspectionRateStatistics' || type === 'deptInspectionStatistics'" class="hospitalTable" [nzData]="inspectionRateStatisticsList" nzSize="middle" [nzShowPagination]="false"
100
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
101
+        <thead>
102
+          <tr class="thead">
103
+            <th nzWidth="4%">序号</th>
104
+            <th nzWidth="12%">患者姓名(床号)</th>
105
+            <th nzWidth="12%">检查项目</th>
106
+            <th nzWidth="12%">预约时间</th>
107
+            <th nzWidth="12%">叫号信息</th>
108
+            <th nzWidth="12%">检查科室</th>
109
+            <th nzWidth="12%">检查状态</th>
110
+            <th nzWidth="12%">陪检人</th>
111
+            <th nzWidth="12%">是否临时急查</th>
112
+          </tr>
113
+        </thead>
114
+        <tbody>
115
+          <tr *ngFor="let data of inspectionRateStatisticsList;let i = index;">
116
+            <td>{{ (pageIndex - 1) * pageSize + i + 1 }}</td>
117
+            <td>{{ data.patientName }}<span *ngIf="data.patientBedNum">({{data.patientBedNum}})</span></td>
118
+            <td>{{ data.inspectName}}</td>
119
+            <td>{{ data.yyTime}}</td>
120
+            <td>{{ data.reservationNumber}}</td>
121
+            <td>{{ data.execDept ? data.execDept.dept : '' }}</td>
122
+            <td>{{ data.inspectState?data.inspectState.name:''}}</td>
123
+            <td>{{ data.workerName}}</td>
124
+            <td>{{ data.priority == 1 ? '是' : '否'}}</td>
125
+          </tr>
126
+        </tbody>
127
+      </nz-table>
128
+
129
+      <!-- 被服洗涤批次管理-查看视图-查看异常 -->
130
+      <nz-table *ngIf="type === 'washingException'" class="hospitalTable" [nzData]="washingExceptionList" nzSize="middle" [nzShowPagination]="false"
131
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
132
+        <thead>
133
+          <tr class="thead">
134
+            <th nzWidth="5%">序号</th>
135
+            <th nzWidth="13%">关联科室</th>
136
+            <th nzWidth="11%">被服种类</th>
137
+            <th nzWidth="5%">调整数量</th>
138
+            <th nzWidth="20%">调整原因</th>
139
+            <th nzWidth="20%">备注</th>
140
+            <th nzWidth="15%">时间</th>
141
+            <th nzWidth="11%">操作人</th>
142
+          </tr>
143
+        </thead>
144
+        <tbody>
145
+          <tr *ngFor="let data of washingExceptionList;let i = index;">
146
+            <td>{{i+1}}</td>
147
+            <td>{{ data.clothesDeptDTO?.dept }}</td>
148
+            <td>{{ data.clothesType?.name }}</td>
149
+            <td>{{ data.changeNum }}</td>
150
+            <td>{{ data.clothesExceptionRe?.name }}</td>
151
+            <td>{{ data.remarks }}</td>
152
+            <td>{{ data.changeTime | date:"yyyy-MM-dd HH:mm:ss" }}</td>
153
+            <td>{{ data.changerDTO?.name }}</td>
154
+          </tr>
155
+        </tbody>
156
+      </nz-table>
157
+
158
+      <div class="pagination" *ngIf="type !== 'blood'">
159
+        <ng-template #totalTemplate let-total> 共 {{ total }} 条 </ng-template>
160
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="total"
161
+          [(nzPageSize)]="pageSize" (nzPageIndexChange)="getList()"
162
+          (nzPageSizeChange)="getList()" [nzShowTotal]="totalTemplate">
163
+        </nz-pagination>
164
+      </div>
165
+    </div>
166
+    <div class="display_flex justify-content_flex-center">
167
+      <button class="btn know" nz-button nzType="primary" (click)="hideModal()">知道了</button>
168
+    </div>
169
+  </div>
170
+</div>

+ 201 - 0
src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.less

@@ -0,0 +1,201 @@
1
+@import "../../../../theme.less";
2
+.modal {
3
+  position: fixed;
4
+  left: 0;
5
+  top: 0;
6
+  width: 100%;
7
+  height: 100%;
8
+  background: rgba(0, 0, 0, 0.4);
9
+  z-index: 999;
10
+  .hospitalTable {
11
+    width: 100%;
12
+    td {
13
+      text-align: center !important;
14
+      position: relative;
15
+      word-break: break-all;
16
+    }
17
+    .thead {
18
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
19
+      th {
20
+        text-align: center !important;
21
+        color: #fff;
22
+        background: transparent;
23
+      }
24
+    }
25
+  }
26
+
27
+  .ji {
28
+    position: absolute;
29
+    right: 0px;
30
+    top: -3px;
31
+    width: 30px;
32
+  }
33
+
34
+  .list-template__top{
35
+    div{
36
+      text-align: left!important;
37
+    }
38
+  }
39
+
40
+  .tab {
41
+    width: 100%;
42
+    height: 60px;
43
+    border-bottom: 1px solid #e5e9ed;
44
+    background-color: #fff;
45
+
46
+    .item {
47
+      text-align: center;
48
+      line-height: 60px;
49
+      height: 100%;
50
+      border-right: 1px solid #e5e9ed;
51
+
52
+      &:nth-last-child(1) {
53
+        border: none;
54
+      }
55
+
56
+      &.checked {
57
+        background: #f0f6ed;
58
+      }
59
+    }
60
+  }
61
+
62
+  .modalBody {
63
+    width: 700px;
64
+    min-height: 220px;
65
+    background: #fff;
66
+    border-radius: 5px;
67
+    padding: 10px 20px;
68
+    color: #333;
69
+    &.modalBody-search {
70
+      width: 480px;
71
+      min-height: 250px;
72
+    }
73
+
74
+    .title {
75
+      width: 100%;
76
+      text-align: center;
77
+      font-size: 18px;
78
+      position: relative;
79
+
80
+      i {
81
+        position: absolute;
82
+        right: 0;
83
+        top: 0;
84
+        font-size: 20px;
85
+        color: #666;
86
+        cursor: pointer;
87
+        padding: 0 5px;
88
+      }
89
+    }
90
+
91
+    .content {
92
+      min-height: 117px;
93
+      background: #f9fafb;
94
+      border: 1px solid #e5e9ed;
95
+      border-radius: 5px;
96
+      overflow: hidden;
97
+      margin-top: 12px;
98
+      display: flex;
99
+      flex-direction: column;
100
+      justify-content: center;
101
+      align-items: center;
102
+      &.content-search {
103
+        min-height: 147px;
104
+        justify-content: start;
105
+        .defeat-search {
106
+          width: 100%;
107
+          height: 52px;
108
+          display: flex;
109
+          justify-content: center;
110
+          align-items: center;
111
+          border-bottom: solid 1px #e5e9ed;
112
+          em {
113
+            color: #666;
114
+            font-style: normal;
115
+          }
116
+        }
117
+        .form {
118
+          width: 100%;
119
+          padding: 0 16px;
120
+          .ant-form-item-label,
121
+          .ant-form-explain {
122
+            text-align: left !important;
123
+          }
124
+        }
125
+      }
126
+
127
+      div {
128
+        text-align: center;
129
+        margin: 0;
130
+
131
+        &.defeat {
132
+          color: #333;
133
+          font-size: 28px;
134
+        }
135
+        &.countDown {
136
+          font-size: 14px;
137
+          color: 666;
138
+          em {
139
+            font-style: normal;
140
+            color: @primary-color;
141
+          }
142
+        }
143
+
144
+        &.pagination {
145
+          font-size: 14px;
146
+          color: #666;
147
+          padding-top: 16px;
148
+          padding-bottom: 16px;
149
+        }
150
+      }
151
+    }
152
+
153
+    button {
154
+      margin-top: 10px;
155
+
156
+      &.btn {
157
+        margin-left: 8px;
158
+      }
159
+    }
160
+  }
161
+
162
+  // 新增
163
+  &.add {
164
+    .modalBody {
165
+      width: 480px;
166
+      height: auto;
167
+
168
+      .content {
169
+        width: 100%;
170
+        height: auto;
171
+        padding: 18px 14px 0 14px;
172
+
173
+        .addForm {
174
+          .ant-form-item {
175
+            margin-bottom: 15px;
176
+
177
+            .ant-form-item-label {
178
+              line-height: 0;
179
+            }
180
+          }
181
+        }
182
+
183
+        .editForm {
184
+          .ant-form-item {
185
+            margin-bottom: 15px;
186
+
187
+            .ant-form-item-label {
188
+              line-height: 0;
189
+            }
190
+          }
191
+        }
192
+      }
193
+
194
+      button {
195
+        &:nth-child(1) {
196
+          margin-right: 20px;
197
+        }
198
+      }
199
+    }
200
+  }
201
+}

+ 304 - 0
src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.ts

@@ -0,0 +1,304 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { format, startOfDay, endOfDay } from 'date-fns';
4
+import { MainService } from 'src/app/services/main.service';
5
+@Component({
6
+  selector: 'app-businessData-detail-modal',
7
+  templateUrl: './businessData-detail-modal.component.html',
8
+  styleUrls: ['./businessData-detail-modal.component.less']
9
+})
10
+export class BusinessDataDetailModalComponent implements OnInit {
11
+  // 切换科室,切换弹窗
12
+  hosId;
13
+  hsLoading = false;
14
+  bloodList: any = [];// 血制品列表
15
+  washingExceptionList: any = [];// 被服洗涤异常列表
16
+  specimenList: any = [];// 标本列表
17
+  inspectionRateStatisticsList: any = [];// 科室检查率统计列表
18
+  pageIndex: number = 1;//表格当前页码
19
+  pageSize: number = 10;//表格每页展示条数
20
+  total: number = 0;//表格总数据量
21
+  searchCriteria:any = {
22
+    stype: 0,
23
+    specimenDesc: 0,
24
+  }
25
+  @Input() show: Boolean;
26
+  @Input() orderId: String;
27
+  @Input() type: String = '';
28
+  @Input() dataInfo: any;
29
+
30
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
31
+
32
+  constructor(private mainService: MainService, private tool: ToolService) { }
33
+
34
+  ngOnInit() {
35
+    this.hosId = this.tool.getCurrentHospital().id;
36
+    this.tabType = 1;
37
+    switch(this.type){
38
+      case 'blood':
39
+        this.getBlood(1);
40
+        break;
41
+      case 'specimen':
42
+          this.getSpecimen(1);
43
+          this.getSpecimenType();
44
+          this.getSpecimenDesc();
45
+          break;
46
+      case 'deptInspectionRateStatistics':
47
+          this.getDeptInspectionRateStatistics(1);
48
+          break;
49
+      case 'deptInspectionStatistics':
50
+        this.getDeptInspectionStatistics(1);
51
+        break;
52
+      case 'washingException':
53
+          this.getWashingException(1);
54
+          break;
55
+    }
56
+  }
57
+  // 关闭弹窗
58
+  hideModal() {
59
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
60
+  }
61
+
62
+  // 切换tab栏
63
+  tabType: number = 1; //tab栏
64
+  checkTab(type) {
65
+    this.tabType = type;
66
+  }
67
+
68
+  // 切换标本类型下拉框
69
+  selectStype(e){
70
+    console.log(e);
71
+    this.searchCriteria.specimenDesc = 0;
72
+    this.getSpecimenDesc();
73
+    this.getSpecimen(1);
74
+  }
75
+
76
+  // 切换标本类型下拉框
77
+  selectDesc(e){
78
+    console.log(e);
79
+    this.getSpecimen(1);
80
+  }
81
+
82
+  // 分页获取数据
83
+  getList(){
84
+    switch(this.type){
85
+      case 'blood':
86
+        this.getBlood();
87
+        break;
88
+      case 'specimen':
89
+          this.getSpecimen();
90
+          break;
91
+      case 'deptInspectionRateStatistics':
92
+        this.getDeptInspectionRateStatistics();
93
+        break;
94
+      case 'deptInspectionStatistics':
95
+        this.getDeptInspectionStatistics();
96
+        break;
97
+      case 'washingException':
98
+        this.getWashingException();
99
+        break;
100
+    }
101
+  }
102
+
103
+  // 获取列表数据
104
+  getBlood(idx?) {
105
+    if (idx) {
106
+      this.pageIndex = 1;
107
+    }
108
+    let postData = {
109
+      "type": "blood",
110
+      "orderId": this.orderId
111
+    }
112
+    this.hsLoading = true;
113
+    this.mainService.checkData(postData).subscribe((data:any) => {
114
+      this.hsLoading = false;
115
+      this.bloodList = data.data ? data.data.all : [];
116
+      this.pageSize = this.total = data.data ? data.data.all.length : 0;
117
+    })
118
+  }
119
+
120
+  // 获取标本类型
121
+  specimentTypeList: any[] = [{ id: 0, name: '全部' }];
122
+  getSpecimenType() {
123
+    this.mainService.getDictionary("list", "specimen_type").subscribe((data:any) => {
124
+      let specimentTypeList = [{ id: 0, name: '全部' }];
125
+      this.specimentTypeList = specimentTypeList.concat(data);
126
+    })
127
+  }
128
+
129
+  // 获取检验项目
130
+  specimenDescList: any[] = [{ id: 0, name: '', nameNum: '全部' }];
131
+  id:number = 0;
132
+  getSpecimenDesc() {
133
+    let postData = {
134
+      "hosId": this.hosId,
135
+      "gdId": this.orderId,
136
+      "stype": this.searchCriteria.stype || undefined,
137
+    };
138
+    this.mainService.specimenCount(postData).subscribe((data:any) => {
139
+      data.data = data.data || [];
140
+      let specimenDescList:any = [{ id: 0, name: '全部', nameNum: '全部' }];
141
+      specimenDescList[0].nameNum = `全部(${data.total})`;
142
+      this.specimenDescList = specimenDescList.concat( data.data.map(v => ({id: --this.id, name: v[0] || '', nameNum: (v[0] ? v[0].slice(0, 15) + (v[0].length >= 15 ? '...' : '') : '') + `(${v[1]})`})));
143
+    })
144
+  }
145
+
146
+  // 获取标本列表
147
+  getSpecimen(idx?) {
148
+    if (idx) {
149
+      this.pageIndex = 1;
150
+    }
151
+    let postData = {
152
+      idx: this.pageIndex - 1,
153
+      sum: this.pageSize,
154
+      specimen: {
155
+        orderBy: 'arrive_time desc',
156
+        hosId: this.hosId,
157
+        gdid: this.orderId,
158
+        stype: this.searchCriteria.stype ? { id: this.searchCriteria.stype } : undefined,
159
+        specimenDesc: this.searchCriteria.specimenDesc ? this.specimenDescList.find(v => v.id == this.searchCriteria.specimenDesc).name: undefined,
160
+      }
161
+    }
162
+    this.hsLoading = true;
163
+    this.mainService.getFetchDataList('simple/data','specimen',postData).subscribe(data => {
164
+      this.hsLoading = false;
165
+      this.specimenList = data.list || [];
166
+      this.total = data.totalNum || 0;
167
+    })
168
+  }
169
+
170
+  // 获取被服洗涤异常列表
171
+  getWashingException(idx?) {
172
+    if (idx) {
173
+      this.pageIndex = 1;
174
+    }
175
+    let postData = {
176
+      idx: this.pageIndex - 1,
177
+      sum: this.pageSize,
178
+      clothesException: {
179
+        hosId: this.hosId,
180
+        batchId: this.orderId,
181
+      }
182
+    }
183
+    this.hsLoading = true;
184
+    this.mainService.getFetchDataList('simple/data','clothesException',postData).subscribe(data => {
185
+      this.hsLoading = false;
186
+      this.washingExceptionList = data.list || [];
187
+      this.total = data.totalNum || 0;
188
+    })
189
+  }
190
+
191
+  // 获取科室检查率统计-详情列表
192
+  getDeptInspectionRateStatistics(idx?) {
193
+    if (idx) {
194
+      this.pageIndex = 1;
195
+    }
196
+    let postData:any = {
197
+      idx: this.pageIndex - 1,
198
+      sum: this.pageSize,
199
+      canceled: this.dataInfo.canceled ? true : undefined,
200
+      priority: this.dataInfo.priority ? 0 : undefined,
201
+    }
202
+    switch(this.dataInfo.type){
203
+      case 'total':
204
+        postData.deptId = this.dataInfo.data.id;
205
+        postData.hosId = this.hosId;
206
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
207
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
208
+        break;
209
+      case 'noCheckCount':
210
+        postData.deptId = this.dataInfo.data.id;
211
+        postData.hosId = this.hosId;
212
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
213
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
214
+        postData.reportInsState = 'noCheck';
215
+        break;
216
+      case 'checkCount':
217
+        postData.deptId = this.dataInfo.data.id;
218
+        postData.hosId = this.hosId;
219
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
220
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
221
+        postData.reportInsState = 'check';
222
+        break;
223
+      case 'insCount':
224
+        postData.deptId = this.dataInfo.data.id;
225
+        postData.hosId = this.hosId;
226
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
227
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
228
+        postData.reportInsState = 'inspect';
229
+        break;
230
+    }
231
+    this.hsLoading = true;
232
+    this.mainService.listMsgByMain("listInspect", postData).subscribe((data: any) => {
233
+      this.hsLoading = false;
234
+      this.inspectionRateStatisticsList = data.list || [];
235
+      this.total = data.totalNum || 0;
236
+    })
237
+
238
+  }
239
+
240
+  // 获取科室检查统计-详情列表
241
+  getDeptInspectionStatistics(idx?) {
242
+    if (idx) {
243
+      this.pageIndex = 1;
244
+    }
245
+    let postData:any = {
246
+      idx: this.pageIndex - 1,
247
+      sum: this.pageSize,
248
+      znDeptInspect: true,
249
+    }
250
+    switch(this.dataInfo.type){
251
+      case 'total':
252
+        postData.deptId = this.dataInfo.data[10];
253
+        postData.hosId = this.hosId;
254
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
255
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
256
+        break;
257
+      case 'cancel':
258
+        postData.deptId = this.dataInfo.data[10];
259
+        postData.hosId = this.hosId;
260
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
261
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
262
+        postData.cancel = true;
263
+        break;
264
+      case 'priority':
265
+        postData.deptId = this.dataInfo.data[10];
266
+        postData.hosId = this.hosId;
267
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
268
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
269
+        postData.priority = 1;
270
+        break;
271
+      case 'noneYY':
272
+        postData.deptId = this.dataInfo.data[10];
273
+        postData.hosId = this.hosId;
274
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
275
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
276
+        postData.noneYY = true;
277
+        break;
278
+      case 'waitCheck':
279
+        postData.deptId = this.dataInfo.data[10];
280
+        postData.hosId = this.hosId;
281
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
282
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
283
+        postData.waitCheck = true;
284
+        break;
285
+      case 'doCheck':
286
+        postData.deptId = this.dataInfo.data[10];
287
+        postData.hosId = this.hosId;
288
+        postData.startTime = this.dataInfo.searchDto.dateRange[0] ? format(startOfDay(this.dataInfo.searchDto.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined;
289
+        postData.endTime = this.dataInfo.searchDto.dateRange[1] ? format(endOfDay(this.dataInfo.searchDto.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined;
290
+        postData.doCheck = true;
291
+        break;
292
+    }
293
+    this.hsLoading = true;
294
+    this.mainService.listMsgByMain("listInspect", postData).subscribe((data: any) => {
295
+      this.hsLoading = false;
296
+      this.inspectionRateStatisticsList = data.list || [];
297
+      this.total = data.totalNum || 0;
298
+    })
299
+
300
+  }
301
+}
302
+
303
+
304
+

+ 28 - 0
src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.html

@@ -0,0 +1,28 @@
1
+<div class="modal display_flex align-items_center">
2
+  <div class="modalBody" style="width: 1200px;">
3
+    <div class="title">待回访<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <div class="items">
6
+        <div class="row">
7
+          <div>单号:SJ2408030022</div>
8
+          <div>优先级:极低</div>
9
+          <div>院区-科室名称:同济医院主院区-神经内科Ⅰ</div>
10
+        </div>
11
+        <div class="row">
12
+          <div>故障描述:故障的描述故障的描述故障的描述故障的描述故障的描述故障的描述故障的描述故障的描述。</div>
13
+        </div>
14
+        <div class="row">
15
+          <div>详细地址:内科楼5楼20病房卫生间</div>
16
+        </div>
17
+        <div class="row">
18
+          <div>申请时间:2024-08-30 12:56</div>
19
+          <div>处理人:张三</div>
20
+          <div>
21
+            <input type="button" class="mid_bot" value="回访" (click)="openRecallModal(data.data.id)" />
22
+            <input type="button" class="btm_bot" value="查看" (click)="openDelModal(data.data.id, 'hsms')" />
23
+          </div>
24
+        </div>
25
+      </div>
26
+    </div>
27
+  </div>
28
+</div>

+ 127 - 0
src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.less

@@ -0,0 +1,127 @@
1
+@import "../../../../theme.less";
2
+.modal {
3
+  position: fixed;
4
+  left: 0;
5
+  top: 0;
6
+  width: 100%;
7
+  height: 100%;
8
+  background: rgba(0, 0, 0, 0.4);
9
+  z-index: 999;
10
+  .hospitalTable {
11
+    width: 100%;
12
+    td {
13
+      text-align: center !important;
14
+      position: relative;
15
+      word-break: break-all;
16
+    }
17
+    .thead {
18
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
19
+      th {
20
+        text-align: center !important;
21
+        color: #fff;
22
+        background: transparent;
23
+      }
24
+    }
25
+  }
26
+
27
+  .ji {
28
+    position: absolute;
29
+    right: 0px;
30
+    top: -3px;
31
+    width: 30px;
32
+  }
33
+
34
+  .list-template__top{
35
+    div{
36
+      text-align: left!important;
37
+    }
38
+  }
39
+
40
+  .tab {
41
+    width: 100%;
42
+    height: 60px;
43
+    border-bottom: 1px solid #e5e9ed;
44
+    background-color: #fff;
45
+
46
+    .item {
47
+      text-align: center;
48
+      line-height: 60px;
49
+      height: 100%;
50
+      border-right: 1px solid #e5e9ed;
51
+
52
+      &:nth-last-child(1) {
53
+        border: none;
54
+      }
55
+
56
+      &.checked {
57
+        background: #f0f6ed;
58
+      }
59
+    }
60
+  }
61
+
62
+  .modalBody {
63
+    width: 700px;
64
+    height: 707px;
65
+    min-height: 220px;
66
+    background: #fff;
67
+    border-radius: 5px;
68
+    padding: 10px 20px;
69
+    color: #333;
70
+    &.modalBody-search {
71
+      width: 480px;
72
+      min-height: 250px;
73
+    }
74
+
75
+    .title {
76
+      width: 100%;
77
+      text-align: center;
78
+      font-size: 18px;
79
+      position: relative;
80
+
81
+      i {
82
+        position: absolute;
83
+        right: 0;
84
+        top: 0;
85
+        font-size: 20px;
86
+        color: #666;
87
+        cursor: pointer;
88
+        padding: 0 5px;
89
+      }
90
+    }
91
+
92
+    .content {
93
+      .items{
94
+        border-bottom: 1px solid #D9D9D9;
95
+        /* 中按钮 */
96
+        .mid_bot {
97
+          width: 65px;
98
+          border-radius: 4px;
99
+          color: white;
100
+          background-color: @primary-color;
101
+          border: 1px @primary-color solid;
102
+          cursor: pointer;
103
+          height: 27px;
104
+        }
105
+
106
+        /* 下按钮 */
107
+        .btm_bot {
108
+          width: 65px;
109
+          border-radius: 4px;
110
+          color: #78797a;
111
+          background-color: #FFF;
112
+          border: 1px #e5e9ed solid;
113
+          cursor: pointer;
114
+          height: 27px;
115
+        }
116
+      }
117
+    }
118
+
119
+    button {
120
+      margin-top: 10px;
121
+
122
+      &.btn {
123
+        margin-left: 8px;
124
+      }
125
+    }
126
+  }
127
+}

+ 55 - 0
src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.ts

@@ -0,0 +1,55 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { MainService } from 'src/app/services/main.service';
4
+@Component({
5
+  selector: 'app-incident-ser-visit',
6
+  templateUrl: './incident-ser-visit.component.html',
7
+  styleUrls: ['./incident-ser-visit.component.less']
8
+})
9
+export class IncidentSerVisitComponent implements OnInit {
10
+  // 切换科室,切换弹窗
11
+  hosId;
12
+  hsLoading = false;
13
+  visitList: any = [];// 列表
14
+  pageIndex: number = 1;//表格当前页码
15
+  pageSize: number = 10;//表格每页展示条数
16
+  total: number = 0;//表格总数据量
17
+
18
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
19
+
20
+  constructor(private mainService: MainService, private tool: ToolService) { }
21
+
22
+  ngOnInit() {
23
+    this.hosId = this.tool.getCurrentHospital().id;
24
+    this.getVisitList();
25
+  }
26
+  // 关闭弹窗
27
+  hideModal() {
28
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
29
+  }
30
+
31
+  // 分页获取数据
32
+  getList(){
33
+    this.getVisitList();
34
+  }
35
+
36
+  // 获取回访列表
37
+  getVisitList() {
38
+    let postData = {
39
+      idx: 0,
40
+      sum: 9999,
41
+      clothesException: {
42
+        hosId: this.hosId,
43
+      }
44
+    }
45
+    this.hsLoading = true;
46
+    this.mainService.getFetchDataList('simple/data','clothesException',postData).subscribe(data => {
47
+      this.hsLoading = false;
48
+      this.visitList = data.list || [];
49
+      this.total = data.totalNum || 0;
50
+    })
51
+  }
52
+}
53
+
54
+
55
+

+ 20 - 0
src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.module.ts

@@ -0,0 +1,20 @@
1
+import { NgModule } from '@angular/core';
2
+import { CommonModule } from '@angular/common';
3
+
4
+import { IncidentSerVisitComponent } from './incident-ser-visit.component';
5
+import { ShareModule } from 'src/app/share/share.module';
6
+
7
+
8
+@NgModule({
9
+  declarations: [
10
+    IncidentSerVisitComponent,
11
+  ],
12
+  imports: [
13
+    CommonModule,
14
+    ShareModule,
15
+  ],
16
+  exports: [
17
+    IncidentSerVisitComponent,
18
+  ]
19
+})
20
+export class IncidentSerVisitModule { }

+ 32 - 94
src/app/views/fuwutai/fuwutai.component.html

@@ -714,48 +714,20 @@
714 714
     </div>
715 715
   </div>
716 716
 
717
-  <!-- 右侧悬浮框 baba-->
717
+  <!-- 右侧悬浮框 -->
718 718
   <div id="fixedMenu" class="fixed">
719
-    <div
720
-      class="left"
721
-      *ngIf="
722
-        fixedTab != '' &&
723
-        showLastItems &&
724
-        fixedTab != 'newOrder' &&
725
-        fixedTab != 'toSystem' &&
726
-        fixedTab != 'logout'
727
-      "
728
-    >
719
+    <div class="left" *ngIf="fixedTab != '' && showLastItems && fixedTab != 'newOrder' && fixedTab != 'toSystem' && fixedTab != 'logout'">
729 720
       <!-- 绑定分机 -->
730
-      <div
731
-        class="con bindingExtension"
732
-        *ngIf="
733
-          fixedTab == 'bindingExtension' &&
734
-          fixedTab != 'newOrder' &&
735
-          !phoneNumLoading
736
-        "
737
-      >
721
+      <div class="con bindingExtension" *ngIf="fixedTab == 'bindingExtension' && fixedTab != 'newOrder' && !phoneNumLoading">
738 722
         <div class="title">绑定分机</div>
739
-        <overlay-scrollbars
740
-          #osComponentRef7
741
-          [ngStyle]="{ height: '152px' }"
742
-          class="conditions"
743
-        >
723
+        <overlay-scrollbars #osComponentRef7 [ngStyle]="{ height: '152px' }" class="conditions">
744 724
           <div nz-row *ngIf="binding === 1">
745 725
             <div nz-col nzSpan="24">
746 726
               <div nz-row>
747
-                <nz-checkbox-wrapper
748
-                  class="w100"
749
-                  (nzOnChange)="changePhones($event)"
750
-                >
727
+                <nz-checkbox-wrapper class="w100" (nzOnChange)="changePhones($event)">
751 728
                   <div nz-row>
752 729
                     <div *ngFor="let data of phoneNumList" nz-col nzSpan="8">
753
-                      <label
754
-                        nz-checkbox
755
-                        [nzValue]="data.value"
756
-                        [ngModel]="data.checked"
757
-                        >分机{{ data.value }}</label
758
-                      >
730
+                      <label nz-checkbox [nzValue]="data.value" [ngModel]="data.checked">分机{{ data.value }}</label>
759 731
                     </div>
760 732
                   </div>
761 733
                 </nz-checkbox-wrapper>
@@ -773,68 +745,25 @@
773 745
           </div>
774 746
           <div nz-row *ngIf="binding === 3">
775 747
             <div nz-col nzSpan="24" class="noContentFlex">
776
-              <img
777
-                class="noContent"
778
-                src="../../assets/images/icon_jianchakong@big.png"
779
-                alt=""
780
-              />
748
+              <img class="noContent" src="../../assets/images/icon_jianchakong@big.png" alt="" />
781 749
               <p>暂未绑定分机号</p>
782 750
             </div>
783 751
           </div>
784 752
         </overlay-scrollbars>
785 753
         <div class="btns display_flex justify-content_flex-center">
786
-          <button
787
-            nz-button
788
-            nzType="primary"
789
-            nzValue="small"
790
-            (click)="bindingHandle()"
791
-            *ngIf="binding === 3"
792
-          >
754
+          <button nz-button nzType="primary" nzValue="small" (click)="bindingHandle()" *ngIf="binding === 3">
793 755
             绑定分机
794 756
           </button>
795
-          <button
796
-            nz-button
797
-            nzType="primary"
798
-            nzValue="small"
799
-            (click)="bindingHandle()"
800
-            *ngIf="binding === 2"
801
-          >
757
+          <button nz-button nzType="primary" nzValue="small" (click)="bindingHandle()" *ngIf="binding === 2">
802 758
             重新绑定
803 759
           </button>
804
-          <button
805
-            nz-button
806
-            nzType="primary"
807
-            nzValue="small"
808
-            *ngIf="binding === 1"
809
-            (click)="bindingOk()"
810
-            [nzLoading]="bindOkLoading"
811
-          >
760
+          <button nz-button nzType="primary" nzValue="small" *ngIf="binding === 1" (click)="bindingOk()" [nzLoading]="bindOkLoading">
812 761
             确定绑定
813 762
           </button>
814 763
         </div>
815 764
       </div>
816
-      <div
817
-        class="
818
-          con
819
-          bindingExtension
820
-          display_flex
821
-          justify-content_flex-center
822
-          align-items_center
823
-        "
824
-        *ngIf="
825
-          fixedTab == 'bindingExtension' &&
826
-          fixedTab != 'newOrder' &&
827
-          phoneNumLoading
828
-        "
829
-      >
830
-        <div
831
-          class="
832
-            loadingFull
833
-            display_flex
834
-            justify-content_flex-center
835
-            align-items_center
836
-          "
837
-        >
765
+      <div class="con bindingExtension display_flex justify-content_flex-center align-items_center" *ngIf="fixedTab == 'bindingExtension' && fixedTab != 'newOrder' && phoneNumLoading">
766
+        <div class="loadingFull display_flex justify-content_flex-center align-items_center">
838 767
           <div class="loadingFullInner">
839 768
             <img src="../../../assets/images/loading.gif" alt="" />
840 769
             <div>加载中...</div>
@@ -1135,17 +1064,23 @@
1135 1064
         </div>
1136 1065
       </div>
1137 1066
     </div>
1138
-    <div
1139
-      *ngIf="
1140
-        showLastItems &&
1141
-        fixedTab != '' &&
1142
-        fixedTab != 'logout' &&
1143
-        fixedTab != 'toSystem' &&
1144
-        fixedTab != 'newOrder'
1145
-      "
1146
-      (click)="fixedMenuShangla()"
1147
-      class="fixedMark"
1148
-    ></div>
1067
+    <div *ngIf="showLastItems && fixedTab != '' && fixedTab != 'logout' && fixedTab != 'toSystem' && fixedTab != 'newOrder'" (click)="fixedMenuShangla()" class="fixedMark"></div>
1068
+  </div>
1069
+
1070
+  <!-- 左侧悬浮框 -->
1071
+  <div id="fixedMenuLeft" class="fixedLeft">
1072
+    <div class="right">
1073
+      <div class="fixedMenu">
1074
+        <div class="menuItems">
1075
+          <div class="others">
1076
+            <!-- <div class="item" (click)="visitOrder()">回访-10</div> -->
1077
+            <div class="item">回访-10</div>
1078
+            <div class="item">留言-10</div>
1079
+            <div class="item itemLink">通话</div>
1080
+          </div>
1081
+        </div>
1082
+      </div>
1083
+    </div>
1149 1084
   </div>
1150 1085
 
1151 1086
   <!-- 核酸打印 -->
@@ -2508,3 +2443,6 @@
2508 2443
 
2509 2444
 <!-- 处理 -->
2510 2445
 <app-incident-handle [id]="coopData.id" *ngIf="handleModalShow" (closeModelHs)="closeHandleModelOrder($event)" (confirmModelHs)="confirmHandleModelOrder($event)"></app-incident-handle>
2446
+
2447
+<!-- 回访 -->
2448
+<app-incident-ser-visit *ngIf="visitShow" (closeModelHs)="closeVisit($event)"></app-incident-ser-visit>

+ 90 - 7
src/app/views/fuwutai/fuwutai.component.less

@@ -671,7 +671,7 @@
671 671
     width: 70%;
672 672
     border-radius: 4px;
673 673
     color: #78797a;
674
-    background-color: #F0F6ED;
674
+    background-color: #FFF;
675 675
     border: 1px #e5e9ed solid;
676 676
     cursor: pointer;
677 677
     height: 27px;
@@ -951,10 +951,6 @@
951 951
     position: relative;
952 952
     overflow: hidden;
953 953
     display: flex;
954
-
955
-    .left_cots {
956
-      // width: 98%;
957
-    }
958 954
   }
959 955
 
960 956
   /* 急标 */
@@ -1257,7 +1253,7 @@
1257 1253
     margin-top: 4px;
1258 1254
     border-radius: 4px;
1259 1255
     color: #78797a;
1260
-    background-color: #F0F6ED;
1256
+    background-color: #FFF;
1261 1257
     border: 1px #e5e9ed solid;
1262 1258
     cursor: pointer;
1263 1259
     height: 27px;
@@ -1557,6 +1553,19 @@
1557 1553
     z-index: 8;
1558 1554
     border-radius: 5px 0 0 5px;
1559 1555
 
1556
+    &.maskFull{
1557
+      &::after{
1558
+        content: '';
1559
+        position: absolute;
1560
+        top: 0;
1561
+        left: 0;
1562
+        width: 100%;
1563
+        height: 100%;
1564
+        z-index: 8;
1565
+        cursor: move;
1566
+      }
1567
+    }
1568
+
1560 1569
     .fixedMark {
1561 1570
       position: fixed;
1562 1571
       left: 0;
@@ -1723,7 +1732,7 @@
1723 1732
             height: 35px;
1724 1733
             line-height: 35px;
1725 1734
             padding: 0 6px;
1726
-            cursor: default;
1735
+            cursor: pointer;
1727 1736
             border-bottom: 1px solid #e5e9ed;
1728 1737
             user-select: none;
1729 1738
             &.itemLink {
@@ -1751,6 +1760,80 @@
1751 1760
     }
1752 1761
   }
1753 1762
 
1763
+  // 左侧悬浮菜单
1764
+  .fixedLeft {
1765
+    position: fixed;
1766
+    top: 40%;
1767
+    left: 0;
1768
+    z-index: 8;
1769
+    border-radius: 5px 0 0 5px;
1770
+
1771
+    &.maskFull{
1772
+      &::after{
1773
+        content: '';
1774
+        position: absolute;
1775
+        top: 0;
1776
+        left: 0;
1777
+        width: 100%;
1778
+        height: 100%;
1779
+        z-index: 8;
1780
+        cursor: move;
1781
+      }
1782
+    }
1783
+
1784
+    .right {
1785
+      width: 80px;
1786
+      float: left;
1787
+      background: rgba(255, 255, 255, 0.5);
1788
+      border-radius: 5px 0 0 5px;
1789
+      position: relative;
1790
+      z-index: 8;
1791
+
1792
+      .fixedMenu {
1793
+        border: 1px solid #e5e9ed;
1794
+        color: @primary-color;
1795
+        background: rgba(255, 255, 255, 0.5);
1796
+        text-align: center;
1797
+        border-radius: 0 5px 5px 0;
1798
+
1799
+        &.hujiaozhongxin {
1800
+          margin-bottom: 5px;
1801
+        }
1802
+
1803
+        .menuItems {
1804
+          .item {
1805
+            height: 35px;
1806
+            line-height: 35px;
1807
+            padding: 0 6px;
1808
+            cursor: pointer;
1809
+            border-bottom: 1px solid #e5e9ed;
1810
+            user-select: none;
1811
+            text-align: left;
1812
+            &.itemLink {
1813
+              border-bottom: none;
1814
+            }
1815
+
1816
+            &.checked {
1817
+              background: #fff;
1818
+              color: #52ab77;
1819
+              opacity: 1;
1820
+              box-shadow: -3px 4px 7px #eae9e9;
1821
+            }
1822
+          }
1823
+
1824
+          .others {
1825
+            transition: height 0.4s linear;
1826
+            overflow: hidden;
1827
+          }
1828
+        }
1829
+
1830
+        .arrow {
1831
+          cursor: pointer;
1832
+        }
1833
+      }
1834
+    }
1835
+  }
1836
+
1754 1837
   // 新建工单弹框
1755 1838
   .newOrder {
1756 1839
     position: fixed;

+ 19 - 8
src/app/views/fuwutai/fuwutai.component.ts

@@ -734,7 +734,8 @@ export class FuwutaiComponent implements OnInit {
734 734
     this.getOrderList(2);
735 735
     this.getOrderList(3);
736 736
     this.initControlView();
737
-    this.moveMenu();
737
+    this.moveMenu("fixedMenu");
738
+    this.moveMenu("fixedMenuLeft");
738 739
     this.getPhoneNum();
739 740
     this.getUnassignedBuilding2();
740 741
     this.getInspectAndPatientTransportConfigTasktype();
@@ -3808,13 +3809,13 @@ export class FuwutaiComponent implements OnInit {
3808 3809
   }
3809 3810
 
3810 3811
   // 菜单拖拽
3811
-  moveMenu() {
3812
-    let fixedMenu = document.getElementById("fixedMenu");
3812
+  moveMenu(nodeId) {
3813
+    let fixedMenu = document.getElementById(nodeId);
3813 3814
     if (!fixedMenu) return;
3814 3815
     fixedMenu.onmousedown = function (e) {
3815
-      fixedMenu.style.cursor = "move";
3816 3816
       let y = e.clientY - fixedMenu.offsetTop;
3817 3817
       document.onmousemove = function (ev) {
3818
+        fixedMenu.classList.add('maskFull');
3818 3819
         var _y = ev.clientY - y > 0 ? ev.clientY - y : 0;
3819 3820
         var wh = window.innerHeight;
3820 3821
         if (_y > wh - fixedMenu.clientHeight) {
@@ -3823,11 +3824,11 @@ export class FuwutaiComponent implements OnInit {
3823 3824
         fixedMenu.style.top = _y + "px";
3824 3825
       };
3825 3826
       document.onmouseup = function () {
3826
-        fixedMenu.style.cursor = "default";
3827
-        this.onmousemove = null;
3828
-        this.onmouseup = null;
3827
+        fixedMenu.classList.remove('maskFull');
3828
+        document.onmousemove = null;
3829
+        document.onmouseup = null;
3829 3830
       };
3830
-      // return false;
3831
+      return false;
3831 3832
     };
3832 3833
   }
3833 3834
 
@@ -4155,4 +4156,14 @@ export class FuwutaiComponent implements OnInit {
4155 4156
     this.handleModalShow = false;
4156 4157
     this.showPromptModalRefresh();
4157 4158
   }
4159
+
4160
+  // 回访
4161
+  visitShow = false; //业务数据弹窗开关
4162
+  visitOrder() {
4163
+    this.visitShow = true;
4164
+  }
4165
+  // 关闭业务数据弹窗
4166
+  closeVisit(e) {
4167
+    this.visitShow = JSON.parse(e).show;
4168
+  }
4158 4169
 }

+ 2 - 0
src/app/views/fuwutai/fuwutai.module.ts

@@ -13,6 +13,7 @@ import { IncidentDetailModule } from 'src/app/components/incidentManagement/inci
13 13
 import { IncidentRejectModule } from 'src/app/components/incidentManagement/incident-reject/incident-reject.module';
14 14
 import { IncidentSubstitutionModule } from 'src/app/components/incidentManagement/incident-substitution/incident-substitution.module';
15 15
 import { IncidentHandleModule } from 'src/app/components/incidentManagement/incident-handle/incident-handle.module';
16
+import { IncidentSerVisitModule } from 'src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.module';
16 17
 
17 18
 
18 19
 @NgModule({
@@ -31,6 +32,7 @@ import { IncidentHandleModule } from 'src/app/components/incidentManagement/inci
31 32
     IncidentRejectModule,
32 33
     IncidentSubstitutionModule,
33 34
     IncidentHandleModule,
35
+    IncidentSerVisitModule,
34 36
   ]
35 37
 })
36 38
 export class FuwutaiModule { }