浏览代码

Merge branch 'master' of http://git.dashitech.com/seimin/zy-pc

maotao 6 月之前
父节点
当前提交
4898206864
共有 100 个文件被更改,包括 9530 次插入3937 次删除
  1. 6 2
      angular.json
  2. 27 0
      package-lock.json
  3. 2 0
      package.json
  4. 8 0
      proxy.conf.json
  5. 68 0
      src/app/components/bind-extension-number/bind-extension-number.component.html
  6. 192 0
      src/app/components/bind-extension-number/bind-extension-number.component.less
  7. 191 0
      src/app/components/bind-extension-number/bind-extension-number.component.ts
  8. 20 0
      src/app/components/bind-extension-number/bind-extension-number.module.ts
  9. 4 1
      src/app/components/configurationCenter/configuration-callcenter/configuration-callcenter.component.html
  10. 2 4
      src/app/components/configurationCenter/configuration-callcenter/configuration-callcenter.component.ts
  11. 2 2
      src/app/components/configurationCenter/configuration-category/configuration-category.component.ts
  12. 2 2
      src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component.html
  13. 12 13
      src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component.ts
  14. 20 0
      src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.module.ts
  15. 5 4
      src/app/components/incidentManagement/incident-detail/incident-detail.component.html
  16. 19 16
      src/app/components/incidentManagement/incident-detail/incident-detail.component.ts
  17. 36 0
      src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.html
  18. 125 0
      src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.less
  19. 120 0
      src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.ts
  20. 20 0
      src/app/components/incidentManagement/incident-direct-order/incident-direct-order.module.ts
  21. 2 2
      src/app/components/incidentManagement/incident-handle-info-simple/incident-handle-info-simple.component.html
  22. 42 8
      src/app/components/incidentManagement/incident-handle-info-simple/incident-handle-info-simple.component.ts
  23. 2 2
      src/app/components/incidentManagement/incident-handle-info/incident-handle-info.component.html
  24. 28 8
      src/app/components/incidentManagement/incident-handle-info/incident-handle-info.component.ts
  25. 30 3
      src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.ts
  26. 2 2
      src/app/components/incidentManagement/incident-handle-repair/incident-handle-repair.component.html
  27. 15 5
      src/app/components/incidentManagement/incident-handle-repair/incident-handle-repair.component.ts
  28. 1 1
      src/app/components/incidentManagement/incident-handle/incident-handle.component.html
  29. 2 4
      src/app/components/incidentManagement/incident-handle/incident-handle.component.less
  30. 3 2
      src/app/components/incidentManagement/incident-handle/incident-handle.component.ts
  31. 14 0
      src/app/components/incidentManagement/incident-recording/incident-recording.component.html
  32. 173 0
      src/app/components/incidentManagement/incident-recording/incident-recording.component.less
  33. 29 0
      src/app/components/incidentManagement/incident-recording/incident-recording.component.ts
  34. 20 0
      src/app/components/incidentManagement/incident-recording/incident-recording.module.ts
  35. 22 0
      src/app/components/incidentManagement/incident-reject/incident-reject.component.html
  36. 125 0
      src/app/components/incidentManagement/incident-reject/incident-reject.component.less
  37. 65 0
      src/app/components/incidentManagement/incident-reject/incident-reject.component.ts
  38. 20 0
      src/app/components/incidentManagement/incident-reject/incident-reject.module.ts
  39. 77 0
      src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.html
  40. 240 0
      src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.less
  41. 122 0
      src/app/components/incidentManagement/incident-ser-call/incident-ser-call.component.ts
  42. 22 0
      src/app/components/incidentManagement/incident-ser-call/incident-ser-call.module.ts
  43. 73 0
      src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.html
  44. 240 0
      src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.less
  45. 181 0
      src/app/components/incidentManagement/incident-ser-message/incident-ser-message.component.ts
  46. 24 0
      src/app/components/incidentManagement/incident-ser-message/incident-ser-message.module.ts
  47. 36 0
      src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.html
  48. 155 0
      src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.less
  49. 143 0
      src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.component.ts
  50. 24 0
      src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.module.ts
  51. 16 1
      src/app/components/incidentManagement/incident-substitutio-assign/incident-substitution-assign.component.ts
  52. 1 1
      src/app/components/incidentManagement/incident-substitutio-redeploy/incident-substitution-redeploy.component.ts
  53. 1 1
      src/app/components/incidentManagement/incident-substitution/incident-substitution.component.less
  54. 1 1
      src/app/components/knowledge-look/knowledge-look.component.less
  55. 3 3
      src/app/components/knowledge-look/knowledge-look.component.ts
  56. 103 0
      src/app/components/order-scope/order-scope.component.html
  57. 184 0
      src/app/components/order-scope/order-scope.component.less
  58. 433 0
      src/app/components/order-scope/order-scope.component.ts
  59. 20 0
      src/app/components/order-scope/order-scope.module.ts
  60. 17 0
      src/app/pipes/string-to-first-name.pipe.ts
  61. 0 1
      src/app/services/httpInterceptor.service.ts
  62. 13 1
      src/app/services/main.service.ts
  63. 25 3
      src/app/services/tool.service.ts
  64. 19 0
      src/app/services/websocket-hjzx.service.ts
  65. 111 0
      src/app/services/websocket-incoming.service.ts
  66. 7 0
      src/app/services/websocket-phone.service.ts
  67. 3 0
      src/app/share/share.module.ts
  68. 6 0
      src/app/views/data-dictionary/data-dictionary.component.ts
  69. 1577 2549
      src/app/views/fuwutai/fuwutai.component.html
  70. 617 75
      src/app/views/fuwutai/fuwutai.component.less
  71. 2901 880
      src/app/views/fuwutai/fuwutai.component.ts
  72. 24 0
      src/app/views/fuwutai/fuwutai.module.ts
  73. 4 3
      src/app/views/group-management/group-management.component.html
  74. 1 1
      src/app/views/hospital-config/hospital-config.component.ts
  75. 0 2
      src/app/views/hushijiandan/hushijiandan.component.ts
  76. 1 1
      src/app/views/incident-config/incident-config.component.html
  77. 11 0
      src/app/views/incident-config/incident-config.component.ts
  78. 3 3
      src/app/views/incident-config/incident-config.module.ts
  79. 11 10
      src/app/views/incident-management/incident-management.component.html
  80. 37 26
      src/app/views/incident-management/incident-management.component.ts
  81. 1 1
      src/app/views/inspection-plan-config/inspection-plan-config.component.ts
  82. 1 0
      src/app/views/login/login.component.html
  83. 33 0
      src/app/views/login/login.component.ts
  84. 33 41
      src/app/views/main/main.component.html
  85. 76 22
      src/app/views/main/main.component.less
  86. 14 5
      src/app/views/main/main.component.ts
  87. 1 1
      src/app/views/other-config/other-config.component.html
  88. 6 1
      src/app/views/other-config/other-config.component.ts
  89. 3 1
      src/app/views/other-config/other-config.module.ts
  90. 72 74
      src/app/views/pathology/pathology.component.ts
  91. 66 68
      src/app/views/pathologyScan/pathologyScan.component.ts
  92. 0 2
      src/app/views/pharmacy/pharmacy.component.ts
  93. 0 2
      src/app/views/pharmacy2/pharmacy2.component.ts
  94. 28 28
      src/app/views/repository-manage/repository-manage.component.ts
  95. 35 37
      src/app/views/specimen-room-view/specimen-room-view.component.ts
  96. 0 2
      src/app/views/specimen-view2/specimen-view2.component.ts
  97. 3 3
      src/app/views/users-management/users-management.component.ts
  98. 164 3
      src/assets/iconfont/demo_index.html
  99. 31 3
      src/assets/iconfont/iconfont.css
  100. 0 0
      src/assets/iconfont/iconfont.js

+ 6 - 2
angular.json

@@ -39,7 +39,9 @@
39 39
             ],
40 40
             "scripts": [
41 41
               "node_modules/echarts/dist/echarts.min.js",
42
-              "./node_modules/swiper/swiper-bundle.min.js"
42
+              "./node_modules/swiper/swiper-bundle.min.js",
43
+              "src/assets/libs/TLWebSocketAgent.js",
44
+              "src/assets/libs/ola_api.js"
43 45
             ]
44 46
           },
45 47
           "configurations": {
@@ -110,7 +112,9 @@
110 112
             ],
111 113
             "scripts": [
112 114
               "node_modules/echarts/dist/echarts.min.js",
113
-              "./node_modules/swiper/swiper-bundle.min.js"
115
+              "./node_modules/swiper/swiper-bundle.min.js",
116
+              "src/assets/libs/TLWebSocketAgent.js",
117
+              "src/assets/libs/ola_api.js"
114 118
             ]
115 119
           }
116 120
         },

+ 27 - 0
package-lock.json

@@ -32,6 +32,7 @@
32 32
         "ngx-echarts": "^4.2.2",
33 33
         "ngx-print": "~1.2.1",
34 34
         "ngx-sortablejs": "^3.1.3",
35
+        "ngx-virtual-scroller": "^4.0.3",
35 36
         "npm": "^6.14.15",
36 37
         "overlayscrollbars": "^1.11.0",
37 38
         "overlayscrollbars-ngx": "^0.1.1",
@@ -829,6 +830,12 @@
829 830
         "npm": ">= 6.2.0"
830 831
       }
831 832
     },
833
+    "node_modules/@tweenjs/tween.js": {
834
+      "version": "17.4.0",
835
+      "resolved": "https://registry.npmmirror.com/@tweenjs/tween.js/-/tween.js-17.4.0.tgz",
836
+      "integrity": "sha512-J3fzl1F6wvh8KXVVcIuHN12xi1ZDcPA/0Vix+ZcJYwZWVHUwfIqfvzYXXEw7ybeev6477KCTt9fKydU+ajUqcg==",
837
+      "license": "MIT"
838
+    },
832 839
     "node_modules/@types/big.js": {
833 840
       "version": "6.2.2",
834 841
       "resolved": "https://registry.npmmirror.com/@types/big.js/-/big.js-6.2.2.tgz",
@@ -947,6 +954,12 @@
947 954
       "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
948 955
       "dev": true
949 956
     },
957
+    "node_modules/@types/tween.js": {
958
+      "version": "17.2.0",
959
+      "resolved": "https://registry.npmmirror.com/@types/tween.js/-/tween.js-17.2.0.tgz",
960
+      "integrity": "sha512-mOsqurEtFEzwgkVc/jDVE2XrjZBYTbrmDUyCr9GXmnfc6q5otokxFtKvSY/B21zgz9LVRIvRTawKczjKi57wrA==",
961
+      "license": "MIT"
962
+    },
950 963
     "node_modules/@types/webpack-sources": {
951 964
       "version": "0.1.12",
952 965
       "resolved": "https://registry.npmmirror.com/@types/webpack-sources/-/webpack-sources-0.1.12.tgz",
@@ -7652,6 +7665,20 @@
7652 7665
         "sortablejs": ">=1.7.0"
7653 7666
       }
7654 7667
     },
7668
+    "node_modules/ngx-virtual-scroller": {
7669
+      "version": "4.0.3",
7670
+      "resolved": "https://registry.npmmirror.com/ngx-virtual-scroller/-/ngx-virtual-scroller-4.0.3.tgz",
7671
+      "integrity": "sha512-JBqUJ/f7GRCZDnI/JeiFoTmYR8rC/Hyv8L5I7ImePM6f/hwiFNRsrK8Abdd0E3TwklwgmZAK875te9XQJrgsyQ==",
7672
+      "license": "MIT",
7673
+      "dependencies": {
7674
+        "@tweenjs/tween.js": "17.4.0",
7675
+        "@types/tween.js": "17.2.0"
7676
+      },
7677
+      "peerDependencies": {
7678
+        "@angular/core": ">=6.0.0",
7679
+        "tslib": "^1.10.0"
7680
+      }
7681
+    },
7655 7682
     "node_modules/nice-try": {
7656 7683
       "version": "1.0.5",
7657 7684
       "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",

+ 2 - 0
package.json

@@ -7,6 +7,7 @@
7 7
     "start:17": "set NODE_OPTIONS=--openssl-legacy-provider && ng serve --proxy-config proxy.conf.json --port 4210 --disable-host-check --public-host=dashitech.com --host 0.0.0.0",
8 8
     "build:17": "set NODE_OPTIONS=--openssl-legacy-provider --max_old_space_size=4096 && npm run build",
9 9
     "development": "node ./upload/development.js",
10
+    "development120": "node ./upload/development120.js",
10 11
     "production": "node ./upload/production.js",
11 12
     "test": "ng test",
12 13
     "lint": "ng lint",
@@ -40,6 +41,7 @@
40 41
     "ngx-echarts": "^4.2.2",
41 42
     "ngx-print": "~1.2.1",
42 43
     "ngx-sortablejs": "^3.1.3",
44
+    "ngx-virtual-scroller": "^4.0.3",
43 45
     "npm": "^6.14.15",
44 46
     "overlayscrollbars": "^1.11.0",
45 47
     "overlayscrollbars-ngx": "^0.1.1",

+ 8 - 0
proxy.conf.json

@@ -14,5 +14,13 @@
14 14
     "pathRewrite": {
15 15
       "^/file": "/file"
16 16
     }
17
+  },
18
+  "/record": {
19
+    "target": "http://192.168.3.108",
20
+    "logLevel": "debug",
21
+    "changeOrigin": true,
22
+    "pathRewrite": {
23
+      "^/record": "/record"
24
+    }
17 25
   }
18 26
 }

+ 68 - 0
src/app/components/bind-extension-number/bind-extension-number.component.html

@@ -0,0 +1,68 @@
1
+<!-- 绑定分机 -->
2
+<div class="init recallOrder display_flex justify-content_flex-center align-items_center">
3
+  <div class="con modalBody">
4
+    <div class="title">
5
+      绑定分机<i class="icon_transport transport-guanbi" (click)="cancelInit()"></i>
6
+    </div>
7
+    <div class="content">
8
+      <div class="scopeTab">
9
+        <div class="scopeTabItem" [ngClass]="{ active: item.value == activeScopeTab.value }" *ngFor="let item of scopeTabs" (click)="activeScopeTab = item">
10
+          <label nz-checkbox [(ngModel)]="item.checked" (ngModelChange)="changeFlag($event, item)">{{item.name}}</label>
11
+        </div>
12
+      </div>
13
+      <!-- 分机绑定 -->
14
+      <div class="conditions" *ngIf="activeScopeTab.value == 1">
15
+        <div nz-row class="row">
16
+          <div nz-col nzSpan="3" class="name">院区:</div>
17
+          <div nz-col nzSpan="21">
18
+            <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzPlaceHolder="请选择院区" [(ngModel)]="formData1.hospital" (ngModelChange)="changeHospital($event)">
19
+              <ng-container *ngFor="let option of hospitalList">
20
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
21
+              </ng-container>
22
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
23
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
24
+              </nz-option>
25
+            </nz-select>
26
+          </div>
27
+        </div>
28
+        <div nz-row class="row">
29
+          <div nz-col nzSpan="3" class="name">分机号:</div>
30
+          <div nz-col nzSpan="21">
31
+            <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzPlaceHolder="请选择分机号" [(ngModel)]="formData1.number">
32
+              <ng-container *ngFor="let option of phoneNumList">
33
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.value" [nzValue]="option.value"></nz-option>
34
+              </ng-container>
35
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
36
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
37
+              </nz-option>
38
+            </nz-select>
39
+          </div>
40
+        </div>
41
+      </div>
42
+      <!-- 呼叫中心 -->
43
+      <div class="conditions" *ngIf="activeScopeTab.value == 2">
44
+        <div nz-row class="row">
45
+          <div nz-col nzSpan="3" class="name">分机号:</div>
46
+          <div nz-col nzSpan="21">
47
+            <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzPlaceHolder="请选择分机号" [(ngModel)]="formData2.number">
48
+              <ng-container *ngFor="let option of hjzxCornetList">
49
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.value" [nzValue]="option.value"></nz-option>
50
+              </ng-container>
51
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
52
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
53
+              </nz-option>
54
+            </nz-select>
55
+          </div>
56
+        </div>
57
+      </div>
58
+    </div>
59
+    <div class="btns display_flex justify-content_flex-center">
60
+      <button class="btn" nz-button nzType="primary" [nzLoading]="websocketLoading" (click)="saveOrderScope()">
61
+        {{activeScopeTab.value == 1 ? '绑定' : '签入'}}
62
+      </button>
63
+      <button class="btn cancel" nz-button nzType="default" (click)="cancelInit()">
64
+        取消
65
+      </button>
66
+    </div>
67
+  </div>
68
+</div>

+ 192 - 0
src/app/components/bind-extension-number/bind-extension-number.component.less

@@ -0,0 +1,192 @@
1
+@import "../../../../src/theme.less";
2
+:host {
3
+  ::ng-deep .ant-checkbox-wrapper + .ant-checkbox-wrapper{
4
+    margin-left: 0!important;
5
+  }
6
+  .formItem {
7
+    width: 290px;
8
+  }
9
+  .name{
10
+    line-height: 32px;
11
+  }
12
+  .row{
13
+    margin-bottom: 24px!important;
14
+  }
15
+  .required{
16
+    position: relative;
17
+    &::before{
18
+      font-family: icon_transport;
19
+      font-size: 10px;
20
+      content:'\e606';
21
+      color: red;
22
+      position: absolute;
23
+      right: 100%;
24
+      top: 50%;
25
+      transform: translateY(-50%);
26
+      margin-right: 2px;
27
+    }
28
+  }
29
+  // 撤回工单
30
+  .recallOrder {
31
+    position: fixed;
32
+    left: 0;
33
+    top: 0;
34
+    width: 100%;
35
+    height: 100%;
36
+    background: rgba(0, 0, 0, 0.4);
37
+    z-index: 9999999;
38
+
39
+    .modalBody {
40
+      width: 350px;
41
+      height: 220px;
42
+      background: #fff;
43
+      border-radius: 5px;
44
+      padding: 10px 20px;
45
+      color: #333;
46
+
47
+      .title {
48
+        width: 100%;
49
+        text-align: center;
50
+        font-size: 18px;
51
+        position: relative;
52
+
53
+        i {
54
+          position: absolute;
55
+          right: 0;
56
+          top: 0;
57
+          font-size: 20px;
58
+          color: #666;
59
+          cursor: pointer;
60
+          padding: 0 5px;
61
+        }
62
+      }
63
+
64
+      .content {
65
+        width: 310px;
66
+        height: 117px;
67
+        background: #f9fafb;
68
+        border: 1px solid #e5e9ed;
69
+        border-radius: 5px;
70
+        overflow: hidden;
71
+        margin-top: 12px;
72
+
73
+        div {
74
+          text-align: center;
75
+          margin: 0;
76
+
77
+          &.icon {
78
+            margin-top: 17px;
79
+
80
+            i {
81
+              color: #ff3b53;
82
+              font-size: 30px !important;
83
+
84
+              &.transport-wenhao {
85
+                color: #f5a523;
86
+              }
87
+            }
88
+          }
89
+
90
+          &.defeat {
91
+            color: #333;
92
+            font-size: 18px;
93
+          }
94
+
95
+          &:nth-child(3) {
96
+            font-size: 14px;
97
+            color: #666;
98
+          }
99
+        }
100
+
101
+        .conditions {
102
+          height: 235px;
103
+          overflow: auto;
104
+          padding: 48px 80px;
105
+
106
+          div {
107
+            text-align: left;
108
+          }
109
+        }
110
+      }
111
+
112
+      .btns {
113
+        button {
114
+          margin-top: 10px;
115
+          margin-left: 5px;
116
+        }
117
+
118
+        .recDelBtn {
119
+          width: 115px;
120
+        }
121
+      }
122
+    }
123
+  }
124
+
125
+  // 初始化设置
126
+  .init {
127
+    position: fixed;
128
+    left: 0;
129
+    top: 0;
130
+    width: 100%;
131
+    height: 100%;
132
+    background: rgba(0, 0, 0, 0.4);
133
+    z-index: 99;
134
+
135
+    .con {
136
+      width: 832px;
137
+      height: auto;
138
+      background: #fff;
139
+      border-radius: 5px;
140
+      padding: 10px 20px;
141
+      color: #333;
142
+
143
+      .content {
144
+        width: 100%;
145
+        height: auto;
146
+
147
+        .scopeTab{
148
+          display: flex;
149
+          height: 60px;
150
+          border-bottom: 1px solid #D9D9D9;
151
+          .scopeTabItem{
152
+            flex: 1;
153
+            display: flex;
154
+            justify-content: center;
155
+            align-items: center;
156
+            border-right: 1px solid #D9D9D9;
157
+            background-color: #fff;
158
+            cursor: pointer;
159
+            &:last-of-type{
160
+              border-right: none;
161
+            }
162
+            &.active{
163
+              background-color: #F0F6ED;
164
+            }
165
+          }
166
+        }
167
+
168
+        .remin {
169
+          font-size: 14px;
170
+          color: #666;
171
+          line-height: 48px;
172
+          border-bottom: 1px solid #e5e9ed;
173
+        }
174
+
175
+        .boxes {
176
+          color: #333;
177
+          padding: 8px 12px;
178
+
179
+          & > div:nth-child(1) {
180
+            color: #333;
181
+            text-align: left;
182
+          }
183
+
184
+          & > div:nth-child(2) {
185
+            color: #666;
186
+            text-align: left;
187
+          }
188
+        }
189
+      }
190
+    }
191
+  }
192
+}

+ 191 - 0
src/app/components/bind-extension-number/bind-extension-number.component.ts

@@ -0,0 +1,191 @@
1
+import { Component, OnInit, Output, Input } from '@angular/core';
2
+import { EventEmitter } from '@angular/core';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { ToolService } from 'src/app/services/tool.service';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+import { WebsocketIncomingService } from 'src/app/services/websocket-incoming.service';
7
+
8
+@Component({
9
+  selector: 'app-bind-extension-number',
10
+  templateUrl: './bind-extension-number.component.html',
11
+  styleUrls: ['./bind-extension-number.component.less']
12
+})
13
+export class BindExtensionNumberComponent implements OnInit {
14
+  @Input() websocketLoading:boolean = false;
15
+  @Input() hsmsData:any = {
16
+    checkedHos: undefined,
17
+    scopeGroups: [],
18
+    orderScopeRadio: undefined,
19
+  }
20
+  @Input() itsmData:any = {
21
+    checkedHos: undefined,
22
+    scopeGroups: [],
23
+    orderScopeRadio: undefined,
24
+  }
25
+  @Output() confirmModal = new EventEmitter();
26
+  @Output() cancelModal = new EventEmitter();
27
+  constructor(
28
+    private mainService: MainService,
29
+    private tool: ToolService,
30
+    private message: NzMessageService,
31
+    private icomingService: WebsocketIncomingService,
32
+  ) { }
33
+
34
+  user = JSON.parse(localStorage.getItem("user")); //用户信息
35
+  isLoading:boolean = false;
36
+  formData1:any = {};
37
+  formData2:any = {};
38
+  hospitalList:any[] = [];
39
+
40
+  // 工单范选项卡
41
+  scopeTabs:any[] = [
42
+    { name: '分机绑定', value: 1, checked: false },
43
+    { name: '呼叫中心', value: 2, checked: false },
44
+  ];
45
+  activeScopeTab = this.scopeTabs[0];
46
+
47
+  ngOnInit() {
48
+    console.log('itsmData', this.itsmData);
49
+    console.log('hsmsData', this.hsmsData);
50
+    this.getHospitalList();
51
+    this.getHjzxCornetList();
52
+    this.getCallCenterConfig();
53
+  }
54
+
55
+  // 获取院区列表
56
+  getHospitalList() {
57
+    // 工单范围
58
+    // 运维不限制部门,则取权限下的所有院区和部门
59
+    // 运维限制部门,则取运维选中的部门和配送选中的院区
60
+    if(this.itsmData.mdv2Switch){
61
+      // 开通运维
62
+      if(this.itsmData.allDuty === 1){
63
+        // 不限制部门
64
+        let hospitals = this.user.infoPermission.hospitals || [];
65
+        let dutyList = this.user.infoPermission.dutyList || [];
66
+        this.hospitalList = hospitals.concat(dutyList);
67
+      }else{
68
+        // 限制部门
69
+        if(this.hsmsData.hsmsSwitch){
70
+          // 开通配送
71
+          this.hospitalList = this.itsmData.checkedHos.concat(this.hsmsData.checkedHosDTO);
72
+        }else{
73
+          // 未开通配送
74
+          this.hospitalList = this.itsmData.checkedHos;
75
+        }
76
+      }
77
+    }else{
78
+      // 未开通运维
79
+      if(this.hsmsData.hsmsSwitch){
80
+        // 开通配送
81
+        this.hospitalList = [this.hsmsData.checkedHosDTO];
82
+      }else{
83
+        // 未开通配送
84
+        this.hospitalList = [];
85
+      }
86
+    }
87
+  }
88
+
89
+  //获取呼叫中心分机号码
90
+  hjzxCornetList:any[] = [];
91
+  getHjzxCornetList() {
92
+    this.isLoading = true;
93
+    this.mainService.getDictionary('list', 'hjzx_cornet').subscribe((data) => {
94
+      this.isLoading = false;
95
+      this.hjzxCornetList = data || [];
96
+    });
97
+  }
98
+
99
+  // 获取呼叫中心服务连接地址
100
+  callCenterConfigObj:any = {};
101
+  getCallCenterConfig() {
102
+    let data = {
103
+      idx: 0,
104
+      sum: 9999,
105
+      callCenterConfig: {},
106
+    };
107
+    this.mainService
108
+      .getFetchDataList("simple/data", "callCenterConfig", data)
109
+      .subscribe((data) => {
110
+        if (data.status == 200) {
111
+          let list = data.list || [];
112
+          this.callCenterConfigObj = list.length ? list[0] : {};
113
+        }else{
114
+          this.message.error(data.msg || "请求数据失败");
115
+        }
116
+      });
117
+  }
118
+
119
+  // 修改院区
120
+  changeHospital(hosId){
121
+    this.phoneNumList = [];
122
+    this.getPhoneNumList(hosId);
123
+  }
124
+
125
+
126
+
127
+  // 修改选项卡-是否启动
128
+  changeFlag(flag, item){
129
+    if(flag){
130
+      this.scopeTabs.forEach(v => {
131
+        if(v.value != item.value){
132
+          v.checked = false;
133
+        }
134
+      })
135
+    }
136
+  }
137
+
138
+  //获取所有分机号码列表
139
+  phoneNumList:any[] = [];
140
+  getPhoneNumList(hosId) {
141
+    this.isLoading = true;
142
+    let postData = {
143
+      idx: 0,
144
+      sum: 100,
145
+      hospitalConfig: { hosId },
146
+    };
147
+    this.mainService
148
+      .getFetchDataList("simple/data", "hospitalConfig", postData)
149
+      .subscribe((result) => {
150
+        this.isLoading = false;
151
+        this.phoneNumList = result.list.filter((item) => item.key.includes("phone_num_port") && item.value);
152
+        console.log('this.phoneNumList:', this.phoneNumList)
153
+      });
154
+  }
155
+
156
+  // 保存工单范围设置
157
+  saveOrderScope() {
158
+    let startObj = this.scopeTabs.find((item) => item.checked);
159
+    if(startObj){
160
+      if(startObj.value == 1){
161
+        // 录音盒
162
+        if(!this.formData1.number){
163
+          this.message.warning('请选择【分机绑定】分机号码')
164
+          return;
165
+        }
166
+        this.icomingService.setSign('box');
167
+        this.confirmModal.emit(this.formData1.number);
168
+      }else if(startObj.value == 2){
169
+        // 呼叫中心
170
+        if(!this.formData2.number){
171
+          this.message.warning('请选择【呼叫中心】分机号码')
172
+          return;
173
+        }
174
+        if(!this.callCenterConfigObj.socketUrl.trim()){
175
+          this.message.warning('呼叫中心服务连接地址未配置,请前往配置中心->三方配置中配置')
176
+          return;
177
+        }
178
+        this.icomingService.setSign('callCenter');
179
+        this.icomingService.setSocketUrl(this.callCenterConfigObj.socketUrl);
180
+        this.confirmModal.emit(this.formData2.number);
181
+      }
182
+    }else{
183
+      this.message.warning('请启动分机号码或呼叫中心')
184
+    }
185
+  }
186
+
187
+  // 关闭弹窗
188
+  cancelInit() {
189
+    this.cancelModal.emit();
190
+  }
191
+}

+ 20 - 0
src/app/components/bind-extension-number/bind-extension-number.module.ts

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

+ 4 - 1
src/app/components/configurationCenter/configuration-callcenter/configuration-callcenter.component.html

@@ -3,7 +3,6 @@
3 3
     <div class="addressAssign">
4 4
       <overlay-scrollbars #osComponentRef2 class="contentBody2">
5 5
         <div class="contentBody">
6
-          <div class="hospital">{{currentHospital.hosName}}</div>
7 6
           <div class="classList">
8 7
             节假日班次:
9 8
             <nz-select class="select" [nzDropdownMatchSelectWidth]="false" nzAllowClear [(ngModel)]="dataInfo.holidayClassId"
@@ -28,6 +27,10 @@
28 27
               </nz-option>
29 28
             </nz-select>
30 29
           </div>
30
+          <div class="classList">
31
+            呼叫中心服务连接:
32
+            <input style="width: 270px;" nz-input placeholder="请填写呼叫中心服务连接" [(ngModel)]="dataInfo.socketUrl" />
33
+          </div>
31 34
         </div>
32 35
       </overlay-scrollbars>
33 36
       <div class="contentBtns">

+ 2 - 4
src/app/components/configurationCenter/configuration-callcenter/configuration-callcenter.component.ts

@@ -33,9 +33,9 @@ export class ConfigurationCallcenterComponent implements OnInit {
33 33
   submitMessageForm(): void {
34 34
     this.btnLoading = true;
35 35
     let postData:any = {
36
-      hosId: this.currentHospital.id,
37 36
       workdayClassId: this.dataInfo.workdayClassId,
38 37
       holidayClassId: this.dataInfo.holidayClassId,
38
+      socketUrl: this.dataInfo.socketUrl,
39 39
     };
40 40
     postData = { ...this.dataInfo, ...postData };
41 41
     this.mainService
@@ -80,9 +80,7 @@ export class ConfigurationCallcenterComponent implements OnInit {
80 80
     let data = {
81 81
       idx: 0,
82 82
       sum: 9999,
83
-      callCenterConfig: {
84
-        hosId: this.currentHospital.id,
85
-      },
83
+      callCenterConfig: {},
86 84
     };
87 85
     this.loading1 = true;
88 86
     this.mainService

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

@@ -169,7 +169,7 @@ export class ConfigurationCategoryComponent implements OnInit {
169 169
       group2: {
170 170
         groupName: keyword,
171 171
         hospitals: this.validateConfigForm.value.dutyId,
172
-        type: 1,
172
+        type: 3,
173 173
       },
174 174
       idx: 0,
175 175
       sum: 10,
@@ -653,7 +653,7 @@ export class ConfigurationCategoryComponent implements OnInit {
653 653
           userGroup: this.validateConfigForm.value.userGroup,
654 654
           groupId: this.validateConfigForm.value.groupId || undefined,
655 655
           userId: this.validateConfigForm.value.userGroup === 1 ? this.validateConfigForm.value.userId : undefined,
656
-          hosId: this.currentHospital.id,
656
+          hosId: this.hospitalConfig === 1 ? this.currentHospital.id  : this.validateConfigForm.value.hosId,
657 657
         }
658 658
       };
659 659
     } else {

+ 2 - 2
src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component.html

@@ -41,8 +41,8 @@
41 41
                     </nz-input-group>
42 42
                   </nz-form-control>
43 43
                 </nz-form-item>
44
-                <i class="icon_transport transport-tag27fuben ml8" (click)="addField(i)"></i>
45
-                <i class="icon_transport transport-shanchu1 ml8" *ngIf="dictionaryList.length > 1 && !data.system" (click)="removeField(data, i)"></i>
44
+                <i class="icon_transport transport-tag27fuben ml8" (click)="addField(i)" *ngIf="!(activeDictionaryKey.key === 'incident_status' || activeDictionaryKey.key === 'incident_degree')"></i>
45
+                <i class="icon_transport transport-shanchu1 ml8" *ngIf="dictionaryList.length > 1 && !data.system && !(activeDictionaryKey.key === 'incident_status' || activeDictionaryKey.key === 'incident_degree')" (click)="removeField(data, i)"></i>
46 46
               </div>
47 47
             </div>
48 48
           </form>

+ 12 - 13
src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component.ts

@@ -1,4 +1,4 @@
1
-import { Component, OnInit, ViewChild } from "@angular/core";
1
+import { Component, OnInit, ViewChild, Input } from "@angular/core";
2 2
 import { ActivatedRoute } from "@angular/router";
3 3
 import { MainService } from "../../../services/main.service";
4 4
 import { Validators, FormGroup, FormBuilder, FormControl } from '@angular/forms';
@@ -33,23 +33,16 @@ export class ConfigurationDictionaryComponent implements OnInit {
33 33
   osComponentRef2: OverlayScrollbarsComponent;
34 34
 
35 35
   ngOnInit() {
36
-    this.initDictionaryForm();
36
+    this.activeDictionaryKey = this.dictionaryKeyList[0];
37 37
     this.getDictionaryList();
38
+    this.initDictionaryForm();
38 39
   }
39 40
 
40 41
   // 数据字典key列表
41
-  dictionaryKeyList: any[] = [
42
-    { id: 1, name: '积分配置', key: "incident_category_score"},
43
-    { id: 2, name: '事件来源', key: "incident_source"},
44
-    { id: 3, name: '处理结果', key: "incident_closecode"},
45
-    { id: 4, name: '处理方式', key: "incident_handle_type"},
46
-    { id: 5, name: '状态', key: "incident_status"},
47
-    { id: 6, name: '维修记录', key: "repair_type"},
48
-    { id: 7, name: '满意度评价', key: "incident_degree"},
49
-  ];
42
+  @Input() dictionaryKeyList: any[] = [];
50 43
 
51 44
   // 点击数据字典key
52
-  activeDictionaryKey:any = this.dictionaryKeyList[0];
45
+  activeDictionaryKey:any;
53 46
   clickDictionaryKey(item){
54 47
     this.activeDictionaryKey = item;
55 48
     this.getDictionaryList();
@@ -107,6 +100,7 @@ export class ConfigurationDictionaryComponent implements OnInit {
107 100
           this.btnLoading = false;
108 101
           this.delModal = false;
109 102
           if (data.status == 200) {
103
+            this.mainService.clearDictionary();
110 104
             this.showPromptModal(this.tipsMsg2, true, "");
111 105
           } else {
112 106
             this.showPromptModal(this.tipsMsg2, false, data.msg);
@@ -171,7 +165,11 @@ export class ConfigurationDictionaryComponent implements OnInit {
171 165
       this.dictionaryList.forEach((obj, i) => {
172 166
         for (const key in obj) {
173 167
           if(key !== 'id' && key !== 'system'){
174
-            this.validateDictionaryForm.addControl(key + '_' + obj.id, new FormControl({value: obj[key], disabled: key === 'value' ? obj.system : false}, [Validators.required]))
168
+            if(this.activeDictionaryKey.key === 'incident_status' || this.activeDictionaryKey.key === 'incident_degree'){
169
+              this.validateDictionaryForm.addControl(key + '_' + obj.id, new FormControl({value: obj[key], disabled: true}, [Validators.required]))
170
+            }else{
171
+              this.validateDictionaryForm.addControl(key + '_' + obj.id, new FormControl({value: obj[key], disabled: key === 'value' ? obj.system : false}, [Validators.required]))
172
+            }
175 173
           }
176 174
         }
177 175
       })
@@ -247,6 +245,7 @@ export class ConfigurationDictionaryComponent implements OnInit {
247 245
       .subscribe((result) => {
248 246
         this.btnLoading = false;
249 247
         if (result.status == 200) {
248
+          this.mainService.clearDictionary();
250 249
           this.showPromptModal('保存', true, '');
251 250
         } else {
252 251
           this.showPromptModal('保存', false, result.msg || '');

+ 20 - 0
src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.module.ts

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

+ 5 - 4
src/app/components/incidentManagement/incident-detail/incident-detail.component.html

@@ -35,8 +35,8 @@
35 35
             </div>
36 36
             <div class="row">
37 37
               <div class="col">来电电话:{{incidentData.incomingPhone}}</div>
38
-              <div class="col"><audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID"><source [src]="audioSrc"></audio></div>
39
-              <div class="col">关联资产:{{incidentData.assetDTO?.name}}</div>
38
+              <div class="col"><audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID && audioSrc"><source [src]="audioSrc" type="audio/wav"></audio></div>
39
+              <div class="col"><ng-container *ngIf="incidentData.assetDTO">关联资产:{{incidentData.assetDTO?.name}}</ng-container></div>
40 40
             </div>
41 41
             <div class="row">
42 42
               <div class="col">报修科室:{{incidentData.department?.dept}}</div>
@@ -59,8 +59,9 @@
59 59
               <div class="col">解决方案:{{incidentData.handleDescription}}</div>
60 60
             </div>
61 61
             <div class="row">
62
-              <div class="col">是否生成知识库:{{incidentData.transSolution == 1 ? '是' : '否'}}</div>
63
-              <div class="col flex2">是否引用知识库:{{incidentData.solutionNo ? '是' : '否'}}</div>
62
+              <div class="col">是否生成知识库:{{incidentData.solutionCode ? '是' : '否'}}</div>
63
+              <div class="col">生成知识库编号:{{incidentData.solutionCode}}</div>
64
+              <div class="col">是否引用知识库:{{incidentData.solutionNo ? '是' : '否'}}</div>
64 65
             </div>
65 66
             <div class="row">
66 67
               <div class="col thumbs">

+ 19 - 16
src/app/components/incidentManagement/incident-detail/incident-detail.component.ts

@@ -59,7 +59,7 @@ export class IncidentDetailComponent implements OnInit {
59 59
     this.activeTabValue = item.value;
60 60
 
61 61
     if(this.activeTabValue == 1){
62
-      this.incidentData.callID && this.getCallrecord();
62
+      this.incidentData.callID && this.getCallLog();
63 63
       this.incidentData.reqAttachment && this.getRepairImgs();
64 64
     }else if(this.activeTabValue == 2){
65 65
       this.getHandleImgs();
@@ -173,19 +173,29 @@ export class IncidentDetailComponent implements OnInit {
173 173
 
174 174
   // 获取通话音频
175 175
   audioSrc =  '';//音频
176
-  getCallrecord() {
176
+  getCallLog() {
177 177
     let postData = {
178 178
       idx: 0,
179 179
       sum: 1,
180
-      callrecord: {callAccept: this.incidentData.callID},
180
+      callLog: {callAccept: this.incidentData.callID},
181 181
     };
182 182
     this.mainService
183
-      .getFetchDataList('simple/data', 'callrecord', postData)
183
+      .getFetchDataList('simple/data', 'callLog', postData)
184 184
       .subscribe((result) => {
185 185
         if(result.status == 200){
186 186
           result.list = result.list || [];
187 187
           if(result.list.length){
188
-            this.audioSrc = location.origin + result.list[0].recordingFileName;
188
+            if(result.list[0].path){
189
+              this.mainService.getCallLogPath({ path: result.list[0].path, hosId: result.list[0].hosId }).subscribe((result) => {
190
+                if (result["state"] == 200) {
191
+                  this.audioSrc = location.origin + result["relativePath"];
192
+                }else{
193
+                  this.audioSrc = '';
194
+                }
195
+              });
196
+            }else{
197
+              this.audioSrc = '';
198
+            }
189 199
           }else{
190 200
             this.audioSrc = '';
191 201
           }
@@ -228,11 +238,6 @@ export class IncidentDetailComponent implements OnInit {
228 238
     return this.incidentData.synergetic && this.incidentData.synergetic.length ? this.incidentData.synergetic.map(v => v.name).join(',') : '';
229 239
   }
230 240
 
231
-  // 是否进入汇总单
232
-  isInSummaryOrder(){
233
-    return this.incidentData.duty && this.itsmSummarySheet.value == 1 && (this.incidentData.handlingPersonnelUser.id == this.tool.getCurrentUserId());
234
-  }
235
-
236 241
   // 获取院区配置信息
237 242
   itsmSummarySheet:any = {};//是否需要填写汇总单
238 243
   getHospitalConfig() {
@@ -250,12 +255,10 @@ export class IncidentDetailComponent implements OnInit {
250 255
         let list = result.list || [];
251 256
         this.itsmSummarySheet = list.find(v => v.key == 'itsmSummarySheet') || {};
252 257
         console.log(this.itsmSummarySheet)
253
-        if(this.isInSummaryOrder()){
254
-          // 维修汇总单
255
-          if(this.incidentData.state.value == 'close' && this.incidentData.summaryId){
256
-            let flag = this.tabs.some(v => v.value === 4);
257
-            !flag && this.tabs.splice(2, 0, {name: '汇总单', value: 4});
258
-          }
258
+        // 维修汇总单
259
+        if(this.incidentData.state.value == 'close' && this.itsmSummarySheet.value == 1 && this.incidentData.summaryId){
260
+          let flag = this.tabs.some(v => v.value === 4);
261
+          !flag && this.tabs.splice(2, 0, {name: '汇总单', value: 4});
259 262
         }
260 263
       });
261 264
   }

+ 36 - 0
src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.html

@@ -0,0 +1,36 @@
1
+<div class="save display_flex justify-content_flex-center align-items_center add">
2
+  <div class="modalBody">
3
+    <div class="title">直接解决<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <form nz-form [formGroup]="validateForm" class="addForm">
6
+        <nz-form-item [hidden]="itsmSimpleHandle.value == 1">
7
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="handleDescription">解决方案</nz-form-label>
8
+          <nz-form-control [nzSpan]="18" nzErrorTip="请填写解决方案!">
9
+            <textarea nz-input rows="4" placeholder="请填写解决方案" formControlName="handleDescription"></textarea>
10
+          </nz-form-control>
11
+        </nz-form-item>
12
+        <nz-form-item>
13
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="closecode">处理结果</nz-form-label>
14
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择处理结果!">
15
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="closecode" nzShowSearch
16
+              nzPlaceHolder="请选择处理结果" nzServerSearch>
17
+              <ng-container *ngFor="let data of closecodeList">
18
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
19
+              </ng-container>
20
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
21
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
22
+              </nz-option>
23
+            </nz-select>
24
+          </nz-form-control>
25
+        </nz-form-item>
26
+      </form>
27
+    </div>
28
+    <div class="display_flex justify-content_flex-center">
29
+      <button nz-button nzType="primary" (click)="submitForm()"[nzLoading]="isLoading">确认</button>
30
+      <button nz-button nzType="default" class="btn cancel" (click)="hideModal()">取消</button>
31
+    </div>
32
+  </div>
33
+</div>
34
+
35
+<!-- 遮罩 -->
36
+<app-mask *ngIf="maskFlag"></app-mask>

+ 125 - 0
src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.less

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

+ 120 - 0
src/app/components/incidentManagement/incident-direct-order/incident-direct-order.component.ts

@@ -0,0 +1,120 @@
1
+import { Component, OnInit, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+import { MainService } from '../../../services/main.service';
3
+import { Router, ActivatedRoute } from '@angular/router';
4
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+import { ToolService } from 'src/app/services/tool.service';
7
+import { FormGroup, Validators, FormBuilder, FormControl } from '@angular/forms';
8
+
9
+@Component({
10
+  selector: 'app-incident-direct-order',
11
+  templateUrl: './incident-direct-order.component.html',
12
+  styleUrls: ['./incident-direct-order.component.less']
13
+})
14
+export class IncidentDicrectOrderComponent implements OnInit {
15
+  @ViewChild("osComponentRef1", {
16
+    read: OverlayScrollbarsComponent,
17
+    static: false,
18
+  })
19
+  osComponentRef1: OverlayScrollbarsComponent;
20
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
21
+  @Output() confirmModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
22
+
23
+  @Input() id: any;
24
+
25
+  constructor(
26
+    private mainService: MainService,
27
+    private router: Router,
28
+    private route: ActivatedRoute,
29
+    private message: NzMessageService,
30
+    private tool: ToolService,
31
+    private fb: FormBuilder,
32
+  ) { }
33
+
34
+  isLoading = false;
35
+  hosId:any;
36
+
37
+  ngOnInit() {
38
+    this.hosId = this.tool.getCurrentHospital().id;
39
+    this.initForm();
40
+    this.getClosecodes();
41
+    this.getHospitalConfig();
42
+  }
43
+
44
+  // 初始化新增form表单
45
+  validateForm: FormGroup; //新增/编辑表单
46
+  initForm() {
47
+    this.validateForm = this.fb.group({
48
+      handleDescription: [null],//解决方案
49
+      closecode: [null, [Validators.required]],//处理结果
50
+    });
51
+    console.log(this.validateForm.controls)
52
+  }
53
+
54
+  requiredChange(name:string, required: boolean): void {
55
+    if (!required) {
56
+      this.validateForm.get(name)!.clearValidators();
57
+      this.validateForm.get(name)!.markAsPristine();
58
+    } else {
59
+      this.validateForm.get(name)!.setValidators(Validators.required);
60
+      this.validateForm.get(name)!.markAsDirty();
61
+    }
62
+    this.validateForm.get(name)!.updateValueAndValidity();
63
+  }
64
+
65
+  // 获取处理结果列表
66
+  closecodeList:any[] = [];
67
+  getClosecodes(){
68
+    this.mainService.getDictionary("list", "incident_closecode").subscribe((data) => {
69
+      this.closecodeList = data || [];
70
+    });
71
+  }
72
+
73
+  // 获取院区配置信息
74
+  itsmSimpleHandle:any = {};//是否简单处理
75
+  getHospitalConfig() {
76
+    let postData = {
77
+      idx: 0,
78
+      sum: 9999,
79
+      hospitalConfig: {
80
+        model: "itsm",
81
+        hosId: this.hosId,
82
+      },
83
+    }
84
+    this.mainService
85
+      .getFetchDataList("simple/data", "hospitalConfig", postData)
86
+      .subscribe((result) => {
87
+        let list = result.list || [];
88
+        this.itsmSimpleHandle = list.find(v => v.key == 'itsmSimpleHandle') || {};
89
+        if(this.itsmSimpleHandle.value != 1){
90
+          this.requiredChange('handleDescription', true);
91
+        }
92
+      });
93
+  }
94
+
95
+  // 关闭弹窗
96
+  hideModal() {
97
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
98
+  }
99
+
100
+  // 表单提交
101
+  maskFlag:any = false;
102
+  submitForm(): void {
103
+    for (const i in this.validateForm.controls) {
104
+      this.validateForm.controls[i].markAsDirty();
105
+      this.validateForm.controls[i].updateValueAndValidity();
106
+    }
107
+    if (this.validateForm.invalid) {
108
+      return;
109
+    }
110
+
111
+    this.confirmModelHs.emit({
112
+      handleDescription: this.validateForm.value.handleDescription,
113
+      closecode: this.validateForm.value.closecode,
114
+    });//emits(向上弹射)事件
115
+  }
116
+}
117
+
118
+
119
+
120
+

+ 20 - 0
src/app/components/incidentManagement/incident-direct-order/incident-direct-order.module.ts

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

+ 2 - 2
src/app/components/incidentManagement/incident-handle-info-simple/incident-handle-info-simple.component.html

@@ -27,12 +27,12 @@
27 27
     </div>
28 28
   </div>
29 29
 
30
-  <div class="formItem">
30
+  <div class="formItem" *ngIf="itsmIncidentAsset.value == 1">
31 31
     <div class="name"><i class="icon_transport transport-required red" style="visibility: hidden;"></i>关联资产:</div>
32 32
     <div class="value w100">
33 33
       <nz-select class="w100" [(ngModel)]="incidentDataCopy.assetId" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
34 34
         (nzOnSearch)="changeInp('assetId', $event)" nzAllowClear  nzPlaceHolder="请选择关联资产">
35
-          <ng-container *ngFor="let option of assetProducList">
35
+          <ng-container *ngFor="let option of assetList">
36 36
             <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
37 37
           </ng-container>
38 38
           <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>

+ 42 - 8
src/app/components/incidentManagement/incident-handle-info-simple/incident-handle-info-simple.component.ts

@@ -36,7 +36,7 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
36 36
       if(v[0] === 'synergetic'){
37 37
         this.getSynergeticList(v[1]);
38 38
       }else if(v[0] === 'assetId'){
39
-        this.getAssetProductList(v[1]);
39
+        this.getAssetList(v[1]);
40 40
       }
41 41
     });
42 42
     this.init();
@@ -47,9 +47,11 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
47 47
     this.hosId = this.tool.getCurrentHospital().id;
48 48
     this.incidentDataCopy = cloneDeep(this.incidentData);
49 49
     this.incidentDataCopy.synergetic = [];
50
+    this.getHospitalConfig();
50 51
     this.getHandleCategorys();
52
+    this.getClosecodes();
51 53
     this.getSynergeticList();
52
-    this.getAssetProductList();
54
+    this.getAssetList();
53 55
   }
54 56
 
55 57
   // 边输边搜节流阀
@@ -76,6 +78,19 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
76 78
     });
77 79
   }
78 80
 
81
+  // 获取处理结果列表
82
+  closecodeList:any[] = [];
83
+  getClosecodes(){
84
+    this.mainService.getDictionary("list", "incident_closecode").subscribe((data) => {
85
+      this.closecodeList = data || [];
86
+      console.log(this.incidentDataCopy)
87
+      if(!this.incidentDataCopy.closecode){
88
+        let closecode = this.closecodeList.find(v => v.value == '1');
89
+        this.incidentDataCopy.closecode = closecode ? closecode.id : undefined;
90
+      }
91
+    });
92
+  }
93
+
79 94
   // 获取协同人员
80 95
   hosId:any;
81 96
   isLoading = false;
@@ -83,7 +98,7 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
83 98
   getSynergeticList(keyword = '') {
84 99
     let postData = {
85 100
       user: {
86
-        hospital: { id: this.hosId },
101
+        hospital: { id: this.incidentDataCopy.duty.id },
87 102
         name: keyword,
88 103
         simpleQuery: true,
89 104
         roleCodes: 'first-line support',
@@ -100,11 +115,30 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
100 115
       });
101 116
   }
102 117
 
118
+  // 获取院区配置信息
119
+  itsmIncidentAsset:any = {};//是否事件关联资产
120
+  getHospitalConfig() {
121
+    let postData = {
122
+      idx: 0,
123
+      sum: 9999,
124
+      hospitalConfig: {
125
+        model: "itsm",
126
+        hosId: this.hosId,
127
+      },
128
+    }
129
+    this.mainService
130
+      .getFetchDataList("simple/data", "hospitalConfig", postData)
131
+      .subscribe((result) => {
132
+        let list = result.list || [];
133
+        this.itsmIncidentAsset = list.find(v => v.key == 'itsmIncidentAsset') || {};
134
+      });
135
+  }
136
+
103 137
   // 获取资产列表
104
-  assetProducList: any = [];
105
-  getAssetProductList(keyword = '') {
138
+  assetList: any = [];
139
+  getAssetList(keyword = '') {
106 140
     let postData = {
107
-      assetProduct: {
141
+      asset: {
108 142
         hosId: this.hosId,
109 143
         name: keyword,
110 144
       },
@@ -112,9 +146,9 @@ export class IncidentHandleInfoSimpleComponent implements OnInit {
112 146
       sum: 20,
113 147
     };
114 148
     this.mainService
115
-      .getFetchDataList("simple/data", "assetProduct", postData)
149
+      .getFetchDataList("simple/data", "asset", postData)
116 150
       .subscribe((data) => {
117
-        this.assetProducList = data.list;
151
+        this.assetList = data.list;
118 152
       });
119 153
   }
120 154
 

+ 2 - 2
src/app/components/incidentManagement/incident-handle-info/incident-handle-info.component.html

@@ -68,12 +68,12 @@
68 68
     </div>
69 69
   </div>
70 70
 
71
-  <div class="formItem">
71
+  <div class="formItem" *ngIf="itsmIncidentAsset.value == 1">
72 72
     <div class="name"><i class="icon_transport transport-required red" style="visibility: hidden;"></i>关联资产:</div>
73 73
     <div class="value w100">
74 74
       <nz-select class="w100" [(ngModel)]="incidentDataCopy.assetId" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
75 75
         (nzOnSearch)="changeInp('assetId', $event)" nzAllowClear  nzPlaceHolder="请选择关联资产">
76
-          <ng-container *ngFor="let option of assetProducList">
76
+          <ng-container *ngFor="let option of assetList">
77 77
             <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
78 78
           </ng-container>
79 79
           <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>

+ 28 - 8
src/app/components/incidentManagement/incident-handle-info/incident-handle-info.component.ts

@@ -45,7 +45,7 @@ export class IncidentHandleInfoComponent implements OnInit, OnChanges {
45 45
       if(v[0] === 'synergetic'){
46 46
         this.getSynergeticList(v[1]);
47 47
       }else if(v[0] === 'assetId'){
48
-        this.getAssetProductList(v[1]);
48
+        this.getAssetList(v[1]);
49 49
       }else if(v[0] === 'category'){
50 50
         this.getIncidentCategoryList(v[1]);
51 51
       }
@@ -66,10 +66,11 @@ export class IncidentHandleInfoComponent implements OnInit, OnChanges {
66 66
       this.incidentDataCopy.transSolution = 0;
67 67
     }
68 68
     console.log('this.incidentDataCopy:', this.incidentDataCopy)
69
+    this.getHospitalConfig();
69 70
     this.getHandleCategorys();
70 71
     this.getClosecodes();
71 72
     this.getSynergeticList();
72
-    this.getAssetProductList();
73
+    this.getAssetList();
73 74
     this.getIncidentCategoryList();
74 75
   }
75 76
 
@@ -122,7 +123,7 @@ export class IncidentHandleInfoComponent implements OnInit, OnChanges {
122 123
   getSynergeticList(keyword = '') {
123 124
     let postData = {
124 125
       user: {
125
-        hospital: { id: this.hosId },
126
+        hospital: { id: this.incidentDataCopy.duty.id },
126 127
         name: keyword,
127 128
         simpleQuery: true,
128 129
         roleCodes: 'first-line support',
@@ -169,11 +170,30 @@ export class IncidentHandleInfoComponent implements OnInit, OnChanges {
169 170
     })
170 171
   }
171 172
 
173
+  // 获取院区配置信息
174
+  itsmIncidentAsset:any = {};//是否事件关联资产
175
+  getHospitalConfig() {
176
+    let postData = {
177
+      idx: 0,
178
+      sum: 9999,
179
+      hospitalConfig: {
180
+        model: "itsm",
181
+        hosId: this.hosId,
182
+      },
183
+    }
184
+    this.mainService
185
+      .getFetchDataList("simple/data", "hospitalConfig", postData)
186
+      .subscribe((result) => {
187
+        let list = result.list || [];
188
+        this.itsmIncidentAsset = list.find(v => v.key == 'itsmIncidentAsset') || {};
189
+      });
190
+  }
191
+
172 192
   // 获取资产列表
173
-  assetProducList: any = [];
174
-  getAssetProductList(keyword = '') {
193
+  assetList: any = [];
194
+  getAssetList(keyword = '') {
175 195
     let postData = {
176
-      assetProduct: {
196
+      asset: {
177 197
         hosId: this.hosId,
178 198
         name: keyword,
179 199
       },
@@ -181,9 +201,9 @@ export class IncidentHandleInfoComponent implements OnInit, OnChanges {
181 201
       sum: 20,
182 202
     };
183 203
     this.mainService
184
-      .getFetchDataList("simple/data", "assetProduct", postData)
204
+      .getFetchDataList("simple/data", "asset", postData)
185 205
       .subscribe((data) => {
186
-        this.assetProducList = data.list;
206
+        this.assetList = data.list;
187 207
       });
188 208
   }
189 209
 

+ 30 - 3
src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.ts

@@ -35,7 +35,7 @@ export class IncidentHandleOrderComponent implements OnInit {
35 35
     });
36 36
     this.hosId = this.tool.getCurrentHospital().id;
37 37
     this.getSummaryList();
38
-    this.getConsumableList();
38
+    this.getHospitalConfig();
39 39
     this.getWorkHourManagementList();
40 40
   }
41 41
 
@@ -143,18 +143,44 @@ export class IncidentHandleOrderComponent implements OnInit {
143 143
     this.changeInpSubject.next([model, e]);
144 144
   }
145 145
 
146
+  // 获取院区配置信息
147
+  itsmZeroStock:any = {};//是否支持零库存
148
+  itsmParentConsumable:any = {};//是否支持父级科室耗材
149
+  getHospitalConfig() {
150
+    let postData = {
151
+      idx: 0,
152
+      sum: 9999,
153
+      hospitalConfig: {
154
+        model: "itsm",
155
+        hosId: this.hosId,
156
+      },
157
+    }
158
+    this.mainService
159
+      .getFetchDataList("simple/data", "hospitalConfig", postData)
160
+      .subscribe((result) => {
161
+        let list = result.list || [];
162
+        this.itsmZeroStock = list.find(v => v.key == 'itsmZeroStock') || {};
163
+        this.itsmParentConsumable = list.find(v => v.key == 'itsmParentConsumable') || {};
164
+        this.getConsumableList();
165
+      });
166
+  }
167
+
146 168
   // 获取耗材
147 169
   consumableList: any = [];
148 170
   getConsumableList(keyword = '', isShowValue = false) {
149
-    let postData = {
171
+    let postData:any = {
150 172
       consumable: {
151 173
         name: keyword,
152
-        hosId: this.hosId,
153 174
         showZero: true,
154 175
       },
155 176
       idx: 0,
156 177
       sum: 20,
157 178
     };
179
+    if(this.itsmParentConsumable.value == 1){
180
+      postData.consumable.upHosId = this.hosId;
181
+		}else{
182
+      postData.consumable.hosId = this.hosId;
183
+		}
158 184
     this.mainService
159 185
       .getFetchDataList("simple/data", "consumable", postData)
160 186
       .subscribe((data) => {
@@ -276,6 +302,7 @@ export class IncidentHandleOrderComponent implements OnInit {
276 302
     let postData = {
277 303
       workHourManagement: {
278 304
         hosId: this.hosId,
305
+        showSecond: 1,
279 306
       },
280 307
       idx: 0,
281 308
       sum: 9999,

+ 2 - 2
src/app/components/incidentManagement/incident-handle-repair/incident-handle-repair.component.html

@@ -39,8 +39,8 @@
39 39
 <div class="detailItem">
40 40
   <div class="name">电话录音:</div>
41 41
   <div class="value">
42
-    <audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID">
43
-      <source [src]="audioSrc">
42
+    <audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID && audioSrc">
43
+      <source [src]="audioSrc" type="audio/wav">
44 44
     </audio>
45 45
   </div>
46 46
 </div>

+ 15 - 5
src/app/components/incidentManagement/incident-handle-repair/incident-handle-repair.component.ts

@@ -21,25 +21,35 @@ export class IncidentHandleRepairComponent implements OnInit {
21 21
 
22 22
   ngOnInit() {
23 23
     this.hosId = this.tool.getCurrentHospital().id;
24
-    this.incidentData.callID && this.getCallrecord();
24
+    this.incidentData.callID && this.getCallLog();
25 25
     this.incidentData.reqAttachment && this.getRepairImgs();
26 26
   }
27 27
 
28 28
   // 获取通话音频
29 29
   audioSrc =  '';//音频
30
-  getCallrecord() {
30
+  getCallLog() {
31 31
     let postData = {
32 32
       idx: 0,
33 33
       sum: 1,
34
-      callrecord: {callAccept: this.incidentData.callID},
34
+      callLog: {callAccept: this.incidentData.callID},
35 35
     };
36 36
     this.mainService
37
-      .getFetchDataList('simple/data', 'callrecord', postData)
37
+      .getFetchDataList('simple/data', 'callLog', postData)
38 38
       .subscribe((result) => {
39 39
         if(result.status == 200){
40 40
           result.list = result.list || [];
41 41
           if(result.list.length){
42
-            this.audioSrc = location.origin + result.list[0].recordingFileName;
42
+            if(result.list[0].path){
43
+              this.mainService.getCallLogPath({ path: result.list[0].path, hosId: result.list[0].hosId }).subscribe((result) => {
44
+                if (result["state"] == 200) {
45
+                  this.audioSrc = location.origin + result["relativePath"];
46
+                }else{
47
+                  this.audioSrc = '';
48
+                }
49
+              });
50
+            }else{
51
+              this.audioSrc = '';
52
+            }
43 53
           }else{
44 54
             this.audioSrc = '';
45 55
           }

+ 1 - 1
src/app/components/incidentManagement/incident-handle/incident-handle.component.html

@@ -1,6 +1,6 @@
1 1
 <div class="modal display_flex justify-content_flex-center align-items_center" *ngIf="incidentData">
2 2
   <div class="modalBody">
3
-    <div class="title">详细处理<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
3
+    <div class="title">{{itsmSimpleHandle.value == 1 ? '简单处理' : '详细处理'}}<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4 4
     <div class="content">
5 5
       <overlay-scrollbars #osComponentRef1 class="detail">
6 6
         <app-incident-handle-repair [incidentData]="incidentData"></app-incident-handle-repair>

+ 2 - 4
src/app/components/incidentManagement/incident-handle/incident-handle.component.less

@@ -114,10 +114,8 @@
114 114
         height: 100%;
115 115
         border-left: 1px solid #E9E9E9;
116 116
         .knowageItem{
117
-          padding: 16px 16px 0;
118
-          &:last-of-type{
119
-            padding-bottom: 16px;
120
-          }
117
+          padding: 16px;
118
+          border-bottom: 1px solid #E9E9E9;
121 119
         }
122 120
         .knowageTitle{
123 121
           font-size: 16px;

+ 3 - 2
src/app/components/incidentManagement/incident-handle/incident-handle.component.ts

@@ -133,7 +133,7 @@ export class IncidentHandleComponent implements OnInit {
133 133
       let solutionStatusList = data[0] || [];
134 134
       let solutionTypeList = data[1] || [];
135 135
 
136
-      this.solutionStatus = solutionStatusList.find(item => item.value == 2);
136
+      this.solutionStatus = solutionStatusList.find(item => item.value == 3);
137 137
       	console.log('this.solutionStatus:', this.solutionStatus)
138 138
       this.solutionType = solutionTypeList.find(item => item.value == 1);
139 139
       	console.log('this.solutionType:', this.solutionType)
@@ -159,7 +159,7 @@ export class IncidentHandleComponent implements OnInit {
159 159
       idx: 0,
160 160
       sum: 9999,
161 161
       solution: {
162
-        category: categoryId,
162
+        categoryId,
163 163
 				status: this.solutionStatus,
164 164
 				type: this.solutionType,
165 165
       },
@@ -321,6 +321,7 @@ export class IncidentHandleComponent implements OnInit {
321 321
         incident: {
322 322
           ...incidentDataCopy,
323 323
           handleCategory: incidentDataCopy.handleCategory ? { id: incidentDataCopy.handleCategory }: undefined,
324
+          closecode: incidentDataCopy.closecode ? { id: incidentDataCopy.closecode }: undefined,
324 325
           synergetic: incidentDataCopy.synergetic.length ? incidentDataCopy.synergetic.map(v => ({id: v})): undefined,
325 326
         },
326 327
       }

+ 14 - 0
src/app/components/incidentManagement/incident-recording/incident-recording.component.html

@@ -0,0 +1,14 @@
1
+<div class="save display_flex justify-content_flex-center align-items_center add">
2
+  <div class="modalBody">
3
+    <div class="title">回放录音<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
4
+    </div>
5
+    <div class="content audio">
6
+      <audio controls style="outline: none;">
7
+        <source [src]="audioPath" type="audio/wav">
8
+      </audio>
9
+    </div>
10
+    <div class=" display_flex justify-content_flex-center">
11
+      <button class="btn cancel" nz-button nzType="default" (click)="hideModal()">知道了</button>
12
+    </div>
13
+  </div>
14
+</div>

+ 173 - 0
src/app/components/incidentManagement/incident-recording/incident-recording.component.less

@@ -0,0 +1,173 @@
1
+@import "../../../../../src/theme.less";
2
+.save {
3
+  position: fixed;
4
+  left: 0;
5
+  top: 0;
6
+  width: 100%;
7
+  height: 100%;
8
+  background: rgba(0, 0, 0, 0.4);
9
+  z-index: 999;
10
+
11
+  .modalBody {
12
+    width: 350px;
13
+    height: 220px;
14
+    background: #fff;
15
+    border-radius: 5px;
16
+    padding: 10px 20px;
17
+    color: #333;
18
+
19
+    .title {
20
+      width: 100%;
21
+      text-align: center;
22
+      font-size: 18px;
23
+      position: relative;
24
+
25
+      i {
26
+        position: absolute;
27
+        right: 0;
28
+        top: 0;
29
+        font-size: 20px;
30
+        color: #666;
31
+        cursor: pointer;
32
+        padding: 0 5px;
33
+      }
34
+    }
35
+
36
+    .content {
37
+      width: 310px;
38
+      height: 117px;
39
+      background: #f9fafb;
40
+      border: 1px solid #e5e9ed;
41
+      border-radius: 5px;
42
+      overflow: hidden;
43
+      margin-top: 12px;
44
+
45
+      & > div {
46
+        text-align: center;
47
+        margin: 0;
48
+
49
+        &.icon {
50
+          margin-top: 17px;
51
+
52
+          i {
53
+            color: #34b349;
54
+            font-size: 30px !important;
55
+
56
+            &.transport-wenhao {
57
+              color: #f5a523;
58
+            }
59
+
60
+            &.transport-shibai {
61
+              color: #ff3a52;
62
+            }
63
+          }
64
+        }
65
+
66
+        &.defeat {
67
+          color: #333;
68
+          font-size: 18px;
69
+        }
70
+
71
+        &:nth-child(3) {
72
+          font-size: 14px;
73
+          color: #666;
74
+        }
75
+      }
76
+      .roundRobinTips {
77
+        font-size: 12px;
78
+      }
79
+    }
80
+
81
+    button {
82
+      margin-top: 10px;
83
+
84
+      &.btn {
85
+        margin-left: 8px;
86
+      }
87
+    }
88
+  }
89
+
90
+  // 新增
91
+  &.add {
92
+    .modalBody {
93
+      width: 480px;
94
+      height: auto;
95
+
96
+      .content {
97
+        width: 100%;
98
+        height: auto;
99
+        padding: 18px 14px 0 14px;
100
+        max-height: 497px;
101
+        overflow-y: auto;
102
+        &.audio {
103
+          padding: 0;
104
+          height: 126px;
105
+          display: flex;
106
+          justify-content: center;
107
+          align-items: center;
108
+        }
109
+
110
+        .addForm {
111
+          .ant-form-item {
112
+            margin-bottom: 15px;
113
+
114
+            .ant-form-item-label {
115
+              line-height: 14px;
116
+              text-align: left;
117
+            }
118
+
119
+            .desc {
120
+              margin-top: 5px;
121
+            }
122
+          }
123
+
124
+          .datesControl {
125
+            margin-top: -16px;
126
+
127
+            .ant-form-item-label {
128
+              line-height: 40px;
129
+            }
130
+          }
131
+
132
+          .timer {
133
+            .ant-form-item-label {
134
+              width: 100%;
135
+              text-align: left;
136
+            }
137
+
138
+            .numInp {
139
+              margin-right: 5px;
140
+            }
141
+
142
+            .line {
143
+              margin-right: 5px;
144
+            }
145
+          }
146
+
147
+          .timer2 {
148
+            .ant-form-item-label {
149
+              line-height: 20px;
150
+            }
151
+          }
152
+        }
153
+
154
+        .editForm {
155
+          .ant-form-item {
156
+            margin-bottom: 15px;
157
+
158
+            .ant-form-item-label {
159
+              line-height: 14px;
160
+              text-align: left;
161
+            }
162
+          }
163
+        }
164
+      }
165
+
166
+      button {
167
+        &:nth-child(1) {
168
+          margin-right: 20px;
169
+        }
170
+      }
171
+    }
172
+  }
173
+}

+ 29 - 0
src/app/components/incidentManagement/incident-recording/incident-recording.component.ts

@@ -0,0 +1,29 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+
3
+@Component({
4
+  selector: 'app-incident-recording',
5
+  templateUrl: './incident-recording.component.html',
6
+  styleUrls: ['./incident-recording.component.less']
7
+})
8
+export class IncidentRecordingComponent implements OnInit {
9
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
10
+
11
+  @Input() path: any;
12
+
13
+  constructor() { }
14
+
15
+  audioPath = ""; //录音文件地址
16
+
17
+  ngOnInit() {
18
+    this.audioPath = location.origin + this.path;
19
+  }
20
+
21
+  // 关闭弹窗
22
+  hideModal() {
23
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
24
+  }
25
+}
26
+
27
+
28
+
29
+

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

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

+ 22 - 0
src/app/components/incidentManagement/incident-reject/incident-reject.component.html

@@ -0,0 +1,22 @@
1
+<div class="save display_flex justify-content_flex-center align-items_center add">
2
+  <div class="modalBody">
3
+    <div class="title">不受理<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <form nz-form [formGroup]="validateForm" class="addForm">
6
+        <nz-form-item>
7
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="rejectRemark">不受理原因</nz-form-label>
8
+          <nz-form-control [nzSpan]="18" nzErrorTip="请填写不受理原因!">
9
+            <textarea rows="4" nz-input formControlName="rejectRemark" placeholder="请填写不受理原因"></textarea>
10
+          </nz-form-control>
11
+        </nz-form-item>
12
+      </form>
13
+    </div>
14
+    <div class="display_flex justify-content_flex-center">
15
+      <button nz-button nzType="primary" (click)="submitForm()"[nzLoading]="isLoading">确认</button>
16
+      <button nz-button nzType="default" class="btn cancel" (click)="hideModal()">取消</button>
17
+    </div>
18
+  </div>
19
+</div>
20
+
21
+<!-- 遮罩 -->
22
+<app-mask *ngIf="maskFlag"></app-mask>

+ 125 - 0
src/app/components/incidentManagement/incident-reject/incident-reject.component.less

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

+ 65 - 0
src/app/components/incidentManagement/incident-reject/incident-reject.component.ts

@@ -0,0 +1,65 @@
1
+import { Component, OnInit, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+import { MainService } from '../../../services/main.service';
3
+import { Router, ActivatedRoute } from '@angular/router';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { ToolService } from 'src/app/services/tool.service';
6
+import { FormGroup, Validators, FormBuilder } from '@angular/forms';
7
+
8
+@Component({
9
+  selector: 'app-incident-reject',
10
+  templateUrl: './incident-reject.component.html',
11
+  styleUrls: ['./incident-reject.component.less']
12
+})
13
+export class IncidentRejectComponent implements OnInit {
14
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
15
+  @Output() confirmModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
16
+
17
+  @Input() id: any;
18
+
19
+  constructor(
20
+    private mainService: MainService,
21
+    private router: Router,
22
+    private route: ActivatedRoute,
23
+    private message: NzMessageService,
24
+    private tool: ToolService,
25
+    private fb: FormBuilder,
26
+  ) { }
27
+
28
+  isLoading = false;
29
+
30
+  ngOnInit() {
31
+    this.initForm();
32
+  }
33
+
34
+  // 初始化新增form表单
35
+  validateForm: FormGroup; //新增/编辑表单
36
+  initForm() {
37
+    this.validateForm = this.fb.group({
38
+      rejectRemark: [null, [Validators.required]],//不受理原因
39
+    });
40
+    console.log(this.validateForm.controls)
41
+  }
42
+
43
+  // 关闭弹窗
44
+  hideModal() {
45
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
46
+  }
47
+
48
+  // 表单提交
49
+  maskFlag:any = false;
50
+  submitForm(): void {
51
+    for (const i in this.validateForm.controls) {
52
+      this.validateForm.controls[i].markAsDirty();
53
+      this.validateForm.controls[i].updateValueAndValidity();
54
+    }
55
+    if (this.validateForm.invalid) {
56
+      return;
57
+    }
58
+
59
+    this.confirmModelHs.emit(this.validateForm.value.rejectRemark);
60
+  }
61
+}
62
+
63
+
64
+
65
+

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

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

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

@@ -0,0 +1,77 @@
1
+<div class="modal display_flex align-items_center">
2
+  <div class="modalBody">
3
+    <div class="title">通话记录<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <div class="list-template w100" style="padding: 16px;">
6
+        <div class="list-template__content">
7
+          <div class="list-template__top" nz-row style="padding: 0;">
8
+            <div nz-col nzXl='18' class="list-template__searchBox">
9
+              <div class="list-template__searchItem">
10
+                <span class="label">主叫号码:</span>
11
+                <input nz-input class="formItem" placeholder="请输入主叫号码" [(ngModel)]="searchDTO.dTMFA" />
12
+              </div>
13
+              <div class="list-template__searchItem">
14
+                <span class="label">被叫号码:</span>
15
+                <input nz-input class="formItem" placeholder="请输入被叫号码" [(ngModel)]="searchDTO.dTMFB" />
16
+              </div>
17
+              <div class="list-template__searchItem">
18
+                <span class="label">开始时间:</span>
19
+                <nz-date-picker class="formItem" [ngModel]="searchDTO.responseTime" (ngModelChange)="searchDTO.responseTime = $event" nzShowTime></nz-date-picker>
20
+              </div>
21
+            </div>
22
+            <div nz-col nzXl='6' class="list-template__btns">
23
+              <button nz-button class="btn default ml8 mt0" (click)='search()'>搜索</button>
24
+              <button nz-button class="btn default ml8 mt0" (click)='reset()'>重置</button>
25
+            </div>
26
+          </div>
27
+        </div>
28
+      </div>
29
+      <div class="tableWrap">
30
+        <nz-table class="hospitalTable" [nzData]="messageList" nzSize="small" [nzShowPagination]="false" [nzLoading]="loading">
31
+          <thead>
32
+            <tr class="thead">
33
+              <th nzWidth="12.5%">主叫号码</th>
34
+              <th nzWidth="12.5%">被叫号码</th>
35
+              <th nzWidth="12.5%">开始时间</th>
36
+              <th nzWidth="12.5%">结束时间</th>
37
+              <th nzWidth="12.5%">通话时长</th>
38
+              <th nzWidth="12.5%">已接/未接</th>
39
+              <th nzWidth="12.5%">呼入/呼出</th>
40
+              <th nzWidth="12.5%">操作</th>
41
+            </tr>
42
+          </thead>
43
+          <tbody>
44
+            <tr *ngFor="let data of messageList;let i = index;">
45
+              <td>{{ data.dTMFA }}</td>
46
+              <td>{{ data.dTMFB }}</td>
47
+              <td>{{ data.responseTime}}</td>
48
+              <td>{{ data.overTime}}</td>
49
+              <td *ngIf="data.longTime!==undefined">{{data.longTime}}秒</td>
50
+              <td *ngIf="data.longTime===undefined"></td>
51
+              <td>{{data.callState == 1?'已接':'未接'}}</td>
52
+              <td>{{data.callType == 1?'呼入':(data.callType == 0?'呼出':'')}}</td>
53
+              <td>
54
+                <div class="coop">
55
+                  <span *ngIf="data.path" (click)="recordcall(data)">回放录音</span>
56
+                </div>
57
+              </td>
58
+            </tr>
59
+          </tbody>
60
+        </nz-table>
61
+        <div class="pagination">
62
+          <ng-template #totalTemplate let-total> 共 {{ total }} 条 </ng-template>
63
+          <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="total"
64
+            [(nzPageSize)]="pageSize" (nzPageIndexChange)="getList()"
65
+            (nzPageSizeChange)="getList()" [nzShowTotal]="totalTemplate">
66
+          </nz-pagination>
67
+        </div>
68
+      </div>
69
+    </div>
70
+  </div>
71
+</div>
72
+
73
+<!-- 回放录音模态框 -->
74
+<app-incident-recording [path]="coopData.relativePath" *ngIf="recordingModalShow" (closeModelHs)="closeRecordingModelOrder($event)"></app-incident-recording>
75
+
76
+<!-- 遮罩 -->
77
+<app-mask *ngIf="maskFlag"></app-mask>

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

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

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

@@ -0,0 +1,122 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { format, startOfDay, endOfDay } from 'date-fns';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { ToolService } from 'src/app/services/tool.service';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+@Component({
7
+  selector: 'app-incident-ser-call',
8
+  templateUrl: './incident-ser-call.component.html',
9
+  styleUrls: ['./incident-ser-call.component.less']
10
+})
11
+export class IncidentSerCallComponent implements OnInit {
12
+  // 切换科室,切换弹窗
13
+  loading = false;
14
+  messageList: any = [];// 通话记录列表
15
+  pageIndex: number = 1;//表格当前页码
16
+  pageSize: number = 10;//表格每页展示条数
17
+  total: number = 0;//表格总数据量
18
+
19
+  searchDTO: any = {};
20
+
21
+  @Input() itsmData:any;
22
+  @Input() hsmsData:any;
23
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
24
+
25
+  constructor(
26
+    private mainService: MainService,
27
+    private tool: ToolService,
28
+    private message: NzMessageService,
29
+  ) { }
30
+
31
+  ngOnInit() {
32
+    this.getMessageList(1);
33
+  }
34
+  // 关闭弹窗
35
+  hideModal() {
36
+    this.closeModelHs.emit({ show: false });//emits(向上弹射)事件
37
+  }
38
+
39
+  // 搜索
40
+  search() {
41
+    this.getMessageList(1);
42
+  }
43
+  // 重置
44
+  reset() {
45
+    this.searchDTO = {};
46
+    this.getMessageList(1);
47
+  }
48
+
49
+  // 回放录音
50
+  coopData:any = {};
51
+  recordingModalShow = false; //弹窗开关
52
+  maskFlag:any = false;
53
+  recordcall(data) {
54
+    this.maskFlag = this.message.loading("正在加载中..", {
55
+      nzDuration: 0,
56
+    }).messageId;
57
+    this.mainService.getCallLogPath({ path: data.path, hosId: data.hosId }).subscribe((result) => {
58
+      this.message.remove(this.maskFlag);
59
+      this.maskFlag = false;
60
+      if (result["state"] == 200) {
61
+        this.coopData = { relativePath: result["relativePath"] };
62
+        this.recordingModalShow = true;
63
+      }
64
+    });
65
+  }
66
+  // 关闭弹窗
67
+  closeRecordingModelOrder(e) {
68
+    this.recordingModalShow = JSON.parse(e).show;
69
+  }
70
+
71
+  // 分页获取数据
72
+  getList(){
73
+    this.getMessageList();
74
+  }
75
+
76
+  // 获取通话记录列表
77
+  getMessageList(idx?) {
78
+    if (idx) {
79
+      this.pageIndex = 1;
80
+    }
81
+    console.log(this.itsmData)
82
+    console.log(this.hsmsData)
83
+    let hosIds;
84
+    if(this.itsmData.mdv2Switch){
85
+      if(this.itsmData.allDuty == 1){
86
+        hosIds = undefined;
87
+      }else{
88
+        hosIds = this.itsmData.checkedHos.map(v => v.id).toString();
89
+      }
90
+    }
91
+    if(this.hsmsData.hsmsSwitch){
92
+      if(this.itsmData.mdv2Switch){
93
+        if(this.itsmData.allDuty == 1){
94
+          hosIds = undefined;
95
+        }else{
96
+          hosIds += ',' + this.hsmsData.checkedHos;
97
+        }
98
+      }else{
99
+        hosIds = this.hsmsData.checkedHos.toString();
100
+      }
101
+    }
102
+    let postData = {
103
+      idx: this.pageIndex - 1,
104
+      sum: this.pageSize,
105
+      callLog: {
106
+        hosIds,
107
+        dTMFA: this.searchDTO.dTMFA || undefined,
108
+        dTMFB: this.searchDTO.dTMFB || undefined,
109
+        responseTime: this.searchDTO.responseTime ? format(this.searchDTO.responseTime, 'yyyy-MM-dd HH:mm:ss') : undefined,
110
+      }
111
+    }
112
+    this.loading = true;
113
+    this.mainService.getFetchDataList('simple/data','callLog',postData).subscribe(data => {
114
+      this.loading = false;
115
+      this.messageList = data.list || [];
116
+      this.total = data.totalNum;
117
+    })
118
+  }
119
+}
120
+
121
+
122
+

+ 22 - 0
src/app/components/incidentManagement/incident-ser-call/incident-ser-call.module.ts

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

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

@@ -0,0 +1,73 @@
1
+<div class="modal display_flex align-items_center">
2
+  <div class="modalBody">
3
+    <div class="title">留言记录<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="content">
5
+      <div class="tabs">
6
+        <div class="tab" *ngFor="let item of tabs" (click)="clickTbab(item)" [ngClass]="{ active: activeTabValue === item.value }">{{ item.name }}</div>
7
+      </div>
8
+      <div class="list-template w100" style="padding: 16px;">
9
+        <div class="list-template__content">
10
+          <div class="list-template__top" nz-row style="padding: 0;">
11
+            <div nz-col nzXl='18' class="list-template__searchBox">
12
+              <div class="list-template__searchItem">
13
+                <span class="label">留言时间</span>:
14
+                <nz-range-picker style="width: 373px;" nzShowTime [(ngModel)]="searchDTO.dateRange" (nzOnCalendarChange)="onCalendarChangeDate($event)"></nz-range-picker>
15
+              </div>
16
+            </div>
17
+            <div nz-col nzXl='6' class="list-template__btns">
18
+              <button nz-button class="btn default ml8 mt0" (click)='search()'>搜索</button>
19
+              <button nz-button class="btn default ml8 mt0" (click)='reset()'>重置</button>
20
+            </div>
21
+          </div>
22
+        </div>
23
+      </div>
24
+      <div class="tableWrap">
25
+        <nz-table class="hospitalTable" [nzData]="messageList" nzSize="small" [nzShowPagination]="false" [nzLoading]="loading">
26
+          <thead>
27
+            <tr class="thead">
28
+              <th nzWidth="8%">序号</th>
29
+              <th nzWidth="23%">留言时间</th>
30
+              <th nzWidth="23%">来电号码</th>
31
+              <th nzWidth="23%">处理状态</th>
32
+              <th nzWidth="23%">操作</th>
33
+            </tr>
34
+          </thead>
35
+          <tbody>
36
+            <tr *ngFor="let data of messageList;let i = index;">
37
+              <td>{{ (pageIndex - 1) * pageSize + i + 1 }}</td>
38
+              <td>{{ data.recTime | date:'yyyy-MM-dd HH:mm' }}</td>
39
+              <td>{{ data.ano}}</td>
40
+              <td>{{ data.isExcute == 1 ? '已受理' : (data.isExcute == 2 ? '不受理' : '未受理') }}</td>
41
+              <td>
42
+                <div class="coop">
43
+                  <span *ngIf="data.isExcute === 0" (click)="createOrder(data)">生成工单</span>
44
+                  <span *ngIf="data.isExcute === 0 || data.isExcute === 1" (click)="recordcall(data)">回放录音</span>
45
+                  <span *ngIf="data.isExcute === 0" (click)="showDelModal(data, '确认不受理后,将无法转换为事件工单!', '不受理', 'notAccepted')">不受理</span>
46
+                  <span *ngIf="data.isExcute === 1" (click)="openItsmDetails(data.incidentDTO)">查看故障单</span>
47
+                </div>
48
+              </td>
49
+            </tr>
50
+          </tbody>
51
+        </nz-table>
52
+        <div class="pagination">
53
+          <ng-template #totalTemplate let-total> 共 {{ total }} 条 </ng-template>
54
+          <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="total"
55
+            [(nzPageSize)]="pageSize" (nzPageIndexChange)="getList()"
56
+            (nzPageSizeChange)="getList()" [nzShowTotal]="totalTemplate">
57
+          </nz-pagination>
58
+        </div>
59
+      </div>
60
+    </div>
61
+  </div>
62
+</div>
63
+
64
+<!-- 回放录音模态框 -->
65
+<app-incident-recording [path]="coopData.recFileName" *ngIf="recordingModalShow" (closeModelHs)="closeRecordingModelOrder($event)"></app-incident-recording>
66
+
67
+<!-- 操作成功/失败提示框 -->
68
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow" [info]="promptInfo"></app-prompt-modal>
69
+
70
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading" (confirmDelEvent)="confirmDelFn()" [content]="tipsMsg1"></app-dialog-delete>
71
+
72
+<!-- 详情 -->
73
+<app-incident-detail [id]="coopData.id" *ngIf="detailModalShow" (closeModelHs)="closeDetailModelOrder($event)" (confirmModelHs)="confirmDetailModelOrder($event)"></app-incident-detail>

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

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

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

@@ -0,0 +1,181 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { format, startOfDay, endOfDay } from 'date-fns';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { ToolService } from 'src/app/services/tool.service';
5
+@Component({
6
+  selector: 'app-incident-ser-message',
7
+  templateUrl: './incident-ser-message.component.html',
8
+  styleUrls: ['./incident-ser-message.component.less']
9
+})
10
+export class IncidentSerMessageComponent implements OnInit {
11
+  // 切换科室,切换弹窗
12
+  loading = false;
13
+  messageList: any = [];// 留言列表
14
+  pageIndex: number = 1;//表格当前页码
15
+  pageSize: number = 10;//表格每页展示条数
16
+  total: number = 0;//表格总数据量
17
+
18
+  tabs:any[] = [
19
+    {id: 1, name: '全部', value: '', num: ''},
20
+    {id: 2, name: '未受理', value: 0, num: ''},
21
+    {id: 3, name: '已受理', value: 1, num: ''},
22
+    {id: 4, name: '不受理', value: 2, num: ''},
23
+  ]
24
+
25
+  searchDTO: any = {};
26
+
27
+  @Input() itsmData:any;
28
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
29
+
30
+  constructor(private mainService: MainService, private tool: ToolService) { }
31
+
32
+  ngOnInit() {
33
+    this.clickTbab(this.tabs[1]);
34
+  }
35
+  // 关闭弹窗
36
+  hideModal() {
37
+    this.closeModelHs.emit({ show: false });//emits(向上弹射)事件
38
+  }
39
+
40
+  // 点击tab
41
+  activeTabValue:any;
42
+  clickTbab(item){
43
+    this.activeTabValue = item.value;
44
+    this.getMessageList(1);
45
+  }
46
+
47
+  onCalendarChangeDate(dateArr){
48
+    console.log(dateArr)
49
+    if(dateArr.length == 2){
50
+      let dateStart = new Date(dateArr[0]);
51
+      let dateEnd = new Date(dateArr[1]);
52
+      dateStart.setHours(0,0,0);
53
+      dateEnd.setHours(23,59,59);
54
+      this.searchDTO.dateRange = [dateStart,dateEnd];
55
+    }
56
+  }
57
+
58
+  // 搜索
59
+  search() {
60
+    this.getMessageList(1);
61
+  }
62
+  // 重置
63
+  reset() {
64
+    this.searchDTO = {};
65
+    this.getMessageList(1);
66
+  }
67
+
68
+  delModal: boolean = false; //删除模态框
69
+  tipsMsg1: string; //提示框信息
70
+  tipsMsg2: string; //操作后信息
71
+  confirmDelType: string; //确认的类型(启用/停用,删除)
72
+  coopData:any = {};
73
+  showDelModal(data, tipsMsg1: string, tipsMsg2: string, type: string) {
74
+    this.confirmDelType = type;
75
+    this.delModal = true;
76
+    this.coopData = data;
77
+    this.tipsMsg1 = tipsMsg1;
78
+    this.tipsMsg2 = tipsMsg2;
79
+  }
80
+  // 隐藏删除框
81
+  hideDelModal() {
82
+    this.delModal = false;
83
+  }
84
+  // 确认删除
85
+  btnLoading: boolean = false; //确认按钮loading状态
86
+  confirmDelFn() {
87
+    this.btnLoading = true;
88
+    if (this.confirmDelType === "notAccepted") {
89
+      //不受理
90
+      this.mainService
91
+        .simplePost("updData", "hjzxRecord", { ...this.coopData, item: undefined, isExcute: 2 })
92
+        .subscribe((data) => {
93
+          this.btnLoading = false;
94
+          this.delModal = false;
95
+          if (data.status == 200) {
96
+            this.showPromptModal(this.tipsMsg2, true, "");
97
+          } else {
98
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
99
+          }
100
+        });
101
+    }
102
+  }
103
+
104
+  // 生成工单
105
+  createOrder(data){
106
+    this.closeModelHs.emit({ show: false, data: data });
107
+  }
108
+
109
+  // 回放录音
110
+  recordingModalShow = false; //弹窗开关
111
+  recordcall(data) {
112
+    this.coopData = data;
113
+    this.recordingModalShow = true;
114
+  }
115
+  // 关闭弹窗
116
+  closeRecordingModelOrder(e) {
117
+    this.recordingModalShow = JSON.parse(e).show;
118
+  }
119
+
120
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
121
+  promptContent: string; //操作提示框提示信息
122
+  ifSuccess: boolean; //操作成功/失败
123
+  promptInfo: string; //操作结果提示信息
124
+  promptModalShow: boolean; //是否展示提示框
125
+  showPromptModal(con, success, promptInfo?) {
126
+    this.promptModalShow = false;
127
+    this.promptContent = con;
128
+    this.ifSuccess = success;
129
+    this.promptInfo = promptInfo;
130
+    setTimeout(() => {
131
+      this.promptModalShow = true;
132
+      this.getList();
133
+    }, 100);
134
+  }
135
+
136
+  // 分页获取数据
137
+  getList(){
138
+    this.getMessageList();
139
+  }
140
+
141
+  // 获取留言列表
142
+  getMessageList(idx?) {
143
+    if (idx) {
144
+      this.pageIndex = 1;
145
+    }
146
+    let postData = {
147
+      idx: this.pageIndex - 1,
148
+      sum: this.pageSize,
149
+      hjzxRecord: {
150
+        isExcute: this.activeTabValue === '' ? undefined : this.activeTabValue,
151
+        startTime: this.searchDTO.dateRange ? format(startOfDay(this.searchDTO.dateRange[0]), 'yyyy-MM-dd HH:mm:ss') : undefined,
152
+        endTime: this.searchDTO.dateRange ? format(endOfDay(this.searchDTO.dateRange[1]), 'yyyy-MM-dd HH:mm:ss') : undefined,
153
+      }
154
+    }
155
+    this.loading = true;
156
+    this.mainService.getFetchDataList('simple/data','hjzxRecord',postData).subscribe(data => {
157
+      this.loading = false;
158
+      this.messageList = data.list || [];
159
+      this.total = data.totalNum;
160
+    })
161
+  }
162
+
163
+  // 查看ITSM工单详情
164
+  detailModalShow = false; //弹窗开关
165
+  openItsmDetails(data) {
166
+    this.coopData = data;
167
+    this.detailModalShow = true;
168
+  }
169
+  // 关闭弹窗
170
+  closeDetailModelOrder(e) {
171
+    this.detailModalShow = JSON.parse(e).show;
172
+  }
173
+  // 弹窗确定
174
+  confirmDetailModelOrder(e){
175
+    console.log(e);
176
+    this.detailModalShow = false;
177
+  }
178
+}
179
+
180
+
181
+

+ 24 - 0
src/app/components/incidentManagement/incident-ser-message/incident-ser-message.module.ts

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

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

@@ -0,0 +1,36 @@
1
+<div class="modal display_flex align-items_center">
2
+  <div class="modalBody">
3
+    <div class="title">待回访<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <overlay-scrollbars #osComponentRef1 class="content">
5
+      <nz-spin nzSimple [nzSpinning]="loading" class="mt8 text_align_center"></nz-spin>
6
+      <ng-container *ngIf="!loading">
7
+        <div class="items" *ngFor="let item of visitList">
8
+          <div class="row">
9
+            <div class="col"><span [ngClass]="priorityColor(item.priorityId)">{{item.priorityDTO?.name}}</span> {{item.incidentsign}}</div>
10
+            <div class="col">{{item.hosName}} {{item.department?.dept}}</div>
11
+          </div>
12
+          <div class="row">
13
+            <div class="col">故障描述:{{item.description}}</div>
14
+          </div>
15
+          <div class="row">
16
+            <div class="col">详细地址:{{ item.place ? item.place.building.buildingName : '' }}{{ item.place ? item.place.floorName : '' }}{{ item.houseNumber }} <span [innerHTML]="item.overtimeRemark"></span></div>
17
+          </div>
18
+          <div class="row">
19
+            <div class="col">申请时间:{{ item.startDate | date: 'yyyy-MM-dd HH:mm'}}</div>
20
+            <div class="col">处理人:{{computedHandlerUser(item)}}</div>
21
+            <div class="col btns">
22
+              <input type="button" class="mid_bot mr8" value="回访" (click)="visit(item)" />
23
+              <input type="button" class="btm_bot" value="查看" (click)="openItsmDetails(item)" />
24
+            </div>
25
+          </div>
26
+        </div>
27
+      </ng-container>
28
+    </overlay-scrollbars>
29
+  </div>
30
+</div>
31
+
32
+<!-- 详情 -->
33
+<app-incident-detail [id]="coopData.id" *ngIf="detailModalShow" (closeModelHs)="closeDetailModelOrder($event)" (confirmModelHs)="confirmDetailModelOrder($event)"></app-incident-detail>
34
+
35
+<!-- 回访 -->
36
+<app-incident-visit [id]="coopData.id" *ngIf="visitModalShow" (closeModelHs)="closeVisitModelOrder($event)" (confirmModelHs)="confirmVisitModelOrder($event)"></app-incident-visit>

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

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

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

@@ -0,0 +1,143 @@
1
+import { Component, OnInit, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
5
+import cloneDeep from 'lodash-es/cloneDeep'
6
+import { format, addHours, addDays } from 'date-fns';
7
+@Component({
8
+  selector: 'app-incident-ser-visit',
9
+  templateUrl: './incident-ser-visit.component.html',
10
+  styleUrls: ['./incident-ser-visit.component.less']
11
+})
12
+export class IncidentSerVisitComponent implements OnInit {
13
+  @ViewChild("osComponentRef1", {
14
+    read: OverlayScrollbarsComponent,
15
+    static: false,
16
+  })
17
+  osComponentRef1: OverlayScrollbarsComponent;
18
+  // 切换科室,切换弹窗
19
+  loading = false;
20
+  visitList: any = [];// 列表
21
+  pageIndex: number = 1;//表格当前页码
22
+  pageSize: number = 10;//表格每页展示条数
23
+  total: number = 0;//表格总数据量
24
+
25
+  @Input() itsmData:any;
26
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
27
+
28
+  constructor(private mainService: MainService, private tool: ToolService) { }
29
+
30
+  ngOnInit() {
31
+    this.getVisitList();
32
+  }
33
+  // 关闭弹窗
34
+  hideModal() {
35
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
36
+  }
37
+
38
+  // 优先级颜色
39
+  priorityColor(priorityId) {
40
+    // 极低|低
41
+    if(priorityId == 1 || priorityId == 2){
42
+      return '';
43
+    } else if(priorityId == 3){
44
+      return 'yellow';
45
+    } else if(priorityId == 4 || priorityId == 5){
46
+      return 'red';
47
+    }
48
+  }
49
+
50
+  // 处理人
51
+  computedHandlerUser(item){
52
+    if(item.state.value == 'pending' && item.currentLog){
53
+      return item.currentLog.workerName;
54
+    }
55
+    if(item.state.value != 'pending' && item.handlingPersonnelUser){
56
+      return item.handlingPersonnelUser.name;
57
+    }
58
+  }
59
+
60
+  // 查看ITSM工单详情
61
+  detailModalShow = false; //弹窗开关
62
+  coopData:any = {};
63
+  openItsmDetails(data) {
64
+    this.coopData = data;
65
+    this.detailModalShow = true;
66
+  }
67
+  // 关闭弹窗
68
+  closeDetailModelOrder(e) {
69
+    this.detailModalShow = JSON.parse(e).show;
70
+  }
71
+  // 弹窗确定
72
+  confirmDetailModelOrder(e){
73
+    console.log(e);
74
+    this.detailModalShow = false;
75
+  }
76
+
77
+  // 回访-弹窗
78
+  visitModalShow = false; //弹窗开关
79
+  visit(data) {
80
+    this.coopData = data;
81
+    this.visitModalShow = true;
82
+  }
83
+  // 关闭弹窗
84
+  closeVisitModelOrder(e) {
85
+    this.visitModalShow = JSON.parse(e).show;
86
+  }
87
+  // 弹窗确定
88
+  confirmVisitModelOrder(e){
89
+    console.log(e);
90
+    this.visitModalShow = false;
91
+    this.getList();
92
+  }
93
+
94
+  // 分页获取数据
95
+  getList(){
96
+    this.getVisitList();
97
+  }
98
+
99
+  // 延期记录
100
+  transferHandlerLog = function (currentLog) {
101
+    if(!currentLog){
102
+        return '';
103
+    }
104
+    currentLog = cloneDeep(currentLog);
105
+    if(currentLog.extra1DTO && currentLog.extra2 && currentLog.startTime){
106
+        if(currentLog.extra2==0.5){
107
+          currentLog.extra2 = 4;
108
+          return currentLog.extra1DTO.name+" "+ format(addHours(currentLog.startTime, +currentLog.extra2), "MM月dd日") + format(addHours(currentLog.startTime, +currentLog.extra2), "HH时mm分前完成");
109
+        }else{
110
+          return currentLog.extra1DTO.name+" "+ format(addDays(currentLog.startTime, +currentLog.extra2), "MM月dd日前完成");
111
+        }
112
+    }else{
113
+        return '';
114
+    }
115
+  }
116
+
117
+  // 获取回访列表
118
+  getVisitList(){
119
+    this.loading = true;
120
+    let postData: any = {
121
+      idx: 0,
122
+      sum: 9999,
123
+      incident: {
124
+        // "groupIds": this.itsmData.allDuty == 1 ? undefined : (this.itsmData.scopeGroups.map(v => v.id).toString() || undefined),
125
+        "dutyIds": this.itsmData.allDuty == 1 ? undefined : (this.itsmData.checkedHos.map(v => v.id).toString() || undefined),
126
+        "urgentType": +this.itsmData.orderScopeRadio + 1,
127
+        "queryTask": "callback",
128
+        "assignee": this.tool.getCurrentUserId(),
129
+        "deleteFlag": 0,
130
+      },
131
+    };
132
+
133
+    this.mainService
134
+      .getFetchDataList("simple/data", "incident", postData)
135
+      .subscribe((result) => {
136
+        this.loading = false;
137
+        this.visitList = result.list.map(v => ({...v, endDeptsName: v.endDepts ? v.endDepts.map(v => v.dept).toString() : ''}));
138
+      });
139
+  }
140
+}
141
+
142
+
143
+

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

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

+ 16 - 1
src/app/components/incidentManagement/incident-substitutio-assign/incident-substitution-assign.component.ts

@@ -28,6 +28,7 @@ export class IncidentSubstitutionAssignComponent implements OnInit {
28 28
         this.getGroups(v[1]);
29 29
       }
30 30
     });
31
+
31 32
     this.initForm();
32 33
     this.getHospitals(1);
33 34
   }
@@ -43,6 +44,20 @@ export class IncidentSubstitutionAssignComponent implements OnInit {
43 44
       groupId: [null, [Validators.required]],//组
44 45
     });
45 46
     console.log(this.validateForm.controls)
47
+
48
+    // 默认回显当前人的院区和责任部门
49
+    let { hospital, type } = this.tool.getHospitalOrDuty();
50
+    if(type === 'duty'){
51
+      // 是责任部门
52
+      this.changeHospital(hospital.parent.id);
53
+      this.validateForm.controls.hosId.setValue(hospital.parent.id);
54
+      this.validateForm.controls.dutyId.setValue(hospital.id);
55
+      this.changeDuty(hospital.id);
56
+    }else{
57
+      // 不是责任部门
58
+      this.changeHospital(hospital.id);
59
+      this.validateForm.controls.hosId.setValue(hospital.id);
60
+    }
46 61
   }
47 62
 
48 63
   // 修改院区
@@ -171,7 +186,7 @@ export class IncidentSubstitutionAssignComponent implements OnInit {
171 186
       group2: {
172 187
         groupName: keyword,
173 188
         hospitals: this.validateForm.value.dutyId,
174
-        type: 1,
189
+        type: 3,
175 190
       },
176 191
       idx: 0,
177 192
       sum: 10,

+ 1 - 1
src/app/components/incidentManagement/incident-substitutio-redeploy/incident-substitution-redeploy.component.ts

@@ -117,7 +117,7 @@ export class IncidentSubstitutionRedeployComponent implements OnInit {
117 117
       group2: {
118 118
         groupName: keyword,
119 119
         hospitals: this.duty.id,
120
-        type: 1,
120
+        type: 3,
121 121
       },
122 122
       idx: 0,
123 123
       sum: 10,

+ 1 - 1
src/app/components/incidentManagement/incident-substitution/incident-substitution.component.less

@@ -12,7 +12,7 @@
12 12
   width: 100%;
13 13
   height: 100%;
14 14
   background: rgba(0, 0, 0, 0.4);
15
-  z-index: 8;
15
+  z-index: 18;
16 16
   .ji {
17 17
     position: absolute;
18 18
     right: 0px;

+ 1 - 1
src/app/components/knowledge-look/knowledge-look.component.less

@@ -128,7 +128,7 @@
128 128
 					z-index:9999;
129 129
 				}
130 130
 			.view-box{
131
-				height: 400px;
131
+				height: 628px;
132 132
 				display: flex;
133 133
 				border: 1px solid #eee;
134 134
 				.left-box{

+ 3 - 3
src/app/components/knowledge-look/knowledge-look.component.ts

@@ -41,7 +41,7 @@ export class KnowledgeLookComponent implements OnInit {
41 41
 			idx: 0,
42 42
 			sum: 9999,
43 43
 			solution: {
44
-				hosId: this.hosId,
44
+				// hosId: data.hosId,
45 45
 				operationType:'lookOver',
46 46
 				solutionNumber:data.solutionNumber
47 47
 			}
@@ -53,7 +53,7 @@ export class KnowledgeLookComponent implements OnInit {
53 53
 				this.getFile()
54 54
 				let data = res.list
55 55
 				this.detailData = data
56
-				let content = data[0].content
56
+				let content = data.length ? data[0].content : ''
57 57
 				if(content){
58 58
 					this.richText = this.sanitizer.bypassSecurityTrustHtml(content);
59 59
 				}else{
@@ -67,7 +67,7 @@ export class KnowledgeLookComponent implements OnInit {
67 67
 					}
68 68
 				}
69 69
 				this.lookData = data[0]
70
-				this.solutionLogs = data[0].solutionLogs
70
+				this.solutionLogs = data.length ? data[0].solutionLogs : []
71 71
 				this.stepLength = this.solutionLogs.length
72 72
 				this.isSpinning = false
73 73
 			});

+ 103 - 0
src/app/components/order-scope/order-scope.component.html

@@ -0,0 +1,103 @@
1
+<!-- 工单范围 -->
2
+<div class="init recallOrder display_flex justify-content_flex-center align-items_center">
3
+  <div class="con modalBody">
4
+    <div class="title">
5
+      工单范围<i class="icon_transport transport-guanbi" (click)="cancelInit()"></i>
6
+    </div>
7
+    <div class="content">
8
+      <div class="scopeTab">
9
+        <div class="scopeTabItem" [ngClass]="{ active: item.value == activeScopeTab.value }" *ngFor="let item of scopeTabs" (click)="activeScopeTab = item">
10
+          <label nz-checkbox [(ngModel)]="item.checked">{{item.name}}</label>
11
+        </div>
12
+      </div>
13
+      <!-- 运维 -->
14
+      <div class="conditions" *ngIf="activeScopeTab.value == 1">
15
+        <div nz-row>
16
+          <div nz-col nzSpan="4">是否不限制部门:</div>
17
+          <div nz-col nzSpan="20">
18
+            <nz-radio-group class="w100" [(ngModel)]="allDuty" (ngModelChange)="changeAllDuty($event)" [nzDisabled]="!activeScopeTab.checked">
19
+              <label nz-radio [nzValue]="1">是</label>
20
+              <label nz-radio [nzValue]="0">否</label>
21
+            </nz-radio-group>
22
+          </div>
23
+        </div>
24
+        <div nz-row>
25
+          <div nz-col nzSpan="3" [ngClass]="{ required: allDuty === 0 }">运维部门:</div>
26
+          <div nz-col nzSpan="21">
27
+            <nz-checkbox-group *ngIf="allDuty === 0" class="w100" style="display: flex; flex-wrap: wrap; gap:8px;" [nzDisabled]="!activeScopeTab.checked" [(ngModel)]="itsmCheckedHos" (ngModelChange)="changeItsmHospital($event)"></nz-checkbox-group>
28
+          </div>
29
+        </div>
30
+        <div nz-row>
31
+          <div nz-col nzSpan="3">运维分组:</div>
32
+          <div nz-col nzSpan="21">
33
+            <label class="checkAll mb8" nz-checkbox *ngIf="itsmCheckedGroup.length" [nzDisabled]="!activeScopeTab.checked" [(ngModel)]="isAllItsmGroupChecked" (ngModelChange)="updateAllItsmGroupChecked()">
34
+              全选
35
+            </label>
36
+            <nz-checkbox-group class="w100" style="display: flex; flex-wrap: wrap; gap:8px;" [nzDisabled]="!activeScopeTab.checked" [(ngModel)]="itsmCheckedGroup" (ngModelChange)="changeItsmGroup($event)"></nz-checkbox-group>
37
+          </div>
38
+        </div>
39
+        <div nz-row>
40
+          <div nz-col nzSpan="3">工单范围:</div>
41
+          <div nz-col nzSpan="21">
42
+            <nz-radio-group class="w100" [(ngModel)]="itsmOrderScopeRadio" [nzDisabled]="!activeScopeTab.checked">
43
+              <label nz-radio nzValue="0">全工单</label>
44
+              <label nz-radio nzValue="1">急单</label>
45
+              <label nz-radio nzValue="2">急单以及超时工单</label>
46
+            </nz-radio-group>
47
+          </div>
48
+        </div>
49
+      </div>
50
+      <!-- 配送 -->
51
+      <div class="conditions" *ngIf="activeScopeTab.value == 2">
52
+        <div nz-row>
53
+          <div nz-col nzSpan="3" class="required">院区:</div>
54
+          <div nz-col nzSpan="21">
55
+            <nz-radio-group class="w100" style="display: flex; flex-wrap: wrap; gap:8px;" [(ngModel)]="checkedHos" [nzDisabled]="!activeScopeTab.checked" (ngModelChange)="changeCheckedHos($event)">
56
+              <label *ngFor="let data of hosList" nz-radio [nzValue]="data.id">{{ data.hosName }}</label>
57
+            </nz-radio-group>
58
+          </div>
59
+        </div>
60
+        <div nz-row>
61
+          <div nz-col nzSpan="3">工单类型:</div>
62
+          <div nz-col nzSpan="21" *ngIf="hosTaskTypes && checkedHos && hosTaskTypes['hos' + checkedHos]">
63
+            <label class="checkAll mb8" nz-checkbox *ngIf="hosTaskTypes['hos' + checkedHos].length" [nzDisabled]="!activeScopeTab.checked" [(ngModel)]="allTypeChecked" (ngModelChange)="updateAllTypeChecked()">
64
+              全选
65
+            </label>
66
+            <nz-checkbox-wrapper class="w100" style="display: flex; flex-wrap: wrap; gap:8px;" (nzOnChange)="changeTaskTypes($event)">
67
+              <label nz-checkbox [nzDisabled]="!activeScopeTab.checked" [nzValue]="data.id" [ngModel]="initTypes[data.id]" *ngFor="let data of hosTaskTypes['hos' + checkedHos]">{{ data.taskName }}</label>
68
+            </nz-checkbox-wrapper>
69
+          </div>
70
+        </div>
71
+        <div nz-row>
72
+          <div nz-col nzSpan="3">人员分组:</div>
73
+          <div nz-col nzSpan="21" *ngIf="hosGroups && checkedHos && hosGroups['hos' + checkedHos]">
74
+            <label class="checkAll mb8" [nzDisabled]="!activeScopeTab.checked" nz-checkbox *ngIf="hosGroups['hos' + checkedHos].length" [(ngModel)]="allGroupChecked" (ngModelChange)="updateAllGroupChecked()">
75
+              全选
76
+            </label>
77
+            <nz-checkbox-wrapper class="w100" style="display: flex; flex-wrap: wrap; gap:8px;" (nzOnChange)="changeGroups($event)">
78
+              <label nz-checkbox [nzDisabled]="!activeScopeTab.checked" [nzValue]="data.id" [ngModel]="initGroups[data.id]" *ngFor="let data of hosGroups['hos' + checkedHos]">{{ data.groupName }}</label>
79
+            </nz-checkbox-wrapper>
80
+          </div>
81
+        </div>
82
+        <div nz-row>
83
+          <div nz-col nzSpan="3">工单范围:</div>
84
+          <div nz-col nzSpan="21">
85
+            <nz-radio-group class="w100" [nzDisabled]="!activeScopeTab.checked" [(ngModel)]="orderScopeRadio">
86
+              <label nz-radio nzValue="0">全工单</label>
87
+              <label nz-radio nzValue="1">急单</label>
88
+              <label nz-radio nzValue="2">急单以及超时工单</label>
89
+            </nz-radio-group>
90
+          </div>
91
+        </div>
92
+      </div>
93
+    </div>
94
+    <div class="btns display_flex justify-content_flex-center">
95
+      <button class="btn" nz-button nzType="primary" [nzLoading]="saveLoading" (click)="saveOrderScope()">
96
+        保存
97
+      </button>
98
+      <button class="btn cancel" nz-button nzType="default" (click)="cancelInit()">
99
+        知道了
100
+      </button>
101
+    </div>
102
+  </div>
103
+</div>

+ 184 - 0
src/app/components/order-scope/order-scope.component.less

@@ -0,0 +1,184 @@
1
+@import "../../../../src/theme.less";
2
+:host {
3
+  ::ng-deep .ant-checkbox-wrapper + .ant-checkbox-wrapper{
4
+    margin-left: 0!important;
5
+  }
6
+  .required{
7
+    position: relative;
8
+    &::before{
9
+      font-family: icon_transport;
10
+      font-size: 10px;
11
+      content:'\e606';
12
+      color: red;
13
+      position: absolute;
14
+      right: 100%;
15
+      top: 50%;
16
+      transform: translateY(-50%);
17
+      margin-right: 2px;
18
+    }
19
+  }
20
+  // 撤回工单
21
+  .recallOrder {
22
+    position: fixed;
23
+    left: 0;
24
+    top: 0;
25
+    width: 100%;
26
+    height: 100%;
27
+    background: rgba(0, 0, 0, 0.4);
28
+    z-index: 9999999;
29
+
30
+    .modalBody {
31
+      width: 350px;
32
+      height: 220px;
33
+      background: #fff;
34
+      border-radius: 5px;
35
+      padding: 10px 20px;
36
+      color: #333;
37
+
38
+      .title {
39
+        width: 100%;
40
+        text-align: center;
41
+        font-size: 18px;
42
+        position: relative;
43
+
44
+        i {
45
+          position: absolute;
46
+          right: 0;
47
+          top: 0;
48
+          font-size: 20px;
49
+          color: #666;
50
+          cursor: pointer;
51
+          padding: 0 5px;
52
+        }
53
+      }
54
+
55
+      .content {
56
+        width: 310px;
57
+        height: 117px;
58
+        background: #f9fafb;
59
+        border: 1px solid #e5e9ed;
60
+        border-radius: 5px;
61
+        overflow: hidden;
62
+        margin-top: 12px;
63
+
64
+        div {
65
+          text-align: center;
66
+          margin: 0;
67
+
68
+          &.icon {
69
+            margin-top: 17px;
70
+
71
+            i {
72
+              color: #ff3b53;
73
+              font-size: 30px !important;
74
+
75
+              &.transport-wenhao {
76
+                color: #f5a523;
77
+              }
78
+            }
79
+          }
80
+
81
+          &.defeat {
82
+            color: #333;
83
+            font-size: 18px;
84
+          }
85
+
86
+          &:nth-child(3) {
87
+            font-size: 14px;
88
+            color: #666;
89
+          }
90
+        }
91
+
92
+        .conditions {
93
+          height: 400px;
94
+          overflow: auto;
95
+          padding: 16px 20px;
96
+
97
+          div {
98
+            text-align: left;
99
+            margin-bottom: 8px;
100
+          }
101
+        }
102
+      }
103
+
104
+      .btns {
105
+        button {
106
+          margin-top: 10px;
107
+          margin-left: 5px;
108
+        }
109
+
110
+        .recDelBtn {
111
+          width: 115px;
112
+        }
113
+      }
114
+    }
115
+  }
116
+
117
+  // 初始化设置
118
+  .init {
119
+    position: fixed;
120
+    left: 0;
121
+    top: 0;
122
+    width: 100%;
123
+    height: 100%;
124
+    background: rgba(0, 0, 0, 0.4);
125
+    z-index: 99;
126
+
127
+    .con {
128
+      width: 832px;
129
+      height: auto;
130
+      background: #fff;
131
+      border-radius: 5px;
132
+      padding: 10px 20px;
133
+      color: #333;
134
+
135
+      .content {
136
+        width: 100%;
137
+        height: auto;
138
+
139
+        .scopeTab{
140
+          display: flex;
141
+          height: 60px;
142
+          border-bottom: 1px solid #D9D9D9;
143
+          .scopeTabItem{
144
+            flex: 1;
145
+            display: flex;
146
+            justify-content: center;
147
+            align-items: center;
148
+            border-right: 1px solid #D9D9D9;
149
+            background-color: #fff;
150
+            cursor: pointer;
151
+            &:last-of-type{
152
+              border-right: none;
153
+            }
154
+            &.active{
155
+              background-color: #F0F6ED;
156
+            }
157
+          }
158
+        }
159
+
160
+        .remin {
161
+          font-size: 14px;
162
+          color: #666;
163
+          line-height: 48px;
164
+          border-bottom: 1px solid #e5e9ed;
165
+        }
166
+
167
+        .boxes {
168
+          color: #333;
169
+          padding: 8px 12px;
170
+
171
+          & > div:nth-child(1) {
172
+            color: #333;
173
+            text-align: left;
174
+          }
175
+
176
+          & > div:nth-child(2) {
177
+            color: #666;
178
+            text-align: left;
179
+          }
180
+        }
181
+      }
182
+    }
183
+  }
184
+}

+ 433 - 0
src/app/components/order-scope/order-scope.component.ts

@@ -0,0 +1,433 @@
1
+import { Component, OnInit, Output, Input } from '@angular/core';
2
+import { EventEmitter } from '@angular/core';
3
+import { MainService } from 'src/app/services/main.service';
4
+import { ToolService } from 'src/app/services/tool.service';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+
7
+@Component({
8
+  selector: 'app-order-scope',
9
+  templateUrl: './order-scope.component.html',
10
+  styleUrls: ['./order-scope.component.less']
11
+})
12
+export class OrderScopeComponent implements OnInit {
13
+  @Input() hsmsData:any = {
14
+    checkedHos: undefined,
15
+    scopeGroups: [],
16
+    orderScopeRadio: undefined,
17
+  }
18
+  @Input() itsmData:any = {
19
+    checkedHos: undefined,
20
+    scopeGroups: [],
21
+    orderScopeRadio: undefined,
22
+  }
23
+  @Output() confirmModal = new EventEmitter();
24
+  @Output() cancelModal = new EventEmitter();
25
+  constructor(
26
+    private mainService: MainService,
27
+    private tool: ToolService,
28
+    private message: NzMessageService,
29
+  ) { }
30
+
31
+  user = JSON.parse(localStorage.getItem("user")); //用户信息
32
+  checkedHos;//转运-院区
33
+  orderScopeRadio:any = '0';//转运-工单范围
34
+
35
+  itsmCheckedHos:any[] = [];//运维-院区
36
+  itsmCheckedGroup:any[] = [];//运维-分组
37
+  itsmOrderScopeRadio:any = '0';//运维-工单范围
38
+  isAllItsmGroupChecked:boolean = false;//运维-是否全选分组
39
+
40
+  ngOnInit() {
41
+    this.initHsms();
42
+    this.initItsm();
43
+  }
44
+
45
+  initHsms(){
46
+    console.log('hsmsData:', this.hsmsData);
47
+    let index = this.scopeTabs.findIndex(v => v.value === 2);
48
+    this.scopeTabs[index].checked = this.hsmsData.hsmsSwitch;
49
+    this.checkedHos = this.hsmsData.checkedHos;
50
+    this.orderScopeRadio = this.hsmsData.orderScopeRadio;
51
+    this.initOrderScope();
52
+    this.getOrderScope();
53
+  }
54
+
55
+  initItsm(){
56
+    console.log('itsmData', this.itsmData);
57
+    let index = this.scopeTabs.findIndex(v => v.value === 1);
58
+    this.scopeTabs[index].checked = this.itsmData.mdv2Switch;
59
+    this.itsmOrderScopeRadio = this.itsmData.orderScopeRadio;
60
+    this.itsmInitOrderScope();
61
+    this.itsmGetOrderScope();
62
+  }
63
+
64
+    // 工单范选项卡
65
+    scopeTabs:any[] = [
66
+      { name: '运维', value: 1, checked: false },
67
+      { name: '配送', value: 2, checked: false },
68
+    ];
69
+    activeScopeTab = this.scopeTabs[0];
70
+    //#region 工单范围-运维start
71
+    allDuty:number = 1;
72
+    itsmInitOrderScope(){
73
+
74
+    }
75
+    // 工单范围数据
76
+    itsmGetOrderScope() {
77
+      // 是否不限制部门
78
+      this.allDuty = this.itsmData.allDuty === undefined ? 1 : this.itsmData.allDuty;
79
+      // 权限内的院区和组
80
+      let hosList = this.user.infoPermission.dutyList || [];
81
+      let groups = this.user.infoPermission.dutyGroupList || [];
82
+
83
+      // 选中的院区和组
84
+      let itsmCheckedHos = this.itsmData.checkedHos || [];
85
+      let itsmCheckedGroup = this.itsmData.scopeGroups || [];
86
+
87
+      let hosIds = itsmCheckedHos.map(v => v.id);
88
+      let groupIds = itsmCheckedGroup.map(v => v.id);
89
+
90
+      this.itsmCheckedHos = hosList.map(v => ({ label: v.hosName, value: v.id, checked: hosIds.includes(v.id) }));
91
+      this.itsmCheckedGroup = groups.filter(v => hosIds.includes(v.hospital.id)).map(v => ({ label: v.hospital.hosName + '-' + v.groupName, value: v.id, checked: groupIds.includes(v.id) }));
92
+      this.isAllItsmGroupChecked = this.itsmCheckedGroup.length ? this.itsmCheckedGroup.every(v => v.checked) : false;
93
+    }
94
+
95
+    // 全选、全不选分组
96
+    updateAllItsmGroupChecked(){
97
+      this.itsmCheckedGroup.forEach(v => v.checked = this.isAllItsmGroupChecked);
98
+    }
99
+    // 选择分组
100
+    changeItsmGroup(e){
101
+      this.isAllItsmGroupChecked = this.itsmCheckedGroup.length ? this.itsmCheckedGroup.every(v => v.checked) : false;
102
+    }
103
+    // 选择院区
104
+    changeItsmHospital(hospitalList){
105
+      console.log('hospitalList:', hospitalList)
106
+      // 权限内的院区和组
107
+      let groups = this.user.infoPermission.dutyGroupList || [];
108
+
109
+      // 选中的院区和组
110
+      let itsmCheckedHos = this.itsmCheckedHos || [];
111
+      let itsmCheckedGroup = this.itsmCheckedGroup || [];
112
+
113
+      let hosIds = itsmCheckedHos.filter(v => v.checked).map(v => v.value);
114
+      let groupIds = itsmCheckedGroup.filter(v => v.checked).map(v => v.value);
115
+
116
+      this.itsmCheckedGroup = groups.filter(v => hosIds.includes(v.hospital.id)).map(v => ({ label: v.hospital.hosName + '-' + v.groupName, value: v.id, checked: groupIds.includes(v.id) }));
117
+      console.log('this.itsmCheckedGroup:', this.itsmCheckedGroup)
118
+      this.isAllItsmGroupChecked = this.itsmCheckedGroup.length ? this.itsmCheckedGroup.every(v => v.checked) : false;
119
+    }
120
+    //#endregion 工单范围-运维end
121
+
122
+    //#region 工单范围-配送start
123
+    // 工单范围数据
124
+    hosList = []; //院区
125
+    taskTypes = []; //当前权限下所有工单类型
126
+    userGroups = []; //当前权限下所有人员分组
127
+    hosTaskTypes = {}; //当前权限下所有院区对应的任务类型
128
+    hosGroups = {}; //当前权限下所有院区对应的人员分组
129
+    getOrderScope() {
130
+      let hospitals = this.user.infoPermission.hospitals || []
131
+      this.hosList = hospitals.filter(v => !this.tool.isDuty(v));
132
+      this.taskTypes = this.user.infoPermission.taskTypes || [];
133
+      let userGroups = this.user.infoPermission.groups || [];
134
+      this.userGroups = this.user.infoPermission.groups.filter(v => v.type !== 3);
135
+      this.hosList.forEach((e) => {
136
+        let arrT = [],
137
+          arrG = [];
138
+        this.taskTypes.forEach((el) => {
139
+          if (el.hosId.id == e.id) {
140
+            arrT.push(el);
141
+            this.hosTaskTypes["hos" + e.id] = arrT;
142
+          }
143
+        });
144
+
145
+        this.userGroups.forEach((ele) => {
146
+          if (ele.hospital.id == e.id) {
147
+            arrG.push(ele);
148
+            this.hosGroups["hos" + e.id] = arrG;
149
+          }
150
+        });
151
+      });
152
+      console.log(this.hosTaskTypes, this.hosGroups);
153
+
154
+      // 工单范围全选按钮是否选中
155
+      this.allTypeChecked = false;
156
+      if (this.user.user.scope && this.user.user.scope.typeIds) {
157
+        if (
158
+          this.user.user.scope.typeIds.length ==
159
+          this.hosTaskTypes["hos" + this.checkedHos].length
160
+        ) {
161
+          this.allTypeChecked = true;
162
+        }
163
+      }
164
+      this.allGroupChecked = false;
165
+      if (this.user.user.scope && this.user.user.scope.groupIds) {
166
+        if (
167
+          this.user.user.scope.groupIds.length ==
168
+          this.hosGroups["hos" + this.checkedHos].length
169
+        ) {
170
+          this.allGroupChecked = true;
171
+        }
172
+      }
173
+    }
174
+
175
+    // 工单类型全选
176
+    allTypeChecked: boolean = false; //工单类型全选框
177
+    updateAllTypeChecked() {
178
+      let arr = [];
179
+      this.hosTaskTypes["hos" + this.checkedHos].forEach((e) => {
180
+        arr.push(e.id);
181
+      });
182
+      this.changeTaskTypes(this.allTypeChecked ? arr : [], false);
183
+
184
+    }
185
+
186
+    // 修改院区
187
+    changeCheckedHos(e){
188
+      this.getTypeAndGroup();
189
+    }
190
+
191
+    // 工单类型
192
+    checkedTypes = []; //已选中taskTypes的ID数组
193
+    changeType: boolean = false; //是否改变工单类型
194
+    hosTypesChecked = {}; //当前权限下所有院区下选中的工单类型
195
+    changeTaskTypes(val, isOwn = true) {
196
+      this.checkedTypes = val;
197
+      this.changeType = true;
198
+      this.hosTypesChecked["hos" + this.checkedHos] = val;
199
+      console.log(this.hosTypesChecked);
200
+      if (val.length == this.hosTaskTypes["hos" + this.checkedHos].length) {
201
+        this.allTypeChecked = true;
202
+      } else {
203
+        this.allTypeChecked = false;
204
+      }
205
+
206
+      if(isOwn){
207
+        let obj = {};
208
+        console.log('arr:', val)
209
+        console.log('hosTaskTypes:', this.hosTaskTypes)
210
+        val.forEach((e) => {
211
+          obj[e] = true;
212
+        });
213
+        this.initTypes = obj;
214
+      }else{
215
+        let obj = {};
216
+        console.log('arr:', val)
217
+        console.log('hosTaskTypes:', this.hosTaskTypes)
218
+        val.forEach((e) => {
219
+          obj[e] = this.allTypeChecked;
220
+        });
221
+        this.initTypes = obj;
222
+      }
223
+    }
224
+
225
+    // 人员分组全选
226
+    allGroupChecked: boolean = false; //工单类型全选框
227
+    updateAllGroupChecked() {
228
+      let arr = [];
229
+      this.hosGroups["hos" + this.checkedHos].forEach((e) => {
230
+        arr.push(e.id);
231
+      });
232
+      this.changeGroups(this.allGroupChecked ? arr : [], false);
233
+
234
+    }
235
+    // 人员分组
236
+    checkedGroups = [];
237
+    changeGroup: boolean = false; //是否改变分组
238
+    hosGroupsChecked = {}; //当前权限下所有院区下选中的人员分组
239
+    changeGroups(val, isOwn = true) {
240
+      this.checkedGroups = val;
241
+      this.changeGroup = true;
242
+      this.hosGroupsChecked["hos" + this.checkedHos] = val;
243
+      console.log(this.hosGroupsChecked);
244
+      if (val.length == this.hosGroups["hos" + this.checkedHos].length) {
245
+        this.allGroupChecked = true;
246
+      } else {
247
+        this.allGroupChecked = false;
248
+      }
249
+
250
+      if(isOwn){
251
+        let obj = {};
252
+        val.forEach((e) => {
253
+          obj[e] = true;
254
+        });
255
+        this.initGroups = obj;
256
+      }else{
257
+        let obj = {};
258
+        val.forEach((e) => {
259
+          obj[e] = this.allGroupChecked;
260
+        });
261
+        this.initGroups = obj;
262
+      }
263
+    }
264
+
265
+    // 工单范围院区切换
266
+    getTypeAndGroup() {
267
+      this.allTypeChecked = false;
268
+      this.allGroupChecked = false;
269
+      for (let k1 in this.initTypes) {
270
+        this.initTypes[k1] = false;
271
+      }
272
+      for (let k1 in this.initGroups) {
273
+        this.initGroups[k1] = false;
274
+      }
275
+      // this.orderScopeRadio = "0";
276
+    }
277
+
278
+    // 切换是否不限制部门
279
+    changeAllDuty(e){
280
+      console.log(e);
281
+      this.itsmCheckedHos.forEach(v => (v.checked = false));
282
+      this.itsmCheckedGroup = [];
283
+    }
284
+
285
+    // 保存工单范围设置
286
+    saveLoading: boolean = false; //保存按钮loading状态
287
+    saveOrderScope() {
288
+      // 配送的院区必填
289
+      let value2 = this.scopeTabs.find(v => v.value == 2 );
290
+      if(value2.checked && !this.checkedHos){
291
+        this.message.warning('【配送】的院区必填!')
292
+        return;
293
+      }
294
+
295
+      // 运维限制部门的时候,部门必填
296
+      let value1 = this.scopeTabs.find(v => v.value == 1 );
297
+      if(value1.checked && !this.itsmCheckedHos.filter(v => v.checked).length && this.allDuty != 1){
298
+        this.message.warning('【运维】的部门必填!')
299
+        return;
300
+      }
301
+
302
+      this.saveLoading = true;
303
+      let types = [];
304
+      if (!this.changeType) {
305
+        // 没有改变当前工单类型设置,取初始化设置,
306
+        for (var i in this.initTypes) {
307
+          if (this.initTypes[i]) {
308
+            types.push(Number(i));
309
+          }
310
+        }
311
+      } else {
312
+        let arr = this.hosTypesChecked["hos" + this.checkedHos] || [];
313
+        arr.forEach(function (val) {
314
+          types.push(Number(val));
315
+        });
316
+      }
317
+
318
+      let groups = [];
319
+      if (!this.changeGroup) {
320
+        // 没有改变当前分组设置,取初始化设置,
321
+        for (var k in this.initGroups) {
322
+          if (this.initGroups[k]) {
323
+            groups.push(Number(k));
324
+          }
325
+        }
326
+      } else {
327
+        let arr = this.hosGroupsChecked["hos" + this.checkedHos] || [];
328
+        arr.forEach(function (val) {
329
+          groups.push(Number(val));
330
+        });
331
+      }
332
+      types = [...new Set(types)];
333
+      groups = [...new Set(groups)];
334
+
335
+      let groupsId = [];
336
+      groups.forEach((e) => {
337
+        groupsId.push({ id: e });
338
+      });
339
+      let typesId = [];
340
+      types.forEach((e) => {
341
+        typesId.push({ id: e });
342
+      });
343
+
344
+      let itsm = this.scopeTabs.find(v => v.value == 1);
345
+      let hsms = this.scopeTabs.find(v => v.value == 2);
346
+
347
+      let postData:any = {
348
+        workerOrderScope: {
349
+          userId: this.user.user.id,
350
+          mdv2Switch: Number(itsm.checked),
351
+          hsmsSwitch: Number(hsms.checked),
352
+          range: 0,
353
+          dutyRange: 0,
354
+        },
355
+      };
356
+
357
+      if(itsm.checked){
358
+        postData.workerOrderScope.allDuty = this.allDuty;
359
+        postData.workerOrderScope.dutyIds = this.itsmCheckedHos.filter(v => v.checked).map(v => v.value).toString() || undefined;
360
+        postData.workerOrderScope.dutyGroupIds = this.itsmCheckedGroup.filter(v => v.checked).map(v => v.value).toString() || undefined;
361
+        postData.workerOrderScope.dutyRange = this.itsmOrderScopeRadio - 0;
362
+      }
363
+      if(hsms.checked){
364
+        postData.workerOrderScope.hospitalId = this.checkedHos ? { id: this.checkedHos - 0 } : undefined;
365
+        postData.workerOrderScope.typeIds = typesId || undefined;
366
+        postData.workerOrderScope.groupIds = groupsId || undefined;
367
+        postData.workerOrderScope.range = this.orderScopeRadio - 0;
368
+      }
369
+      if (this.user.user.scope && this.user.user.scope.id) {
370
+        postData.workerOrderScope["id"] = this.user.user.scope.id;
371
+      }
372
+      console.log('allDuty', this.allDuty)
373
+      console.log('itsmCheckedHos', this.itsmCheckedHos)
374
+      console.log('itsmCheckedGroup', this.itsmCheckedGroup)
375
+      console.log('itsmOrderScopeRadio', this.itsmOrderScopeRadio)
376
+      console.log(postData);
377
+      // return;
378
+      this.mainService
379
+        .coopTypeConfig("addData", "workerOrderScope", postData)
380
+        .subscribe((data) => {
381
+          this.saveLoading = false;
382
+          this.confirmModal.emit(data);
383
+        });
384
+    }
385
+
386
+    // 关闭弹窗
387
+    cancelInit() {
388
+      this.cancelModal.emit();
389
+    }
390
+
391
+    // 工单范围设置回显
392
+    initTypes = {}; //工单类型
393
+    initGroups = {}; //人员分组
394
+    initOrderScope() {
395
+      if (!this.user || !this.user.user || !this.user.user.scope) return;
396
+      let scopeInfo = this.user.user.scope;
397
+      if (!this.taskTypes.length) {
398
+        this.initTypes = {};
399
+      } else {
400
+        this.taskTypes.forEach((val, idx) => {
401
+          this.initTypes[val.id] = false;
402
+        });
403
+      }
404
+      if (!scopeInfo.typeIds) {
405
+        this.initTypes = {};
406
+        this.allTypeChecked = false;
407
+      } else {
408
+        scopeInfo.typeIds.forEach((val, idx) => {
409
+          this.initTypes[val.id] = true;
410
+        });
411
+      }
412
+
413
+      console.log(this.initTypes);
414
+
415
+      if (!this.userGroups || !this.userGroups.length) {
416
+        this.initGroups = {};
417
+      } else {
418
+        this.userGroups.forEach((val, idx) => {
419
+          this.initGroups[val.id] = false;
420
+        });
421
+      }
422
+      if (!scopeInfo.groupIds || !scopeInfo.groupIds.length) {
423
+        this.initGroups = {};
424
+      } else {
425
+        scopeInfo.groupIds.forEach((val, idx) => {
426
+          this.initGroups[val.id] = true;
427
+        });
428
+      }
429
+      console.log(this.initGroups);
430
+      console.log(this.initTypes);
431
+    }
432
+    //#endregion 工单范围-配送end
433
+}

+ 20 - 0
src/app/components/order-scope/order-scope.module.ts

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

+ 17 - 0
src/app/pipes/string-to-first-name.pipe.ts

@@ -0,0 +1,17 @@
1
+import { Pipe, PipeTransform } from '@angular/core';
2
+
3
+@Pipe({
4
+  name: 'stringToFirstValue'
5
+})
6
+export class StringToFirstValuePipe implements PipeTransform {
7
+
8
+  transform(value: string, ...args: any[]): any {
9
+    if(value){
10
+      return value.split(',')[0];
11
+    }else{
12
+      return '';
13
+    }
14
+
15
+  }
16
+
17
+}

+ 0 - 1
src/app/services/httpInterceptor.service.ts

@@ -38,7 +38,6 @@ export class HttpInterceptorService implements HttpInterceptor {
38 38
               this.message.info('登录失效,请重新登录!').onClose!.subscribe(() => {
39 39
                 localStorage.removeItem("user");
40 40
                 localStorage.removeItem("menu");
41
-                localStorage.removeItem("phones");
42 41
                 localStorage.removeItem("index");
43 42
                 this.router.navigate(['/login']);
44 43
               })

+ 13 - 1
src/app/services/main.service.ts

@@ -993,7 +993,19 @@ export class MainService {
993 993
 	    headers: this.headers,
994 994
 	  });
995 995
 	}
996
-	
996
+
997
+	// 调度台工单列表
998
+	orderList(data) {
999
+	  return this.http.post(host.host + `/ser/merge/orderList`,data, {
1000
+	    headers: this.headers,
1001
+	  });
1002
+	}
1003
+  // 调度台头部运维分组
1004
+	incidentUserTaskCount(data) {
1005
+	  return this.http.post(host.host + `/incident/incidentUserTaskCount`,data, {
1006
+      headers: this.headers,
1007
+	  });
1008
+	}
997 1009
 	// 大输液-科室汇总统计
998 1010
 	summaryData(data) {
999 1011
 	  return this.http.post(host.host + `/infusion/solutions/dept/summary`,data, {

+ 25 - 3
src/app/services/tool.service.ts

@@ -63,7 +63,7 @@ export class ToolService {
63 63
   getCurrentUserId() {
64 64
     return JSON.parse(localStorage.getItem("user")).user.id;
65 65
   }
66
-  //返回院区或责任部门
66
+  //返回当前人的院区是院区或责任部门
67 67
   getHospitalOrDuty() {
68 68
     let hospital = this.getCurrentHospital();
69 69
     let type = 'hospital';//默认是院区
@@ -83,6 +83,11 @@ export class ToolService {
83 83
     }
84 84
   }
85 85
 
86
+  //判断是否是责任部门
87
+  isDuty(hospital) {
88
+    return hospital.type && hospital.type.value == 6;
89
+  }
90
+
86 91
   // 返回当前用户的组
87 92
   getCurrentGroupList(){
88 93
     return JSON.parse(localStorage.getItem("user")).user.group || [];
@@ -111,6 +116,14 @@ export class ToolService {
111 116
         jurisdiction = e.childrens || []; //匹配路由后,取得对应的权限
112 117
       }
113 118
     });
119
+    if(!jurisdiction.length){
120
+      // type为panel路由
121
+      menu.forEach(v => {
122
+        if(v.type === 'panel' && v.link == link && v.childrens){
123
+          jurisdiction = v.childrens || []; //匹配路由后,取得对应的权限
124
+        }
125
+      })
126
+    }
114 127
     jurisdiction.forEach((e) => {
115 128
       switch (e.link) {
116 129
         case "look":
@@ -236,8 +249,8 @@ export class ToolService {
236 249
         case "assign":
237 250
           coopBtns.assign = true; //指派
238 251
           break;
239
-        case "postpone":
240
-          coopBtns.postpone = true; //延期处理
252
+        case "handle":
253
+          coopBtns.handle = true; //处理
241 254
           break;
242 255
         case "settings":
243 256
           coopBtns.settings = true; //设置
@@ -260,6 +273,15 @@ export class ToolService {
260 273
         case "visit":
261 274
           coopBtns.visit = true; //回访
262 275
           break;
276
+        case "continue":
277
+            coopBtns.continue = true; //继续建单
278
+            break;
279
+        case "generate":
280
+          coopBtns.generate = true; //生成
281
+          break;
282
+        case "reject":
283
+          coopBtns.reject = true; //不受理
284
+          break;
263 285
       }
264 286
     });
265 287
     console.log(coopBtns);

+ 19 - 0
src/app/services/websocket-hjzx.service.ts

@@ -0,0 +1,19 @@
1
+/*
2
+ * @Author: seimin
3
+ * @Date: 2024-09-24 16:34:47
4
+ * @LastEditors: seimin
5
+ * @LastEditTime: 2024-09-29 15:38:58
6
+ * @Description: 呼叫中心websocket服务
7
+ */
8
+import { Injectable } from "@angular/core";
9
+declare const tlwsa: any;
10
+@Injectable({
11
+  providedIn: "root",
12
+})
13
+export class WebsocketHjzxService {
14
+  constructor() { }
15
+
16
+  closeWs(flag: boolean = false){
17
+    flag && tlwsa.tlaClose();
18
+  }
19
+}

+ 111 - 0
src/app/services/websocket-incoming.service.ts

@@ -0,0 +1,111 @@
1
+/*
2
+ * @Author: seimin
3
+ * @Date: 2024-09-24 16:34:47
4
+ * @LastEditors: seimin
5
+ * @LastEditTime: 2024-09-29 15:41:54
6
+ * @Description: 来电弹屏websocket服务
7
+ */
8
+import { Injectable } from "@angular/core";
9
+import { Observable } from "rxjs";
10
+import { WebsocketPhoneService } from './websocket-phone.service';
11
+import { WebsocketHjzxService } from './websocket-hjzx.service';
12
+import { MainService } from './main.service';
13
+import http from "../../assets/js/http";
14
+
15
+@Injectable({
16
+  providedIn: "root",
17
+})
18
+export class WebsocketIncomingService {
19
+  constructor(
20
+    private mainService: MainService,
21
+    private phoneService: WebsocketPhoneService,
22
+    private hjzxService: WebsocketHjzxService,
23
+  ) { }
24
+
25
+  // 连接websocket { userCount }
26
+  private user = JSON.parse(localStorage.getItem("user")); //用户信息
27
+  connectWs(): Observable<any> {
28
+    let userCount = this.user.user.account + "|" + this.getPhoneNumber();
29
+    if(this.getSign() === 'box'){
30
+      return this.phoneService.connectWs(http.phoneWs, { userCount });
31
+    }
32
+  }
33
+  // 断开websocket
34
+  closeWs(flag: boolean = false) {
35
+    console.log('sign', this.getSign())
36
+    if(this.getSign() === 'box'){
37
+      this.phoneService.closeWs(flag);
38
+    }else if(this.getSign() === 'callCenter'){
39
+      this.hjzxService.closeWs(flag);
40
+    }
41
+  }
42
+
43
+  // 绑定的分机号码
44
+  private phoneNumber:string = '';
45
+  // 获取绑定分机号码
46
+  getPhoneNumber() {
47
+    return this.phoneNumber || sessionStorage.getItem('phoneNumber');
48
+  }
49
+  // 设置绑定分机号码
50
+  setPhoneNumber(phoneNumber: string) {
51
+    this.phoneNumber = phoneNumber;
52
+    sessionStorage.setItem('phoneNumber', phoneNumber);
53
+  }
54
+  // 删除绑定分机号码
55
+  removePhoneNumber() {
56
+    this.phoneNumber = '';
57
+    sessionStorage.removeItem('phoneNumber');
58
+  }
59
+
60
+  // 上次绑定的分机号码
61
+  private phoneNumberPre:string = '';
62
+  // 获取上次绑定分机号码
63
+  getPhoneNumberPre() {
64
+    return this.phoneNumberPre || sessionStorage.getItem('phoneNumberPre');
65
+  }
66
+  // 设置上次绑定分机号码
67
+  setPhoneNumberPre(phoneNumberPre: string) {
68
+    this.phoneNumberPre = phoneNumberPre;
69
+    sessionStorage.setItem('phoneNumberPre', phoneNumberPre);
70
+  }
71
+  // 删除上次绑定分机号码
72
+  removePhoneNumberPre() {
73
+    this.phoneNumberPre = '';
74
+    sessionStorage.removeItem('phoneNumberPre');
75
+  }
76
+
77
+  // 标识(呼叫中心或录音盒)
78
+  // callCenter|box
79
+  private sign:string = '';
80
+  // 获取绑定标识
81
+  getSign() {
82
+    return this.sign || sessionStorage.getItem('sign');
83
+  }
84
+  // 设置绑定标识
85
+  setSign(sign: string) {
86
+    this.sign = sign;
87
+    sessionStorage.setItem('sign', sign);
88
+  }
89
+  // 删除绑定标识
90
+  removeSign() {
91
+    this.sign = '';
92
+    sessionStorage.removeItem('sign');
93
+  }
94
+
95
+  // 呼叫中心服务地址
96
+  private socketUrl:string = '';
97
+  // 获取呼叫中心服务地址
98
+  getSocketUrl() {
99
+    return this.socketUrl || sessionStorage.getItem('socketUrl');
100
+  }
101
+  // 设置呼叫中心服务地址
102
+  setSocketUrl(socketUrl: string) {
103
+    this.socketUrl = socketUrl;
104
+    sessionStorage.setItem('socketUrl', socketUrl);
105
+  }
106
+  // 删除呼叫中心服务地址
107
+  removeSocketUrl() {
108
+    this.socketUrl = '';
109
+    sessionStorage.removeItem('socketUrl');
110
+  }
111
+}

+ 7 - 0
src/app/services/websocket-phone.service.ts

@@ -1,3 +1,10 @@
1
+/*
2
+ * @Author: seimin
3
+ * @Date: 2024-03-11 11:11:09
4
+ * @LastEditors: seimin
5
+ * @LastEditTime: 2024-09-24 16:38:23
6
+ * @Description: 录音盒websocket服务
7
+ */
1 8
 import { Injectable } from "@angular/core";
2 9
 import { Subject, Observable, from } from "rxjs";
3 10
 import * as Atmosphere from "atmosphere.js";

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

@@ -57,6 +57,7 @@ import { wangEditorComponent } from './wang-editor/wang-editor.component';
57 57
 import { StripHtmlPipe } from '../pipes/strip-html.pipe.';
58 58
 import { PathologyAddComponent } from './pathology-add/pathology-add.component';
59 59
 import { PathologyDetailComponent } from './pathology-detail/pathology-detail.component';
60
+import { StringToFirstValuePipe } from '../pipes/string-to-first-name.pipe';
60 61
 
61 62
 @NgModule({
62 63
   declarations: [
@@ -91,6 +92,7 @@ import { PathologyDetailComponent } from './pathology-detail/pathology-detail.co
91 92
 		PathologyDetailComponent,
92 93
     DateTransformPipe,
93 94
     DataToNamePipe,
95
+    StringToFirstValuePipe,
94 96
     DialogDeleteComponent,
95 97
     DialogBxComponent,
96 98
     DialogSurgeryComponent,
@@ -162,6 +164,7 @@ import { PathologyDetailComponent } from './pathology-detail/pathology-detail.co
162 164
     OverlayscrollbarsModule,
163 165
     DateTransformPipe,
164 166
     DataToNamePipe,
167
+    StringToFirstValuePipe,
165 168
     DialogDeleteComponent,
166 169
     DialogBxComponent,
167 170
     DialogSurgeryComponent,

+ 6 - 0
src/app/views/data-dictionary/data-dictionary.component.ts

@@ -321,6 +321,9 @@ export class DataDictionaryComponent implements OnInit {
321 321
         this.hideModal();
322 322
         this.btnLoading = false;
323 323
         if (result["status"] == 200) {
324
+          if(this.checkedDictionary.type === 'dictionary'){
325
+            this.mainService.clearDictionary();
326
+          }
324 327
           this.showPromptModal(this.add ? "新增" : "编辑", true, "");
325 328
         } else {
326 329
           this.showPromptModal(
@@ -359,6 +362,9 @@ export class DataDictionaryComponent implements OnInit {
359 362
       this.hideDelDictionaryModal();
360 363
       this.btnLoading = false;
361 364
       if (result.status == 200) {
365
+        if(this.checkedDictionary.type === 'dictionary'){
366
+          this.mainService.clearDictionary();
367
+        }
362 368
         this.showPromptModal("删除", true, "");
363 369
       } else {
364 370
         this.showPromptModal("删除", false, result.msg);

文件差异内容过多而无法显示
+ 1577 - 2549
src/app/views/fuwutai/fuwutai.component.html


文件差异内容过多而无法显示
+ 617 - 75
src/app/views/fuwutai/fuwutai.component.less


文件差异内容过多而无法显示
+ 2901 - 880
src/app/views/fuwutai/fuwutai.component.ts


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

@@ -6,6 +6,18 @@ import { FuwutaiComponent } from './fuwutai.component';
6 6
 import { ShareModule } from 'src/app/share/share.module';
7 7
 
8 8
 import { NgxPrintModule } from 'ngx-print';
9
+import { OrderScopeModule } from 'src/app/components/order-scope/order-scope.module';
10
+import { IncidentDicrectOrderModule } from 'src/app/components/incidentManagement/incident-direct-order/incident-direct-order.module';
11
+import { KnowledgeLookModule } from 'src/app/components/knowledge-look/knowledge-look.module';
12
+import { IncidentDetailModule } from 'src/app/components/incidentManagement/incident-detail/incident-detail.module';
13
+import { IncidentRejectModule } from 'src/app/components/incidentManagement/incident-reject/incident-reject.module';
14
+import { IncidentSubstitutionModule } from 'src/app/components/incidentManagement/incident-substitution/incident-substitution.module';
15
+import { IncidentHandleModule } from 'src/app/components/incidentManagement/incident-handle/incident-handle.module';
16
+import { IncidentSerVisitModule } from 'src/app/components/incidentManagement/incident-ser-visit/incident-ser-visit.module';
17
+import { IncidentSerMessageModule } from 'src/app/components/incidentManagement/incident-ser-message/incident-ser-message.module';
18
+import { IncidentSerCallModule } from 'src/app/components/incidentManagement/incident-ser-call/incident-ser-call.module';
19
+import { VirtualScrollerModule } from 'ngx-virtual-scroller';
20
+import { BindExtensionNumberModule } from 'src/app/components/bind-extension-number/bind-extension-number.module';
9 21
 
10 22
 
11 23
 @NgModule({
@@ -17,6 +29,18 @@ import { NgxPrintModule } from 'ngx-print';
17 29
     ShareModule,
18 30
     FuwutaiRoutingModule,
19 31
     NgxPrintModule,
32
+    OrderScopeModule,
33
+    IncidentDicrectOrderModule,
34
+    KnowledgeLookModule,
35
+    IncidentDetailModule,
36
+    IncidentRejectModule,
37
+    IncidentSubstitutionModule,
38
+    IncidentHandleModule,
39
+    IncidentSerVisitModule,
40
+    IncidentSerMessageModule,
41
+    IncidentSerCallModule,
42
+    VirtualScrollerModule,
43
+    BindExtensionNumberModule,
20 44
   ]
21 45
 })
22 46
 export class FuwutaiModule { }

+ 4 - 3
src/app/views/group-management/group-management.component.html

@@ -160,12 +160,13 @@
160 160
                 [nzDropdownMatchSelectWidth]="false"
161 161
                 formControlName="groupType"
162 162
                 nzShowSearch
163
-                nzAllowClear 
163
+                nzAllowClear
164 164
                 [nzDisabled]="isDisabledGroupType"
165 165
                 nzPlaceHolder="请选择分组类型"
166 166
               >
167
-                <nz-option nzLabel="统计分组" nzValue="1"></nz-option>
167
+                <nz-option nzLabel="配送分组" nzValue="1"></nz-option>
168 168
                 <nz-option nzLabel="派单分组" nzValue="2"></nz-option>
169
+                <nz-option nzLabel="运维分组" nzValue="3"></nz-option>
169 170
               </nz-select>
170 171
             </nz-form-control>
171 172
           </nz-form-item>
@@ -179,7 +180,7 @@
179 180
                 class="formItem"
180 181
                 nzServerSearch
181 182
                 nzShowSearch
182
-                [nzLoading]="editLoading" 
183
+                [nzLoading]="editLoading"
183 184
                 nzPlaceHolder="请选择分组组长"
184 185
                 formControlName="groupLeader"
185 186
                 (nzOnSearch)="changeInp($event)"

+ 1 - 1
src/app/views/hospital-config/hospital-config.component.ts

@@ -441,7 +441,7 @@ export class HospitalConfigComponent implements OnInit {
441 441
    * @returns
442 442
    */
443 443
   getGroupList(hosId) {
444
-    let postData = { idx: 0, sum: 100, group2: { hospitals: hosId, type: 1 } };
444
+    let postData = { idx: 0, sum: 100, group2: { hospitals: hosId, typeIds: '1,3' } };
445 445
     return this.mainService
446 446
       .getFetchDataList("data", "group2", postData)
447 447
       .toPromise();

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

@@ -4473,7 +4473,6 @@ export class HushijiandanComponent implements OnInit {
4473 4473
     }
4474 4474
     localStorage.removeItem("user");
4475 4475
     localStorage.removeItem("menu");
4476
-    localStorage.removeItem("phones");
4477 4476
     localStorage.removeItem("index");
4478 4477
 
4479 4478
     // 假退出
@@ -4486,7 +4485,6 @@ export class HushijiandanComponent implements OnInit {
4486 4485
         }
4487 4486
         localStorage.removeItem("user");
4488 4487
         localStorage.removeItem("menu");
4489
-        localStorage.removeItem("phones");
4490 4488
         localStorage.removeItem("index");
4491 4489
       }
4492 4490
     });

+ 1 - 1
src/app/views/incident-config/incident-config.component.html

@@ -18,7 +18,7 @@
18 18
   </ng-container>
19 19
   <!-- 数据字典 -->
20 20
   <ng-container *ngIf="activeTagId === 3">
21
-    <app-configuration-dictionary></app-configuration-dictionary>
21
+    <app-configuration-dictionary [dictionaryKeyList]="dictionaryKeyList"></app-configuration-dictionary>
22 22
   </ng-container>
23 23
   <!-- 消息通知 -->
24 24
   <ng-container *ngIf="activeTagId === 4">

+ 11 - 0
src/app/views/incident-config/incident-config.component.ts

@@ -22,6 +22,17 @@ export class IncidentConfigComponent implements OnInit, AfterViewInit {
22 22
     { id: 7, name: '院区配置',},
23 23
   ];
24 24
 
25
+  // 数据字典
26
+  dictionaryKeyList:any[] = [
27
+    { id: 1, name: '积分配置', key: "incident_category_score"},
28
+    { id: 2, name: '事件来源', key: "incident_source"},
29
+    { id: 3, name: '处理结果', key: "incident_closecode"},
30
+    { id: 4, name: '处理方式', key: "incident_handle_type"},
31
+    { id: 5, name: '状态', key: "incident_status"},
32
+    { id: 6, name: '维修记录', key: "repair_type"},
33
+    { id: 7, name: '满意度评价', key: "incident_degree"},
34
+  ]
35
+
25 36
   ngOnInit(): void {}
26 37
 
27 38
   ngAfterViewInit(){

+ 3 - 3
src/app/views/incident-config/incident-config.module.ts

@@ -6,11 +6,11 @@ import { IncidentConfigComponent } from './incident-config.component';
6 6
 import { ShareModule } from 'src/app/share/share.module';
7 7
 import { ConfigurationCategoryComponent } from 'src/app/components/configurationCenter/configuration-category/configuration-category.component';
8 8
 import { ConfigurationPriorityComponent } from 'src/app/components/configurationCenter/configuration-priority/configuration-priority.component';
9
-import { ConfigurationDictionaryComponent } from 'src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component';
10 9
 import { ConfigurationManHourComponent } from 'src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component';
11 10
 import { ConfigurationDeptUserComponent } from 'src/app/components/configurationCenter/configuration-deptUser/configuration-deptUser.component';
12 11
 import { ConfigurationMessageComponent } from 'src/app/components/configurationCenter/configuration-message/configuration-message.component';
13 12
 import { ConfigurationHospitalComponent } from 'src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component';
13
+import { ConfigurationDictionaryModule } from 'src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.module';
14 14
 
15 15
 
16 16
 @NgModule({
@@ -18,7 +18,6 @@ import { ConfigurationHospitalComponent } from 'src/app/components/configuration
18 18
     IncidentConfigComponent,
19 19
     ConfigurationCategoryComponent,
20 20
     ConfigurationPriorityComponent,
21
-    ConfigurationDictionaryComponent,
22 21
 		ConfigurationManHourComponent,
23 22
 		ConfigurationDeptUserComponent,
24 23
     ConfigurationMessageComponent,
@@ -27,7 +26,8 @@ import { ConfigurationHospitalComponent } from 'src/app/components/configuration
27 26
   imports: [
28 27
     CommonModule,
29 28
     IncidentConfigRoutingModule,
30
-    ShareModule
29
+    ShareModule,
30
+    ConfigurationDictionaryModule,
31 31
   ]
32 32
 })
33 33
 export class IncidentConfigModule { }

+ 11 - 10
src/app/views/incident-management/incident-management.component.html

@@ -1,7 +1,7 @@
1 1
 <div class="list-template pt0">
2 2
   <div class="list-template__content">
3 3
     <div class="list-template__tab">
4
-      <div class="list-template__tabItem" [ngClass]="{'active': queryTask == item.key}" (click)="changeTab(item.key)" *ngFor="let item of tabs">{{item.value}}({{item.num}})</div>
4
+      <div class="list-template__tabItem" [ngClass]="{'active': queryTask == item.key}" (click)="changeTab(item.key)" *ngFor="let item of tabs">{{item.value}}<span [ngClass]="{ red: item.isRed && item.num > 0}">({{item.num}})</span></div>
5 5
     </div>
6 6
     <div class="list-template__top" nz-row>
7 7
       <div nz-col nzXl='18' class="list-template__searchBox">
@@ -72,7 +72,7 @@
72 72
             <td>{{index+(pageIndex-1) * pageSize + 1}}</td>
73 73
             <td class="text_align_left">
74 74
               <span [ngClass]="priorityColor(data.priorityId)">{{ data.priorityDTO?.name }}</span>
75
-              {{ data.incidentsign }} {{ data.description }}
75
+              {{ data.incidentsign }} {{ data.acceptDate | date: 'yyyy-MM-dd HH:mm' }}<br>{{ data.description }}
76 76
               <i class="icon_transport transport-a-11111 ml8" *ngIf="data.reqAttachment"></i>
77 77
               <i class="icon_transport transport-luyin ml8" *ngIf="data.reqRecord"></i>
78 78
             </td>
@@ -90,19 +90,20 @@
90 90
             <td>
91 91
               {{ data.acceptUser?.name || '无' }}<br>
92 92
               {{ transferSynergetic(data) }}<br>
93
-              <span [ngStyle]="{ color: data.handleColourInfo ? data.handleColourInfo.value : '' }">{{ data.overdueTime | date: 'MM-dd HH:mm' }}</span>前接单
93
+              <ng-container *ngIf="(data.state.value === 'pending' || data.state.value === 'reassign') && data.overdueResponseDate"><span [ngStyle]="{ color: data.acceptColourInfo ? data.acceptColourInfo.value : '' }">{{ data.overdueResponseDate | date: 'MM-dd HH:mm' }}</span>前接单</ng-container>
94
+              <ng-container *ngIf="data.state.value === 'handler' && data.overdueTime"><span [ngStyle]="{ color: data.handleColourInfo ? data.handleColourInfo.value : '' }">{{ data.overdueTime | date: 'MM-dd HH:mm' }}</span>前处理</ng-container>
94 95
             </td>
95
-            <td [innerHTML]="transferHandlerLog(data.currentLog)"></td>
96
+            <td [innerHTML]="data.overtimeRemark"></td>
96 97
             <td>{{ data.state?.name }}</td>
97 98
             <td>
98 99
               <div class="coop">
99 100
                 <span *ngIf="coopBtns.look" (click)="detail($event,data)">查看</span>
100
-                <span *ngIf="computedVisit(data)" (click)="visit($event,data)">回访</span>
101
-                <span *ngIf="computedReceive(data)" (click)="showDelModal($event, data,'您确认要接单吗?','接单','receive')">接单</span>
102
-                <span *ngIf="computedHandle(data)" (click)="handle($event,data)">处理</span>
103
-                <span *ngIf="computedSubstitution(data)" (click)="substitution($event,data)">换人处理</span>
104
-                <span *ngIf="computedPostpone(data)" (click)="postpone($event,data)">延期处理</span>
105
-                <span *ngIf="computedSetDuty(data)" (click)="setDuty($event,data)">设置责任部门</span>
101
+                <span *ngIf="data.computedVisitFlag" (click)="visit($event,data)">回访</span>
102
+                <span *ngIf="data.computedReceiveFlag" (click)="showDelModal($event, data,'您确认要接单吗?','接单','receive')">接单</span>
103
+                <span *ngIf="data.computedHandleFlag" (click)="handle($event,data)">处理</span>
104
+                <span *ngIf="data.computedSubstitutionFlag" (click)="substitution($event,data)">换人处理</span>
105
+                <span *ngIf="data.computedPostponeFlag" (click)="postpone($event,data)">延期处理</span>
106
+                <span *ngIf="data.computedSetDutyFlag" (click)="setDuty($event,data)">设置责任部门</span>
106 107
                 <span *ngIf="coopBtns.del && data.deleteFlag !== 1" (click)="showDelModal($event, data,'您确认要删除吗?','删除','del')">删除</span>
107 108
               </div>
108 109
             </td>

+ 37 - 26
src/app/views/incident-management/incident-management.component.ts

@@ -48,15 +48,15 @@ export class IncidentManagementComponent implements OnInit {
48 48
   btnLoading: boolean = false; //提交按钮loading状态
49 49
 
50 50
   tabs:any[] = [
51
-    // {key: 'all', value: '全部故障', num: 0},
52
-    {key: 'todo', value: '待我接单', num: 0},
53
-    {key: 'doing', value: '待我处理', num: 0},
54
-    // {key: 'reassign', value: '重新指派', num: 0},
55
-    // {key: 'callback', value: '待我回访', num: 0},
56
-    {key: 'resolve', value: '由我解决', num: 0},
57
-    {key: 'owns', value: '与我关联', num: 0},
58
-    {key: 'storage', value: '暂存', num: 0},
59
-    // {key: 'badEvaluate', value: '异常评价', num: 0},
51
+    // {key: 'all', value: '全部故障', num: 0, isRed: false},
52
+    {key: 'todo', value: '待我接单', num: 0, isRed: true},
53
+    {key: 'doing', value: '待我处理', num: 0, isRed: true},
54
+    // {key: 'reassign', value: '重新指派', num: 0, isRed: false},
55
+    // {key: 'callback', value: '待我回访', num: 0, isRed: false},
56
+    {key: 'resolve', value: '由我解决', num: 0, isRed: false},
57
+    {key: 'owns', value: '与我关联', num: 0, isRed: false},
58
+    {key: 'storage', value: '暂存', num: 0, isRed: false},
59
+    // {key: 'badEvaluate', value: '异常评价', num: 0, isRed: false},
60 60
   ]
61 61
 
62 62
   searchDTO: any = {};
@@ -87,8 +87,8 @@ export class IncidentManagementComponent implements OnInit {
87 87
     this.coopBtns = this.tool.initCoopBtns(this.route);
88 88
     this.initTabs();
89 89
     this.getDeparts();
90
-    this.getUsers('', null, 'handle');
91
-    this.getUsers('', null, 'acceptUser');
90
+    this.getUsers('', 'handle');
91
+    this.getUsers('', 'acceptUser');
92 92
     this.getGdStates();
93 93
     this.getOverdueStates();
94 94
     this.getIncidentCategoryList();
@@ -99,18 +99,18 @@ export class IncidentManagementComponent implements OnInit {
99 99
   // 初始化tab
100 100
   initTabs(){
101 101
     if (this.coopBtns.all) {
102
-        this.tabs.splice(0, 0 , {key: 'all', value: '全部故障', num: 0});
102
+        this.tabs.splice(0, 0 , {key: 'all', value: '全部故障', num: 0, isRed: false});
103 103
     }
104 104
     if (this.coopBtns.callback) {
105 105
         let index = this.tabs.findIndex(v => v.key == 'resolve');
106
-        this.tabs.splice(index, 0 , {key: 'callback', value: '待我回访', num: 0});
106
+        this.tabs.splice(index, 0 , {key: 'callback', value: '待我回访', num: 0, isRed: false});
107 107
     }
108 108
     if (this.coopBtns.reassign) {
109 109
         let index = this.tabs.findIndex(v => v.key == 'doing');
110
-        this.tabs.splice(index + 1, 0 , {key: 'reassign', value: '重新指派', num: 0});
110
+        this.tabs.splice(index + 1, 0 , {key: 'reassign', value: '重新指派', num: 0, isRed: false});
111 111
     }
112 112
     // if (this.coopBtns.badEvaluate) {
113
-    //     this.tabs.push({key: 'badEvaluate', value: '异常评价', num: 0});
113
+    //     this.tabs.push({key: 'badEvaluate', value: '异常评价', num: 0, isRed: false});
114 114
     // }
115 115
   }
116 116
 
@@ -150,12 +150,13 @@ export class IncidentManagementComponent implements OnInit {
150 150
   }
151 151
 
152 152
   // 获取处理人
153
-  getUsers(e?, those?, type?) {
154
-    let that = those || this;
153
+  getUsers(e?, type?) {
154
+    let that = this;
155 155
     let postData = {
156 156
       user: {
157 157
         name: e || "",
158
-        hospital: { id: that.hospital },
158
+        hospital: { id: that.tool.getCurrentHospital().id },
159
+        engineer: 1,
159 160
         simpleQuery: true,
160 161
       },
161 162
       idx: 0,
@@ -214,7 +215,7 @@ export class IncidentManagementComponent implements OnInit {
214 215
     if(currentLog.extra1DTO && currentLog.extra2 && currentLog.startTime){
215 216
         if(currentLog.extra2==0.5){
216 217
           currentLog.extra2 = 4;
217
-          return currentLog.extra1DTO.name+"<br>"+ format(addHours(currentLog.startTime, +currentLog.extra2), "MM月dd日")+"<br>"+ format(addDays(currentLog.startTime, +currentLog.extra2), "HH时mm分前完成");
218
+          return currentLog.extra1DTO.name+"<br>"+ format(addHours(currentLog.startTime, +currentLog.extra2), "MM月dd日")+"<br>"+ format(addHours(currentLog.startTime, +currentLog.extra2), "HH时mm分前完成");
218 219
         }else{
219 220
           return currentLog.extra1DTO.name+"<br>"+ format(addDays(currentLog.startTime, +currentLog.extra2), "MM月dd日前完成");
220 221
         }
@@ -245,17 +246,17 @@ export class IncidentManagementComponent implements OnInit {
245 246
 
246 247
   // 是否显示处理按钮
247 248
   computedHandle(data){
248
-    return data.state.value === 'handler' && data.handlingPersonnelUser && data.handlingPersonnelUser.id == this.tool.getCurrentUserId() && data.deleteFlag !== 1;
249
+    return this.coopBtns.handle && data.state.value === 'handler' && data.handlingPersonnelUser && data.handlingPersonnelUser.id == this.tool.getCurrentUserId() && data.deleteFlag !== 1;
249 250
   }
250 251
 
251 252
   // 是否显示换人处理按钮
252 253
   computedSubstitution(data){
253
-    return data.state.value === 'pending' || data.state.value === 'handler' || (data.state.value === 'reassign' && this.coopBtns.assign) && data.deleteFlag !== 1;
254
+    return (data.state.value === 'pending' || data.state.value === 'handler' || (data.state.value === 'reassign' && this.coopBtns.assign)) && data.deleteFlag !== 1;
254 255
   }
255 256
 
256 257
   // 是否显示延期处理按钮
257 258
   computedPostpone(data){
258
-    return this.coopBtns.postpone && data.state.value == 'handler' && data.handlingPersonnelUser && data.handlingPersonnelUser.id == this.tool.getCurrentUserId() && data.deleteFlag !== 1;
259
+    return data.state.value == 'handler' && data.handlingPersonnelUser && data.handlingPersonnelUser.id == this.tool.getCurrentUserId() && data.deleteFlag !== 1;
259 260
   }
260 261
 
261 262
   // 是否显示设置责任部门按钮
@@ -316,7 +317,17 @@ export class IncidentManagementComponent implements OnInit {
316 317
       .getFetchDataList("simple/data", "incident", postData)
317 318
       .subscribe((result) => {
318 319
         this.loading1 = false;
319
-        this.listOfData = result.list.map(v => ({...v, endDeptsName: v.endDepts ? v.endDepts.map(v => v.dept).toString() : ''}));
320
+        let list = result.list || [];
321
+        list.forEach((item) => {
322
+          item.endDeptsName = item.endDepts ? item.endDepts.map(v => v.dept).toString() : '';
323
+          item.computedVisitFlag = this.computedVisit(item);
324
+          item.computedReceiveFlag = this.computedReceive(item);
325
+          item.computedHandleFlag = this.computedHandle(item);
326
+          item.computedSubstitutionFlag = this.computedSubstitution(item);
327
+          item.computedPostponeFlag = this.computedPostpone(item);
328
+          item.computedSetDutyFlag = this.computedSetDuty(item);
329
+        });
330
+        this.listOfData = list;
320 331
         this.listLength = result.totalNum;
321 332
       });
322 333
 
@@ -337,7 +348,7 @@ export class IncidentManagementComponent implements OnInit {
337 348
         if(!incident){
338 349
             incident = {};
339 350
         }
340
-        if(this.queryTask === 'all' || this.queryTask === 'callback' || this.queryTask === 'badEvaluate'){
351
+        if(incident.queryTask === 'all' || incident.queryTask === 'callback' || incident.queryTask === 'badEvaluate'){
341 352
           let { hospital, type } = this.tool.getHospitalOrDuty();
342 353
           if(type === 'duty'){
343 354
             // 当前的所属责任部门
@@ -353,7 +364,7 @@ export class IncidentManagementComponent implements OnInit {
353 364
 
354 365
         incident.assignee = this.tool.getCurrentUserId();
355 366
 
356
-        if(this.queryTask === 'todo' || this.queryTask === 'owns'){
367
+        if(incident.queryTask === 'todo' || incident.queryTask === 'owns'){
357 368
           incident.candidateGroups = this.tool.getCurrentGroupList().map(v => v.id).toString();
358 369
         }else{
359 370
           delete incident.candidateGroups;
@@ -690,7 +701,7 @@ export class IncidentManagementComponent implements OnInit {
690 701
     this.getList(true);
691 702
   }
692 703
 
693
-  // 处理-弹窗
704
+  // 换人处理-弹窗
694 705
   substitutionModalShow = false; //弹窗开关
695 706
   substitution(e, data) {
696 707
     e.stopPropagation();

+ 1 - 1
src/app/views/inspection-plan-config/inspection-plan-config.component.ts

@@ -207,7 +207,7 @@ export class InspectionPlanConfigComponent implements OnInit, AfterViewInit {
207 207
       group2: {
208 208
         groupName: keyword,
209 209
         hospitals: this.currentHospital.id,
210
-        type: 1,
210
+        type: 3,
211 211
       },
212 212
       idx: 0,
213 213
       sum: 10,

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

@@ -46,6 +46,7 @@
46 46
       <strong>点击下载谷歌浏览器👉</strong>
47 47
       <a [href]="http.domain+'/chrome64/ChromeSetup32.exe'">win32</a>
48 48
       <a [href]="http.domain+'/chrome64/ChromeSetup64.exe'">win64</a>
49
+      <a href="javascript:;" (click)="showScreen($event)">录屏</a>
49 50
     </div>
50 51
   </div>
51 52
 </div>

+ 33 - 0
src/app/views/login/login.component.ts

@@ -9,6 +9,8 @@ import { baseUrlType } from "src/app/type/types";
9 9
 import { ToolService } from 'src/app/services/tool.service';
10 10
 import { Title } from '@angular/platform-browser';
11 11
 import { MarkingService } from 'src/app/services/marking.service';
12
+
13
+declare var MediaRecorder: any;
12 14
 @Component({
13 15
   selector: "app-login",
14 16
   templateUrl: "./login.component.html",
@@ -301,4 +303,35 @@ export class LoginComponent implements OnInit {
301 303
     });
302 304
     return parents;
303 305
   }
306
+
307
+  // 录屏
308
+  isRecording:boolean = false;
309
+  async showScreen(e){
310
+    if(this.isRecording || !navigator.mediaDevices){
311
+      return;
312
+    }
313
+    e.preventDefault();
314
+    let stream = await (navigator.mediaDevices as any).getDisplayMedia({ video: true });
315
+    let mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") ? "video/webm; codecs=vp9" : "video/webm";
316
+
317
+    let mediaRecorder = new MediaRecorder(stream, { mimeType: mime });
318
+    let chunks = [];
319
+    //录制
320
+    mediaRecorder.addEventListener('dataavailable', (e) => {
321
+      this.isRecording = true;
322
+      chunks.push(e.data)
323
+    })
324
+    //停止
325
+    mediaRecorder.addEventListener('stop', () => {
326
+      let blob = new Blob(chunks, { type: chunks[0].type });
327
+      let url = URL.createObjectURL(blob);
328
+      let a = document.createElement('a');
329
+      a.href = url;
330
+      a.download = 'video.webm';
331
+      a.click();
332
+      this.isRecording = false;
333
+    })
334
+    //手动启动
335
+    mediaRecorder.start()
336
+  }
304 337
 }

+ 33 - 41
src/app/views/main/main.component.html

@@ -1,28 +1,25 @@
1 1
 <nz-layout class="app-layout display_flex flex_auto ant-layout-has-sider">
2 2
   <overlay-scrollbars #osComponentRef1 class="menu-sidebar">
3 3
     <div class="sidebar-logo display_flex align-items_center justify-content_flex-center">
4
-      <div style="line-height: normal;height:100%;" class="display_flex align-items_center justify-content_flex-center flex-direction_column">
5
-        <img [src]="tool.logoUrl">
6
-        <span>{{tool.logoTitle}}</span>
4
+      <div class="display_flex align-items_center justify-content_flex-center logoTitle">
5
+        <div class="title ellipsis-multiline" nz-tooltip nzTooltipTitle="{{tool.logoTitle}}">{{tool.logoTitle}}</div>
7 6
       </div>
8 7
     </div>
9 8
     <!-- 导航重写,兼容chrome39 -->
10 9
     <ul id="ds-menu">
11 10
       <li class="mainMenuOne" (click)="totoMenu('首页')" [ngClass]="{mainMenuSelected:indexFlag}">
12 11
         <i nz-icon nzType="home"></i>
13
-        <span>首页</span>
12
+        <span nz-tooltip nzTooltipTitle="首页">首页</span>
14 13
       </li>
15 14
       <li *ngFor="let data of menus" class="mainMenuWrap">
16 15
         <div class="mainMenuOne" (click)="clickMenuOne(data)" [ngClass]="{mainMenuSelected:data.flagBg}">
17 16
           <i class="icon_transport" [ngClass]="data.icon" *ngIf="isTransportIcon(data.icon)"></i>
18 17
           <i nz-icon [nzType]="data.icon" *ngIf="!isTransportIcon(data.icon)"></i>
19
-          <span>{{data.title}}</span>
20
-          <span class="icon_transport transport-xialajiantou"
21
-            [ngStyle]="{transform:data.flag?'rotate(180deg)':'rotate(0deg)',color:data.flag?'#fff':'#999'}"></span>
18
+          <span nz-tooltip nzTooltipTitle="{{data.title}}">{{data.title}}</span>
19
+          <span class="icon_transport transport-xialajiantou" [ngStyle]="{transform:data.flag?'rotate(180deg)':'rotate(0deg)',color:data.flag?'#fff':'#999'}"></span>
22 20
         </div>
23 21
         <ul>
24
-          <li *ngFor="let item of data.childrens" class="mainMenu" (click)="totoMenu(item.title,item,data)"
25
-            [ngStyle]="{height:data.flag?'44px':0}" [ngClass]="{menuTwoSelected:item.flag}">
22
+          <li *ngFor="let item of data.childrens" class="mainMenu" (click)="totoMenu(item.title,item,data)" [ngStyle]="{height:data.flag?'44px':0}" [ngClass]="{menuTwoSelected:item.flag}" nz-tooltip nzTooltipTitle="{{item.title}}">
26 23
             {{item.title}}
27 24
           </li>
28 25
         </ul>
@@ -33,42 +30,37 @@
33 30
     <nz-header>
34 31
       <div class="app-header display_flex justify-content_space-between align-items_center">
35 32
         <div class="left">
36
-          <button nz-button nzType="primary" *ngIf='deskRole' (click)="toFuwutai()">调度台</button>
37
-          <button nz-button nzType="primary" *ngIf="nurseRole" (click)="toHuShi()">护士端</button>
38
-          <button nz-button nzType="primary" *ngIf="pharmacyRole" (click)="toPharmacy()">药房端</button>
39
-          <button nz-button nzType="primary" *ngIf="pharmacyRole" (click)="toPharmacy2()">药房端2</button>
40
-          <button nz-button nzType="primary" *ngIf="largeScreenRole" (click)="toBigScreen('largeScreen')">大屏端</button>
41
-          <button nz-button nzType="primary" *ngIf="largeScreenRole2" (click)="toBigScreen('largeScreen2')">大屏端2</button>
42
-          <button nz-button nzType="primary" *ngIf="specimenViewRole" (click)="toBigScreen('specimenView')" [nzLoading]="deptTypeLoading">业务视图</button>
43
-          <button nz-button nzType="primary" *ngIf="specimenViewRole2" (click)="toSpecimenView2()">标本视图</button>
44
-					<button nz-button nzType="primary" *ngIf="specimenRoomView" (click)="toSpecimenRoomView()">标本间端</button>
45
-					<button nz-button nzType="primary" *ngIf="pathology" (click)="toPathology()">病理科端</button>
46
-					<button nz-button nzType="primary" *ngIf="disinfectionSupplyRole" (click)="toDisinfectionSupply()">全局业务查看</button>
47
-          <button nz-button nzType="primary" *ngIf="configurationCenterRole" (click)="toConfigurationCenter()">配置中心</button>
33
+          <i class="icon_transport transport-tiaodu-fill green" *ngIf='deskRole' (click)="toFuwutai()" nz-tooltip nzTooltipTitle="调度台"></i>
34
+          <i class="icon_transport transport-hushizhihanghuligongzuo green" *ngIf="nurseRole" (click)="toHuShi()" nz-tooltip nzTooltipTitle="护士端"></i>
35
+          <i class="icon_transport transport-peizhi1 green" *ngIf="configurationCenterRole" (click)="toConfigurationCenter()" nz-tooltip nzTooltipTitle="配置中心"></i>
36
+          <i class="icon_transport transport-shangban green" *ngIf='PCCommutesToWork && userInfo.user && !userInfo.user.online' (click)="GoWork()" nz-tooltip nzTooltipTitle="我要上班"></i>
37
+          <i class="icon_transport transport-shangban green" *ngIf='PCCommutesToWork && userInfo.user && userInfo.user.online' (click)="GoWork()" nz-tooltip nzTooltipTitle="我要下班"></i>
38
+          <div class="dropdown" *ngIf="pharmacyRole || largeScreenRole || largeScreenRole2 || specimenViewRole || specimenViewRole2 || specimenRoomView || pathology || disinfectionSupplyRole">
39
+            <i class="icon_transport transport-gengduoda-copy" (mouseenter)="showDropdown1 = true" (mouseleave)="showDropdown1 = false"></i>
40
+            <div class="dropdown-content ct" [hidden]="!showDropdown1" (mouseenter)="showDropdown1 = true" (mouseleave)="showDropdown1 = false">
41
+              <div class="dropdownItem" *ngIf="pharmacyRole" (click)="toPharmacy()">药房端</div>
42
+              <div class="dropdownItem" *ngIf="pharmacyRole" (click)="toPharmacy2()">药房端2</div>
43
+              <div class="dropdownItem" *ngIf="largeScreenRole" (click)="toBigScreen('largeScreen')">大屏端</div>
44
+              <div class="dropdownItem" *ngIf="largeScreenRole2" (click)="toBigScreen('largeScreen2')">大屏端2</div>
45
+              <div class="dropdownItem" *ngIf="specimenViewRole" (click)="toBigScreen('specimenView')">业务视图</div>
46
+              <div class="dropdownItem" *ngIf="specimenViewRole2" (click)="toSpecimenView2()">标本视图</div>
47
+              <div class="dropdownItem" *ngIf="specimenRoomView" (click)="toSpecimenRoomView()">标本间端</div>
48
+              <div class="dropdownItem" *ngIf="pathology" (click)="toPathology()">病理科端</div>
49
+              <div class="dropdownItem" *ngIf="disinfectionSupplyRole" (click)="toDisinfectionSupply()">全局业务查看</div>
50
+            </div>
51
+          </div>
48 52
         </div>
49 53
         <div class="right">
50
-          <button class="mr8" nz-button nzType="primary" *ngIf='PCCommutesToWork && userInfo.user && !userInfo.user.online' (click)="GoWork()">我要上班</button>
51
-          <button class="mr8" nz-button nzType="primary" *ngIf='PCCommutesToWork && userInfo.user && userInfo.user.online' (click)="GoWork()">我要下班</button>
52
-          <!-- <div class="msg">
53
-            <div class="msgBtn display_flex align-items_center justify-content_flex-center" nz-popover [nzPopoverContent]="contentTemplate" nzPopoverPlacement="bottomRight">
54
-              <i nz-icon nzType="bell" nzTheme="outline"></i>
55
-            </div>
56
-            <ng-template #contentTemplate>
57
-              <div>
58
-                <p>消息通知</p>
59
-              </div>
60
-            </ng-template>
61
-          </div> -->
62
-          <div class="userInfo">
63
-            <div class="wel" [title]="'欢迎您,' + currentHospital.hosName + ':'">欢迎您,{{currentHospital.hosName}}:</div>
64
-            <div class="user">
54
+          <div class="userInfo dropdown">
55
+            <div class="user" (mouseenter)="showDropdown = true" (mouseleave)="showDropdown = false">
65 56
               <img src="../../assets/images/icon_keshi.png" alt="">
66
-              <span [title]="(userInfo&&userInfo.user)?userInfo.user.name:''">{{(userInfo&&userInfo.user)?userInfo.user.name:''}}</span>
57
+              <span><ng-container *ngIf="currentHospital.hosName">{{currentHospital.hosName}}-</ng-container>{{(userInfo&&userInfo.user)?userInfo.user.name:''}}</span>
58
+              <i class="icon_transport transport-xiala1 ml8"></i>
67 59
             </div>
68
-            <div class="logOut">
69
-              <span (click)="hosFlag1 = true">选择院区</span>
70
-              <span (click)="showUpPwd()">修改密码</span>
71
-              <span (click)="logOut()">退出</span>
60
+            <div class="dropdown-content r8" [hidden]="!showDropdown" (mouseenter)="showDropdown = true" (mouseleave)="showDropdown = false">
61
+              <div class="dropdownItem" (click)="selectHospital()">选择院区</div>
62
+              <div class="dropdownItem" (click)="showUpPwd()">修改密码</div>
63
+              <div class="dropdownItem" (click)="logOut()">退出</div>
72 64
             </div>
73 65
           </div>
74 66
         </div>

+ 76 - 22
src/app/views/main/main.component.less

@@ -17,9 +17,46 @@ nz-sider {
17 17
   overflow-y: auto;
18 18
 }
19 19
 
20
+// 下拉列表
21
+.dropdown{
22
+  position: relative;
23
+  height: 48px;
24
+  line-height: 48px;
25
+  .dropdown-content {
26
+    position: absolute;
27
+    top: 48px;
28
+    background-color: #fff;
29
+    width: 156px;
30
+    box-shadow: 0px 2px 4px 1px #D9D9D9;
31
+    z-index: 999999;
32
+    border-radius: 4px;
33
+    border: 1px solid rgba(0,0,0,0.15);
34
+    color: rgba(0,0,0,0.65);
35
+    &.ct{
36
+      left: 50%;
37
+      transform: translateX(-50%);
38
+    }
39
+    &.r8{
40
+      right: 8px;
41
+    }
42
+  }
43
+
44
+  .dropdown-content .dropdownItem {
45
+    height: 40px;
46
+    cursor: pointer;
47
+    display: flex;
48
+    align-items: center;
49
+    padding: 0 24px;
50
+  }
51
+
52
+  .dropdown-content .dropdownItem:hover {
53
+    background-color: #e9f7e9;
54
+  }
55
+}
56
+
20 57
 .menu-sidebar {
21
-  width: 224px;
22
-  flex: 0 0 224px;
58
+  width: 175px;
59
+  flex: 0 0 175px;
23 60
   position: relative;
24 61
   z-index: 8;
25 62
   min-height: 100vh;
@@ -79,7 +116,7 @@ nz-sider {
79 116
     box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
80 117
 
81 118
     & > i {
82
-      margin-left: 24px;
119
+      margin-left: 16px;
83 120
       margin-right: 10px;
84 121
       font-size: 14px;
85 122
     }
@@ -113,7 +150,11 @@ nz-sider {
113 150
     margin: 0;
114 151
     padding: 0;
115 152
     li {
116
-      padding-left: 48px;
153
+      white-space: nowrap;
154
+      overflow: hidden;//文本超出隐藏
155
+      text-overflow: ellipsis;//文本超出省略号替代
156
+      padding-left: 40px;
157
+      padding-right: 40px;
117 158
       transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
118 159
       box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.45) inset;
119 160
     }
@@ -123,14 +164,19 @@ nz-sider {
123 164
 
124 165
 .sidebar-logo {
125 166
   position: relative;
126
-  height: 88px;
167
+  height: 48px;
127 168
   overflow: hidden;
128
-  line-height: 64px;
169
+  line-height: 48px;
129 170
   background: #fff;
130 171
   transition: all 0.3s;
131 172
 
132
-  span {
133
-    margin-top: 8px;
173
+  .logoTitle{
174
+    padding: 0 8px;
175
+    line-height: normal;
176
+    height:100%;
177
+  }
178
+
179
+  .title {
134 180
     color: @primary-color;
135 181
     font-weight: 600;
136 182
     font-size: 13px;
@@ -147,13 +193,13 @@ nz-sider {
147 193
 nz-header.ant-layout-header {
148 194
   padding: 0;
149 195
   width: 100%;
150
-  z-index: 2;
196
+  z-index: 99;
151 197
   background: #fff;
152
-  height: 88px;
198
+  height: 48px;
153 199
 
154 200
   .app-header {
155 201
     position: relative;
156
-    height: 88px;
202
+    height: 48px;
157 203
     padding: 0;
158 204
     background: #fff;
159 205
     box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
@@ -161,10 +207,19 @@ nz-header.ant-layout-header {
161 207
     border-bottom: 1px solid rgba(0, 21, 41, 0.08);
162 208
 
163 209
     .left {
210
+      height: 100%;
164 211
       flex: 1;
165 212
       display: flex;
166
-      flex-wrap: wrap;
167 213
       align-items: center;
214
+      justify-content: flex-end;
215
+      .icon_transport{
216
+        margin-right: 24px;
217
+        cursor: pointer;
218
+        font-size: 20px;
219
+        height: 48px;
220
+        line-height: 48px;
221
+        display: inline-block;
222
+      }
168 223
       .menuLabel {
169 224
         color: #333;
170 225
         font-size: 22px;
@@ -206,10 +261,9 @@ nz-header.ant-layout-header {
206 261
       }
207 262
 
208 263
       .userInfo {
209
-        width: 260px;
210 264
         height: 100%;
211 265
         float: right;
212
-        padding: 8px 36px 8px 8px;
266
+        padding: 0 24px;
213 267
         box-sizing: border-box;
214 268
         font-size: 14px;
215 269
         border-left: 1px solid #e5e9ed;
@@ -223,22 +277,22 @@ nz-header.ant-layout-header {
223 277
 
224 278
         .user {
225 279
           overflow: hidden;
226
-          font-size: 20px;
227
-          height: 40px;
280
+          height: 48px;
228 281
           display: flex;
229 282
           justify-content: center;
230 283
           align-items: center;
284
+          font-size: 16px;
285
+          cursor: pointer;
231 286
 
232 287
           img {
233
-            width: 36px;
234
-            height: 36px;
288
+            width: 32px;
289
+            height: 32px;
235 290
             margin-right: 8px;
236 291
           }
237 292
 
238
-          span {
239
-            white-space: nowrap;
240
-            overflow: hidden;//文本超出隐藏
241
-            text-overflow: ellipsis;//文本超出省略号替代
293
+          span, .transport-xiala1 {
294
+            height: 48px;
295
+            line-height: 48px;
242 296
           }
243 297
         }
244 298
 

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

@@ -452,18 +452,20 @@ export class MainComponent implements OnInit {
452 452
     }
453 453
   }
454 454
   //获取系统设置中的科室类型
455
-  deptTypeLoading = false;
456 455
   getTypeByDept(id) {
457 456
     let postData = {
458 457
       idx: 0,
459 458
       sum: 1,
460 459
       systemConfiguration: { keyconfig: "busiViewDeptId" },
461 460
     };
462
-    this.deptTypeLoading = true;
461
+    this.maskFlag = this.msg.loading("正在加载中..", {
462
+      nzDuration: 0,
463
+    }).messageId;
463 464
     this.mainService
464 465
       .getFetchDataList("simple/data", "systemConfiguration", postData)
465 466
       .subscribe((result) => {
466
-        this.deptTypeLoading = false;
467
+        this.msg.remove(this.maskFlag);
468
+        this.maskFlag = false;
467 469
         if (result.status == 200) {
468 470
           let remember = JSON.parse(localStorage.getItem("remember"));
469 471
           window.open(
@@ -493,6 +495,15 @@ export class MainComponent implements OnInit {
493 495
     this.iShowMenuModal = false;
494 496
   }
495 497
 
498
+  // 下拉
499
+  showDropdown:boolean = false;
500
+  showDropdown1:boolean = false;
501
+
502
+  // 选择院区
503
+  selectHospital(){
504
+    this.hosFlag1 = true
505
+  }
506
+
496 507
   // 退出
497 508
   logOut(): void {
498 509
     // 假退出
@@ -504,7 +515,6 @@ export class MainComponent implements OnInit {
504 515
     }
505 516
     localStorage.removeItem("user");
506 517
     localStorage.removeItem("menu");
507
-    localStorage.removeItem("phones");
508 518
     localStorage.removeItem("index");
509 519
 
510 520
     // 假退出
@@ -517,7 +527,6 @@ export class MainComponent implements OnInit {
517 527
         }
518 528
         localStorage.removeItem("user");
519 529
         localStorage.removeItem("menu");
520
-        localStorage.removeItem("phones");
521 530
         localStorage.removeItem("index");
522 531
       }
523 532
     });

+ 1 - 1
src/app/views/other-config/other-config.component.html

@@ -18,7 +18,7 @@
18 18
   </ng-container>
19 19
   <!-- 数据字典 -->
20 20
   <ng-container *ngIf="activeTagId === 3">
21
-    <!-- <app-configuration-dictionary></app-configuration-dictionary> -->
21
+    <app-configuration-dictionary [dictionaryKeyList]="dictionaryKeyList"></app-configuration-dictionary>
22 22
   </ng-container>
23 23
 </div>
24 24
 

+ 6 - 1
src/app/views/other-config/other-config.component.ts

@@ -15,9 +15,14 @@ export class OtherConfigComponent implements OnInit, AfterViewInit {
15 15
   tagList:any = [
16 16
     { id: 1, name: '呼叫中心',},
17 17
     { id: 2, name: '微信配置',},
18
-    // { id: 3, name: '数据字典',},
18
+    { id: 3, name: '数据字典',},
19 19
   ];
20 20
 
21
+  // 数据字典
22
+  dictionaryKeyList:any[] = [
23
+    { id: 1, name: '呼叫中心分机号', key: "hjzx_cornet"},
24
+  ]
25
+
21 26
   ngOnInit(): void {}
22 27
 
23 28
   ngAfterViewInit(){

+ 3 - 1
src/app/views/other-config/other-config.module.ts

@@ -6,6 +6,7 @@ import { OtherConfigComponent } from './other-config.component';
6 6
 import { ShareModule } from 'src/app/share/share.module';
7 7
 import { ConfigurationWechatComponent } from 'src/app/components/configurationCenter/configuration-wechat/configuration-wechat.component';
8 8
 import { ConfigurationCallcenterComponent } from 'src/app/components/configurationCenter/configuration-callcenter/configuration-callcenter.component';
9
+import { ConfigurationDictionaryModule } from 'src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.module';
9 10
 
10 11
 
11 12
 @NgModule({
@@ -17,7 +18,8 @@ import { ConfigurationCallcenterComponent } from 'src/app/components/configurati
17 18
   imports: [
18 19
     CommonModule,
19 20
     OtherConfigRoutingModule,
20
-    ShareModule
21
+    ShareModule,
22
+    ConfigurationDictionaryModule,
21 23
   ]
22 24
 })
23 25
 export class OtherConfigModule { }

+ 72 - 74
src/app/views/pathology/pathology.component.ts

@@ -48,8 +48,8 @@ export class PathologyComponent implements OnInit, OnDestroy {
48 48
   })
49 49
   osComponentRef5: OverlayScrollbarsComponent;
50 50
   constructor(
51
-	private mainService: MainService, 
52
-	public router: Router, 
51
+	private mainService: MainService,
52
+	public router: Router,
53 53
 	private route: ActivatedRoute,
54 54
 	public tool: ToolService,
55 55
 	private fb: FormBuilder,
@@ -95,7 +95,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
95 95
   completedFlag = false;
96 96
   completedSearchKey = "";
97 97
   completedLoad = false;
98
-	
98
+
99 99
 	barCode:any; //条码搜索
100 100
   // other
101 101
   loginUser: any = localStorage.getItem("user")
@@ -117,7 +117,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
117 117
 	fixationModal:boolean = false //标本接收固定
118 118
 	verificationMoadl:boolean = false //标本核验
119 119
 	specimenCode:any; //标本条码
120
-	listOneData:any=[]; 
120
+	listOneData:any=[];
121 121
 	listOneLength:any;
122 122
 	pageOneIndex:any = 1;
123 123
 	pageSize:any = 10;
@@ -255,7 +255,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
255 255
       this.runTime();
256 256
     }, 500);
257 257
   }
258
-	
258
+
259 259
 	//tab切换
260 260
 	tabClick(type){
261 261
 		this.activeIndex = type
@@ -269,7 +269,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
269 269
 			this.getHospitalData()
270 270
 		}
271 271
 	}
272
-	
272
+
273 273
 	// 获取今日接收数据
274 274
 	getToday(){
275 275
 		this.mainService
@@ -284,7 +284,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
284 284
 	changeUserInp(e){
285 285
 		this.changeInpSubjectUser.next([e]);
286 286
 	}
287
-	
287
+
288 288
 	// 获取配送人
289 289
 	getUserData(e){
290 290
 		let query={
@@ -301,7 +301,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
301 301
 			this.userData = res.list
302 302
 		});
303 303
 	}
304
-	
304
+
305 305
 	// 搜索
306 306
 	search() {
307 307
 	  this.pageOneIndex = 1;
@@ -340,7 +340,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
340 340
 	      that.listOneLength = data.totalNum;
341 341
 	    });
342 342
 	}
343
-	
343
+
344 344
 	// 实时术中快速数据
345 345
 	getSpeedinessList() {
346 346
 		var that = this;
@@ -362,7 +362,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
362 362
 		    that.listTwoLength = data.totalNum;
363 363
 		  });
364 364
 	}
365
-	
365
+
366 366
 	// 打包配送
367 367
 	getPackList() {
368 368
 	  var that = this;
@@ -382,7 +382,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
382 382
 	      that.listThreeLength = data.totalNum;
383 383
 	    });
384 384
 	}
385
-	
385
+
386 386
 	// 查看
387 387
 	project:any = [];
388 388
 	oneLook(e,data){
@@ -404,7 +404,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
404 404
 			}
405 405
 		});
406 406
 	}
407
-	
407
+
408 408
 	// 关闭查看
409 409
 	closeDetail(){
410 410
 		this.listDetailMoadl = false
@@ -412,7 +412,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
412 412
 			document.getElementById('Binput').focus();
413 413
 		},200)
414 414
 	}
415
-	
415
+
416 416
 	// 接收
417 417
 	connect(){
418 418
 		this.mainService.generateBatchNumber()
@@ -427,7 +427,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
427 427
 			}
428 428
 		})
429 429
 	}
430
-	
430
+
431 431
 	// 打包
432 432
 	packaging(){
433 433
 		this.mainService.generateBatchNumber()
@@ -442,14 +442,14 @@ export class PathologyComponent implements OnInit, OnDestroy {
442 442
 			}
443 443
 		})
444 444
 	}
445
-	
445
+
446 446
 	//打包查看标本
447 447
 	threeLook(e,data){
448 448
 		localStorage.setItem("pathologyActiveIndex",this.activeIndex)
449 449
 		localStorage.setItem("dataType",'');
450 450
 		this.router.navigateByUrl(`/pathologyScan?packId=${data.id}&businessType=packagLook`);
451 451
 	}
452
-	
452
+
453 453
 	// 配送
454 454
 	distributionModal:boolean = false
455 455
 	distribution(e,data){
@@ -463,7 +463,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
463 463
 		this.handoverUserId = null
464 464
 		this.distributionModal = true
465 465
 	}
466
-	
466
+
467 467
 	// 确定配送
468 468
 	submitDistributionForm(){
469 469
 		for (const i in this.validateForm.controls) {
@@ -491,9 +491,9 @@ export class PathologyComponent implements OnInit, OnDestroy {
491 491
 		      this.message.error(data.msg)
492 492
 		    }
493 493
 		  });
494
-		
494
+
495 495
 	}
496
-	
496
+
497 497
 	// 取消配送
498 498
 	hideDistributionModal(){
499 499
 		this.distributionModal = false
@@ -501,16 +501,16 @@ export class PathologyComponent implements OnInit, OnDestroy {
501 501
 			document.getElementById('Binput').focus();
502 502
 		},200)
503 503
 	}
504
-	
504
+
505 505
 	changeHospitalInp(e){
506 506
 		// this.changeInpSubjectHospital.next([e]);
507 507
 	}
508
-	
508
+
509 509
 	changeDepartmentInp(e){
510 510
 		this.isDeptLoading = true
511 511
 		this.changeInpSubjectDepartment.next([e]);
512 512
 	}
513
-	
513
+
514 514
 	// 获取院区
515 515
 	getHospitalData(){
516 516
 		let arr = this.tool.getHospitalList().filter(i=>i.parent==undefined)
@@ -528,7 +528,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
528 528
 		//     this.hospital = res.list;
529 529
 		//   });
530 530
 	}
531
-	
531
+
532 532
 	// 选择院区
533 533
 	hospitalId:any=null;
534 534
 	changeHospDate(e){
@@ -536,7 +536,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
536 536
 		this.hospitalId = e
537 537
 		this.getDepartmentData('',e)
538 538
 	}
539
-	
539
+
540 540
 	// 获取科室
541 541
 	isDeptLoading:boolean = false;
542 542
 	getDepartmentData(e,hospital){
@@ -559,7 +559,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
559 559
 			  });
560 560
 		});
561 561
 	}
562
-	
562
+
563 563
 	// 补打
564 564
 	printModal:boolean = false;
565 565
 	parintLoading:boolean = false;
@@ -567,7 +567,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
567 567
 		this.rowData = item
568 568
 		this.printModal = true
569 569
 	}
570
-	
570
+
571 571
 	// 取消补打
572 572
 	hidePrintModal(){
573 573
 		this.printModal = false
@@ -575,7 +575,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
575 575
 			document.getElementById('Binput').focus();
576 576
 		},200)
577 577
 	}
578
-	
578
+
579 579
 	// 确定补打
580 580
 	confirmPrintDel(){
581 581
 		this.parintLoading = true
@@ -603,9 +603,9 @@ export class PathologyComponent implements OnInit, OnDestroy {
603 603
 				this.message.error(data.msg)
604 604
 			}
605 605
 		});
606
-		
606
+
607 607
 	}
608
-	
608
+
609 609
 	// 接收时间
610 610
 	startDate:any;
611 611
 	endDate:any;
@@ -614,12 +614,12 @@ export class PathologyComponent implements OnInit, OnDestroy {
614 614
 		this.endDate = format(result[1], 'yyyy-MM-dd' +' '+'23:59:59');
615 615
 		this.acceptTime = [this.startDate,this.endDate]
616 616
 	}
617
-	
617
+
618 618
 	// 获取批次号
619 619
 	generateBatchNumber(){
620 620
 
621 621
 	}
622
-	
622
+
623 623
 	// 标本条码搜索
624 624
 	errorcODEMsg:any = null
625 625
 	batchNo:any = null;
@@ -657,7 +657,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
657 657
 				})
658 658
 			}
659 659
 		})
660
-		
660
+
661 661
 	}
662 662
 	// 获取标本接收数据
663 663
 	pageReceptionIndex:any = 1;
@@ -693,7 +693,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
693 693
 				this.listReceptionLength = res.totalNum;
694 694
 		  });
695 695
 	}
696
-	
696
+
697 697
 	// 确定接收包
698 698
 	submitReceptionForm(){
699 699
 		for (const i in this.validateConnectForm.controls) {
@@ -724,7 +724,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
724 724
 		    }
725 725
 		  });
726 726
 	}
727
-	
727
+
728 728
 	// 关闭配送接收
729 729
 	hideReceptionModal(){
730 730
 		this.receptionModal = false
@@ -732,12 +732,12 @@ export class PathologyComponent implements OnInit, OnDestroy {
732 732
 			document.getElementById('Binput').focus();
733 733
 		},200)
734 734
 	}
735
-	
735
+
736 736
 	// 选择固定时间
737 737
 	formChangeDate(result){
738 738
 	  this.startDate = format(result, 'yyyy-MM-dd HH:mm:ss');
739 739
 	}
740
-	
740
+
741 741
 	// 监听人员交接接收人工号输入
742 742
 	connectUserId:any = null;
743 743
 	receptionName:any = null;
@@ -761,7 +761,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
761 761
 				}
762 762
 		  });
763 763
 	}
764
-	
764
+
765 765
 	// 监听人员交接配送人工号输入
766 766
 	dispatchingUserId:any = null;
767 767
 	dispatchingName:any = null;
@@ -785,7 +785,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
785 785
 				}
786 786
 		  });
787 787
 	}
788
-	
788
+
789 789
 	// 确定交接
790 790
 	mustReceived:any = null;
791 791
 	currReceived:any = null;
@@ -811,7 +811,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
811 811
 				this.dispatchingName = null;
812 812
 				this.dispatchingUserId = null
813 813
 			}
814
-			
814
+
815 815
 			this.receptionName = null;
816 816
 			this.connectUserId = null
817 817
 			this.connectModal = true
@@ -821,7 +821,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
821 821
 	hideConnectModal(){
822 822
 		this.connectModal = false
823 823
 	}
824
-	
824
+
825 825
 	// 确定人员交接
826 826
 	btnConnectLoading:boolean = false;
827 827
 	submitConnectForm(){
@@ -847,21 +847,21 @@ export class PathologyComponent implements OnInit, OnDestroy {
847 847
 		    }
848 848
 		  });
849 849
 	}
850
-	
850
+
851 851
 	// 确定打包
852 852
 	packModal:boolean = false;
853 853
 	submitScanForm(){
854 854
 		this.packModal = true
855 855
 		// this.hideSpecimenModal()
856 856
 	}
857
-	
857
+
858 858
 	// 确定打包并打印
859 859
 	btnPackLoading:boolean = false;
860 860
 	printData:any = [];
861 861
 	submitPackForm(){
862 862
 		let that = this
863 863
 		let data: any = {
864
-			
864
+
865 865
 		};
866 866
 
867 867
 		this.btnPackLoading = true;
@@ -889,7 +889,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
889 889
 				}
890 890
 		  });
891 891
 	}
892
-	
892
+
893 893
 	// 关闭打包并打印
894 894
 	hidePackModal(){
895 895
 		this.packModal = false
@@ -897,7 +897,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
897 897
 			document.getElementById('specimen').focus();
898 898
 		},200)
899 899
 	}
900
-	
900
+
901 901
 	// 关闭交接/打包
902 902
 	hideSpecimenModal(){
903 903
 		this.barCode = null;
@@ -907,7 +907,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
907 907
 			document.getElementById('Binput').focus();
908 908
 		},200)
909 909
 	}
910
-	
910
+
911 911
 	// 获取标本详情
912 912
 	getSampleData(item){
913 913
 		// this.isSpinning = true
@@ -928,7 +928,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
928 928
 			}
929 929
 		});
930 930
 	}
931
-	
931
+
932 932
 	// 获取科室
933 933
 	getDept(){
934 934
 		this.setSpecimen()
@@ -957,7 +957,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
957 957
 			  .subscribe((res) => {
958 958
 			    that.operationData = res.list;
959 959
 			  });
960
-				
960
+
961 961
 			that.mainService
962 962
 			  .getFetchDataList("data", "department", data2)
963 963
 			  .subscribe((res) => {
@@ -966,7 +966,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
966 966
 			  });
967 967
 		});
968 968
 	}
969
-	
969
+
970 970
 	// 获取关联科室详情
971 971
 	getDeptDetail(){
972 972
 		this.mainService
@@ -986,7 +986,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
986 986
 				}
987 987
 		  });
988 988
 	}
989
-	
989
+
990 990
 	// 获取是否关联标本间
991 991
 	setSpecimen(){
992 992
 		this.validateForm = this.fb.group({
@@ -996,7 +996,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
996 996
 		});
997 997
 		this.relevanceModal = true
998 998
 	}
999
-	
999
+
1000 1000
 	// 确定关联科室
1001 1001
 	btnLoading:boolean = false;
1002 1002
 	submitForm(){
@@ -1030,7 +1030,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1030 1030
 		    }
1031 1031
 		  });
1032 1032
 	}
1033
-	
1033
+
1034 1034
 	getNewDept(){
1035 1035
 		let postData = {
1036 1036
 		  currentHosId: this.hosId,
@@ -1056,12 +1056,12 @@ export class PathologyComponent implements OnInit, OnDestroy {
1056 1056
 		  }
1057 1057
 		});
1058 1058
 	}
1059
-	
1059
+
1060 1060
 	// 获取当前用户信息
1061 1061
 	getCurrentUserNow() {
1062 1062
 	  this.mainService.getCurrentUser1().subscribe((data:any) => {
1063 1063
 	    if (data["status"] == 200) {
1064
-				this.loginUser = data.data 
1064
+				this.loginUser = data.data
1065 1065
 	      let user = JSON.parse(localStorage.getItem("user"));
1066 1066
 	      user.user.dept = data["data"].dept;
1067 1067
 	      user.user.currentHospital = data["data"].currentHospital;
@@ -1069,7 +1069,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1069 1069
 	    }
1070 1070
 	  });
1071 1071
 	}
1072
-	
1072
+
1073 1073
 	// 输入工号查询姓名
1074 1074
 	handoverUserId:any = null;
1075 1075
 	numberChange(e){
@@ -1092,7 +1092,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1092 1092
 				}
1093 1093
 		  });
1094 1094
 	}
1095
-	
1095
+
1096 1096
 	// 提交固定标本接收
1097 1097
 	submitVerificationForm(){
1098 1098
 		for (const i in this.validateVerificationForm.controls) {
@@ -1100,7 +1100,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1100 1100
 		  this.validateVerificationForm.controls[i].updateValueAndValidity();
1101 1101
 		}
1102 1102
 		if (this.validateVerificationForm.invalid) return;
1103
-		
1103
+
1104 1104
 		let data: any = {
1105 1105
 			id:this.codeData.id,
1106 1106
 			specimenDeptId:this.validateForm.value.specimen,
@@ -1124,14 +1124,14 @@ export class PathologyComponent implements OnInit, OnDestroy {
1124 1124
 			}
1125 1125
 		});
1126 1126
 	}
1127
-	
1127
+
1128 1128
 	// 成功/失败提示框
1129 1129
 	closeModel(){
1130 1130
 		this.hideReceptionModal()
1131 1131
 		this.hideConnectModal()
1132 1132
 		this.hideSpecimenModal()
1133 1133
 	}
1134
-	
1134
+
1135 1135
 	// 关闭配送信息
1136 1136
 	hideVerificationModal(){
1137 1137
 		this.verificationMoadl = false
@@ -1145,13 +1145,13 @@ export class PathologyComponent implements OnInit, OnDestroy {
1145 1145
 		this.businessType = 'connect'
1146 1146
 		this.changeInpSubjectSpecimen.next([e]);
1147 1147
 	}
1148
-	
1148
+
1149 1149
 	// 监听交接/打包扫描条码
1150 1150
 	tableLoading:boolean = false;
1151 1151
 	codeChange(e){
1152 1152
 		this.changeInpSubject.next([e]);
1153 1153
 	}
1154
-	
1154
+
1155 1155
 	// 标本接收搜索条码
1156 1156
 	errorMsg:any = null;
1157 1157
 	searchSpecimenData(e){
@@ -1186,7 +1186,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1186 1186
 			}
1187 1187
 		})
1188 1188
 	}
1189
-	
1189
+
1190 1190
 	// 关闭多只标本
1191 1191
 	hideMultiModal(){
1192 1192
 		this.multiModal = false
@@ -1194,7 +1194,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1194 1194
 			document.getElementById('specimen').focus();
1195 1195
 		},200)
1196 1196
 	}
1197
-	
1197
+
1198 1198
 	// 监听多只标本扫描
1199 1199
 	codeMultiChange(e){
1200 1200
 		if(!e){
@@ -1223,7 +1223,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1223 1223
 			})
1224 1224
 		},500)
1225 1225
 	}
1226
-	
1226
+
1227 1227
 	// 多只标本确定接受
1228 1228
 	btnMultiLoading:boolean = false;
1229 1229
 	submitMultiForm(){
@@ -1231,7 +1231,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1231 1231
 		this.btnMultiLoading = false
1232 1232
 		this.hideMultiModal()
1233 1233
 	}
1234
-	
1234
+
1235 1235
 	pathologyLogs:any=[];
1236 1236
 	specimenList:any=[]
1237 1237
 	stepLength:any = 0;
@@ -1240,19 +1240,19 @@ export class PathologyComponent implements OnInit, OnDestroy {
1240 1240
 	// 	this.getSampleData(item)
1241 1241
 	// 	clearInterval(this.logTimer);
1242 1242
 	// 	if(type==1){
1243
-			
1243
+
1244 1244
 	// 	}else if(type==2){
1245
-			
1245
+
1246 1246
 	// 	}else{
1247
-			
1247
+
1248 1248
 	// 	}
1249 1249
 	// }
1250
-	
1250
+
1251 1251
 	closeDetailMoadl(){
1252 1252
 		this.detailMoadl = false
1253 1253
 	}
1254
-	
1255
- 
1254
+
1255
+
1256 1256
   // 自动刷新倒计时
1257 1257
   autoUpdate(flag = true) {
1258 1258
     if (flag) {
@@ -1278,7 +1278,6 @@ export class PathologyComponent implements OnInit, OnDestroy {
1278 1278
     }
1279 1279
     localStorage.removeItem("user");
1280 1280
     localStorage.removeItem("menu");
1281
-    localStorage.removeItem("phones");
1282 1281
     localStorage.removeItem("index");
1283 1282
 		localStorage.removeItem("scanCodeData");
1284 1283
 		localStorage.removeItem("dataType");
@@ -1293,7 +1292,6 @@ export class PathologyComponent implements OnInit, OnDestroy {
1293 1292
         }
1294 1293
         localStorage.removeItem("user");
1295 1294
         localStorage.removeItem("menu");
1296
-        localStorage.removeItem("phones");
1297 1295
         localStorage.removeItem("index");
1298 1296
 				localStorage.removeItem("scanCodeData");
1299 1297
 				localStorage.removeItem("dataType");
@@ -1389,7 +1387,7 @@ export class PathologyComponent implements OnInit, OnDestroy {
1389 1387
       }
1390 1388
     }, 1000);
1391 1389
   }
1392
-	
1390
+
1393 1391
 	promptModalShow:boolean = false;
1394 1392
 	promptContent:any = null;
1395 1393
 	ifSuccess:any = null;

+ 66 - 68
src/app/views/pathologyScan/pathologyScan.component.ts

@@ -48,14 +48,14 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
48 48
   })
49 49
   osComponentRef5: OverlayScrollbarsComponent;
50 50
   constructor(
51
-	private mainService: MainService, 
52
-	public router: Router, 
51
+	private mainService: MainService,
52
+	public router: Router,
53 53
 	private route: ActivatedRoute,
54 54
 	public tool: ToolService,
55 55
 	private fb: FormBuilder,
56 56
 	private message: NzMessageService,
57 57
 	private sanitizer: DomSanitizer,
58
-	
58
+
59 59
 	) {}
60 60
   // 今日药单量
61 61
   todayTotal: undefined;
@@ -96,7 +96,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
96 96
   completedFlag = false;
97 97
   completedSearchKey = "";
98 98
   completedLoad = false;
99
-	
99
+
100 100
 	barCode:any; //条码搜索
101 101
   // other
102 102
   loginUser: any = localStorage.getItem("user")
@@ -118,7 +118,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
118 118
 	fixationModal:boolean = false //标本接收固定
119 119
 	verificationMoadl:boolean = false //标本核验
120 120
 	specimenCode:any; //标本条码
121
-	listOneData:any=[]; 
121
+	listOneData:any=[];
122 122
 	listOneLength:any;
123 123
 	pageOneIndex:any = 1;
124 124
 	pageSize:any = 10;
@@ -210,7 +210,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
210 210
 			if(this.dataType=='pathologyPack'){
211 211
 				this.getJsData(4)
212 212
 			}
213
-			if(this.scanCodeData.pathologySpecimenDTOList && 
213
+			if(this.scanCodeData.pathologySpecimenDTOList &&
214 214
 			this.scanCodeData.pathologySpecimenDTOList.length>1){
215 215
 				this.muArr = []
216 216
 				for(let i of this.scanCodeData.pathologySpecimenDTOList){
@@ -219,7 +219,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
219 219
 					}
220 220
 				}
221 221
 				this.getJsData(3)
222
-			}else if(this.scanCodeData.pathologySpecimenDTOList && 
222
+			}else if(this.scanCodeData.pathologySpecimenDTOList &&
223 223
 			this.scanCodeData.pathologySpecimenDTOList.length==1){
224 224
 				this.getJsData(1)
225 225
 			}
@@ -233,9 +233,9 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
233 233
 			}
234 234
 			this.getJsData(1)
235 235
 		}
236
-		
236
+
237 237
   }
238
-	
238
+
239 239
 	// 分页
240 240
 	noType:any='none';
241 241
 	pageChange(){
@@ -248,7 +248,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
248 248
 			this.getJsData(1)
249 249
 		}
250 250
 	}
251
-	
251
+
252 252
   // 当前时间日期
253 253
   runTime() {
254 254
     clearTimeout(this.timer);
@@ -266,7 +266,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
266 266
 			document.getElementById('specimen').focus();
267 267
 		},200)
268 268
 	}
269
-	
269
+
270 270
 	// 打包
271 271
 	packaging(){
272 272
 		this.fixationModal = true
@@ -275,7 +275,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
275 275
 			document.getElementById('specimen').focus();
276 276
 		},200)
277 277
 	}
278
-	
278
+
279 279
 	// 配送
280 280
 	distributionModal:boolean = false
281 281
 	distribution(e,data){
@@ -288,14 +288,14 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
288 288
 		this.handoverUserId = null
289 289
 		this.distributionModal = true
290 290
 	}
291
-	
291
+
292 292
 	// 确定配送
293 293
 	submitDistributionForm(){
294 294
 		this.btnLoading = true
295 295
 		this.btnLoading = false
296 296
 		this.hideDistributionModal()
297 297
 	}
298
-	
298
+
299 299
 	// 取消配送
300 300
 	hideDistributionModal(){
301 301
 		this.distributionModal = false
@@ -303,23 +303,23 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
303 303
 			document.getElementById('Binput').focus();
304 304
 		},200)
305 305
 	}
306
-	
306
+
307 307
 	changeHospitalInp(e){
308 308
 		// this.changeInpSubjectHospital.next([e]);
309 309
 	}
310
-	
310
+
311 311
 	changeDepartmentInp(e){
312 312
 		// this.isDeptLoading = true
313 313
 		// this.changeInpSubjectDepartment.next([e]);
314 314
 	}
315
-	
315
+
316 316
 	// 补打
317 317
 	printModal:boolean = false;
318 318
 	parintLoading:boolean = false;
319 319
 	reprint(e,data){
320 320
 		this.printModal = true
321 321
 	}
322
-	
322
+
323 323
 	// 取消补打
324 324
 	hidePrintModal(){
325 325
 		this.printModal = false
@@ -327,7 +327,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
327 327
 			document.getElementById('Binput').focus();
328 328
 		},200)
329 329
 	}
330
-	
330
+
331 331
 	// 确定补打
332 332
 	confirmPrintDel(){
333 333
 		this.parintLoading = true
@@ -338,9 +338,9 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
338 338
 		// } else {
339 339
 		// 	this.showPromptModal("操作", false, res.msg);
340 340
 		// }
341
-		
341
+
342 342
 	}
343
-	
343
+
344 344
 	// 接收时间
345 345
 	startDate:any;
346 346
 	endDate:any;
@@ -348,12 +348,12 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
348 348
 		this.startDate = format(result[0], 'yyyy-MM-dd HH:mm:ss');
349 349
 		this.endDate = format(result[1], 'yyyy-MM-dd HH:mm:ss');
350 350
 	}
351
-	
351
+
352 352
 	// 获取批次号
353 353
 	generateBatchNumber(){
354 354
 
355 355
 	}
356
-	
356
+
357 357
 	// 获取标本接收数据
358 358
 	pageReceptionIndex:any = 1;
359 359
 	listReceptionLength:any = 0;
@@ -403,7 +403,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
403 403
 				this.listReceptionLength = res.totalNum;
404 404
 		  });
405 405
 	}
406
-	
406
+
407 407
 	// 配送中包交接完成
408 408
 	connectAccomplish(){
409 409
 		this.validateConnectForm = this.fb.group({
@@ -412,14 +412,14 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
412 412
 		});
413 413
 		this.dispatchingName = this.scanCodeData.deliveryUserDTO.name;
414 414
 		this.dispatchingUserId = this.scanCodeData.deliveryUserDTO.id
415
-		
415
+
416 416
 		this.receptionName = this.userInfo.name;
417 417
 		this.connectUserId = this.userInfo.id;
418
-		
418
+
419 419
 		this.receptionModal = true
420 420
 		this.barCode = null
421 421
 	}
422
-	
422
+
423 423
 	// 确定接收包
424 424
 	submitReceptionForm(){
425 425
 		for (const i in this.validateConnectForm.controls) {
@@ -448,17 +448,17 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
448 448
 				}
449 449
 		  });
450 450
 	}
451
-	
451
+
452 452
 	// 关闭配送接收
453 453
 	hideReceptionModal(){
454 454
 		this.receptionModal = false
455 455
 	}
456
-	
456
+
457 457
 	// 选择固定时间
458 458
 	formChangeDate(result){
459 459
 	  this.startDate = format(result, 'yyyy-MM-dd HH:mm:ss');
460 460
 	}
461
-	
461
+
462 462
 	// 监听人员交接接收人工号输入
463 463
 	connectUserId:any = null;
464 464
 	receptionName:any = null;
@@ -482,7 +482,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
482 482
 				}
483 483
 		  });
484 484
 	}
485
-	
485
+
486 486
 	// 监听人员交接配送人工号输入
487 487
 	dispatchingUserId:any = null;
488 488
 	dispatchingName:any = null;
@@ -506,7 +506,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
506 506
 				}
507 507
 		  });
508 508
 	}
509
-	
509
+
510 510
 	// 确定交接
511 511
 	mustReceived:any = null;
512 512
 	currReceived:any = null;
@@ -541,7 +541,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
541 541
 	hideConnectModal(){
542 542
 		this.connectModal = false
543 543
 	}
544
-	
544
+
545 545
 	// 确定人员交接
546 546
 	btnConnectLoading:boolean = false;
547 547
 	submitConnectForm(){
@@ -568,21 +568,21 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
568 568
 		    }
569 569
 		  });
570 570
 	}
571
-	
571
+
572 572
 	// 确定打包
573 573
 	packModal:boolean = false;
574 574
 	submitScanForm(){
575 575
 		this.packModal = true
576 576
 		// this.hideSpecimenModal()
577 577
 	}
578
-	
578
+
579 579
 	// 确定打包并打印
580 580
 	btnPackLoading:boolean = false;
581 581
 	printData:any = [];
582 582
 	submitPackForm(){
583 583
 		let that = this
584 584
 		let data: any = {
585
-			batchNo:this.batchNo, 
585
+			batchNo:this.batchNo,
586 586
 			deptId:this.deptId
587 587
 		};
588 588
 
@@ -613,7 +613,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
613 613
 				}
614 614
 		  });
615 615
 	}
616
-	
616
+
617 617
 	// 关闭打包并打印
618 618
 	hidePackModal(){
619 619
 		this.packModal = false
@@ -621,14 +621,14 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
621 621
 			document.getElementById('specimen').focus();
622 622
 		},200)
623 623
 	}
624
-	
624
+
625 625
 	// 关闭交接/打包
626 626
 	hideSpecimenModal(){
627 627
 		// 清空data
628 628
 		localStorage.setItem("scanCodeData",'')
629 629
 		this.router.navigateByUrl(`/pathology?type=detail`)
630 630
 	}
631
-	
631
+
632 632
 	// 获取标本详情
633 633
 	project:any = [];
634 634
 	getSampleData(item){
@@ -649,7 +649,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
649 649
 			}
650 650
 		});
651 651
 	}
652
-	
652
+
653 653
 	// 获取科室
654 654
 	getDept(){
655 655
 		this.setSpecimen()
@@ -678,7 +678,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
678 678
 			  .subscribe((res) => {
679 679
 			    that.operationData = res.list;
680 680
 			  });
681
-				
681
+
682 682
 			that.mainService
683 683
 			  .getFetchDataList("data", "department", data2)
684 684
 			  .subscribe((res) => {
@@ -687,7 +687,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
687 687
 			  });
688 688
 		});
689 689
 	}
690
-	
690
+
691 691
 	// 获取关联科室详情
692 692
 	getDeptDetail(){
693 693
 		this.mainService
@@ -707,7 +707,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
707 707
 				}
708 708
 		  });
709 709
 	}
710
-	
710
+
711 711
 	// 获取是否关联标本间
712 712
 	setSpecimen(){
713 713
 		this.validateForm = this.fb.group({
@@ -717,7 +717,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
717 717
 		});
718 718
 		this.relevanceModal = true
719 719
 	}
720
-	
720
+
721 721
 	// 确定关联科室
722 722
 	btnLoading:boolean = false;
723 723
 	submitForm(){
@@ -751,7 +751,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
751 751
 		    }
752 752
 		  });
753 753
 	}
754
-	
754
+
755 755
 	getNewDept(){
756 756
 		let postData = {
757 757
 		  currentHosId: this.hosId,
@@ -777,12 +777,12 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
777 777
 		  }
778 778
 		});
779 779
 	}
780
-	
780
+
781 781
 	// 获取当前用户信息
782 782
 	getCurrentUserNow() {
783 783
 	  this.mainService.getCurrentUser1().subscribe((data:any) => {
784 784
 	    if (data["status"] == 200) {
785
-				this.loginUser = data.data 
785
+				this.loginUser = data.data
786 786
 	      let user = JSON.parse(localStorage.getItem("user"));
787 787
 	      user.user.dept = data["data"].dept;
788 788
 	      user.user.currentHospital = data["data"].currentHospital;
@@ -790,7 +790,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
790 790
 	    }
791 791
 	  });
792 792
 	}
793
-	
793
+
794 794
 	// 输入工号查询姓名
795 795
 	handoverUserId:any = null;
796 796
 	numberChange(e){
@@ -813,7 +813,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
813 813
 				}
814 814
 		  });
815 815
 	}
816
-	
816
+
817 817
 	// 提交固定标本接收
818 818
 	submitVerificationForm(){
819 819
 		for (const i in this.validateVerificationForm.controls) {
@@ -821,7 +821,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
821 821
 		  this.validateVerificationForm.controls[i].updateValueAndValidity();
822 822
 		}
823 823
 		if (this.validateVerificationForm.invalid) return;
824
-		
824
+
825 825
 		let data: any = {
826 826
 			id:this.codeData.id,
827 827
 			specimenDeptId:this.validateForm.value.specimen,
@@ -845,13 +845,13 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
845 845
 			}
846 846
 		});
847 847
 	}
848
-	
848
+
849 849
 	// 成功/失败提示框
850 850
 	closeModel(){
851 851
 		localStorage.setItem("scanCodeData",'')
852 852
 		this.router.navigateByUrl(`/pathology?type=detail`);
853 853
 	}
854
-	
854
+
855 855
 	// 关闭配送信息
856 856
 	hideVerificationModal(){
857 857
 		this.verificationMoadl = false
@@ -860,13 +860,13 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
860 860
 		},200)
861 861
 	}
862 862
 
863
-	
863
+
864 864
 	// 监听交接/打包扫描条码
865 865
 	tableLoading:boolean = false;
866 866
 	codeChange(e){
867 867
 		this.changeInpSubject.next([e]);
868 868
 	}
869
-	
869
+
870 870
 	// 标本接收搜索条码
871 871
 	errorMsg:any = null;
872 872
 	searchSpecimenData(e){
@@ -916,7 +916,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
916 916
 			}
917 917
 		})
918 918
 	}
919
-	
919
+
920 920
 	// 关闭多只标本
921 921
 	hideMultiModal(){
922 922
 		localStorage.setItem("scanCodeData",'');
@@ -928,7 +928,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
928 928
 			document.getElementById('specimen').focus();
929 929
 		},200)
930 930
 	}
931
-	
931
+
932 932
 	// 监听多只标本扫描
933 933
 	codeMultiChange(e){
934 934
 		if(!e){
@@ -975,7 +975,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
975 975
 			})
976 976
 		},500)
977 977
 	}
978
-	
978
+
979 979
 	// 多只标本确定接受
980 980
 	btnMultiLoading:boolean = false;
981 981
 	submitMultiForm(){
@@ -1003,7 +1003,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1003 1003
 			},500)
1004 1004
 		});
1005 1005
 	}
1006
-	
1006
+
1007 1007
 	// 多只标本打包
1008 1008
 	submitMultiScanForm(){
1009 1009
 		let data1 = JSON.parse(localStorage.getItem("scanCodeData"))
@@ -1030,7 +1030,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1030 1030
 			},500)
1031 1031
 		});
1032 1032
 	}
1033
-	
1033
+
1034 1034
 	// 查看详情
1035 1035
 	pathologyLogs:any=[];
1036 1036
 	specimenList:any=[]
@@ -1040,19 +1040,19 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1040 1040
 		this.getSampleData(item)
1041 1041
 		clearInterval(this.logTimer);
1042 1042
 		if(type==1){
1043
-			
1043
+
1044 1044
 		}else if(type==2){
1045
-			
1045
+
1046 1046
 		}else{
1047
-			
1047
+
1048 1048
 		}
1049 1049
 	}
1050
-	
1050
+
1051 1051
 	closeDetailMoadl(){
1052 1052
 		this.detailMoadl = false
1053 1053
 	}
1054
-	
1055
- 
1054
+
1055
+
1056 1056
   // 自动刷新倒计时
1057 1057
   autoUpdate(flag = true) {
1058 1058
     if (flag) {
@@ -1078,7 +1078,6 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1078 1078
     }
1079 1079
     localStorage.removeItem("user");
1080 1080
     localStorage.removeItem("menu");
1081
-    localStorage.removeItem("phones");
1082 1081
     localStorage.removeItem("index");
1083 1082
     // 假退出
1084 1083
     this.mainService.logOut().subscribe((data) => {
@@ -1090,7 +1089,6 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1090 1089
         }
1091 1090
         localStorage.removeItem("user");
1092 1091
         localStorage.removeItem("menu");
1093
-        localStorage.removeItem("phones");
1094 1092
         localStorage.removeItem("index");
1095 1093
       }
1096 1094
     });
@@ -1183,7 +1181,7 @@ export class PathologyScanComponent implements OnInit, OnDestroy {
1183 1181
       }
1184 1182
     }, 1000);
1185 1183
   }
1186
-	
1184
+
1187 1185
 	promptModalShow:boolean = false;
1188 1186
 	promptContent:any = null;
1189 1187
 	ifSuccess:any = null;

+ 0 - 2
src/app/views/pharmacy/pharmacy.component.ts

@@ -256,7 +256,6 @@ export class PharmacyComponent implements OnInit {
256 256
     }
257 257
     localStorage.removeItem("user");
258 258
     localStorage.removeItem("menu");
259
-    localStorage.removeItem("phones");
260 259
     localStorage.removeItem("index");
261 260
 
262 261
     // 假退出
@@ -269,7 +268,6 @@ export class PharmacyComponent implements OnInit {
269 268
         }
270 269
         localStorage.removeItem("user");
271 270
         localStorage.removeItem("menu");
272
-        localStorage.removeItem("phones");
273 271
         localStorage.removeItem("index");
274 272
       }
275 273
     });

+ 0 - 2
src/app/views/pharmacy2/pharmacy2.component.ts

@@ -427,7 +427,6 @@ export class Pharmacy2Component implements OnInit, OnDestroy {
427 427
     }
428 428
     localStorage.removeItem("user");
429 429
     localStorage.removeItem("menu");
430
-    localStorage.removeItem("phones");
431 430
     localStorage.removeItem("index");
432 431
 
433 432
     // 假退出
@@ -440,7 +439,6 @@ export class Pharmacy2Component implements OnInit, OnDestroy {
440 439
         }
441 440
         localStorage.removeItem("user");
442 441
         localStorage.removeItem("menu");
443
-        localStorage.removeItem("phones");
444 442
         localStorage.removeItem("index");
445 443
       }
446 444
     });

+ 28 - 28
src/app/views/repository-manage/repository-manage.component.ts

@@ -41,7 +41,7 @@ export class RepositoryManageComponent implements OnInit {
41 41
   ) {}
42 42
   ngOnInit() {
43 43
     this.searchParentDeptSubject.pipe(debounceTime(500)).subscribe((e) => {
44
-			
44
+
45 45
     });
46 46
 		this.hosId = this.tool.getCurrentHospital().id;
47 47
     this.coopBtns = this.tool.initCoopBtns(this.route);
@@ -58,7 +58,7 @@ export class RepositoryManageComponent implements OnInit {
58 58
   validateForm: FormGroup; //新增/编辑表单
59 59
   coopId: number; //表格中执行操作的id
60 60
   department: number; //所属科室
61
-	hosId: number; 
61
+	hosId: number;
62 62
 	loadAllConsumeDept: boolean = true;//是否加载所有消耗科室
63 63
   solutionNumber; //编号
64 64
 	title; //标题
@@ -115,7 +115,7 @@ export class RepositoryManageComponent implements OnInit {
115 115
   hideDelModal1() {
116 116
     this.editModal = false;
117 117
   }
118
-	
118
+
119 119
   // 编辑保存
120 120
   confirmDel1() {
121 121
     var that = this;
@@ -180,7 +180,7 @@ export class RepositoryManageComponent implements OnInit {
180 180
         that.listLength = data.totalNum;
181 181
       });
182 182
   }
183
-	
183
+
184 184
 	// 版本号点击
185 185
 	versionsClick(data, index){
186 186
 		this.vIndex = index
@@ -192,14 +192,14 @@ export class RepositoryManageComponent implements OnInit {
192 192
 			this.richText = ''
193 193
 		}
194 194
 	}
195
-	
195
+
196 196
 	// 点击附件
197 197
 	fileClick(data){
198 198
 		console.log(222,data)
199 199
 		let a: any = document.createElement('a') // 创建一个元素
200 200
 		a.style = 'display: none' // 不能在页面中被看到,把他隐藏起来
201 201
 		a.style.height = '0px' // 给个0高度,避免影响页面布局
202
-		a.download = data.name; 
202
+		a.download = data.name;
203 203
 		a.href = data.url // 文件url地址
204 204
 		document.body.appendChild(a)  //  将其绑定在body上才能发挥作用
205 205
 		a.click() // 触发a标签的click事件
@@ -209,7 +209,7 @@ export class RepositoryManageComponent implements OnInit {
209 209
   hideModal() {
210 210
     this.modal = false;
211 211
   }
212
-	
212
+
213 213
 	// 审核通过
214 214
 	confirmDel4() {
215 215
 		let data: any = {
@@ -229,16 +229,16 @@ export class RepositoryManageComponent implements OnInit {
229 229
 				}
230 230
 			});
231 231
 	}
232
-	
232
+
233 233
 	hideDelModal4() {
234 234
 	  this.auditModal = false;
235 235
 	}
236
-	
236
+
237 237
 	// 审核驳回
238 238
 	rejectCancel(){
239 239
 		this.rejectModal = false
240 240
 	}
241
-	
241
+
242 242
 	// 审核驳回
243 243
 	rejectOk(){
244 244
 		if(this.rejectData==null){
@@ -263,11 +263,11 @@ export class RepositoryManageComponent implements OnInit {
263 263
 				}
264 264
 			});
265 265
 	}
266
-	
266
+
267 267
 	closeModel(){
268 268
 		this.hideModal()
269 269
 	}
270
-	
270
+
271 271
   // 表单提交
272 272
 	auditModal = false;
273 273
   submitForm(type): void {
@@ -279,18 +279,18 @@ export class RepositoryManageComponent implements OnInit {
279 279
 			this.rejectModal = true
280 280
 		}
281 281
   }
282
-	
282
+
283 283
 	// 升级
284 284
 	upgrade(e, data){
285 285
 		e.stopPropagation();
286 286
 		this.router.navigateByUrl(`/repositoryManageAdd/${data.id}?type=upgrade`);
287 287
 	}
288
-	
288
+
289 289
 	// 新增
290 290
 	addForm(){
291 291
 		this.router.navigateByUrl(`/repositoryManageAdd/0`);
292 292
 	}
293
-	
293
+
294 294
 	// 查看
295 295
 	look(e, data){
296 296
 		e.stopPropagation();
@@ -334,7 +334,7 @@ export class RepositoryManageComponent implements OnInit {
334 334
 				this.isSpinning = false
335 335
 			});
336 336
 	}
337
-	
337
+
338 338
 	getFile(){
339 339
 		this.mainService
340 340
 			.getPreviewImage('solution', this.rowId)
@@ -347,7 +347,7 @@ export class RepositoryManageComponent implements OnInit {
347 347
 				});
348 348
 			});
349 349
 	}
350
-	
350
+
351 351
 	// 审核
352 352
 	rowId=null;
353 353
 	audit(e, data){
@@ -375,22 +375,22 @@ export class RepositoryManageComponent implements OnInit {
375 375
 				this.detailData = data
376 376
 				this.richText = this.sanitizer.bypassSecurityTrustHtml(data[0].content);
377 377
 				for(let i of data[0].solutionLogs){
378
-					i.time = format(i.operationTime, 'yyyy-MM-dd HH:mm') 
378
+					i.time = format(i.operationTime, 'yyyy-MM-dd HH:mm')
379 379
 				}
380 380
 				this.lookData = data[0]
381 381
 				this.solutionLogs = data[0].solutionLogs
382 382
 				this.stepLength = this.solutionLogs.length
383 383
 				this.isSpinning = false
384 384
 			});
385
-	
385
+
386 386
 	}
387
-	
387
+
388 388
 	// 编辑
389 389
 	edit(e, data) {
390 390
 	  e.stopPropagation();
391 391
 	  this.router.navigateByUrl(`/repositoryManageAdd/${data.id}?type=edit`);
392 392
 	}
393
-	
393
+
394 394
 	// 停用
395 395
 	pauseModal = false;
396 396
 	pause(e, data){
@@ -398,7 +398,7 @@ export class RepositoryManageComponent implements OnInit {
398 398
 		this.pauseModal = true;
399 399
 		this.coopId = data.id;
400 400
 	}
401
-	
401
+
402 402
 	// 确认停用
403 403
 	confirmDel2() {
404 404
 	  var that = this;
@@ -419,12 +419,12 @@ export class RepositoryManageComponent implements OnInit {
419 419
 				}
420 420
 			});
421 421
 	}
422
-	
422
+
423 423
 	hideDelModal2() {
424 424
 	  this.pauseModal = false;
425 425
 	}
426
-	
427
-	
426
+
427
+
428 428
 	// 恢复
429 429
 	renewModal = false;
430 430
 	renew(e, data){
@@ -432,7 +432,7 @@ export class RepositoryManageComponent implements OnInit {
432 432
 		this.renewModal = true;
433 433
 		this.coopId = data.id;
434 434
 	}
435
-	
435
+
436 436
 	// 确认恢复
437 437
 	confirmDel3() {
438 438
 	  var that = this;
@@ -453,11 +453,11 @@ export class RepositoryManageComponent implements OnInit {
453 453
 				}
454 454
 			});
455 455
 	}
456
-	
456
+
457 457
 	hideDelModal3() {
458 458
 	  this.renewModal = false;
459 459
 	}
460
-	
460
+
461 461
 
462 462
   // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
463 463
   showPromptModal(con, success, promptInfo?) {

+ 35 - 37
src/app/views/specimen-room-view/specimen-room-view.component.ts

@@ -47,8 +47,8 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
47 47
   })
48 48
   osComponentRef5: OverlayScrollbarsComponent;
49 49
   constructor(
50
-	private mainService: MainService, 
51
-	public router: Router, 
50
+	private mainService: MainService,
51
+	public router: Router,
52 52
 	public tool: ToolService,
53 53
 	private fb: FormBuilder,
54 54
 	private message: NzMessageService,
@@ -92,7 +92,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
92 92
   completedFlag = false;
93 93
   completedSearchKey = "";
94 94
   completedLoad = false;
95
-	
95
+
96 96
 	barCode:any; //条码搜索
97 97
   // other
98 98
   loginUser: any = localStorage.getItem("user")
@@ -113,7 +113,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
113 113
 	fixationModal:boolean = false //标本接收固定
114 114
 	verificationMoadl:boolean = false //标本核验
115 115
 	specimenCode:any; //标本条码
116
-	listOfData:any=[]; 
116
+	listOfData:any=[];
117 117
 	fixativeData:any = []; //固体液类型
118 118
 	hosId:any;
119 119
 	userId:any;
@@ -161,7 +161,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
161 161
       this.runTime();
162 162
     }, 500);
163 163
   }
164
-	
164
+
165 165
 	// 标本条码搜索
166 166
 	searchSpecimen(e){
167 167
 		if(!this.barCode){
@@ -199,12 +199,12 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
199 199
 			}
200 200
 		})
201 201
 	}
202
-	
202
+
203 203
 	// 选择固定时间
204 204
 	formChangeDate(result){
205 205
 	  this.startDate = format(result, 'yyyy-MM-dd HH:mm:ss');
206 206
 	}
207
-	
207
+
208 208
 	// 确定接受固定标本
209 209
 	startDate:any;
210 210
 	submitFixationForm(){
@@ -224,7 +224,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
224 224
 			this.verificationMoadl = true
225 225
 		});
226 226
 	}
227
-	
227
+
228 228
 	// 关闭接受固定标本
229 229
 	hideSpecimenModal(){
230 230
 		this.autoUpdate()
@@ -236,7 +236,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
236 236
 			document.getElementById('Binput').focus();
237 237
 		},200)
238 238
 	}
239
-	
239
+
240 240
 	// 获取标本详情
241 241
 	project:any = [];
242 242
 	getSampleData(item){
@@ -256,7 +256,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
256 256
 		  this.detailMoadl = true
257 257
 		});
258 258
 	}
259
-	
259
+
260 260
 	// 获取科室
261 261
 	getDept(){
262 262
 		this.setSpecimen()
@@ -285,7 +285,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
285 285
 			  .subscribe((res) => {
286 286
 			    that.operationData = res.list;
287 287
 			  });
288
-				
288
+
289 289
 			that.mainService
290 290
 			  .getFetchDataList("data", "department", data2)
291 291
 			  .subscribe((res) => {
@@ -294,7 +294,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
294 294
 			  });
295 295
 		});
296 296
 	}
297
-	
297
+
298 298
 	// 获取关联科室详情
299 299
 	getDeptDetail(){
300 300
 		this.mainService
@@ -314,7 +314,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
314 314
 				}
315 315
 		  });
316 316
 	}
317
-	
317
+
318 318
 	// 获取是否关联标本间
319 319
 	setSpecimen(){
320 320
 		if(this.validateForm){
@@ -332,7 +332,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
332 332
 		}
333 333
 		this.relevanceModal = true
334 334
 	}
335
-	
335
+
336 336
 	// 确定关联科室
337 337
 	btnLoading:boolean = false;
338 338
 	submitForm(){
@@ -372,7 +372,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
372 372
 		    }
373 373
 		  });
374 374
 	}
375
-	
375
+
376 376
 	getNewDept(){
377 377
 		let postData = {
378 378
 		  currentHosId: this.hosId,
@@ -398,12 +398,12 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
398 398
 		  }
399 399
 		});
400 400
 	}
401
-	
401
+
402 402
 	// 获取当前用户信息
403 403
 	getCurrentUserNow() {
404 404
 	  this.mainService.getCurrentUser1().subscribe((data:any) => {
405 405
 	    if (data["status"] == 200) {
406
-				this.loginUser = data.data 
406
+				this.loginUser = data.data
407 407
 	      let user = JSON.parse(localStorage.getItem("user"));
408 408
 	      user.user.dept = data["data"].dept;
409 409
 	      user.user.currentHospital = data["data"].currentHospital;
@@ -411,7 +411,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
411 411
 	    }
412 412
 	  });
413 413
 	}
414
-	
414
+
415 415
 	// 输入工号查询姓名
416 416
 	handoverUserId:any = null;
417 417
 	numberChange(e){
@@ -435,7 +435,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
435 435
 				}
436 436
 		  });
437 437
 	}
438
-	
438
+
439 439
 	// 提交固定标本接收
440 440
 	submitVerificationForm(){
441 441
 		for (const i in this.validateVerificationForm.controls) {
@@ -443,7 +443,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
443 443
 		  this.validateVerificationForm.controls[i].updateValueAndValidity();
444 444
 		}
445 445
 		if (this.validateVerificationForm.invalid) return;
446
-		
446
+
447 447
 		let data: any = {
448 448
 			id:this.codeData.id,
449 449
 			specimenDeptId:this.validateForm.value.specimen,
@@ -474,7 +474,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
474 474
 			}
475 475
 		});
476 476
 	}
477
-	
477
+
478 478
 	closeModel(){
479 479
 		this.verificationMoadl = false
480 480
 		this.fixationModal = false
@@ -482,7 +482,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
482 482
 			document.getElementById('Binput').focus();
483 483
 		},200)
484 484
 	}
485
-	
485
+
486 486
 	// 关闭固定接受标本
487 487
 	hideVerificationModal(){
488 488
 		this.verificationMoadl = false
@@ -490,19 +490,19 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
490 490
 			document.getElementById('Binput').focus();
491 491
 		},200)
492 492
 	}
493
-	
493
+
494 494
 
495 495
 	// 监听标本条码
496 496
 	specimenCodeChange(e){
497 497
 		this.changeInpSubjectSpecimen.next([e]);
498 498
 	}
499
-	
499
+
500 500
 	// 监听接受固定标本条码
501 501
 	tableLoading:boolean = false;
502 502
 	codeChange(e){
503 503
 		this.changeInpSubject.next([e]);
504 504
 	}
505
-	
505
+
506 506
 	fixationError:any;
507 507
 	searchSpecimenData(e){
508 508
 		if(!e){
@@ -522,13 +522,13 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
522 522
 			this.specimenCode = null
523 523
 			if(res.status==200){
524 524
 				this.codeData = res.data[0]
525
-				this.fixationError = null 
525
+				this.fixationError = null
526 526
 			}else{
527
-				this.fixationError = res.msg 
527
+				this.fixationError = res.msg
528 528
 			}
529 529
 		})
530 530
 	}
531
-	
531
+
532 532
 	// 查看详情
533 533
 	detailMoadl:boolean = false;
534 534
 	pathologyLogs:any=[];
@@ -539,14 +539,14 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
539 539
 		this.getSampleData(item)
540 540
 		clearInterval(this.logTimer);
541 541
 		if(type==1){
542
-			
542
+
543 543
 		}else if(type==2){
544
-			
544
+
545 545
 		}else{
546
-			
546
+
547 547
 		}
548 548
 	}
549
-	
549
+
550 550
 	closeDetailMoadl(){
551 551
 		setTimeout(_=>{
552 552
 			document.getElementById('Binput').focus();
@@ -554,7 +554,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
554 554
 		this.detailMoadl = false
555 555
 		this.autoUpdate(false);
556 556
 	}
557
-	
557
+
558 558
   // 统计
559 559
   // total() {
560 560
   //   let launch = JSON.parse(localStorage.getItem("user")).user.dept.id;
@@ -578,7 +578,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
578 578
   //   console.log(item);
579 579
   //   this.router.navigateByUrl(`specimenView2/detailSample/${item.id}`);
580 580
   // }
581
-	
581
+
582 582
   // // 查看流程信息弹窗
583 583
   // logPromptModalShow = false; //弹窗开关
584 584
   // scode = ""; //查看记录携带
@@ -815,7 +815,6 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
815 815
     }
816 816
     localStorage.removeItem("user");
817 817
     localStorage.removeItem("menu");
818
-    localStorage.removeItem("phones");
819 818
     localStorage.removeItem("index");
820 819
     // 假退出
821 820
     this.mainService.logOut().subscribe((data) => {
@@ -827,7 +826,6 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
827 826
         }
828 827
         localStorage.removeItem("user");
829 828
         localStorage.removeItem("menu");
830
-        localStorage.removeItem("phones");
831 829
         localStorage.removeItem("index");
832 830
       }
833 831
     });
@@ -914,7 +912,7 @@ export class SpecimenRoomViewComponent implements OnInit, OnDestroy {
914 912
       }
915 913
     }, 1000);
916 914
   }
917
-	
915
+
918 916
 	promptModalShow:boolean = false;
919 917
 	promptContent:any = null;
920 918
 	ifSuccess:any = null;

+ 0 - 2
src/app/views/specimen-view2/specimen-view2.component.ts

@@ -461,7 +461,6 @@ export class SpecimenView2Component implements OnInit, OnDestroy {
461 461
     }
462 462
     localStorage.removeItem("user");
463 463
     localStorage.removeItem("menu");
464
-    localStorage.removeItem("phones");
465 464
     localStorage.removeItem("index");
466 465
     // 假退出
467 466
     this.mainService.logOut().subscribe((data) => {
@@ -473,7 +472,6 @@ export class SpecimenView2Component implements OnInit, OnDestroy {
473 472
         }
474 473
         localStorage.removeItem("user");
475 474
         localStorage.removeItem("menu");
476
-        localStorage.removeItem("phones");
477 475
         localStorage.removeItem("index");
478 476
       }
479 477
     });

+ 3 - 3
src/app/views/users-management/users-management.component.ts

@@ -257,7 +257,7 @@ export class UsersManagementComponent implements OnInit {
257 257
     let groupData = {
258 258
       group2: {
259 259
         hospitals: hid,
260
-        type:1
260
+        typeIds: '1,3',
261 261
       },
262 262
       idx: 0,
263 263
       sum: 9999,
@@ -303,7 +303,7 @@ export class UsersManagementComponent implements OnInit {
303 303
     let groupData = {
304 304
       group2: {
305 305
         hospitals: id,
306
-        type:1
306
+        typeIds: '1,3',
307 307
       },
308 308
       idx: 0,
309 309
       sum: 9999,
@@ -469,7 +469,7 @@ export class UsersManagementComponent implements OnInit {
469 469
     let groupData = {
470 470
       group2: {
471 471
         hospitals: hid,
472
-        type:1
472
+        typeIds: '1,3',
473 473
       },
474 474
       idx: 0,
475 475
       sum: 9999,

+ 164 - 3
src/assets/iconfont/demo_index.html

@@ -55,6 +55,42 @@
55 55
           <ul class="icon_lists dib-box">
56 56
           
57 57
             <li class="dib">
58
+              <span class="icon icon_transport">&#xe7ba;</span>
59
+                <div class="name">护士执行护理工作</div>
60
+                <div class="code-name">&amp;#xe7ba;</div>
61
+              </li>
62
+          
63
+            <li class="dib">
64
+              <span class="icon icon_transport">&#xe6bb;</span>
65
+                <div class="name">配置</div>
66
+                <div class="code-name">&amp;#xe6bb;</div>
67
+              </li>
68
+          
69
+            <li class="dib">
70
+              <span class="icon icon_transport">&#xe659;</span>
71
+                <div class="name">筛选</div>
72
+                <div class="code-name">&amp;#xe659;</div>
73
+              </li>
74
+          
75
+            <li class="dib">
76
+              <span class="icon icon_transport">&#xe695;</span>
77
+                <div class="name">home_title_class</div>
78
+                <div class="code-name">&amp;#xe695;</div>
79
+              </li>
80
+          
81
+            <li class="dib">
82
+              <span class="icon icon_transport">&#xe6b5;</span>
83
+                <div class="name">调度-fill</div>
84
+                <div class="code-name">&amp;#xe6b5;</div>
85
+              </li>
86
+          
87
+            <li class="dib">
88
+              <span class="icon icon_transport">&#xe657;</span>
89
+                <div class="name">护士</div>
90
+                <div class="code-name">&amp;#xe657;</div>
91
+              </li>
92
+          
93
+            <li class="dib">
58 94
               <span class="icon icon_transport">&#xe62b;</span>
59 95
                 <div class="name">下载</div>
60 96
                 <div class="code-name">&amp;#xe62b;</div>
@@ -841,6 +877,12 @@
841 877
               </li>
842 878
           
843 879
             <li class="dib">
880
+              <span class="icon icon_transport">&#xeeed;</span>
881
+                <div class="name">更多</div>
882
+                <div class="code-name">&amp;#xeeed;</div>
883
+              </li>
884
+          
885
+            <li class="dib">
844 886
               <span class="icon icon_transport">&#xe633;</span>
845 887
                 <div class="name">搜索</div>
846 888
                 <div class="code-name">&amp;#xe633;</div>
@@ -906,9 +948,9 @@
906 948
 <pre><code class="language-css"
907 949
 >@font-face {
908 950
   font-family: 'icon_transport';
909
-  src: url('iconfont.woff2?t=1724726830485') format('woff2'),
910
-       url('iconfont.woff?t=1724726830485') format('woff'),
911
-       url('iconfont.ttf?t=1724726830485') format('truetype');
951
+  src: url('iconfont.woff2?t=1729066208752') format('woff2'),
952
+       url('iconfont.woff?t=1729066208752') format('woff'),
953
+       url('iconfont.ttf?t=1729066208752') format('truetype');
912 954
 }
913 955
 </code></pre>
914 956
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -935,6 +977,60 @@
935 977
         <ul class="icon_lists dib-box">
936 978
           
937 979
           <li class="dib">
980
+            <span class="icon icon_transport transport-hushizhihanghuligongzuo"></span>
981
+            <div class="name">
982
+              护士执行护理工作
983
+            </div>
984
+            <div class="code-name">.transport-hushizhihanghuligongzuo
985
+            </div>
986
+          </li>
987
+          
988
+          <li class="dib">
989
+            <span class="icon icon_transport transport-peizhi1"></span>
990
+            <div class="name">
991
+              配置
992
+            </div>
993
+            <div class="code-name">.transport-peizhi1
994
+            </div>
995
+          </li>
996
+          
997
+          <li class="dib">
998
+            <span class="icon icon_transport transport-shaixuan"></span>
999
+            <div class="name">
1000
+              筛选
1001
+            </div>
1002
+            <div class="code-name">.transport-shaixuan
1003
+            </div>
1004
+          </li>
1005
+          
1006
+          <li class="dib">
1007
+            <span class="icon icon_transport transport-shangban"></span>
1008
+            <div class="name">
1009
+              home_title_class
1010
+            </div>
1011
+            <div class="code-name">.transport-shangban
1012
+            </div>
1013
+          </li>
1014
+          
1015
+          <li class="dib">
1016
+            <span class="icon icon_transport transport-tiaodu-fill"></span>
1017
+            <div class="name">
1018
+              调度-fill
1019
+            </div>
1020
+            <div class="code-name">.transport-tiaodu-fill
1021
+            </div>
1022
+          </li>
1023
+          
1024
+          <li class="dib">
1025
+            <span class="icon icon_transport transport-hushi"></span>
1026
+            <div class="name">
1027
+              护士
1028
+            </div>
1029
+            <div class="code-name">.transport-hushi
1030
+            </div>
1031
+          </li>
1032
+          
1033
+          <li class="dib">
938 1034
             <span class="icon icon_transport transport-xiazai"></span>
939 1035
             <div class="name">
940 1036
               下载
@@ -2114,6 +2210,15 @@
2114 2210
           </li>
2115 2211
           
2116 2212
           <li class="dib">
2213
+            <span class="icon icon_transport transport-gengduoda-copy"></span>
2214
+            <div class="name">
2215
+              更多
2216
+            </div>
2217
+            <div class="code-name">.transport-gengduoda-copy
2218
+            </div>
2219
+          </li>
2220
+          
2221
+          <li class="dib">
2117 2222
             <span class="icon icon_transport transport-sousuo"></span>
2118 2223
             <div class="name">
2119 2224
               搜索
@@ -2214,6 +2319,54 @@
2214 2319
           
2215 2320
             <li class="dib">
2216 2321
                 <svg class="icon svg-icon" aria-hidden="true">
2322
+                  <use xlink:href="#transport-hushizhihanghuligongzuo"></use>
2323
+                </svg>
2324
+                <div class="name">护士执行护理工作</div>
2325
+                <div class="code-name">#transport-hushizhihanghuligongzuo</div>
2326
+            </li>
2327
+          
2328
+            <li class="dib">
2329
+                <svg class="icon svg-icon" aria-hidden="true">
2330
+                  <use xlink:href="#transport-peizhi1"></use>
2331
+                </svg>
2332
+                <div class="name">配置</div>
2333
+                <div class="code-name">#transport-peizhi1</div>
2334
+            </li>
2335
+          
2336
+            <li class="dib">
2337
+                <svg class="icon svg-icon" aria-hidden="true">
2338
+                  <use xlink:href="#transport-shaixuan"></use>
2339
+                </svg>
2340
+                <div class="name">筛选</div>
2341
+                <div class="code-name">#transport-shaixuan</div>
2342
+            </li>
2343
+          
2344
+            <li class="dib">
2345
+                <svg class="icon svg-icon" aria-hidden="true">
2346
+                  <use xlink:href="#transport-shangban"></use>
2347
+                </svg>
2348
+                <div class="name">home_title_class</div>
2349
+                <div class="code-name">#transport-shangban</div>
2350
+            </li>
2351
+          
2352
+            <li class="dib">
2353
+                <svg class="icon svg-icon" aria-hidden="true">
2354
+                  <use xlink:href="#transport-tiaodu-fill"></use>
2355
+                </svg>
2356
+                <div class="name">调度-fill</div>
2357
+                <div class="code-name">#transport-tiaodu-fill</div>
2358
+            </li>
2359
+          
2360
+            <li class="dib">
2361
+                <svg class="icon svg-icon" aria-hidden="true">
2362
+                  <use xlink:href="#transport-hushi"></use>
2363
+                </svg>
2364
+                <div class="name">护士</div>
2365
+                <div class="code-name">#transport-hushi</div>
2366
+            </li>
2367
+          
2368
+            <li class="dib">
2369
+                <svg class="icon svg-icon" aria-hidden="true">
2217 2370
                   <use xlink:href="#transport-xiazai"></use>
2218 2371
                 </svg>
2219 2372
                 <div class="name">下载</div>
@@ -3262,6 +3415,14 @@
3262 3415
           
3263 3416
             <li class="dib">
3264 3417
                 <svg class="icon svg-icon" aria-hidden="true">
3418
+                  <use xlink:href="#transport-gengduoda-copy"></use>
3419
+                </svg>
3420
+                <div class="name">更多</div>
3421
+                <div class="code-name">#transport-gengduoda-copy</div>
3422
+            </li>
3423
+          
3424
+            <li class="dib">
3425
+                <svg class="icon svg-icon" aria-hidden="true">
3265 3426
                   <use xlink:href="#transport-sousuo"></use>
3266 3427
                 </svg>
3267 3428
                 <div class="name">搜索</div>

+ 31 - 3
src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
1 1
 @font-face {
2 2
   font-family: "icon_transport"; /* Project id 4543613 */
3
-  src: url('iconfont.woff2?t=1724726830485') format('woff2'),
4
-       url('iconfont.woff?t=1724726830485') format('woff'),
5
-       url('iconfont.ttf?t=1724726830485') format('truetype');
3
+  src: url('iconfont.woff2?t=1729066208752') format('woff2'),
4
+       url('iconfont.woff?t=1729066208752') format('woff'),
5
+       url('iconfont.ttf?t=1729066208752') format('truetype');
6 6
 }
7 7
 
8 8
 .icon_transport {
@@ -13,6 +13,30 @@
13 13
   -moz-osx-font-smoothing: grayscale;
14 14
 }
15 15
 
16
+.transport-hushizhihanghuligongzuo:before {
17
+  content: "\e7ba";
18
+}
19
+
20
+.transport-peizhi1:before {
21
+  content: "\e6bb";
22
+}
23
+
24
+.transport-shaixuan:before {
25
+  content: "\e659";
26
+}
27
+
28
+.transport-shangban:before {
29
+  content: "\e695";
30
+}
31
+
32
+.transport-tiaodu-fill:before {
33
+  content: "\e6b5";
34
+}
35
+
36
+.transport-hushi:before {
37
+  content: "\e657";
38
+}
39
+
16 40
 .transport-xiazai:before {
17 41
   content: "\e62b";
18 42
 }
@@ -537,6 +561,10 @@
537 561
   content: "\ea66";
538 562
 }
539 563
 
564
+.transport-gengduoda-copy:before {
565
+  content: "\eeed";
566
+}
567
+
540 568
 .transport-sousuo:before {
541 569
   content: "\e633";
542 570
 }

+ 0 - 0
src/assets/iconfont/iconfont.js


部分文件因为文件数量过多而无法显示