Bläddra i källkod

新药品页面流程控制

seimin 5 månader sedan
förälder
incheckning
1c928b024a

+ 114 - 0
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.html

@@ -0,0 +1,114 @@
1
+<div class="content drugPage" id="dictionary">
2
+  <div class="contentInner">
3
+    <div class="address">
4
+      <overlay-scrollbars #osComponentRef1 class="contentBody">
5
+        <div class="contentItem" [title]="item.name" [ngClass]="{ active: item.value === activeDictionary.value }" (click)="clickDictionaryKey(item)" *ngFor="let item of dictionaryKeyList">{{ item.name }}</div>
6
+      </overlay-scrollbars>
7
+    </div>
8
+    <div class="addressAssign">
9
+      <div class="contentBody2">
10
+        <div class="TaskTypeManagement">
11
+          <div class="taskTypeInfo">
12
+            <div class="top">
13
+              <div class="item" (click)="tabModal('characteristics')" [ngClass]="{'items':tabModalName=='characteristics'}">
14
+                特性配置
15
+              </div>
16
+              <div class="item" (click)="tabModal('automaticOrderCreation')" [ngClass]="{'items':tabModalName=='automaticOrderCreation'}">
17
+                自动建单配置
18
+              </div>
19
+            </div>
20
+            <ng-container *ngFor="let item of dictionaryKeyList">
21
+              <div class="list" *ngIf="!loading && activeDictionary.value === item.value">
22
+                <!-- 特性配置 -->
23
+                <div *ngIf="tabModalName=='characteristics'">
24
+                  <!-- 工单模式 -->
25
+                  <div class="display_flex align-items_center mb8">
26
+                    <nz-form-label class="label" nzRequired>工单模式</nz-form-label>
27
+                    <nz-radio-group [(ngModel)]="item.postData.drugsModel">
28
+                      <label nz-radio [nzValue]="item.value" *ngFor="let item of drugsModelList">{{ item.label }}</label>
29
+                    </nz-radio-group>
30
+                  </div>
31
+                  <!-- 支持建单并签到 -->
32
+                  <div class="display_flex align-items_center mb8">
33
+                    <nz-form-label class="label">支持建单并签到</nz-form-label>
34
+                    <nz-checkbox-group [(ngModel)]="item.postData.drugsCreateSign"></nz-checkbox-group>
35
+                  </div>
36
+                  <!-- 支持接单并签到 -->
37
+                  <div class="display_flex align-items_center mb8">
38
+                    <nz-form-label class="label">支持接单并签到</nz-form-label>
39
+                    <nz-checkbox-group [(ngModel)]="item.postData.drugsReceiveSign"></nz-checkbox-group>
40
+                  </div>
41
+
42
+                  <!-- 起点科室支持核对 -->
43
+                  <div class="display_flex align-items_center mb8">
44
+                    <nz-form-label class="label">起点科室支持核对</nz-form-label>
45
+                    <nz-checkbox-group [(ngModel)]="item.postData.drugsStartCheck" (ngModelChange)="changeDrugsStartCheck($event)"></nz-checkbox-group>
46
+                  </div>
47
+                  <ng-container *ngIf="item.postData.drugsStartCheck[0].checked">
48
+                    <!-- 核对方式 -->
49
+                    <div class="display_flex align-items_center mb8">
50
+                      <nz-form-label class="label" nzRequired>核对方式</nz-form-label>
51
+                      <nz-checkbox-group [(ngModel)]="item.postData.drugsStartCheckScanIds"></nz-checkbox-group>
52
+                    </div>
53
+                    <!-- 手动填写 -->
54
+                    <div class="display_flex align-items_center mb8">
55
+                      <nz-form-label class="label">手动填写</nz-form-label>
56
+                      <nz-select class="w320px" nzPlaceHolder="请选择手动填写" [(ngModel)]="item.postData.drugsStartManual" nzAllowClear>
57
+                        <nz-option *ngFor="let item of drugsManualList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
58
+                      </nz-select>
59
+                    </div>
60
+                    <!-- 支持拍照留存 -->
61
+                    <div class="display_flex align-items_center mb8">
62
+                      <nz-form-label class="label">支持拍照留存</nz-form-label>
63
+                      <nz-checkbox-group [(ngModel)]="item.postData.drugsStartPhoto"></nz-checkbox-group>
64
+                    </div>
65
+                  </ng-container>
66
+
67
+                  <!-- 终点科室支持核对 -->
68
+                  <div class="display_flex align-items_center mb8">
69
+                    <nz-form-label class="label">终点科室支持核对</nz-form-label>
70
+                    <nz-checkbox-group [(ngModel)]="item.postData.drugsEndCheck" (ngModelChange)="changeDrugsEndCheck($event)"></nz-checkbox-group>
71
+                  </div>
72
+                  <ng-container *ngIf="item.postData.drugsEndCheck[0].checked">
73
+                    <!-- 核对方式 -->
74
+                    <div class="display_flex align-items_center mb8">
75
+                      <nz-form-label class="label" nzRequired>核对方式</nz-form-label>
76
+                      <nz-checkbox-group [(ngModel)]="item.postData.drugsEndCheckScanIds"></nz-checkbox-group>
77
+                    </div>
78
+                    <!-- 手动填写 -->
79
+                    <div class="display_flex align-items_center mb8">
80
+                      <nz-form-label class="label">手动填写</nz-form-label>
81
+                      <nz-select class="w320px" nzPlaceHolder="请选择手动填写" [(ngModel)]="item.postData.drugsEndManual" nzAllowClear>
82
+                        <nz-option *ngFor="let item of drugsManualList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
83
+                      </nz-select>
84
+                    </div>
85
+                    <!-- 支持拍照留存 -->
86
+                    <div class="display_flex align-items_center mb8">
87
+                      <nz-form-label class="label">支持拍照留存</nz-form-label>
88
+                      <nz-checkbox-group [(ngModel)]="item.postData.drugsEndPhoto"></nz-checkbox-group>
89
+                    </div>
90
+                  </ng-container>
91
+                </div>
92
+                <!-- 自动建单配置 -->
93
+                <div *ngIf="tabModalName=='automaticOrderCreation'">
94
+                  <!-- 自动建单 -->
95
+                </div>
96
+                <div class="bottom">
97
+                  <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>
98
+                </div>
99
+              </div>
100
+            </ng-container>
101
+            <div class="list" *ngIf="loading">
102
+              <div class="loadingFull display_flex justify-content_flex-center align-items_center">
103
+                <div class="loadingFullInner">
104
+                  <img src="../../../assets/images/loading.gif" alt="">
105
+                  <div>加载中...</div>
106
+                </div>
107
+              </div>
108
+            </div>
109
+          </div>
110
+        </div>
111
+      </div>
112
+    </div>
113
+  </div>
114
+</div>

+ 858 - 0
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.less

@@ -0,0 +1,858 @@
1
+@import "../../../../../src/theme.less";
2
+:host {
3
+  height: 100%;
4
+  display: flex;
5
+  flex-direction: column;
6
+  justify-content: space-between;
7
+  background-color: #F0F2F5;
8
+  .list-template__nzTable,
9
+  .list-template__bottom{
10
+    padding: 0!important;
11
+    border: none!important;
12
+    background: #fff!important;
13
+  }
14
+  .list-template{
15
+    width: 100%!important;
16
+    height: 100%!important;
17
+  }
18
+  #dictionary{
19
+    margin: 24px 16px;
20
+    .addressAssign{
21
+      flex: 7;
22
+    }
23
+    .contentItem{
24
+      margin: 0 16px;
25
+      padding: 8px;
26
+      text-align: center;
27
+      &.active{
28
+        background-color: @primary-color;
29
+        color: #fff;
30
+        border-radius: 4px;
31
+      }
32
+    }
33
+    .contentBody{
34
+      padding: 16px;
35
+      min-height: 0;
36
+      display: flex;
37
+      flex-direction: column;
38
+    }
39
+    .contentBody2{
40
+      flex: 1;
41
+    }
42
+    ::ng-deep .ant-form-item{
43
+      margin-bottom: 0;
44
+    }
45
+    .dictionaryRow{
46
+      display: flex;
47
+      align-items: center;
48
+      justify-content: center;
49
+      gap: 16px;
50
+      .orders{
51
+        flex: 1;
52
+        display: flex;
53
+        justify-content: flex-end;
54
+        align-items: center;
55
+      }
56
+      .name{
57
+        width: 100px;
58
+        display: flex;
59
+        justify-content: flex-end;
60
+        align-items: center;
61
+      }
62
+      .value{
63
+        flex: 3;
64
+        display: flex;
65
+        align-items: center;
66
+        .valueInput{
67
+          width: 600px;
68
+        }
69
+        .icon_transport{
70
+          font-size: 20px;
71
+          color: #8a8a8a;
72
+          cursor: pointer;
73
+        }
74
+      }
75
+
76
+    }
77
+  }
78
+  .content{
79
+    flex: 1;
80
+    min-height: 0;
81
+    display: flex;
82
+    flex-direction: column;
83
+    justify-content: space-between;
84
+    border: 1px solid #EEF3F9;
85
+    &.priority{
86
+      margin: 24px 118px 0;
87
+      background-color: #fff;
88
+      .contentInner{
89
+        padding: 48px 206px;
90
+        border: 1px solid #E8EBEF;
91
+      }
92
+    }
93
+    .contentItem{
94
+      padding: 4px 16px;
95
+      cursor: pointer;
96
+      overflow: hidden;
97
+      text-overflow: ellipsis;
98
+      white-space: nowrap;
99
+      &.active{
100
+        color: @primary-color;
101
+        background-color: #F0F6ED;
102
+        border-radius: 4px;
103
+      }
104
+    }
105
+    .contentInner{
106
+      flex: 1;
107
+      display: flex;
108
+      justify-content: space-between;
109
+      align-items: center;
110
+      padding: 0 16px;
111
+      gap: 16px;
112
+      .contentHead{
113
+        height: 45px;
114
+        display: flex;
115
+        justify-content: space-between;
116
+        align-items: center;
117
+        gap: 16px;
118
+        padding: 0 16px;
119
+        font-size: 16px;
120
+        font-weight: bold;
121
+        border-bottom: 1px solid #D9D9D9;
122
+        .title{
123
+          overflow: hidden;
124
+          text-overflow: ellipsis;
125
+          white-space: nowrap;
126
+        }
127
+        .btns{
128
+          flex-shrink: 0;
129
+        }
130
+      }
131
+      .contentBody{
132
+        padding: 0 8px;
133
+        margin: 4px 0;
134
+        flex: 1;
135
+      }
136
+      .address{
137
+        flex: 1;
138
+        height: 100%;
139
+        background: #FFFFFF;
140
+        border: 1px solid #E8EBEF;
141
+        display: flex;
142
+        flex-direction: column;
143
+        width: 0;
144
+      }
145
+      .addressAssign{
146
+        flex: 3;
147
+        height: 100%;
148
+        background: #FFFFFF;
149
+        border: 1px solid #E8EBEF;
150
+        display: flex;
151
+        flex-direction: column;
152
+        width: 0;
153
+      }
154
+      .list-template__searchItem {
155
+        margin-bottom: 16px;
156
+        .label {
157
+          color: #333;
158
+          display: inline-block;
159
+          width: 70px;
160
+          text-align-last: justify;
161
+          text-align: justify;
162
+          &.label--big {
163
+            width: 100px;
164
+          }
165
+        }
166
+        .formItem {
167
+          width: 135px;
168
+        }
169
+      }
170
+    }
171
+    .contentBtns{
172
+      margin-bottom: 16px;
173
+      display: flex;
174
+      justify-content: center;
175
+      align-items: center;
176
+    }
177
+  }
178
+  .TaskTypeManagement {
179
+    height: calc(100vh - 136px);
180
+    background: #f9fafb;
181
+    overflow: hidden;
182
+    padding: 16px 20px;
183
+
184
+    .pagination {
185
+      margin-top: 14px;
186
+      margin-bottom: 14px;
187
+      bottom: 12px;
188
+      right: 5px;
189
+    }
190
+
191
+    .taskType {
192
+      float: left;
193
+      width: 24%;
194
+      height: 100%;
195
+      border: 1px solid #e5e9ed;
196
+      background: #fff;
197
+      color: #333;
198
+      font-size: 14px;
199
+      position: relative;
200
+      overflow: hidden;
201
+
202
+      .title {
203
+        width: 100%;
204
+        height: 40px;
205
+        line-height: 40px;
206
+        padding-left: 16px;
207
+        border-bottom: 1px solid #e5e9ed;
208
+        position: relative;
209
+        background: #fff;
210
+        z-index: 2;
211
+      }
212
+
213
+      .operate {
214
+        width: 100%;
215
+        border-bottom: 1px solid #e5e9ed;
216
+        position: relative;
217
+        background: #fff;
218
+        z-index: 2;
219
+        display: flex;
220
+
221
+        .item {
222
+          flex: 1;
223
+          height: 34px;
224
+          line-height: 34px;
225
+          border-right: 1px solid #e5e9ed;
226
+          text-align: center;
227
+          color: #666; // cursor: default;
228
+          cursor: pointer;
229
+
230
+          &:hover {
231
+            color: @primary-color;
232
+            background: #f0f6ed;
233
+          }
234
+
235
+          &:nth-last-child(1) {
236
+            border: none;
237
+          }
238
+        }
239
+      }
240
+
241
+      .taskTypes {
242
+        // width: 110%;
243
+        width: 100%;
244
+        height: 92%;
245
+        // padding-right: 10%;
246
+        overflow-y: auto;
247
+        z-index: 1;
248
+        padding-bottom: 30px;
249
+
250
+        .itemChoice {
251
+          color: @primary-color;
252
+          background: #f0f6ed;
253
+        }
254
+
255
+        .item {
256
+          width: 100%;
257
+          height: 34px;
258
+          line-height: 34px;
259
+          text-align: center;
260
+          cursor: pointer;
261
+          overflow: hidden;
262
+          text-overflow: ellipsis;
263
+          white-space: nowrap;
264
+
265
+          &:hover {
266
+            color: @primary-color;
267
+            background: #f0f6ed;
268
+          }
269
+
270
+          &.checked {
271
+            color: @primary-color;
272
+            background: #f0f6ed;
273
+          }
274
+        }
275
+      }
276
+    }
277
+
278
+    //任务类型管理-主体
279
+    .taskTypeInfo {
280
+      height: 100%;
281
+      border: 1px solid #e5e9ed;
282
+      background: #fff;
283
+      color: #333;
284
+      position: relative;
285
+
286
+      .top {
287
+        height: 61px;
288
+        line-height: 60px;
289
+        display: flex;
290
+        align-items: center;
291
+        border-bottom: 1px solid #e5e9ed;
292
+        position: relative;
293
+        z-index: 2;
294
+
295
+        .items {
296
+          background: #f0f6ed;
297
+        }
298
+
299
+        & > div {
300
+          border-right: 1px solid #e5e9ed;
301
+          width: 30%;
302
+          text-align: center; // display: flex;
303
+          // align-items: center;
304
+          cursor: pointer;
305
+
306
+          &:hover {
307
+            background: #f0f6ed;
308
+          }
309
+        }
310
+
311
+        &:nth-last-child(4) {
312
+          border: none;
313
+        }
314
+      }
315
+
316
+      .list {
317
+        width: 100%; // height: 100%;
318
+        padding: 16px; // position: absolute;
319
+        // top: 0;
320
+        // padding-top: 90px;
321
+        background: #fff;
322
+        height: 89%;
323
+        overflow: auto;
324
+
325
+        nz-form-label {
326
+          margin-left: 0px !important;
327
+        }
328
+
329
+        & > div {
330
+          background: #f9fafb;
331
+          border: 1px solid #e5e9ed;
332
+          border-radius: 10px 10px 0px 0px;
333
+          padding: 24px 120px;
334
+
335
+          .label {
336
+            margin-left: 16px;
337
+            font-size: 14px;
338
+            color: #333;
339
+          }
340
+        }
341
+
342
+        // 规则信息
343
+        .ruleList {
344
+          padding: 15px 15px 0px 15px;
345
+          background: #fff;
346
+
347
+          .table {
348
+            width: 100%;
349
+            height: 100%;
350
+
351
+            .box {
352
+              // background: #f9fafb;
353
+              // border: 1px solid #e5e9ed;
354
+              border-radius: 5px;
355
+              position: relative;
356
+
357
+              .table_title {
358
+                font-size: 18px;
359
+                margin: 14px 0px;
360
+                text-align: center;
361
+              }
362
+
363
+              .thead {
364
+                background-image: linear-gradient(to right, @bg-start, @bg-end);
365
+
366
+                th {
367
+                  background: transparent;
368
+                  color: #fff;
369
+                  text-align: center;
370
+                  font-size: 14px;
371
+                }
372
+              }
373
+
374
+              .ant-table-body {
375
+                border-bottom: 1px solid #e5e9ed;
376
+                background: #f9fafb;
377
+              }
378
+
379
+              .ant-table-tbody {
380
+                background: #f9fafb;
381
+                border: 1px solid #e5e9ed;
382
+
383
+                .zzBontton {
384
+                  & > td {
385
+                    border-bottom: 1px solid #e5e9ed;
386
+                  }
387
+                }
388
+
389
+                tr {
390
+                  text-align: center;
391
+                  font-size: 14px;
392
+                  border: none;
393
+                  color: #333;
394
+                  overflow: hidden;
395
+
396
+                  .lin {
397
+                    width: 68.2%;
398
+                    height: 2rem;
399
+                    border-bottom: 0.1rem solid #e5e9ed;
400
+                    position: absolute;
401
+                    text-align: center;
402
+                    margin-left: 0%;
403
+                    margin-top: -0.8%;
404
+                    transform: rotate(6.5deg);
405
+                  }
406
+
407
+                  td {
408
+                    border: none;
409
+
410
+                    nz-input-number {
411
+                      width: 50px;
412
+                    }
413
+
414
+                    .coop {
415
+                      .line {
416
+                        margin: 10px;
417
+                      }
418
+
419
+                      span:nth-child(2n-1) {
420
+                        cursor: pointer;
421
+
422
+                        &:hover {
423
+                          color: @primary-color;
424
+                        }
425
+
426
+                        &:active {
427
+                          color: @primary-color;
428
+                        }
429
+                      }
430
+                    }
431
+                  }
432
+                }
433
+
434
+                tr:nth-child(even) {
435
+                  background: #fff;
436
+                }
437
+              }
438
+            }
439
+          }
440
+        }
441
+
442
+        //运送过程
443
+        .ysgcItem {
444
+          padding: 0px 0px 0px 0px; // background: #fff;
445
+
446
+          .ysgc_top {
447
+            height: 88px;
448
+            background: #fff;
449
+            border-radius: 10px 10px 0px 0px;
450
+            padding: 15px 22px 0px 22px;
451
+
452
+            .title {
453
+              span {
454
+                font-size: 18px;
455
+              }
456
+            }
457
+
458
+            .carrItems {
459
+              color: @primary-color;
460
+              border-color: @primary-color !important;
461
+            }
462
+
463
+            .process {
464
+              width: 80%;
465
+              display: flex;
466
+              justify-content: center;
467
+              align-items: center;
468
+              margin: 5px auto;
469
+              font-size: 14px;
470
+
471
+              .carrItem {
472
+                height: 40px;
473
+                line-height: 28px;
474
+                cursor: pointer;
475
+                display: flex;
476
+                justify-content: center;
477
+                align-items: center;
478
+
479
+                .carrItem_icon {
480
+                  width: 35px;
481
+                  height: 35px;
482
+                  border: 1px solid #e5e9ed;
483
+                  border-radius: 50%;
484
+                  text-align: center;
485
+                  line-height: 35px;
486
+                  margin-right: 10px;
487
+
488
+                  i {
489
+                    font-size: 18px;
490
+                  }
491
+                }
492
+              }
493
+
494
+              .carrItem1 {
495
+                float: left;
496
+                width: 45%;
497
+                height: 40px;
498
+                line-height: 28px;
499
+                padding-left: 10%;
500
+                cursor: pointer;
501
+
502
+                .carrItem_icon {
503
+                  width: 35px;
504
+                  height: 35px;
505
+                  border: 1px solid #e5e9ed;
506
+                  border-radius: 50%;
507
+                  text-align: center;
508
+                  line-height: 35px;
509
+                  float: left;
510
+                  margin-right: 10px;
511
+
512
+                  i {
513
+                    font-size: 18px;
514
+                  }
515
+                }
516
+              }
517
+            }
518
+          }
519
+
520
+          .ysgc_cont {
521
+            padding: 0px 240px 24px 240px;
522
+
523
+            textarea {
524
+              padding-right: 10%;
525
+            }
526
+
527
+            .icon_btn {
528
+              cursor: pointer;
529
+              font-size: 18px;
530
+            }
531
+
532
+            .icon_text {
533
+              display: block;
534
+              cursor: pointer;
535
+              position: relative;
536
+              right: 5px;
537
+            }
538
+
539
+            .item_type_cont {
540
+              height: 70px;
541
+              padding-top: 4px;
542
+
543
+              & > div {
544
+                height: 65px;
545
+                border: 1px solid #e5e9ed;
546
+                border-radius: 5px;
547
+                background: #fff;
548
+
549
+                .item_type_cont_L {
550
+                  height: 100%;
551
+                  width: 90%;
552
+                  float: left;
553
+                  padding: 2px 12px;
554
+                  overflow: auto;
555
+
556
+                  .item_yq {
557
+                    width: 24%;
558
+                    height: 28px;
559
+                    display: inline-block;
560
+                    border: 1px solid #e5e9ed;
561
+                    border-radius: 20px;
562
+                    text-align: center;
563
+                    line-height: 26px;
564
+                    background: #f9fafb;
565
+                    margin-right: 1%;
566
+                    margin-bottom: 2px;
567
+                    font-size: 12px;
568
+                    padding-left: 8px;
569
+
570
+                    span {
571
+                      width: 75%;
572
+                      float: left;
573
+                      overflow: hidden;
574
+                      text-overflow: ellipsis;
575
+                      white-space: nowrap;
576
+                    }
577
+
578
+                    i {
579
+                      font-size: 14px;
580
+                      color: #999;
581
+                      cursor: pointer;
582
+                    }
583
+                  }
584
+                }
585
+
586
+                .item_type_cont_R {
587
+                  height: 100%;
588
+                  width: 10%;
589
+                  float: right;
590
+                  text-align: center;
591
+                  padding-top: 15px;
592
+                  border-left: 1px solid #e5e9ed;
593
+                  cursor: pointer;
594
+
595
+                  i {
596
+                    display: block;
597
+                    font-size: 16px;
598
+                  }
599
+
600
+                  i:hover {
601
+                    color: @primary-color;
602
+                  }
603
+
604
+                  .icon_text {
605
+                    right: 1px;
606
+                  }
607
+                }
608
+              }
609
+            }
610
+          }
611
+        }
612
+
613
+        //关联信息
614
+        .glxxItem {
615
+          padding: 10px 15px 0px 15px;
616
+          background: #fff;
617
+
618
+          .tab_btn {
619
+            cursor: pointer;
620
+          }
621
+
622
+          .tab_btn:hover {
623
+            color: @primary-color;
624
+          }
625
+
626
+          .table_title {
627
+            font-size: 18px;
628
+            margin: 14px 0px;
629
+            text-align: center;
630
+          }
631
+
632
+          .thead {
633
+            background-image: linear-gradient(to right, @bg-start, @bg-end);
634
+
635
+            th {
636
+              background: transparent;
637
+              color: #fff;
638
+              text-align: center;
639
+              font-size: 14px;
640
+            }
641
+          }
642
+
643
+          .ant-table-body {
644
+            // border-bottom: 1px solid #e5e9ed;
645
+            background: #f9fafb;
646
+          }
647
+
648
+          .ant-table-tbody {
649
+            background: #f9fafb;
650
+            border: 1px solid #e5e9ed;
651
+
652
+            tr {
653
+              text-align: center;
654
+              font-size: 14px;
655
+              border: none;
656
+              color: #333;
657
+
658
+              td {
659
+                border: none; // font-size: 14px;
660
+
661
+                nz-input-number {
662
+                  width: 40px;
663
+                }
664
+
665
+                .coop {
666
+                  .line {
667
+                    margin: 10px;
668
+                  }
669
+
670
+                  span:nth-child(2n-1) {
671
+                    cursor: pointer;
672
+
673
+                    &:hover {
674
+                      color: @primary-color;
675
+                    }
676
+
677
+                    &:active {
678
+                      color: @primary-color;
679
+                    }
680
+                  }
681
+                }
682
+              }
683
+            }
684
+
685
+            tr:nth-child(even) {
686
+              background: #fff;
687
+            }
688
+          }
689
+        }
690
+
691
+        // 开通科室
692
+        .ktksItem {
693
+          padding: 0px 0px 0px 0px;
694
+          background: #fff;
695
+
696
+          .top {
697
+            width: 100%; // padding-bottom: 7px;
698
+            // border-bottom: 1px solid #e5e9ed;
699
+            position: relative;
700
+            overflow: hidden;
701
+            z-index: 2;
702
+            display: flex;
703
+            align-items: center;
704
+            justify-content: space-between;
705
+
706
+            .top_L {
707
+              width: 70%;
708
+              text-align: left;
709
+              display: flex;
710
+              flex-wrap: wrap;
711
+              align-items: center;
712
+              padding: 0 4px;
713
+              .top_L_item {
714
+                margin-left: 4px;
715
+              }
716
+
717
+              .label {
718
+                font-size: 14px;
719
+                color: #333;
720
+                margin-left: 0;
721
+              }
722
+
723
+              nz-select {
724
+                font-size: 12px;
725
+                width: 100px;
726
+              }
727
+
728
+              input {
729
+                font-size: 12px;
730
+                width: 100px;
731
+              }
732
+            }
733
+
734
+            .top_R {
735
+              border: 0px;
736
+
737
+              .btn {
738
+                margin-left: 10px;
739
+              }
740
+            }
741
+          }
742
+
743
+          .ktksItemList {
744
+            padding: 10px 15px 0px 15px;
745
+            .table {
746
+              min-height: 528px;
747
+            }
748
+
749
+            .operate {
750
+              float: right;
751
+              margin-bottom: 5px;
752
+
753
+              span {
754
+                font-size: 14px;
755
+              }
756
+
757
+              .num {
758
+                font-size: 18px;
759
+                color: @primary-color;
760
+              }
761
+            }
762
+
763
+            .thead {
764
+              background-image: linear-gradient(to right, @bg-start, @bg-end);
765
+
766
+              th {
767
+                background: transparent;
768
+                color: #fff;
769
+                text-align: center;
770
+                font-size: 14px;
771
+              }
772
+            }
773
+
774
+            .ant-table-body {
775
+              border-bottom: 1px solid #e5e9ed;
776
+              background: #f9fafb;
777
+            }
778
+
779
+            .ant-table-tbody {
780
+              background: #f9fafb;
781
+              border: 1px solid #e5e9ed;
782
+
783
+              .zzBontton {
784
+                & > td {
785
+                  border-bottom: 1px solid #e5e9ed;
786
+                }
787
+              }
788
+
789
+              tr {
790
+                text-align: center;
791
+                font-size: 14px;
792
+                border: none;
793
+                color: #333;
794
+
795
+                td {
796
+                  border: none; // font-size: 14px;
797
+
798
+                  nz-input-number {
799
+                    width: 40px;
800
+                  }
801
+
802
+                  .coop {
803
+                    .line {
804
+                      margin: 10px;
805
+                    }
806
+
807
+                    span:nth-child(2n-1) {
808
+                      cursor: pointer;
809
+
810
+                      &:hover {
811
+                        color: @primary-color;
812
+                      }
813
+
814
+                      &:active {
815
+                        color: @primary-color;
816
+                      }
817
+                    }
818
+                  }
819
+                }
820
+              }
821
+
822
+              tr:nth-child(even) {
823
+                background: #fff;
824
+              }
825
+            }
826
+          }
827
+
828
+          .pagination {
829
+            margin-top: 25px;
830
+            margin-bottom: 14px;
831
+            bottom: 12px;
832
+            right: 5px;
833
+            position: relative;
834
+            height: 30px;
835
+            .page {
836
+              position: absolute;
837
+              right: 5px;
838
+            }
839
+          }
840
+        }
841
+
842
+        .bottom {
843
+          height: 60px;
844
+          border-radius: 0px 0px 10px 10px;
845
+          padding: 10px 240px 0px 240px;
846
+          border-top: 0px;
847
+
848
+          button {
849
+            width: 80px;
850
+            height: 34px;
851
+            display: block;
852
+            margin: 0 auto;
853
+          }
854
+        }
855
+      }
856
+    }
857
+  }
858
+}

+ 300 - 0
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.ts

@@ -0,0 +1,300 @@
1
+import { Component, OnInit, ViewChild } from "@angular/core";
2
+import { MainService } from "../../../services/main.service";
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { Subject, forkJoin } from 'rxjs';
6
+import { debounceTime } from 'rxjs/operators';
7
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
8
+
9
+@Component({
10
+  selector: "app-configuration-drug",
11
+  templateUrl: "./configuration-drug.component.html",
12
+  styleUrls: ["./configuration-drug.component.less"],
13
+})
14
+export class ConfigurationDrugComponent implements OnInit {
15
+  @ViewChild("osComponentRef1", {
16
+    read: OverlayScrollbarsComponent,
17
+    static: false,
18
+  })
19
+  osComponentRef1: OverlayScrollbarsComponent;
20
+
21
+  loading:boolean = false; //页面加载的loading
22
+  btnLoading:boolean = false; //提交按钮的loading
23
+  tabModalName:string = 'characteristics'; //当前选中的tab
24
+  hosId = this.tool.getCurrentHospital().id; //当前院区
25
+
26
+  // 配置
27
+  configs:any = {};
28
+  // 任务类型
29
+  tasktype:any = {};
30
+  constructor(private mainService: MainService,private tool: ToolService,private msg: NzMessageService) {}
31
+
32
+  ngOnInit():void {
33
+    this.activeDictionary = this.dictionaryKeyList[0];
34
+    this.init();
35
+  }
36
+
37
+  // 工单模式
38
+  drugsModelList:any[] = [
39
+    { label: '一单一码', value: 1 },
40
+    { label: '一单多码', value: 2 },
41
+  ];
42
+
43
+  // 手动填写
44
+  drugsManualList:any[] = [];
45
+
46
+  // 数据字典key列表
47
+  dictionaryKeyList: any[] = [
48
+    {
49
+      name: '静配',
50
+      value: 'drugsJpbag',
51
+      postData: {
52
+        drugsModel: undefined,//工单模式
53
+        drugsCreateSign: [{ label:'是否开启', value: 0 }],//支持建单并签到
54
+        drugsReceiveSign: [{ label:'是否开启', value: 0 }],//支持接单并签到
55
+        drugsStartCheck: [{ label:'是否开启', value: 0 }],//起点科室支持核对
56
+        drugsStartCheckScanIds: [],//起点核对方式
57
+        drugsStartManual: undefined,//起点科室手动填写
58
+        drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
59
+        drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
60
+        drugsEndCheckScanIds: [],//终点核对方式
61
+        drugsEndManual: undefined,//终点科室手动填写
62
+        drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
63
+      }
64
+    },
65
+    {
66
+      name: '西药',
67
+      value: 'drugsWestern',
68
+      postData: {
69
+        drugsModel: undefined,//工单模式
70
+        drugsCreateSign: [{ label:'是否开启', value: 0 }],//支持建单并签到
71
+        drugsReceiveSign: [{ label:'是否开启', value: 0 }],//支持接单并签到
72
+        drugsStartCheck: [{ label:'是否开启', value: 0 }],//起点科室支持核对
73
+        drugsStartCheckScanIds: [],//起点核对方式
74
+        drugsStartManual: undefined,//起点科室手动填写
75
+        drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
76
+        drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
77
+        drugsEndCheckScanIds: [],//终点核对方式
78
+        drugsEndManual: undefined,//终点科室手动填写
79
+        drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
80
+      }
81
+    },
82
+    {
83
+      name: '退药',
84
+      value: 'drugsReturn',
85
+      postData: {
86
+        drugsModel: undefined,//工单模式
87
+        drugsCreateSign: [{ label:'是否开启', value: 0 }],//支持建单并签到
88
+        drugsReceiveSign: [{ label:'是否开启', value: 0 }],//支持接单并签到
89
+        drugsStartCheck: [{ label:'是否开启', value: 0 }],//起点科室支持核对
90
+        drugsStartCheckScanIds: [],//起点核对方式
91
+        drugsStartManual: undefined,//起点科室手动填写
92
+        drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
93
+        drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
94
+        drugsEndCheckScanIds: [],//终点核对方式
95
+        drugsEndManual: undefined,//终点科室手动填写
96
+        drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
97
+      }
98
+    },
99
+    {
100
+      name: '毒麻',
101
+      value: 'drugsPoison',
102
+      postData: {
103
+        drugsModel: undefined,//工单模式
104
+        drugsCreateSign: [{ label:'是否开启', value: 0 }],//支持建单并签到
105
+        drugsReceiveSign: [{ label:'是否开启', value: 0 }],//支持接单并签到
106
+        drugsStartCheck: [{ label:'是否开启', value: 0 }],//起点科室支持核对
107
+        drugsStartCheckScanIds: [],//起点核对方式
108
+        drugsStartManual: undefined,//起点科室手动填写
109
+        drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
110
+        drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
111
+        drugsEndCheckScanIds: [],//终点核对方式
112
+        drugsEndManual: undefined,//终点科室手动填写
113
+        drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
114
+      }
115
+    },
116
+    {
117
+      name: '中草药',
118
+      value: 'drugsHerbal',
119
+      postData: {
120
+        drugsModel: undefined,//工单模式
121
+        drugsCreateSign: [{ label:'是否开启', value: 0 }],//支持建单并签到
122
+        drugsReceiveSign: [{ label:'是否开启', value: 0 }],//支持接单并签到
123
+        drugsStartCheck: [{ label:'是否开启', value: 0 }],//起点科室支持核对
124
+        drugsStartCheckScanIds: [],//起点核对方式
125
+        drugsStartManual: undefined,//起点科室手动填写
126
+        drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
127
+        drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
128
+        drugsEndCheckScanIds: [],//终点核对方式
129
+        drugsEndManual: undefined,//终点科室手动填写
130
+        drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
131
+      }
132
+    },
133
+  ];
134
+
135
+  // 点击数据字典key
136
+  activeDictionary:any;
137
+  clickDictionaryKey(item){
138
+    this.activeDictionary = item;
139
+    this.init();
140
+  }
141
+
142
+  // 修改起点科室支持核对
143
+  changeDrugsStartCheck(e){
144
+    console.log(e);
145
+    if(!e[0].checked){
146
+      this.activeDictionary.postData.drugsStartCheckScanIds = this.activeDictionary.postData.drugsStartCheckScanIds.map(v => ({...v, checked: false}));
147
+      this.activeDictionary.postData.drugsStartManual = undefined;
148
+      this.activeDictionary.postData.drugsStartPhoto[0].checked = false;
149
+    }
150
+  }
151
+
152
+  // 修改终点科室支持核对
153
+  changeDrugsEndCheck(e){
154
+    console.log(e);
155
+    if(!e[0].checked){
156
+      this.activeDictionary.postData.drugsEndCheckScanIds = this.activeDictionary.postData.drugsEndCheckScanIds.map(v => ({...v, checked: false}));;
157
+      this.activeDictionary.postData.drugsEndManual = undefined;
158
+      this.activeDictionary.postData.drugsEndPhoto[0].checked = false;
159
+    }
160
+  }
161
+
162
+  // 切换tab
163
+  tabModal(tabModalName:string){
164
+    this.tabModalName = tabModalName;
165
+  }
166
+  // 保存
167
+  submitForm() {
168
+    if(!this.tasktype.id){
169
+      this.msg.create("warning", "请先配置任务类型!");
170
+      return;
171
+    }
172
+
173
+    if(!this.activeDictionary.postData.drugsModel){
174
+      this.msg.create("warning", "请选择工单模式!");
175
+      return;
176
+    }
177
+
178
+    if(this.activeDictionary.postData.drugsStartCheck[0].checked && !this.activeDictionary.postData.drugsStartCheckScanIds.length){
179
+      this.msg.create("warning", "请选择起点科室的核对方式!");
180
+      return;
181
+    }
182
+
183
+    if(this.activeDictionary.postData.drugsEndCheck[0].checked && !this.activeDictionary.postData.drugsEndCheckScanIds.length){
184
+      this.msg.create("warning", "请选择终点科室的核对方式!");
185
+      return;
186
+    }
187
+
188
+    let postData:any = {
189
+      id: this.configs.id,
190
+      taskType: this.tasktype.id,
191
+      hosId: this.hosId,
192
+      drugsModel: this.activeDictionary.postData.drugsModel || undefined,
193
+      drugsCreateSign: this.activeDictionary.postData.drugsCreateSign[0].checked ? 1 : 0,
194
+      drugsReceiveSign: this.activeDictionary.postData.drugsReceiveSign[0].checked ? 1 : 0,
195
+      drugsStartCheck: this.activeDictionary.postData.drugsStartCheck[0].checked ? 1 : 0,
196
+      drugsStartCheckScanIds: this.activeDictionary.postData.drugsStartCheckScanIds.filter(v => v.checked).map(v => v.value).toString() || undefined,
197
+      drugsStartManual: this.activeDictionary.postData.drugsStartManual ? { id: this.activeDictionary.postData.drugsStartManual } : undefined,
198
+      drugsStartPhoto: this.activeDictionary.postData.drugsStartPhoto[0].checked ? 1 : 0,
199
+      drugsEndCheck: this.activeDictionary.postData.drugsEndCheck[0].checked ? 1 : 0,
200
+      drugsEndCheckScanIds: this.activeDictionary.postData.drugsEndCheckScanIds.filter(v => v.checked).map(v => v.value).toString() || undefined,
201
+      drugsEndManual: this.activeDictionary.postData.drugsEndManual ? { id: this.activeDictionary.postData.drugsEndManual } : undefined,
202
+      drugsEndPhoto: this.activeDictionary.postData.drugsEndPhoto[0].checked ? 1 : 0,
203
+    };
204
+    this.btnLoading = true;
205
+    this.mainService
206
+      .simplePost("addData", "taskTypeConfig", postData)
207
+      .subscribe((result) => {
208
+        this.btnLoading = false;
209
+        if (result.status == 200) {
210
+          this.getConfig();
211
+        }
212
+      });
213
+  }
214
+
215
+  //初始化
216
+  init() {
217
+    this.loading = true;
218
+    let drugs_bag_check_scan_type$ = this.mainService.getDictionary('list', 'drugs_bag_check_scan_type', true);
219
+    let drugs_bag_manual_type$ = this.mainService.getDictionary('list', 'drugs_bag_manual_type', true);
220
+    forkJoin(drugs_bag_check_scan_type$, drugs_bag_manual_type$).subscribe((data:any[]) => {
221
+      let drugs_bag_check_scan_type = data[0] || [];
222
+      let drugs_bag_manual_type = data[1] || [];
223
+
224
+      this.activeDictionary.postData.drugsStartCheckScanIds = drugs_bag_check_scan_type.map(v => ({ label:v.name, value: v.id }));
225
+      this.activeDictionary.postData.drugsEndCheckScanIds = drugs_bag_check_scan_type.map(v => ({ label:v.name, value: v.id }));
226
+      this.drugsManualList = drugs_bag_manual_type.map(v => ({ label:v.name, value: v.id }));
227
+
228
+      this.getTaskType();
229
+    })
230
+  }
231
+
232
+  //获取任务类型
233
+  getTaskType() {
234
+    this.loading = true;
235
+    let postData = {
236
+      idx: 0,
237
+      sum: 1,
238
+      taskType: {
239
+        simpleQuery: true,
240
+        hosId: {
241
+          id: this.hosId
242
+        },
243
+        ordinaryField: {
244
+          key: 'ordinary_field',
245
+          value: this.activeDictionary.value,
246
+        }
247
+      }
248
+    };
249
+    this.mainService
250
+      .getFetchDataList("simple/data", "taskType", postData)
251
+      .subscribe((result) => {
252
+        this.loading = false;
253
+        if (result.status == 200) {
254
+          this.tasktype = result.list[0] || {};
255
+          this.getConfig();
256
+        }
257
+      });
258
+  }
259
+
260
+  // 获取配置
261
+  getConfig() {
262
+    this.loading = true;
263
+    let postData = {
264
+      idx: 0,
265
+      sum: 1,
266
+      taskTypeConfig: {
267
+        taskTypeDTO: {
268
+          hosId: {
269
+            id: this.hosId
270
+          },
271
+          ordinaryField: {
272
+            key: 'ordinary_field',
273
+            value: this.activeDictionary.value,
274
+          }
275
+        }
276
+      }
277
+    };
278
+    this.mainService
279
+      .getFetchDataList("simple/data", "taskTypeConfig", postData)
280
+      .subscribe((result) => {
281
+        this.loading = false;
282
+        if (result.status == 200) {
283
+          this.configs = result.list[0] || {};
284
+          this.activeDictionary.postData.drugsModel = this.configs.drugsModel || undefined;
285
+          this.activeDictionary.postData.drugsCreateSign[0].checked = this.configs.drugsCreateSign == 1;
286
+          this.activeDictionary.postData.drugsReceiveSign[0].checked = this.configs.drugsReceiveSign == 1;
287
+
288
+          this.activeDictionary.postData.drugsStartCheck[0].checked = this.configs.drugsStartCheck == 1;
289
+          this.activeDictionary.postData.drugsStartCheckScanIds = this.activeDictionary.postData.drugsStartCheckScanIds.map(v => ({...v, checked: (this.configs.drugsStartCheckScanIds || '').split(',').includes(v.value.toString())}));
290
+          this.activeDictionary.postData.drugsStartManual = this.configs.drugsStartManual ? this.configs.drugsStartManual.id : undefined;
291
+          this.activeDictionary.postData.drugsStartPhoto[0].checked = this.configs.drugsStartPhoto == 1;
292
+
293
+          this.activeDictionary.postData.drugsEndCheck[0].checked = this.configs.drugsEndCheck == 1;
294
+          this.activeDictionary.postData.drugsEndCheckScanIds = this.activeDictionary.postData.drugsEndCheckScanIds.map(v => ({...v, checked: (this.configs.drugsEndCheckScanIds || '').split(',').includes(v.value.toString())}));
295
+          this.activeDictionary.postData.drugsEndManual = this.configs.drugsEndManual ? this.configs.drugsEndManual.id : undefined;
296
+          this.activeDictionary.postData.drugsEndPhoto[0].checked = this.configs.drugsEndPhoto == 1;
297
+        }
298
+      });
299
+  }
300
+}

+ 2 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.ts

@@ -166,6 +166,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
166 166
 
167 167
   //获取任务类型
168 168
   getTaskType() {
169
+    this.loading = true;
169 170
     let postData = {
170 171
       idx: 0,
171 172
       sum: 10,
@@ -183,6 +184,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
183 184
     this.mainService
184 185
       .getFetchDataList("simple/data", "taskType", postData)
185 186
       .subscribe((result) => {
187
+        this.loading = false;
186 188
         if (result.status == 200) {
187 189
           this.tasktype = result.list[0] || {};
188 190
           this.getConfig();

+ 6 - 1
src/app/views/page-config/page-config.component.html

@@ -1,7 +1,7 @@
1 1
 <div class="incidentConfig">
2 2
   <div class="tagsAndTemplete">
3 3
     <div class="tags">
4
-      <div><i class="icon_transport transport-peizhizhongxin"></i>配置中心&emsp;&gt;&emsp;业务页面控制</div>
4
+      <div><i class="icon_transport transport-peizhizhongxin"></i>配置中心&emsp;&gt;&emsp;业务流程控制</div>
5 5
       <div class="tagList">
6 6
         <span *ngFor="let tag of tagList" [ngClass]="{ active: activeTagLink === tag.link }" (click)="clickTag(tag)">{{ tag.title }}</span>
7 7
       </div>
@@ -12,6 +12,11 @@
12 12
   <ng-container *ngIf="activeTagLink === 'pageConfigSpecimen'">
13 13
     <app-configuration-specimen></app-configuration-specimen>
14 14
   </ng-container>
15
+
16
+  <!-- 药品 -->
17
+  <ng-container *ngIf="activeTagLink === 'pageConfigDrug'">
18
+    <app-configuration-drug></app-configuration-drug>
19
+  </ng-container>
15 20
 </div>
16 21
 
17 22
 

+ 2 - 0
src/app/views/page-config/page-config.module.ts

@@ -5,12 +5,14 @@ import { PageConfigRoutingModule } from './page-config-routing.module';
5 5
 import { PageConfigComponent } from './page-config.component';
6 6
 import { ShareModule } from 'src/app/share/share.module';
7 7
 import { ConfigurationSpecimenComponent } from 'src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component';
8
+import { ConfigurationDrugComponent } from 'src/app/components/configurationCenter/configuration-drug/configuration-drug.component';
8 9
 
9 10
 
10 11
 @NgModule({
11 12
   declarations: [
12 13
     PageConfigComponent,
13 14
     ConfigurationSpecimenComponent,
15
+    ConfigurationDrugComponent,
14 16
   ],
15 17
   imports: [
16 18
     CommonModule,

+ 7 - 5
src/app/views/task-type-management/task-type-management.component.html

@@ -61,11 +61,13 @@
61 61
           </nz-select>
62 62
         </div>
63 63
         <ng-container *ngIf="association.value == 'ordinary'">
64
-          <nz-form-label class="label" nzRequired>关联业务</nz-form-label>
65
-          <!-- 关联业务禁止修改 -->
66
-          <nz-select class="mb8 w100" nzShowSearch nzAllowClear nzPlaceHolder="请选择关联业务" [(ngModel)]="relatedBusiness.id" [nzDisabled]="!add">
67
-            <nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}" *ngFor="let data of allRelatedBusiness"></nz-option>
68
-          </nz-select>
64
+          <div nz-row class="mb8 display_flex align-items_center">
65
+            <nz-form-label class="label" nzRequired>关联业务</nz-form-label>
66
+            <!-- 关联业务禁止修改 -->
67
+            <nz-select class="flex_1" nzShowSearch nzAllowClear nzPlaceHolder="请选择关联业务" [(ngModel)]="relatedBusiness.id" [nzDisabled]="!add">
68
+              <nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}" *ngFor="let data of allRelatedBusiness"></nz-option>
69
+            </nz-select>
70
+          </div>
69 71
         </ng-container>
70 72
         <nz-form-label *ngIf="association.value == 'specimen'" class="label" nzRequired>空单默认科室</nz-form-label>
71 73
         <nz-select *ngIf="association.value == 'specimen'" class="mb8 w100" [ngClass]="{remandTypeId:!defaultNullDeptId}"