Forráskód Böngészése

首页与效率报表

chenc 3 éve
szülő
commit
746ccf18ff

+ 4 - 0
src/app/entity/fbs/fbs-working-statistics.ts

@@ -57,4 +57,8 @@ export class FbsWorkingStatistics extends Page{
   start?:string;
   end?:string;
 	cutTime?:string;
+	costItemCode?:string;//项目编号
+	projectName?:string;//项目名称
+	workCenter?:string;//工作中心
+	fbsTechnologicalProcessItemName?:string;//工艺名称
 }

+ 1 - 0
src/app/entity/fbs/fbs-workshop-dispatch-list.ts

@@ -77,4 +77,5 @@ export class FbsWorkshopDispatchList extends Page{
 	dayList?:any[];
 	firstTime?:string;
 	finalTime?:string;
+	workCenter?:string;//工作中心
 }

+ 1382 - 0
src/app/routes/dashboard/analysis-history

@@ -0,0 +1,1382 @@
+<!-- <div nz-row nzGutter="24">
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD01项目<br/>
+      85%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD02项目<br/>
+      50%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD03项目<br/>
+      90%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD04项目<br/>
+      40%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_danger">
+      CD05项目<br/>
+      30%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD06项目<br/>
+      25%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_danger">
+      CD07项目<br/>
+      15%
+    </div>
+  </nz-col>
+  <nz-col nzXs="12" nzSm="6" nzMd="3" nzLg="3">
+    <div class="block_normal">
+      CD08项目<br/>
+      0%
+    </div>
+  </nz-col>
+</div> -->
+
+<!-- <div nz-row [nzGutter]="24" class="pt-lg">
+  <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
+    <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="{{'last.90.days.project.statistics' | translate}}"
+      class="mb-0">
+      <g2-pie *ngIf="isVisible" [data]="projectFeeData" [hasLegend]="true" [subTitle]="'项目状态(个数)' | translate" [height]="600"
+        [lineWidth]="4" [total]="projectFeeTotal" [valueFormat]="projectFeeFormat" [inner]="0.4">
+      </g2-pie>
+    </nz-card>
+  </div>
+</div> -->
+<!-- class="tableTdPadding" -->
+<!-- <th nzLeft="0px" nzWidth="60px"><strong>序号</strong></th>
+<th nzLeft="60px" nzWidth="100px"><strong>生产线</strong></th>
+<th nzLeft="160px" nzWidth="100px"><strong>生产订单号</strong></th> -->
+<nz-spin [nzSpinning]="saveLoading">
+  <form nz-form>
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">生产订单</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <!-- <input [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName" nz-input
+            placeholder="请输入" /> -->
+            <nz-select [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName"
+              style="width: 100%" nzShowSearch nzAllowClear nzPlaceHolder="请选择">
+              <ng-container *ngFor="let list of listOfDataSelect">
+                <nz-option [nzLabel]="list.productionOrderNumberName" [nzValue]="list.productionOrderNumberName">
+                </nz-option>
+              </ng-container>
+            </nz-select>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="4">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">年份</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkshopDispatchList.year" name="year" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="4">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">月份</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkshopDispatchList.month" name="month" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <!-- 按钮 -->
+      <div nz-col nzXs="24" nzSm="4" nzLg="2">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="2" [nzNoColon]="true"></nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <!-- 查询 -->
+            <button nz-button nzType="primary" (click)="getSumDispatchReport()">查询</button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="6">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="16">是否显示已完成订单</nz-form-label>
+          <nz-form-control [nzSpan]="8">
+            <!-- 查询 -->
+            <nz-switch [(ngModel)]="isSwitch" name="isSwitch" nzCheckedChildren="是" nzUnCheckedChildren="否"
+              (ngModelChange)="isSwitchChange()">
+            </nz-switch>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+
+  </form>
+  <div nz-row [nzGutter]="24">
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
+      <nz-table class="tableTdPadding" nzSize="small" #columnTable nzBordered [nzData]="listOfData"
+        [nzScroll]="{ x: widthLength+'px', y:'550px'}" [nzShowPagination]="false" [nzFrontPagination]="false">
+        <thead>
+          <tr>
+            <!-- <th nzLeft="0px" nzWidth="60px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>序号</strong></th>
+          <th nzLeft="58px" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>项目名称</strong></th>
+          <th nzLeft="157px" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>生产订单号</strong></th>
+          <th nzLeft="265px" nzWidth="120px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料编码</strong></th>
+          <th nzLeft="383px" nzWidth="200px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料名称</strong></th> -->
+
+            <th nzLeft="0px" rowSpan="2" nzWidth="30px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>序号</strong></th>
+            <th nzLeft="29px" rowSpan="2" nzWidth="80px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>项目名称</strong></th>
+            <th nzLeft="108px" rowSpan="2" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>生产订单号</strong></th>
+            <th nzLeft="217px" rowSpan="2" nzWidth="120px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>物料编码</strong></th>
+            <th nzLeft="336px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>物料名称</strong></th>
+            <th nzLeft="436px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>计划数量</strong></th>
+            <th nzLeft="506px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>标准工时</strong></th>
+            <th nzLeft="576px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>完成数量</strong></th>
+            <th nzLeft="645px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+              <strong>实际工时</strong></th>
+              <th nzLeft="714px" rowSpan="2" nzWidth="80px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+                <strong>计划达成率</strong></th>
+                <th nzLeft="794px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+                  <strong>生产效率</strong></th>
+                  <th nzLeft="864px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+                    <strong>计划开完工时间</strong></th>
+                  <th nzLeft="964px" rowSpan="2" nzWidth="50px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+                    <strong>状态</strong></th>
+            <ng-container *ngFor="let date of dateList">
+              <th nzWidth="100px" nzAlign="center"><strong>当日计划数量</strong></th>
+              <th nzWidth="100px" nzAlign="center"><strong>当日完成数量</strong></th>
+              <th nzWidth="100px" nzAlign="center"><strong>当日完成工时 </strong></th>
+              <th nzWidth="100px" nzAlign="center"><strong>当日标准工时</strong></th>
+              <th nzWidth="100px" nzAlign="center"><strong>当日生产效率</strong></th>
+              <th nzWidth="100px" nzAlign="center"><strong>当日达成率</strong></th>
+            </ng-container>
+          </tr>
+          <tr>
+            <!-- <th colspan="5" nzLeft="0px"></th>
+          <th colspan="4" ></th> -->
+            <!-- <th colspan="9" ></th> -->
+            <ng-container *ngFor="let date of dateList;let i=index">
+              <th colspan="6" *ngIf="i%2===0" style="background-color:rgb(223, 223, 219)">
+                <strong>{{date.finalTime|date:'y-MM-dd'}}</strong></th>
+              <th colspan="6" *ngIf="i%2!==0"><strong>{{date.finalTime|date:'y-MM-dd'}}</strong></th>
+            </ng-container>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of columnTable.data;let i = index">
+            <ng-container *ngIf="data.projectName!=='统计'&&data.isSwitch">
+              <!-- *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines" -->
+              <td nzLeft="0px" nzAlign="center" *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">
+                {{ data.sort }}</td>
+              <td nzLeft="29px" *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">{{ data.projectName }}</td>
+              <td nzLeft="108px">{{ data.productionOrderNumberName }}</td>
+              <td nzLeft="217px">{{data.productId}}</td>
+              <td nzLeft="336px">{{data.product}}</td>
+              <td nzLeft="436px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+              <td nzLeft="506px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
+              <td nzLeft="576px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
+              <td nzLeft="645px" nzAlign="center">{{data.manHoursCompletedTotal}}</td>
+              <td nzLeft="714px" nzAlign="center">{{data.achievementRate}}%</td>
+              <td nzLeft="794px" nzAlign="center">{{data.productionEfficiency}}%</td>
+              <td nzLeft="864px" nzAlign="center">{{data.startDate}}至{{data.dueDate}}</td>
+              <td nzLeft="964px" nzAlign="center">
+                <ng-container *ngIf="data.lackOfMaterialState=='正常'">
+                  {{data.lackOfMaterialState}}
+                </ng-container>
+                <ng-container *ngIf="data.lackOfMaterialState=='待料'">
+                  <span style="color: red;">{{data.lackOfMaterialState}}</span>
+                </ng-container>
+              </td>
+              <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
+                <td nzAlign="center">{{dateChild.numberOfTasks}}</td>
+                <td nzAlign="center">{{dateChild.qualifiedNumber}}</td>
+                <td nzAlign="center">{{dateChild.manHoursCompleted}}</td>
+                <td nzAlign="center">{{dateChild.standardWorkingHours}}</td>
+                <td nzAlign="center">
+                  <ng-container *ngIf="dateChild.productionEfficiency">{{dateChild.productionEfficiency}}%
+                  </ng-container>
+                  <ng-container *ngIf="!dateChild.productionEfficiency">0%</ng-container>
+                </td>
+                <td nzAlign="center">
+                  <ng-container *ngIf="dateChild.achievementRate">{{dateChild.achievementRate}}%</ng-container>
+                  <ng-container *ngIf="!dateChild.achievementRate">0%</ng-container>
+                </td>
+              </ng-container>
+            </ng-container>
+          </tr>
+          <!-- 统计 -->
+          <tr style="background-color:rgb(223, 223, 219)" *ngFor="let data of columnTable.data;let i = index">
+            <ng-container *ngIf="data.projectName==='统计'">
+              <td nzLeft="0px" style="background-color:rgb(223, 223, 219)"></td>
+              <td nzLeft="29px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center">
+                <!-- 剩余工时 -->标准总工时
+              </td>
+              <td nzLeft="108px" style="background-color:rgb(223, 223, 219)" nzAlign="center">
+                <!-- {{data.remainingWorkTotal}} -->{{data.standardWorkingHoursTotal}}
+              </td>
+              <td nzLeft="217px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center"></td>
+              <td nzLeft="336px" style="background-color:rgb(223, 223, 219);font-weight:bolder">统计</td>
+              <td nzLeft="436px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+              <td nzLeft="506px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
+              <td nzLeft="576px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
+              <td nzLeft="645px" nzAlign="center">{{data.manHoursCompletedTotal}}</td>
+              <td nzLeft="714px" nzAlign="center"></td>
+              <td nzLeft="794px" nzAlign="center" colSpan="3"></td>
+              <!-- <td nzLeft="836px" nzAlign="center"></td> -->
+              <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
+                <td nzAlign="center">{{dateChild.numberOfTasks}}</td>
+                <td nzAlign="center">{{dateChild.qualifiedNumber}}</td>
+                <td nzAlign="center">{{dateChild.manHoursCompleted}}</td>
+                <td nzAlign="center">{{dateChild.standardWorkingHours}}</td>
+                <td nzAlign="center">
+                  <ng-container *ngIf="dateChild.productionEfficiency">{{dateChild.productionEfficiency}}%
+                  </ng-container>
+                  <ng-container *ngIf="!dateChild.productionEfficiency">0%</ng-container>
+                </td>
+                <td nzAlign="center">
+                  <ng-container *ngIf="dateChild.achievementRate">{{dateChild.achievementRate}}%</ng-container>
+                  <ng-container *ngIf="!dateChild.achievementRate">0%</ng-container>
+                </td>
+              </ng-container>
+            </ng-container>
+          </tr>
+          <tr></tr>
+        </tbody>
+        <!-- 异常工时 -->
+        <tbody>
+          <tr>
+            <td  nzLeft="0px"></td>
+            <td  nzLeft="29px" nzAlign="center" style="font-weight:bolder">月计划达成率</td>
+            <td  nzLeft="108px" nzAlign="center">{{achievementRateTotal}}%</td>
+            <td  nzLeft="217px" nzAlign="center" style="font-weight:bolder">月生产效率</td>
+            <td  nzLeft="336px" nzAlign="center">{{productivityTotal}}%</td>
+            <td  nzLeft="436px" colSpan="8"></td>
+            <td [colSpan]="dateList.length*6" rowSpan="2"></td>
+          </tr>
+          <tr>
+            <td  nzLeft="0px"></td>
+            <td  nzLeft="29px" nzAlign="center" style="font-weight:bolder">月出勤工时</td>
+            <td  nzLeft="108px" nzAlign="center">{{abnormalWorkingHours.attendanceHours}}</td>
+            <td  nzLeft="217px" nzAlign="center" style="font-weight:bolder">月加班工时</td>
+            <td  nzLeft="336px" nzAlign="center">{{abnormalWorkingHours.overtimeHours}}</td>
+            <td  nzLeft="436px" nzAlign="center" style="font-weight:bolder" colSpan="2">月其他工时</td>
+            <td  nzLeft="576px" nzAlign="center">{{abnormalWorkingHours.other}}</td>
+            <td  nzLeft="645px" nzAlign="center" style="font-weight:bolder" colSpan="2">月异常工时</td>
+            <td  nzLeft="794px" nzAlign="center">{{abnormalWorkingHours.quality}}</td>
+            <td  nzLeft="864px" nzAlign="center" style="font-weight:bolder">月仓库工时</td>
+            <td  nzLeft="964px" nzAlign="center" >{{abnormalWorkingHours.plan}}</td>
+          </tr>
+          <!-- <tr>
+            <td  nzLeft="0px"></td>
+            <td  nzLeft="29px" nzAlign="center" style="font-weight:bolder">总达成率</td>
+            <td  nzLeft="109px" nzAlign="center">{{achievementRateTotal}}%</td>
+            <td  nzLeft="218px" nzAlign="center" style="font-weight:bolder">总生产效率</td>
+            <td  nzLeft="337px" nzAlign="center">{{productivityTotal}}%</td>
+            <td nzLeft="437px" class="bolder">出勤总工时</td>
+            <td nzLeft="486px" nzAlign="center">{{AbnormalWorkingHoursTotal.attendanceHours}}</td>
+            <td nzLeft="536px" colSpan="4" nzAlign="right" class="bolder">出勤情况</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>应到人数</td>
+              <td nzAlign="center">{{abnormalWorkingHours.numberOfPeopleToArrive}}</td>
+              <td>实到人数</td>
+              <td nzAlign="center">{{abnormalWorkingHours.actualNumberOfPeople}}</td>
+              <td>出勤工时</td>
+              <td nzAlign="center">{{abnormalWorkingHours.attendanceHours}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            <td nzLeft="0px" colspan="5" rowSpan="9"></td>
+            <td nzLeft="437px" class="bolder">加班总工时</td>
+            <td nzLeft="486px" nzAlign="center">{{AbnormalWorkingHoursTotal.overtimeHours}}</td>
+            <td nzLeft="536px" colSpan="4" nzAlign="right" class="bolder">加班记录</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>加班工时</td>
+              <td nzAlign="center">{{abnormalWorkingHours.overtimeHours}}</td>
+              <td>加班原因</td>
+              <td colSpan="3">{{abnormalWorkingHours.overtimeReason}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            
+            <td nzLeft="437px" rowSpan="2" class="bolder">其他总工时</td>
+            <td nzLeft="486px" rowSpan="2" nzAlign="center">{{AbnormalWorkingHoursTotal.train}}</td>
+            <td nzLeft="536px" colSpan="4" rowSpan="2" nzAlign="right" class="bolder">其他工时统计</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>培训</td>
+              <td nzAlign="center">{{abnormalWorkingHours.train}}</td>
+              <td>会议</td>
+              <td nzAlign="center">{{abnormalWorkingHours.meeting}}</td>
+              <td>5S</td>
+              <td nzAlign="center">{{abnormalWorkingHours.fiveS}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>研发</td>
+              <td nzAlign="center">{{abnormalWorkingHours.researchAndDevelopment}}</td>
+              <td></td>
+              <td></td>
+              <td></td>
+              <td></td>
+            </ng-container>
+          </tr>
+          <tr>
+            <td nzLeft="437px" rowSpan="3" class="bolder">异常总工时统计</td>
+            <td nzLeft="486px" rowSpan="3" nzAlign="center">{{AbnormalWorkingHoursTotal.abnormalWorkingHours}}</td>
+            <td nzLeft="536px" colSpan="4" rowSpan="3" nzAlign="right" class="bolder">异常工时统计</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>质量</td>
+              <td nzAlign="center">{{abnormalWorkingHours.quality}}</td>
+              <td>设计</td>
+              <td nzAlign="center">{{abnormalWorkingHours.design}}</td>
+              <td>返工</td>
+              <td nzAlign="center">{{abnormalWorkingHours.rework}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>物料</td>
+              <td nzAlign="center">{{abnormalWorkingHours.materiel}}</td>
+              <td>能源</td>
+              <td nzAlign="center">{{abnormalWorkingHours.energy}}</td>
+              <td>其他</td>
+              <td nzAlign="center">{{abnormalWorkingHours.other}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>设备</td>
+              <td nzAlign="center">{{abnormalWorkingHours.equipment}}</td>
+              <td>计划</td>
+              <td nzAlign="center">{{abnormalWorkingHours.plan}}</td>
+              <td></td>
+              <td></td>
+            </ng-container>
+          </tr>
+          <tr>
+            <td nzLeft="437px" rowSpan="2" class="bolder">仓库总工时统计</td>
+            <td nzLeft="486px" rowSpan="2" nzAlign="center">{{AbnormalWorkingHoursTotal.warehouse}}</td>
+            <td nzLeft="536px" colSpan="4" rowSpan="2" nzAlign="right" class="bolder">仓库工时统计</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>配料</td>
+              <td nzAlign="center">{{abnormalWorkingHours.mixedIngredients}}</td>
+              <td>入库</td>
+              <td nzAlign="center">{{abnormalWorkingHours.warehousing}}</td>
+              <td>打包</td>
+              <td nzAlign="center">{{abnormalWorkingHours.pack}}</td>
+            </ng-container>
+          </tr>
+          <tr>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td>其他</td>
+              <td nzAlign="center">{{abnormalWorkingHours.warehouseOthers}}</td>
+              <td>备注</td>
+              <td nzAlign="center" colSpan="3">{{abnormalWorkingHours.memo}}</td>
+            </ng-container>
+          </tr>
+
+
+          <tr>
+            <td nzLeft="437px" colSpan="6" class="bolder">异常原因描述</td>
+            <ng-container *ngFor="let abnormalWorkingHours of abnormalWorkingHoursList">
+              <td colSpan="6">
+                <ng-container *ngFor="let describe of abnormalWorkingHours.fbsAbnormalWorkingHoursDescribeList">
+                  <ng-container *ngIf="describe.describes">
+                    {{describe.describes}}<br>
+                  </ng-container>
+                </ng-container>
+              </td>
+            </ng-container>
+          </tr> -->
+
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+  <form nz-form>
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      <!-- 按钮 -->
+      <div nz-col nzXs="24" nzSm="4" nzLg="4">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="2" [nzNoColon]="true"></nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <!-- 查询 -->
+            <button nz-button nzType="primary" (click)="export()" [nzLoading]="exportLoading">导出</button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+
+</nz-spin>
+<nz-spin [nzSpinning]="planningReportLoading">
+  <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+    <div nz-col nzXs="24" nzSm="4" nzLg="4">
+      <nz-form-item class="nz-form-item">
+        <nz-form-label [nzSpan]="6" ><strong>日期</strong></nz-form-label>
+        <nz-form-control [nzSpan]="12">
+          {{fbsWorkshopDispatchListPlanningReport.year}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col nzXs="24" nzSm="4" nzLg="4">
+      <nz-form-item class="nz-form-item">
+        <nz-form-label [nzSpan]="6" ><strong>周末</strong></nz-form-label>
+        <nz-form-control [nzSpan]="12" >
+          <span style="background-color: yellow;border:1px solid #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+    <div nz-col nzXs="24" nzSm="24" nzLg="24" >
+     
+      <nz-table  class="tableTdPadding" nzSize="small" #columnTable2 nzBordered [nzData]="planningReportList"
+      [nzScroll]="{x:columnTable2Width+'px',y:'35vw'}" [nzShowPagination]="false" [nzFrontPagination]="false">
+        <thead>
+          <tr>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="0px" nzAlign="center"><strong>序号</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="40px" nzAlign="center"><strong>生产订单</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="120px" nzAlign="center"><strong>物料编码</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="120px" nzLeft="210px" nzAlign="center"><strong>物料名称</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="310px" nzAlign="center"><strong>数量</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="80px" nzLeft="350px" nzAlign="center"><strong>标准工时</strong></th>
+            <!-- <th style="background-color:rgb(223, 223, 219);" nzWidth="4vw"><strong>{{fbsWorkshopDispatchListPlanningReport.year}}</strong></th> -->
+            <ng-container *ngFor="let day of fbsWorkshopDispatchListPlanningReport.dayList">
+              <ng-container *ngIf="day.week=='2'">
+                <th style="background-color:rgb(223, 223, 219);padding: 2px;" nzWidth="25px" nzAlign="center">{{day.day}}</th>
+              </ng-container>
+              <ng-container *ngIf="day.week=='1'">
+                <th style="background-color:yellow;padding: 2px;" nzWidth="25px" nzAlign="center">{{day.day}}</th>
+              </ng-container>
+              
+            </ng-container>
+
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of columnTable2.data;let i = index">
+            <td nzLeft="0px" nzAlign="center" >{{i+1}}</td>
+            <td nzLeft="40px">{{data.productionOrderNumberName}}</td>
+            <td nzLeft="120px">{{data.productId}}</td>
+            <td nzLeft="210px">{{data.product}}</td>
+            <td nzLeft="310px" nzAlign="center">{{data.numberOfTasks}}</td>
+            <td nzLeft="350px" nzAlign="center">{{data.standardWorkingHours}}</td>
+            <!-- <td ></td> -->
+            <ng-container *ngFor="let color of data.isColor">
+              <ng-container *ngIf="color==='1'">
+                <td style="background-color:greenyellow;"></td>
+              </ng-container>
+              <ng-container *ngIf="color==='0'">
+                <td ></td>
+              </ng-container>
+            </ng-container>
+
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-spin>
+
+
+
+<!-- <div nz-row [nzGutter]="24" class="pt-lg">
+    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
+        <nz-card [nzLoading]="loading" [nzBordered]="false" [nzTitle]="'项目费用占比' | translate"  class="mb-0">
+            <h4 class="margin:5px 0 5px 0;"></h4>
+            <nz-table [nzShowPagination]="false">
+                <thead>
+                  <tr>
+                    <th rowspan="2">序号</th>
+                    <th rowspan="2">任务</th>
+                    <th rowspan="2">负责人</th>
+                    <th rowspan="2">开始<br/>时间</th>
+                    <th rowspan="2">完成<br/>时间</th>
+                    <th rowspan="2">工期</th>
+                    <th rowspan="2">进度</th>
+                    <th colspan="2">19年2月</th>
+                    <th colspan="2">19年3月</th>
+                    <th colspan="2">19年4月</th>
+                    <th colspan="2">19年5月</th>
+                    <th colspan="2">19年6月</th>
+                    <th colspan="2">19年7月</th>
+                    <th colspan="2">19年8月</th>
+                    <th colspan="2">19年9月</th>
+                  </tr>
+                  <tr>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                    <th>10</th>
+                    <th>25</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr>
+                    <td>1</td>
+                    <td>CD01</td>
+                    <td>张三</td>
+                    <td>20190201</td>
+                    <td>20190620</td>
+                    <td>100d</td>
+                    <td>85%</td>
+                    <td class="work_done"></td>
+                    <td class="work_done"></td>
+
+                    <td class="work_done"></td>
+                    <td class="work_done"></td>
+
+                    <td class="work_done"></td>
+                    <td class="work_done"></td>
+
+                    <td class="work_done"></td>
+                    <td class="work_done"></td>
+
+                    <td class="work_doing"></td>
+                    <td class="work_doing"></td>
+
+                    <td></td>
+                    <td></td>
+
+                    <td></td>
+                    <td></td>
+
+                    <td></td>
+                    <td></td>
+                  </tr>
+                  <tr>
+                      <td>2</td>
+                      <td>CD02</td>
+                      <td>李四</td>
+                      <td>20190301</td>
+                      <td>20190926</td>
+                      <td>150d</td>
+                      <td>50%</td>
+                      <td></td>
+                      <td></td>
+  
+                      <td class="work_done"></td>
+                      <td class="work_done"></td>
+  
+                      <td class="work_done"></td>
+                      <td class="work_done"></td>
+  
+                      <td class="work_done"></td>
+                      <td class="work_done"></td>
+  
+                      <td class="work_doing"></td>
+                      <td class="work_doing"></td>
+  
+                      <td class="work_doing"></td>
+                      <td class="work_doing"></td>
+  
+                      <td class="work_doing"></td>
+                      <td class="work_doing"></td>
+  
+                      <td class="work_doing"></td>
+                      <td></td>
+                    </tr>
+                    <tr>
+                        <td>3</td>
+                        <td>CD03</td>
+                        <td>Jack</td>
+                        <td>20190315</td>
+                        <td>20190606</td>
+                        <td>60d</td>
+                        <td>90%</td>
+                        <td></td>
+                        <td></td>
+    
+                        <td class=""></td>
+                        <td class="work_done"></td>
+    
+                        <td class="work_done"></td>
+                        <td class="work_done"></td>
+    
+                        <td class="work_done"></td>
+                        <td class="work_done"></td>
+    
+                        <td class="work_doing"></td>
+                        <td class=""></td>
+    
+                        <td class=""></td>
+                        <td class=""></td>
+    
+                        <td class=""></td>
+                        <td class=""></td>
+    
+                        <td class=""></td>
+                        <td></td>
+                      </tr>
+                      <tr>
+                          <td>4</td>
+                          <td>CD04</td>
+                          <td>Alise</td>
+                          <td>20190401</td>
+                          <td>20190816</td>
+                          <td>100d</td>
+                          <td>40%</td>
+                          <td></td>
+                          <td></td>
+      
+                          <td class=""></td>
+                          <td class=""></td>
+      
+                          <td class="work_done"></td>
+                          <td class="work_done"></td>
+      
+                          <td class="work_done"></td>
+                          <td class="work_doing"></td>
+      
+                          <td class="work_doing"></td>
+                          <td class="work_doing"></td>
+      
+                          <td class="work_doing"></td>
+                          <td class="work_doing"></td>
+      
+                          <td class="work_doing"></td>
+                          <td class=""></td>
+      
+                          <td class=""></td>
+                          <td></td>
+                        </tr>
+                        <tr>
+                            <td>5</td>
+                            <td>CD05</td>
+                            <td>Tom</td>
+                            <td>20190410</td>
+                            <td>20190924</td>
+                            <td>120d</td>
+                            <td>30%</td>
+                            <td></td>
+                            <td></td>
+        
+                            <td class=""></td>
+                            <td class=""></td>
+        
+                            <td class=""></td>
+                            <td class="work_done"></td>
+        
+                            <td class="work_done"></td>
+                            <td class="work_doing"></td>
+        
+                            <td class="work_doing"></td>
+                            <td class="work_doing"></td>
+        
+                            <td class="work_doing"></td>
+                            <td class="work_doing"></td>
+        
+                            <td class="work_doing"></td>
+                            <td class="work_doing"></td>
+        
+                            <td class="work_doing"></td>
+                            <td></td>
+                          </tr>
+                          <tr>
+                              <td>6</td>
+                              <td>CD06</td>
+                              <td>王五</td>
+                              <td>20190422</td>
+                              <td>20190906</td>
+                              <td>100d</td>
+                              <td>25%</td>
+                              <td></td>
+                              <td></td>
+          
+                              <td class=""></td>
+                              <td class=""></td>
+          
+                              <td class=""></td>
+                              <td class=""></td>
+          
+                              <td class="work_done"></td>
+                              <td class="work_done"></td>
+          
+                              <td class="work_doing"></td>
+                              <td class="work_doing"></td>
+          
+                              <td class="work_doing"></td>
+                              <td class="work_doing"></td>
+          
+                              <td class="work_doing"></td>
+                              <td class="work_doing"></td>
+          
+                              <td class=""></td>
+                              <td></td>
+                            </tr>
+                            <tr>
+                                <td>7</td>
+                                <td>CD07</td>
+                                <td>超人</td>
+                                <td>20190510</td>
+                                <td>20190829</td>
+                                <td>80d</td>
+                                <td>15%</td>
+                                <td></td>
+                                <td></td>
+            
+                                <td class=""></td>
+                                <td class=""></td>
+            
+                                <td class=""></td>
+                                <td class=""></td>
+            
+                                <td class=""></td>
+                                <td class="work_done"></td>
+            
+                                <td class="work_doing"></td>
+                                <td class="work_doing"></td>
+            
+                                <td class="work_doing"></td>
+                                <td class="work_doing"></td>
+            
+                                <td class="work_doing"></td>
+                                <td class="work_doing"></td>
+            
+                                <td class=""></td>
+                                <td class=""></td>
+                              </tr>
+                              <tr>
+                                  <td>8</td>
+                                  <td>CD08</td>
+                                  <td>Mike</td>
+                                  <td>20190527</td>
+                                  <td>20190913</td>
+                                  <td>80d</td>
+                                  <td>0%</td>
+                                  <td></td>
+                                  <td></td>
+              
+                                  <td class=""></td>
+                                  <td class=""></td>
+              
+                                  <td class=""></td>
+                                  <td class=""></td>
+              
+                                  <td class=""></td>
+                                  <td class=""></td>
+              
+                                  <td class="work_doing"></td>
+                                  <td class="work_doing"></td>
+              
+                                  <td class="work_doing"></td>
+                                  <td class="work_doing"></td>
+              
+                                  <td class="work_doing"></td>
+                                  <td class="work_doing"></td>
+              
+                                  <td class="work_doing"></td>
+                                  <td class=""></td>
+                                </tr>
+                </tbody>
+              </nz-table>
+          </nz-card>
+    </div>
+  </div>
+<div nz-row [nzGutter]="24">
+  <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+    <nz-card [nzLoading]="loading" [nzBordered]="false" [nzTitle]="'2018年度成本分析' | translate" class="mb-0">
+      
+        <h4 class="margin:8px 0 32px 0;"></h4>
+        <g2-pie *ngIf="salesPieData" [data]="feeData" [hasLegend]="true" [subTitle]="'' | translate" [height]="248" [lineWidth]="4" [total]=""
+          [valueFormat]="feeFormat" [inner]="0">
+        </g2-pie>
+    </nz-card>
+  </div>
+  <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="12">
+    <nz-card [nzLoading]="loading" [nzBordered]="false" [nzTitle]="'项目风险预警' | translate" 
+      class="sales-card mb-0" >
+      <h4 class="margin:8px 0 32px 0;"></h4>
+      <g2-bar *ngIf="salesPieData" [data]="alertData" [height]="248" >
+      </g2-bar>
+    </nz-card>
+  </div>
+</div> -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+import { Component, ChangeDetectionStrategy, OnInit, ChangeDetectorRef, ElementRef } from '@angular/core';
+import { NzMessageService } from 'ng-zorro-antd';
+import { STColumn, XlsxService } from '@delon/abc';
+import { getTimeDistance } from '@delon/util';
+import { _HttpClient } from '@delon/theme';
+import { I18NService } from '@core';
+import { yuan } from '@shared';
+import { ProjectFileService } from 'app/services/projectFile/project-file.service';
+import { FbsWorkshopDispatchListService } from 'app/services/fbs/fbs-workshop-dispatch-list.service';
+import { FbsAbnormalWorkingHoursService } from 'app/services/fbs/fbs-abnormal-working-hours.service';
+import { FbsWorkshopDispatchList } from 'app/entity/fbs/fbs-workshop-dispatch-list';
+import { convertingNumbers } from '@shared/utils/shared';
+import { FbsAbnormalWorkingHours } from 'app/entity/fbs/fbs-abnormal-working-hours';
+@Component({
+  selector: 'app-dashboard-analysis',
+  templateUrl: './analysis.component.html',
+  styleUrls: ['./analysis.component.less'],
+  styles:[
+    `
+    table{
+      border-collapse:collapse;border:none;
+    }
+    th{
+      border:solid#000 1px;
+    }
+    td{
+      border:solid#000 1px;
+    }
+    .bolder{
+      font-weight:bolder;
+    }
+    
+    `
+  ]
+  // changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class DashboardAnalysisComponent implements OnInit {
+  data: any = {};
+  loading = true;
+  date_range: Date[] = [];
+  rankingListData: any[] = Array(7)
+    .fill({})
+    .map((item, i) => {
+      return {
+        title: this.i18n.fanyi('app.analysis.test', { no: i }),
+        total: 323234,
+      };
+    });
+  titleMap = {
+    y1: this.i18n.fanyi('app.analysis.traffic'),
+    y2: this.i18n.fanyi('app.analysis.payments'),
+  };
+  searchColumn: STColumn[] = [
+    { title: '排名', i18n: 'app.analysis.table.rank', index: 'index' },
+    {
+      title: '搜索关键词',
+      i18n: 'app.analysis.table.search-keyword',
+      index: 'keyword',
+      click: (item: any) => this.msg.success(item.keyword),
+    },
+    {
+      type: 'number',
+      title: '用户数',
+      i18n: 'app.analysis.table.users',
+      index: 'count',
+      sorter: (a, b) => a.count - b.count,
+    },
+    {
+      type: 'number',
+      title: '周涨幅',
+      i18n: 'app.analysis.table.weekly-range',
+      index: 'range',
+      render: 'range',
+      sorter: (a, b) => a.range - b.range,
+    },
+  ];
+
+  constructor(
+    private http: _HttpClient,
+    public msg: NzMessageService,
+    private i18n: I18NService,
+    private cdr: ChangeDetectorRef,
+    private projectFileService: ProjectFileService,
+    private fbsWorkshopDispatchListService:FbsWorkshopDispatchListService,
+    private fbsAbnormalWorkingHoursService:FbsAbnormalWorkingHoursService,
+    private xlsx: XlsxService
+  ) { }
+
+
+  ngOnInit() {
+    // const offlineData: any[] = [];
+    // for (let i = 0; i < 10; i += 1) {
+    //   offlineData.push({
+    //     name: `门店${i}`,
+    //     cvr: Math.ceil(Math.random() * 9) / 10,
+    //   });
+    // };
+    // offlineData.forEach((item: any, idx: number) => {
+    //   item.show = idx === 0;
+    //   item.chart = Object.assign([], offlineData);
+    // });
+    // this.http.get('/chart').subscribe((res: any) => {
+    //   res.offlineData.forEach((item: any, idx: number) => {
+    //     item.show = idx === 0;
+    //     item.chart = Object.assign([], res.offlineChartData);
+    //   });
+    //   this.data = res;
+    //   this.loading = false;
+    // });
+    
+    this.getCircleChartData();
+    this.feeTotal = `&yen ${this.feeData.reduce((pre, now) => now.y + pre, 0).toFixed(2)}`;
+    this.alertTotal = `&yen ${this.feeData.reduce((pre, now) => now.y + pre, 0).toFixed(2)}`;
+    this.getNow();
+    this.getSumDispatchReport();
+    this.getAbnormalWorkingHoursReport();
+    this.getPlanningReport();
+    this.getAbnormalWorkingHoursTotal();
+  }
+
+  /**
+   * @description: 获取数据
+   * @param {type} 
+   * @author: 段亚鑫
+   */
+  isVisible = false;
+  getCircleChartData() {
+    this.projectFileService.queryStatusNum().then((response) => {
+      this.projectFeeData = response.result.statusList;
+      this.projectFeeTotal = response.result.sum;
+      this.isVisible = true;
+      this.loading = false;
+      // this.chart.render();
+    })
+  }
+
+  /**
+  * @description: 渲染图表
+  * @param {type} 
+  * @author: 段亚鑫
+  */
+  chart: any;
+  render(el: ElementRef) {
+    const data = [{
+      item: '事例一',
+      count: 40,
+      percent: 0.4
+    }, {
+      item: '事例二',
+      count: 21,
+      percent: 0.21
+    }, {
+      item: '事例三',
+      count: 17,
+      percent: 0.17
+    }, {
+      item: '事例四',
+      count: 13,
+      percent: 0.13
+    }, {
+      item: '事例五',
+      count: 9,
+      percent: 0.09
+    }];
+    this.chart = new G2.Chart({
+      container: el.nativeElement,
+      forceFit: true,
+      height: 450,
+      animate: false
+    });
+    this.chart.source(data, {
+      percent: {
+        formatter: function formatter(val) {
+          val = val * 100 + '%';
+          return val;
+        }
+      }
+    });
+    this.chart.coord('theta', {
+      radius: 0.75,
+      innerRadius: 0.6
+    });
+    this.chart.tooltip({
+      showTitle: false,
+      itemTpl: '<li><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>'
+    });
+    // 文本
+    this.chart.guide().html({
+      position: ['50%', '50%'],
+      html: '<div style="color:#8c8c8c;font-size: 14px;text-align: center;width: 10em;">主机<br><span style="color:#8c8c8c;font-size:20px">200</span>台</div>',
+      alignX: 'middle',
+      alignY: 'middle'
+    });
+    const interval = this.chart.intervalStack().position('percent').color('item').label('percent', {
+      formatter: function formatter(val, item) {
+        return item.point.item + ': ' + val;
+      }
+    }).tooltip('item*percent', function (item, percent) {
+      percent = percent * 100 + '%';
+      return {
+        name: item,
+        value: percent
+      };
+    }).style({
+      lineWidth: 1,
+      stroke: '#fff'
+    });
+    // this.chart.render();
+    interval.setSelected(data[0]);
+  }
+
+  setDate(type: any) {
+    this.date_range = getTimeDistance(type);
+    setTimeout(() => this.cdr.detectChanges());
+  }
+
+  salesType = 'all';
+  salesPieData: any;
+  salesTotal = 0;
+  changeSaleType() {
+    this.salesPieData =
+      this.salesType === 'all'
+        ? this.data.salesTypeData
+        : this.salesType === 'online'
+          ? this.data.salesTypeDataOnline
+          : this.data.salesTypeDataOffline;
+    if (this.salesPieData) {
+      this.salesTotal = this.salesPieData.reduce((pre, now) => now.y + pre, 0);
+    }
+    this.cdr.detectChanges();
+  }
+
+  handlePieValueFormat(value: any) {
+    return yuan(value);
+  }
+
+  saleTabs: any[] = [{ key: 'sales', show: true }, { key: 'visits' }];
+  salesChange(idx: number) {
+    if (this.saleTabs[idx].show !== true) {
+      this.saleTabs[idx].show = true;
+      this.cdr.detectChanges();
+    }
+  }
+
+  offlineIdx = 0;
+  offlineChange(idx: number) {
+    if (this.data.offlineData[idx].show !== true) {
+      this.data.offlineData[idx].show = true;
+      this.cdr.detectChanges();
+    }
+  }
+
+
+  projectFeeTotal: any = null;
+  projectFeeData = [
+    // {x:'试剂/PD01',y:5.0,},
+    // {x:'试剂/PDA',y:2.5,},
+    // {x:'试剂/PR02',y:1.5,},
+    // {x:'检测/PD01',y:5.5,},
+    // {x:'检测/PDA',y:2.2,},
+    // {x:'检测/PR02',y:1.6,},
+    // {x:'会议/PD01',y:0.8,},
+    // {x:'会议/PDA',y:3.2,},
+    // {x:'会议/PR02',y:1.5,},
+    // {x:'培训/PD01',y:2.5,},
+    // {x:'培训/PDA',y:7.6,},
+    // {x:'培训/PR02',y:1.8,},
+    // {x:'会议/PD01',y:0.8,},
+    // {x:'会议/PDA',y:3.2,},
+    // {x:'人工/PR02',y:4.2,},
+  ];
+  projectFeeFormat(val: number) {
+    // console.error(val)
+    return val+"/个";
+  }
+
+  feeTotal: string;
+  feeData = [
+    { x: '一季度', y: 10000, },
+    { x: '二季度', y: 40000, },
+    { x: '三季度', y: 80000, },
+    { x: '四季度', y: 30000, },
+  ];
+  feeFormat(val: number) {
+    return `&yen ${val.toFixed(2)}`;
+  }
+
+  alertTotal: string;
+  alertData = [
+    { x: '办公费', y: 8000, },
+    { x: '检测费', y: 12000, },
+    { x: '设备采购费', y: 66000, },
+    { x: '培训费', y: 45000, },
+  ];
+  alertFormat(val: number) {
+    return `&yen ${val.toFixed(2)}`;
+  }
+
+  saveLoading=false;
+  /**
+   * 获取报表数据
+   */
+  listOfDataSelect=null;
+  getSumDispatchReport(){
+    this.saveLoading=true;
+    this.fbsWorkshopDispatchListService.getSumDispatchReport(this.fbsWorkshopDispatchList).then((response)=>{
+      this.listOfData=response.result;
+      this.defaultSwitch();
+      this.isSwitchChange();
+      if(this.listOfDataSelect===null){
+        this.listOfDataSelect=JSON.parse(JSON.stringify(response.result));
+      }
+      
+      //获取时间集合数据
+      this.getDateList();
+      //总效率
+      this.getEfficiencyTotal()
+      this.saveLoading=false;
+    })
+  }
+
+  achievementRateTotal="";//总达成率
+  productivityTotal="";//生产率
+  getEfficiencyTotal(){
+    this.listOfData.forEach(element => {
+      let numberOfTasksTotal=element.numberOfTasksTotal;//计划数量
+      let standardWorkingHoursActualTotal=element.standardWorkingHoursActualTotal;//实际标准工时
+      let quantityCompletedTotal=element.quantityCompletedTotal;//完成数量
+      let manHoursCompletedTotal=element.manHoursCompletedTotal;//完成工时
+      if(element.projectName==="统计"){
+        this.achievementRateTotal=((Number(quantityCompletedTotal)/Number(numberOfTasksTotal))*100).toFixed(1);
+        console.log("标准工时",standardWorkingHoursActualTotal)
+        this.productivityTotal=((Number(standardWorkingHoursActualTotal)/Number(manHoursCompletedTotal))*100).toFixed(1)
+      }
+    });
+  }
+
+  /**
+   * 工时报表的总工时
+   */
+  abnormalWorkingHours:FbsAbnormalWorkingHours={}
+  getAbnormalWorkingHoursTotal(){
+    this.fbsAbnormalWorkingHoursService.getTotal(this.fbsWorkshopDispatchList.year+"-"+this.fbsWorkshopDispatchList.month).then((response)=>{
+      this.abnormalWorkingHours=response.result;
+    })
+  }
+
+  /**
+   * 获取时间列集合数据
+   */
+  widthLength=0;
+  dateList=[];
+  getDateList(){
+    if(this.listOfData&&this.listOfData.length>0){
+      this.dateList=this.listOfData[0].fbsWorkshopDispatchListList
+      // this.widthLength=(this.listOfData[0].fbsWorkshopDispatchListList.length*700)+890;
+      this.widthLength=(this.listOfData[0].fbsWorkshopDispatchListList.length*600)+1020;
+    }
+  }
+
+  /**
+   * 异常工时统计
+   */
+  abnormalWorkingHoursList:any=[];
+  AbnormalWorkingHoursTotal:any={}
+  getAbnormalWorkingHoursReport(){
+    this.fbsAbnormalWorkingHoursService.getAbnormalWorkingHoursReport().then((response)=>{
+      this.abnormalWorkingHoursList=response.result.fbsAbnormalWorkingHoursList;
+      let attendanceHours=0;//出勤总工时
+      let overtimeHours=0;//加班总工时
+      let train=0;//其他总工时
+      let abnormalWorkingHours=0;//异常总工时统计
+      let warehouse=0;//仓库总工时统计
+      this.abnormalWorkingHoursList.forEach(element => {
+        if(element.attendanceHours){
+          attendanceHours=attendanceHours+Number(element.attendanceHours);
+        }
+        if(element.overtimeHours){
+        overtimeHours=overtimeHours+Number(element.overtimeHours);
+        }
+        train=train+Number(element.train)+Number(element.meeting)+Number(element.fiveS)+Number(element.researchAndDevelopment);
+        abnormalWorkingHours=abnormalWorkingHours+Number(element.quality)+Number(element.design)+Number(element.rework)+Number(element.materiel)+Number(element.energy)+Number(element.other)+Number(element.equipment)+Number(element.plan);
+        warehouse=warehouse+Number(element.mixedIngredients)+Number(element.warehousing)+Number(element.pack)+Number(element.warehouseOthers)
+      });
+      this.AbnormalWorkingHoursTotal.attendanceHours=attendanceHours;
+      this.AbnormalWorkingHoursTotal.overtimeHours=overtimeHours;
+      this.AbnormalWorkingHoursTotal.train=train;
+      this.AbnormalWorkingHoursTotal.abnormalWorkingHours=abnormalWorkingHours;
+      this.AbnormalWorkingHoursTotal.warehouse=warehouse;
+    })
+  }
+
+
+  fbsWorkshopDispatchList:FbsWorkshopDispatchList={};
+
+
+  listOfData=[]
+
+  isSwitch=false;//是否显示已完成订单
+  isSwitchChange(){
+      this.listOfData.forEach(element => {
+        if(element.status===4){
+          if(this.isSwitch===false){
+            element.isSwitch=false;
+          }else{
+            element.isSwitch=true;
+          }
+        }
+      });
+  }
+  defaultSwitch(){
+    this.listOfData.forEach(element => {
+      if(element.status===4){
+          element.isSwitch=false;
+      }else{
+        element.isSwitch=true;
+      }
+    });
+  }
+
+  /**
+   * 导出
+   */
+
+   year="0";
+   month="0";
+   //初始化年月 默认当前年月
+   getNow(){
+    let date = new Date();
+    this.fbsWorkshopDispatchList.year=date.getFullYear()+"";
+    if(date.getMonth()<10){
+      this.fbsWorkshopDispatchList.month="0"+(date.getMonth()+1)
+    }else{
+      this.fbsWorkshopDispatchList.month=(date.getMonth()+1)+"";
+    }
+    
+   }
+   
+  exportLoading=false;
+  export(){
+    // let month=this.year.substring(2,4)+this.month;
+    // this.fbsWorkshopDispatchListService.export(month).then((response)=>{
+    //   let list=[];
+    //   list=response.result
+
+    // this.exportLoading=true;
+    let data = [];
+    let title = [
+      ['项目名称'], // 项目名称
+      ['生产订单号'], // 生产订单号
+      ['物料编码'], // 物料编码
+      ['物料名称'], // 物料名称
+      ['计划数量'], // 月度计划
+      ['标准工时'], // 标准工时
+      ['完成数量'], // 累计完成数量
+      ['实际工时'], // 累计完成工时
+      ['计划达成率'], // 计划达成率
+      ['计划生产效率'], // 计划生产效率
+    ];
+    data.push(title);
+    this.listOfData.forEach(element => {
+      let row=[];
+      if(element.projectName=="统计"){
+        row.push("标准总工时")
+        row.push(element.standardWorkingHoursTotal)
+        element.product="统计";
+      }else{
+        row.push(element.projectName)
+        row.push(element.productionOrderNumberName)
+      }
+      
+      row.push(element.productId)
+      row.push(element.product)
+      row.push(convertingNumbers(element.surplusNumberOfTasksTotal))//numberOfTasksTotal
+      row.push(convertingNumbers(element.surplusStandardWorkingHoursTotal))//standardWorkingHoursTotal
+      row.push(element.quantityCompletedTotal)//quantityCompletedTotal//latestCompletedQuantity
+      row.push(convertingNumbers(element.manHoursCompletedTotal))
+      if(element.projectName!="统计"){
+        row.push(element.achievementRate+"%")
+        if(element.productionEfficiency){
+          row.push(element.productionEfficiency+"%")
+        }else{
+          row.push("0.0%")
+        }
+      }
+
+      
+      
+      data.push(row);
+    });
+    
+    let efficiencyTotal=[
+      ['总达成率'],
+      [this.achievementRateTotal+'%'],
+      ['总生产效率'],
+      [this.productivityTotal+'%'],
+      ['出勤总工时'],
+      [this.abnormalWorkingHours.attendanceHours],
+      ['加班总工时'],
+      [this.abnormalWorkingHours.overtimeHours],
+      ['其他总工时'],
+      [this.abnormalWorkingHours.other],
+      ['异常总工时统计'],
+      [this.abnormalWorkingHours.quality],
+      ['仓库总工时统计'],
+      [this.abnormalWorkingHours.plan]
+    ];
+    data.push(efficiencyTotal);
+    // 导出
+    this.xlsx.export({
+      sheets: [
+        {
+          data: data,
+          name: '生产订单汇总导出',
+        },
+      ],
+      filename: '生产订单汇总导出.xlsx',
+    });
+    // this.exportLoading=false;
+    // })
+  }
+
+
+  planningReportList=[]
+  planningReportLoading=false;
+  fbsWorkshopDispatchListPlanningReport:FbsWorkshopDispatchList={}
+  columnTable2Width=0;
+  getPlanningReport(){
+    this.planningReportLoading=true;
+    this.fbsWorkshopDispatchListService.getPlanningReport().then((response)=>{
+      this.fbsWorkshopDispatchListPlanningReport=response.result;
+      this.planningReportList=response.result.fbsWorkshopDispatchListList;
+      this.columnTable2Width=response.result.dayList.length*25+420
+      this.planningReportLoading=false;
+    })
+  }
+}

+ 183 - 111
src/app/routes/dashboard/analysis/analysis.component.html

@@ -66,23 +66,8 @@
 <nz-spin [nzSpinning]="saveLoading">
   <form nz-form>
     <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      
       <div nz-col nzXs="24" nzSm="4" nzLg="8">
-        <nz-form-item class="nz-form-item">
-          <nz-form-label [nzSpan]="8">生产订单</nz-form-label>
-          <nz-form-control [nzSpan]="16">
-            <!-- <input [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName" nz-input
-            placeholder="请输入" /> -->
-            <nz-select [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName"
-              style="width: 100%" nzShowSearch nzAllowClear nzPlaceHolder="请选择">
-              <ng-container *ngFor="let list of listOfDataSelect">
-                <nz-option [nzLabel]="list.productionOrderNumberName" [nzValue]="list.productionOrderNumberName">
-                </nz-option>
-              </ng-container>
-            </nz-select>
-          </nz-form-control>
-        </nz-form-item>
-      </div>
-      <div nz-col nzXs="24" nzSm="4" nzLg="4">
         <nz-form-item class="nz-form-item">
           <nz-form-label [nzSpan]="8">年份</nz-form-label>
           <nz-form-control [nzSpan]="16">
@@ -90,7 +75,7 @@
           </nz-form-control>
         </nz-form-item>
       </div>
-      <div nz-col nzXs="24" nzSm="4" nzLg="4">
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
         <nz-form-item class="nz-form-item">
           <nz-form-label [nzSpan]="8">月份</nz-form-label>
           <nz-form-control [nzSpan]="16">
@@ -99,19 +84,22 @@
         </nz-form-item>
       </div>
       <!-- 按钮 -->
-      <div nz-col nzXs="24" nzSm="4" nzLg="2">
+      <div nz-col nzXs="24" nzSm="4" nzLg="4">
         <nz-form-item class="nz-form-item">
           <nz-form-label [nzSpan]="2" [nzNoColon]="true"></nz-form-label>
-          <nz-form-control [nzSpan]="16">
+          <nz-form-control [nzSpan]="22">
             <!-- 查询 -->
             <button nz-button nzType="primary" (click)="getSumDispatchReport()">查询</button>
+            &nbsp;&nbsp;
+            <a *ngIf="!isShow" (click)="getShow()">展开&nbsp;<i nz-icon nzType="down" nzTheme="outline"></i></a>
+            <a *ngIf="isShow" (click)="getShow()">收起&nbsp;<i nz-icon nzType="up" nzTheme="outline"></i></a>
           </nz-form-control>
         </nz-form-item>
       </div>
-      <div nz-col nzXs="24" nzSm="4" nzLg="6">
+      <div nz-col nzXs="24" nzSm="4" nzLg="4">
         <nz-form-item class="nz-form-item">
-          <nz-form-label [nzSpan]="16">是否显示已完成订单</nz-form-label>
-          <nz-form-control [nzSpan]="8">
+          <nz-form-label [nzSpan]="18">是否显示已完成订单</nz-form-label>
+          <nz-form-control [nzSpan]="6">
             <!-- 查询 -->
             <nz-switch [(ngModel)]="isSwitch" name="isSwitch" nzCheckedChildren="是" nzUnCheckedChildren="否"
               (ngModelChange)="isSwitchChange()">
@@ -120,12 +108,74 @@
         </nz-form-item>
       </div>
     </div>
-
+    <div *ngIf="isShow">
+      <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">项目编号</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <input [(ngModel)]="fbsWorkshopDispatchList.costItemCode" name="costItemCode" nz-input
+                placeholder="请输入" />
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">项目名称</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <input [(ngModel)]="fbsWorkshopDispatchList.projectName" name="projectName" nz-input placeholder="请输入" />
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">工作中心</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <input [(ngModel)]="fbsWorkshopDispatchList.workCenter" name="workCenter" nz-input placeholder="请输入" />
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+      </div>
+      <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">生产订单</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <!-- <input [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName" nz-input
+              placeholder="请输入" /> -->
+              <nz-select [(ngModel)]="fbsWorkshopDispatchList.productionOrderNumberName" name="productionOrderNumberName"
+                style="width: 100%" nzShowSearch nzAllowClear nzPlaceHolder="请选择">
+                <ng-container *ngFor="let list of listOfDataSelect">
+                  <nz-option [nzLabel]="list.productionOrderNumberName" [nzValue]="list.productionOrderNumberName">
+                  </nz-option>
+                </ng-container>
+              </nz-select>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">物料编码</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <input [(ngModel)]="fbsWorkshopDispatchList.productId" name="productId" nz-input placeholder="请输入" />
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzXs="24" nzSm="4" nzLg="8">
+          <nz-form-item class="nz-form-item">
+            <nz-form-label [nzSpan]="8">物料名称</nz-form-label>
+            <nz-form-control [nzSpan]="16">
+              <input [(ngModel)]="fbsWorkshopDispatchList.product" name="product" nz-input placeholder="请输入" />
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+      </div>
+    </div>
   </form>
   <div nz-row [nzGutter]="24">
     <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
       <nz-table class="tableTdPadding" nzSize="small" #columnTable nzBordered [nzData]="listOfData"
-        [nzScroll]="{ x: widthLength+'px', y:'550px'}" [nzShowPagination]="false" [nzFrontPagination]="false">
+        [nzShowPagination]="false" [nzFrontPagination]="false">
         <thead>
           <tr>
             <!-- <th nzLeft="0px" nzWidth="60px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>序号</strong></th>
@@ -134,70 +184,71 @@
           <th nzLeft="265px" nzWidth="120px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料编码</strong></th>
           <th nzLeft="383px" nzWidth="200px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料名称</strong></th> -->
 
-            <th nzLeft="0px" rowSpan="2" nzWidth="30px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 2%;background-color:rgb(223, 223, 219)">
               <strong>序号</strong></th>
-            <th nzLeft="29px" rowSpan="2" nzWidth="80px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 7%;background-color:rgb(223, 223, 219)">
+              <strong>项目编号</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 10%;background-color:rgb(223, 223, 219)">
               <strong>项目名称</strong></th>
-            <th nzLeft="108px" rowSpan="2" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 7%;background-color:rgb(223, 223, 219)">
+              <strong>工作中心</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 7%;background-color:rgb(223, 223, 219)">
               <strong>生产订单号</strong></th>
-            <th nzLeft="217px" rowSpan="2" nzWidth="120px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 7%;background-color:rgb(223, 223, 219)">
               <strong>物料编码</strong></th>
-            <th nzLeft="336px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 7%;background-color:rgb(223, 223, 219)">
               <strong>物料名称</strong></th>
-            <th nzLeft="436px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-              <strong>计划数量</strong></th>
-            <th nzLeft="506px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-              <strong>标准工时</strong></th>
-            <th nzLeft="576px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 8%;background-color:rgb(223, 223, 219)">
+              <strong>状态</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
+              <strong>数量</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
               <strong>完成数量</strong></th>
-            <th nzLeft="645px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
+              <strong>剩余数量</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
+              <strong>标准工时</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
               <strong>实际工时</strong></th>
-              <th nzLeft="714px" rowSpan="2" nzWidth="80px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-                <strong>计划达成率</strong></th>
-                <th nzLeft="794px" rowSpan="2" nzWidth="70px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-                  <strong>生产效率</strong></th>
-                  <th nzLeft="864px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-                    <strong>计划开完工时间</strong></th>
-                  <th nzLeft="964px" rowSpan="2" nzWidth="50px" nzAlign="center" style="background-color:rgb(223, 223, 219)">
-                    <strong>状态</strong></th>
-            <ng-container *ngFor="let date of dateList">
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
+              <strong>计划达成率</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 3%;background-color:rgb(223, 223, 219)">
+              <strong>生产效率</strong></th>
+            <th rowSpan="2" nzAlign="center" style="width: 14%;background-color:rgb(223, 223, 219)">
+              <strong>计划开完工时间</strong></th>
+            <!-- <ng-container *ngFor="let date of dateList">
               <th nzWidth="100px" nzAlign="center"><strong>当日计划数量</strong></th>
               <th nzWidth="100px" nzAlign="center"><strong>当日完成数量</strong></th>
               <th nzWidth="100px" nzAlign="center"><strong>当日完成工时 </strong></th>
               <th nzWidth="100px" nzAlign="center"><strong>当日标准工时</strong></th>
               <th nzWidth="100px" nzAlign="center"><strong>当日生产效率</strong></th>
               <th nzWidth="100px" nzAlign="center"><strong>当日达成率</strong></th>
-            </ng-container>
+            </ng-container> -->
           </tr>
           <tr>
             <!-- <th colspan="5" nzLeft="0px"></th>
           <th colspan="4" ></th> -->
             <!-- <th colspan="9" ></th> -->
-            <ng-container *ngFor="let date of dateList;let i=index">
+            <!-- <ng-container *ngFor="let date of dateList;let i=index">
               <th colspan="6" *ngIf="i%2===0" style="background-color:rgb(223, 223, 219)">
                 <strong>{{date.finalTime|date:'y-MM-dd'}}</strong></th>
               <th colspan="6" *ngIf="i%2!==0"><strong>{{date.finalTime|date:'y-MM-dd'}}</strong></th>
-            </ng-container>
+            </ng-container> -->
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of columnTable.data;let i = index">
             <ng-container *ngIf="data.projectName!=='统计'&&data.isSwitch">
               <!-- *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines" -->
-              <td nzLeft="0px" nzAlign="center" *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">
+              <td nzAlign="center" *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">
                 {{ data.sort }}</td>
-              <td nzLeft="29px" *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">{{ data.projectName }}</td>
-              <td nzLeft="108px">{{ data.productionOrderNumberName }}</td>
-              <td nzLeft="217px">{{data.productId}}</td>
-              <td nzLeft="336px">{{data.product}}</td>
-              <td nzLeft="436px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
-              <td nzLeft="506px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
-              <td nzLeft="576px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
-              <td nzLeft="645px" nzAlign="center">{{data.manHoursCompletedTotal}}</td>
-              <td nzLeft="714px" nzAlign="center">{{data.achievementRate}}%</td>
-              <td nzLeft="794px" nzAlign="center">{{data.productionEfficiency}}%</td>
-              <td nzLeft="864px" nzAlign="center">{{data.startDate}}至{{data.dueDate}}</td>
-              <td nzLeft="964px" nzAlign="center">
+              <td>{{ data.costItemCode }}</td>
+              <td *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">{{ data.projectName }}</td>
+              <td>{{ data.workCenter }}</td>
+              <td>{{ data.productionOrderNumberName }}</td>
+              <td>{{data.productId}}</td>
+              <td>{{data.product}}</td>
+              <td nzAlign="center">
                 <ng-container *ngIf="data.lackOfMaterialState=='正常'">
                   {{data.lackOfMaterialState}}
                 </ng-container>
@@ -205,7 +256,16 @@
                   <span style="color: red;">{{data.lackOfMaterialState}}</span>
                 </ng-container>
               </td>
-              <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
+              <td nzAlign="center">{{data.numberOfTasksTotal}}</td>
+              <td nzAlign="center">{{data.quantityCompletedTotal}}</td>
+              <td nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+              <!-- <td  nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td> -->
+              <td nzAlign="center">{{data.standardWorkingHoursTotal}}</td>
+              <td nzAlign="center">{{data.manHoursCompletedTotal}}</td>
+              <td nzAlign="center">{{data.achievementRate}}%</td>
+              <td nzAlign="center">{{data.productionEfficiency}}%</td>
+              <td nzAlign="center">{{data.startDate}}至{{data.dueDate}}</td>
+              <!-- <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
                 <td nzAlign="center">{{dateChild.numberOfTasks}}</td>
                 <td nzAlign="center">{{dateChild.qualifiedNumber}}</td>
                 <td nzAlign="center">{{dateChild.manHoursCompleted}}</td>
@@ -219,29 +279,33 @@
                   <ng-container *ngIf="dateChild.achievementRate">{{dateChild.achievementRate}}%</ng-container>
                   <ng-container *ngIf="!dateChild.achievementRate">0%</ng-container>
                 </td>
-              </ng-container>
+              </ng-container> -->
             </ng-container>
           </tr>
           <!-- 统计 -->
           <tr style="background-color:rgb(223, 223, 219)" *ngFor="let data of columnTable.data;let i = index">
             <ng-container *ngIf="data.projectName==='统计'">
-              <td nzLeft="0px" style="background-color:rgb(223, 223, 219)"></td>
-              <td nzLeft="29px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center">
+              <td style="background-color:rgb(223, 223, 219)"></td>
+              <td style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center">
                 <!-- 剩余工时 -->标准总工时
               </td>
-              <td nzLeft="108px" style="background-color:rgb(223, 223, 219)" nzAlign="center">
+              <td style="background-color:rgb(223, 223, 219)" nzAlign="center">
                 <!-- {{data.remainingWorkTotal}} -->{{data.standardWorkingHoursTotal}}
               </td>
-              <td nzLeft="217px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center"></td>
-              <td nzLeft="336px" style="background-color:rgb(223, 223, 219);font-weight:bolder">统计</td>
-              <td nzLeft="436px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
-              <td nzLeft="506px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
-              <td nzLeft="576px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
-              <td nzLeft="645px" nzAlign="center">{{data.manHoursCompletedTotal}}</td>
-              <td nzLeft="714px" nzAlign="center"></td>
-              <td nzLeft="794px" nzAlign="center" colSpan="3"></td>
+              <td style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center"></td>
+              <td style="background-color:rgb(223, 223, 219);font-weight:bolder">统计</td>
+              <td></td>
+              <td></td>
+              <td></td>
+              <td>{{data.numberOfTasksTotal}}</td>
+              <td>{{data.quantityCompletedTotal}}</td>
+              <td nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+              <!-- <td nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td> -->
+              <td nzAlign="center">{{data.standardWorkingHoursTotal}}</td>
+              <td nzAlign="center">{{data.manHoursCompletedTotal}}</td>
+              <td nzAlign="center"  colSpan="3"></td>
               <!-- <td nzLeft="836px" nzAlign="center"></td> -->
-              <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
+              <!-- <ng-container *ngFor="let dateChild of data.fbsWorkshopDispatchListList">
                 <td nzAlign="center">{{dateChild.numberOfTasks}}</td>
                 <td nzAlign="center">{{dateChild.qualifiedNumber}}</td>
                 <td nzAlign="center">{{dateChild.manHoursCompleted}}</td>
@@ -255,7 +319,7 @@
                   <ng-container *ngIf="dateChild.achievementRate">{{dateChild.achievementRate}}%</ng-container>
                   <ng-container *ngIf="!dateChild.achievementRate">0%</ng-container>
                 </td>
-              </ng-container>
+              </ng-container> -->
             </ng-container>
           </tr>
           <tr></tr>
@@ -263,26 +327,27 @@
         <!-- 异常工时 -->
         <tbody>
           <tr>
-            <td  nzLeft="0px"></td>
-            <td  nzLeft="29px" nzAlign="center" style="font-weight:bolder">月计划达成率</td>
-            <td  nzLeft="108px" nzAlign="center">{{achievementRateTotal}}%</td>
-            <td  nzLeft="217px" nzAlign="center" style="font-weight:bolder">月生产效率</td>
-            <td  nzLeft="336px" nzAlign="center">{{productivityTotal}}%</td>
-            <td  nzLeft="436px" colSpan="8"></td>
-            <td [colSpan]="dateList.length*6" rowSpan="2"></td>
+            <td></td>
+            <td nzAlign="center" style="font-weight:bolder">月计划达成率</td>
+            <td nzAlign="center">{{achievementRateTotal}}%</td>
+            <td nzAlign="center" style="font-weight:bolder">月生产效率</td>
+            <td nzAlign="center">{{productivityTotal}}%</td>
+            <td colSpan="11"></td>
+            <!-- <td [colSpan]="dateList.length*6" rowSpan="2"></td> -->
           </tr>
           <tr>
-            <td  nzLeft="0px"></td>
-            <td  nzLeft="29px" nzAlign="center" style="font-weight:bolder">月出勤工时</td>
-            <td  nzLeft="108px" nzAlign="center">{{abnormalWorkingHours.attendanceHours}}</td>
-            <td  nzLeft="217px" nzAlign="center" style="font-weight:bolder">月加班工时</td>
-            <td  nzLeft="336px" nzAlign="center">{{abnormalWorkingHours.overtimeHours}}</td>
-            <td  nzLeft="436px" nzAlign="center" style="font-weight:bolder" colSpan="2">月其他工时</td>
-            <td  nzLeft="576px" nzAlign="center">{{abnormalWorkingHours.other}}</td>
-            <td  nzLeft="645px" nzAlign="center" style="font-weight:bolder" colSpan="2">月异常工时</td>
-            <td  nzLeft="794px" nzAlign="center">{{abnormalWorkingHours.quality}}</td>
-            <td  nzLeft="864px" nzAlign="center" style="font-weight:bolder">月仓库工时</td>
-            <td  nzLeft="964px" nzAlign="center" >{{abnormalWorkingHours.plan}}</td>
+            <td></td>
+            <td nzAlign="center" style="font-weight:bolder">月出勤工时</td>
+            <td nzAlign="center">{{abnormalWorkingHours.attendanceHours}}</td>
+            <td nzAlign="center" style="font-weight:bolder">月加班工时</td>
+            <td nzAlign="center">{{abnormalWorkingHours.overtimeHours}}</td>
+            <td nzAlign="center" style="font-weight:bolder" colSpan="2">月其他工时</td>
+            <td nzAlign="center">{{abnormalWorkingHours.other}}</td>
+            <td nzAlign="center" style="font-weight:bolder" colSpan="2">月异常工时</td>
+            <td nzAlign="center">{{abnormalWorkingHours.quality}}</td>
+            <td nzAlign="center" style="font-weight:bolder">月仓库工时</td>
+            <td nzAlign="center">{{abnormalWorkingHours.plan}}</td>
+            <td nzAlign="center" colSpan="3"></td>
           </tr>
           <!-- <tr>
             <td  nzLeft="0px"></td>
@@ -431,7 +496,7 @@
   <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
     <div nz-col nzXs="24" nzSm="4" nzLg="4">
       <nz-form-item class="nz-form-item">
-        <nz-form-label [nzSpan]="6" ><strong>日期</strong></nz-form-label>
+        <nz-form-label [nzSpan]="6"><strong>日期</strong></nz-form-label>
         <nz-form-control [nzSpan]="12">
           {{fbsWorkshopDispatchListPlanningReport.year}}
         </nz-form-control>
@@ -439,42 +504,49 @@
     </div>
     <div nz-col nzXs="24" nzSm="4" nzLg="4">
       <nz-form-item class="nz-form-item">
-        <nz-form-label [nzSpan]="6" ><strong>周末</strong></nz-form-label>
-        <nz-form-control [nzSpan]="12" >
+        <nz-form-label [nzSpan]="6"><strong>周末</strong></nz-form-label>
+        <nz-form-control [nzSpan]="12">
           <span style="background-color: yellow;border:1px solid #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
         </nz-form-control>
       </nz-form-item>
     </div>
   </div>
-    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
-    <div nz-col nzXs="24" nzSm="24" nzLg="24" >
-     
-      <nz-table  class="tableTdPadding" nzSize="small" #columnTable2 nzBordered [nzData]="planningReportList"
-      [nzScroll]="{x:columnTable2Width+'px',y:'35vw'}" [nzShowPagination]="false" [nzFrontPagination]="false">
+  <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+    <div nz-col nzXs="24" nzSm="24" nzLg="24">
+
+      <nz-table class="tableTdPadding" nzSize="small" #columnTable2 nzBordered [nzData]="planningReportList"
+        [nzScroll]="{x:columnTable2Width+'px',y:'35vw'}" [nzShowPagination]="false" [nzFrontPagination]="false">
         <thead>
           <tr>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="0px" nzAlign="center"><strong>序号</strong></th>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="40px" nzAlign="center"><strong>生产订单</strong></th>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="120px" nzAlign="center"><strong>物料编码</strong></th>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="120px" nzLeft="210px" nzAlign="center"><strong>物料名称</strong></th>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="310px" nzAlign="center"><strong>数量</strong></th>
-            <th style="background-color:rgb(223, 223, 219);" nzWidth="80px" nzLeft="350px" nzAlign="center"><strong>标准工时</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="0px" nzAlign="center">
+              <strong>序号</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="40px" nzAlign="center">
+              <strong>生产订单</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="90px" nzLeft="120px" nzAlign="center">
+              <strong>物料编码</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="120px" nzLeft="210px" nzAlign="center">
+              <strong>物料名称</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="40px" nzLeft="310px" nzAlign="center">
+              <strong>数量</strong></th>
+            <th style="background-color:rgb(223, 223, 219);" nzWidth="80px" nzLeft="350px" nzAlign="center">
+              <strong>标准工时</strong></th>
             <!-- <th style="background-color:rgb(223, 223, 219);" nzWidth="4vw"><strong>{{fbsWorkshopDispatchListPlanningReport.year}}</strong></th> -->
             <ng-container *ngFor="let day of fbsWorkshopDispatchListPlanningReport.dayList">
               <ng-container *ngIf="day.week=='2'">
-                <th style="background-color:rgb(223, 223, 219);padding: 2px;" nzWidth="25px" nzAlign="center">{{day.day}}</th>
+                <th style="background-color:rgb(223, 223, 219);padding: 2px;" nzWidth="25px" nzAlign="center">
+                  {{day.day}}</th>
               </ng-container>
               <ng-container *ngIf="day.week=='1'">
                 <th style="background-color:yellow;padding: 2px;" nzWidth="25px" nzAlign="center">{{day.day}}</th>
               </ng-container>
-              
+
             </ng-container>
 
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of columnTable2.data;let i = index">
-            <td nzLeft="0px" nzAlign="center" >{{i+1}}</td>
+            <td nzLeft="0px" nzAlign="center">{{i+1}}</td>
             <td nzLeft="40px">{{data.productionOrderNumberName}}</td>
             <td nzLeft="120px">{{data.productId}}</td>
             <td nzLeft="210px">{{data.product}}</td>
@@ -486,7 +558,7 @@
                 <td style="background-color:greenyellow;"></td>
               </ng-container>
               <ng-container *ngIf="color==='0'">
-                <td ></td>
+                <td></td>
               </ng-container>
             </ng-container>
 

+ 10 - 0
src/app/routes/dashboard/analysis/analysis.component.ts

@@ -534,4 +534,14 @@ export class DashboardAnalysisComponent implements OnInit {
       this.planningReportLoading=false;
     })
   }
+
+  //控制查询条件展开与收起
+  isShow=false;
+  getShow(){
+    if(this.isShow){
+      this.isShow=false;
+    }else{
+      this.isShow=true;
+    }
+  }
 }

+ 13 - 0
src/app/routes/efficiency-report/efficiency-report-routing.module.ts

@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+import { EfficiencyReportListComponent } from './list/list.component';
+
+const routes: Routes = [
+
+  { path: 'list', component: EfficiencyReportListComponent }];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+export class EfficiencyReportRoutingModule { }

+ 21 - 0
src/app/routes/efficiency-report/efficiency-report.module.ts

@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { SharedModule } from '@shared';
+import { EfficiencyReportRoutingModule } from './efficiency-report-routing.module';
+import { EfficiencyReportListComponent } from './list/list.component';
+
+const COMPONENTS = [
+  EfficiencyReportListComponent];
+const COMPONENTS_NOROUNT = [];
+
+@NgModule({
+  imports: [
+    SharedModule,
+    EfficiencyReportRoutingModule
+  ],
+  declarations: [
+    ...COMPONENTS,
+    ...COMPONENTS_NOROUNT
+  ],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class EfficiencyReportModule { }

+ 187 - 0
src/app/routes/efficiency-report/list/list.component.html

@@ -0,0 +1,187 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <!-- <button (click)="add()" nz-button nzType="primary">新建</button> -->
+  </ng-template>
+</page-header>
+<nz-card>
+  <form nz-form>
+    <!-- 查询条件 -->
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+
+      <!-- 派工时间 -->
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">时间</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <!-- <input [(ngModel)]="fbsWorkshopDispatchList.name" name="name" nz-input
+              placeholder="请输入" /> -->
+            <nz-date-picker name="fbsWorkshopDispatchList.start" [(ngModel)]="fbsWorkingStatistics.start"
+              nzPlaceHolder="请选择">
+            </nz-date-picker>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8" [nzNoColon]="true"></nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <!-- <input [(ngModel)]="fbsWorkshopDispatchList.name" name="name" nz-input
+              placeholder="请输入" /> -->
+            <nz-date-picker name="fbsWorkshopDispatchList.end" [(ngModel)]="fbsWorkingStatistics.end"
+              nzPlaceHolder="请选择">
+            </nz-date-picker>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <!-- 按钮 -->
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="4" [nzNoColon]="true"></nz-form-label>
+          <nz-form-control [nzSpan]="20" >
+            <!-- 查询 -->
+            <button nz-button nzType="primary" (click)="query()">查询</button>
+            &nbsp;&nbsp;
+            <a *ngIf="!isShow" (click)="getShow()">展开&nbsp;<i nz-icon nzType="down" nzTheme="outline"></i></a>
+            <a *ngIf="isShow" (click)="getShow()">收起&nbsp;<i nz-icon nzType="up" nzTheme="outline"></i></a>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+    <div *ngIf="isShow">
+    <div  nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">项目编号</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.costItemCode" name="costItemCode" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">项目名称</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.projectName" name="projectName" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">工作中心</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.workCenter" name="workCenter" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">生产订单号</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.orderNumber" name="orderNumber" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">物料编码</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.materielCode" name="materielCode" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">物料名称</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.materielName" name="materielName" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+    <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">工序</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <input [(ngModel)]="fbsWorkingStatistics.fbsTechnologicalProcessItemName" name="fbsTechnologicalProcessItemName" nz-input placeholder="请输入" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <!-- 名称 -->
+      <div nz-col nzXs="24" nzSm="4" nzLg="8">
+        <nz-form-item class="nz-form-item">
+          <nz-form-label [nzSpan]="8">姓名</nz-form-label>
+          <nz-form-control [nzSpan]="16">
+            <nz-select [(ngModel)]="fbsWorkingStatistics.personnelCode" name="personnelCode" style="width: 100%"
+              nzShowSearch nzAllowClear nzPlaceHolder="请选择">
+              <ng-container *ngFor="let proper of properList">
+                <nz-option [nzLabel]="proper.personnelName" [nzValue]="proper.personnelCode"> </nz-option>
+              </ng-container>
+            </nz-select>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </div>
+  </form>
+  <!-- 数据表 -->
+  <nz-table nzSize="small" class="buttonDistance" [nzData]="dataList" [nzLoading]="isLoading"
+    [nzFrontPagination]="false" #borderedTable [nzTotal]="page.total" [nzPageIndex]="page.current"
+    (nzPageIndexChange)="pageIndexChange($event)">
+    <thead>
+      <tr>
+        <th>项目编号</th>
+        <th>项目名称</th>
+        <th>工作中心</th>
+        <th>生产订单号</th>
+        <th>物料编码</th>
+        <th>物料名称</th>
+        <th>工艺流程</th>
+        <!-- <th nzAlign="center">工艺标准工时</th> -->
+        <th>人员编码</th>
+        <th>姓名</th>
+        <th>上岗时间</th>
+        <th>下岗时间</th>
+        <th nzAlign="center">工时</th>
+        <th nzAlign="center">效率</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr *ngFor="let item of  borderedTable.data">
+        <td>{{item.costItemCode}}</td>
+        <td>{{item.projectName}}</td>
+        <td>{{item.workCenter}}</td>
+        <td>{{item.orderNumber}}</td>
+        <td>{{item.materielCode}}</td>
+        <td>{{item.materielName}}</td>
+        <td>{{item.fbsTechnologicalProcessItemName}}</td>
+        <!-- <td nzAlign="center">{{item.standardWorkingHoursProcess}}</td> -->
+        <td>{{item.personnelCode}}</td>
+        <td>{{item.personnelName}}</td>
+        <td>{{item.firstTime}}</td>
+        <td>{{item.finalTime}}</td>
+        <td nzAlign="center">{{item.workingHours}}</td>
+        <td nzAlign="center">{{item.efficiency}}%</td>
+      </tr>
+      <tr style="font-weight:bolder">
+        <td>总计</td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <!-- <td></td> -->
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td nzAlign="center">{{totalList.workingHoursTotal}}</td>
+        <td nzAlign="center"></td>
+
+      </tr>
+    </tbody>
+  </nz-table>
+</nz-card>

+ 24 - 0
src/app/routes/efficiency-report/list/list.component.spec.ts

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

+ 146 - 0
src/app/routes/efficiency-report/list/list.component.ts

@@ -0,0 +1,146 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { _HttpClient, ModalHelper } from '@delon/theme';
+import { STColumn, STComponent } from '@delon/abc';
+import { SFSchema } from '@delon/form';
+import { FbsWorkingStatisticsService } from 'app/services/fbs/fbs-working-statistics.service';
+import { FbsPersonnelService } from 'app/services/fbs/fbs-personnel.service';
+import { DatePipe } from '@angular/common';
+import { NzNotificationService, NzModalService } from 'ng-zorro-antd';
+import { FbsWorkingStatistics } from 'app/entity/fbs/fbs-working-statistics';
+
+@Component({
+  selector: 'app-efficiency-report-list',
+  templateUrl: './list.component.html',
+})
+export class EfficiencyReportListComponent implements OnInit {
+  
+
+  constructor(
+    private fbsWorkingStatisticsService: FbsWorkingStatisticsService,
+    private fbsPersonnelService: FbsPersonnelService,
+    private datePipe: DatePipe,
+    private nzNotificationService: NzNotificationService,
+    private nzModalService: NzModalService
+  ) { }
+
+  ngOnInit() {
+    this.getList();
+    this.getProperList();
+    this.getTotalList();
+   }
+
+   dataList = []; //表格数据
+   isLoading = false; //表格加载
+   //分页参数
+   page = {
+     total: 0,
+     current: 0,
+     size: 0,
+   };
+   fbsWorkingStatistics: FbsWorkingStatistics = {}; //派工单对象
+ 
+   /**
+    * 查询按钮
+    */
+   query() {
+     this.fbsWorkingStatistics.pageNo = 1;
+     //主数据刷新
+     this.getList();
+     //计算各个合计
+     this.getTotalList();
+   }
+ 
+   // 按页码查询
+   pageIndexChange(event) {
+     this.fbsWorkingStatistics.pageNo = event;
+     //主数据刷新
+     this.getList();
+   }
+ 
+   /**
+    * 主数据查询
+    */
+   getList() {
+     this.isLoading = true;
+     //时间格式化
+     this.fbsWorkingStatistics.start = this.datePipe.transform(this.fbsWorkingStatistics.start, 'yyyy-MM-dd');
+     this.fbsWorkingStatistics.end = this.datePipe.transform(this.fbsWorkingStatistics.end, 'yyyy-MM-dd');
+     this.fbsWorkingStatisticsService.getEfficiencyReport(this.fbsWorkingStatistics).then(response => {
+       if (response.success) {
+         //查询成功
+         this.dataList = response.result.records; //表格数据
+         this.page = response.result; //分页数据
+         // this.getTotal();//查询总计//计算各个合计
+         this.getTotalList();
+         this.isLoading = false;
+       }
+     });
+   }
+ 
+   /**
+    * 计算各个总计
+    */
+   getTotalList() {
+     this.fbsWorkingStatistics.start = this.datePipe.transform(this.fbsWorkingStatistics.start, 'yyyy-MM-dd');
+     this.fbsWorkingStatistics.end = this.datePipe.transform(this.fbsWorkingStatistics.end, 'yyyy-MM-dd');
+     let fbsWorkingStatistics = JSON.parse(JSON.stringify(this.fbsWorkingStatistics));
+     fbsWorkingStatistics.pageSize = -1;
+     this.fbsWorkingStatisticsService.getEfficiencyReport(fbsWorkingStatistics).then(response => {
+       if (response.success) {
+         //查询成功
+         let dataList = response.result.records; //表格数据
+         this.getTotal(dataList); //查询总计
+         this.isLoading = false;
+       }
+     });
+   }
+ 
+   /**
+    * 初始化总计变量
+    */
+   totalList: any = {};
+   initializationTotal() {
+     this.totalList = {
+       workingHoursTotal: 0,
+       qualifiedNumberTotal: 0,
+     };
+   }
+   /**
+    * 计算工时、数量总计
+    */
+   getTotal(dataList) {
+     this.initializationTotal();
+     dataList.forEach(element => {
+       this.totalList.workingHoursTotal += Number(element.workingHours);
+       this.totalList.qualifiedNumberTotal += Number(element.qualifiedNumber);
+     });
+     this.totalList.workingHoursTotal = this.totalList.workingHoursTotal.toFixed(1);
+     this.totalList.qualifiedNumberTotal = this.totalList.qualifiedNumberTotal.toFixed(1);
+   }
+ 
+   /**
+    * 初始化人员下拉数据集合
+    */
+   properList = [];
+   getProperList() {
+     // this.fbsWorkshopDispatchListService.getPerAndDerp().then((response)=>{
+     //   this.properList=response.result
+     // })
+     this.fbsPersonnelService.list({ pageSize: 1000 }).then(response => {
+       this.properList = response.result.records;
+     });
+   }
+ 
+   //控制查询条件展开与收起
+   isShow=false;
+   getShow(){
+     if(this.isShow){
+       this.isShow=false;
+     }else{
+       this.isShow=true;
+     }
+   }
+ 
+ 
+   view() {}
+}

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

@@ -69,7 +69,9 @@ const routes: Routes = [
       //工艺流程档案
       { path: 'fbs-technological-process', loadChildren: './fbs-technological-process/fbs-technological-process.module#FbsTechnologicalProcessModule' },
       //仓库报表
-      { path: 'fbs-warehouse', loadChildren: './fbs-warehouse/fbs-warehouse.module#FbsWarehouseModule' }
+      { path: 'fbs-warehouse', loadChildren: './fbs-warehouse/fbs-warehouse.module#FbsWarehouseModule' },
+      //效率报表
+      { path:'efficiency-report',loadChildren:'./efficiency-report/efficiency-report.module#EfficiencyReportModule'}
     ],
   },
   // 全屏布局

+ 5 - 0
src/app/services/fbs/fbs-working-statistics.service.ts

@@ -16,6 +16,11 @@ export class FbsWorkingStatisticsService {
     return await this.http.get<BaseResponse<Result<FbsWorkingStatistics[]>>>('/workingStatistics/fbsWorkingStatistics/list',{params:body}).toPromise();
   }
 
+  // 效率报表
+  async getEfficiencyReport(body:any): Promise<BaseResponse<Result<FbsWorkingStatistics[]>>> {
+    return await this.http.get<BaseResponse<Result<FbsWorkingStatistics[]>>>('/workingStatistics/fbsWorkingStatistics/getEfficiencyReport',{params:body}).toPromise();
+  }
+
   //修改扫码时间
   async updateTime(body:any): Promise<BaseResponse<Result<FbsWorkingStatistics>>> {
     return await this.http.put<BaseResponse<Result<FbsWorkingStatistics>>>('/workingStatistics/fbsWorkingStatistics/updateTime',body).toPromise();