seimin 2 月之前
父節點
當前提交
66aeeec9f6
共有 38 個文件被更改,包括 3163 次插入32 次删除
  1. 1 1
      proxy.conf.json
  2. 12 0
      src/app/app-routing.module.ts
  3. 22 0
      src/app/guard/inspectClosedLoopView.guard.ts
  4. 31 3
      src/app/services/main.service.ts
  5. 72 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.html
  6. 193 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.less
  7. 196 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.ts
  8. 25 0
      src/app/share/select-date-yytime/select-date-yytime.component.html
  9. 131 0
      src/app/share/select-date-yytime/select-date-yytime.component.less
  10. 57 0
      src/app/share/select-date-yytime/select-date-yytime.component.ts
  11. 24 0
      src/app/share/select-date/select-date.component.html
  12. 135 0
      src/app/share/select-date/select-date.component.less
  13. 47 0
      src/app/share/select-date/select-date.component.ts
  14. 9 0
      src/app/share/share.module.ts
  15. 17 0
      src/app/views/batch-inspection/batch-inspection-routing.module.ts
  16. 90 0
      src/app/views/batch-inspection/batch-inspection.component.html
  17. 134 0
      src/app/views/batch-inspection/batch-inspection.component.less
  18. 580 0
      src/app/views/batch-inspection/batch-inspection.component.ts
  19. 17 0
      src/app/views/batch-inspection/batch-inspection.module.ts
  20. 1 1
      src/app/views/hushijiandan/hushijiandan.component.html
  21. 3 0
      src/app/views/hushijiandan/hushijiandan.component.ts
  22. 17 0
      src/app/views/inspect-closed-loop-view/inspect-closed-loop-view-routing.module.ts
  23. 73 0
      src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.html
  24. 139 0
      src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.less
  25. 188 0
      src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.ts
  26. 17 0
      src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.module.ts
  27. 1 0
      src/app/views/main/main.component.html
  28. 10 1
      src/app/views/main/main.component.ts
  29. 25 0
      src/app/views/patient-inspect-log-detail/patient-inspect-log-detail-routing.module.ts
  30. 173 0
      src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.html
  31. 578 0
      src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.less
  32. 117 0
      src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.ts
  33. 19 0
      src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.module.ts
  34. 2 3
      src/app/views/patient-inspect-log/patient-inspect-log-routing.module.ts
  35. 2 19
      src/app/views/patient-inspect-log/patient-inspect-log.component.html
  36. 2 2
      src/app/views/patient-inspect-log/patient-inspect-log.component.ts
  37. 0 2
      src/app/views/patient-inspect-log/patient-inspect-log.module.ts
  38. 3 0
      src/common.less

+ 1 - 1
proxy.conf.json

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

+ 12 - 0
src/app/app-routing.module.ts

@@ -31,6 +31,7 @@ import { DataGenerateGuard } from './guard/DataGenerate.guard';
31 31
 import { SystemConfigGuard } from './guard/SystemConfig.guard';
32 32
 // 故障实时播报权限
33 33
 import { RealtimeBroadcastGuard } from './guard/realtimeBroadcast.guard';
34
+import { InspectClosedLoopViewGuard } from './guard/inspectClosedLoopView.guard';
34 35
 const routes: Routes = [
35 36
   // 默认
36 37
   {
@@ -194,6 +195,17 @@ const routes: Routes = [
194 195
     path: "newStatistics",
195 196
     loadChildren: () => import("./views/new-statistics/new-statistics.module").then((m) => m.NewStatisticsModule),
196 197
   },
198
+  // 批量发起陪检
199
+  {
200
+    path: 'batchInspection',
201
+    loadChildren: () => import('./views/batch-inspection/batch-inspection.module').then(m => m.BatchInspectionModule),
202
+  },
203
+  // 陪检闭环视图
204
+  {
205
+    path: 'inspectClosedLoopView',
206
+    loadChildren: () => import('./views/inspect-closed-loop-view/inspect-closed-loop-view.module').then(m => m.InspectClosedLoopViewModule),
207
+    canActivate: [InspectClosedLoopViewGuard]
208
+  },
197 209
   // 临时路由
198 210
   {
199 211
     path: "redirect",

+ 22 - 0
src/app/guard/inspectClosedLoopView.guard.ts

@@ -0,0 +1,22 @@
1
+import { Injectable } from '@angular/core';
2
+import { CanActivate, Router } from '@angular/router';
3
+
4
+@Injectable({
5
+  providedIn: 'root'
6
+})
7
+export class InspectClosedLoopViewGuard implements CanActivate  {
8
+  constructor(public router: Router) { }
9
+
10
+  canActivate(): boolean {
11
+    const menus = JSON.parse(localStorage.getItem('menu'));
12
+    let can = false;
13
+    if (menus) {
14
+      can = menus.some(e => e.link == 'inspectClosedLoopView');
15
+    }
16
+    if (!can) {
17
+      this.router.navigate(['login']);
18
+      return false
19
+    }
20
+    return true;
21
+  }
22
+}

+ 31 - 3
src/app/services/main.service.ts

@@ -2,7 +2,7 @@ import { Injectable } from "@angular/core";
2 2
 import { HttpClient, HttpHeaders } from "@angular/common/http";
3 3
 
4 4
 import host from "../../assets/js/http";
5
-import { Observable } from "rxjs";
5
+import { Observable, of } from "rxjs";
6 6
 import { AES, mode, pad, enc } from "crypto-js";
7 7
 import { MarkingService } from './marking.service';
8 8
 
@@ -1119,12 +1119,40 @@ export class MainService {
1119 1119
 		  headers: this.headers,
1120 1120
 		});
1121 1121
 	}
1122
-	
1122
+
1123 1123
 	// 闭环数据生成-查询数据
1124 1124
 	queryCount(data){
1125 1125
 		return this.http.post(host.host + `/api/patchData/queryCount`, data, {
1126 1126
 		  headers: this.headers,
1127 1127
 		});
1128 1128
 	}
1129
-	
1129
+
1130
+  // 根据当前日期查询陪检批量建单设置中的默认时间
1131
+	getPatientInspectTime(data = {}){
1132
+		return this.http.post(host.host + `/nurse/patientInspect/getPatientInspectTime`, data, {
1133
+		  headers: this.headers,
1134
+		});
1135
+	}
1136
+
1137
+  // 根据当前日期查询陪检批量建单设置中的默认时间
1138
+	bindPatientInspect(data = {}){
1139
+		return this.http.post(host.host + `/nurse/patientInspect/bindPatientInspect`, data, {
1140
+		  headers: this.headers,
1141
+		});
1142
+	}
1143
+
1144
+  // 根据当患者查检查
1145
+	getPatientInspectList(data = {}){
1146
+		return this.http.post(host.host + `/nurse/patientInspect/getPatientInspectList`, data, {
1147
+		  headers: this.headers,
1148
+		});
1149
+	}
1150
+
1151
+  // 批量-检查项目转检验项目
1152
+	addPatientInspectList(data = {}){
1153
+		return this.http.post(host.host + `/nurse/patientInspect/addPatientInspectList`, data, {
1154
+		  headers: this.headers,
1155
+		});
1156
+	}
1157
+
1130 1158
 }

+ 72 - 0
src/app/share/add-inspect-modal/add-inspect-modal.component.html

@@ -0,0 +1,72 @@
1
+<div class="modal display_flex justify-content_flex-center 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="patient">
6
+        <span>患者姓名:{{patientInspectLogDTO.patientName}}</span>
7
+        <span *ngIf="patientInspectLogDTO.patientType && patientInspectLogDTO.patientType.value == 'I'">住院号:{{patientInspectLogDTO.patientCode}}({{patientInspectLogDTO.bedNum}})</span>
8
+        <span *ngIf="patientInspectLogDTO.patientType && patientInspectLogDTO.patientType.value == 'O'">门诊号:{{patientInspectLogDTO.patientCode}}</span>
9
+        <span *ngIf="patientInspectLogDTO.patientType && patientInspectLogDTO.patientType.value == 'E'">急诊号:{{patientInspectLogDTO.patientCode}}</span>
10
+        <span>护理级别:{{patientInspectLogDTO.careLevel?.name}}</span>
11
+        <span>危重等级:{{patientInspectLogDTO.illnessState?.name}}</span>
12
+      </div>
13
+      <div class="tabs">
14
+        <div class="tab" [ngClass]="{ active: activeTabId == item.id }" *ngFor="let item of tabList" (click)="selectTab(item.id)">{{item.name}}</div>
15
+      </div>
16
+      <div class="tableWrap">
17
+        <ng-container *ngIf="activeTabId == 1">
18
+          <nz-table class="hospitalTable" [nzData]="data1List" nzSize="middle" [nzShowPagination]="false"
19
+            [nzLoading]="hsLoading" (nzCurrentPageDataChange)="currentPageData1Change($event)" [nzScroll]="{ y: '400px' }">
20
+            <thead>
21
+              <tr class="thead">
22
+                <th nzWidth="4%" nzShowCheckbox [(nzChecked)]="isAllDisplayData1Checked" [nzIndeterminate]="isIndeterminateData1"
23
+                  (nzCheckedChange)="checkAllData1($event)"></th>
24
+                <th nzWidth="32%">检查项目</th>
25
+                <th nzWidth="32%">检查地点</th>
26
+                <th nzWidth="32%">预约时间</th>
27
+              </tr>
28
+            </thead>
29
+            <tbody>
30
+              <tr *ngFor="let data of data1List;let i = index;" (click)="selectedListData1(data.id)">
31
+                <td nzShowCheckbox [(nzChecked)]="mapOfCheckedData1Id[data.id]" (nzCheckedChange)="refreshData1Status()"></td>
32
+                <td>{{ data.inspectName}}</td>
33
+                <td>{{ deptDisplay == 2 ? data.execDept?.deptalias : data.execDept?.dept }}</td>
34
+                <td>{{ data.yyTime | date:"yyyy-MM-dd HH:mm" }}</td>
35
+              </tr>
36
+            </tbody>
37
+          </nz-table>
38
+        </ng-container>
39
+
40
+        <ng-container *ngIf="activeTabId == 2">
41
+          <div class="inspectType">
42
+            检查类型:<u *ngFor="let item of inspectCheckItemList" (click)="clickInspectCheckItem(item.id)" [ngClass]="{ active: activeInspectCheckItemId == item.id }">{{item.name}}</u>
43
+          </div>
44
+          <nz-table class="hospitalTable" [nzData]="data2List" nzSize="middle" [nzShowPagination]="false"
45
+            [nzLoading]="hsLoading" (nzCurrentPageDataChange)="currentPageData2Change($event)" [nzScroll]="{ y: '400px' }">
46
+            <thead>
47
+              <tr class="thead">
48
+                <th nzWidth="4%" nzShowCheckbox [(nzChecked)]="isAllDisplayData2Checked" [nzIndeterminate]="isIndeterminateData2"
49
+                  (nzCheckedChange)="checkAllData2($event)"></th>
50
+                <th nzWidth="32%">检查项目</th>
51
+                <th nzWidth="32%">检查地点</th>
52
+                <th nzWidth="32%">检查类型</th>
53
+              </tr>
54
+            </thead>
55
+            <tbody>
56
+              <tr *ngFor="let data of data2List;let i = index;" (click)="selectedListData2(data.id)">
57
+                <td nzShowCheckbox [(nzChecked)]="mapOfCheckedData2Id[data.id]" (nzCheckedChange)="refreshData2Status()"></td>
58
+                <td>{{ data.name}}</td>
59
+                <td>{{ deptDisplay == 2 ? data.extra4DTO?.deptalias : data.extra4DTO?.dept }}</td>
60
+                <td>{{ data.extra5DTO?.name }}</td>
61
+              </tr>
62
+            </tbody>
63
+          </nz-table>
64
+        </ng-container>
65
+      </div>
66
+    </div>
67
+    <div class="display_flex justify-content_flex-center">
68
+      <button class="btn" nz-button nzType="primary" (click)="confirmModal()">确认</button>
69
+      <button class="btn cancel" nz-button nzType="default" (click)="hideModal()">取消</button>
70
+    </div>
71
+  </div>
72
+</div>

+ 193 - 0
src/app/share/add-inspect-modal/add-inspect-modal.component.less

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

+ 196 - 0
src/app/share/add-inspect-modal/add-inspect-modal.component.ts

@@ -0,0 +1,196 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { MainService } from '../../services/main.service';
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { startOfDay, format } from 'date-fns';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+@Component({
7
+  selector: 'app-add-inspect-modal',
8
+  templateUrl: './add-inspect-modal.component.html',
9
+  styleUrls: ['./add-inspect-modal.component.less']
10
+})
11
+export class AddInspectModalComponent implements OnInit {
12
+  // 切换科室,切换弹窗
13
+  isAllDisplayData1Checked = false;
14
+  isAllDisplayData2Checked = false;
15
+  listOfDisplayData1: any[] = [];
16
+  listOfDisplayData2: any[] = [];
17
+  mapOfCheckedData1Id: { [key: string]: boolean } = {};
18
+  mapOfCheckedData2Id: { [key: string]: boolean } = {};
19
+  isIndeterminateData1 = false;
20
+  isIndeterminateData2 = false;
21
+  currentDept; //当前科室
22
+
23
+  hosId;
24
+  hsLoading = false;
25
+  data1List: any = [];// 列表
26
+  data2List: any = [];// 列表
27
+
28
+  tabList:any[] = [
29
+    {id: 1, name: '检验项目'},
30
+    {id: 2, name: '手动添加'},
31
+  ]
32
+  activeTabId: number = 1;
33
+  @Input() patientInspectLogDTO: any;
34
+  @Input() deptDisplay: any;
35
+
36
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
37
+  @Output() confirmModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
38
+
39
+  constructor(
40
+    private mainService: MainService,
41
+    private tool: ToolService,
42
+    private message: NzMessageService,
43
+  ) { }
44
+
45
+  ngOnInit() {
46
+    this.hosId = this.tool.getCurrentHospital().id;
47
+    this.currentDept = this.tool.getCurrentUserDept();
48
+    this.getList();
49
+  }
50
+
51
+  // 选择tab
52
+  selectTab(id){
53
+    this.activeTabId = id;
54
+    this.getList();
55
+  }
56
+
57
+  currentPageData1Change($event: any[]): void {
58
+    this.listOfDisplayData1 = this.data1List; //改变页数,长度也要变
59
+    this.refreshData1Status();
60
+  }
61
+
62
+  currentPageData2Change($event: any[]): void {
63
+    this.listOfDisplayData2 = this.data2List; //改变页数,长度也要变
64
+    this.refreshData2Status();
65
+  }
66
+
67
+  refreshData1Status(): void {
68
+    this.isAllDisplayData1Checked = this.listOfDisplayData1.every(
69
+      (item) => this.mapOfCheckedData1Id[item.id]
70
+    );
71
+    this.isIndeterminateData1 =
72
+      this.listOfDisplayData1.some((item) => this.mapOfCheckedData1Id[item.id]) &&
73
+      !this.isAllDisplayData1Checked;
74
+  }
75
+
76
+  refreshData2Status(): void {
77
+    this.isAllDisplayData2Checked = this.listOfDisplayData2.every(
78
+      (item) => this.mapOfCheckedData2Id[item.id]
79
+    );
80
+    this.isIndeterminateData2 =
81
+      this.listOfDisplayData2.some((item) => this.mapOfCheckedData2Id[item.id]) &&
82
+      !this.isAllDisplayData2Checked;
83
+  }
84
+
85
+  // 开通科室选择整行
86
+  selectedListData1(id) {
87
+    this.mapOfCheckedData1Id[id] = !this.mapOfCheckedData1Id[id];
88
+    this.refreshData1Status();
89
+  }
90
+
91
+  // 开通科室选择整行
92
+  selectedListData2(id) {
93
+    this.mapOfCheckedData2Id[id] = !this.mapOfCheckedData2Id[id];
94
+    this.refreshData2Status();
95
+  }
96
+
97
+  checkAllData1(value: boolean): void {
98
+    this.listOfDisplayData1.forEach(
99
+      (item) => (this.mapOfCheckedData1Id[item.id] = value)
100
+    );
101
+    this.refreshData1Status();
102
+  }
103
+
104
+  checkAllData2(value: boolean): void {
105
+    this.listOfDisplayData2.forEach(
106
+      (item) => (this.mapOfCheckedData2Id[item.id] = value)
107
+    );
108
+    this.refreshData2Status();
109
+  }
110
+
111
+  // 确认弹窗
112
+  confirmModal() {
113
+    console.log(this[`mapOfCheckedData${this.activeTabId}Id`]);
114
+    let list = [];
115
+    for (const key in this[`mapOfCheckedData${this.activeTabId}Id`]) {
116
+      if (this[`mapOfCheckedData${this.activeTabId}Id`][key]) {
117
+        list.push({id: key});
118
+      }
119
+    }
120
+    if(list.length == 0){
121
+      this.message.warning('请选择数据');
122
+      return;
123
+    }
124
+    this.confirmModelHs.emit(JSON.stringify({ show: false, list, type: this.activeTabId }));//emits(向上弹射)事件
125
+  }
126
+
127
+  // 关闭弹窗
128
+  hideModal() {
129
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
130
+  }
131
+
132
+  getList(){
133
+    if(this.activeTabId == 1){
134
+      this.getList1();
135
+    }else if(this.activeTabId == 2){
136
+      this.getInspectCheckItem();
137
+      this.getList2();
138
+    }
139
+  }
140
+
141
+  // 获取列表数据
142
+  getList1() {
143
+    let postData = {
144
+      startTime: format(startOfDay(new Date()), 'yyyy-MM-dd HH:mm:ss'),
145
+      patientCodes: this.patientInspectLogDTO.patientCode,
146
+      inspectStateValue: 1,//待陪检
147
+      noneGdid: 1,//未绑定工单
148
+      nonePilId: 1,//未绑定患者闭环
149
+      deptId: this.currentDept.id,
150
+    }
151
+    this.hsLoading = true;
152
+    this.mainService.getPatientInspectList(postData).subscribe((data: any) => {
153
+      this.hsLoading = false;
154
+      this.data1List = data.list || [];
155
+    })
156
+  }
157
+
158
+  // 获取列表数据
159
+  getList2() {
160
+    let postData = {
161
+      idx: 0,
162
+      sum: 9999,
163
+      dictionary: {
164
+        key: 'inspect_check_type',
165
+        extra5: this.activeInspectCheckItemId,
166
+      }
167
+    }
168
+    this.hsLoading = true;
169
+    this.mainService.getFetchDataList('simple/data','dictionary',postData).subscribe(data => {
170
+      this.hsLoading = false;
171
+      this.data2List = data.list || [];
172
+    })
173
+  }
174
+
175
+  // 获取检查项目
176
+  inspectCheckItemList:any[] = [];
177
+  activeInspectCheckItemId;
178
+  getInspectCheckItem() {
179
+    this.mainService.getDictionary("list", "inspect_check_item").subscribe((data) => {
180
+			this.inspectCheckItemList = data || [];
181
+		});
182
+  }
183
+
184
+  clickInspectCheckItem(id){
185
+    if(this.activeInspectCheckItemId == id){
186
+      this.activeInspectCheckItemId = undefined;
187
+    }else{
188
+      this.activeInspectCheckItemId = id;
189
+    }
190
+    this.getList2();
191
+  }
192
+
193
+}
194
+
195
+
196
+

+ 25 - 0
src/app/share/select-date-yytime/select-date-yytime.component.html

@@ -0,0 +1,25 @@
1
+<div class="save add display_flex align-items_center justify-content_flex-center">
2
+  <div class="modalBody">
3
+    <div class="title">修改预约时间<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
4
+    </div>
5
+    <div class="content">
6
+      <div class="addForm">
7
+        <div class="display_flex align-items_center">
8
+          <div>
9
+            <nz-date-picker [(ngModel)]="yyDate" [nzShowToday]="false"></nz-date-picker>
10
+            <nz-time-picker [nzDisabled]="!yyDate" class="ml8" nzFormat="HH:mm" [(ngModel)]="yyTime" [nzAllowEmpty]="false">
11
+            </nz-time-picker>
12
+            <button [disabled]="!yyDate" nz-button nzType="primary" class="ml8 mt0" (click)="nextDay()">
13
+              下一日
14
+            </button>
15
+          </div>
16
+        </div>
17
+      </div>
18
+    </div>
19
+    <div class="display_flex justify-content_flex-center">
20
+      <button class="btn" nzType="primary" nz-button (click)="submitFormYytime()">预约陪检</button>
21
+      <button class="btn" nzType="primary" nz-button (click)="submitFormDirect()">立即执行</button>
22
+      <button class="btn cancel" nz-button nzType="default" (click)="hideModal()">取消</button>
23
+    </div>
24
+  </div>
25
+</div>

+ 131 - 0
src/app/share/select-date-yytime/select-date-yytime.component.less

@@ -0,0 +1,131 @@
1
+.yyTimeError {
2
+  ::ng-deep .ant-time-picker-input,
3
+  ::ng-deep .ant-calendar-picker-input {
4
+    border: 1px solid red !important;
5
+  }
6
+}
7
+.save {
8
+  position: fixed;
9
+  left: 0;
10
+  top: 0;
11
+  width: 100%;
12
+  height: 100%;
13
+  background: rgba(0, 0, 0, 0.4);
14
+  z-index: 999;
15
+
16
+  .modalBody {
17
+    width: 350px;
18
+    background: #fff;
19
+    border-radius: 5px;
20
+    padding: 10px 20px;
21
+    color: #333;
22
+
23
+    .title {
24
+      width: 100%;
25
+      text-align: center;
26
+      font-size: 18px;
27
+      position: relative;
28
+
29
+      i {
30
+        position: absolute;
31
+        right: 0;
32
+        top: 0;
33
+        font-size: 20px;
34
+        color: #666;
35
+        cursor: pointer;
36
+        padding: 0 5px;
37
+      }
38
+    }
39
+
40
+    .content {
41
+      width: 100%;
42
+      height: 117px;
43
+      background: #f9fafb;
44
+      border: 1px solid #e5e9ed;
45
+      border-radius: 5px;
46
+      overflow: hidden;
47
+      margin-top: 12px;
48
+
49
+      .tips{
50
+        margin-bottom: 19px;
51
+      }
52
+
53
+      div {
54
+        text-align: center;
55
+        margin: 0;
56
+
57
+        &.icon {
58
+          margin-top: 17px;
59
+
60
+          i {
61
+            color: #34b349;
62
+            font-size: 30px !important;
63
+
64
+            &.transport-wenhao {
65
+              color: #f5a523;
66
+            }
67
+
68
+            &.transport-shibai {
69
+              color: #ff3a52;
70
+            }
71
+          }
72
+        }
73
+
74
+        &.defeat {
75
+          color: #333;
76
+          font-size: 16px;
77
+        }
78
+
79
+        &:nth-child(3) {
80
+          font-size: 14px;
81
+          color: #666;
82
+        }
83
+      }
84
+    }
85
+
86
+    button {
87
+      margin-top: 10px;
88
+
89
+      &.btn {
90
+        margin-left: 8px;
91
+      }
92
+    }
93
+  }
94
+
95
+  // 新增
96
+  &.add {
97
+    .modalBody {
98
+      width: 480px;
99
+      height: auto;
100
+
101
+      .content {
102
+        width: 100%;
103
+        height: auto;
104
+        padding: 19px 14px;
105
+        max-height: 500px;
106
+        overflow-y: auto;
107
+
108
+        .addForm {
109
+          .ant-form-item {
110
+            margin-bottom: 14px;
111
+
112
+            .ant-form-item-label {
113
+              line-height: 14px;
114
+              text-align: left;
115
+            }
116
+          }
117
+        }
118
+
119
+        .editForm {
120
+          .ant-form-item {
121
+            margin-bottom: 14px;
122
+
123
+            .ant-form-item-label {
124
+              line-height: 0;
125
+            }
126
+          }
127
+        }
128
+      }
129
+    }
130
+  }
131
+}

+ 57 - 0
src/app/share/select-date-yytime/select-date-yytime.component.ts

@@ -0,0 +1,57 @@
1
+import { Component, OnInit, Output, Input } from '@angular/core';
2
+import { EventEmitter } from '@angular/core';
3
+import { NzMessageService } from 'ng-zorro-antd';
4
+import { addDays, startOfMinute, format } from 'date-fns';
5
+
6
+@Component({
7
+  selector: 'app-select-date-yytime',
8
+  templateUrl: './select-date-yytime.component.html',
9
+  styleUrls: ['./select-date-yytime.component.less']
10
+})
11
+export class SelectDateYytimeComponent implements OnInit {
12
+  @Input() date:any;
13
+  @Output() submitFormYytimeE = new EventEmitter();
14
+  @Output() submitFormDirectE = new EventEmitter();
15
+  @Output() cancelFlagHand = new EventEmitter();
16
+  yyDate = null; //预约日期-患者其他服务
17
+  yyTime = null; //预约时间-患者其他服务
18
+  constructor(
19
+    private message: NzMessageService,
20
+  ) { }
21
+
22
+  ngOnInit() {
23
+    if(this.date){
24
+      this.yyDate = new Date(this.date);
25
+      this.yyTime = new Date(this.date);
26
+    }
27
+  }
28
+
29
+  // 下一日(患者其他服务)
30
+  nextDay() {
31
+    this.yyDate = addDays(this.yyDate, 1);
32
+  }
33
+
34
+  // 隐藏模态框
35
+  hideModal() {
36
+    this.cancelFlagHand.emit(false)
37
+  }
38
+
39
+  // 预约陪检
40
+  submitFormYytime(): void {
41
+    if(!this.yyDate || !this.yyTime) {
42
+      this.message.warning('请选择完整预约时间');
43
+      return;
44
+    }
45
+    this.submitFormYytimeE.emit(format(this.yyDate, 'yyyy-MM-dd') + ' ' + format(startOfMinute(this.yyTime), 'HH:mm:ss'));
46
+  }
47
+
48
+  // 立即执行
49
+  submitFormDirect(): void {
50
+    if(!this.yyDate || !this.yyTime) {
51
+      this.message.warning('请选择完整预约时间');
52
+      return;
53
+    }
54
+    this.submitFormDirectE.emit(format(this.yyDate, 'yyyy-MM-dd') + ' ' + format(startOfMinute(this.yyTime), 'HH:mm:ss'));
55
+  }
56
+}
57
+

+ 24 - 0
src/app/share/select-date/select-date.component.html

@@ -0,0 +1,24 @@
1
+<div class="save add display_flex align-items_center justify-content_flex-center">
2
+  <div class="modalBody">
3
+    <div class="title">修改预约时间<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
4
+    </div>
5
+    <div class="content">
6
+      <div class="addForm">
7
+        <div class="display_flex align-items_center">
8
+          <div>
9
+            <nz-date-picker [(ngModel)]="yyDate" [nzShowToday]="false"></nz-date-picker>
10
+            <nz-time-picker [nzDisabled]="!yyDate" class="ml8" nzFormat="HH:mm" [(ngModel)]="yyTime" [nzAllowEmpty]="false">
11
+            </nz-time-picker>
12
+            <button [disabled]="!yyDate" nz-button nzType="primary" class="ml8 mt0" (click)="nextDay()">
13
+              下一日
14
+            </button>
15
+          </div>
16
+        </div>
17
+      </div>
18
+    </div>
19
+    <div class="display_flex justify-content_flex-center">
20
+      <button nzType="primary" nz-button (click)="submitForm()">确认</button>
21
+      <button class="btn cancel" nz-button nzType="default" (click)="hideModal()">取消</button>
22
+    </div>
23
+  </div>
24
+</div>

+ 135 - 0
src/app/share/select-date/select-date.component.less

@@ -0,0 +1,135 @@
1
+.yyTimeError {
2
+  ::ng-deep .ant-time-picker-input,
3
+  ::ng-deep .ant-calendar-picker-input {
4
+    border: 1px solid red !important;
5
+  }
6
+}
7
+.save {
8
+  position: fixed;
9
+  left: 0;
10
+  top: 0;
11
+  width: 100%;
12
+  height: 100%;
13
+  background: rgba(0, 0, 0, 0.4);
14
+  z-index: 999;
15
+
16
+  .modalBody {
17
+    width: 350px;
18
+    background: #fff;
19
+    border-radius: 5px;
20
+    padding: 10px 20px;
21
+    color: #333;
22
+
23
+    .title {
24
+      width: 100%;
25
+      text-align: center;
26
+      font-size: 18px;
27
+      position: relative;
28
+
29
+      i {
30
+        position: absolute;
31
+        right: 0;
32
+        top: 0;
33
+        font-size: 20px;
34
+        color: #666;
35
+        cursor: pointer;
36
+        padding: 0 5px;
37
+      }
38
+    }
39
+
40
+    .content {
41
+      width: 100%;
42
+      height: 117px;
43
+      background: #f9fafb;
44
+      border: 1px solid #e5e9ed;
45
+      border-radius: 5px;
46
+      overflow: hidden;
47
+      margin-top: 12px;
48
+
49
+      .tips{
50
+        margin-bottom: 19px;
51
+      }
52
+
53
+      div {
54
+        text-align: center;
55
+        margin: 0;
56
+
57
+        &.icon {
58
+          margin-top: 17px;
59
+
60
+          i {
61
+            color: #34b349;
62
+            font-size: 30px !important;
63
+
64
+            &.transport-wenhao {
65
+              color: #f5a523;
66
+            }
67
+
68
+            &.transport-shibai {
69
+              color: #ff3a52;
70
+            }
71
+          }
72
+        }
73
+
74
+        &.defeat {
75
+          color: #333;
76
+          font-size: 16px;
77
+        }
78
+
79
+        &:nth-child(3) {
80
+          font-size: 14px;
81
+          color: #666;
82
+        }
83
+      }
84
+    }
85
+
86
+    button {
87
+      margin-top: 10px;
88
+
89
+      &.btn {
90
+        margin-left: 8px;
91
+      }
92
+    }
93
+  }
94
+
95
+  // 新增
96
+  &.add {
97
+    .modalBody {
98
+      width: 480px;
99
+      height: auto;
100
+
101
+      .content {
102
+        width: 100%;
103
+        height: auto;
104
+        padding: 19px 14px;
105
+        max-height: 500px;
106
+        overflow-y: auto;
107
+
108
+        .addForm {
109
+          .ant-form-item {
110
+            margin-bottom: 14px;
111
+
112
+            .ant-form-item-label {
113
+              line-height: 14px;
114
+              text-align: left;
115
+            }
116
+          }
117
+        }
118
+
119
+        .editForm {
120
+          .ant-form-item {
121
+            margin-bottom: 14px;
122
+
123
+            .ant-form-item-label {
124
+              line-height: 0;
125
+            }
126
+          }
127
+        }
128
+      }
129
+
130
+      button:nth-child(1) {
131
+        margin-right: 20px;
132
+      }
133
+    }
134
+  }
135
+}

+ 47 - 0
src/app/share/select-date/select-date.component.ts

@@ -0,0 +1,47 @@
1
+import { Component, OnInit, Output, Input } from '@angular/core';
2
+import { EventEmitter } from '@angular/core';
3
+import { NzMessageService } from 'ng-zorro-antd';
4
+import { addDays, startOfMinute, format } from 'date-fns';
5
+
6
+@Component({
7
+  selector: 'app-select-date',
8
+  templateUrl: './select-date.component.html',
9
+  styleUrls: ['./select-date.component.less']
10
+})
11
+export class SelectDateComponent implements OnInit {
12
+  @Input() date:any;
13
+  @Output() submitFormHand = new EventEmitter();
14
+  @Output() cancelFlagHand = new EventEmitter();
15
+  yyDate = null; //预约日期-患者其他服务
16
+  yyTime = null; //预约时间-患者其他服务
17
+  constructor(
18
+    private message: NzMessageService,
19
+  ) { }
20
+
21
+  ngOnInit() {
22
+    if(this.date){
23
+      this.yyDate = new Date(this.date);
24
+      this.yyTime = new Date(this.date);
25
+    }
26
+  }
27
+
28
+  // 下一日(患者其他服务)
29
+  nextDay() {
30
+    this.yyDate = addDays(this.yyDate, 1);
31
+  }
32
+
33
+  // 隐藏模态框
34
+  hideModal() {
35
+    this.cancelFlagHand.emit(false)
36
+  }
37
+
38
+  // 表单提交
39
+  submitForm(): void {
40
+    if(!this.yyDate || !this.yyTime) {
41
+      this.message.warning('请选择完整预约时间');
42
+      return;
43
+    }
44
+    this.submitFormHand.emit(format(this.yyDate, 'yyyy-MM-dd') + ' ' + format(startOfMinute(this.yyTime), 'HH:mm:ss'));
45
+  }
46
+}
47
+

+ 9 - 0
src/app/share/share.module.ts

@@ -59,6 +59,9 @@ import { PathologyAddComponent } from './pathology-add/pathology-add.component';
59 59
 import { PathologyDetailComponent } from './pathology-detail/pathology-detail.component';
60 60
 import { StringToFirstValuePipe } from '../pipes/string-to-first-name.pipe';
61 61
 import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info-modal/businessData-detail-info-modal.component';
62
+import { SelectDateComponent } from './select-date/select-date.component';
63
+import { AddInspectModalComponent } from './add-inspect-modal/add-inspect-modal.component';
64
+import { SelectDateYytimeComponent } from './select-date-yytime/select-date-yytime.component';
62 65
 
63 66
 @NgModule({
64 67
   declarations: [
@@ -121,6 +124,9 @@ import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info
121 124
     BloodHistoryPromptModalComponent,
122 125
     MedicalWasteHistoryPromptModalComponent,
123 126
     MedicalWasteLogPromptModalComponent,
127
+    SelectDateComponent,
128
+    AddInspectModalComponent,
129
+    SelectDateYytimeComponent,
124 130
   ],
125 131
   imports: [
126 132
     CommonModule,
@@ -191,6 +197,9 @@ import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info
191 197
     BloodHistoryPromptModalComponent,
192 198
     MedicalWasteHistoryPromptModalComponent,
193 199
     MedicalWasteLogPromptModalComponent,
200
+    SelectDateComponent,
201
+    AddInspectModalComponent,
202
+    SelectDateYytimeComponent,
194 203
   ]
195 204
 })
196 205
 export class ShareModule { }

+ 17 - 0
src/app/views/batch-inspection/batch-inspection-routing.module.ts

@@ -0,0 +1,17 @@
1
+import { NgModule } from '@angular/core';
2
+import { Routes, RouterModule } from '@angular/router';
3
+import { BatchInspectionComponent } from './batch-inspection.component';
4
+
5
+
6
+const routes: Routes = [
7
+  {
8
+    path: "",
9
+    component: BatchInspectionComponent,
10
+  },
11
+];
12
+
13
+@NgModule({
14
+  imports: [RouterModule.forChild(routes)],
15
+  exports: [RouterModule]
16
+})
17
+export class BatchInspectionRoutingModule { }

File diff suppressed because it is too large
+ 90 - 0
src/app/views/batch-inspection/batch-inspection.component.html


+ 134 - 0
src/app/views/batch-inspection/batch-inspection.component.less

@@ -0,0 +1,134 @@
1
+@import "../../../../src/theme.less";
2
+
3
+:host {
4
+  width: 100vw;
5
+  height: 100vh;
6
+  overflow: hidden;
7
+  background-color: #F0F2F5;
8
+  display: flex;
9
+  flex-direction: column;
10
+  .header{
11
+    height: 64px;
12
+    background-color: #fff;
13
+    display: flex;
14
+    align-items: center;
15
+    justify-content: space-between;
16
+    padding: 0 24px;
17
+    font-size: 16px;
18
+    .dept{
19
+      margin-right: 48px;
20
+    }
21
+    .patient{
22
+      margin-left: 24px;
23
+    }
24
+    .label{
25
+      padding-right: 16px;
26
+      font-size: 14px;
27
+    }
28
+    .formItem{
29
+      width: 173px;
30
+    }
31
+    .info{
32
+      margin-left: 48px;
33
+    }
34
+  }
35
+  .table{
36
+    flex: 1;
37
+    min-height: 0;
38
+    margin-top: 10px;
39
+    background-color: #fff;
40
+    overflow: auto;
41
+    padding: 8px 16px;
42
+    .patient{
43
+      position: relative;
44
+      .circle{
45
+        width: 8px;
46
+        height: 8px;
47
+        border-radius: 50%;
48
+        background-color: @primary-color;
49
+        position: absolute;
50
+        top: 50%;
51
+        left: -8px;
52
+        transform: translate(-50%,-50%);
53
+        &.red{
54
+          background-color: red;
55
+        }
56
+      }
57
+    }
58
+    .transport-weibiaoti2010104{
59
+      font-size: 15px;
60
+      color: #999;
61
+      margin-left: 10px;
62
+      margin-top: 3px;
63
+      cursor: pointer;
64
+    }
65
+    .transport-shanchu1{
66
+      font-size: 15px;
67
+      color: #999;
68
+      margin-left: 5px;
69
+      margin-top: 3px;
70
+      cursor: pointer;
71
+    }
72
+    .thead{
73
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
74
+      th {
75
+        background: transparent;
76
+        color: #fff;
77
+        text-align: center;
78
+      }
79
+    }
80
+    .ant-table-body {
81
+      border-bottom: 1px solid #e5e9ed;
82
+    }
83
+
84
+    .ant-table-tbody {
85
+      tr {
86
+        text-align: center;
87
+        color: #333;
88
+
89
+        td {
90
+          border: none;
91
+
92
+          &.tab_hover:hover{
93
+            text-decoration: underline;
94
+            cursor: pointer;
95
+          }
96
+
97
+          .coop {
98
+            button{
99
+              color: #333;
100
+            }
101
+            span,button {
102
+              display: inline-block;
103
+              padding: 0 8px;
104
+              cursor: pointer;
105
+              position: relative;
106
+
107
+              &::after {
108
+                content: "|";
109
+                position: absolute;
110
+                top: 0;
111
+                right: 0;
112
+              }
113
+
114
+              &:hover,
115
+              &:active {
116
+                color: @primary-color;
117
+              }
118
+
119
+              &:nth-last-child(1) {
120
+                &::after {
121
+                  content: "";
122
+                }
123
+              }
124
+            }
125
+          }
126
+        }
127
+      }
128
+    }
129
+  }
130
+  .footer{
131
+    height: 60px;
132
+    background-color: #fff;
133
+  }
134
+}

+ 580 - 0
src/app/views/batch-inspection/batch-inspection.component.ts

@@ -0,0 +1,580 @@
1
+import { Component, OnInit } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { startOfDay, endOfDay, format } from 'date-fns';
6
+import { Subject } from 'rxjs';
7
+import { debounceTime } from 'rxjs/operators';
8
+import { Location } from '@angular/common';
9
+import cloneDeep from 'lodash-es/cloneDeep'
10
+@Component({
11
+  selector: 'app-batch-inspection',
12
+  templateUrl: './batch-inspection.component.html',
13
+  styleUrls: ['./batch-inspection.component.less']
14
+})
15
+export class BatchInspectionComponent implements OnInit {
16
+
17
+  constructor(
18
+    private mainService: MainService,
19
+    private tool: ToolService,
20
+    private message: NzMessageService,
21
+    private _location: Location,
22
+  ) { }
23
+
24
+  dateRange: any = []; //预约时间
25
+  patientId: any; //患者
26
+  hosId:any = this.tool.getCurrentHospital().id; //当前院区
27
+  deptDTO:any = this.tool.getCurrentUserDept(); //当前科室
28
+  deptDisplay; //护士端是否显示可以别名,1是显示科室名称,2是显示科室别名
29
+  listOfData: any[] = []; //表格数据
30
+
31
+  searchTimerSubject = new Subject(); //防抖
32
+
33
+  ngOnInit() {
34
+    //防抖
35
+    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
36
+      let fun = v[0];
37
+      fun.call(this, v[1]);
38
+    });
39
+
40
+    this.tool.getDeptDisplay().subscribe((result) => {
41
+      if (result.status == 200) {
42
+        this.deptDisplay = result.list[0].valueconfig;
43
+      }
44
+    });
45
+
46
+    this.init();
47
+  }
48
+
49
+  // 修改出行方式
50
+  changeTripType(tripTypeId, id){
51
+    this.maskFlag = this.message.loading("正在加载中..", {
52
+      nzDuration: 0,
53
+    }).messageId;
54
+    let postData = this.listOfData.find(v => v.id == id);
55
+    this.mainService
56
+    .simplePost("addData", 'patientInspectLog', postData)
57
+    .subscribe((data) => {
58
+      this.message.remove(this.maskFlag);
59
+      this.maskFlag = false;
60
+      this.getList();
61
+      if (data.status == 200) {
62
+        this.message.success("修改出行方式成功");
63
+      } else {
64
+        this.message.success(data.msg || "修改出行方式失败");
65
+      }
66
+    });
67
+  }
68
+
69
+  init(){
70
+    this.getPatientInspectTime();
71
+    this.getWorkOrderInspectScore();
72
+    this.getList();
73
+  }
74
+
75
+  // 获取批量建单设置中的默认时间
76
+  getPatientInspectTime(){
77
+    this.mainService.getPatientInspectTime().subscribe((result:any) => {
78
+      if(result.startTime && result.endTime){
79
+        this.dateRange = [new Date(result.startTime), new Date(result.endTime)];
80
+      }else{
81
+        this.dateRange = [];
82
+      }
83
+    });
84
+  }
85
+
86
+  // 日期选择
87
+  onCalendarChangeDate(dateArr){
88
+    if(dateArr.length == 2){
89
+      this.dateRange = [startOfDay(dateArr[0]), endOfDay(dateArr[1])];
90
+    }
91
+  }
92
+
93
+  // 防抖
94
+  isLoading = false;
95
+  isSelecting:boolean = false; // 是否在选中状态
96
+  searchTimer(fun, e) {
97
+    if (this.isSelecting) {
98
+      this.isSelecting = false; // 重置标志
99
+      return; // 跳过处理
100
+    }
101
+    this.isLoading = true;
102
+    this.searchTimerSubject.next([fun, e]);
103
+  }
104
+
105
+  // 搜索
106
+  changeInp(type, e) {
107
+    if(type === 'patient'){
108
+      this.searchTimer(this.getPatientList, e);
109
+    }
110
+  }
111
+
112
+  // 设置标志
113
+  setIsSelecting(flag){
114
+    this.isSelecting = flag; // 设置标志
115
+  }
116
+
117
+
118
+  openChangePatient(flag){
119
+    flag && this.setIsSelecting(false);
120
+    flag && this.getPatientList();
121
+  }
122
+
123
+  // 获取患者
124
+  patientList: any = [];
125
+  getPatientList(e = undefined) {
126
+    let postData = {
127
+      idx: 0,
128
+      sum: 20,
129
+      patient: {
130
+        department: this.deptDTO,
131
+        keyWord: e,
132
+      }
133
+    };
134
+    this.isLoading = true;
135
+    this.mainService
136
+      .getFetchDataList("simple/data", "patient", postData)
137
+      .subscribe((data) => {
138
+        this.isLoading = false;
139
+        this.patientList = data.list || [];
140
+      });
141
+  }
142
+
143
+  maskFlag: any = false;
144
+
145
+  addPatientList(){
146
+    let postData = {
147
+      idx: 0,
148
+      sum: 9999,
149
+      patient: {
150
+        department: this.deptDTO,
151
+      }
152
+    };
153
+    this.maskFlag = this.message.loading("正在加载中..", {
154
+      nzDuration: 0,
155
+    }).messageId;
156
+    this.mainService
157
+      .getFetchDataList("simple/data", "patient", postData)
158
+      .subscribe((data) => {
159
+        let patientList = data.list || [];
160
+        this.patientActiveList = patientList;
161
+
162
+        if(!this.patientActiveList.length){
163
+          this.message.warning('没有找到患者');
164
+          return;
165
+        }
166
+
167
+        let postData = {
168
+          startTime: this.dateRange.length ? format(this.dateRange[0], 'yyyy-MM-dd HH:mm:ss') : undefined,
169
+          endTime: this.dateRange.length ? format(this.dateRange[1], 'yyyy-MM-dd HH:mm:ss') : undefined,
170
+          patientCodes: this.patientActiveList.map(v => v.patientCode).toString(),
171
+          inspectStateValue: 1,//待陪检
172
+          noneGdid: 1,//未绑定工单
173
+          nonePilId: 1,//未绑定患者闭环
174
+          deptId: this.deptDTO.id,
175
+        };
176
+
177
+        this.mainService
178
+          .getPatientInspectList(postData)
179
+          .subscribe((result:any) => {
180
+            this.message.remove(this.maskFlag);
181
+            this.maskFlag = false;
182
+            this.inspectActiveList = result.list || [];
183
+            this.showDelModal(this.patientActiveList, `您确认添加“<b class="red">${this.patientActiveList.length}</b>”位患者共“<b class="red">${this.inspectActiveList.length}</b>”项检查吗?`,'批量添加患者','add');
184
+          });
185
+      });
186
+  }
187
+
188
+  changePatientId(id){
189
+    this.setIsSelecting(true);
190
+    if(!id){
191
+      return;
192
+    }
193
+    setTimeout(() => {
194
+      this.patientId = null;
195
+    }, 0)
196
+    let patientDTO = this.patientList.find(v => v.id == id);
197
+    this.patientActiveList = [patientDTO];
198
+    let postData = {
199
+      startTime: this.dateRange.length ? format(this.dateRange[0], 'yyyy-MM-dd HH:mm:ss') : undefined,
200
+      endTime: this.dateRange.length ? format(this.dateRange[1], 'yyyy-MM-dd HH:mm:ss') : undefined,
201
+      patientCodes: patientDTO.patientCode,
202
+      inspectStateValue: 1,//待陪检
203
+      noneGdid: 1,//未绑定工单
204
+      nonePilId: 1,//未绑定患者闭环
205
+      deptId: this.deptDTO.id,
206
+    };
207
+    this.maskFlag = this.message.loading("正在加载中..", {
208
+      nzDuration: 0,
209
+    }).messageId;
210
+    this.mainService
211
+      .getPatientInspectList(postData)
212
+      .subscribe((result:any) => {
213
+        this.message.remove(this.maskFlag);
214
+        this.maskFlag = false;
215
+        this.inspectActiveList = result.list || [];
216
+        this.showDelModal(this.patientActiveList, `<b class="red">${patientDTO.patientName}</b>在时间范围内有<b class="red">${this.inspectActiveList.length}</b>项检查项目,是否确认添加?`,'添加','add');
217
+      });
218
+  }
219
+
220
+  inspectActiveList: any = [];//选中检查列表
221
+  patientActiveList: any = [];//选中患者列表
222
+
223
+  coopData: any = {}; //当前操作列
224
+  btnLoading: boolean = false; //提交按钮loading状态
225
+
226
+  delModal: boolean = false; //删除模态框
227
+  tipsMsg1: string; //提示框信息
228
+  tipsMsg2: string; //操作后信息
229
+  confirmDelType: string; //确认的类型(启用/停用,删除)
230
+  showDelModal(
231
+    data,
232
+    tipsMsg1: string,
233
+    tipsMsg2: string,
234
+    type: string,
235
+  ) {
236
+    this.confirmDelType = type;
237
+    this.delModal = true;
238
+    this.coopData = data;
239
+    this.tipsMsg1 = tipsMsg1;
240
+    this.tipsMsg2 = tipsMsg2;
241
+  }
242
+  // 隐藏删除框
243
+  hideDelModal() {
244
+    this.delModal = false;
245
+  }
246
+  // 确认删除
247
+  confirmDel() {
248
+    this.btnLoading = true;
249
+    if (this.confirmDelType === "del") {
250
+      //删除-移除患者
251
+      this.mainService
252
+        .simplePost("rmvData", "patientInspectLog", [this.coopData.id])
253
+        .subscribe((data) => {
254
+          this.btnLoading = false;
255
+          this.delModal = false;
256
+          if (data.status == 200) {
257
+            this.showPromptModal(this.tipsMsg2, true, "");
258
+          } else {
259
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
260
+          }
261
+        });
262
+    }else if (this.confirmDelType === "delInspect") {
263
+      //删除-检验项目
264
+      this.coopData.data.inspectList.forEach(v => {
265
+        if(v.id == this.coopData.inspect.id){
266
+          v.pilId = undefined;
267
+        }
268
+      })
269
+      let postData = {
270
+        type: 'plan',
271
+        pilList: [{
272
+          ...this.patientInspectLogDTO,
273
+          inspectList: this.coopData.data.inspectList.filter(v => v.id == this.coopData.inspect.id),
274
+        }]
275
+      }
276
+      this.mainService
277
+        .addPatientInspectList(postData)
278
+        .subscribe((data:any) => {
279
+          this.btnLoading = false;
280
+          this.delModal = false;
281
+          if (data.state == 200) {
282
+            this.showPromptModal('删除', true, "");
283
+          } else {
284
+            this.showPromptModal('删除', false, data.msg);
285
+          }
286
+        });
287
+    }else if (this.confirmDelType === "add") {
288
+      //新增-患者陪检闭环
289
+      let postData = {
290
+        patientIds: this.patientActiveList.map(v => v.id).toString() || undefined,
291
+      }
292
+      this.mainService
293
+        .bindPatientInspect(postData)
294
+        .subscribe((data:any) => {
295
+          this.btnLoading = false;
296
+          this.delModal = false;
297
+          if (data.state == 200) {
298
+            this.showPromptModal(this.tipsMsg2, true, "");
299
+          } else {
300
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
301
+          }
302
+        });
303
+    }else if (this.confirmDelType === "reset") {
304
+      //重置
305
+      let ids = this.listOfData.filter(v => v.state.value == 1).map(v => v.id);
306
+      this.mainService
307
+        .simplePost("rmvData", "patientInspectLog", ids)
308
+        .subscribe((data) => {
309
+          this.btnLoading = false;
310
+          this.delModal = false;
311
+          if (data.status == 200) {
312
+            this.showPromptModal(this.tipsMsg2, true, "");
313
+          } else {
314
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
315
+          }
316
+        });
317
+    }
318
+  }
319
+
320
+  // 修改检验项目
321
+  isShowSelectDate:boolean = false;
322
+  editInspect(data){
323
+    this.isShowSelectDate = true;
324
+    this.coopData = data;
325
+  }
326
+
327
+  // 修改检验项目-确定
328
+  submitSelectDate(date){
329
+    console.log(date)
330
+    this.coopData.data.inspectList.forEach(v => {
331
+      if(v.id == this.coopData.inspect.id){
332
+        v.yyTime = date;
333
+      }
334
+    })
335
+    let postData = {
336
+      type: 'plan',
337
+      pilList: [{
338
+        ...this.coopData.data,
339
+        inspectList: this.coopData.data.inspectList.filter(v => v.id == this.coopData.inspect.id),
340
+      }]
341
+    }
342
+    this.maskFlag = this.message.loading("正在加载中..", {
343
+      nzDuration: 0,
344
+    }).messageId;
345
+    this.mainService
346
+      .addPatientInspectList(postData)
347
+      .subscribe((data:any) => {
348
+        this.message.remove(this.maskFlag);
349
+        this.maskFlag = false;
350
+        if (data.state == 200) {
351
+          this.isShowSelectDate = false;
352
+          this.showPromptModal('修改', true, "");
353
+        } else {
354
+          this.showPromptModal('修改', false, data.msg);
355
+        }
356
+      });
357
+  }
358
+
359
+  // 修改检验项目-取消
360
+  cancelSelectDate(e) {
361
+    this.isShowSelectDate = false;
362
+  }
363
+
364
+
365
+  // 批量发起陪检
366
+  isShowSelectDateYytime:boolean = false;
367
+  addYytime(){
368
+    let obj1 = this.listOfData.find(v => v.tripType);
369
+    if(!obj1){
370
+      this.message.warning(`【${obj1.patientName}】请填写出行方式!`)
371
+      return;
372
+    }
373
+
374
+    let obj2 = this.listOfData.find(v => v.tripType);
375
+    if(!obj2){
376
+      this.message.warning(`【${obj2.patientName}】请追加项目!`)
377
+      return;
378
+    }
379
+    this.isShowSelectDateYytime = true;
380
+  }
381
+
382
+  // 批量发起陪检-预约陪检
383
+  submitSelectDateYytime(date){
384
+    console.log(date)
385
+    if(+date <= +new Date()){
386
+      this.message.warning(`预约时间不能小于当前时间!`)
387
+      return;
388
+    }
389
+    let pilList = cloneDeep(this.listOfData);
390
+    pilList.forEach(v => {
391
+      v.yyTime = date;
392
+      delete v.inspectList;
393
+    })
394
+    let postData = {
395
+      type: 'appointment',
396
+      pilList,
397
+    }
398
+    this.maskFlag = this.message.loading("正在加载中..", {
399
+      nzDuration: 0,
400
+    }).messageId;
401
+    this.mainService
402
+      .addPatientInspectList(postData)
403
+      .subscribe((data:any) => {
404
+        this.message.remove(this.maskFlag);
405
+        this.maskFlag = false;
406
+        if (data.state == 200) {
407
+          this.isShowSelectDateYytime = false;
408
+          this.showPromptModal('操作', true, "");
409
+        } else {
410
+          this.showPromptModal('操作', false, data.msg);
411
+        }
412
+      });
413
+  }
414
+
415
+  // 批量发起陪检-立即执行
416
+  submitSelectDateDirect(date){
417
+    console.log(date)
418
+    let pilList = cloneDeep(this.listOfData);
419
+    pilList.forEach(v => {
420
+      delete v.inspectList;
421
+    })
422
+    let postData = {
423
+      type: 'action',
424
+      pilList,
425
+    }
426
+    this.maskFlag = this.message.loading("正在加载中..", {
427
+      nzDuration: 0,
428
+    }).messageId;
429
+    this.mainService
430
+      .addPatientInspectList(postData)
431
+      .subscribe((data:any) => {
432
+        this.message.remove(this.maskFlag);
433
+        this.maskFlag = false;
434
+        if (data.state == 200) {
435
+          this.isShowSelectDateYytime = false;
436
+          this.showPromptModal('操作', true, "");
437
+        } else {
438
+          this.showPromptModal('操作', false, data.msg);
439
+        }
440
+      });
441
+  }
442
+
443
+  // 批量发起陪检-取消
444
+  cancelSelectDateYytime(e) {
445
+    this.isShowSelectDateYytime = false;
446
+  }
447
+
448
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
449
+  promptContent: string; //操作提示框提示信息
450
+  ifSuccess: boolean; //操作成功/失败
451
+  promptInfo: string; //操作结果提示信息
452
+  promptModalShow: boolean; //操作提示框是否展示
453
+  showPromptModal(con, success, promptInfo?) {
454
+    this.promptModalShow = false;
455
+    this.promptContent = con;
456
+    this.ifSuccess = success;
457
+    this.promptInfo = promptInfo;
458
+    setTimeout(() => {
459
+      this.promptModalShow = true;
460
+    }, 100);
461
+    this.getList();
462
+  }
463
+
464
+  loading1:boolean = false;
465
+  inspectTotalCount:number = 0;
466
+
467
+  getList(){
468
+    let data = {
469
+      idx: 0,
470
+      sum: 9999,
471
+      patientInspectLog: {
472
+        state: { value: '1,2' },
473
+        deptId: this.deptDTO ? this.deptDTO.id : undefined,
474
+      },
475
+    };
476
+    this.loading1 = true;
477
+    this.mainService
478
+      .getFetchDataList("simple/data", "patientInspectLog", data)
479
+      .subscribe((data) => {
480
+        this.loading1 = false;
481
+        if (data.status == 200) {
482
+          this.listOfData = data.list;
483
+          this.inspectTotalCount = this.listOfData.reduce((v, i) => v + i.planInspectCount, 0);
484
+        }else{
485
+          this.message.error(data.msg || "请求数据失败");
486
+        }
487
+      });
488
+  }
489
+
490
+  //获取出行方式
491
+  workOrderInspectScoreList:any[] = [];
492
+  getWorkOrderInspectScore() {
493
+    let postData = { idx: 0, sum: 9999, workOrderInspectScore: { hosId: this.hosId } };
494
+    this.mainService
495
+      .getFetchDataList("simple/data", "workOrderInspectScore", postData)
496
+      .subscribe((result) => {
497
+        if (result.status == 200) {
498
+          this.workOrderInspectScoreList = result.list || [];
499
+        } else {
500
+          this.message.error("请求数据失败");
501
+        }
502
+      });
503
+  }
504
+
505
+  // 返回
506
+  goBack(){
507
+    this._location.back();
508
+  }
509
+
510
+  // 追加项目
511
+  patientInspectLogDTO:any = {};
512
+  isShowAddInspect = false; //弹窗开关
513
+  addInspect(patientInspectLogDTO){
514
+    this.patientInspectLogDTO = patientInspectLogDTO;
515
+    this.isShowAddInspect = true;
516
+  }
517
+  // 关闭弹窗
518
+  closeAddInspectModel(e) {
519
+    this.isShowAddInspect = JSON.parse(e).show;
520
+  }
521
+  // 确定弹窗
522
+  confirmAddInspectModel(e) {
523
+    console.log(e);
524
+    let obj = JSON.parse(e);
525
+    this.isShowAddInspect = obj.show;
526
+    if(obj.type == 1){
527
+      //检验项目
528
+      let postData = {
529
+        inspectIds: obj.list.map(v => v.id).toString() || undefined,
530
+      }
531
+      this.maskFlag = this.message.loading("正在加载中..", {
532
+        nzDuration: 0,
533
+      }).messageId;
534
+      this.mainService
535
+        .bindPatientInspect(postData)
536
+        .subscribe((data:any) => {
537
+          this.message.remove(this.maskFlag);
538
+          this.maskFlag = false;
539
+          if (data.state == 200) {
540
+            this.showPromptModal('添加', true, "");
541
+          } else {
542
+            this.showPromptModal('添加', false, data.msg);
543
+          }
544
+        });
545
+    }else if(obj.type == 2){
546
+      // 手动添加
547
+      let postData = {
548
+        type: 'plan',
549
+        pilList: [{
550
+          ...this.patientInspectLogDTO,
551
+          inspectList: obj.list.map(v => ({
552
+            patientCode: this.patientInspectLogDTO.patientCode,
553
+            patientName: this.patientInspectLogDTO.patientName,
554
+            barCode: this.patientInspectLogDTO.barCode,
555
+            inspectCheckType: { id: v.id },
556
+            applyDeptId: this.patientInspectLogDTO.deptId,
557
+            bedNum: this.patientInspectLogDTO.bedNum,
558
+            hosId: this.patientInspectLogDTO.hosId,
559
+            pilId: this.patientInspectLogDTO.id,
560
+            yyTime: this.dateRange.length ? format(this.dateRange[0], 'yyyy-MM-dd HH:mm:ss') : undefined,
561
+          })) || undefined,
562
+        }]
563
+      }
564
+      this.maskFlag = this.message.loading("正在加载中..", {
565
+        nzDuration: 0,
566
+      }).messageId;
567
+      this.mainService
568
+        .addPatientInspectList(postData)
569
+        .subscribe((data:any) => {
570
+          this.message.remove(this.maskFlag);
571
+          this.maskFlag = false;
572
+          if (data.state == 200) {
573
+            this.showPromptModal('添加', true, "");
574
+          } else {
575
+            this.showPromptModal('添加', false, data.msg);
576
+          }
577
+        });
578
+    }
579
+  }
580
+}

+ 17 - 0
src/app/views/batch-inspection/batch-inspection.module.ts

@@ -0,0 +1,17 @@
1
+import { NgModule } from '@angular/core';
2
+import { CommonModule } from '@angular/common';
3
+
4
+import { BatchInspectionRoutingModule } from './batch-inspection-routing.module';
5
+import { BatchInspectionComponent } from './batch-inspection.component';
6
+import { ShareModule } from 'src/app/share/share.module';
7
+
8
+
9
+@NgModule({
10
+  declarations: [BatchInspectionComponent],
11
+  imports: [
12
+    CommonModule,
13
+    BatchInspectionRoutingModule,
14
+    ShareModule,
15
+  ]
16
+})
17
+export class BatchInspectionModule { }

+ 1 - 1
src/app/views/hushijiandan/hushijiandan.component.html

@@ -353,7 +353,7 @@
353 353
                       <div class="navIcon" [ngClass]="backColorComputed(item.icon.extra1)"><i class="icon_transport" [ngClass]="[item.icon.extra1]"></i></div>
354 354
                       <div class="navContent">
355 355
                         <h2>{{item.name}}</h2>
356
-                        <div class="navSpecimen" *ngIf="(item.urgentFlag || item.ordinaryFlag) && deptTaskTypeRules.openSpecimen">
356
+                        <div class="navSpecimen" *ngIf="item.urgentFlag || item.ordinaryFlag">
357 357
                           <span *ngIf="item.urgentFlag" (click)="changeSpeDetail($event, 1)">急:<span class="red">{{ specimenWorkOrderMsg.specimenCount ? specimenWorkOrderMsg.specimenCount.urgent : 0 }}</span></span>
358 358
                           <span *ngIf="item.ordinaryFlag" (click)="changeSpeDetail($event, 0)">普:{{ specimenWorkOrderMsg.specimenCount ? specimenWorkOrderMsg.specimenCount.noUrgent : 0 }}</span>
359 359
                         </div>

+ 3 - 0
src/app/views/hushijiandan/hushijiandan.component.ts

@@ -5204,6 +5204,9 @@ export class HushijiandanComponent implements OnInit {
5204 5204
       // 物品配送
5205 5205
       this.buildQuickConfirmData = data || {};
5206 5206
       this.isShowBuildQuickConfirm = true;
5207
+    }else if(data.bussType.value === 'inspect'){
5208
+      // 陪检
5209
+      this.router.navigateByUrl("/batchInspection");
5207 5210
     }
5208 5211
   }
5209 5212
   cancelBuildQuickConfirm(e){

+ 17 - 0
src/app/views/inspect-closed-loop-view/inspect-closed-loop-view-routing.module.ts

@@ -0,0 +1,17 @@
1
+import { NgModule } from '@angular/core';
2
+import { Routes, RouterModule } from '@angular/router';
3
+import { InspectClosedLoopViewComponent } from './inspect-closed-loop-view.component';
4
+
5
+
6
+const routes: Routes = [
7
+  {
8
+    path: "",
9
+    component: InspectClosedLoopViewComponent,
10
+  },
11
+];
12
+
13
+@NgModule({
14
+  imports: [RouterModule.forChild(routes)],
15
+  exports: [RouterModule]
16
+})
17
+export class InspectClosedLoopViewRoutingModule { }

+ 73 - 0
src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.html

@@ -0,0 +1,73 @@
1
+<div class="header">
2
+  <div class="display_flex align-items_center">
3
+    <div class="dept"><i class="icon icon_transport transport-fanhui" (click)='goBack()'></i></div>
4
+    <div class="patient">
5
+      <span class="label">科室:</span>
6
+      <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzPlaceHolder="请选择科室" [(ngModel)]="searchDto.deptId" nzAllowClear nzServerSearch nzShowSearch (nzOnSearch)="changeInp('department', $event)" (nzOpenChange)="openChangeDepartment($event)" (ngModelChange)="setIsSelecting(true)">
7
+        <ng-container *ngFor="let option of departmentList">
8
+          <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
9
+        </ng-container>
10
+        <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
11
+          <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
12
+        </nz-option>
13
+      </nz-select>
14
+    </div>
15
+    <div class="patient">
16
+      <span class="label">患者:</span>
17
+      <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzPlaceHolder="请选择患者" [(ngModel)]="searchDto.patientId" nzAllowClear nzServerSearch nzShowSearch (nzOnSearch)="changeInp('patient', $event)" (nzOpenChange)="openChangePatient($event)" (ngModelChange)="setIsSelecting(true)">
18
+        <ng-container *ngFor="let option of patientList">
19
+          <nz-option *ngIf="!isLoading" [nzLabel]="option.patientName" [nzValue]="option.id"></nz-option>
20
+        </ng-container>
21
+        <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
22
+          <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
23
+        </nz-option>
24
+      </nz-select>
25
+    </div>
26
+    <div class="patient">
27
+      <span class="label">状态:</span>
28
+      <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzPlaceHolder="请选择状态" [(ngModel)]="searchDto.stateId" nzAllowClear (nzOpenChange)="openChangeStatus($event)">
29
+        <ng-container *ngFor="let option of statusList">
30
+          <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
31
+        </ng-container>
32
+        <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
33
+          <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
34
+        </nz-option>
35
+      </nz-select>
36
+    </div>
37
+  </div>
38
+  <div class="display_flex align-items_center">
39
+    <button nz-button class="btn default" (click)='reset()'>重置</button>
40
+    <button nz-button class="btn default ml8" (click)='addPatientList()'>搜索</button>
41
+  </div>
42
+</div>
43
+<div class="table">
44
+  <nz-table class="list-template__nzTable" [nzData]="listOfData" nzSize="middle" [nzShowPagination]="false" [nzLoading]="loading1">
45
+    <thead>
46
+      <tr class="thead">
47
+        <th nzWidth="12.5%">科室</th>
48
+        <th nzWidth="12.5%">患者信息</th>
49
+        <th nzWidth="12.5%">护理信息</th>
50
+        <th nzWidth="12.5%">预约时间</th>
51
+        <th nzWidth="12.5%">出行方式</th>
52
+        <th nzWidth="12.5%">检查项目</th>
53
+        <th nzWidth="12.5%">签到信息</th>
54
+        <th nzWidth="12.5%">状态</th>
55
+      </tr>
56
+    </thead>
57
+    <tbody>
58
+      <tr *ngFor="let data of listOfData">
59
+        <td>{{data.inspectionDTO?.name}}<br>{{data.batchNo}}</td>
60
+        <td>{{data.inspectionDTO?.name}}<br>{{data.batchNo}}</td>
61
+        <td>{{data.inspectionNodeDTO?.name}}<br>{{data.inspectionDTO?.inspectionFormDTO?.name}}</td>
62
+        <td>{{data.signType?.name}}</td>
63
+        <td>{{data.userDTO?.name || data.groupDTO?.groupName}}</td>
64
+        <td>{{data.incidentDTO?.incidentsign}}<br>{{data.incidentDTO?.state?.name}}</td>
65
+        <td>{{data.yyTime | date:'yyyy-MM-dd HH:mm'}}</td>
66
+        <td>{{data.state?.name}}</td>
67
+      </tr>
68
+    </tbody>
69
+  </nz-table>
70
+</div>
71
+<div class="footer display_flex align-items_center justify-content_flex-end">
72
+  <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="listLength" [(nzPageSize)]="pageSize" nzShowSizeChanger (nzPageIndexChange)="getList(0)" (nzPageSizeChange)="getList(0)"></nz-pagination>
73
+</div>

+ 139 - 0
src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.less

@@ -0,0 +1,139 @@
1
+@import "../../../../src/theme.less";
2
+
3
+:host {
4
+  width: 100vw;
5
+  height: 100vh;
6
+  overflow: hidden;
7
+  background-color: #F0F2F5;
8
+  display: flex;
9
+  flex-direction: column;
10
+  .header{
11
+    height: 64px;
12
+    background-color: #fff;
13
+    display: flex;
14
+    align-items: center;
15
+    justify-content: space-between;
16
+    padding: 0 24px;
17
+    font-size: 16px;
18
+    .dept{
19
+      margin-right: 48px;
20
+      i{
21
+        font-size: 24px;
22
+        color: #8A8A8A;
23
+        cursor: pointer;
24
+      }
25
+    }
26
+    .patient{
27
+      margin-left: 24px;
28
+    }
29
+    .label{
30
+      padding-right: 16px;
31
+      font-size: 14px;
32
+    }
33
+    .formItem{
34
+      width: 173px;
35
+    }
36
+    .info{
37
+      margin-left: 48px;
38
+    }
39
+  }
40
+  .table{
41
+    flex: 1;
42
+    min-height: 0;
43
+    margin-top: 10px;
44
+    background-color: #fff;
45
+    overflow: auto;
46
+    padding: 8px 16px;
47
+    .patient{
48
+      position: relative;
49
+      .circle{
50
+        width: 8px;
51
+        height: 8px;
52
+        border-radius: 50%;
53
+        background-color: @primary-color;
54
+        position: absolute;
55
+        top: 50%;
56
+        left: -8px;
57
+        transform: translate(-50%,-50%);
58
+        &.red{
59
+          background-color: red;
60
+        }
61
+      }
62
+    }
63
+    .transport-weibiaoti2010104{
64
+      font-size: 15px;
65
+      color: #999;
66
+      margin-left: 10px;
67
+      margin-top: 3px;
68
+      cursor: pointer;
69
+    }
70
+    .transport-shanchu1{
71
+      font-size: 15px;
72
+      color: #999;
73
+      margin-left: 5px;
74
+      margin-top: 3px;
75
+      cursor: pointer;
76
+    }
77
+    .thead{
78
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
79
+      th {
80
+        background: transparent;
81
+        color: #fff;
82
+        text-align: center;
83
+      }
84
+    }
85
+    .ant-table-body {
86
+      border-bottom: 1px solid #e5e9ed;
87
+    }
88
+
89
+    .ant-table-tbody {
90
+      tr {
91
+        text-align: center;
92
+        color: #333;
93
+
94
+        td {
95
+          border: none;
96
+
97
+          &.tab_hover:hover{
98
+            text-decoration: underline;
99
+            cursor: pointer;
100
+          }
101
+
102
+          .coop {
103
+            button{
104
+              color: #333;
105
+            }
106
+            span,button {
107
+              display: inline-block;
108
+              padding: 0 8px;
109
+              cursor: pointer;
110
+              position: relative;
111
+
112
+              &::after {
113
+                content: "|";
114
+                position: absolute;
115
+                top: 0;
116
+                right: 0;
117
+              }
118
+
119
+              &:hover,
120
+              &:active {
121
+                color: @primary-color;
122
+              }
123
+
124
+              &:nth-last-child(1) {
125
+                &::after {
126
+                  content: "";
127
+                }
128
+              }
129
+            }
130
+          }
131
+        }
132
+      }
133
+    }
134
+  }
135
+  .footer{
136
+    height: 60px;
137
+    background-color: #fff;
138
+  }
139
+}

+ 188 - 0
src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.component.ts

@@ -0,0 +1,188 @@
1
+import { Component, OnInit } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { startOfDay, endOfDay, format } from 'date-fns';
6
+import { Subject } from 'rxjs';
7
+import { debounceTime } from 'rxjs/operators';
8
+import { Location } from '@angular/common';
9
+import cloneDeep from 'lodash-es/cloneDeep'
10
+@Component({
11
+  selector: 'app-inspect-closed-loop-view',
12
+  templateUrl: './inspect-closed-loop-view.component.html',
13
+  styleUrls: ['./inspect-closed-loop-view.component.less']
14
+})
15
+export class InspectClosedLoopViewComponent implements OnInit {
16
+
17
+  constructor(
18
+    private mainService: MainService,
19
+    private tool: ToolService,
20
+    private message: NzMessageService,
21
+    private _location: Location,
22
+  ) { }
23
+
24
+  hosId:any = this.tool.getCurrentHospital().id; //当前院区
25
+  deptDTO:any = this.tool.getCurrentUserDept(); //当前科室
26
+  listOfData: any[] = []; //表格数据
27
+  pageIndex: number = 1; //表格当前页码
28
+  pageSize: number = 10; //表格每页展示条数
29
+  listLength: number = 10; //表格总数据量
30
+  searchDto: any = {};
31
+
32
+
33
+  searchTimerSubject = new Subject(); //防抖
34
+
35
+  ngOnInit() {
36
+    //防抖
37
+    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
38
+      let fun = v[0];
39
+      fun.call(this, v[1]);
40
+    });
41
+
42
+    this.init();
43
+  }
44
+
45
+  // 搜索
46
+  search() {
47
+    this.getList(1);
48
+  }
49
+
50
+  // 重置
51
+  reset() {
52
+    this.searchDto = {};
53
+    this.getList(1);
54
+  }
55
+
56
+  init(){
57
+    this.search();
58
+  }
59
+
60
+  // 防抖
61
+  isLoading = false;
62
+  isSelecting:boolean = false; // 是否在选中状态
63
+  searchTimer(fun, e) {
64
+    if (this.isSelecting) {
65
+      this.isSelecting = false; // 重置标志
66
+      return; // 跳过处理
67
+    }
68
+    this.isLoading = true;
69
+    this.searchTimerSubject.next([fun, e]);
70
+  }
71
+
72
+  // 搜索
73
+  changeInp(type, e) {
74
+    if(type === 'patient'){
75
+      this.searchTimer(this.getPatientList, e);
76
+    }else if(type === 'department'){
77
+      this.searchTimer(this.getDepartmentList, e);
78
+    }
79
+  }
80
+
81
+  // 设置标志
82
+  setIsSelecting(flag){
83
+    this.isSelecting = flag; // 设置标志
84
+  }
85
+
86
+
87
+  openChangePatient(flag){
88
+    flag && this.setIsSelecting(false);
89
+    flag && this.getPatientList();
90
+  }
91
+
92
+  // 获取患者
93
+  patientList: any = [];
94
+  getPatientList(e = undefined) {
95
+    let postData = {
96
+      idx: 0,
97
+      sum: 20,
98
+      patient: {
99
+        hosId: this.hosId,
100
+        keyWord: e,
101
+      }
102
+    };
103
+    this.isLoading = true;
104
+    this.mainService
105
+      .getFetchDataList("simple/data", "patient", postData)
106
+      .subscribe((data) => {
107
+        this.isLoading = false;
108
+        this.patientList = data.list || [];
109
+      });
110
+  }
111
+
112
+  openChangeDepartment(flag){
113
+    flag && this.setIsSelecting(false);
114
+    flag && this.getDepartmentList();
115
+  }
116
+
117
+  // 获取科室
118
+  departmentList: any = [];
119
+  getDepartmentList(e = undefined) {
120
+    let postData = {
121
+      idx: 0,
122
+      sum: 20,
123
+      department: {
124
+        searchType: 1,// 简单查询
125
+        hospital: { id: this.hosId },
126
+        dept: e,
127
+      }
128
+    };
129
+    this.isLoading = true;
130
+    this.mainService
131
+      .getFetchDataList("simple/data", "department", postData)
132
+      .subscribe((data) => {
133
+        this.isLoading = false;
134
+        this.departmentList = data.list || [];
135
+      });
136
+  }
137
+
138
+  openChangeStatus(flag){
139
+    flag && this.setIsSelecting(false);
140
+    flag && this.getStatusList();
141
+  }
142
+
143
+  // 获取状态
144
+  statusList: any = [];
145
+  getStatusList() {
146
+    this.mainService.getDictionary('list', 'patient_inspect_state').subscribe((data) => {
147
+      this.statusList = data || [];
148
+    });
149
+  }
150
+
151
+  loading1:boolean = false;
152
+
153
+  // 表格数据
154
+  searchDto: any = {};
155
+  getList(type) {
156
+    if (type == 1) {
157
+      this.pageIndex = 1;
158
+    }
159
+    let data = {
160
+      idx: this.pageIndex - 1,
161
+      sum: this.pageSize,
162
+      patientInspectLog: {
163
+        hosId: this.currentHospital.id,
164
+        deptId: this.searchDto.deptId || undefined,
165
+        batchId: this.searchDto.patientId || undefined,
166
+        state: this.searchDto.stateId ? { id: this.searchDto.stateId } : undefined,
167
+      },
168
+    };
169
+    this.loading1 = true;
170
+    this.mainService
171
+      .getFetchDataList("simple/data", "patientInspectLog", data)
172
+      .subscribe((data) => {
173
+        this.loading1 = false;
174
+        if (data.status == 200) {
175
+          this.listOfData = data.list;
176
+          this.listLength = data.totalNum;
177
+        }else{
178
+          this.message.error(data.msg || "请求数据失败");
179
+        }
180
+      });
181
+  }
182
+
183
+  // 返回
184
+  goBack(){
185
+    this._location.back();
186
+  }
187
+
188
+}

+ 17 - 0
src/app/views/inspect-closed-loop-view/inspect-closed-loop-view.module.ts

@@ -0,0 +1,17 @@
1
+import { NgModule } from '@angular/core';
2
+import { CommonModule } from '@angular/common';
3
+
4
+import { InspectClosedLoopViewRoutingModule } from './inspect-closed-loop-view-routing.module';
5
+import { InspectClosedLoopViewComponent } from './inspect-closed-loop-view.component';
6
+import { ShareModule } from 'src/app/share/share.module';
7
+
8
+
9
+@NgModule({
10
+  declarations: [InspectClosedLoopViewComponent],
11
+  imports: [
12
+    CommonModule,
13
+    InspectClosedLoopViewRoutingModule,
14
+    ShareModule,
15
+  ]
16
+})
17
+export class InspectClosedLoopViewModule { }

+ 1 - 0
src/app/views/main/main.component.html

@@ -51,6 +51,7 @@
51 51
 							<div class="dropdownItem" *ngIf="communicationBook" (click)="toCommunicationBook()">病理交接本</div>
52 52
 							<div class="dropdownItem" *ngIf="disinfectionSupplyRole" (click)="toDisinfectionSupply()">全局业务查看</div>
53 53
 							<div class="dropdownItem" *ngIf="realtimeBroadcastRole" (click)="toRealtimeBroadcast()">故障实时播报</div>
54
+							<div class="dropdownItem" *ngIf="inspectClosedLoopViewRole" (click)="toInspectClosedLoopView()">陪检闭环视图</div>
54 55
             </div>
55 56
           </div>
56 57
         </div>

+ 10 - 1
src/app/views/main/main.component.ts

@@ -34,7 +34,8 @@ export class MainComponent implements OnInit {
34 34
 	sampling: boolean = false; //门诊病理采样端权限
35 35
 	communicationBook: boolean = false; //病理交接本权限
36 36
   disinfectionSupplyRole: boolean = false; //全局业务查看权限
37
-  realtimeBroadcastRole: boolean = false; //全局业务查看权限
37
+  realtimeBroadcastRole: boolean = false; //故障实时播报
38
+  inspectClosedLoopViewRole: boolean = false; //陪检闭环视图
38 39
   incidentConfigRole: boolean = false; //事件配置权限
39 40
   otherConfigRole: boolean = false; //三方配置权限
40 41
   pageConfigRole: boolean = false; //业务页面控制权限
@@ -322,6 +323,10 @@ export class MainComponent implements OnInit {
322 323
         this.realtimeBroadcastRole = true;
323 324
         console.log("故障实时播报权限");
324 325
       }
326
+      if (e.link == "inspectClosedLoopView") {
327
+        this.inspectClosedLoopViewRole = true;
328
+        console.log("陪检闭环视图权限");
329
+      }
325 330
       if (e.link == "incidentConfig") {
326 331
         this.incidentConfigRole = true;
327 332
         console.log("事件配置权限");
@@ -477,6 +482,10 @@ export class MainComponent implements OnInit {
477 482
   toRealtimeBroadcast(): void {
478 483
     this.router.navigateByUrl("realtimeBroadcast");
479 484
   }
485
+  // 陪检闭环视图
486
+  toInspectClosedLoopView(): void {
487
+    this.router.navigateByUrl("inspectClosedLoopView");
488
+  }
480 489
   // 配置中心
481 490
   toConfigurationCenter(): void {
482 491
     this.iShowMenuModal = true;

+ 25 - 0
src/app/views/patient-inspect-log-detail/patient-inspect-log-detail-routing.module.ts

@@ -0,0 +1,25 @@
1
+import { NgModule } from '@angular/core';
2
+import { Routes, RouterModule } from '@angular/router';
3
+import { OrderDetailComponent } from 'src/app/share/order-detail/order-detail.component';
4
+import { PatientInspectLogDetailComponent } from './patient-inspect-log-detail.component';
5
+
6
+
7
+const routes: Routes = [
8
+  {
9
+    path: '',
10
+    component: PatientInspectLogDetailComponent,
11
+    children: [
12
+      {
13
+        // 查看详情
14
+        path: 'orderDetail/:id',
15
+        component: OrderDetailComponent,
16
+      }
17
+    ]
18
+  }
19
+];
20
+
21
+@NgModule({
22
+  imports: [RouterModule.forChild(routes)],
23
+  exports: [RouterModule]
24
+})
25
+export class PatientInspectLogDetailRoutingModule { }

+ 173 - 0
src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.html

@@ -0,0 +1,173 @@
1
+<div class="detail" *ngIf="!maskFlag">
2
+  <div class="title">
3
+    查看<i class="icon_transport transport-guanbi" (click)="close()"></i>
4
+  </div>
5
+  <div class="box">
6
+    <div class="tab display_flex">
7
+      <div [ngClass]="{ item: true, flex_1: true, checked: tabType == 1 }" (click)="checkTab(1)">基本信息</div>
8
+      <div [ngClass]="{ item: true, flex_1: true, checked: tabType == 2 }" (click)="checkTab(2)">日志</div>
9
+      <div [ngClass]="{ item: true, flex_1: true, checked: tabType == 3 }" (click)="checkTab(3)">检查项目</div>
10
+      <div [ngClass]="{ item: true, flex_1: true, checked: tabType == 4 }" (click)="checkTab(4)">陪检工单</div>
11
+    </div>
12
+
13
+    <!-- 基本信息 -->
14
+    <overlay-scrollbars #osComponentRef1 style="height: 90%; flex: 1" *ngIf="tabType == 1">
15
+      <div class="content orders">
16
+        <div class="top">
17
+          <div class="info" nz-row>
18
+            <div nz-col nzSpan="6">科室名称:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
19
+            <div nz-col nzSpan="6">患者信息:{{ orderInfo.startTime }}</div>
20
+            <div nz-col nzSpan="6">床号:{{ orderInfo.startTime }}</div>
21
+            <div nz-col nzSpan="6">年龄:{{ orderInfo.startTime }}</div>
22
+          </div>
23
+
24
+          <div class="info" nz-row>
25
+            <div nz-col nzSpan="6">护理级别:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
26
+            <div nz-col nzSpan="6">危重等级:{{ orderInfo.startTime }}</div>
27
+            <div nz-col nzSpan="6">出科时间:{{ orderInfo.startTime }}</div>
28
+            <div nz-col nzSpan="6">出科陪检人:{{ orderInfo.startTime }}</div>
29
+          </div>
30
+
31
+          <div class="info" nz-row>
32
+            <div nz-col nzSpan="6">回科时间:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
33
+            <div nz-col nzSpan="6">回科陪检人:{{ orderInfo.startTime }}</div>
34
+            <div nz-col nzSpan="6">签到科室:{{ orderInfo.startTime }}</div>
35
+            <div nz-col nzSpan="6"></div>
36
+          </div>
37
+
38
+          <div class="info" nz-row>
39
+            <div nz-col nzSpan="6">签到时间:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
40
+            <div nz-col nzSpan="6">签到人:{{ orderInfo.startTime }}</div>
41
+            <div nz-col nzSpan="6">关联工单数:{{ orderInfo.startTime }}</div>
42
+            <div nz-col nzSpan="6"></div>
43
+          </div>
44
+
45
+          <div class="info" nz-row>
46
+            <div nz-col nzSpan="6">关联检查项目:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
47
+            <div nz-col nzSpan="6">状态:{{ orderInfo.startTime }}</div>
48
+            <div nz-col nzSpan="6">携带设备:{{ orderInfo.startTime }}</div>
49
+            <div nz-col nzSpan="6">出行方式:{{ orderInfo.startTime }}</div>
50
+          </div>
51
+
52
+          <div class="info" nz-row>
53
+            <div nz-col nzSpan="6">预约时间:{{ orderInfo.startTime | date: "yyyy-MM-dd HH:mm" }}</div>
54
+            <div nz-col nzSpan="6">住院号:{{ orderInfo.startTime }}</div>
55
+            <div nz-col nzSpan="6"></div>
56
+            <div nz-col nzSpan="6"></div>
57
+          </div>
58
+        </div>
59
+      </div>
60
+    </overlay-scrollbars>
61
+    <!-- 日志 -->
62
+    <overlay-scrollbars #osComponentRef2 style="height: 90%;flex:1;" *ngIf="tabType == 2">
63
+      <div class="content jifen">
64
+        <div class="table">
65
+          <nz-table class="integralTable" [nzData]="workOrderRecord" nzSize="middle" [nzShowPagination]="false">
66
+            <thead>
67
+              <tr class="thead">
68
+                <th nzWidth="15%">动作</th>
69
+                <th nzWidth="15%">操作时间</th>
70
+                <th nzWidth="10%">操作人</th>
71
+                <th nzWidth="10%">原负责人</th>
72
+                <th nzWidth="10%">接收负责人</th>
73
+                <th nzWidth="40%">备注</th>
74
+              </tr>
75
+            </thead>
76
+            <tbody>
77
+              <tr *ngFor="let item of workOrderRecord; let i = index">
78
+                <td>{{ item.operation ? item.operation.name : "-" }}</td>
79
+                <td>{{ item.operationTime || "-" }}</td>
80
+                <td>{{ item.username || "-" }}</td>
81
+                <td>{{ item.handoverUserid ? item.handoverUserid.name : "-" }}</td>
82
+                <td>{{ item.handoverUserid ? item.handoverUserid.name : "-" }}</td>
83
+                <td>{{ item.logRemarks || "-" }}</td>
84
+              </tr>
85
+            </tbody>
86
+          </nz-table>
87
+        </div>
88
+      </div>
89
+    </overlay-scrollbars>
90
+    <!-- 检查项目 -->
91
+    <overlay-scrollbars #osComponentRef3 style="height: 90%;flex:1;" *ngIf="tabType == 3">
92
+      <div class="content jifen">
93
+        <div class="table">
94
+          <nz-table class="integralTable" [nzData]="workOrderRecord" nzSize="middle" [nzShowPagination]="false">
95
+            <thead>
96
+              <tr class="thead">
97
+                <th nzWidth="20%">检查单号</th>
98
+                <th nzWidth="20%">检查项目</th>
99
+                <th nzWidth="20%">检查地点</th>
100
+                <th nzWidth="20%">预约时间</th>
101
+                <th nzWidth="20%">状态</th>
102
+              </tr>
103
+            </thead>
104
+            <tbody>
105
+              <tr *ngFor="let item of workOrderRecord; let i = index">
106
+                <td>{{ item.operation ? item.operation.name : "-" }}</td>
107
+                <td>{{ item.operationTime || "-" }}</td>
108
+                <td>{{ item.username || "-" }}</td>
109
+                <td>{{ item.handoverUserid ? item.handoverUserid.name : "-" }}</td>
110
+                <td>{{ item.logRemarks || "-" }}</td>
111
+              </tr>
112
+            </tbody>
113
+          </nz-table>
114
+        </div>
115
+      </div>
116
+    </overlay-scrollbars>
117
+    <!-- 陪检工单 -->
118
+    <overlay-scrollbars #osComponentRef4 style="height: 90%;flex:1;" *ngIf="tabType == 4">
119
+      <div class="content jifen">
120
+        <div class="table">
121
+          <nz-table class="integralTable" [nzData]="workOrderRecord" nzSize="middle" [nzShowPagination]="false">
122
+            <thead>
123
+              <tr class="thead">
124
+                <th nzWidth="17%">终点科室</th>
125
+                <th nzWidth="17%">任务类型</th>
126
+                <th nzWidth="17%">发起时间</th>
127
+                <th nzWidth="17%">执行人</th>
128
+                <th nzWidth="17%">状态</th>
129
+                <th nzWidth="15%">操作</th>
130
+              </tr>
131
+            </thead>
132
+            <tbody>
133
+              <tr *ngFor="let item of workOrderRecord; let i = index">
134
+                <td>{{ item.operation ? item.operation.name : "-" }}</td>
135
+                <td>{{ item.operationTime || "-" }}</td>
136
+                <td>{{ item.username || "-" }}</td>
137
+                <td>{{ item.handoverUserid ? item.handoverUserid.name : "-" }}</td>
138
+                <td>{{ item.logRemarks || "-" }}</td>
139
+                <td>
140
+                  <div class="coop">
141
+                    <span (click)="detail($event, item.id)">查看</span>
142
+                  </div>
143
+                </td>
144
+              </tr>
145
+            </tbody>
146
+          </nz-table>
147
+        </div>
148
+      </div>
149
+    </overlay-scrollbars>
150
+  </div>
151
+  <div class="btns">
152
+    <button class="btn cancel" nz-button nzType="default" (click)="close()">
153
+      关闭
154
+    </button>
155
+  </div>
156
+</div>
157
+<!-- 操作成功/失败提示框 -->
158
+<app-prompt-modal
159
+  *ngIf="promptModalShow"
160
+  [content]="promptContent"
161
+  [success]="ifSuccess"
162
+  [show]="promptModalShow"
163
+  [info]="promptInfo"
164
+  (closeModel)="close()"
165
+>
166
+  <!-- 2.父组件调用子组件时绑定到这个事件属性,并在事件发生时作出回应。(closeModel)="close()" -->
167
+</app-prompt-modal>
168
+
169
+<!-- 遮罩 -->
170
+<app-mask *ngIf="maskFlag"></app-mask>
171
+
172
+<!-- 查看详情 -->
173
+<router-outlet></router-outlet>

+ 578 - 0
src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.less

@@ -0,0 +1,578 @@
1
+@import "../../../../src/theme.less";
2
+
3
+img{
4
+	cursor: pointer;
5
+}
6
+
7
+.img-box{
8
+	display: flex;
9
+	img{
10
+		margin: 0 2px;
11
+	}
12
+}
13
+
14
+:host {
15
+  width: 100%;
16
+  height: 100%;
17
+  position: fixed;
18
+  left: 0;
19
+  top: 0;
20
+  background: rgba(0, 0, 0, 0.4);
21
+  z-index: 99;
22
+
23
+  display: flex;
24
+  justify-content: center;
25
+  align-items: center;
26
+}
27
+
28
+.coop {
29
+  button{
30
+    color: #333;
31
+  }
32
+  span,button {
33
+    display: inline-block;
34
+    padding: 0 8px;
35
+    cursor: pointer;
36
+    position: relative;
37
+
38
+    &::after {
39
+      content: "|";
40
+      position: absolute;
41
+      top: 0;
42
+      right: 0;
43
+    }
44
+
45
+    &:hover,
46
+    &:active {
47
+      color: @primary-color;
48
+    }
49
+
50
+    &:nth-last-child(1) {
51
+      &::after {
52
+        content: "";
53
+      }
54
+    }
55
+  }
56
+}
57
+
58
+.detail {
59
+  display: flex;
60
+  flex-direction: column;
61
+  width: 1200px;
62
+  height: calc(100vh - 100px);
63
+  min-height: 580px;
64
+  border-radius: 5px;
65
+  background: #fff;
66
+  color: #333;
67
+  font-size: 14px;
68
+  padding: 12px 20px;
69
+  position: relative;
70
+  padding-bottom: 70px;
71
+
72
+  .title {
73
+    font-size: 18px;
74
+    text-align: center;
75
+    line-height: 24px;
76
+    margin: 0;
77
+    margin-bottom: 12px;
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
+  & > .box {
92
+    width: 1160px;
93
+    border: 1px solid #e5e9ed;
94
+    border-radius: 5px;
95
+    flex: 1;
96
+    overflow: hidden;
97
+    display: flex;
98
+    flex-direction: column;
99
+
100
+    .tab {
101
+      width: 100%;
102
+      height: 60px;
103
+      border-bottom: 1px solid #e5e9ed;
104
+      cursor: pointer;
105
+
106
+      .item {
107
+        text-align: center;
108
+        line-height: 60px;
109
+        height: 100%;
110
+        // border-right: 1px solid #e5e9ed;
111
+
112
+        &:nth-last-child(1) {
113
+          border: none;
114
+        }
115
+
116
+        &.checked {
117
+          background: #F0F6ED;
118
+        }
119
+      }
120
+    }
121
+
122
+    .content {
123
+      width: 100%;
124
+      // min-height: 453px;
125
+      display: flex;
126
+      flex-direction: column;
127
+
128
+      &.orders {
129
+        background: #f9fafb;
130
+      }
131
+
132
+      & > .top {
133
+        padding: 16px 24px;
134
+        overflow: hidden;
135
+        background: #fff;
136
+
137
+        .num {
138
+          font-size: 16px;
139
+          overflow: hidden;
140
+          margin-bottom: 6px;
141
+
142
+          .left {
143
+            float: left;
144
+            font-weight: 600;
145
+          }
146
+
147
+          .right {
148
+            float: right;
149
+          }
150
+        }
151
+
152
+        .info {
153
+          color: #666;
154
+
155
+          & > div {
156
+            margin: 8px 0;
157
+          }
158
+
159
+          .jiaji {
160
+            margin: 0;
161
+            margin-top: 8px;
162
+          }
163
+        }
164
+      }
165
+
166
+      & > .center {
167
+        padding: 27px 0 17px 0;
168
+        border-bottom: 1px solid #e5e9ed;
169
+        font-size: 12px;
170
+        background: #fff;
171
+
172
+        .box {
173
+          display: flex;
174
+          justify-content: center;
175
+
176
+          .steps {
177
+            &:nth-last-child(1) {
178
+              .line {
179
+                display: none !important;
180
+              }
181
+            }
182
+
183
+            .step {
184
+              .info {
185
+                width: 90px;
186
+                text-align: center;
187
+                display: inline-block;
188
+                vertical-align: top;
189
+
190
+                i {
191
+                  color: #e5e9ed;
192
+
193
+                  &.green {
194
+                    color: @primary-color;
195
+                  }
196
+                }
197
+              }
198
+
199
+              p {
200
+                margin: 0;
201
+              }
202
+
203
+              .line {
204
+                display: inline-block;
205
+                width: 60px;
206
+                height: 2px;
207
+                background: #e5e9ed;
208
+              }
209
+            }
210
+          }
211
+        }
212
+      }
213
+
214
+      & > .bottom {
215
+        flex: 1;
216
+        padding: 25px 32px;
217
+        background: #f9fafb;
218
+
219
+        .amplification {
220
+          display: flex;
221
+          justify-content: flex-end;
222
+          margin-bottom: 8px;
223
+        }
224
+
225
+        .urgent {
226
+          input {
227
+            width: 600px;
228
+          }
229
+
230
+          .candelBtn {
231
+            margin-left: 20px;
232
+          }
233
+        }
234
+
235
+        .table {
236
+          width: 100%;
237
+          height: 100%;
238
+          min-height: 160px;
239
+          background: #fff;
240
+          border-radius: 5px;
241
+
242
+          .thead {
243
+            background-image: repeating-linear-gradient(
244
+              to right,
245
+              @bg-start,
246
+              @bg-end 100%
247
+            ) !important;
248
+
249
+            th {
250
+              color: #fff !important;
251
+              text-align: center;
252
+              font-size: 12px;
253
+              border: none;
254
+            }
255
+          }
256
+
257
+          .detailDrugTable {
258
+            .thead {
259
+              background-image: repeating-linear-gradient(
260
+                to right,
261
+                @bg-start,
262
+                @bg-end 50%
263
+              ) !important;
264
+            }
265
+          }
266
+
267
+          .ant-table-tbody {
268
+            tr {
269
+              text-align: center;
270
+              font-size: 12px;
271
+              border: none;
272
+
273
+              td {
274
+                border: none;
275
+                position: relative;
276
+              }
277
+            }
278
+
279
+            tr:nth-child(2n) {
280
+              background: #f9fafb;
281
+            }
282
+          }
283
+        }
284
+
285
+        .info {
286
+          width: 100%;
287
+          height: 100%;
288
+          background: #fff;
289
+          border-radius: 5px;
290
+          border: 1px solid #e5e9ed;
291
+          padding: 24px 28px 14px 28px;
292
+          margin-bottom: 8px;
293
+
294
+          .top {
295
+            .left {
296
+              border-right: 1px dashed #e5e9ed;
297
+
298
+              p {
299
+                padding: 0 70px 0 102px;
300
+                overflow: hidden;
301
+
302
+                & > span:nth-child(1) {
303
+                  float: left;
304
+                }
305
+
306
+                & > span:nth-child(2) {
307
+                  float: right;
308
+                  color: #666;
309
+                  text-align: right;
310
+                  max-width: 175px;
311
+                }
312
+              }
313
+            }
314
+
315
+            .right {
316
+              p {
317
+                padding: 0 102px 0 70px;
318
+                overflow: hidden;
319
+
320
+                span:nth-child(1) {
321
+                  float: left;
322
+                }
323
+
324
+                span:nth-child(2) {
325
+                  float: right;
326
+                  color: #666;
327
+                  text-align: right;
328
+                }
329
+              }
330
+            }
331
+          }
332
+
333
+          .wait {
334
+            text-align: center;
335
+            margin-top: 7px;
336
+
337
+            i {
338
+              font-size: 24px;
339
+              color: #62c26d;
340
+            }
341
+
342
+            span {
343
+              color: #62c26d;
344
+            }
345
+          }
346
+        }
347
+      }
348
+
349
+      &.pingjia {
350
+        .msg {
351
+          width: 100%;
352
+          height: 50px;
353
+          line-height: 50px;
354
+          padding-left: 32px;
355
+          border-bottom: 1px solid #e5e9ed;
356
+
357
+          div {
358
+            display: inline-block;
359
+            margin-right: 100px;
360
+          }
361
+        }
362
+
363
+        .con {
364
+          padding: 16px 32px;
365
+          min-height: 360px;
366
+        }
367
+      }
368
+
369
+      & > .form {
370
+        .ant-form-item {
371
+          padding: 0 32px 13px 32px;
372
+          margin-bottom: 0;
373
+          border-bottom: 1px solid #e5e9ed;
374
+
375
+          &:nth-last-child(1) {
376
+            border: none;
377
+          }
378
+        }
379
+
380
+        .ant-form-item-label {
381
+          line-height: 34px;
382
+          text-align: left;
383
+        }
384
+      }
385
+
386
+      & > .mediation {
387
+        padding: 16px 32px;
388
+
389
+        .item {
390
+          border-bottom: 1px solid #e5e9ed;
391
+          padding-top: 10px;
392
+
393
+          .label {
394
+            line-height: 28px;
395
+            margin-top: 10px;
396
+          }
397
+
398
+          .info {
399
+            line-height: 28px;
400
+            color: #999;
401
+            padding-bottom: 20px;
402
+          }
403
+        }
404
+      }
405
+
406
+      &.jifen {
407
+        padding: 32px;
408
+
409
+        & > .table {
410
+          width: 100%;
411
+          height: 100%;
412
+          min-height: 160px;
413
+          padding: 6px;
414
+          background: #fff;
415
+          border: 1px solid #e5e9ed;
416
+          border-radius: 5px;
417
+          overflow: hidden;
418
+
419
+          .thead {
420
+            background-image: repeating-linear-gradient(
421
+              to right,
422
+              @bg-start,
423
+              @bg-end 100%
424
+            ) !important;
425
+
426
+            th {
427
+              color: #fff !important;
428
+              text-align: center;
429
+              font-size: 12px;
430
+              border: none;
431
+              background: transparent;
432
+            }
433
+          }
434
+
435
+          .ant-table-tbody {
436
+            tr {
437
+              text-align: center;
438
+              font-size: 12px;
439
+              border: none;
440
+
441
+              td {
442
+                border: none;
443
+              }
444
+            }
445
+
446
+            tr:nth-child(2n) {
447
+              background: #f9fafb;
448
+            }
449
+          }
450
+        }
451
+      }
452
+    }
453
+  }
454
+
455
+  .btns {
456
+    display: flex;
457
+    justify-content: center;
458
+    align-items: center;
459
+    width: 100%;
460
+    position: absolute;
461
+    left: 0;
462
+    bottom: 20px;
463
+
464
+    .btn {
465
+      margin: 9px;
466
+      margin-bottom: 0;
467
+    }
468
+  }
469
+
470
+  .ant-table {
471
+    border: none !important;
472
+  }
473
+}
474
+
475
+// 撤回工单
476
+.recallOrder {
477
+  position: fixed;
478
+  left: 0;
479
+  top: 0;
480
+  width: 100%;
481
+  height: 100%;
482
+
483
+  display: flex;
484
+  justify-content: center;
485
+  align-items: center;
486
+  background: rgba(0, 0, 0, 0.4);
487
+  z-index: 99;
488
+
489
+  .modalBody {
490
+    width: 350px;
491
+    height: 220px;
492
+    background: #fff;
493
+    border-radius: 5px;
494
+    padding: 10px 20px;
495
+    color: #333;
496
+
497
+    .title {
498
+      width: 100%;
499
+      text-align: center;
500
+      font-size: 18px;
501
+      position: relative;
502
+
503
+      i {
504
+        position: absolute;
505
+        right: 0;
506
+        top: 0;
507
+        font-size: 20px;
508
+        color: #666;
509
+        cursor: pointer;
510
+        padding: 0 5px;
511
+      }
512
+    }
513
+
514
+    .content {
515
+      width: 310px;
516
+      height: 117px;
517
+      background: #f9fafb;
518
+      border: 1px solid #e5e9ed;
519
+      border-radius: 5px;
520
+      overflow: hidden;
521
+      margin-top: 12px;
522
+
523
+      div {
524
+        text-align: center;
525
+        margin: 0;
526
+
527
+        &.icon {
528
+          margin-top: 17px;
529
+
530
+          i {
531
+            color: #ff3b53;
532
+            font-size: 30px !important;
533
+
534
+            &.transport-wenhao {
535
+              color: #f5a523;
536
+            }
537
+          }
538
+        }
539
+
540
+        &.defeat {
541
+          color: #333;
542
+          font-size: 18px;
543
+        }
544
+
545
+        &:nth-child(3) {
546
+          font-size: 14px;
547
+          color: #666;
548
+        }
549
+      }
550
+
551
+      .conditions {
552
+        padding: 16px 20px;
553
+
554
+        div {
555
+          text-align: left;
556
+        }
557
+      }
558
+    }
559
+
560
+    button {
561
+      margin-top: 10px;
562
+
563
+      &.btn {
564
+        margin-left: 8px;
565
+      }
566
+    }
567
+  }
568
+}
569
+
570
+.txtC {
571
+  text-align: center;
572
+}
573
+.ji {
574
+  position: absolute;
575
+  right: 0px;
576
+  top: -3px;
577
+  width: 30px;
578
+}

+ 117 - 0
src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.component.ts

@@ -0,0 +1,117 @@
1
+import { Component, OnInit, ViewChild } from "@angular/core";
2
+import { MainService } from "../../services/main.service";
3
+import { OverlayScrollbarsComponent } from "overlayscrollbars-ngx";
4
+import { NzMessageService } from "ng-zorro-antd";
5
+import { ActivatedRoute, Router } from '@angular/router';
6
+@Component({
7
+  selector: "app-patient-inspect-log-detail",
8
+  templateUrl: "./patient-inspect-log-detail.component.html",
9
+  styleUrls: ["./patient-inspect-log-detail.component.less"],
10
+})
11
+export class PatientInspectLogDetailComponent implements OnInit {
12
+  @ViewChild("osComponentRef1", {
13
+    read: OverlayScrollbarsComponent,
14
+    static: false,
15
+  })
16
+  osComponentRef1: OverlayScrollbarsComponent;
17
+  @ViewChild("osComponentRef2", {
18
+    read: OverlayScrollbarsComponent,
19
+    static: false,
20
+  })
21
+  osComponentRef2: OverlayScrollbarsComponent;
22
+  @ViewChild("osComponentRef3", {
23
+    read: OverlayScrollbarsComponent,
24
+    static: false,
25
+  })
26
+  osComponentRef3: OverlayScrollbarsComponent;
27
+  @ViewChild("osComponentRef4", {
28
+    read: OverlayScrollbarsComponent,
29
+    static: false,
30
+  })
31
+  osComponentRef4: OverlayScrollbarsComponent;
32
+  constructor(
33
+    private message: NzMessageService,
34
+    private mainService: MainService,
35
+    private route: ActivatedRoute,
36
+    private router: Router,
37
+  ) {}
38
+  maskFlag: any = false;
39
+  id: number; //工单id
40
+  orderInfo: any; //工单详情信息
41
+  promptContent: string; //操作提示框提示信息
42
+  ifSuccess: boolean; //操作成功/失败
43
+  promptInfo: string; //操作结果提示信息
44
+  promptModalShow: boolean; //是否展示提示框
45
+
46
+  ngOnInit() {
47
+    this.id = +this.route.snapshot.paramMap.get("id");
48
+    this.checkTab(1);
49
+  }
50
+
51
+  // 获取工单详情
52
+  getInfo() {
53
+    this.maskFlag = this.message.loading("正在加载中..", {
54
+      nzDuration: 0,
55
+    }).messageId;
56
+    this.mainService
57
+      .getFetchData("simple/data", "workOrder", this.id)
58
+      .subscribe((data) => {
59
+        this.message.remove(this.maskFlag);
60
+        this.maskFlag = false;
61
+        this.orderInfo = data.data;
62
+      });
63
+  }
64
+
65
+  // 获取历史记录
66
+  workOrderRecord: any = [];
67
+  getWorkOrderRecord() {
68
+    this.maskFlag = this.message.loading("正在加载中..", {
69
+      nzDuration: 0,
70
+    }).messageId;
71
+    this.mainService.getWorkOrderRecord({ gdid: this.id }).subscribe((res) => {
72
+      this.message.remove(this.maskFlag);
73
+        this.maskFlag = false;
74
+      if (res.status == 200) {
75
+        this.workOrderRecord = res.data || [];
76
+      }
77
+    })
78
+  }
79
+  // 切换tab栏
80
+  tabType: number = 1; //tab栏
81
+  checkTab(type) {
82
+    this.tabType = type;
83
+    if(type == 1){
84
+      this.getInfo();
85
+    }else if(type == 2){
86
+      this.getWorkOrderRecord();
87
+    }else if(type == 3){
88
+      this.getWorkOrderRecord();
89
+    }else if(type == 4){
90
+      this.getWorkOrderRecord();
91
+    }
92
+  }
93
+
94
+  // 关闭弹框
95
+  close() {
96
+    history.go(-1);
97
+  }
98
+
99
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
100
+  showPromptModal(con, success, promptInfo?) {
101
+    this.promptModalShow = false;
102
+    this.promptContent = con;
103
+    this.ifSuccess = success;
104
+    this.promptInfo = promptInfo;
105
+    setTimeout(() => {
106
+      this.promptModalShow = true;
107
+    }, 100);
108
+  }
109
+
110
+  // 查看
111
+  detail(e, id) {
112
+    id = 2803260;
113
+    e.stopPropagation();
114
+    this.router.navigateByUrl(`/main/patientInspectLog/patientInspectLogDetail/${this.id}/orderDetail/${id}`);
115
+  }
116
+
117
+}

+ 19 - 0
src/app/views/patient-inspect-log-detail/patient-inspect-log-detail.module.ts

@@ -0,0 +1,19 @@
1
+import { NgModule } from '@angular/core';
2
+import { CommonModule } from '@angular/common';
3
+
4
+import { PatientInspectLogDetailRoutingModule } from './patient-inspect-log-detail-routing.module';
5
+import { ShareModule } from 'src/app/share/share.module';
6
+import { PatientInspectLogDetailComponent } from './patient-inspect-log-detail.component';
7
+
8
+
9
+@NgModule({
10
+  declarations: [
11
+    PatientInspectLogDetailComponent
12
+  ],
13
+  imports: [
14
+    CommonModule,
15
+    PatientInspectLogDetailRoutingModule,
16
+    ShareModule,
17
+  ]
18
+})
19
+export class PatientInspectLogDetailModule { }

+ 2 - 3
src/app/views/patient-inspect-log/patient-inspect-log-routing.module.ts

@@ -1,6 +1,5 @@
1 1
 import { NgModule } from '@angular/core';
2 2
 import { Routes, RouterModule } from '@angular/router';
3
-import { InspectionExecuteDetailComponent } from 'src/app/share/inspection-execute-detail/inspection-execute-detail.component';
4 3
 import { PatientInspectLogComponent } from './patient-inspect-log.component';
5 4
 
6 5
 
@@ -11,8 +10,8 @@ const routes: Routes = [
11 10
     children: [
12 11
       {
13 12
         // 查看详情
14
-        path: 'inspectionExecuteDetail/:id',
15
-        component: InspectionExecuteDetailComponent,
13
+        path: 'patientInspectLogDetail/:id',
14
+        loadChildren: () => import('../patient-inspect-log-detail/patient-inspect-log-detail.module').then(m => m.PatientInspectLogDetailModule),
16 15
       }
17 16
     ]
18 17
   }

+ 2 - 19
src/app/views/patient-inspect-log/patient-inspect-log.component.html

@@ -62,11 +62,11 @@
62 62
             <td>{{data.inspectionDTO?.name}}<br>{{data.batchNo}}</td>
63 63
             <td>{{data.inspectionDTO?.name}}<br>{{data.batchNo}}</td>
64 64
             <td>{{data.inspectionNodeDTO?.name}}<br>{{data.inspectionDTO?.inspectionFormDTO?.name}}</td>
65
-            <td>{{data.overtime | date:'yyyy-MM-dd HH:mm'}}</td>
66 65
             <td>{{data.signType?.name}}</td>
67 66
             <td>{{data.userDTO?.name || data.groupDTO?.groupName}}</td>
68
-            <td>{{data.status?.name}}</td>
69 67
             <td>{{data.incidentDTO?.incidentsign}}<br>{{data.incidentDTO?.state?.name}}</td>
68
+            <td>{{data.yyTime | date:'yyyy-MM-dd HH:mm'}}</td>
69
+            <td>{{data.state?.name}}</td>
70 70
             <td>
71 71
               <div class="coop">
72 72
                 <span *ngIf="coopBtns.look" (click)="detail($event,data.id)">查看</span>
@@ -83,27 +83,10 @@
83 83
     </div>
84 84
   </div>
85 85
 </div>
86
-<!-- 模态框 -->
87
-<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
88
-(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
89 86
 <!-- 操作成功/失败提示框 -->
90 87
 <app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
91 88
   [info]="promptInfo">
92 89
 </app-prompt-modal>
93 90
 
94
-<!-- 指派 -->
95
-<app-inspection-execute-assign-prompt-modal
96
-  [deptFlag]="inspectionExecuteAssignPromptModalShow"
97
-  (submitFormHand)="confirmModelInspectionExecuteAssign($event)"
98
-  (deptFlagHand)="closeModelInspectionExecuteAssign($event)"
99
-  *ngIf="inspectionExecuteAssignPromptModalShow"
100
-></app-inspection-execute-assign-prompt-modal>
101
-
102
-<!-- 遮罩 -->
103
-<app-mask *ngIf="maskFlag"></app-mask>
104
-
105 91
 <!-- 查看详情 -->
106 92
 <router-outlet></router-outlet>
107
-
108
-<!-- 详情 -->
109
-<app-incident-detail [id]="coopData.incidentId" *ngIf="detailModalShow" (closeModelHs)="closeDetailModelOrder($event)" (confirmModelHs)="confirmDetailModelOrder($event)"></app-incident-detail>

+ 2 - 2
src/app/views/patient-inspect-log/patient-inspect-log.component.ts

@@ -62,7 +62,7 @@ export class PatientInspectLogComponent implements OnInit {
62 62
   // 查看
63 63
   detail(e, id) {
64 64
     e.stopPropagation();
65
-    this.router.navigateByUrl("/main/inspectionExecute/inspectionExecuteDetail/" + id);
65
+    this.router.navigateByUrl("/main/patientInspectLog/patientInspectLogDetail/" + id);
66 66
   }
67 67
 
68 68
   // 搜索
@@ -163,7 +163,7 @@ export class PatientInspectLogComponent implements OnInit {
163 163
     flag && this.getPatientList();
164 164
   }
165 165
 
166
-  // 获取科室
166
+  // 获取患者
167 167
   patientList: any = [];
168 168
   getPatientList(e = undefined) {
169 169
     let postData = {

+ 0 - 2
src/app/views/patient-inspect-log/patient-inspect-log.module.ts

@@ -3,7 +3,6 @@ import { CommonModule } from '@angular/common';
3 3
 
4 4
 import { PatientInspectLogRoutingModule } from './patient-inspect-log-routing.module';
5 5
 import { ShareModule } from 'src/app/share/share.module';
6
-import { IncidentDetailModule } from 'src/app/components/incidentManagement/incident-detail/incident-detail.module';
7 6
 import { PatientInspectLogComponent } from './patient-inspect-log.component';
8 7
 
9 8
 
@@ -15,7 +14,6 @@ import { PatientInspectLogComponent } from './patient-inspect-log.component';
15 14
     CommonModule,
16 15
     PatientInspectLogRoutingModule,
17 16
     ShareModule,
18
-    IncidentDetailModule,
19 17
   ]
20 18
 })
21 19
 export class PatientInspectLogModule { }

+ 3 - 0
src/common.less

@@ -1,6 +1,9 @@
1 1
 .ant-table-tbody tr:nth-of-type(2n){
2 2
   background-color: #e9f7e9!important;
3 3
 }
4
+.display_block{
5
+  display: block!important;
6
+}
4 7
 .padding8{
5 8
   padding: 8px!important
6 9
 }