seimin 1 месяц назад
Родитель
Сommit
97dc64c27d
15 измененных файлов с 900 добавлено и 11 удалено
  1. 6 1
      src/app/components/configurationCenter/configuration-drug/configuration-drug.component.html
  2. 12 0
      src/app/components/configurationCenter/configuration-drug/configuration-drug.component.ts
  3. 1 1
      src/app/components/configurationCenter/configuration-message/configuration-message.component.html
  4. 26 2
      src/app/components/configurationCenter/configuration-message/configuration-message.component.ts
  5. 119 0
      src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.html
  6. 303 0
      src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.less
  7. 283 0
      src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.ts
  8. 20 0
      src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.module.ts
  9. 8 1
      src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.html
  10. 2 0
      src/app/components/configurationCenter/configuration-specimen/configuration-specimen.module.ts
  11. 15 5
      src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.html
  12. 57 0
      src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.ts
  13. 6 1
      src/app/views/specimen-package/specimen-package.component.html
  14. 39 0
      src/app/views/specimen-package/specimen-package.component.ts
  15. 3 0
      src/common.less

+ 6 - 1
src/app/components/configurationCenter/configuration-drug/configuration-drug.component.html

@@ -80,7 +80,7 @@
80 80
 
81 81
                   <!-- 终点科室支持核对 -->
82 82
                   <div class="display_flex align-items_center mb8">
83
-                    <nz-form-label class="label">终点科室支持核对</nz-form-label>
83
+                    <nz-form-label class="label" nzRequired>终点科室支持核对</nz-form-label>
84 84
                     <nz-checkbox-group [(ngModel)]="item.postData.drugsEndCheck" (ngModelChange)="changeDrugsEndCheck($event)"></nz-checkbox-group>
85 85
                   </div>
86 86
                   <ng-container *ngIf="item.postData.drugsEndCheck[0].checked">
@@ -127,6 +127,11 @@
127 127
 									  <nz-form-label class="label">交接后,剩余药包是否建单</nz-form-label>
128 128
 									  <nz-checkbox-group [(ngModel)]="item.postData.drugsResidueCreateOrder"></nz-checkbox-group>
129 129
 									</div>
130
+                  <!-- 是否开启紧急配送建单 -->
131
+									<div class="display_flex align-items_center mb8">
132
+									  <nz-form-label class="label">是否开启紧急配送建单</nz-form-label>
133
+									  <nz-checkbox-group [(ngModel)]="item.postData.urgentCreateOrder"></nz-checkbox-group>
134
+									</div>
130 135
                 </div>
131 136
                 <!-- 自动建单配置 -->
132 137
                 <div *ngIf="tabModalName=='automaticOrderCreation'">

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

@@ -74,6 +74,7 @@ export class ConfigurationDrugComponent implements OnInit {
74 74
 				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
75 75
 				sendingMergeOrder: [{ label:'是否开启', value: 0 }],//待送达合并工单
76 76
 				drugsResidueCreateOrder: [{ label:'是否开启', value: 0 }],//交接后,剩余药包是否建单
77
+				urgentCreateOrder: [{ label:'是否开启', value: 0 }],//是否开启紧急配送建单
77 78
 				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
78 79
 				autoCreateState: undefined // 药品自动建单状态
79 80
 			}
@@ -100,6 +101,7 @@ export class ConfigurationDrugComponent implements OnInit {
100 101
 				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
101 102
 				sendingMergeOrder: [{ label:'是否开启', value: 0 }],//待送达合并工单
102 103
         drugsResidueCreateOrder: [{ label:'是否开启', value: 0 }],//交接后,剩余药包是否建单
104
+        urgentCreateOrder: [{ label:'是否开启', value: 0 }],//是否开启紧急配送建单
103 105
 				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
104 106
 				autoCreateState: undefined // 药品自动建单状态
105 107
 			}
@@ -126,6 +128,7 @@ export class ConfigurationDrugComponent implements OnInit {
126 128
 				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
127 129
         sendingMergeOrder: [{ label:'是否开启', value: 0 }],//待送达合并工单
128 130
         drugsResidueCreateOrder: [{ label:'是否开启', value: 0 }],//交接后,剩余药包是否建单
131
+        urgentCreateOrder: [{ label:'是否开启', value: 0 }],//是否开启紧急配送建单
129 132
 				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
130 133
 				autoCreateState: undefined // 药品自动建单状态
131 134
 			}
@@ -152,6 +155,7 @@ export class ConfigurationDrugComponent implements OnInit {
152 155
 				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
153 156
         sendingMergeOrder: [{ label:'是否开启', value: 0 }],//待送达合并工单
154 157
         drugsResidueCreateOrder: [{ label:'是否开启', value: 0 }],//交接后,剩余药包是否建单
158
+        urgentCreateOrder: [{ label:'是否开启', value: 0 }],//是否开启紧急配送建单
155 159
 				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
156 160
 				autoCreateState: undefined // 药品自动建单状态
157 161
 			}
@@ -178,6 +182,7 @@ export class ConfigurationDrugComponent implements OnInit {
178 182
 				showDrugsBagDetails: [{ label:'是否开启', value: 0 }],//是否支持查看药品详情信息
179 183
         sendingMergeOrder: [{ label:'是否开启', value: 0 }],//待送达合并工单
180 184
         drugsResidueCreateOrder: [{ label:'是否开启', value: 0 }],//交接后,剩余药包是否建单
185
+        urgentCreateOrder: [{ label:'是否开启', value: 0 }],//是否开启紧急配送建单
181 186
 				autoCreate: [{ label:'是否开启', value: 0 }], // 是否自动建单
182 187
 				autoCreateState: undefined // 药品自动建单状态
183 188
 			}
@@ -241,6 +246,11 @@ export class ConfigurationDrugComponent implements OnInit {
241 246
       return;
242 247
     }
243 248
 
249
+    if(!this.activeDictionary.postData.drugsEndCheck[0].checked){
250
+      this.msg.create("warning", "终点科室支持核对必填!");
251
+      return;
252
+    }
253
+
244 254
     if(this.activeDictionary.postData.drugsEndCheck[0].checked && !this.activeDictionary.postData.drugsEndCheckScanIds.filter(v => v.checked).length){
245 255
       this.msg.create("warning", "请选择终点科室的核对方式!");
246 256
       return;
@@ -273,6 +283,7 @@ export class ConfigurationDrugComponent implements OnInit {
273 283
 			showDrugsBagDetails: this.activeDictionary.postData.showDrugsBagDetails[0].checked ? 1 : 0,
274 284
 			sendingMergeOrder: this.activeDictionary.postData.sendingMergeOrder[0].checked ? 1 : 0,
275 285
 			drugsResidueCreateOrder: this.activeDictionary.postData.drugsResidueCreateOrder[0].checked ? 1 : 0,
286
+			urgentCreateOrder: this.activeDictionary.postData.urgentCreateOrder[0].checked ? 1 : 0,
276 287
 			autoCreate: this.activeDictionary.postData.autoCreate[0].checked ? 1 : 0,
277 288
 			autoCreateState:{
278 289
 				id:this.activeDictionary.postData.autoCreateState || undefined
@@ -377,6 +388,7 @@ export class ConfigurationDrugComponent implements OnInit {
377 388
 					this.activeDictionary.postData.showDrugsBagDetails[0].checked = this.configs.showDrugsBagDetails == 1;
378 389
 					this.activeDictionary.postData.sendingMergeOrder[0].checked = this.configs.sendingMergeOrder == 1;
379 390
 					this.activeDictionary.postData.drugsResidueCreateOrder[0].checked = this.configs.drugsResidueCreateOrder == 1;
391
+					this.activeDictionary.postData.urgentCreateOrder[0].checked = this.configs.urgentCreateOrder == 1;
380 392
 					this.activeDictionary.postData.autoCreate[0].checked = this.configs.autoCreate == 1;
381 393
 					this.activeDictionary.postData.autoCreateState = this.configs.autoCreateState && this.configs.autoCreateState.id || undefined;
382 394
 				}

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

@@ -63,7 +63,7 @@
63 63
         </div>
64 64
       </div>
65 65
       <div class="message_body">
66
-        <div class="message_body_list" *ngFor="let item of tabs;let i = index;" [hidden]="item.hidden && i != currentIndex">
66
+        <div class="message_body_list" *ngFor="let item of tabs;let i = index;" [hidden]="i != currentIndex">
67 67
           <div class="message_body_list_title" *ngIf="!(i == 1)">
68 68
             <span>通知标题:</span><input nz-input placeholder="请输入通知标题" [(ngModel)]="item.processTitle" [disabled]="item.disable" />
69 69
           </div>

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

@@ -113,7 +113,7 @@ export class ConfigurationMessageComponent implements OnInit {
113 113
           processContent: this.editData.shortMessageContent,
114 114
           checkboxFlag: this.editData.shortMessageFlag,
115 115
           disable: !this.editData.shortMessageFlag,
116
-          hidden: true,
116
+          hidden: false,
117 117
         },
118 118
         {
119 119
           tabName: "微信",
@@ -130,7 +130,31 @@ export class ConfigurationMessageComponent implements OnInit {
130 130
         "[$建单人$]",
131 131
       ];
132 132
 
133
-      this.currentIndex = 2;
133
+      if(data.noticeCode === 'pil_sign_user'){
134
+        // 驻点人员
135
+        this.varArr = [
136
+          "[$患者信息$]",
137
+          "[$建单人$]",
138
+        ];
139
+      }else if(data.noticeCode === 'spe_bag_remove'){
140
+        // 支助人员
141
+        this.varArr = [
142
+          "[$工单单号$]",
143
+          "[$申请科室$]",
144
+          "[$起点科室$]",
145
+          "[$终点科室$]",
146
+          "[$发起时间$]",
147
+          "[$执行人$]",
148
+          "[$状态$]",
149
+          "[$任务类型$]",
150
+          "[$总积分$]",
151
+          "[$执行时长$]",
152
+          "[$患者信息$]",
153
+          "[$删除原因$]",
154
+        ];
155
+      }
156
+
157
+      this.currentIndex = 1;
134 158
     }else if(this.wechatConfigTypeValue === 'mdv2_handle'){
135 159
       // 运维
136 160
       this.tabs = [

+ 119 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.html

@@ -0,0 +1,119 @@
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>
9
+            <div nz-col nzXl="7" class="list-template__btns">
10
+              <button nz-button class="btn default" (click)="addWechatModal()">新增</button>
11
+            </div>
12
+          </div>
13
+          <nz-table class="list-template__nzTable" [nzData]="dataList" nzSize="middle" [nzShowPagination]="false"
14
+            [nzLoading]="loading1">
15
+            <thead>
16
+              <tr class="thead">
17
+                <th nzWidth="20%">科室</th>
18
+                <th nzWidth="16%">检验项目</th>
19
+                <th nzWidth="16%">标本类型</th>
20
+                <th nzWidth="16%">试管类型</th>
21
+                <th nzWidth="16%">标记类型</th>
22
+                <th nzWidth="16%">操作</th>
23
+              </tr>
24
+            </thead>
25
+            <tbody>
26
+              <tr *ngFor="let data of dataList;let i = index">
27
+                <td>{{data.startDeptDTO?.dept}}</td>
28
+                <td>{{data.checkItem}}</td>
29
+                <td>{{data.stype?.name}}</td>
30
+                <td>{{data.tubeType?.name}}</td>
31
+                <td>{{data.urgent == 1 ? '标记加急' : ''}}</td>
32
+                <td>
33
+                  <div class="coop">
34
+                    <span (click)="showDelModal(data,'您确认要删除吗?','删除','del')">删除</span>
35
+                    <span (click)="editWechat(data)">编辑</span>
36
+                  </div>
37
+                </td>
38
+              </tr>
39
+            </tbody>
40
+          </nz-table>
41
+        </div>
42
+      </div>
43
+    </div>
44
+  </div>
45
+</div>
46
+
47
+<!-- 操作成功/失败提示框 -->
48
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
49
+  [info]="promptInfo">
50
+</app-prompt-modal>
51
+
52
+<!-- 删除模态框 -->
53
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
54
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
55
+
56
+<!-- 新增/编辑模态框 -->
57
+<div class="save display_flex justify-content_flex-center align-items_center add" *ngIf="modalWechat">
58
+  <div class="modalBody">
59
+    <div class="title">{{modelName}}<i class="icon_transport transport-guanbi" (click)="hideWechatModal()"></i></div>
60
+    <div class="content">
61
+      <form nz-form [formGroup]="validateForm" class="addForm">
62
+        <nz-form-item>
63
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="stype">标本类型</nz-form-label>
64
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择标本类型!">
65
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="stype" nzPlaceHolder="请选择标本类型" nzServerSearch>
66
+              <ng-container *ngFor="let data of typeList">
67
+                <nz-option *ngIf="!isLoading" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
68
+              </ng-container>
69
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
70
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
71
+              </nz-option>
72
+            </nz-select>
73
+          </nz-form-control>
74
+        </nz-form-item>
75
+        <nz-form-item>
76
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="checkItem">检验项目</nz-form-label>
77
+          <nz-form-control [nzSpan]="18" nzErrorTip="请输入检验项目!">
78
+            <nz-input-group>
79
+              <input formControlName="checkItem" nz-input placeholder="请输入检验项目">
80
+            </nz-input-group>
81
+          </nz-form-control>
82
+        </nz-form-item>
83
+        <nz-form-item>
84
+          <nz-form-label [nzSpan]="6" nzFor="startDept"><span class="visibility_hidden">囧</span>申请科室</nz-form-label>
85
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择申请科室!">
86
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="startDept" nzPlaceHolder="请选择申请科室" nzAllowClear nzServerSearch nzShowSearch (nzOnSearch)="changeDeptInp($event)" (nzOpenChange)="openChangeDept($event)" (ngModelChange)="setIsSelecting(true)">
87
+              <ng-container *ngFor="let option of deptList">
88
+                <nz-option *ngIf="!isLoading" [nzLabel]="option.dept" [nzValue]="option.id"></nz-option>
89
+              </ng-container>
90
+              <nz-option *ngIf="isLoading" nzDisabled nzCustomContent>
91
+                <i nz-icon nzType="loading" class="loading-icon"></i> 搜索中...
92
+              </nz-option>
93
+            </nz-select>
94
+          </nz-form-control>
95
+        </nz-form-item>
96
+        <nz-form-item>
97
+          <nz-form-label [nzSpan]="6" nzFor="tubeType"><span class="visibility_hidden">囧</span>试管类型</nz-form-label>
98
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择试管类型!">
99
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="tubeType" nzPlaceHolder="请选择试管类型" nzServerSearch>
100
+              <nz-option *ngFor="let data of tubeTypeList" [nzLabel]="data.name" [nzValue]="data.id"></nz-option>
101
+            </nz-select>
102
+          </nz-form-control>
103
+        </nz-form-item>
104
+        <nz-form-item>
105
+          <nz-form-label [nzSpan]="6" nzRequired nzFor="urgent">标记类型</nz-form-label>
106
+          <nz-form-control [nzSpan]="18" nzErrorTip="请选择标记类型!">
107
+            <nz-select [nzDropdownMatchSelectWidth]="false" formControlName="urgent" nzPlaceHolder="请选择标记类型" nzServerSearch>
108
+              <nz-option nzLabel="标记加急" [nzValue]="1"></nz-option>
109
+            </nz-select>
110
+          </nz-form-control>
111
+        </nz-form-item>
112
+      </form>
113
+    </div>
114
+    <div class=" display_flex justify-content_flex-center">
115
+      <button nzType="primary" nz-button (click)="submitWechatForm()" [nzLoading]="btnLoading">确认</button>
116
+      <button class="btn cancel" nz-button nzType="default" (click)="hideWechatModal()">取消</button>
117
+    </div>
118
+  </div>
119
+</div>

+ 303 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.less

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

+ 283 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.component.ts

@@ -0,0 +1,283 @@
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-special-specimen-marking",
11
+  templateUrl: "./configuration-special-specimen-marking.component.html",
12
+  styleUrls: ["./configuration-special-specimen-marking.component.less"],
13
+})
14
+export class ConfigurationSpecialSpecimenMarkingComponent 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
+    this.getTypes();
33
+    this.getTubeTypeList();
34
+    this.getList();
35
+  }
36
+
37
+  // 新增弹框
38
+  modelName = ""; //模态框名称
39
+  modalWechat: boolean = false; //新增/编辑模态框
40
+  add: boolean; //true:新增;false:编辑
41
+  addWechatModal() {
42
+    this.modelName = "新增";
43
+    this.add = true; //新增
44
+    this.modalWechat = true;
45
+    this.initWechatForm();
46
+  }
47
+  //关闭新增/编辑弹框
48
+  hideWechatModal() {
49
+    this.modalWechat = false;
50
+  }
51
+
52
+  // 防抖
53
+  isLoading = false;
54
+  isSelecting:boolean = false; // 是否在选中状态
55
+  searchTimer(fun, e) {
56
+    if (this.isSelecting) {
57
+      this.isSelecting = false; // 重置标志
58
+      return; // 跳过处理
59
+    }
60
+    this.isLoading = true;
61
+    this.searchTimerSubject.next([fun, e]);
62
+  }
63
+
64
+  // 设置标志
65
+  setIsSelecting(flag){
66
+    this.isSelecting = flag; // 设置标志
67
+  }
68
+
69
+  openChangeDept(flag){
70
+    flag && this.setIsSelecting(false);
71
+    flag && this.getDeptList();
72
+  }
73
+
74
+  // 科室搜索
75
+  changeDeptInp(e) {
76
+    this.searchTimer(this.getDeptList, e);
77
+  }
78
+
79
+  // 获取申请科室
80
+  deptList: any = [];
81
+  getDeptList(e = undefined) {
82
+    let postData = {
83
+      idx: 0,
84
+      sum: 20,
85
+      department: {
86
+        searchType: 1,// 简单查询
87
+        cascadeHosId: this.hosId,
88
+        dept: e,
89
+      }
90
+    };
91
+    this.isLoading = true;
92
+    this.mainService
93
+      .getFetchDataList("simple/data", "department", postData)
94
+      .subscribe((data) => {
95
+        this.isLoading = false;
96
+        this.deptList = data.list || [];
97
+      });
98
+  }
99
+
100
+  // 编辑
101
+  editWechat(data) {
102
+    console.log(data);
103
+    this.modelName = "编辑";
104
+    this.add = false;
105
+    this.modalWechat = true;
106
+    this.initWechatForm();
107
+    this.coopData = data;
108
+    this.validateForm.controls.stype.setValue(data.stype ? data.stype.id : null);
109
+    this.validateForm.controls.checkItem.setValue(data.checkItem);
110
+    this.validateForm.controls.startDept.setValue(data.startDeptDTO ? data.startDeptDTO.id : null);
111
+    this.validateForm.controls.tubeType.setValue(data.tubeType ? data.tubeType.id : null);
112
+    this.validateForm.controls.urgent.setValue(data.urgent);
113
+
114
+    data.startDeptDTO && (this.deptList = [data.startDeptDTO]);
115
+  }
116
+
117
+  // 新增/编辑表单提交
118
+  btnLoading: boolean = false; //提交按钮loading状态
119
+  submitWechatForm(): void {
120
+    for (const i in this.validateForm.controls) {
121
+      this.validateForm.controls[i].markAsDirty();
122
+      this.validateForm.controls[i].updateValueAndValidity();
123
+    }
124
+    if (this.validateForm.invalid) {
125
+      return;
126
+    }
127
+    console.log(this.validateForm.value);
128
+    this.btnLoading = true;
129
+    let postData:any = {};
130
+
131
+    if (this.add) {
132
+      //增加
133
+      postData = {
134
+        // speUrgentMarkConfig: {
135
+          hosId: this.hosId,
136
+          stype: this.validateForm.value.stype ? { id: this.validateForm.value.stype } : undefined,
137
+          checkItem: this.validateForm.value.checkItem || undefined,
138
+          startDept: this.validateForm.value.startDept || undefined,
139
+          tubeType: this.validateForm.value.tubeType ? { id: this.validateForm.value.tubeType } : undefined,
140
+          urgent: this.validateForm.value.urgent || undefined,
141
+        // }
142
+      };
143
+    } else {
144
+      //编辑
145
+      postData = {
146
+        // speUrgentMarkConfig: {
147
+          ...this.coopData,
148
+          stype: this.validateForm.value.stype ? { id: this.validateForm.value.stype } : undefined,
149
+          checkItem: this.validateForm.value.checkItem || undefined,
150
+          startDept: this.validateForm.value.startDept || undefined,
151
+          tubeType: this.validateForm.value.tubeType ? { id: this.validateForm.value.tubeType } : undefined,
152
+          urgent: this.validateForm.value.urgent || undefined,
153
+        // }
154
+      };
155
+    }
156
+    this.mainService
157
+      .simplePost("addData", "speUrgentMarkConfig", postData)
158
+      .subscribe((result) => {
159
+        this.btnLoading = false;
160
+        this.hideWechatModal();
161
+        let msg = "";
162
+        if (this.add) {
163
+          msg = "新增";
164
+        } else {
165
+          msg = "修改";
166
+        }
167
+        if (result.status == 200) {
168
+          this.showPromptModal(msg, true, '');
169
+        } else {
170
+          this.showPromptModal(msg, false, result.msg);
171
+        }
172
+      });
173
+  }
174
+
175
+  // 初始化新增form表单
176
+  validateForm: FormGroup; //新增/编辑表单
177
+  initWechatForm() {
178
+    this.validateForm = this.fb.group({
179
+      stype: [null, [Validators.required]],
180
+      checkItem: [null, [Validators.required]],
181
+      startDept: [null],
182
+      tubeType: [null],
183
+      urgent: [null, [Validators.required]],
184
+    });
185
+  }
186
+
187
+  // 获取列表
188
+  loading1:boolean = false;
189
+  dataList: any[] = []; //表格数据
190
+  getList() {
191
+    let data = {
192
+      idx: 0,
193
+      sum: 9999,
194
+      speUrgentMarkConfig: {
195
+        hosId: this.hosId,
196
+      },
197
+    };
198
+    this.loading1 = true;
199
+    this.mainService
200
+      .getFetchDataList("simple/data", "speUrgentMarkConfig", data)
201
+      .subscribe((data) => {
202
+        this.loading1 = false;
203
+        if (data.status == 200) {
204
+          this.dataList = data.list || [];
205
+        }else{
206
+          this.message.error(data.msg || "请求数据失败");
207
+        }
208
+      });
209
+  }
210
+
211
+  // 获取试管类型
212
+  tubeTypeList: any = [];
213
+  getTubeTypeList() {
214
+    this.mainService.getDictionary('list', 'specimen_tube_type').subscribe((data) => {
215
+      this.isLoading = false;
216
+      this.tubeTypeList = data || [];
217
+    });
218
+  }
219
+
220
+  // 获取标本类型
221
+  typeList: any = [];
222
+  getTypes() {
223
+    this.mainService.getDictionary('list', 'specimen_type').subscribe((data) => {
224
+      this.isLoading = false;
225
+      this.typeList = data || [];
226
+    });
227
+  }
228
+
229
+  delModal: boolean = false; //删除模态框
230
+  tipsMsg1: string; //提示框信息
231
+  tipsMsg2: string; //操作后信息
232
+  confirmDelType: string; //确认的类型(启用/停用,删除)
233
+  showDelModal(
234
+    data,
235
+    tipsMsg1: string,
236
+    tipsMsg2: string,
237
+    type: string,
238
+  ) {
239
+    this.confirmDelType = type;
240
+    this.delModal = true;
241
+    this.coopData = data;
242
+    this.tipsMsg1 = tipsMsg1;
243
+    this.tipsMsg2 = tipsMsg2;
244
+  }
245
+  // 隐藏删除框
246
+  hideDelModal() {
247
+    this.delModal = false;
248
+  }
249
+  // 确认删除
250
+  confirmDel() {
251
+    this.btnLoading = true;
252
+    if (this.confirmDelType === "del") {
253
+      //删除
254
+      this.mainService
255
+        .simplePost("rmvData", "speUrgentMarkConfig", [this.coopData.id])
256
+        .subscribe((data) => {
257
+          this.btnLoading = false;
258
+          this.delModal = false;
259
+          if (data.status == 200) {
260
+            this.showPromptModal(this.tipsMsg2, true, "");
261
+          } else {
262
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
263
+          }
264
+        });
265
+    }
266
+  }
267
+
268
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
269
+  promptContent: string; //操作提示框提示信息
270
+  ifSuccess: boolean; //操作成功/失败
271
+  promptInfo: string; //操作结果提示信息
272
+  promptModalShow: boolean; //操作提示框是否展示
273
+  showPromptModal(con, success, promptInfo?) {
274
+    this.promptModalShow = false;
275
+    this.promptContent = con;
276
+    this.ifSuccess = success;
277
+    this.promptInfo = promptInfo;
278
+    setTimeout(() => {
279
+      this.promptModalShow = true;
280
+    }, 100);
281
+    this.getList();
282
+  }
283
+}

+ 20 - 0
src/app/components/configurationCenter/configuration-specimen/configuration-special-specimen-marking/configuration-special-specimen-marking.module.ts

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

+ 8 - 1
src/app/components/configurationCenter/configuration-specimen/configuration-specimen.component.html

@@ -16,6 +16,9 @@
16 16
               <div class="item" (click)="tabModal('automaticOrderCreation')" [ngClass]="{'items':tabModalName=='automaticOrderCreation'}">
17 17
                 自动建单配置
18 18
               </div>
19
+              <div class="item" (click)="tabModal('specialSpecimenMarking')" [ngClass]="{'items':tabModalName=='specialSpecimenMarking'}">
20
+                特殊标本标记
21
+              </div>
19 22
             </div>
20 23
             <div class="list" *ngIf="!loading">
21 24
               <!-- 特性配置 -->
@@ -192,8 +195,12 @@
192 195
               <div *ngIf="tabModalName=='automaticOrderCreation'">
193 196
                 <!-- 自动建单 -->
194 197
               </div>
198
+              <!-- 特殊标本标记 -->
199
+              <div *ngIf="tabModalName=='specialSpecimenMarking'">
200
+                <app-configuration-special-specimen-marking></app-configuration-special-specimen-marking>
201
+              </div>
195 202
               <div class="bottom">
196
-                <button class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>
203
+                <button *ngIf="tabModalName != 'specialSpecimenMarking'" class="login-form-button" nzType="primary" [nzLoading]="btnLoading" nz-button (click)="submitForm()">保存</button>
197 204
               </div>
198 205
             </div>
199 206
             <div class="list" *ngIf="loading">

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

@@ -5,6 +5,7 @@ import { ShareModule } from 'src/app/share/share.module';
5 5
 
6 6
 import { ConfigurationSpecimenComponent } from './configuration-specimen.component';
7 7
 import { ConfigurationSpecimenReturnModule } from './configuration-specimen-return/configuration-specimen-return.module';
8
+import { ConfigurationSpecialSpecimenMarkingModule } from './configuration-special-specimen-marking/configuration-special-specimen-marking.module';
8 9
 
9 10
 
10 11
 @NgModule({
@@ -15,6 +16,7 @@ import { ConfigurationSpecimenReturnModule } from './configuration-specimen-retu
15 16
     CommonModule,
16 17
     ShareModule,
17 18
     ConfigurationSpecimenReturnModule,
19
+    ConfigurationSpecialSpecimenMarkingModule,
18 20
   ],
19 21
   exports: [
20 22
     ConfigurationSpecimenComponent,

+ 15 - 5
src/app/share/specimen-package-list-modal/specimen-package-list-modal.component.html

@@ -22,14 +22,14 @@
22 22
           <tr class="thead">
23 23
             <th nzWidth="13%">包号</th>
24 24
             <th nzWidth="6%">打包人</th>
25
-            <th nzWidth="15%">打包时间</th>
25
+            <th nzWidth="14%">打包时间</th>
26 26
             <th nzWidth="6%">标本数</th>
27 27
             <th nzWidth="6%">收取人</th>
28
-            <th nzWidth="15%">收取时间</th>
28
+            <th nzWidth="14%">收取时间</th>
29 29
             <th nzWidth="6%">送达人</th>
30
-            <th nzWidth="15%">送达时间</th>
31
-            <th nzWidth="8%">状态</th>
32
-            <th nzWidth="10%">操作</th>
30
+            <th nzWidth="14%">送达时间</th>
31
+            <th nzWidth="6%">状态</th>
32
+            <th nzWidth="15%">操作</th>
33 33
           </tr>
34 34
         </thead>
35 35
         <tbody>
@@ -47,6 +47,7 @@
47 47
               <div class="coop">
48 48
                 <span (click)="printPackageByConfig(data)" *ngIf="data.status.value !== '0'">补打</span>
49 49
                 <span (click)="toSpecimenPackage(data)" *ngIf="data.status.value === '0' || data.status.value === '1'">修改</span>
50
+                <span (click)="showDelModal(data, '您确认要删除吗?', '删除', 'del')" *ngIf="data.status.value === '0' || data.status.value === '1'">删除</span>
50 51
               </div>
51 52
             </td>
52 53
           </tr>
@@ -67,6 +68,15 @@
67 68
   </div>
68 69
 </div>
69 70
 
71
+<!-- 模态框 -->
72
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
73
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
74
+
75
+<!-- 操作成功/失败提示框 -->
76
+<app-prompt-modal *ngIf="promptModalShow" [content]="promptContent" [success]="ifSuccess" [show]="promptModalShow"
77
+  [info]="promptInfo">
78
+</app-prompt-modal>
79
+
70 80
 <!-- 打印的内容 -->
71 81
 <div id="print-section-package" hidden>
72 82
   <!-- 80mm*80mm -->

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

@@ -152,6 +152,63 @@ export class SpecimenPackageListModalComponent implements OnInit {
152 152
         }
153 153
       });
154 154
   }
155
+
156
+  delModal: boolean = false; //删除模态框
157
+  tipsMsg1: string; //提示框信息
158
+  tipsMsg2: string; //操作后信息
159
+  confirmDelType: string; //确认的类型(启用/停用,删除)
160
+  coopData: any; //当前操作列
161
+  showDelModal(
162
+    data,
163
+    tipsMsg1: string,
164
+    tipsMsg2: string,
165
+    type: string,
166
+  ) {
167
+    this.confirmDelType = type;
168
+    this.delModal = true;
169
+    this.coopData = data;
170
+    this.tipsMsg1 = tipsMsg1;
171
+    this.tipsMsg2 = tipsMsg2;
172
+  }
173
+  // 隐藏删除框
174
+  hideDelModal() {
175
+    this.delModal = false;
176
+  }
177
+  btnLoading:boolean = false;
178
+  // 确认删除
179
+  confirmDel() {
180
+    this.btnLoading = true;
181
+    if (this.confirmDelType === "del") {
182
+      //删除
183
+      this.mainService
184
+        .simplePost("rmvData", "pathologyPackInfo", [this.coopData.id])
185
+        .subscribe((data) => {
186
+          this.btnLoading = false;
187
+          this.delModal = false;
188
+          if (data.status == 200) {
189
+            this.showPromptModal(this.tipsMsg2, true, "");
190
+          } else {
191
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
192
+          }
193
+        });
194
+    }
195
+  }
196
+
197
+  // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
198
+  promptContent: string; //操作提示框提示信息
199
+  ifSuccess: boolean; //操作成功/失败
200
+  promptInfo: string; //操作结果提示信息
201
+  promptModalShow: boolean; //操作提示框是否展示
202
+  showPromptModal(con, success, promptInfo?) {
203
+    this.promptModalShow = false;
204
+    this.promptContent = con;
205
+    this.ifSuccess = success;
206
+    this.promptInfo = promptInfo;
207
+    setTimeout(() => {
208
+      this.promptModalShow = true;
209
+    }, 100);
210
+    this.getSpecimenPackageList(1);
211
+  }
155 212
 }
156 213
 
157 214
 

+ 6 - 1
src/app/views/specimen-package/specimen-package.component.html

@@ -75,7 +75,8 @@
75 75
             <td class="clickable" (click)="detail($event, data.gdid)">{{ data.gdDTO?.gdcode }}</td>
76 76
             <td>
77 77
               <div class="coop">
78
-                <span (click)="showLogs(data)">查看日志</span>
78
+                <span *ngIf="coopBtns.lookLog" (click)="showLogs(data)">查看日志</span>
79
+                <span *ngIf="coopBtns.del && (data.status.value === '0' || data.status.value === '1')" (click)="showDelModal(data, '您确认要删除吗?', '删除', 'del')">删除</span>
79 80
               </div>
80 81
             </td>
81 82
           </tr>
@@ -102,5 +103,9 @@
102 103
   (closeModelHs)="closeModelLog($event)"
103 104
 ></app-specimen-package-log-prompt-modal>
104 105
 
106
+<!-- 模态框 -->
107
+<app-dialog-delete [delModal]="delModal" (hideDelModalEvent)="hideDelModal()" [btnLoading]="btnLoading"
108
+(confirmDelEvent)="confirmDel()" [content]="tipsMsg1"></app-dialog-delete>
109
+
105 110
 <!-- 查看详情 -->
106 111
 <router-outlet></router-outlet>

+ 39 - 0
src/app/views/specimen-package/specimen-package.component.ts

@@ -237,4 +237,43 @@ export class SpecimenPackageComponent implements OnInit {
237 237
     e.stopPropagation();
238 238
     this.router.navigateByUrl(`/main/specimenPackage/orderDetail/${id}`);
239 239
   }
240
+
241
+  delModal: boolean = false; //删除模态框
242
+  tipsMsg1: string; //提示框信息
243
+  tipsMsg2: string; //操作后信息
244
+  confirmDelType: string; //确认的类型(启用/停用,删除)
245
+  showDelModal(
246
+    data,
247
+    tipsMsg1: string,
248
+    tipsMsg2: string,
249
+    type: string,
250
+  ) {
251
+    this.confirmDelType = type;
252
+    this.delModal = true;
253
+    this.coopData = data;
254
+    this.tipsMsg1 = tipsMsg1;
255
+    this.tipsMsg2 = tipsMsg2;
256
+  }
257
+  // 隐藏删除框
258
+  hideDelModal() {
259
+    this.delModal = false;
260
+  }
261
+  // 确认删除
262
+  confirmDel() {
263
+    this.btnLoading = true;
264
+    if (this.confirmDelType === "del") {
265
+      //删除
266
+      this.mainService
267
+        .simplePost("rmvData", "pathologyPackInfo", [this.coopData.id])
268
+        .subscribe((data) => {
269
+          this.btnLoading = false;
270
+          this.delModal = false;
271
+          if (data.status == 200) {
272
+            this.showPromptModal(this.tipsMsg2, true, "");
273
+          } else {
274
+            this.showPromptModal(this.tipsMsg2, false, data.msg);
275
+          }
276
+        });
277
+    }
278
+  }
240 279
 }

+ 3 - 0
src/common.less

@@ -1,3 +1,6 @@
1
+.visibility_hidden{
2
+  visibility: hidden;
3
+}
1 4
 textarea{
2 5
   margin-bottom: 0!important;
3 6
 }