seimin 6 月之前
父節點
當前提交
ec73ea153f

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

@@ -21,6 +21,8 @@ import { DisinfectionSupplyGuard } from './guard/DisinfectionSupplyGuard.guard';
21 21
 import { IncidentConfigGuard } from './guard/IncidentConfig.guard';
22 22
 // 三方配置查看权限
23 23
 import { OtherConfigGuard } from './guard/OtherConfig.guard';
24
+//业务页面控制查看权限
25
+import { PageConfigGuard } from './guard/PageConfig.guard';
24 26
 
25 27
 const routes: Routes = [
26 28
   // 默认
@@ -110,6 +112,12 @@ const routes: Routes = [
110 112
     loadChildren: () => import('./views/other-config/other-config.module').then(m => m.OtherConfigModule),
111 113
     canActivate: [OtherConfigGuard]
112 114
   },
115
+  // 业务页面控制查看
116
+  {
117
+    path: 'pageConfig',
118
+    loadChildren: () => import('./views/page-config/page-config.module').then(m => m.PageConfigModule),
119
+    canActivate: [PageConfigGuard]
120
+  },
113 121
   // 问卷预览
114 122
   {
115 123
     path: "preview",

+ 58 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.html

@@ -0,0 +1,58 @@
1
+<div class="content specimen">
2
+  <div class="contentInner">
3
+    <div class="addressAssign">
4
+      <div class="contentBody2">
5
+        <div class="TaskTypeManagement">
6
+          <div class="taskTypeInfo">
7
+            <div class="top">
8
+              <div class="item" (click)="tabModal('characteristics')" [ngClass]="{'items':tabModalName=='characteristics'}">
9
+                特性配置
10
+              </div>
11
+              <div class="item" (click)="tabModal('automaticOrderCreation')" [ngClass]="{'items':tabModalName=='automaticOrderCreation'}">
12
+                自动建单配置
13
+              </div>
14
+            </div>
15
+            <div class="list" *ngIf="!loading">
16
+              <!-- 特性配置 -->
17
+              <div *ngIf="tabModalName=='characteristics'">
18
+                <!-- 是否允许追加服务 -->
19
+                <div class="display_flex align-items_center mb8">
20
+                  <nz-form-label class="label">是否允许追加服务</nz-form-label>
21
+                  <nz-checkbox-group [(ngModel)]="addService" (ngModelChange)="changeAddService($event)"></nz-checkbox-group>
22
+                </div>
23
+                <!-- 追加服务任务类型 -->
24
+                <div class="display_flex align-items_center mb8" *ngIf="addService[0].checked">
25
+                  <nz-form-label class="label" nzRequired>追加服务任务类型</nz-form-label>
26
+                  <nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear
27
+                    (nzOnSearch)="changeTasktype($event)" nzPlaceHolder="请选择追加服务任务类型" [(ngModel)]="addServiceTaskIds">
28
+                    <ng-container *ngFor="let option of taskTypes">
29
+                      <nz-option *ngIf="!isLoading" [nzLabel]="option.taskName" [nzValue]="option.id"></nz-option>
30
+                    </ng-container>
31
+                    <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
32
+                      <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
33
+                    </nz-option>
34
+                  </nz-select>
35
+                </div>
36
+              </div>
37
+              <!-- 自动建单配置 -->
38
+              <div *ngIf="tabModalName=='automaticOrderCreation'">
39
+                <!-- 自动建单 -->
40
+              </div>
41
+              <div class="bottom">
42
+                <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>
43
+              </div>
44
+            </div>
45
+            <div class="list" *ngIf="loading">
46
+              <div class="loadingFull display_flex justify-content_flex-center align-items_center">
47
+                <div class="loadingFullInner">
48
+                  <img src="../../../assets/images/loading.gif" alt="">
49
+                  <div>加载中...</div>
50
+                </div>
51
+              </div>
52
+            </div>
53
+          </div>
54
+        </div>
55
+      </div>
56
+    </div>
57
+  </div>
58
+</div>

+ 823 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.less

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

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

@@ -0,0 +1,171 @@
1
+import { Component, OnInit } 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 } from 'rxjs';
6
+import { debounceTime } from 'rxjs/operators';
7
+
8
+@Component({
9
+  selector: "app-configuration-specimen",
10
+  templateUrl: "./configuration-specimen.component.html",
11
+  styleUrls: ["./configuration-specimen.component.less"],
12
+})
13
+export class ConfigurationSpecimenComponent implements OnInit {
14
+  loading:boolean = false; //页面加载的loading
15
+  btnLoading:boolean = false; //提交按钮的loading
16
+  tabModalName:string = 'characteristics'; //当前选中的tab
17
+  hosId = this.tool.getCurrentHospital().id; //当前院区
18
+
19
+  // 是否允许追加服务
20
+  addService:any[] = [
21
+    {label:'是否开启',value: 0}
22
+  ];
23
+
24
+  // 配置
25
+  configs:any = {};
26
+  // 任务类型
27
+  tasktype:any = {};
28
+  searchTimerSubject = new Subject();
29
+  constructor(private mainService: MainService,private tool: ToolService,private msg: NzMessageService) {}
30
+
31
+  ngOnInit():void {
32
+    // todo
33
+    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
34
+      let fun = v[0];
35
+      fun.call(this, v[1]);
36
+    });
37
+    this.getTaskTypes();
38
+    this.getTaskType();
39
+  }
40
+
41
+  // 修改是否允许追加服务
42
+  changeAddService(e){
43
+    console.log(e);
44
+    if(!e[0].checked){
45
+      this.addServiceTaskIds = [];
46
+    }
47
+  }
48
+  // 用户输入搜索
49
+  isLoading: boolean = false;
50
+  addServiceTaskIds:any[] = [];
51
+  taskTypes:any[] = [];
52
+  changeTasktype(e) {
53
+    this.searchTimer(this.getTaskTypes, e);
54
+  }
55
+  // 边输入边搜索节流阀
56
+  searchTimer(fun, e) {
57
+    this.isLoading = true;
58
+    this.searchTimerSubject.next([fun, e]);
59
+  }
60
+  //获取患者其他服务任务类型
61
+  getTaskTypes(e:string = '') {
62
+    let postData:any = {
63
+      idx: 0,
64
+      sum: 9999,
65
+      taskType: {
66
+        taskName: e,
67
+        simpleQuery: true,
68
+        hosId: {
69
+          id: this.hosId
70
+        },
71
+        associationType: {
72
+          key: 'association_types',
73
+          value: 'patientTransport'
74
+        }
75
+      }
76
+    };
77
+    this.isLoading = true;
78
+    this.mainService.getFetchDataList("simple/data", "taskType", postData)
79
+      .subscribe((result) => {
80
+        this.isLoading = false;
81
+        if (result.status == 200) {
82
+          this.taskTypes = result.list || [];
83
+        }
84
+      });
85
+  }
86
+
87
+  // 切换tab
88
+  tabModal(tabModalName:string){
89
+    this.tabModalName = tabModalName;
90
+  }
91
+  // 保存
92
+  submitForm() {
93
+    if(!this.tasktype.id){
94
+      this.msg.create("warning", "请先配置患者陪检任务类型!");
95
+      return;
96
+    }
97
+    if(this.addService[0].checked && !this.addServiceTaskIds.length){
98
+      this.msg.create("warning", "请选择追加服务任务类型!");
99
+      return;
100
+    }
101
+    let postData:any = {
102
+      id: this.configs.id,
103
+      taskType: this.tasktype.id,
104
+      hosId: this.hosId,
105
+      addService: this.addService[0].checked ? 1 : 0,
106
+      addServiceTaskIds: this.addServiceTaskIds.length ? this.addServiceTaskIds.toString() : undefined,
107
+    };
108
+    this.btnLoading = true;
109
+    this.mainService
110
+      .simplePost("addData", "taskTypeConfig", postData)
111
+      .subscribe((result) => {
112
+        this.btnLoading = false;
113
+        if (result.status == 200) {
114
+          this.getConfig();
115
+        }
116
+      });
117
+  }
118
+
119
+  //获取任务类型
120
+  getTaskType() {
121
+    let postData = {
122
+      idx: 0,
123
+      sum: 10,
124
+      taskType: {
125
+        simpleQuery: true,
126
+        hosId: {
127
+          id: this.hosId
128
+        },
129
+        associationType: {
130
+          key:"association_types",
131
+          value: 'inspect'
132
+        }
133
+      }
134
+    };
135
+    this.mainService
136
+      .getFetchDataList("simple/data", "taskType", postData)
137
+      .subscribe((result) => {
138
+        if (result.status == 200) {
139
+          this.tasktype = result.list[0] || {};
140
+          this.getConfig();
141
+        }
142
+      });
143
+  }
144
+
145
+  // 获取配置
146
+  getConfig() {
147
+    this.loading = true;
148
+    let postData = {
149
+      idx: 0,
150
+      sum: 10,
151
+      taskTypeConfig: {
152
+        taskTypeDTO: {
153
+          hosId: {
154
+            id: this.hosId
155
+          },
156
+          associationType: this.tasktype.associationType
157
+        }
158
+      }
159
+    };
160
+    this.mainService
161
+      .getFetchDataList("simple/data", "taskTypeConfig", postData)
162
+      .subscribe((result) => {
163
+        this.loading = false;
164
+        if (result.status == 200) {
165
+          this.configs = result.list[0] || {};
166
+          this.addService[0].checked = this.configs.addService == 1;
167
+          this.addServiceTaskIds = this.configs.addServiceTaskIds ? this.configs.addServiceTaskIds.split(',').map(v => +v) : [];
168
+        }
169
+      });
170
+  }
171
+}

+ 5 - 0
src/app/components/select-menu/select-menu.component.ts

@@ -20,10 +20,15 @@ export class SelectMenuComponent implements OnInit {
20 20
   ngOnInit() {
21 21
     let menus = JSON.parse(localStorage.getItem("menu"));
22 22
     let configurationCenterMenus = [];
23
+    // 事件配置
23 24
     let incidentConfig = menus.find(item => item.link == 'incidentConfig');
24 25
     incidentConfig && configurationCenterMenus.push(incidentConfig);
26
+    // 三方配置
25 27
     let otherConfig = menus.find(item => item.link == 'otherConfig');
26 28
     otherConfig && configurationCenterMenus.push(otherConfig);
29
+    // 业务页面控制
30
+    let pageConfig = menus.find(item => item.link == 'pageConfig');
31
+    pageConfig && configurationCenterMenus.push(pageConfig);
27 32
     this.configurationCenterMenus = configurationCenterMenus;
28 33
   }
29 34
   clickHandle(item){

+ 22 - 0
src/app/guard/pageConfig.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 PageConfigGuard 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 == 'pageConfig');
15
+    }
16
+    if (!can) {
17
+      this.router.navigate(['login']);
18
+      return false
19
+    }
20
+    return true;
21
+  }
22
+}

+ 5 - 0
src/app/views/main/main.component.ts

@@ -34,6 +34,7 @@ export class MainComponent implements OnInit {
34 34
   disinfectionSupplyRole: boolean = false; //全局业务查看权限
35 35
   incidentConfigRole: boolean = false; //事件配置权限
36 36
   otherConfigRole: boolean = false; //三方配置权限
37
+  pageConfigRole: boolean = false; //业务页面控制权限
37 38
   PCCommutesToWork: boolean = false; //PC上下班权限
38 39
   @ViewChild("osComponentRef1", {
39 40
     read: OverlayScrollbarsComponent,
@@ -312,6 +313,10 @@ export class MainComponent implements OnInit {
312 313
         this.otherConfigRole = true;
313 314
         console.log("三方配置权限");
314 315
       }
316
+      if (e.link == "pageConfig") {
317
+        this.pageConfigRole = true;
318
+        console.log("业务页面控制权限");
319
+      }
315 320
       if (e.link == "PCCommutesToWork") {
316 321
         this.PCCommutesToWork = true;
317 322
         console.log("PC上下班");

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

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

+ 17 - 0
src/app/views/page-config/page-config.component.html

@@ -0,0 +1,17 @@
1
+<div class="incidentConfig">
2
+  <div class="tagsAndTemplete">
3
+    <div class="tags">
4
+      <div><i class="icon_transport transport-peizhizhongxin"></i>配置中心&emsp;&gt;&emsp;业务页面控制</div>
5
+      <div class="tagList">
6
+        <span *ngFor="let tag of tagList" [ngClass]="{ active: activeTagId === tag.id }" (click)="clickTag(tag)">{{ tag.name }}</span>
7
+      </div>
8
+      <button nz-button class="btn default" (click)="goBack()">返回</button>
9
+    </div>
10
+  </div>
11
+  <!-- 标本 -->
12
+  <ng-container *ngIf="activeTagId === 1">
13
+    <app-configuration-specimen></app-configuration-specimen>
14
+  </ng-container>
15
+</div>
16
+
17
+

+ 57 - 0
src/app/views/page-config/page-config.component.less

@@ -0,0 +1,57 @@
1
+@import "../../../../src/theme.less";
2
+:host {
3
+  width: 100%;
4
+  .incidentConfig{
5
+    padding-bottom: 24px;
6
+    height: 100%;
7
+    display: flex;
8
+    flex-direction: column;
9
+    justify-content: space-between;
10
+    background-color: #F0F2F5;
11
+    .tagsAndTemplete{
12
+      height: 64px;
13
+      display: flex;
14
+      justify-content: space-between;
15
+      align-items: center;
16
+      .tags{
17
+        height: 100%;
18
+        background: #fff;
19
+        flex: 1;
20
+        padding: 16px 24px;
21
+        display: flex;
22
+        align-items: center;
23
+        justify-content: space-between;
24
+        position: relative;
25
+        .transport-peizhizhongxin{
26
+          color: @primary-color;
27
+          font-size: 20px;
28
+          margin-right: 8px;;
29
+        }
30
+        .tagList{
31
+          width: 100%;
32
+          height: 100%;
33
+          position: absolute;
34
+          left: 0;
35
+          top: 50%;
36
+          transform: translateY(-50%);
37
+          display: flex;
38
+          justify-content: center;
39
+          align-items: center;
40
+          span{
41
+            height: 100%;
42
+            display: inline-block;
43
+            padding: 0 24px;
44
+            cursor: pointer;
45
+            display: flex;
46
+            justify-content: center;
47
+            align-items: center;
48
+            &.active{
49
+              color: @primary-color;
50
+              background: #F0F6ED;
51
+            }
52
+          }
53
+        }
54
+      }
55
+    }
56
+  }
57
+}

+ 35 - 0
src/app/views/page-config/page-config.component.ts

@@ -0,0 +1,35 @@
1
+import { Component, OnInit, AfterViewInit } from "@angular/core";
2
+import { Location } from '@angular/common';
3
+
4
+@Component({
5
+  selector: "app-page-config",
6
+  templateUrl: "./page-config.component.html",
7
+  styleUrls: ["./page-config.component.less"],
8
+})
9
+export class PageConfigComponent implements OnInit, AfterViewInit {
10
+  constructor(
11
+    private _location: Location,
12
+  ){}
13
+
14
+  // tab
15
+  tagList:any = [
16
+    { id: 1, name: '标本',},
17
+  ];
18
+
19
+  ngOnInit(): void {}
20
+
21
+  ngAfterViewInit(){
22
+    this.clickTag(this.tagList[0]);
23
+  }
24
+
25
+  // 点击tab
26
+  activeTagId:any = 1;
27
+  clickTag(tag){
28
+    this.activeTagId = tag.id;
29
+  }
30
+
31
+  // 返回
32
+  goBack(){
33
+    this._location.back();
34
+  }
35
+}

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

@@ -0,0 +1,21 @@
1
+import { NgModule } from '@angular/core';
2
+import { CommonModule } from '@angular/common';
3
+
4
+import { PageConfigRoutingModule } from './page-config-routing.module';
5
+import { PageConfigComponent } from './page-config.component';
6
+import { ShareModule } from 'src/app/share/share.module';
7
+import { ConfigurationSpecimenComponent } from 'src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component';
8
+
9
+
10
+@NgModule({
11
+  declarations: [
12
+    PageConfigComponent,
13
+    ConfigurationSpecimenComponent,
14
+  ],
15
+  imports: [
16
+    CommonModule,
17
+    PageConfigRoutingModule,
18
+    ShareModule,
19
+  ]
20
+})
21
+export class PageConfigModule { }