Browse Source

Merge branch 'master' of http://121.36.37.70:3000/shaojiahao/Jinan_project

非煤矿山灾害智能感知和预警系统
jingbowen 3 years ago
parent
commit
7f324ea198
  1. 2
      src/app/home/home-routing.module.ts
  2. 14
      src/app/home/home.module.ts
  3. 2
      src/app/home/nav/nav.component.html
  4. 16
      src/app/home/nav/nav.component.ts
  5. 202
      src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.html
  6. 63
      src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.scss
  7. 286
      src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.ts
  8. 187
      src/app/home/task/da-oneself-plan/da-oneself-plan.component.html
  9. 50
      src/app/home/task/da-oneself-plan/da-oneself-plan.component.scss
  10. 225
      src/app/home/task/da-oneself-plan/da-oneself-plan.component.ts
  11. 42
      src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.html
  12. 2
      src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.scss
  13. 231
      src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.ts
  14. 4
      src/app/home/task/da-subordinate-audit/allot-person/allot-person.component.html
  15. 90
      src/app/home/task/station-task-apply/apply/apply.component.html
  16. 78
      src/app/home/task/station-task-apply/apply/apply.component.scss
  17. 182
      src/app/home/task/station-task-apply/apply/apply.component.ts
  18. 36
      src/app/home/task/station-task-apply/station-task-apply.component.html
  19. 36
      src/app/home/task/station-task-apply/station-task-apply.component.ts
  20. 8
      src/app/home/task/station-task-execution/station-task-execution.component.html
  21. 9
      src/app/home/task/station-task-execution/station-task-execution.component.ts
  22. 24
      src/app/home/task/station-weekly-plan/create-task/create-task.component.html
  23. 0
      src/app/home/task/station-weekly-plan/create-task/create-task.component.scss
  24. 83
      src/app/home/task/station-weekly-plan/create-task/create-task.component.ts
  25. 43
      src/app/home/task/station-weekly-plan/station-weekly-plan.component.html
  26. 332
      src/app/home/task/station-weekly-plan/station-weekly-plan.component.ts
  27. 11
      src/app/home/task/station-weekly-plan/task-details/task-details.component.html
  28. 9
      src/app/home/task/station-weekly-plan/task-details/task-details.component.scss
  29. 25
      src/app/home/task/station-weekly-plan/task-details/task-details.component.spec.ts
  30. 73
      src/app/home/task/station-weekly-plan/task-details/task-details.component.ts
  31. 30
      src/app/home/task/task.component.ts
  32. 22
      src/app/home/task/zhi-indicators/edit-or/edit-or.component.html
  33. 0
      src/app/home/task/zhi-indicators/edit-or/edit-or.component.scss
  34. 41
      src/app/home/task/zhi-indicators/edit-or/edit-or.component.ts
  35. 512
      src/app/home/task/zhi-indicators/zhi-indicators.component.html
  36. 56
      src/app/home/task/zhi-indicators/zhi-indicators.component.scss
  37. 700
      src/app/home/task/zhi-indicators/zhi-indicators.component.ts
  38. 3
      src/app/http-interceptors/base-interceptor.ts
  39. 15
      src/app/pages/login/login.component.html
  40. 133
      src/app/pages/login/login.component.scss
  41. 2
      src/app/pages/login/login.component.ts
  42. BIN
      src/assets/images/logo/loginlogo.png
  43. 8
      src/styles.scss

2
src/app/home/home-routing.module.ts

@ -42,7 +42,7 @@ const routes: Routes = [
},
{
path: 'audit',
component: ZhiAuditComponent,
component: ZhiAuditComponent
},
{
path: 'monthlytaskoverview',

14
src/app/home/home.module.ts

@ -59,8 +59,11 @@ import { ChangePasswordComponent } from './change-password/change-password.compo
import { NzUploadModule } from 'ng-zorro-antd/upload';
import { NzCardModule } from 'ng-zorro-antd/card';
import { PlanAdjustmentComponent } from './task/da-oneself-plan/plan-adjustment/plan-adjustment.component';
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
import { TaskDetailsComponent } from './task/station-weekly-plan/task-details/task-details.component';
import { EditOrComponent } from './task/zhi-indicators/edit-or/edit-or.component';
import { NzInputNumberModule } from 'ng-zorro-antd/input-number';
import { CreateTaskComponent } from './task/station-weekly-plan/create-task/create-task.component';
@NgModule({
declarations: [
NavComponent,
@ -95,7 +98,9 @@ import { TaskDetailsComponent } from './task/station-weekly-plan/task-details/ta
AllotPersonComponent,
ChangePasswordComponent,
PlanAdjustmentComponent,
TaskDetailsComponent
TaskDetailsComponent,
EditOrComponent,
CreateTaskComponent
],
imports: [
CommonModule,
@ -127,8 +132,9 @@ import { TaskDetailsComponent } from './task/station-weekly-plan/task-details/ta
NzSpinModule,
NzCardModule,
NzUploadModule,
NzToolTipModule
NzToolTipModule,
NzInputNumberModule
],
entryComponents: [AddroleComponent, EditroleComponent, AdduserComponent, EdituserComponent, AddorComponent, EditorComponent, ApplyComponent, ApplyLookComponent, LookTaskComponent, AllotPersonComponent]
entryComponents: [AddroleComponent, EditroleComponent, AdduserComponent, EdituserComponent, AddorComponent, EditorComponent, ApplyComponent, ApplyLookComponent, LookTaskComponent, AllotPersonComponent, EditOrComponent, CreateTaskComponent]
})
export class HomeModule { }

2
src/app/home/nav/nav.component.html

@ -14,7 +14,7 @@
<li [routerLink]="['/statistic']" routerLinkActive="router-link-active">
<div>统计分析</div>
</li>
<li [routerLink]="['/system']" routerLinkActive="router-link-active">
<li *ngIf="isSuperAdmin" [routerLink]="['/system']" routerLinkActive="router-link-active">
<div>系统管理</div>
</li>
</ul>

16
src/app/home/nav/nav.component.ts

@ -12,12 +12,20 @@ import { NzMessageService } from 'ng-zorro-antd/message';
})
export class NavComponent implements OnInit {
constructor( private modal: NzModalService,private http: HttpClient,private message: NzMessageService,private viewContainerRef: ViewContainerRef,private router: Router, public token: CacheTokenService) { }
user:""
constructor(private modal: NzModalService, private http: HttpClient, private message: NzMessageService, private viewContainerRef: ViewContainerRef, private router: Router, public token: CacheTokenService) { }
user = null
isSuperAdmin
ngOnInit(): void {
//调用服务中的function刷新token
this.token.startUp()
this.user=JSON.parse(sessionStorage.getItem('userData')).name
this.user = JSON.parse(sessionStorage.getItem('userData')).name
let roles = JSON.parse(sessionStorage.getItem('userData')).roles
let isTrue = roles.find(item => {
return item.name == '超级管理员'
})
isTrue ? this.isSuperAdmin = true : this.isSuperAdmin = false
}
signOut() {
this.router.navigate(['/login'])
@ -25,7 +33,7 @@ export class NavComponent implements OnInit {
ngOnDestroy(): void {
this.token.delete()
}
changePassword() {
const modal: any = this.modal.create({
nzTitle: '修改密码',

202
src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.html

@ -32,14 +32,15 @@
style="vertical-align: text-top;cursor: pointer;" nz-icon nzType="right-circle"
nzTheme="outline"></i>
</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">5/9</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">
{{item.passed}}/{{item.data.length}}</p>
</div>
<div class="jindu">
<p>
<span>完成率</span>
<span>60%</span>
<span>{{item.percentage}}%</span>
</p>
<nz-progress style="width: 100%;" [nzPercent]="75" nzStrokeColor="#42B983"
<nz-progress style="width: 100%;" [nzPercent]="item.percentage" nzStrokeColor="#87D068"
[nzShowInfo]="false"></nz-progress>
</div>
</div>
@ -51,13 +52,12 @@
nzTheme="outline"></i>返回</span>
</p>
<div class="itemtwocontent">
<div class="itemtwocontentitem">
<div class="itemtwocontentitem" *ngFor="let i of item.data">
<p class="itemtwocontentitemp1">
<span class="itemtwocontentitemp1name">济南历下森豪室内娱乐场</span>
<span class="itemtwocontentitemp1name">{{i.company.companyName}}</span>
</p>
<p>
<span class="green" style="margin-right: 12px;">已分配</span>
<span class="green">已检查</span>
<span class="green" style="margin-right: 12px;">{{i.approvalStatus}}</span>
</p>
</div>
</div>
@ -81,7 +81,14 @@
<div class="taskauditbox" *ngFor="let item of taskData">
<div class="header">
<span>{{item.name}}</span>
<div>
<span style="margin-right: 18px;">{{item.name}}</span>
<span>
已审批: <span class="green"> {{item.finished}}/{{item.list.length}}</span>
</span>
</div>
<span (click)="expand(item)" class="expand blue">
{{item.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="item.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
@ -89,39 +96,38 @@
</div>
<div class="content" *ngIf="item.isExpand">
<div *ngFor="let i of item.list" class="card greencard"
[ngClass]="{'redcard': i.approvalStatus == 'reject'}">
[ngClass]="{'redcard': i.approvalStatus == '驳回'}">
<div class="unitname">
<img src="../../../../assets/images/icon/unit.png" alt="">
<span>{{i.company.companyName}}</span>
</div>
<div class="info">
<div >
<span>
<img src="../../../../assets/images/icon/main.png" alt="">
{{i.mainSupervisor ? i.mainSupervisor.name : '未分配'}}
<span class="assistant" nz-tooltip [nzTooltipTitle]="titleTemplate">
<span *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
<span>
<img src="../../../../assets/images/icon/assist.png" alt="">
{{i.assitantSupervisor ? i.assitantSupervisor.name : '未分配'}}
</span>
<ng-template #titleTemplate let-thing>
<span style="margin-right: 6px;" *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
<span class="blue" (click)="allot(i)">分配</span>
<span>|</span>
<span>申请人: {{i.organization.name}}</span>
<!-- <span class="blue">修改</span> -->
</div>
</ng-template>
<!-- <span class="blue" (click)="allot(i)">分配</span> -->
<span>|</span>
<span>申请人: {{i.organization.name}}</span>
</div>
<div class="img">
<img *ngIf="i.approvalStatus == '驳回'" src="../../../../assets/images/icon/reject.png">
<img *ngIf="i.approvalStatus == '通过'" src="../../../../assets/images/icon/agree.png">
</div>
<!-- <div class="btn">
<button [ngClass]="{'forbidbtn': i.approvalStatus}" [disabled]="i.approvalStatus"
nz-button (click)="agree(i)">同意</button>
<button [ngClass]="{'forbidbtn': i.approvalStatus}" [disabled]="i.approvalStatus"
nz-button (click)="reject(i)">驳回</button>
</div> -->
<div class="img">
<img class="auditimg" *ngIf="i.approvalStatus == '驳回'"
src="../../../../assets/images/icon/reject.png" alt="">
<img *ngIf="i.approvalStatus == '通过'" class="auditimg"
src="../../../../assets/images/icon/agree.png" alt="">
</div>
</div>
</div>
@ -144,40 +150,46 @@
<div class="aaa">
<div class="title">
任务总数
<span
style="font-weight: 18;font-size: 26px;margin-left: 10px;">{{countStat.statistics1.num}}</span>
</div>
<div class="details">
<div class="detailsname">
完成
<!-- <span style="font-weight: 18;font-size: 26px;margin-left: 10px;">15</span> -->
</div>
<span class="progresssquare">
<!-- <span>完成率</span> -->
<nz-progress nzStrokeLinecap="square" style="width: 70%;margin-bottom: 3px;"
[nzPercent]="75" nzStrokeColor="#42B983" [nzShowInfo]="false" [nzStrokeWidth]="18">
[nzPercent]="countStat.statistics1.percentageComplete" nzStrokeColor="#87D068"
[nzShowInfo]="false" [nzStrokeWidth]="18">
</nz-progress>
<span>75%</span>
<span>{{countStat.statistics1.percentageComplete}}%</span>
</span>
</div>
</div>
<div class="percentage">
<nz-progress [nzWidth]="80" nz-tooltip nzType="circle"
[nzPercent]="70" nzStrokeLinecap="square" [nzShowInfo]="false" [nzSuccessPercent]="40"></nz-progress>
[nzPercent]="countStat.statistics1.item1+countStat.statistics1.item2"
nzStrokeLinecap="square" [nzShowInfo]="false"
[nzSuccessPercent]="countStat.statistics1.item1"></nz-progress>
<div class="typebox">
<div class="type">
<div class="tips" style="background: #42B983;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">上级指派</span><span>46%</span></div>
<div class="tips" style="background: #87D068;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">上级指派</span><span>{{countStat.statistics1.item1}}%</span>
</div>
</div>
<div class="type">
<div class="tips" style="background: #1890FF;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">自主任务</span><span>46%</span></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">自主任务</span><span>{{countStat.statistics1.item2}}%</span>
</div>
</div>
<div class="type">
<div class="tips" style="background: #fff;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">申领任务</span><span>46%</span></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">申领任务</span><span>{{countStat.statistics1.item3}}%</span>
</div>
</div>
</div>
</div>
@ -185,7 +197,9 @@
<div class="deploycontentitem">
<div class="aaa">
<div class="title">
任务总数
消防救援任务总数
<span
style="font-weight: 18;font-size: 26px;margin-left: 10px;">{{countStat.statistics2.num}}</span>
</div>
<div class="details">
<div class="detailsname">
@ -195,28 +209,37 @@
<span class="progresssquare">
<!-- <span>完成率</span> -->
<nz-progress nzStrokeLinecap="square" style="width: 70%;margin-bottom: 3px;"
[nzPercent]="75" nzStrokeColor="#42B983" [nzShowInfo]="false" [nzStrokeWidth]="18">
[nzPercent]="countStat.statistics2.percentageComplete" nzStrokeColor="#87D068"
[nzShowInfo]="false" [nzStrokeWidth]="18">
</nz-progress>
<span>75%</span>
<span>{{countStat.statistics2.percentageComplete}}%</span>
</span>
</div>
</div>
<div class="percentage">
<nz-progress [nzWidth]="80" nz-tooltip nzType="circle"
[nzPercent]="70" nzStrokeColor="#42B983" nzStrokeLinecap="square" [nzShowInfo]="false" ></nz-progress>
[nzPercent]="countStat.statistics2.item1+countStat.statistics2.item2"
nzStrokeColor="#3658c8" nzStrokeLinecap="square" [nzShowInfo]="false"
[nzSuccessPercent]="countStat.statistics2.item1"></nz-progress>
<div class="typebox">
<div class="type">
<div class="tips" style="background: #42B983;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">自主任务</span><span>46%</span></div>
<div class="tips" style="background: #87D068;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">上级指派</span><span>{{countStat.statistics2.item1}}%</span>
</div>
</div>
<div class="type">
<div class="tips" style="background: #3658c8;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">自主任务</span><span>{{countStat.statistics2.item2}}%</span>
</div>
</div>
<div class="type">
<div class="tips" style="background: #fff;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">申领任务</span><span>46%</span></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">申领任务</span><span>{{countStat.statistics2.item3}}%</span>
</div>
</div>
</div>
</div>
@ -224,7 +247,9 @@
<div class="deploycontentitem">
<div class="aaa">
<div class="title">
任务总数
检查员任务总数
<span
style="font-weight: 18;font-size: 26px;margin-left: 10px;">{{countStat.statistics3.num}}</span>
</div>
<div class="details">
<div class="detailsname">
@ -234,30 +259,39 @@
<span class="progresssquare">
<!-- <span>完成率</span> -->
<nz-progress nzStrokeLinecap="square" style="width: 70%;margin-bottom: 3px;"
[nzPercent]="75" nzStrokeColor="#E6D91D" [nzShowInfo]="false" [nzStrokeWidth]="18">
[nzPercent]="countStat.statistics3.percentageComplete" nzStrokeColor="#E6D91D"
[nzShowInfo]="false" [nzStrokeWidth]="18">
</nz-progress>
<span>75%</span>
<span>{{countStat.statistics3.percentageComplete}}%</span>
</span>
</div>
</div>
<div class="percentage">
<nz-progress [nzWidth]="80" nz-tooltip nzType="circle"
[nzPercent]="50" nzStrokeColor="#E6D91D" [nzShowInfo]="false" ></nz-progress>
<div class="typebox">
<div class="type">
<div class="tips" style="background: #E6D91D;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">自主任务</span><span>46%</span></div>
[nzPercent]="countStat.statistics3.item1+countStat.statistics3.item2"
nzStrokeColor="#E6D91D" [nzShowInfo]="false"
[nzSuccessPercent]="countStat.statistics3.item1"></nz-progress>
<div class="typebox">
<div class="type">
<div class="tips" style="background: #87D068;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">上级指派</span><span>{{countStat.statistics3.item1}}%</span>
</div>
<div class="type">
<div class="tips" style="background: #fff;"></div>
<div style="font-size: 13px;"><span style="margin-right: 5px;">申领任务</span><span>46%</span></div>
</div>
<div class="type">
<div class="tips" style="background: #E6D91D;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">自主任务</span><span>{{countStat.statistics3.item2}}%</span>
</div>
</div>
<div class="type">
<div class="tips" style="background: #fff;"></div>
<div style="font-size: 13px;"><span
style="margin-right: 5px;">申领任务</span><span>{{countStat.statistics3.item3}}%</span>
</div>
</div>
</div>
</div>
</div>
</div>
@ -276,14 +310,18 @@
<img src="../../../../assets//images/icon/station.png" alt="">
{{element.name}}
</span>
<span style="width: 8%;">单位总数: 7/8</span>
<div style="width: 66%;" class="progress progresssquare">
<span style="width: 8%;">
<span>
单位总数:{{element.awaitInspect}}/{{element.allUnitsNum}}
</span>
</span>
<div style="width: 72%;" class="progress progresssquare">
<span>完成进度</span>
<nz-progress nzStrokeLinecap="square" nzStrokeWidth="16" nzStrokeColor="#42B983"
[nzPercent]="30"></nz-progress>
<nz-progress nzStrokeLinecap="square" [nzStrokeWidth]="16" nzStrokeColor="#87D068"
[nzPercent]="element.percentage"></nz-progress>
</div>
<!-- <button nz-button nzType="primary">任务下派</button> -->
<span (click)="expandcarditem(element)" class="expand blue">
<span class="expand blue" (click)="expandcarditem(element)">
{{element.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="element.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
</span>
@ -298,12 +336,12 @@
<div class="num">
<div class="round" style="background: #2C4DC0;"></div>
<span class="word">已分配</span>
<span class="boldspan">0</span>
<span class="boldspan">{{item.inspected}}</span>
</div>
<div class="num">
<div class="round" style="background: #42B983;"></div>
<div class="round" style="background: #87D068;"></div>
<span class="word">已完成</span>
<span class="boldspan">0</span>
<span class="boldspan">{{item.finished}}</span>
</div>
</div>
<div class="maincontentitemright">
@ -366,7 +404,7 @@
<div class="flexcol">
<span>
未发现违法违规情况
{{i.inspectionResult}}
</span>
<span>
检查结果

63
src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.scss

@ -261,22 +261,19 @@
border-radius: 4px 4px 4px 4px;
opacity: 1;
display: flex;
margin-bottom: 18px;
align-items: center;
box-sizing: border-box;
padding: 0 20px;
position: relative;
margin-bottom: 18px;
div {
display: flex;
align-items: center;
img {
margin-top: -3px;
}
}
.unitname {
width: 30%;
flex: 1;
}
.info {
@ -285,33 +282,38 @@
justify-content: center;
align-items: center;
span {
margin-right: 20px;
}
}
.assistant {
width: 50%;
.btn {
flex: 1;
span {
color: #303133;
margin-right: 6px;
}
button:nth-child(1) {
background: #42B983;
color: white;
img {
width: 16px;
height: 16px;
vertical-align: text-bottom;
}
display: inline-block;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
button:nth-child(2) {
background: #FF0000;
color: white;
margin-left: 20px;
span {
margin-right: 20px;
}
}
.img {
width: 30%;
flex: 1;
.auditimg {
position: absolute;
right: 18%;
top: 9%;
img {
margin-left: 40%;
}
}
@ -329,9 +331,8 @@
}
}
.taskauditbox:nth-child(2) {
.taskauditbox:nth-child(3) {
margin-bottom: 0px;
}
}
@ -358,7 +359,7 @@
justify-content: space-between;
.deploycontentitem {
width: 32%;
width: 33%;
height: 110px;
background: linear-gradient(180deg, #7AA3FC 0%, #2C4DC0 100%);
box-shadow: 0px 3px 8px 1px rgba(0, 0, 0, 0.0800);
@ -379,6 +380,8 @@
.title {
text-align: left;
display: flex;
align-items: center;
}
.details {
@ -433,7 +436,7 @@
.tips {
width: 10px;
height: 10px;
border-radius: 10px;
margin-right: 5px;
}
@ -453,7 +456,7 @@
.deploycontentitem:nth-child(3) {
background: linear-gradient(180deg, #73D9AA 0%, #42B983 100%);
background: linear-gradient(180deg, #9ef3cc 0%, #42B983 100%);
}
}
}
@ -646,4 +649,4 @@
.cutoffrule {
width: 100%;
border-top: 1px dashed #C7CAD0;
}
}

286
src/app/home/task/da-monthly-task-overview/da-monthly-task-overview.component.ts

@ -1,5 +1,5 @@
import { HttpClient } from '@angular/common/http';
import { Component, OnInit, ViewContainerRef } from '@angular/core';
import { Component, NgZone, OnInit, ViewContainerRef } from '@angular/core';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzModalService } from 'ng-zorro-antd/modal';
import { AllotPersonComponent } from '../da-subordinate-audit/allot-person/allot-person.component';
@ -10,19 +10,24 @@ import { AllotPersonComponent } from '../da-subordinate-audit/allot-person/allot
})
export class DaMonthlyTaskOverviewComponent implements OnInit {
constructor(private http: HttpClient, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private message: NzMessageService) { }
constructor(private ngZone: NgZone, private http: HttpClient, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private message: NzMessageService) { }
selectedMonth
selectedYear = 2022
selectedTime
selectMonth(item) {
this.selectedMonth = item.id
this.getHigherTasks()
this.getTaskList()
this.getAllStation()
this.getCountStat()
}
selectYear(e) {
this.selectedYear = e
console.log('年', e)
this.getHigherTasks()
this.getTaskList()
this.getAllStation()
this.getCountStat()
}
months = [
{ id: 1, name: '1月', isable: true },
@ -40,51 +45,125 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
]
istaskauditExpanded = true
istaskauditexpand() {
this.istaskauditExpanded = !this.istaskauditExpanded
}
isdeployboxExpanded = true
isdeployboxexpand() {
this.isdeployboxExpanded = !this.isdeployboxExpanded
OrganizationId
ngOnInit(): void {
this.OrganizationId = JSON.parse(sessionStorage.getItem('userData')).organizationId
this.selectedMonth = new Date().getMonth() + 1
//上级任务指标
this.getHigherTasks()
// 下级任务申请
this.getTaskList()
this.getSupervisor('main')
this.getSupervisor('assisted')
//统计信息
this.getCountStat()
//本级部署
this.getAllStation()
}
shuxiTaskData = {
isExpand: true
//上级任务指标
cardData = [
{ name: '双随机', isDetails: false, isLoading: false, background: '#1D9DFF', icon: 'suiji.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '行政许可', isDetails: false, isLoading: false, background: '#42B983', icon: 'xuke.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '熟悉演练', isDetails: false, isLoading: false, background: '#9D80FF', icon: 'yanlian.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '消防宣传', isDetails: false, isLoading: false, background: '#FF5D2A', icon: 'xuanchuan.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '投诉举报', isDetails: false, isLoading: false, background: '#5087FF', icon: 'tousu.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '火灾调查', isDetails: false, isLoading: false, background: '#FF404D', icon: 'huozai.png', passed: 0, inspected: 0, percentage: 0, data: [] }
]
getHigherTasks() {
this.cardData.forEach((item, key) => {
item.data = []
item.passed = 0
item.inspected = 0
});
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
OrganizationId: this.OrganizationId,
PageNumber: 1,
CreationTypes: ['上级指派'],
PageSize: 9999
}
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
data.items.forEach(element => {
this.cardData.forEach((item, key) => {
element.taskType == item.name ? this.cardData[key].data.push(element) : null
});
});
this.cardData.forEach(element => {
element.data.forEach(item => {
item.approvalStatus == '通过' ? element.passed += 1 : null
item.approvalStatus == '已检查 ' ? element.inspected += 1 : null
})
})
this.cardData.forEach(element => {
element.percentage = Math.round(element.inspected / element.data.length) * 100 || 0
})
this.cardData = [...this.cardData]
})
}
zhidaoTaskData = {
isExpand: true
openDetails(data, type) {
this.ngZone.run(() => {
//这里写需要立即渲染的代码
data.isDetails = type
});
}
PageNumber = 1
PageSize = 9999
//下级任务申请打开关闭
expand(data) {
this.ngZone.run(() => {
//这里写需要立即渲染的代码
data.isExpand = !data.isExpand
});
}
istaskauditExpanded = true
istaskauditexpand() {
this.istaskauditExpanded = !this.istaskauditExpanded
}
taskData = [
{ id: 0, name: '熟悉演练任务', finished: 0, totalCount: 0, list: [], isExpand: true },
{ id: 1, name: '联络指导任务', finished: 0, totalCount: 0, list: [], isExpand: true }
{ id: 1, name: '联络指导任务', finished: 0, totalCount: 0, list: [], isExpand: true },
{ id: 2, name: '双随机任务', finished: 0, totalCount: 0, list: [], isExpand: true }
]
isloading = false
getTaskList() {
this.isloading = true
this.taskData = [
{ id: 0, name: '熟悉演练任务', finished: 0, totalCount: 0, list: [], isExpand: true },
{ id: 1, name: '联络指导任务', finished: 0, totalCount: 0, list: [], isExpand: true }
{ id: 1, name: '联络指导任务', finished: 0, totalCount: 0, list: [], isExpand: true },
{ id: 2, name: '双随机任务', finished: 0, totalCount: 0, list: [], isExpand: true }
]
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
console.log('查询时间', selectedTime)
let params = {
Month: selectedTime,
OrganizationId: this.OrganizationId,
PageNumber: this.PageNumber,
PageSize: this.PageSize
CreationTypes: ['申领任务'],
PageNumber: 1,
PageSize: 9999
}
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
let arr1 = []
let arr2 = []
let arr3 = []
data.items.forEach(element => {
if (element.taskName == '熟悉演练') {
arr1.push(element)
@ -92,27 +171,33 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
if (element.taskName == '联络指导') {
arr2.push(element)
}
if (element.taskName == '双随机') {
arr3.push(element)
}
});
arr1.forEach(item => {
if (!!item.approvalStatus) {
if (item.approvalStatus == '通过') {
this.taskData[0].finished += 1
}
});
arr2.forEach(item => {
if (!!item.approvalStatus) {
if (item.approvalStatus == '通过') {
this.taskData[1].finished += 1
}
});
this.taskData[0].totalCount = arr1.length
arr3.forEach(item => {
if (item.approvalStatus == '通过') {
this.taskData[2].finished += 1
}
});
this.taskData[0].list = [...arr1]
this.taskData[1].totalCount = arr2.length
this.taskData[1].list = [...arr2]
this.isloading = false
this.taskData[2].list = [...arr3]
console.log('下级任务申请', this.taskData)
})
}
assitantsupervisorList
mainsupervisorList
getSupervisor(type) {
@ -130,7 +215,6 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
}
})
}
allot(item) {
console.log(item)
if (this.mainsupervisorList.length == 0 || this.assitantsupervisorList.length == 0) {
@ -159,7 +243,7 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
this.message.create('success', '分配成功');
resolve(data)
console.log(data);
this.getTaskList()
return true
},
@ -183,52 +267,60 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
expand(data) {
data.isExpand = !data.isExpand
//获得统计信息
countStat: any = {
statistics1: {
num: 0, percentageComplete: 0, item1: 0, item2: 0, item3: 0
},
statistics2: {
num: 0, percentageComplete: 0, item1: 0, item2: 0, item3: 0
},
statistics3: {
num: 0, percentageComplete: 0, item1: 0, item2: 0, item3: 0
}
}
formatOne = (percent: number): string => `${percent}%\n完成率`;
cardData = [
{ name: '双随机', isDetails: false, background: '#1D9DFF', icon: 'suiji.png' },
{ name: '熟悉演练', isDetails: false, background: '#9D80FF', icon: 'yanlian.png' },
{ name: '投诉举报', isDetails: false, background: '#5087FF', icon: 'tousu.png' },
{ name: '行政许可', isDetails: false, background: '#42B983', icon: 'xuke.png' },
{ name: '消防宣传', isDetails: false, background: '#FF5D2A', icon: 'xuanchuan.png' },
{ name: '火灾调查', isDetails: false, background: '#FF404D', icon: 'huozai.png' }
]
openDetails(data, type) {
data.isDetails = type
getCountStat() {
function integer(num) {
return Math.round(num * 100) || 0
}
let selectedMonth = this.selectedMonth < 10 ? "0" + this.selectedMonth : this.selectedMonth;
let selectedTime = this.selectedYear + '-' + selectedMonth + '-' + '01'
this.http.get('/api/PlanTasks/GetCountStat', {
params: {
month: selectedTime
}
}).subscribe(data => {
console.log('统计信息', data)
this.countStat = {
statistics1: {
num: data['任务总数']['总数'], percentageComplete: integer(data['任务总数']['已完成'] / data['任务总数']['总数']), item1: integer(data['任务总数']['上级指派'] / data['任务总数']['总数']), item2: integer(data['任务总数']['自主任务'] / data['任务总数']['总数']), item3: integer(data['任务总数']['申领任务'] / data['任务总数']['总数'])
},
statistics2: {
num: data['消防救援任务总数']['总数'], percentageComplete: integer(data['任务总数']['已完成'] / data['任务总数']['总数']), item1: integer(data['消防救援任务总数']['上级指派'] / data['消防救援任务总数']['总数']), item2: integer(data['消防救援任务总数']['自主任务'] / data['消防救援任务总数']['总数']), item3: integer(data['消防救援任务总数']['申领任务'] / data['消防救援任务总数']['总数'])
},
statistics3: {
num: data['检查员任务总数']['总数'], percentageComplete: integer(data['任务总数']['已完成'] / data['任务总数']['总数']), item1: integer(data['检查员任务总数']['上级指派'] / data['检查员任务总数']['总数']), item2: integer(data['检查员任务总数']['自主任务'] / data['检查员任务总数']['总数']), item3: integer(data['检查员任务总数']['申领任务'] / data['检查员任务总数']['总数'])
}
}
})
}
xxx = false
radioChange(e) {
setTimeout(() => {
this.xxx = !this.xxx
}, 0);
}
OrganizationId
ngOnInit(): void {
this.OrganizationId = JSON.parse(sessionStorage.getItem('userData')).organizationId
this.selectedMonth = new Date().getMonth() + 1
this.getTaskList()
//获得主协调查人员
this.getSupervisor('main')
this.getSupervisor('assisted')
this.getAllStation()
//本级部署打开关闭
isdeployboxExpanded = true
isdeployboxexpand() {
this.isdeployboxExpanded = !this.isdeployboxExpanded
}
formatOne = (percent: number): string => `${percent}%\n完成率`;
//获得辖区下所有救援站
stationData = []
@ -240,23 +332,26 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
this.http.get('/api/Organizations', {
params: params
}).subscribe((data: any) => {
data.items = data.items.filter(element => {
return element.level == 'squadron'
});
data.items.forEach(element => {
element.isExpand = false
element.isLoading = false
});
this.stationData = data.items
this.ngZone.run(() => {
data.items = data.items.filter(element => {
return element.level == 'squadron'
});
data.items.forEach(element => {
element.isExpand = false
element.isLoading = false
});
this.stationData = data.items
this.stationData[0].isExpand = true
this.stationData.forEach(item => {
this.getTaskListOfStation(item)
})
})
})
}
expandcarditem(item) {
item.isExpand = !item.isExpand
console.log(item)
if (item.isExpand) {
this.getTaskListOfStation(item)
}
}
//获得消防站下的所有任务
@ -265,9 +360,9 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
let params = {
Month: selectedTime,
CompanyOrganizationId: item.id,
PageNumber: this.PageNumber,
PageNumber: 1,
approvalStatuses: '通过',
PageSize: this.PageSize
PageSize: 9999
}
item.isLoading = true
this.http.get('/api/PlanTasks', {
@ -276,13 +371,13 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
next: (data: any) => {
item.isLoading = false
let listData = [
{ name: '双随机', background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [] },
{ name: '行政许可', background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [] },
{ name: '熟悉演练', background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [] },
{ name: '联络指导', background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [] },
{ name: '消防宣传', background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [] },
{ name: '投诉举报', background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [] },
{ name: '火灾调查', background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [] }
{ name: '双随机', background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '行政许可', background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '熟悉演练', background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '联络指导', background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '消防宣传', background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '投诉举报', background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '火灾调查', background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [], inspected: 0, finished: 0 }
]
data.items.forEach(element => {
listData.forEach((item, key) => {
@ -297,7 +392,22 @@ export class DaMonthlyTaskOverviewComponent implements OnInit {
}
}
item.data = listData
// console.log('点击的救援站通过数据', item)
console.log('当前登录用户所有通过的任务', item);
item.allUnitsNum = 0
item.awaitInspect = 0
item.inspected = 0
item.finished = 0
item.data.forEach(element => {
item.allUnitsNum += element.data.length
element.data.forEach(i => {
i.approvalStatus == '待检查' ? item.awaitInspect += 1 : null
i.approvalStatus == '已检查' ? item.inspected += 1 : null
i.approvalStatus == '待检查' ? element.inspected += 1 : null
i.approvalStatus == '已检查' ? element.finished += 1 : null
});
});
item.percentage = Math.round(item.inspected / item.allUnitsNum) * 100
},
error: (err) => {
this.message.create('warning', '获取数据失败');

187
src/app/home/task/da-oneself-plan/da-oneself-plan.component.html

@ -1,17 +1,18 @@
<!-- <p>本级计划</p> -->
<div class="box">
<div class="timebox">
<nz-select ngModel="2022">
<nz-option nzValue="2021" nzLabel="2021年"></nz-option>
<nz-option nzValue="2022" nzLabel="2022年"></nz-option>
<nz-select [(ngModel)]="selectedYear" (ngModelChange)="selectYear($event)">
<nz-option [nzValue]="2021" nzLabel="2021年"></nz-option>
<nz-option [nzValue]="2022" nzLabel="2022年"></nz-option>
</nz-select>
<div *ngFor="let item of months" class="monthbtn" (click)="selectMonth(item)"
[ngClass]="{'selectedMonth': item.name == selectedMonth}">
[ngClass]="{'selectedMonth': item.id == selectedMonth}">
{{item.name}}
</div>
</div>
<div style="flex: 1;overflow-y: auto;">
<!-- 上部仪表盘 -->
<!-- 上部仪表盘 -->
<div class="instrumentpanelbox">
<div class="instrumentpanelheader">
@ -24,6 +25,9 @@
<div class="instrumentpanel">
<div class="instrumentpanelitem" *ngFor="let item of cardData"
[ngClass]="{'instrumentpanelitemopen': isExpand,'instrumentpanelitemclose': !isExpand}">
<div class="spin" *ngIf="item.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="itemone" *ngIf="!item.isDetails">
<div class="instrumentpanelitemleft">
<div class="panelheadername" [style]="'background:'+ item.background">
@ -37,12 +41,13 @@
style="vertical-align: text-top;cursor: pointer;" nz-icon nzType="right-circle"
nzTheme="outline"></i>
</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">5/9</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">
{{item.passed}}/{{item.data.length}}</p>
</div>
<button *ngIf="isExpand" nz-button class="btn">快速派发</button>
<!-- <button *ngIf="isExpand" nz-button class="btn">一键通过</button> -->
</div>
<div class="instrumentpanelitemright" *ngIf="isExpand">
<nz-progress [nzPercent]="75" nzType="circle" [nzFormat]="formatOne"
<nz-progress [nzPercent]="item.percentage" nzType="circle" [nzFormat]="formatOne"
nzStrokeColor="#42B983">
</nz-progress>
</div>
@ -50,19 +55,25 @@
<div class="itemtwo" *ngIf="item.isDetails">
<p class="itemtwotitle">
<span>{{item.name}}</span>
<span class="back" (click)="openDetails(item,false)"><i nz-icon nzType="rollback"
nzTheme="outline"></i>返回</span>
<span class="back">
<span (click)="openDetails(item,false)">
<i nz-icon nzType="rollback" nzTheme="outline"></i>
返回
</span>
</span>
</p>
<div class="itemtwocontent">
<div class="itemtwocontentitem">
<div class="itemtwocontentitem" *ngFor="let i of item.data">
<p class="itemtwocontentitemp1">
<span class="itemtwocontentitemp1name">济南历下森豪室内娱乐场</span>
<span>
<span class="blue" *ngIf="isExpand">派发</span>
<span class="itemtwocontentitemp1name">{{i.company.companyName}}</span>
<span class="marginr5">
<span class="green" *ngIf="isExpand">{{i.approvalStatus}}</span>
</span>
</p>
<p>A消防救援站</p>
<p><span class="blue" *ngIf="!isExpand">派发</span></p>
<p>{{i.company.organization.name}}</p>
<p class="marginr5" *ngIf="!isExpand">
<span class="green">{{i.approvalStatus}}</span>
</p>
</div>
</div>
</div>
@ -72,48 +83,55 @@
<!-- 救援站列表 -->
<div class="stationcardlistbox">
<div class="stationcardlistitembox" *ngFor="let item of stationData">
<div class="stationcardlistitembox" *ngFor="let element of stationData">
<div class="stationcardlistitem">
<div class="spin" *ngIf="element.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="header">
<span style="width: 16%;">
<img src="../../../../assets//images/icon/station.png" alt="">
{{item.name}}
{{element.name}}
</span>
<span style="width: 8%;">
<span>
单位总数:{{element.awaitInspect}}/{{element.allUnitsNum}}
</span>
</span>
<span style="width: 8%;">单位总数: 7/8</span>
<div style="width: 66%;" class="progress progresssquare">
<span>完成进度</span>
<nz-progress nzStrokeLinecap="square" nzStrokeWidth="16"
nzStrokeColor="#42B983" [nzPercent]="30"></nz-progress>
<nz-progress nzStrokeLinecap="square" [nzStrokeWidth]="16" nzStrokeColor="#42B983"
[nzPercent]="element.percentage"></nz-progress>
</div>
<button nz-button nzType="primary" (click)="adjustment()">任务调整</button>
<span (click)="expandcarditem(item)" class="expand blue">
{{item.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="item.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
<button nz-button nzType="primary" (click)="adjustment(element)">任务调整</button>
<span class="expand blue" (click)="expandcarditem(element)">
{{element.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="element.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
</span>
</div>
<div class="maincontent" *ngIf="item.isExpand">
<div class="maincontentitem">
<div class="maincontent" *ngIf="element.isExpand">
<div class="maincontentitem" *ngFor="let item of element.data">
<div class="maincontentitemleft">
<div class="panelheadername panelheadernameor">
<img src="'../../../../assets/images/icon/huodong.png" alt="">
重大活动
<div class="panelheadername" [style]="'background:'+ item.background">
<img [src]="'../../../../assets/images/icon/'+ item.icon" alt="">
{{item.name}}
</div>
<div class="num">
<div class="round" style="background: #2C4DC0;"></div>
<span class="word">已分配</span>
<span class="boldspan">1</span>
<span class="boldspan">{{item.inspected}}</span>
</div>
<div class="num">
<div class="round" style="background: #42B983;"></div>
<span class="word">已完成</span>
<span class="boldspan">1</span>
<span class="boldspan">{{item.finished}}</span>
</div>
</div>
<div class="maincontentitemright">
<div class="maincontentitemrightitem">
<div class="maincontentitemrightitem" *ngFor="let i of item.data">
<div class="flexcol namebox">
<span>
尬粒酒店管理有限公司济南泺文路分公司
{{i.company.companyName}}
</span>
<span>
单位名称
@ -121,7 +139,7 @@
</div>
<div class="flexcol">
<span>
重点单位
{{i.company.useNature}}
</span>
<span>
级别
@ -129,100 +147,52 @@
</div>
<div class="flexcol">
<span>
历下区A消防救援站
{{i.organization.name}}
</span>
<span>
责任机构
</span>
</div>
<div class="flexcol">
<span>
历下区B消防救援站
</span>
<span>
协助机构
<div class="flexcol flexcolassistant">
<span class="assistant" nz-tooltip [nzTooltipTitle]="titleTemplate">
<span *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
</span>
<ng-template #titleTemplate let-thing>
<span style="margin-right: 6px;" *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
</ng-template>
<span>
协助人员
</span>
</div>
<div class="flexcol">
<span>
<label nz-radio ngModel [ngModel]="xxx"
(click)="radioChange($event)">宣传</label>
宣传
</span>
<span>
同步工作
</span>
</div>
<div class="flexcol progressbox progresssquare">
<span>
<nz-progress style="width: 200px;" nzStrokeLinecap="square"
nzStrokeWidth="16" nzStrokeColor="#42B983" [nzPercent]="30">
</nz-progress>
</span>
<span>
进度
</span>
</div>
<div class="btnbox">
<button nz-button nzType="primary">提交审核</button>
<button style="margin-left: 12px;" nz-button nzType="primary">取消</button>
</div>
</div>
<div class="maincontentitemrightitem">
<div class="flexcol namebox">
<span>
尬粒酒店管理有限公司济南泺文路分公司
</span>
<span>
单位名称
</span>
</div>
<div class="flexcol">
<span>
重点单位
</span>
<span>
级别
</span>
</div>
<div class="flexcol">
<span>
历下区A消防救援站
</span>
<span>
责任机构
</span>
</div>
<div class="flexcol">
<span>
历下区B消防救援站
</span>
<span>
协助机构
</span>
</div>
<div class="flexcol">
<span>
<label nz-radio ngModel [ngModel]="xxx"
(click)="radioChange($event)">宣传</label>
</span>
<span>
同步工作
</span>
</div>
<div class="flexcol progressbox progresssquare">
<span>
<nz-progress style="width: 200px;" nzStrokeLinecap="square"
nzStrokeWidth="16" nzStrokeColor="#42B983" [nzPercent]="30">
</nz-progress>
{{i.inspectionResult}}
</span>
<span>
进度
检查结果
</span>
</div>
<div class="btnbox">
<button nz-button nzType="primary">提交审核</button>
<button style="margin-left: 12px;" nz-button nzType="primary">取消</button>
</div>
</div>
</div>
@ -231,7 +201,6 @@
</div>
</div>
</div>
<!-- -->
<div class="cutoffrule"></div>
</div>

50
src/app/home/task/da-oneself-plan/da-oneself-plan.component.scss

@ -45,18 +45,21 @@
box-sizing: border-box;
padding: 18px;
color: #303133;
padding-bottom: 0;
padding-right: 0;
.instrumentpanelheader {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
box-sizing: border-box;
padding-right: 22px;
}
.instrumentpanel {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.instrumentpanelitem {
@ -66,7 +69,7 @@
opacity: 1;
border: 1px solid #E4E7EC;
display: flex;
position: relative;
.itemone {
width: 100%;
@ -193,6 +196,7 @@
width: 24.3%;
height: 260px;
margin-bottom: 18px;
margin-right: 8px;
.itemone {
.instrumentpanelitemleft {
@ -204,7 +208,8 @@
.instrumentpanelitemclose {
width: 11.7%;
height: 200px;
margin-bottom: 0px;
margin-bottom: 18px;
margin-right: 1%;
.itemone {
.instrumentpanelitemleft {
@ -230,6 +235,7 @@
color: #303133;
box-sizing: border-box;
padding: 0 18px;
position: relative;
.header {
width: 100%;
@ -331,7 +337,13 @@
padding: 12px 0px;
border-bottom: 1px dashed #C7CAD0;
div {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.flexcol {
display: flex;
@ -350,21 +362,33 @@
}
.namebox {
width: 28%;
flex: 2;
}
.progressbox {
width: 220px;
.flexcolassistant {
flex: 2;
overflow: hidden;
span:nth-child(1) {
.assistant {
width: 100%;
}
}
.btnbox {
display: flex;
justify-content: flex-end;
align-self: flex-start;
span {
color: #303133;
margin-right: 6px;
}
img {
width: 16px;
height: 16px;
vertical-align: text-bottom;
}
display: inline-block;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}

225
src/app/home/task/da-oneself-plan/da-oneself-plan.component.ts

@ -1,8 +1,9 @@
import { Component, OnInit,ViewContainerRef } from '@angular/core';
import { Component, OnInit, ViewContainerRef } from '@angular/core';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzModalService } from 'ng-zorro-antd/modal';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import {PlanAdjustmentComponent} from './plan-adjustment/plan-adjustment.component'
import { PlanAdjustmentComponent } from './plan-adjustment/plan-adjustment.component'
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-da-oneself-plan',
templateUrl: './da-oneself-plan.component.html',
@ -10,28 +11,43 @@ import {PlanAdjustmentComponent} from './plan-adjustment/plan-adjustment.compone
})
export class DaOneselfPlanComponent implements OnInit {
constructor(private modal: NzModalService,private message: NzMessageService,private viewContainerRef: ViewContainerRef) { }
constructor(private http: HttpClient, private modal: NzModalService, private message: NzMessageService, private viewContainerRef: ViewContainerRef) { }
validateForm!: FormGroup;
OrganizationId
ngOnInit(): void {
this.OrganizationId = JSON.parse(sessionStorage.getItem('userData')).organizationId
this.selectedMonth = new Date().getMonth() + 1
this.getTasks()
this.getAllStation()
}
months = [
{ name: '1月', isable: true },
{ name: '2月', isable: true },
{ name: '3月', isable: true },
{ name: '4月', isable: true },
{ name: '5月', isable: true },
{ name: '6月', isable: true },
{ name: '7月', isable: true },
{ name: '8月', isable: true },
{ name: '9月', isable: true },
{ name: '10月', isable: true },
{ name: '11月', isable: true },
{ name: '12月', isable: true }
]
selectedMonth
selectedYear = 2022
selectedTime
selectMonth(item) {
this.selectedMonth = item.name
this.selectedMonth = item.id
this.getTasks()
this.getAllStation()
}
selectYear(e) {
this.selectedYear = e
console.log('年', e)
this.getTasks()
this.getAllStation()
}
months = [
{ id: 1, name: '1月', isable: true },
{ id: 2, name: '2月', isable: true },
{ id: 3, name: '3月', isable: true },
{ id: 4, name: '4月', isable: true },
{ id: 5, name: '5月', isable: true },
{ id: 6, name: '6月', isable: true },
{ id: 7, name: '7月', isable: true },
{ id: 8, name: '8月', isable: true },
{ id: 9, name: '9月', isable: true },
{ id: 10, name: '10月', isable: true },
{ id: 11, name: '11月', isable: true },
{ id: 12, name: '12月', isable: true }
]
isExpand = false
expand() {
@ -41,52 +57,169 @@ export class DaOneselfPlanComponent implements OnInit {
formatOne = (percent: number): string => `${percent}%\n完成率`;
//上部卡片
cardData = [
{ name: '重大活动', isDetails: false, background: '#FF9203', icon: 'huodong.png' },
{ name: '双随机', isDetails: false, background: '#1D9DFF', icon: 'suiji.png' },
{ name: '行政许可', isDetails: false, background: '#42B983', icon: 'xuke.png' },
{ name: '熟悉演练', isDetails: false, background: '#9D80FF', icon: 'yanlian.png' },
{ name: '联络指导', isDetails: false, background: '#5483EA', icon: 'zhidao.png' },
{ name: '消防宣传', isDetails: false, background: '#FF5D2A', icon: 'xuanchuan.png' },
{ name: '投诉举报', isDetails: false, background: '#5087FF', icon: 'tousu.png' },
{ name: '火灾调查', isDetails: false, background: '#FF404D', icon: 'huozai.png' }
{ name: '双随机', isDetails: false, isLoading: false, background: '#1D9DFF', icon: 'suiji.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '行政许可', isDetails: false, isLoading: false, background: '#42B983', icon: 'xuke.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '熟悉演练', isDetails: false, isLoading: false, background: '#9D80FF', icon: 'yanlian.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '联络指导', isDetails: false, isLoading: false, background: '#5483EA', icon: 'zhidao.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '消防宣传', isDetails: false, isLoading: false, background: '#FF5D2A', icon: 'xuanchuan.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '投诉举报', isDetails: false, isLoading: false, background: '#5087FF', icon: 'tousu.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '火灾调查', isDetails: false, isLoading: false, background: '#FF404D', icon: 'huozai.png', passed: 0, inspected: 0, percentage: 0, data: [] }
]
openDetails(data, type) {
data.isDetails = type
}
xxx = false
radioChange(e) {
setTimeout(() => {
this.xxx = !this.xxx
}, 0);
async getTasks() {
this.cardData.forEach((item, key) => {
item.data = []
item.passed = 0
item.inspected = 0
});
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
OrganizationId: this.OrganizationId,
PageNumber: 1,
PageSize: 9999
}
return await new Promise<void>((resolve, reject) => {
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
// console.log('任务申请列表', data.items);
data.items.forEach(element => {
this.cardData.forEach((item, key) => {
element.taskType == item.name ? this.cardData[key].data.push(element) : null
});
});
this.cardData.forEach(element => {
element.data.forEach(item => {
item.approvalStatus == '通过' ? element.passed += 1 : null
item.approvalStatus == '已检查 ' ? element.inspected += 1 : null
})
})
this.cardData.forEach(element => {
element.percentage = Math.round(element.inspected / element.data.length) * 100 || 0
})
resolve(data)
console.log('并入卡片数据', this.cardData)
})
})
}
//获得辖区下所有救援站
stationData = []
getAllStation() {
let params = {
ContainsChildren: true,
pageSize: 9999
}
this.http.get('/api/Organizations', {
params: params
}).subscribe((data: any) => {
data.items = data.items.filter(element => {
return element.level == 'squadron'
});
data.items.forEach(element => {
element.isExpand = false
element.isLoading = false
});
this.stationData = data.items
this.stationData[0].isExpand = true
this.stationData.forEach(item => {
this.getTaskListOfStation(item)
})
})
}
stationData = [
{ name: '历下区A消防救援站', isExpand: true },
{ name: '历下区B消防救援站', isExpand: false },
{ name: '历下区C消防救援站', isExpand: false }
]
expandcarditem(item) {
item.isExpand = !item.isExpand
}
nodes: any = []
BuildingTypes
adjustment(){
//获得消防站下的所有任务
PageNumber = 1
PageSize = 9999
getTaskListOfStation(item) {
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
CompanyOrganizationId: item.id,
PageNumber: this.PageNumber,
approvalStatuses: ['通过', '待检查'],
PageSize: this.PageSize
}
item.isLoading = true
this.http.get('/api/PlanTasks', {
params: params
}).subscribe({
next: (data: any) => {
item.isLoading = false
let listData = [
{ name: '双随机', background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '行政许可', background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '熟悉演练', background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '联络指导', background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '消防宣传', background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '投诉举报', background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '火灾调查', background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [], inspected: 0, finished: 0 }
]
data.items.forEach(element => {
listData.forEach((item, key) => {
element.taskType == item.name ? listData[key].data.push(element) : null
});
});
for (let index = 0; index < listData.length; index++) {
const element = listData[index];
if (element.data.length == 0) {
listData.splice(index, 1)
index--
}
}
item.data = listData
console.log('当前登录用户所有通过的任务', item);
item.allUnitsNum = 0
item.awaitInspect = 0
item.inspected = 0
item.finished = 0
item.data.forEach(element => {
item.allUnitsNum += element.data.length
element.data.forEach(i => {
i.approvalStatus == '待检查' ? item.awaitInspect += 1 : null
i.approvalStatus == '已检查' ? item.inspected += 1 : null
i.approvalStatus == '待检查' ? element.inspected += 1 : null
i.approvalStatus == '已检查' ? element.finished += 1 : null
});
});
item.percentage = Math.round(item.inspected / item.allUnitsNum) * 100
},
error: (err) => {
this.message.create('warning', '获取数据失败');
item.isLoading = false
}
})
}
adjustment(item) {
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
const modal = this.modal.create({
nzTitle: "任务调整",
nzContent: PlanAdjustmentComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 900,
nzFooter: null,
nzComponentParams: {
},
nzOnOk: async () => {
console.log(123);
data: JSON.parse(JSON.stringify(item)),
time: selectedTime,
level: '大队'
}
});
const instance = modal.getContentComponent();
modal.afterClose.subscribe(result => {
this.getTaskListOfStation(item)
});
}
}

42
src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.html

@ -1,35 +1,39 @@
<div class="box">
<div style="border: 1px solid #E4E7EC; padding: 20px; width:400px; margin: 0 20px;">
<div class="title"><span>未接任务</span><span>任务总数:{{taskNumber}}/8</span></div>
<div style="border: 1px solid #E4E7EC; padding: 20px; width:400px; margin: 0 20px;position: relative;">
<div class="spin" *ngIf="spin1">
<nz-spin nzSimple></nz-spin>
</div>
<div class="title"><span>未接任务</span></div>
<div class="missed">
<div *ngFor="let item of list" class="item">
<i [style]="'background:'+item.class+';'">&nbsp;&nbsp;</i>
<span>{{item.tag}}</span>
<div (click)="aaa(data)" class="checked" *ngFor="let data of item.item">
<label [nzDisabled]="task" nz-checkbox [(ngModel)]="data.checked" (change)="aaa(data)">{{data.name}}</label>
<div *ngFor="let item of allTasks" class="item">
<i [style]="'background:'+item.background">&nbsp;&nbsp;</i>
<span>{{item.name}}</span>
<div class="checked" *ngFor="let i of item.data">
<label [(ngModel)]="i.checked" [nzDisabled]=" i.approvalStatus=='已检查'" nz-checkbox
(ngModelChange)="push(i,item,$event)">{{i.company.companyName}}</label>
</div>
</div>
</div>
</div>
<div style="border: 1px solid #E4E7EC; padding: 20px; width:400px; margin: 0 20px;" >
<div style="border: 1px solid #E4E7EC; padding: 20px; width:400px; margin: 0 20px;position: relative;">
<div class="spin" *ngIf="spin2">
<nz-spin nzSimple></nz-spin>
</div>
<div class="title">已接任务</div>
<div class="missed">
<div *ngFor="let item2 of list" class="item">
<div *ngFor="let item of data.data" class="item">
<div>
<i [style]="'background:'+item2.class+';'">&nbsp;&nbsp;</i>
<span>{{item2.tag}}</span>
<i [style]="'background:'+item.background">&nbsp;&nbsp;</i>
<span>{{item.name}}</span>
</div>
<div *ngFor="let data of item2.item">
<div class="received checked" *ngIf="data.checked">
<div class="name">{{data.name}}</div>
<div><i nz-icon nzType="close" nzTheme="outline" (click)="bbb(data)"></i></div>
<div *ngFor="let i of item.data">
<div class="received checked">
<div class="name">{{i.company.companyName}}</div>
<div><i nz-icon nzType="close" nzTheme="outline" style="cursor: pointer;"
(click)="cancel(i,item)"></i></div>
</div>
</div>
</div>
</div>
</div>
</div>

2
src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.scss

@ -1,5 +1,7 @@
.box {
display: flex;
max-height: 800px;
overflow-y: auto;
}
.title{
span{

231
src/app/home/task/da-oneself-plan/plan-adjustment/plan-adjustment.component.ts

@ -1,4 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Component, Input, OnInit } from '@angular/core';
import { NzMessageService } from 'ng-zorro-antd/message';
@Component({
selector: 'app-plan-adjustment',
@ -6,65 +8,190 @@ import { Component, OnInit } from '@angular/core';
styleUrls: ['./plan-adjustment.component.scss']
})
export class PlanAdjustmentComponent implements OnInit {
@Input() data?: any;
@Input() time?: any;
@Input() level?: any;
constructor() { }
list = [
{
tag: "行政许可",
class: "#42B983",
item: [
{
name: "想啥吃啥餐饮有限公司",
checked: false
},
{
name: "想啥吃啥餐饮有限公司",
checked: false
}
]
},
{
tag: "双随机",
class: "#1D9DFF",
item: [
{
name: "想啥吃啥餐饮有限公司",
checked: false
}
]
},
]
list2 = [
constructor(private http: HttpClient, private message: NzMessageService) { }
]
taskNumber=0
task=false
spin1 = false
spin2 = false
userId
ngOnInit(): void {
this.userId = JSON.parse(sessionStorage.getItem('userData')).id
this.getTaskListOfStation(this.data, '未接任务')
}
aaa(data) {
if(data.checked && !this.task){
this.list2.push({meu:this.list2.length,data})
console.log(this.list2);
this.taskNumber=this.list2.length
if(this.taskNumber==8){
this.task=true
}
}else{
this.bbb(data)
push(i, item, e) {
let body = {
approvalStatus: e ? '通过' : '待处理'
}
this.http.patch(`/api/PlanTasks/${i.id}`, body).subscribe({
next: (data) => {
this.message.create('success', '处理成功');
if (e) {
i.approvalStatus = '通过'
let isTrue = this.data.data.find((item) => {
return item.name == i.taskType
})
if (isTrue) {
this.data.data.forEach(item => {
if (item.name == i.taskType) {
item.data.push(i)
}
});
} else {
this.data.data.push({
name: item.name,
background: item.background,
data: [i]
})
}
} else {
this.data.data.forEach((item, key) => {
if (item.name == i.taskType) {
for (let index = 0; index < item.data.length; index++) {
const element = item.data[index];
if (element.id == i.id) {
item.data.splice(index, 1)
index--
}
}
}
});
}
},
error: (err) => {
this.message.create('warning', '处理失败');
}
})
}
bbb(e) {
console.log(e);
e.checked=false
for (let index = 0; index < this.list2.length; index++) {
if(e==this.list2[index].data){
this.list2.splice(this.list2[index].meu,1)
this.taskNumber=this.list2.length
if(this.taskNumber!=8){
this.task=false
cancel(i, item) {
// console.log(i)
// console.log(item)
// console.log(this.allTasks)
let body = {
approvalStatus: '待处理'
}
this.http.patch(`/api/PlanTasks/${i.id}`, body).subscribe({
next: (data) => {
this.message.create('success', '处理成功');
this.allTasks.forEach(element => {
if (element.name == item.name) {
element.data.forEach(item => {
if (item.id == i.id) {
item.checked = false
item.approvalStatus = '待处理'
}
});
}
});
for (let index = 0; index < item.data.length; index++) {
const element = item.data[index];
if (element.id == i.id) {
item.data.splice(index, 1)
index--
}
}
},
error: (err) => {
this.message.create('warning', '处理失败');
}
})
}
//获得消防站下的所有任务
PageNumber = 1
PageSize = 9999
allTasks
async getTaskListOfStation(item, type) {
let statuses = []
if (type == '未接任务') {
statuses = ['待处理', '通过', '驳回', '待检查', '已检查']
this.spin1 = true
}
if (type == '已接任务') {
statuses = ['通过', '待检查']
this.spin2 = true
}
let params
if (this.level == '大队') {
params = {
Month: this.time,
CompanyOrganizationId: item.id,
PageNumber: this.PageNumber,
approvalStatuses: statuses,
PageSize: this.PageSize
}
} else {
params = {
Month: this.time,
SupervisorId: this.userId,
PageNumber: this.PageNumber,
approvalStatuses: statuses,
PageSize: this.PageSize
}
}
return new Promise<void>((resolve, reject) => {
this.http.get('/api/PlanTasks', {
params: params
}).subscribe({
next: (data: any) => {
let checkedList = []
this.data.data.forEach(element => {
element.data.forEach(item => {
checkedList.push(item)
});
});
data.items.forEach(element => {
element.checked = false
checkedList.forEach(item => {
if (item.id == element.id) {
element.checked = true
}
});
});
let listData = [
{ name: '双随机', background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '行政许可', background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '熟悉演练', background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '联络指导', background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '消防宣传', background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '投诉举报', background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '火灾调查', background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [], inspected: 0, finished: 0 }
]
data.items.forEach(element => {
listData.forEach((item, key) => {
element.taskType == item.name ? listData[key].data.push(element) : null
});
});
for (let index = 0; index < listData.length; index++) {
const element = listData[index];
if (element.data.length == 0) {
listData.splice(index, 1)
index--
}
}
this.allTasks = listData
if (type == '未接任务') {
this.spin1 = false
}
if (type == '已接任务') {
this.spin2 = false
}
resolve(data)
},
error: (err) => {
reject(err)
}
})
})
}
}

4
src/app/home/task/da-subordinate-audit/allot-person/allot-person.component.html

@ -3,7 +3,7 @@
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="检查员(主)">检查员(主)</nz-form-label>
<nz-form-control>
<nz-select formControlName="main" nzPlaceHolder="请选择消防监督检查员(主)">
<nz-select nzMode="multiple" formControlName="main" nzPlaceHolder="请选择消防监督检查员(主)">
<nz-option *ngFor="let item of mainsupervisorList" [nzValue]="item.id" [nzLabel]="item.name">
</nz-option>
</nz-select>
@ -12,7 +12,7 @@
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="检查员(协)">检查员(协)</nz-form-label>
<nz-form-control>
<nz-select formControlName="assitant" nzPlaceHolder="请选择消防监督检查员(协)">
<nz-select nzMode="multiple" formControlName="assitant" nzPlaceHolder="请选择消防监督检查员(协)">
<nz-option *ngFor="let item of assitantsupervisorList" [nzValue]="item.id" [nzLabel]="item.name">
</nz-option>
</nz-select>

90
src/app/home/task/station-task-apply/apply/apply.component.html

@ -1,4 +1,4 @@
<div class="box applymodel">
<div class="applymodel" cdkScrollable>
<form nz-form [formGroup]="validateForm">
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="账号">任务名称</nz-form-label>
@ -10,7 +10,7 @@
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="单位名称">单位名称</nz-form-label>
<nz-form-control>
<!-- <nz-form-control>
<nz-select formControlName="unitname" (nzScrollToBottom)="loadMore()" nzPlaceHolder="请选择单位" nzAllowClear
[nzDropdownRender]="renderTemplate" nzShowSearch nzServerSearch (nzOnSearch)="search($event)">
<nz-option *ngFor="let o of optionList" [nzValue]="o.id" [nzLabel]="o.companyName"></nz-option>
@ -18,7 +18,91 @@
<ng-template #renderTemplate>
<nz-spin *ngIf="isLoading"></nz-spin>
</ng-template>
</nz-form-control>
</nz-form-control> -->
<div class="selectUnit" (click)="isPopover(unitPopover)">
<ng-container *ngIf="selectedUnitData.name; else elseTemplate">
{{selectedUnitData.name}}
</ng-container>
<ng-template #elseTemplate>
<span class="gray">请点击选择单位</span>
</ng-template>
<div class="selectUnitPopover" *ngIf="unitPopover.isPopover" (click)="$event.stopPropagation()">
<div class="popoverTitle">
<span (click)="popoverMenuSelect(unitPopover,1)"
[ngClass]="{'selectedspan': unitPopover.selectedMenu == 1}">单位名称</span>
<span style="margin: 0 10px;">|</span>
<span (click)="popoverMenuSelect(unitPopover,2)"
[ngClass]="{'selectedspan': unitPopover.selectedMenu == 2}">组织机构</span>
</div>
<div class="popoverContent" *ngIf="unitPopover.selectedMenu == 1">
<div>
<form nz-form (ngSubmit)="submitForm(unitPopover)">
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="unitPopover.search1" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
<button style="display: none;" type="submit"></button>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-checkbox-group [(ngModel)]="unitPopover.unitList" (ngModelChange)="log(unitPopover)"
[ngModelOptions]="{standalone: true}">
</nz-checkbox-group>
</div>
</div>
<div class="popoverContent" *ngIf="unitPopover.selectedMenu == 2">
<div>
<form nz-form>
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="unitPopover.search2" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-tree [nzHideUnMatched]='true' [nzSearchValue]="unitPopover.search2" #nzTreeComponent
[nzData]="unitPopover.nodes" [nzTreeTemplate]="nzTreeTemplate" nzBlockNode
[nzExpandedIcon]="multiExpandedIconTpl2">
</nz-tree>
<ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="nodebox">
<span class="name">
<label *ngIf="node.origin.companyName" [(ngModel)]="node.origin.isChecked"
nz-checkbox (ngModelChange)="orcheckbox(unitPopover,$event,node)"
[ngModelOptions]="{standalone: true}"></label>
{{ node.title }}
</span>
</div>
</ng-template>
<ng-template #multiExpandedIconTpl2 let-node let-origin="origin">
<ng-container *ngIf="node.origin.companyName; else elseTemplate">
</ng-container>
<ng-template #elseTemplate>
<i nz-icon [nzType]="node.isExpanded ? 'caret-down' : 'caret-right'"
class="ant-tree-switcher-line-icon"></i>
</ng-template>
</ng-template>
</div>
</div>
<div class="popoverBtn">
<button nz-button nzType="primary" [nzLoading]="unitPopover.isLoading"
(click)="selectedUnit(unitPopover,$event)">确定</button>
<button nz-button nzType="default" [nzLoading]="unitPopover.isLoading"
(click)="isPopover(unitPopover,$event)">取消</button>
</div>
</div>
</div>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="协助机构">协助机构</nz-form-label>

78
src/app/home/task/station-task-apply/apply/apply.component.scss

@ -0,0 +1,78 @@
.selectUnit {
width: 85%;
position: relative;
background-color: #fff;
border: 1px solid #d9d9d9;
border-radius: 2px;
transition: all 0.3s;
height: 32px;
line-height: 30px;
cursor: pointer;
box-sizing: border-box;
padding-left: 10px;
.gray {
color: #C7C8C7;
}
.selectUnitPopover {
position: absolute;
left: -1px;
top: 35px;
width: 520px;
height: 438px;
z-index: 9999;
background-color: #fff;
border: 1px solid #d9d9d9;
box-sizing: border-box;
padding: 10px;
nz-form-item {
margin: 12px 0;
}
display: flex;
flex-direction: column;
.popoverTitle {
display: flex;
align-items: center;
span {
color: #C7CAD0;
cursor: pointer;
}
.selectedspan {
color: #2C4DC0;
}
}
.popoverContent {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
.popoverContentitem {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
p {
text-align: center;
}
}
}
.popoverBtn {
display: flex;
justify-content: flex-end;
margin-top: 16px;
button {
margin-left: 18px;
}
}
}
}

182
src/app/home/task/station-task-apply/apply/apply.component.ts

@ -5,6 +5,7 @@ import { HttpClient } from '@angular/common/http';
import { TreeService } from 'src/app/service/tree.service';
import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { NzMessageService } from 'ng-zorro-antd/message';
@Component({
selector: 'app-apply',
templateUrl: './apply.component.html',
@ -18,72 +19,169 @@ export class ApplyComponent implements OnInit {
@Input() users?: any;
validateForm!: FormGroup;
constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient, private toTree: TreeService) { }
constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient, private toTree: TreeService, private message: NzMessageService) { }
newTree
ngOnInit(): void {
this.validateForm = this.fb.group({
taskname: [null, [Validators.required]],
unitname: [null, [Validators.required]],
organization: [null, [Validators.required]]
});
// let arr = [...this.supervisorList, ...this.organizationList]
// this.newTree = this.toTree.toTree(arr)
this.newTree = this.nodes
}
this.newTree = this.nodes
Promise.all([this.getCompanies(), this.getAllOrganization()])
.then((results) => {
destroyModal(): void {
this.modal.destroy({ data: 'this the result data' });
let arr = [...JSON.parse(JSON.stringify(this.allOrList)), ...JSON.parse(JSON.stringify(this.unitList))]
console.log(789456, this.allOrList)
console.log(789456, this.unitList)
let nodes = [...this.toTree.toTree(arr)]
this.unitPopover.nodes = JSON.parse(JSON.stringify(nodes))
});
}
optionList = [];
selectedUser = null;
isLoading = false;
PageNumber = 0
PageSize = 50
totalCount
loadMore(): Promise<void> {
if (this.optionList.length >= this.totalCount) {
return
}
this.PageNumber += 1
this.isLoading = true;
this.getCompanies()
}
search(value: string) {
this.optionList = []
this.PageNumber = 1
this.isLoading = true;
this.getCompanies(value)
}
allOrList: any
async getCompanies(CompanyName?: string) {
async getAllOrganization() {
let params = {
CompanyName: CompanyName,
ContainsChildren: true,
pageSize: 9999
}
return new Promise<void>((resolve, reject) => {
this.http.get('/api/Organizations', {
params: params
}).subscribe((data: any) => {
data.items.forEach(element => {
element.key = element.id
element.title = element.name
element.selectable = false
element.disableCheckbox = true
});
this.allOrList = JSON.parse(JSON.stringify(data.items))
this.allOrList.length == 1 ? this.allOrList[0].parentId = null : null
resolve(data)
})
})
}
unitList
async getCompanies(incomingData?: any) {
let params = {
CompanyName: incomingData ? incomingData.search1 : '',
OrganizationId: JSON.parse(sessionStorage.getItem('userData')).organizationId,
PageNumber: this.PageNumber,
PageSize: this.PageSize
PageNumber: 1,
PageSize: 9999
}
await new Promise<void>((resolve, reject) => {
return new Promise<void>((resolve, reject) => {
this.http.get('/api/Companies', {
params: params
}).subscribe((data: any) => {
this.totalCount = data.totalCount
this.isLoading = false;
this.optionList = [...this.optionList, ...data.items];
let map = new Map();
for (let item of this.optionList) {
if (!map.has(item.id)) {
map.set(item.id, item);
};
};
this.optionList = [...map.values()];
data.items.forEach(element => {
element.label = element.companyName
element.value = element.id
element.parentId = element.organizationId
element.key = element.id
element.title = element.companyName
element.level = 4
});
this.unitList = data.items
this.unitPopover.unitList = JSON.parse(JSON.stringify(this.unitList))
resolve(data)
})
})
}
selectedUnitData = {
name: '',
id: ''
}
selectedUnit(data, e?: any) {
e ? e.stopPropagation() : null
let arr = [...data.search1Value, ...data.search2Value]
let arrSet = [...new Set(arr)]
if (arrSet.length > 1) {
this.message.create('warning', '只能选择一个单位');
return
} else {
this.unitList.forEach(element => {
if (element.id == arrSet[0]) {
this.selectedUnitData.name = element.companyName
this.selectedUnitData.id = element.id
}
});
console.log(this.selectedUnitData)
console.log(this.unitPopover)
this.unitPopover.isPopover = false
}
}
//
unitPopover = {
allocated: 0,
isExpand: true,//卡片展开
isPopover: false,//选择单位气泡卡片
isLoading: false,
search1: '',//选择单位气泡卡片---单位选择列表
search1Value: [],
search2: '',//选择单位气泡卡片---组织选择列表
search2Value: [],
searchAll: [],
selectedMenu: 1,//选择单位气泡卡片
data: [
],//表格数据
nodes: [],
unitList: []
}
isPopover(data, e?: any) {
e ? e.stopPropagation() : null
console.log(data)
data.isPopover = !data.isPopover
// data.unitList.forEach(element => {
// element.checked = false
// });
}
// 弹出 tab
popoverMenuSelect(data, type) {
data.selectedMenu = type
}
//搜索框提交
submitForm(data): void {
console.log(data)
data.unitList = []
this.getCompanies(data)
}
log(data) {
let arr = []
data.unitList.forEach(item => {
item.checked ? arr.push(item.id) : null
});
data.search1Value = arr
}
orcheckbox(data, $event, node) {
if ($event) {
data.search2Value.push(node.origin.id)
} else {
for (let index = 0; index < data.search2Value.length; index++) {
const element = data.search2Value[index];
if (element == node.origin.id) {
data.search2Value.splice(index, 1)
index--
}
}
}
console.log(data.search2Value)
}
}

36
src/app/home/task/station-task-apply/station-task-apply.component.html

@ -118,19 +118,19 @@
<div class="flexcol flexcolassistant">
<span class="assistant" nz-tooltip [nzTooltipTitle]="titleTemplate">
<span *ngFor="let i of item.supervisors">
<img *ngIf="i.posts && i.posts[0] == '主查人员'" src="../../../../assets/images/icon/main.png"
alt="">
<img *ngIf="i.posts && i.posts[0] == '协查人员'" src="../../../../assets/images/icon/assist.png"
alt="">
<img *ngIf="i.posts && i.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="i.posts && i.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{i.name}}
</span>
</span>
<ng-template #titleTemplate let-thing>
<span style="margin-right: 6px;" *ngFor="let i of item.supervisors">
<img *ngIf="i.posts && i.posts[0] == '主查人员'" src="../../../../assets/images/icon/main.png"
alt="">
<img *ngIf="i.posts && i.posts[0] == '协查人员'" src="../../../../assets/images/icon/assist.png"
alt="">
<img *ngIf="i.posts && i.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="i.posts && i.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{i.name}}
</span>
</ng-template>
@ -148,19 +148,25 @@
</div>
<div class="flexcol">
<span>
<img *ngIf="item.approvalStatus == '通过'" src="../../../../assets/images/icon/agree.png"
alt="">
<img *ngIf="item.approvalStatus == '驳回'" src="../../../../assets/images/icon/reject.png"
alt="">
<span *ngIf="item.approvalStatus == '待处理'">待处理</span>
<ng-container
*ngIf="item.approvalStatus == '通过'|| item.approvalStatus == '驳回' ; else elseTemplate">
<img *ngIf="item.approvalStatus == '通过'"
src="../../../../assets/images/icon/agree.png" alt="">
<img *ngIf="item.approvalStatus == '驳回'"
src="../../../../assets/images/icon/reject.png" alt="">
</ng-container>
<ng-template #elseTemplate>
<span>{{item.approvalStatus}}</span>
</ng-template>
</span>
<span>
结果
</span>
</div>
<div class="flexcol">
<span class="blue" (click)="look(item)">
查看
<span>
<span class="blue" style="margin-right: 6px;" (click)="look(item)">查看</span>
<span class="red" (click)="deleteTask(item, taskLIst)">删除</span>
</span>
<span>
操作

36
src/app/home/task/station-task-apply/station-task-apply.component.ts

@ -278,14 +278,18 @@ export class StationTaskApplyComponent implements OnInit {
},
nzOnOk: async () => {
console.log(instance.validateForm.value)
if (instance.validateForm.valid) {
if (instance.validateForm.valid && instance.selectedUnitData.id) {
await new Promise((resolve, reject) => {
let selectedMonth = this.selectedMonth < 10 ? "0" + this.selectedMonth : this.selectedMonth;
let selectedTime = this.selectedYear + '-' + selectedMonth + '-' + '01'
let body = {
month: selectedTime,
taskName: instance.validateForm.value.taskname,
taskType: instance.validateForm.value.taskname,
companyId: instance.validateForm.value.unitname,
companyId: instance.selectedUnitData.id,
organizationId: this.OrganizationId,
supervisorIds: instance.validateForm.value.organization,
creationType: '申领任务',
approvalStatus: '待处理'
}
this.http.post('/api/PlanTasks', body).subscribe({
@ -330,7 +334,35 @@ export class StationTaskApplyComponent implements OnInit {
modal.afterOpen.subscribe(() => console.log('[afterOpen] emitted!'));
modal.afterClose.subscribe(result => console.log('[afterClose] The result is:', result));
}
//删除任务
deleteTask(item, incomingData) {
console.log(item)
console.log(incomingData)
this.modal.confirm({
nzTitle: `确定要删除该任务吗?`,
nzOkText: '确定',
nzOkType: 'primary',
nzOnOk: () => {
this.http.delete(`/api/PlanTasks/${item.id}`).subscribe(data => {
for (let index = 0; index < incomingData.length; index++) {
const element = incomingData[index];
if (element.id == item.id) {
incomingData.splice(index, 1)
index--
}
}
this.message.create('success', '删除成功!');
})
},
nzCancelText: '取消',
nzOnCancel: () => {
}
});
}
}
export enum ApprovalStatus {

8
src/app/home/task/station-task-execution/station-task-execution.component.html

@ -39,7 +39,7 @@
</div>
<div class="header">
<span>
任务申请
任务执行
</span>
<span style="font-size: 14px; color: #42B983;">
<i nz-icon nzType="info-circle" nzTheme="outline"></i>
@ -76,10 +76,10 @@
</div>
</div>
<div class="content">
<div class="applybtn">
<!-- <div class="applybtn">
<button (click)="apply()" nz-button nzType="primary"><i nz-icon nzType="form"
nzTheme="outline"></i>申请</button>
</div>
</div> -->
<div class="tablebox">
<div class="tableboxitem" *ngFor="let item of taskLIst"
[ngClass]="{'greenborder': item.approvalStatus == '通过','redborder': item.approvalStatus == '驳回'}">
@ -150,7 +150,7 @@
</div>
<div class="flexcol">
<span>
待检查
{{item.inspectionResult}}
</span>
<span>
检查结果

9
src/app/home/task/station-task-execution/station-task-execution.component.ts

@ -64,16 +64,17 @@ export class StationTaskExecutionComponent implements OnInit {
PageSize = 10
taskLIst = []
getTaskList() {
this.isloading = true
// this.isloading = true
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
OrganizationId: this.OrganizationId,
// OrganizationId: this.OrganizationId,
TaskName: this.searchForm.taskname,
CompanyName: this.searchForm.unitname,
AssitantOrganizationId: this.searchForm.or,
approvalStatuses: ['已检查'],
SupervisorId: this.userId,
PageNumber: this.PageNumber,
CreatorId: this.userId,
PageSize: this.PageSize
}
this.http.get('/api/PlanTasks', {
@ -254,7 +255,7 @@ export class StationTaskExecutionComponent implements OnInit {
}
look(item) {
}

24
src/app/home/task/station-weekly-plan/create-task/create-task.component.html

@ -0,0 +1,24 @@
<div class="box applymodel">
<form nz-form [formGroup]="validateForm">
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="账号">任务名称</nz-form-label>
<nz-form-control>
<nz-radio-group formControlName="taskname">
<label nz-radio [nzValue]="title">{{title}}</label>
</nz-radio-group>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="单位名称">单位名称</nz-form-label>
<nz-form-control>
<nz-select formControlName="unitname" (nzScrollToBottom)="loadMore()" nzPlaceHolder="请选择单位" nzAllowClear
[nzDropdownRender]="renderTemplate" nzShowSearch nzServerSearch (nzOnSearch)="search($event)">
<nz-option *ngFor="let o of optionList" [nzValue]="o" [nzLabel]="o.companyName"></nz-option>
</nz-select>
<ng-template #renderTemplate>
<nz-spin *ngIf="isLoading"></nz-spin>
</ng-template>
</nz-form-control>
</nz-form-item>
</form>
</div>

0
src/app/home/task/station-weekly-plan/create-task/create-task.component.scss

83
src/app/home/task/station-weekly-plan/create-task/create-task.component.ts

@ -0,0 +1,83 @@
import { Component, OnInit, Input } from '@angular/core';
import { NzModalRef } from 'ng-zorro-antd/modal';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { TreeService } from 'src/app/service/tree.service';
import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
@Component({
selector: 'app-create-task',
templateUrl: './create-task.component.html',
styleUrls: ['./create-task.component.scss']
})
export class CreateTaskComponent implements OnInit {
@Input() title?: any;
validateForm!: FormGroup;
constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient, private toTree: TreeService) { }
newTree
ngOnInit(): void {
this.validateForm = this.fb.group({
taskname: [null, [Validators.required]],
unitname: [null, [Validators.required]]
});
}
destroyModal(): void {
this.modal.destroy({ data: 'this the result data' });
}
optionList = [];
selectedUser = null;
isLoading = false;
PageNumber = 0
PageSize = 50
totalCount
loadMore(): Promise<void> {
if (this.optionList.length >= this.totalCount) {
return
}
this.PageNumber += 1
this.isLoading = true;
this.getCompanies()
}
search(value: string) {
this.optionList = []
this.PageNumber = 1
this.isLoading = true;
this.getCompanies(value)
}
async getCompanies(CompanyName?: string) {
let params = {
CompanyName: CompanyName,
OrganizationId: JSON.parse(sessionStorage.getItem('userData')).organizationId,
PageNumber: this.PageNumber,
PageSize: this.PageSize
}
await new Promise<void>((resolve, reject) => {
this.http.get('/api/Companies', {
params: params
}).subscribe((data: any) => {
this.totalCount = data.totalCount
this.isLoading = false;
this.optionList = [...this.optionList, ...data.items];
let map = new Map();
for (let item of this.optionList) {
if (!map.has(item.id)) {
map.set(item.id, item);
};
};
this.optionList = [...map.values()];
resolve(data)
})
})
}
}

43
src/app/home/task/station-weekly-plan/station-weekly-plan.component.html

@ -33,7 +33,7 @@
</div>
<div style="flex: 1;overflow-y: auto;position: relative;">
<div class="spin" *ngIf="isloading">
<div class="spin" *ngIf="isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<!-- 上部仪表盘 -->
@ -48,7 +48,7 @@
<div class="instrumentpanel">
<div class="instrumentpanelitem" *ngFor="let item of cardData"
[ngClass]="{'instrumentpanelitemopen': isExpand,'instrumentpanelitemclose': !isExpand}">
<div class="spin" *ngIf="item.isloading">
<div class="spin" *ngIf="item.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="itemone" *ngIf="!item.isDetails">
@ -64,12 +64,13 @@
style="vertical-align: text-top;cursor: pointer;" nz-icon nzType="right-circle"
nzTheme="outline"></i>
</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">{{item.scale}}</p>
<p style="font-weight: 900;font-size: 36px;text-align: left;">
{{item.passed}}/{{item.data.length}}</p>
</div>
<button *ngIf="isExpand" nz-button class="btn">一键通过</button>
<button *ngIf="isExpand" nz-button class="btn" (click)="allPass(item)">一键通过</button>
</div>
<div class="instrumentpanelitemright" *ngIf="isExpand">
<nz-progress [nzPercent]="75" nzType="circle" [nzFormat]="formatOne"
<nz-progress [nzPercent]="item.percentage" nzType="circle" [nzFormat]="formatOne"
nzStrokeColor="#42B983">
</nz-progress>
</div>
@ -77,14 +78,17 @@
<div class="itemtwo" *ngIf="item.isDetails">
<p class="itemtwotitle">
<span>{{item.name}}</span>
<span class="back">
<i nz-icon nzType="fullscreen" nzTheme="outline" (click)="taskDetails()"></i>
<span class="green" *ngIf="item.name == '熟悉演练' && !isSupervisor"
(click)="apply(item)">新增</span>
<span class="green" *ngIf="(item.name == '双随机' || item.name == '联络指导') && isSupervisor"
(click)="apply(item)">新增</span>
<i nz-icon nzType="fullscreen" nzTheme="outline" (click)="taskDetails(item)"
style="margin:0 8px;"></i>
<span (click)="openDetails(item,false)">
<i nz-icon nzType="rollback" nzTheme="outline"></i>
返回
</span>
</span>
</p>
<div class="itemtwocontent">
@ -121,17 +125,19 @@
<nz-spin nzSimple></nz-spin>
</div>
<div class="header">
<span style="width: 16%;margin-left: 20px;">
<span style="width: 13%;margin-left: 20px;">
<img src="../../../../assets//images/icon/station.png" alt="">
{{element.name}}
</span>
<span style="width: 8%;">单位总数: 7/8</span>
<div style="width: 63%;" class="progress progresssquare">
<span style="width: 8%;">单位总数: {{element.awaitInspect}}/{{element.allUnitsNum}}</span>
<div style="width: 60%;" class="progress progresssquare">
<span>完成进度</span>
<nz-progress nzStrokeLinecap="square" nzStrokeWidth="16" nzStrokeColor="#42B983"
[nzPercent]="30"></nz-progress>
<nz-progress nzStrokeLinecap="square" [nzStrokeWidth]="16" nzStrokeColor="#42B983"
[nzPercent]="element.percentage"></nz-progress>
</div>
<button nz-button nzType="primary">{{isSupervisor ? '协同任务' : '生成周计划'}}</button>
<button nz-button nzType="primary" style="margin-right: 12px;" (click)="adjustment(element)">任务调整</button>
<button nz-button nzType="primary" (click)="createTask(element)">{{isSupervisor ? '协同任务' :
'生成周计划'}}</button>
<span (click)="expandcarditem(element)" class="expand blue">
{{element.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="element.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
@ -147,12 +153,12 @@
<div class="num">
<div class="round" style="background: #2C4DC0;"></div>
<span class="word">已分配</span>
<span class="boldspan">0</span>
<span class="boldspan">{{item.inspected}}</span>
</div>
<div class="num">
<div class="round" style="background: #42B983;"></div>
<span class="word">已完成</span>
<span class="boldspan">0</span>
<span class="boldspan">{{item.finished}}</span>
</div>
</div>
<div class="maincontentitemright">
@ -215,8 +221,9 @@
</div>
<div class="flexcol">
<span>
<nz-date-picker [(ngModel)]="i.checkTime" nzPlaceHolder="请选择检查日期"
nzBorderless (ngModelChange)="checkTime($event,i,element)">
<nz-date-picker [nzDisabledDate]="disabledDate" [(ngModel)]="i.checkTime"
nzPlaceHolder="请选择检查日期" nzBorderless
(ngModelChange)="checkTime($event,i,element)">
</nz-date-picker>
</span>
<span>

332
src/app/home/task/station-weekly-plan/station-weekly-plan.component.ts

@ -6,6 +6,10 @@ import { NzMessageService } from 'ng-zorro-antd/message';
import { HttpClient } from '@angular/common/http';
import { TreeService } from 'src/app/service/tree.service';
import * as moment from 'moment';
import { TaskDetailsComponent } from './task-details/task-details.component';
import { CreateTaskComponent } from './create-task/create-task.component';
import { differenceInCalendarDays, setHours } from 'date-fns'
import { PlanAdjustmentComponent } from '../da-oneself-plan/plan-adjustment/plan-adjustment.component';
@Component({
selector: 'app-station-weekly-plan',
templateUrl: './station-weekly-plan.component.html',
@ -13,11 +17,13 @@ import * as moment from 'moment';
})
export class StationWeeklyPlanComponent implements OnInit {
constructor(private http: HttpClient, private modal: NzModalService, private message: NzMessageService) { }
constructor(private http: HttpClient, private modal: NzModalService, private message: NzMessageService, private viewContainerRef: ViewContainerRef) { }
OrganizationId
userId
isSupervisor
today = new Date();
disabledDate = (current: Date): boolean => differenceInCalendarDays(current, this.today) <= 0;
months = [
{ id: 1, name: '1月', isable: true },
{ id: 2, name: '2月', isable: true },
@ -39,11 +45,13 @@ export class StationWeeklyPlanComponent implements OnInit {
this.selectedMonth = item.id
this.initializeData()
this.getTaskList()
this.getTaskListPass(this.stationData[0])
}
selectYear(e) {
this.selectedYear = e
this.initializeData()
this.getTaskList()
this.getTaskListPass(this.stationData[0])
}
isExpand = true
@ -97,7 +105,7 @@ export class StationWeeklyPlanComponent implements OnInit {
}
stationData = []
//获得辖区下所有救援站
totalCount: string
@ -123,28 +131,28 @@ export class StationWeeklyPlanComponent implements OnInit {
}
cardData = [
{ name: '双随机', isDetails: false, isloading: false, background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [] },
{ name: '行政许可', isDetails: false, isloading: false, background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [] },
{ name: '熟悉演练', isDetails: false, isloading: false, background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [] },
{ name: '联络指导', isDetails: false, isloading: false, background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [] },
{ name: '消防宣传', isDetails: false, isloading: false, background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [] },
{ name: '投诉举报', isDetails: false, isloading: false, background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [] },
{ name: '火灾调查', isDetails: false, isloading: false, background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [] }
{ name: '双随机', isDetails: false, isLoading: false, background: '#1D9DFF', icon: 'suiji.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '行政许可', isDetails: false, isLoading: false, background: '#42B983', icon: 'xuke.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '熟悉演练', isDetails: false, isLoading: false, background: '#9D80FF', icon: 'yanlian.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '联络指导', isDetails: false, isLoading: false, background: '#5483EA', icon: 'zhidao.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '消防宣传', isDetails: false, isLoading: false, background: '#FF5D2A', icon: 'xuanchuan.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '投诉举报', isDetails: false, isLoading: false, background: '#5087FF', icon: 'tousu.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '火灾调查', isDetails: false, isLoading: false, background: '#FF404D', icon: 'huozai.png', passed: 0, inspected: 0, percentage: 0, data: [] }
]
//初始化数据
initializeData() {
this.cardData = [
{ name: '双随机', isDetails: false, isloading: false, background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [] },
{ name: '行政许可', isDetails: false, isloading: false, background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [] },
{ name: '熟悉演练', isDetails: false, isloading: false, background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [] },
{ name: '联络指导', isDetails: false, isloading: false, background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [] },
{ name: '消防宣传', isDetails: false, isloading: false, background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [] },
{ name: '投诉举报', isDetails: false, isloading: false, background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [] },
{ name: '火灾调查', isDetails: false, isloading: false, background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [] }
{ name: '双随机', isDetails: false, isLoading: false, background: '#1D9DFF', icon: 'suiji.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '行政许可', isDetails: false, isLoading: false, background: '#42B983', icon: 'xuke.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '熟悉演练', isDetails: false, isLoading: false, background: '#9D80FF', icon: 'yanlian.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '联络指导', isDetails: false, isLoading: false, background: '#5483EA', icon: 'zhidao.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '消防宣传', isDetails: false, isLoading: false, background: '#FF5D2A', icon: 'xuanchuan.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '投诉举报', isDetails: false, isLoading: false, background: '#5087FF', icon: 'tousu.png', passed: 0, inspected: 0, percentage: 0, data: [] },
{ name: '火灾调查', isDetails: false, isLoading: false, background: '#FF404D', icon: 'huozai.png', passed: 0, inspected: 0, percentage: 0, data: [] }
]
this.stationData.forEach(element => {
element.isExpand = false
element.isExpand = true
element.isLoading = false
element.data = []
});
@ -152,38 +160,114 @@ export class StationWeeklyPlanComponent implements OnInit {
isloading = false
isLoading = false
PageNumber = 1
PageSize = 9999
async getTaskList() {
this.isloading = true
this.cardData.forEach(item => {
item.data = []
})
this.isLoading = true
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
// OrganizationId: this.isSupervisor ? this.OrganizationId : "",
SupervisorId: this.userId,
PageNumber: this.PageNumber,
PageSize: this.PageSize
}
var p = await new Promise<void>((resolve, reject) => {
return await new Promise<void>((resolve, reject) => {
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
this.isloading = false
this.isLoading = false
// console.log('任务申请列表', data.items);
data.items.forEach(element => {
this.cardData.forEach((item, key) => {
element.taskType == item.name ? this.cardData[key].data.push(element) : null
});
});
this.cardData.forEach(element => {
element.data.forEach(item => {
item.approvalStatus == '通过' ? element.passed += 1 : null
item.approvalStatus == '已检查 ' ? element.inspected += 1 : null
})
})
this.cardData.forEach(element => {
element.percentage = Math.round(element.inspected / element.data.length) * 100
})
resolve(data)
console.log('并入卡片数据', this.cardData)
})
})
return p
}
stationData = [
{ name: '', isExpand: true, isLoading: false, data: [], allUnitsNum: 0, awaitInspect: 0, inspected: 0, percentage: 0 }
]
async getTaskListPass(item) {
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
approvalStatuses: ['通过', '待检查', '已检查'],
SupervisorId: this.userId,
PageNumber: this.PageNumber,
PageSize: this.PageSize
}
item.isLoading = true
return await new Promise<void>((resolve, reject) => {
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
item.isLoading = false
let listData = [
{ name: '双随机', background: '#1D9DFF', icon: 'suiji.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '行政许可', background: '#42B983', icon: 'xuke.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '熟悉演练', background: '#9D80FF', icon: 'yanlian.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '联络指导', background: '#5483EA', icon: 'zhidao.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '消防宣传', background: '#FF5D2A', icon: 'xuanchuan.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '投诉举报', background: '#5087FF', icon: 'tousu.png', scale: '0/0', data: [], inspected: 0, finished: 0 },
{ name: '火灾调查', background: '#FF404D', icon: 'huozai.png', scale: '0/0', data: [], inspected: 0, finished: 0 }
]
data.items.forEach(element => {
listData.forEach((item, key) => {
element.taskType == item.name ? listData[key].data.push(element) : null
});
});
for (let index = 0; index < listData.length; index++) {
const element = listData[index];
if (element.data.length == 0) {
listData.splice(index, 1)
index--
}
}
item.data = listData
console.log('当前登录用户所有通过的任务', item);
item.allUnitsNum = 0
item.awaitInspect = 0
item.inspected = 0
item.finished = 0
item.data.forEach(element => {
item.allUnitsNum += element.data.length
element.data.forEach(i => {
i.approvalStatus == '待检查' ? item.awaitInspect += 1 : null
i.approvalStatus == '已检查' ? item.inspected += 1 : null
i.approvalStatus == '待检查' ? element.inspected += 1 : null
i.approvalStatus == '已检查' ? element.finished += 1 : null
});
});
item.percentage = Math.round(item.inspected / item.allUnitsNum) * 100
resolve(data)
})
})
}
//接受任务
accept(i, item) {
this.modal.confirm({
@ -191,7 +275,7 @@ export class StationWeeklyPlanComponent implements OnInit {
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
item.isloading = true
item.isLoading = true
this.http.post(`/api/PlanTasks/Approval/${i.id}`, null, {
params: {
approvalStatus: '通过'
@ -200,19 +284,14 @@ export class StationWeeklyPlanComponent implements OnInit {
next: (data) => {
this.message.create('success', '已接受');
i.approvalStatus = '通过'
item.isloading = false
this.stationData.forEach(element => {
if (element.id == i.company.organizationId) {
if (element.isExpand) {
this.getTaskListOfStation(element)
}
}
});
item.isLoading = false
item.passed += 1
this.getTaskListPass(this.stationData[0])
},
error: (err) => {
this.message.create('warning', '接受失败');
item.isloading = false
item.isLoading = false
}
})
},
@ -226,7 +305,7 @@ export class StationWeeklyPlanComponent implements OnInit {
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
item.isloading = true
item.isLoading = true
this.http.post(`/api/PlanTasks/Approval/${i.id}`, null, {
params: {
approvalStatus: '驳回'
@ -235,27 +314,27 @@ export class StationWeeklyPlanComponent implements OnInit {
next: (data) => {
this.message.create('success', '已拒绝');
i.approvalStatus = '驳回'
item.isloading = false
this.stationData.forEach(element => {
if (element.id == i.company.organizationId) {
if (element.isExpand) {
this.getTaskListOfStation(element)
}
}
});
item.isLoading = false
item.passed -= 1
this.getTaskListPass(this.stationData[0])
},
error: (err) => {
this.message.create('warning', '拒绝失败');
item.isloading = false
item.isLoading = false
}
})
},
nzCancelText: '取消'
});
}
userName
ngOnInit(): void {
this.OrganizationId = JSON.parse(sessionStorage.getItem('userData')).organizationId
this.userId = JSON.parse(sessionStorage.getItem('userData')).id
this.userName = JSON.parse(sessionStorage.getItem('userData')).name
this.stationData[0].name = this.userName
let roles = JSON.parse(sessionStorage.getItem('userData')).roles
let isSupervisor = roles.find(item => {
return item.name.indexOf('检查') != -1
@ -263,9 +342,9 @@ export class StationWeeklyPlanComponent implements OnInit {
isSupervisor ? this.isSupervisor = true : this.isSupervisor = false
this.selectedMonth = new Date().getMonth() + 1
this.getAllStation()
// this.getAllStation()
this.getTaskList()
this.getTaskListPass(this.stationData[0])
setTimeout(() => {
this.rollStart()
@ -312,10 +391,10 @@ export class StationWeeklyPlanComponent implements OnInit {
expandcarditem(item) {
item.isExpand = !item.isExpand
console.log(item)
if (item.isExpand) {
this.getTaskListOfStation(item)
}
// console.log(item)
// if (item.isExpand) {
// this.getTaskListOfStation(item)
// }
}
//获得消防站下的所有任务
@ -325,7 +404,7 @@ export class StationWeeklyPlanComponent implements OnInit {
Month: selectedTime,
CompanyOrganizationId: item.id,
PageNumber: this.PageNumber,
approvalStatuses: '通过',
approvalStatuses: ['通过', '待检查', '已检查'],
PageSize: this.PageSize
}
item.isLoading = true
@ -364,7 +443,156 @@ export class StationWeeklyPlanComponent implements OnInit {
}
})
}
taskDetails(){
taskDetails(item) {
// console.log(item)
const modal = this.modal.create({
nzTitle: item.name,
nzContent: TaskDetailsComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 900,
nzMaskClosable: false,
nzFooter: null,
nzComponentParams: {
data: item,
parent: this
}
});
const instance = modal.getContentComponent();
modal.afterOpen.subscribe(() => console.log('[afterOpen] emitted!'));
modal.afterClose.subscribe(result => console.log('[afterClose] The result is:', result));
}
apply(item) {
const modal = this.modal.create({
nzTitle: '新增' + item.name + '任务',
nzContent: CreateTaskComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 660,
nzMaskClosable: false,
nzComponentParams: {
title: item.name,
},
nzOnOk: async () => {
console.log(instance.validateForm.value)
if (instance.validateForm.valid) {
await new Promise((resolve, reject) => {
let selectedMonth = this.selectedMonth < 10 ? "0" + this.selectedMonth : this.selectedMonth;
let selectedTime = this.selectedYear + '-' + selectedMonth + '-' + '01'
let body = {
month: selectedTime,
taskName: instance.validateForm.value.taskname,
taskType: instance.validateForm.value.taskname,
companyId: instance.validateForm.value.unitname.id,
organizationId: this.OrganizationId,
supervisorIds: [this.userId],
creationType: '自主任务',
approvalStatus: '通过'
}
this.http.post('/api/PlanTasks', body).subscribe({
next: (data: any) => {
console.log(item)
data.company = instance.validateForm.value.unitname
item.data.push(data)
item.passed += 1
// this.getTaskList()
this.getTaskListPass(this.stationData[0])
this.message.create('success', '创建成功');
resolve(data)
return true
},
error: (err) => {
this.message.create('warning', '创建失败');
reject(err)
return false
}
})
})
} else {
this.message.create('warning', '请填写完整!');
return false
}
}
});
const instance = modal.getContentComponent();
modal.afterOpen.subscribe(() => console.log('[afterOpen] emitted!'));
modal.afterClose.subscribe(result => console.log('[afterClose] The result is:', result));
}
createTask(element) {
console.log(element)
let taskIds = []
element.data.forEach(item => {
item.data.forEach(i => {
i.checkTime ? taskIds.push(i.id) : null
});
});
let params = {
ids: taskIds,
approvalStatus: '待检查'
}
this.http.post('/api/PlanTasks/ApprovalMany', null, { params: params }).subscribe({
next: (data: any) => {
this.message.create('success', '发布成功');
},
error: (err) => {
this.message.create('warning', '发布失败');
}
})
}
adjustment(item) {
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
const modal = this.modal.create({
nzTitle: "任务调整",
nzContent: PlanAdjustmentComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 900,
nzFooter: null,
nzComponentParams: {
data: JSON.parse(JSON.stringify(item)),
time: selectedTime,
level: '非大队'
}
});
const instance = modal.getContentComponent();
modal.afterClose.subscribe(result => {
this.getTaskListPass(this.stationData[0])
});
}
allPass(item) {
console.log(item)
this.modal.confirm({
nzTitle: `确定要全部接受该模块下所有任务吗?`,
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
let ids = []
item.data.forEach(element => {
ids.push(element.id)
});
this.http.post(`/api/PlanTasks/ApprovalMany`, null, {
params: {
ids: ids,
approvalStatus: '通过'
}
}).subscribe({
next: (data) => {
this.message.create('success', '成功');
item.data.forEach(element => {
element.approvalStatus = '通过'
});
this.getTaskListPass(this.stationData[0])
},
error: (err) => {
this.message.create('warning', '失败');
item.isLoading = false
}
})
},
nzCancelText: '取消'
});
}
}

11
src/app/home/task/station-weekly-plan/task-details/task-details.component.html

@ -1,13 +1,16 @@
<div>
<div class="list">
<div class="item">
<div class="item" *ngFor="let item of data.data">
<div class="text">
想吃啥吃啥有限公司
{{item.company.companyName}}
</div>
<div class="state">
已派发
<span class="green" (click)="accept(item)">接受</span>
<span class="red" (click)="reject(item)">拒绝</span>
<span *ngIf="item.approvalStatus == '待处理'">待处理</span>
<span class="green" *ngIf="item.approvalStatus == '通过'">已通过</span>
<span class="red" *ngIf="item.approvalStatus == '驳回'">已驳回</span>
</div>
</div>
</div>
</div>

9
src/app/home/task/station-weekly-plan/task-details/task-details.component.scss

@ -6,10 +6,15 @@
.item{
display: flex;
border-bottom: 1px dotted #C7CAD0;
height: 60px;
line-height: 60px;
height: 50px;
line-height: 50px;
.text{
flex: 1;
}
.state{
span{
margin-left: 8px;
}
}
}
}

25
src/app/home/task/station-weekly-plan/task-details/task-details.component.spec.ts

@ -1,25 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { TaskDetailsComponent } from './task-details.component';
describe('TaskDetailsComponent', () => {
let component: TaskDetailsComponent;
let fixture: ComponentFixture<TaskDetailsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ TaskDetailsComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(TaskDetailsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

73
src/app/home/task/station-weekly-plan/task-details/task-details.component.ts

@ -1,4 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Component, Input, OnInit } from '@angular/core';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzModalService } from 'ng-zorro-antd/modal';
@Component({
selector: 'app-task-details',
@ -6,10 +9,74 @@ import { Component, OnInit } from '@angular/core';
styleUrls: ['./task-details.component.scss']
})
export class TaskDetailsComponent implements OnInit {
constructor() { }
@Input() data?: any;
@Input() parent?: any;
constructor(private http: HttpClient, private modal: NzModalService, private message: NzMessageService) { }
ngOnInit(): void {
}
//接受任务
accept(i) {
console.log(this.parent)
this.modal.confirm({
nzTitle: `确定要接受该任务吗?`,
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
this.http.post(`/api/PlanTasks/Approval/${i.id}`, null, {
params: {
approvalStatus: '通过'
}
}).subscribe({
next: (data) => {
this.message.create('success', '已接受');
i.approvalStatus = '通过'
this.parent.stationData.forEach(element => {
if (element.id == i.company.organizationId) {
if (element.isExpand) {
this.parent.getTaskListOfStation(element)
}
}
});
},
error: (err) => {
this.message.create('warning', '接受失败');
}
})
},
nzCancelText: '取消'
});
}
//拒绝任务
reject(i) {
this.modal.confirm({
nzTitle: `确定要拒绝该任务吗?`,
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
this.http.post(`/api/PlanTasks/Approval/${i.id}`, null, {
params: {
approvalStatus: '驳回'
}
}).subscribe({
next: (data) => {
this.message.create('success', '已拒绝');
i.approvalStatus = '驳回'
this.parent.stationData.forEach(element => {
if (element.id == i.company.organizationId) {
if (element.isExpand) {
this.parent.getTaskListOfStation(element)
}
}
});
},
error: (err) => {
this.message.create('warning', '拒绝失败');
}
})
},
nzCancelText: '取消'
});
}
}

30
src/app/home/task/task.component.ts

@ -7,33 +7,33 @@ import { Router } from '@angular/router';
styleUrls: ['./task.component.scss']
})
export class TaskComponent implements OnInit {
level=""
user=false
level = ""
user = false
constructor(private router: Router) { }
ngOnInit(): void {
console.log(JSON.parse(sessionStorage.getItem('userData')));
this.level=JSON.parse(sessionStorage.getItem('userData')).organizationLevel
let user=JSON.parse(sessionStorage.getItem('userData')).roles
this.level = JSON.parse(sessionStorage.getItem('userData')).organizationLevel
let user = JSON.parse(sessionStorage.getItem('userData')).roles
for (let index = 0; index < user.length; index++) {
const element = user[index].name;
if(element.indexOf('检查') != -1){
this.user=true
if (element.indexOf('检查') != -1) {
this.user = true
}
}
if(this.router.url=="/task"){
if(this.level=="brigade"){
if (this.router.url == "/task") {
if (this.level == "brigade") {
this.router.navigate(['/task/indicators'])
}else if(this.level=="battalion" && !this.user){
} else if (this.level == "battalion" && !this.user) {
this.router.navigate(['/task/monthlytaskoverview'])
}else if(this.level=="squadron" || this.user){
} else if (this.level == "squadron" || this.user) {
this.router.navigate(['/task/taskexecution'])
}
}
}
}

22
src/app/home/task/zhi-indicators/edit-or/edit-or.component.html

@ -0,0 +1,22 @@
<div class="box applymodel">
<form nz-form [formGroup]="validateForm">
<nz-form-item>
<nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="协助机构">协助机构</nz-form-label>
<nz-form-control>
<nz-tree-select [nzShowSearch]='true' [nzDropdownClassName]="'maxHeightTreeSelect'"
formControlName="organization" [nzNodes]="newTree" nzPlaceHolder="请选择协助机构"
[nzExpandedIcon]="multiExpandedIconTpl" nzCheckable [nzCheckStrictly]="true">
</nz-tree-select>
<ng-template #multiExpandedIconTpl let-node let-origin="origin">
<ng-container *ngIf="node.children.length == 0; else elseTemplate">
</ng-container>
<ng-template #elseTemplate>
<i nz-icon [nzType]="node.isExpanded ? 'caret-down' : 'caret-right'"
class="ant-tree-switcher-line-icon"></i>
</ng-template>
</ng-template>
</nz-form-control>
</nz-form-item>
</form>
</div>

0
src/app/home/task/zhi-indicators/edit-or/edit-or.component.scss

41
src/app/home/task/zhi-indicators/edit-or/edit-or.component.ts

@ -0,0 +1,41 @@
import { Component, OnInit, Input } from '@angular/core';
import { NzModalRef } from 'ng-zorro-antd/modal';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { TreeService } from 'src/app/service/tree.service';
import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
@Component({
selector: 'app-edit-or',
templateUrl: './edit-or.component.html',
styleUrls: ['./edit-or.component.scss']
})
export class EditOrComponent implements OnInit {
@Input() selectedData?: any;
@Input() organizationList?: any;
@Input() users?: any;
validateForm!: FormGroup;
constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient, private toTree: TreeService) { }
newTree = []
ngOnInit(): void {
this.validateForm = this.fb.group({
organization: [this.selectedData]
});
console.log(111, this.users)
console.log(222, this.organizationList)
let arr = [...this.users, ...this.organizationList]
console.log(333, arr)
this.newTree = this.toTree.toTree(arr)
}
destroyModal(): void {
this.modal.destroy({ data: 'this the result data' });
}
}

512
src/app/home/task/zhi-indicators/zhi-indicators.component.html

@ -1,18 +1,318 @@
<!-- <p>任务指标</p> -->
<div class="box">
<div class="timebox">
<nz-select ngModel="2022">
<nz-option nzValue="2021" nzLabel="2021年"></nz-option>
<nz-option nzValue="2022" nzLabel="2022年"></nz-option>
<nz-select [(ngModel)]="selectedYear" (ngModelChange)="selectYear($event)">
<nz-option [nzValue]="2021" nzLabel="2021年"></nz-option>
<nz-option [nzValue]="2022" nzLabel="2022年"></nz-option>
</nz-select>
<div *ngFor="let item of months" class="monthbtn" (click)="selectMonth(item)"
[ngClass]="{'selectedMonth': item.name == selectedMonth}">
[ngClass]="{'selectedMonth': item.id == selectedMonth}">
{{item.name}}
</div>
</div>
<div class="content" cdkScrollable>
<!-- 双随机 -->
<!-- 投诉举报 complaint-->
<div class="panel">
<div class="spin" *ngIf="complaint.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="panelheader">
<div class="panelheaderleft">
<div class="panelheadername panelheadernameblue2">
<img src="../../../../assets/images/icon/yanlian.png" alt="">
投诉举报
</div>
<button nz-button nzType="primary" nz-popover nzPopoverPlacement="bottomLeft"
[nzPopoverContent]="contentTemplate1" [nzPopoverTrigger]=null
[nzPopoverVisible]="complaint.isPopover" (click)="isPopover(complaint)">选择单位</button>
<ng-template #contentTemplate1>
<div class="selectUnitPopover">
<div class="popoverTitle">
<span (click)="popoverMenuSelect(complaint,1)"
[ngClass]="{'selectedspan': complaint.selectedMenu == 1}">单位名称</span>
<span style="margin: 0 10px;">|</span>
<span (click)="popoverMenuSelect(complaint,2)"
[ngClass]="{'selectedspan': complaint.selectedMenu == 2}">组织机构</span>
</div>
<div class="popoverContent" *ngIf="complaint.selectedMenu == 1">
<div>
<form nz-form (ngSubmit)="submitForm(complaint)">
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="complaint.search1" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
<button style="display: none;" type="submit"></button>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-checkbox-group [(ngModel)]="complaint.unitList"
(ngModelChange)="log(complaint)"></nz-checkbox-group>
<!-- <p class="blue" *ngIf="complaint.unitList.length < totalCount"
(click)="moreData()">更多</p> -->
</div>
</div>
<div class="popoverContent" *ngIf="complaint.selectedMenu == 2">
<div>
<form nz-form>
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="complaint.search2" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-tree [nzHideUnMatched]='true' [nzSearchValue]="complaint.search2"
#nzTreeComponent [nzData]="complaint.nodes" [nzTreeTemplate]="nzTreeTemplate"
nzBlockNode [nzExpandedIcon]="multiExpandedIconTpl">
</nz-tree>
<ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="nodebox">
<span class="name">
<label *ngIf="node.origin.companyName"
[(ngModel)]="node.origin.isChecked" nz-checkbox
(ngModelChange)="orcheckbox(complaint,$event,node)"></label>
{{ node.title }}
</span>
</div>
</ng-template>
<ng-template #multiExpandedIconTpl let-node let-origin="origin">
<ng-container *ngIf="node.origin.companyName; else elseTemplate">
</ng-container>
<ng-template #elseTemplate>
<i nz-icon [nzType]="node.isExpanded ? 'caret-down' : 'caret-right'"
class="ant-tree-switcher-line-icon"></i>
</ng-template>
</ng-template>
</div>
</div>
<div class="popoverBtn">
<button nz-button nzType="primary" [nzLoading]="complaint.isLoading"
(click)="selectedUnit(complaint,'投诉举报')">确定</button>
<button nz-button nzType="default" [nzLoading]="complaint.isLoading"
(click)="isPopover(complaint)">取消</button>
</div>
</div>
</ng-template>
<span>
已分配: <span class="blue">{{complaint.allocated}}/{{complaint.data.length}}</span> 家单位
</span>
</div>
<div class="panelheaderright">
<!-- <button nz-button nzType="primary">提交审核</button> -->
<span (click)="expand(complaint)" class="expand blue">
{{complaint.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="complaint.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
</span>
</div>
</div>
<div class="panelcontent" *ngIf="complaint.isExpand">
<nz-table #colSpanTable [nzData]="complaint.data" nzBordered nzSize="small" [nzShowPagination]="false">
<thead>
<tr>
<th nzWidth="25%">单位名称</th>
<th nzWidth="42%">配合机构</th>
<th nzWidth="25%">说明</th>
<th nzWidth="8%">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of colSpanTable.data; index as i">
<td>{{item.company.companyName}}</td>
<td class="editOr">
<span class="name">
<span>{{item.organization.name}}</span>
<span *ngFor="let i of item.supervisors">
/{{i.name}}
</span>
</span>
<span class="blue" (click)="editOr(complaint,item)"
[ngClass]="{'forbid': item.approvalStatus == '通过'}">修改机构</span>
</td>
<td style="padding:0 2px!important;">
<textarea [disabled]="item.approvalStatus == '通过'" nzAutosize
[(ngModel)]="item.description" style="border: 0;" rows="1" nz-input
placeholder="一段简短的说明文字..."
(ngModelChange)="taskDescChange(complaint,item)"></textarea>
</td>
<td style="display: flex;justify-content: space-between;align-items: center;">
<ng-container *ngIf="item.approvalStatus == '未派发'; else elseTemplate">
<span class="blue" (click)="distribute(item,'投诉举报')">派发</span>
</ng-container>
<ng-template #elseTemplate>
<span class="green">已派发</span>
</ng-template>
<span style="margin-left: 6px;" class="red"
(click)="deleteTask(item,complaint)">删除</span>
</td>
</tr>
</tbody>
</nz-table>
</div>
</div>
<!-- 行政许可 -->
<div class="panel">
<div class="spin" *ngIf="permission.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="panelheader">
<div class="panelheaderleft">
<div class="panelheadername panelheadernamegreen">
<img src="../../../../assets/images/icon/yanlian.png" alt="">
行政许可
</div>
<button nz-button nzType="primary" nz-popover nzPopoverPlacement="bottomLeft"
[nzPopoverContent]="contentTemplate2" [nzPopoverTrigger]=null
[nzPopoverVisible]="permission.isPopover" (click)="isPopover(permission)">选择单位</button>
<ng-template #contentTemplate2>
<div class="selectUnitPopover">
<div class="popoverTitle">
<span (click)="popoverMenuSelect(permission,1)"
[ngClass]="{'selectedspan': permission.selectedMenu == 1}">单位名称</span>
<span style="margin: 0 10px;">|</span>
<span (click)="popoverMenuSelect(permission,2)"
[ngClass]="{'selectedspan': permission.selectedMenu == 2}">组织机构</span>
</div>
<div class="popoverContent" *ngIf="permission.selectedMenu == 1">
<div>
<form nz-form (ngSubmit)="submitForm(permission)">
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="permission.search1" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
<button style="display: none;" type="submit"></button>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-checkbox-group [(ngModel)]="permission.unitList"
(ngModelChange)="log(permission)"></nz-checkbox-group>
<!-- <p class="blue" *ngIf="permission.unitList.length < totalCount"
(click)="moreData()">更多</p> -->
</div>
</div>
<div class="popoverContent" *ngIf="permission.selectedMenu == 2">
<div>
<form nz-form>
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
<input type="text" [(ngModel)]="permission.search2" nz-input
placeholder="请输入单位名称" [ngModelOptions]="{standalone: true}" />
</nz-input-group>
</nz-form-control>
</nz-form-item>
</form>
</div>
<div class="popoverContentitem">
<nz-tree [nzHideUnMatched]='true' [nzSearchValue]="permission.search2"
#nzTreeComponent [nzData]="permission.nodes" [nzTreeTemplate]="nzTreeTemplate"
nzBlockNode [nzExpandedIcon]="multiExpandedIconTpl">
</nz-tree>
<ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="nodebox">
<span class="name">
<label *ngIf="node.origin.companyName"
[(ngModel)]="node.origin.isChecked" nz-checkbox
(ngModelChange)="orcheckbox(permission,$event,node)"></label>
{{ node.title }}
</span>
</div>
</ng-template>
<ng-template #multiExpandedIconTpl let-node let-origin="origin">
<ng-container *ngIf="node.origin.companyName; else elseTemplate">
</ng-container>
<ng-template #elseTemplate>
<i nz-icon [nzType]="node.isExpanded ? 'caret-down' : 'caret-right'"
class="ant-tree-switcher-line-icon"></i>
</ng-template>
</ng-template>
</div>
</div>
<div class="popoverBtn">
<button nz-button nzType="primary" [nzLoading]="permission.isLoading"
(click)="selectedUnit(permission,'行政许可')">确定</button>
<button nz-button nzType="default" [nzLoading]="permission.isLoading"
(click)="isPopover(permission)">取消</button>
</div>
</div>
</ng-template>
<span>
已分配: <span class="blue">{{permission.allocated}}/{{permission.data.length}}</span> 家单位
</span>
</div>
<div class="panelheaderright">
<!-- <button nz-button nzType="primary">提交审核</button> -->
<span (click)="expand(permission)" class="expand blue">
{{permission.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="permission.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
</span>
</div>
</div>
<div class="panelcontent" *ngIf="permission.isExpand">
<nz-table #colSpanTable [nzData]="permission.data" nzBordered nzSize="small" [nzShowPagination]="false">
<thead>
<tr>
<th nzWidth="25%">单位名称</th>
<th nzWidth="42%">配合机构</th>
<th nzWidth="25%">说明</th>
<th nzWidth="8%">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of colSpanTable.data; index as i">
<td>{{item.company.companyName}}</td>
<td class="editOr">
<span class="name">
<span>{{item.organization.name}}</span>
<span *ngFor="let i of item.supervisors">
/{{i.name}}
</span>
</span>
<span class="blue" (click)="editOr(permission,item)"
[ngClass]="{'forbid': item.approvalStatus == '通过'}">修改机构</span>
</td>
<td style="padding:0 2px!important;">
<textarea [disabled]="item.approvalStatus == '通过'" nzAutosize
[(ngModel)]="item.description" style="border: 0;" rows="1" nz-input
placeholder="一段简短的说明文字..."
(ngModelChange)="taskDescChange(permission,item)"></textarea>
</td>
<td style="display: flex;justify-content: space-between;align-items: center;">
<ng-container *ngIf="item.approvalStatus == '未派发'; else elseTemplate">
<span class="blue" (click)="distribute(item,'行政许可')">派发</span>
</ng-container>
<ng-template #elseTemplate>
<span class="green">已派发</span>
</ng-template>
<span style="margin-left: 6px;" class="red"
(click)="deleteTask(item,permission)">删除</span>
</td>
</tr>
</tbody>
</nz-table>
</div>
</div>
<!-- 双随机 doubleRandom-->
<div class="panel">
<div class="spin" *ngIf="doubleRandom.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="panelheader">
<div class="panelheaderleft">
<div class="panelheadername panelheadernameblue">
@ -20,9 +320,9 @@
双随机
</div>
<button nz-button nzType="primary" nz-popover nzPopoverPlacement="bottomLeft"
[nzPopoverContent]="contentTemplate" [nzPopoverTrigger]=null
[nzPopoverContent]="contentTemplate3" [nzPopoverTrigger]=null
[nzPopoverVisible]="doubleRandom.isPopover" (click)="isPopover(doubleRandom)">选择单位</button>
<ng-template #contentTemplate>
<ng-template #contentTemplate3>
<div class="selectUnitPopover">
<div class="popoverTitle">
<span (click)="popoverMenuSelect(doubleRandom,1)"
@ -48,8 +348,8 @@
<div class="popoverContentitem">
<nz-checkbox-group [(ngModel)]="doubleRandom.unitList"
(ngModelChange)="log(doubleRandom)"></nz-checkbox-group>
<p class="blue" *ngIf="doubleRandom.unitList.length < totalCount"
(click)="moreData()">更多</p>
<!-- <p class="blue" *ngIf="doubleRandom.unitList.length < totalCount"
(click)="moreData()">更多</p> -->
</div>
</div>
<div class="popoverContent" *ngIf="doubleRandom.selectedMenu == 2">
@ -68,12 +368,10 @@
<div class="popoverContentitem">
<nz-tree [nzHideUnMatched]='true' [nzSearchValue]="doubleRandom.search2"
#nzTreeComponent [nzData]="doubleRandom.nodes" [nzTreeTemplate]="nzTreeTemplate"
nzBlockNode (nzClick)="nzEvent($event)"
(nzExpandChange)="nzEvent($event)" [nzExpandedIcon]="multiExpandedIconTpl">
nzBlockNode [nzExpandedIcon]="multiExpandedIconTpl">
</nz-tree>
<ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="nodebox">
<span class="name">
<label *ngIf="node.origin.companyName"
[(ngModel)]="node.origin.isChecked" nz-checkbox
@ -94,17 +392,19 @@
</div>
</div>
<div class="popoverBtn">
<button nz-button nzType="primary">确定</button>
<button nz-button nzType="default" (click)="isPopover(doubleRandom)">取消</button>
<button nz-button nzType="primary" [nzLoading]="doubleRandom.isLoading"
(click)="selectedUnit2(doubleRandom,'双随机')">确定</button>
<button nz-button nzType="default" [nzLoading]="doubleRandom.isLoading"
(click)="isPopover(doubleRandom)">取消</button>
</div>
</div>
</ng-template>
<span>
已分配: <span class="blue">14/15</span> 家单位
已分配: <span class="blue">{{doubleRandom.allocated}}/{{doubleRandom.allPlanTasks}}</span> 家单位
</span>
</div>
<div class="panelheaderright">
<button nz-button nzType="primary">提交审核</button>
<!-- <button nz-button nzType="primary">提交审核</button> -->
<span (click)="expand(doubleRandom)" class="expand blue">
{{doubleRandom.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="doubleRandom.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
@ -117,25 +417,79 @@
<thead>
<tr>
<th nzWidth="18%">责任机构</th>
<th nzWidth="8%">任务额</th>
<th nzWidth="6%">任务额</th>
<th nzWidth="25%">单位名称</th>
<th nzWidth="15%">监督员</th>
<th>说明</th>
<th nzWidth="8%">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of colSpanTable.data; index as i">
<td>访客</td>
<td>2021-11-19</td>
<td>
22
<td>{{item.organizatin.name}}</td>
<td>{{item.targetCount}}</td>
<td class="flextd">
<ng-container *ngIf="item.planTasks && item.planTasks.length != 0; else elseTemplate">
<div class="itembox" *ngFor="let i of item.planTasks">{{i.company.companyName}}
</div>
</ng-container>
<ng-template #elseTemplate>
/
</ng-template>
</td>
<td>
22
<td class="flextd">
<div class="itembox" *ngFor="let i of item.planTasks">
<ng-container *ngIf="i.supervisors.length != 0; else elseTemplate">
<div class="ellipsis">
<span class="assistant" nz-tooltip [nzTooltipTitle]="titleTemplate">
<span *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
</span>
<ng-template #titleTemplate let-thing>
<span style="margin-right: 6px;" *ngFor="let o of i.supervisors">
<img *ngIf="o.posts && o.posts[0] == '主查人员'"
src="../../../../assets/images/icon/main.png" alt="">
<img *ngIf="o.posts && o.posts[0] == '协查人员'"
src="../../../../assets/images/icon/assist.png" alt="">
{{o.name}}
</span>
</ng-template>
</div>
<div>
<span class="blue" (click)="allot(i,'双随机')"
[ngClass]="{'forbid': i.approvalStatus == '通过'}">更改</span>
</div>
</ng-container>
<ng-template #elseTemplate>
<div class="select" (click)="allot(i,'双随机')"
[ngClass]="{'forbidbtn': i.approvalStatus == '通过'}">
检查员
</div>
</ng-template>
</div>
</td>
<td style="padding:0 2px!important;">
<textarea [(ngModel)]="item.explain" style="border: 0;" rows="1" nz-input
placeholder="一段简短的说明文字..." (ngModelChange)="saveItem()"></textarea>
<td style="padding:0 2px!important;" class="flextd">
<div class="itembox" *ngFor="let i of item.planTasks">
<textarea [disabled]="i.approvalStatus == '通过'" [(ngModel)]="i.description"
nzAutosize style="border: 0;" rows="1" nz-input placeholder="一段简短的说明文字..."
(ngModelChange)="taskDescChange(doubleRandom,i)"></textarea>
</div>
</td>
<td class="flextd">
<div class="itembox" *ngFor="let i of item.planTasks">
<ng-container *ngIf="i.approvalStatus == '未派发'; else elseTemplate">
<span class="blue" (click)="distribute(i,'双随机')">派发</span>
</ng-container>
<ng-template #elseTemplate>
<span class="green">已派发</span>
</ng-template>
<span style="margin-left: 6px;" class="red" (click)="deleteTask(i,item)">删除</span>
</div>
</td>
</tr>
</tbody>
@ -143,9 +497,11 @@
</div>
</div>
<!-- 熟悉演练 -->
<div class="panel">
<div class="spin" *ngIf="rehearsal.isLoading">
<nz-spin nzSimple></nz-spin>
</div>
<div class="panelheader">
<div class="panelheaderleft">
<div class="panelheadername panelheadernamepurple">
@ -153,9 +509,9 @@
熟悉演练
</div>
<button nz-button nzType="primary" nz-popover nzPopoverPlacement="bottomLeft"
[nzPopoverContent]="contentTemplate2" [nzPopoverTrigger]=null
[nzPopoverContent]="contentTemplate4" [nzPopoverTrigger]=null
[nzPopoverVisible]="rehearsal.isPopover" (click)="isPopover(rehearsal)">选择单位</button>
<ng-template #contentTemplate2>
<ng-template #contentTemplate4>
<div class="selectUnitPopover">
<div class="popoverTitle">
<span (click)="popoverMenuSelect(rehearsal,1)"
@ -166,7 +522,7 @@
</div>
<div class="popoverContent" *ngIf="rehearsal.selectedMenu == 1">
<div>
<form nz-form (ngSubmit)="submitForm(rehearsal.search1)">
<form nz-form (ngSubmit)="submitForm(rehearsal)">
<nz-form-item>
<nz-form-control>
<nz-input-group nzPrefixIcon="search">
@ -179,6 +535,10 @@
</form>
</div>
<div class="popoverContentitem">
<nz-checkbox-group [(ngModel)]="rehearsal.unitList"
(ngModelChange)="log(rehearsal)"></nz-checkbox-group>
<!-- <p class="blue" *ngIf="rehearsal.unitList.length < totalCount"
(click)="moreData()">更多</p> -->
</div>
</div>
<div class="popoverContent" *ngIf="rehearsal.selectedMenu == 2">
@ -201,9 +561,8 @@
</nz-tree>
<ng-template #nzTreeTemplate let-node let-origin="origin">
<div class="nodebox">
<span class="name">
<label *ngIf="node.origin.isGasStation"
<label *ngIf="node.origin.companyName"
[(ngModel)]="node.origin.isChecked" nz-checkbox
(ngModelChange)="orcheckbox(rehearsal,$event,node)"></label>
{{ node.title }}
@ -211,7 +570,7 @@
</div>
</ng-template>
<ng-template #multiExpandedIconTpl let-node let-origin="origin">
<ng-container *ngIf="node.children.length == 0; else elseTemplate">
<ng-container *ngIf="node.origin.companyName; else elseTemplate">
</ng-container>
<ng-template #elseTemplate>
@ -222,17 +581,19 @@
</div>
</div>
<div class="popoverBtn">
<button nz-button nzType="primary">确定</button>
<button nz-button nzType="default" (click)="isPopover(rehearsal)">取消</button>
<button nz-button nzType="primary" [nzLoading]="rehearsal.isLoading"
(click)="selectedUnit2(rehearsal,'熟悉演练')">确定</button>
<button nz-button nzType="default" [nzLoading]="rehearsal.isLoading"
(click)="isPopover(rehearsal)">取消</button>
</div>
</div>
</ng-template>
<span>
已分配: <span class="blue">14/15</span> 家单位
已分配: <span class="blue">{{rehearsal.allocated}}/{{rehearsal.allPlanTasks}}</span> 家单位
</span>
</div>
<div class="panelheaderright">
<button nz-button nzType="primary">提交审核</button>
<!-- <button nz-button nzType="primary">提交审核</button> -->
<span (click)="expand(rehearsal)" class="expand blue">
{{rehearsal.isExpand ? '收起' :'展开'}}
<i nz-icon [nzType]="rehearsal.isExpand ? 'down' : 'up'" nzTheme="outline"></i>
@ -243,25 +604,48 @@
<nz-table #colSpanTable [nzData]="rehearsal.data" nzBordered nzSize="small" [nzShowPagination]="false">
<thead>
<tr>
<th nzWidth="18%">责任机构</th>
<th nzWidth="8%">任务额</th>
<th nzWidth="25%">单位名称</th>
<th nzWidth="15%">监督员</th>
<th nzWidth="25%">责任机构</th>
<th nzWidth="6%">任务额</th>
<th nzWidth="30%">单位名称</th>
<th>说明</th>
<th nzWidth="8%">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of colSpanTable.data; index as i">
<td>访客</td>
<td>2021-11-19</td>
<td>{{item.organizatin.name}}</td>
<td>
22
<nz-input-number [(ngModel)]="item.targetCount" [nzMin]="1" [nzMax]="9" [nzStep]="1"
(nzBlur)="targetCountChange(rehearsal,item,$event)">
</nz-input-number>
</td>
<td>
22
<td class="flextd">
<ng-container *ngIf="item.planTasks && item.planTasks.length != 0; else elseTemplate">
<div class="itembox" *ngFor="let i of item.planTasks">{{i.company.companyName}}
</div>
</ng-container>
<ng-template #elseTemplate>
/
</ng-template>
</td>
<td style="padding:0 2px!important;">
<textarea style="border: 0;" rows="1" nz-input placeholder="一段简短的说明文字..."></textarea>
<td style="padding:0 2px!important;" class="flextd">
<div class="itembox" *ngFor="let i of item.planTasks">
<textarea [disabled]="i.approvalStatus == '通过'" [(ngModel)]="i.description"
nzAutosize nzBorderless rows="1" nz-input placeholder="一段简短的说明文字..."
(ngModelChange)="taskDescChange(rehearsal,i)"></textarea>
</div>
</td>
<td class="flextd">
<div class="itembox" *ngFor="let i of item.planTasks">
<ng-container *ngIf="i.approvalStatus == '未派发'; else elseTemplate">
<span class="blue" (click)="distribute(i,'熟悉演练')">派发</span>
</ng-container>
<ng-template #elseTemplate>
<span class="green">已派发</span>
</ng-template>
<span style="margin-left: 6px;" class="red" (click)="deleteTask(i,item)">删除</span>
</div>
</td>
</tr>
</tbody>
@ -269,30 +653,6 @@
</div>
</div>
<div class="panel">
<div class="panelheader">
<div class="panelheaderleft">
<div class="panelheadername panelheadernameor">
<img src="../../../../assets/images/icon/huodong.png" alt="">
重大活动
</div>
<button nz-button nzType="primary">选择单位</button>
<span>
已分配: <span class="blue">0/0</span> 家单位
</span>
</div>
<div class="panelheaderright">
<!-- <button nz-button nzType="primary">提交审核</button>
<span class="expand blue">
收起
<i nz-icon nzType="down" nzTheme="outline"></i>
</span> -->
</div>
</div>
</div>
<div class="panel">
<div class="panelheader">
<div class="panelheaderleft">
@ -300,10 +660,10 @@
<img src="../../../../assets/images/icon/xuanchuan.png" alt="">
消防宣传
</div>
<button nz-button nzType="primary">选择单位</button>
<!-- <button nz-button nzType="primary">选择单位</button>
<span>
已分配: <span class="blue">0/0</span> 家单位
</span>
</span> -->
</div>
<div class="panelheaderright">
<!-- <button nz-button nzType="primary">提交审核</button>
@ -321,10 +681,10 @@
<img src="../../../../assets/images/icon/huozai.png" alt="">
火灾调查
</div>
<button nz-button nzType="primary">选择单位</button>
<!-- <button nz-button nzType="primary">选择单位</button>
<span>
已分配: <span class="blue">0/0</span> 家单位
</span>
</span> -->
</div>
<div class="panelheaderright">
<!-- <button nz-button nzType="primary">提交审核</button>

56
src/app/home/task/zhi-indicators/zhi-indicators.component.scss

@ -51,6 +51,7 @@
.panel {
margin-bottom: 16px;
position: relative;
.panelheader {
justify-content: space-between;
@ -91,6 +92,52 @@
.panelcontent {
nz-table {
margin-top: 16px;
.editOr {
overflow: hidden;
.blue {
float: right;
}
}
.flextd {
.itembox {
height: 32px;
line-height: 32px;
margin: 2px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
position: relative;
display: flex;
justify-content: space-between;
.ellipsis {
max-width: 200px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.select {
width: 80px;
height: 26px;
line-height: 26px;
background: #42B983;
border-radius: 4px 4px 4px 4px;
color: #fff;
opacity: 1;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
cursor: pointer;
text-align: center;
}
}
}
}
}
@ -127,12 +174,14 @@
display: flex;
flex-direction: column;
overflow: hidden;
.popoverContentitem{
.popoverContentitem {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
p{
p {
text-align: center;
}
}
@ -142,7 +191,8 @@
display: flex;
justify-content: flex-end;
margin-top: 16px;
button{
button {
margin-left: 18px;
}
}

700
src/app/home/task/zhi-indicators/zhi-indicators.component.ts

@ -1,10 +1,14 @@
import { HttpClient } from '@angular/common/http';
import { Component, OnInit, ViewChild } from '@angular/core';
import { Component, OnInit, ViewChild, ViewContainerRef, NgZone } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { TreeService } from 'src/app/service/tree.service';
import { fromEvent, Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators'; // 引入debounceTime、Subject
import { debounceTime, elementAt } from 'rxjs/operators'; // 引入debounceTime、Subject
import { NzFormatEmitEvent, NzTreeNodeOptions } from 'ng-zorro-antd/tree';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzModalService } from 'ng-zorro-antd/modal';
import { EditOrComponent } from './edit-or/edit-or.component';
import { AllotPersonComponent } from '../da-subordinate-audit/allot-person/allot-person.component';
@Component({
selector: 'app-zhi-indicators',
templateUrl: './zhi-indicators.component.html',
@ -13,95 +17,170 @@ import { NzFormatEmitEvent, NzTreeNodeOptions } from 'ng-zorro-antd/tree';
export class ZhiIndicatorsComponent implements OnInit {
validateForm!: FormGroup;
constructor(private fb: FormBuilder, private http: HttpClient, private toTree: TreeService) { }
constructor(private ngZone: NgZone, private fb: FormBuilder, private http: HttpClient, private toTree: TreeService, private message: NzMessageService, private modal: NzModalService, private viewContainerRef: ViewContainerRef) { }
private valueChange = new Subject<string>();
private targetCount = new Subject<string>();
ngOnInit(): void {
this.getAllOrganization()
this.getCompanies()
//保存防抖
this.valueChange.pipe(debounceTime(1000)).subscribe(data => {
console.log(data);
});
}
saveItem() {
this.valueChange.next('xxxx');
}
months = [
{ name: '1月', isable: true },
{ name: '2月', isable: true },
{ name: '3月', isable: true },
{ name: '4月', isable: true },
{ name: '5月', isable: true },
{ name: '6月', isable: true },
{ name: '7月', isable: true },
{ name: '8月', isable: true },
{ name: '9月', isable: true },
{ name: '10月', isable: true },
{ name: '11月', isable: true },
{ name: '12月', isable: true }
{ id: 1, name: '1月', isable: true },
{ id: 2, name: '2月', isable: true },
{ id: 3, name: '3月', isable: true },
{ id: 4, name: '4月', isable: true },
{ id: 5, name: '5月', isable: true },
{ id: 6, name: '6月', isable: true },
{ id: 7, name: '7月', isable: true },
{ id: 8, name: '8月', isable: true },
{ id: 9, name: '9月', isable: true },
{ id: 10, name: '10月', isable: true },
{ id: 11, name: '11月', isable: true },
{ id: 12, name: '12月', isable: true }
]
selectedMonth
selectedYear = 2022
selectedTime
selectMonth(item) {
this.selectedMonth = item.name
console.log('选择月份')
this.selectedMonth = item.id
this.initializeData()
this.getTaskList('投诉举报')
this.getTaskList('行政许可')
this.getTaskTarget('双随机')
this.getTaskTarget('熟悉演练')
}
selectYear(e) {
console.log('选择年份')
this.selectedYear = e
this.initializeData()
this.getTaskList('投诉举报')
this.getTaskList('行政许可')
this.getTaskTarget('双随机')
this.getTaskTarget('熟悉演练')
}
initializeData() {
this.complaint.isExpand = true
this.complaint.isPopover = false
this.complaint.isLoading = false
this.complaint.search1 = ''
this.complaint.search1Value = []
this.complaint.search2 = ''
this.complaint.search2Value = []
this.complaint.selectedMenu = 1
this.complaint.data = []
// 双随机
doubleRandom = {
this.permission.isExpand = true
this.permission.isPopover = false
this.permission.isLoading = false
this.permission.search1 = ''
this.permission.search1Value = []
this.permission.search2 = ''
this.permission.search2Value = []
this.permission.selectedMenu = 1
this.permission.data = []
this.doubleRandom.isExpand = true
this.doubleRandom.isPopover = false
this.doubleRandom.isLoading = false
this.doubleRandom.search1 = ''
this.doubleRandom.search1Value = []
this.doubleRandom.search2 = ''
this.doubleRandom.search2Value = []
this.doubleRandom.selectedMenu = 1
this.doubleRandom.data = []
this.rehearsal.isExpand = true
this.rehearsal.isPopover = false
this.rehearsal.isLoading = false
this.rehearsal.search1 = ''
this.rehearsal.search1Value = []
this.rehearsal.search2 = ''
this.rehearsal.search2Value = []
this.rehearsal.selectedMenu = 1
this.rehearsal.data = []
}
//投诉举报
complaint = {
name: '投诉举报',
allocated: 0,
isExpand: true,//卡片展开
isPopover: false,//选择单位气泡卡片
isLoading: false,
search1: '',//选择单位气泡卡片---单位选择列表
search1Value: [],
search2: '',//选择单位气泡卡片---组织选择列表
search2Value: [],
searchAll: [],
selectedMenu: 1,//选择单位气泡卡片
data: [
{ explain: '' }
],//表格数据
nodes: [],
unitList: []
}
//行政许可
permission = {
name: '行政许可',
allocated: 0,
isExpand: true,//卡片展开
isPopover: false,//选择单位气泡卡片
isLoading: false,
search1: '',//选择单位气泡卡片---单位选择列表
search1Value: [],
search2: '',//选择单位气泡卡片---组织选择列表
search2Value: [],
searchAll: [],
selectedMenu: 1,//选择单位气泡卡片
data: [],//表格数据
nodes: [],
unitList: []
}
// 双随机
doubleRandom = {
name: '双随机',
allocated: 0,
allPlanTasks: 0,
isExpand: true,//卡片展开
isPopover: false,//选择单位气泡卡片
isLoading: false,
search1: '',//选择单位气泡卡片---单位选择列表
search1Value: [],
search2: '',//选择单位气泡卡片---组织选择列表
search2Value: [],
searchAll: [],
selectedMenu: 1,//选择单位气泡卡片
data: [],//表格数据
nodes: [],
unitList: []
}
// 熟悉演练
rehearsal = {
isExpand: false,//卡片展开
name: '熟悉演练',
allocated: 0,
allPlanTasks: 0,
isExpand: true,//卡片展开
isPopover: false,//选择单位气泡卡片
isLoading: false,
search1: '',//选择单位气泡卡片---单位选择列表
search1Value: [],
search2: '',//选择单位气泡卡片---组织选择列表
search2Value: [],
searchAll: [],
selectedMenu: 1,//选择单位气泡卡片
data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],//表格数据
data: [],//表格数据
nodes: [],
unitList: []
}
PageNumber = 1
PageSize = 50
totalCount: number
getCompanies(CompanyName?: string) {
let params = {
CompanyName: CompanyName,
PageNumber: this.PageNumber,
PageSize: this.PageSize
}
this.http.get('/api/Companies', {
params: params
}).subscribe((data: any) => {
console.log(data);
this.totalCount = data.totalCount
data.items.forEach(element => {
element.label = element.companyName
element.value = element.id
});
this.doubleRandom.unitList = this.doubleRandom.unitList.concat(data.items);
this.doubleRandom.unitList = [...this.doubleRandom.unitList]
})
}
PageNumber
moreData() {
this.PageNumber += 1
this.getCompanies()
@ -116,15 +195,31 @@ export class ZhiIndicatorsComponent implements OnInit {
data.search1Value = arr
}
isPopover(data) {
console.log(data)
data.isPopover = !data.isPopover
data.unitList.forEach(element => {
element.checked = false
// data.data.forEach(item => {
// if (element.id == item.company.id) {
// element.checked = true
// }
// })
});
}
//搜索框提交
submitForm(data): void {
data.unitList = []
this.PageNumber = 1
this.getCompanies(data.search1)
this.getCompanies(data)
}
// 弹出 tab
popoverMenuSelect(data, type) {
data.selectedMenu = type
@ -134,64 +229,387 @@ export class ZhiIndicatorsComponent implements OnInit {
}
totalCount: number
unitList = []
async getCompanies(incomingData?: any) {
let params = {
CompanyName: incomingData ? incomingData.search1 : '',
PageNumber: 1,
PageSize: 99999
}
return new Promise<void>((resolve, reject) => {
this.http.get('/api/Companies', {
params: params
}).subscribe((data: any) => {
this.totalCount = data.totalCount
data.items.forEach(element => {
element.label = element.companyName
element.value = element.id
element.parentId = element.organizationId
element.key = element.id
element.title = element.companyName
element.level = 4
});
this.unitList = data.items
if (incomingData && incomingData.name == '投诉举报') {
this.complaint.unitList = JSON.parse(JSON.stringify(this.unitList))
} else if (incomingData && incomingData.name == '行政许可') {
this.permission.unitList = JSON.parse(JSON.stringify(this.unitList))
} else if (incomingData && incomingData.name == '双随机') {
this.doubleRandom.unitList = JSON.parse(JSON.stringify(this.unitList))
} else if (incomingData && incomingData.name == '熟悉演练') {
this.rehearsal.unitList = JSON.parse(JSON.stringify(this.unitList))
} else {
this.complaint.unitList = JSON.parse(JSON.stringify(this.unitList))
this.permission.unitList = JSON.parse(JSON.stringify(this.unitList))
this.doubleRandom.unitList = JSON.parse(JSON.stringify(this.unitList))
this.rehearsal.unitList = JSON.parse(JSON.stringify(this.unitList))
}
// this.complaint.unitList = this.complaint.unitList.concat(JSON.parse(JSON.stringify(data.items)));
// this.complaint.unitList = [...this.complaint.unitList]
// this.permission.unitList = this.permission.unitList.concat(JSON.parse(JSON.stringify(data.items)));
// this.permission.unitList = [...this.permission.unitList]
// this.doubleRandom.unitList = this.doubleRandom.unitList.concat(JSON.parse(JSON.stringify(data.items)));
// this.doubleRandom.unitList = [...this.doubleRandom.unitList]
// this.rehearsal.unitList = this.rehearsal.unitList.concat(JSON.parse(JSON.stringify(data.items)));
// this.rehearsal.unitList = [...this.rehearsal.unitList]
nzExpandAll = false;
resolve(data)
})
})
}
allOrList: any
nodes
getAllOrganization() {
async getAllOrganization() {
let params = {
ContainsChildren: true,
pageSize: 9999
}
this.http.get('/api/Organizations', {
params: params
}).subscribe((data: any) => {
data.items.forEach(element => {
element.key = element.id
element.title = element.name
element.selectable = false
});
this.allOrList = data.items
this.nodes = [...this.toTree.toTree(data.items)]
this.doubleRandom.nodes = JSON.parse(JSON.stringify(this.nodes))
this.rehearsal.nodes = JSON.parse(JSON.stringify(this.nodes))
return new Promise<void>((resolve, reject) => {
this.http.get('/api/Organizations', {
params: params
}).subscribe((data: any) => {
data.items.forEach(element => {
element.key = element.id
element.title = element.name
element.selectable = false
element.disableCheckbox = true
});
this.allOrList = JSON.parse(JSON.stringify(data.items))
resolve(data)
})
})
}
//获得除了检查员的其他用户
users
async getUsers() {
return new Promise<void>((resolve, reject) => {
let params = {
OrganizationId: this.OrganizationId,
OrganizationLevel: 'squadron',
ContainsChildren: true,
PageNumber: 1,
PageSize: 9999
}
this.http.get('/api/Users', {
params: params
}).subscribe((data: any) => {
console.log('用户列表', data.items)
data.items.forEach(element => {
element.key = element.id
element.title = element.name
element.parentId = element.organizationId
});
this.users = data.items
resolve(data)
})
})
}
editOr(incomingData, item) {
const modal = this.modal.create({
nzTitle: '修改协助机构',
nzContent: EditOrComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 660,
nzMaskClosable: false,
nzComponentParams: {
selectedData: item.supervisorIds,
organizationList: JSON.parse(JSON.stringify(this.allOrList)),
users: JSON.parse(JSON.stringify(this.users)),
},
nzOnOk: async () => {
if (instance.validateForm.valid) {
await new Promise((resolve, reject) => {
let body = {
supervisorIds: instance.validateForm.value.organization,
}
this.http.patch(`/api/PlanTasks/${item.id}`, body).subscribe({
next: async (data: any) => {
this.message.create('success', '修改成功');
incomingData.name == '投诉举报' ? this.getTaskList('投诉举报') : null
incomingData.name == '行政许可' ? this.getTaskList('行政许可') : null
resolve(data)
},
error: (err) => {
this.message.create('warning', '修改失败');
reject(err)
}
})
})
} else {
this.message.create('warning', '请填写完整!');
return false
}
}
});
const instance = modal.getContentComponent();
modal.afterOpen.subscribe(() => console.log('[afterOpen] emitted!'));
modal.afterClose.subscribe(result => console.log('[afterClose] The result is:', result));
}
orcheckbox(data, $event, node) {
if ($event) {
data.search2Value.push(node.origin.name)
data.search2Value.push(node.origin.id)
} else {
for (let index = 0; index < data.search2Value.length; index++) {
const element = data.search2Value[index];
if (element == node.origin.name) {
if (element == node.origin.id) {
data.search2Value.splice(index, 1)
index--
}
}
}
console.log(data.search2Value)
}
OrganizationId
ngOnInit(): void {
this.OrganizationId = JSON.parse(sessionStorage.getItem('userData')).organizationId
this.selectedMonth = new Date().getMonth() + 1
//说明保存防抖
this.valueChange.pipe(debounceTime(1000)).subscribe((item: any) => {
let body = {
description: item.description,
}
return new Promise<void>((resolve, reject) => {
this.http.patch(`/api/PlanTasks/${item.id}`, body).subscribe({
next: async (data: any) => {
this.message.create('success', '实时保存成功');
resolve(data)
},
error: (err) => {
this.message.create('warning', '保存失败');
reject(err)
}
})
})
});
//任务额保存防抖
this.targetCount.pipe(debounceTime(1000)).subscribe((item: any) => {
console.log(item)
let body = {
targetCount: item.targetCount,
}
return new Promise<void>((resolve, reject) => {
this.http.patch(`/api/TaskTargets/${item.id}`, body).subscribe({
next: async (data: any) => {
this.message.create('success', '修改任务额成功');
resolve(data)
},
error: (err) => {
this.message.create('warning', '修改任务额失败');
reject(err)
}
})
})
});
this.getUsers()
Promise.all([this.getCompanies(), this.getAllOrganization()])
.then((results) => {
let arr = [...JSON.parse(JSON.stringify(this.allOrList)), ...JSON.parse(JSON.stringify(this.unitList))]
this.nodes = [...this.toTree.toTree(arr)]
this.complaint.nodes = JSON.parse(JSON.stringify(this.nodes))
this.permission.nodes = JSON.parse(JSON.stringify(this.nodes))
this.doubleRandom.nodes = JSON.parse(JSON.stringify(this.nodes))
this.rehearsal.nodes = JSON.parse(JSON.stringify(this.nodes))
});
this.getTaskList('投诉举报')
this.getTaskList('行政许可')
this.getTaskTarget('双随机')
this.getTaskTarget('熟悉演练')
//获得主协调查人员
this.getSupervisor('main')
this.getSupervisor('assisted')
}
//投诉举报/行政许可 选择单位 确认按钮
selectedUnit(data, type) {
let arr = [...data.search1Value, ...data.search2Value]
let arrSet = [...new Set(arr)]
data.isLoading = true
let selectedMonth = this.selectedMonth < 10 ? "0" + this.selectedMonth : this.selectedMonth;
let selectedTime = this.selectedYear + '-' + selectedMonth + '-' + '01'
this.http.post(`/api/PlanTasks/Many`, null, {
params: {
month: selectedTime,
companyIds: arrSet,
taskType: type
}
}).subscribe({
next: (item: Array<Object>) => {
data.isLoading = false
data.isPopover = false
this.message.create('success', '共创建' + arrSet.length + '条任务' + ',成功创建' + item.length + '条,剩余' + (arrSet.length - item.length) + '个单位已被创建');
type == '投诉举报' ? this.getTaskList('投诉举报', data) : null
type == '行政许可' ? this.getTaskList('行政许可', data) : null
},
error: (err) => {
this.message.create('warning', '创建失败');
}
})
}
//双随机/熟悉演练 选择单位 确认按钮
selectedUnit2(data, type) {
let selectedMonth = this.selectedMonth < 10 ? "0" + this.selectedMonth : this.selectedMonth;
let selectedTime = this.selectedYear + '-' + selectedMonth + '-' + '01'
let arr = [...data.search1Value, ...data.search2Value]
let body = [...new Set(arr)]
data.isLoading = true
this.http.post(`/api/TaskTargets/${selectedTime}`, body, {
params: {
taskType: type
}
}).subscribe({
next: (item: Array<Object>) => {
data.isLoading = false
data.isPopover = false
this.message.create('success', '共创建' + body.length + '条任务' + ',成功创建' + item.length + '条,剩余' + (body.length - item.length) + '个单位已被创建');
type == '双随机' ? this.getTaskTarget('双随机', data) : null
type == '熟悉演练' ? this.getTaskTarget('熟悉演练', data) : null
},
error: (err) => {
this.message.create('warning', '创建失败');
}
})
}
async getTaskTarget(TaskType, carddata?: any) {
TaskType == '双随机' ? this.doubleRandom.isLoading = true : this.rehearsal.isLoading = true
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
taskType: TaskType
}
return await new Promise<void>((resolve, reject) => {
this.http.get(`/api/TaskTargets/${selectedTime}`, {
params: params
}).subscribe((data: any) => {
this.ngZone.run(() => {
//这里写需要立即渲染的代码
TaskType == '双随机' ? this.doubleRandom.isLoading = false : this.rehearsal.isLoading = false
console.log(TaskType + '任务指标列表', data);
TaskType == '双随机' ? this.doubleRandom.allocated = 0 : null
TaskType == '熟悉演练' ? this.rehearsal.allocated = 0 : null
TaskType == '双随机' ? this.doubleRandom.allPlanTasks = 0 : null
TaskType == '熟悉演练' ? this.rehearsal.allPlanTasks = 0 : null
TaskType == '双随机' ? this.doubleRandom.data = data : null
TaskType == '熟悉演练' ? this.rehearsal.data = data : null
data.forEach(element => {
if (element.planTasks) {
if (TaskType == '双随机') {
this.doubleRandom.allPlanTasks += element.planTasks.length
}
if (TaskType == '熟悉演练') {
this.rehearsal.allPlanTasks += element.planTasks.length
}
element.planTasks.forEach(item => {
if (item.approvalStatus == '通过') {
TaskType == '双随机' ? this.doubleRandom.allocated += 1 : null
TaskType == '熟悉演练' ? this.rehearsal.allocated += 1 : null
}
});
}
});
});
resolve(data)
})
})
}
async getTaskList(TaskType, carddata?: any) {
TaskType == '投诉举报' ? this.complaint.isLoading = true : this.permission.isLoading = true
// carddata ? carddata.isLoading = true : null
let selectedTime = this.selectedYear + '-' + this.selectedMonth + '-' + '01'
let params = {
Month: selectedTime,
OrganizationId: this.OrganizationId,
TaskType: TaskType,
PageNumber: 1,
PageSize: 99999
}
return await new Promise<void>((resolve, reject) => {
this.http.get('/api/PlanTasks', {
params: params
}).subscribe((data: any) => {
this.ngZone.run(() => {
//这里写需要立即渲染的代码
console.log(TaskType + '任务列表', data.items);
TaskType == '投诉举报' ? this.complaint.isLoading = false : this.permission.isLoading = false
TaskType == '投诉举报' ? this.complaint.allocated = 0 : null
TaskType == '行政许可' ? this.permission.allocated = 0 : null
TaskType == '投诉举报' ? this.complaint.data = data.items : null
TaskType == '行政许可' ? this.permission.data = data.items : null
data.items.forEach(item => {
if (item.approvalStatus == '通过') {
TaskType == '投诉举报' ? this.complaint.allocated += 1 : null
TaskType == '行政许可' ? this.permission.allocated += 1 : null
}
});
});
resolve(data)
})
})
}
//修改任务描述
taskDescChange(incomingData, item) {
this.valueChange.next(item);
}
//修改任务额
targetCountChange(incomingData, item, e) {
this.targetCount.next(item);
}
ngOnDestroy(): void {
//Called once, before the instance is destroyed.
//Add 'implements OnDestroy' to the class.
console.log('毁灭了')
this.doubleRandom.isPopover = false
// this.doubleRandom.isPopover = false
}
nzEvent(event: NzFormatEmitEvent): any {
console.log(event);
// load child async
if(event.node.origin.companyName){
if (event.node.origin.companyName) {
return new Promise<void>((resolve, reject) => {
reject()
resolve()
})
}
if (event.node.origin.level === 3 && !event.node.origin.companyName) {
if (event.node.origin.level === 'squadron' && !event.node.origin.companyName) {
const node = event.node;
console.log(node?.getChildren())
console.log(888)
if (node?.getChildren().length === 0) {
this.loadNode(event.node.origin.id).then(data => {
node.addChildren(data);
@ -222,4 +640,128 @@ export class ZhiIndicatorsComponent implements OnInit {
}
assitantsupervisorList
mainsupervisorList
getSupervisor(type) {
let params = {
inspectorType: type
}
this.http.get('/api/Users/Inspectors', {
params: params
}).subscribe((data: any) => {
console.log('检查员列表', data)
if (type == 'main') {
this.mainsupervisorList = data
} else {
this.assitantsupervisorList = data
}
})
}
allot(item, type) {
console.log(item)
if (this.mainsupervisorList.length == 0 || this.assitantsupervisorList.length == 0) {
this.message.create('warning', '请从用户管理添加检查人员');
return
}
const modal = this.modal.create({
nzTitle: '分配监督检查员',
nzContent: AllotPersonComponent,
nzViewContainerRef: this.viewContainerRef,
nzWidth: 485,
nzMaskClosable: false,
nzComponentParams: {
mainsupervisorList: this.mainsupervisorList,
assitantsupervisorList: this.assitantsupervisorList
},
nzOnOk: async () => {
if (instance.validateForm.valid) {
await new Promise((resolve, reject) => {
let body = {
supervisorIds: [...instance.validateForm.value.main, ...instance.validateForm.value.assitant]
}
this.http.patch(`/api/PlanTasks/${item.id}`, body).subscribe({
next: async (data) => {
this.message.create('success', '分配成功');
this.getTaskTarget(type)
resolve(data)
return true
},
error: (err) => {
this.message.create('warning', '分配失败');
reject(err)
return false
}
})
})
} else {
this.message.create('warning', '请填写完整!');
return false
}
}
});
const instance = modal.getContentComponent();
modal.afterOpen.subscribe(() => console.log('[afterOpen] emitted!'));
modal.afterClose.subscribe(result => console.log('[afterClose] The result is:', result));
}
distribute(item, type) {
this.modal.confirm({
nzTitle: `确定要派发该任务吗?`,
nzOkText: '确定',
nzOkType: 'default',
nzOnOk: () => {
item.isLoading = true
this.http.post(`/api/PlanTasks/Approval/${item.id}`, null, {
params: {
approvalStatus: '通过'
}
}).subscribe({
next: (data) => {
this.message.create('success', '已派发');
item.approvalStatus = '通过'
item.isLoading = false
item.passed += 1
type == '投诉举报' ? this.complaint.allocated += 1 : null
type == '行政许可' ? this.permission.allocated += 1 : null
type == '双随机' ? this.doubleRandom.allocated += 1 : null
type == '熟悉演练' ? this.rehearsal.allocated += 1 : null
},
error: (err) => {
this.message.create('warning', '派发失败');
item.isLoading = false
}
})
},
nzCancelText: '取消'
});
}
//删除任务
deleteTask(item, incomingData) {
console.log(item)
console.log(incomingData)
this.modal.confirm({
nzTitle: `确定要删除该任务吗?`,
nzOkText: '确定',
nzOkType: 'primary',
nzOnOk: () => {
this.http.delete(`/api/PlanTasks/${item.id}`).subscribe(data => {
let originaldata
if (item.taskType == '投诉举报' || item.taskType == '行政许可') {
this.getTaskList(item.taskType)
}
if (item.taskType == '双随机' || item.taskType == '熟悉演练') {
this.getTaskTarget(item.taskType)
}
this.message.create('success', '删除成功!');
})
},
nzCancelText: '取消',
nzOnCancel: () => {
}
});
}
}

3
src/app/http-interceptors/base-interceptor.ts

@ -70,10 +70,11 @@ export class BaseInterceptor implements HttpInterceptor {
} else {
// 服务端返回http状态码
// 服务端返回错误信息
console.error(
`状态码${error.status}, ` +
`错误内容:${error.error}`);
this.message.create('error', error.error.title);
this.message.create('error', error.error.detail);
}
// 返回带有面向用户的错误信息
return throwError(() => {

15
src/app/pages/login/login.component.html

@ -1,9 +1,12 @@
<div class="login" id="login">
<div class="left">
<p class="a1">Hi,欢迎登陆</p>
<p class="a2">防消一体化综合治理平台</p>
<p class="a3">INTEGRATED CONTROL PL ATFORM FOR PREVENTION AND EL IMINATION</p>
<div>
<img src="../../../assets/images/logo/loginlogo.png" alt="">
</div>
</div>
<div class="card">
<h1 class="cardheader">登录</h1>
<!-- <h1 class="cardheader">济南管理系统</h1> -->
@ -13,7 +16,7 @@
<nz-form-item style="margin-bottom: 12px;">
<nz-form-control nzErrorTip="请输入账号!">
<nz-input-group nzPrefixIcon="user">
<input required nz-input type="text" formControlName="userName" placeholder="请输入账号"/>
<input required nz-input type="text" formControlName="userName" placeholder="请输入账号" />
</nz-input-group>
</nz-form-control>
</nz-form-item>
@ -21,7 +24,7 @@
<nz-form-item>
<nz-form-control nzErrorTip="请输入密码!">
<nz-input-group nzPrefixIcon="lock">
<input required nz-input type="password" formControlName="password" placeholder="请输入密码"/>
<input required nz-input type="password" formControlName="password" placeholder="请输入密码" />
</nz-input-group>
</nz-form-control>
</nz-form-item>
@ -46,8 +49,4 @@
<p class="company">防消一体化综合治理平台 v1.1.0</p>
</div>
<div class="name">
</div>
</div>

133
src/app/pages/login/login.component.scss

@ -3,30 +3,31 @@
height: 100%;
background: url('../../../assets/images/bgImg.png');
background-size: 100% 100%;
display: flex;
justify-content: center;
align-items: center;
overflow: auto;
}
.left{
.left {
color: #feffff;
padding: 50px;
margin-right: 200px;
height: 504px;
p{
margin-left: -58px;
p {
color: #feffff;
font-size: 24px;
font-size: 26px;
text-align: left;
font-family: YouYuan;
box-sizing: border-box;
margin-top: 20px;
}
.a2{
font-size: 44px;
}
.a3{
margin-top: -30px;
font-size: 14px;
color: rgb(254,255,255,.4);
img {
width: 850px;
height: auto;
margin-left: -76px;
}
}
@ -39,81 +40,61 @@
box-sizing: border-box;
padding: 40px 45px 42px 45px;
color: #3b3b3b;
}
.cardheader {
width: 200px;
margin: 0 auto 10px auto;
text-align: center;
font-size: 22px;
color: #3b3b3b
}
.cardheader:nth-child(2) {
margin-bottom: 40px;
}
label {
color: #3b3b3b;
}
.hint {
display: flex;
justify-content: space-between;
margin-bottom: 6px;
align-items: center;
.forget {
cursor: pointer;
color: #2399FF;
.cardheader {
width: 200px;
margin: 0 auto 10px auto;
text-align: center;
font-size: 22px;
color: #3b3b3b
}
}
.autologin {
margin-bottom: 40px;
}
.cardheader:nth-child(2) {
margin-bottom: 40px;
}
button {
margin: 30px 0;
width: 100%;
height: 42px;
font-size: 16px;
// background: #2D4CC1;
border-radius: 4px;
}
label {
color: #3b3b3b;
}
p {
text-align: center;
}
.hint {
display: flex;
justify-content: space-between;
margin-bottom: 6px;
align-items: center;
.role {
color: #2399FF;
margin-top: 38px;
font-size: 15px;
}
.forget {
cursor: pointer;
color: #2399FF;
}
}
.company {
color: #666262;
margin-top: 10px;
font-size: 14px;
}
.autologin {
margin-bottom: 40px;
}
.name {
position: absolute;
left:40px;
top:40px;
button {
margin: 30px 0;
width: 100%;
height: 42px;
font-size: 16px;
// background: #2D4CC1;
border-radius: 4px;
}
img {
// margin-bottom: 32px;
width: 254px;
height: 56px;
p {
text-align: center;
}
h1 {
font-size: 63px;
color: #3b3b3b;
font-weight: 600;
.role {
color: #2399FF;
margin-top: 38px;
font-size: 15px;
}
text-shadow: 0px 2px 8px #2399FF;
letter-spacing: 5px;
margin-bottom: 0px;
.company {
color: #666262;
margin-top: 10px;
font-size: 14px;
}
}

2
src/app/pages/login/login.component.ts

@ -105,7 +105,7 @@ export class LoginComponent implements OnInit {
this.isLoading = false;
this.rememberInfo()
this.autoLogin()
this.router.navigate(['/system'])
this.router.navigate(['/task'])
this.message.create('success', `登录成功`);
sessionStorage.setItem("userData", JSON.stringify(data));
await this.getLevel()

BIN
src/assets/images/logo/loginlogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

8
src/styles.scss

@ -130,13 +130,13 @@ app-root {
.forbid {
color: gray;
pointer-events: none
color: gray !important;
pointer-events: none !important;
}
.forbidbtn {
background: gray !important;
pointer-events: none
pointer-events: none !important;
}
.box {
@ -222,6 +222,8 @@ app-root {
align-items: center;
justify-content: center;
z-index: 999;
left: 0;
top: 0;
}
#setPosition {

Loading…
Cancel
Save