瀏覽代碼

首页 仓库报表

chenc 4 年之前
父節點
當前提交
7cf38fad42
共有 31 個文件被更改,包括 2887 次插入33 次删除
  1. 79 0
      src/app/entity/fbs/fbs-warehouse.ts
  2. 1 1
      src/app/entity/fbs/fbs-working-statistics.ts
  3. 730 0
      src/app/routes/dashboard/home-page/home-page.component.html
  4. 24 0
      src/app/routes/dashboard/home-page/home-page.component.spec.ts
  5. 490 0
      src/app/routes/dashboard/home-page/home-page.component.ts
  6. 207 0
      src/app/routes/dashboard/home-page/home-page.less
  7. 3 1
      src/app/routes/fbs-scan-code/fbs-scan-code.module.ts
  8. 5 0
      src/app/routes/fbs-scan-code/list/list.component.html
  9. 68 28
      src/app/routes/fbs-scan-code/list/list.component.ts
  10. 18 0
      src/app/routes/fbs-scan-code/update-time/update-time.component.html
  11. 24 0
      src/app/routes/fbs-scan-code/update-time/update-time.component.spec.ts
  12. 48 0
      src/app/routes/fbs-scan-code/update-time/update-time.component.ts
  13. 177 0
      src/app/routes/fbs-warehouse/add/add.component.html
  14. 24 0
      src/app/routes/fbs-warehouse/add/add.component.spec.ts
  15. 70 0
      src/app/routes/fbs-warehouse/add/add.component.ts
  16. 13 0
      src/app/routes/fbs-warehouse/fbs-warehouse-routing.module.ts
  17. 27 0
      src/app/routes/fbs-warehouse/fbs-warehouse.module.ts
  18. 90 0
      src/app/routes/fbs-warehouse/list/list.component.html
  19. 24 0
      src/app/routes/fbs-warehouse/list/list.component.spec.ts
  20. 148 0
      src/app/routes/fbs-warehouse/list/list.component.ts
  21. 203 0
      src/app/routes/fbs-warehouse/update/update.component.html
  22. 24 0
      src/app/routes/fbs-warehouse/update/update.component.spec.ts
  23. 91 0
      src/app/routes/fbs-warehouse/update/update.component.ts
  24. 149 0
      src/app/routes/fbs-warehouse/view/view.component.html
  25. 24 0
      src/app/routes/fbs-warehouse/view/view.component.spec.ts
  26. 68 0
      src/app/routes/fbs-warehouse/view/view.component.ts
  27. 1 1
      src/app/routes/fbs-workshop-dispatch-list/add/add.component.ts
  28. 5 1
      src/app/routes/routes-routing.module.ts
  29. 3 1
      src/app/routes/routes.module.ts
  30. 38 0
      src/app/services/fbs/fbs-warehouse.service.ts
  31. 11 0
      src/app/services/fbs/fbs-working-statistics.service.ts

+ 79 - 0
src/app/entity/fbs/fbs-warehouse.ts

@@ -0,0 +1,79 @@
+import { Page } from '../page';
+
+export class FbsWarehouse extends Page{
+  /**应到人数*/
+  numberOfPeopleToArrive?: number;
+  /**实到人数*/
+  actualNumberOfPeople?: number;
+  /**请假*/
+  lleave?: number;
+  /**旷工*/
+  absenteeism?: number;
+  /**离职*/
+  quit?: number;
+  /**出勤工时*/
+  attendanceHours?: number;
+  /**加班人数*/
+  overtimePeople?: number;
+  /**加班工时*/
+  overtimeHours?: number;
+  /**加班原因*/
+  overtimeReason?: string;
+  /**工单配料*/
+  workOrderBatching?: number;
+  /**工单配料-生产订单号*/
+  batchingProductionOrderNumberCode?: string;
+  /**成品收存*/
+  storageFinishedProducts?: number;
+  /**成品收存-生产订单号*/
+  productsProductionOrderNumberCode?: string;
+  /**原材料收存*/
+  storageRawMaterials?: number;
+  /**入库单号*/
+  stockInNumber?: string;
+  /**研发领用*/
+  researchAndDevelopment?: number;
+  /**研发领用-出库单号*/
+  developmentDeliveryOrderNo?: string;
+  /**项目配料*/
+  projectIngredients?: number;
+  /**项目配料-出库单号*/
+  projectDeliveryOrderNo?: string;
+  /**项目发货*/
+  projectDelivery?: number;
+  /**项目发货-项目名称*/
+  deliveryProjectName?: string;
+  /**项目打包*/
+  packProject?: number;
+  /**项目打包-项目名称*/
+  packProjectName?: string;
+  /**装车*/
+  loading?: number;
+  /**装车-项目名称*/
+  loadingProjectName?: string;
+  /**盘点*/
+  inventory?: number;
+  /**物料编号*/
+  itemNumber?: string;
+  /**培训*/
+  train?: number;
+  /**培训-备注*/
+  trainMemo?: string;
+  /**会议*/
+  meeting?: number;
+  /**会议-备注*/
+  meetingMemo?: string;
+  /**5S*/
+  fiveS?: number;
+  /**5S-备注*/
+  fiveSMemo?: string;
+  /**其他*/
+  other?: number;
+  /**其他-备注*/
+  otherMemo?: string;
+  //日期
+  date?:string;
+
+  start?:string;
+  end?:string;
+}

+ 1 - 1
src/app/entity/fbs/fbs-working-statistics.ts

@@ -56,5 +56,5 @@ export class FbsWorkingStatistics extends Page{
   
   start?:string;
   end?:string;
-
+	cutTime?:string;
 }

+ 730 - 0
src/app/routes/dashboard/home-page/home-page.component.html

@@ -0,0 +1,730 @@
+<!-- <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="60px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>序号</strong></th>
+          <th nzLeft="58px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>项目名称</strong></th>
+          <th nzLeft="157px" rowSpan="2" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>生产订单号</strong></th>
+          <th nzLeft="265px" rowSpan="2" nzWidth="120px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料编码</strong></th>
+          <th nzLeft="383px" rowSpan="2" nzWidth="200px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>物料名称</strong></th>
+          <th nzLeft="580px" rowSpan="2" nzWidth="80px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>月度计划</strong></th>
+          <th nzLeft="659px" rowSpan="2" nzWidth="100px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>标准总工时</strong></th>
+          <th nzLeft="758px" rowSpan="2" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>累计完成数量</strong></th>
+          <th nzLeft="867px" rowSpan="2" nzWidth="110px" nzAlign="center" style="background-color:rgb(223, 223, 219)"><strong>累计完成工时</strong></th>
+          <ng-container *ngFor="let date of dateList">
+            <th nzWidth="120px" nzAlign="center"><strong>当日计划数量</strong></th>
+            <th nzWidth="120px" nzAlign="center"><strong>当日完成数量</strong></th>
+            <th nzWidth="120px" nzAlign="center"><strong>当日完成工时 </strong></th>
+            <th nzWidth="120px" nzAlign="center"><strong>当日标准工时</strong></th>
+            <th nzWidth="120px" 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="58px"  *ngIf="data.mergeLines!=0" [attr.rowSpan]="data.mergeLines">{{ data.projectName }}</td>
+          <td nzLeft="157px" >{{ data.productionOrderNumberName }}</td>
+          <td nzLeft="265px">{{data.productId}}</td>
+          <td nzLeft="383px">{{data.product}}</td>
+          <td nzLeft="580px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+          <td nzLeft="659px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
+          <td nzLeft="758px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
+          <td nzLeft="867px" nzAlign="center">{{data.manHoursCompletedTotal}}</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="58px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center">
+            <!-- 剩余工时 -->
+          </td>
+          <td nzLeft="157px" style="background-color:rgb(223, 223, 219)" nzAlign="center">
+            <!-- {{data.remainingWorkTotal}} -->
+          </td>
+          <td nzLeft="265px" style="background-color:rgb(223, 223, 219);font-weight:bolder" nzAlign="center">统计</td>
+          <td  nzLeft="383px"></td>
+          <td nzLeft="580px" nzAlign="center">{{data.surplusNumberOfTasksTotal}}</td>
+          <td nzLeft="659px" nzAlign="center">{{data.surplusStandardWorkingHoursTotal}}</td>
+          <td nzLeft="758px" nzAlign="center">{{data.quantityCompletedTotal}}</td>
+          <td nzLeft="867px" nzAlign="center">{{data.manHoursCompletedTotal}}</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" colspan="5" rowSpan="8"></td> -->
+          <td rowSpan="2" nzLeft="0px"></td>
+          <td rowSpan="2" nzLeft="58px" nzAlign="center" style="font-weight:bolder">总达成率</td>
+          <td rowSpan="2" nzLeft="157px" nzAlign="center">{{achievementRateTotal}}%</td>
+          <td rowSpan="2" nzLeft="265px" nzAlign="center" style="font-weight:bolder">总生产效率</td>
+          <td rowSpan="2" nzLeft="383px" nzAlign="center">{{productivityTotal}}%</td>
+          <!-- <td>月计划达成率</td>
+          <td>1.95%</td>
+          <td>月生产效率</td>
+          <td>根据生产计划进度。实时变化</td> -->
+          <td nzLeft="580px" class="bolder">出勤总工时</td>
+          <td nzLeft="659px" nzAlign="center">{{AbnormalWorkingHoursTotal.attendanceHours}}</td>
+          <td  nzLeft="758px" colSpan="2" 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 ></td>
+          <td ></td>
+          <td ></td>
+          <td ></td>
+          <td ></td> -->
+          <td nzLeft="580px" class="bolder">加班总工时</td>
+          <td nzLeft="659px" nzAlign="center">{{AbnormalWorkingHoursTotal.overtimeHours}}</td>
+          <td nzLeft="758px" colSpan="2" 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 rowSpan="2"></td>
+          <td rowSpan="2"></td>
+          <td rowSpan="2"></td>
+          <td rowSpan="2"></td>
+          <td rowSpan="2"></td> -->
+          <!-- <td nzLeft="0px" rowSpan="2"></td>
+          <td nzLeft="58px" rowSpan="2"></td>
+          <td nzLeft="157px" rowSpan="2"></td>
+          <td nzLeft="265px" rowSpan="2"></td>
+          <td nzLeft="383px" rowSpan="2"></td> -->
+          <td nzLeft="0px" colspan="5" rowSpan="8"></td>
+          <td nzLeft="580px" rowSpan="2" class="bolder">其他总工时</td>
+          <td nzLeft="659px" rowSpan="2" nzAlign="center">{{AbnormalWorkingHoursTotal.train}}</td>
+          <td nzLeft="758px" colSpan="2" 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 rowSpan="3"></td>
+          <td rowSpan="3"></td>
+          <td rowSpan="3"></td>
+          <td rowSpan="3"></td>
+          <td rowSpan="3"></td> -->
+          <!-- <td nzLeft="0px" rowSpan="3"></td>
+          <td nzLeft="58px" rowSpan="3"></td>
+          <td nzLeft="157px" rowSpan="3"></td>
+          <td nzLeft="265px" rowSpan="3"></td>
+          <td nzLeft="383px" rowSpan="3"></td> -->
+          <td nzLeft="580px" rowSpan="3" class="bolder">异常总工时统计</td>
+          <td nzLeft="659px" rowSpan="3" nzAlign="center">{{AbnormalWorkingHoursTotal.abnormalWorkingHours}}</td>
+          <td nzLeft="758px" colSpan="2" 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="580px" rowSpan="2" class="bolder">仓库总工时统计</td>
+          <td nzLeft="659px" rowSpan="2" nzAlign="center">{{AbnormalWorkingHoursTotal.warehouse}}</td>
+          <td nzLeft="758px" colSpan="2" 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 ></td>
+          <td ></td>
+          <td ></td>
+          <td ></td>
+          <td ></td> -->
+          <td nzLeft="580px" colSpan="4" 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>
+<!-- <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> -->

+ 24 - 0
src/app/routes/dashboard/home-page/home-page.component.spec.ts

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

+ 490 - 0
src/app/routes/dashboard/home-page/home-page.component.ts

@@ -0,0 +1,490 @@
+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';
+@Component({
+  selector: 'app-dashboard-analysis',
+  templateUrl: './home-page.component.html',
+  styleUrls: ['./home-page.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 RoutesDashboardHomePageComponent 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();
+    
+  }
+
+  /**
+   * @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)
+      }
+    });
+  }
+
+  /**
+   * 获取时间列集合数据
+   */
+  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;
+    }
+  }
+
+  /**
+   * 异常工时统计
+   */
+  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=[];
+      row.push(element.projectName)
+      row.push(element.productionOrderNumberName)
+      row.push(element.productId)
+      row.push(element.product)
+      row.push(convertingNumbers(element.numberOfTasksTotal))
+      row.push(convertingNumbers(element.standardWorkingHoursTotal))
+      row.push(element.quantityCompletedTotal)//quantityCompletedTotal//latestCompletedQuantity
+      row.push(convertingNumbers(element.manHoursCompletedTotal))
+      data.push(row);
+    });
+    let efficiencyTotal=[
+      ['总达成率'],
+      [this.achievementRateTotal+'%'],
+      ['总生产效率'],
+      [this.productivityTotal+'%'],
+      ['出勤总工时'],
+      [this.AbnormalWorkingHoursTotal.attendanceHours],
+      ['加班总工时'],
+      [this.AbnormalWorkingHoursTotal.overtimeHours],
+      ['其他总工时'],
+      [this.AbnormalWorkingHoursTotal.train],
+      ['异常总工时统计'],
+      [this.AbnormalWorkingHoursTotal.abnormalWorkingHours],
+      ['仓库总工时统计'],
+      [this.AbnormalWorkingHoursTotal.warehouse]
+    ];
+    data.push(efficiencyTotal);
+    // 导出
+    this.xlsx.export({
+      sheets: [
+        {
+          data: data,
+          name: '生产订单汇总导出',
+        },
+      ],
+      filename: '生产订单汇总导出.xlsx',
+    });
+    // this.exportLoading=false;
+    // })
+  }
+  
+}
+
+

+ 207 - 0
src/app/routes/dashboard/home-page/home-page.less

@@ -0,0 +1,207 @@
+@import '~@delon/theme/styles/default';
+:host ::ng-deep {
+  .icon-group {
+    i {
+      transition: color 0.32s;
+      color: @text-color-secondary;
+      cursor: pointer;
+      margin-left: 16px;
+      &:hover {
+        color: @text-color;
+      }
+    }
+  }
+  .rank-list {
+    margin: 25px 0 0;
+    padding: 0;
+    list-style: none;
+    li {
+      .clearfix();
+      margin-top: 16px;
+      display: flex;
+      align-items: center;
+      span {
+        color: @text-color;
+        font-size: 14px;
+        line-height: 22px;
+      }
+      .number {
+        background-color: @background-color-base;
+        border-radius: 20px;
+        display: inline-block;
+        font-size: 12px;
+        font-weight: 600;
+        margin-right: 16px;
+        height: 20px;
+        line-height: 20px;
+        width: 20px;
+        text-align: center;
+        margin-top: 1.5px;
+        &.active {
+          background-color: #314659;
+          color: #fff;
+        }
+      }
+      .title {
+        flex: 1;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        margin-right: 8px;
+      }
+    }
+  }
+  .sales-extra {
+    display: inline-block;
+    margin-right: 24px;
+    a {
+      color: @text-color;
+      margin-left: 24px;
+      &:hover {
+        color: @primary-color;
+      }
+      &.currentDate {
+        color: @primary-color;
+      }
+    }
+  }
+  .sales-card {
+    .bar {
+      padding: 0 0 32px 32px;
+    }
+    .rank {
+      padding: 0 32px 32px 72px;
+    }
+    .ant-tabs-bar {
+      padding-left: 16px;
+      .ant-tabs-nav .ant-tabs-tab {
+        padding-top: 16px;
+        padding-bottom: 14px;
+        line-height: 24px;
+      }
+    }
+    .ant-tabs-extra-content {
+      padding-right: 24px;
+      line-height: 55px;
+    }
+    .ant-card-head {
+      position: relative;
+    }
+    .ant-card-head-title {
+      align-items: normal;
+    }
+  }
+  .sales-card-extra {
+    height: inherit;
+  }
+  .sales-type-radio {
+    position: absolute;
+    right: 54px;
+    bottom: 12px;
+  }
+  .offline-card {
+    .ant-tabs-ink-bar {
+      bottom: auto;
+    }
+    .ant-tabs-bar {
+      border-bottom: none;
+    }
+    .ant-tabs-nav-container-scrolling {
+      padding-left: 40px;
+      padding-right: 40px;
+    }
+    .ant-tabs-tab-prev-icon:before {
+      position: relative;
+      left: 6px;
+    }
+    .ant-tabs-tab-next-icon:before {
+      position: relative;
+      right: 6px;
+    }
+    .ant-tabs-tab-active h4 {
+      color: @primary-color;
+    }
+  }
+  .trend-text {
+    margin-left: 8px;
+    color: @heading-color;
+  }
+
+  @media screen and (max-width: @screen-lg) {
+    .sales-extra {
+      display: none;
+    }
+    .rank-list {
+      li {
+        span:first-child {
+          margin-right: 8px;
+        }
+      }
+    }
+  }
+
+  @media screen and (max-width: @screen-md) {
+    .rank-title {
+      margin-top: 16px;
+    }
+    .sales-card .bar {
+      padding: 16px;
+    }
+  }
+
+  @media screen and (max-width: @screen-sm) {
+    .sales-extra-wrap {
+      display: none;
+    }
+    .sales-card {
+      .ant-tabs-content {
+        padding-top: 30px;
+      }
+    }
+  }
+
+  // fix pagination bottom
+  .ant-table-pagination {
+    margin-bottom: 0;
+  }
+
+  .g2-pie__legend-block .g2-pie__chart {
+    margin: 0;
+  }
+}
+
+
+.block_normal {
+  padding: 5px 0;
+  text-align: center;
+  vertical-align: middle;
+  border-radius: 0;
+  line-height: 20px;
+  margin-top: 15px;
+  margin-bottom: 15px;
+  background-color: #4473c5;
+  font-size:16px;
+  font-weight:bolder;
+  color:#fff;
+}
+
+.block_danger {
+  padding: 5px 0;
+  text-align: center;
+  vertical-align: middle;
+  border-radius: 0;
+  line-height: 20px;
+  margin-top: 15px;
+  margin-bottom: 15px;
+  background-color: #ed7d31;
+  font-size:16px;
+  font-weight:bolder;
+  color:#fff;
+}
+
+.work_done{
+  background-color:#68da68;
+}
+.work_doing{
+  background-color:#6bb8fc;
+}

+ 3 - 1
src/app/routes/fbs-scan-code/fbs-scan-code.module.ts

@@ -2,10 +2,12 @@ import { NgModule } from '@angular/core';
 import { SharedModule } from '@shared';
 import { FbsScanCodeRoutingModule } from './fbs-scan-code-routing.module';
 import { FbsScanCodeListComponent } from './list/list.component';
+import { FbsScanCodeUpdateTimeComponent } from './update-time/update-time.component';
 
 const COMPONENTS = [
   FbsScanCodeListComponent];
-const COMPONENTS_NOROUNT = [];
+const COMPONENTS_NOROUNT = [
+  FbsScanCodeUpdateTimeComponent];
 
 @NgModule({
   imports: [

+ 5 - 0
src/app/routes/fbs-scan-code/list/list.component.html

@@ -88,6 +88,7 @@
         <th>扫码信息</th>
         <th nzAlign="center">工时</th>
         <th nzAlign="center">完成数量</th>
+        <th>操作</th>
       </tr>
     </thead>
     <tbody>
@@ -102,6 +103,9 @@
         <td>{{item.finalInfo}}</td>
         <td nzAlign="center">{{item.workingHours}}</td>
         <td nzAlign="center">{{item.qualifiedNumber}}</td>
+        <td>
+          <a (click)="update(item)">修改时间</a>
+        </td>
       </tr>
       <tr style="font-weight:bolder">
         <td>总计</td>
@@ -114,6 +118,7 @@
         <td></td>
         <td nzAlign="center">{{totalList.workingHoursTotal}}</td>
         <td nzAlign="center">{{totalList.qualifiedNumberTotal}}</td>
+        
       </tr>
     </tbody>
   </nz-table>

+ 68 - 28
src/app/routes/fbs-scan-code/list/list.component.ts

@@ -6,26 +6,27 @@ import { FbsWorkingStatistics } from 'app/entity/fbs/fbs-working-statistics';
 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 { FbsScanCodeUpdateTimeComponent } from '../update-time/update-time.component';
 
 @Component({
   selector: 'app-fbs-scan-code-list',
   templateUrl: './list.component.html',
 })
 export class FbsScanCodeListComponent implements OnInit {
-  
-
   constructor(
-    private fbsWorkingStatisticsService:FbsWorkingStatisticsService,
-    private fbsPersonnelService:FbsPersonnelService,
-    private datePipe:DatePipe
-  ) { }
+    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; //表格加载
@@ -70,7 +71,6 @@ export class FbsScanCodeListComponent implements OnInit {
         this.page = response.result; //分页数据
         // this.getTotal();//查询总计
         this.isLoading = false;
-
       }
     });
   }
@@ -78,18 +78,17 @@ export class FbsScanCodeListComponent implements OnInit {
   /**
    * 计算各个总计
    */
-  getTotalList(){
+  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=10000;
+    let fbsWorkingStatistics = JSON.parse(JSON.stringify(this.fbsWorkingStatistics));
+    fbsWorkingStatistics.pageSize = 10000;
     this.fbsWorkingStatisticsService.list(fbsWorkingStatistics).then(response => {
       if (response.success) {
         //查询成功
         let dataList = response.result.records; //表格数据
-        this.getTotal(dataList);//查询总计
+        this.getTotal(dataList); //查询总计
         this.isLoading = false;
-
       }
     });
   }
@@ -97,27 +96,27 @@ export class FbsScanCodeListComponent implements OnInit {
   /**
    * 初始化总计变量
    */
-  totalList:any={};
-  initializationTotal(){
-    this.totalList={
-      workingHoursTotal:0,
-      qualifiedNumberTotal:0
-    }
+  totalList: any = {};
+  initializationTotal() {
+    this.totalList = {
+      workingHoursTotal: 0,
+      qualifiedNumberTotal: 0,
+    };
   }
   /**
    * 计算工时、数量总计
    */
-  getTotal(dataList){
+  getTotal(dataList) {
     this.initializationTotal();
     dataList.forEach(element => {
-      this.totalList.workingHoursTotal+=Number(element.workingHours);
-      this.totalList.qualifiedNumberTotal+=Number(element.qualifiedNumber);
+      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);
+    this.totalList.workingHoursTotal = this.totalList.workingHoursTotal.toFixed(1);
+    this.totalList.qualifiedNumberTotal = this.totalList.qualifiedNumberTotal.toFixed(1);
   }
 
-   /**
+  /**
    * 初始化人员下拉数据集合
    */
   properList = [];
@@ -130,8 +129,49 @@ export class FbsScanCodeListComponent implements OnInit {
     });
   }
 
-  view(){
-
+  update(item) {
+    const modal = this.nzModalService.create({
+      nzTitle: '修改',
+      nzWidth: '50%',
+      nzContent: FbsScanCodeUpdateTimeComponent,
+      nzComponentParams: {
+        id: item.id,
+      },
+      nzFooter: [
+        {
+          //取消
+          label: '取消',
+          type: 'default',
+          onClick: model => {
+            model.close();
+          },
+        },
+        {
+          label: '保存',
+          type: 'primary',
+          onClick: model => {
+            // model.save().then(()=>{
+            //   this.getList()
+            // })
+            model.save().then(() => {
+              this.fbsWorkingStatisticsService.updateTime(model.fbsWorkingStatistics).then(response => {
+                if (response.success) {
+                  this.nzNotificationService.success('修改成功', '');
+                  //刷新list列表
+                  model.close();
+                  this.getList();
+                  this.isLoading = false;
+                } else {
+                  this.nzNotificationService.error('修改失败', response.message);
+                  this.isLoading = false;
+                }
+              });
+            });
+          },
+        },
+      ],
+    });
   }
 
+  view() {}
 }

+ 18 - 0
src/app/routes/fbs-scan-code/update-time/update-time.component.html

@@ -0,0 +1,18 @@
+<nz-spin [nzSpinning]="saveLoading">
+  <form nz-form>
+    <nz-form-item>
+      <nz-form-label [nzSpan]="6" >上岗时间</nz-form-label>
+      <nz-form-control [nzSpan]="16">
+        <nz-date-picker nzFormat="yyyy-MM-dd HH:mm:ss" name="firstTime" [(ngModel)]="fbsWorkingStatistics.firstTime" nzPlaceHolder="请选择" [nzShowTime]="{ nzDefaultOpenValue: timeDefaultValue }">
+        </nz-date-picker>
+      </nz-form-control>
+    </nz-form-item>
+    <nz-form-item>
+      <nz-form-label [nzSpan]="6" >下岗时间</nz-form-label>
+      <nz-form-control [nzSpan]="16">
+        <nz-date-picker nzFormat="yyyy-MM-dd HH:mm:ss" name="finalTime" [(ngModel)]="fbsWorkingStatistics.finalTime" nzPlaceHolder="请选择" [nzShowTime]="{ nzDefaultOpenValue: timeDefaultValue }">
+        </nz-date-picker>
+      </nz-form-control>
+    </nz-form-item>
+    </form>
+  </nz-spin>

+ 24 - 0
src/app/routes/fbs-scan-code/update-time/update-time.component.spec.ts

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

+ 48 - 0
src/app/routes/fbs-scan-code/update-time/update-time.component.ts

@@ -0,0 +1,48 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { FbsWorkingStatistics } from 'app/entity/fbs/fbs-working-statistics';
+import { FbsWorkingStatisticsService } from 'app/services/fbs/fbs-working-statistics.service';
+import { setHours } from 'date-fns';
+import { DatePipe } from '@angular/common';
+
+@Component({
+  selector: 'app-fbs-scan-code-update-time',
+  templateUrl: './update-time.component.html',
+})
+export class FbsScanCodeUpdateTimeComponent implements OnInit {
+  constructor(
+    private modal: NzModalRef,
+    private fbsWorkingStatisticsService: FbsWorkingStatisticsService,
+    private datePipe: DatePipe,
+  ) {}
+
+  ngOnInit(): void {
+    this.fbsWorkingStatisticsService.getById(this.id).then(response => {
+      this.fbsWorkingStatistics = response.result;
+    });
+  }
+  //时间格式可选择时分秒
+  timeDefaultValue = setHours(new Date(), 0);
+  saveLoading = false;
+  id = '';
+  fbsWorkingStatistics: FbsWorkingStatistics = {}; //派工单对象
+
+  save() {
+    return new Promise(resolve => {
+      this.fbsWorkingStatistics.firstTime = this.datePipe.transform(
+        this.fbsWorkingStatistics.firstTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      this.fbsWorkingStatistics.finalTime = this.datePipe.transform(
+        this.fbsWorkingStatistics.finalTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      resolve();
+    });
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

+ 177 - 0
src/app/routes/fbs-warehouse/add/add.component.html

@@ -0,0 +1,177 @@
+<nz-spin [nzSpinning]="saveLoading">
+  <!-- 主数据 -->
+  <nz-table nzSize="small" [nzNoResult]="' '" nzBordered #basicTable [nzShowPagination]="false"
+    style="margin-bottom: 5px;">
+    <thead>
+      <tr>
+        <!-- 异常工时信息统计单 -->
+        <th colspan="13">
+          <h2><strong>仓库报表</strong></h2>
+        </th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>时间</td>
+        <td colSpan="12">
+          <nz-date-picker [(ngModel)]="fbsWarehouse.date" nzPlaceHolder="请选择">
+          </nz-date-picker>
+        </td>
+      </tr>
+      <tr>
+        <td>出勤工时</td>
+        <td>应到人数</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.numberOfPeopleToArrive" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>实到人数</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.actualNumberOfPeople" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>请假</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.lleave" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>旷工</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.absenteeism" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>离职</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.quit" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>出勤工时</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.attendanceHours" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+      </tr>
+      <tr>
+        <td>加班记录</td>
+        <td>加班人数</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.overtimePeople" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>加班工时</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.overtimeHours" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>加班原因</td>
+        <td colSpan="7">
+          <textarea rows="2" nz-input [(ngModel)]="fbsWarehouse.overtimeReason"></textarea>
+        </td>
+      </tr>
+      <tr>
+        <td rowspan="9">工时统计</td>
+        <td>工单配料</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.workOrderBatching" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>生产订单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.batchingProductionOrderNumberCode"/></td>
+      </tr>
+      <tr>
+        <td>成品收存</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.storageFinishedProducts" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>生产订单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.productsProductionOrderNumberCode"/></td>
+      </tr>
+      <tr>
+        <td>原材料收存</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.storageRawMaterials" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>入库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.stockInNumber"/></td>
+      </tr>
+      <tr>
+        <td>研发领用</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.researchAndDevelopment" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>出库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.developmentDeliveryOrderNo"/></td>
+      </tr>
+      <tr>
+        <td>项目配料</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.projectIngredients" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>出库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.projectDeliveryOrderNo"/></td>
+      </tr>
+      <tr>
+        <td>项目发货</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.projectDelivery" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.deliveryProjectName"/></td>
+      </tr>
+      <tr>
+        <td>项目打包</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.packProject" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.packProjectName"/></td>
+      </tr>
+      <tr>
+        <td>装车</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.loading" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.loadingProjectName"/></td>
+      </tr>
+      <tr>
+        <td>盘点</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.inventory" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>物料编号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.itemNumber"/></td>
+      </tr>
+      <tr>
+        <td rowspan="4">其他工时统计</td>
+        <td>培训</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.train" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.trainMemo"/></td>
+      </tr>
+      <tr>
+        <td>会议</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.meeting" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.meetingMemo"/></td>
+      </tr>
+      <tr>
+        <td>5S</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.fiveS" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.fiveSMemo"/></td>
+      </tr>
+      <tr>
+        <td>其他</td>
+        <td><nz-input-number [(ngModel)]="fbsWarehouse.other" [nzMin]="0" [nzStep]="1">
+        </nz-input-number></td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.otherMemo"/></td>
+      </tr>
+    </tbody>
+  </nz-table>
+</nz-spin>
+
+<!-- 底部按钮 -->
+<div class="base">
+  <!-- 底部关闭按钮 -->
+  <a nz-popconfirm style="margin-right: 2%" nzTitle="确认关闭吗(关闭前请确认数据已保存)" (nzOnConfirm)="close()">
+    <button nz-button class="ant-btn buttonDistance"><span>关闭
+      </span></button>
+  </a>
+  <!-- 底部保存按钮 -->
+  <button nzbutton (click)="save()" nz-button nzType="primary" [nzLoading]="saveLoading"><span>保存</span></button>
+</div>

+ 24 - 0
src/app/routes/fbs-warehouse/add/add.component.spec.ts

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

+ 70 - 0
src/app/routes/fbs-warehouse/add/add.component.ts

@@ -0,0 +1,70 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { FbsWarehouse } from 'app/entity/fbs/fbs-warehouse';
+import { FbsWarehouseService } from 'app/services/fbs/fbs-warehouse.service';
+import { DatePipe } from '@angular/common';
+
+@Component({
+  selector: 'app-fbs-warehouse-add',
+  templateUrl: './add.component.html',
+  styles: [
+    `
+    .base{
+      position: absolute;
+      bottom: 0px;
+      width: 100%;
+      border-top: 1px solid rgb(232, 232, 232);
+      padding: 10px 16px;
+      text-align: right;
+      left: 0px;
+      background: #fff;
+      z-index:99;
+    }
+
+    `
+  ]
+})
+export class FbsWarehouseAddComponent implements OnInit {
+
+  constructor(
+    private fbsWarehouseService:FbsWarehouseService,
+    private datePipe:DatePipe,
+    private nzNotificationService:NzNotificationService,
+    private drawerRef:NzDrawerRef
+  ) { }
+
+  ngOnInit(): void {
+  }
+
+  saveLoading=false;
+  fbsWarehouse: FbsWarehouse = {
+    date:new Date().toString()
+  };
+
+
+
+  /**
+   * 保存按钮
+   */
+  save(){
+    this.saveLoading=true;
+    //时间格式化
+    this.fbsWarehouse.date=this.datePipe.transform(this.fbsWarehouse.date, 'yyyy-MM-dd HH:mm:ss');
+    this.fbsWarehouseService.add(this.fbsWarehouse).then((response)=>{
+      if(response.success){//保存成功
+        this.nzNotificationService.success("保存成功","");
+        this.saveLoading=false;//加载效果关闭
+        this.drawerRef.close(true);//关闭抽屉 启动主页面的回调
+      }else{//保存失败
+        this.nzNotificationService.error("保存失败",response.message);
+        this.saveLoading=false;//加载效果关闭
+      }
+    })
+  }
+
+  close() {
+    //抽屉关闭
+    this.drawerRef.close();
+  }
+}

+ 13 - 0
src/app/routes/fbs-warehouse/fbs-warehouse-routing.module.ts

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

+ 27 - 0
src/app/routes/fbs-warehouse/fbs-warehouse.module.ts

@@ -0,0 +1,27 @@
+import { NgModule } from '@angular/core';
+import { SharedModule } from '@shared';
+import { FbsWarehouseRoutingModule } from './fbs-warehouse-routing.module';
+import { FbsWarehouseListComponent } from './list/list.component';
+import { FbsWarehouseAddComponent } from './add/add.component';
+import { FbsWarehouseUpdateComponent } from './update/update.component';
+import { FbsWarehouseViewComponent } from './view/view.component';
+
+const COMPONENTS = [
+  FbsWarehouseListComponent];
+const COMPONENTS_NOROUNT = [
+  FbsWarehouseAddComponent,
+  FbsWarehouseUpdateComponent,
+  FbsWarehouseViewComponent];
+
+@NgModule({
+  imports: [
+    SharedModule,
+    FbsWarehouseRoutingModule
+  ],
+  declarations: [
+    ...COMPONENTS,
+    ...COMPONENTS_NOROUNT
+  ],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class FbsWarehouseModule { }

+ 90 - 0
src/app/routes/fbs-warehouse/list/list.component.html

@@ -0,0 +1,90 @@
+<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="start" [(ngModel)]="fbsWarehouse.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="end" [(ngModel)]="fbsWarehouse.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]="2" [nzNoColon]="true"></nz-form-label>
+          <nz-form-control [nzSpan]="22" style="text-align: right;">
+            <!-- 查询 -->
+            <button nz-button nzType="primary" (click)="query()">查询</button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+  <div nz-row [nzGutter]="{xs:12,sm:15,md:29,lg: 36, xl: 40}">
+    <div nz-col nzXs="24" nzSm="4" nzLg="24">
+      <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>加班人数</th>
+            <th>操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let item of  borderedTable.data">
+            <td>{{item.date}}</td>
+            <td>{{item.numberOfPeopleToArrive}}</td>
+            <td>{{item.actualNumberOfPeople}}</td>
+            <td>{{item.lleave}}</td>
+            <td>{{item.absenteeism}}</td>
+            <td>{{item.quit}}</td>
+            <td>{{item.attendanceHours}}</td>
+            <td>{{item.overtimePeople}}</td>
+            <td>
+              <!-- 详情 -->
+              <a (click)="view(item)">详情</a>
+              <!-- 修改 -->
+              <span>&nbsp;|&nbsp;</span>
+              <a (click)="update(item)">修改</a>
+              <!-- 删除 -->
+              <span>&nbsp;|&nbsp;</span>
+              <a nz-popconfirm nzTitle="是否删除" nzOkText="是" nzCancelText="否"
+                (nzOnConfirm)="delete(item)">删除</a>
+    
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/fbs-warehouse/list/list.component.spec.ts

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

+ 148 - 0
src/app/routes/fbs-warehouse/list/list.component.ts

@@ -0,0 +1,148 @@
+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 { FbsWarehouse } from 'app/entity/fbs/fbs-warehouse';
+import { DatePipe } from '@angular/common';
+import { FbsWarehouseService } from 'app/services/fbs/fbs-warehouse.service';
+import { NzDrawerService, NzNotificationService } from 'ng-zorro-antd';
+import { FbsWarehouseAddComponent } from '../add/add.component';
+import { FbsWarehouseUpdateComponent } from '../update/update.component';
+import { FbsWarehouseViewComponent } from '../view/view.component';
+
+@Component({
+  selector: 'app-fbs-warehouse-list',
+  templateUrl: './list.component.html',
+})
+export class FbsWarehouseListComponent implements OnInit {
+ 
+  constructor(
+    private datePipe:DatePipe,
+    private fbsWarehouseService:FbsWarehouseService,
+    private nzDrawerService:NzDrawerService,
+    private nzNotificationService:NzNotificationService
+  ) { }
+
+  ngOnInit() { 
+    this.getList();
+  }
+
+  dataList = []; //表格数据
+  isLoading = false; //表格加载
+  page = {
+    total: 0,
+    current: 0,
+    size: 0,
+  };
+
+  fbsWarehouse: FbsWarehouse = {};
+  // 按页码查询
+  pageIndexChange(event) {
+    this.fbsWarehouse.pageNo = event;
+    //主数据刷新
+    this.getList();
+  }
+
+  /**
+   * 主数据查询
+   */
+  getList(){
+    this.isLoading=true;
+    //时间格式化
+    this.fbsWarehouse.start = this.datePipe.transform(this.fbsWarehouse.start, 'yyyy-MM-dd');
+    this.fbsWarehouse.end = this.datePipe.transform(this.fbsWarehouse.end, 'yyyy-MM-dd');
+    this.fbsWarehouseService.list(this.fbsWarehouse).then((response)=>{
+      if(response.success){//查询成功
+        this.dataList=response.result.records;//表格数据
+        this.page=response.result;//分页数据
+        // this.getTotal();//统计合计
+        this.isLoading=false;
+      }
+    })
+  }
+
+
+  /**
+   * 查询按钮
+   */
+  query(){
+    this.fbsWarehouse.pageNo=1;
+    //主数据刷新
+    this.getList();
+  }
+
+  add() {
+    //打开新增抽屉
+    const drawerRef = this.nzDrawerService.create<FbsWarehouseAddComponent>({
+      nzTitle: '新增',
+      nzContent: FbsWarehouseAddComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {},
+    });
+
+    //关闭抽屉的回调
+    drawerRef.afterClose.subscribe(isRefresh => {
+      if (isRefresh) {
+        //刷新list列表
+        this.getList();
+      }
+    });
+  }
+
+  update(item) {
+    //打开修改抽屉
+    const drawerRef = this.nzDrawerService.create<FbsWarehouseUpdateComponent>({
+      nzTitle: '修改',
+      nzContent: FbsWarehouseUpdateComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {
+        id:item.id
+      },
+    });
+
+    //关闭抽屉的回调
+    drawerRef.afterClose.subscribe(isRefresh => {
+      if (isRefresh) {
+        //刷新list列表
+        this.getList();
+      }
+    });
+  }
+
+
+  /**
+   * 详情按钮
+   */
+  view(item) {
+    //打开详情抽屉
+    const drawerRef = this.nzDrawerService.create<FbsWarehouseViewComponent>({
+      nzTitle: '详情生产异常信息统计单',
+      nzContent: FbsWarehouseViewComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {
+        id:item.id
+      },
+    });
+  }
+
+  /**
+   * 删除按钮
+   */
+  delete(item) {
+    this.isLoading=true;
+    this.fbsWarehouseService.deleteD(item.id).then((response)=>{
+      if(response.success){
+        this.nzNotificationService.success("删除成功","");
+        //刷新list列表
+        this.getList();
+        this.isLoading=false;
+      }else{
+        this.nzNotificationService.success("删除失败",response.message);
+        this.isLoading=false;
+      }
+    })
+  }
+}

+ 203 - 0
src/app/routes/fbs-warehouse/update/update.component.html

@@ -0,0 +1,203 @@
+<nz-spin [nzSpinning]="saveLoading">
+  <!-- 主数据 -->
+  <nz-table nzSize="small" [nzNoResult]="' '" nzBordered #basicTable [nzShowPagination]="false"
+    style="margin-bottom: 5px;">
+    <thead>
+      <tr>
+        <!-- 异常工时信息统计单 -->
+        <th colspan="13">
+          <h2><strong>仓库报表</strong></h2>
+        </th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>时间</td>
+        <td colSpan="12">
+          <nz-date-picker [(ngModel)]="fbsWarehouse.date" nzPlaceHolder="请选择">
+          </nz-date-picker>
+        </td>
+      </tr>
+      <tr>
+        <td>出勤工时</td>
+        <td>应到人数</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.numberOfPeopleToArrive" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>实到人数</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.actualNumberOfPeople" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>请假</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.lleave" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>旷工</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.absenteeism" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>离职</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.quit" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>出勤工时</td>
+        <td style="width: 8%;">
+          <nz-input-number [(ngModel)]="fbsWarehouse.attendanceHours" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+      </tr>
+      <tr>
+        <td>加班记录</td>
+        <td>加班人数</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.overtimePeople" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>加班工时</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.overtimeHours" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>加班原因</td>
+        <td colSpan="7">
+          <textarea rows="2" nz-input [(ngModel)]="fbsWarehouse.overtimeReason"></textarea>
+        </td>
+      </tr>
+      <tr>
+        <td rowspan="9">工时统计</td>
+        <td>工单配料</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.workOrderBatching" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>生产订单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.batchingProductionOrderNumberCode" /></td>
+      </tr>
+      <tr>
+        <td>成品收存</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.storageFinishedProducts" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>生产订单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.productsProductionOrderNumberCode" /></td>
+      </tr>
+      <tr>
+        <td>原材料收存</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.storageRawMaterials" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>入库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.stockInNumber" /></td>
+      </tr>
+      <tr>
+        <td>研发领用</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.researchAndDevelopment" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>出库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.developmentDeliveryOrderNo" /></td>
+      </tr>
+      <tr>
+        <td>项目配料</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.projectIngredients" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>出库单号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.projectDeliveryOrderNo" /></td>
+      </tr>
+      <tr>
+        <td>项目发货</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.projectDelivery" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.deliveryProjectName" /></td>
+      </tr>
+      <tr>
+        <td>项目打包</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.packProject" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.packProjectName" /></td>
+      </tr>
+      <tr>
+        <td>装车</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.loading" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>项目名称</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.loadingProjectName" /></td>
+      </tr>
+      <tr>
+        <td>盘点</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.inventory" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>物料编号</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.itemNumber" /></td>
+      </tr>
+      <tr>
+        <td rowspan="4">其他工时统计</td>
+        <td>培训</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.train" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.trainMemo" /></td>
+      </tr>
+      <tr>
+        <td>会议</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.meeting" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.meetingMemo" /></td>
+      </tr>
+      <tr>
+        <td>5S</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.fiveS" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.fiveSMemo" /></td>
+      </tr>
+      <tr>
+        <td>其他</td>
+        <td>
+          <nz-input-number [(ngModel)]="fbsWarehouse.other" [nzMin]="0" [nzStep]="1">
+          </nz-input-number>
+        </td>
+        <td>备注</td>
+        <td colSpan="9"><input nz-input [(ngModel)]="fbsWarehouse.otherMemo" /></td>
+      </tr>
+    </tbody>
+  </nz-table>
+</nz-spin>
+
+<!-- 底部按钮 -->
+<div class="base">
+  <!-- 底部关闭按钮 -->
+  <a nz-popconfirm style="margin-right: 2%" nzTitle="确认关闭吗(关闭前请确认数据已保存)" (nzOnConfirm)="close()">
+    <button nz-button class="ant-btn buttonDistance"><span>关闭
+      </span></button>
+  </a>
+  <!-- 底部保存按钮 -->
+  <button nzbutton (click)="save()" nz-button nzType="primary" [nzLoading]="saveLoading"><span>保存</span></button>
+</div>

+ 24 - 0
src/app/routes/fbs-warehouse/update/update.component.spec.ts

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

+ 91 - 0
src/app/routes/fbs-warehouse/update/update.component.ts

@@ -0,0 +1,91 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { FbsWarehouse } from 'app/entity/fbs/fbs-warehouse';
+import { FbsWarehouseService } from 'app/services/fbs/fbs-warehouse.service';
+import { DatePipe } from '@angular/common';
+
+@Component({
+  selector: 'app-fbs-warehouse-update',
+  templateUrl: './update.component.html',
+  styles: [
+    `
+      .base {
+        position: absolute;
+        bottom: 0px;
+        width: 100%;
+        border-top: 1px solid rgb(232, 232, 232);
+        padding: 10px 16px;
+        text-align: right;
+        left: 0px;
+        background: #fff;
+        z-index: 99;
+      }
+    `,
+  ],
+})
+export class FbsWarehouseUpdateComponent implements OnInit {
+  constructor(
+    private fbsWarehouseService: FbsWarehouseService,
+    private datePipe: DatePipe,
+    private nzNotificationService: NzNotificationService,
+    private drawerRef: NzDrawerRef,
+  ) {}
+
+  ngOnInit(): void {
+    this.getById();
+  }
+
+  saveLoading = false;
+  fbsWarehouse: FbsWarehouse = {
+  };
+
+
+    /**
+   * 根据id查询主表数据
+   */
+  id = '';
+  getById() {
+    return new Promise(resolve => {
+      this.saveLoading = true;
+      this.fbsWarehouseService.getById(this.id).then(response => {
+        if (response.success) {
+          //查询成功
+          this.fbsWarehouse = response.result;
+          this.saveLoading = false;
+          resolve();
+        } else {
+          this.nzNotificationService.error('查询失败', response.message);
+          this.saveLoading = false;
+        }
+      });
+    });
+  }
+  
+
+  /**
+   * 保存按钮
+   */
+  save() {
+    this.saveLoading = true;
+    //时间格式化
+    this.fbsWarehouse.date = this.datePipe.transform(this.fbsWarehouse.date, 'yyyy-MM-dd HH:mm:ss');
+    this.fbsWarehouseService.edit(this.fbsWarehouse).then(response => {
+      if (response.success) {
+        //保存成功
+        this.nzNotificationService.success('保存成功', '');
+        this.saveLoading = false; //加载效果关闭
+        this.drawerRef.close(true); //关闭抽屉 启动主页面的回调
+      } else {
+        //保存失败
+        this.nzNotificationService.error('保存失败', response.message);
+        this.saveLoading = false; //加载效果关闭
+      }
+    });
+  }
+
+  close() {
+    //抽屉关闭
+    this.drawerRef.close();
+  }
+}

+ 149 - 0
src/app/routes/fbs-warehouse/view/view.component.html

@@ -0,0 +1,149 @@
+<nz-spin [nzSpinning]="saveLoading">
+  <!-- 主数据 -->
+  <nz-table nzSize="small" [nzNoResult]="' '" nzBordered #basicTable [nzShowPagination]="false"
+    style="margin-bottom: 5px;">
+    <thead>
+      <tr>
+        <!-- 异常工时信息统计单 -->
+        <th colspan="13">
+          <h2><strong>仓库报表</strong></h2>
+        </th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>时间</td>
+        <td colSpan="12">
+          {{fbsWarehouse.date}}
+        </td>
+      </tr>
+      <tr>
+        <td>出勤工时</td>
+        <td>应到人数</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.numberOfPeopleToArrive}}
+        </td>
+        <td>实到人数</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.actualNumberOfPeople}}
+        </td>
+        <td>请假</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.lleave}}
+        </td>
+        <td>旷工</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.absenteeism}}
+        </td>
+        <td>离职</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.quit}}
+        </td>
+        <td>出勤工时</td>
+        <td style="width: 8%;">
+          {{fbsWarehouse.attendanceHours}}
+        </td>
+      </tr>
+      <tr>
+        <td>加班记录</td>
+        <td>加班人数</td>
+        <td>
+          {{fbsWarehouse.overtimePeople}}
+        </td>
+        <td>加班工时</td>
+        <td>
+          {{fbsWarehouse.overtimeHours}}
+        </td>
+        <td>加班原因</td>
+        <td colSpan="7">
+          {{fbsWarehouse.overtimeReason}}
+        </td>
+      </tr>
+      <tr>
+        <td rowspan="9">工时统计</td>
+        <td>工单配料</td>
+        <td>{{fbsWarehouse.workOrderBatching}}</td>
+        <td>生产订单号</td>
+        <td colSpan="9">{{fbsWarehouse.batchingProductionOrderNumberCode}}</td>
+      </tr>
+      <tr>
+        <td>成品收存</td>
+        <td>{{fbsWarehouse.storageFinishedProducts}}</td>
+        <td>生产订单号</td>
+        <td colSpan="9">{{fbsWarehouse.productsProductionOrderNumberCode}}</td>
+      </tr>
+      <tr>
+        <td>原材料收存</td>
+        <td>{{fbsWarehouse.storageRawMaterials}}</td>
+        <td>入库单号</td>
+        <td colSpan="9">{{fbsWarehouse.stockInNumber}}</td>
+      </tr>
+      <tr>
+        <td>研发领用</td>
+        <td>{{fbsWarehouse.researchAndDevelopment}}</td>
+        <td>出库单号</td>
+        <td colSpan="9">{{fbsWarehouse.developmentDeliveryOrderNo}}</td>
+      </tr>
+      <tr>
+        <td>项目配料</td>
+        <td>{{fbsWarehouse.projectIngredients}}</td>
+        <td>出库单号</td>
+        <td colSpan="9">{{fbsWarehouse.projectDeliveryOrderNo}}</td>
+      </tr>
+      <tr>
+        <td>项目发货</td>
+        <td>{{fbsWarehouse.projectDelivery}}</td>
+        <td>项目名称</td>
+        <td colSpan="9">{{fbsWarehouse.deliveryProjectName}}</td>
+      </tr>
+      <tr>
+        <td>项目打包</td>
+        <td>{{fbsWarehouse.packProject}}</td>
+        <td>项目名称</td>
+        <td colSpan="9">{{fbsWarehouse.packProjectName}}</td>
+      </tr>
+      <tr>
+        <td>装车</td>
+        <td>{{fbsWarehouse.loading}}</td>
+        <td>项目名称</td>
+        <td colSpan="9">{{fbsWarehouse.loadingProjectName}}</td>
+      </tr>
+      <tr>
+        <td>盘点</td>
+        <td>{{fbsWarehouse.inventory}}</td>
+        <td>物料编号</td>
+        <td colSpan="9">{{fbsWarehouse.itemNumber}}</td>
+      </tr>
+      <tr>
+        <td rowspan="4">其他工时统计</td>
+        <td>培训</td>
+        <td>{{fbsWarehouse.train}}</td>
+        <td>备注</td>
+        <td colSpan="9">{{fbsWarehouse.trainMemo}}</td>
+      </tr>
+      <tr>
+        <td>会议</td>
+        <td>{{fbsWarehouse.meeting}}</td>
+        <td>备注</td>
+        <td colSpan="9">{{fbsWarehouse.meetingMemo}}</td>
+      </tr>
+      <tr>
+        <td>5S</td>
+        <td>{{fbsWarehouse.fiveS}}</td>
+        <td>备注</td>
+        <td colSpan="9">{{fbsWarehouse.fiveSMemo}}</td>
+      </tr>
+      <tr>
+        <td>其他</td>
+        <td>{{fbsWarehouse.other}}</td>
+        <td>备注</td>
+        <td colSpan="9">{{fbsWarehouse.otherMemo}}</td>
+      </tr>
+    </tbody>
+  </nz-table>
+</nz-spin>
+
+<!-- 底部按钮 -->
+<div class="base">
+  <button nzbutton (click)="close()" nz-button ><span>关闭</span></button>
+</div>

+ 24 - 0
src/app/routes/fbs-warehouse/view/view.component.spec.ts

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

+ 68 - 0
src/app/routes/fbs-warehouse/view/view.component.ts

@@ -0,0 +1,68 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { FbsWarehouse } from 'app/entity/fbs/fbs-warehouse';
+import { FbsWarehouseService } from 'app/services/fbs/fbs-warehouse.service';
+import { DatePipe } from '@angular/common';
+
+@Component({
+  selector: 'app-fbs-warehouse-view',
+  templateUrl: './view.component.html',
+  styles: [
+    `
+    .base{
+      position: absolute;
+      bottom: 0px;
+      width: 100%;
+      border-top: 1px solid rgb(232, 232, 232);
+      padding: 10px 16px;
+      text-align: right;
+      left: 0px;
+      background: #fff;
+      z-index:99;
+    }
+
+    `
+  ]
+})
+export class FbsWarehouseViewComponent implements OnInit {
+  constructor(
+    private fbsWarehouseService: FbsWarehouseService,
+    private datePipe: DatePipe,
+    private nzNotificationService: NzNotificationService,
+    private drawerRef: NzDrawerRef,
+  ) {}
+
+  ngOnInit(): void {
+    this.getById();
+  }
+
+  saveLoading = false;
+  fbsWarehouse: FbsWarehouse = {};
+
+  /**
+   * 根据id查询主表数据
+   */
+  id = '';
+  getById() {
+    return new Promise(resolve => {
+      this.saveLoading = true;
+      this.fbsWarehouseService.getById(this.id).then(response => {
+        if (response.success) {
+          //查询成功
+          this.fbsWarehouse = response.result;
+          this.saveLoading = false;
+          resolve();
+        } else {
+          this.nzNotificationService.error('查询失败', response.message);
+          this.saveLoading = false;
+        }
+      });
+    });
+  }
+
+  close() {
+    //抽屉关闭
+    this.drawerRef.close();
+  }
+}

+ 1 - 1
src/app/routes/fbs-workshop-dispatch-list/add/add.component.ts

@@ -4,7 +4,7 @@ import { _HttpClient } from '@delon/theme';
 import { FbsWorkshopDispatchList } from 'app/entity/fbs/fbs-workshop-dispatch-list';
 import { FbsWorkshopDispatchListService } from 'app/services/fbs/fbs-workshop-dispatch-list.service';
 import { DatePipe } from '@angular/common';
-import {setHours} from 'date-fns'
+import {setHours} from 'date-fns';
 import { FbsPersonnelService } from 'app/services/fbs/fbs-personnel.service';
 import { FbsTechnologicalProcessService } from 'app/services/fbs/fbs-technological-process.service';
 import { FbsTechnologicalProcess } from 'app/entity/fbs/fbs-technological-process';

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

@@ -18,6 +18,7 @@ import { UserRegisterResultComponent } from './passport/register-result/register
 // single pages
 import { CallbackComponent } from './callback/callback.component';
 import { UserLockComponent } from './passport/lock/lock.component';
+import { RoutesDashboardHomePageComponent } from './dashboard/home-page/home-page.component';
 
 const routes: Routes = [
   {
@@ -30,6 +31,7 @@ const routes: Routes = [
       { path: 'dashboard', redirectTo: 'dashboard/v1', pathMatch: 'full' },
       { path: 'dashboard/v1', component: DashboardV1Component },
       { path: 'dashboard/analysis', component: DashboardAnalysisComponent },
+      { path: 'dashboard/home-page', component: RoutesDashboardHomePageComponent },
       { path: 'dashboard/monitor', component: DashboardMonitorComponent },
       { path: 'dashboard/workplace', component: DashboardWorkplaceComponent },
       { path: 'widgets', loadChildren: './widgets/widgets.module#WidgetsModule' },
@@ -65,7 +67,9 @@ const routes: Routes = [
       //扫码记录
       { path: 'fbs-fbs-scan-code', loadChildren: './fbs-scan-code/fbs-scan-code.module#FbsScanCodeModule' },
       //工艺流程档案
-      { path: 'fbs-technological-process', loadChildren: './fbs-technological-process/fbs-technological-process.module#FbsTechnologicalProcessModule' }
+      { path: 'fbs-technological-process', loadChildren: './fbs-technological-process/fbs-technological-process.module#FbsTechnologicalProcessModule' },
+      //仓库报表
+      { path: 'fbs-warehouse', loadChildren: './fbs-warehouse/fbs-warehouse.module#FbsWarehouseModule' }
     ],
   },
   // 全屏布局

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

@@ -19,6 +19,7 @@ import { PmModule } from './pm/pm.module';
 import { RoutesCommonUploadUrlAddComponent } from './common/upload-url-add/upload-url-add.component';
 import { RoutesMessageNotificationComponent } from './message-notification/message-notification.component';
 import { RoutesCommonSelectContractCodeComponent } from './common/select-contract-code/select-contract-code.component';
+import { RoutesDashboardHomePageComponent } from './dashboard/home-page/home-page.component';
 // import { FinancialManagementModule } from './financial-management/financial-management.module';
 
 
@@ -39,7 +40,8 @@ const COMPONENTS = [
 const COMPONENTS_NOROUNT = [
   RoutesCommonUploadUrlAddComponent,
   RoutesMessageNotificationComponent,
-  RoutesCommonSelectContractCodeComponent];
+  RoutesCommonSelectContractCodeComponent,
+  RoutesDashboardHomePageComponent];
 
 @NgModule({
   imports: [SharedModule, RouteRoutingModule],

+ 38 - 0
src/app/services/fbs/fbs-warehouse.service.ts

@@ -0,0 +1,38 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { BaseResponse } from 'app/entity/baseResponse';
+import { Result } from 'app/entity/Result';
+import { FbsWarehouse } from 'app/entity/fbs/fbs-warehouse';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class FbsWarehouseService {
+
+  constructor(private http:HttpClient) { }
+
+  // 查询
+  async list(body:any): Promise<BaseResponse<Result<FbsWarehouse[]>>> {
+    return await this.http.get<BaseResponse<Result<FbsWarehouse[]>>>('/fbsWarehouse/fbsWarehouse/list',{params:body}).toPromise();
+  }
+
+  // 新增
+  async add(body: FbsWarehouse): Promise<BaseResponse<FbsWarehouse>> {
+    return await this.http.post<BaseResponse<FbsWarehouse>>('/fbsWarehouse/fbsWarehouse/add', body).toPromise();
+  }
+
+  // 修改
+  async edit(body: FbsWarehouse): Promise<BaseResponse<FbsWarehouse>> {
+    return await this.http.put<BaseResponse<FbsWarehouse>>('/fbsWarehouse/fbsWarehouse/edit', body).toPromise();
+  }
+
+  // 通过id删除
+  async deleteD(id: string): Promise<BaseResponse<FbsWarehouse>> {
+    return await this.http.delete<BaseResponse<FbsWarehouse>>('/fbsWarehouse/fbsWarehouse/deleteD', { params: { id: id } }).toPromise();
+  }
+
+   // 根据id查询
+   async getById(id: string): Promise<BaseResponse<FbsWarehouse>> {
+    return await this.http.get<BaseResponse<FbsWarehouse>>("/fbsWarehouse/fbsWarehouse/queryById", { params: { id: id } }).toPromise();
+  }
+}

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

@@ -15,4 +15,15 @@ export class FbsWorkingStatisticsService {
   async list(body:any): Promise<BaseResponse<Result<FbsWorkingStatistics[]>>> {
     return await this.http.get<BaseResponse<Result<FbsWorkingStatistics[]>>>('/workingStatistics/fbsWorkingStatistics/list',{params:body}).toPromise();
   }
+
+  //修改扫码时间
+  async updateTime(body:any): Promise<BaseResponse<Result<FbsWorkingStatistics>>> {
+    return await this.http.put<BaseResponse<Result<FbsWorkingStatistics>>>('/workingStatistics/fbsWorkingStatistics/updateTime',body).toPromise();
+  }
+
+  // 根据id查询
+  async getById(id: string): Promise<BaseResponse<FbsWorkingStatistics>> {
+    return await this.http.get<BaseResponse<FbsWorkingStatistics>>("/workingStatistics/fbsWorkingStatistics/queryById", { params: { id: id } }).toPromise();
+  }
 }
+