瀏覽代碼

财务收款确认 项目管理 产品确认单 费用报销单添加附件

chenc 4 年之前
父節點
當前提交
bdeb2f28b0
共有 57 個文件被更改,包括 1665 次插入52 次删除
  1. 82 0
      src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.html
  2. 24 0
      src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.spec.ts
  3. 97 0
      src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.ts
  4. 3 1
      src/app/routes/down-payment-management/down-payment-management-routing.module.ts
  5. 3 1
      src/app/routes/down-payment-management/down-payment-management.module.ts
  6. 5 5
      src/app/routes/down-payment-management/payment-slip/add/add.component.ts
  7. 5 6
      src/app/routes/down-payment-management/payment-slip/update/update.component.ts
  8. 5 5
      src/app/routes/down-payment-management/receipt/add/add.component.ts
  9. 5 6
      src/app/routes/down-payment-management/receipt/update/update.component.ts
  10. 7 1
      src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.html
  11. 37 1
      src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.ts
  12. 7 1
      src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.html
  13. 37 2
      src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.ts
  14. 6 0
      src/app/routes/expense-reimbursement/expense-reimbursement-form/view/view.component.html
  15. 29 2
      src/app/routes/expense-reimbursement/expense-reimbursement-form/view/view.component.ts
  16. 17 0
      src/app/routes/project-manage-archives/add/add.component.ts
  17. 1 1
      src/app/routes/project-manage-archives/add/development/development.component.html
  18. 1 0
      src/app/routes/project-manage-archives/add/development/development.component.ts
  19. 2 2
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.html
  20. 2 0
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.ts
  21. 1 1
      src/app/routes/project-manage-archives/add/implementation/implementation.component.html
  22. 1 1
      src/app/routes/project-manage-archives/add/implementation/implementation.component.ts
  23. 1 1
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.html
  24. 1 0
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.ts
  25. 1 0
      src/app/routes/project-manage-archives/project-node-tree.ts
  26. 1 1
      src/app/routes/project-manage-archives/update/development/development.component.html
  27. 2 0
      src/app/routes/project-manage-archives/update/development/development.component.ts
  28. 2 2
      src/app/routes/project-manage-archives/update/essential-information/essential-information.component.html
  29. 2 0
      src/app/routes/project-manage-archives/update/essential-information/essential-information.component.ts
  30. 1 1
      src/app/routes/project-manage-archives/update/implementation/implementation.component.html
  31. 2 0
      src/app/routes/project-manage-archives/update/implementation/implementation.component.ts
  32. 1 1
      src/app/routes/project-manage-archives/update/serviceta/serviceta.component.html
  33. 2 0
      src/app/routes/project-manage-archives/update/serviceta/serviceta.component.ts
  34. 16 0
      src/app/routes/project-manage-archives/update/update.component.ts
  35. 115 0
      src/app/routes/project-work/product-confirmation/add/add.component.html
  36. 24 0
      src/app/routes/project-work/product-confirmation/add/add.component.spec.ts
  37. 195 0
      src/app/routes/project-work/product-confirmation/add/add.component.ts
  38. 71 0
      src/app/routes/project-work/product-confirmation/product-confirmation.component.html
  39. 24 0
      src/app/routes/project-work/product-confirmation/product-confirmation.component.spec.ts
  40. 145 0
      src/app/routes/project-work/product-confirmation/product-confirmation.component.ts
  41. 101 0
      src/app/routes/project-work/product-confirmation/update/update.component.html
  42. 24 0
      src/app/routes/project-work/product-confirmation/update/update.component.spec.ts
  43. 228 0
      src/app/routes/project-work/product-confirmation/update/update.component.ts
  44. 94 0
      src/app/routes/project-work/product-confirmation/view/view.component.html
  45. 24 0
      src/app/routes/project-work/product-confirmation/view/view.component.spec.ts
  46. 63 0
      src/app/routes/project-work/product-confirmation/view/view.component.ts
  47. 5 1
      src/app/routes/project-work/project-work-routing.module.ts
  48. 10 2
      src/app/routes/project-work/project-work.module.ts
  49. 10 2
      src/app/routes/report-form/project-situation/project-situation.component.html
  50. 1 1
      src/app/routes/report-form/project-situation/project-situation.component.ts
  51. 9 1
      src/app/routes/report-form/project-statistics/project-statistics.component.html
  52. 1 1
      src/app/routes/report-form/project-statistics/project-statistics.component.ts
  53. 4 2
      src/app/routes/routes.module.ts
  54. 8 0
      src/app/routes/upload-download/upload-download.component.html
  55. 24 0
      src/app/routes/upload-download/upload-download.component.spec.ts
  56. 64 0
      src/app/routes/upload-download/upload-download.component.ts
  57. 12 0
      src/app/services/down-payment-management/manager-payment-and-receipt-slip.service.ts

+ 82 - 0
src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.html

@@ -0,0 +1,82 @@
+<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: 8, sm: 16, md: 24, lg: 32 }">
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">单据编码</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="code" [(ngModel)]="managerPaymentAndReceiptSlip.billcode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="2" [nzXs]="24" [nzNoColon]=true></nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <button nzType="primary" (click)="query()" nz-button><span>查询</span></button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+  <!-- 表格 -->
+  <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+    <div nz-col [nzSpan]="24">
+      <nz-table nzSize="small" #basicTable [nzData]="listOfData" [nzFrontPagination]="false" [nzTotal]="page.total"
+        [nzPageIndex]="page.current" (nzPageIndexChange)="pageIndexChange($event)" [nzLoading]="isSpinning">
+        <thead>
+          <tr>
+            <th>单据编码</th>
+            <th>客户编码</th>
+            <th>客户名称</th>
+            <th>项目编码</th>
+            <th>项目名称</th>
+            <th>收付款条线</th>
+            <th>里程碑</th>
+            <th>收款金额</th>
+            <th>说明</th>
+            <th>对应发票</th>
+            <th>操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of basicTable.data">
+            <td>{{ data.billcode }}</td>
+            <td>{{ data.cusCode }}</td>
+            <td>{{ data.cusName }}</td>
+            <td>{{ data.proCode }}</td>
+            <td>{{ data.proName }}</td>
+            <td>
+              {{data.coArchivesName}}
+            </td>
+            <td>
+              {{data.proArchivesMilestone}}
+            </td>
+            <td>
+              <!-- 已确认显示 -->
+              <nz-input-number *ngIf="data.status==='1'" [nzDisabled]="true"  [(ngModel)]="data.coPrvice" [nzMin]="0" [nzMax]=10000000000 [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
+              <!-- 待确认显示 -->
+              <nz-input-number *ngIf="data.status==='0'" [(ngModel)]="data.coPrvice" [nzMin]="0" [nzMax]=10000000000 [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              {{data.explain}}
+            </td>
+            <td>
+              {{data.invoice}}
+            </td>
+            <td>
+              <a *ngIf="data.status==='0'" (click)="toBeConfirmed(data)" acl [acl-ability]="'receipt:update'">待确认</a>
+              <nz-tag *ngIf="data.status==='1'" [nzColor]="'green'">已确认</nz-tag>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.spec.ts

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

+ 97 - 0
src/app/routes/down-payment-management/collection-confirmation/collection-confirmation.component.ts

@@ -0,0 +1,97 @@
+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 { ManagerPaymentAndReceiptSlip } from 'app/entity/down-payment-management/manager-payment-and-receipt-slip';
+import { ManagerPaymentAndReceiptSlipService } from 'app/services/down-payment-management/manager-payment-and-receipt-slip.service';
+import { NzNotificationService } from 'ng-zorro-antd';
+import { I18NService } from '@core';
+
+@Component({
+  selector: 'app-down-payment-management-collection-confirmation',
+  templateUrl: './collection-confirmation.component.html',
+})
+export class DownPaymentManagementCollectionConfirmationComponent implements OnInit {
+  constructor(
+    private managerPaymentAndReceiptSlipService: ManagerPaymentAndReceiptSlipService,
+    private nzNotificationService: NzNotificationService,
+    private i18NService: I18NService,
+  ) {}
+
+  ngOnInit() {}
+
+  listOfData: any = [];
+  managerPaymentAndReceiptSlip: ManagerPaymentAndReceiptSlip = {}; //对象
+  page = {
+    total: 0,
+    current: 0,
+  }; //页码
+  isSpinning = false;
+  //金额格式化
+  formatterDollar = (value: number) => {
+    if (value) {
+      return `$ ${value}`;
+    } else {
+      return `$ `;
+    }
+  };
+  parserDollar = (value: string) => value.replace('$ ', '');
+
+  //按页码显示数据
+  pageIndexChange(event) {
+    this.managerPaymentAndReceiptSlip.pageNo = event; //当前页码
+    this.getList();
+  }
+
+  /**
+   * 查询数据表
+   */
+  getList() {
+    this.isSpinning = true;
+    this.managerPaymentAndReceiptSlip.pkOrg = sessionStorage.getItem('pkOrg'); //组织
+    this.managerPaymentAndReceiptSlip.type = '1'; //收款单
+    this.managerPaymentAndReceiptSlipService.getFinanceList(this.managerPaymentAndReceiptSlip).then(response => {
+      this.listOfData = response.result.records;
+      this.isSpinning = false;
+    });
+  }
+
+  /**
+   * 查询按钮
+   */
+  query() {
+    this.managerPaymentAndReceiptSlip.pageNo = 1;
+    this.getList();
+  }
+
+  add() {
+    // this.modal
+    //   .createStatic(FormEditComponent, { i: { id: 0 } })
+    //   .subscribe(() => this.st.reload());
+  }
+
+  /**
+   * 待确认按钮
+   */
+  toBeConfirmed(data) {
+    let where = {
+      id: data.id,
+      contentId: data.contentId,
+      status: '1',
+      coPrvice: data.coPrvice,
+      proArchivesMilestone: data.proArchivesMilestone,
+    };
+    this.managerPaymentAndReceiptSlipService.editFinanceList(where).then(response => {
+      if (response.success) {
+        //确认成功
+        this.isSpinning = false;
+        this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+        this.getList();
+      } else {
+        //确认失败
+        this.isSpinning = false;
+        this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+      }
+    });
+  }
+}

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

@@ -2,11 +2,13 @@ import { NgModule } from '@angular/core';
 import { Routes, RouterModule } from '@angular/router';
 import { DownPaymentManagementReceiptComponent } from './receipt/receipt.component';
 import { DownPaymentManagementPaymentSlipComponent } from './payment-slip/payment-slip.component';
+import { DownPaymentManagementCollectionConfirmationComponent } from './collection-confirmation/collection-confirmation.component';
 
 const routes: Routes = [
 
   { path: 'receipt', component: DownPaymentManagementReceiptComponent },
-  { path: 'payment-slip', component: DownPaymentManagementPaymentSlipComponent }];
+  { path: 'payment-slip', component: DownPaymentManagementPaymentSlipComponent },
+  { path: 'collection-confirmation', component: DownPaymentManagementCollectionConfirmationComponent }];
 
 @NgModule({
   imports: [RouterModule.forChild(routes)],

+ 3 - 1
src/app/routes/down-payment-management/down-payment-management.module.ts

@@ -9,10 +9,12 @@ import { DownPaymentManagementPaymentSlipAddComponent } from './payment-slip/add
 import { DownPaymentManagementPaymentSlipUpdateComponent } from './payment-slip/update/update.component';
 import { DownPaymentManagementReceiptViewComponent } from './receipt/view/view.component';
 import { DownPaymentManagementPaymentSlipViewComponent } from './payment-slip/view/view.component';
+import { DownPaymentManagementCollectionConfirmationComponent } from './collection-confirmation/collection-confirmation.component';
 
 const COMPONENTS = [
   DownPaymentManagementReceiptComponent,
-  DownPaymentManagementPaymentSlipComponent];
+  DownPaymentManagementPaymentSlipComponent,
+  DownPaymentManagementCollectionConfirmationComponent];
 const COMPONENTS_NOROUNT = [
   DownPaymentManagementReceiptAddComponent,
   DownPaymentManagementReceiptUpdateComponent,

+ 5 - 5
src/app/routes/down-payment-management/payment-slip/add/add.component.ts

@@ -47,10 +47,7 @@ export class DownPaymentManagementPaymentSlipAddComponent implements OnInit {
     });
     this.isLoadingSave = true;
     //项目下拉数据
-    this.getProList().then(()=>{
-      //销售发票下拉数据
-      return this.getInvoiceIdList();
-    }).then(() => {
+    this.getProList().then(() => {
       this.isLoadingSave = false;
     });
   }
@@ -81,6 +78,7 @@ export class DownPaymentManagementPaymentSlipAddComponent implements OnInit {
       invoiceManagePurchase.pageSize=20000;
       invoiceManagePurchase.type="1";
       invoiceManagePurchase.pkOrg=sessionStorage.getItem("pkOrg");
+      invoiceManagePurchase.proArchivesId=this.managerPaymentAndReceiptSlip.proId;//项目id
       this.invoiceManagePurchaseService.getList(invoiceManagePurchase).then((response)=>{
         if(response.success){
           this.invoiceIdList=response.result.records
@@ -123,6 +121,8 @@ export class DownPaymentManagementPaymentSlipAddComponent implements OnInit {
           this.managerPaymentAndReceiptSlip.cusName = project.cusName; //客户名称
           //获取条线下拉数据
           this.getLineList();
+          //获取发票下拉数据
+          this.getInvoiceIdList();
         }
       });
     }
@@ -131,7 +131,7 @@ export class DownPaymentManagementPaymentSlipAddComponent implements OnInit {
   //获取条线下拉数据
   getLineList() {
     //查询条件
-    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '1' };
+    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '4' };
     this.projectManageArchivesService.getLineList(projectManageArchives).then(response => {
       if (response.success) {
         this.coArchivesList = response.result;

+ 5 - 6
src/app/routes/down-payment-management/payment-slip/update/update.component.ts

@@ -50,11 +50,7 @@ export class DownPaymentManagementPaymentSlipUpdateComponent implements OnInit {
     this.getById()
       .then(() => {
         return this.getProList(); //根据id查询修改数据
-      })
-      .then(() => {
-        return this.getInvoiceIdList(); //获取销售下拉数据
-      })
-      .then(() => {
+      }).then(() => {
         this.isLoadingSave = false;
       });
   }
@@ -86,6 +82,7 @@ export class DownPaymentManagementPaymentSlipUpdateComponent implements OnInit {
       invoiceManagePurchase.pageSize = 20000;
       invoiceManagePurchase.type = '1';
       invoiceManagePurchase.pkOrg = sessionStorage.getItem('pkOrg');
+      invoiceManagePurchase.proArchivesId=this.managerPaymentAndReceiptSlip.proId;//项目id
       this.invoiceManagePurchaseService.getList(invoiceManagePurchase).then(response => {
         if (response.success) {
           this.invoiceIdList = response.result.records;
@@ -151,6 +148,8 @@ export class DownPaymentManagementPaymentSlipUpdateComponent implements OnInit {
           this.managerPaymentAndReceiptSlip.cusName = project.cusName; //客户名称
           //获取条线下拉数据
           this.getLineList();
+          //获取发票下拉数据
+          this.getInvoiceIdList();
         }
       });
     }
@@ -159,7 +158,7 @@ export class DownPaymentManagementPaymentSlipUpdateComponent implements OnInit {
   //获取条线下拉数据
   getLineList() {
     //查询条件
-    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '1' };
+    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '4' };
     this.projectManageArchivesService.getLineList(projectManageArchives).then(response => {
       if (response.success) {
         this.coArchivesList = response.result;

+ 5 - 5
src/app/routes/down-payment-management/receipt/add/add.component.ts

@@ -47,10 +47,7 @@ export class DownPaymentManagementReceiptAddComponent implements OnInit {
     });
     this.isLoadingSave = true;
     //项目下拉数据
-    this.getProList().then(()=>{
-      //销售发票下拉数据
-      return this.getInvoiceIdList();
-    }).then(() => {
+    this.getProList().then(() => {
       this.isLoadingSave = false;
     });
   }
@@ -81,6 +78,7 @@ export class DownPaymentManagementReceiptAddComponent implements OnInit {
       invoiceManagePurchase.pageSize=20000;
       invoiceManagePurchase.type="2";
       invoiceManagePurchase.pkOrg=sessionStorage.getItem("pkOrg");
+      invoiceManagePurchase.proArchivesId=this.managerPaymentAndReceiptSlip.proId;//项目id
       this.invoiceManagePurchaseService.getList(invoiceManagePurchase).then((response)=>{
         if(response.success){
           this.invoiceIdList=response.result.records
@@ -123,6 +121,8 @@ export class DownPaymentManagementReceiptAddComponent implements OnInit {
           this.managerPaymentAndReceiptSlip.cusName = project.cusName; //客户名称
           //获取条线下拉数据
           this.getLineList();
+          //获取发票下拉数据
+          this.getInvoiceIdList()
         }
       });
     }
@@ -131,7 +131,7 @@ export class DownPaymentManagementReceiptAddComponent implements OnInit {
   //获取条线下拉数据
   getLineList() {
     //查询条件
-    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '1' };
+    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '2' };
     this.projectManageArchivesService.getLineList(projectManageArchives).then(response => {
       if (response.success) {
         this.coArchivesList = response.result;

+ 5 - 6
src/app/routes/down-payment-management/receipt/update/update.component.ts

@@ -50,11 +50,7 @@ export class DownPaymentManagementReceiptUpdateComponent implements OnInit {
     this.getById()
       .then(() => {
         return this.getProList(); //根据id查询修改数据
-      })
-      .then(() => {
-        return this.getInvoiceIdList(); //获取销售下拉数据
-      })
-      .then(() => {
+      }).then(() => {
         this.isLoadingSave = false;
       });
   }
@@ -86,6 +82,7 @@ export class DownPaymentManagementReceiptUpdateComponent implements OnInit {
       invoiceManagePurchase.pageSize = 20000;
       invoiceManagePurchase.type = '2';
       invoiceManagePurchase.pkOrg = sessionStorage.getItem('pkOrg');
+      invoiceManagePurchase.proArchivesId=this.managerPaymentAndReceiptSlip.proId
       this.invoiceManagePurchaseService.getList(invoiceManagePurchase).then(response => {
         if (response.success) {
           this.invoiceIdList = response.result.records;
@@ -151,6 +148,8 @@ export class DownPaymentManagementReceiptUpdateComponent implements OnInit {
           this.managerPaymentAndReceiptSlip.cusName = project.cusName; //客户名称
           //获取条线下拉数据
           this.getLineList();
+          //获取发票下拉数据
+          this.getInvoiceIdList();
         }
       });
     }
@@ -159,7 +158,7 @@ export class DownPaymentManagementReceiptUpdateComponent implements OnInit {
   //获取条线下拉数据
   getLineList() {
     //查询条件
-    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '1' };
+    let projectManageArchives = { proArchivesId: this.managerPaymentAndReceiptSlip.proId, planType: '2' };
     this.projectManageArchivesService.getLineList(projectManageArchives).then(response => {
       if (response.success) {
         this.coArchivesList = response.result;

+ 7 - 1
src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.html

@@ -78,6 +78,7 @@
               <th nzAlign="center">序号</th>
               <th>费用项目</th>
               <th>金额</th>
+              <th>上传附件</th>
               <th>操作</th>
             </tr>
           </thead>
@@ -92,11 +93,16 @@
               <td>
                 <nz-input-number [(ngModel)]="data.price" [nzMin]="0" [nzMax]=10000000000 [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
               </td>
+              <td>
+                <button nz-button nzType="primary" (click)="uploadDownload(data)">{{'pm.project.archives.files.needed.to.be.uploaded.to.the.software'|translate}}</button>
+                <!-- 几个文件 -->
+                &nbsp;<nz-tag [nzColor]="'blue'">{{data.files.length}}</nz-tag>{{'File'|translate}}
+              </td>
               <td ><a nz-popconfirm nzTitle="是否删除?"
                   (nzOnConfirm)="deleteRow(data.sort)">{{'table.delete'|translate}}</a></td>
             </tr>
             <tr>
-              <td colSpan="4"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
+              <td colSpan="5"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
             </tr>
           </tbody>
         </nz-table>

+ 37 - 1
src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.ts

@@ -1,5 +1,5 @@
 import { Component, OnInit } from '@angular/core';
-import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef, NzModalService } from 'ng-zorro-antd';
 import { _HttpClient, SettingsService } from '@delon/theme';
 import { FormBuilder, Validators, FormGroup } from '@angular/forms';
 import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
@@ -12,6 +12,7 @@ import { BaseArchivesCostService } from 'app/services/basedata/base-archives-cos
 import { ReExpenseSlipService } from 'app/services/expense-reimbursement/re-expense-slip.service';
 import { I18NService } from '@core';
 import { DatePipe } from '@angular/common';
+import { RoutesUploadDownloadComponent } from 'app/routes/upload-download/upload-download.component';
 
 @Component({
   selector: 'app-expense-reimbursement-expense-reimbursement-form-add',
@@ -44,6 +45,7 @@ export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements
     private i18NService: I18NService,
     private drawerRef: NzDrawerRef,
     private datePipe: DatePipe,
+    private modalService:NzModalService
   ) {}
 
   ngOnInit(): void {
@@ -122,6 +124,7 @@ export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements
         uncoPrice: '',
         coPrice: '',
         sort: this.sort,
+        files:[]
       },
     ];
     this.sort++;
@@ -249,4 +252,37 @@ export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements
   close() {
     this.drawerRef.close();
   }
+
+  /**
+   * 文件上传下来按钮
+   */
+  uploadDownload(data){
+    const modalRef = this.modalService.create({
+      nzTitle: "新增",
+      nzContent: RoutesUploadDownloadComponent,
+      nzWidth: 600,
+      nzComponentParams:{
+        fileList:data.files
+      },
+      nzFooter: [
+        {
+          label: "关闭",
+          type: "default",
+          onClick: addModel => {
+            addModel.close()
+          }
+        },
+        {
+          label: "确定",
+          type: "primary",
+          // loading:this.modelSaveLoading,
+          onClick: addModel => {
+            addModel.save().then(()=>{
+              data.files=addModel.uploadUrlList;//文件路径集合
+            })
+          }
+        }
+      ]
+    })
+  }
 }

+ 7 - 1
src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.html

@@ -78,6 +78,7 @@
               <th nzAlign="center">序号</th>
               <th>费用项目</th>
               <th>金额</th>
+              <th>上传附件</th>
               <th>操作</th>
             </tr>
           </thead>
@@ -92,11 +93,16 @@
               <td>
                 <nz-input-number [(ngModel)]="data.price" [nzMin]="0" [nzMax]=10000000000 [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
               </td>
+              <td>
+                <button nz-button nzType="primary" (click)="uploadDownload(data)">{{'pm.project.archives.files.needed.to.be.uploaded.to.the.software'|translate}}</button>
+                <!-- 几个文件 -->
+                &nbsp;<nz-tag [nzColor]="'blue'">{{data.files.length}}</nz-tag>{{'File'|translate}}
+              </td>
               <td ><a nz-popconfirm nzTitle="是否删除?"
                   (nzOnConfirm)="deleteRow(data.sort)">{{'table.delete'|translate}}</a></td>
             </tr>
             <tr>
-              <td colSpan="4"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
+              <td colSpan="5"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
             </tr>
           </tbody>
         </nz-table>

+ 37 - 2
src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.ts

@@ -1,5 +1,5 @@
 import { Component, OnInit } from '@angular/core';
-import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef, NzModalService } from 'ng-zorro-antd';
 import { _HttpClient, SettingsService } from '@delon/theme';
 import { FormBuilder, Validators, FormGroup } from '@angular/forms';
 import { PersonnelService } from 'app/services/basedata/personnel.service';
@@ -12,6 +12,7 @@ import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip'
 import { recursiveQuery } from '@shared';
 import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
 import { BaseArchivesCost } from 'app/entity/basedata/base-archives-cost';
+import { RoutesUploadDownloadComponent } from 'app/routes/upload-download/upload-download.component';
 
 @Component({
   selector: 'app-expense-reimbursement-expense-reimbursement-form-update',
@@ -43,7 +44,8 @@ export class ExpenseReimbursementExpenseReimbursementFormUpdateComponent impleme
     private reExpenseSlipService:ReExpenseSlipService,
     private i18NService:I18NService,
     private drawerRef:NzDrawerRef,
-    private datePipe:DatePipe
+    private datePipe:DatePipe,
+    private modalService:NzModalService
   ) {}
 
   ngOnInit(): void {
@@ -263,6 +265,39 @@ export class ExpenseReimbursementExpenseReimbursementFormUpdateComponent impleme
     });
   }
 
+  /**
+   * 文件上传下来按钮
+   */
+  uploadDownload(data){
+    const modalRef = this.modalService.create({
+      nzTitle: "新增",
+      nzContent: RoutesUploadDownloadComponent,
+      nzWidth: 600,
+      nzComponentParams:{
+        fileList:data.files
+      },
+      nzFooter: [
+        {
+          label: "关闭",
+          type: "default",
+          onClick: addModel => {
+            addModel.close()
+          }
+        },
+        {
+          label: "确定",
+          type: "primary",
+          // loading:this.modelSaveLoading,
+          onClick: addModel => {
+            addModel.save().then(()=>{
+              data.files=addModel.uploadUrlList;//文件路径集合
+            })
+          }
+        }
+      ]
+    })
+  }
+
   close() {
     this.drawerRef.close();
   }

+ 6 - 0
src/app/routes/expense-reimbursement/expense-reimbursement-form/view/view.component.html

@@ -56,6 +56,7 @@
               <th nzAlign="center">序号</th>
               <th>费用项目</th>
               <th>金额</th>
+              <th>上传附件</th>
             </tr>
           </thead>
           <tbody>
@@ -67,6 +68,11 @@
               <td>
                 {{data.price}}
               </td>
+              <td>
+                <button nz-button nzType="primary" (click)="uploadDownload(data)">{{'pm.project.archives.files.needed.to.be.uploaded.to.the.software'|translate}}</button>
+                <!-- 几个文件 -->
+                &nbsp;<nz-tag [nzColor]="'blue'">{{data.files.length}}</nz-tag>{{'File'|translate}}
+              </td>
             </tr>
           </tbody>
         </nz-table>

+ 29 - 2
src/app/routes/expense-reimbursement/expense-reimbursement-form/view/view.component.ts

@@ -1,8 +1,9 @@
 import { Component, OnInit } from '@angular/core';
-import { NzModalRef, NzMessageService, NzDrawerRef } from 'ng-zorro-antd';
+import { NzModalRef, NzMessageService, NzDrawerRef, NzModalService } from 'ng-zorro-antd';
 import { _HttpClient } from '@delon/theme';
 import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
 import { ReExpenseSlipService } from 'app/services/expense-reimbursement/re-expense-slip.service';
+import { RoutesUploadDownloadComponent } from 'app/routes/upload-download/upload-download.component';
 
 @Component({
   selector: 'app-expense-reimbursement-expense-reimbursement-form-view',
@@ -27,7 +28,8 @@ export class ExpenseReimbursementExpenseReimbursementFormViewComponent implement
  
   constructor(
     private reExpenseSlipService:ReExpenseSlipService,
-    private drawerRef:NzDrawerRef
+    private drawerRef:NzDrawerRef,
+    private modalService:NzModalService
   ) { }
 
   ngOnInit(): void {
@@ -55,6 +57,31 @@ export class ExpenseReimbursementExpenseReimbursementFormViewComponent implement
     })
   }
 
+  /**
+   * 文件上传下来按钮
+   */
+  uploadDownload(data){
+    const modalRef = this.modalService.create({
+      nzTitle: "新增",
+      nzContent: RoutesUploadDownloadComponent,
+      nzWidth: 600,
+      nzComponentParams:{
+        fileList:data.files,
+        isDownload:false
+      },
+      nzFooter: [
+        {
+          label: "关闭",
+          type: "default",
+          onClick: addModel => {
+            addModel.close()
+          }
+        }
+      ]
+    })
+  }
+
+
   close() {
     this.drawerRef.close();
   }

+ 17 - 0
src/app/routes/project-manage-archives/add/add.component.ts

@@ -155,12 +155,28 @@ export class ProjectManageArchivesAddComponent implements OnInit {
         this.essentialInformation.impManagerList = JSON.parse(JSON.stringify(response.result));
         this.essentialInformation.deManagerList = JSON.parse(JSON.stringify(response.result));
         this.essentialInformation.seManagerList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开树形id
+        this.essentialInformation.seManagerList.forEach(pkorg => {
+            this.essentialInformation.expandKeys.push(pkorg.key)
+        });
         //实施页签
         this.implementation.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开树形id
+        this.implementation.personnelList.forEach(pkorg => {
+          this.implementation.expandKeys.push(pkorg.key)
+        });
         //开发页签
         this.development.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开树形id
+        this.development.personnelList.forEach(pkorg => {
+          this.development.expandKeys.push(pkorg.key)
+        });
         //服务页签
         this.serviceta.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开树形id
+        this.serviceta.personnelList.forEach(pkorg => {
+          this.serviceta.expandKeys.push(pkorg.key)
+        });
         recursiveQuery(this.essentialInformation.personnelList);
         recursiveQuery(this.essentialInformation.saleManagerList);
         recursiveQuery(this.essentialInformation.impManagerList);
@@ -390,6 +406,7 @@ export class ProjectManageArchivesAddComponent implements OnInit {
         element.keyId = element.key;
         element.executor = names;
         element.executorId = ids;
+        element.id="";
         list.push(element);
       });
     });

+ 1 - 1
src/app/routes/project-manage-archives/add/development/development.component.html

@@ -121,7 +121,7 @@
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
                   nzPlaceHolder="请选择"
-                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                 </nz-tree-select>
                 </td>
                 <td>

+ 1 - 0
src/app/routes/project-manage-archives/add/development/development.component.ts

@@ -29,6 +29,7 @@ export class ProjectManageArchivesAddDevelopmentComponent implements OnInit {
   listOfMapData:any=[];//树形集合
   personnelList=[];//人员下拉列表
   remittanceInformation:any={};//回款信息实体
+  expandKeys=[];//树形下拉默认展开第一级
 
 
   /**

+ 2 - 2
src/app/routes/project-manage-archives/add/essential-information/essential-information.component.html

@@ -172,7 +172,7 @@
           <nz-tree-select style="width: 100%" [nzNodes]="seManagerList" nzShowSearch [nzMultiple]="false"
             formControlName="seManagerId" id="seManagerId" nzPlaceHolder="请选择"
             [(ngModel)]="projectManageArchivesa.seManagerId" [nzMaxTagCount]="3" [nzAllowClear]="true"
-            (ngModelChange)="managerChange($event,'4')">
+            (ngModelChange)="managerChange($event,'4')" [nzDefaultExpandedKeys]="expandKeys">
           </nz-tree-select>
         </nz-form-control>
       </nz-form-item>
@@ -183,7 +183,7 @@
         <nz-form-control [nzSm]="24" [nzXs]="24">
           <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
             formControlName="seEngineerIds" id="seEngineerIds" nzPlaceHolder="请选择" [(ngModel)]="seEngineerIds"
-            [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="personnelChange($event,'4')">
+            [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="personnelChange($event,'4')" [nzDefaultExpandedKeys]="expandKeys">
           </nz-tree-select>
         </nz-form-control>
       </nz-form-item>

+ 2 - 0
src/app/routes/project-manage-archives/add/essential-information/essential-information.component.ts

@@ -206,6 +206,8 @@ export class ProjectManageArchivesAddEssentialInformationComponent implements On
     }
   }
 
+  expandKeys=[]
+
   /**
    * 人员多选触发事件
    * @param event 人员id

+ 1 - 1
src/app/routes/project-manage-archives/add/implementation/implementation.component.html

@@ -121,7 +121,7 @@
                     <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
-                    nzPlaceHolder="请选择" [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                    nzPlaceHolder="请选择" [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                   </nz-tree-select>
                 </td>
                 <td>

+ 1 - 1
src/app/routes/project-manage-archives/add/implementation/implementation.component.ts

@@ -29,7 +29,7 @@ export class ProjectManageArchivesAddImplementationComponent implements OnInit {
   listOfMapData:any=[];//树形集合
   personnelList=[];//人员下拉列表
   remittanceInformation:any={};//回款信息实体
-
+  expandKeys=[];//树形下拉默认展开第一级
 
   /**
    * 获取树形集合

+ 1 - 1
src/app/routes/project-manage-archives/add/serviceta/serviceta.component.html

@@ -121,7 +121,7 @@
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
                   nzPlaceHolder="请选择"
-                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                 </nz-tree-select>
                 </td>
                 <td>

+ 1 - 0
src/app/routes/project-manage-archives/add/serviceta/serviceta.component.ts

@@ -24,6 +24,7 @@ export class ProjectManageArchivesAddServicetaComponent implements OnInit {
   listOfMapData: any = []; //树形集合
   personnelList = []; //人员下拉列表
   remittanceInformation: any = {}; //回款信息实体
+  expandKeys=[];//树形下拉默认展开第一级
 
   /**
    * 获取树形集合

+ 1 - 0
src/app/routes/project-manage-archives/project-node-tree.ts

@@ -18,4 +18,5 @@ export interface ProjectNodeTree {
     executor?:string;
     executorId?:string;
     keyId?:string;
+    muilesCode?:string;
   }

+ 1 - 1
src/app/routes/project-manage-archives/update/development/development.component.html

@@ -121,7 +121,7 @@
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
                   nzPlaceHolder="请选择"
-                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                 </nz-tree-select>
                 </td>
                 <td>

+ 2 - 0
src/app/routes/project-manage-archives/update/development/development.component.ts

@@ -23,6 +23,7 @@ export class ProjectManageArchivesUpdateDevelopmentComponent implements OnInit {
   listOfMapData: any = []; //树形集合
   personnelList = []; //人员下拉列表
   remittanceInformation: any = {}; //回款信息实体
+  expandKeys=[];//树形下拉默认展开第一季下拉数据
 
   /**
    * 获取树形集合
@@ -158,6 +159,7 @@ export class ProjectManageArchivesUpdateDevelopmentComponent implements OnInit {
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.muilesCode=element.muilesCode;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

+ 2 - 2
src/app/routes/project-manage-archives/update/essential-information/essential-information.component.html

@@ -172,7 +172,7 @@
           <nz-tree-select style="width: 100%" [nzNodes]="seManagerList" nzShowSearch [nzMultiple]="false"
             formControlName="seManagerId" id="seManagerId" nzPlaceHolder="请选择"
             [(ngModel)]="projectManageArchivesa.seManagerId" [nzMaxTagCount]="3" [nzAllowClear]="true"
-            (ngModelChange)="managerChange($event,'4')">
+            (ngModelChange)="managerChange($event,'4')" [nzDefaultExpandedKeys]="expandKeys">
           </nz-tree-select>
         </nz-form-control>
       </nz-form-item>
@@ -183,7 +183,7 @@
         <nz-form-control [nzSm]="24" [nzXs]="24">
           <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
             formControlName="seEngineerIds" id="seEngineerIds" nzPlaceHolder="请选择" [(ngModel)]="seEngineerIds"
-            [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="personnelChange($event,'4')">
+            [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="personnelChange($event,'4')" [nzDefaultExpandedKeys]="expandKeys">
           </nz-tree-select>
         </nz-form-control>
       </nz-form-item>

+ 2 - 0
src/app/routes/project-manage-archives/update/essential-information/essential-information.component.ts

@@ -202,6 +202,8 @@ export class ProjectManageArchivesUpdateEssentialInformationComponent implements
     }
   }
 
+  expandKeys=[]
+
   /**
    * 人员多选触发事件
    * @param event 人员id

+ 1 - 1
src/app/routes/project-manage-archives/update/implementation/implementation.component.html

@@ -120,7 +120,7 @@
                     <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
-                    nzPlaceHolder="请选择" [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                    nzPlaceHolder="请选择" [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                   </nz-tree-select>
                 </td>
                 <td>

+ 2 - 0
src/app/routes/project-manage-archives/update/implementation/implementation.component.ts

@@ -25,6 +25,7 @@ export class ProjectManageArchivesUpdateImplementationComponent implements OnIni
   listOfMapData: any = []; //树形集合
   personnelList = []; //人员下拉列表
   remittanceInformation: any = {}; //回款信息实体
+  expandKeys=[];//树形下拉默认打开第一级
 
   /**
    * 获取树形集合
@@ -160,6 +161,7 @@ export class ProjectManageArchivesUpdateImplementationComponent implements OnIni
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.muilesCode=element.muilesCode;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

+ 1 - 1
src/app/routes/project-manage-archives/update/serviceta/serviceta.component.html

@@ -120,7 +120,7 @@
                   </nz-select> -->
                   <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="true"
                   nzPlaceHolder="请选择"
-                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true">
+                  [(ngModel)]="item.executors" [nzMaxTagCount]="3" [nzAllowClear]="true" [nzDefaultExpandedKeys]="expandKeys">
                 </nz-tree-select>
                 </td>
                 <td>

+ 2 - 0
src/app/routes/project-manage-archives/update/serviceta/serviceta.component.ts

@@ -23,6 +23,7 @@ export class ProjectManageArchivesUpdateServicetaComponent implements OnInit {
   listOfMapData: any = []; //树形集合
   personnelList = []; //人员下拉列表
   remittanceInformation: any = {}; //回款信息实体
+  expandKeys=[];//树形下拉默认展开第一季
 
   /**
    * 获取树形集合
@@ -159,6 +160,7 @@ export class ProjectManageArchivesUpdateServicetaComponent implements OnInit {
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.muilesCode=element.muilesCode;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

+ 16 - 0
src/app/routes/project-manage-archives/update/update.component.ts

@@ -145,12 +145,28 @@ export class ProjectManageArchivesUpdateComponent implements OnInit {
         this.essentialInformation.impManagerList = JSON.parse(JSON.stringify(response.result));
         this.essentialInformation.deManagerList = JSON.parse(JSON.stringify(response.result));
         this.essentialInformation.seManagerList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开id
+        this.essentialInformation.seManagerList.forEach(pkorg => {
+          this.essentialInformation.expandKeys.push(pkorg.key)
+        });
         //实施页签
         this.implementation.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开id
+        this.implementation.personnelList.forEach(pkorg => {
+          this.implementation.expandKeys.push(pkorg.key)
+        });
         //开发页签
         this.development.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开id
+        this.development.personnelList.forEach(pkorg => {
+          this.development.expandKeys.push(pkorg.key)
+        });
         //服务页签
         this.serviceta.personnelList = JSON.parse(JSON.stringify(response.result));
+        //获取默认展开id
+        this.serviceta.personnelList.forEach(pkorg => {
+          this.serviceta.expandKeys.push(pkorg.key)
+        });
         recursiveQuery(this.essentialInformation.personnelList);
         recursiveQuery(this.essentialInformation.saleManagerList);
         recursiveQuery(this.essentialInformation.impManagerList);

+ 115 - 0
src/app/routes/project-work/product-confirmation/add/add.component.html

@@ -0,0 +1,115 @@
+<!-- 基本信息 -->
+<form nz-form [formGroup]="validateForm" (ngSubmit)="submitForm()">
+
+
+
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>单据编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          自动生成
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">项目编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.proCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>项目名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="proId" id="proId"
+            [(ngModel)]="proWorkMilestone.proId" nzPlaceHolder="请选择" (ngModelChange)="proChange($event)">
+            <nz-option *ngFor="let i of proList" [nzValue]="i.id" [nzLabel]="i.proName"></nz-option>
+          </nz-select>
+          <nz-form-explain *ngIf="validateForm.get('proId')?.dirty && validateForm.get('proId')?.errors">
+            请选择项目名称
+          </nz-form-explain>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <!-- <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>项目里程碑</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="mileId" id="mileId"
+            [(ngModel)]="proWorkMilestone.mileId" nzPlaceHolder="请选择" (ngModelChange)="milChange($event)">
+            <nz-option *ngFor="let i of mieList" [nzValue]="i.key" [nzLabel]="i.milesName"></nz-option>
+          </nz-select>
+          <nz-form-explain *ngIf="validateForm.get('mileId')?.dirty && validateForm.get('mileId')?.errors">
+            请选择里程碑
+          </nz-form-explain>
+        </nz-form-control>
+      </nz-form-item>
+    </div> -->
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>确认</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-switch formControlName="milSwitch" id="milSwitch" [(ngModel)]="milSwitch" nzCheckedChildren="是"
+            nzUnCheckedChildren="否"></nz-switch>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>确认时间</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-date-picker formControlName="confirmTime" id="confirmTime" [(ngModel)]="proWorkMilestone.confirmTime">
+          </nz-date-picker>
+          <nz-form-explain *ngIf="validateForm.get('confirmTime')?.dirty && validateForm.get('confirmTime')?.errors">
+            请选择时间
+          </nz-form-explain>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+</form>
+<!-- 项目成果 -->
+<nz-card nzTitle="项目成果">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-upload nzAction="sys/common/uploadFile" [nzFileList]="fileList" nzMultiple=true
+        (nzChange)="handleChange($event)">
+        <button nz-button><i nz-icon nzType="upload"></i>上传</button>
+      </nz-upload>
+    </div>
+  </div>
+</nz-card>
+<!-- 按钮 -->
+<div class="base">
+  <strong>填写人:</strong>{{proWorkMilestone.currentUser}} <strong>填写时间:</strong>{{proWorkMilestone.createTime}}
+  <!-- 关闭按钮 -->
+  <a nz-popconfirm nzTitle="{{'pm.contract.contract.add.button.cancel'|translate}}" (nzOnConfirm)="close()"
+    style="padding-right: 8px">
+    <button nz-button>{{'pm.quotation.cancel'|translate}}</button>
+  </a>
+  <!-- 保存按钮 -->
+  <button nz-button nzType="primary" class="ant-btn ant-btn-primary" (click)="submitForm()"
+    [nzLoading]="isLoadingSave"><span>{{'pm.finish' | translate}}</span></button>
+</div>

+ 24 - 0
src/app/routes/project-work/product-confirmation/add/add.component.spec.ts

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

+ 195 - 0
src/app/routes/project-work/product-confirmation/add/add.component.ts

@@ -0,0 +1,195 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { _HttpClient, ModalHelper, SettingsService } from '@delon/theme';
+import { STColumn, STComponent } from '@delon/abc';
+import { SFSchema } from '@delon/form';
+import { FormBuilder, Validators, FormGroup } from '@angular/forms';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { DatePipe } from '@angular/common';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { I18NService } from '@core';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { environment } from '@env/environment';
+
+@Component({
+  selector: 'app-project-work-product-confirmation-add',
+  templateUrl: './add.component.html',
+  styles: [
+    `
+      .base {
+        position: absolute;
+        bottom: 0px;
+        width: 100%;
+        border-top: 1px solid rgb(232, 232, 232);
+        padding: 6px 16px;
+        text-align: right;
+        left: 0px;
+        background: #fff;
+        z-index: 99;
+      }
+    `,
+  ],
+})
+export class ProjectWorkProductConfirmationAddComponent implements OnInit {
+  constructor(
+    private fb: FormBuilder,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private datePipe: DatePipe,
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private nzNotificationService:NzNotificationService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private settingsService:SettingsService
+  ) {}
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      // mileId: [null, [Validators.required]],
+      milSwitch: [null],
+      confirmTime: [null, [Validators.required]],
+    });
+    //项目集合
+    this.getProList().then(() => {});
+  }
+
+  validateForm!: FormGroup;
+  proWorkMilestone: ProWorkMilestone = {
+    currentUser: this.settingsService.user.realname,//当天填写人
+    createTime: this.datePipe.transform(new Date(), 'yyyy-MM-dd HH:mm:ss')//当前时间
+  }; //对象
+  isLoadingSave = false; //加载
+  proList = []; //项目下拉列表
+  milSwitch = false; //里程碑确认空间
+
+  /**
+   * 获取项目下拉数据
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let projectManageArchives = new ProjectManageArchives();
+      projectManageArchives.pageSize = 20000;
+      projectManageArchives.pkOrg = sessionStorage.getItem('pkOrg');
+      this.projectManageArchivesService.getList(projectManageArchives).then(response => {
+        if (response.result.records) {
+          this.proList = response.result.records;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 项目选择事件
+   * @param event 项目档案id
+   */
+  proChange(event) {
+    if (event) {
+      //根据id获取项目档案数据
+      this.projectManageArchivesService.getListById(event).then(response => {
+        if (response.success) {
+          let project = JSON.parse(JSON.stringify(response.result)); //项目档案对象
+          this.proWorkMilestone.proCode = project.proCode; //项目档案编码
+          this.proWorkMilestone.proName = project.proName; //项目档案名称
+          this.proWorkMilestone.cusId = project.cusId; //客户id
+          this.proWorkMilestone.cusCode = project.cusCode; //客户编码
+          this.proWorkMilestone.cusName = project.cusName; //客户名称
+        }
+      });
+    }
+  }
+
+
+  fileList = [];
+
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    console.log(JSON.parse(JSON.stringify(this.fileList)))
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
+  }
+
+  /**
+   * 保存按钮
+   */
+  uploadUrlList = []; //传入后台的文件地址集合
+  submitForm() {
+    for (const i in this.validateForm.controls) {
+      this.validateForm.controls[i].markAsDirty();
+      this.validateForm.controls[i].updateValueAndValidity();
+    }
+    let valid = this.validateForm.valid;
+    if (valid) {
+      this.proWorkMilestone.type="4";
+      this.proWorkMilestone.pkOrg=sessionStorage.getItem("pkOrg");
+      //获取里程碑确认状态
+      if (this.milSwitch) {
+        this.proWorkMilestone.mileConfirm = 1;
+      } else {
+        this.proWorkMilestone.mileConfirm = 0;
+      }
+      //事件格式化
+      this.proWorkMilestone.confirmTime = this.datePipe.transform(
+        this.proWorkMilestone.confirmTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      //文件集合
+      this.getFileList();
+      this.proWorkMilestone.fileList=this.uploadUrlList;
+      this.proWorkMilestoneService.add(this.proWorkMilestone).then((response)=>{
+        if (response.success) {
+          //保存成功
+          this.isLoadingSave = false;
+          this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+          this.drawerRef.close(true);
+        } else {
+          //保存失败
+          this.isLoadingSave = false;
+          this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+        }
+      })
+    }
+  }
+
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          }
+        ];
+      });
+    }
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+
+  //显示路径
+  setAppendix(file: any) {
+    const url = file.fileUrl;
+    if (url != null && url !== '') {
+      const idx = url.lastIndexOf('/');
+      const fileUrl = url.slice(idx + 1);
+      const index = fileUrl.lastIndexOf('_');
+      const i = fileUrl.lastIndexOf('.');
+      const fileName = fileUrl.substring(0, index);
+      const fileSuffix = fileUrl.slice(i + 1);
+      const f = fileName + '.' + fileSuffix;
+      return f;
+    }
+    return '';
+  }
+
+}

+ 71 - 0
src/app/routes/project-work/product-confirmation/product-confirmation.component.html

@@ -0,0 +1,71 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'product-confirmation:add'">新建</button>
+  </ng-template>
+</page-header>
+<nz-card>
+  <!-- 查询条件 -->
+  <form nz-form>
+    <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">单据编码</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="code" [(ngModel)]="proWorkMilestone.billcode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="2" [nzXs]="24" [nzNoColon]=true></nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <button nzType="primary" (click)="query()" nz-button><span>查询</span></button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+   <!-- 表格 -->
+   <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+    <div nz-col [nzSpan]="24">
+      <nz-table nzSize="small" #basicTable [nzData]="listOfData" [nzFrontPagination]="false" [nzTotal]="page.total"
+        [nzPageIndex]="page.current" (nzPageIndexChange)="pageIndexChange($event)" [nzLoading]="isSpinning">
+        <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 data of basicTable.data">
+            <td>{{ data.billcode }}</td>
+            <td>{{ data.proCode }}</td>
+            <td>{{ data.proName }}</td>
+            <td>{{ data.cusCode }}</td>
+            <td>{{ data.cusName }}</td>
+            <!-- <td>{{ data.mileName }}</td> -->
+            <td>
+              <nz-tag *ngIf="data.mileConfirm===0" [nzColor]="'red'"></nz-tag>
+              <nz-tag *ngIf="data.mileConfirm===1" [nzColor]="'green'"></nz-tag>
+            </td>
+            <td>{{ data.confirmTime }}</td>
+            <td>
+              <a (click)="view(data)" acl [acl-ability]="'product-confirmation:view'">详情</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'product-confirmation:view'"></nz-divider>
+              <a (click)="update(data)" acl [acl-ability]="'product-confirmation:update'">修改</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'product-confirmation:update'"></nz-divider>
+              <a (click)="delete(data.id)" acl [acl-ability]="'product-confirmation:delete'">删除</a>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/project-work/product-confirmation/product-confirmation.component.spec.ts

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

+ 145 - 0
src/app/routes/project-work/product-confirmation/product-confirmation.component.ts

@@ -0,0 +1,145 @@
+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 { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { NzDrawerService, NzNotificationService } from 'ng-zorro-antd';
+import { I18NService } from '@core';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { ProjectWorkProductConfirmationAddComponent } from './add/add.component';
+import { ProjectWorkProductConfirmationUpdateComponent } from './update/update.component';
+import { ProjectWorkProductConfirmationViewComponent } from './view/view.component';
+
+@Component({
+  selector: 'app-project-work-product-confirmation',
+  templateUrl: './product-confirmation.component.html',
+})
+export class ProjectWorkProductConfirmationComponent implements OnInit {
+  
+
+  constructor(
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private nzDrawerService:NzDrawerService,
+    private i18NService:I18NService,
+    private nzNotificationService:NzNotificationService
+  ) {}
+
+  ngOnInit() {
+    this.getList()
+  }
+
+  listOfData = [];
+  proWorkMilestone: ProWorkMilestone = {}; //对象
+  page = {
+    total: 0,
+    current: 0,
+  }; //页码
+  isSpinning = false;
+
+  //按页码显示数据
+  pageIndexChange(event) {
+    this.proWorkMilestone.pageNo = event; //当前页码
+    this.getList();
+  }
+
+  /**
+   * 查询数据表
+   */
+  getList() {
+    // this.isSpinning=true;
+    this.isSpinning=true;
+    this.proWorkMilestone.pkOrg = sessionStorage.getItem('pkOrg'); //组织
+    this.proWorkMilestone.type = '4';//产品类型
+    this.proWorkMilestoneService.getList(this.proWorkMilestone).then(response => {
+      this.listOfData = response.result.records;
+      this.isSpinning=false;
+    });
+  }
+
+  /**
+   * 查询按钮
+   */
+  query() {
+    this.proWorkMilestone.pageNo = 1;
+    this.getList();
+  }
+
+  /**
+   * 新增按钮
+   */
+  add() {
+    const drawerRef = this.nzDrawerService.create<ProjectWorkProductConfirmationAddComponent, { quotationId: string }, string>({
+      nzTitle: this.i18NService.fanyi("button.add"),//新增标题
+      nzContent: ProjectWorkProductConfirmationAddComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' }
+      // nzContentParams: {
+      //   //模板id
+      //   quotationId: item.id
+      // }
+    });
+
+    //关闭抽屉的回调
+    drawerRef.afterClose.subscribe((isRefresh) => {
+      if (isRefresh) {//刷新list列表
+        this.getList();
+      }
+    });
+  }
+
+  update(data){
+    const drawerRef = this.nzDrawerService.create<ProjectWorkProductConfirmationUpdateComponent, { id: string }, string>({
+      nzTitle: this.i18NService.fanyi("table.update"),//修改标题
+      nzContent: ProjectWorkProductConfirmationUpdateComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {
+        //id
+        id: data.id
+      }
+    });
+
+    //关闭抽屉的回调
+    drawerRef.afterClose.subscribe((isRefresh) => {
+      if (isRefresh) {//刷新list列表
+        this.getList();
+      }
+    });
+  }
+
+  /**
+   * 详情按钮
+   */
+  view(data){
+    const drawerRef = this.nzDrawerService.create<ProjectWorkProductConfirmationViewComponent, { id: string }, string>({
+      nzTitle: this.i18NService.fanyi("table.view"),//详情标题
+      nzContent: ProjectWorkProductConfirmationViewComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {
+        //id
+        id: data.id
+      }
+    });
+  }
+
+  /**
+   * 删除按钮
+   * @param id 删除id
+   */
+  delete(id){
+    let proWorkMilestone=new ProWorkMilestone();
+    proWorkMilestone.id=id;
+    this.proWorkMilestoneService.delete(proWorkMilestone).then((response)=>{
+      if (response.success) {
+        //删除成功
+        this.nzNotificationService.success(this.i18NService.fanyi('successful.deletion'), '');
+        this.getList();
+      } else {
+        //删除失败
+        this.nzNotificationService.error(this.i18NService.fanyi('delete.failed'), '');
+      }
+    })
+  }
+
+}

+ 101 - 0
src/app/routes/project-work/product-confirmation/update/update.component.html

@@ -0,0 +1,101 @@
+<!-- 基本信息 -->
+<form nz-form [formGroup]="validateForm" (ngSubmit)="submitForm()">
+
+
+
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>单据编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.billcode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">项目编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.proCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>项目名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="proId" id="proId"
+            [(ngModel)]="proWorkMilestone.proId" nzPlaceHolder="请选择" (ngModelChange)="proChange($event)">
+            <nz-option *ngFor="let i of proList" [nzValue]="i.id" [nzLabel]="i.proName"></nz-option>
+          </nz-select>
+          <nz-form-explain *ngIf="validateForm.get('proId')?.dirty && validateForm.get('proId')?.errors">
+            请选择项目名称
+          </nz-form-explain>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>确认</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-switch formControlName="milSwitch" id="milSwitch" [(ngModel)]="milSwitch" nzCheckedChildren="是"
+            nzUnCheckedChildren="否"></nz-switch>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" nzRequired>确认时间</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-date-picker formControlName="confirmTime" id="confirmTime" [(ngModel)]="proWorkMilestone.confirmTime">
+          </nz-date-picker>
+          <nz-form-explain *ngIf="validateForm.get('confirmTime')?.dirty && validateForm.get('confirmTime')?.errors">
+            请选择时间
+          </nz-form-explain>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+</form>
+<!-- 项目成果 -->
+<nz-card nzTitle="项目成果">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-upload nzAction="sys/common/uploadFile" [nzFileList]="fileList" nzMultiple=true
+        (nzChange)="handleChange($event)">
+        <button nz-button><i nz-icon nzType="upload"></i>上传</button>
+      </nz-upload>
+    </div>
+  </div>
+</nz-card>
+<!-- 按钮 -->
+<div class="base">
+  <strong>填写人:</strong>{{proWorkMilestone.currentUser}} <strong>填写时间:</strong>{{proWorkMilestone.createTime}}
+  <!-- 关闭按钮 -->
+  <a nz-popconfirm nzTitle="{{'pm.contract.contract.add.button.cancel'|translate}}" (nzOnConfirm)="close()"
+    style="padding-right: 8px">
+    <button nz-button>{{'pm.quotation.cancel'|translate}}</button>
+  </a>
+  <!-- 保存按钮 -->
+  <button nz-button nzType="primary" class="ant-btn ant-btn-primary" (click)="submitForm()"
+    [nzLoading]="isLoadingSave"><span>{{'pm.finish' | translate}}</span></button>
+</div>

+ 24 - 0
src/app/routes/project-work/product-confirmation/update/update.component.spec.ts

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

+ 228 - 0
src/app/routes/project-work/product-confirmation/update/update.component.ts

@@ -0,0 +1,228 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient, SettingsService } from '@delon/theme';
+import { FormBuilder, Validators, FormGroup } from '@angular/forms';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { DatePipe } from '@angular/common';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { I18NService } from '@core';
+import { environment } from '@env/environment';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+
+@Component({
+  selector: 'app-project-work-product-confirmation-update',
+  templateUrl: './update.component.html',
+  styles: [
+    `
+      .base {
+        position: absolute;
+        bottom: 0px;
+        width: 100%;
+        border-top: 1px solid rgb(232, 232, 232);
+        padding: 6px 16px;
+        text-align: right;
+        left: 0px;
+        background: #fff;
+        z-index: 99;
+      }
+    `,
+  ],
+})
+export class ProjectWorkProductConfirmationUpdateComponent implements OnInit {
+  constructor(
+    private fb: FormBuilder,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private datePipe: DatePipe,
+    private proWorkMilestoneService: ProWorkMilestoneService,
+    private nzNotificationService: NzNotificationService,
+    private i18NService: I18NService,
+    private drawerRef: NzDrawerRef,
+    private settingsService: SettingsService,
+  ) {}
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      mileId: [null, [Validators.required]],
+      milSwitch: [null],
+      confirmTime: [null, [Validators.required]],
+    });
+    //项目集合
+    this.getProList().then(() => {});
+    this.getById();
+  }
+
+  /**
+   * 根据id查询数据
+   */
+  getById() {
+    this.isLoadingSave=true;
+    this.proWorkMilestoneService.queryById(this.id).then(response => {
+      if (response.success) {
+        //表数据
+        this.proWorkMilestone = response.result;
+        //确认状态
+        if(this.proWorkMilestone.mileConfirm===1){
+          this.milSwitch=true;
+        }else{
+          this.milSwitch=false;
+        }
+        //文件信息
+        this.fileList=response.result.fileList;
+        this.getFileListById();
+      }
+      this.isLoadingSave=false;
+    });
+  }
+
+  getFileListById() {
+    //文件集合不为空则显示文件下载
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach((element, index) => {
+        const fileName = this.setAppendix(element);
+        (element.uid = '-1'),
+          (element.uid = index + 1),
+          (element.name = fileName),
+          (element.status = 'done'),
+          (element.url = environment.SERVER_URL + 'sys/common/downloadFile/' + element.fileUrl);
+        element.response = { message: element.fileUrl };
+      });
+    }
+  }
+
+  validateForm!: FormGroup;
+  proWorkMilestone: ProWorkMilestone = {
+  }; //对象
+  isLoadingSave = false; //加载
+  proList = []; //项目下拉列表
+  milSwitch = false; //里程碑确认空间
+  id = '';
+  /**
+   * 获取项目下拉数据
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let projectManageArchives = new ProjectManageArchives();
+      projectManageArchives.pageSize = 20000;
+      projectManageArchives.pkOrg = sessionStorage.getItem('pkOrg');
+      this.projectManageArchivesService.getList(projectManageArchives).then(response => {
+        if (response.result.records) {
+          this.proList = response.result.records;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 项目选择事件
+   * @param event 项目档案id
+   */
+  proChange(event) {
+    if (event) {
+      //根据id获取项目档案数据
+      this.projectManageArchivesService.getListById(event).then(response => {
+        if (response.success) {
+          let project = JSON.parse(JSON.stringify(response.result)); //项目档案对象
+          this.proWorkMilestone.proCode = project.proCode; //项目档案编码
+          this.proWorkMilestone.proName = project.proName; //项目档案名称
+          this.proWorkMilestone.cusId = project.cusId; //客户id
+          this.proWorkMilestone.cusCode = project.cusCode; //客户编码
+          this.proWorkMilestone.cusName = project.cusName; //客户名称
+        }
+      });
+    }
+  }
+  fileList = [];
+/**
+ * 文件选择事件
+ */
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
+  }
+
+  /**
+   * 保存按钮
+   */
+  uploadUrlList = []; //传入后台的文件地址集合
+  submitForm() {
+    for (const i in this.validateForm.controls) {
+      this.validateForm.controls[i].markAsDirty();
+      this.validateForm.controls[i].updateValueAndValidity();
+    }
+    let valid = this.validateForm.valid;
+    if (valid) {
+      this.isLoadingSave=true;
+      //获取里程碑确认状态
+      if (this.milSwitch) {
+        this.proWorkMilestone.mileConfirm = 1;
+      } else {
+        this.proWorkMilestone.mileConfirm = 0;
+      }
+      //事件格式化
+      this.proWorkMilestone.confirmTime = this.datePipe.transform(
+        this.proWorkMilestone.confirmTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      //文件集合
+      this.getFileList();
+      this.proWorkMilestone.fileList = this.uploadUrlList;
+      this.proWorkMilestoneService.update(this.proWorkMilestone).then(response => {
+        if (response.success) {
+          //保存成功
+          this.isLoadingSave = false;
+          this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+          this.drawerRef.close(true);
+        } else {
+          //保存失败
+          this.isLoadingSave = false;
+          this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+        }
+        this.isLoadingSave=false;
+      });
+    }
+  }
+
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          },
+        ];
+      });
+    }
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+
+  //显示路径
+  setAppendix(file: any) {
+    const url = file.fileUrl;
+    if (url != null && url !== '') {
+      const idx = url.lastIndexOf('/');
+      const fileUrl = url.slice(idx + 1);
+      const index = fileUrl.lastIndexOf('_');
+      const i = fileUrl.lastIndexOf('.');
+      const fileName = fileUrl.substring(0, index);
+      const fileSuffix = fileUrl.slice(i + 1);
+      const f = fileName + '.' + fileSuffix;
+      return f;
+    }
+    return '';
+  }
+}

+ 94 - 0
src/app/routes/project-work/product-confirmation/view/view.component.html

@@ -0,0 +1,94 @@
+<!-- 基本信息 -->
+<form nz-form>
+
+
+
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" >单据编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.billcode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">项目编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.proCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" >项目名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.proName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusCode}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.cusName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" >项目里程碑</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.mileName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" >里程碑确认</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+            <nz-tag [nzColor]="'green'" *ngIf="proWorkMilestone.mileConfirm===1"></nz-tag>
+            <nz-tag [nzColor]="'green'" *ngIf="proWorkMilestone.mileConfirm===0"></nz-tag>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" >确认时间</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{proWorkMilestone.confirmTime}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+</form>
+<!-- 项目成果 -->
+<nz-card nzTitle="项目成果">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-upload nzAction="sys/common/uploadFile" [nzFileList]="fileList" nzMultiple=true
+        >
+        <!-- <button nz-button><i nz-icon nzType="upload"></i>上传</button> -->
+      </nz-upload>
+    </div>
+  </div>
+</nz-card>
+<!-- 按钮 -->
+<div class="base">
+  <strong>填写人:</strong>{{proWorkMilestone.currentUser}} <strong>填写时间:</strong>{{proWorkMilestone.createTime}}
+  <!-- 关闭按钮 -->
+  <button nz-button (click)="close()"
+    [nzLoading]="isLoadingSave"><span>{{'pm.quotation.cancel'|translate}}</span></button>
+</div>

+ 24 - 0
src/app/routes/project-work/product-confirmation/view/view.component.spec.ts

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

+ 63 - 0
src/app/routes/project-work/product-confirmation/view/view.component.ts

@@ -0,0 +1,63 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { getFileListById } from '@shared/utils/file-show';
+
+@Component({
+  selector: 'app-project-work-product-confirmation-view',
+  templateUrl: './view.component.html',
+  styles: [
+    `
+      .base {
+        position: absolute;
+        bottom: 0px;
+        width: 100%;
+        border-top: 1px solid rgb(232, 232, 232);
+        padding: 6px 16px;
+        text-align: right;
+        left: 0px;
+        background: #fff;
+        z-index: 99;
+      }
+    `,
+  ],
+})
+export class ProjectWorkProductConfirmationViewComponent implements OnInit {
+  constructor(
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private drawerRef:NzDrawerRef
+  ) { }
+
+  ngOnInit(): void {
+    this.getById();
+  }
+  isLoadingSave=false;
+  proWorkMilestone: ProWorkMilestone = {
+  }; //对象
+  id = '';
+  fileList = [];
+
+  /**
+   * 根据id查询数据
+   */
+  getById() {
+    this.isLoadingSave=true;
+    this.proWorkMilestoneService.queryById(this.id).then(response => {
+      if (response.success) {
+        //表数据
+        this.proWorkMilestone = response.result;
+        //文件信息
+        this.fileList=response.result.fileList;
+        //获取文件格式
+        getFileListById(this.fileList);
+      }
+      this.isLoadingSave=false;
+    });
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+}

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

@@ -6,6 +6,8 @@ import { ProjectWorkServiceLogComponent } from './service-log/service-log.compon
 import { ProjectWorkImplementationMilestoneConfirmComponent } from './implementation-milestone-confirm/implementation-milestone-confirm.component';
 import { ProjectWorkDevelopmentMilestoneConfirmComponent } from './development-milestone-confirm/development-milestone-confirm.component';
 import { ProjectWorkServiceMilestoneConfirmComponent } from './service-milestone-confirm/service-milestone-confirm.component';
+import { ProjectWorkProductConfirmationComponent } from './product-confirmation/product-confirmation.component';
+import { ProjectWorkProductConfirmationAddComponent } from './product-confirmation/add/add.component';
 
 const routes: Routes = [
 
@@ -14,7 +16,9 @@ const routes: Routes = [
   { path: 'service-log', component: ProjectWorkServiceLogComponent },
   { path: 'implementation-milestone-confirm', component: ProjectWorkImplementationMilestoneConfirmComponent },
   { path: 'development-milestone-confirm', component: ProjectWorkDevelopmentMilestoneConfirmComponent },
-  { path: 'service-milestone-confirm', component: ProjectWorkServiceMilestoneConfirmComponent }];
+  { path: 'service-milestone-confirm', component: ProjectWorkServiceMilestoneConfirmComponent },
+  { path: 'product-confirmation', component: ProjectWorkProductConfirmationComponent },
+  { path: 'add', component: ProjectWorkProductConfirmationAddComponent }];
 
 @NgModule({
   imports: [RouterModule.forChild(routes)],

+ 10 - 2
src/app/routes/project-work/project-work.module.ts

@@ -25,6 +25,10 @@ import { ProjectWorkServiceLogViewComponent } from './service-log/view/view.comp
 import { ProjectWorkImplementationMilestoneConfirmViewComponent } from './implementation-milestone-confirm/view/view.component';
 import { ProjectWorkDevelopmentMilestoneConfirmViewComponent } from './development-milestone-confirm/view/view.component';
 import { ProjectWorkServiceMilestoneConfirmViewComponent } from './service-milestone-confirm/view/view.component';
+import { ProjectWorkProductConfirmationComponent } from './product-confirmation/product-confirmation.component';
+import { ProjectWorkProductConfirmationAddComponent } from './product-confirmation/add/add.component';
+import { ProjectWorkProductConfirmationUpdateComponent } from './product-confirmation/update/update.component';
+import { ProjectWorkProductConfirmationViewComponent } from './product-confirmation/view/view.component';
 
 const COMPONENTS = [
   ProjectWorkImplementationLogComponent,
@@ -32,7 +36,9 @@ const COMPONENTS = [
   ProjectWorkServiceLogComponent,
   ProjectWorkImplementationMilestoneConfirmComponent,
   ProjectWorkDevelopmentMilestoneConfirmComponent,
-  ProjectWorkServiceMilestoneConfirmComponent];
+  ProjectWorkServiceMilestoneConfirmComponent,
+  ProjectWorkProductConfirmationComponent,
+  ProjectWorkProductConfirmationAddComponent];
 const COMPONENTS_NOROUNT = [
   ProjectWorkImplementationLogAddComponent,
   ProjectWorkImplementationLogUpdateComponent,
@@ -51,7 +57,9 @@ const COMPONENTS_NOROUNT = [
   ProjectWorkServiceLogViewComponent,
   ProjectWorkImplementationMilestoneConfirmViewComponent,
   ProjectWorkDevelopmentMilestoneConfirmViewComponent,
-  ProjectWorkServiceMilestoneConfirmViewComponent];
+  ProjectWorkServiceMilestoneConfirmViewComponent,
+  ProjectWorkProductConfirmationUpdateComponent,
+  ProjectWorkProductConfirmationViewComponent];
 
 @NgModule({
   imports: [

+ 10 - 2
src/app/routes/report-form/project-situation/project-situation.component.html

@@ -6,7 +6,15 @@
         <nz-form-item>
           <nz-form-label [nzSm]="6" [nzXs]="24">项目编码</nz-form-label>
           <nz-form-control [nzSm]="14" [nzXs]="24">
-            <input nz-input name="code" [(ngModel)]="projectStatisticsWhere.proCode" />
+            <input nz-input name="proArchivesCode" [(ngModel)]="projectStatisticsWhere.proArchivesCode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">项目名称</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="proArchivesName" [(ngModel)]="projectStatisticsWhere.proArchivesName" />
           </nz-form-control>
         </nz-form-item>
       </div>
@@ -22,7 +30,7 @@
   </form>
   <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
     <div nz-col [nzSpan]="24">
-      <nz-table  [nzScroll]="{ x: '1930px', y:'550px'}" #expandTable [nzData]="listOfMapData" nzTableLayout="fixed"
+      <nz-table  [nzScroll]="{ x: '1930px', y:'400px'}" class="tableTdPadding" #expandTable [nzData]="listOfMapData" nzTableLayout="fixed"
         nzSize="small" [nzShowPagination]="false" [nzFrontPagination]="false" [nzLoading]="isSpinning">
         <thead>
           <tr>

+ 1 - 1
src/app/routes/report-form/project-situation/project-situation.component.ts

@@ -41,7 +41,7 @@ export class ReportFormProjectSituationComponent implements OnInit {
    */
   getProStatistics() {
     this.isSpinning=true;
-    this.projectStatisticsService.getProStatistics(null).then(response => {
+    this.projectStatisticsService.getProStatistics(this.projectStatisticsWhere).then(response => {
       this.listOfMapData=response.result;
       this.getTreeLoading();
       this.isSpinning=false;

+ 9 - 1
src/app/routes/report-form/project-statistics/project-statistics.component.html

@@ -6,7 +6,15 @@
         <nz-form-item>
           <nz-form-label [nzSm]="6" [nzXs]="24">项目编码</nz-form-label>
           <nz-form-control [nzSm]="14" [nzXs]="24">
-            <input nz-input name="code" [(ngModel)]="projectStatisticsWhere.proCode" />
+            <input nz-input name="proArchivesCode" [(ngModel)]="projectStatisticsWhere.proArchivesCode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">项目名称</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="proArchivesName" [(ngModel)]="projectStatisticsWhere.proArchivesName" />
           </nz-form-control>
         </nz-form-item>
       </div>

+ 1 - 1
src/app/routes/report-form/project-statistics/project-statistics.component.ts

@@ -38,7 +38,7 @@ export class ReportFormProjectStatisticsComponent implements OnInit {
    */
   getCostAccountingData() {
     return new Promise(resolve => {
-      this.projectStatisticsService.getCostAccountingData(null).then(response => {
+      this.projectStatisticsService.getCostAccountingData(this.projectStatisticsWhere).then(response => {
         this.listOfData = response.result;
       });
     });

+ 4 - 2
src/app/routes/routes.module.ts

@@ -14,7 +14,8 @@ import { UserRegisterResultComponent } from './passport/register-result/register
 // single pages
 import { UserLockComponent } from './passport/lock/lock.component';
 import { CallbackComponent } from './callback/callback.component';
-import { BasedataModule } from './basedata/basedata.module';
+import { BasedataModule } from './basedata/basedata.module';
+import { RoutesUploadDownloadComponent } from './upload-download/upload-download.component';
 // 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';
@@ -40,7 +41,8 @@ const COMPONENTS_NOROUNT = [
   // RoutesCommonUploadUrlAddComponent,
   // RoutesMessageNotificationComponent,
   // RoutesCommonSelectContractCodeComponent
-];
+
+  RoutesUploadDownloadComponent];
 
 @NgModule({
   imports: [SharedModule, RouteRoutingModule],

+ 8 - 0
src/app/routes/upload-download/upload-download.component.html

@@ -0,0 +1,8 @@
+<div nz-row [nzGutter]="24">
+  <div nz-col [nzSpan]="6">
+    <nz-upload nzAction="sys/common/uploadFile" [nzFileList]="fileList" nzMultiple=true
+      (nzChange)="handleChange($event)">
+      <button nz-button *ngIf="isDownload"><i nz-icon nzType="upload"></i>上传</button>
+    </nz-upload>
+  </div>
+</div>

+ 24 - 0
src/app/routes/upload-download/upload-download.component.spec.ts

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

+ 64 - 0
src/app/routes/upload-download/upload-download.component.ts

@@ -0,0 +1,64 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { getFileListById } from '@shared/utils/file-show';
+import { environment } from '@env/environment';
+
+@Component({
+  selector: 'app-routes-upload-download',
+  templateUrl: './upload-download.component.html',
+})
+export class RoutesUploadDownloadComponent implements OnInit {
+  
+  constructor(
+    private modal: NzModalRef
+  ) { }
+
+  ngOnInit(): void {
+    //整理文件格式
+    getFileListById(this.fileList);
+  }
+
+  fileList = [];
+  isDownload=true;
+/**
+ * 文件选择事件
+ */
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
+  }
+
+  uploadUrlList=[];//保存的文件对象
+  save(){
+    return new Promise((resolve)=>{
+      this.getFileList();//格式化保存的文件地址
+      this.close()
+      resolve()
+    })
+  }
+
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          },
+        ];
+      });
+    }
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

+ 12 - 0
src/app/services/down-payment-management/manager-payment-and-receipt-slip.service.ts

@@ -38,4 +38,16 @@ export class ManagerPaymentAndReceiptSlipService {
   async update(body: ManagerPaymentAndReceiptSlip): Promise<BaseResponse<any>> {
     return await this.http.put<BaseResponse<any>>('payment/managerPaymentAndReceiptSlip/edit', body).toPromise();
   }
+
+  //财务确认收款数据查询
+  async getFinanceList(body: any): Promise<BaseResponse<Result<any>>> {
+    return await this.http
+      .get<BaseResponse<Result<any>>>('/payment/managerPaymentAndReceiptSlip/getFinanceList', { params: body })
+      .toPromise();
+  }
+
+  //财务确认收款确认
+  async editFinanceList(body: ManagerPaymentAndReceiptSlip): Promise<BaseResponse<any>> {
+    return await this.http.put<BaseResponse<any>>('payment/managerPaymentAndReceiptSlip/editFinanceList', body).toPromise();
+  }
 }