Browse Source

解决冲突

maotao 8 months ago
parent
commit
b05302338e
44 changed files with 5112 additions and 52 deletions
  1. 8 0
      src/app/app-routing.module.ts
  2. 22 0
      src/app/guard/ConfigurationCenter.guard.ts
  3. 0 1
      src/app/pipes/data-to-name.pipe.ts
  4. 7 1
      src/app/services/main.service.ts
  5. 44 0
      src/app/services/tool.service.ts
  6. 82 0
      src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.html
  7. 331 0
      src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.less
  8. 259 0
      src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.ts
  9. 3 0
      src/app/share/share.module.ts
  10. 14 0
      src/app/views/assets-info/assets-info-routing.module.ts
  11. 231 0
      src/app/views/assets-info/assets-info.component.html
  12. 176 0
      src/app/views/assets-info/assets-info.component.less
  13. 432 0
      src/app/views/assets-info/assets-info.component.ts
  14. 19 0
      src/app/views/assets-info/assets-info.module.ts
  15. 14 0
      src/app/views/assets-product-management/assets-product-management-routing.module.ts
  16. 192 0
      src/app/views/assets-product-management/assets-product-management.component.html
  17. 179 0
      src/app/views/assets-product-management/assets-product-management.component.less
  18. 388 0
      src/app/views/assets-product-management/assets-product-management.component.ts
  19. 19 0
      src/app/views/assets-product-management/assets-product-management.module.ts
  20. 18 0
      src/app/views/configuration-center/configuration-center-routing.module.ts
  21. 371 0
      src/app/views/configuration-center/configuration-center.component.html
  22. 388 0
      src/app/views/configuration-center/configuration-center.component.less
  23. 1049 0
      src/app/views/configuration-center/configuration-center.component.ts
  24. 19 0
      src/app/views/configuration-center/configuration-center.module.ts
  25. 3 3
      src/app/views/fuwutai/fuwutai.component.less
  26. 18 0
      src/app/views/main/main-routing.module.ts
  27. 3 23
      src/app/views/main/main.component.html
  28. 1 0
      src/app/views/main/main.component.less
  29. 14 0
      src/app/views/main/main.component.ts
  30. 1 0
      src/app/views/medical-waste-batch-out-of-storage/medical-waste-batch-out-of-storage.component.ts
  31. 14 0
      src/app/views/tripartite-company/tripartite-company-routing.module.ts
  32. 131 0
      src/app/views/tripartite-company/tripartite-company.component.html
  33. 176 0
      src/app/views/tripartite-company/tripartite-company.component.less
  34. 266 0
      src/app/views/tripartite-company/tripartite-company.component.ts
  35. 19 0
      src/app/views/tripartite-company/tripartite-company.module.ts
  36. 21 17
      src/app/views/unit-management/unit-management.component.ts
  37. 118 3
      src/assets/iconfont/demo_index.html
  38. 23 3
      src/assets/iconfont/iconfont.css
  39. 1 1
      src/assets/iconfont/iconfont.js
  40. 35 0
      src/assets/iconfont/iconfont.json
  41. BIN
      src/assets/iconfont/iconfont.ttf
  42. BIN
      src/assets/iconfont/iconfont.woff
  43. BIN
      src/assets/iconfont/iconfont.woff2
  44. 3 0
      src/common.less

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

@@ -13,6 +13,8 @@ import { PharmacyGuard } from './guard/pharmacy.guard';
13 13
 import { SpecimenView2Guard } from './guard/SpecimenView2Guard.guard';
14 14
 // 全局业务查看权限
15 15
 import { DisinfectionSupplyGuard } from './guard/DisinfectionSupplyGuard.guard';
16
+// 配置中心查看权限
17
+import { ConfigurationCenterGuard } from './guard/ConfigurationCenter.guard';
16 18
 
17 19
 const routes: Routes = [
18 20
   // 默认
@@ -73,6 +75,12 @@ const routes: Routes = [
73 75
     loadChildren: () => import('./views/disinfection-supply/disinfection-supply.module').then(m => m.DisinfectionSupplyModule),
74 76
     canActivate: [DisinfectionSupplyGuard]
75 77
   },
78
+  // 配置中心查看
79
+  {
80
+    path: 'configurationCenter',
81
+    loadChildren: () => import('./views/configuration-center/configuration-center.module').then(m => m.ConfigurationCenterModule),
82
+    canActivate: [ConfigurationCenterGuard]
83
+  },
76 84
   // 问卷预览
77 85
   {
78 86
     path: "preview",

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

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

+ 0 - 1
src/app/pipes/data-to-name.pipe.ts

@@ -6,7 +6,6 @@ import { Pipe, PipeTransform } from '@angular/core';
6 6
 export class DataToNamePipe implements PipeTransform {
7 7
 
8 8
   transform(value: any[], ...args: any[]): any {
9
-    console.log(args)
10 9
     if(Array.isArray(value)){
11 10
       return value.map(v => v[args[0]]).join(args[1]);
12 11
     }else{

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

@@ -833,11 +833,17 @@ export class MainService {
833 833
 	    headers: this.headers,
834 834
 	  });
835 835
 	}
836
-	
836
+  // 配置中心
837
+	incidentPost(type, data): any {
838
+	  return this.http.post(host.host + "/incident/" + type, data, {
839
+	    headers: this.headers,
840
+	  });
841
+	}
837 842
 	// 发药批次-配置科室数据
838 843
 	getConsumeDept(data): any {
839 844
 	  return this.http.post(host.host + "/infusion/solutions/getConsumeDept", data, {
840 845
 	    headers: this.headers,
841 846
 	  });
842 847
 	}
848
+
843 849
 }

+ 44 - 0
src/app/services/tool.service.ts

@@ -188,6 +188,9 @@ export class ToolService {
188 188
 				case "upgrade":
189 189
 				  coopBtns.upgrade = true; //升级
190 190
 				  break;
191
+        case "commonFault":
192
+          coopBtns.commonFault = true; //常见故障
193
+          break;
191 194
       }
192 195
     });
193 196
     console.log(coopBtns);
@@ -241,4 +244,45 @@ export class ToolService {
241 244
     }
242 245
     return res;
243 246
   }
247
+
248
+  /**
249
+   * @description: 扁平化结构转成树形结构-ng-zorro树形结构专用
250
+   * @param {*} list 扁平化的数组
251
+   * @param {*} rootValue 顶级parentKeyName的值
252
+   * @param {*} parentKeyName 父级字段名称
253
+   * @param {*} keyName 字段名称
254
+   * @return {*} 返回树形结构
255
+   * @author: seimin
256
+   */
257
+  tranListToTreeDataLeaf(list:Array<any>, rootValue:any, parentKeyName:string, keyName:string = 'id'):Array<any> {
258
+    return list.filter((t) => {
259
+      let children = this.tranListToTreeData(list, t[keyName], parentKeyName, keyName);
260
+      if(!children.length){
261
+        t.isLeaf = true;
262
+      }
263
+      return t[parentKeyName] === rootValue
264
+      ? (t.children = children)
265
+      : false
266
+    });
267
+  }
268
+
269
+  /**
270
+   * @description: 树形结构根据id回显-ng-zorro树形结构专用
271
+   * @param {*} list 扁平化的数组
272
+   * @param {*} rootValue 顶级parentKeyName的值
273
+   * @param {*} parentKeyName 父级字段名称
274
+   * @param {*} keyName 字段名称
275
+   * @return {*} 返回树形结构
276
+   * @author: seimin
277
+   */
278
+  tranListToTreeDataFindIdsLeaf(tree: Array<any>, id: number, arr = []):Array<number> {
279
+    let list = this.tranTreeToListData(tree);
280
+    console.log(list)
281
+    let obj = list.find(v => v.id === id);
282
+    arr.unshift(id);
283
+    if(obj.parentId){
284
+      this.tranListToTreeDataFindIdsLeaf(tree, obj.parentId, arr);
285
+    }
286
+    return arr;
287
+  }
244 288
 }

+ 82 - 0
src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.html

@@ -0,0 +1,82 @@
1
+<div class="modal display_flex justify-content_flex-center align-items_center" *ngIf="show">
2
+  <div class="modalBody">
3
+    <div class="title">常见故障配置<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="list-template content">
5
+      <div class="list-template__content">
6
+        <div class="list-template__top" nz-row>
7
+          <div nz-col nzXl='19' class="list-template__searchBox">
8
+
9
+          </div>
10
+          <div nz-col nzLg="5" class="list-template__btns">
11
+            <button nz-button class="btn default mr8" (click)="addModal()">新增</button>
12
+          </div>
13
+        </div>
14
+        <div class="list-template__bottom">
15
+          <nz-table class="hospitalTable list-template__nzTable" [nzData]="historySpecimenList" nzSize="middle" [nzShowPagination]="false"
16
+            [nzLoading]="hsLoading" [nzScroll]="{ y: '506px' }">
17
+            <thead>
18
+              <tr class="thead">
19
+                <th nzWidth="25%">关联故障现象</th>
20
+                <th nzWidth="25%">别名</th>
21
+                <th nzWidth="25%">状态</th>
22
+                <th nzWidth="25%">操作</th>
23
+              </tr>
24
+            </thead>
25
+            <tbody>
26
+              <tr *ngFor="let data of historySpecimenList;let i = index;">
27
+                <td>{{ data.incidentCategoryDTO?.category }}</td>
28
+                <td>{{ data.alias }}</td>
29
+                <td>{{ data.status?.name }}</td>
30
+                <td>
31
+                  <div class="coop">
32
+                    <span (click)="showDelModal($event, data,'您确认要删除吗?','删除','del')">删除</span>
33
+                    <span (click)="showDelModal($event, data, data.status.value == 1 ? '您确认要停用吗?' : '您确认要启动吗?', data.status.value == 1 ? '停用' : '启用', 'switch', data.status.value == 1)">{{data.status.value == 1 ? '停用' : '启用'}}</span>
34
+                    <span (click)="edit($event, data)">编辑</span>
35
+                  </div>
36
+                </td>
37
+              </tr>
38
+            </tbody>
39
+          </nz-table>
40
+        </div>
41
+      </div>
42
+    </div>
43
+    <div class="display_flex justify-content_flex-center">
44
+      <button class="btn know" nz-button nzType="primary" (click)="hideModal()">
45
+        知道了
46
+      </button>
47
+    </div>
48
+  </div>
49
+</div>
50
+
51
+<!-- 新增/编辑模态框 -->
52
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modal">
53
+  <div class="modalBody">
54
+    <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideAddModal()"></i></div>
55
+    <div class="content">
56
+      <form nz-form [formGroup]="validateForm" class="addForm">
57
+        <nz-form-item>
58
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="incidentCategoryId">故障现象</nz-form-label>
59
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择故障现象!">
60
+            <nz-cascader [nzOptions]="incidentCategoryList" formControlName="incidentCategoryId" nzPlaceHolder="请选择故障现象"></nz-cascader>
61
+          </nz-form-control>
62
+        </nz-form-item>
63
+        <nz-form-item>
64
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="alias">别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名</nz-form-label>
65
+          <nz-form-control [nzSpan]="19" nzErrorTip="请输入别名!">
66
+            <nz-input-group>
67
+                <input formControlName="alias" nz-input placeholder="请输入别名">
68
+            </nz-input-group>
69
+          </nz-form-control>
70
+        </nz-form-item>
71
+      </form>
72
+    </div>
73
+    <div class="display_flex justify-content_flex-center">
74
+      <button nzType="primary" nz-button (click)="submitAddForm()" [nzLoading]="btnLoading">确认</button>
75
+      <button class="btn cancel" nz-button nzType="default" (click)="hideAddModal()">取消</button>
76
+    </div>
77
+  </div>
78
+</div>
79
+
80
+<!-- 模态框 -->
81
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
82
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>

+ 331 - 0
src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.less

@@ -0,0 +1,331 @@
1
+@import "../../../../src/theme.less";
2
+.list-template__top{
3
+  padding: 8px 0!important;
4
+}
5
+
6
+.modal {
7
+  position: fixed;
8
+  left: 0;
9
+  top: 0;
10
+  width: 100%;
11
+  height: 100%;
12
+  background: rgba(0, 0, 0, 0.4);
13
+  z-index: 99;
14
+  .hospitalTable {
15
+    width: 100%;
16
+    padding: 0;
17
+    td {
18
+      text-align: center !important;
19
+    }
20
+    .thead {
21
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
22
+      th {
23
+        text-align: center !important;
24
+        color: #fff;
25
+        background: transparent;
26
+      }
27
+    }
28
+  }
29
+
30
+  .modalBody {
31
+    width: 950px;
32
+    min-height: 220px;
33
+    background: #fff;
34
+    border-radius: 5px;
35
+    padding: 10px 20px;
36
+    color: #333;
37
+    &.modalBody-search {
38
+      width: 480px;
39
+      min-height: 250px;
40
+    }
41
+
42
+    .title {
43
+      width: 100%;
44
+      text-align: center;
45
+      font-size: 18px;
46
+      position: relative;
47
+
48
+      i {
49
+        position: absolute;
50
+        right: 0;
51
+        top: 0;
52
+        font-size: 20px;
53
+        color: #666;
54
+        cursor: pointer;
55
+        padding: 0 5px;
56
+      }
57
+    }
58
+
59
+    .list-template{
60
+      padding: 0!important;
61
+    }
62
+
63
+    .list-template__bottom{
64
+      border: none!important;
65
+      padding: 0!important;
66
+    }
67
+
68
+    .content {
69
+      min-height: 117px;
70
+      background: #f9fafb;
71
+      border: 1px solid #e5e9ed;
72
+      border-radius: 5px;
73
+      overflow: hidden;
74
+      margin-top: 12px;
75
+      display: flex;
76
+      flex-direction: column;
77
+      justify-content: center;
78
+      // align-items: center;
79
+      &.content-search {
80
+        min-height: 147px;
81
+        justify-content: start;
82
+        .defeat-search {
83
+          width: 100%;
84
+          height: 52px;
85
+          display: flex;
86
+          justify-content: center;
87
+          align-items: center;
88
+          border-bottom: solid 1px #e5e9ed;
89
+          em {
90
+            color: #666;
91
+            font-style: normal;
92
+          }
93
+        }
94
+        .form {
95
+          width: 100%;
96
+          padding: 0 16px;
97
+          .ant-form-item-label,
98
+          .ant-form-explain {
99
+            text-align: left !important;
100
+          }
101
+        }
102
+      }
103
+
104
+      div {
105
+        margin: 0;
106
+      }
107
+      button{
108
+        margin-top: 0!important;
109
+        margin-left: 0!important;
110
+      }
111
+      .formItem{
112
+        text-align: left!important;
113
+      }
114
+    }
115
+
116
+    button {
117
+      margin-top: 10px;
118
+
119
+      &.btn {
120
+        margin-left: 8px;
121
+      }
122
+    }
123
+  }
124
+
125
+  // 新增
126
+  &.add {
127
+    .modalBody {
128
+      width: 480px;
129
+      height: auto;
130
+
131
+      .content {
132
+        width: 100%;
133
+        height: auto;
134
+        padding: 18px 14px 0 14px;
135
+
136
+        .addForm {
137
+          .ant-form-item {
138
+            margin-bottom: 15px;
139
+
140
+            .ant-form-item-label {
141
+              line-height: 0;
142
+            }
143
+          }
144
+        }
145
+
146
+        .editForm {
147
+          .ant-form-item {
148
+            margin-bottom: 15px;
149
+
150
+            .ant-form-item-label {
151
+              line-height: 0;
152
+            }
153
+          }
154
+        }
155
+      }
156
+
157
+      button {
158
+        &:nth-child(1) {
159
+          margin-right: 20px;
160
+        }
161
+      }
162
+    }
163
+  }
164
+}
165
+
166
+.save {
167
+  position: fixed;
168
+  left: 0;
169
+  top: 0;
170
+  width: 100%;
171
+  height: 100%;
172
+  background: rgba(0, 0, 0, 0.4);
173
+  z-index: 99;
174
+
175
+  .modalBody {
176
+    width: 350px;
177
+    background: #fff;
178
+    border-radius: 5px;
179
+    padding: 10px 20px;
180
+    color: #333;
181
+
182
+    .title {
183
+      width: 100%;
184
+      text-align: center;
185
+      font-size: 18px;
186
+      position: relative;
187
+
188
+      i {
189
+        position: absolute;
190
+        right: 0;
191
+        top: 0;
192
+        font-size: 20px;
193
+        color: #666;
194
+        cursor: pointer;
195
+        padding: 0 5px;
196
+      }
197
+    }
198
+
199
+    .content {
200
+      width: 310px;
201
+      background: #f9fafb;
202
+      border: 1px solid #e5e9ed;
203
+      border-radius: 5px;
204
+      overflow: hidden;
205
+      margin-top: 12px;
206
+      padding: 16px 0;
207
+
208
+      .busyList{
209
+        display: flex;
210
+        margin-bottom: 8px;
211
+        .busyContent{
212
+          margin-right: 8px;
213
+          flex: 1;
214
+        }
215
+      }
216
+
217
+      & > div {
218
+        text-align: center;
219
+        margin: 0;
220
+
221
+        &.icon {
222
+          // margin-top: 17px;
223
+
224
+          i {
225
+            color: #34b349;
226
+            font-size: 30px !important;
227
+
228
+            &.transport-wenhao {
229
+              color: #f5a523;
230
+            }
231
+
232
+            &.transport-shibai {
233
+              color: #ff3a52;
234
+            }
235
+          }
236
+        }
237
+
238
+        &.defeat {
239
+          color: #333;
240
+          font-size: 14px;
241
+        }
242
+
243
+        &:nth-child(3) {
244
+          font-size: 14px;
245
+          color: #666;
246
+        }
247
+      }
248
+      .workAssignmentTips {
249
+        font-size: 12px;
250
+      }
251
+    }
252
+
253
+    button {
254
+      margin-top: 10px;
255
+
256
+      &.btn {
257
+        margin-left: 8px;
258
+      }
259
+    }
260
+  }
261
+
262
+  // 新增
263
+  &.add {
264
+    .modalBody {
265
+      width: 480px;
266
+      height: auto;
267
+
268
+      .content {
269
+        width: 100%;
270
+        height: auto;
271
+        padding: 16px;
272
+        max-height: 497px;
273
+        overflow-y: auto;
274
+
275
+        .addForm {
276
+          .ant-form-item {
277
+            margin-bottom: 0;
278
+
279
+            .ant-form-item-label {
280
+              text-align: left;
281
+            }
282
+
283
+            .desc {
284
+              margin-top: 5px;
285
+            }
286
+          }
287
+
288
+          .datesControl {
289
+            margin-top: -16px;
290
+
291
+            .ant-form-item-label {
292
+              line-height: 40px;
293
+            }
294
+          }
295
+
296
+          .timer {
297
+            .ant-form-item-label {
298
+              width: 100%;
299
+              text-align: left;
300
+            }
301
+
302
+            .numInp {
303
+              margin-right: 5px;
304
+            }
305
+
306
+            .line {
307
+              margin-right: 5px;
308
+            }
309
+          }
310
+
311
+          .timer2 {
312
+            .ant-form-item-label {
313
+              line-height: 20px;
314
+            }
315
+          }
316
+        }
317
+
318
+        .editForm {
319
+          .ant-form-item {
320
+            margin-bottom: 15px;
321
+
322
+            .ant-form-item-label {
323
+              line-height: 14px;
324
+              text-align: left;
325
+            }
326
+          }
327
+        }
328
+      }
329
+    }
330
+  }
331
+}

+ 259 - 0
src/app/share/assets-product-management-prompt-modal/assets-product-management-prompt-modal.component.ts

@@ -0,0 +1,259 @@
1
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
2
+import { MainService } from '../../services/main.service';
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { FormGroup, Validators, FormBuilder } from '@angular/forms';
6
+
7
+@Component({
8
+  selector: 'app-assets-product-management-prompt-modal',
9
+  templateUrl: './assets-product-management-prompt-modal.component.html',
10
+  styleUrls: ['./assets-product-management-prompt-modal.component.less']
11
+})
12
+export class AssetsProductManagementPromptModalComponent implements OnInit {
13
+  // 切换科室,切换弹窗
14
+  hsLoading = false;
15
+  historySpecimenList: any = [];
16
+
17
+  currentHospital; //当前院区
18
+  @Input() show: Boolean;
19
+  @Input() id: Number;
20
+
21
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
22
+
23
+  constructor(
24
+    private mainService: MainService,
25
+    private tool: ToolService,
26
+    private message: NzMessageService,
27
+    private fb: FormBuilder,
28
+  ) { }
29
+
30
+  ngOnInit() {
31
+    this.currentHospital = this.tool.getCurrentHospital();
32
+    this.getList();
33
+    this.getIncidentCategoryList();
34
+  }
35
+
36
+  // 获取故障现象
37
+  incidentCategoryList:any[] = [];
38
+  getIncidentCategoryList(){
39
+    if(!this.currentHospital.type || (this.currentHospital.type && this.currentHospital.type.value !== '6')){
40
+      this.incidentCategoryList = [];
41
+      return;
42
+    };
43
+    let postData = {
44
+      category: {
45
+        dutyIds: this.currentHospital.type.value === '6' ? this.currentHospital.id.toString()  : undefined,
46
+      },
47
+    };
48
+    this.mainService.incidentPost("listIncidentCategory", postData).subscribe(res => {
49
+      let incidentCategoryList = res.data || [];
50
+      incidentCategoryList = incidentCategoryList.map(v => ({...v, parentId: v.parent ? v.parent.id : undefined, label: v.category, value: v.id}));
51
+      this.incidentCategoryList = this.tool.tranListToTreeDataLeaf(incidentCategoryList, undefined, "parentId");
52
+      console.log(this.incidentCategoryList);
53
+    })
54
+  }
55
+
56
+  // 编辑
57
+  edit(e, data) {
58
+    e.stopPropagation();
59
+    console.log(data);
60
+    this.initForm();
61
+    this.modelName = "编辑";
62
+    this.add = false;
63
+    this.modal = true;
64
+    this.coopData = data;
65
+    this.validateForm.controls.alias.setValue(data.alias);
66
+    this.validateForm.controls.incidentCategoryId.setValue(this.tool.tranListToTreeDataFindIdsLeaf(this.incidentCategoryList, data.incidentCategoryId));
67
+  }
68
+
69
+  // 新增弹框
70
+  modelName = ""; //模态框名称
71
+  modal: boolean = false; //新增/编辑模态框
72
+  add: boolean; //true:新增;false:编辑
73
+  validateForm: FormGroup; //新增/编辑表单
74
+  coopData: any; //当前操作列
75
+  addModal() {
76
+    this.modelName = "新增";
77
+    this.add = true; //新增
78
+    this.modal = true;
79
+    this.initForm();
80
+  }
81
+  //关闭新增/编辑弹框
82
+  hideAddModal() {
83
+    this.modal = false;
84
+    this.initForm();
85
+  }
86
+
87
+  // 初始化新增form表单
88
+  initForm() {
89
+    this.validateForm = this.fb.group({
90
+      alias: ['', [Validators.required, Validators.pattern(/\S/)]],
91
+      incidentCategoryId: [null, [Validators.required]],
92
+    });
93
+  }
94
+
95
+  // 新增/编辑表单提交
96
+  btnLoading:boolean = false;
97
+  submitAddForm(): void {
98
+    for (const i in this.validateForm.controls) {
99
+      this.validateForm.controls[i].markAsDirty();
100
+      this.validateForm.controls[i].updateValueAndValidity();
101
+    }
102
+    if (this.validateForm.invalid) {
103
+      return;
104
+    }
105
+
106
+    console.log(this.validateForm.value)
107
+
108
+    this.btnLoading = true;
109
+    let postData:any = {};
110
+
111
+    if (this.add) {
112
+      //增加
113
+      postData = {
114
+        // assetProductIncidentCategory: {
115
+          hosId: this.currentHospital.id,
116
+          alias: this.validateForm.value.alias,
117
+          productId: this.id,
118
+          incidentCategoryId: this.validateForm.value.incidentCategoryId.length ? this.validateForm.value.incidentCategoryId.slice(-1)[0] : undefined,
119
+        // }
120
+      };
121
+    } else {
122
+      //编辑
123
+      postData = {
124
+        // assetProductIncidentCategory:{
125
+          ...this.coopData,
126
+          ...{
127
+            hosId: this.currentHospital.id,
128
+            alias: this.validateForm.value.alias,
129
+            productId: this.id,
130
+            incidentCategoryId: this.validateForm.value.incidentCategoryId.length ? this.validateForm.value.incidentCategoryId.slice(-1)[0] : undefined,
131
+          }
132
+        // }
133
+      };
134
+    }
135
+    console.log(postData);
136
+    this.mainService
137
+      .simplePost("addData", "assetProductIncidentCategory", postData)
138
+      .subscribe((result) => {
139
+        this.btnLoading = false;
140
+        this.hideAddModal();
141
+        let msg = "";
142
+        if (this.add) {
143
+          msg = "新增";
144
+        } else {
145
+          msg = "修改";
146
+        }
147
+        if (result.status == 200) {
148
+          this.showPromptModal(msg, true, "");
149
+        } else {
150
+          this.showPromptModal(msg, false, result.msg);
151
+        }
152
+      });
153
+  }
154
+
155
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
156
+  promptContent: string; //操作提示框提示信息
157
+  ifSuccess: boolean; //操作成功/失败
158
+  promptInfo: string; //操作结果提示信息
159
+  promptModalShow: boolean; //操作提示框是否展示
160
+  showPromptModal(con, success, promptInfo?) {
161
+    this.promptModalShow = false;
162
+    this.promptContent = con;
163
+    this.ifSuccess = success;
164
+    this.promptInfo = promptInfo;
165
+    setTimeout(() => {
166
+      this.promptModalShow = true;
167
+    }, 100);
168
+    this.getList();
169
+  }
170
+
171
+  delModal: boolean = false; //删除模态框
172
+  tipsMsg1: string; //提示框信息
173
+  tipsMsg2: string; //操作后信息
174
+  confirmDelType: string; //确认的类型(启用/停用,删除)
175
+  confirmDelIsSwitch: boolean; //启用/停用
176
+  showDelModal(
177
+    e,
178
+    data,
179
+    tipsMsg1: string,
180
+    tipsMsg2: string,
181
+    type: string,
182
+    isSwitch?: boolean
183
+  ) {
184
+    e.stopPropagation();
185
+    this.confirmDelIsSwitch = isSwitch;
186
+    this.confirmDelType = type;
187
+    this.delModal = true;
188
+    this.coopData = data;
189
+    this.tipsMsg1 = tipsMsg1;
190
+    this.tipsMsg2 = tipsMsg2;
191
+  }
192
+  // 隐藏删除框
193
+  hideDelModal() {
194
+    this.delModal = false;
195
+  }
196
+  // 确认删除
197
+  confirmDel() {
198
+    this.btnLoading = true;
199
+    if (this.confirmDelType === "del") {
200
+      //删除
201
+      this.mainService
202
+        .simplePost("rmvData", "assetProductIncidentCategory", [this.coopData.id])
203
+        .subscribe((data) => {
204
+          this.btnLoading = false;
205
+          this.delModal = false;
206
+          if (data.status == 200) {
207
+            this.showPromptModal(this.tipsMsg2, true, "");
208
+          } else {
209
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
210
+          }
211
+        });
212
+    } else if (this.confirmDelType === "switch") {
213
+      //启用/停用
214
+      let postData = {
215
+        // assetProductIncidentCategory:{
216
+          ...this.coopData,
217
+          ...{
218
+            status: { key: 'product_category_status', value: this.confirmDelIsSwitch ? '0' : '1' },
219
+          }
220
+        // }
221
+      };
222
+      console.log(postData);
223
+      this.mainService
224
+        .simplePost("addData", "assetProductIncidentCategory", postData)
225
+        .subscribe((data) => {
226
+          this.btnLoading = false;
227
+          this.delModal = false;
228
+          if (data.status == 200) {
229
+            this.showPromptModal(this.tipsMsg2, true, "");
230
+          } else {
231
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
232
+          }
233
+        });
234
+    }
235
+  }
236
+
237
+  // 关闭弹窗
238
+  hideModal() {
239
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
240
+  }
241
+  // 获取列表数据
242
+  getList() {
243
+    let postData = {
244
+      idx: 0,
245
+      sum: 9999,
246
+      assetProductIncidentCategory: {
247
+        productId: this.id,
248
+        hosId: this.currentHospital.id,
249
+      }
250
+    }
251
+    this.hsLoading = true;
252
+    this.mainService.getFetchDataList("data", "assetProductIncidentCategory", postData).subscribe(data => {
253
+      this.hsLoading = false;
254
+      this.historySpecimenList = data.list || [];
255
+    })
256
+  }
257
+}
258
+
259
+

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

@@ -13,6 +13,7 @@ import { HsPromptModalComponent } from './hs-prompt-modal/hs-prompt-modal.compon
13 13
 import { HistoryPromptModalComponent } from './history-prompt-modal/history-prompt-modal.component';
14 14
 import { InspectionConfigurationItemPromptModalComponent } from './inspection-configuration-item-prompt-modal/inspection-configuration-item-prompt-modal.component';
15 15
 import { InspectionAddressDepartmentPromptModalComponent } from './inspection-address-department-prompt-modal/inspection-address-department-prompt-modal.component';
16
+import { AssetsProductManagementPromptModalComponent } from './assets-product-management-prompt-modal/assets-product-management-prompt-modal.component';
16 17
 import { InspectionTemplatePromptModalComponent } from './inspection-template-prompt-modal/inspection-template-prompt-modal.component';
17 18
 import { InspectionAddressTagPromptModalComponent } from './inspection-address-tag-prompt-modal/inspection-address-tag-prompt-modal.component';
18 19
 import { InspectionExecuteAssignPromptModalComponent } from './inspection-execute-assign-prompt-modal/inspection-execute-assign-prompt-modal.component';
@@ -70,6 +71,7 @@ import { wangEditorComponent } from './wang-editor/wang-editor.component';
70 71
     HistoryPromptModalComponent,
71 72
     InspectionConfigurationItemPromptModalComponent,
72 73
     InspectionAddressDepartmentPromptModalComponent,
74
+    AssetsProductManagementPromptModalComponent,
73 75
     InspectionTemplatePromptModalComponent,
74 76
     InspectionAddressTagPromptModalComponent,
75 77
     InspectionExecuteAssignPromptModalComponent,
@@ -132,6 +134,7 @@ import { wangEditorComponent } from './wang-editor/wang-editor.component';
132 134
     HistoryPromptModalComponent,
133 135
     InspectionConfigurationItemPromptModalComponent,
134 136
     InspectionAddressDepartmentPromptModalComponent,
137
+    AssetsProductManagementPromptModalComponent,
135 138
     InspectionTemplatePromptModalComponent,
136 139
     InspectionAddressTagPromptModalComponent,
137 140
     InspectionExecuteAssignPromptModalComponent,

+ 14 - 0
src/app/views/assets-info/assets-info-routing.module.ts

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

+ 231 - 0
src/app/views/assets-info/assets-info.component.html

@@ -0,0 +1,231 @@
1
+<div class="list-template">
2
+  <div class="list-template__content">
3
+    <div class="list-template__top" nz-row>
4
+      <div nz-col nzXl='16' class="list-template__searchBox">
5
+        <div class="list-template__searchItem">
6
+          <span class="label" style="width: 100px;">资产编码|SN号</span>:
7
+          <input nz-input class="formItem" placeholder="请输入资产编码|SN号" [(ngModel)]="searchDto.searchKey" />
8
+        </div>
9
+        <div class="list-template__searchItem">
10
+          <span class="label">资产名称</span>:
11
+          <input nz-input class="formItem" placeholder="请输入资产名称" [(ngModel)]="searchDto.name" />
12
+        </div>
13
+        <div class="list-template__searchItem">
14
+          <span class="label">状态</span>:
15
+          <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzAllowClear nzPlaceHolder="请选择状态" [(ngModel)]="searchDto.status">
16
+            <ng-container *ngFor="let option of dispatchMethods">
17
+              <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
18
+            </ng-container>
19
+            <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
20
+              <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
21
+            </nz-option>
22
+          </nz-select>
23
+        </div>
24
+        <div class="list-template__searchItem">
25
+          <span class="label">使用科室</span>:
26
+          <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
27
+            (nzOnSearch)="changeInp('search', 'department', $event)" nzAllowClear nzPlaceHolder="请选择使用科室" [(ngModel)]="searchDto.deptId">
28
+            <ng-container *ngFor="let option of departmentSearchList">
29
+              <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
30
+            </ng-container>
31
+            <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
32
+              <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
33
+            </nz-option>
34
+          </nz-select>
35
+        </div>
36
+      </div>
37
+      <div nz-col nzLg="8" class="list-template__btns">
38
+        <button nz-button class="btn default ml8" (click)='search()'>搜索</button>
39
+        <button nz-button class="btn default ml8" (click)='reset()'>重置</button>
40
+        <button nz-button *ngIf="coopBtns.add" class="btn default ml8" (click)="addModal()">新增</button>
41
+      </div>
42
+    </div>
43
+    <div class="list-template__bottom">
44
+      <nz-table class="list-template__nzTable" [nzData]="listOfData" nzSize="middle" [nzShowPagination]="false"
45
+        [nzLoading]="loading1">
46
+        <thead>
47
+          <tr class="thead">
48
+            <th nzWidth="12%">资产编号|SN号</th>
49
+            <th nzWidth="11%">资产名称</th>
50
+            <th nzWidth="11%">存放位置</th>
51
+            <th nzWidth="11%">状态</th>
52
+            <th nzWidth="11%">入库时间|有效期至</th>
53
+            <th nzWidth="11%">关联产品</th>
54
+            <th nzWidth="11%">供应商</th>
55
+            <th nzWidth="11%">使用科室</th>
56
+            <th nzWidth="11%">责任部门</th>
57
+          </tr>
58
+        </thead>
59
+        <tbody>
60
+          <tr *ngFor="let data of listOfData;let i = index">
61
+            <td>{{data.code}}<br>{{data.snCode}}</td>
62
+            <td>{{data.name}}</td>
63
+            <td>{{data.buildDTO?.buildingName}}{{data.floorDTO?.floorName}}{{data.address}}</td>
64
+            <td>{{data.status?.name}}</td>
65
+            <td>{{data.inTime| date:'yyyy-MM-dd'}}<br>{{data.overTime| date:'yyyy-MM-dd'}}</td>
66
+            <td>{{data.assetProductDTO?.name}}</td>
67
+            <td>{{data.supplierDTO?.name}}</td>
68
+            <td>{{data.deptDTO?.dept}}</td>
69
+            <td>{{data.duty?.hosName}}</td>
70
+          </tr>
71
+        </tbody>
72
+      </nz-table>
73
+      <div class="list-template__pagination">
74
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="listLength" [(nzPageSize)]="pageSize" nzShowSizeChanger
75
+          (nzPageIndexChange)="getList(0)" (nzPageSizeChange)="getList(0)">
76
+        </nz-pagination>
77
+      </div>
78
+    </div>
79
+  </div>
80
+
81
+  <!-- 新增/编辑模态框 -->
82
+  <div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modal">
83
+    <div class="modalBody">
84
+      <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideAddModal()"></i></div>
85
+      <div class="content">
86
+        <form nz-form [formGroup]="validateForm" class="addForm">
87
+          <nz-form-item>
88
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="code">资产编码</nz-form-label>
89
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入资产编码!">
90
+              <nz-input-group>
91
+                  <input formControlName="code" nz-input placeholder="请输入资产编码">
92
+              </nz-input-group>
93
+            </nz-form-control>
94
+          </nz-form-item>
95
+          <nz-form-item>
96
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="snCode">SN号</nz-form-label>
97
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入SN号!">
98
+              <nz-input-group>
99
+                  <input formControlName="snCode" nz-input placeholder="请输入SN号">
100
+              </nz-input-group>
101
+            </nz-form-control>
102
+          </nz-form-item>
103
+          <nz-form-item>
104
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="productId">关联产品</nz-form-label>
105
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择关联产品!">
106
+              <nz-select (nzOnSearch)="changeInp('add', 'assetProduct', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch formControlName="productId" nzPlaceHolder="请选择关联产品" (ngModelChange)="changeAssetProduct($event)" (nzOpenChange)="changeInp('add', 'assetProduct', '')">
107
+                <ng-container *ngFor="let option of assetProductList">
108
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
109
+                </ng-container>
110
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
111
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
112
+                </nz-option>
113
+              </nz-select>
114
+            </nz-form-control>
115
+          </nz-form-item>
116
+          <nz-form-item>
117
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="name">资产名称</nz-form-label>
118
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入资产名称!">
119
+              <nz-input-group>
120
+                  <input formControlName="name" nz-input placeholder="请输入资产名称">
121
+              </nz-input-group>
122
+            </nz-form-control>
123
+          </nz-form-item>
124
+          <nz-form-item>
125
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="buildId">存放位置</nz-form-label>
126
+            <nz-form-control [nzSpan]="9" nzErrorTip="请选择楼栋!">
127
+              <nz-select (nzOnSearch)="changeInp('add', 'building', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="buildId" nzPlaceHolder="请选择楼栋" (ngModelChange)="changeBuilding($event)">
128
+                <ng-container *ngFor="let option of buildingAddList">
129
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.buildingName" [nzValue]="option.id"></nz-option>
130
+                </ng-container>
131
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
132
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
133
+                </nz-option>
134
+              </nz-select>
135
+            </nz-form-control>
136
+            <nz-form-control [nzSpan]="9" [nzPush]="1" nzErrorTip="请选择楼层!">
137
+              <nz-select (nzOnSearch)="changeInp('add', 'floor', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="floorId" nzPlaceHolder="请选择楼层">
138
+                <ng-container *ngFor="let option of floorList">
139
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.floorName" [nzValue]="option.id"></nz-option>
140
+                </ng-container>
141
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
142
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
143
+                </nz-option>
144
+              </nz-select>
145
+            </nz-form-control>
146
+          </nz-form-item>
147
+          <nz-form-item>
148
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="address">具体位置</nz-form-label>
149
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入具体位置!">
150
+              <nz-input-group>
151
+                  <input formControlName="address" nz-input placeholder="请输入具体位置">
152
+              </nz-input-group>
153
+            </nz-form-control>
154
+          </nz-form-item>
155
+          <nz-form-item>
156
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="status">状态</nz-form-label>
157
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择状态!">
158
+              <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="status" nzShowSearch
159
+                nzPlaceHolder="请选择状态" nzServerSearch>
160
+                <ng-container *ngFor="let data of dispatchMethods">
161
+                  <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
162
+                </ng-container>
163
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
164
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
165
+                </nz-option>
166
+              </nz-select>
167
+            </nz-form-control>
168
+          </nz-form-item>
169
+          <nz-form-item>
170
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="brand">品牌</nz-form-label>
171
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入品牌!">
172
+              <nz-input-group>
173
+                  <input formControlName="brand" nz-input placeholder="请输入品牌">
174
+              </nz-input-group>
175
+            </nz-form-control>
176
+          </nz-form-item>
177
+          <nz-form-item>
178
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="supplierId">供应商</nz-form-label>
179
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择供应商!">
180
+              <nz-select [nzDropdownMatchSelectWidth]="false" nzAllowClear formControlName="supplierId" nzPlaceHolder="请选择供应商">
181
+                <ng-container *ngFor="let option of companyList">
182
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
183
+                </ng-container>
184
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
185
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
186
+                </nz-option>
187
+              </nz-select>
188
+            </nz-form-control>
189
+          </nz-form-item>
190
+          <nz-form-item>
191
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="deptId">使用科室</nz-form-label>
192
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择使用科室!">
193
+              <nz-select (nzOnSearch)="changeInp('add', 'department', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="deptId" nzPlaceHolder="请选择使用科室" (nzOpenChange)="changeInp('add', 'department', '')">
194
+                <ng-container *ngFor="let option of departmentAddList">
195
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
196
+                </ng-container>
197
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
198
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
199
+                </nz-option>
200
+              </nz-select>
201
+            </nz-form-control>
202
+          </nz-form-item>
203
+          <nz-form-item>
204
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="dutyId">责任部门</nz-form-label>
205
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择责任部门!">
206
+              <nz-select (nzOnSearch)="changeInp('add', 'hospital', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="dutyId" nzPlaceHolder="请选择责任部门" (nzOpenChange)="changeInp('add', 'hospital', '')">
207
+                <ng-container *ngFor="let option of dutyList">
208
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
209
+                </ng-container>
210
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
211
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
212
+                </nz-option>
213
+              </nz-select>
214
+            </nz-form-control>
215
+          </nz-form-item>
216
+        </form>
217
+      </div>
218
+      <div class="display_flex justify-content_flex-center">
219
+        <button nzType="primary" nz-button (click)="submitForm()" [nzLoading]="btnLoading">确认</button>
220
+        <button class="btn cancel" nz-button nzType="default" (click)="hideAddModal()">取消</button>
221
+      </div>
222
+    </div>
223
+  </div>
224
+  <!-- 模态框 -->
225
+  <app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
226
+    (confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
227
+</div>
228
+<!-- 操作成功/失败提示框 -->
229
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
230
+  [info]="promptInfo">
231
+</app-prompt-modal>

+ 176 - 0
src/app/views/assets-info/assets-info.component.less

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

+ 432 - 0
src/app/views/assets-info/assets-info.component.ts

@@ -0,0 +1,432 @@
1
+import { Component, OnInit } from "@angular/core";
2
+import { ActivatedRoute, Router } from "@angular/router";
3
+import { FormBuilder, Validators, FormGroup } from "@angular/forms";
4
+
5
+import { MainService } from "../../services/main.service";
6
+import { ToolService } from "../../services/tool.service";
7
+import { NzMessageService } from 'ng-zorro-antd';
8
+import { Subject } from 'rxjs';
9
+import { debounceTime } from 'rxjs/operators';
10
+@Component({
11
+  selector: "app-assets-info",
12
+  templateUrl: "./assets-info.component.html",
13
+  styleUrls: ["./assets-info.component.less"],
14
+})
15
+export class AssetsInfoComponent implements OnInit {
16
+  constructor(
17
+    private fb: FormBuilder,
18
+    private mainService: MainService,
19
+    private route: ActivatedRoute,
20
+    private router: Router,
21
+    private tool: ToolService,
22
+    private message: NzMessageService,
23
+  ) {}
24
+
25
+  listOfData: any[] = []; //表格数据
26
+  pageIndex: number = 1; //表格当前页码
27
+  pageSize: number = 10; //表格每页展示条数
28
+  listLength: number = 10; //表格总数据量
29
+  modal: boolean = false; //新增/编辑模态框
30
+  add: boolean; //true:新增;false:编辑
31
+  validateForm: FormGroup; //新增/编辑表单
32
+  coopData: any; //当前操作列
33
+  currentHospital; //当前院区
34
+
35
+  btnLoading: boolean = false; //提交按钮loading状态
36
+
37
+  promptContent: string; //操作提示框提示信息
38
+  ifSuccess: boolean; //操作成功/失败
39
+  promptInfo: string; //操作结果提示信息
40
+  promptModalShow: boolean; //操作提示框是否展示
41
+  nextSchemeName = ""; //下一个开启的方案名称
42
+  modelName = ""; //模态框名称
43
+
44
+  changeInpSubject = new Subject(); //防抖
45
+  showDropdown:boolean = false;
46
+
47
+  ngOnInit() {
48
+    //防抖
49
+    this.changeInpSubject.pipe(debounceTime(500)).subscribe((v) => {
50
+      if(v[1] === 'department'){
51
+        this.getDeparts(v[0], v[2]);
52
+      } else if(v[1] === 'building'){
53
+        this.getBuildings(v[0], v[2]);
54
+      } else if(v[1] === 'floor'){
55
+        this.getFloors(v[0], v[2], this.validateForm.value.buildId);
56
+      } else if(v[1] === 'assetProduct'){
57
+        this.getAssetProductList(v[0], v[2]);
58
+      } else if(v[1] === 'hospital'){
59
+        this.getDutyList(v[0], v[2]);
60
+      }
61
+    });
62
+    this.currentHospital = this.tool.getCurrentHospital();
63
+    this.coopBtns = this.tool.initCoopBtns(this.route);
64
+    this.getList(1);
65
+    this.getDeparts('search', '');
66
+    this.getDeparts('add', '');
67
+    this.getAssetProductList('add', '');
68
+    this.getDutyList('add', '');
69
+    this.getBuildings('add', '');
70
+    this.getDispatchMethods();
71
+  }
72
+
73
+  // 初始化增删改按钮
74
+  coopBtns: any = {};
75
+
76
+  // 搜索
77
+  search() {
78
+    this.getList(1);
79
+  }
80
+  // 重置
81
+  reset() {
82
+    this.searchDto = {};
83
+    this.getList(1);
84
+  }
85
+
86
+  // 表格数据
87
+  searchDto: any = {};
88
+  loading1 = false;
89
+  getList(type) {
90
+    if (type == 1) {
91
+      this.pageIndex = 1;
92
+    }
93
+    let data = {
94
+      idx: this.pageIndex - 1,
95
+      sum: this.pageSize,
96
+      asset: {
97
+        hosId: this.currentHospital.id,
98
+        ...this.searchDto,
99
+      },
100
+    };
101
+    data.asset.status = data.asset.status ? { id: data.asset.status } : undefined;
102
+    this.loading1 = true;
103
+    this.mainService
104
+      .getFetchDataList("simple/data", "asset", data)
105
+      .subscribe((data) => {
106
+        this.loading1 = false;
107
+        if (data.status == 200) {
108
+          this.listOfData = data.list;
109
+          this.listLength = data.totalNum;
110
+        }else{
111
+          this.message.error(data.msg || "请求数据失败");
112
+        }
113
+      });
114
+  }
115
+
116
+  // 新增弹框
117
+  addModal() {
118
+    this.modelName = "新增";
119
+    this.add = true; //新增
120
+    this.modal = true;
121
+    this.initForm();
122
+  }
123
+  //关闭新增/编辑弹框
124
+  hideAddModal() {
125
+    this.modal = false;
126
+    this.initForm();
127
+  }
128
+
129
+  // 初始化新增form表单
130
+  initForm() {
131
+    this.floorList = [];
132
+    this.validateForm = this.fb.group({
133
+      code: ['', [Validators.required, Validators.pattern(/\S/)]],
134
+      snCode: ['', [Validators.required, Validators.pattern(/\S/)]],
135
+      productId: [null, [Validators.required]],
136
+      name: ['', [Validators.required, Validators.pattern(/\S/)]],
137
+      buildId: [null, [Validators.required]],
138
+      floorId: [null, [Validators.required]],
139
+      address: ['', [Validators.required, Validators.pattern(/\S/)]],
140
+      status: [null, [Validators.required]],
141
+      brand: ['', [Validators.required, Validators.pattern(/\S/)]],
142
+      supplierId: [null, [Validators.required]],
143
+      deptId: [null, [Validators.required]],
144
+      dutyId: [null, [Validators.required]],
145
+    });
146
+  }
147
+
148
+  // 边输边搜节流阀
149
+  isLoading = false;
150
+  changeInp(type, model, e) {
151
+    this.isLoading = true;
152
+    this.changeInpSubject.next([type, model, e]);
153
+  }
154
+
155
+  // 获取产品列表
156
+  assetProductList: any = [];
157
+  getAssetProductList(type, keyword, init = false) {
158
+    let postData:any = {
159
+      assetProduct: {
160
+        name: keyword,
161
+        hosId: this.currentHospital.id,
162
+      },
163
+      idx: 0,
164
+      sum: 20,
165
+    };
166
+    this.mainService
167
+      .getFetchDataList("simple/data", "assetProduct", postData)
168
+      .subscribe((data) => {
169
+        this.assetProductList = data.list || [];
170
+
171
+        this.isLoading = false;
172
+      });
173
+  }
174
+
175
+  // 获取所有科室
176
+  departmentAddList: any = []; //所有所属科室
177
+  departmentSearchList: any = []; //所有所属科室(搜索)
178
+  getDeparts(type, keyword, init = false) {
179
+    let postData:any = {
180
+      department: {
181
+        // searchType: 1,// 简单查询
182
+        dept: keyword,
183
+        cascadeHosId: this.currentHospital.id,
184
+      },
185
+      idx: 0,
186
+      sum: 20,
187
+    };
188
+    this.mainService
189
+      .getFetchDataList("data", "department", postData)
190
+      .subscribe((data) => {
191
+        if (type == "search") {
192
+          this.departmentSearchList = data.list;
193
+        } else if (type == "add") {
194
+          this.departmentAddList = data.list;
195
+        }
196
+
197
+        this.isLoading = false;
198
+      });
199
+  }
200
+
201
+  // 获取供应商
202
+  companyList: any = [];
203
+
204
+  // 获取责任部门
205
+  dutyList: any = [];
206
+  getDutyList(type, keyword, init = false) {
207
+    let postData:any = {
208
+      hospital: {
209
+        hosName: keyword,
210
+        type: { key: 'hospital_type', value: '6' },
211
+      },
212
+      idx: 0,
213
+      sum: 9999,
214
+    };
215
+    this.mainService
216
+      .getFetchDataList("simple/data", "hospital", postData)
217
+      .subscribe((data) => {
218
+        this.dutyList = data.list || [];
219
+
220
+        this.isLoading = false;
221
+      });
222
+  }
223
+
224
+  // 获取楼栋
225
+  buildingAddList: any = [];
226
+  buildingSearchList: any = [];
227
+  getBuildings(type, keyword, init = false) {
228
+    let postData = {
229
+      building: {
230
+        simpleQuery: true,
231
+        buildingName: keyword,
232
+        cascadeHosId: this.currentHospital.id,
233
+      },
234
+      idx: 0,
235
+      sum: 20,
236
+    };
237
+    this.mainService
238
+      .getFetchDataList("simple/data", "building", postData)
239
+      .subscribe((data) => {
240
+        if (type == "search") {
241
+          this.buildingSearchList = data.list;
242
+        } else if (type == "add") {
243
+          this.buildingAddList = data.list;
244
+        }
245
+        this.isLoading = false;
246
+      });
247
+  }
248
+
249
+  // 修改产品
250
+  changeAssetProduct(id){
251
+    let obj = this.assetProductList.find(v => v.id == id);
252
+    console.log(obj);
253
+    this.validateForm.controls.brand.setValue(obj.brand);
254
+    this.companyList = obj.supplierList || [];
255
+    this.validateForm.controls.supplierId.setValue(null);
256
+  }
257
+
258
+  // 修改楼栋
259
+  noChangeBuilding:boolean = false;
260
+  changeBuilding(buildId?){
261
+    console.log(buildId)
262
+    if(!this.noChangeBuilding){
263
+      this.validateForm.controls.floorId.setValue(null);
264
+      this.getFloors('add', '', this.validateForm.value.buildId);
265
+    }
266
+    this.noChangeBuilding = false;
267
+  }
268
+
269
+  // 获取楼层
270
+  floorList: any = [];
271
+  getFloors(type, keyword, buildId, init = false, isNoChangeBuilding = false) {
272
+    console.log(isNoChangeBuilding)
273
+    if(!buildId){
274
+      this.floorList = [];
275
+      return;
276
+    }
277
+    let postData = {
278
+      floor: {
279
+        floorName: keyword,
280
+        buildId,
281
+        // hosId: this.currentHospital.id,
282
+      },
283
+      idx: 0,
284
+      sum: 20,
285
+    };
286
+    this.mainService
287
+      .getFetchDataList("simple/data", "floor", postData)
288
+      .subscribe((data) => {
289
+        this.floorList = data.list;
290
+        this.isLoading = false;
291
+      });
292
+  }
293
+
294
+  //获取状态
295
+  dispatchMethods:any[] = [];
296
+  getDispatchMethods() {
297
+    this.isLoading = true;
298
+    this.mainService.getDictionary("list", "asset_status").subscribe((data) => {
299
+      this.isLoading = false;
300
+      this.dispatchMethods = data || [];
301
+    });
302
+  }
303
+
304
+  // 新增/编辑表单提交
305
+  submitForm(): void {
306
+    for (const i in this.validateForm.controls) {
307
+      this.validateForm.controls[i].markAsDirty();
308
+      this.validateForm.controls[i].updateValueAndValidity();
309
+    }
310
+    if (this.validateForm.invalid) {
311
+      return;
312
+    }
313
+
314
+    console.log(this.validateForm.value)
315
+
316
+    this.btnLoading = true;
317
+    let postData:any = {};
318
+
319
+    if (this.add) {
320
+      //增加
321
+      postData = {
322
+        asset: {
323
+          hosId: this.currentHospital.id,
324
+          code: this.validateForm.value.code,
325
+          snCode: this.validateForm.value.snCode,
326
+          productId: this.validateForm.value.productId,
327
+          name: this.validateForm.value.name,
328
+          buildId: this.validateForm.value.buildId,
329
+          floorId: this.validateForm.value.floorId,
330
+          address: this.validateForm.value.address,
331
+          status: { id: this.validateForm.value.status },
332
+          deptId: this.validateForm.value.deptId,
333
+          dutyId: this.validateForm.value.dutyId,
334
+          brand: this.validateForm.value.brand,
335
+          supplierId: this.validateForm.value.supplierId,
336
+        }
337
+      };
338
+    } else {
339
+      //编辑
340
+      postData = {
341
+        asset:{
342
+          ...this.coopData,
343
+          ...{
344
+            hosId: this.currentHospital.id,
345
+            code: this.validateForm.value.code,
346
+            snCode: this.validateForm.value.snCode,
347
+            productId: this.validateForm.value.productId,
348
+            name: this.validateForm.value.name,
349
+            buildId: this.validateForm.value.buildId,
350
+            floorId: this.validateForm.value.floorId,
351
+            address: this.validateForm.value.address,
352
+            status: { id: this.validateForm.value.status },
353
+            deptId: this.validateForm.value.deptId,
354
+            dutyId: this.validateForm.value.dutyId,
355
+            brand: this.validateForm.value.brand,
356
+            supplierId: this.validateForm.value.supplierId,
357
+          }
358
+        }
359
+      };
360
+    }
361
+    this.mainService
362
+      .coopData("addData", "asset", postData)
363
+      .subscribe((result) => {
364
+        this.btnLoading = false;
365
+        this.hideAddModal();
366
+        let msg = "";
367
+        if (this.add) {
368
+          msg = "新增";
369
+        } else {
370
+          msg = "修改";
371
+        }
372
+        if (result.status == 200) {
373
+          this.showPromptModal(msg, true, "");
374
+        } else {
375
+          this.showPromptModal(msg, false, result.msg);
376
+        }
377
+      });
378
+  }
379
+
380
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
381
+  showPromptModal(con, success, promptInfo?) {
382
+    this.promptModalShow = false;
383
+    this.promptContent = con;
384
+    this.ifSuccess = success;
385
+    this.promptInfo = promptInfo;
386
+    setTimeout(() => {
387
+      this.promptModalShow = true;
388
+    }, 100);
389
+    this.getList(0);
390
+  }
391
+
392
+  delModal: boolean = false; //删除模态框
393
+  tipsMsg1: string; //提示框信息
394
+  tipsMsg2: string; //操作后信息
395
+  confirmDelType: string; //确认的类型(启用/停用,删除)
396
+  showDelModal(
397
+    e,
398
+    data,
399
+    tipsMsg1: string,
400
+    tipsMsg2: string,
401
+    type: string,
402
+  ) {
403
+    e.stopPropagation();
404
+    this.confirmDelType = type;
405
+    this.delModal = true;
406
+    this.coopData = data;
407
+    this.tipsMsg1 = tipsMsg1;
408
+    this.tipsMsg2 = tipsMsg2;
409
+  }
410
+  // 隐藏删除框
411
+  hideDelModal() {
412
+    this.delModal = false;
413
+  }
414
+  // 确认删除
415
+  confirmDel() {
416
+    this.btnLoading = true;
417
+    if (this.confirmDelType === "del") {
418
+      //删除
419
+      this.mainService
420
+        .simplePost("rmvData", "asset", [this.coopData.id])
421
+        .subscribe((data) => {
422
+          this.btnLoading = false;
423
+          this.delModal = false;
424
+          if (data.status == 200) {
425
+            this.showPromptModal(this.tipsMsg2, true, "");
426
+          } else {
427
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
428
+          }
429
+        });
430
+    }
431
+  }
432
+}

+ 19 - 0
src/app/views/assets-info/assets-info.module.ts

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

+ 14 - 0
src/app/views/assets-product-management/assets-product-management-routing.module.ts

@@ -0,0 +1,14 @@
1
+import { NgModule } from '@angular/core';
2
+import { Routes, RouterModule } from '@angular/router';
3
+import { AssetsProductManagementComponent } from './assets-product-management.component';
4
+
5
+
6
+const routes: Routes = [
7
+  { path: '', component: AssetsProductManagementComponent }
8
+];
9
+
10
+@NgModule({
11
+  imports: [RouterModule.forChild(routes)],
12
+  exports: [RouterModule]
13
+})
14
+export class AssetsProductManagementRoutingModule { }

+ 192 - 0
src/app/views/assets-product-management/assets-product-management.component.html

@@ -0,0 +1,192 @@
1
+<div class="list-template">
2
+  <div class="list-template__content">
3
+    <div class="list-template__top" nz-row>
4
+      <div nz-col nzXl='16' class="list-template__searchBox">
5
+        <div class="list-template__searchItem">
6
+          <span class="label">名称</span>:
7
+          <input nz-input class="formItem" placeholder="请输入名称" [(ngModel)]="searchDto.name" />
8
+        </div>
9
+        <div class="list-template__searchItem">
10
+          <span class="label">编码</span>:
11
+          <input nz-input class="formItem" placeholder="请输入编码" [(ngModel)]="searchDto.code" />
12
+        </div>
13
+        <div class="list-template__searchItem">
14
+          <span class="label">大类</span>:
15
+          <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear nzPlaceHolder="请选择大类" [(ngModel)]="searchDto.mainType">
16
+            <ng-container *ngFor="let option of productCategoryTypeListSearch1">
17
+              <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
18
+            </ng-container>
19
+            <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
20
+              <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
21
+            </nz-option>
22
+          </nz-select>
23
+        </div>
24
+      </div>
25
+      <div nz-col nzLg="8" class="list-template__btns">
26
+        <button nz-button class="btn default ml8" (click)='search()'>搜索</button>
27
+        <button nz-button class="btn default ml8" (click)='reset()'>重置</button>
28
+        <button nz-button *ngIf="coopBtns.add" class="btn default ml8" (click)="addModal()">新增</button>
29
+      </div>
30
+    </div>
31
+    <div class="list-template__bottom">
32
+      <nz-table class="list-template__nzTable" [nzData]="listOfData" nzSize="middle" [nzShowPagination]="false"
33
+        [nzLoading]="loading1">
34
+        <thead>
35
+          <tr class="thead">
36
+            <th nzWidth="8%">编码</th>
37
+            <th nzWidth="8%">名称</th>
38
+            <th nzWidth="8%">型号</th>
39
+            <th nzWidth="8%">品牌</th>
40
+            <th nzWidth="8%">大类</th>
41
+            <th nzWidth="8%">小类</th>
42
+            <th nzWidth="12%">描述</th>
43
+            <th nzWidth="14%">供应商</th>
44
+            <th nzWidth="14%">生产商</th>
45
+            <th nzWidth="12%">操作</th>
46
+          </tr>
47
+        </thead>
48
+        <tbody>
49
+          <tr *ngFor="let data of listOfData;let i = index">
50
+            <td>{{data.code}}</td>
51
+            <td>{{data.name}}</td>
52
+            <td>{{data.model}}</td>
53
+            <td>{{data.brand}}</td>
54
+            <td>{{data.mainTypeDTO?.name}}</td>
55
+            <td>{{data.subTypeDTO?.name}}</td>
56
+            <td>{{data.description}}</td>
57
+            <td>{{data.supplierList | dataToName:'name':','}}</td>
58
+            <td>{{data.manufacturerList | dataToName:'name':','}}</td>
59
+            <td>
60
+              <div class="coop">
61
+                <span *ngIf="coopBtns.commonFault" (click)="commonFault($event, data)">常见故障</span>
62
+                <span *ngIf="coopBtns.edit" (click)="edit($event, data)">编辑</span>
63
+                <span *ngIf="coopBtns.del" (click)="showDelModal($event, data,'您确认要删除吗?','删除','del')">删除</span>
64
+              </div>
65
+            </td>
66
+          </tr>
67
+        </tbody>
68
+      </nz-table>
69
+      <div class="list-template__pagination">
70
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="listLength" [(nzPageSize)]="pageSize" nzShowSizeChanger
71
+          (nzPageIndexChange)="getList(0)" (nzPageSizeChange)="getList(0)">
72
+        </nz-pagination>
73
+      </div>
74
+    </div>
75
+  </div>
76
+
77
+  <!-- 新增/编辑模态框 -->
78
+  <div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modal">
79
+    <div class="modalBody">
80
+      <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideAddModal()"></i></div>
81
+      <div class="content">
82
+        <form nz-form [formGroup]="validateForm" class="addForm">
83
+          <nz-form-item>
84
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="name">名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称</nz-form-label>
85
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入名称!">
86
+              <nz-input-group>
87
+                  <input formControlName="name" nz-input placeholder="请输入名称">
88
+              </nz-input-group>
89
+            </nz-form-control>
90
+          </nz-form-item>
91
+          <nz-form-item>
92
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="model">型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;号</nz-form-label>
93
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入型号!">
94
+              <nz-input-group>
95
+                  <input formControlName="model" nz-input placeholder="请输入型号">
96
+              </nz-input-group>
97
+            </nz-form-control>
98
+          </nz-form-item>
99
+          <nz-form-item>
100
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="brand">品&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;牌</nz-form-label>
101
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入品牌!">
102
+              <nz-input-group>
103
+                  <input formControlName="brand" nz-input placeholder="请输入品牌">
104
+              </nz-input-group>
105
+            </nz-form-control>
106
+          </nz-form-item>
107
+          <nz-form-item>
108
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="mainType">大&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类</nz-form-label>
109
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择大类!">
110
+              <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="mainType" nzShowSearch
111
+                nzPlaceHolder="请选择大类" (ngModelChange)="changeMainType($event)">
112
+                <ng-container *ngFor="let data of productCategoryTypeList1">
113
+                  <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
114
+                </ng-container>
115
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
116
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
117
+                </nz-option>
118
+              </nz-select>
119
+            </nz-form-control>
120
+          </nz-form-item>
121
+          <nz-form-item>
122
+            <nz-form-label [nzSpan]="5" nzFor="subType">&nbsp;&nbsp;&nbsp;小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类</nz-form-label>
123
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择小类!">
124
+              <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="subType" nzShowSearch
125
+                nzPlaceHolder="请选择小类">
126
+                <ng-container *ngFor="let data of productCategoryTypeList2">
127
+                  <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
128
+                </ng-container>
129
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
130
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
131
+                </nz-option>
132
+              </nz-select>
133
+            </nz-form-control>
134
+          </nz-form-item>
135
+          <nz-form-item>
136
+            <nz-form-label [nzSpan]="5" nzFor="description">&nbsp;&nbsp;&nbsp;描&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;述</nz-form-label>
137
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入描述!">
138
+              <nz-input-group>
139
+                <textarea rows="3" nz-input formControlName="description" placeholder="请输入描述"></textarea>
140
+              </nz-input-group>
141
+            </nz-form-control>
142
+          </nz-form-item>
143
+          <nz-form-item>
144
+            <nz-form-label [nzSpan]="5" nzFor="supplierIds">&nbsp;&nbsp;&nbsp;供&nbsp;应&nbsp;商</nz-form-label>
145
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择供应商!">
146
+              <nz-select nzMode="multiple" (nzOnSearch)="changeInp('1', 'company', $event)" (nzOpenChange)="openSupplier($event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="supplierIds" nzPlaceHolder="请选择供应商">
147
+                <ng-container *ngFor="let option of companyList1">
148
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
149
+                </ng-container>
150
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
151
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
152
+                </nz-option>
153
+              </nz-select>
154
+            </nz-form-control>
155
+          </nz-form-item>
156
+          <nz-form-item>
157
+            <nz-form-label [nzSpan]="5" nzFor="manufacturerIds">&nbsp;&nbsp;&nbsp;生&nbsp;产&nbsp;商</nz-form-label>
158
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择生产商!">
159
+              <nz-select nzMode="multiple" (nzOnSearch)="changeInp('2', 'company', $event)" (nzOpenChange)="openManufacturer($event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="manufacturerIds" nzPlaceHolder="请选择生产商">
160
+                <ng-container *ngFor="let option of companyList2">
161
+                  <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
162
+                </ng-container>
163
+                <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
164
+                  <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
165
+                </nz-option>
166
+              </nz-select>
167
+            </nz-form-control>
168
+          </nz-form-item>
169
+        </form>
170
+      </div>
171
+      <div class="display_flex justify-content_flex-center">
172
+        <button nzType="primary" nz-button (click)="submitForm()" [nzLoading]="btnLoading">确认</button>
173
+        <button class="btn cancel" nz-button nzType="default" (click)="hideAddModal()">取消</button>
174
+      </div>
175
+    </div>
176
+  </div>
177
+  <!-- 模态框 -->
178
+  <app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
179
+    (confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
180
+</div>
181
+<!-- 操作成功/失败提示框 -->
182
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
183
+  [info]="promptInfo">
184
+</app-prompt-modal>
185
+
186
+<!-- 常见故障 -->
187
+<app-assets-product-management-prompt-modal
188
+  *ngIf="assetsProductManagementPromptModalShow"
189
+  [show]="assetsProductManagementPromptModalShow"
190
+  [id]="commonFaultId"
191
+  (closeModelHs)="closeModelAssetsProductManagement($event)"
192
+></app-assets-product-management-prompt-modal>

+ 179 - 0
src/app/views/assets-product-management/assets-product-management.component.less

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

+ 388 - 0
src/app/views/assets-product-management/assets-product-management.component.ts

@@ -0,0 +1,388 @@
1
+import { Component, OnInit } from "@angular/core";
2
+import { ActivatedRoute, Router } from "@angular/router";
3
+import { FormBuilder, Validators, FormGroup } from "@angular/forms";
4
+
5
+import { MainService } from "../../services/main.service";
6
+import { ToolService } from "../../services/tool.service";
7
+import { NzMessageService } from 'ng-zorro-antd';
8
+import { Subject } from 'rxjs';
9
+import { debounceTime } from 'rxjs/operators';
10
+@Component({
11
+  selector: "app-assets-product-management",
12
+  templateUrl: "./assets-product-management.component.html",
13
+  styleUrls: ["./assets-product-management.component.less"],
14
+})
15
+export class AssetsProductManagementComponent implements OnInit {
16
+  constructor(
17
+    private fb: FormBuilder,
18
+    private mainService: MainService,
19
+    private route: ActivatedRoute,
20
+    private router: Router,
21
+    private tool: ToolService,
22
+    private message: NzMessageService,
23
+  ) {}
24
+
25
+  listOfData: any[] = []; //表格数据
26
+  pageIndex: number = 1; //表格当前页码
27
+  pageSize: number = 10; //表格每页展示条数
28
+  listLength: number = 10; //表格总数据量
29
+  modal: boolean = false; //新增/编辑模态框
30
+  add: boolean; //true:新增;false:编辑
31
+  validateForm: FormGroup; //新增/编辑表单
32
+  coopData: any; //当前操作列
33
+  currentHospital; //当前院区
34
+
35
+  btnLoading: boolean = false; //提交按钮loading状态
36
+
37
+  promptContent: string; //操作提示框提示信息
38
+  ifSuccess: boolean; //操作成功/失败
39
+  promptInfo: string; //操作结果提示信息
40
+  promptModalShow: boolean; //操作提示框是否展示
41
+  modelName = ""; //模态框名称
42
+
43
+  changeInpSubject = new Subject(); //防抖
44
+  showDropdown:boolean = false;
45
+
46
+  ngOnInit() {
47
+    //防抖
48
+    this.changeInpSubject.pipe(debounceTime(500)).subscribe((v) => {
49
+      if(v[1] === 'company'){
50
+        this.getCompanyList(v[0], v[2]);
51
+      }
52
+    });
53
+    this.currentHospital = this.tool.getCurrentHospital();
54
+    this.coopBtns = this.tool.initCoopBtns(this.route);
55
+    this.getList(1);
56
+    this.getProductCategoryTypeList(1);
57
+    this.getProductCategoryTypeList(1, 'Search');
58
+    this.getCompanyTypeList();
59
+  }
60
+
61
+  // 初始化增删改按钮
62
+  coopBtns: any = {};
63
+
64
+  // 常见故障
65
+  commonFaultId:any;
66
+  commonFault(e, data){
67
+    e.stopPropagation();
68
+    this.commonFaultId = data.id;
69
+    this.showAssetsProductManagementDepartment();
70
+  }
71
+
72
+  // 常见故障
73
+  assetsProductManagementPromptModalShow = false;
74
+  showAssetsProductManagementDepartment() {
75
+    this.assetsProductManagementPromptModalShow = true;
76
+  }
77
+  // 关闭弹窗
78
+  closeModelAssetsProductManagement(e) {
79
+    this.assetsProductManagementPromptModalShow = JSON.parse(e).show;
80
+  }
81
+
82
+  // 搜索
83
+  search() {
84
+    this.getList(1);
85
+  }
86
+  // 重置
87
+  reset() {
88
+    this.searchDto = {};
89
+    this.getList(1);
90
+  }
91
+
92
+  // 表格数据
93
+  searchDto: any = {};
94
+  loading1 = false;
95
+  getList(type) {
96
+    if (type == 1) {
97
+      this.pageIndex = 1;
98
+    }
99
+    let data = {
100
+      idx: this.pageIndex - 1,
101
+      sum: this.pageSize,
102
+      assetProduct: {
103
+        hosId: this.currentHospital.id,
104
+        ...this.searchDto,
105
+      },
106
+    };
107
+    this.loading1 = true;
108
+    this.mainService
109
+      .getFetchDataList("simple/data", "assetProduct", data)
110
+      .subscribe((data) => {
111
+        this.loading1 = false;
112
+        if (data.status == 200) {
113
+          this.listOfData = data.list;
114
+          this.listLength = data.totalNum;
115
+        }else{
116
+          this.message.error(data.msg || "请求数据失败");
117
+        }
118
+      });
119
+  }
120
+
121
+  // 新增弹框
122
+  addModal() {
123
+    this.modelName = "新增";
124
+    this.add = true; //新增
125
+    this.modal = true;
126
+    this.initForm();
127
+  }
128
+  //关闭新增/编辑弹框
129
+  hideAddModal() {
130
+    this.modal = false;
131
+    this.initForm();
132
+  }
133
+
134
+  // 初始化新增form表单
135
+  initForm() {
136
+    this.validateForm = this.fb.group({
137
+      name: ['', [Validators.required, Validators.pattern(/\S/)]],
138
+      model: ['', [Validators.required, Validators.pattern(/\S/)]],
139
+      brand: ['', [Validators.required, Validators.pattern(/\S/)]],
140
+      mainType: [null, [Validators.required]],
141
+      subType: [null],
142
+      description: [''],
143
+      supplierIds: [[]],
144
+      manufacturerIds: [[]],
145
+    });
146
+  }
147
+
148
+  // 边输边搜节流阀
149
+  isLoading = false;
150
+  changeInp(type, model, e) {
151
+    this.isLoading = true;
152
+    this.changeInpSubject.next([type, model, e]);
153
+  }
154
+
155
+  openSupplier(flag){
156
+    if(flag){
157
+      this.getCompanyList('1');
158
+    }
159
+  }
160
+
161
+  openManufacturer(flag){
162
+    if(flag){
163
+      this.getCompanyList('2');
164
+    }
165
+  }
166
+
167
+  // 获取三方公司
168
+  companyList1: any = [];//供应商
169
+  companyList2: any = [];//生产商
170
+  getCompanyList(type, keyword = '') {
171
+    this.isLoading = true;
172
+    let postData:any = {
173
+      company: {
174
+        name: keyword,
175
+        busiType: {key: "company_busi_type", value: "2"},
176
+        hosId: this.currentHospital.id,
177
+      },
178
+      idx: 0,
179
+      sum: 20,
180
+    };
181
+    let dictionary = this.companyTypeList.find(v => v.value == type);
182
+    if(!dictionary){
183
+      this['companyList' + type] = [];
184
+      return;
185
+    }
186
+    postData.company.companyTypeIds = dictionary.id.toString();
187
+    this.mainService
188
+      .getFetchDataList("simple/data", "company", postData)
189
+      .subscribe((data) => {
190
+        this['companyList' + type] = data.list || [];
191
+        this.isLoading = false;
192
+      });
193
+  }
194
+
195
+  //获取大类/小类
196
+  productCategoryTypeList1:any[] = [];
197
+  productCategoryTypeListSearch1:any[] = [];
198
+  productCategoryTypeList2:any[] = [];
199
+  getProductCategoryTypeList(level:number, type:string = '') {
200
+    this.isLoading = true;
201
+    let postData = {
202
+      dictionaryTree: {
203
+        deleted: 0,
204
+        level,
205
+        parent: level == 1 ? undefined : this.validateForm.value.mainType,
206
+        key: 'product_category_type',
207
+      },
208
+      idx: 0,
209
+      sum: 9999,
210
+    };
211
+    this.mainService
212
+      .getFetchDataList("simple/data", "dictionaryTree", postData)
213
+      .subscribe((data) => {
214
+        this.isLoading = false;
215
+        this['productCategoryTypeList' + type + level] = data.list || [];
216
+      });
217
+  }
218
+
219
+  // 获取三方公司公司分类
220
+  companyTypeList:any[] = [];
221
+  getCompanyTypeList(){
222
+    this.mainService.getDictionary("list", "company_type").subscribe((data) => {
223
+      this.companyTypeList = data || [];
224
+      this.getCompanyList('1');
225
+      this.getCompanyList('2');
226
+    });
227
+  }
228
+
229
+  // 修改大类
230
+  changeMainType(id){
231
+    console.log(id);
232
+    this.validateForm.controls.subType.setValue(null);
233
+    this.productCategoryTypeList2 = [];
234
+
235
+    this.getProductCategoryTypeList(2);
236
+  }
237
+
238
+  // 新增/编辑表单提交
239
+  submitForm(): void {
240
+    for (const i in this.validateForm.controls) {
241
+      this.validateForm.controls[i].markAsDirty();
242
+      this.validateForm.controls[i].updateValueAndValidity();
243
+    }
244
+    if (this.validateForm.invalid) {
245
+      return;
246
+    }
247
+
248
+    console.log(this.validateForm.value)
249
+
250
+    this.btnLoading = true;
251
+    let postData:any = {};
252
+
253
+    if (this.add) {
254
+      //增加
255
+      postData = {
256
+        // assetProduct: {
257
+          hosId: this.currentHospital.id,
258
+          name: this.validateForm.value.name,
259
+          model: this.validateForm.value.model,
260
+          brand: this.validateForm.value.brand,
261
+          mainType: this.validateForm.value.mainType,
262
+          subType: this.validateForm.value.subType || undefined,
263
+          description: this.validateForm.value.description,
264
+          supplierIds: this.validateForm.value.supplierIds.length ? this.validateForm.value.supplierIds.toString() : undefined,
265
+          manufacturerIds: this.validateForm.value.manufacturerIds.length ? this.validateForm.value.manufacturerIds.toString() : undefined,
266
+        // }
267
+      };
268
+    } else {
269
+      //编辑
270
+      postData = {
271
+        // assetProduct:{
272
+          ...this.coopData,
273
+          ...{
274
+            hosId: this.currentHospital.id,
275
+            name: this.validateForm.value.name,
276
+            model: this.validateForm.value.model,
277
+            brand: this.validateForm.value.brand,
278
+            mainType: this.validateForm.value.mainType,
279
+            subType: this.validateForm.value.subType || undefined,
280
+            description: this.validateForm.value.description,
281
+            supplierIds: this.validateForm.value.supplierIds.length ? this.validateForm.value.supplierIds.toString() : undefined,
282
+            manufacturerIds: this.validateForm.value.manufacturerIds.length ? this.validateForm.value.manufacturerIds.toString() : undefined,
283
+          }
284
+        // }
285
+      };
286
+    }
287
+    console.log(postData);
288
+    this.mainService
289
+      .simplePost("addData", "assetProduct", postData)
290
+      .subscribe((result) => {
291
+        this.btnLoading = false;
292
+        this.hideAddModal();
293
+        let msg = "";
294
+        if (this.add) {
295
+          msg = "新增";
296
+        } else {
297
+          msg = "修改";
298
+        }
299
+        if (result.status == 200) {
300
+          this.showPromptModal(msg, true, "");
301
+        } else {
302
+          this.showPromptModal(msg, false, result.msg);
303
+        }
304
+      });
305
+  }
306
+
307
+  // 编辑
308
+  edit(e, data) {
309
+    e.stopPropagation();
310
+    console.log(data);
311
+    this.initForm();
312
+    this.modelName = "编辑";
313
+    this.add = false;
314
+    this.modal = true;
315
+    this.coopData = data;
316
+    this.validateForm.controls.name.setValue(data.name);
317
+    this.validateForm.controls.model.setValue(data.model);
318
+    this.validateForm.controls.brand.setValue(data.brand);
319
+    this.validateForm.controls.mainType.setValue(data.mainType ? data.mainType.toString() : null);
320
+    this.validateForm.controls.subType.setValue(data.subType ? data.subType.toString() : null);
321
+    this.validateForm.controls.description.setValue(data.description);
322
+    this.validateForm.controls.supplierIds.setValue(Array.isArray(data.supplierList) ? data.supplierList.map(v => v.id) : []);
323
+    this.validateForm.controls.manufacturerIds.setValue(Array.isArray(data.manufacturerList) ? data.manufacturerList.map(v => v.id) : []);
324
+
325
+    if(data.supplierList){
326
+      this.companyList1 = data.supplierList || [];
327
+    }
328
+    if(data.manufacturerList){
329
+      this.companyList2 = data.manufacturerList || [];
330
+    }
331
+    if(data.mainType){
332
+      this.getProductCategoryTypeList(2);
333
+    }
334
+  }
335
+
336
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
337
+  showPromptModal(con, success, promptInfo?) {
338
+    this.promptModalShow = false;
339
+    this.promptContent = con;
340
+    this.ifSuccess = success;
341
+    this.promptInfo = promptInfo;
342
+    setTimeout(() => {
343
+      this.promptModalShow = true;
344
+    }, 100);
345
+    this.getList(0);
346
+  }
347
+
348
+  delModal: boolean = false; //删除模态框
349
+  tipsMsg1: string; //提示框信息
350
+  tipsMsg2: string; //操作后信息
351
+  confirmDelType: string; //确认的类型(启用/停用,删除)
352
+  showDelModal(
353
+    e,
354
+    data,
355
+    tipsMsg1: string,
356
+    tipsMsg2: string,
357
+    type: string,
358
+  ) {
359
+    e.stopPropagation();
360
+    this.confirmDelType = type;
361
+    this.delModal = true;
362
+    this.coopData = data;
363
+    this.tipsMsg1 = tipsMsg1;
364
+    this.tipsMsg2 = tipsMsg2;
365
+  }
366
+  // 隐藏删除框
367
+  hideDelModal() {
368
+    this.delModal = false;
369
+  }
370
+  // 确认删除
371
+  confirmDel() {
372
+    this.btnLoading = true;
373
+    if (this.confirmDelType === "del") {
374
+      //删除
375
+      this.mainService
376
+        .simplePost("rmvData", "assetProduct", [this.coopData.id])
377
+        .subscribe((data) => {
378
+          this.btnLoading = false;
379
+          this.delModal = false;
380
+          if (data.status == 200) {
381
+            this.showPromptModal(this.tipsMsg2, true, "");
382
+          } else {
383
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
384
+          }
385
+        });
386
+    }
387
+  }
388
+}

+ 19 - 0
src/app/views/assets-product-management/assets-product-management.module.ts

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

+ 18 - 0
src/app/views/configuration-center/configuration-center-routing.module.ts

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

+ 371 - 0
src/app/views/configuration-center/configuration-center.component.html

@@ -0,0 +1,371 @@
1
+<div class="configurationCenter">
2
+  <div class="tagsAndTemplete">
3
+    <div class="tags">
4
+      <div><i class="icon_transport transport-peizhizhongxin"></i>配置中心&emsp;&gt;&emsp;事件配置</div>
5
+      <div class="tagList">
6
+        <span *ngFor="let tag of tagList" [ngClass]="{ active: activeTagId === tag.id }" (click)="clickTag(tag)">{{ tag.name }}</span>
7
+      </div>
8
+      <button nz-button class="btn default" (click)="goBack()">返回</button>
9
+    </div>
10
+  </div>
11
+  <!-- 故障现象 -->
12
+  <ng-container *ngIf="activeTagId === 1">
13
+    <div class="hospitalConfig">
14
+      <nz-radio-group [(ngModel)]="hospitalConfig" (ngModelChange)="changeHospitalConfig($event)">
15
+        <label nz-radio [nzValue]="item.id" *ngFor="let item of hospitalConfigList">{{ item.name }}</label>
16
+      </nz-radio-group>
17
+    </div>
18
+
19
+    <div class="content">
20
+      <div class="contentInner">
21
+        <div class="address">
22
+          <div class="contentHead">一级故障现象<button nz-button nzType="primary" nzSize="small" (click)="addCategoryModal(1)">新增</button></div>
23
+          <overlay-scrollbars #osComponentRef1 class="contentBody">
24
+            <nz-spin nzSimple [nzSpinning]="categoryLoading1" class="mt8 text_align_center"></nz-spin>
25
+            <div [hidden]="categoryLoading1" class="contentItem" [title]="item.category" [ngClass]="{ active: item.id === activeCategory1.id }" (click)="clickCategory(item, 1)" *ngFor="let item of categoryList1">{{ item.category }}</div>
26
+          </overlay-scrollbars>
27
+        </div>
28
+        <div class="address">
29
+          <div class="contentHead">二级故障现象<button nz-button nzType="primary" nzSize="small" *ngIf="activeCategory1.id" (click)="addCategoryModal(2)">新增</button></div>
30
+          <overlay-scrollbars #osComponentRef2 class="contentBody">
31
+            <nz-spin nzSimple [nzSpinning]="categoryLoading2" class="mt8 text_align_center"></nz-spin>
32
+            <div [hidden]="categoryLoading2" class="contentItem" [title]="item.category" [ngClass]="{ active: item.id === activeCategory2.id }" (click)="clickCategory(item, 2)" *ngFor="let item of categoryList2">{{ item.category }}</div>
33
+          </overlay-scrollbars>
34
+        </div>
35
+        <div class="address">
36
+          <div class="contentHead">三级故障现象<button nz-button nzType="primary" nzSize="small" *ngIf="activeCategory2.id" (click)="addCategoryModal(3)">新增</button></div>
37
+          <overlay-scrollbars #osComponentRef3 class="contentBody">
38
+            <nz-spin nzSimple [nzSpinning]="categoryLoading3" class="mt8 text_align_center"></nz-spin>
39
+            <div [hidden]="categoryLoading3" class="contentItem" [title]="item.category" [ngClass]="{ active: item.id === activeCategory3.id }" (click)="clickCategory(item, 3)" *ngFor="let item of categoryList3">{{ item.category }}</div>
40
+          </overlay-scrollbars>
41
+        </div>
42
+        <div class="addressAssign">
43
+          <div class="contentHead">
44
+            <div class="title" title="{{activeCategory1.category}}{{activeCategory2.category ? ' - ' + activeCategory2.category : ''}}{{activeCategory3.category ? ' - ' + activeCategory3.category : ''}}">{{activeCategory1.category}}{{activeCategory2.category ? ' - ' + activeCategory2.category : ''}}{{activeCategory3.category ? ' - ' + activeCategory3.category : ''}}</div>
45
+            <div class="btns" *ngIf="activeCategory1.id || activeCategory2.id || activeCategory3.id">
46
+              <button nz-button nzType="primary" nzSize="small" (click)="showDelModal(data, hospitalConfig === 1 ? '您确认向下复制您的配置信息吗?' : '您确认向下复制您的配置吗?将会移除各科室的配置,使用当前配置进行覆盖。','向下复制','copy')" *ngIf="currentChildrenCategoryList">向下复制</button>
47
+              <button nz-button nzType="primary" nzSize="small" class="ml8" *ngIf="hospitalConfig === 2" (click)="addConfigModal()">新增</button>
48
+            </div>
49
+          </div>
50
+          <div class="contentBody" id="categoryTable">
51
+            <div class="list-template">
52
+              <div class="list-template__content">
53
+                <div class="list-template__bottom">
54
+                  <nz-table class="list-template__nzTable" [nzData]="categoryConfigList" nzSize="middle" [nzShowPagination]="false"
55
+                    [nzLoading]="loading1" [nzScroll]="{ y: tableCategoryHeight + 'px' }">
56
+                    <thead>
57
+                      <tr class="thead">
58
+                        <th nzWidth="16%">院区</th>
59
+                        <th nzWidth="16%">责任部门</th>
60
+                        <th nzWidth="16%">优先级</th>
61
+                        <th nzWidth="16%">积分</th>
62
+                        <th nzWidth="16%">维修人|组</th>
63
+                        <th nzWidth="20%">操作</th>
64
+                      </tr>
65
+                    </thead>
66
+                    <tbody>
67
+                      <tr *ngFor="let data of categoryConfigList;let i = index">
68
+                        <td>{{data.hospitalDTO?.hosName}}</td>
69
+                        <td>{{data.dutyDTO?.hosName}}</td>
70
+                        <td>{{data.priorityDTO?.name}}</td>
71
+                        <td>{{data.score?.value}}</td>
72
+                        <td>{{data.userGroup === 1 ? data.userDTO?.name : (data.userGroup === 2 ? data.groupDTO?.groupName : '')}}</td>
73
+                        <td>
74
+                          <div class="coop">
75
+                            <span (click)="showDelModal(data,'您确认要删除吗?','删除','delConfig')">删除</span>
76
+                            <span (click)="editConfig(data)">编辑</span>
77
+                          </div>
78
+                        </td>
79
+                      </tr>
80
+                    </tbody>
81
+                  </nz-table>
82
+                </div>
83
+              </div>
84
+            </div>
85
+          </div>
86
+        </div>
87
+      </div>
88
+    </div>
89
+  </ng-container>
90
+  <!-- 优先级 -->
91
+  <ng-container *ngIf="activeTagId === 2">
92
+    <div class="content priority">
93
+      <div class="contentInner">
94
+        <div class="list-template" id="priorityTable">
95
+          <div class="list-template__content">
96
+            <div class="list-template__bottom">
97
+              <div class="list-template__top" nz-row>
98
+                <div nz-col nzLg="24" class="list-template__btns">
99
+                  <button nz-button class="btn default" (click)="addPriorityModal()">新增</button>
100
+                </div>
101
+              </div>
102
+              <nz-table class="list-template__nzTable" [nzData]="priorityList" nzSize="middle" [nzShowPagination]="false"
103
+                [nzLoading]="loading1" [nzScroll]="{ y: tablePriorityHeight + 'px' }">
104
+                <thead>
105
+                  <tr class="thead">
106
+                    <th nzWidth="20%">优先级名称</th>
107
+                    <th nzWidth="20%">排序</th>
108
+                    <th nzWidth="20%">响应时间(分钟)</th>
109
+                    <th nzWidth="20%">解决时间(分钟)</th>
110
+                    <th nzWidth="20%">操作</th>
111
+                  </tr>
112
+                </thead>
113
+                <tbody>
114
+                  <tr *ngFor="let data of priorityList;let i = index">
115
+                    <td>{{data.name}}</td>
116
+                    <td>{{data.orders}}</td>
117
+                    <td>{{data.responseTime}}</td>
118
+                    <td>{{data.handleTime}}</td>
119
+                    <td>
120
+                      <div class="coop">
121
+                        <span (click)="showDelModal(data,'您确认要删除吗?','删除','delPriority')">删除</span>
122
+                        <span (click)="editPriority(data)">编辑</span>
123
+                      </div>
124
+                    </td>
125
+                  </tr>
126
+                </tbody>
127
+              </nz-table>
128
+            </div>
129
+          </div>
130
+        </div>
131
+      </div>
132
+    </div>
133
+  </ng-container>
134
+  <!-- 数据字典 -->
135
+  <ng-container *ngIf="activeTagId === 3">
136
+    <div class="content" id="dictionary">
137
+      <div class="contentInner">
138
+        <div class="address">
139
+          <overlay-scrollbars #osComponentRef5 class="contentBody">
140
+            <div class="contentItem" [title]="item.name" [ngClass]="{ active: item.id === activeDictionaryKey.id }" (click)="clickDictionaryKey(item)" *ngFor="let item of dictionaryKeyList">{{ item.name }}</div>
141
+          </overlay-scrollbars>
142
+        </div>
143
+        <div class="addressAssign">
144
+          <div class="contentBody">
145
+            <div class="dictionaryRow">
146
+              <div class="name">键</div>
147
+              <div class="value">值</div>
148
+            </div>
149
+            <form nz-form [formGroup]="validateDictionaryForm" class="w100">
150
+              <div class="dictionaryRow" *ngFor="let data of dictionaryList;let i = index;">
151
+                <div class="name">
152
+                  <nz-form-item>
153
+                    <nz-form-control [nzSpan]="24" nzErrorTip="请输入键!">
154
+                      <nz-input-group>
155
+                        <input [formControlName]="'name_' + data.id" nz-input class="nameInput">
156
+                      </nz-input-group>
157
+                    </nz-form-control>
158
+                  </nz-form-item>
159
+                </div>
160
+                <div class="value">
161
+                  <nz-form-item>
162
+                    <nz-form-control [nzSpan]="24" nzErrorTip="请输入值!">
163
+                      <nz-input-group>
164
+                        <nz-input-number [formControlName]="'value_' + data.id" class="valueInput"></nz-input-number>
165
+                      </nz-input-group>
166
+                    </nz-form-control>
167
+                  </nz-form-item>
168
+                  <i class="icon_transport transport-tag27fuben ml8" (click)="addField(i)"></i>
169
+                  <i class="icon_transport transport-shanchu1 ml8" *ngIf="dictionaryList.length > 1" (click)="removeField(data, i)"></i>
170
+                </div>
171
+              </div>
172
+            </form>
173
+          </div>
174
+          <div class="contentBtns">
175
+            <button nz-button nzType="primary" class="ml8" (click)="saveDictionary()">保存</button>
176
+          </div>
177
+        </div>
178
+      </div>
179
+    </div>
180
+  </ng-container>
181
+</div>
182
+
183
+<!-- 操作成功/失败提示框 -->
184
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
185
+  [info]="promptInfo">
186
+</app-prompt-modal>
187
+
188
+<!-- 删除模态框 -->
189
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
190
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
191
+
192
+<!-- 新增/编辑优先级模态框 -->
193
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modalPriority">
194
+  <div class="modalBody">
195
+    <div class="title">{{modelName}}优先级<i class="icon_transport transport-guanbi" (click)="hidePriorityModal()"></i></div>
196
+    <div class="content">
197
+      <form nz-form [formGroup]="validatePriorityForm" class="addForm">
198
+        <nz-form-item>
199
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="name">优先级名称</nz-form-label>
200
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入优先级名称!">
201
+            <nz-input-group>
202
+              <input formControlName="name" nz-input placeholder="请输入优先级名称">
203
+            </nz-input-group>
204
+          </nz-form-control>
205
+        </nz-form-item>
206
+        <nz-form-item>
207
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="orders">排&nbsp;&nbsp;&nbsp;序&nbsp;&nbsp;&nbsp;号</nz-form-label>
208
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入排序号!">
209
+            <nz-input-group>
210
+              <nz-input-number class="w100" formControlName="orders" nzPlaceHolder="请输入排序号" [nzMin]="0" [nzStep]="1" [nzPrecision]="0"></nz-input-number>
211
+            </nz-input-group>
212
+          </nz-form-control>
213
+        </nz-form-item>
214
+        <nz-form-item>
215
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="responseTime">响&nbsp;应&nbsp;时&nbsp;间</nz-form-label>
216
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入响应时间(分钟)!">
217
+            <nz-input-group>
218
+              <nz-input-number class="w100" formControlName="responseTime" nzPlaceHolder="请输入响应时间(分钟)" [nzMin]="0" [nzStep]="1" [nzPrecision]="0" [nzFormatter]="formatterMinute" [nzParser]="parserMinute"></nz-input-number>
219
+            </nz-input-group>
220
+          </nz-form-control>
221
+        </nz-form-item>
222
+        <nz-form-item>
223
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="handleTime">解&nbsp;决&nbsp;时&nbsp;间</nz-form-label>
224
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入解决时间(分钟)!">
225
+            <nz-input-group>
226
+              <nz-input-number class="w100" formControlName="handleTime" nzPlaceHolder="请输入解决时间(分钟)" [nzMin]="0" [nzStep]="1" [nzPrecision]="0" [nzFormatter]="formatterMinute" [nzParser]="parserMinute"></nz-input-number>
227
+            </nz-input-group>
228
+          </nz-form-control>
229
+        </nz-form-item>
230
+      </form>
231
+    </div>
232
+    <div class=" display_flex justify-content_flex-center">
233
+      <button nzType="primary" nz-button (click)="submitPriorityForm()" [nzLoading]="btnLoading">确认</button>
234
+      <button class="btn cancel" nz-button nzType="default" (click)="hidePriorityModal()">取消</button>
235
+    </div>
236
+  </div>
237
+</div>
238
+
239
+<!-- 新增/编辑故障现象模态框 -->
240
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modalCategory">
241
+  <div class="modalBody">
242
+    <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideCategoryModal()"></i></div>
243
+    <div class="content">
244
+      <div class="tips" *ngIf="coopType === 1">您将添加一级故障现象,请输入故障现象</div>
245
+      <div class="tips" *ngIf="coopType === 2">您将在“<span class="red">{{activeCategory1.category}}</span>”下新增故障现象,请输入故障现象</div>
246
+      <div class="tips" *ngIf="coopType === 3">您将在“<span class="red">{{activeCategory1.category}}{{activeCategory2.category ? ' - ' + activeCategory2.category : ''}}</span>”下新增故障现象,请输入故障现象</div>
247
+      <form nz-form [formGroup]="validateCategoryForm" class="addForm">
248
+        <nz-form-item>
249
+          <nz-form-control [nzSpan]="24" nzErrorTip="请输入故障现象名称!">
250
+            <nz-input-group>
251
+              <textarea formControlName="name" nz-input placeholder="请输入故障现象名称" [nzAutosize]="{minRows: 3}"></textarea>
252
+            </nz-input-group>
253
+          </nz-form-control>
254
+        </nz-form-item>
255
+      </form>
256
+    </div>
257
+    <div class=" display_flex justify-content_flex-center">
258
+      <button nzType="primary" nz-button (click)="submitCategoryForm()" [nzLoading]="btnLoading">确认</button>
259
+      <button class="btn cancel" nz-button nzType="default" (click)="hideCategoryModal()">取消</button>
260
+    </div>
261
+  </div>
262
+</div>
263
+
264
+<!-- 新增/编辑关联模态框 -->
265
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modalConfig">
266
+  <div class="modalBody">
267
+    <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideConfigModal()"></i></div>
268
+    <div class="content">
269
+      <form nz-form [formGroup]="validateConfigForm" class="addForm">
270
+        <nz-form-item>
271
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="hosId">院区</nz-form-label>
272
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择院区!">
273
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="hosId" nzShowSearch
274
+              nzPlaceHolder="请选择院区" nzServerSearch (ngModelChange)="changeHospital($event)" [nzDisabled]="!add">
275
+              <ng-container *ngFor="let data of hospitalList">
276
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.hosName" [nzValue]="data.id"></nz-option>
277
+              </ng-container>
278
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
279
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
280
+              </nz-option>
281
+            </nz-select>
282
+          </nz-form-control>
283
+        </nz-form-item>
284
+        <nz-form-item>
285
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="dutyId">责任部门</nz-form-label>
286
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择责任部门!">
287
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="dutyId" nzShowSearch
288
+              nzPlaceHolder="请选择责任部门" nzServerSearch (ngModelChange)="changeDuty($event)" [nzDisabled]="!add">
289
+              <ng-container *ngFor="let data of dutyList">
290
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.hosName" [nzValue]="data.id"></nz-option>
291
+              </ng-container>
292
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
293
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
294
+              </nz-option>
295
+            </nz-select>
296
+          </nz-form-control>
297
+        </nz-form-item>
298
+        <nz-form-item>
299
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="priority">优先级</nz-form-label>
300
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择优先级!">
301
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="priority" nzShowSearch
302
+            nzPlaceHolder="请选择优先级" nzServerSearch>
303
+              <ng-container *ngFor="let option of priority_c_List">
304
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
305
+              </ng-container>
306
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
307
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
308
+              </nz-option>
309
+            </nz-select>
310
+          </nz-form-control>
311
+        </nz-form-item>
312
+        <nz-form-item>
313
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="score">积分</nz-form-label>
314
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择积分!">
315
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="score" nzShowSearch
316
+              nzPlaceHolder="请选择积分" nzServerSearch>
317
+              <ng-container *ngFor="let data of scoreList">
318
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
319
+              </ng-container>
320
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
321
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
322
+              </nz-option>
323
+            </nz-select>
324
+          </nz-form-control>
325
+        </nz-form-item>
326
+        <nz-form-item>
327
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="userGroup">分配方式</nz-form-label>
328
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择积分!">
329
+            <nz-radio-group formControlName="userGroup" (ngModelChange)="changeUserGroup($event)">
330
+              <label nz-radio [nzValue]="1">人</label>
331
+              <label nz-radio [nzValue]="2">组</label>
332
+            </nz-radio-group>
333
+          </nz-form-control>
334
+        </nz-form-item>
335
+        <nz-form-item *ngIf="validateConfigForm.value.userGroup === 1">
336
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="userId">维修人</nz-form-label>
337
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择维修人!">
338
+            <nz-select (nzOnSearch)="changeInp('add', 'user', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="userId" nzPlaceHolder="请选择维修人">
339
+              <ng-container *ngFor="let option of userList">
340
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
341
+              </ng-container>
342
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
343
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
344
+              </nz-option>
345
+            </nz-select>
346
+          </nz-form-control>
347
+        </nz-form-item>
348
+        <nz-form-item *ngIf="validateConfigForm.value.userGroup === 2">
349
+          <nz-form-label [nzSpan]="5" nzRequired nzFor="groupId">维修组</nz-form-label>
350
+          <nz-form-control [nzSpan]="19" nzErrorTip="请选择维修组!">
351
+            <nz-select (nzOnSearch)="changeInp('add', 'group', $event)" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear formControlName="groupId" nzPlaceHolder="请选择维修组">
352
+              <ng-container *ngFor="let option of groupList">
353
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.groupName" [nzValue]="option.id"></nz-option>
354
+              </ng-container>
355
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
356
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
357
+              </nz-option>
358
+            </nz-select>
359
+          </nz-form-control>
360
+        </nz-form-item>
361
+      </form>
362
+    </div>
363
+    <div class=" display_flex justify-content_flex-center">
364
+      <button nzType="primary" nz-button (click)="submitConfigForm()" [nzLoading]="btnLoading">确认</button>
365
+      <button class="btn cancel" nz-button nzType="default" (click)="hideConfigModal()">取消</button>
366
+    </div>
367
+  </div>
368
+</div>
369
+
370
+<!-- 遮罩 -->
371
+<app-mask *ngIf="maskFlag"></app-mask>

+ 388 - 0
src/app/views/configuration-center/configuration-center.component.less

@@ -0,0 +1,388 @@
1
+@import "../../../../src/theme.less";
2
+:host {
3
+  width: 100%;
4
+  .list-template__nzTable,
5
+  .list-template__bottom{
6
+    padding: 0!important;
7
+    border: none!important;
8
+    background: #fff!important;
9
+  }
10
+  .list-template{
11
+    width: 100%!important;
12
+    height: 100%!important;
13
+  }
14
+  #dictionary{
15
+    margin: 24px 16px;
16
+    .addressAssign{
17
+      flex: 7;
18
+    }
19
+    .contentItem{
20
+      margin: 0 16px;
21
+      padding: 8px;
22
+      text-align: center;
23
+      &.active{
24
+        background-color: @primary-color;
25
+        color: #fff;
26
+        border-radius: 4px;
27
+      }
28
+    }
29
+    .contentBody{
30
+      padding: 16px;
31
+    }
32
+    ::ng-deep .ant-form-item{
33
+      margin-bottom: 0;
34
+    }
35
+    .dictionaryRow{
36
+      display: flex;
37
+      align-items: center;
38
+      justify-content: center;
39
+      gap: 16px;
40
+      .name{
41
+        flex: 1;
42
+        display: flex;
43
+        justify-content: flex-end;
44
+        align-items: center;
45
+        .nameInput{
46
+          width: 100px;
47
+        }
48
+      }
49
+      .value{
50
+        flex: 3;
51
+        display: flex;
52
+        align-items: center;
53
+        .valueInput{
54
+          width: 600px;
55
+        }
56
+        .icon_transport{
57
+          font-size: 20px;
58
+          color: #8a8a8a;
59
+          cursor: pointer;
60
+        }
61
+      }
62
+    }
63
+  }
64
+  .configurationCenter{
65
+    padding-bottom: 24px;
66
+    height: 100%;
67
+    display: flex;
68
+    flex-direction: column;
69
+    justify-content: space-between;
70
+    background-color: #F0F2F5;
71
+    .tagsAndTemplete{
72
+      height: 64px;
73
+      display: flex;
74
+      justify-content: space-between;
75
+      align-items: center;
76
+      .tags{
77
+        height: 100%;
78
+        background: #fff;
79
+        flex: 1;
80
+        padding: 16px 24px;
81
+        display: flex;
82
+        align-items: center;
83
+        justify-content: space-between;
84
+        position: relative;
85
+        .transport-peizhizhongxin{
86
+          color: @primary-color;
87
+          font-size: 20px;
88
+          margin-right: 8px;;
89
+        }
90
+        .tagList{
91
+          width: 100%;
92
+          position: absolute;
93
+          left: 0;
94
+          top: 50%;
95
+          transform: translateY(-50%);
96
+          display: flex;
97
+          justify-content: center;
98
+          align-items: center;
99
+          gap: 48px;
100
+          span{
101
+            cursor: pointer;
102
+            &.active{
103
+              color: @primary-color;
104
+            }
105
+          }
106
+        }
107
+      }
108
+    }
109
+    .hospitalConfig{
110
+      height: 60px;
111
+      display: flex;
112
+      justify-content: center;
113
+      align-items: center;
114
+      gap: 72px;
115
+    }
116
+    .content{
117
+      flex: 1;
118
+      min-height: 0;
119
+      display: flex;
120
+      flex-direction: column;
121
+      justify-content: space-between;
122
+      border: 1px solid #EEF3F9;
123
+      &.priority{
124
+        margin: 24px 118px 0;
125
+        background-color: #fff;
126
+        .contentInner{
127
+          padding: 48px 206px;
128
+          border: 1px solid #E8EBEF;
129
+        }
130
+      }
131
+      .contentItem{
132
+        padding: 4px 16px;
133
+        cursor: pointer;
134
+        overflow: hidden;
135
+        text-overflow: ellipsis;
136
+        white-space: nowrap;
137
+        &.active{
138
+          color: @primary-color;
139
+          background-color: #F0F6ED;
140
+          border-radius: 4px;
141
+        }
142
+      }
143
+      .contentInner{
144
+        flex: 1;
145
+        display: flex;
146
+        justify-content: space-between;
147
+        align-items: center;
148
+        padding: 0 16px;
149
+        gap: 16px;
150
+        .contentHead{
151
+          height: 45px;
152
+          display: flex;
153
+          justify-content: space-between;
154
+          align-items: center;
155
+          gap: 16px;
156
+          padding: 0 16px;
157
+          font-size: 16px;
158
+          font-weight: bold;
159
+          border-bottom: 1px solid #D9D9D9;
160
+          .title{
161
+            overflow: hidden;
162
+            text-overflow: ellipsis;
163
+            white-space: nowrap;
164
+          }
165
+          .btns{
166
+            flex-shrink: 0;
167
+          }
168
+        }
169
+        .contentBody{
170
+          padding: 0 8px;
171
+          margin: 4px 0;
172
+          flex: 1;
173
+        }
174
+        .address{
175
+          flex: 1;
176
+          height: 100%;
177
+          background: #FFFFFF;
178
+          border: 1px solid #E8EBEF;
179
+          display: flex;
180
+          flex-direction: column;
181
+          width: 0;
182
+        }
183
+        .addressAssign{
184
+          flex: 3;
185
+          height: 100%;
186
+          background: #FFFFFF;
187
+          border: 1px solid #E8EBEF;
188
+          display: flex;
189
+          flex-direction: column;
190
+          width: 0;
191
+        }
192
+        .list-template__searchItem {
193
+          margin-bottom: 16px;
194
+          .label {
195
+            color: #333;
196
+            display: inline-block;
197
+            width: 70px;
198
+            text-align-last: justify;
199
+            text-align: justify;
200
+            &.label--big {
201
+              width: 100px;
202
+            }
203
+          }
204
+          .formItem {
205
+            width: 135px;
206
+          }
207
+        }
208
+      }
209
+      .contentBtns{
210
+        margin-bottom: 16px;
211
+        display: flex;
212
+        justify-content: center;
213
+        align-items: center;
214
+      }
215
+    }
216
+  }
217
+
218
+  .save {
219
+    position: fixed;
220
+    left: 0;
221
+    top: 0;
222
+    width: 100%;
223
+    height: 100%;
224
+    background: rgba(0, 0, 0, 0.4);
225
+    z-index: 99;
226
+
227
+    .tips{
228
+      margin-bottom: 16px!important;
229
+    }
230
+
231
+    .modalBody {
232
+      width: 350px;
233
+      background: #fff;
234
+      border-radius: 5px;
235
+      padding: 10px 20px;
236
+      color: #333;
237
+
238
+      .title {
239
+        width: 100%;
240
+        text-align: center;
241
+        font-size: 18px;
242
+        position: relative;
243
+
244
+        i {
245
+          position: absolute;
246
+          right: 0;
247
+          top: 0;
248
+          font-size: 20px;
249
+          color: #666;
250
+          cursor: pointer;
251
+          padding: 0 5px;
252
+        }
253
+      }
254
+
255
+      .content {
256
+        width: 310px;
257
+        background: #f9fafb;
258
+        border: 1px solid #e5e9ed;
259
+        border-radius: 5px;
260
+        overflow: hidden;
261
+        margin-top: 12px;
262
+        padding: 16px 0;
263
+
264
+        .busyList{
265
+          display: flex;
266
+          margin-bottom: 8px;
267
+          .busyContent{
268
+            margin-right: 8px;
269
+            flex: 1;
270
+          }
271
+        }
272
+
273
+        & > div {
274
+          text-align: center;
275
+          margin: 0;
276
+
277
+          &.icon {
278
+            // margin-top: 17px;
279
+
280
+            i {
281
+              color: #34b349;
282
+              font-size: 30px !important;
283
+
284
+              &.transport-wenhao {
285
+                color: #f5a523;
286
+              }
287
+
288
+              &.transport-shibai {
289
+                color: #ff3a52;
290
+              }
291
+            }
292
+          }
293
+
294
+          &.defeat {
295
+            color: #333;
296
+            font-size: 14px;
297
+          }
298
+
299
+          &:nth-child(3) {
300
+            font-size: 14px;
301
+            color: #666;
302
+          }
303
+        }
304
+        .workAssignmentTips {
305
+          font-size: 12px;
306
+        }
307
+      }
308
+
309
+      button {
310
+        margin-top: 10px;
311
+
312
+        &.btn {
313
+          margin-left: 8px;
314
+        }
315
+      }
316
+    }
317
+
318
+    // 新增
319
+    &.add {
320
+      .modalBody {
321
+        width: 480px;
322
+        height: auto;
323
+
324
+        .content {
325
+          width: 100%;
326
+          height: auto;
327
+          padding: 16px;
328
+          max-height: 497px;
329
+          overflow-y: auto;
330
+
331
+          .addForm {
332
+            .ant-form-item {
333
+              margin-bottom: 0;
334
+
335
+              .ant-form-item-label {
336
+                text-align: left;
337
+              }
338
+
339
+              .desc {
340
+                margin-top: 5px;
341
+              }
342
+            }
343
+
344
+            .datesControl {
345
+              margin-top: -16px;
346
+
347
+              .ant-form-item-label {
348
+                line-height: 40px;
349
+              }
350
+            }
351
+
352
+            .timer {
353
+              .ant-form-item-label {
354
+                width: 100%;
355
+                text-align: left;
356
+              }
357
+
358
+              .numInp {
359
+                margin-right: 5px;
360
+              }
361
+
362
+              .line {
363
+                margin-right: 5px;
364
+              }
365
+            }
366
+
367
+            .timer2 {
368
+              .ant-form-item-label {
369
+                line-height: 20px;
370
+              }
371
+            }
372
+          }
373
+
374
+          .editForm {
375
+            .ant-form-item {
376
+              margin-bottom: 15px;
377
+
378
+              .ant-form-item-label {
379
+                line-height: 14px;
380
+                text-align: left;
381
+              }
382
+            }
383
+          }
384
+        }
385
+      }
386
+    }
387
+  }
388
+}

File diff suppressed because it is too large
+ 1049 - 0
src/app/views/configuration-center/configuration-center.component.ts


+ 19 - 0
src/app/views/configuration-center/configuration-center.module.ts

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

+ 3 - 3
src/app/views/fuwutai/fuwutai.component.less

@@ -6,9 +6,9 @@
6 6
   padding: 16px;
7 7
   display: flex;
8 8
   flex-direction: column;
9
-}
10
-::ng-deep .ant-form-item-label {
11
-  line-height: 24px !important;
9
+  ::ng-deep .ant-form-item-label {
10
+    line-height: 24px !important;
11
+  }
12 12
 }
13 13
 
14 14
 .fuwutai {

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

@@ -563,11 +563,29 @@ const routes: Routes = [
563 563
         path: "inspectionExecute",
564 564
         loadChildren: () => import("../inspection-execute/inspection-execute.module").then((m) => m.InspectionExecuteModule),
565 565
       },
566
+<<<<<<< HEAD
566 567
 			// 故障管理-知识库管理
567 568
 			{
568 569
 			  path: "repositoryManage",
569 570
 			  loadChildren: () => import("../repository-manage/repository-manage.module").then((m) => m.RepositoryManageModule),
570 571
 			},
572
+=======
573
+      // 三方公司
574
+      {
575
+        path: "tripartiteCompany",
576
+        loadChildren: () => import("../tripartite-company/tripartite-company.module").then((m) => m.TripartiteCompanyModule),
577
+      },
578
+      // 资产信息
579
+      {
580
+        path: "assetsInfo",
581
+        loadChildren: () => import("../assets-info/assets-info.module").then((m) => m.AssetsInfoModule),
582
+      },
583
+      // 产品管理
584
+      {
585
+        path: "assetsProductManagement",
586
+        loadChildren: () => import("../assets-product-management/assets-product-management.module").then((m) => m.AssetsProductManagementModule),
587
+      },
588
+>>>>>>> ce9c995986db1c27e0fa1c88d63814fae0b91dcd
571 589
     ],
572 590
   },
573 591
 ];

File diff suppressed because it is too large
+ 3 - 23
src/app/views/main/main.component.html


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

@@ -81,6 +81,7 @@ nz-sider {
81 81
     & > i {
82 82
       margin-left: 24px;
83 83
       margin-right: 10px;
84
+      font-size: 14px;
84 85
     }
85 86
     .transport-xialajiantou {
86 87
       color: #999;

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

@@ -30,6 +30,7 @@ export class MainComponent implements OnInit {
30 30
   specimenViewRole: boolean = false; //业务视图权限
31 31
   specimenViewRole2: boolean = false; //标本视图权限
32 32
   disinfectionSupplyRole: boolean = false; //全局业务查看权限
33
+  configurationCenterRole: boolean = false; //配置中心权限
33 34
   PCCommutesToWork: boolean = false; //PC上下班权限
34 35
   @ViewChild("osComponentRef1", {
35 36
     read: OverlayScrollbarsComponent,
@@ -65,6 +66,11 @@ export class MainComponent implements OnInit {
65 66
     this.webs.closeWs(true);
66 67
   }
67 68
 
69
+  // 菜单图标名称是否包含transport-
70
+  isTransportIcon(icon:string) {
71
+    return icon.indexOf("transport-") > -1;
72
+  }
73
+
68 74
   //上下班
69 75
   loading3 = false;
70 76
   workModal: boolean = false; //模态框
@@ -283,6 +289,10 @@ export class MainComponent implements OnInit {
283 289
         this.disinfectionSupplyRole = true;
284 290
         console.log("全局业务查看权限");
285 291
       }
292
+      if (e.link == "configurationCenter") {
293
+        this.configurationCenterRole = true;
294
+        console.log("配置中心权限");
295
+      }
286 296
       if (e.link == "PCCommutesToWork") {
287 297
         this.PCCommutesToWork = true;
288 298
         console.log("PC上下班");
@@ -398,6 +408,10 @@ export class MainComponent implements OnInit {
398 408
   toDisinfectionSupply(): void {
399 409
     this.router.navigateByUrl("disinfectionSupply");
400 410
   }
411
+  // 配置中心
412
+  toConfigurationCenter(): void {
413
+    this.router.navigateByUrl("configurationCenter");
414
+  }
401 415
   // 大屏端或视图端
402 416
   screenType;
403 417
   hosFlag = false;

+ 1 - 0
src/app/views/medical-waste-batch-out-of-storage/medical-waste-batch-out-of-storage.component.ts

@@ -170,6 +170,7 @@ export class MedicalWasteBatchOutOfStorageComponent implements OnInit {
170 170
       company: {
171 171
         hosId: this.hosId,
172 172
         transType: dictionary,
173
+        busiType: { key: 'company_busi_type', value: '1' },
173 174
       },
174 175
     };
175 176
     this.mainService

+ 14 - 0
src/app/views/tripartite-company/tripartite-company-routing.module.ts

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

+ 131 - 0
src/app/views/tripartite-company/tripartite-company.component.html

@@ -0,0 +1,131 @@
1
+<div class="list-template">
2
+  <div class="list-template__content">
3
+    <div class="list-template__top" nz-row>
4
+      <div nz-col nzXl='16' class="list-template__searchBox">
5
+        <div class="list-template__searchItem">
6
+          <span class="label">公司名称</span>:
7
+          <input nz-input class="formItem" placeholder="请输入公司名称" [(ngModel)]="searchDto.name" />
8
+        </div>
9
+        <div class="list-template__searchItem">
10
+          <span class="label">公司分类</span>:
11
+          <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear nzPlaceHolder="请选择公司分类" [(ngModel)]="searchDto.companyTypeIds">
12
+            <ng-container *ngFor="let option of companyTypeList">
13
+              <nz-option *ngIf="!isLoading" [nzLabel]="option.name" nzValue="{{option.id}}"></nz-option>
14
+            </ng-container>
15
+            <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
16
+              <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
17
+            </nz-option>
18
+          </nz-select>
19
+        </div>
20
+      </div>
21
+      <div nz-col nzLg="8" class="list-template__btns">
22
+        <button nz-button class="btn default ml8" (click)='search()'>搜索</button>
23
+        <button nz-button class="btn default ml8" (click)='reset()'>重置</button>
24
+        <button nz-button *ngIf="coopBtns.add" class="btn default ml8" (click)="addModal()">新增</button>
25
+      </div>
26
+    </div>
27
+    <div class="list-template__bottom">
28
+      <nz-table class="list-template__nzTable" [nzData]="listOfData" nzSize="middle" [nzShowPagination]="false"
29
+        [nzLoading]="loading1">
30
+        <thead>
31
+          <tr class="thead">
32
+            <th nzWidth="14%">公司编号</th>
33
+            <th nzWidth="14%">公司全称</th>
34
+            <th nzWidth="14%">公司简称</th>
35
+            <th nzWidth="14%">公司分类</th>
36
+            <th nzWidth="14%">联系人</th>
37
+            <th nzWidth="14%">联系电话</th>
38
+            <th nzWidth="11%">操作</th>
39
+          </tr>
40
+        </thead>
41
+        <tbody>
42
+          <tr *ngFor="let data of listOfData;let i = index">
43
+            <td>{{data.code}}</td>
44
+            <td>{{data.name}}</td>
45
+            <td>{{data.nickName}}</td>
46
+            <td>{{data.companyTypeList | dataToName:'name':','}}</td>
47
+            <td>{{data.contacts}}</td>
48
+            <td>{{data.mphone}}</td>
49
+            <td>
50
+              <div class="coop">
51
+                <span *ngIf="coopBtns.edit" (click)="edit($event, data)">编辑</span>
52
+                <span *ngIf="coopBtns.del" (click)="showDelModal($event, data,'删除后您配置的相关巡检计划,下次执行时不在生成巡检任务,您确认要删除吗?','删除','del')">删除</span>
53
+              </div>
54
+            </td>
55
+          </tr>
56
+        </tbody>
57
+      </nz-table>
58
+      <div class="list-template__pagination">
59
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="listLength" [(nzPageSize)]="pageSize" nzShowSizeChanger
60
+          (nzPageIndexChange)="getList(0)" (nzPageSizeChange)="getList(0)">
61
+        </nz-pagination>
62
+      </div>
63
+    </div>
64
+  </div>
65
+
66
+  <!-- 新增/编辑模态框 -->
67
+  <div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modal">
68
+    <div class="modalBody">
69
+      <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideAddModal()"></i></div>
70
+      <div class="content">
71
+        <form nz-form [formGroup]="validateForm" class="addForm">
72
+          <nz-form-item *ngIf="!add">
73
+            <nz-form-label [nzSpan]="5" nzRequired>公司编号</nz-form-label>
74
+            <nz-form-control [nzSpan]="19">
75
+              {{coopData.code}}
76
+            </nz-form-control>
77
+          </nz-form-item>
78
+          <nz-form-item>
79
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="name">公司全称</nz-form-label>
80
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入公司全称!">
81
+              <nz-input-group>
82
+                  <input formControlName="name" nz-input placeholder="请输入公司全称">
83
+              </nz-input-group>
84
+            </nz-form-control>
85
+          </nz-form-item>
86
+          <nz-form-item>
87
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="nickName">公司简称</nz-form-label>
88
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入公司简称!">
89
+              <nz-input-group>
90
+                  <input formControlName="nickName" nz-input placeholder="请输入公司简称">
91
+              </nz-input-group>
92
+            </nz-form-control>
93
+          </nz-form-item>
94
+          <nz-form-item>
95
+            <nz-form-label [nzSpan]="5" nzRequired nzFor="companyTypeIds">公司分类</nz-form-label>
96
+            <nz-form-control [nzSpan]="19" nzErrorTip="请选择公司分类!">
97
+              <nz-checkbox-group formControlName="companyTypeIds"></nz-checkbox-group>
98
+            </nz-form-control>
99
+          </nz-form-item>
100
+          <nz-form-item>
101
+            <nz-form-label [nzSpan]="5" nzFor="contacts">&nbsp;&nbsp;联&nbsp;系&nbsp;人</nz-form-label>
102
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入联系人!">
103
+              <nz-input-group>
104
+                  <input formControlName="contacts" nz-input placeholder="请输入联系人">
105
+              </nz-input-group>
106
+            </nz-form-control>
107
+          </nz-form-item>
108
+          <nz-form-item>
109
+            <nz-form-label [nzSpan]="5" nzFor="mphone">&nbsp;&nbsp;联系电话</nz-form-label>
110
+            <nz-form-control [nzSpan]="19" nzErrorTip="请输入联系电话!">
111
+              <nz-input-group>
112
+                  <input formControlName="mphone" nz-input placeholder="请输入联系电话">
113
+              </nz-input-group>
114
+            </nz-form-control>
115
+          </nz-form-item>
116
+        </form>
117
+      </div>
118
+      <div class="display_flex justify-content_flex-center">
119
+        <button nzType="primary" nz-button (click)="submitForm()" [nzLoading]="btnLoading">确认</button>
120
+        <button class="btn cancel" nz-button nzType="default" (click)="hideAddModal()">取消</button>
121
+      </div>
122
+    </div>
123
+  </div>
124
+  <!-- 模态框 -->
125
+  <app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
126
+    (confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
127
+</div>
128
+<!-- 操作成功/失败提示框 -->
129
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
130
+  [info]="promptInfo">
131
+</app-prompt-modal>

+ 176 - 0
src/app/views/tripartite-company/tripartite-company.component.less

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

+ 266 - 0
src/app/views/tripartite-company/tripartite-company.component.ts

@@ -0,0 +1,266 @@
1
+import { Component, OnInit } from "@angular/core";
2
+import { ActivatedRoute } from "@angular/router";
3
+import { FormBuilder, Validators, FormGroup } from "@angular/forms";
4
+
5
+import { MainService } from "../../services/main.service";
6
+import { ToolService } from "../../services/tool.service";
7
+import { NzMessageService } from 'ng-zorro-antd';
8
+@Component({
9
+  selector: "app-tripartite-company",
10
+  templateUrl: "./tripartite-company.component.html",
11
+  styleUrls: ["./tripartite-company.component.less"],
12
+})
13
+export class TripartiteCompanyComponent implements OnInit {
14
+  constructor(
15
+    private fb: FormBuilder,
16
+    private mainService: MainService,
17
+    private route: ActivatedRoute,
18
+    private tool: ToolService,
19
+    private message: NzMessageService,
20
+  ) {}
21
+
22
+  listOfData: any[] = []; //表格数据
23
+  pageIndex: number = 1; //表格当前页码
24
+  pageSize: number = 10; //表格每页展示条数
25
+  listLength: number = 10; //表格总数据量
26
+  modal: boolean = false; //新增/编辑模态框
27
+  add: boolean; //true:新增;false:编辑
28
+  validateForm: FormGroup; //新增/编辑表单
29
+  coopData: any; //当前操作列
30
+  currentHospital; //当前院区
31
+
32
+  btnLoading: boolean = false; //提交按钮loading状态
33
+
34
+  promptContent: string; //操作提示框提示信息
35
+  ifSuccess: boolean; //操作成功/失败
36
+  promptInfo: string; //操作结果提示信息
37
+  promptModalShow: boolean; //操作提示框是否展示
38
+  nextSchemeName = ""; //下一个开启的方案名称
39
+  modelName = ""; //模态框名称
40
+
41
+  showDropdown:boolean = false;
42
+
43
+  ngOnInit() {
44
+    this.currentHospital = this.tool.getCurrentHospital();
45
+    this.coopBtns = this.tool.initCoopBtns(this.route);
46
+    this.getList(1);
47
+    this.getCompanyType();
48
+  }
49
+
50
+  // 初始化增删改按钮
51
+  coopBtns: any = {};
52
+
53
+  // 搜索
54
+  search() {
55
+    this.getList(1);
56
+  }
57
+  // 重置
58
+  reset() {
59
+    this.searchDto = {};
60
+    this.getList(1);
61
+  }
62
+
63
+  // 表格数据
64
+  searchDto: any = {};
65
+  loading1 = false;
66
+  getList(type) {
67
+    if (type == 1) {
68
+      this.pageIndex = 1;
69
+    }
70
+    let data = {
71
+      idx: this.pageIndex - 1,
72
+      sum: this.pageSize,
73
+      company: {
74
+        hosId: this.currentHospital.id,
75
+        busiType: { key: 'company_busi_type', value: '2' },
76
+        ...this.searchDto,
77
+      },
78
+    };
79
+    this.loading1 = true;
80
+    this.mainService
81
+      .getFetchDataList("simple/data", "company", data)
82
+      .subscribe((data) => {
83
+        this.loading1 = false;
84
+        if (data.status == 200) {
85
+          this.listOfData = data.list;
86
+          this.listLength = data.totalNum;
87
+        }else{
88
+          this.message.error(data.msg || "请求数据失败");
89
+        }
90
+      });
91
+  }
92
+
93
+  // 新增弹框
94
+  addModal() {
95
+    this.modelName = "新增";
96
+    this.add = true; //新增
97
+    this.modal = true;
98
+    this.initForm();
99
+  }
100
+  //关闭新增/编辑弹框
101
+  hideAddModal() {
102
+    this.modal = false;
103
+    this.initForm();
104
+  }
105
+
106
+  // 初始化新增form表单
107
+  initForm() {
108
+    this.validateForm = this.fb.group({
109
+      name: ['', [Validators.required, Validators.pattern(/\S/)]],
110
+      nickName: ['', [Validators.required]],
111
+      companyTypeIds: [this.companyTypeList.map(v => ({ label: v.name, value: v.id, checked: false })), [Validators.required]],
112
+      contacts: [''],
113
+      mphone: [''],
114
+    });
115
+  }
116
+
117
+  //获取公司分类
118
+  isLoading:boolean = false;
119
+  companyTypeList:any[] = [];
120
+  getCompanyType() {
121
+    this.isLoading = true;
122
+    this.mainService.getDictionary("list", "company_type").subscribe((data) => {
123
+      this.isLoading = false;
124
+      this.companyTypeList = data || [];
125
+    });
126
+  }
127
+
128
+  // 新增/编辑表单提交
129
+  submitForm(): void {
130
+    for (const i in this.validateForm.controls) {
131
+      this.validateForm.controls[i].markAsDirty();
132
+      this.validateForm.controls[i].updateValueAndValidity();
133
+    }
134
+    if (this.validateForm.invalid) {
135
+      return;
136
+    }
137
+
138
+    console.log(this.validateForm.value)
139
+    let companyList = this.validateForm.value.companyTypeIds.filter(v => v.checked);
140
+    if(!companyList.length){
141
+      this.message.info("请选择公司分类");
142
+      return;
143
+    }
144
+
145
+    this.btnLoading = true;
146
+    let postData:any = {};
147
+
148
+    if (this.add) {
149
+      //增加
150
+      postData = {
151
+        company: {
152
+          hosId: this.currentHospital.id,
153
+          name: this.validateForm.value.name,
154
+          nickName: this.validateForm.value.nickName,
155
+          companyTypeIds: companyList.map(v => v.value).toString(),
156
+          contacts: this.validateForm.value.contacts,
157
+          mphone: this.validateForm.value.mphone,
158
+          busiType: { key: 'company_busi_type', value: '2' },
159
+        }
160
+      };
161
+    } else {
162
+      //编辑
163
+      postData = {
164
+        company:{
165
+          ...this.coopData,
166
+          ...{
167
+            hosId: this.currentHospital.id,
168
+            name: this.validateForm.value.name,
169
+            nickName: this.validateForm.value.nickName,
170
+            companyTypeIds: this.validateForm.value.companyTypeIds.filter(v => v.checked).map(v => v.value).toString(),
171
+            contacts: this.validateForm.value.contacts,
172
+            mphone: this.validateForm.value.mphone,
173
+            busiType: { key: 'company_busi_type', value: '2' },
174
+          }
175
+        }
176
+      };
177
+    }
178
+    console.log(postData);
179
+    this.mainService
180
+      .coopData("addData", "company", postData)
181
+      .subscribe((result) => {
182
+        this.btnLoading = false;
183
+        this.hideAddModal();
184
+        let msg = "";
185
+        if (this.add) {
186
+          msg = "新增";
187
+        } else {
188
+          msg = "修改";
189
+        }
190
+        if (result.status == 200) {
191
+          this.showPromptModal(msg, true, "");
192
+        } else {
193
+          this.showPromptModal(msg, false, result.msg);
194
+        }
195
+      });
196
+  }
197
+
198
+  // 编辑
199
+  edit(e, data) {
200
+    e.stopPropagation();
201
+    console.log(data);
202
+    this.initForm();
203
+    this.modelName = "编辑";
204
+    this.add = false;
205
+    this.modal = true;
206
+    this.coopData = data;
207
+    this.validateForm.controls.name.setValue(data.name);
208
+    this.validateForm.controls.nickName.setValue(data.nickName);
209
+    this.validateForm.controls.companyTypeIds.setValue(this.companyTypeList.map(v => ({label: v.name, value: v.id, checked: data.companyTypeIds.includes(v.id)})));
210
+    this.validateForm.controls.contacts.setValue(data.contacts);
211
+    this.validateForm.controls.mphone.setValue(data.mphone);
212
+  }
213
+
214
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
215
+  showPromptModal(con, success, promptInfo?) {
216
+    this.promptModalShow = false;
217
+    this.promptContent = con;
218
+    this.ifSuccess = success;
219
+    this.promptInfo = promptInfo;
220
+    setTimeout(() => {
221
+      this.promptModalShow = true;
222
+    }, 100);
223
+    this.getList(0);
224
+  }
225
+
226
+  delModal: boolean = false; //删除模态框
227
+  tipsMsg1: string; //提示框信息
228
+  tipsMsg2: string; //操作后信息
229
+  confirmDelType: string; //确认的类型(启用/停用,删除)
230
+  showDelModal(
231
+    e,
232
+    data,
233
+    tipsMsg1: string,
234
+    tipsMsg2: string,
235
+    type: string,
236
+  ) {
237
+    e.stopPropagation();
238
+    this.confirmDelType = type;
239
+    this.delModal = true;
240
+    this.coopData = data;
241
+    this.tipsMsg1 = tipsMsg1;
242
+    this.tipsMsg2 = tipsMsg2;
243
+  }
244
+  // 隐藏删除框
245
+  hideDelModal() {
246
+    this.delModal = false;
247
+  }
248
+  // 确认删除
249
+  confirmDel() {
250
+    this.btnLoading = true;
251
+    if (this.confirmDelType === "del") {
252
+      //删除
253
+      this.mainService
254
+        .simplePost("rmvData", "company", [this.coopData.id])
255
+        .subscribe((data) => {
256
+          this.btnLoading = false;
257
+          this.delModal = false;
258
+          if (data.status == 200) {
259
+            this.showPromptModal(this.tipsMsg2, true, "");
260
+          } else {
261
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
262
+          }
263
+        });
264
+    }
265
+  }
266
+}

+ 19 - 0
src/app/views/tripartite-company/tripartite-company.module.ts

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

+ 21 - 17
src/app/views/unit-management/unit-management.component.ts

@@ -63,6 +63,7 @@ export class UnitManagementComponent implements OnInit {
63 63
       sum: this.pageSize,
64 64
       company: {
65 65
         hosId: this.hosId,
66
+        busiType: { key: 'company_busi_type', value: '1' },
66 67
       },
67 68
     };
68 69
     this.loading1 = true;
@@ -185,37 +186,40 @@ export class UnitManagementComponent implements OnInit {
185 186
     }
186 187
     if (that.validateForm.invalid) return;
187 188
     that.btnLoading = true;
188
-    let data:any = {
189
-      name: that.validateForm.value.name,
190
-      transType: { id: that.validateForm.value.transType },
191
-      contacts: that.validateForm.value.contacts,
192
-      mphone: that.validateForm.value.mphone,
193
-      businessCode: that.validateForm.value.businessCode,
194
-      address: that.validateForm.value.address,
195
-      hosId: that.hosId,
196
-      laborers: [],
197
-      carNo: "",
189
+    let postData:any = {
190
+      company:{
191
+        name: that.validateForm.value.name,
192
+        transType: { id: that.validateForm.value.transType },
193
+        contacts: that.validateForm.value.contacts,
194
+        mphone: that.validateForm.value.mphone,
195
+        businessCode: that.validateForm.value.businessCode,
196
+        address: that.validateForm.value.address,
197
+        hosId: that.hosId,
198
+        laborers: [],
199
+        carNo: "",
200
+        busiType: { key: 'company_busi_type', value: '1' },
201
+      }
198 202
     };
199 203
     // 司机信息
200 204
     if(that.validateForm.value.laborerName0 && that.validateForm.value.laborerPhone0){
201
-      data.laborers = [{name: that.validateForm.value.laborerName0, mphone: that.validateForm.value.laborerPhone0}];
205
+      postData.company.laborers = [{name: that.validateForm.value.laborerName0, mphone: that.validateForm.value.laborerPhone0}];
202 206
       this.laborers.forEach(v => {
203
-        data.laborers.push({name: that.validateForm.value[v[0].name], mphone: that.validateForm.value[v[1].name]})
207
+        postData.company.laborers.push({name: that.validateForm.value[v[0].name], mphone: that.validateForm.value[v[1].name]})
204 208
       })
205 209
     }
206 210
     // 车牌号信息
207 211
     if(that.validateForm.value.carNo0){
208
-      data.carNo = that.validateForm.value.carNo0;
212
+      postData.company.carNo = that.validateForm.value.carNo0;
209 213
       this.carNos.forEach(v => {
210
-        data.carNo += "," + that.validateForm.value[v.name];
214
+        postData.company.carNo += "," + that.validateForm.value[v.name];
211 215
       })
212 216
     }
213 217
     if (!that.add) {
214
-      data = {...this.coopData, ...data};
218
+      postData.company = {...this.coopData, ...postData.company};
215 219
     }
216
-    console.log(data);
220
+    console.log(postData);
217 221
     that.mainService
218
-      .simplePost("addData", "company", data)
222
+      .coopData("addData", "company", postData)
219 223
       .subscribe((data) => {
220 224
         that.btnLoading = false;
221 225
         that.hideModal();

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

@@ -55,6 +55,36 @@
55 55
           <ul class="icon_lists dib-box">
56 56
           
57 57
             <li class="dib">
58
+              <span class="icon icon_transport">&#xe611;</span>
59
+                <div class="name">Icon - 统计分析</div>
60
+                <div class="code-name">&amp;#xe611;</div>
61
+              </li>
62
+          
63
+            <li class="dib">
64
+              <span class="icon icon_transport">&#xe630;</span>
65
+                <div class="name">资产</div>
66
+                <div class="code-name">&amp;#xe630;</div>
67
+              </li>
68
+          
69
+            <li class="dib">
70
+              <span class="icon icon_transport">&#xe653;</span>
71
+                <div class="name">控制</div>
72
+                <div class="code-name">&amp;#xe653;</div>
73
+              </li>
74
+          
75
+            <li class="dib">
76
+              <span class="icon icon_transport">&#xe690;</span>
77
+                <div class="name">建单统计</div>
78
+                <div class="code-name">&amp;#xe690;</div>
79
+              </li>
80
+          
81
+            <li class="dib">
82
+              <span class="icon icon_transport">&#xe6af;</span>
83
+                <div class="name">配置中心</div>
84
+                <div class="code-name">&amp;#xe6af;</div>
85
+              </li>
86
+          
87
+            <li class="dib">
58 88
               <span class="icon icon_transport">&#xe885;</span>
59 89
                 <div class="name">24gf-tags</div>
60 90
                 <div class="code-name">&amp;#xe885;</div>
@@ -750,9 +780,9 @@
750 780
 <pre><code class="language-css"
751 781
 >@font-face {
752 782
   font-family: 'icon_transport';
753
-  src: url('iconfont.woff2?t=1719826829751') format('woff2'),
754
-       url('iconfont.woff?t=1719826829751') format('woff'),
755
-       url('iconfont.ttf?t=1719826829751') format('truetype');
783
+  src: url('iconfont.woff2?t=1721896916365') format('woff2'),
784
+       url('iconfont.woff?t=1721896916365') format('woff'),
785
+       url('iconfont.ttf?t=1721896916365') format('truetype');
756 786
 }
757 787
 </code></pre>
758 788
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -779,6 +809,51 @@
779 809
         <ul class="icon_lists dib-box">
780 810
           
781 811
           <li class="dib">
812
+            <span class="icon icon_transport transport-Icon-tongjifenxi"></span>
813
+            <div class="name">
814
+              Icon - 统计分析
815
+            </div>
816
+            <div class="code-name">.transport-Icon-tongjifenxi
817
+            </div>
818
+          </li>
819
+          
820
+          <li class="dib">
821
+            <span class="icon icon_transport transport-zichan"></span>
822
+            <div class="name">
823
+              资产
824
+            </div>
825
+            <div class="code-name">.transport-zichan
826
+            </div>
827
+          </li>
828
+          
829
+          <li class="dib">
830
+            <span class="icon icon_transport transport-kongzhi"></span>
831
+            <div class="name">
832
+              控制
833
+            </div>
834
+            <div class="code-name">.transport-kongzhi
835
+            </div>
836
+          </li>
837
+          
838
+          <li class="dib">
839
+            <span class="icon icon_transport transport-jiandantongji"></span>
840
+            <div class="name">
841
+              建单统计
842
+            </div>
843
+            <div class="code-name">.transport-jiandantongji
844
+            </div>
845
+          </li>
846
+          
847
+          <li class="dib">
848
+            <span class="icon icon_transport transport-peizhizhongxin"></span>
849
+            <div class="name">
850
+              配置中心
851
+            </div>
852
+            <div class="code-name">.transport-peizhizhongxin
853
+            </div>
854
+          </li>
855
+          
856
+          <li class="dib">
782 857
             <span class="icon icon_transport transport-24gf-tags"></span>
783 858
             <div class="name">
784 859
               24gf-tags
@@ -1824,6 +1899,46 @@
1824 1899
           
1825 1900
             <li class="dib">
1826 1901
                 <svg class="icon svg-icon" aria-hidden="true">
1902
+                  <use xlink:href="#transport-Icon-tongjifenxi"></use>
1903
+                </svg>
1904
+                <div class="name">Icon - 统计分析</div>
1905
+                <div class="code-name">#transport-Icon-tongjifenxi</div>
1906
+            </li>
1907
+          
1908
+            <li class="dib">
1909
+                <svg class="icon svg-icon" aria-hidden="true">
1910
+                  <use xlink:href="#transport-zichan"></use>
1911
+                </svg>
1912
+                <div class="name">资产</div>
1913
+                <div class="code-name">#transport-zichan</div>
1914
+            </li>
1915
+          
1916
+            <li class="dib">
1917
+                <svg class="icon svg-icon" aria-hidden="true">
1918
+                  <use xlink:href="#transport-kongzhi"></use>
1919
+                </svg>
1920
+                <div class="name">控制</div>
1921
+                <div class="code-name">#transport-kongzhi</div>
1922
+            </li>
1923
+          
1924
+            <li class="dib">
1925
+                <svg class="icon svg-icon" aria-hidden="true">
1926
+                  <use xlink:href="#transport-jiandantongji"></use>
1927
+                </svg>
1928
+                <div class="name">建单统计</div>
1929
+                <div class="code-name">#transport-jiandantongji</div>
1930
+            </li>
1931
+          
1932
+            <li class="dib">
1933
+                <svg class="icon svg-icon" aria-hidden="true">
1934
+                  <use xlink:href="#transport-peizhizhongxin"></use>
1935
+                </svg>
1936
+                <div class="name">配置中心</div>
1937
+                <div class="code-name">#transport-peizhizhongxin</div>
1938
+            </li>
1939
+          
1940
+            <li class="dib">
1941
+                <svg class="icon svg-icon" aria-hidden="true">
1827 1942
                   <use xlink:href="#transport-24gf-tags"></use>
1828 1943
                 </svg>
1829 1944
                 <div class="name">24gf-tags</div>

+ 23 - 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=1719826829751') format('woff2'),
4
-       url('iconfont.woff?t=1719826829751') format('woff'),
5
-       url('iconfont.ttf?t=1719826829751') format('truetype');
3
+  src: url('iconfont.woff2?t=1721896916365') format('woff2'),
4
+       url('iconfont.woff?t=1721896916365') format('woff'),
5
+       url('iconfont.ttf?t=1721896916365') format('truetype');
6 6
 }
7 7
 
8 8
 .icon_transport {
@@ -13,6 +13,26 @@
13 13
   -moz-osx-font-smoothing: grayscale;
14 14
 }
15 15
 
16
+.transport-Icon-tongjifenxi:before {
17
+  content: "\e611";
18
+}
19
+
20
+.transport-zichan:before {
21
+  content: "\e630";
22
+}
23
+
24
+.transport-kongzhi:before {
25
+  content: "\e653";
26
+}
27
+
28
+.transport-jiandantongji:before {
29
+  content: "\e690";
30
+}
31
+
32
+.transport-peizhizhongxin:before {
33
+  content: "\e6af";
34
+}
35
+
16 36
 .transport-24gf-tags:before {
17 37
   content: "\e885";
18 38
 }

File diff suppressed because it is too large
+ 1 - 1
src/assets/iconfont/iconfont.js


+ 35 - 0
src/assets/iconfont/iconfont.json

@@ -6,6 +6,41 @@
6 6
   "description": "",
7 7
   "glyphs": [
8 8
     {
9
+      "icon_id": "6334918",
10
+      "name": "Icon - 统计分析",
11
+      "font_class": "Icon-tongjifenxi",
12
+      "unicode": "e611",
13
+      "unicode_decimal": 58897
14
+    },
15
+    {
16
+      "icon_id": "11016190",
17
+      "name": "资产",
18
+      "font_class": "zichan",
19
+      "unicode": "e630",
20
+      "unicode_decimal": 58928
21
+    },
22
+    {
23
+      "icon_id": "12975220",
24
+      "name": "控制",
25
+      "font_class": "kongzhi",
26
+      "unicode": "e653",
27
+      "unicode_decimal": 58963
28
+    },
29
+    {
30
+      "icon_id": "26226575",
31
+      "name": "建单统计",
32
+      "font_class": "jiandantongji",
33
+      "unicode": "e690",
34
+      "unicode_decimal": 59024
35
+    },
36
+    {
37
+      "icon_id": "21758119",
38
+      "name": "配置中心",
39
+      "font_class": "peizhizhongxin",
40
+      "unicode": "e6af",
41
+      "unicode_decimal": 59055
42
+    },
43
+    {
9 44
       "icon_id": "7542757",
10 45
       "name": "24gf-tags",
11 46
       "font_class": "24gf-tags",

BIN
src/assets/iconfont/iconfont.ttf


BIN
src/assets/iconfont/iconfont.woff


BIN
src/assets/iconfont/iconfont.woff2


+ 3 - 0
src/common.less

@@ -43,6 +43,9 @@
43 43
 .green {
44 44
   color: #49b856 !important;
45 45
 }
46
+.text_align_center{
47
+  text-align: center !important;
48
+}
46 49
 // 加载中
47 50
 .loadingFull {
48 51
   height: 100%;