Bladeren bron

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

seimin 1 maand geleden
bovenliggende
commit
6d8cee0cae
100 gewijzigde bestanden met toevoegingen van 8562 en 763 verwijderingen
  1. 5 0
      angular.json
  2. 28 0
      package-lock.json
  3. 1 0
      package.json
  4. 26 0
      src/app/app-routing.module.ts
  5. 3 1
      src/app/app.module.ts
  6. 357 0
      src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.html
  7. 893 0
      src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.less
  8. 399 0
      src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.ts
  9. 68 0
      src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.html
  10. 213 0
      src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.less
  11. 127 0
      src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.ts
  12. 31 5
      src/app/components/configurationCenter/configuration-drug/configuration-drug.component.html
  13. 55 8
      src/app/components/configurationCenter/configuration-drug/configuration-drug.component.ts
  14. 94 29
      src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.html
  15. 188 134
      src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.less
  16. 47 13
      src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.ts
  17. 89 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.html
  18. 700 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.less
  19. 226 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.ts
  20. 20 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.module.ts
  21. 132 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.html
  22. 288 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.less
  23. 309 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.ts
  24. 20 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.module.ts
  25. 15 2
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect.component.html
  26. 2 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect.component.less
  27. 27 1
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect.component.ts
  28. 4 0
      src/app/components/configurationCenter/configuration-inspect/configuration-inspect.module.ts
  29. 52 2
      src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component.html
  30. 117 0
      src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component.less
  31. 113 1
      src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component.ts
  32. 13 0
      src/app/components/configurationCenter/configuration-quick/configuration-quick.component.html
  33. 52 6
      src/app/components/configurationCenter/configuration-quick/configuration-quick.component.ts
  34. 250 3
      src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.html
  35. 4 0
      src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.less
  36. 367 28
      src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.ts
  37. 2 2
      src/app/components/incidentManagement/incident-create/incident-create.component.html
  38. 2 2
      src/app/components/incidentManagement/incident-create/incident-create.component.ts
  39. 3 2
      src/app/components/incidentManagement/incident-detail/incident-detail.component.html
  40. 1 1
      src/app/components/incidentManagement/incident-detail/incident-detail.component.less
  41. 4 2
      src/app/components/incidentManagement/incident-detail/incident-detail.component.ts
  42. 45 2
      src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.html
  43. 118 0
      src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.less
  44. 76 1
      src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.ts
  45. 9 0
      src/app/components/order-scope/order-scope.component.html
  46. 12 6
      src/app/components/order-scope/order-scope.component.ts
  47. 3 0
      src/app/components/select-menu/select-menu.component.ts
  48. 22 0
      src/app/guard/DataGenerate.guard.ts
  49. 22 0
      src/app/guard/inspectClosedLoopView.guard.ts
  50. 69 0
      src/app/services/date.service.ts
  51. 112 2
      src/app/services/main.service.ts
  52. 6 0
      src/app/services/tool.service.ts
  53. 72 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.html
  54. 194 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.less
  55. 192 0
      src/app/share/add-inspect-modal/add-inspect-modal.component.ts
  56. 442 430
      src/app/share/appraise-detail/appraise-detail.component.html
  57. 2 2
      src/app/share/appraise-detail/appraise-detail.component.ts
  58. 6 2
      src/app/share/businessData-detail-info-modal/businessData-detail-info-modal.component.html
  59. 35 17
      src/app/share/businessData-detail-modal/businessData-detail-modal.component.html
  60. 24 5
      src/app/share/businessData-detail-modal/businessData-detail-modal.component.less
  61. 3 0
      src/app/share/businessData-detail-modal/businessData-detail-modal.component.ts
  62. 1 0
      src/app/share/detail-drug/detail-drug.component.html
  63. 1 1
      src/app/share/detail-drug/detail-drug.component.less
  64. 19 0
      src/app/share/detail-ordinary/detail-ordinary.component.html
  65. 64 1
      src/app/share/detail-ordinary/detail-ordinary.component.less
  66. 1 0
      src/app/share/detail-others/detail-others.component.html
  67. 1 1
      src/app/share/detail-others/detail-others.component.less
  68. 1 0
      src/app/share/detail-patients/detail-patients.component.html
  69. 1 1
      src/app/share/detail-patients/detail-patients.component.less
  70. 1 0
      src/app/share/detail-sample/detail-sample.component.html
  71. 1 1
      src/app/share/detail-sample/detail-sample.component.less
  72. 12 1
      src/app/share/dialog-delete/dialog-delete.component.html
  73. 2 1
      src/app/share/dialog-delete/dialog-delete.component.less
  74. 13 0
      src/app/share/dialog-delete/dialog-delete.component.ts
  75. 4 0
      src/app/share/hs-prompt-modal/hs-prompt-modal.component.ts
  76. 13 0
      src/app/share/inspection-execute-detail/inspection-execute-detail.component.html
  77. 30 11
      src/app/share/order-detail/order-detail.component.html
  78. 35 0
      src/app/share/package-specimen-rule/package-specimen-rule.component.html
  79. 154 0
      src/app/share/package-specimen-rule/package-specimen-rule.component.less
  80. 70 0
      src/app/share/package-specimen-rule/package-specimen-rule.component.ts
  81. 3 2
      src/app/share/pathology-add/pathology-add.component.html
  82. 7 0
      src/app/share/pathology-add/pathology-add.component.less
  83. 19 1
      src/app/share/pathology-add/pathology-add.component.ts
  84. 26 0
      src/app/share/select-date-yytime/select-date-yytime.component.html
  85. 131 0
      src/app/share/select-date-yytime/select-date-yytime.component.less
  86. 53 0
      src/app/share/select-date-yytime/select-date-yytime.component.ts
  87. 24 0
      src/app/share/select-date/select-date.component.html
  88. 135 0
      src/app/share/select-date/select-date.component.less
  89. 47 0
      src/app/share/select-date/select-date.component.ts
  90. 20 0
      src/app/share/share.module.ts
  91. 92 0
      src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.html
  92. 261 0
      src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.less
  93. 158 0
      src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.ts
  94. 56 0
      src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.html
  95. 165 0
      src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.less
  96. 54 0
      src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.ts
  97. 34 24
      src/app/views/appraise-management/appraise-management.component.html
  98. 39 7
      src/app/views/appraise-management/appraise-management.component.ts
  99. 3 2
      src/app/views/appraise-management/appraise-management.module.ts
  100. 0 0
      src/app/views/assets-consumable/assets-consumable.component.html

+ 5 - 0
angular.json

@@ -30,6 +30,11 @@
30 30
                 "glob": "**/*",
31 31
                 "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",
32 32
                 "output": "/assets/"
33
+              },
34
+              {
35
+                "glob": "login.html",
36
+                "input": "src",
37
+                "output": "/"
33 38
               }
34 39
             ],
35 40
             "styles": [

+ 28 - 0
package-lock.json

@@ -29,6 +29,7 @@
29 29
         "echarts": "^4.6.0",
30 30
         "lodash-es": "^4.17.21",
31 31
         "ng-zorro-antd": "^8.5.2",
32
+        "ngx-color": "^4.1.1",
32 33
         "ngx-echarts": "^4.2.2",
33 34
         "ngx-markdown": "^8.2.2",
34 35
         "ngx-print": "~1.2.1",
@@ -716,6 +717,14 @@
716 717
         "node": ">=0.1.90"
717 718
       }
718 719
     },
720
+    "node_modules/@ctrl/tinycolor": {
721
+      "version": "2.6.1",
722
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-2.6.1.tgz",
723
+      "integrity": "sha512-xKN3lAA+xbNhP+JX3sLhzA65IGiKqun/Yf9jBlZX7Og0SxlCrrqKxqTd6ccn20fv3Cgcvq6KnjPhnmS+v7uAwQ==",
724
+      "engines": {
725
+        "node": ">=8.0.0"
726
+      }
727
+    },
719 728
     "node_modules/@dabh/diagnostics": {
720 729
       "version": "2.0.3",
721 730
       "resolved": "https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
@@ -7173,6 +7182,11 @@
7173 7182
         "node": ">=0.10.0"
7174 7183
       }
7175 7184
     },
7185
+    "node_modules/material-colors": {
7186
+      "version": "1.2.6",
7187
+      "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
7188
+      "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
7189
+    },
7176 7190
     "node_modules/md5.js": {
7177 7191
       "version": "1.3.5",
7178 7192
       "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz",
@@ -7655,6 +7669,20 @@
7655 7669
       "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-1.30.1.tgz",
7656 7670
       "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw=="
7657 7671
     },
7672
+    "node_modules/ngx-color": {
7673
+      "version": "4.1.1",
7674
+      "resolved": "https://registry.npmmirror.com/ngx-color/-/ngx-color-4.1.1.tgz",
7675
+      "integrity": "sha512-eWqhqc6iW7RmBF4nWRIpOCFJwoDOJm/rrdp8RJpxqcYmiuN3ZXXIcHLXK6ut2+yDb/wkI9bMdTXwC0AAgZcX/Q==",
7676
+      "dependencies": {
7677
+        "@ctrl/tinycolor": "^2.6.0",
7678
+        "material-colors": "^1.2.6",
7679
+        "tslib": "^1.9.0"
7680
+      },
7681
+      "peerDependencies": {
7682
+        "@angular/common": ">=8.0.0",
7683
+        "@angular/core": ">=8.0.0"
7684
+      }
7685
+    },
7658 7686
     "node_modules/ngx-echarts": {
7659 7687
       "version": "4.2.2",
7660 7688
       "resolved": "https://registry.npmmirror.com/ngx-echarts/-/ngx-echarts-4.2.2.tgz",

+ 1 - 0
package.json

@@ -38,6 +38,7 @@
38 38
     "echarts": "^4.6.0",
39 39
     "lodash-es": "^4.17.21",
40 40
     "ng-zorro-antd": "^8.5.2",
41
+    "ngx-color": "^4.1.1",
41 42
     "ngx-echarts": "^4.2.2",
42 43
     "ngx-markdown": "^8.2.2",
43 44
     "ngx-print": "~1.2.1",

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

@@ -23,11 +23,15 @@ import { IncidentConfigGuard } from './guard/IncidentConfig.guard';
23 23
 import { OtherConfigGuard } from './guard/OtherConfig.guard';
24 24
 //业务页面控制查看权限
25 25
 import { PageConfigGuard } from './guard/PageConfig.guard';
26
+// 护士端控制查看权限
26 27
 import { NurseConfigGuard } from './guard/nurseConfig.guard';
28
+// 数据生成查看权限
29
+import { DataGenerateGuard } from './guard/DataGenerate.guard';
27 30
 //系统配置查看权限
28 31
 import { SystemConfigGuard } from './guard/SystemConfig.guard';
29 32
 // 故障实时播报权限
30 33
 import { RealtimeBroadcastGuard } from './guard/realtimeBroadcast.guard';
34
+import { InspectClosedLoopViewGuard } from './guard/inspectClosedLoopView.guard';
31 35
 const routes: Routes = [
32 36
   // 默认
33 37
   {
@@ -149,6 +153,12 @@ const routes: Routes = [
149 153
     loadChildren: () => import('./views/nurse-config/nurse-config.module').then(m => m.NurseConfigModule),
150 154
     canActivate: [NurseConfigGuard]
151 155
   },
156
+	// 数据生成查看
157
+	{
158
+	  path: 'dataGenerate',
159
+	  loadChildren: () => import('./views/data-generate/data-generate.module').then(m => m.DataGenerateModule),
160
+	  canActivate: [DataGenerateGuard]
161
+	},
152 162
   // 问卷预览
153 163
   {
154 164
     path: "preview",
@@ -185,6 +195,22 @@ const routes: Routes = [
185 195
     path: "newStatistics",
186 196
     loadChildren: () => import("./views/new-statistics/new-statistics.module").then((m) => m.NewStatisticsModule),
187 197
   },
198
+  // 批量发起陪检
199
+  {
200
+    path: 'batchInspection',
201
+    loadChildren: () => import('./views/batch-inspection/batch-inspection.module').then(m => m.BatchInspectionModule),
202
+  },
203
+  // 陪检闭环视图
204
+  {
205
+    path: 'inspectClosedLoopView',
206
+    loadChildren: () => import('./views/inspect-closed-loop-view/inspect-closed-loop-view.module').then(m => m.InspectClosedLoopViewModule),
207
+    canActivate: [InspectClosedLoopViewGuard]
208
+  },
209
+  // 标本打包
210
+  {
211
+    path: 'batchSpecimen',
212
+    loadChildren: () => import('./views/batch-specimen/batch-specimen.module').then(m => m.BatchSpecimenModule),
213
+  },
188 214
   // 临时路由
189 215
   {
190 216
     path: "redirect",

+ 3 - 1
src/app/app.module.ts

@@ -13,6 +13,7 @@ import { NZ_I18N, zh_CN, NzConfig, NZ_CONFIG } from 'ng-zorro-antd';
13 13
 import { RouteReuseStrategy } from '@angular/router';
14 14
 import { SimpleReuseStrategy } from './SimpleReuseStrategy';
15 15
 import { MarkdownModule } from 'ngx-markdown';
16
+// import { ColorSketchModule   } from 'ngx-color/sketch';
16 17
 const ngZorroConfig: NzConfig = {
17 18
   // 注意组件名称没有 nz 前缀
18 19
   notification: { nzTop: 100 }
@@ -29,7 +30,8 @@ registerLocaleData(zh);
29 30
     AppRoutingModule,
30 31
     HttpClientModule,
31 32
     ShareModule,
32
-		MarkdownModule.forRoot()
33
+		MarkdownModule.forRoot(),
34
+		// ColorSketchModule
33 35
   ],
34 36
   providers: [
35 37
     { provide: NZ_I18N, useValue: zh_CN },

+ 357 - 0
src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.html

@@ -0,0 +1,357 @@
1
+<div class="content specimen" id="dictionary">
2
+  <div class="contentInner">
3
+		<div class="address">
4
+		  <overlay-scrollbars #osComponentRef1 class="contentBody">
5
+		    <div class="contentItem" [title]="item.name" [ngClass]="{ active: item.key == activeDictionaryKey }" (click)="clickDictionaryKey(item)" *ngFor="let item of dictionaryKeyList">{{ item.name }}</div>
6
+		  </overlay-scrollbars>
7
+		</div>
8
+    <div class="addressAssign">
9
+      <div class="contentBody2">
10
+        <div class="TaskTypeManagement" *ngIf="activeDictionaryKey=='specimen'">
11
+          <div class="taskTypeInfo">
12
+            <div class="top">
13
+              <div class="item" (click)="tabModal('course')" [ngClass]="{'items':tabModalName=='course'}">
14
+                过程数据
15
+              </div>
16
+            </div>
17
+            <div class="list" #scrollContainer *ngIf="!loading">
18
+              <!-- 过程数据 -->
19
+								<div class="top-style">
20
+									<div class="sign"></div>
21
+									<div>查询范围</div>
22
+								</div>
23
+								
24
+								<!-- 采集开始时间 -->
25
+								<div class="display_flex align-items_center mb8">
26
+								  <nz-form-label class="label" nzRequired>采集开始时间</nz-form-label>
27
+								  <nz-range-picker nzShowTime (nzOnCalendarChange)="onCalendarChangeDate($event)" [(ngModel)]="dateRange" (ngModelChange)="changeDate($event)"></nz-range-picker>
28
+								</div>
29
+								
30
+                <!-- 标本状态 -->
31
+                <div class="display_flex align-items_center mb8">
32
+                  <nz-form-label class="label" nzRequired>标本状态</nz-form-label>
33
+                  <nz-select class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
34
+										nzPlaceHolder="请选择标本状态" [(ngModel)]="transState">
35
+                    <ng-container *ngFor="let option of drugStatusList">
36
+                      <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
37
+                    </ng-container>
38
+                  </nz-select>
39
+                </div>
40
+								
41
+								<div class="display_flex align-items_center mb8">
42
+									<nz-form-label class="label" nzRequired>是否关联工单</nz-form-label>
43
+									<nz-radio-group type="active" [(ngModel)]="bindOrder">
44
+										<label nz-radio [nzValue]="1">是</label>
45
+										<label nz-radio [nzValue]="0">否</label>
46
+									</nz-radio-group>
47
+								</div>
48
+								
49
+								<div class="display_flex align-items_center mb8">
50
+									<nz-form-label class="label">编码</nz-form-label>
51
+									<input nz-input [(ngModel)]="code" class="w350px"/>
52
+								</div>
53
+							<div class="interval"></div>
54
+							<div class="top-style">
55
+								<div class="sign"></div>
56
+								<div>生成规则</div>
57
+							</div>
58
+							<!-- 收取时间间隔区间 -->
59
+							<div class="display_flex align-items_center mb8">
60
+								<nz-form-label class="label max" nzRequired>收取时间间隔区间</nz-form-label>
61
+								<input nz-input [(ngModel)]="arriveStartMinute" class="min-input"/>
62
+								<span class="span"> ~	</span>
63
+								<input nz-input [(ngModel)]="arriveEndMinute" class="min-input"/>
64
+								&nbsp;&nbsp;<span>分钟</span>
65
+							</div>
66
+							<!-- 送达时间间隔区间 -->
67
+							<div class="display_flex align-items_center mb8">
68
+								<nz-form-label class="label max" nzRequired>送达时间间隔区间</nz-form-label>
69
+								<input nz-input [(ngModel)]="sendStartMinute" class="min-input"/>
70
+								<span class="span">~</span>
71
+								<input nz-input [(ngModel)]="sendEndMinute" class="min-input"/>
72
+								&nbsp;&nbsp;<span>分钟</span>
73
+							</div>
74
+							<!-- 目标状态 -->
75
+							<div class="display_flex align-items_center mb8">
76
+								<nz-form-label class="label max" nzRequired>目标状态</nz-form-label>
77
+								<nz-radio-group type="active" [(ngModel)]="completeState">
78
+									<label nz-radio [nzValue]="1">到达</label>
79
+									<label nz-radio [nzValue]="2">送达</label>
80
+								</nz-radio-group>
81
+							</div>
82
+							<!-- 配送人员 -->
83
+							<div class="display_flex align-items_center mb8">
84
+							  <nz-form-label class="label max" nzRequired>配送人员</nz-form-label>
85
+								<nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
86
+									nzPlaceHolder="请选择配送人员" [(ngModel)]="userIds" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
87
+								  (nzOnSearch)="changeUser($event)" nzAllowClear>
88
+								  <ng-container *ngFor="let option of distributionList">
89
+								    <nz-option *ngIf="!isLoading" [nzLabel]="option.name +' ('+ option.account +')'" [nzValue]="option.id"></nz-option>
90
+								  </ng-container>
91
+								  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
92
+								    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
93
+								  </nz-option>
94
+								</nz-select>
95
+							</div>
96
+              <div class="bottom">
97
+                <button class="login-form-button" nzType="primary" nz-button (click)="generateForm()">生成数据</button>
98
+								<button class="login-form-button" nzType="primary" [nzLoading]="btnLoading2" nz-button (click)="submitForm()">查询</button>
99
+								<button class="login-form-button" nzType="default" [nzLoading]="btnLoading3" nz-button (click)="resetForm()">重置</button>
100
+              </div>
101
+							<div class="tip" *ngIf="showNum">共查询数据 <span class="weight">{{queryNum}}</span> 条</div>
102
+							<div class="tip" *ngIf="showGenerate">共修改数据 <span class="weight">{{generateObj.count}}</span> 条,生成日志 <span class="weight">{{generateObj.logCount || 0}}</span> 条</div>
103
+						</div>
104
+            <div class="list" *ngIf="loading">
105
+              <div class="loadingFull display_flex justify-content_flex-center align-items_center">
106
+                <div class="loadingFullInner">
107
+                  <img src="../../../assets/images/loading.gif" alt="">
108
+                  <div>加载中...</div>
109
+                </div>
110
+              </div>
111
+            </div>
112
+          </div>
113
+        </div>
114
+				<div class="TaskTypeManagement" *ngIf="activeDictionaryKey=='drugsBag'">
115
+					<div class="taskTypeInfo">
116
+					  <div class="top">
117
+					    <div class="item" (click)="tabModal('course')" [ngClass]="{'items':tabModalName=='course'}">
118
+					      过程数据
119
+					    </div>
120
+					  </div>
121
+					  <div class="list"  #scrollContainer *ngIf="!loading">
122
+					    <!-- 过程数据 -->
123
+								<div class="top-style">
124
+									<div class="sign"></div>
125
+									<div>查询范围</div>
126
+								</div>
127
+								
128
+								<!-- 同步开始时间 -->
129
+								<div class="display_flex align-items_center mb8">
130
+								  <nz-form-label class="label" nzRequired>同步开始时间</nz-form-label>
131
+								  <nz-range-picker nzShowTime (nzOnCalendarChange)="onCalendarChangeDate($event)" [(ngModel)]="dateRange" (ngModelChange)="changeDate($event)"></nz-range-picker>
132
+								</div>
133
+								
134
+					      <!-- 药品状态 -->
135
+					      <div class="display_flex align-items_center mb8">
136
+					        <nz-form-label class="label" nzRequired>药品状态</nz-form-label>
137
+					        <nz-select class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
138
+										nzPlaceHolder="请选择药品状态" [(ngModel)]="transState">
139
+					          <ng-container *ngFor="let option of drugStatusList">
140
+					            <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
141
+					          </ng-container>
142
+					        </nz-select>
143
+					      </div>
144
+								
145
+								<div class="display_flex align-items_center mb8">
146
+									<nz-form-label class="label" nzRequired>是否关联工单</nz-form-label>
147
+									<nz-radio-group type="active" [(ngModel)]="bindOrder">
148
+										<label nz-radio [nzValue]="1">是</label>
149
+										<label nz-radio [nzValue]="0">否</label>
150
+									</nz-radio-group>
151
+								</div>
152
+								
153
+								<div class="display_flex align-items_center mb8">
154
+									<nz-form-label class="label">编码</nz-form-label>
155
+									<input nz-input [(ngModel)]="code" class="w350px"/>
156
+								</div>
157
+							<div class="interval"></div>
158
+							<div class="top-style">
159
+								<div class="sign"></div>
160
+								<div>生成规则</div>
161
+							</div>
162
+							<!-- 收取时间间隔区间 -->
163
+							<div class="display_flex align-items_center mb8">
164
+								<nz-form-label class="label max" nzRequired>收取时间间隔区间</nz-form-label>
165
+								<input nz-input [(ngModel)]="arriveStartMinute" class="min-input"/>
166
+								<span class="span"> ~	</span>
167
+								<input nz-input [(ngModel)]="arriveEndMinute" class="min-input"/>
168
+								&nbsp;&nbsp;<span>分钟</span>
169
+							</div>
170
+							<!-- 送达时间间隔区间 -->
171
+							<div class="display_flex align-items_center mb8">
172
+								<nz-form-label class="label max" nzRequired>送达时间间隔区间</nz-form-label>
173
+								<input nz-input [(ngModel)]="sendStartMinute" class="min-input"/>
174
+								<span class="span">~</span>
175
+								<input nz-input [(ngModel)]="sendEndMinute" class="min-input"/>
176
+								&nbsp;&nbsp;<span>分钟</span>
177
+							</div>
178
+							<!-- 目标状态 -->
179
+							<div class="display_flex align-items_center mb8">
180
+								<nz-form-label class="label max" nzRequired>目标状态</nz-form-label>
181
+								<nz-radio-group type="active" [(ngModel)]="completeState">
182
+									<label nz-radio [nzValue]="1">到达</label>
183
+									<label nz-radio [nzValue]="2">送达</label>
184
+								</nz-radio-group>
185
+							</div>
186
+							<!-- 配送人员 -->
187
+							<div class="display_flex align-items_center mb8">
188
+							  <nz-form-label class="label max" nzRequired>配送人员</nz-form-label>
189
+								<nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
190
+									nzPlaceHolder="请选择配送人员" [(ngModel)]="userIds" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
191
+								  (nzOnSearch)="changeUser($event)" nzAllowClear>
192
+								  <ng-container *ngFor="let option of distributionList">
193
+								    <nz-option *ngIf="!isLoading" [nzLabel]="option.name +' ('+ option.account +')'" [nzValue]="option.id"></nz-option>
194
+								  </ng-container>
195
+								  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
196
+								    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
197
+								  </nz-option>
198
+								</nz-select>
199
+							</div>
200
+							<!-- 接收人员 -->
201
+							<div class="display_flex align-items_center mb8">
202
+							  <nz-form-label class="label max" nzRequired>接收人员</nz-form-label>
203
+								<nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
204
+									nzPlaceHolder="请选择接收人员" [(ngModel)]="receiverUserIds" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
205
+								  (nzOnSearch)="changeReceptionUser($event)" nzAllowClear>
206
+								  <ng-container *ngFor="let option of receptionList">
207
+								    <nz-option *ngIf="!isLoading" [nzLabel]="option.name +' ('+ option.account +')'" [nzValue]="option.id"></nz-option>
208
+								  </ng-container>
209
+								  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
210
+								    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
211
+								  </nz-option>
212
+								</nz-select>
213
+							</div>
214
+					    <div class="bottom">
215
+					      <button class="login-form-button" nzType="primary" nz-button (click)="generateForm()">生成数据</button>
216
+								<button class="login-form-button" nzType="primary" [nzLoading]="btnLoading2" nz-button (click)="submitForm()">查询</button>
217
+								<button class="login-form-button" nzType="default" [nzLoading]="btnLoading3" nz-button (click)="resetForm()">重置</button>
218
+					    </div>
219
+							<div class="tip" *ngIf="showNum">共查询数据 <span class="weight">{{queryNum}}</span> 条</div>
220
+							<div class="tip" *ngIf="showGenerate">共修改数据 <span class="weight">{{generateObj.count}}</span> 条,生成日志 <span class="weight">{{generateObj.logCount || 0}}</span> 条</div>
221
+					  </div>
222
+					  <div class="list" *ngIf="loading">
223
+					    <div class="loadingFull display_flex justify-content_flex-center align-items_center">
224
+					      <div class="loadingFullInner">
225
+					        <img src="../../../assets/images/loading.gif" alt="">
226
+					        <div>加载中...</div>
227
+					      </div>
228
+					    </div>
229
+					  </div>
230
+					</div>
231
+				</div>
232
+				<div class="TaskTypeManagement" *ngIf="activeDictionaryKey=='blood'">
233
+					<div class="taskTypeInfo">
234
+					  <div class="top">
235
+					    <div class="item" (click)="tabModal('course')" [ngClass]="{'items':tabModalName=='course'}">
236
+					      过程数据
237
+					    </div>
238
+					  </div>
239
+					  <div class="list" #scrollContainer *ngIf="!loading">
240
+					    <!-- 过程数据 -->
241
+								<div class="top-style">
242
+									<div class="sign"></div>
243
+									<div>查询范围</div>
244
+								</div>
245
+								
246
+								<!-- 发血开始时间 -->
247
+								<div class="display_flex align-items_center mb8">
248
+								  <nz-form-label class="label" nzRequired>发血开始时间</nz-form-label>
249
+								  <nz-range-picker nzShowTime (nzOnCalendarChange)="onCalendarChangeDate($event)" [(ngModel)]="dateRange" (ngModelChange)="changeDate($event)"></nz-range-picker>
250
+								</div>
251
+								
252
+					      <!-- 血制品状态 -->
253
+					      <div class="display_flex align-items_center mb8">
254
+					        <nz-form-label class="label" nzRequired>血制品状态</nz-form-label>
255
+					        <nz-select class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
256
+										nzPlaceHolder="请选择血制品状态" [(ngModel)]="transState">
257
+					          <ng-container *ngFor="let option of drugStatusList">
258
+					            <nz-option *ngIf="!isLoading" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
259
+					          </ng-container>
260
+					        </nz-select>
261
+					      </div>
262
+								
263
+								<div class="display_flex align-items_center mb8">
264
+									<nz-form-label class="label" nzRequired>是否关联工单</nz-form-label>
265
+									<nz-radio-group type="active" [(ngModel)]="bindOrder">
266
+										<label nz-radio [nzValue]="1">是</label>
267
+										<label nz-radio [nzValue]="0">否</label>
268
+									</nz-radio-group>
269
+								</div>
270
+								
271
+								<div class="display_flex align-items_center mb8">
272
+									<nz-form-label class="label">编码</nz-form-label>
273
+									<input nz-input [(ngModel)]="code" class="w350px"/>
274
+								</div>
275
+							<div class="interval"></div>
276
+							<div class="top-style">
277
+								<div class="sign"></div>
278
+								<div>生成规则</div>
279
+							</div>
280
+							<!-- 收取时间间隔区间 -->
281
+							<div class="display_flex align-items_center mb8">
282
+								<nz-form-label class="label max" nzRequired>收取时间间隔区间</nz-form-label>
283
+								<input nz-input [(ngModel)]="arriveStartMinute" class="min-input"/>
284
+								<span class="span"> ~	</span>
285
+								<input nz-input [(ngModel)]="arriveEndMinute" class="min-input"/>
286
+								&nbsp;&nbsp;<span>分钟</span>
287
+							</div>
288
+							<!-- 送达时间间隔区间 -->
289
+							<div class="display_flex align-items_center mb8">
290
+								<nz-form-label class="label max" nzRequired>送达时间间隔区间</nz-form-label>
291
+								<input nz-input [(ngModel)]="sendStartMinute" class="min-input"/>
292
+								<span class="span">~</span>
293
+								<input nz-input [(ngModel)]="sendEndMinute" class="min-input"/>
294
+								&nbsp;&nbsp;<span>分钟</span>
295
+							</div>
296
+							<!-- 目标状态 -->
297
+							<div class="display_flex align-items_center mb8">
298
+								<nz-form-label class="label max" nzRequired>目标状态</nz-form-label>
299
+								<nz-radio-group type="active" [(ngModel)]="completeState">
300
+									<label nz-radio [nzValue]="1">到达</label>
301
+									<label nz-radio [nzValue]="2">送达</label>
302
+								</nz-radio-group>
303
+							</div>
304
+							<!-- 配送人员 -->
305
+							<div class="display_flex align-items_center mb8">
306
+							  <nz-form-label class="label max" nzRequired>配送人员</nz-form-label>
307
+								<nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
308
+									nzPlaceHolder="请选择配送人员" [(ngModel)]="userIds" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
309
+								  (nzOnSearch)="changeUser($event)" nzAllowClear>
310
+								  <ng-container *ngFor="let option of distributionList">
311
+								    <nz-option *ngIf="!isLoading" [nzLabel]="option.name +' ('+ option.account +')'" [nzValue]="option.id"></nz-option>
312
+								  </ng-container>
313
+								  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
314
+								    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
315
+								  </nz-option>
316
+								</nz-select>
317
+							</div>
318
+							<!-- 接收人员 -->
319
+							<div class="display_flex align-items_center mb8">
320
+							  <nz-form-label class="label max" nzRequired>接收人员</nz-form-label>
321
+								<nz-select nzMode="multiple" class="w320px" [nzDropdownMatchSelectWidth]="false" nzAllowClear
322
+									nzPlaceHolder="请选择接收人员" [(ngModel)]="receiverUserIds" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch
323
+								  (nzOnSearch)="changeReceptionUser($event)" nzAllowClear>
324
+								  <ng-container *ngFor="let option of receptionList">
325
+								    <nz-option *ngIf="!isLoading" [nzLabel]="option.name +' ('+ option.account +')'" [nzValue]="option.id"></nz-option>
326
+								  </ng-container>
327
+								  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
328
+								    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
329
+								  </nz-option>
330
+								</nz-select>
331
+							</div>
332
+					    <div class="bottom">
333
+					      <button class="login-form-button" nzType="primary" nz-button (click)="generateForm()">生成数据</button>
334
+								<button class="login-form-button" nzType="primary" [nzLoading]="btnLoading2" nz-button (click)="submitForm()">查询</button>
335
+								<button class="login-form-button" nzType="default" [nzLoading]="btnLoading3" nz-button (click)="resetForm()">重置</button>
336
+					    </div>
337
+							<div class="tip" *ngIf="showNum">共查询数据 <span class="weight">{{queryNum}}</span> 条</div>
338
+							<div class="tip" *ngIf="showGenerate">共修改数据 <span class="weight">{{generateObj.count}}</span> 条,生成日志 <span class="weight">{{generateObj.logCount || 0}}</span> 条</div>
339
+					  </div>
340
+					  <div class="list" *ngIf="loading">
341
+					    <div class="loadingFull display_flex justify-content_flex-center align-items_center">
342
+					      <div class="loadingFullInner">
343
+					        <img src="../../../assets/images/loading.gif" alt="">
344
+					        <div>加载中...</div>
345
+					      </div>
346
+					    </div>
347
+					  </div>
348
+					</div>
349
+				</div>
350
+      </div>
351
+    </div>
352
+  </div>
353
+	
354
+	<app-dialog-delete [delModal]="generateModal" (hideDelModalEvent)="hideGenerateModal()" [btnLoading]="btnLoading1"
355
+	  (confirmDelEvent)="confirmGenerate()" content="你确认要执行数据生成吗?"></app-dialog-delete>
356
+		
357
+</div>

+ 893 - 0
src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.less

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

+ 399 - 0
src/app/components/configurationCenter/configuration-closedData/configuration-closedData.component.ts

@@ -0,0 +1,399 @@
1
+import { Component, OnInit, ElementRef, ViewChild } from "@angular/core";
2
+import { MainService } from "../../../services/main.service";
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { Subject } from 'rxjs';
6
+import { debounceTime } from 'rxjs/operators';
7
+import { format } from 'date-fns';
8
+
9
+@Component({
10
+  selector: "app-configuration-closedData",
11
+  templateUrl: "./configuration-closedData.component.html",
12
+  styleUrls: ["./configuration-closedData.component.less"],
13
+})
14
+export class ConfigurationClosedDataComponent implements OnInit {
15
+	@ViewChild('scrollContainer', {static: false}) scrollContainer: ElementRef;
16
+	
17
+  loading:boolean = false; //页面加载的loading
18
+  btnLoading:boolean = false; //提交按钮的loading
19
+  tabModalName:string = 'course'; //当前选中的tab
20
+  hosId = this.tool.getCurrentHospital().id; //当前院区
21
+	
22
+	// tab类型
23
+	dictionaryKeyList:any[] = [
24
+		{
25
+			name:'检验标本',key:'specimen'
26
+		},
27
+		{
28
+			name:'病理申请单',key:'pathology'
29
+		},
30
+		{
31
+			name:'药品',key:'drugsBag'
32
+		},
33
+		{
34
+			name:'血制品',key:'blood'
35
+		},
36
+		{
37
+			name:'预约检查',key:'subscribe'
38
+		}
39
+	];
40
+	btnLoading1:boolean = false;
41
+	btnLoading2:boolean = false;
42
+	btnLoading3:boolean = false;
43
+	// 是否关联工单
44
+	bindOrder:any = 0;
45
+	// 同步开始时间
46
+	dateRange:any = [];
47
+	// 业务状态
48
+	 transState:any;
49
+	// 目标状态
50
+	completeState:any = 2;
51
+	// 收取时间间隔区间
52
+	arriveStartMinute:any;
53
+	// 收取时间间隔区间
54
+	arriveEndMinute:any;
55
+	// 送达时间间隔区间
56
+	sendStartMinute:any;
57
+	// 送达时间间隔区间
58
+	sendEndMinute:any;
59
+	code:any;
60
+  // 配置
61
+  configs:any = {};
62
+  // 任务类型
63
+  tasktype:any = {};
64
+  searchTimerSubject = new Subject();
65
+  constructor(private mainService: MainService,private tool: ToolService,private msg: NzMessageService) {}
66
+
67
+  ngOnInit():void {
68
+    // todo
69
+    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
70
+      let fun = v[0];
71
+      fun.call(this, v[1]);
72
+    });
73
+    this.getSpeDic();
74
+		this.getUsers();
75
+		this.getReceptionUsers();
76
+  }
77
+	
78
+	// 点击数据字典key
79
+	activeDictionaryKey:any = 'specimen';
80
+	clickDictionaryKey(item){
81
+	  this.activeDictionaryKey = item.key;
82
+		this.getSpeDic();
83
+		this.resetForm();
84
+	}
85
+	
86
+	onCalendarChangeDate(dateArr){
87
+	  console.log(dateArr)
88
+	  if(dateArr.length == 2){
89
+	    let dateStart = new Date(dateArr[0]);
90
+	    let dateEnd = new Date(dateArr[1]);
91
+	    dateStart.setHours(0,0,0);
92
+	    dateEnd.setHours(23,59,59);
93
+	    this.dateRange = [dateStart,dateEnd];
94
+	  }
95
+	}
96
+	
97
+	// 日期选择
98
+	startDate: string; //发起时间开始
99
+	endDate: string; //发起时间结束
100
+	changeDate(result?): void {
101
+	  if (!result) {
102
+	    this.startDate = this.endDate = "";
103
+	    return;
104
+	  }
105
+		console.log(1111,result)
106
+	  this.startDate = format(result[0], 'yyyy-MM-dd HH:mm:ss');
107
+	  this.endDate = format(result[1], 'yyyy-MM-dd HH:mm:ss');
108
+	}
109
+	
110
+  // 切换tab
111
+  tabModal(tabModalName:string){
112
+    this.tabModalName = tabModalName;
113
+  }
114
+	
115
+	// 生成数据
116
+	queryNum:any;
117
+	generateModal:boolean = false;
118
+	generateForm(){
119
+		if(this.activeDictionaryKey == 'specimen'){
120
+			if(!this.startDate || !this.endDate){
121
+				this.msg.error("采集开始时间不能为空");
122
+				return
123
+			}
124
+			if(!this.transState){
125
+				this.msg.error("标本状态不能为空");
126
+				return
127
+			}
128
+			
129
+		}else if (this.activeDictionaryKey == 'drugsBag'){
130
+			if(!this.startDate || !this.endDate){
131
+				this.msg.error("同步开始时间不能为空");
132
+				return
133
+			}
134
+			if(!this.transState){
135
+				this.msg.error("药品状态不能为空");
136
+				return
137
+			}
138
+		}else if (this.activeDictionaryKey == 'blood'){
139
+			if(!this.startDate || !this.endDate){
140
+				this.msg.error("发血开始时间不能为空");
141
+				return
142
+			}
143
+			if(!this.transState){
144
+				this.msg.error("血制品状态不能为空");
145
+				return
146
+			}
147
+		}
148
+
149
+		if(!this.arriveStartMinute || !this.arriveEndMinute){
150
+			this.msg.error("收取时间间隔区间不能为空");
151
+			return
152
+		}
153
+		if(!this.sendStartMinute || !this.sendEndMinute){
154
+			this.msg.error("送达时间间隔区间不能为空");
155
+			return
156
+		}
157
+		if(this.userIds.length==0){
158
+			this.msg.error("配送人员不能为空");
159
+			return
160
+		}
161
+		if (this.activeDictionaryKey != 'specimen'){
162
+			if(this.receiverUserIds.length==0){
163
+				this.msg.error("接收人员不能为空");
164
+				return
165
+			}
166
+		}
167
+		this.generateModal = true
168
+	}
169
+	
170
+	hideGenerateModal() {
171
+	  this.generateModal = false;
172
+		this.btnLoading1 = false;
173
+	}
174
+	
175
+	showGenerate:boolean = false;
176
+	generateObj:any;
177
+	confirmGenerate() {
178
+	  var that = this;
179
+	  let list = this.drugStatusList.find(i=> i.id == this.transState)
180
+	  let postData:any = {
181
+	  	patchDataConfig:{
182
+	  		hosId: this.hosId,
183
+	  		bindOrder: this.bindOrder,
184
+	  		transStartTime: this.startDate || undefined,
185
+	  		transEndTime: this.endDate || undefined,
186
+	  		transState: list || undefined,
187
+	  		transType: {
188
+	  			value: this.activeDictionaryKey || undefined
189
+	  		},
190
+				code: this.code || undefined,
191
+	  		completeState: this.completeState,
192
+	  		arriveStartMinute: this.arriveStartMinute || undefined,
193
+	  		arriveEndMinute: this.arriveEndMinute || undefined,
194
+	  		sendStartMinute: this.sendStartMinute || undefined,
195
+	  		sendEndMinute: this.sendEndMinute || undefined,
196
+	  		userIds: this.userIds.length>0 ? this.userIds.join(',') : undefined,
197
+				receiverUserIds: this.receiverUserIds.length>0 ? this.receiverUserIds.join(',') : undefined
198
+			}
199
+	  };
200
+	  this.btnLoading1 = true;
201
+	  this.mainService
202
+	    .generateData( postData).subscribe((result:any) => {
203
+	      this.btnLoading1 = false;
204
+	      if (result.state == 200) {
205
+					this.hideGenerateModal()
206
+					this.showNum = false
207
+	        this.showGenerate = true
208
+	        this.generateObj = result.data
209
+					setTimeout(_=>{
210
+						this.scrollContainer.nativeElement.scrollTop = this.scrollContainer.nativeElement.scrollHeight;
211
+					},100)
212
+	      }else{
213
+					this.hideGenerateModal()
214
+					this.msg.error(result.msg);
215
+				}
216
+	    });
217
+	}
218
+	
219
+  // 查询
220
+	showNum:boolean = false;
221
+  submitForm() {
222
+		if(this.activeDictionaryKey == 'specimen'){
223
+			if(!this.startDate || !this.endDate){
224
+				this.msg.error("采集开始时间不能为空");
225
+				return
226
+			}
227
+			if(!this.transState){
228
+				this.msg.error("标本状态不能为空");
229
+				return
230
+			}
231
+			
232
+		}else if (this.activeDictionaryKey == 'drugsBag'){
233
+			if(!this.startDate || !this.endDate){
234
+				this.msg.error("同步开始时间不能为空");
235
+				return
236
+			}
237
+			if(!this.transState){
238
+				this.msg.error("药品状态不能为空");
239
+				return
240
+			}
241
+		}else if (this.activeDictionaryKey == 'blood'){
242
+			if(!this.startDate || !this.endDate){
243
+				this.msg.error("发血开始时间不能为空");
244
+				return
245
+			}
246
+			if(!this.transState){
247
+				this.msg.error("血制品状态不能为空");
248
+				return
249
+			}
250
+		}
251
+		if(!this.arriveStartMinute || !this.arriveEndMinute){
252
+			this.msg.error("收取时间间隔区间不能为空");
253
+			return
254
+		}
255
+		if(!this.sendStartMinute || !this.sendEndMinute){
256
+			this.msg.error("送达时间间隔区间不能为空");
257
+			return
258
+		}
259
+		if(this.userIds.length==0){
260
+			this.msg.error("配送人员不能为空");
261
+			return
262
+		}
263
+		if (this.activeDictionaryKey != 'specimen'){
264
+			if(this.receiverUserIds.length==0){
265
+				this.msg.error("接收人员不能为空");
266
+				return
267
+			}
268
+		}
269
+    let list = this.drugStatusList.find(i=> i.id == this.transState)
270
+    let postData:any = {
271
+    	patchDataConfig:{
272
+    		hosId: this.hosId,
273
+    		bindOrder: this.bindOrder,
274
+    		transStartTime: this.startDate || undefined,
275
+    		transEndTime: this.endDate || undefined,
276
+    		transState: list || undefined,
277
+    		transType: {
278
+    			value: this.activeDictionaryKey || undefined
279
+    		},
280
+				code: this.code || undefined,
281
+    		completeState: this.completeState,
282
+    		arriveStartMinute: this.arriveStartMinute || undefined,
283
+    		arriveEndMinute: this.arriveEndMinute || undefined,
284
+    		sendStartMinute: this.sendStartMinute || undefined,
285
+    		sendEndMinute: this.sendEndMinute || undefined,
286
+    		userIds: this.userIds.length>0 ? this.userIds.join(',') : undefined,
287
+				receiverUserIds: this.receiverUserIds.length>0 ? this.receiverUserIds.join(',') : undefined
288
+			}
289
+    };
290
+    this.btnLoading2 = true;
291
+    this.mainService
292
+      .queryCount( postData).subscribe((result:any) => {
293
+        this.btnLoading2 = false;
294
+        if (result.state == 200) {
295
+					this.showNum = true
296
+					this.showGenerate = false
297
+          this.queryNum = result.data
298
+					setTimeout(_=>{
299
+						this.scrollContainer.nativeElement.scrollTop = this.scrollContainer.nativeElement.scrollHeight;
300
+					},100)
301
+        }else{
302
+					this.msg.error(result.msg);
303
+				}
304
+      });
305
+  }
306
+	
307
+	// 重置
308
+	resetForm(){
309
+		this.showNum = false;
310
+		this.showGenerate = false;
311
+		this.bindOrder = 0;
312
+		this.startDate = "";
313
+		this.endDate = "";
314
+		this.dateRange = [];
315
+		this.code = undefined;
316
+		this.transState = undefined;
317
+		this.completeState = 2;
318
+		this.arriveStartMinute = undefined;
319
+		this.arriveEndMinute = undefined;
320
+		this.sendStartMinute = undefined;
321
+		this.sendEndMinute = undefined;
322
+		this.userIds = [];
323
+		this.receiverUserIds = [];
324
+	}
325
+	
326
+	// 获取字典
327
+	drugStatusList:any = [];
328
+	getSpeDic(){
329
+		let key = null;
330
+		if(this.activeDictionaryKey=='specimen'){
331
+			key = 'speState'
332
+		}else if (this.activeDictionaryKey=='drugsBag'){
333
+			key = 'drug_state'
334
+		}else{
335
+			key = 'blood_trans_state'
336
+		}
337
+		this.mainService.getDictionary("list", key).subscribe((data) => {
338
+			this.drugStatusList = data
339
+		});
340
+	}
341
+	
342
+	// 人员边输边搜节流阀
343
+	changeUser(e) {
344
+	  this.searchTimer(this.getUsers, e);
345
+	}
346
+	
347
+	changeReceptionUser(e){
348
+		this.searchTimer(this.getReceptionUsers, e);
349
+	}
350
+	
351
+	// 边输入边搜索节流阀
352
+	searchTimer(fun, e) {
353
+	  this.isLoading = true;
354
+	  this.searchTimerSubject.next([fun, e]);
355
+	}
356
+	
357
+	// 配送人员
358
+	userIds:any = [];
359
+	distributionList:any;
360
+	isLoading:boolean = false;
361
+	getUsers(e?) {
362
+	  let postData = {
363
+	    user: {
364
+	      name: e,
365
+	      hospital: { id: this.hosId },
366
+	    },
367
+	    idx: 0,
368
+	    sum: 20,
369
+	  };
370
+	  this.isLoading = true;
371
+	  this.mainService
372
+	    .getFetchDataList("data", "user", postData)
373
+	    .subscribe((data) => {
374
+	      this.isLoading = false;
375
+	      this.distributionList = data.list;
376
+	    });
377
+	}
378
+	
379
+	// 接收人员
380
+	receiverUserIds:any = [];
381
+	receptionList:any;
382
+	getReceptionUsers(e?) {
383
+	  let postData = {
384
+	    user: {
385
+	      name: e,
386
+	      hospital: { id: this.hosId },
387
+	    },
388
+	    idx: 0,
389
+	    sum: 20,
390
+	  };
391
+	  this.isLoading = true;
392
+	  this.mainService
393
+	    .getFetchDataList("data", "user", postData)
394
+	    .subscribe((data) => {
395
+	      this.isLoading = false;
396
+	      this.receptionList = data.list;
397
+	    });
398
+	}
399
+}

+ 68 - 0
src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.html

@@ -0,0 +1,68 @@
1
+<div class="content" id="dictionary">
2
+  <div class="contentInner">
3
+    <div class="address">
4
+      <overlay-scrollbars #osComponentRef1 class="contentBody">
5
+        <div class="contentItem" [title]="item.name" [ngClass]="{ active: item.id === activeDictionaryKey.id }" (click)="clickDictionaryKey(item)" *ngFor="let item of hospitalTabList">{{ item.name }}</div>
6
+      </overlay-scrollbars>
7
+    </div>
8
+		<div class="addressAssign" *ngIf="activeDictionaryKey.key=='evaluate'">
9
+			<div class="hos-title">{{currentHospital.hosName}}</div>
10
+		  <overlay-scrollbars #osComponentRef2 class="contentBody2">
11
+		    <div class="contentBody">
12
+		      <div class="classList" *ngFor="let item of hospitalList">
13
+						
14
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='hsmsEvaluationTime'">
15
+							<span class="w100px">{{ item.desc }}:</span>
16
+							<input nz-input class="w220px" [(ngModel)]="item.value" [placeholder]="'请输入'+item.desc" />
17
+						</div>
18
+						
19
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='hsmsUserEvaluation'">
20
+							<span class="w100px">{{ item.desc }}:</span>
21
+							<nz-select class="w220px" nzShowSearch nzAllowClear
22
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
23
+							  <ng-container *ngFor="let option of dicData">
24
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
25
+							  </ng-container>
26
+							</nz-select>
27
+						</div>
28
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='hsmsCallbackEvaluation'">
29
+							<span class="w100px">{{ item.desc }}:</span>
30
+							<nz-select class="w220px" nzShowSearch nzAllowClear
31
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
32
+							  <ng-container *ngFor="let option of dicData">
33
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
34
+							  </ng-container>
35
+							</nz-select>
36
+						</div>
37
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='hsmsUserBadEvaluationRange'">
38
+							<span class="w100px">{{ item.desc }}:</span>
39
+							<nz-select class="w220px" nzMode="multiple" nzShowSearch nzAllowClear
40
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
41
+							  <ng-container *ngFor="let option of dicData">
42
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
43
+							  </ng-container>
44
+							</nz-select>
45
+						</div>
46
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='hsmsCallbackBadEvaluationRange'">
47
+							<span class="w100px">{{ item.desc }}:</span>
48
+							<nz-select class="w220px" nzMode="multiple" nzShowSearch nzAllowClear
49
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
50
+							  <ng-container *ngFor="let option of dicData">
51
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
52
+							  </ng-container>
53
+							</nz-select>
54
+						</div>
55
+		      </div>
56
+		    </div>
57
+		  	<div class="contentBtns">
58
+		  	  <button nz-button nzType="primary" [nzLoading]="btnLoading" (click)="submitMessageForm()">确定</button>
59
+		  	</div>
60
+		  </overlay-scrollbars>
61
+		</div>
62
+  </div>
63
+</div>
64
+
65
+<!-- 操作成功/失败提示框 -->
66
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
67
+  [info]="promptInfo">
68
+</app-prompt-modal>

+ 213 - 0
src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.less

@@ -0,0 +1,213 @@
1
+@import "../../../../../src/theme.less";
2
+:host {
3
+  height: 100%;
4
+  display: flex;
5
+  flex-direction: column;
6
+  justify-content: space-between;
7
+  background-color: #F0F2F5;
8
+	.w220px{
9
+		width: 220px;
10
+	}
11
+	.w100px{
12
+			width: 100px !important;
13
+		}
14
+  .list-template__nzTable,
15
+  .list-template__bottom{
16
+    padding: 0!important;
17
+    border: none!important;
18
+    background: #fff!important;
19
+  }
20
+  .list-template{
21
+    width: 100%!important;
22
+    height: 100%!important;
23
+  }
24
+	
25
+	#dictionary{
26
+	  margin: 24px 16px;
27
+	  .addressAssign{
28
+	    flex: 7;
29
+			.hos-title{
30
+				margin-top: 10px;
31
+				text-align: center;
32
+			}
33
+	  }
34
+	  .contentItem{
35
+	    margin: 0 16px;
36
+	    padding: 8px;
37
+	    text-align: center;
38
+	    &.active{
39
+	      background-color: @primary-color;
40
+	      color: #fff;
41
+	      border-radius: 4px;
42
+	    }
43
+	  }
44
+	  .contentBody{
45
+	    padding: 16px;
46
+	    min-height: 0;
47
+	    display: flex;
48
+	    flex-direction: column;
49
+	  }
50
+	  .contentBody2{
51
+	    flex: 1;
52
+	  }
53
+	  ::ng-deep .ant-form-item{
54
+	    margin-bottom: 0;
55
+	  }
56
+	  .dictionaryRow{
57
+	    display: flex;
58
+	    align-items: center;
59
+	    justify-content: center;
60
+	    gap: 16px;
61
+	    .orders{
62
+	      flex: 1;
63
+	      display: flex;
64
+	      justify-content: flex-end;
65
+	      align-items: center;
66
+	    }
67
+	    .name{
68
+	      width: 100px;
69
+	      display: flex;
70
+	      justify-content: flex-end;
71
+	      align-items: center;
72
+	    }
73
+	    .value{
74
+	      flex: 3;
75
+	      display: flex;
76
+	      align-items: center;
77
+	      .valueInput{
78
+	        width: 600px;
79
+	      }
80
+	      .icon_transport{
81
+	        font-size: 20px;
82
+	        color: #8a8a8a;
83
+	        cursor: pointer;
84
+	      }
85
+	    }
86
+	
87
+	  }
88
+	}
89
+	
90
+	.content{
91
+	  flex: 1;
92
+	  min-height: 0;
93
+	  display: flex;
94
+	  flex-direction: column;
95
+	  justify-content: space-between;
96
+	  border: 1px solid #EEF3F9;
97
+	  &.priority{
98
+	    margin: 24px 118px 0;
99
+	    background-color: #fff;
100
+	    .contentInner{
101
+	      padding: 48px 206px;
102
+	      border: 1px solid #E8EBEF;
103
+	    }
104
+	  }
105
+	  .contentItem{
106
+	    padding: 4px 16px;
107
+	    cursor: pointer;
108
+	    overflow: hidden;
109
+	    text-overflow: ellipsis;
110
+	    white-space: nowrap;
111
+	    &.active{
112
+	      color: @primary-color;
113
+	      background-color: #F0F6ED;
114
+	      border-radius: 4px;
115
+	    }
116
+	  }
117
+	  .contentInner{
118
+	    flex: 1;
119
+	    display: flex;
120
+	    justify-content: space-between;
121
+	    align-items: center;
122
+	    padding: 0 16px;
123
+	    gap: 16px;
124
+			.hos-title{
125
+				font-weight: 600;
126
+				font-size: 16px;
127
+			}
128
+
129
+			.hospital{
130
+			  width: 100%;
131
+			  text-align: left;
132
+			}
133
+			.classList{
134
+				// padding: 5px 0;
135
+				.mar-10{
136
+					margin: 8px 0;
137
+				}
138
+			  .select{
139
+			    width: 313px;
140
+			  }
141
+			  span{
142
+			    display: inline-block;
143
+			    width: 11em;
144
+			  }
145
+			}
146
+			
147
+	    .contentHead{
148
+	      height: 45px;
149
+	      display: flex;
150
+	      justify-content: space-between;
151
+	      align-items: center;
152
+	      gap: 16px;
153
+	      padding: 0 16px;
154
+	      font-size: 16px;
155
+	      font-weight: bold;
156
+	      border-bottom: 1px solid #D9D9D9;
157
+	      .title{
158
+	        overflow: hidden;
159
+	        text-overflow: ellipsis;
160
+	        white-space: nowrap;
161
+	      }
162
+	      .btns{
163
+	        flex-shrink: 0;
164
+	      }
165
+	    }
166
+	    .contentBody{
167
+	      padding: 0 8px;
168
+	      margin: 4px 0;
169
+	      flex: 1;
170
+	    }
171
+	    .address{
172
+	      flex: 1;
173
+	      height: 100%;
174
+	      background: #FFFFFF;
175
+	      border: 1px solid #E8EBEF;
176
+	      display: flex;
177
+	      flex-direction: column;
178
+	      width: 0;
179
+	    }
180
+	    .addressAssign{
181
+	      flex: 3;
182
+	      height: 100%;
183
+	      background: #FFFFFF;
184
+	      border: 1px solid #E8EBEF;
185
+	      display: flex;
186
+	      flex-direction: column;
187
+	      width: 0;
188
+	    }
189
+	    .list-template__searchItem {
190
+	      margin-bottom: 16px;
191
+	      .label {
192
+	        color: #333;
193
+	        display: inline-block;
194
+	        width: 70px;
195
+	        text-align-last: justify;
196
+	        text-align: justify;
197
+	        &.label--big {
198
+	          width: 100px;
199
+	        }
200
+	      }
201
+	      .formItem {
202
+	        width: 135px;
203
+	      }
204
+	    }
205
+	  }
206
+	  .contentBtns{
207
+	    padding-bottom: 16px;
208
+	    display: flex;
209
+	    justify-content: center;
210
+	    align-items: center;
211
+	  }
212
+	}
213
+}

+ 127 - 0
src/app/components/configurationCenter/configuration-distribution-hospital/configuration-distribution-hospital.component.ts

@@ -0,0 +1,127 @@
1
+import { Component, OnInit, Input } from "@angular/core";
2
+import { ActivatedRoute } from "@angular/router";
3
+import { MainService } from "../../../services/main.service";
4
+import { ToolService } from 'src/app/services/tool.service';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+
7
+@Component({
8
+  selector: "app-configuration-distribution-hospital",
9
+  templateUrl: "./configuration-distribution-hospital.component.html",
10
+  styleUrls: ["./configuration-distribution-hospital.component.less"],
11
+})
12
+export class ConfigurationDistributionHospitalComponent implements OnInit {
13
+  constructor(
14
+    private route: ActivatedRoute,
15
+    private mainService: MainService,
16
+    private tool: ToolService,
17
+    private message: NzMessageService,
18
+  ) {}
19
+
20
+  coopData: any = {}; //当前操作列
21
+  currentHospital; //当前院区
22
+	maintainDept:any=[];
23
+	@Input() hospitalTabList: any[] = [];
24
+	
25
+  ngOnInit() {
26
+		this.activeDictionaryKey = this.hospitalTabList[0];
27
+		this.maintainDept = this.tool.getUserInfoPermission().dutyList
28
+    this.currentHospital = this.tool.getCurrentHospital();
29
+		this.getDicType();
30
+  }
31
+	
32
+	activeDictionaryKey:any;
33
+	clickDictionaryKey(item){
34
+	  this.activeDictionaryKey = item;
35
+	  this.getList();
36
+	}
37
+	
38
+	// 获取评价字典
39
+	dicData:any=[];
40
+	getDicType(){
41
+		this.mainService.getDictionary("list", "workorderEvaluation").subscribe((data) => {
42
+			this.dicData = data
43
+			this.getList();
44
+		});
45
+	}
46
+	
47
+  // 新增/编辑表单提交
48
+  btnLoading: boolean = false; //提交按钮loading状态
49
+  submitMessageForm(): void {
50
+    this.btnLoading = true;
51
+		for(let i of this.hospitalList){
52
+			if(i.key=='hsmsUserBadEvaluationRange' || i.key=='hsmsCallbackBadEvaluationRange'){
53
+				i.value = i.value.join(',')
54
+			}
55
+		}
56
+		setTimeout(_=>{
57
+			this.mainService
58
+			  .simplePost("addListData", "hospitalConfig", this.hospitalList)
59
+			  .subscribe((result) => {
60
+			    this.btnLoading = false;
61
+			    let msg = "保存";
62
+			    if (result.status == 200) {
63
+			      this.showPromptModal(msg, true, '');
64
+			    } else {
65
+			      this.showPromptModal(msg, false, result.msg);
66
+			    }
67
+			  });
68
+		},50)
69
+  }
70
+
71
+  // 获取列表
72
+  loading1:boolean = false;
73
+  hospitalList:any[] = [];
74
+  getList() {
75
+    let data = {
76
+      idx: 0,
77
+      sum: 9999,
78
+      hospitalConfig: {
79
+        hosId: this.currentHospital.id,
80
+        model: 'hsms',
81
+      },
82
+    };
83
+    this.loading1 = true;
84
+    this.mainService
85
+      .getFetchDataList("simple/data", "hospitalConfig", data)
86
+      .subscribe((data) => {
87
+        this.loading1 = false;
88
+        if (data.status == 200) {
89
+					data.list.forEach(i =>{
90
+					  i.show = false
91
+					})
92
+					let newData = data.list
93
+					for(let i of newData){
94
+						if(i.key=='hsmsUserEvaluation' || i.key=='hsmsCallbackEvaluation'){
95
+							i.value = Number(i.value)
96
+						}
97
+						
98
+						if(i.key=='hsmsUserBadEvaluationRange' || i.key=='hsmsCallbackBadEvaluationRange'){
99
+							let arr = i.value.split(',')
100
+							arr = arr.map(i=>i = parseInt(i))
101
+							i.value = arr
102
+						}
103
+					}
104
+
105
+          this.hospitalList = newData || [];
106
+        }else{
107
+          this.message.error(data.msg || "请求数据失败");
108
+        }
109
+      });
110
+  }
111
+
112
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
113
+  promptContent: string; //操作提示框提示信息
114
+  ifSuccess: boolean; //操作成功/失败
115
+  promptInfo: string; //操作结果提示信息
116
+  promptModalShow: boolean; //操作提示框是否展示
117
+  showPromptModal(con, success, promptInfo?) {
118
+    this.promptModalShow = false;
119
+    this.promptContent = con;
120
+    this.ifSuccess = success;
121
+    this.promptInfo = promptInfo;
122
+    setTimeout(() => {
123
+      this.promptModalShow = true;
124
+    }, 100);
125
+    this.getList();
126
+  }
127
+}

+ 31 - 5
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.html

@@ -82,16 +82,42 @@
82 82
                         <nz-option *ngFor="let item of drugsManualList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
83 83
                       </nz-select>
84 84
                     </div>
85
-                    <!-- 支持拍照留存 -->
86
-                    <div class="display_flex align-items_center mb8">
87
-                      <nz-form-label class="label">支持拍照留存</nz-form-label>
88
-                      <nz-checkbox-group [(ngModel)]="item.postData.drugsEndPhoto"></nz-checkbox-group>
89
-                    </div>
85
+										<!-- 支持拍照留存 -->
86
+										<div class="display_flex align-items_center mb8">
87
+										  <nz-form-label class="label">支持拍照留存</nz-form-label>
88
+										  <nz-checkbox-group [(ngModel)]="item.postData.drugsEndPhoto"></nz-checkbox-group>
89
+										</div>
90 90
                   </ng-container>
91
+									<!-- 药单显示患者 -->
92
+									<div class="display_flex align-items_center mb8">
93
+									  <nz-form-label class="label">药单显示患者</nz-form-label>
94
+									  <nz-checkbox-group [(ngModel)]="item.postData.showPatientInfo"></nz-checkbox-group>
95
+									</div>
96
+                  <!-- 是否显示药品数、种类数 -->
97
+									<div class="display_flex align-items_center mb8">
98
+									  <nz-form-label class="label">是否显示药品数、种类数</nz-form-label>
99
+									  <nz-checkbox-group [(ngModel)]="item.postData.showDrugsBagTypeCount"></nz-checkbox-group>
100
+									</div>
101
+                  <!-- 是否支持查看药品详情信息 -->
102
+									<div class="display_flex align-items_center mb8">
103
+									  <nz-form-label class="label">是否支持查看药品详情信息</nz-form-label>
104
+									  <nz-checkbox-group [(ngModel)]="item.postData.showDrugsBagDetails"></nz-checkbox-group>
105
+									</div>
91 106
                 </div>
92 107
                 <!-- 自动建单配置 -->
93 108
                 <div *ngIf="tabModalName=='automaticOrderCreation'">
94 109
                   <!-- 自动建单 -->
110
+									<div class="display_flex align-items_center mb8">
111
+									  <nz-form-label class="label">是否自动建单</nz-form-label>
112
+									  <nz-checkbox-group [(ngModel)]="item.postData.autoCreate"></nz-checkbox-group>
113
+									</div>
114
+									<!-- 药品自动建单状态 -->
115
+									<div class="display_flex align-items_center mb8" *ngIf="item.postData.autoCreate[0].checked">
116
+									  <nz-form-label class="label">药品自动建单状态</nz-form-label>
117
+										<nz-select class="w320px" nzPlaceHolder="请选择" [(ngModel)]="item.postData.autoCreateState" nzAllowClear>
118
+										  <nz-option *ngFor="let item of drugStateData" [nzLabel]="item.name" [nzValue]="item.id"></nz-option>
119
+										</nz-select>
120
+									</div>
95 121
                 </div>
96 122
                 <div class="bottom">
97 123
                   <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>

+ 55 - 8
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.ts

@@ -32,6 +32,7 @@ export class ConfigurationDrugComponent implements OnInit {
32 32
   ngOnInit():void {
33 33
     this.activeDictionary = this.dictionaryKeyList[0];
34 34
     this.init();
35
+		this.getDrugState();
35 36
   }
36 37
 
37 38
   // 工单模式
@@ -58,9 +59,14 @@ export class ConfigurationDrugComponent implements OnInit {
58 59
         drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
59 60
         drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
60 61
         drugsEndCheckScanIds: [],//终点核对方式
62
+				showPatientInfo: [{ label:'是否开启', value: 0 }],//药单显示患者
61 63
         drugsEndManual: undefined,//终点科室手动填写
62 64
         drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
63
-      }
65
+				showDrugsBagTypeCount: [{ label:'是否开启', value: 0 }],//是否显示药品数、种类数
66
+				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
67
+				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
68
+				autoCreateState: undefined // 药品自动建单状态
69
+			}
64 70
     },
65 71
     {
66 72
       name: '西药',
@@ -75,9 +81,14 @@ export class ConfigurationDrugComponent implements OnInit {
75 81
         drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
76 82
         drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
77 83
         drugsEndCheckScanIds: [],//终点核对方式
84
+				showPatientInfo: [{ label:'是否开启', value: 0 }],//药单显示患者
78 85
         drugsEndManual: undefined,//终点科室手动填写
79 86
         drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
80
-      }
87
+        showDrugsBagTypeCount: [{ label:'是否开启', value: 0 }],//是否显示药品数、种类数
88
+				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
89
+				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
90
+				autoCreateState: undefined // 药品自动建单状态
91
+			}
81 92
     },
82 93
     {
83 94
       name: '退药',
@@ -92,9 +103,14 @@ export class ConfigurationDrugComponent implements OnInit {
92 103
         drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
93 104
         drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
94 105
         drugsEndCheckScanIds: [],//终点核对方式
106
+				showPatientInfo: [{ label:'是否开启', value: 0 }],//药单显示患者
95 107
         drugsEndManual: undefined,//终点科室手动填写
96 108
         drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
97
-      }
109
+        showDrugsBagTypeCount: [{ label:'是否开启', value: 0 }],//是否显示药品数、种类数
110
+				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
111
+				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
112
+				autoCreateState: undefined // 药品自动建单状态
113
+			}
98 114
     },
99 115
     {
100 116
       name: '毒麻',
@@ -109,9 +125,14 @@ export class ConfigurationDrugComponent implements OnInit {
109 125
         drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
110 126
         drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
111 127
         drugsEndCheckScanIds: [],//终点核对方式
128
+				showPatientInfo: [{ label:'是否开启', value: 0 }],//药单显示患者
112 129
         drugsEndManual: undefined,//终点科室手动填写
113 130
         drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
114
-      }
131
+        showDrugsBagTypeCount: [{ label:'是否开启', value: 0 }],//是否显示药品数、种类数
132
+				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
133
+				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
134
+				autoCreateState: undefined // 药品自动建单状态
135
+			}
115 136
     },
116 137
     {
117 138
       name: '中草药',
@@ -126,12 +147,26 @@ export class ConfigurationDrugComponent implements OnInit {
126 147
         drugsStartPhoto: [{ label:'是否开启', value: 0 }],//起点科室支持拍照留存
127 148
         drugsEndCheck: [{ label:'是否开启', value: 0 }],//终点科室支持核对
128 149
         drugsEndCheckScanIds: [],//终点核对方式
150
+				showPatientInfo: [{ label:'是否开启', value: 0 }],//药单显示患者
129 151
         drugsEndManual: undefined,//终点科室手动填写
130 152
         drugsEndPhoto: [{ label:'是否开启', value: 0 }],//终点科室支持拍照留存
131
-      }
153
+        showDrugsBagTypeCount: [{ label:'是否开启', value: 0 }],//是否显示药品数、种类数
154
+				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
155
+				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
156
+				autoCreateState: undefined // 药品自动建单状态
157
+			}
132 158
     },
133 159
   ];
134
-
160
+	
161
+	
162
+	// 获取药品状态
163
+	drugStateData:any = []
164
+	getDrugState(){
165
+		this.mainService.getDictionary("list", "drug_state").subscribe((data) => {
166
+			this.drugStateData = data
167
+		});
168
+	}
169
+	
135 170
   // 点击数据字典key
136 171
   activeDictionary:any;
137 172
   clickDictionaryKey(item){
@@ -200,7 +235,14 @@ export class ConfigurationDrugComponent implements OnInit {
200 235
       drugsEndCheckScanIds: this.activeDictionary.postData.drugsEndCheckScanIds.filter(v => v.checked).map(v => v.value).toString() || undefined,
201 236
       drugsEndManual: this.activeDictionary.postData.drugsEndManual ? { id: this.activeDictionary.postData.drugsEndManual } : undefined,
202 237
       drugsEndPhoto: this.activeDictionary.postData.drugsEndPhoto[0].checked ? 1 : 0,
203
-    };
238
+			showPatientInfo: this.activeDictionary.postData.showPatientInfo[0].checked ? 1 : 0,
239
+			showDrugsBagTypeCount: this.activeDictionary.postData.showDrugsBagTypeCount[0].checked ? 1 : 0,
240
+			showDrugsBagDetails: this.activeDictionary.postData.showDrugsBagDetails[0].checked ? 1 : 0,
241
+			autoCreate: this.activeDictionary.postData.autoCreate[0].checked ? 1 : 0,
242
+			autoCreateState:{
243
+				id:this.activeDictionary.postData.autoCreateState || undefined
244
+			}
245
+		};
204 246
     this.btnLoading = true;
205 247
     this.mainService
206 248
       .simplePost("addData", "taskTypeConfig", postData)
@@ -294,7 +336,12 @@ export class ConfigurationDrugComponent implements OnInit {
294 336
           this.activeDictionary.postData.drugsEndCheckScanIds = this.activeDictionary.postData.drugsEndCheckScanIds.map(v => ({...v, checked: (this.configs.drugsEndCheckScanIds || '').split(',').includes(v.value.toString())}));
295 337
           this.activeDictionary.postData.drugsEndManual = this.configs.drugsEndManual ? this.configs.drugsEndManual.id : undefined;
296 338
           this.activeDictionary.postData.drugsEndPhoto[0].checked = this.configs.drugsEndPhoto == 1;
297
-        }
339
+					this.activeDictionary.postData.showPatientInfo[0].checked = this.configs.showPatientInfo == 1;
340
+					this.activeDictionary.postData.showDrugsBagTypeCount[0].checked = this.configs.showDrugsBagTypeCount == 1;
341
+					this.activeDictionary.postData.showDrugsBagDetails[0].checked = this.configs.showDrugsBagDetails == 1;
342
+					this.activeDictionary.postData.autoCreate[0].checked = this.configs.autoCreate == 1;
343
+					this.activeDictionary.postData.autoCreateState = this.configs.autoCreateState && this.configs.autoCreateState.id || undefined;
344
+				}
298 345
       });
299 346
   }
300 347
 }

+ 94 - 29
src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.html

@@ -1,46 +1,111 @@
1
-<div class="content priority">
1
+<div class="content" id="dictionary">
2 2
   <div class="contentInner">
3
-		<div class="hos-title">{{currentHospital.hosName}}</div>
4
-    <div class="addressAssign">
5
-      <div class="contentBody2">
3
+    <div class="address">
4
+      <overlay-scrollbars #osComponentRef1 class="contentBody">
5
+        <div class="contentItem" [title]="item.name" [ngClass]="{ active: item.id === activeDictionaryKey.id }" (click)="clickDictionaryKey(item)" *ngFor="let item of hospitalTabList">{{ item.name }}</div>
6
+      </overlay-scrollbars>
7
+    </div>
8
+    <div class="addressAssign" *ngIf="activeDictionaryKey.key=='property'">
9
+			<div class="hos-title">{{currentHospital.hosName}}</div>
10
+      <overlay-scrollbars #osComponentRef2 class="contentBody2">
6 11
         <div class="contentBody">
7 12
           <div class="classList" *ngFor="let item of hospitalList">
8
-						<div class="mar-10" *ngIf="item.key!='itsmWorkHourQuoteDept' && item.key!='itsmConsumableQuoteDept' && !item.show">
9
-							<span>{{ item.desc }}:</span>
10
-							<nz-radio-group [(ngModel)]="item.value" (ngModelChange)="radioChange(item)">
11
-							  <label nz-radio nzValue="1">是</label>
12
-							  <label nz-radio nzValue="0">否</label>
13
-							</nz-radio-group>
14
-						</div>
13
+      			<div class="mar-10" *ngIf="item.key!='itsmWorkHourQuoteDept' && 
14
+						item.key!='itsmConsumableQuoteDept' &&
15
+						item.key!='itsmEvaluationTime' &&
16
+						item.key!='itsmUserEvaluation' && 
17
+						item.key!='itsmCallbackEvaluation' && 
18
+						item.key!='itsmUserBadEvaluationRange' && 
19
+						item.key!='itsmCallbackBadEvaluationRange'
20
+						&& !item.show && item.value2=='asset_consumables'">
21
+      				<span>{{ item.desc }}:</span>
22
+      				<nz-radio-group [(ngModel)]="item.value" (ngModelChange)="radioChange(item)">
23
+      				  <label nz-radio nzValue="1">是</label>
24
+      				  <label nz-radio nzValue="0">否</label>
25
+      				</nz-radio-group>
26
+      			</div>
15 27
             
16
-						<div class="mar-10" *ngIf="item.key=='itsmWorkHourQuoteDept' && itsmQuoteOtherDeptWorkHourType">
28
+      			<div class="mar-10" *ngIf="item.key=='itsmWorkHourQuoteDept' && itsmQuoteOtherDeptWorkHourType && item.value2=='asset_consumables'">
29
+      				<span class="w100px">{{ item.desc }}:</span>
30
+      				<nz-select class="w220px" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear
31
+      					[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
32
+      				  <ng-container *ngFor="let option of maintainDept">
33
+      				    <nz-option [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
34
+      				  </ng-container>
35
+      				</nz-select>
36
+      			</div>
37
+      			
38
+      			<div class="mar-10" *ngIf="item.key=='itsmConsumableQuoteDept' && itsmQuoteOtherDeptConsumableType && item.value2=='asset_consumables'">
39
+      				<span class="w100px">{{ item.desc }}:</span>
40
+      				<nz-select class="w220px" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear
41
+      					[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
42
+      				  <ng-container *ngFor="let option of maintainDept">
43
+      				    <nz-option [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
44
+      				  </ng-container>
45
+      				</nz-select>
46
+      			</div>
47
+      			
48
+          </div>
49
+        </div>
50
+      	<div class="contentBtns">
51
+      	  <button nz-button nzType="primary" [nzLoading]="btnLoading" (click)="submitMessageForm()">确定</button>
52
+      	</div>
53
+      </overlay-scrollbars>
54
+    </div>
55
+		<div class="addressAssign" *ngIf="activeDictionaryKey.key=='evaluate'">
56
+			<div class="hos-title">{{currentHospital.hosName}}</div>
57
+		  <overlay-scrollbars #osComponentRef2 class="contentBody2">
58
+		    <div class="contentBody">
59
+		      <div class="classList" *ngFor="let item of hospitalList">
60
+						
61
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='itsmEvaluationTime'">
17 62
 							<span class="w100px">{{ item.desc }}:</span>
18
-							<nz-select class="w220px" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear
63
+							<input nz-input class="w220px" [(ngModel)]="item.value" [placeholder]="'请输入'+item.desc" />
64
+						</div>
65
+						
66
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='itsmUserEvaluation'">
67
+							<span class="w100px">{{ item.desc }}:</span>
68
+							<nz-select class="w220px" nzShowSearch nzAllowClear
19 69
 								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
20
-							  <ng-container *ngFor="let option of maintainDept">
21
-							    <nz-option [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
70
+							  <ng-container *ngFor="let option of dicData">
71
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
22 72
 							  </ng-container>
23 73
 							</nz-select>
24 74
 						</div>
25
-						
26
-						<div class="mar-10" *ngIf="item.key=='itsmConsumableQuoteDept' && itsmQuoteOtherDeptConsumableType">
75
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='itsmCallbackEvaluation'">
27 76
 							<span class="w100px">{{ item.desc }}:</span>
28
-							<nz-select class="w220px" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear
77
+							<nz-select class="w220px" nzShowSearch nzAllowClear
29 78
 								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
30
-							  <ng-container *ngFor="let option of maintainDept">
31
-							    <nz-option [nzLabel]="option.hosName" [nzValue]="option.id"></nz-option>
79
+							  <ng-container *ngFor="let option of dicData">
80
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
32 81
 							  </ng-container>
33 82
 							</nz-select>
34 83
 						</div>
35
-						
36
-          </div>
37
-        </div>
38
-				<div class="contentBtns">
39
-				  <button nz-button nzType="primary" [nzLoading]="btnLoading" (click)="submitMessageForm()">确定</button>
40
-				</div>
41
-      </div>
42
-      
43
-    </div>
84
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='itsmUserBadEvaluationRange'">
85
+							<span class="w100px">{{ item.desc }}:</span>
86
+							<nz-select class="w220px" nzMode="multiple" nzShowSearch nzAllowClear
87
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
88
+							  <ng-container *ngFor="let option of dicData">
89
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
90
+							  </ng-container>
91
+							</nz-select>
92
+						</div>
93
+						<div class="mar-10" *ngIf="item.value2 == 'evaluation' && item.key=='itsmCallbackBadEvaluationRange'">
94
+							<span class="w100px">{{ item.desc }}:</span>
95
+							<nz-select class="w220px" nzMode="multiple" nzShowSearch nzAllowClear
96
+								[nzPlaceHolder]="'请选择'+item.desc" [(ngModel)]="item.value">
97
+							  <ng-container *ngFor="let option of dicData">
98
+							    <nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
99
+							  </ng-container>
100
+							</nz-select>
101
+						</div>
102
+		      </div>
103
+		    </div>
104
+		  	<div class="contentBtns">
105
+		  	  <button nz-button nzType="primary" [nzLoading]="btnLoading" (click)="submitMessageForm()">确定</button>
106
+		  	</div>
107
+		  </overlay-scrollbars>
108
+		</div>
44 109
   </div>
45 110
 </div>
46 111
 

+ 188 - 134
src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.less

@@ -21,139 +21,193 @@
21 21
     width: 100%!important;
22 22
     height: 100%!important;
23 23
   }
24
-  .content{
25
-    flex: 1;
26
-    min-height: 0;
27
-    display: flex;
28
-    flex-direction: column;
29
-    justify-content: space-between;
30
-    border: 1px solid #EEF3F9;
31
-    &.priority{
32
-      margin: 24px 275px;
33
-      background-color: #fff;
34
-      .contentInner{
35
-        // padding: 90px 158px 72px;
36
-        // border: 1px solid #E8EBEF;
37
-				.hos-title{
38
-					font-weight: 600;
39
-					font-size: 16px;
24
+	
25
+	#dictionary{
26
+	  margin: 24px 16px;
27
+	  .addressAssign{
28
+	    flex: 7;
29
+			.hos-title{
30
+				margin-top: 10px;
31
+				text-align: center;
32
+			}
33
+	  }
34
+	  .contentItem{
35
+	    margin: 0 16px;
36
+	    padding: 8px;
37
+	    text-align: center;
38
+	    &.active{
39
+	      background-color: @primary-color;
40
+	      color: #fff;
41
+	      border-radius: 4px;
42
+	    }
43
+	  }
44
+	  .contentBody{
45
+	    padding: 16px;
46
+	    min-height: 0;
47
+	    display: flex;
48
+	    flex-direction: column;
49
+	  }
50
+	  .contentBody2{
51
+	    flex: 1;
52
+	  }
53
+	  ::ng-deep .ant-form-item{
54
+	    margin-bottom: 0;
55
+	  }
56
+	  .dictionaryRow{
57
+	    display: flex;
58
+	    align-items: center;
59
+	    justify-content: center;
60
+	    gap: 16px;
61
+	    .orders{
62
+	      flex: 1;
63
+	      display: flex;
64
+	      justify-content: flex-end;
65
+	      align-items: center;
66
+	    }
67
+	    .name{
68
+	      width: 100px;
69
+	      display: flex;
70
+	      justify-content: flex-end;
71
+	      align-items: center;
72
+	    }
73
+	    .value{
74
+	      flex: 3;
75
+	      display: flex;
76
+	      align-items: center;
77
+	      .valueInput{
78
+	        width: 600px;
79
+	      }
80
+	      .icon_transport{
81
+	        font-size: 20px;
82
+	        color: #8a8a8a;
83
+	        cursor: pointer;
84
+	      }
85
+	    }
86
+	
87
+	  }
88
+	}
89
+	
90
+	.content{
91
+	  flex: 1;
92
+	  min-height: 0;
93
+	  display: flex;
94
+	  flex-direction: column;
95
+	  justify-content: space-between;
96
+	  border: 1px solid #EEF3F9;
97
+	  &.priority{
98
+	    margin: 24px 118px 0;
99
+	    background-color: #fff;
100
+	    .contentInner{
101
+	      padding: 48px 206px;
102
+	      border: 1px solid #E8EBEF;
103
+	    }
104
+	  }
105
+	  .contentItem{
106
+	    padding: 4px 16px;
107
+	    cursor: pointer;
108
+	    overflow: hidden;
109
+	    text-overflow: ellipsis;
110
+	    white-space: nowrap;
111
+	    &.active{
112
+	      color: @primary-color;
113
+	      background-color: #F0F6ED;
114
+	      border-radius: 4px;
115
+	    }
116
+	  }
117
+	  .contentInner{
118
+	    flex: 1;
119
+	    display: flex;
120
+	    justify-content: space-between;
121
+	    align-items: center;
122
+	    padding: 0 16px;
123
+	    gap: 16px;
124
+			.hos-title{
125
+				font-weight: 600;
126
+				font-size: 16px;
127
+			}
128
+
129
+			.hospital{
130
+			  width: 100%;
131
+			  text-align: left;
132
+			}
133
+			.classList{
134
+				// padding: 5px 0;
135
+				.mar-10{
136
+					margin: 8px 0;
40 137
 				}
41
-        .addressAssign{
42
-          width: 100%;
43
-          border: none;
44
-        }
45
-        .contentBody{
46
-          flex: 1;
47
-          display: flex;
48
-          flex-direction: column;
49
-          // align-items: center;
50
-          padding: 0 16px;
51
-          // gap: 32px;
52
-        }
53
-        .hospital{
54
-          width: 100%;
55
-          text-align: left;
56
-        }
57
-        .classList{
58
-					// padding: 5px 0;
59
-					.mar-10{
60
-						margin: 8px 0;
61
-					}
62
-          .select{
63
-            width: 313px;
64
-          }
65
-          span{
66
-            display: inline-block;
67
-            width: 11em;
68
-          }
69
-        }
70
-      }
71
-    }
72
-    .contentItem{
73
-      padding: 4px 16px;
74
-      cursor: pointer;
75
-      overflow: hidden;
76
-      text-overflow: ellipsis;
77
-      white-space: nowrap;
78
-      &.active{
79
-        color: @primary-color;
80
-        background-color: #F0F6ED;
81
-        border-radius: 4px;
82
-      }
83
-    }
84
-    .contentInner{
85
-      flex: 1;
86
-      display: flex;
87
-      flex-direction: column;
88
-      align-items: center;
89
-      padding: 0 16px;
90
-      gap: 32px;
91
-      .contentHead{
92
-        height: 45px;
93
-        display: flex;
94
-        justify-content: space-between;
95
-        align-items: center;
96
-        gap: 16px;
97
-        padding: 0 16px;
98
-        font-size: 16px;
99
-        font-weight: bold;
100
-        border-bottom: 1px solid #D9D9D9;
101
-        .title{
102
-          overflow: hidden;
103
-          text-overflow: ellipsis;
104
-          white-space: nowrap;
105
-        }
106
-        .btns{
107
-          flex-shrink: 0;
108
-        }
109
-      }
110
-      .contentBody{
111
-        padding: 0 8px 16px;
112
-        margin: 4px 0;
113
-        flex: 1;
114
-      }
115
-      .contentBody2{
116
-        flex: 1;
117
-        margin-bottom: 16px;
118
-      }
119
-      .address{
120
-        flex: 1;
121
-        height: 100%;
122
-        background: #FFFFFF;
123
-        border: 1px solid #E8EBEF;
124
-        display: flex;
125
-        flex-direction: column;
126
-        width: 0;
127
-      }
128
-      .addressAssign{
129
-        flex: 3;
130
-        height: 100%;
131
-        // background: #FFFFFF;
132
-        border: 1px solid #E8EBEF;
133
-        display: flex;
134
-        flex-direction: column;
135
-        width: 0;
136
-      }
137
-      .list-template__searchItem {
138
-        margin-bottom: 16px;
139
-        .label {
140
-          color: #333;
141
-          display: inline-block;
142
-          width: 70px;
143
-          text-align-last: justify;
144
-          text-align: justify;
145
-          &.label--big {
146
-            width: 100px;
147
-          }
148
-        }
149
-        .formItem {
150
-          width: 135px;
151
-        }
152
-      }
153
-    }
154
-    .contentBtns{
155
-      margin-top: 20px;
156
-      text-align: center;
157
-    }
158
-  }
138
+			  .select{
139
+			    width: 313px;
140
+			  }
141
+			  span{
142
+			    display: inline-block;
143
+			    width: 11em;
144
+			  }
145
+			}
146
+			
147
+	    .contentHead{
148
+	      height: 45px;
149
+	      display: flex;
150
+	      justify-content: space-between;
151
+	      align-items: center;
152
+	      gap: 16px;
153
+	      padding: 0 16px;
154
+	      font-size: 16px;
155
+	      font-weight: bold;
156
+	      border-bottom: 1px solid #D9D9D9;
157
+	      .title{
158
+	        overflow: hidden;
159
+	        text-overflow: ellipsis;
160
+	        white-space: nowrap;
161
+	      }
162
+	      .btns{
163
+	        flex-shrink: 0;
164
+	      }
165
+	    }
166
+	    .contentBody{
167
+	      padding: 0 8px;
168
+	      margin: 4px 0;
169
+	      flex: 1;
170
+	    }
171
+	    .address{
172
+	      flex: 1;
173
+	      height: 100%;
174
+	      background: #FFFFFF;
175
+	      border: 1px solid #E8EBEF;
176
+	      display: flex;
177
+	      flex-direction: column;
178
+	      width: 0;
179
+	    }
180
+	    .addressAssign{
181
+	      flex: 3;
182
+	      height: 100%;
183
+	      background: #FFFFFF;
184
+	      border: 1px solid #E8EBEF;
185
+	      display: flex;
186
+	      flex-direction: column;
187
+	      width: 0;
188
+	    }
189
+	    .list-template__searchItem {
190
+	      margin-bottom: 16px;
191
+	      .label {
192
+	        color: #333;
193
+	        display: inline-block;
194
+	        width: 70px;
195
+	        text-align-last: justify;
196
+	        text-align: justify;
197
+	        &.label--big {
198
+	          width: 100px;
199
+	        }
200
+	      }
201
+	      .formItem {
202
+	        width: 135px;
203
+	      }
204
+	    }
205
+	  }
206
+	  .contentBtns{
207
+	    padding-bottom: 16px;
208
+	    display: flex;
209
+	    justify-content: center;
210
+	    align-items: center;
211
+	  }
212
+	}
159 213
 }

+ 47 - 13
src/app/components/configurationCenter/configuration-hospital/configuration-hospital.component.ts

@@ -1,4 +1,4 @@
1
-import { Component, OnInit } from "@angular/core";
1
+import { Component, OnInit, Input } from "@angular/core";
2 2
 import { ActivatedRoute } from "@angular/router";
3 3
 import { MainService } from "../../../services/main.service";
4 4
 import { ToolService } from 'src/app/services/tool.service';
@@ -20,13 +20,30 @@ export class ConfigurationHospitalComponent implements OnInit {
20 20
   coopData: any = {}; //当前操作列
21 21
   currentHospital; //当前院区
22 22
 	maintainDept:any=[];
23
+	@Input() hospitalTabList: any[] = [];
23 24
 	
24 25
   ngOnInit() {
26
+		this.activeDictionaryKey = this.hospitalTabList[0];
25 27
 		this.maintainDept = this.tool.getUserInfoPermission().dutyList
26 28
     this.currentHospital = this.tool.getCurrentHospital();
27
-    this.getList();
29
+		this.getDicType();
28 30
   }
29 31
 	
32
+	activeDictionaryKey:any;
33
+	clickDictionaryKey(item){
34
+	  this.activeDictionaryKey = item;
35
+	  this.getList();
36
+	}
37
+	
38
+	// 获取评价字典
39
+	dicData:any=[];
40
+	getDicType(){
41
+		this.mainService.getDictionary("list", "incident_degree").subscribe((data) => {
42
+			this.dicData = data
43
+			this.getList();
44
+		});
45
+	}
46
+	
30 47
 	itsmQuoteOtherDeptWorkHourType:any;
31 48
 	itsmQuoteOtherDeptConsumableType:any;
32 49
 	radioChange(data){
@@ -69,17 +86,24 @@ export class ConfigurationHospitalComponent implements OnInit {
69 86
   btnLoading: boolean = false; //提交按钮loading状态
70 87
   submitMessageForm(): void {
71 88
     this.btnLoading = true;
72
-    this.mainService
73
-      .simplePost("addListData", "hospitalConfig", this.hospitalList)
74
-      .subscribe((result) => {
75
-        this.btnLoading = false;
76
-        let msg = "保存";
77
-        if (result.status == 200) {
78
-          this.showPromptModal(msg, true, '');
79
-        } else {
80
-          this.showPromptModal(msg, false, result.msg);
81
-        }
82
-      });
89
+		for(let i of this.hospitalList){
90
+			if(i.key=='itsmUserBadEvaluationRange' || i.key=='itsmCallbackBadEvaluationRange'){
91
+				i.value = i.value.join(',')
92
+			}
93
+		}
94
+		setTimeout(_=>{
95
+			this.mainService
96
+			  .simplePost("addListData", "hospitalConfig", this.hospitalList)
97
+			  .subscribe((result) => {
98
+			    this.btnLoading = false;
99
+			    let msg = "保存";
100
+			    if (result.status == 200) {
101
+			      this.showPromptModal(msg, true, '');
102
+			    } else {
103
+			      this.showPromptModal(msg, false, result.msg);
104
+			    }
105
+			  });
106
+		},50)
83 107
   }
84 108
 
85 109
   // 获取列表
@@ -132,6 +156,16 @@ export class ConfigurationHospitalComponent implements OnInit {
132 156
 						}else if(i.key=='itsmQuoteOtherDeptConsumable' && i.value==0){
133 157
 							this.itsmQuoteOtherDeptConsumableType = false
134 158
 						}
159
+						
160
+						if(i.key=='itsmUserEvaluation' || i.key=='itsmCallbackEvaluation'){
161
+							i.value = Number(i.value)
162
+						}
163
+						
164
+						if(i.key=='itsmUserBadEvaluationRange' || i.key=='itsmCallbackBadEvaluationRange'){
165
+							let arr = i.value.split(',')
166
+							arr = arr.map(i=>i = parseInt(i))
167
+							i.value = arr
168
+						}
135 169
 					}
136 170
 
137 171
           this.hospitalList = newData || [];

+ 89 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.html

@@ -0,0 +1,89 @@
1
+<div class="TaskTypeManagement">
2
+  <div class="taskTypeInfo">
3
+    <div class="top">
4
+      <div class="item" (click)="tabModal('characteristics')" [ngClass]="{'items':tabModalName=='characteristics'}">
5
+        特性配置
6
+      </div>
7
+      <div class="item" (click)="tabModal('automaticOrderCreation')" [ngClass]="{'items':tabModalName=='automaticOrderCreation'}">
8
+        自动建单配置
9
+      </div>
10
+    </div>
11
+    <ng-container *ngFor="let item of dictionaryKeyList">
12
+      <div class="list" *ngIf="!loading && activeDictionaryKey.id === item.id">
13
+        <!-- 特性配置 -->
14
+        <div *ngIf="tabModalName=='characteristics'">
15
+          <div class="timeRange">
16
+            <div class="timeRangeTitle green">默认时间区间1</div>
17
+            <div class="timeRangeActive">
18
+              有效时间范围:
19
+              <span>
20
+                <nz-time-picker [(ngModel)]="item.postData.ibActiveStartTime1" nzFormat="HH:mm" nzPlaceHolder="开始时间1"></nz-time-picker>
21
+                ~
22
+                <nz-time-picker [(ngModel)]="item.postData.ibActiveEndTime1" nzFormat="HH:mm" nzPlaceHolder="结束时间1"></nz-time-picker>
23
+              </span>
24
+              <span class="ml16">
25
+                <nz-time-picker [(ngModel)]="item.postData.ibActiveStartTime2" nzFormat="HH:mm" nzPlaceHolder="开始时间2"></nz-time-picker>
26
+                ~
27
+                <nz-time-picker [(ngModel)]="item.postData.ibActiveEndTime2" nzFormat="HH:mm" nzPlaceHolder="结束时间2"></nz-time-picker>
28
+              </span>
29
+            </div>
30
+            <div class="timeRangeDefault">
31
+              默认时间:
32
+              <span style="visibility: hidden;">囧囧</span>
33
+              <span>
34
+                <nz-time-picker [(ngModel)]="item.postData.ibDefaultStartTime" nzFormat="HH:mm" nzPlaceHolder="开始时间"></nz-time-picker>
35
+                <nz-checkbox-group class="timeRangeCheckbox" [(ngModel)]="item.postData.ibDefaultDayStart"></nz-checkbox-group>
36
+                ~
37
+                <nz-time-picker class="ml8" [(ngModel)]="item.postData.ibDefaultEndTime" nzFormat="HH:mm" nzPlaceHolder="结束时间"></nz-time-picker>
38
+                <nz-checkbox-group class="timeRangeCheckbox" [(ngModel)]="item.postData.ibDefaultDayEnd"></nz-checkbox-group>
39
+              </span>
40
+            </div>
41
+          </div>
42
+
43
+          <div class="timeRange">
44
+            <div class="timeRangeTitle green">默认时间区间2</div>
45
+            <div class="timeRangeActive">
46
+              有效时间范围:
47
+              <span>
48
+                <nz-time-picker [(ngModel)]="item.postData.ib2ActiveStartTime1" nzFormat="HH:mm" nzPlaceHolder="开始时间1"></nz-time-picker>
49
+                ~
50
+                <nz-time-picker [(ngModel)]="item.postData.ib2ActiveEndTime1" nzFormat="HH:mm" nzPlaceHolder="结束时间1"></nz-time-picker>
51
+              </span>
52
+              <span class="ml16">
53
+                <nz-time-picker [(ngModel)]="item.postData.ib2ActiveStartTime2" nzFormat="HH:mm" nzPlaceHolder="开始时间2"></nz-time-picker>
54
+                ~
55
+                <nz-time-picker [(ngModel)]="item.postData.ib2ActiveEndTime2" nzFormat="HH:mm" nzPlaceHolder="结束时间2"></nz-time-picker>
56
+              </span>
57
+            </div>
58
+            <div class="timeRangeDefault">
59
+              默认时间:
60
+              <span style="visibility: hidden;">囧囧</span>
61
+              <span>
62
+                <nz-time-picker [(ngModel)]="item.postData.ib2DefaultStartTime" nzFormat="HH:mm" nzPlaceHolder="开始时间"></nz-time-picker>
63
+                <nz-checkbox-group class="timeRangeCheckbox" [(ngModel)]="item.postData.ib2DefaultDayStart"></nz-checkbox-group>
64
+                ~
65
+                <nz-time-picker class="ml8" [(ngModel)]="item.postData.ib2DefaultEndTime" nzFormat="HH:mm" nzPlaceHolder="结束时间"></nz-time-picker>
66
+                <nz-checkbox-group class="timeRangeCheckbox" [(ngModel)]="item.postData.ib2DefaultDayEnd"></nz-checkbox-group>
67
+              </span>
68
+            </div>
69
+          </div>
70
+        </div>
71
+        <!-- 自动建单配置 -->
72
+        <div *ngIf="tabModalName=='automaticOrderCreation'">
73
+          <!-- 自动建单 -->
74
+        </div>
75
+        <div class="bottom">
76
+          <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>
77
+        </div>
78
+      </div>
79
+    </ng-container>
80
+    <div class="list" *ngIf="loading">
81
+      <div class="loadingFull display_flex justify-content_flex-center align-items_center">
82
+        <div class="loadingFullInner">
83
+          <img src="../../../assets/images/loading.gif" alt="">
84
+          <div>加载中...</div>
85
+        </div>
86
+      </div>
87
+    </div>
88
+  </div>
89
+</div>

+ 700 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.less

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

+ 226 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-batch/configuration-inspect-batch.component.ts

@@ -0,0 +1,226 @@
1
+import { Component, OnInit, ViewChild, Input } from "@angular/core";
2
+import { ToolService } from 'src/app/services/tool.service';
3
+import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
4
+import { NzMessageService } from 'ng-zorro-antd';
5
+import { v4 as uuidv4, validate as uuidValidate } from 'uuid';
6
+import { addDays, startOfMinute, endOfMinute, set, getYear, getMonth, getDate, format } from 'date-fns';
7
+import { MainService } from 'src/app/services/main.service';
8
+
9
+@Component({
10
+  selector: "app-configuration-inspect-batch",
11
+  templateUrl: "./configuration-inspect-batch.component.html",
12
+  styleUrls: ["./configuration-inspect-batch.component.less"],
13
+})
14
+export class ConfigurationInspectBatchComponent implements OnInit {
15
+  @Input() activeDictionaryKey: any;
16
+  @Input() dictionaryKeyList: any;
17
+  constructor(
18
+    private mainService: MainService,
19
+    private tool: ToolService,
20
+    private message: NzMessageService,
21
+  ) {}
22
+
23
+  ngOnInit() {
24
+    this.tabModal('characteristics');
25
+    this.init();
26
+  }
27
+
28
+ tabModalName:string = 'characteristics'; //当前选中的tab
29
+ loading:boolean = false; //页面加载的loading
30
+ hosId = this.tool.getCurrentHospital().id; //当前院区
31
+ tasktype:any = {};// 任务类型
32
+ configs:any = {};// 配置
33
+ // 切换tab
34
+ tabModal(tabModalName:string){
35
+   this.tabModalName = tabModalName;
36
+ }
37
+ // 保存
38
+ btnLoading: boolean = false; //提交按钮loading状态
39
+ submitForm() {
40
+   if(!this.tasktype.id){
41
+     this.message.create("warning", "请先配置任务类型!");
42
+     return;
43
+   }
44
+
45
+   // 默认时间区间1
46
+
47
+   if(
48
+     (this.activeDictionaryKey.postData.ibActiveStartTime1 && !this.activeDictionaryKey.postData.ibActiveEndTime1) ||
49
+     (!this.activeDictionaryKey.postData.ibActiveStartTime1 && this.activeDictionaryKey.postData.ibActiveEndTime1) ||
50
+     (this.activeDictionaryKey.postData.ibActiveStartTime2 && !this.activeDictionaryKey.postData.ibActiveEndTime2) ||
51
+     (!this.activeDictionaryKey.postData.ibActiveStartTime2 && this.activeDictionaryKey.postData.ibActiveEndTime2)
52
+   ){
53
+     this.message.create("warning", "【默认时间区间1】的【有效时间范围】请完整填写开始时间与结束时间!");
54
+     return;
55
+   }else if(
56
+     (this.activeDictionaryKey.postData.ibActiveStartTime1 && this.activeDictionaryKey.postData.ibActiveEndTime1 && +this.activeDictionaryKey.postData.ibActiveStartTime1 > +this.activeDictionaryKey.postData.ibActiveEndTime1) ||
57
+     (this.activeDictionaryKey.postData.ibActiveStartTime2 && this.activeDictionaryKey.postData.ibActiveEndTime2 && +this.activeDictionaryKey.postData.ibActiveStartTime2 > +this.activeDictionaryKey.postData.ibActiveEndTime2)
58
+   ){
59
+    // 王满测试说有问题,要求去掉校验
60
+    // 开发无法复现问题,暂时注释
61
+    //  this.message.create("warning", "【默认时间区间1】的【有效时间范围】开始时间不能大于结束时间!");
62
+    //  return;
63
+   }
64
+
65
+   if(
66
+     (this.activeDictionaryKey.postData.ibDefaultStartTime && !this.activeDictionaryKey.postData.ibDefaultEndTime) ||
67
+     (!this.activeDictionaryKey.postData.ibDefaultStartTime && this.activeDictionaryKey.postData.ibDefaultEndTime)
68
+   ){
69
+     this.message.create("warning", "【默认时间区间1】的【默认时间】请完整填写开始时间与结束时间!");
70
+     return;
71
+   }else if(
72
+     this.activeDictionaryKey.postData.ibDefaultStartTime &&
73
+     this.activeDictionaryKey.postData.ibDefaultEndTime &&
74
+     (this.activeDictionaryKey.postData.ibDefaultDayStart[0].checked ? +addDays(this.activeDictionaryKey.postData.ibDefaultStartTime, 1) : +this.activeDictionaryKey.postData.ibDefaultStartTime) > (this.activeDictionaryKey.postData.ibDefaultDayEnd[0].checked ? +addDays(this.activeDictionaryKey.postData.ibDefaultEndTime, 1) : +this.activeDictionaryKey.postData.ibDefaultEndTime)
75
+   ){
76
+     this.message.create("warning", "【默认时间区间1】的【默认时间】开始时间不能大于结束时间!");
77
+     return;
78
+   }
79
+
80
+   // 默认时间区间2
81
+
82
+   if(
83
+     (this.activeDictionaryKey.postData.ib2ActiveStartTime1 && !this.activeDictionaryKey.postData.ib2ActiveEndTime1) ||
84
+     (!this.activeDictionaryKey.postData.ib2ActiveStartTime1 && this.activeDictionaryKey.postData.ib2ActiveEndTime1) ||
85
+     (this.activeDictionaryKey.postData.ib2ActiveStartTime2 && !this.activeDictionaryKey.postData.ib2ActiveEndTime2) ||
86
+     (!this.activeDictionaryKey.postData.ib2ActiveStartTime2 && this.activeDictionaryKey.postData.ib2ActiveEndTime2)
87
+   ){
88
+     this.message.create("warning", "【默认时间区间1】的【有效时间范围】请完整填写开始时间与结束时间!");
89
+     return;
90
+   }else if(
91
+     (this.activeDictionaryKey.postData.ib2ActiveStartTime1 && this.activeDictionaryKey.postData.ib2ActiveEndTime1 && +this.activeDictionaryKey.postData.ib2ActiveStartTime1 > +this.activeDictionaryKey.postData.ib2ActiveEndTime1) ||
92
+     (this.activeDictionaryKey.postData.ib2ActiveStartTime2 && this.activeDictionaryKey.postData.ib2ActiveEndTime2 && +this.activeDictionaryKey.postData.ib2ActiveStartTime2 > +this.activeDictionaryKey.postData.ib2ActiveEndTime2)
93
+   ){
94
+    // 王满测试说有问题,要求去掉校验
95
+    // 开发无法复现问题,暂时注释
96
+    //  this.message.create("warning", "【默认时间区间1】的【有效时间范围】开始时间不能大于结束时间!");
97
+    //  return;
98
+   }
99
+
100
+   if(
101
+     (this.activeDictionaryKey.postData.ib2DefaultStartTime && !this.activeDictionaryKey.postData.ib2DefaultEndTime) ||
102
+     (!this.activeDictionaryKey.postData.ib2DefaultStartTime && this.activeDictionaryKey.postData.ib2DefaultEndTime)
103
+   ){
104
+     this.message.create("warning", "【默认时间区间1】的【默认时间】请完整填写开始时间与结束时间!");
105
+     return;
106
+   }else if(
107
+     this.activeDictionaryKey.postData.ib2DefaultStartTime &&
108
+     this.activeDictionaryKey.postData.ib2DefaultEndTime &&
109
+     (this.activeDictionaryKey.postData.ib2DefaultDayStart[0].checked ? +addDays(this.activeDictionaryKey.postData.ib2DefaultStartTime, 1) : +this.activeDictionaryKey.postData.ib2DefaultStartTime) > (this.activeDictionaryKey.postData.ib2DefaultDayEnd[0].checked ? +addDays(this.activeDictionaryKey.postData.ib2DefaultEndTime, 1) : +this.activeDictionaryKey.postData.ib2DefaultEndTime)
110
+   ){
111
+     this.message.create("warning", "【默认时间区间1】的【默认时间】开始时间不能大于结束时间!");
112
+     return;
113
+   }
114
+
115
+   let postData:any = {
116
+     ...this.configs,
117
+     taskType: this.tasktype.id,
118
+     hosId: this.hosId,
119
+     ibActiveStartTime1: this.activeDictionaryKey.postData.ibActiveStartTime1 ? format(startOfMinute(this.activeDictionaryKey.postData.ibActiveStartTime1), 'yyyy-MM-dd HH:mm:ss') : undefined,
120
+     ibActiveEndTime1: this.activeDictionaryKey.postData.ibActiveEndTime1 ? format(endOfMinute(this.activeDictionaryKey.postData.ibActiveEndTime1), 'yyyy-MM-dd HH:mm:ss') : undefined,
121
+     ibActiveStartTime2: this.activeDictionaryKey.postData.ibActiveStartTime2 ? format(startOfMinute(this.activeDictionaryKey.postData.ibActiveStartTime2), 'yyyy-MM-dd HH:mm:ss') : undefined,
122
+     ibActiveEndTime2: this.activeDictionaryKey.postData.ibActiveEndTime2 ? format(endOfMinute(this.activeDictionaryKey.postData.ibActiveEndTime2), 'yyyy-MM-dd HH:mm:ss') : undefined,
123
+     ibDefaultStartTime: this.activeDictionaryKey.postData.ibDefaultStartTime ? format(startOfMinute(this.activeDictionaryKey.postData.ibDefaultStartTime), 'yyyy-MM-dd HH:mm:ss') : undefined,
124
+     ibDefaultEndTime: this.activeDictionaryKey.postData.ibDefaultEndTime ? format(endOfMinute(this.activeDictionaryKey.postData.ibDefaultEndTime), 'yyyy-MM-dd HH:mm:ss') : undefined,
125
+     ibDefaultDayStart: this.activeDictionaryKey.postData.ibDefaultDayStart[0].checked ? 1 : 0,
126
+     ibDefaultDayEnd: this.activeDictionaryKey.postData.ibDefaultDayEnd[0].checked ? 1 : 0,
127
+     ib2ActiveStartTime1: this.activeDictionaryKey.postData.ib2ActiveStartTime1 ? format(startOfMinute(this.activeDictionaryKey.postData.ib2ActiveStartTime1), 'yyyy-MM-dd HH:mm:ss') : undefined,
128
+     ib2ActiveEndTime1: this.activeDictionaryKey.postData.ib2ActiveEndTime1 ? format(endOfMinute(this.activeDictionaryKey.postData.ib2ActiveEndTime1), 'yyyy-MM-dd HH:mm:ss') : undefined,
129
+     ib2ActiveStartTime2: this.activeDictionaryKey.postData.ib2ActiveStartTime2 ? format(startOfMinute(this.activeDictionaryKey.postData.ib2ActiveStartTime2), 'yyyy-MM-dd HH:mm:ss') : undefined,
130
+     ib2ActiveEndTime2: this.activeDictionaryKey.postData.ib2ActiveEndTime2 ? format(endOfMinute(this.activeDictionaryKey.postData.ib2ActiveEndTime2), 'yyyy-MM-dd HH:mm:ss') : undefined,
131
+     ib2DefaultStartTime: this.activeDictionaryKey.postData.ib2DefaultStartTime ? format(startOfMinute(this.activeDictionaryKey.postData.ib2DefaultStartTime), 'yyyy-MM-dd HH:mm:ss') : undefined,
132
+     ib2DefaultEndTime: this.activeDictionaryKey.postData.ib2DefaultEndTime ? format(endOfMinute(this.activeDictionaryKey.postData.ib2DefaultEndTime), 'yyyy-MM-dd HH:mm:ss') : undefined,
133
+     ib2DefaultDayStart: this.activeDictionaryKey.postData.ib2DefaultDayStart[0].checked ? 1 : 0,
134
+     ib2DefaultDayEnd: this.activeDictionaryKey.postData.ib2DefaultDayEnd[0].checked ? 1 : 0,
135
+   };
136
+   console.log(postData);
137
+   this.btnLoading = true;
138
+   this.mainService
139
+     .simplePost("addData", "taskTypeConfig", postData)
140
+     .subscribe((result) => {
141
+       this.btnLoading = false;
142
+       if (result.status == 200) {
143
+         this.message.success("保存成功!");
144
+         this.getConfig();
145
+       }else{
146
+         this.message.success("保存失败!");
147
+       }
148
+     });
149
+ }
150
+
151
+ //初始化
152
+ init() {
153
+   this.loading = true;
154
+   this.getTaskType();
155
+ }
156
+
157
+ //获取任务类型
158
+ getTaskType() {
159
+   this.loading = true;
160
+   let postData = {
161
+     idx: 0,
162
+     sum: 1,
163
+     taskType: {
164
+       simpleQuery: true,
165
+       hosId: {
166
+         id: this.hosId
167
+       },
168
+       associationType: {
169
+         key: 'association_types',
170
+         value: 'inspect',
171
+       }
172
+     }
173
+   };
174
+   this.mainService
175
+     .getFetchDataList("simple/data", "taskType", postData)
176
+     .subscribe((result) => {
177
+       this.loading = false;
178
+       if (result.status == 200) {
179
+         this.tasktype = result.list[0] || {};
180
+         this.getConfig();
181
+       }
182
+     });
183
+ }
184
+
185
+ // 获取配置
186
+ getConfig() {
187
+   this.loading = true;
188
+   let postData = {
189
+     idx: 0,
190
+     sum: 1,
191
+     taskTypeConfig: {
192
+       taskTypeDTO: {
193
+         hosId: {
194
+           id: this.hosId
195
+         },
196
+         associationType: this.tasktype.associationType,
197
+       }
198
+     }
199
+   };
200
+   this.mainService
201
+     .getFetchDataList("simple/data", "taskTypeConfig", postData)
202
+     .subscribe((result) => {
203
+       this.loading = false;
204
+       if (result.status == 200) {
205
+         this.configs = result.list[0] || {};
206
+         this.activeDictionaryKey.postData.ibActiveStartTime1 = this.configs.ibActiveStartTime1 ? new Date(this.configs.ibActiveStartTime1) : undefined;
207
+         this.activeDictionaryKey.postData.ibActiveEndTime1 = this.configs.ibActiveEndTime1 ? new Date(this.configs.ibActiveEndTime1) : undefined;
208
+         this.activeDictionaryKey.postData.ibActiveStartTime2 = this.configs.ibActiveStartTime2 ? new Date(this.configs.ibActiveStartTime2) : undefined;
209
+         this.activeDictionaryKey.postData.ibActiveEndTime2 = this.configs.ibActiveEndTime2 ? new Date(this.configs.ibActiveEndTime2) : undefined;
210
+         this.activeDictionaryKey.postData.ibDefaultStartTime = this.configs.ibDefaultStartTime ? new Date(this.configs.ibDefaultStartTime) : undefined;
211
+         this.activeDictionaryKey.postData.ibDefaultEndTime = this.configs.ibDefaultEndTime ? new Date(this.configs.ibDefaultEndTime) : undefined;
212
+         this.activeDictionaryKey.postData.ibDefaultDayStart[0].checked = this.configs.ibDefaultDayStart == 1;
213
+         this.activeDictionaryKey.postData.ibDefaultDayEnd[0].checked = this.configs.ibDefaultDayEnd == 1;
214
+
215
+         this.activeDictionaryKey.postData.ib2ActiveStartTime1 = this.configs.ib2ActiveStartTime1 ? new Date(this.configs.ib2ActiveStartTime1) : undefined;
216
+         this.activeDictionaryKey.postData.ib2ActiveEndTime1 = this.configs.ib2ActiveEndTime1 ? new Date(this.configs.ib2ActiveEndTime1) : undefined;
217
+         this.activeDictionaryKey.postData.ib2ActiveStartTime2 = this.configs.ib2ActiveStartTime2 ? new Date(this.configs.ib2ActiveStartTime2) : undefined;
218
+         this.activeDictionaryKey.postData.ib2ActiveEndTime2 = this.configs.ib2ActiveEndTime2 ? new Date(this.configs.ib2ActiveEndTime2) : undefined;
219
+         this.activeDictionaryKey.postData.ib2DefaultStartTime = this.configs.ib2DefaultStartTime ? new Date(this.configs.ib2DefaultStartTime) : undefined;
220
+         this.activeDictionaryKey.postData.ib2DefaultEndTime = this.configs.ib2DefaultEndTime ? new Date(this.configs.ib2DefaultEndTime) : undefined;
221
+         this.activeDictionaryKey.postData.ib2DefaultDayStart[0].checked = this.configs.ib2DefaultDayStart == 1;
222
+         this.activeDictionaryKey.postData.ib2DefaultDayEnd[0].checked = this.configs.ib2DefaultDayEnd == 1;
223
+       }
224
+     });
225
+ }
226
+}

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

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

+ 132 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.html

@@ -0,0 +1,132 @@
1
+<div class="content priority">
2
+  <div class="contentInner">
3
+    <div class="list-template" id="wechatTable">
4
+      <div class="list-template__content">
5
+        <div class="list-template__bottom">
6
+          <div class="list-template__top" nz-row>
7
+            <div nz-col nzXl='17' class="list-template__searchBox">
8
+              <div class="list-template__searchItem">
9
+                <span class="label">检查类型</span>:
10
+                <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzPlaceHolder="请选择检查类型" [(ngModel)]="queryData.extra5" nzAllowClear nzServerSearch>
11
+                  <nz-option *ngFor="let option of typeList" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
12
+                </nz-select>
13
+              </div>
14
+              <div class="list-template__searchItem">
15
+                <span class="label">检查科室</span>:
16
+                <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzPlaceHolder="请选择检查科室" [(ngModel)]="queryData.extra4" nzAllowClear nzServerSearch nzShowSearch (nzOnSearch)="changeDeptInp($event)" (nzOpenChange)="openChangeDept($event)" (ngModelChange)="setIsSelecting(true)">
17
+                  <ng-container *ngFor="let option of deptList">
18
+                    <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
19
+                  </ng-container>
20
+                  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
21
+                    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
22
+                  </nz-option>
23
+                </nz-select>
24
+              </div>
25
+              <div class="list-template__searchItem">
26
+                <span class="label">项目名称</span>:
27
+                <input nz-input class="formItem" placeholder="请输入项目名称" [(ngModel)]="queryData.name" />
28
+              </div>
29
+            </div>
30
+            <div nz-col nzXl="7" class="list-template__btns">
31
+              <button nz-button class="btn default" (click)="addWechatModal()">新增</button>
32
+              <button nz-button class="btn default ml8" (click)='reset()'>重置</button>
33
+              <button nz-button class="btn default ml8" (click)='getList()'>搜索</button>
34
+            </div>
35
+          </div>
36
+          <nz-table class="list-template__nzTable" [nzData]="dataList" nzSize="middle" [nzShowPagination]="false"
37
+            [nzLoading]="loading1" [nzScroll]="{ y: tableWechatHeight + 'px' }">
38
+            <thead>
39
+              <tr class="thead">
40
+                <th nzWidth="20%">排序号</th>
41
+                <th nzWidth="20%">项目名称</th>
42
+                <th nzWidth="20%">检查科室</th>
43
+                <th nzWidth="20%">检查类型</th>
44
+                <th nzWidth="20%">操作</th>
45
+              </tr>
46
+            </thead>
47
+            <tbody>
48
+              <tr *ngFor="let data of dataList;let i = index">
49
+                <td>{{data.orders}}</td>
50
+                <td>{{data.name}}</td>
51
+                <td>{{data.extra4DTO?.dept}}</td>
52
+                <td>{{data.extra5DTO?.name}}</td>
53
+                <td>
54
+                  <div class="coop">
55
+                    <span (click)="showDelModal(data,'您确认要删除吗?','删除','del')">删除</span>
56
+                    <span (click)="editWechat(data)">编辑</span>
57
+                  </div>
58
+                </td>
59
+              </tr>
60
+            </tbody>
61
+          </nz-table>
62
+        </div>
63
+      </div>
64
+    </div>
65
+  </div>
66
+</div>
67
+
68
+<!-- 操作成功/失败提示框 -->
69
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
70
+  [info]="promptInfo">
71
+</app-prompt-modal>
72
+
73
+<!-- 删除模态框 -->
74
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
75
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
76
+
77
+<!-- 新增/编辑模态框 -->
78
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modalWechat">
79
+  <div class="modalBody">
80
+    <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideWechatModal()"></i></div>
81
+    <div class="content">
82
+      <form nz-form [formGroup]="validateForm" class="addForm">
83
+        <nz-form-item>
84
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="orders">排序号</nz-form-label>
85
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入排序号!">
86
+            <nz-input-group>
87
+              <nz-input-number class="w100" formControlName="orders" nzPlaceHolder="请输入排序号" [nzMin]="0" [nzStep]="1" [nzPrecision]="0"></nz-input-number>
88
+            </nz-input-group>
89
+          </nz-form-control>
90
+        </nz-form-item>
91
+        <nz-form-item>
92
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="name">项目名称</nz-form-label>
93
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入项目名称!">
94
+            <nz-input-group>
95
+              <input formControlName="name" nz-input placeholder="请输入项目名称">
96
+            </nz-input-group>
97
+          </nz-form-control>
98
+        </nz-form-item>
99
+        <nz-form-item>
100
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="extra4">检查科室</nz-form-label>
101
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择检查科室!">
102
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="extra4" nzPlaceHolder="请选择检查科室" nzAllowClear nzServerSearch nzShowSearch (nzOnSearch)="changeDeptInp($event)" (nzOpenChange)="openChangeDept($event)" (ngModelChange)="setIsSelecting(true)">
103
+              <ng-container *ngFor="let option of deptList">
104
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
105
+              </ng-container>
106
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
107
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
108
+              </nz-option>
109
+            </nz-select>
110
+          </nz-form-control>
111
+        </nz-form-item>
112
+        <nz-form-item>
113
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="extra5">检查项目</nz-form-label>
114
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择检查项目!">
115
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="extra5" nzPlaceHolder="请选择检查项目" nzServerSearch>
116
+              <ng-container *ngFor="let data of typeList">
117
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
118
+              </ng-container>
119
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
120
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
121
+              </nz-option>
122
+            </nz-select>
123
+          </nz-form-control>
124
+        </nz-form-item>
125
+      </form>
126
+    </div>
127
+    <div class=" display_flex justify-content_flex-center">
128
+      <button nzType="primary" nz-button (click)="submitWechatForm()" [nzLoading]="btnLoading">确认</button>
129
+      <button class="btn cancel" nz-button nzType="default" (click)="hideWechatModal()">取消</button>
130
+    </div>
131
+  </div>
132
+</div>

+ 288 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.less

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

+ 309 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect-inspects/configuration-inspect-inspects.component.ts

@@ -0,0 +1,309 @@
1
+import { Component, OnInit, Input } from "@angular/core";
2
+import { Subject } from 'rxjs';
3
+import { debounceTime } from 'rxjs/operators';
4
+import { Validators, FormGroup, FormBuilder } from '@angular/forms';
5
+import { ToolService } from 'src/app/services/tool.service';
6
+import { NzMessageService } from 'ng-zorro-antd';
7
+import { MainService } from 'src/app/services/main.service';
8
+
9
+@Component({
10
+  selector: "app-configuration-inspect-inspects",
11
+  templateUrl: "./configuration-inspect-inspects.component.html",
12
+  styleUrls: ["./configuration-inspect-inspects.component.less"],
13
+})
14
+export class ConfigurationInspectInspectsComponent implements OnInit {
15
+  constructor(
16
+    private mainService: MainService,
17
+    private fb: FormBuilder,
18
+    private tool: ToolService,
19
+    private message: NzMessageService,
20
+  ) {}
21
+
22
+  coopData: any = {}; //当前操作列
23
+  hosId: any = this.tool.getCurrentHospital().id;
24
+
25
+  searchTimerSubject = new Subject();
26
+
27
+  ngOnInit() {
28
+    this.searchTimerSubject.pipe(debounceTime(500)).subscribe((v) => {
29
+      let fun = v[0];
30
+      fun.call(this, v[1]);
31
+    });
32
+    setTimeout(() => {
33
+      this.tableWechatHeight = document.querySelector('#wechatTable').clientHeight - document.querySelector('#wechatTable .list-template__top').clientHeight - 8 - document.querySelector('#wechatTable .thead').clientHeight;
34
+    }, 0)
35
+    this.getTypes();
36
+    this.getList();
37
+  }
38
+
39
+  // 新增弹框
40
+  modelName = ""; //模态框名称
41
+  modalWechat: boolean = false; //新增/编辑模态框
42
+  add: boolean; //true:新增;false:编辑
43
+  addWechatModal() {
44
+    this.modelName = "新增";
45
+    this.add = true; //新增
46
+    this.modalWechat = true;
47
+    this.initWechatForm();
48
+  }
49
+  //关闭新增/编辑弹框
50
+  hideWechatModal() {
51
+    this.modalWechat = false;
52
+  }
53
+
54
+  // 编辑
55
+  editWechat(data) {
56
+    console.log(data);
57
+    this.modelName = "编辑";
58
+    this.add = false;
59
+    this.modalWechat = true;
60
+    this.initWechatForm();
61
+    this.coopData = data;
62
+    this.validateForm.controls.orders.setValue(data.orders);
63
+    this.validateForm.controls.name.setValue(data.name);
64
+    this.validateForm.controls.extra4.setValue(data.extra4DTO ? data.extra4DTO.id : null);
65
+    this.validateForm.controls.extra5.setValue(data.extra5DTO ? data.extra5DTO.id : null);
66
+
67
+    data.extra4DTO && (this.deptList = [data.extra4DTO]);
68
+  }
69
+
70
+  // 新增/编辑表单提交
71
+  btnLoading: boolean = false; //提交按钮loading状态
72
+  submitWechatForm(): void {
73
+    for (const i in this.validateForm.controls) {
74
+      this.validateForm.controls[i].markAsDirty();
75
+      this.validateForm.controls[i].updateValueAndValidity();
76
+    }
77
+    if (this.validateForm.invalid) {
78
+      return;
79
+    }
80
+    console.log(this.validateForm.value);
81
+    this.btnLoading = true;
82
+    let postData:any = {};
83
+
84
+    let arr = this.dataList.filter(
85
+      (item) => item.name == this.validateForm.value.name && item.id != this.coopData.id
86
+    );
87
+
88
+    //有重复名称
89
+    if (arr.length > 0) {
90
+      this.btnLoading = false;
91
+      this.showPromptModal(
92
+        this.add ? "新增" : "编辑",
93
+        false,
94
+        `存在重复的检查项目名称【${this.validateForm.value.name}】请修改后再保存!`
95
+      );
96
+      return;
97
+    }
98
+
99
+    if (this.add) {
100
+      //增加
101
+      let n = 0;
102
+      if (this.dataList.length > 0) {
103
+        let sortArr = this.dataList.map((item) => Number(item.value));
104
+        n = Math.max.apply(null, sortArr);
105
+      } else {
106
+        n = 0;
107
+      }
108
+      postData = {
109
+        // dictionary: {
110
+          key: "inspect_check_type",
111
+          value: n + 1,
112
+          desc: "检查项目",
113
+          orders: this.validateForm.value.orders,
114
+          name: this.validateForm.value.name,
115
+          extra4: this.validateForm.value.extra4,
116
+          extra5: this.validateForm.value.extra5,
117
+        // }
118
+      };
119
+    } else {
120
+      //编辑
121
+      postData = {
122
+        // dictionary: {
123
+          ...this.coopData,
124
+          ...{
125
+            orders: this.validateForm.value.orders,
126
+            name: this.validateForm.value.name,
127
+            extra4: this.validateForm.value.extra4,
128
+            extra5: this.validateForm.value.extra5,
129
+          }
130
+        // }
131
+      };
132
+    }
133
+    this.mainService
134
+      .simplePost("addData", "dictionary", postData)
135
+      .subscribe((result) => {
136
+        this.btnLoading = false;
137
+        this.hideWechatModal();
138
+        let msg = "";
139
+        if (this.add) {
140
+          msg = "新增";
141
+        } else {
142
+          msg = "修改";
143
+        }
144
+        if (result.status == 200) {
145
+          this.showPromptModal(msg, true, '');
146
+        } else {
147
+          this.showPromptModal(msg, false, result.msg);
148
+        }
149
+      });
150
+  }
151
+
152
+  // 初始化新增form表单
153
+  validateForm: FormGroup; //新增/编辑表单
154
+  initWechatForm() {
155
+    this.validateForm = this.fb.group({
156
+      orders: [null, [Validators.required]],
157
+      name: [null, [Validators.required]],
158
+      extra4: [null, [Validators.required]],
159
+      extra5: [null, [Validators.required]],
160
+    });
161
+  }
162
+
163
+  // 重置
164
+  queryData: any = {}
165
+  reset(){
166
+    this.queryData = {};
167
+    this.getList();
168
+  }
169
+
170
+  // 获取列表
171
+  loading1:boolean = false;
172
+  dataList: any[] = []; //表格数据
173
+  tableWechatHeight:number = 0;
174
+  getList() {
175
+    let data = {
176
+      idx: 0,
177
+      sum: 9999,
178
+      dictionary: {
179
+        key: "inspect_check_type",
180
+        name: this.queryData.name,
181
+        extra4: this.queryData.extra4,
182
+        extra5: this.queryData.extra5,
183
+      },
184
+    };
185
+    this.loading1 = true;
186
+    this.mainService
187
+      .getFetchDataList("simple/data", "dictionary", data)
188
+      .subscribe((data) => {
189
+        this.loading1 = false;
190
+        if (data.status == 200) {
191
+          this.dataList = data.list || [];
192
+        }else{
193
+          this.message.error(data.msg || "请求数据失败");
194
+        }
195
+      });
196
+  }
197
+
198
+  // 防抖
199
+  isLoading = false;
200
+  isSelecting:boolean = false; // 是否在选中状态
201
+  searchTimer(fun, e) {
202
+    if (this.isSelecting) {
203
+      this.isSelecting = false; // 重置标志
204
+      return; // 跳过处理
205
+    }
206
+    this.isLoading = true;
207
+    this.searchTimerSubject.next([fun, e]);
208
+  }
209
+
210
+  // 设置标志
211
+  setIsSelecting(flag){
212
+    this.isSelecting = flag; // 设置标志
213
+  }
214
+
215
+  openChangeDept(flag){
216
+    flag && this.setIsSelecting(false);
217
+    flag && this.getDeptList();
218
+  }
219
+
220
+  // 科室搜索
221
+  changeDeptInp(e) {
222
+    this.searchTimer(this.getDeptList, e);
223
+  }
224
+
225
+  // 获取检查科室
226
+  deptList: any = [];
227
+  getDeptList(e = undefined) {
228
+    let postData = {
229
+      idx: 0,
230
+      sum: 20,
231
+      department: {
232
+        searchType: 1,// 简单查询
233
+        cascadeHosId: this.hosId,
234
+        dept: e,
235
+      }
236
+    };
237
+    this.isLoading = true;
238
+    this.mainService
239
+      .getFetchDataList("simple/data", "department", postData)
240
+      .subscribe((data) => {
241
+        this.isLoading = false;
242
+        this.deptList = data.list || [];
243
+      });
244
+  }
245
+
246
+  // 获取检查类型
247
+  typeList: any = [];
248
+  getTypes() {
249
+    this.mainService.getDictionary('list', 'inspect_check_item').subscribe((data) => {
250
+      this.isLoading = false;
251
+      this.typeList = data || [];
252
+    });
253
+  }
254
+
255
+  delModal: boolean = false; //删除模态框
256
+  tipsMsg1: string; //提示框信息
257
+  tipsMsg2: string; //操作后信息
258
+  confirmDelType: string; //确认的类型(启用/停用,删除)
259
+  showDelModal(
260
+    data,
261
+    tipsMsg1: string,
262
+    tipsMsg2: string,
263
+    type: string,
264
+  ) {
265
+    this.confirmDelType = type;
266
+    this.delModal = true;
267
+    this.coopData = data;
268
+    this.tipsMsg1 = tipsMsg1;
269
+    this.tipsMsg2 = tipsMsg2;
270
+  }
271
+  // 隐藏删除框
272
+  hideDelModal() {
273
+    this.delModal = false;
274
+  }
275
+  // 确认删除
276
+  confirmDel() {
277
+    this.btnLoading = true;
278
+    if (this.confirmDelType === "del") {
279
+      //删除
280
+      this.mainService
281
+        .simplePost("rmvData", "dictionary", [this.coopData.id])
282
+        .subscribe((data) => {
283
+          this.btnLoading = false;
284
+          this.delModal = false;
285
+          if (data.status == 200) {
286
+            this.showPromptModal(this.tipsMsg2, true, "");
287
+          } else {
288
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
289
+          }
290
+        });
291
+    }
292
+  }
293
+
294
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
295
+  promptContent: string; //操作提示框提示信息
296
+  ifSuccess: boolean; //操作成功/失败
297
+  promptInfo: string; //操作结果提示信息
298
+  promptModalShow: boolean; //操作提示框是否展示
299
+  showPromptModal(con, success, promptInfo?) {
300
+    this.promptModalShow = false;
301
+    this.promptContent = con;
302
+    this.ifSuccess = success;
303
+    this.promptInfo = promptInfo;
304
+    setTimeout(() => {
305
+      this.promptModalShow = true;
306
+    }, 100);
307
+    this.getList();
308
+  }
309
+}

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

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

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

@@ -6,7 +6,8 @@
6 6
       </overlay-scrollbars>
7 7
     </div>
8 8
     <div class="addressAssign">
9
-      <div class="contentBody">
9
+      <!-- 注意事项 -->
10
+      <div class="contentBody" [hidden]="activeDictionaryKey.id != 1">
10 11
         <div class="dictionaryRow">
11 12
           <div class="orders">排序号</div>
12 13
           <div class="name">注意事项</div>
@@ -48,9 +49,21 @@
48 49
           </form>
49 50
         </overlay-scrollbars>
50 51
       </div>
51
-      <div class="contentBtns">
52
+      <div class="contentBtns" [hidden]="activeDictionaryKey.id != 1">
52 53
         <button nz-button nzType="primary" class="ml8" (click)="saveDictionary()">保存</button>
53 54
       </div>
55
+      <!-- 批量建单设置 -->
56
+      <ng-container *ngIf="activeDictionaryKey.id == 2">
57
+        <div class="contentBody2">
58
+          <app-configuration-inspect-batch [activeDictionaryKey]="activeDictionaryKey" [dictionaryKeyList]="dictionaryKeyList"></app-configuration-inspect-batch>
59
+        </div>
60
+      </ng-container>
61
+      <!-- 检查项目 -->
62
+      <ng-container *ngIf="activeDictionaryKey.id == 3">
63
+        <div class="contentBody2">
64
+          <app-configuration-inspect-inspects></app-configuration-inspect-inspects>
65
+        </div>
66
+      </ng-container>
54 67
     </div>
55 68
   </div>
56 69
 </div>

+ 2 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect.component.less

@@ -175,4 +175,6 @@
175 175
       align-items: center;
176 176
     }
177 177
   }
178
+
179
+
178 180
 }

+ 27 - 1
src/app/components/configurationCenter/configuration-inspect/configuration-inspect.component.ts

@@ -6,6 +6,7 @@ import { ToolService } from 'src/app/services/tool.service';
6 6
 import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
7 7
 import { NzMessageService } from 'ng-zorro-antd';
8 8
 import { v4 as uuidv4, validate as uuidValidate } from 'uuid';
9
+import { addDays, startOfMinute, endOfMinute, set, getYear, getMonth, getDate, format } from 'date-fns';
9 10
 
10 11
 @Component({
11 12
   selector: "app-configuration-inspect",
@@ -41,13 +42,35 @@ export class ConfigurationInspectComponent implements OnInit {
41 42
   // 数据字典key列表
42 43
   dictionaryKeyList:any[] = [
43 44
     { id: 1, name: '注意事项', key: "inspect_notes"},
45
+    { id: 2, name: '批量建单配置', key: "", postData: {
46
+      ibActiveStartTime1: undefined,
47
+      ibActiveEndTime1: undefined,
48
+      ibActiveStartTime2: undefined,
49
+      ibActiveEndTime2: undefined,
50
+      ibDefaultStartTime: undefined,
51
+      ibDefaultEndTime: undefined,
52
+      ibDefaultDayStart: [{ label:'+1天', value: 0 }],
53
+      ibDefaultDayEnd: [{ label:'+1天', value: 0 }],
54
+      ib2ActiveStartTime1: undefined,
55
+      ib2ActiveEndTime1: undefined,
56
+      ib2ActiveStartTime2: undefined,
57
+      ib2ActiveEndTime2: undefined,
58
+      ib2DefaultStartTime: undefined,
59
+      ib2DefaultEndTime: undefined,
60
+      ib2DefaultDayStart: [{ label:'+1天', value: 0 }],
61
+      ib2DefaultDayEnd: [{ label:'+1天', value: 0 }],
62
+    }},
63
+    { id: 3, name: '检查项目', key: ""},
44 64
   ]
45 65
 
46 66
   // 点击数据字典key
47 67
   activeDictionaryKey:any;
48 68
   clickDictionaryKey(item){
49 69
     this.activeDictionaryKey = item;
50
-    this.getDictionaryList();
70
+    if(this.activeDictionaryKey.id == 1){
71
+      this.getDictionaryList();
72
+      this.initDictionaryForm();
73
+    }
51 74
   }
52 75
 
53 76
   btnLoading: boolean = false; //提交按钮loading状态
@@ -254,4 +277,7 @@ export class ConfigurationInspectComponent implements OnInit {
254 277
         }
255 278
       });
256 279
   }
280
+
281
+
282
+
257 283
 }

+ 4 - 0
src/app/components/configurationCenter/configuration-inspect/configuration-inspect.module.ts

@@ -3,6 +3,8 @@ import { CommonModule } from '@angular/common';
3 3
 
4 4
 import { ConfigurationInspectComponent } from './configuration-inspect.component';
5 5
 import { ShareModule } from '../../../share/share.module';
6
+import { ConfigurationInspectBatchModule } from './configuration-inspect-batch/configuration-inspect-batch.module';
7
+import { ConfigurationInspectInspectsModule } from './configuration-inspect-inspects/configuration-inspect-inspects.module';
6 8
 
7 9
 
8 10
 @NgModule({
@@ -12,6 +14,8 @@ import { ShareModule } from '../../../share/share.module';
12 14
   imports: [
13 15
     CommonModule,
14 16
     ShareModule,
17
+    ConfigurationInspectBatchModule,
18
+    ConfigurationInspectInspectsModule,
15 19
   ],
16 20
   exports: [
17 21
     ConfigurationInspectComponent,

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

@@ -4,6 +4,8 @@
4 4
     <div class="address">
5 5
       <div class="contentHead">工时大类
6 6
 				<div>
7
+					<button nz-button class="mar-rig-10 btn" nzType="primary" nzSize="small" *ngIf="activeCategory1.id" (click)="operation(1)">{{activeCategory1.disableType==1?'停用':'启用'}}</button>
8
+					<button nz-button class="mar-rig-10 btn" nzType="primary" nzSize="small" *ngIf="activeCategory1.id" (click)="addLogModal(1)">日志</button>
7 9
 					<button nz-button class="mar-rig-10 btn cancel" nzType="default" nzSize="small" *ngIf="activeCategory1.id && categoryList1.length" (click)="delCategoryModal(1)">删除</button>
8 10
           <button nz-button class="mar-rig-10 btn" nzType="primary" nzSize="small" *ngIf="activeCategory1.id && categoryList1.length" (click)="editCategoryModal(1)">编辑</button>
9 11
 					<button nz-button nzType="primary" nzSize="small" (click)="addCategoryModal(1)">新增</button>
@@ -11,12 +13,14 @@
11 13
 			</div>
12 14
       <overlay-scrollbars #osComponentRef1 class="contentBody">
13 15
         <nz-spin nzSimple [nzSpinning]="categoryLoading1" class="mt8 text_align_center"></nz-spin>
14
-        <div [hidden]="categoryLoading1" class="contentItem" [title]="item.workName" [ngClass]="{ active: item.id === activeCategory1.id }" (click)="clickCategory(item, 1)" *ngFor="let item of categoryList1">{{ item.workName }} - {{item.workUnit}} - {{item.wage}}元 - {{item.integral.value}}分</div>
16
+        <div [hidden]="categoryLoading1" class="contentItem" [title]="item.workName" [ngClass]="{ active: item.id === activeCategory1.id }" (click)="clickCategory(item, 1)" *ngFor="let item of categoryList1">{{ item.workName }} - {{item.workUnit}} - {{item.wage}}元 - {{item.integral?item.integral.value:''}}分 - {{item.disableType==0?'停用':'启用'}}</div>
15 17
       </overlay-scrollbars>
16 18
     </div>
17 19
     <div class="address">
18 20
       <div class="contentHead">工时小类
19 21
 				<div>
22
+					<button nz-button class="mar-rig-10 btn" nzType="primary" nzSize="small" *ngIf="activeCategory2.id && activeCategory1.disableType==1 && activeCategory1.id" (click)="operation(2)">{{activeCategory2.disableType==1?'停用':'启用'}}</button>
23
+					<button nz-button class="mar-rig-10 btn" nzType="primary" nzSize="small" *ngIf="activeCategory2.id && activeCategory1.id" (click)="addLogModal(2)">日志</button>
20 24
 					<button nz-button class="mar-rig-10 btn cancel" *ngIf="activeCategory2.id && activeCategory1.id" nzType="default" nzSize="small" (click)="delCategoryModal(2)">删除</button>
21 25
           <button nz-button class="mar-rig-10 btn" *ngIf="activeCategory2.id && activeCategory1.id" nzType="primary" nzSize="small" (click)="editCategoryModal(2)">编辑</button>
22 26
 					<button nz-button nzType="primary" nzSize="small" *ngIf="activeCategory1.id" (click)="addCategoryModal(2)">新增</button>
@@ -24,7 +28,7 @@
24 28
 			</div>
25 29
       <overlay-scrollbars #osComponentRef2 class="contentBody">
26 30
         <nz-spin nzSimple [nzSpinning]="categoryLoading2" class="mt8 text_align_center"></nz-spin>
27
-        <div [hidden]="categoryLoading2" class="contentItem" [title]="item.workName" [ngClass]="{ active: item.id === activeCategory2.id }" (click)="clickCategory(item, 2)" *ngFor="let item of categoryList2">{{ item.workName }} - {{item.workUnit}} - {{item.wage}}元 - {{item.integral.value}}分</div>
31
+        <div [hidden]="categoryLoading2" class="contentItem" [title]="item.workName" [ngClass]="{ active: item.id === activeCategory2.id }" (click)="clickCategory(item, 2)" *ngFor="let item of categoryList2">{{ item.workName }} - {{item.workUnit}} - {{item.wage}}元 - {{item.integral?item.integral.value:''}}分 - {{item.disableType==0?'停用':'启用'}}</div>
28 32
       </overlay-scrollbars>
29 33
     </div>
30 34
   </div>
@@ -121,3 +125,49 @@
121 125
 <app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
122 126
   (confirmDelEvent)="confirmDel()" (cancelDelEvent)="cancelDel()" [content]="delContent" confirmTxt="是" cancelTxt="否">
123 127
 </app-dialog-delete>
128
+
129
+<!-- 启用/停用模态框 -->
130
+<app-dialog-delete [delModal]="operationModal" (hideDelModalEvent)="hideOperationModal()" [btnLoading]="btnLoading"
131
+  (confirmDelEvent)="confirmOperation()" (cancelDelEvent)="cancelOperation()" [content]="operationContent" confirmTxt="是" cancelTxt="否">
132
+</app-dialog-delete>
133
+
134
+<!-- 日志查看模态框 -->
135
+	<div class="save add display_flex align-items_center justify-content_flex-center" *ngIf="logModal">
136
+	  <div class="modalBody modalLogBody">
137
+	    <div class="title">日志查看<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
138
+	    </div>
139
+	    <div class="content">
140
+	      <div class="list-template__bottom">
141
+	        <nz-table class="list-template__nzTable" [nzData]="listLogOfData" nzSize="middle" [nzShowPagination]="false"
142
+	          [nzLoading]="loading2">
143
+	          <thead>
144
+	            <tr class="thead">
145
+								<th>事件单号</th>
146
+								<th>动作</th>
147
+	              <th>操作时间</th>
148
+	              <th>操作人</th>
149
+	              <th>调整记录</th>
150
+	            </tr>
151
+	          </thead>
152
+	          <tbody>
153
+	            <tr *ngFor="let data of listLogOfData">
154
+								<td>{{ data.incidentDTO ? data.incidentDTO.incidentsign : '-' }}</td>
155
+	            	<td>{{ data.operationType ? data.operationType.name : '-' }}</td>
156
+	            	<td>{{ data.operationTime|date:'yyyy-MM-dd HH:mm'}}</td>
157
+	            	<td>{{ data.operationUserDTO ? data.operationUserDTO.name : '-' }}</td>
158
+	            	<td>{{ data.logRemark ? data.logRemark : '-' }} <span *ngIf="data.operationType.value==6">单价:{{ data.currentPrice }} &nbsp;&nbsp;积分:{{ data.currentScore?data.currentScore.value:'' }}</span></td>
159
+	            </tr>
160
+	          </tbody>
161
+	        </nz-table>
162
+	      </div>
163
+				<div class="list-template__pagination">
164
+				  <nz-pagination [(nzPageIndex)]="pageLogIndex" [(nzTotal)]="listLogLength" nzShowSizeChanger [(nzPageSize)]="pageLogSize"
165
+				    (nzPageIndexChange)="getLogList()" (nzPageSizeChange)="getLogList()">
166
+				  </nz-pagination>
167
+				</div>
168
+	    </div>
169
+	    <div class="display_flex justify-content_flex-center">
170
+	      <button class="btn" nz-button nzType="primary" (click)="hideModal()">知道了</button>
171
+	    </div>
172
+	  </div>
173
+	</div>

+ 117 - 0
src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component.less

@@ -298,6 +298,123 @@
298 298
           }
299 299
         }
300 300
       }
301
+			
302
+			.modalLogBody {
303
+			  width: 80%;
304
+			  height: auto;
305
+			
306
+			  .content {
307
+			    width: 100%;
308
+			    height: auto;
309
+			    padding: 19px 14px 0 14px;
310
+			    max-height: 500px;
311
+			    overflow-y: auto;
312
+					
313
+					.list-template__bottom {
314
+					  background: #f9fafb;
315
+					  border: 1px solid #e5e9ed;
316
+					  border-radius: 8px;
317
+					  // padding-bottom: 56px;
318
+					  position: relative;
319
+					  .list-template__nzTable {
320
+					    padding: 16px 16px 0;
321
+					
322
+					    .thead {
323
+					      background-image: linear-gradient(to right, @bg-start, @bg-end);
324
+					
325
+					      th {
326
+					        background: transparent;
327
+					        color: #fff;
328
+					        text-align: center;
329
+					      }
330
+					    }
331
+					
332
+					    .ant-table-body {
333
+					      border-bottom: 1px solid #e5e9ed;
334
+					    }
335
+					
336
+					    .ant-table-tbody {
337
+					      tr {
338
+					        text-align: center;
339
+					        color: #333;
340
+					
341
+					        td {
342
+					          border: none;
343
+					
344
+					          &.tab_hover:hover{
345
+					            text-decoration: underline;
346
+					            cursor: pointer;
347
+					          }
348
+					
349
+					          .coop {
350
+					            button{
351
+					              color: #333;
352
+					            }
353
+					            span,button {
354
+					              display: inline-block;
355
+					              padding: 0 8px;
356
+					              cursor: pointer;
357
+					              position: relative;
358
+					
359
+					              &::after {
360
+					                content: "|";
361
+					                position: absolute;
362
+					                top: 0;
363
+					                right: 0;
364
+					              }
365
+					
366
+					              &:hover,
367
+					              &:active {
368
+					                color: @primary-color;
369
+					              }
370
+					
371
+					              &:nth-last-child(1) {
372
+					                &::after {
373
+					                  content: "";
374
+					                }
375
+					              }
376
+					            }
377
+					          }
378
+					        }
379
+					      }
380
+					    }
381
+					  }
382
+					}
383
+										
384
+			    .addForm {
385
+			      .ant-form-item {
386
+			        margin-bottom: 14px;
387
+			
388
+			        .ant-form-item-label {
389
+			          line-height: 14px;
390
+			          text-align: left;
391
+			        }
392
+			      }
393
+			    }
394
+			
395
+			    .editForm {
396
+			      .ant-form-item {
397
+			        margin-bottom: 14px;
398
+			
399
+			        .ant-form-item-label {
400
+			          line-height: 0;
401
+			          text-align: left;
402
+			        }
403
+			      }
404
+			    }
405
+					.list-template__pagination {
406
+						text-align: right;
407
+						padding: 20px 0;
408
+					}
409
+			  }
410
+				
411
+				
412
+			  button {
413
+			    &:nth-child(1) {
414
+			      margin-right: 20px;
415
+			    }
416
+			  }
417
+			}
301 418
     }
302 419
   }
303 420
 }

+ 113 - 1
src/app/components/configurationCenter/configuration-manHour/configuration-manHour.component.ts

@@ -161,7 +161,119 @@ export class ConfigurationManHourComponent implements OnInit {
161 161
 	hideDelModal() {
162 162
 	  this.delModal = false;
163 163
 	}
164
-
164
+	
165
+	// 日志列表
166
+	listLogOfData: any[] = []; //日志数据
167
+	pageLogIndex: number = 1; //日志当前页码
168
+	pageLogSize: number = 10; //日志每页展示条数
169
+	listLogLength: number = 10; //日志总数据量
170
+	loading2:boolean = false;
171
+	getLogList(type) {
172
+	  if (type == 1) {
173
+	    this.pageLogIndex = 1;
174
+	  }
175
+	  let postData = {
176
+	  	idx: this.pageLogIndex - 1,
177
+	  	sum: this.pageLogSize,
178
+	  	workHourManagementLog: {
179
+	  		workHourId: this.itemData.id,
180
+	  	},
181
+	  };
182
+	  this.loading2 = true;
183
+	  this.mainService
184
+	    .getFetchDataList("simple/data", "workHourManagementLog", postData)
185
+	    .subscribe((data) => {
186
+	      this.loading2 = false;
187
+	      if (data.status == 200) {
188
+					this.logModal = true
189
+	        this.listLogOfData = data.list;
190
+	        this.listLogLength = data.totalNum;
191
+	      }else{
192
+	        this.message.error(data.msg || "请求数据失败");
193
+	      }
194
+	    });
195
+	}
196
+	
197
+	// 启用/停用工时
198
+	operationModal: boolean = false; 
199
+	operationContent: string = null; 
200
+	operation(type:number){
201
+		if(type==1){
202
+			let msg = this.activeCategory1.disableType==1?'停用':'启用'
203
+			if(this.activeCategory1.disableType==1){
204
+				this.operationContent = `您确认${msg}大类工时吗?${msg}后所有小类同时${msg}`
205
+			}else{
206
+				this.operationContent = `您确认${msg}大类工时吗?`
207
+			}
208
+		}else{
209
+			let msg = this.activeCategory2.disableType==1?'停用':'启用'
210
+			this.operationContent = `您确认${msg}小类工时吗?`
211
+		}
212
+		this.coopType = type;
213
+		this.operationModal = true
214
+	}
215
+	
216
+	hideOperationModal(){
217
+		this.operationModal = false
218
+	}
219
+	
220
+	// 取消启用/停用弹框
221
+	cancelOperation(){
222
+		this.hideOperationModal();
223
+	}
224
+	
225
+	// 确认启用/停用
226
+	confirmOperation() {
227
+	  let that = this;
228
+		let disableType = null
229
+	  that.btnLoading = true;
230
+		if(this['activeCategory' + this.coopType].disableType==1){
231
+			disableType = 0
232
+		}else{
233
+			disableType = 1
234
+		}
235
+		let postData = {
236
+		  workHourManagement: {
237
+				...this['activeCategory' + this.coopType],
238
+				disableType:disableType,
239
+				upType: 'disable'
240
+		  }
241
+		}
242
+	  that.mainService
243
+	    .coopData('updData', 'workHourManagement', postData)
244
+	    .subscribe((data) => {
245
+	      that.btnLoading = false;
246
+				if(disableType==1){
247
+					this['activeCategory' + this.coopType].disableType = 1
248
+				}else{
249
+					this['activeCategory' + this.coopType].disableType = 0
250
+				}
251
+	      that.hideOperationModal();
252
+				if(this.coopType==1){
253
+					this.categoryList2 = []
254
+				}
255
+	      if (data["status"] == 200) {
256
+	        that.showPromptModal("操作", true, "");
257
+	      } else {
258
+	        that.showPromptModal("操作", false, data["msg"]);
259
+	      }
260
+	    });
261
+	}
262
+	
263
+	// 查看日志
264
+	itemData:any = {};
265
+	logModal:boolean = false;
266
+	addLogModal(type){
267
+		this.itemData = this['activeCategory' + type];
268
+		console.log(this['activeCategory' + type])
269
+		this.getLogList(1)
270
+	}
271
+	
272
+	// 关闭日志
273
+	hideModal() {
274
+	  this.logModal = false;
275
+	}
276
+	
165 277
   // 获取工时
166 278
   loading1:boolean = false;
167 279
   tableCategoryHeight:number = 0;

+ 13 - 0
src/app/components/configurationCenter/configuration-quick/configuration-quick.component.html

@@ -125,6 +125,19 @@
125 125
 						</nz-select>
126 126
           </nz-form-control>
127 127
         </nz-form-item>
128
+        <nz-form-item *ngIf="validatePriorityForm.value.bussType === 'inspect'">
129
+          <nz-form-label nzFor="taskTypeInspectIds" nzRequired [nzSpan]="6">任务类型</nz-form-label>
130
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择任务类型!">
131
+						<nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear nzPlaceHolder="请选择任务类型" formControlName="taskTypeInspectIds" (nzOnSearch)="changeCommonInp('taskTypeInspect', $event)">
132
+						  <ng-container *ngFor="let option of malfunctionInspectData">
133
+						    <nz-option *ngIf="!isLoading" [nzLabel]="option.taskName" [nzValue]="option.id"></nz-option>
134
+						  </ng-container>
135
+						  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
136
+						    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
137
+						  </nz-option>
138
+						</nz-select>
139
+          </nz-form-control>
140
+        </nz-form-item>
128 141
         <nz-form-item *ngIf="validatePriorityForm.value.bussType === 'goods' && hasSpecimen">
129 142
           <nz-form-label nzFor="urgentIds" [nzSpan]="8">是否显示标本数量</nz-form-label>
130 143
           <nz-form-control [nzSpan]="16" nzErrorTip="请选择是否显示标本数量!">

+ 52 - 6
src/app/components/configurationCenter/configuration-quick/configuration-quick.component.ts

@@ -28,6 +28,7 @@ export class ConfigurationQuickComponent implements OnInit {
28 28
 
29 29
 	currentHospital:any;
30 30
 	malfunctionData:any = [];
31
+	malfunctionInspectData:any = [];
31 32
 	allUserGroup:any = [];
32 33
 	userData:any = [];
33 34
 
@@ -37,6 +38,8 @@ export class ConfigurationQuickComponent implements OnInit {
37 38
 		this.changeCommonInpSubject.pipe(debounceTime(500)).subscribe((v) => {
38 39
       if(v[0] === 'taskType'){
39 40
         this.getTaskTypeList(v[1]);
41
+      }else if(v[0] === 'taskTypeInspect'){
42
+        this.getTaskTypeInspectList(v[1]);
40 43
       }
41 44
     });
42 45
 
@@ -48,6 +51,7 @@ export class ConfigurationQuickComponent implements OnInit {
48 51
 		this.currentHospital = this.tool.getCurrentHospital();
49 52
     this.getCommonFaultsList();
50 53
 		this.getTaskTypeList();
54
+		this.getTaskTypeInspectList();
51 55
     this.getPagePermissionIcon();
52 56
     this.getPagePermissionBussType();
53 57
     this.getPagePermissionQuickOperation();
@@ -72,7 +76,7 @@ export class ConfigurationQuickComponent implements OnInit {
72 76
     this.changeCommonInpSubject.next([type, e]);
73 77
   }
74 78
 
75
-	// 获取故障现象数据
79
+	// 获取任务类型数据-标本,其他,万能
76 80
   isLoading:boolean = false;
77 81
 	getTaskTypeList(keyWord?){
78 82
 		let postData = {
@@ -94,6 +98,27 @@ export class ConfigurationQuickComponent implements OnInit {
94 98
 		})
95 99
 	}
96 100
 
101
+	// 获取任务类型数据-陪检
102
+	getTaskTypeInspectList(keyWord?){
103
+		let postData = {
104
+      idx: 0,
105
+      sum: 9999,
106
+		  taskType: {
107
+        taskName: keyWord,
108
+        hosIds: this.hosId,
109
+        assTypeValues: 'inspect',
110
+        simpleQuery: true,
111
+		  },
112
+		};
113
+    this.isLoading = true;
114
+		this.mainService.getFetchDataList('configuration', "taskType", postData).subscribe(data => {
115
+		  this.isLoading = false;
116
+      if (data.status == 200) {
117
+        this.malfunctionInspectData = data.list || [];
118
+      }
119
+		})
120
+	}
121
+
97 122
   // 获取字典数据-图标名称
98 123
   pagePermissionIconList: any[] = [];
99 124
   getPagePermissionIcon() {
@@ -135,15 +160,23 @@ export class ConfigurationQuickComponent implements OnInit {
135 160
     console.log(e);
136 161
     this.validatePriorityForm.controls.quickOperation.setValue(null);
137 162
     this.validatePriorityForm.controls.taskTypeIds.setValue([]);
163
+    this.validatePriorityForm.controls.taskTypeInspectIds.setValue(null);
138 164
     this.validatePriorityForm.controls.urgentIds.setValue(this.gdEmergencyList.map(v => {v.checked = false;return v;}));
139 165
 
140 166
     if(e === 'service'){
141 167
       this.requiredChange('quickOperation', true);
142 168
       this.requiredChange('taskTypeIds', false);
169
+      this.requiredChange('taskTypeInspectIds', false);
143 170
       this.requiredChange('urgentIds', false);
144 171
     }else if(e === 'goods'){
145 172
       this.requiredChange('quickOperation', false);
146 173
       this.requiredChange('taskTypeIds', true);
174
+      this.requiredChange('taskTypeInspectIds', false);
175
+      this.requiredChange('urgentIds', false);
176
+    }else if(e === 'inspect'){
177
+      this.requiredChange('quickOperation', false);
178
+      this.requiredChange('taskTypeIds', false);
179
+      this.requiredChange('taskTypeInspectIds', true);
147 180
       this.requiredChange('urgentIds', false);
148 181
     }
149 182
   }
@@ -180,14 +213,20 @@ export class ConfigurationQuickComponent implements OnInit {
180 213
     this.coopData = data;
181 214
 
182 215
     this.changeBussType(data.bussType.value);
183
-    data.taskTypeIds && this.changeTaskTypeIds(data.taskTypeIds.split(',').map(v => +v));
216
+    if(data.bussType.value === 'goods'){
217
+      data.taskTypeIds && this.changeTaskTypeIds(data.taskTypeIds.split(',').map(v => +v));
218
+    }
184 219
 
185 220
     this.validatePriorityForm.controls.orders.setValue(data.orders);
186 221
     this.validatePriorityForm.controls.icon.setValue(data.icon.id);
187 222
     this.validatePriorityForm.controls.name.setValue(data.name);
188 223
     this.validatePriorityForm.controls.bussType.setValue(data.bussType.value);
189 224
     data.quickOperation && this.validatePriorityForm.controls.quickOperation.setValue(data.quickOperation.id);
190
-    data.taskTypeIds && this.validatePriorityForm.controls.taskTypeIds.setValue(data.taskTypeIds.split(',').map(v => +v));
225
+    if(data.bussType.value === 'goods'){
226
+      data.taskTypeIds && this.validatePriorityForm.controls.taskTypeIds.setValue(data.taskTypeIds.split(',').map(v => +v));
227
+    }else if(data.bussType.value === 'inspect'){
228
+      data.taskTypeIds && this.validatePriorityForm.controls.taskTypeInspectIds.setValue(+data.taskTypeIds);
229
+    }
191 230
     if(data.urgentIds){
192 231
       let ids = data.urgentIds.split(',').map(v => +v);
193 232
       let urgentIds = this.gdEmergencyList.map(v => {
@@ -212,6 +251,12 @@ export class ConfigurationQuickComponent implements OnInit {
212 251
     console.log(this.validatePriorityForm.value);
213 252
     this.btnLoading = true;
214 253
     let postData:any = {};
254
+    let taskTypeIds;
255
+    if(this.validatePriorityForm.value.bussType === 'goods'){
256
+      taskTypeIds = this.validatePriorityForm.value.taskTypeIds.length ? this.validatePriorityForm.value.taskTypeIds.toString() : undefined
257
+    }else if(this.validatePriorityForm.value.bussType === 'inspect'){
258
+      taskTypeIds = this.validatePriorityForm.value.taskTypeInspectIds ? this.validatePriorityForm.value.taskTypeInspectIds.toString() : undefined
259
+    }
215 260
     if (this.add) {
216 261
       //增加
217 262
       postData = {
@@ -221,7 +266,7 @@ export class ConfigurationQuickComponent implements OnInit {
221 266
         name: this.validatePriorityForm.value.name,
222 267
         bussType: this.validatePriorityForm.value.bussType ? this.pagePermissionBussTypeList.find(v => v.value === this.validatePriorityForm.value.bussType) : undefined,
223 268
         quickOperation: this.validatePriorityForm.value.quickOperation ? { id: this.validatePriorityForm.value.quickOperation } : undefined,
224
-        taskTypeIds: this.validatePriorityForm.value.taskTypeIds.length ? this.validatePriorityForm.value.taskTypeIds.toString() : undefined,
269
+        taskTypeIds,
225 270
         urgentIds: this.validatePriorityForm.value.urgentIds.length ? this.validatePriorityForm.value.urgentIds.filter(v => v.checked).map(v => v.value).toString() : undefined,
226 271
         active: this.validatePriorityForm.value.active,
227 272
       };
@@ -234,7 +279,7 @@ export class ConfigurationQuickComponent implements OnInit {
234 279
         name: this.validatePriorityForm.value.name,
235 280
         bussType: this.validatePriorityForm.value.bussType ? this.pagePermissionBussTypeList.find(v => v.value === this.validatePriorityForm.value.bussType) : undefined,
236 281
         quickOperation: this.validatePriorityForm.value.quickOperation ? { id: this.validatePriorityForm.value.quickOperation } : undefined,
237
-        taskTypeIds: this.validatePriorityForm.value.taskTypeIds.length ? this.validatePriorityForm.value.taskTypeIds.toString() : undefined,
282
+        taskTypeIds,
238 283
         urgentIds: this.validatePriorityForm.value.urgentIds.length ? this.validatePriorityForm.value.urgentIds.filter(v => v.checked).map(v => v.value).toString() : undefined,
239 284
         active: this.validatePriorityForm.value.active,
240 285
       };
@@ -268,7 +313,8 @@ export class ConfigurationQuickComponent implements OnInit {
268 313
       name: [null, [Validators.required]],//按钮名称
269 314
       bussType: [null, [Validators.required]],//关联业务
270 315
       quickOperation: [null, [Validators.required]],//快捷操作
271
-      taskTypeIds: [[], [Validators.required]],//关联任务类型
316
+      taskTypeIds: [[], [Validators.required]],//关联任务类型-标本,其他,万能
317
+      taskTypeInspectIds: [null, [Validators.required]],//关联任务类型-陪检
272 318
       urgentIds: [this.gdEmergencyList.map(v => {v.checked = false;return v;}), [Validators.required]],//是否显示标本数量
273 319
       active: [0, [Validators.required]],//是否启用
274 320
     });

+ 250 - 3
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.html

@@ -49,13 +49,13 @@
49 49
                   <nz-form-label class="label">必须扫描动态二维码</nz-form-label>
50 50
                   <nz-checkbox-group [(ngModel)]="arriveScanDynamicCode"></nz-checkbox-group>
51 51
                 </div>
52
-								
52
+
53 53
 								<!-- 输入动态数字密钥 -->
54 54
 								<div class="display_flex align-items_center mb8" *ngIf="arriveScanCode[0].checked">
55 55
 								  <nz-form-label class="label">输入动态数字密钥</nz-form-label>
56 56
 								  <nz-checkbox-group [(ngModel)]="enterDynamicDigitalKey"></nz-checkbox-group>
57 57
 								</div>
58
-								
58
+
59 59
                 <!-- 退回标本是否填写交接人 -->
60 60
                 <div class="display_flex align-items_center mb8">
61 61
                   <nz-form-label class="label">退回标本是否填写交接人</nz-form-label>
@@ -85,6 +85,75 @@
85 85
                   <nz-form-label class="label">默认扫描标本进入标本扫描页</nz-form-label>
86 86
                   <nz-checkbox-group [(ngModel)]="defaultScanSpe"></nz-checkbox-group>
87 87
                 </div>
88
+								
89
+								<!-- 是否开通收取限制 -->
90
+								<div class="display_flex align-items_center mb8">
91
+								  <nz-form-label class="label">是否开通收取限制</nz-form-label>
92
+								  <nz-checkbox-group [(ngModel)]="speCollectLimit" (ngModelChange)="changeSpeCollect($event)"></nz-checkbox-group>
93
+								</div>
94
+								
95
+								<!-- 是否支持非起点科室收取 -->
96
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
97
+								  <nz-form-label class="label">是否支持非起点科室收取</nz-form-label>
98
+								  <nz-checkbox-group [(ngModel)]="speCollectSupportNotStartDept"></nz-checkbox-group>
99
+								</div>
100
+								
101
+								<!-- 限制标本状态收取 -->
102
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
103
+									<nz-form-label class="label">限制标本状态收取</nz-form-label>
104
+									<nz-select class="formItem" nzMode="multiple" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzAllowClear nzPlaceHolder="请选择限制标本状态收取" [(ngModel)]="speCollectLimitState">
105
+										<ng-container *ngFor="let option of specimenStateData">
106
+											<nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
107
+										</ng-container>
108
+									</nz-select>
109
+								</div>
110
+								
111
+								<!-- 限制终点科室收取 -->
112
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
113
+									<nz-form-label class="label">限制终点科室收取</nz-form-label>
114
+									<nz-select nzMode="multiple" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear
115
+									  (nzOnSearch)="changeEndDept($event)" nzPlaceHolder="请选择限制终点科室收取" [(ngModel)]="speCollectLimitEndDept">
116
+									  <ng-container *ngFor="let option of endDeptData">
117
+									    <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
118
+									  </ng-container>
119
+									  <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
120
+									    <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
121
+									  </nz-option>
122
+									</nz-select>
123
+								</div>
124
+								
125
+								<!-- 限制普通或紧急收取 -->
126
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
127
+									<nz-form-label class="label">限制普通或紧急收取</nz-form-label>
128
+									<nz-select class="formItem" nzMode="multiple" [nzDropdownMatchSelectWidth]="false" nzAllowClear nzPlaceHolder="请选择限制普通或紧急收取" [(ngModel)]="speCollectLimitUrgent">
129
+										<ng-container *ngFor="let option of astrictData">
130
+											<nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
131
+										</ng-container>
132
+									</nz-select>
133
+								</div>
134
+								
135
+								<!-- 是否限制重复收取标本 -->
136
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
137
+								  <nz-form-label class="label">是否限制重复收取标本</nz-form-label>
138
+									<nz-checkbox-group [(ngModel)]="speCollectLimitRepeat"></nz-checkbox-group>
139
+								</div>
140
+								
141
+								<!-- 是否限制试管类型收取标本 -->
142
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
143
+								  <nz-form-label class="label">是否限制试管类型收取标本</nz-form-label>
144
+									<nz-select class="formItem" nzMode="multiple" [nzDropdownMatchSelectWidth]="false" nzAllowClear nzPlaceHolder="请选择是否限制重复收取标本" [(ngModel)]="speCollectLimitTubeType">
145
+										<ng-container *ngFor="let option of repetitionData">
146
+											<nz-option [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
147
+										</ng-container>
148
+									</nz-select>
149
+								</div>
150
+								
151
+								<!-- 是否开始收取前进入配置页 -->
152
+								<div class="display_flex align-items_center mb8" *ngIf="speCollectLimit[0].checked">
153
+								  <nz-form-label class="label">是否开始收取前进入配置页</nz-form-label>
154
+								  <nz-checkbox-group [(ngModel)]="speStartCollectShowConfig"></nz-checkbox-group>
155
+								</div>
156
+								
88 157
               </div>
89 158
               <!-- 自动建单配置 -->
90 159
               <div *ngIf="tabModalName=='automaticOrderCreation'">
@@ -140,7 +209,7 @@
140 209
 										</ng-container>
141 210
 									</nz-select>
142 211
 								</div>
143
-								
212
+
144 213
 								<!-- 手术病理标签样式 -->
145 214
 								<div class="display_flex align-items_center mb8">
146 215
 									<nz-form-label class="label">手术病理标签样式</nz-form-label>
@@ -150,6 +219,23 @@
150 219
 										</ng-container>
151 220
 									</nz-select>
152 221
 								</div>
222
+
223
+								<!-- 速冻标本数量控制 -->
224
+								<div class="display_flex align-items_center mb8">
225
+									<nz-form-label class="label">速冻标本数量控制</nz-form-label>
226
+									<nz-radio-group type="active" [(ngModel)]="pathologyFrozenSpecimenNum">
227
+										<label nz-radio [nzValue]="1">单只</label>
228
+										<label nz-radio [nzValue]="0">多只</label>
229
+									</nz-radio-group>
230
+								</div>
231
+
232
+								<!-- 提示语 -->
233
+								<div class="display_flex align-items_center mb8" *ngIf="pathologyFrozenSpecimenNum==1">
234
+									<nz-form-label class="label">提示语</nz-form-label>
235
+									<nz-input-group>
236
+										<input class="width-200" type="text" nz-input [(ngModel)]="prompt" />
237
+									</nz-input-group>
238
+								</div>
153 239
 							</div>
154 240
 							<div class="bottom">
155 241
 								<button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitPathologyForm()">保存</button>
@@ -165,6 +251,167 @@
165 251
 						</div>
166 252
 					</div>
167 253
 				</div>
254
+        <div class="TaskTypeManagement" *ngIf="activeDictionaryKey=='specimenPackage'">
255
+					<div class="taskTypeInfo">
256
+            <div class="top">
257
+              <div class="item" (click)="tabModal('characteristics')" [ngClass]="{'items':tabModalName=='characteristics'}">
258
+                特性配置
259
+              </div>
260
+              <div class="item" (click)="tabModal('nursePackage')" [ngClass]="{'items':tabModalName=='nursePackage'}">
261
+                护士打包配置
262
+              </div>
263
+              <div class="item" (click)="tabModal('automaticOrderCreation')" [ngClass]="{'items':tabModalName=='automaticOrderCreation'}">
264
+                自动建单配置
265
+              </div>
266
+            </div>
267
+            <div class="list" *ngIf="!loading">
268
+              <!-- 特性配置 -->
269
+              <div *ngIf="tabModalName=='characteristics'">
270
+                <!-- 是否联合标本收取 -->
271
+                <div class="display_flex align-items_center mb8">
272
+                  <nz-form-label class="label">是否联合标本收取</nz-form-label>
273
+                  <nz-radio-group [(ngModel)]="spePackageUnionReceive">
274
+                    <label nz-radio [nzValue]="1">是</label>
275
+                    <label nz-radio [nzValue]="0">否</label>
276
+                  </nz-radio-group>
277
+                </div>
278
+                <!-- 关联任务类型 -->
279
+                <div class="display_flex align-items_center mb8">
280
+                  <nz-form-label class="label">关联任务类型</nz-form-label>
281
+                  {{tasktype.taskName}}
282
+                </div>
283
+                <!-- 工单模式 -->
284
+                <div class="display_flex align-items_center mb8">
285
+                  <nz-form-label class="label" nzRequired>工单模式</nz-form-label>
286
+                  <nz-radio-group [(ngModel)]="spePackageModel">
287
+                    <label nz-radio [nzValue]="item.value" *ngFor="let item of spePackageModelList">{{ item.label }}</label>
288
+                  </nz-radio-group>
289
+                </div>
290
+                <!-- 支持建单并签到 -->
291
+                <div class="display_flex align-items_center mb8">
292
+                  <nz-form-label class="label">支持建单并签到</nz-form-label>
293
+                  <nz-checkbox-group [(ngModel)]="drugsCreateSign"></nz-checkbox-group>
294
+                </div>
295
+                <!-- 支持接单并签到 -->
296
+                <div class="display_flex align-items_center mb8">
297
+                  <nz-form-label class="label">支持接单并签到</nz-form-label>
298
+                  <nz-checkbox-group [(ngModel)]="drugsReceiveSign"></nz-checkbox-group>
299
+                </div>
300
+
301
+                <!-- 起点科室支持核对 -->
302
+                <div class="display_flex align-items_center mb8">
303
+                  <nz-form-label class="label">起点科室支持核对</nz-form-label>
304
+                  <nz-checkbox-group [(ngModel)]="drugsStartCheck" (ngModelChange)="changeDrugsStartCheck($event)"></nz-checkbox-group>
305
+                </div>
306
+                <ng-container *ngIf="drugsStartCheck[0].checked">
307
+                  <!-- 核对方式 -->
308
+                  <div class="display_flex align-items_center mb8">
309
+                    <nz-form-label class="label" nzRequired>核对方式</nz-form-label>
310
+                    <nz-checkbox-group [(ngModel)]="drugsStartCheckScanIds"></nz-checkbox-group>
311
+                  </div>
312
+                  <!-- 手动填写 -->
313
+                  <div class="display_flex align-items_center mb8">
314
+                    <nz-form-label class="label">手动填写</nz-form-label>
315
+                    <nz-select class="w320px" nzPlaceHolder="请选择手动填写" [(ngModel)]="drugsStartManual" nzAllowClear>
316
+                      <nz-option *ngFor="let item of drugsManualList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
317
+                    </nz-select>
318
+                  </div>
319
+                </ng-container>
320
+
321
+                <!-- 终点科室支持核对 -->
322
+                <div class="display_flex align-items_center mb8">
323
+                  <nz-form-label class="label">终点科室支持核对</nz-form-label>
324
+                  <nz-checkbox-group [nzDisabled]="true" [(ngModel)]="drugsEndCheck" (ngModelChange)="changeDrugsEndCheck($event)"></nz-checkbox-group>
325
+                </div>
326
+                <ng-container *ngIf="drugsEndCheck[0].checked">
327
+                  <!-- 核对方式 -->
328
+                  <div class="display_flex align-items_center mb8">
329
+                    <nz-form-label class="label" nzRequired>核对方式</nz-form-label>
330
+                    <nz-checkbox-group [(ngModel)]="drugsEndCheckScanIds"></nz-checkbox-group>
331
+                  </div>
332
+                  <!-- 手动填写 -->
333
+                  <div class="display_flex align-items_center mb8">
334
+                    <nz-form-label class="label">手动填写</nz-form-label>
335
+                    <nz-select class="w320px" nzPlaceHolder="请选择手动填写" [(ngModel)]="drugsEndManual" nzAllowClear>
336
+                      <nz-option *ngFor="let item of drugsManualList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
337
+                    </nz-select>
338
+                  </div>
339
+                </ng-container>
340
+              </div>
341
+              <!-- 护士打包配置 -->
342
+              <div *ngIf="tabModalName=='nursePackage'">
343
+                <!-- 是否自动打包 -->
344
+                <div class="display_flex align-items_center mb8">
345
+                  <nz-form-label class="label">自动打包</nz-form-label>
346
+                  <nz-checkbox-group [(ngModel)]="spePackageAutoPack" (ngModelChange)="changeSpePackageAutoPack($event)"></nz-checkbox-group>
347
+                </div>
348
+
349
+                <ng-container *ngIf="spePackageAutoPack[0].checked">
350
+                  <!-- 自动关联普标急标 -->
351
+                  <div class="display_flex align-items_center mb8">
352
+                    <nz-form-label class="label">自动关联普标急标</nz-form-label>
353
+                    <nz-checkbox-group [(ngModel)]="spePackageUrgents"></nz-checkbox-group>
354
+                  </div>
355
+                  <!-- 自动关联科室 -->
356
+                  <div class="display_flex align-items_center mb8">
357
+                    <nz-form-label class="label">自动关联科室</nz-form-label>
358
+                    <nz-select nzMode="multiple" style="width: 500px;" [nzDropdownMatchSelectWidth]="false" nzServerSearch nzShowSearch nzAllowClear
359
+                    (nzOnSearch)="changeDept($event)" nzPlaceHolder="请选择自动关联科室" [(ngModel)]="spePackageDeptIds" (nzOpenChange)="openDeptList($event)">
360
+                      <ng-container *ngFor="let option of deptList">
361
+                        <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
362
+                      </ng-container>
363
+                      <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
364
+                        <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
365
+                      </nz-option>
366
+                    </nz-select>
367
+                  </div>
368
+                  <!-- 自动关联试管类型 -->
369
+                  <div class="display_flex align-items_center mb8">
370
+                    <nz-form-label class="label">自动关联试管类型</nz-form-label>
371
+                    <nz-select nzMode="multiple" style="width: 500px;" nzPlaceHolder="请选择自动关联试管类型" [(ngModel)]="spePackageTubeIds" nzAllowClear>
372
+                      <nz-option *ngFor="let item of spePackageTubeList" [nzLabel]="item.label" [nzValue]="item.value"></nz-option>
373
+                    </nz-select>
374
+                  </div>
375
+                </ng-container>
376
+
377
+                <!-- 清点方式 -->
378
+                <div class="display_flex align-items_center mb8">
379
+                  <nz-form-label class="label">清点方式</nz-form-label>
380
+                  <nz-checkbox-group [(ngModel)]="spePackageInventoryTypes"></nz-checkbox-group>
381
+                </div>
382
+
383
+                <!-- 是否生成配送工单 -->
384
+                <div class="display_flex align-items_center mb8">
385
+                  <nz-form-label class="label">生成配送工单</nz-form-label>
386
+                  <nz-checkbox-group [(ngModel)]="spePackageCreateOrder"></nz-checkbox-group>
387
+                </div>
388
+
389
+                <!-- 条码打印尺寸 -->
390
+                <div class="display_flex align-items_center mb8">
391
+                  <nz-form-label class="label">条码打印尺寸</nz-form-label>
392
+                  <nz-select class="w320px" nzPlaceHolder="请选择条码打印尺寸" [(ngModel)]="spePackageCodeSize" nzAllowClear>
393
+                    <nz-option nzLabel="80*80" [nzValue]="1"></nz-option>
394
+                  </nz-select>
395
+                </div>
396
+              </div>
397
+              <!-- 自动建单配置 -->
398
+              <div *ngIf="tabModalName=='automaticOrderCreation'">
399
+                <!-- 自动建单 -->
400
+              </div>
401
+              <div class="bottom">
402
+                <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitSpecimenPackageForm()">保存</button>
403
+              </div>
404
+            </div>
405
+            <div class="list" *ngIf="loading">
406
+              <div class="loadingFull display_flex justify-content_flex-center align-items_center">
407
+                <div class="loadingFullInner">
408
+                  <img src="../../../assets/images/loading.gif" alt="">
409
+                  <div>加载中...</div>
410
+                </div>
411
+              </div>
412
+            </div>
413
+          </div>
414
+				</div>
168 415
       </div>
169 416
     </div>
170 417
   </div>

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

@@ -330,6 +330,10 @@
330 330
 					width: 200px;
331 331
 				}
332 332
 				
333
+				.width-200{
334
+					width: 275px;
335
+				}
336
+				
333 337
         & > div {
334 338
           background: #f9fafb;
335 339
           border: 1px solid #e5e9ed;

+ 367 - 28
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.ts

@@ -2,7 +2,7 @@ import { Component, OnInit } from "@angular/core";
2 2
 import { MainService } from "../../../services/main.service";
3 3
 import { ToolService } from 'src/app/services/tool.service';
4 4
 import { NzMessageService } from 'ng-zorro-antd';
5
-import { Subject } from 'rxjs';
5
+import { Subject, forkJoin } from 'rxjs';
6 6
 import { debounceTime } from 'rxjs/operators';
7 7
 
8 8
 @Component({
@@ -15,22 +15,51 @@ export class ConfigurationSpecimenComponent implements OnInit {
15 15
   btnLoading:boolean = false; //提交按钮的loading
16 16
   tabModalName:string = 'characteristics'; //当前选中的tab
17 17
   hosId = this.tool.getCurrentHospital().id; //当前院区
18
-	
18
+
19 19
 	// tab类型
20 20
 	dictionaryKeyList:any[] = [
21 21
 		{
22
-			name:'检标本',key:'examine'
22
+			name:'检标本',key:'examine'
23 23
 		},
24 24
 		{
25 25
 			name:'病理标本',key:'pathology'
26
-		}
26
+		},
27
+    {
28
+      name:'标本打包',key:'specimenPackage'
29
+    }
27 30
 	];
28
-	
31
+
32
+  spePackageUnionReceive:any = undefined;//是否联合标本收取
33
+  spePackageModel:any = undefined;//工单模式
34
+  drugsCreateSign:any = [{ label:'是否开启', value: 0 }];//支持建单并签到
35
+  drugsReceiveSign:any = [{ label:'是否开启', value: 0 }];//支持接单并签到
36
+  drugsStartCheck:any = [{ label:'是否开启', value: 0 }];//起点科室支持核对
37
+  drugsStartCheckScanIds:any = [];//起点核对方式
38
+  drugsStartManual:any = undefined;//起点科室手动填写
39
+  drugsEndCheck:any = [{ label:'是否开启', value: 1 }];//终点科室支持核对
40
+  drugsEndCheckScanIds:any = [];//终点核对方式
41
+  drugsEndManual:any = undefined;//终点科室手动填写
42
+  spePackageAutoPack:any = [{ label:'是否开启', value: 0 }];//自动打包
43
+  spePackageUrgents:any[] = [{label: '急标', value: 1}, {label: '普标', value: 0}];//自动关联急标普标急标
44
+  spePackageTubeIds:any[] = [];// 自动关联试管类型
45
+  spePackageTubeList:any[] = [];// 自动关联试管类型列表
46
+  spePackageInventoryTypes:any[] = [{label: '患者', value: 1, disabled: true, checked: true}, {label: '试管', value: 2}];//清点方式
47
+  spePackageCreateOrder:any = [{ label:'是否开启', value: 0 }];//生成配送工单
48
+  spePackageCodeSize:any = undefined;//条码打印尺寸
49
+
50
+  // 工单模式
51
+  spePackageModelList:any[] = [
52
+    { label: '一单一包', value: 1 },
53
+  ];
54
+
55
+  // 手动填写
56
+  drugsManualList:any[] = [];
57
+
29 58
 	// 是否支持根据手术新建申请单
30 59
 	autoCreate:any[] = [
31 60
 	  {label:'是否开启',value: 0}
32 61
 	];
33
-	
62
+
34 63
 	// 是否是否支持门诊新增申请单
35 64
 	outpatientCreatePathologyForm:any[] = [
36 65
 	  {label:'是否开启',value: 0}
@@ -41,7 +70,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
41 70
 	outpatientInVitroFixation:any[] = [
42 71
 	  {label:'是否开启',value: 0}
43 72
 	];
44
-	
73
+
45 74
   // 扫描时指定科室不提醒勾选项
46 75
   deptNotAlert:any[] = [
47 76
     {label:'是否开启',value: 0}
@@ -56,12 +85,12 @@ export class ConfigurationSpecimenComponent implements OnInit {
56 85
   arriveScanDynamicCode:any[] = [
57 86
     {label:'是否开启',value: 0}
58 87
   ];
59
-	
88
+
60 89
 	// 必须扫描动态二维码
61 90
 	enterDynamicDigitalKey:any[] = [
62 91
 	  {label:'是否开启',value: 0}
63 92
 	];
64
-	
93
+
65 94
   // 退回标本是否填写交接人
66 95
   returnSpecimenWhetherHandover:any[] = [
67 96
     {label:'是否开启',value: 0}
@@ -86,14 +115,59 @@ export class ConfigurationSpecimenComponent implements OnInit {
86 115
   defaultScanSpe:any[] = [
87 116
     {label:'是否开启',value: 0}
88 117
   ];
89
-	
118
+
119
+	// 是否开通收取限制
120
+	speCollectLimit:any[] = [
121
+    {label:'是否开启',value: 0}
122
+  ];
123
+
124
+	// 是否支持非起点科室收取
125
+	speCollectSupportNotStartDept:any[] = [
126
+	  {label:'是否开启',value: 0}
127
+	];
128
+
129
+	// 限制标本状态收取
130
+	speCollectLimitState:any = [];
131
+
132
+	// 限制终点科室收取
133
+	speCollectLimitEndDept:any = [];
134
+
135
+	// 限制普通或紧急收取
136
+	speCollectLimitUrgent:any = [];
137
+
138
+	// 是否限制重复收取标本
139
+	speCollectLimitRepeat:any[]= [
140
+	  {label:'是否开启',value: 0}
141
+	];
142
+
143
+	// 是否限制试管类型收取标本
144
+	speCollectLimitTubeType:any[];
145
+
146
+	// 是否开始收取前进入配置页
147
+	speStartCollectShowConfig:any[] = [
148
+	  {label:'是否开启',value: 0}
149
+	];
150
+
151
+	// 速冻标本数量控制
152
+	pathologyFrozenSpecimenNum:any = '0';
153
+
154
+	// 提示语
155
+	prompt:any;
156
+
90 157
 	//申请单条码设置
91 158
 	pathologyBarCode:any;
92
-	
159
+
93 160
   // 配置
94 161
   configs:any = {};
95 162
   // 任务类型
96 163
   tasktype:any = {};
164
+	specimenStateData:any = [];
165
+	endDeptData:any = [];
166
+	repetitionData:any = [];
167
+	astrictData:any = [
168
+		{name:'普通',id:'0'},
169
+		{name:'紧急',id:'1'},
170
+	]
97 171
   searchTimerSubject = new Subject();
98 172
   constructor(private mainService: MainService,private tool: ToolService,private msg: NzMessageService) {}
99 173
 
@@ -103,23 +177,102 @@ export class ConfigurationSpecimenComponent implements OnInit {
103 177
       let fun = v[0];
104 178
       fun.call(this, v[1]);
105 179
     });
180
+		this.getDeptDic();
106 181
     this.getDeptList();
107 182
     this.getTaskType();
108 183
   }
109
-	
184
+
185
+
186
+	// 获取科室类型
187
+	deptItem:any;
188
+	getDeptDic(e:string = ''){
189
+		this.mainService.getDictionary("list", "speState").subscribe((res) => {
190
+			this.specimenStateData = res
191
+		})
192
+		this.mainService.getDictionary("list", "specimen_tube_type").subscribe((res) => {
193
+			this.repetitionData = res
194
+		})
195
+		this.mainService.getDictionary("list", "dept_type").subscribe((res2) => {
196
+			this.deptItem = res2.find(i=>i.name=='检验科室')
197
+			let data1 = {
198
+			  idx: 0,
199
+			  sum: 9999,
200
+			  department: {
201
+			    hospital: { id: this.hosId || "" },
202
+			    type: { id: this.deptItem.id || "" },
203
+					dept: e,
204
+			  },
205
+			};
206
+			this.mainService
207
+			  .getFetchDataList("data", "department", data1)
208
+			  .subscribe((res) => {
209
+			    this.endDeptData = res.list;
210
+			  });
211
+		})
212
+	}
213
+
214
+	getEndDeptData(e){
215
+		let data1 = {
216
+		  idx: 0,
217
+		  sum: 9999,
218
+		  department: {
219
+		    hospital: { id: this.hosId || "" },
220
+		    type: { id: this.deptItem.id || "" },
221
+				dept: e,
222
+		  },
223
+		};
224
+		this.mainService
225
+		  .getFetchDataList("data", "department", data1)
226
+		  .subscribe((res) => {
227
+				 this.isLoading = false;
228
+		    this.endDeptData = res.list;
229
+		  });
230
+	}
231
+
232
+	// 搜索起点科室
233
+	changeEndDept(e){
234
+		this.searchTimer(this.getEndDeptData, e);
235
+	}
236
+
110 237
 	// 点击数据字典key
111 238
 	activeDictionaryKey:any = 'examine';
112 239
 	clickDictionaryKey(item){
113 240
 	  this.activeDictionaryKey = item.key;
241
+    this.tabModal('characteristics');
114 242
 		if(item.key=='examine'){
115 243
 			this.getDeptList();
116 244
 			this.getTaskType();
117
-		}else{
245
+		}else if(item.key=='pathology'){
118 246
 			this.getLabelDic()
119 247
 			this.getTaskTypesId()
248
+		}else if(item.key=='specimenPackage'){
249
+      this.getDeptList();
250
+      this.loading = true;
251
+      let drugs_bag_check_scan_type$ = this.mainService.getDictionary('list', 'drugs_bag_check_scan_type', true);
252
+      let drugs_bag_manual_type$ = this.mainService.getDictionary('list', 'drugs_bag_manual_type', true);
253
+      let specimen_tube_type$ = this.mainService.getDictionary('list', 'specimen_tube_type', true);
254
+      forkJoin(drugs_bag_check_scan_type$, drugs_bag_manual_type$, specimen_tube_type$).subscribe((data:any[]) => {
255
+        let drugs_bag_check_scan_type = data[0] || [];
256
+        let drugs_bag_manual_type = data[1] || [];
257
+        let specimen_tube_type = data[2] || [];
258
+
259
+        this.drugsStartCheckScanIds = drugs_bag_check_scan_type.map(v => ({ label:v.name, value: v.id }));
260
+        this.drugsEndCheckScanIds = drugs_bag_check_scan_type.map(v => ({ label:v.name, value: v.id }));
261
+        this.drugsManualList = drugs_bag_manual_type.map(v => ({ label:v.name, value: v.id }));
262
+
263
+        this.spePackageTubeList = specimen_tube_type.map(v => ({ label:v.name, value: v.id }));
264
+
265
+        this.getTaskTypeByOrdinary('specimenPackage')
266
+      })
120 267
 		}
121 268
 	}
122
-	
269
+
270
+	changeSpeCollect(e){
271
+		if(!e[0].checked){
272
+
273
+		}
274
+	}
275
+
123 276
   // 扫描时指定科室不提醒勾选项
124 277
   changeDeptNotAlert(e){
125 278
     console.log(e);
@@ -138,6 +291,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
138 291
   // 用户输入搜索
139 292
   isLoading: boolean = false;
140 293
   deptNotAlertIds:any[] = [];
294
+  spePackageDeptIds:any[] = [];
141 295
   deptList:any[] = [];
142 296
   changeDept(e) {
143 297
     this.searchTimer(this.getDeptList, e);
@@ -177,7 +331,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
177 331
   tabModal(tabModalName:string){
178 332
     this.tabModalName = tabModalName;
179 333
   }
180
-	
334
+
181 335
 	//病理标本保存
182 336
 	submitPathologyForm(){
183 337
 		let postData:any = {
@@ -188,12 +342,14 @@ export class ConfigurationSpecimenComponent implements OnInit {
188 342
 			outpatientCreatePathologyForm: this.outpatientCreatePathologyForm[0].checked ? 1 : 0,
189 343
 			outpatientInVitroFixation: this.outpatientInVitroFixation[0].checked ? 1 : 0,
190 344
 			pathologyBarCode : this.pathologyBarCode,
345
+			pathologyFrozenSpecimenNum : this.pathologyFrozenSpecimenNum,
346
+			prompt : this.prompt?this.prompt:undefined,
191 347
 			outpatientPathologyLabelSize:{
192 348
 				id:this.outpatientPathologyLabelSize
193 349
 			},
194 350
 			surgeryPathologyLabelSize:{
195 351
 				id:this.surgeryPathologyLabelSize
196
-			}, 
352
+			},
197 353
 		};
198 354
 		this.btnLoading = true;
199 355
 		this.mainService
@@ -205,8 +361,8 @@ export class ConfigurationSpecimenComponent implements OnInit {
205 361
 		    }
206 362
 		  });
207 363
 	}
208
-	
209
-  // 检标本保存
364
+
365
+  // 检标本保存
210 366
   submitForm() {
211 367
     if(!this.tasktype.id){
212 368
       this.msg.create("warning", "请先配置患者陪检任务类型!");
@@ -229,7 +385,86 @@ export class ConfigurationSpecimenComponent implements OnInit {
229 385
       bigScanArriveNotOwner: this.bigScanArriveNotOwner[0].checked ? 1 : 0,
230 386
       bigScanShowCreateBtn: this.bigScanShowCreateBtn[0].checked ? 1 : 0,
231 387
       defaultScanSpe: this.defaultScanSpe[0].checked ? 1 : 0,
232
-      deptNotAlertIds: this.deptNotAlertIds.length ? this.deptNotAlertIds.toString() : undefined,
388
+      deptNotAlertIds: this.deptNotAlertIds && this.deptNotAlertIds.length>0 ? this.deptNotAlertIds.toString() : undefined,
389
+			speCollectLimit: this.speCollectLimit[0].checked ? 1 : 0,
390
+			speCollectSupportNotStartDept: null,
391
+			speCollectLimitRepeat: null,
392
+			speCollectLimitTubeType: null,
393
+			speStartCollectShowConfig: null,
394
+			speCollectLimitState: null,
395
+			speCollectLimitEndDept: null,
396
+			speCollectLimitUrgent: null,
397
+		};
398
+		if(this.speCollectLimit[0].checked){
399
+			postData.speCollectSupportNotStartDept = this.speCollectSupportNotStartDept[0].checked ? 1 : 0;
400
+			postData.speCollectLimitRepeat = this.speCollectLimitRepeat[0].checked ? 1 : 0;
401
+			postData.speCollectLimitTubeType = this.speCollectLimitTubeType && this.speCollectLimitTubeType.length>0 ? this.speCollectLimitTubeType.toString() : undefined;
402
+			postData.speStartCollectShowConfig = this.speStartCollectShowConfig[0].checked ? 1 : 0;
403
+			postData.speCollectLimitState = this.speCollectLimitState && this.speCollectLimitState.length>0 ? this.speCollectLimitState.toString() : undefined;
404
+			postData.speCollectLimitEndDept = this.speCollectLimitEndDept && this.speCollectLimitEndDept.length>0 ? this.speCollectLimitEndDept.toString() : undefined;
405
+			postData.speCollectLimitUrgent = this.speCollectLimitUrgent && this.speCollectLimitUrgent.length>0 ? this.speCollectLimitUrgent.toString() : undefined;
406
+		}else{
407
+			postData.speCollectSupportNotStartDept = undefined;
408
+			postData.speCollectLimitRepeat = undefined;
409
+			postData.speCollectLimitTubeType = undefined;
410
+			postData.speStartCollectShowConfig = undefined;
411
+			postData.speCollectLimitState = undefined;
412
+			postData.speCollectLimitEndDept = undefined;
413
+			postData.speCollectLimitUrgent = undefined;
414
+		}
415
+    this.btnLoading = true;
416
+    this.mainService
417
+      .simplePost("addData", "taskTypeConfig", postData)
418
+      .subscribe((result) => {
419
+        this.btnLoading = false;
420
+        if (result.status == 200) {
421
+          this.getConfig();
422
+        }
423
+      });
424
+  }
425
+
426
+  // 标本打包保存
427
+  submitSpecimenPackageForm() {
428
+    if(!this.tasktype.id){
429
+      this.msg.create("warning", "请先配置关联任务类型!");
430
+      return;
431
+    }
432
+    if(!this.spePackageModel){
433
+      this.msg.create("warning", "请选择工单模式!");
434
+      return;
435
+    }
436
+
437
+    if(this.drugsStartCheck[0].checked && !this.drugsStartCheckScanIds.filter(v => v.checked).length){
438
+      this.msg.create("warning", "请选择起点科室的核对方式!");
439
+      return;
440
+    }
441
+
442
+    if(this.drugsEndCheck[0].checked && !this.drugsEndCheckScanIds.filter(v => v.checked).length){
443
+      this.msg.create("warning", "请选择终点科室的核对方式!");
444
+      return;
445
+    }
446
+
447
+    let postData:any = {
448
+      id: this.configs.id,
449
+      taskType: this.tasktype.id,
450
+      hosId: this.hosId,
451
+      spePackageUnionReceive: this.spePackageUnionReceive,
452
+      spePackageModel: this.spePackageModel || undefined,
453
+      drugsCreateSign: this.drugsCreateSign[0].checked ? 1 : 0,
454
+      drugsReceiveSign: this.drugsReceiveSign[0].checked ? 1 : 0,
455
+      drugsStartCheck: this.drugsStartCheck[0].checked ? 1 : 0,
456
+      drugsStartCheckScanIds: this.drugsStartCheckScanIds.filter(v => v.checked).map(v => v.value).toString() || undefined,
457
+      drugsStartManual: this.drugsStartManual ? { id: this.drugsStartManual } : undefined,
458
+      drugsEndCheck: this.drugsEndCheck[0].checked ? 1 : 0,
459
+      drugsEndCheckScanIds: this.drugsEndCheckScanIds.filter(v => v.checked).map(v => v.value).toString() || undefined,
460
+      drugsEndManual: this.drugsEndManual ? { id: this.drugsEndManual } : undefined,
461
+      spePackageAutoPack: this.spePackageAutoPack[0].checked ? 1 : 0,
462
+      spePackageUrgents: this.spePackageUrgents.filter(v => v.checked).map(v => v.value).toString() || undefined,
463
+      spePackageDeptIds: this.spePackageDeptIds.length ? this.spePackageDeptIds.toString() : undefined,
464
+      spePackageTubeIds: this.spePackageTubeIds.length ? this.spePackageTubeIds.toString() : undefined,
465
+      spePackageInventoryTypes: this.spePackageInventoryTypes.filter(v => v.checked).map(v => v.value).toString() || undefined,
466
+      spePackageCreateOrder: this.spePackageCreateOrder[0].checked ? 1 : 0,
467
+      spePackageCodeSize: this.spePackageCodeSize || undefined,
233 468
     };
234 469
     this.btnLoading = true;
235 470
     this.mainService
@@ -241,7 +476,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
241 476
         }
242 477
       });
243 478
   }
244
-	
479
+
245 480
 	// 获取标本字典
246 481
 	labelData:any = [];
247 482
 	getLabelDic(){
@@ -249,7 +484,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
249 484
 			this.labelData = data
250 485
 		});
251 486
 	}
252
-	
487
+
253 488
 	// 获取任务类型(病理标本)
254 489
 	taskTypeData:any;
255 490
 	getTaskTypesId() {
@@ -258,7 +493,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
258 493
 			this.getConfig();
259 494
 		});
260 495
 	}
261
-	
496
+
262 497
   //获取任务类型
263 498
   getTaskType() {
264 499
     this.loading = true;
@@ -287,6 +522,34 @@ export class ConfigurationSpecimenComponent implements OnInit {
287 522
       });
288 523
   }
289 524
 
525
+  //获取任务类型
526
+  getTaskTypeByOrdinary(key) {
527
+    this.loading = true;
528
+    let postData = {
529
+      idx: 0,
530
+      sum: 10,
531
+      taskType: {
532
+        simpleQuery: true,
533
+        hosId: {
534
+          id: this.hosId
535
+        },
536
+        ordinaryField: {
537
+          key:"ordinary_field",
538
+          value: key
539
+        }
540
+      }
541
+    };
542
+    this.mainService
543
+      .getFetchDataList("simple/data", "taskType", postData)
544
+      .subscribe((result) => {
545
+        this.loading = false;
546
+        if (result.status == 200) {
547
+          this.tasktype = result.list[0] || {};
548
+          this.getConfig();
549
+        }
550
+      });
551
+  }
552
+
290 553
   // 获取配置
291 554
   getConfig() {
292 555
     this.loading = true;
@@ -304,7 +567,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
304 567
 			    }
305 568
 			  }
306 569
 			};
307
-		}else{
570
+		}else if(this.activeDictionaryKey=='pathology'){
308 571
 			postData = {
309 572
 			  idx: 0,
310 573
 			  sum: 10,
@@ -313,8 +576,21 @@ export class ConfigurationSpecimenComponent implements OnInit {
313 576
 					taskType:this.taskTypeData.id
314 577
 			  }
315 578
 			};
579
+		}else if(this.activeDictionaryKey=='specimenPackage'){
580
+			postData = {
581
+			  idx: 0,
582
+			  sum: 10,
583
+			  taskTypeConfig: {
584
+			    taskTypeDTO: {
585
+			      hosId: {
586
+			        id: this.hosId
587
+			      },
588
+			      ordinaryField: this.tasktype.ordinaryField
589
+			    }
590
+			  }
591
+			};
316 592
 		}
317
-    
593
+
318 594
     this.mainService
319 595
       .getFetchDataList("simple/data", "taskTypeConfig", postData)
320 596
       .subscribe((result) => {
@@ -322,7 +598,7 @@ export class ConfigurationSpecimenComponent implements OnInit {
322 598
         if (result.status == 200) {
323 599
           this.configs = result.list[0] || {};
324 600
 					if(this.activeDictionaryKey=='examine'){
325
-						// 检标本
601
+						// 检标本
326 602
 						this.deptNotAlert[0].checked = this.configs.deptNotAlert == 1;
327 603
 						this.arriveScanCode[0].checked = this.configs.arriveScanCode == 1;
328 604
 						this.arriveScanDynamicCode[0].checked = this.configs.arriveScanDynamicCode == 1;
@@ -334,16 +610,79 @@ export class ConfigurationSpecimenComponent implements OnInit {
334 610
 						this.defaultScanSpe[0].checked = this.configs.defaultScanSpe == 1;
335 611
 						this.deptNotAlertIds = this.configs.deptNotAlertIds ? this.configs.deptNotAlertIds.split(',').map(v => +v) : [];
336 612
 						this.deptList = this.configs.deptNotAlertList || [];
337
-					}else{
338
-						// 病理标本
613
+            this.speCollectLimit[0].checked = this.configs.speCollectLimit == 1;
614
+						if(this.configs.speCollectLimit == 1){
615
+							this.speCollectSupportNotStartDept[0].checked = this.configs.speCollectSupportNotStartDept == 1;
616
+							this.speCollectLimitRepeat[0].checked  = this.configs.speCollectLimitRepeat == 1;
617
+							this.speCollectLimitTubeType = this.configs.speCollectLimitTubeType ? this.configs.speCollectLimitTubeType.split(',').map(v => +v) : [];
618
+							this.speStartCollectShowConfig[0].checked = this.configs.speStartCollectShowConfig == 1;
619
+							this.speCollectLimitState = this.configs.speCollectLimitState ? this.configs.speCollectLimitState.split(',').map(v => +v) : [];
620
+							this.speCollectLimitEndDept = this.configs.speCollectLimitEndDept ? this.configs.speCollectLimitEndDept.split(',').map(v => +v) : [];
621
+							this.speCollectLimitUrgent = this.configs.speCollectLimitUrgent ? this.configs.speCollectLimitUrgent.split(',').map(v => v) : [];
622
+						}
623
+					}else if(this.activeDictionaryKey=='pathology'){
624
+            // 病理标本
339 625
 						this.autoCreate[0].checked = this.configs.autoCreate == 1;
340 626
 						this.outpatientCreatePathologyForm[0].checked = this.configs.outpatientCreatePathologyForm == 1;
341 627
 						this.outpatientInVitroFixation[0].checked = this.configs.outpatientInVitroFixation == 1;
342 628
 						this.pathologyBarCode = this.configs.pathologyBarCode;
343
-						this.outpatientPathologyLabelSize = this.configs.outpatientPathologyLabelSize.id; //门诊病理标签样式
629
+						this.pathologyFrozenSpecimenNum = this.configs.pathologyFrozenSpecimenNum;
630
+						this.prompt = this.configs.prompt || '';
631
+            this.outpatientPathologyLabelSize = this.configs.outpatientPathologyLabelSize.id; //门诊病理标签样式
344 632
 						this.surgeryPathologyLabelSize = this.configs.surgeryPathologyLabelSize.id //手术病理标签样式
633
+					}else if(this.activeDictionaryKey=='specimenPackage'){
634
+						// 标本打包
635
+						this.spePackageUnionReceive = this.configs.spePackageUnionReceive || 0;
636
+						this.spePackageModel = this.configs.spePackageModel || undefined;
637
+            this.drugsCreateSign[0].checked = this.configs.drugsCreateSign == 1;
638
+            this.drugsReceiveSign[0].checked = this.configs.drugsReceiveSign == 1;
639
+
640
+            this.drugsStartCheck[0].checked = this.configs.drugsStartCheck == 1;
641
+            this.drugsStartCheckScanIds = this.drugsStartCheckScanIds.map(v => ({...v, checked: (this.configs.drugsStartCheckScanIds || '').split(',').includes(v.value.toString())}));
642
+            this.drugsStartManual = this.configs.drugsStartManual ? this.configs.drugsStartManual.id : undefined;
643
+
644
+            this.drugsEndCheck[0].checked = true;
645
+            this.drugsEndCheckScanIds = this.drugsEndCheckScanIds.map(v => ({...v, checked: (this.configs.drugsEndCheckScanIds || '').split(',').includes(v.value.toString())}));
646
+            this.drugsEndManual = this.configs.drugsEndManual ? this.configs.drugsEndManual.id : undefined;
647
+
648
+            this.spePackageAutoPack[0].checked = this.configs.spePackageAutoPack == 1;
649
+            this.spePackageUrgents = this.spePackageUrgents.map(v => ({...v, checked: (this.configs.spePackageUrgents || '').split(',').includes(v.value.toString())}));
650
+            this.spePackageDeptIds = this.configs.spePackageDeptIds ? this.configs.spePackageDeptIds.split(',').map(v => +v) : [];
651
+            this.deptList = this.configs.spePackageDeptList || [];
652
+            this.spePackageTubeIds = this.configs.spePackageTubeIds ? this.configs.spePackageTubeIds.split(',').map(v => +v) : [];
653
+            this.spePackageInventoryTypes = this.spePackageInventoryTypes.map(v => ({...v, checked: (this.configs.spePackageInventoryTypes || '').split(',').includes(v.value.toString())}));
654
+            this.spePackageCreateOrder[0].checked = this.configs.spePackageCreateOrder == 1;
655
+            this.spePackageCodeSize = this.configs.spePackageCodeSize || undefined;
345 656
 					}
346 657
         }
347 658
       });
348 659
   }
660
+
661
+  // 修改起点科室支持核对
662
+  changeDrugsStartCheck(e){
663
+    console.log(e);
664
+    if(!e[0].checked){
665
+      this.drugsStartCheckScanIds = this.drugsStartCheckScanIds.map(v => ({...v, checked: false}));
666
+      this.drugsStartManual = undefined;
667
+    }
668
+  }
669
+
670
+  // 修改终点科室支持核对
671
+  changeDrugsEndCheck(e){
672
+    console.log(e);
673
+    if(!e[0].checked){
674
+      this.drugsEndCheckScanIds = this.drugsEndCheckScanIds.map(v => ({...v, checked: false}));
675
+      this.drugsEndManual = undefined;
676
+    }
677
+  }
678
+
679
+  // 修改自动打包
680
+  changeSpePackageAutoPack(e){
681
+    console.log(e);
682
+    if(!e[0].checked){
683
+      this.spePackageUrgents = this.spePackageUrgents.map(v => ({...v, checked: false}));
684
+      this.spePackageDeptIds = [];
685
+      this.spePackageTubeIds = [];
686
+    }
687
+  }
349 688
 }

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

@@ -178,8 +178,8 @@
178 178
                     </nz-select>
179 179
                   </div>
180 180
                   <div class="col">
181
-                    <span class="name">事件来源:</span>
182
-                    <nz-select class="w100" [(ngModel)]="incidentModel.source" nzAllowClear nzPlaceHolder="请选择事件来源">
181
+                    <span class="name">报修来源:</span>
182
+                    <nz-select class="w100" [(ngModel)]="incidentModel.source" nzAllowClear nzPlaceHolder="请选择报修来源">
183 183
                       <nz-option [nzValue]="item.id" [nzLabel]="item.name" *ngFor="let item of applicationSourceList"></nz-option>
184 184
                     </nz-select>
185 185
                   </div>

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

@@ -589,7 +589,7 @@ export class IncidentCreateComponent implements OnInit {
589 589
         this.isLoading = false;
590 590
         if (data.status == 200) {
591 591
           this.applicationPriorityList = data.list;
592
-          // 回显事件来源
592
+          // 回显报修来源
593 593
           let source = this.applicationSourceList.find(v => v.value === 'phone');
594 594
           if(!this.incidentModel.source && source){
595 595
             this.incidentModel.source = source.id;
@@ -597,7 +597,7 @@ export class IncidentCreateComponent implements OnInit {
597 597
         }
598 598
       });
599 599
   }
600
-  // 事件来源列表
600
+  // 报修来源列表
601 601
   applicationSourceList:any[] = [];
602 602
   searchApplicationSource(keyWord?) {
603 603
     this.mainService.getDictionary("list", "incident_source").subscribe((data) => {

+ 3 - 2
src/app/components/incidentManagement/incident-detail/incident-detail.component.html

@@ -16,7 +16,8 @@
16 16
             </div>
17 17
             <div class="row">
18 18
               <div class="col">报修类型:{{incidentData.repairIncidentType?.name}}</div>
19
-              <div class="col display_flex flex2">报修录音:<audio class="audio" controls style="outline: none;" *ngIf="incidentData.reqRecord && audioRequireSrc"><source [src]="audioRequireSrc" type="audio/mp3"></audio></div>
19
+              <div class="col display_flex">报修录音:<audio class="audio" controls style="outline: none;" *ngIf="incidentData.reqRecord && audioRequireSrc"><source [src]="audioRequireSrc" type="audio/mp3"></audio></div>
20
+              <div class="col">报修来源:{{incidentData.source?.name}}</div>
20 21
             </div>
21 22
             <div class="row">
22 23
               <div class="col">故障现象:{{incidentData.category?.mutiCategory}}</div>
@@ -39,7 +40,7 @@
39 40
             </div>
40 41
             <div class="row">
41 42
               <div class="col">来电电话:{{incidentData.incomingPhone}}</div>
42
-              <div class="col"><audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID && audioSrc"><source [src]="audioSrc" type="audio/wav"></audio></div>
43
+              <div class="col display_flex">来电录音:<audio class="audio" controls style="outline: none;" *ngIf="incidentData.callID && audioSrc"><source [src]="audioSrc" type="audio/wav"></audio></div>
43 44
               <div class="col"><ng-container *ngIf="incidentData.assetDTO">关联资产:{{incidentData.assetDTO?.name}}</ng-container></div>
44 45
             </div>
45 46
             <div class="row">

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

@@ -318,7 +318,7 @@
318 318
     }
319 319
   }
320 320
   .audio{
321
-    width: 264px;
321
+    width: 220px;
322 322
     height: 1.5em;
323 323
   }
324 324
 }

+ 4 - 2
src/app/components/incidentManagement/incident-detail/incident-detail.component.ts

@@ -88,12 +88,14 @@ export class IncidentDetailComponent implements OnInit {
88 88
         this.message.remove(this.maskFlag);
89 89
         this.maskFlag = false;
90 90
         this.incidentData = result.data || {};
91
-
91
+				if(this.incidentData.wxdegree){
92
+					this.incidentData.wxdegree.value = Number(this.incidentData.wxdegree.value)
93
+				}
92 94
         this.clickTbab(this.tabs[0]);
93 95
 
94 96
         let logs = this.incidentData.logs || [];
95 97
         this.resolveLogs = logs.filter(v => v.logType.value == 'resolve').slice(0, 1);
96
-        this.callbackLogs = logs.filter(v => v.logType.value == 'callback').slice(0, 1);
98
+				this.callbackLogs = logs.filter(v => v.logType.value == 'callback').slice(0, 1);
97 99
 
98 100
         this.getHospitalConfig();
99 101
       });

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

@@ -9,7 +9,8 @@
9 9
           <div class="value">
10 10
             <span class="unitPrice">单价:{{ item.consumableEndPrice }}元</span>
11 11
             <button nz-button class="btn default ml8" (click)="editConsumable(item)">编辑</button>
12
-          </div>
12
+						<button nz-button class="btn default ml8" (click)="logView(1,item)">日志</button>
13
+					</div>
13 14
         </div>
14 15
 
15 16
         <div class="row">
@@ -39,7 +40,8 @@
39 40
           <div class="value">
40 41
             <span class="unitPrice">单价:{{ item.wage }}元</span>
41 42
             <button nz-button class="btn default ml8" (click)="editWorkHourManagement(item)">编辑</button>
42
-          </div>
43
+						<button nz-button class="btn default ml8" (click)="logView(2,item)">日志</button>
44
+					</div>
43 45
         </div>
44 46
 
45 47
         <div class="row">
@@ -137,3 +139,44 @@
137 139
 <!-- 删除模态框 -->
138 140
 <app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
139 141
 (confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
142
+
143
+<!-- 日志查看模态框 -->
144
+	<div class="save add display_flex align-items_center justify-content_flex-center" *ngIf="logModal">
145
+	  <div class="modalBody modalLogBody">
146
+	    <div class="title">日志查看<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
147
+	    </div>
148
+	    <div class="content">
149
+	      <div class="list-template__bottom">
150
+	        <nz-table class="list-template__nzTable" [nzData]="listLogOfData" nzSize="middle" [nzShowPagination]="false"
151
+	          [nzLoading]="loading2">
152
+	          <thead>
153
+	            <tr class="thead">
154
+								<th>动作</th>
155
+	              <th>操作时间</th>
156
+	              <th>操作人</th>
157
+	              <th>调整记录</th>
158
+	            </tr>
159
+	          </thead>
160
+	          <tbody>
161
+	            <tr *ngFor="let data of listLogOfData">
162
+								<td>{{ data.operationType ? data.operationType.name : '-' }}</td>
163
+								<td *ngIf="operationType==1">{{ data.time|date:'yyyy-MM-dd HH:mm'}}</td>
164
+								<td *ngIf="operationType==2">{{ data.operationTime|date:'yyyy-MM-dd HH:mm'}}</td>
165
+								<td *ngIf="operationType==1">{{ data.operator ? data.operator.name : '-' }}</td>
166
+								<td *ngIf="operationType==2">{{ data.operationUserDTO ? data.operationUserDTO.name : '-' }}</td>
167
+								<td>{{ data.logRemark ? data.logRemark : '-' }} <span *ngIf="data.operationType.value==6">单价:{{ data.currentPrice }} &nbsp;&nbsp;积分:{{ data.currentScore.value }}</span></td>
168
+	            </tr>
169
+	          </tbody>
170
+	        </nz-table>
171
+	      </div>
172
+			<!-- 	<div class="list-template__pagination">
173
+				  <nz-pagination [(nzPageIndex)]="pageLogIndex" [(nzTotal)]="listLogLength" nzShowSizeChanger [(nzPageSize)]="pageLogSize"
174
+				    (nzPageIndexChange)="getLogList()" (nzPageSizeChange)="getLogList()">
175
+				  </nz-pagination>
176
+				</div> -->
177
+	    </div>
178
+	    <div class="display_flex justify-content_flex-center">
179
+	      <button class="btn" nz-button nzType="primary" (click)="hideModal()">知道了</button>
180
+	    </div>
181
+	  </div>
182
+	</div>

+ 118 - 0
src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.less

@@ -333,6 +333,124 @@
333 333
           }
334 334
         }
335 335
       }
336
+			
337
+			
338
+			.modalLogBody {
339
+			  width: 80%;
340
+			  height: auto;
341
+			
342
+			  .content {
343
+			    width: 100%;
344
+			    height: auto;
345
+			    padding: 19px 14px 20px 14px;
346
+			    max-height: 500px;
347
+			    overflow-y: auto;
348
+					
349
+					.list-template__bottom {
350
+					  background: #f9fafb;
351
+					  border: 1px solid #e5e9ed;
352
+					  border-radius: 8px;
353
+					  // padding-bottom: 56px;
354
+					  position: relative;
355
+					  .list-template__nzTable {
356
+					    padding: 16px 16px 0;
357
+					
358
+					    .thead {
359
+					      background-image: linear-gradient(to right, @bg-start, @bg-end);
360
+					
361
+					      th {
362
+					        background: transparent;
363
+					        color: #fff;
364
+					        text-align: center;
365
+					      }
366
+					    }
367
+					
368
+					    .ant-table-body {
369
+					      border-bottom: 1px solid #e5e9ed;
370
+					    }
371
+					
372
+					    .ant-table-tbody {
373
+					      tr {
374
+					        text-align: center;
375
+					        color: #333;
376
+					
377
+					        td {
378
+					          border: none;
379
+					
380
+					          &.tab_hover:hover{
381
+					            text-decoration: underline;
382
+					            cursor: pointer;
383
+					          }
384
+					
385
+					          .coop {
386
+					            button{
387
+					              color: #333;
388
+					            }
389
+					            span,button {
390
+					              display: inline-block;
391
+					              padding: 0 8px;
392
+					              cursor: pointer;
393
+					              position: relative;
394
+					
395
+					              &::after {
396
+					                content: "|";
397
+					                position: absolute;
398
+					                top: 0;
399
+					                right: 0;
400
+					              }
401
+					
402
+					              &:hover,
403
+					              &:active {
404
+					                color: @primary-color;
405
+					              }
406
+					
407
+					              &:nth-last-child(1) {
408
+					                &::after {
409
+					                  content: "";
410
+					                }
411
+					              }
412
+					            }
413
+					          }
414
+					        }
415
+					      }
416
+					    }
417
+					  }
418
+					}
419
+										
420
+			    .addForm {
421
+			      .ant-form-item {
422
+			        margin-bottom: 14px;
423
+			
424
+			        .ant-form-item-label {
425
+			          line-height: 14px;
426
+			          text-align: left;
427
+			        }
428
+			      }
429
+			    }
430
+			
431
+			    .editForm {
432
+			      .ant-form-item {
433
+			        margin-bottom: 14px;
434
+			
435
+			        .ant-form-item-label {
436
+			          line-height: 0;
437
+			          text-align: left;
438
+			        }
439
+			      }
440
+			    }
441
+					.list-template__pagination {
442
+						text-align: right;
443
+						padding: 20px 0;
444
+					}
445
+			  }
446
+				
447
+				
448
+			  button {
449
+			    &:nth-child(1) {
450
+			      margin-right: 20px;
451
+			    }
452
+			  }
453
+			}
336 454
     }
337 455
   }
338 456
 }

+ 76 - 1
src/app/components/incidentManagement/incident-handle-order/incident-handle-order.component.ts

@@ -38,7 +38,81 @@ export class IncidentHandleOrderComponent implements OnInit {
38 38
     this.getHospitalConfig();
39 39
     this.getWorkHourManagementList();
40 40
   }
41
-
41
+	
42
+	// 工时日志列表
43
+	listLogOfData: any[] = []; //日志数据
44
+	pageLogIndex: number = 1; //日志当前页码
45
+	pageLogSize: number = 10; //日志每页展示条数
46
+	listLogLength: number = 10; //日志总数据量
47
+	loading2:boolean = false;
48
+	getHourLogList() {
49
+	  let data = {
50
+	    idx: 0,
51
+	    sum: 99999,
52
+	    workHourManagementLog: {
53
+				workHourId: this.itemData.id,
54
+				repairSummaryId: this.summaryId
55
+	    },
56
+	  };
57
+	  this.loading2 = true;
58
+	  this.mainService
59
+	    .getFetchDataList("simple/data", "workHourManagementLog", data)
60
+	    .subscribe((data) => {
61
+	      this.loading2 = false;
62
+	      if (data.status == 200) {
63
+					this.logModal = true
64
+	        this.listLogOfData = data.list;
65
+	        // this.listLogLength = data.totalNum;
66
+	      }else{
67
+	        this.message.error(data.msg || "请求数据失败");
68
+	      }
69
+	    });
70
+	}
71
+	
72
+	// 耗材日志列表
73
+	getConsumableLogList() {
74
+	  let data = {
75
+	    idx: 0,
76
+	    sum: 99999,
77
+			assetConsumablesHistory: {
78
+			  assetConsumablesId: this.itemData.consumableId,
79
+				repairSummaryId: this.summaryId
80
+			},
81
+	  };
82
+	  this.loading2 = true;
83
+	  this.mainService
84
+	    .getFetchDataList("simple/data", "assetConsumablesHistory", data)
85
+	    .subscribe((data) => {
86
+	      this.loading2 = false;
87
+	      if (data.status == 200) {
88
+					this.logModal = true
89
+	        this.listLogOfData = data.list;
90
+	        // this.listLogLength = data.totalNum;
91
+	      }else{
92
+	        this.message.error(data.msg || "请求数据失败");
93
+	      }
94
+	    });
95
+	}
96
+	
97
+	// 查看日志
98
+	itemData:any = {};
99
+	logModal:boolean = false;
100
+	operationType:any;
101
+	logView(type, data){
102
+		this.operationType = type;
103
+		this.itemData = data;
104
+		if(type==1){ //耗材
105
+			this.getConsumableLogList()
106
+		}else{ //日志
107
+			this.getHourLogList()
108
+		}
109
+	}
110
+	
111
+	// 关闭日志
112
+	hideModal() {
113
+	  this.logModal = false;
114
+	}
115
+	
42 116
   // ============耗材start=================
43 117
 
44 118
   // 新增耗材/工时弹框
@@ -312,6 +386,7 @@ export class IncidentHandleOrderComponent implements OnInit {
312 386
       workHourManagement: {
313 387
         hosId: this.hosId,
314 388
         showSecond: 1,
389
+				disableType:1
315 390
       },
316 391
       idx: 0,
317 392
       sum: 9999,

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

@@ -49,6 +49,15 @@
49 49
             </nz-radio-group>
50 50
           </div>
51 51
         </div>
52
+				<div nz-row>
53
+				  <div nz-col nzSpan="5">是否展示重新指派:</div>
54
+				  <div nz-col nzSpan="19">
55
+				    <nz-radio-group class="w100" [(ngModel)]="showReassign" [nzDisabled]="!activeScopeTab.checked">
56
+				      <label nz-radio [nzValue]="1">是</label>
57
+				      <label nz-radio [nzValue]="0">否</label>
58
+				    </nz-radio-group>
59
+				  </div>
60
+				</div>
52 61
       </div>
53 62
       <!-- 配送 -->
54 63
       <div class="conditions" *ngIf="scopeTabs.length>0 && activeScopeTab.value == 2">

+ 12 - 6
src/app/components/order-scope/order-scope.component.ts

@@ -3,7 +3,7 @@ import { EventEmitter } from '@angular/core';
3 3
 import { MainService } from 'src/app/services/main.service';
4 4
 import { ToolService } from 'src/app/services/tool.service';
5 5
 import { NzMessageService } from 'ng-zorro-antd';
6
-import { Router } from "@angular/router";
6
+import { Router, ActivatedRoute } from "@angular/router";
7 7
 
8 8
 @Component({
9 9
   selector: 'app-order-scope',
@@ -22,14 +22,15 @@ export class OrderScopeComponent implements OnInit {
22 22
     orderScopeRadio: undefined,
23 23
   }
24 24
 	@Input() coopBtns:any;
25
-	
25
+
26 26
   @Output() confirmModal = new EventEmitter();
27 27
   @Output() cancelModal = new EventEmitter();
28 28
   constructor(
29 29
     private mainService: MainService,
30 30
     private tool: ToolService,
31 31
     private message: NzMessageService,
32
-		public router: Router
32
+		public router: Router,
33
+		public route: ActivatedRoute
33 34
   ) { }
34 35
 
35 36
   user = JSON.parse(localStorage.getItem("user")); //用户信息
@@ -45,9 +46,12 @@ export class OrderScopeComponent implements OnInit {
45 46
 	activeScopeTab:any;
46 47
 	//#region 工单范围-运维start
47 48
 	allDuty:number = 1;
49
+	showReassign:any = 0;
48 50
 	menuList:any;
49
-	
51
+
50 52
   ngOnInit() {
53
+		let btn = this.tool.initCoopBtns(this.route)
54
+		console.log(77777,btn)
51 55
 		let menuItem = JSON.parse(localStorage.getItem("menuItem"))
52 56
 		this.menuList = menuItem.find(i=>i.link=='gongdanfanwei')
53 57
     this.initItsm();
@@ -76,7 +80,7 @@ export class OrderScopeComponent implements OnInit {
76 80
 				}
77 81
 			}
78 82
 		}
79
-		
83
+
80 84
 		if(this.scopeTabs.length>0){
81 85
 			this.activeScopeTab = this.scopeTabs[0]
82 86
 		}
@@ -99,7 +103,8 @@ export class OrderScopeComponent implements OnInit {
99 103
     itsmGetOrderScope() {
100 104
       // 是否不限制部门
101 105
       this.allDuty = this.itsmData.allDuty === undefined ? 1 : this.itsmData.allDuty;
102
-      // 权限内的院区和组
106
+      this.showReassign = this.itsmData.showReassign || 0;
107
+			// 权限内的院区和组
103 108
       let hosList = this.user.infoPermission.dutyList || [];
104 109
       let groups = this.user.infoPermission.dutyGroupList || [];
105 110
 
@@ -383,6 +388,7 @@ export class OrderScopeComponent implements OnInit {
383 388
 
384 389
       if(itsm && itsm.checked){
385 390
         postData.workerOrderScope.allDuty = this.allDuty;
391
+				postData.workerOrderScope.showReassign = this.showReassign;
386 392
         postData.workerOrderScope.dutyIds = this.itsmCheckedHos.filter(v => v.checked).map(v => v.value).toString() || undefined;
387 393
         postData.workerOrderScope.dutyGroupIds = this.itsmCheckedGroup.filter(v => v.checked).map(v => v.value).toString() || undefined;
388 394
         postData.workerOrderScope.dutyRange = this.itsmOrderScopeRadio - 0;

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

@@ -36,6 +36,9 @@ export class SelectMenuComponent implements OnInit {
36 36
     let nurseConfig = menus.find(item => item.link == 'nurseConfig');
37 37
     nurseConfig && configurationCenterMenus.push(nurseConfig);
38 38
     this.configurationCenterMenus = configurationCenterMenus;
39
+		// 数据生成
40
+		let dataGenerate = menus.find(item => item.link == 'dataGenerate');
41
+		dataGenerate && configurationCenterMenus.push(dataGenerate);
39 42
   }
40 43
   clickHandle(item){
41 44
     this.router.navigateByUrl(item.link);

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

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

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

+ 69 - 0
src/app/services/date.service.ts

@@ -10,6 +10,8 @@ import {
10 10
   addYears,
11 11
   endOfYear,
12 12
   endOfWeek,
13
+  endOfDay,
14
+  format,
13 15
 } from "date-fns";
14 16
 
15 17
 @Injectable({
@@ -17,10 +19,66 @@ import {
17 19
 })
18 20
 export class DateService {
19 21
   constructor() {}
22
+  // 获取日期快捷类型
23
+  getDateType(dateRange){
24
+    console.log('dateRange:', dateRange)
25
+    let [startDate, endDate] = dateRange;
26
+    if(startDate == format(this.date().yesterdayStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().yesterdayEndDate, 'yyyy-MM-dd HH:mm:ss')){
27
+      return 1;
28
+    }else if(startDate == format(this.date().thisWeekStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().thisWeekEndDate, 'yyyy-MM-dd HH:mm:ss')){
29
+      return 2;
30
+    }else if(startDate == format(this.date().thisMonthStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().thisMonthEndDate, 'yyyy-MM-dd HH:mm:ss')){
31
+      return 3;
32
+    }else if(startDate == format(this.date().thisYearStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().thisYearEndDate, 'yyyy-MM-dd HH:mm:ss')){
33
+      return 4;
34
+    }else if(startDate == format(this.date().lastWeekStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().lastWeekEndDate, 'yyyy-MM-dd HH:mm:ss')){
35
+      return 5;
36
+    }else if(startDate == format(this.date().lastMonthStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().lastMonthEndDate, 'yyyy-MM-dd HH:mm:ss')){
37
+      return 6;
38
+    }else if(startDate == format(this.date().lastYearStartDate, 'yyyy-MM-dd HH:mm:ss') && endDate == format(this.date().lastYearEndDate, 'yyyy-MM-dd HH:mm:ss')){
39
+      return 7;
40
+    }
41
+  }
20 42
   /**
21 43
    * 日期操作
22 44
    */
23 45
   date() {
46
+    //获得昨日的开始日期(昨日 00:00:00)
47
+    function getYesterdayStartDate() {
48
+      return addDays(startOfDay(new Date()), -1);
49
+    }
50
+    //获得昨日的结束日期(昨日 23:59:59)
51
+    function getYesterdayEndDate() {
52
+      return addDays(endOfDay(new Date()), -1);
53
+    }
54
+
55
+    //获得本周的开始日期(本周一 00:00:00)
56
+    function getThisWeekStartDate() {
57
+      return startOfWeek(new Date(), { weekStartsOn: 1 });
58
+    }
59
+    //获得本周的结束日期(本周日 23:59:59)
60
+    function getThisWeekEndDate() {
61
+      return endOfWeek(new Date(), { weekStartsOn: 1 });
62
+    }
63
+
64
+    //获得本月开始时间(本月1号 00:00:00)
65
+    function getThisMonthStartDate() {
66
+      return startOfMonth(new Date());
67
+    }
68
+    //获得本月结束时间(本月底 23:59:59)
69
+    function getThisMonthEndDate() {
70
+      return endOfMonth(new Date());
71
+    }
72
+
73
+    //获得本年的开始日期(本年1月1日 00:00:00)
74
+    function getThisYearStartDate() {
75
+      return startOfYear(new Date());
76
+    }
77
+    //获得本年的结束日期(本年12月31日 23:59:59)
78
+    function getThisYearEndDate() {
79
+      return endOfYear(new Date());
80
+    }
81
+
24 82
     //获得上周的开始日期(上周一 00:00:00)
25 83
     function getLastWeekStartDate() {
26 84
       return addDays(startOfWeek(new Date()), -6);
@@ -29,6 +87,7 @@ export class DateService {
29 87
     function getLastWeekEndDate() {
30 88
       return addDays(endOfWeek(new Date()), -6);
31 89
     }
90
+
32 91
     //获得上月开始时间(上月1号 00:00:00)
33 92
     function getLastMonthStartDate() {
34 93
       return startOfMonth(addMonths(new Date(), -1));
@@ -37,6 +96,7 @@ export class DateService {
37 96
     function getLastMonthEndDate() {
38 97
       return endOfMonth(addMonths(new Date(), -1));
39 98
     }
99
+
40 100
     //获得上年的开始日期(去年1月1日 00:00:00)
41 101
     function getLastYearStartDate() {
42 102
       return startOfYear(addYears(new Date(), -1));
@@ -45,7 +105,16 @@ export class DateService {
45 105
     function getLastYearEndDate() {
46 106
       return endOfYear(addYears(new Date(), -1));
47 107
     }
108
+
48 109
     return {
110
+      yesterdayStartDate: getYesterdayStartDate(),
111
+      yesterdayEndDate: getYesterdayEndDate(),
112
+      thisWeekStartDate: getThisWeekStartDate(),
113
+      thisWeekEndDate: getThisWeekEndDate(),
114
+      thisMonthStartDate: getThisMonthStartDate(),
115
+      thisMonthEndDate: getThisMonthEndDate(),
116
+      thisYearStartDate: getThisYearStartDate(),
117
+      thisYearEndDate: getThisYearEndDate(),
49 118
       lastWeekStartDate: getLastWeekStartDate(),
50 119
       lastWeekEndDate: getLastWeekEndDate(),
51 120
       lastMonthStartDate: getLastMonthStartDate(),

+ 112 - 2
src/app/services/main.service.ts

@@ -2,7 +2,7 @@ import { Injectable } from "@angular/core";
2 2
 import { HttpClient, HttpHeaders } from "@angular/common/http";
3 3
 
4 4
 import host from "../../assets/js/http";
5
-import { Observable } from "rxjs";
5
+import { Observable, of } from "rxjs";
6 6
 import { AES, mode, pad, enc } from "crypto-js";
7 7
 import { MarkingService } from './marking.service';
8 8
 
@@ -1107,5 +1107,115 @@ export class MainService {
1107 1107
 			responseType: "arraybuffer",
1108 1108
 		});
1109 1109
 	}
1110
-	
1110
+	// 恢复删除的用户
1111
+	recoveryUser(data){
1112
+		return this.http.post(host.host + `/user/data/recoveryUser`, data, {
1113
+		  headers: this.headers,
1114
+		});
1115
+	}
1116
+	// 闭环数据生成-生成数据
1117
+	generateData(data){
1118
+		return this.http.post(host.host + `/api/patchData/execute`, data, {
1119
+		  headers: this.headers,
1120
+		});
1121
+	}
1122
+
1123
+	// 闭环数据生成-查询数据
1124
+	queryCount(data){
1125
+		return this.http.post(host.host + `/api/patchData/queryCount`, data, {
1126
+		  headers: this.headers,
1127
+		});
1128
+	}
1129
+
1130
+  // 根据当前日期查询陪检批量建单设置中的默认时间
1131
+	getPatientInspectTime(data = {}){
1132
+		return this.http.post(host.host + `/nurse/patientInspect/getPatientInspectTime`, data, {
1133
+		  headers: this.headers,
1134
+		});
1135
+	}
1136
+
1137
+  // 根据当前日期查询陪检批量建单设置中的默认时间
1138
+	bindPatientInspect(data = {}){
1139
+		return this.http.post(host.host + `/nurse/patientInspect/bindPatientInspect`, data, {
1140
+		  headers: this.headers,
1141
+		});
1142
+	}
1143
+
1144
+  // 根据当患者查检查
1145
+	getPatientInspectList(data = {}){
1146
+		return this.http.post(host.host + `/nurse/patientInspect/getPatientInspectList`, data, {
1147
+		  headers: this.headers,
1148
+		});
1149
+	}
1150
+
1151
+  // 批量-检查项目转检验项目
1152
+	addPatientInspectList(data = {}){
1153
+		return this.http.post(host.host + `/nurse/patientInspect/addPatientInspectList`, data, {
1154
+		  headers: this.headers,
1155
+		});
1156
+	}
1157
+
1158
+  // 护士端-批量陪检图标下两个数字
1159
+	getPatientInspectCount(data = {}){
1160
+		return this.http.post(host.host + `/nurse/patientInspect/getPatientInspectCount`, data, {
1161
+		  headers: this.headers,
1162
+		});
1163
+	}
1164
+
1165
+  // 标本打包-获取患者、试管类型列表、标本总数
1166
+	querySaveSpePackage(data = {}){
1167
+		return this.http.post(host.host + `/nurse/specimen/querySaveSpePackage`, data, {
1168
+		  headers: this.headers,
1169
+		});
1170
+	}
1171
+
1172
+  // 标本打包-新增标本
1173
+	addPackageSpe(data = {}){
1174
+		return this.http.post(host.host + `/nurse/specimen/addPackageSpe`, data, {
1175
+		  headers: this.headers,
1176
+		});
1177
+	}
1178
+
1179
+  // 标本打包-移除标本
1180
+	removePackageSpe(data = {}){
1181
+		return this.http.post(host.host + `/nurse/specimen/removePackageSpe`, data, {
1182
+		  headers: this.headers,
1183
+		});
1184
+	}
1185
+
1186
+  // 标本打包-重置
1187
+	resetPackageSpe(data = {}){
1188
+		return this.http.post(host.host + `/nurse/specimen/resetPackageSpe`, data, {
1189
+		  headers: this.headers,
1190
+		});
1191
+	}
1192
+
1193
+  // 标本打包-建单
1194
+	createOrTakeOrderSpecimen(data = {}){
1195
+		return this.http.post(host.host + `/transflow/createOrTakeOrder`, data, {
1196
+		  headers: this.headers,
1197
+		});
1198
+	}
1199
+
1200
+  // 标本打包-打印
1201
+	makeQrCode(data = {}, code){
1202
+		return this.http.post(host.host + `/workerOrder/makeQrCode/specimenPackage/${code}`, data, {
1203
+		  headers: this.headers,
1204
+		});
1205
+	}
1206
+
1207
+  // 护士端-标本打包图标下两个数字
1208
+	getSpePackageCount(data = {}){
1209
+		return this.http.post(host.host + `/nurse/specimen/getSpePackageCount`, data, {
1210
+		  headers: this.headers,
1211
+		});
1212
+	}
1213
+
1214
+  // 标本打包-标本包里的标本的所有终点科室列表
1215
+	getSpePackageEndDeptList(data = {}){
1216
+		return this.http.post(host.host + `/nurse/specimen/getSpePackageEndDeptList`, data, {
1217
+		  headers: this.headers,
1218
+		});
1219
+	}
1220
+
1111 1221
 }

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

@@ -312,6 +312,12 @@ export class ToolService {
312 312
 				case "callCenter":
313 313
 				  coopBtns.callCenter = true; //呼叫中心
314 314
 				  break;
315
+				case "log":
316
+				  coopBtns.log = true; //日志
317
+					break
318
+				case "viewGd":
319
+				  coopBtns.viewGd = true; //查看工单
320
+				  break;
315 321
       }
316 322
     });
317 323
     console.log(coopBtns);

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

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

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

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

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

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

+ 442 - 430
src/app/share/appraise-detail/appraise-detail.component.html

@@ -1,437 +1,449 @@
1 1
 <!-- 药品/静配 -->
2 2
 <div class="detail" *ngIf="!maskFlag">
3
-  <div class="title">差评查看<i class="icon_transport transport-guanbi" (click)="close()"></i></div>
4
-  <div class="box">
5
-    <div class="tab display_flex">
6
-      <div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==1}" (click)="checkTab(1)">工单信息</div>
7
-      <div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==2}" (click)="checkTab(2)">评价内容</div>
8
-      <div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==3}" (click)="checkTab(3)">调解</div>
9
-    </div>
10
-    <!-- 其他类型工单信息 -->
11
-    <div *ngIf="(tabType==1)&&(orderInfo.workOrderObj.taskType.associationType.value=='other')" class="content orders">
12
-      <div class="top">
13
-        <div class="num">
14
-          <span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
15
-          <span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
16
-        </div>
17
-        <div class="info" nz-row>
18
-          <div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
19
-          <div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
20
-          <div nz-col nzSpan="8">申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container *ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
21
-          </div>
22
-          <div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
23
-        </div>
24
-        <div class="info" nz-row>
25
-          <div nz-col nzSpan="6">
26
-            申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
27
-          </div>
28
-          <div nz-col nzSpan="6">
29
-            目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
30
-          </div>
31
-          <div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
32
-            加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
33
-        </div>
34
-        <div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
35
-          <div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
36
-        </div>
37
-      </div>
38
-      <div class="center">
39
-        <div class="box">
40
-          <div class="steps" *ngFor="let step of logList">
41
-            <div class="step">
42
-              <div class="info">
43
-                <i
44
-                  [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
45
-                <p>{{step.operationName}}</p>
46
-                <p>{{step.record?step.record.operationtime:''}}</p>
47
-                <p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
48
-                    *ngFor="let dept of step.record">{{dept.dept}},</span></p>
49
-                <p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
50
-              </div>
51
-              <div class="line"></div>
52
-            </div>
53
-          </div>
54
-        </div>
55
-      </div>
56
-    </div>
57
-    <!-- 标本类型工单信息 -->
58
-    <div
59
-      *ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='specimen'||orderInfo.workOrderObj.taskType.associationType.value=='specimenPlan')"
60
-      class="content orders">
61
-      <div class="top">
62
-        <div class="num">
63
-          <span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
64
-          <span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
65
-        </div>
66
-        <div class="info" nz-row>
67
-          <div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
68
-          <div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
69
-          <div nz-col nzSpan="8">申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container *ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
70
-          </div>
71
-          <div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
72
-        </div>
73
-        <div class="info" nz-row>
74
-          <div nz-col nzSpan="6">
75
-            申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
76
-          </div>
77
-          <div nz-col nzSpan="6">
78
-            目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
79
-          </div>
80
-          <div nz-col nzSpan="4">预计接收:{{orderInfo.workOrderObj.expectReceiveNum}}</div>
81
-          <div nz-col nzSpan="4">送达:{{orderInfo.workOrderObj.deliveryNum}}</div>
82
-          <div nz-col nzSpan="4">实际接收:{{orderInfo.workOrderObj.actualReceiveNum}}</div>
83
-        </div>
84
-        <div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
85
-          <div nz-col nzSpan="8">
86
-            加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
87
-          <div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
88
-        </div>
89
-      </div>
90
-      <div class="center">
91
-        <div class="box">
92
-          <div class="steps" *ngFor="let step of logList">
93
-            <div class="step">
94
-              <div class="info">
95
-                <i
96
-                  [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
97
-                <p>{{step.operationName}}</p>
98
-                <p>{{step.record?step.record.operationtime:''}}</p>
99
-                <p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
100
-                    *ngFor="let dept of step.record">{{dept.dept}},</span></p>
101
-                <p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
102
-              </div>
103
-              <div class="line"></div>
104
-            </div>
105
-          </div>
106
-        </div>
107
-      </div>
108
-      <div class="bottom">
109
-        <div class="table">
110
-          <nz-table class="" [nzData]="orderInfo.workOrderObj.specimenSet" nzSize="small"
111
-            [nzScroll]="{ y: (orderInfo.workOrderObj.urgentDetails?'124px':'153px') }" [nzShowPagination]="null">
112
-            <thead>
113
-              <tr class="thead">
114
-                <th nzWidth="50px">序号</th>
115
-                <th nzWidth="95px">检验项目</th>
116
-                <th nzWidth="95px">标本类型</th>
117
-                <th nzWidth="110px">标本编码</th>
118
-                <th nzWidth="88px">患者姓名</th>
119
-                <th nzWidth="88px">住院号</th>
120
-                <th nzWidth="50px">床号</th>
121
-                <th nzWidth="88px">目标科室</th>
122
-                <!-- <th nzWidth="75px">是否接收</th> -->
123
-                <!-- <th nzWidth="75px">是否送达</th> -->
124
-                <th nzWidth="123px">接收扫描时间</th>
125
-                <!-- <th nzWidth="123px">送达扫描时间</th> -->
126
-              </tr>
127
-            </thead>
128
-            <tbody *ngIf="orderInfo.workOrderObj.specimenSet">
129
-              <tr *ngFor="let data of orderInfo.workOrderObj.specimenSet;let i =index;">
130
-                <td>{{i+1}}</td>
131
-                <td>{{data.specimenDesc}}</td>
132
-                <td>{{data.stype?data.stype.name:''}}</td>
133
-                <td>{{data.scode}}</td>
134
-                <td>{{data.patientName}}</td>
135
-                <td>{{data.residenceNo}}</td>
136
-                <td>{{data.bedNum}}</td>
137
-                <td>{{data.checkDept.dept}}</td>
138
-                <!-- <td>{{data.received?"是":"否"}}</td> -->
139
-                <!-- <td>{{data.arrived?"是":"否"}}</td> -->
140
-                <td>{{data.arriveTime|date:'MM-dd HH:mm'}}</td>
141
-                <!-- <td>{{data.sendTime|date:'yyyy-MM-dd HH:mm'}}</td> -->
142
-              </tr>
143
-            </tbody>
144
-          </nz-table>
145
-        </div>
146
-      </div>
147
-    </div>
148
-    <!-- 药品/静配配送类型工单信息 -->
149
-    <div
150
-      *ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='drugsBag'||orderInfo.workOrderObj.taskType.associationType.value=='jPBag')"
151
-      class="content orders">
152
-      <div class="top">
153
-        <div class="num">
154
-          <span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
155
-          <span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
156
-        </div>
157
-        <div class="info" nz-row>
158
-          <div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
159
-          <div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
160
-          <div nz-col nzSpan="8">申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container *ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
161
-          </div>
162
-          <div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
163
-        </div>
164
-        <div class="info" nz-row>
165
-          <div nz-col nzSpan="6">
166
-            申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
167
-          </div>
168
-          <div nz-col nzSpan="6">
169
-            目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
170
-          </div>
171
-          <div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
172
-            加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
173
-        </div>
174
-        <div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
175
-          <div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
176
-        </div>
177
-      </div>
178
-      <div class="center">
179
-        <div class="box">
180
-          <div class="steps" *ngFor="let step of logList">
181
-            <div class="step">
182
-              <div class="info">
183
-                <i
184
-                  [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
185
-                <p>{{step.operationName}}</p>
186
-                <p>{{step.record?step.record.operationtime:''}}</p>
187
-                <p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
188
-                    *ngFor="let dept of step.record">{{dept.dept}},</span></p>
189
-                <p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
190
-              </div>
191
-              <div class="line"></div>
192
-            </div>
193
-          </div>
194
-        </div>
195
-      </div>
196
-      <div class="bottom">
197
-        <div class="table">
198
-          <!-- 静配 -->
199
-          <nz-table *ngIf="orderInfo.workOrderObj.staticDistri" class="detailDrugTable"
200
-            [nzData]="orderInfo.workOrderObj.staticDistri.jpdetailsFormat" nzSize="small" [nzScroll]="{ y: '125px' }"
201
-            [nzShowPagination]="null">
202
-            <thead>
203
-              <tr class="thead">
204
-                <th nzWidth="15%">患者信息</th>
205
-                <th nzWidth="30%">药品</th>
206
-                <th nzWidth="5%">数量</th>
207
-                <th nzWidth="15%">患者信息</th>
208
-                <th nzWidth="30%">药品</th>
209
-                <th nzWidth="5%">数量</th>
210
-              </tr>
211
-            </thead>
212
-            <tbody *ngIf="orderInfo.workOrderObj.staticDistri">
213
-              <tr *ngFor="let data of orderInfo.workOrderObj.staticDistri.jpdetailsFormat">
214
-                <td>{{data[0].bedNum}}床:{{data[0].patientInfo}}</td>
215
-                <td>{{data[0].jpInfo}}</td>
216
-                <td>{{data[0].jpNum}}</td>
217
-                <td>{{data[1]?data[1].bedNum+"床:"+data[1].patientInfo:''}}</td>
218
-                <td>{{data[1]?data[1].jpInfo:''}}</td>
219
-                <td>{{data[1]?data[1].jpNum:''}}</td>
220
-              </tr>
221
-            </tbody>
222
-          </nz-table>
223
-          <!-- 药品 -->
224
-          <nz-table *ngIf="orderInfo.workOrderObj.drugs" class="detailDrugTable"
225
-            [nzData]="orderInfo.workOrderObj.drugs.drugsFormat" nzSize="small" [nzScroll]="{ y: '125px' }"
226
-            [nzShowPagination]="null">
227
-            <thead>
228
-              <tr class="thead">
229
-                <th nzWidth="15%">患者信息</th>
230
-                <th nzWidth="30%">药品</th>
231
-                <th nzWidth="5%">数量</th>
232
-                <th nzWidth="15%">患者信息</th>
233
-                <th nzWidth="30%">药品</th>
234
-                <th nzWidth="5%">数量</th>
235
-              </tr>
236
-            </thead>
237
-            <tbody *ngIf="orderInfo.workOrderObj.drugs">
238
-              <tr *ngFor="let data of orderInfo.workOrderObj.drugs.drugsFormat">
239
-                <td>{{data[0].bedNum}}床:{{data[0].patientInfo}}</td>
240
-                <td>{{data[0].drugsInfo}}</td>
241
-                <td>{{data[0].drugsNum}}</td>
242
-                <td>{{data[1]?data[1].bedNum+"床:"+data[1].patientInfo:''}}</td>
243
-                <td>{{data[1]?data[1].drugsInfo:''}}</td>
244
-                <td>{{data[1]?data[1].drugsNum:''}}</td>
245
-              </tr>
246
-            </tbody>
247
-          </nz-table>
248
-        </div>
249
-      </div>
250
-    </div>
251
-    <!-- 患者陪检/患者转运类型工单信息 -->
252
-    <div
253
-      *ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='inspect'||orderInfo.workOrderObj.taskType.associationType.value=='patientTransport')"
254
-      class="content orders">
255
-      <div class="top">
256
-        <div class="num">
257
-          <span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
258
-          <span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
259
-        </div>
260
-        <div class="info" nz-row>
261
-          <div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
262
-          <div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
263
-          <div nz-col nzSpan="8">申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container *ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
264
-          </div>
265
-          <div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
266
-        </div>
267
-        <div class="info" nz-row>
268
-          <div nz-col nzSpan="6">
269
-            申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
270
-          </div>
271
-          <div nz-col nzSpan="6">
272
-            目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
273
-          </div>
274
-          <div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
275
-            加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
276
-        </div>
277
-        <div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
278
-          <div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
279
-        </div>
280
-      </div>
281
-      <div class="center">
282
-        <div class="box">
283
-          <div class="steps" *ngFor="let step of logList">
284
-            <div class="step">
285
-              <div class="info">
286
-                <i
287
-                  [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
288
-                <p>{{step.operationName}}</p>
289
-                <p>{{step.record?step.record.operationtime:''}}</p>
290
-                <p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
291
-                    *ngFor="let dept of step.record">{{dept.dept}},</span></p>
292
-                <p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
293
-              </div>
294
-              <div class="line"></div>
295
-            </div>
296
-          </div>
297
-        </div>
298
-      </div>
299
-      <div class="bottom">
300
-        <div class="info">
301
-          <div nz-row class="top">
302
-            <div class="left" nz-col nzSpan="12">
303
-              <p>
304
-                <span class="label">患者姓名</span>
305
-                <span>{{orderInfo.workOrderObj.patient.patientName}}</span>
306
-              </p>
307
-              <p>
308
-                <span class="label">床位</span>
309
-                <span>{{orderInfo.workOrderObj.patient.bedNum}}</span>
310
-              </p>
311
-              <p *ngIf="orderInfo.workOrderObj.taskType.associationType.value=='inspect'">
312
-                <span class="label">检查项目</span>
313
-                <span>
314
-                  <span *ngFor="let item of orderInfo.workOrderObj.checkList;let i = index;">
315
-                    <span *ngIf="i!=orderInfo.workOrderObj.checkList.length-1">{{item.inspectName}},</span>
316
-                    <span *ngIf="i==orderInfo.workOrderObj.checkList.length-1">{{item.inspectName}}</span>
317
-                  </span>
318
-                </span>
319
-              </p>
320
-            </div>
321
-            <div class="right" nz-col nzSpan="12">
322
-              <p>
323
-                <span class="label">住院号</span>
324
-                <span>{{orderInfo.workOrderObj.patient.residenceNo}}</span>
325
-              </p>
326
-              <p>
327
-                <span class="label">携带设备</span>
328
-                <span>{{orderInfo.workOrderObj.goods}}</span>
329
-              </p>
330
-              <p *ngIf="orderInfo.workOrderObj.taskType.associationType.value=='inspect'">
331
-                <span class="label">预约时间</span>
332
-                <span>{{orderInfo.workOrderObj.yyTime?orderInfo.workOrderObj.yyTime:''}}</span>
333
-              </p>
334
-            </div>
335
-          </div>
336
-        </div>
337
-      </div>
338
-    </div>
339
-    <!-- 评价内容 -->
340
-    <div *ngIf="tabType==2" class="content pingjia">
341
-      <div class="msg">
342
-        <div>评价等级:{{orderInfo.evaluationDetails.serviceEvaluation.name}}</div>
343
-        <div>评价人:{{orderInfo.evaluationDetails.evalutationUser.name}}</div>
344
-      </div>
345
-      <div class="con">
346
-        意见内容:{{orderInfo.evaluationDetails.remark}}
347
-      </div>
348
-    </div>
349
-    <!-- 调解(未调解) -->
350
-    <div *ngIf="tabType==3&&orderInfo.handleStatus.id==286" class="content">
351
-      <div class="form">
352
-        <form nz-form [formGroup]="validateForm" class="addForm" (ngSubmit)="submitForm()">
353
-          <nz-form-item>
354
-            <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="reason">原因及事件过程</nz-form-label>
355
-            <nz-form-control nzErrorTip="请输入原因及事件过程!">
356
-              <nz-input-group>
357
-                <textarea rows="3" maxlength="500" nz-input type="reason" formControlName="reason"
358
-                  placeholder="请输入原因及事件过程"></textarea>
359
-              </nz-input-group>
360
-            </nz-form-control>
361
-          </nz-form-item>
362
-          <nz-form-item>
363
-            <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="process">调解过程</nz-form-label>
364
-            <nz-form-control nzErrorTip="请输入调解过程!">
365
-              <nz-input-group>
366
-                <textarea rows="3" maxlength="500" nz-input type="process" formControlName="process"
367
-                  placeholder="请输入调解过程"></textarea>
368
-              </nz-input-group>
369
-            </nz-form-control>
370
-          </nz-form-item>
371
-          <nz-form-item>
372
-            <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="handleType">解决方式</nz-form-label>
373
-            <nz-form-control nzErrorTip="请选择解决方式!">
374
-              <nz-select [nzDropdownMatchSelectWidth]="false" type="handleType" nzShowSearch nzAllowClear
375
-                formControlName="handleType" nzPlaceHolder="请选择解决方式">
376
-                <nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}" *ngFor="let data of allHandleType">
377
-                </nz-option>
378
-              </nz-select>
379
-            </nz-form-control>
380
-          </nz-form-item>
381
-          <nz-form-item>
382
-            <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="improve">改进意见</nz-form-label>
383
-            <nz-form-control nzErrorTip="请输入改进意见!">
384
-              <nz-input-group>
385
-                <textarea rows="3" maxlength="500" nz-input type="improve" formControlName="improve"
386
-                  placeholder="请输入改进意见"></textarea>
387
-              </nz-input-group>
388
-            </nz-form-control>
389
-          </nz-form-item>
390
-        </form>
391
-      </div>
392
-    </div>
393
-    <!-- 调解(已调解) -->
394
-    <div *ngIf="tabType==3&&orderInfo.handleStatus.id==287" class="content">
395
-      <div class="mediation">
396
-        <div class="item">
397
-          <div class="label">原因及事件过程:</div>
398
-          <div class="info">{{orderInfo.reasonAndEventProcess}}</div>
399
-        </div>
400
-        <div class="item">
401
-          <div class="label">调解过程:</div>
402
-          <div class="info">{{orderInfo.mediationProcess}}</div>
403
-        </div>
404
-        <div class="item display_flex align-items_center justify-content_space-between">
405
-          <div class="block">
406
-            <div class="label">解决方式:</div>
407
-            <div class="info">{{orderInfo.handleType.name}}</div>
408
-          </div>
409
-          <div class="block">
410
-            <div class="label">调解人:</div>
411
-            <div class="info">{{orderInfo.mediationUser?orderInfo.mediationUser.name:''}}</div>
412
-          </div>
413
-          <div class="block">
414
-            <div class="label">调解时间:</div>
415
-            <div class="info">{{orderInfo.mediationTime?date(orderInfo.mediationTime):''}}</div>
416
-          </div>
417
-        </div>
418
-        <div class="item">
419
-          <div class="label">改进意见:</div>
420
-          <div class="info">{{orderInfo.advice}}</div>
421
-        </div>
422
-      </div>
423
-    </div>
424
-  </div>
425
-  <div class="btns">
426
-    <button *ngIf="tabType==3&&orderInfo.handleStatus.id==286" class="candelBtn btn" nz-button nzType="primary"
427
-      [nzLoading]="btnLoading" (click)="submitForm()">调解记录保存</button>
428
-    <button class="candelBtn btn cancel" nz-button nzType="default" (click)="close()">关闭</button>
429
-  </div>
3
+	<div class="title">{{orderInfo.handleStatus.value==1 ? '调解' : '查看'}}<i class="icon_transport transport-guanbi" (click)="close()"></i></div>
4
+	<div class="box">
5
+		<div class="tab display_flex" *ngIf="!allShow">
6
+			<div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==1}" (click)="checkTab(1)">工单信息</div>
7
+			<div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==2}" (click)="checkTab(2)">评价内容</div>
8
+			<div [ngClass]="{'item':true, 'flex_1':true, 'checked':tabType==3}" (click)="checkTab(3)">调解</div>
9
+		</div>
10
+		<div *ngIf="!allShow">
11
+			<!-- 其他类型工单信息 -->
12
+			<div *ngIf="(tabType==1)&&(orderInfo.workOrderObj.taskType.associationType.value=='other')"
13
+				class="content orders">
14
+				<div class="top">
15
+					<div class="num">
16
+						<span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
17
+						<span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
18
+					</div>
19
+					<div class="info" nz-row>
20
+						<div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
21
+						<div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
22
+						<div nz-col nzSpan="8">
23
+							申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container
24
+								*ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
25
+						</div>
26
+						<div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
27
+					</div>
28
+					<div class="info" nz-row>
29
+						<div nz-col nzSpan="6">
30
+							申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
31
+						</div>
32
+						<div nz-col nzSpan="6">
33
+							目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
34
+						</div>
35
+						<div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
36
+							加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
37
+					</div>
38
+					<div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
39
+						<div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
40
+					</div>
41
+				</div>
42
+				<div class="center">
43
+					<div class="box">
44
+						<div class="steps" *ngFor="let step of logList">
45
+							<div class="step">
46
+								<div class="info">
47
+									<i
48
+										[ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
49
+									<p>{{step.operationName}}</p>
50
+									<p>{{step.record?step.record.operationtime:''}}</p>
51
+									<p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
52
+											*ngFor="let dept of step.record">{{dept.dept}},</span></p>
53
+									<p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
54
+								</div>
55
+								<div class="line"></div>
56
+							</div>
57
+						</div>
58
+					</div>
59
+				</div>
60
+			</div>
61
+			<!-- 标本类型工单信息 -->
62
+			<div
63
+				*ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='specimen'||orderInfo.workOrderObj.taskType.associationType.value=='specimenPlan')"
64
+				class="content orders">
65
+				<div class="top">
66
+					<div class="num">
67
+						<span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
68
+						<span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
69
+					</div>
70
+					<div class="info" nz-row>
71
+						<div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
72
+						<div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
73
+						<div nz-col nzSpan="8">
74
+							申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container
75
+								*ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
76
+						</div>
77
+						<div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
78
+					</div>
79
+					<div class="info" nz-row>
80
+						<div nz-col nzSpan="6">
81
+							申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
82
+						</div>
83
+						<div nz-col nzSpan="6">
84
+							目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
85
+						</div>
86
+						<div nz-col nzSpan="4">预计接收:{{orderInfo.workOrderObj.expectReceiveNum}}</div>
87
+						<div nz-col nzSpan="4">送达:{{orderInfo.workOrderObj.deliveryNum}}</div>
88
+						<div nz-col nzSpan="4">实际接收:{{orderInfo.workOrderObj.actualReceiveNum}}</div>
89
+					</div>
90
+					<div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
91
+						<div nz-col nzSpan="8">
92
+							加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
93
+						<div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
94
+					</div>
95
+				</div>
96
+				<div class="center">
97
+					<div class="box">
98
+						<div class="steps" *ngFor="let step of logList">
99
+							<div class="step">
100
+								<div class="info">
101
+									<i
102
+										[ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
103
+									<p>{{step.operationName}}</p>
104
+									<p>{{step.record?step.record.operationtime:''}}</p>
105
+									<p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
106
+											*ngFor="let dept of step.record">{{dept.dept}},</span></p>
107
+									<p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
108
+								</div>
109
+								<div class="line"></div>
110
+							</div>
111
+						</div>
112
+					</div>
113
+				</div>
114
+				<div class="bottom">
115
+					<div class="table">
116
+						<nz-table class="" [nzData]="orderInfo.workOrderObj.specimenSet" nzSize="small"
117
+							[nzScroll]="{ y: (orderInfo.workOrderObj.urgentDetails?'124px':'153px') }" [nzShowPagination]="null">
118
+							<thead>
119
+								<tr class="thead">
120
+									<th nzWidth="50px">序号</th>
121
+									<th nzWidth="95px">检验项目</th>
122
+									<th nzWidth="95px">标本类型</th>
123
+									<th nzWidth="110px">标本编码</th>
124
+									<th nzWidth="88px">患者姓名</th>
125
+									<th nzWidth="88px">住院号</th>
126
+									<th nzWidth="50px">床号</th>
127
+									<th nzWidth="88px">目标科室</th>
128
+									<!-- <th nzWidth="75px">是否接收</th> -->
129
+									<!-- <th nzWidth="75px">是否送达</th> -->
130
+									<th nzWidth="123px">接收扫描时间</th>
131
+									<!-- <th nzWidth="123px">送达扫描时间</th> -->
132
+								</tr>
133
+							</thead>
134
+							<tbody *ngIf="orderInfo.workOrderObj.specimenSet">
135
+								<tr *ngFor="let data of orderInfo.workOrderObj.specimenSet;let i =index;">
136
+									<td>{{i+1}}</td>
137
+									<td>{{data.specimenDesc}}</td>
138
+									<td>{{data.stype?data.stype.name:''}}</td>
139
+									<td>{{data.scode}}</td>
140
+									<td>{{data.patientName}}</td>
141
+									<td>{{data.residenceNo}}</td>
142
+									<td>{{data.bedNum}}</td>
143
+									<td>{{data.checkDept.dept}}</td>
144
+									<!-- <td>{{data.received?"是":"否"}}</td> -->
145
+									<!-- <td>{{data.arrived?"是":"否"}}</td> -->
146
+									<td>{{data.arriveTime|date:'MM-dd HH:mm'}}</td>
147
+									<!-- <td>{{data.sendTime|date:'yyyy-MM-dd HH:mm'}}</td> -->
148
+								</tr>
149
+							</tbody>
150
+						</nz-table>
151
+					</div>
152
+				</div>
153
+			</div>
154
+			<!-- 药品/静配配送类型工单信息 -->
155
+			<div
156
+				*ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='drugsBag'||orderInfo.workOrderObj.taskType.associationType.value=='jPBag')"
157
+				class="content orders">
158
+				<div class="top">
159
+					<div class="num">
160
+						<span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
161
+						<span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
162
+					</div>
163
+					<div class="info" nz-row>
164
+						<div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
165
+						<div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
166
+						<div nz-col nzSpan="8">
167
+							申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container
168
+								*ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
169
+						</div>
170
+						<div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
171
+					</div>
172
+					<div class="info" nz-row>
173
+						<div nz-col nzSpan="6">
174
+							申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
175
+						</div>
176
+						<div nz-col nzSpan="6">
177
+							目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
178
+						</div>
179
+						<div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
180
+							加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
181
+					</div>
182
+					<div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
183
+						<div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
184
+					</div>
185
+				</div>
186
+				<div class="center">
187
+					<div class="box">
188
+						<div class="steps" *ngFor="let step of logList">
189
+							<div class="step">
190
+								<div class="info">
191
+									<i
192
+										[ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
193
+									<p>{{step.operationName}}</p>
194
+									<p>{{step.record?step.record.operationtime:''}}</p>
195
+									<p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
196
+											*ngFor="let dept of step.record">{{dept.dept}},</span></p>
197
+									<p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
198
+								</div>
199
+								<div class="line"></div>
200
+							</div>
201
+						</div>
202
+					</div>
203
+				</div>
204
+				<div class="bottom">
205
+					<div class="table">
206
+						<!-- 静配 -->
207
+						<nz-table *ngIf="orderInfo.workOrderObj.staticDistri" class="detailDrugTable"
208
+							[nzData]="orderInfo.workOrderObj.staticDistri.jpdetailsFormat" nzSize="small" [nzScroll]="{ y: '125px' }"
209
+							[nzShowPagination]="null">
210
+							<thead>
211
+								<tr class="thead">
212
+									<th nzWidth="15%">患者信息</th>
213
+									<th nzWidth="30%">药品</th>
214
+									<th nzWidth="5%">数量</th>
215
+									<th nzWidth="15%">患者信息</th>
216
+									<th nzWidth="30%">药品</th>
217
+									<th nzWidth="5%">数量</th>
218
+								</tr>
219
+							</thead>
220
+							<tbody *ngIf="orderInfo.workOrderObj.staticDistri">
221
+								<tr *ngFor="let data of orderInfo.workOrderObj.staticDistri.jpdetailsFormat">
222
+									<td>{{data[0].bedNum}}床:{{data[0].patientInfo}}</td>
223
+									<td>{{data[0].jpInfo}}</td>
224
+									<td>{{data[0].jpNum}}</td>
225
+									<td>{{data[1]?data[1].bedNum+"床:"+data[1].patientInfo:''}}</td>
226
+									<td>{{data[1]?data[1].jpInfo:''}}</td>
227
+									<td>{{data[1]?data[1].jpNum:''}}</td>
228
+								</tr>
229
+							</tbody>
230
+						</nz-table>
231
+						<!-- 药品 -->
232
+						<nz-table *ngIf="orderInfo.workOrderObj.drugs" class="detailDrugTable"
233
+							[nzData]="orderInfo.workOrderObj.drugs.drugsFormat" nzSize="small" [nzScroll]="{ y: '125px' }"
234
+							[nzShowPagination]="null">
235
+							<thead>
236
+								<tr class="thead">
237
+									<th nzWidth="15%">患者信息</th>
238
+									<th nzWidth="30%">药品</th>
239
+									<th nzWidth="5%">数量</th>
240
+									<th nzWidth="15%">患者信息</th>
241
+									<th nzWidth="30%">药品</th>
242
+									<th nzWidth="5%">数量</th>
243
+								</tr>
244
+							</thead>
245
+							<tbody *ngIf="orderInfo.workOrderObj.drugs">
246
+								<tr *ngFor="let data of orderInfo.workOrderObj.drugs.drugsFormat">
247
+									<td>{{data[0].bedNum}}床:{{data[0].patientInfo}}</td>
248
+									<td>{{data[0].drugsInfo}}</td>
249
+									<td>{{data[0].drugsNum}}</td>
250
+									<td>{{data[1]?data[1].bedNum+"床:"+data[1].patientInfo:''}}</td>
251
+									<td>{{data[1]?data[1].drugsInfo:''}}</td>
252
+									<td>{{data[1]?data[1].drugsNum:''}}</td>
253
+								</tr>
254
+							</tbody>
255
+						</nz-table>
256
+					</div>
257
+				</div>
258
+			</div>
259
+			<!-- 患者陪检/患者转运类型工单信息 -->
260
+			<div
261
+				*ngIf="tabType==1&&(orderInfo.workOrderObj.taskType.associationType.value=='inspect'||orderInfo.workOrderObj.taskType.associationType.value=='patientTransport')"
262
+				class="content orders">
263
+				<div class="top">
264
+					<div class="num">
265
+						<span class="left">单号:{{orderInfo.workOrderObj.gdcode}}</span>
266
+						<span class="right">{{orderInfo.workOrderObj.gdState?orderInfo.workOrderObj.gdState.name:''}}</span>
267
+					</div>
268
+					<div class="info" nz-row>
269
+						<div nz-col nzSpan="6">工单日期:{{orderInfo.workOrderObj.startTime|date:'yyyy-MM-dd HH:mm'}}</div>
270
+						<div nz-col nzSpan="6">总耗时:{{orderInfo.workOrderObj.showTimeNum}}</div>
271
+						<div nz-col nzSpan="8">
272
+							申请类型:{{orderInfo.workOrderObj.taskType?orderInfo.workOrderObj.taskType.taskName:''}}<ng-container
273
+								*ngIf="orderInfo.workOrderObj.goodsRemark">-{{orderInfo.workOrderObj.goodsRemark}}</ng-container>
274
+						</div>
275
+						<div nz-col nzSpan="4">配送人员信息:{{orderInfo.workOrderObj.worker?orderInfo.workOrderObj.worker.name:''}}</div>
276
+					</div>
277
+					<div class="info" nz-row>
278
+						<div nz-col nzSpan="6">
279
+							申请科室:{{orderInfo.workOrderObj.createDeptDTO?orderInfo.workOrderObj.createDeptDTO.dept:''}}
280
+						</div>
281
+						<div nz-col nzSpan="6">
282
+							目标科室:{{(orderInfo.workOrderObj.endDepts&&orderInfo.workOrderObj.endDepts[0])?orderInfo.workOrderObj.endDepts[0].dept:''}}
283
+						</div>
284
+						<div nz-col nzSpan="8" *ngIf="orderInfo.workOrderObj.urgentDetails">
285
+							加急状态:{{orderInfo.workOrderObj.urgentDetails.checkStatus.name}}</div>
286
+					</div>
287
+					<div class="info" nz-row *ngIf="orderInfo.workOrderObj.urgentDetails">
288
+						<div nz-col nzSpan="24" class="jiaji">加急原因:{{orderInfo.workOrderObj.urgentDetails.urgentReason}}</div>
289
+					</div>
290
+				</div>
291
+				<div class="center">
292
+					<div class="box">
293
+						<div class="steps" *ngFor="let step of logList">
294
+							<div class="step">
295
+								<div class="info">
296
+									<i
297
+										[ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
298
+									<p>{{step.operationName}}</p>
299
+									<p>{{step.record?step.record.operationtime:''}}</p>
300
+									<p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
301
+											*ngFor="let dept of step.record">{{dept.dept}},</span></p>
302
+									<p *ngIf="step.record&&step.record.length&&step.operationName!='申请'">耗时{{filterTime(step.record)}}</p>
303
+								</div>
304
+								<div class="line"></div>
305
+							</div>
306
+						</div>
307
+					</div>
308
+				</div>
309
+				<div class="bottom">
310
+					<div class="info">
311
+						<div nz-row class="top">
312
+							<div class="left" nz-col nzSpan="12">
313
+								<p>
314
+									<span class="label">患者姓名</span>
315
+									<span>{{orderInfo.workOrderObj.patient.patientName}}</span>
316
+								</p>
317
+								<p>
318
+									<span class="label">床位</span>
319
+									<span>{{orderInfo.workOrderObj.patient.bedNum}}</span>
320
+								</p>
321
+								<p *ngIf="orderInfo.workOrderObj.taskType.associationType.value=='inspect'">
322
+									<span class="label">检查项目</span>
323
+									<span>
324
+										<span *ngFor="let item of orderInfo.workOrderObj.checkList;let i = index;">
325
+											<span *ngIf="i!=orderInfo.workOrderObj.checkList.length-1">{{item.inspectName}},</span>
326
+											<span *ngIf="i==orderInfo.workOrderObj.checkList.length-1">{{item.inspectName}}</span>
327
+										</span>
328
+									</span>
329
+								</p>
330
+							</div>
331
+							<div class="right" nz-col nzSpan="12">
332
+								<p>
333
+									<span class="label">住院号</span>
334
+									<span>{{orderInfo.workOrderObj.patient.residenceNo}}</span>
335
+								</p>
336
+								<p>
337
+									<span class="label">携带设备</span>
338
+									<span>{{orderInfo.workOrderObj.goods}}</span>
339
+								</p>
340
+								<p *ngIf="orderInfo.workOrderObj.taskType.associationType.value=='inspect'">
341
+									<span class="label">预约时间</span>
342
+									<span>{{orderInfo.workOrderObj.yyTime?orderInfo.workOrderObj.yyTime:''}}</span>
343
+								</p>
344
+							</div>
345
+						</div>
346
+					</div>
347
+				</div>
348
+			</div>
349
+			<!-- 评价内容 -->
350
+			<div *ngIf="tabType==2" class="content pingjia">
351
+				<div class="msg">
352
+					<div>评价等级:{{orderInfo.evaluationLevel ? orderInfo.evaluationLevel.name:'-'}}</div>
353
+					<div>评价人:{{orderInfo.evaluatorDTO?orderInfo.evaluatorDTO.name:''}}</div>
354
+				</div>
355
+				<div class="con">
356
+					意见内容:{{orderInfo.evaluationContent}}
357
+				</div>
358
+			</div>
359
+		</div>
360
+
361
+		<!-- 调解(未调解) -->
362
+		<div *ngIf="orderInfo.handleStatus.value==1" class="content">
363
+			<div class="form">
364
+				<form nz-form [formGroup]="validateForm" class="addForm" (ngSubmit)="submitForm()">
365
+					<nz-form-item>
366
+						<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="reason">原因及事件过程</nz-form-label>
367
+						<nz-form-control nzErrorTip="请输入原因及事件过程!">
368
+							<nz-input-group>
369
+								<textarea rows="3" maxlength="500" nz-input type="reason" formControlName="reason"
370
+									placeholder="请输入原因及事件过程"></textarea>
371
+							</nz-input-group>
372
+						</nz-form-control>
373
+					</nz-form-item>
374
+					<nz-form-item>
375
+						<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="process">调解过程</nz-form-label>
376
+						<nz-form-control nzErrorTip="请输入调解过程!">
377
+							<nz-input-group>
378
+								<textarea rows="3" maxlength="500" nz-input type="process" formControlName="process"
379
+									placeholder="请输入调解过程"></textarea>
380
+							</nz-input-group>
381
+						</nz-form-control>
382
+					</nz-form-item>
383
+					<nz-form-item>
384
+						<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="handleType">解决方式</nz-form-label>
385
+						<nz-form-control nzErrorTip="请选择解决方式!">
386
+							<nz-select [nzDropdownMatchSelectWidth]="false" type="handleType" nzShowSearch nzAllowClear
387
+								formControlName="handleType" nzPlaceHolder="请选择解决方式">
388
+								<nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}" *ngFor="let data of allHandleType">
389
+								</nz-option>
390
+							</nz-select>
391
+						</nz-form-control>
392
+					</nz-form-item>
393
+					<nz-form-item>
394
+						<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="improve">改进意见</nz-form-label>
395
+						<nz-form-control nzErrorTip="请输入改进意见!">
396
+							<nz-input-group>
397
+								<textarea rows="3" maxlength="500" nz-input type="improve" formControlName="improve"
398
+									placeholder="请输入改进意见"></textarea>
399
+							</nz-input-group>
400
+						</nz-form-control>
401
+					</nz-form-item>
402
+				</form>
403
+			</div>
404
+		</div>
405
+		<!-- 调解(已调解) -->
406
+		<div *ngIf="orderInfo.handleStatus.value==2" class="content">
407
+			<div class="mediation">
408
+				<div class="item">
409
+					<div class="label">原因及事件过程:</div>
410
+					<div class="info">{{orderInfo.reasonAndEventProcess}}</div>
411
+				</div>
412
+				<div class="item">
413
+					<div class="label">调解过程:</div>
414
+					<div class="info">{{orderInfo.mediationProcess}}</div>
415
+				</div>
416
+				<div class="item display_flex align-items_center justify-content_space-between">
417
+					<div class="block">
418
+						<div class="label">解决方式:</div>
419
+						<div class="info">{{orderInfo.handleType.name}}</div>
420
+					</div>
421
+					<div class="block">
422
+						<div class="label">调解人:</div>
423
+						<div class="info">{{orderInfo.mediationUser?orderInfo.mediationUser.name:''}}</div>
424
+					</div>
425
+					<div class="block">
426
+						<div class="label">调解时间:</div>
427
+						<div class="info">{{orderInfo.mediationTime?date(orderInfo.mediationTime):''}}</div>
428
+					</div>
429
+				</div>
430
+				<div class="item">
431
+					<div class="label">改进意见:</div>
432
+					<div class="info">{{orderInfo.advice}}</div>
433
+				</div>
434
+			</div>
435
+		</div>
436
+	</div>
437
+	<div class="btns">
438
+		<button *ngIf="orderInfo.handleStatus.value==1" class="candelBtn btn" nz-button nzType="primary"
439
+			[nzLoading]="btnLoading" (click)="submitForm()">调解记录保存</button>
440
+		<button class="candelBtn btn cancel" nz-button nzType="default" (click)="close()">关闭</button>
441
+	</div>
430 442
 </div>
431 443
 <!-- 操作成功/失败提示框 -->
432 444
 <app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
433
-  [info]="promptInfo" (closeModel)="close()">
434
-  <!-- 2.父组件调用子组件时绑定到这个事件属性,并在事件发生时作出回应。(closeModel)="close()" -->
445
+	[info]="promptInfo" (closeModel)="close()">
446
+	<!-- 2.父组件调用子组件时绑定到这个事件属性,并在事件发生时作出回应。(closeModel)="close()" -->
435 447
 </app-prompt-modal>
436 448
 <!-- 遮罩 -->
437
-<app-mask *ngIf="maskFlag"></app-mask>
449
+<app-mask *ngIf="maskFlag"></app-mask>

+ 2 - 2
src/app/share/appraise-detail/appraise-detail.component.ts

@@ -33,7 +33,7 @@ export class AppraiseDetailComponent implements OnInit {
33 33
   urgentLoading: boolean = false; //确认加急按钮loading状态
34 34
   recLoading: boolean = false; //撤回并删除按钮loading状态
35 35
   btnLoading: boolean = false; //确认按钮loading状态
36
-
36
+	allShow: boolean = true; //先全部隐藏
37 37
   ngOnInit() {
38 38
     this.getInfo();
39 39
     this.initForm();
@@ -80,7 +80,7 @@ export class AppraiseDetailComponent implements OnInit {
80 80
   // 获取工单历史记录
81 81
   logList = []; //工单历史记录
82 82
   getLog() {
83
-    return this.mainService.getWorkOrderLog(this.orderInfo["workOrderObj"].id);
83
+    return this.mainService.getWorkOrderLog(this.orderInfo.workOrder);
84 84
   }
85 85
 
86 86
   // 获取所有院区

+ 6 - 2
src/app/share/businessData-detail-info-modal/businessData-detail-info-modal.component.html

@@ -10,15 +10,16 @@
10 10
       <div>发药科室:{{drugsBag.launch ? drugsBag.launch.dept : ''}}</div>
11 11
     </div>
12 12
     <div class="content">
13
-      <ng-container *ngIf="type === 'drugsJpbag' || type === 'drugsWestern' || type === 'drugsReturn' || type === 'drugsPoison' || type === 'drugsHerbal'">
13
+      <ng-container *ngIf="configs.showDrugsBagDetails === 1 && (type === 'drugsJpbag' || type === 'drugsWestern' || type === 'drugsReturn' || type === 'drugsPoison' || type === 'drugsHerbal')">
14 14
         <!-- 新药品 -->
15 15
         <nz-table class="hospitalTable" [nzData]="drugsBugSingleList" nzSize="middle" [nzShowPagination]="false"
16 16
           [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
17 17
           <thead>
18 18
             <tr class="thead">
19 19
               <th nzWidth="5%">序号</th>
20
-              <th nzWidth="85%">药品名称+规格</th>
20
+              <th nzWidth="65%">药品名称+规格</th>
21 21
               <th nzWidth="10%">数量</th>
22
+							<th nzWidth="20%" *ngIf="configs.showPatientInfo==1">患者信息</th>
22 23
             </tr>
23 24
           </thead>
24 25
           <tbody>
@@ -26,6 +27,9 @@
26 27
               <td>{{i+1}}</td>
27 28
               <td>{{ data.drugsInfo }} {{ data.model }}</td>
28 29
               <td>{{ data.drugsNum }}</td>
30
+							<td nz-tooltip [nzTooltipTitle]="data.patientNames" *ngIf="configs.showPatientInfo==1">
31
+								{{ data.patientNames }}
32
+							</td>
29 33
             </tr>
30 34
           </tbody>
31 35
         </nz-table>

+ 35 - 17
src/app/share/businessData-detail-modal/businessData-detail-modal.component.html

@@ -41,13 +41,14 @@
41 41
         </tbody>
42 42
       </nz-table>
43 43
       <!-- 新药品-一单一码 -->
44
-      <nz-table *ngIf="configs.drugsModel === 1 && (type === 'drugsJpbag' || type === 'drugsWestern' || type === 'drugsReturn' || type === 'drugsPoison' || type === 'drugsHerbal')" class="hospitalTable" [nzData]="drugsBugSingleList" nzSize="middle" [nzShowPagination]="false"
44
+      <nz-table *ngIf="configs.showDrugsBagDetails === 1 && configs.drugsModel === 1 && (type === 'drugsJpbag' || type === 'drugsWestern' || type === 'drugsReturn' || type === 'drugsPoison' || type === 'drugsHerbal')" class="hospitalTable" [nzData]="drugsBugSingleList" nzSize="middle" [nzShowPagination]="false"
45 45
         [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
46 46
         <thead>
47 47
           <tr class="thead">
48 48
             <th nzWidth="5%">序号</th>
49
-            <th nzWidth="85%">药品名称+规格</th>
49
+            <th nzWidth="65%">药品名称+规格</th>
50 50
             <th nzWidth="10%">数量</th>
51
+						<th nzWidth="20%" *ngIf="configs.showPatientInfo==1">患者信息</th>
51 52
           </tr>
52 53
         </thead>
53 54
         <tbody>
@@ -55,6 +56,9 @@
55 56
             <td>{{i+1}}</td>
56 57
             <td>{{ data.drugsInfo }} {{ data.model }}</td>
57 58
             <td>{{ data.drugsNum }}</td>
59
+						<td nz-tooltip [nzTooltipTitle]="data.patientNames" *ngIf="configs.showPatientInfo==1">
60
+							{{ data.patientNames }}
61
+						</td>
58 62
           </tr>
59 63
         </tbody>
60 64
       </nz-table>
@@ -65,27 +69,41 @@
65 69
           <tr class="thead">
66 70
             <th nzWidth="5%">序号</th>
67 71
             <th nzWidth="11%">单号</th>
68
-            <th nzWidth="8%">种类数</th>
69
-            <th nzWidth="8%">总数</th>
70
-            <th nzWidth="10%">收取人</th>
71
-            <th nzWidth="10%">收取交接人</th>
72
+						<th nzWidth="10%" *ngIf="configs.showPatientInfo==1">患者信息</th>
73
+            <th nzWidth="8%" *ngIf="configs.showDrugsBagTypeCount==1">种类数</th>
74
+            <th nzWidth="8%" *ngIf="configs.showDrugsBagTypeCount==1">总数</th>
75
+            <th nzWidth="10%">收取人/交接人</th>
76
+            <!-- <th nzWidth="10%">收取交接人</th> -->
72 77
             <th nzWidth="14%">收取时间</th>
73
-            <th nzWidth="10%">送达人</th>
74
-            <th nzWidth="10%">送达交接人</th>
78
+            <th nzWidth="10%">送达人/交接人</th>
79
+            <!-- <th nzWidth="10%">送达交接人</th> -->
75 80
             <th nzWidth="14%">送达时间</th>
76 81
           </tr>
77 82
         </thead>
78 83
         <tbody>
79
-          <tr *ngFor="let data of drugsBugMultipleList;let i = index;" (click)="viewDetail(type, data.id)">
84
+          <tr *ngFor="let data of drugsBugMultipleList;let i = index;" (click)="viewDetail(type, data.id)" [ngStyle]="{ 'cursor': configs.showDrugsBagDetails == 1 ? 'pointer' : '' }">
80 85
             <td>{{i+1}}</td>
81
-            <td>{{ data.packid }}</td>
82
-            <td>{{ data.drugsTypeCount }}</td>
83
-            <td>{{ data.drugsCount }}</td>
84
-            <td><ng-container *ngIf="data.startLog">{{data.startLog.username}}</ng-container></td>
85
-            <td><ng-container *ngIf="data.startLog">{{data.startLog.handoverName}}</ng-container></td>
86
+						<td [ngStyle]="{ 'text-decoration': configs.showDrugsBagDetails == 1 ? 'underline' : '' }">{{ data.packid }}</td>
87
+						<td nz-tooltip [nzTooltipTitle]="data.patientNames" *ngIf="configs.showPatientInfo==1">
88
+							{{ data.patientNames }}
89
+						</td>
90
+            <td *ngIf="configs.showDrugsBagTypeCount==1">{{ data.drugsTypeCount }}</td>
91
+            <td *ngIf="configs.showDrugsBagTypeCount==1">{{ data.drugsCount }}</td>
92
+            <td>
93
+							<ng-container *ngIf="data.startLog">
94
+								<div>{{data.startLog.username}}</div>
95
+								<div>{{data.startLog.handoverName}}</div>
96
+							</ng-container>
97
+						</td>
98
+            <!-- <td><ng-container *ngIf="data.startLog"></ng-container></td> -->
86 99
             <td><ng-container *ngIf="data.startLog">{{data.startLog.operationTime | date:'yyyy-MM-dd HH:mm'}}</ng-container></td>
87
-            <td><ng-container *ngIf="data.endLog">{{data.endLog.username}}</ng-container></td>
88
-            <td><ng-container *ngIf="data.endLog">{{data.endLog.handoverName}}</ng-container></td>
100
+            <td>
101
+							<ng-container *ngIf="data.endLog">
102
+								<div>{{data.endLog.username}}</div>
103
+								<div>{{data.endLog.handoverName}}</div>
104
+							</ng-container>
105
+						</td>
106
+            <!-- <td><ng-container *ngIf="data.endLog"></ng-container></td> -->
89 107
             <td><ng-container *ngIf="data.endLog">{{data.endLog.operationTime | date:'yyyy-MM-dd HH:mm'}}</ng-container></td>
90 108
           </tr>
91 109
         </tbody>
@@ -221,7 +239,7 @@
221 239
         </nz-pagination>
222 240
       </div>
223 241
     </div>
224
-    <div class="display_flex justify-content_flex-center">
242
+    <div class="display_flex justify-content_flex-center bottom-btn">
225 243
       <button class="btn know" nz-button nzType="primary" (click)="hideModal()">知道了</button>
226 244
     </div>
227 245
   </div>

+ 24 - 5
src/app/share/businessData-detail-modal/businessData-detail-modal.component.less

@@ -68,10 +68,22 @@
68 68
   }
69 69
 
70 70
   .modalBody {
71
-    width: 700px;
72
-    background: #fff;
73
-    border-radius: 5px;
74
-    color: #333;
71
+		// height: calc(100vh - 40px);
72
+  //   width: 700px;
73
+  //   background: #fff;
74
+  //   border-radius: 5px;
75
+  //   color: #333;
76
+		// position: relative;
77
+		
78
+		height: calc(100vh - 100px);
79
+		min-height: 580px;
80
+		border-radius: 5px;
81
+		background: #fff;
82
+		color: #333;
83
+		font-size: 14px;
84
+		padding: 12px 20px;
85
+		position: relative;
86
+		padding-bottom: 70px;
75 87
     &.modalBody-search {
76 88
       width: 480px;
77 89
       min-height: 250px;
@@ -158,7 +170,14 @@
158 170
         }
159 171
       }
160 172
     }
161
-
173
+		
174
+		.bottom-btn{
175
+			.btn {
176
+				position: absolute;
177
+				bottom: 10px;
178
+			}
179
+		}
180
+		
162 181
     button {
163 182
       margin-top: 10px;
164 183
       margin-bottom: 10px;

+ 3 - 0
src/app/share/businessData-detail-modal/businessData-detail-modal.component.ts

@@ -433,6 +433,9 @@ export class BusinessDataDetailModalComponent implements OnInit {
433 433
   businessDataModalType = ''; //业务数据类型
434 434
   infoId = ''; //业务数据id
435 435
   viewDetail(type, id) {
436
+    if(this.configs.showDrugsBagDetails != 1){
437
+      return;
438
+    }
436 439
     this.infoId = id;
437 440
     this.businessDataModalType = type;
438 441
     this.businessDataModalShow = true;

+ 1 - 0
src/app/share/detail-drug/detail-drug.component.html

@@ -37,6 +37,7 @@
37 37
                 <i
38 38
                   [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
39 39
                 <p>{{step.operationName}}</p>
40
+								<p>{{step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : ''}}</p>
40 41
                 <p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
41 42
                 <p *ngIf="step.record&&step.record.length&&step.record[0].dept"><span
42 43
                     *ngFor="let dept of step.record">{{!showCoop&&deptDisplay==2?dept.deptalias:dept.dept}},</span></p>

+ 1 - 1
src/app/share/detail-drug/detail-drug.component.less

@@ -6,7 +6,7 @@
6 6
   left: 0;
7 7
   top: 0;
8 8
   background: rgba(0, 0, 0, 0.4);
9
-  z-index: 9;
9
+  z-index: 9999;
10 10
 
11 11
   display: flex;
12 12
   justify-content: center;

+ 19 - 0
src/app/share/detail-ordinary/detail-ordinary.component.html

@@ -38,6 +38,7 @@
38 38
                 <i
39 39
                   [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
40 40
                 <p>{{step.operationName}}</p>
41
+								<p>{{step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : ''}}</p>
41 42
                 <p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
42 43
                 <p *ngIf="step.record[0]&&step.record[0].dept">
43 44
                   <span *ngFor="let dept of step.record">{{!showCoop&&deptDisplay==2?dept.deptalias:dept.dept}},</span>
@@ -70,6 +71,24 @@
70 71
           </div> -->
71 72
         </div>
72 73
 
74
+        <!-- 标本打包 -->
75
+        <div class="info" *ngIf="orderInfo.taskType.ordinaryField.value == 'specimenPackage'">
76
+          <div nz-row class="top">
77
+            <div class="left" nz-col nzSpan="12">
78
+              <p>
79
+                <span class="label">打包码</span>
80
+                <span>{{orderInfo.pathologyPackInfoDTO?.packCode}}</span>
81
+              </p>
82
+            </div>
83
+            <div class="right" nz-col nzSpan="12">
84
+              <p>
85
+                <span class="label">标本数量</span>
86
+                <span>{{orderInfo.pathologyPackInfoDTO?.specimenNum}}</span>
87
+              </p>
88
+            </div>
89
+          </div>
90
+        </div>
91
+
73 92
         <!-- <div class="table">
74 93
           <nz-table class="detailSampleTable" [nzData]="orderInfo.specimenSet" nzSize="small" [nzShowPagination]="null">
75 94
             <thead>

+ 64 - 1
src/app/share/detail-ordinary/detail-ordinary.component.less

@@ -6,7 +6,7 @@
6 6
   left: 0;
7 7
   top: 0;
8 8
   background: rgba(0, 0, 0, 0.4);
9
-  z-index: 9;
9
+  z-index: 9999;
10 10
   display: flex;
11 11
   justify-content: center;
12 12
   align-items: center;
@@ -174,6 +174,69 @@
174 174
           }
175 175
         }
176 176
       }
177
+
178
+      .info {
179
+        width: 100%;
180
+        height: 100%;
181
+        background: #fff;
182
+        border-radius: 5px;
183
+        border: 1px solid #e5e9ed;
184
+        padding: 24px 28px 14px 28px;
185
+        margin-bottom: 8px;
186
+
187
+        .top {
188
+          .left {
189
+            border-right: 1px dashed #e5e9ed;
190
+
191
+            p {
192
+              padding: 0 70px 0 102px;
193
+              overflow: hidden;
194
+
195
+              & > span:nth-child(1) {
196
+                float: left;
197
+              }
198
+
199
+              & > span:nth-child(2) {
200
+                float: right;
201
+                color: #666;
202
+                text-align: right;
203
+                max-width: 175px;
204
+              }
205
+            }
206
+          }
207
+
208
+          .right {
209
+            p {
210
+              padding: 0 102px 0 70px;
211
+              overflow: hidden;
212
+
213
+              span:nth-child(1) {
214
+                float: left;
215
+              }
216
+
217
+              span:nth-child(2) {
218
+                float: right;
219
+                color: #666;
220
+                text-align: right;
221
+              }
222
+            }
223
+          }
224
+        }
225
+
226
+        .wait {
227
+          text-align: center;
228
+          margin-top: 7px;
229
+
230
+          i {
231
+            font-size: 24px;
232
+            color: #62c26d;
233
+          }
234
+
235
+          span {
236
+            color: #62c26d;
237
+          }
238
+        }
239
+      }
177 240
     }
178 241
   }
179 242
 

+ 1 - 0
src/app/share/detail-others/detail-others.component.html

@@ -35,6 +35,7 @@
35 35
                 <i
36 36
                   [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
37 37
                 <p>{{step.operationName}}</p>
38
+								<p>{{step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : ''}}</p>
38 39
                 <p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
39 40
                 <p *ngIf="step.record[0]&&step.record[0].dept">
40 41
                   <span *ngFor="let dept of step.record">{{!showCoop&&deptDisplay==2?dept.deptalias:dept.dept}},</span>

+ 1 - 1
src/app/share/detail-others/detail-others.component.less

@@ -6,7 +6,7 @@
6 6
   left: 0;
7 7
   top: 0;
8 8
   background: rgba(0, 0, 0, 0.4);
9
-  z-index: 9;
9
+  z-index: 9999;
10 10
 
11 11
   display: flex;
12 12
   justify-content: center;

+ 1 - 0
src/app/share/detail-patients/detail-patients.component.html

@@ -51,6 +51,7 @@
51 51
                 <i
52 52
                   [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
53 53
                 <p>{{step.operationName}}</p>
54
+								<p>{{step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : ''}}</p>
54 55
                 <p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
55 56
                 <p *ngIf="step.record[0]&&step.record[0].dept">
56 57
                   <span *ngFor="let dept of step.record">{{!showCoop&&deptDisplay==2?dept.deptalias:dept.dept}},</span>

+ 1 - 1
src/app/share/detail-patients/detail-patients.component.less

@@ -6,7 +6,7 @@
6 6
   left: 0;
7 7
   top: 0;
8 8
   background: rgba(0, 0, 0, 0.4);
9
-  z-index: 9;
9
+  z-index: 9999;
10 10
   display: flex;
11 11
   justify-content: center;
12 12
   align-items: center;

+ 1 - 0
src/app/share/detail-sample/detail-sample.component.html

@@ -35,6 +35,7 @@
35 35
                 <i
36 36
                   [ngClass]="{'icon_transport':true, 'transport-icon_liucheng':true,'green':(step.record&&step.record[0]&&step.record[0].operationTime)}"></i>
37 37
                 <p>{{step.operationName}}</p>
38
+								<p>{{step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : ''}}</p>
38 39
                 <p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
39 40
                 <p *ngIf="step.record[0]&&step.record[0].dept">
40 41
                   <span *ngFor="let dept of step.record">{{!showCoop&&deptDisplay==2?dept.deptalias:dept.dept}},</span>

+ 1 - 1
src/app/share/detail-sample/detail-sample.component.less

@@ -6,7 +6,7 @@
6 6
   left: 0;
7 7
   top: 0;
8 8
   background: rgba(0, 0, 0, 0.4);
9
-  z-index: 9;
9
+  z-index: 9999;
10 10
   display: flex;
11 11
   justify-content: center;
12 12
   align-items: center;

+ 12 - 1
src/app/share/dialog-delete/dialog-delete.component.html

@@ -1,5 +1,5 @@
1 1
 <!-- 删除模态框 -->
2
-<div class="dialog-delete" *ngIf="delModal" [ngStyle]="{'z-index': isSelected ? '9' : '9999999'}">
2
+<div class="dialog-delete" *ngIf="delModal" [ngStyle]="{'z-index': (isSelected || isShowEndDeptId) ? '9' : '9999999'}">
3 3
   <div class="modalBody" [ngStyle]="{'height': isSelected ? 'auto' : '220px'}">
4 4
     <div class="title">提示<i class="icon_transport transport-guanbi" (click)="hideDelModal('x')"></i></div>
5 5
     <div class="content">
@@ -21,6 +21,17 @@
21 21
           </nz-option>
22 22
         </nz-select>
23 23
       </div>
24
+      <div *ngIf="isShowEndDeptId" class="mt8 mb8 w100">
25
+        <nz-select class="w100" [nzDropdownMatchSelectWidth]="false" nzShowSearch nzPlaceHolder="请选择终点科室" [(ngModel)]="endDeptId">
26
+          <ng-container *ngFor="let option of isShowEndDeptIdArr">
27
+            <nz-option *ngIf="!isLoading" [nzLabel]="deptDisplay == 2 ? option.deptalias : option.dept" [nzValue]="option.id"></nz-option>
28
+          </ng-container>
29
+          <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
30
+            <i nz-icon nzType="loading" class="loading-icon"></i>
31
+            搜索中...
32
+          </nz-option>
33
+        </nz-select>
34
+      </div>
24 35
     </div>
25 36
     <div class="operate">
26 37
       <button nz-button nzType="primary" (click)="cancel('cancel')" *ngIf="!isShowConfirm">知道了</button>

+ 2 - 1
src/app/share/dialog-delete/dialog-delete.component.less

@@ -12,7 +12,7 @@
12 12
 
13 13
   .modalBody {
14 14
     width: 350px;
15
-    height: 220px;
15
+    min-height: 220px;
16 16
     background: #fff;
17 17
     border-radius: 8px;
18 18
     padding: 8px 16px;
@@ -46,6 +46,7 @@
46 46
       flex-direction: column;
47 47
       align-items: center;
48 48
       justify-content: center;
49
+      padding: 0 16px;
49 50
 
50 51
       .defeat{
51 52
         width: 100%;

+ 13 - 0
src/app/share/dialog-delete/dialog-delete.component.ts

@@ -22,11 +22,14 @@ export class DialogDeleteComponent implements OnInit, OnChanges {
22 22
   @Input() deptDisplay: number = 0;
23 23
   @Input() isShowConfirm: boolean = true;
24 24
   @Input() isShowConfirmInfo: string = '';
25
+  @Input() isShowEndDeptId: boolean = false;
26
+  @Input() isShowEndDeptIdArr: any[] = [];
25 27
   constructor(private message: NzMessageService) {}
26 28
 
27 29
   isRemandClean:boolean = true;
28 30
   isLoading:boolean = false;
29 31
   recoveryRoom:any = null;
32
+  endDeptId:any = null;
30 33
 
31 34
   ngOnInit() {}
32 35
 
@@ -36,6 +39,9 @@ export class DialogDeleteComponent implements OnInit, OnChanges {
36 39
       this.isLoading = false;
37 40
       // this.recoveryRoom = null;
38 41
     }
42
+    if(changes.isShowEndDeptId){
43
+      this.endDeptId = null;
44
+    }
39 45
     if(changes.isSelected && changes.isSelectedArr){
40 46
       if(changes.isSelectedArr.currentValue.length === 1){
41 47
         this.recoveryRoom = changes.isSelectedArr.currentValue[0].id;
@@ -55,6 +61,10 @@ export class DialogDeleteComponent implements OnInit, OnChanges {
55 61
       this.message.info('请选择苏醒科室!');
56 62
       return;
57 63
     }
64
+    if(this.isShowEndDeptId && !this.endDeptId){
65
+      this.message.info('请选择终点科室!');
66
+      return;
67
+    }
58 68
     let data:any = {};
59 69
     if(this.isChecked){
60 70
       data.isRemandClean = this.isRemandClean;
@@ -62,6 +72,9 @@ export class DialogDeleteComponent implements OnInit, OnChanges {
62 72
     if(this.isSelected){
63 73
       data.recoveryRoom = this.recoveryRoom;
64 74
     }
75
+    if(this.isShowEndDeptId){
76
+      data.endDeptId = this.endDeptId;
77
+    }
65 78
     this.confirmDelEvent.emit(data);
66 79
   }
67 80
 

+ 4 - 0
src/app/share/hs-prompt-modal/hs-prompt-modal.component.ts

@@ -38,6 +38,7 @@ export class HsPromptModalComponent implements OnInit {
38 38
   searchDeptSubject = new Subject();
39 39
   deptDisplay; //护士端是否显示可以别名,1是显示科室名称,2是显示科室别名
40 40
   deptDisplayLoading: boolean = false;
41
+	user:any;
41 42
   ngOnInit() {
42 43
     this.deptDisplayLoading = true;
43 44
     this.tool.getDeptDisplay().subscribe((result) => {
@@ -52,6 +53,7 @@ export class HsPromptModalComponent implements OnInit {
52 53
     this.hospitals = this.tool.getHospitalList();
53 54
     this.currentHospital = this.tool.getCurrentHospital();
54 55
     this.currentDept = this.tool.getCurrentUserDept();
56
+		this.user = this.tool.getCurrentUserInfo();
55 57
     this.initForm();
56 58
   }
57 59
   initForm() {
@@ -110,6 +112,8 @@ export class HsPromptModalComponent implements OnInit {
110 112
       if (result.status == 200) {
111 113
         let dataObj = {
112 114
           user: {
115
+						account: this.user.account,
116
+						upType: "changeDept",
113 117
             dept: {
114 118
               id: this.validateForm.controls.dutyDeptFc.value,
115 119
             },

+ 13 - 0
src/app/share/inspection-execute-detail/inspection-execute-detail.component.html

@@ -81,6 +81,19 @@
81 81
               </div>
82 82
             </div>
83 83
           </div>
84
+          <div class="top" *ngIf="orderInfo.incidentDTO">
85
+            <div class="info" nz-row>
86
+              <div nz-col nzSpan="8">
87
+                关联故障单:{{ orderInfo.incidentDTO.incidentsign }}
88
+              </div>
89
+              <div nz-col nzSpan="8">
90
+                状态:{{ orderInfo.incidentDTO.state?.name }}
91
+              </div>
92
+              <div nz-col nzSpan="8">
93
+                处理人/组:{{ orderInfo.incidentDTO.groupORHandlerUser }}
94
+              </div>
95
+            </div>
96
+          </div>
84 97
         </div>
85 98
       </div>
86 99
     </overlay-scrollbars>

+ 30 - 11
src/app/share/order-detail/order-detail.component.html

@@ -129,6 +129,7 @@
129 129
                     }"
130 130
                   ></i>
131 131
                   <p>{{ step.operationName }}</p>
132
+									<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
132 133
 									<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):'' }}</p>
133 134
                   <p>{{ step.record ? step.record.operationtime : "" }}</p>
134 135
                   <p
@@ -256,6 +257,7 @@
256 257
                     }"
257 258
                   ></i>
258 259
                   <p>{{ step.operationName }}</p>
260
+									<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
259 261
 									<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
260 262
                   <p>{{ step.record ? step.record.operationtime : "" }}</p>
261 263
                   <p
@@ -366,6 +368,7 @@
366 368
                     }"
367 369
                   ></i>
368 370
                   <p>{{ step.operationName }}</p>
371
+									<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
369 372
 									<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
370 373
                   <p>{{ step.record ? step.record.operationtime : "" }}</p>
371 374
                   <p
@@ -476,6 +479,7 @@
476 479
                     }"
477 480
                   ></i>
478 481
                   <p>{{ step.operationName }}</p>
482
+									<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
479 483
 									<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
480 484
                   <p>{{ step.record ? step.record.operationtime : "" }}</p>
481 485
                   <p
@@ -720,7 +724,8 @@
720 724
                     }"
721 725
                   ></i>
722 726
                   <p>{{ step.operationName }}</p>
723
-									<p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
727
+									<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
728
+									<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):'' }}</p>
724 729
                   <p>{{ step.record ? step.record.operationtime : "" }}</p>
725 730
                   <p
726 731
                     *ngIf="
@@ -949,7 +954,8 @@
949 954
                   }"
950 955
                 ></i>
951 956
                 <p>{{ step.operationName }}</p>
952
-								<p>{{step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):''}}</p>
957
+								<p>{{ step.record.length>=1 && step.operationName=='申请' ? step.record[0].username : '' }}</p>
958
+								<p>{{ step.record.length>=1?(step.record[0].operationTime|date:'MM-dd HH:mm'):'' }}</p>
953 959
                 <p>{{ step.record ? step.record.operationtime : "" }}</p>
954 960
                 <p
955 961
                   *ngIf="
@@ -975,6 +981,25 @@
975 981
           </div>
976 982
         </div>
977 983
       </div>
984
+      <!-- 标本打包 -->
985
+      <div class="bottom">
986
+        <div class="info" *ngIf="orderInfo.taskType.ordinaryField.value == 'specimenPackage'">
987
+            <div nz-row class="top">
988
+              <div class="left" nz-col nzSpan="12">
989
+                <p>
990
+                  <span class="label">打包码</span>
991
+                  <span>{{orderInfo.pathologyPackInfoDTO?.packCode}}</span>
992
+                </p>
993
+              </div>
994
+              <div class="right" nz-col nzSpan="12">
995
+                <p>
996
+                  <span class="label">标本数量</span>
997
+                  <span>{{orderInfo.pathologyPackInfoDTO?.specimenNum}}</span>
998
+                </p>
999
+              </div>
1000
+            </div>
1001
+          </div>
1002
+      </div>
978 1003
     </div>
979 1004
     </overlay-scrollbars>
980 1005
     <!-- 评价内容 -->
@@ -987,24 +1012,18 @@
987 1012
         <div class="msg">
988 1013
           <div>
989 1014
             评价等级:{{
990
-              orderInfo.evaluationDetails
991
-                ? orderInfo.evaluationDetails.serviceEvaluation.name
992
-                : ""
1015
+              orderInfo.evaluationLevel ? orderInfo.evaluationLevel.name:'-'
993 1016
             }}
994 1017
           </div>
995 1018
           <div>
996 1019
             评价人:{{
997
-              orderInfo.evaluationDetails
998
-                ? orderInfo.evaluationDetails.evalutationUser.name
999
-                : ""
1020
+              orderInfo.evaluatorDTO?orderInfo.evaluatorDTO.name:''
1000 1021
             }}
1001 1022
           </div>
1002 1023
         </div>
1003 1024
         <div class="con">
1004 1025
           意见内容:{{
1005
-            orderInfo.evaluationDetails
1006
-              ? orderInfo.evaluationDetails.remark
1007
-              : ""
1026
+            orderInfo.evaluationContent
1008 1027
           }}
1009 1028
         </div>
1010 1029
       </div>

+ 35 - 0
src/app/share/package-specimen-rule/package-specimen-rule.component.html

@@ -0,0 +1,35 @@
1
+<div class="save add display_flex align-items_center justify-content_flex-center">
2
+  <div class="modalBody">
3
+    <div class="title">自动清点规则<i class="icon_transport transport-guanbi" (click)="hideModal()"></i>
4
+    </div>
5
+    <div class="content">
6
+      <div class="block">
7
+        <div class="name">标本紧急度:</div>
8
+        <div class="value">
9
+          <ng-container *ngFor="let item of configs.spePackageUrgentsList;let last = last">
10
+            {{item.name}}<ng-container *ngIf="!last">、</ng-container>
11
+          </ng-container>
12
+        </div>
13
+      </div>
14
+      <div class="block">
15
+        <div class="name">关联检验科室:</div>
16
+        <div class="value">
17
+          <ng-container *ngFor="let item of configs.spePackageDeptList;let last = last">
18
+            {{item.dept}}<br *ngIf="!last">
19
+          </ng-container>
20
+        </div>
21
+      </div>
22
+      <div class="block">
23
+        <div class="name">关联试管类型:</div>
24
+        <div class="value">
25
+          <ng-container *ngFor="let item of configs.spePackageTubeList;let last = last">
26
+            {{item.name}}<ng-container *ngIf="!last">、</ng-container>
27
+          </ng-container>
28
+        </div>
29
+      </div>
30
+    </div>
31
+    <div class="display_flex justify-content_flex-center">
32
+      <button class="btn cancel" nz-button nzType="default" (click)="hideModal()">取消</button>
33
+    </div>
34
+  </div>
35
+</div>

+ 154 - 0
src/app/share/package-specimen-rule/package-specimen-rule.component.less

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

+ 70 - 0
src/app/share/package-specimen-rule/package-specimen-rule.component.ts

@@ -0,0 +1,70 @@
1
+import { Component, OnInit, Output, Input } from '@angular/core';
2
+import { EventEmitter } from '@angular/core';
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { MainService } from 'src/app/services/main.service';
5
+
6
+@Component({
7
+  selector: 'app-package-specimen-rule',
8
+  templateUrl: './package-specimen-rule.component.html',
9
+  styleUrls: ['./package-specimen-rule.component.less']
10
+})
11
+export class PackageSpecimenRuleComponent implements OnInit {
12
+  @Output() cancelFlagHand = new EventEmitter();
13
+  constructor(
14
+    private mainService: MainService,
15
+    private tool: ToolService,
16
+  ) { }
17
+
18
+  hosId:any = this.tool.getCurrentHospital().id; //当前院区
19
+
20
+  ngOnInit() {
21
+    this.getConfig();
22
+  }
23
+  // 隐藏模态框
24
+  hideModal() {
25
+    this.cancelFlagHand.emit(false)
26
+  }
27
+
28
+  // 获取配置
29
+  configs:any = {};
30
+  spePackageUrgents = {
31
+    '0': '普标',
32
+    '1': '急标',
33
+  }
34
+  getConfig() {
35
+		let postData = {
36
+      idx: 0,
37
+      sum: 10,
38
+      taskTypeConfig: {
39
+        taskTypeDTO: {
40
+          hosId: {
41
+            id: this.hosId
42
+          },
43
+          ordinaryField: {
44
+            key:"ordinary_field",
45
+            value: 'specimenPackage'
46
+          }
47
+        }
48
+      }
49
+    };
50
+
51
+    this.mainService
52
+      .getFetchDataList("simple/data", "taskTypeConfig", postData)
53
+      .subscribe((result) => {
54
+        if (result.status == 200) {
55
+          let configs = result.list[0] || {};
56
+
57
+          configs.spePackageDeptList = configs.spePackageDeptList || [];
58
+          configs.spePackageTubeList = configs.spePackageTubeList || [];
59
+          if(configs.spePackageUrgents){
60
+            configs.spePackageUrgentsList = configs.spePackageUrgents.split(',').map(v => ({ name: this.spePackageUrgents[v] }));
61
+          }else{
62
+            configs.spePackageUrgentsList = [];
63
+          }
64
+
65
+          this.configs = configs;
66
+        }
67
+      });
68
+  }
69
+}
70
+

+ 3 - 2
src/app/share/pathology-add/pathology-add.component.html

@@ -125,9 +125,10 @@
125 125
 					
126 126
 					<nz-form-item class="form-item">
127 127
 						<nz-form-label nzRequired [nzSm]="3" [nzXs]="24">标本</nz-form-label>
128
-						<div class="add-icon-class" (click)='openSpecimen()'>
128
+						<div class="add-icon-class" (click)='openSpecimen()' *ngIf="(pathologyFrozenSpecimen && specimenList.length==0) || !pathologyFrozenSpecimen">
129 129
 							<span class="icon_transport transport-tag27fuben form-icon"></span>
130 130
 						</div>
131
+						<span *ngIf="pathologyFrozenSpecimen" class="text-prompt">{{ prompt }}</span>
131 132
 					</nz-form-item>
132 133
 					
133 134
 					<div class="specimen-list">
@@ -239,7 +240,7 @@
239 240
 		</div>
240 241
 		<div class="display_flex justify-content_flex-center bottom-btn">
241 242
 			<button class="btn btn-right" nz-button nzType="primary" (click)="submitSpecimen(1)" [nzLoading]="btnSpLoading">确定</button>
242
-			<button class="btn btn-right" nz-button nzType="primary" (click)="submitSpecimen(2)">新增下一个标本</button>
243
+			<button *ngIf="!pathologyFrozenSpecimen" class="btn btn-right" nz-button nzType="primary" (click)="submitSpecimen(2)">新增下一个标本</button>
243 244
 			<button class="btn cancel" nz-button nzType="default" (click)="hideSpecimenModal()">取消</button>
244 245
 		</div>
245 246
 	</div>

+ 7 - 0
src/app/share/pathology-add/pathology-add.component.less

@@ -247,6 +247,13 @@
247 247
 		}
248 248
 	}
249 249
 	
250
+	.text-prompt{
251
+		display: flex;
252
+		align-items: center;
253
+		margin-left: 20px;
254
+		color: red;
255
+	}
256
+	
250 257
 }
251 258
 	// 新增
252 259
 	&.add {

+ 19 - 1
src/app/share/pathology-add/pathology-add.component.ts

@@ -67,7 +67,6 @@ export class PathologyAddComponent implements OnInit {
67 67
   ngOnInit() {
68 68
 		this.hosId = this.tool.getCurrentHospital().id;
69 69
 		this.initForm()
70
-		this.getTaskTypesId()
71 70
 		this.fetchDataList()
72 71
 		this.getStationaryLiquid()
73 72
   }
@@ -85,6 +84,9 @@ export class PathologyAddComponent implements OnInit {
85 84
 	pathologyBarCode:any = 1;
86 85
 	ifImmobilization:any = false;
87 86
 	surgeryPathologyLabelSize:any = 1;
87
+	prompt:any;
88
+	pathologyFrozenSpecimen:boolean = false;
89
+	taskTypeConfig:any;
88 90
 	getPathologySys(){
89 91
 		let postData = {
90 92
 			  idx: 0,
@@ -99,6 +101,7 @@ export class PathologyAddComponent implements OnInit {
99 101
 		  .getFetchDataList("simple/data", "taskTypeConfig", postData)
100 102
 		  .subscribe((result) => {
101 103
 		    if (result.status == 200) {
104
+					this.taskTypeConfig = result.list[0]
102 105
 					this.pathologyBarCode = result.list[0].pathologyBarCode?result.list[0].pathologyBarCode:1;
103 106
 					if(result.list[0].surgeryPathologyLabelSize){
104 107
 						this.surgeryPathologyLabelSize = result.list[0].surgeryPathologyLabelSize.value;
@@ -108,6 +111,15 @@ export class PathologyAddComponent implements OnInit {
108 111
 					}else{
109 112
 						this.ifImmobilization = false
110 113
 					}
114
+					
115
+					if(this.detailsData.pathologyFormType==1 && this.taskTypeConfig.pathologyFrozenSpecimenNum==1){
116
+						this.pathologyFrozenSpecimen = true
117
+						this.prompt = this.taskTypeConfig.prompt
118
+						console.log(4444)
119
+					}else{
120
+						this.pathologyFrozenSpecimen = false
121
+						this.prompt = null
122
+					}
111 123
 				}
112 124
 		  });
113 125
 	}
@@ -170,6 +182,8 @@ export class PathologyAddComponent implements OnInit {
170 182
 				if(this.detailsData.intraoperativeFindings){
171 183
 					this.validateForm.controls.intraoperativeFindings.setValue(this.detailsData.intraoperativeFindings);
172 184
 				}
185
+			
186
+				this.getTaskTypesId()
173 187
 				this.getSpecimenName()
174 188
 				this.getProDicData()
175 189
 				this.getDicData()
@@ -205,6 +219,10 @@ export class PathologyAddComponent implements OnInit {
205 219
 	// 快捷标本点击
206 220
 	specimenEditType:any = null;
207 221
 	fastSpecimenClick(e, item, index){
222
+		if(this.detailsData.pathologyFormType==1 && this.pathologyFrozenSpecimen && this.specimenList.length>0){
223
+			this.message.error(this.prompt)
224
+			return
225
+		}
208 226
 		if(item.containPosition==1){
209 227
 			this.isSpinning = true
210 228
 			let data = {

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -59,6 +59,13 @@ import { PathologyAddComponent } from './pathology-add/pathology-add.component';
59 59
 import { PathologyDetailComponent } from './pathology-detail/pathology-detail.component';
60 60
 import { StringToFirstValuePipe } from '../pipes/string-to-first-name.pipe';
61 61
 import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info-modal/businessData-detail-info-modal.component';
62
+import { SelectDateComponent } from './select-date/select-date.component';
63
+import { AddInspectModalComponent } from './add-inspect-modal/add-inspect-modal.component';
64
+import { SelectDateYytimeComponent } from './select-date-yytime/select-date-yytime.component';
65
+import { PackageSpecimenRuleComponent } from './package-specimen-rule/package-specimen-rule.component';
66
+import { SpecimenPackageListModalComponent } from './specimen-package-list-modal/specimen-package-list-modal.component';
67
+import { NgxPrintModule } from 'ngx-print';
68
+import { SpecimenPackageLogPromptModalComponent } from './specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component';
62 69
 
63 70
 @NgModule({
64 71
   declarations: [
@@ -121,6 +128,12 @@ import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info
121 128
     BloodHistoryPromptModalComponent,
122 129
     MedicalWasteHistoryPromptModalComponent,
123 130
     MedicalWasteLogPromptModalComponent,
131
+    SelectDateComponent,
132
+    AddInspectModalComponent,
133
+    SelectDateYytimeComponent,
134
+    PackageSpecimenRuleComponent,
135
+    SpecimenPackageListModalComponent,
136
+    SpecimenPackageLogPromptModalComponent,
124 137
   ],
125 138
   imports: [
126 139
     CommonModule,
@@ -129,6 +142,7 @@ import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info
129 142
     ReactiveFormsModule,
130 143
     OverlayscrollbarsModule,
131 144
     NzIconModule,
145
+    NgxPrintModule,
132 146
   ],
133 147
   exports: [
134 148
     DetailSampleComponent,
@@ -191,6 +205,12 @@ import { BusinessDataDetailInfoModalComponent } from './businessData-detail-info
191 205
     BloodHistoryPromptModalComponent,
192 206
     MedicalWasteHistoryPromptModalComponent,
193 207
     MedicalWasteLogPromptModalComponent,
208
+    SelectDateComponent,
209
+    AddInspectModalComponent,
210
+    SelectDateYytimeComponent,
211
+    PackageSpecimenRuleComponent,
212
+    SpecimenPackageListModalComponent,
213
+    SpecimenPackageLogPromptModalComponent,
194 214
   ]
195 215
 })
196 216
 export class ShareModule { }

+ 92 - 0
src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.html

@@ -0,0 +1,92 @@
1
+<div class="modal display_flex justify-content_flex-center align-items_center">
2
+  <div class="modalBody" style="width: 1200px;">
3
+    <div class="title">科室内打包信息<i class="icon_transport transport-guanbi" (click)="hideModal()"></i></div>
4
+    <div class="list-template w100">
5
+      <div class="list-template__content">
6
+        <div class="list-template__top" nz-row>
7
+          <div nz-col nzXl='24' class="list-template__searchBox">
8
+            <div class="list-template__searchItem">
9
+              <span class="label">状态</span>:
10
+              <nz-select class="formItem" nzAllowClear [nzDropdownMatchSelectWidth]="false" nzShowSearch nzPlaceHolder="请选择状态" [(ngModel)]="searchCriteria.status" (ngModelChange)="selectStatus($event)">
11
+                <nz-option *ngFor="let option of specimentPackageTypeList" [nzLabel]="option.name" [nzValue]="option.id"></nz-option>
12
+              </nz-select>
13
+            </div>
14
+          </div>
15
+        </div>
16
+      </div>
17
+    </div>
18
+    <div class="content">
19
+      <nz-table class="hospitalTable" [nzData]="packageList" nzSize="middle" [nzShowPagination]="false"
20
+        [nzLoading]="hsLoading" [nzScroll]="{ y: '500px' }">
21
+        <thead>
22
+          <tr class="thead">
23
+            <th nzWidth="13%">包号</th>
24
+            <th nzWidth="6%">打包人</th>
25
+            <th nzWidth="15%">打包时间</th>
26
+            <th nzWidth="6%">标本数</th>
27
+            <th nzWidth="6%">配送人</th>
28
+            <th nzWidth="15%">配送时间</th>
29
+            <th nzWidth="6%">接收人</th>
30
+            <th nzWidth="15%">接收时间</th>
31
+            <th nzWidth="8%">状态</th>
32
+            <th nzWidth="10%">操作</th>
33
+          </tr>
34
+        </thead>
35
+        <tbody>
36
+          <tr *ngFor="let data of packageList;let i = index;">
37
+            <td>{{ data.packCode }}</td>
38
+            <td>{{ data.packUserDTO?.name }}</td>
39
+            <td>{{ data.packTime | date: 'yyyy-MM-dd HH:mm'}}</td>
40
+            <td>{{ data.specimenNum }}</td>
41
+            <td>{{ data.deliveryUserDTO?.name }}</td>
42
+            <td>{{ data.deliveryTime | date: 'yyyy-MM-dd HH:mm'}}</td>
43
+            <td>{{ data.receiveUserDTO?.name }}</td>
44
+            <td>{{ data.receiveTime | date: 'yyyy-MM-dd HH:mm'}}</td>
45
+            <td>{{ data.status?.name }}</td>
46
+            <td>
47
+              <div class="coop">
48
+                <span (click)="printPackageByConfig(data)" *ngIf="data.status.value !== '0'">补打</span>
49
+                <span (click)="toSpecimenPackage(data)" *ngIf="data.status.value === '0' || data.status.value === '1'">修改</span>
50
+              </div>
51
+            </td>
52
+          </tr>
53
+        </tbody>
54
+      </nz-table>
55
+
56
+      <div class="pagination">
57
+        <ng-template #totalTemplate let-total> 共 {{ total }} 条 </ng-template>
58
+        <nz-pagination [(nzPageIndex)]="pageIndex" [(nzTotal)]="total"
59
+          [(nzPageSize)]="pageSize" (nzPageIndexChange)="getList()"
60
+          (nzPageSizeChange)="getList()" [nzShowTotal]="totalTemplate">
61
+        </nz-pagination>
62
+      </div>
63
+    </div>
64
+    <div class="display_flex justify-content_flex-center bottom-btn">
65
+      <button class="btn cancel know" nz-button nzType="default" (click)="hideModal()">取消</button>
66
+    </div>
67
+  </div>
68
+</div>
69
+
70
+<!-- 打印的内容 -->
71
+<div id="print-section-package" hidden>
72
+  <!-- 80mm*80mm -->
73
+  <ng-container *ngIf="configs.spePackageCodeSize == 1">
74
+    <div style="overflow: hidden;padding: 4mm;font-size: 4mm;width: 80mm;height: 80mm;">
75
+      <div style="display: flex;">
76
+        <img [src]="base64" style="width: 23mm;height: 23mm;margin-right: 3mm;">
77
+        <div style="flex: 1;">
78
+          <div>包号:{{package.packCode}}</div>
79
+          <div style="margin-top: 3mm;">打包人:{{package.packUserDTO?.name}}</div>
80
+          <div style="margin-top: 3mm;">标本总数:{{package.specimenNum}}</div>
81
+        </div>
82
+      </div>
83
+      <div style="margin-top: 3mm;">打包时间:{{package.packTime | date: 'yyyy-MM-dd HH:mm'}}</div>
84
+      <div style="margin-top: 3mm;">打包科室:{{package.packDeptDTO?.dept}}</div>
85
+      <div style="margin-top: 3mm;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;">终点科室:{{package.targetDeptDTO?.dept}}</div>
86
+      <div style="display: flex;flex-wrap: wrap;">
87
+        <div style="width: 33.33%;margin-top: 3mm;" *ngFor="let item of typeSpecimentList | slice:0:9">{{item.name}}:{{item.size}}</div>
88
+      </div>
89
+    </div>
90
+  </ng-container>
91
+</div>
92
+<button ngxPrint printSectionId="print-section-package" #printBtnPackage hidden [printStyle]="{ '@page': { margin: '0 !important' }, 'body': { margin: '0 !important' } }">打印</button>

+ 261 - 0
src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.less

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

+ 158 - 0
src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.ts

@@ -0,0 +1,158 @@
1
+import { Component, OnInit, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';
2
+import { MainService } from '../../services/main.service';
3
+import { ToolService } from 'src/app/services/tool.service';
4
+import { format, startOfDay, endOfDay } from 'date-fns';
5
+import { NzMessageService } from 'ng-zorro-antd';
6
+import { Router } from '@angular/router';
7
+@Component({
8
+  selector: 'app-specimen-package-list-modal',
9
+  templateUrl: './specimen-package-list-modal.component.html',
10
+  styleUrls: ['./specimen-package-list-modal.component.less']
11
+})
12
+export class SpecimenPackageListModalComponent implements OnInit {
13
+  @ViewChild('printBtnPackage', { static: false }) printBtnPackage: ElementRef<HTMLElement>;
14
+  // 切换科室,切换弹窗
15
+  hosId;
16
+  hsLoading = false;
17
+  packageList: any = [];// 标本列表
18
+  pageIndex: number = 1;//表格当前页码
19
+  pageSize: number = 10;//表格每页展示条数
20
+  total: number = 0;//表格总数据量
21
+  searchCriteria:any = {}
22
+
23
+  deptId = this.tool.getCurrentUserDept().id;
24
+  @Input() specimenPackageStateValue = '';
25
+  @Output() closeModelHs = new EventEmitter<any>();//1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
26
+
27
+  constructor(
28
+    private mainService: MainService,
29
+    private tool: ToolService,
30
+    private message: NzMessageService,
31
+    public router: Router,
32
+  ) { }
33
+
34
+  ngOnInit() {
35
+    this.hosId = this.tool.getCurrentHospital().id;
36
+
37
+    this.getStatusList();
38
+  }
39
+  // 关闭弹窗
40
+  hideModal() {
41
+    this.closeModelHs.emit(JSON.stringify({ show: false }));//emits(向上弹射)事件
42
+  }
43
+
44
+  // 切换状态下拉框
45
+  selectStatus(e){
46
+    this.getSpecimenPackageList(1);
47
+  }
48
+
49
+  // 分页获取数据
50
+  getList(){
51
+    this.getSpecimenPackageList();
52
+  }
53
+
54
+  // 获取状态
55
+  specimentPackageTypeList: any[] = [];
56
+  getStatusList() {
57
+    this.mainService.getDictionary("list", "pathology_pack_status").subscribe((data:any) => {
58
+      this.specimentPackageTypeList = data || [];
59
+
60
+      let obj = this.specimentPackageTypeList.find(v => v.value == this.specimenPackageStateValue);
61
+      if(obj){
62
+        this.searchCriteria.status = obj.id;
63
+      }
64
+      this.getSpecimenPackageList(1);
65
+    })
66
+  }
67
+
68
+  // 获取标本列表
69
+  getSpecimenPackageList(idx?) {
70
+    if (idx) {
71
+      this.pageIndex = 1;
72
+    }
73
+    let postData = {
74
+      idx: this.pageIndex - 1,
75
+      sum: this.pageSize,
76
+      pathologyPackInfo: {
77
+        deptId: this.deptId,
78
+        busiType: 'specimen',//标本打包
79
+        status: this.searchCriteria.status ? { id: this.searchCriteria.status } : undefined,
80
+      }
81
+    }
82
+    this.hsLoading = true;
83
+    this.mainService.getFetchDataList('simple/data','pathologyPackInfo',postData).subscribe(data => {
84
+      this.hsLoading = false;
85
+      this.packageList = data.list || [];
86
+      this.total = data.totalNum || 0;
87
+    })
88
+  }
89
+
90
+  // 修改
91
+  toSpecimenPackage(data){
92
+    this.router.navigateByUrl(`/batchSpecimen?id=${data.id}`);
93
+  }
94
+
95
+  // 补打
96
+  base64:string = '';
97
+  typeSpecimentList:any[] = [];
98
+  patientSpecimentList:any[] = [];
99
+  package:any = {};
100
+  printPackage(item){
101
+    this.mainService
102
+      .makeQrCode({}, item.packCode)
103
+      .subscribe((data:any) => {
104
+        if (data.state == 200) {
105
+          this.typeSpecimentList = data.tube || [];
106
+          this.patientSpecimentList = data.patient || [];
107
+          let packageDTO:any = data.package || {};
108
+          if(packageDTO.endDeptList){
109
+            packageDTO.endDeptNames = packageDTO.endDeptList.map(v => v.dept).toString();
110
+          }else{
111
+            packageDTO.endDeptNames = "";
112
+          }
113
+          this.package = packageDTO;
114
+
115
+          this.base64 = data.base64 || '';
116
+
117
+          this.message.success("操作成功");
118
+          setTimeout(()=>{
119
+            this.printBtnPackage.nativeElement.click();
120
+          },0)
121
+        } else {
122
+          this.message.error(data.msg || "操作失败");
123
+        }
124
+      });
125
+  }
126
+
127
+  // 获取配置
128
+  configs:any = {};
129
+  printPackageByConfig(data) {
130
+		let postData = {
131
+      idx: 0,
132
+      sum: 10,
133
+      taskTypeConfig: {
134
+        taskTypeDTO: {
135
+          hosId: {
136
+            id: this.hosId
137
+          },
138
+          ordinaryField: {
139
+            key:"ordinary_field",
140
+            value: 'specimenPackage'
141
+          }
142
+        }
143
+      }
144
+    };
145
+
146
+    this.mainService
147
+      .getFetchDataList("simple/data", "taskTypeConfig", postData)
148
+      .subscribe((result) => {
149
+        if (result.status == 200) {
150
+          this.configs = result.list[0] || {};
151
+          this.printPackage(data);
152
+        }
153
+      });
154
+  }
155
+}
156
+
157
+
158
+

+ 56 - 0
src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.html

@@ -0,0 +1,56 @@
1
+<div
2
+  class="modal display_flex justify-content_flex-center align-items_center"
3
+  *ngIf="show"
4
+>
5
+  <div class="modalBody">
6
+    <div class="title">
7
+      流程信息查看<i
8
+        class="icon_transport transport-guanbi"
9
+        (click)="hideModal()"
10
+      ></i>
11
+    </div>
12
+    <div class="content">
13
+      <nz-table
14
+        class="hospitalTable"
15
+        [nzData]="historySpecimenList"
16
+        nzSize="middle"
17
+        [nzShowPagination]="false"
18
+        [nzLoading]="hsLoading"
19
+      >
20
+        <thead>
21
+          <tr class="thead">
22
+            <th nzWidth="8%">序号</th>
23
+            <th nzWidth="23%">动作</th>
24
+            <th nzWidth="23%">时间</th>
25
+            <th nzWidth="23%">备注</th>
26
+            <th nzWidth="23%">操作人</th>
27
+          </tr>
28
+        </thead>
29
+        <tbody>
30
+          <tr *ngFor="let data of historySpecimenList; let i = index">
31
+            <td>{{ i+(historySpecimenPageIndex-1) * historySpecimenPageSize + 1 }}</td>
32
+            <td>{{ data.operationType?.name }}</td>
33
+            <td>{{ data.createTime | date: "MM-dd HH:mm:ss" }}</td>
34
+            <td>{{ data.logRemarks }}</td>
35
+            <td>{{ data.operationUserDTO?.name }}</td>
36
+          </tr>
37
+        </tbody>
38
+      </nz-table>
39
+      <div class="pagination">
40
+        <nz-pagination
41
+          [(nzPageIndex)]="historySpecimenPageIndex"
42
+          [(nzTotal)]="historySpecimenListLength"
43
+          [(nzPageSize)]="historySpecimenPageSize"
44
+          (nzPageIndexChange)="getHistorySpecimen()"
45
+          (nzPageSizeChange)="getHistorySpecimen()"
46
+        >
47
+        </nz-pagination>
48
+      </div>
49
+    </div>
50
+    <div class="display_flex justify-content_flex-center">
51
+      <button class="btn cancel" nz-button (click)="hideModal()">
52
+        关闭
53
+      </button>
54
+    </div>
55
+  </div>
56
+</div>

+ 165 - 0
src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.less

@@ -0,0 +1,165 @@
1
+@import "../../../../src/theme.less";
2
+.modal {
3
+  position: fixed;
4
+  left: 0;
5
+  top: 0;
6
+  width: 100%;
7
+  height: 100%;
8
+  background: rgba(0, 0, 0, 0.4);
9
+  z-index: 999;
10
+  .hospitalTable {
11
+    width: 100%;
12
+    td {
13
+      text-align: center !important;
14
+    }
15
+    .thead {
16
+      background-image: linear-gradient(to right, @bg-start, @bg-end);
17
+      th {
18
+        text-align: center !important;
19
+        color: #fff;
20
+        background: transparent;
21
+      }
22
+    }
23
+  }
24
+
25
+  .pagination{
26
+    padding: 8px;
27
+    margin-left: auto;
28
+  }
29
+
30
+  .modalBody {
31
+    width: 700px;
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
+    .content {
60
+      min-height: 117px;
61
+      background: #f9fafb;
62
+      border: 1px solid #e5e9ed;
63
+      border-radius: 5px;
64
+      overflow: hidden;
65
+      margin-top: 12px;
66
+      display: flex;
67
+      flex-direction: column;
68
+      justify-content: center;
69
+      align-items: center;
70
+      &.content-search {
71
+        min-height: 147px;
72
+        justify-content: start;
73
+        .defeat-search {
74
+          width: 100%;
75
+          height: 52px;
76
+          display: flex;
77
+          justify-content: center;
78
+          align-items: center;
79
+          border-bottom: solid 1px #e5e9ed;
80
+          em {
81
+            color: #666;
82
+            font-style: normal;
83
+          }
84
+        }
85
+        .form {
86
+          width: 100%;
87
+          padding: 0 16px;
88
+          .ant-form-item-label,
89
+          .ant-form-explain {
90
+            text-align: left !important;
91
+          }
92
+        }
93
+      }
94
+
95
+      div {
96
+        &.defeat {
97
+          color: #333;
98
+          font-size: 28px;
99
+        }
100
+        &.countDown {
101
+          font-size: 14px;
102
+          color: 666;
103
+          em {
104
+            font-style: normal;
105
+            color: @primary-color;
106
+          }
107
+        }
108
+
109
+        &:nth-child(3) {
110
+          font-size: 14px;
111
+          color: #666;
112
+          padding-bottom: 10px;
113
+        }
114
+      }
115
+    }
116
+
117
+    button {
118
+      margin-top: 10px;
119
+
120
+      &.btn {
121
+        margin-left: 8px;
122
+      }
123
+    }
124
+  }
125
+
126
+  // 新增
127
+  &.add {
128
+    .modalBody {
129
+      width: 480px;
130
+      height: auto;
131
+
132
+      .content {
133
+        width: 100%;
134
+        height: auto;
135
+        padding: 18px 14px 0 14px;
136
+
137
+        .addForm {
138
+          .ant-form-item {
139
+            margin-bottom: 15px;
140
+
141
+            .ant-form-item-label {
142
+              line-height: 0;
143
+            }
144
+          }
145
+        }
146
+
147
+        .editForm {
148
+          .ant-form-item {
149
+            margin-bottom: 15px;
150
+
151
+            .ant-form-item-label {
152
+              line-height: 0;
153
+            }
154
+          }
155
+        }
156
+      }
157
+
158
+      button {
159
+        &:nth-child(1) {
160
+          margin-right: 20px;
161
+        }
162
+      }
163
+    }
164
+  }
165
+}

+ 54 - 0
src/app/share/specimen-package-log-prompt-modal/specimen-package-log-prompt-modal.component.ts

@@ -0,0 +1,54 @@
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
+
5
+@Component({
6
+  selector: "app-specimen-package-log-prompt-modal",
7
+  templateUrl: "./specimen-package-log-prompt-modal.component.html",
8
+  styleUrls: ["./specimen-package-log-prompt-modal.component.less"],
9
+})
10
+export class SpecimenPackageLogPromptModalComponent implements OnInit {
11
+  hosId;
12
+  // 切换科室,切换弹窗
13
+  hsLoading = false;
14
+  historySpecimenList: any = [];
15
+  historySpecimenPageIndex: number = 1; //表格当前页码
16
+  historySpecimenPageSize: number = 5; //表格每页展示条数
17
+  historySpecimenListLength: number = 10; //表格总数据量
18
+  @Input() show: Boolean;
19
+  @Input() id: String;
20
+
21
+  @Output() closeModelHs = new EventEmitter<any>(); //1.组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件
22
+
23
+  constructor(private mainService: MainService, private tool: ToolService) {}
24
+
25
+  ngOnInit() {
26
+    this.hosId = this.tool.getCurrentHospital().id;
27
+    this.getHistorySpecimen();
28
+  }
29
+  // 关闭弹窗
30
+  hideModal() {
31
+    this.closeModelHs.emit(JSON.stringify({ show: false })); //emits(向上弹射)事件
32
+  }
33
+  // 获取列表数据
34
+  getHistorySpecimen(idx?) {
35
+    if (idx) {
36
+      this.historySpecimenPageIndex = 1;
37
+    }
38
+    let postData = {
39
+      idx: this.historySpecimenPageIndex - 1,
40
+      sum: this.historySpecimenPageSize,
41
+      pathologyPackLog: {
42
+        packId: this.id,
43
+      },
44
+    };
45
+    this.hsLoading = true;
46
+    this.mainService
47
+      .getFetchDataList("simple/data", "pathologyPackLog", postData)
48
+      .subscribe((data) => {
49
+        this.hsLoading = false;
50
+        this.historySpecimenList = data.list || [];
51
+        this.historySpecimenListLength = data.totalNum || 0;
52
+      });
53
+  }
54
+}

+ 34 - 24
src/app/views/appraise-management/appraise-management.component.html

@@ -7,7 +7,7 @@
7 7
           <nz-select class="formItem" [nzDropdownMatchSelectWidth]="false" [nzShowSearch]="false" nzAllowClear
8 8
             nzPlaceHolder="请选择工单类型" [(ngModel)]="taskType">
9 9
             <ng-container *ngFor="let data of allTaskType">
10
-              <nz-option nzLabel="{{data.taskName}}" nzValue="{{data.id}}"></nz-option>
10
+              <nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}"></nz-option>
11 11
             </ng-container>
12 12
           </nz-select>
13 13
         </div>
@@ -42,6 +42,10 @@
42 42
             <nz-option nzLabel="{{data.name}}" nzValue="{{data.id}}" *ngFor="let data of handleStatus"></nz-option>
43 43
           </nz-select>
44 44
         </div>
45
+				<div class="list-template__searchItem">
46
+				  <span class="label">单号</span>:
47
+				  <input class="formItem" nz-input placeholder="请输入单号" [(ngModel)]="orderNo" />
48
+				</div>
45 49
       </div>
46 50
       <div nz-col nzXl='6' class="list-template__btns">
47 51
         <button nz-button class="btn default" (click)='search()'>搜索</button>
@@ -54,37 +58,40 @@
54 58
         <thead>
55 59
           <tr class="thead">
56 60
             <th nzWidth="5%">序号</th>
57
-            <th nzWidth="10%">工单单号</th>
58
-            <th nzWidth="10%">申请科室</th>
59
-            <th nzWidth="7%">工单类型</th>
60
-            <th nzWidth="10%">发起时间</th>
61
-            <th nzWidth="10%">评价描述</th>
62
-            <th nzWidth="7%">评价等级</th>
63
-            <th nzWidth="10%">执行配送人员</th>
64
-            <th nzWidth="7%">处理状态</th>
65
-            <th nzWidth="7%">调解人</th>
66
-            <th nzWidth="17%">操作</th>
61
+						<th>工单类型</th>
62
+            <th>单号</th>
63
+            <th>申请科室</th>
64
+            <!-- <th>发起时间</th> -->
65
+						<th>执行人</th>
66
+						<th>评价时间</th>
67
+            <th>评价等级</th>
68
+						<th>评价描述</th>
69
+						<th>评价人</th>
70
+            <th>处理状态</th>
71
+            <th nzWidth="180px">操作</th>
67 72
           </tr>
68 73
         </thead>
69 74
         <tbody>
70 75
           <tr *ngFor="let data of listOfData;let index=index;">
71 76
             <td>{{index+(pageIndex-1) * pageSize + 1}}</td>
72
-            <td>{{data.workOrderObj?data.workOrderObj.gdcode:''}}</td>
77
+						<td>{{data.orderType?data.orderType.name:'-'}}</td>
78
+            <td>{{data.orderNo}}</td>
73 79
             <td>{{ data.startDept.dept }}</td>
74
-            <td>{{data.workOrderObj.taskType.taskName}}</td>
75
-            <td>{{timestampToTime(data.startTime)}}</td>
76
-            <td>
77
-              <span style="overflow: hidden;text-overflow: ellipsis;">{{ data.evaluationDetails.remark }}</span>
78
-            </td>
79
-            <td>{{ data.evaluationDetails.serviceEvaluation.name }}</td>
80
-            <td>{{data.worker?data.worker.name:''}}</td>
80
+            <!-- <td>{{timestampToTime(data.startTime)}}</td> -->
81
+						<td>{{data.worker?data.worker.name:''}}</td>
82
+						<td>{{ data.evaluationTime?timestampToTime(data.evaluationTime):'-'}}</td>
83
+						<td>{{ data.evaluationLevel ? data.evaluationLevel.name:'-' }}</td>
84
+						<td>
85
+						  <span style="overflow: hidden;text-overflow: ellipsis;">{{ data.evaluationContent }}</span>
86
+						</td>
87
+            <td>{{data.evaluatorDTO?data.evaluatorDTO.name:''}}</td>
81 88
             <td>{{data.handleStatus.name}}</td>
82
-            <td>{{data.mediationUser?data.mediationUser.name:''}}</td>
83
-            <td>
89
+						<td>
84 90
               <div class="coop">
85
-                <span *ngIf="coopBtns.look" (click)="detail(data.id)">查看</span>
86
-                <span *ngIf="coopBtns.mediate&&data.handleStatus.id==286" (click)="detail(data.id,true)">调解</span>
87
-                <span *ngIf="coopBtns.designate&&data.handleStatus.id==286"
91
+								<span *ngIf="coopBtns.viewGd" (click)="viewDetail(data)">查看工单</span>
92
+                <span *ngIf="coopBtns.look && data.handleStatus.value==2" (click)="detail(data.id)">查看</span>
93
+                <span *ngIf="coopBtns.mediate && data.handleStatus.value==1" (click)="detail(data.id,true)">调解</span>
94
+                <span *ngIf="coopBtns.designate && data.handleStatus.value==1"
88 95
                   (click)="designate(data.id,data.hosId)">指派</span>
89 96
               </div>
90 97
             </td>
@@ -136,3 +143,6 @@
136 143
 
137 144
 <!-- 查看详情 -->
138 145
 <router-outlet (deactivate)="getList()"></router-outlet>
146
+
147
+<!-- 详情 -->
148
+<app-incident-detail [id]="coopData.workOrder" *ngIf="detailModalShow" (closeModelHs)="closeDetailModelOrder($event)" (confirmModelHs)="confirmDetailModelOrder($event)"></app-incident-detail>

+ 39 - 7
src/app/views/appraise-management/appraise-management.component.ts

@@ -29,6 +29,7 @@ export class AppraiseManagementComponent implements OnInit {
29 29
   department: any; //所属科室
30 30
   mediUser: number; //调解人
31 31
   taskType: number; //工单类型
32
+	orderNo:any;
32 33
   allTaskType: any; //所有工单类型
33 34
   allHospital: any; //所有院区
34 35
   pageIndex: number = 1; //页码
@@ -70,7 +71,6 @@ export class AppraiseManagementComponent implements OnInit {
70 71
     this.worker = null;
71 72
     this.mediUser = null;
72 73
     this.status = null;
73
-    this.getAllTaskType();
74 74
     this.getAllWorker();
75 75
     this.getAllMediUser();
76 76
   }
@@ -123,7 +123,6 @@ export class AppraiseManagementComponent implements OnInit {
123 123
       user: {
124 124
         name: e || "",
125 125
         hospital: { id: that.hospital },
126
-        usertype: { id: 107 }, //服务台
127 126
       },
128 127
       idx: 0,
129 128
       sum: 20,
@@ -167,6 +166,11 @@ export class AppraiseManagementComponent implements OnInit {
167 166
       .subscribe((data) => {
168 167
         that.handleStatus = data;
169 168
       });
169
+		that.mainService
170
+		  .getDictionary("list", "order_type")
171
+		  .subscribe((data) => {
172
+		    that.allTaskType = data;
173
+		  });
170 174
   }
171 175
 
172 176
   // 搜索
@@ -178,6 +182,7 @@ export class AppraiseManagementComponent implements OnInit {
178 182
   reset() {
179 183
     this.pageIndex = 1;
180 184
     this.taskType = null;
185
+		this.orderNo = null;
181 186
     this.worker = null;
182 187
     this.mediUser = null;
183 188
     this.status = null;
@@ -191,15 +196,18 @@ export class AppraiseManagementComponent implements OnInit {
191 196
       idx: that.pageIndex - 1,
192 197
       sum: that.pageSize,
193 198
       badEvaluationHandle: {
194
-        taskType: that.taskType || "",
199
+				orderNo: that.orderNo || "",
200
+        orderType: {
201
+					id: that.taskType || "",
202
+				},
195 203
         worker: { id: that.worker || "" },
196 204
         handleStatus: { id: that.status || "" },
197 205
         hosId: that.hospital,
198 206
         mediationUser: { id: that.mediUser },
199 207
       },
200 208
     };
201
-    if (!data.badEvaluationHandle.taskType) {
202
-      delete data.badEvaluationHandle.taskType;
209
+    if (!data.badEvaluationHandle.orderType) {
210
+      delete data.badEvaluationHandle.orderType;
203 211
     }
204 212
     if (!data.badEvaluationHandle.worker.id) {
205 213
       delete data.badEvaluationHandle.worker;
@@ -293,7 +301,29 @@ export class AppraiseManagementComponent implements OnInit {
293 301
     }, 100);
294 302
     this.getList();
295 303
   }
296
-
304
+	
305
+	// 查看工单
306
+	detailModalShow = false; //弹窗开关
307
+	coopData:any;
308
+	viewDetail(data){ // 1:维修 2:配送陪检
309
+		this.coopData = data;
310
+		if(data.orderType.value==1){
311
+			this.detailModalShow = true;
312
+		}else{
313
+			this.router.navigateByUrl("/main/orderManagement/orderDetail/" + data.workOrder);
314
+		}
315
+	}
316
+	
317
+	// 关闭弹窗
318
+	closeDetailModelOrder(e) {
319
+	  this.detailModalShow = JSON.parse(e).show;
320
+	}
321
+	// 弹窗确定
322
+	confirmDetailModelOrder(e){
323
+	  this.detailModalShow = false;
324
+	  this.getList();
325
+	}
326
+	
297 327
   // 查看
298 328
   detail(id, tj?) {
299 329
     if (tj) {
@@ -301,7 +331,9 @@ export class AppraiseManagementComponent implements OnInit {
301 331
         fragment: "tj",
302 332
       });
303 333
     } else {
304
-      this.router.navigate(["/main/appraiseManagement/appraiseDetail/" + id]);
334
+      this.router.navigate(["/main/appraiseManagement/appraiseDetail/" + id],  {
335
+        fragment: "wtj",
336
+      });
305 337
     }
306 338
   }
307 339
 

+ 3 - 2
src/app/views/appraise-management/appraise-management.module.ts

@@ -4,7 +4,7 @@ import { CommonModule } from '@angular/common';
4 4
 import { AppraiseManagementRoutingModule } from './appraise-management-routing.module';
5 5
 import { AppraiseManagementComponent } from './appraise-management.component';
6 6
 import { ShareModule } from 'src/app/share/share.module';
7
-
7
+import { IncidentDetailModule } from 'src/app/components/incidentManagement/incident-detail/incident-detail.module';
8 8
 
9 9
 @NgModule({
10 10
   declarations: [
@@ -13,7 +13,8 @@ import { ShareModule } from 'src/app/share/share.module';
13 13
   imports: [
14 14
     CommonModule,
15 15
     AppraiseManagementRoutingModule,
16
-    ShareModule
16
+    ShareModule,
17
+		IncidentDetailModule,
17 18
   ]
18 19
 })
19 20
 export class AppraiseManagementModule { }

+ 0 - 0
src/app/views/assets-consumable/assets-consumable.component.html


Some files were not shown because too many files changed in this diff