chenc 3 gadi atpakaļ
vecāks
revīzija
8517e26e86

+ 2 - 1
src/app/entity/contract-management/contract-file-product.ts

@@ -40,7 +40,8 @@ export class ContractFileProduct extends Page {
 	sort?:number;
 	/**主表id*/
 	contractFileId?:string;
-
+	/**折扣率 */
+	discountRate?:number;
 	/**合同产品模块子表*/
 	contractFileModularList?:ContractFileModular[];
 }

+ 3 - 1
src/app/routes/contract-management/contract-file/add/add.component.html

@@ -2,6 +2,8 @@
   <nz-tab nzTitle="合同基本信息">
     <app-contract-management-contract-file-add-essential-information #essentialInformation></app-contract-management-contract-file-add-essential-information>
   </nz-tab>
-  <nz-tab nzTitle="产品与模块">Content of Tab Pane 2</nz-tab>
+  <nz-tab nzTitle="产品与模块">
+    <app-contract-management-contract-file-add-product-module #productModule (contractFileObject)="contractFileObject($event)"></app-contract-management-contract-file-add-product-module>
+  </nz-tab>
   <nz-tab nzTitle="收款计划">Content of Tab Pane 3</nz-tab>
 </nz-tabset>

+ 14 - 0
src/app/routes/contract-management/contract-file/add/add.component.ts

@@ -7,6 +7,8 @@ import { BaseArchivesProjectApproval } from 'app/entity/basedata/base-archives-p
 import { ContractManagementContractFileAddEssentialInformationComponent } from './essential-information/essential-information.component';
 import { PersonnelService } from 'app/services/basedata/personnel.service';
 import { recursiveQuery } from '@shared';
+import { ContractManagementContractFileAddProductModuleComponent } from './product-module/product-module.component';
+import { ContractFile } from 'app/entity/contract-management/contract-file';
 
 @Component({
   selector: 'app-contract-management-contract-file-add',
@@ -29,6 +31,9 @@ export class ContractManagementContractFileAddComponent implements OnInit {
   //基本信息组件
   @ViewChild('essentialInformation')
   essentialInformation: ContractManagementContractFileAddEssentialInformationComponent;
+  //产品与模块组件
+  @ViewChild('productModule')
+  productModule: ContractManagementContractFileAddProductModuleComponent;
 
   /**
    * 查询项目立项
@@ -69,5 +74,14 @@ export class ContractManagementContractFileAddComponent implements OnInit {
     });
   }
 
+  /**
+   * 产品与模块改变数据传值到其他页面
+   */
+  contractFileObject(contractFile:ContractFile){
+    console.log(contractFile)
+    //产品中计算的标准报价总和传入基本信息
+    this.essentialInformation.contractFile.standardQuotation=contractFile.standardQuotation;
+  }
+
   close() {}
 }

+ 1 - 1
src/app/routes/contract-management/contract-file/add/essential-information/essential-information.component.html

@@ -170,7 +170,7 @@
           <nz-form-label [nzSpan]="'vertical' ? 24 : null">标准报价</nz-form-label>
           <nz-form-explain>
             <nz-input-number [(ngModel)]="contractFile.standardQuotation" formControlName="standardQuotation"
-              id="standardQuotation" [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+              id="standardQuotation" [nzDisabled]="true" [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
             </nz-input-number>
           </nz-form-explain>
         </nz-form-item>

+ 2 - 2
src/app/routes/contract-management/contract-file/add/essential-information/essential-information.component.ts

@@ -57,8 +57,8 @@ export class ContractManagementContractFileAddEssentialInformationComponent impl
   proList: any = []; //项目下拉集合
   businessTypeDictList: any = []; //业务类型集合
   salesStaffList:any=[];//销售人员tree下拉数据
-  formatterDollar = (value: number): string => `$ ${value}`;
-  parserDollar = (value: string): string => value.replace('$ ', '');
+  formatterDollar = (value: number): string => `¥ ${value}`;
+  parserDollar = (value: string): string => value.replace('¥ ', '');
 
   /**
    * 项目名称下拉款触发事件

+ 121 - 0
src/app/routes/contract-management/contract-file/add/product-module/product-module.component.html

@@ -0,0 +1,121 @@
+<!-- 产品 -->
+<nz-card nzTitle="产品">
+  <!-- 操作按钮 -->
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <button nz-button (click)="productAddRow()" nzType="primary">新增</button>
+      <br />
+      <br />
+    </div>
+  </div>
+  <!-- 表格 -->
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <nz-table #productRowTable nzSize="small" class="tableTdPadding" nzBordered [nzData]="productList">
+        <thead>
+          <tr>
+            <th nzWidth="10%">产品编码</th>
+            <th nzWidth="17%">产品名称</th>
+            <th nzWidth="9%">折扣率</th>
+            <th nzWidth="9%">标准报价</th>
+            <th nzWidth="9%">折扣后单价</th>
+            <th nzWidth="9%">标准金额</th>
+            <th nzWidth="9%">折扣后金额</th>
+            <th nzWidth="9%">成本单价</th>
+            <th nzWidth="9%">成本金额</th>
+            <th nzWidth="10%">操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of productRowTable.data" class="editable-row">
+            <td><input type="text" nz-input [(ngModel)]="data.code" /></td>
+            <td><input type="text" nz-input [(ngModel)]="data.name" /></td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.discountRate"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [nzDisabled]="true" [(ngModel)]="data.standardQuotation" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.unitPriceAfterDiscount" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.standardAmount" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.amountAfterDiscount" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.costUnitPrice" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <nz-input-number [nzMin]="0" [(ngModel)]="data.costAmount" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td>
+              <a nz-popconfirm nzTitle="{{ 'confirm.to.delete' | translate }}?" nzOkText="{{ 'yes' | translate }}"
+                nzCancelText="{{ 'no' | translate }}"
+                (nzOnConfirm)="productDeleteRow(data.id)">{{ 'table.delete' | translate }}</a>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>
+
+<nz-card nzTitle="模块">
+  <nz-tabset>
+    <nz-tab *ngFor="let product of productList" [nzTitle]="product.name">
+      <!-- 操作按钮 -->
+      <div nz-row [nzGutter]="24">
+        <div nz-col [nzSpan]="24">
+          <button nz-button (click)="moduleAddRow(product)" nzType="primary">新增</button>
+          <br />
+          <br />
+        </div>
+      </div>
+      <!-- 表格 -->
+      <div nz-row [nzGutter]="24">
+        <div nz-col [nzSpan]="24">
+          <nz-table #moduleRowTable nzSize="small" class="tableTdPadding" nzBordered
+            [nzData]="product.contractFileModularList">
+            <thead>
+              <tr>
+                <th nzWidth="30%">产品模块编码</th>
+                <th nzWidth="30%">产品模块名称</th>
+                <th nzWidth="10%">标准报价</th>
+                <th nzWidth="10%">采购价格</th>
+                <th nzWidth="20%">操作</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr *ngFor="let data of moduleRowTable.data" class="editable-row">
+                <td><input type="text" nz-input [(ngModel)]="data.code" /></td>
+                <td><input type="text" nz-input [(ngModel)]="data.name" /></td>
+                <td>
+                  <nz-input-number [nzMin]="0" [(ngModel)]="data.standardQuotation" [nzFormatter]="formatterDollar"
+                    [nzParser]="parserDollar" (ngModelChange)="standardQuotationModuleKeyUp(product)"></nz-input-number>
+                </td>
+                <td>
+                  <nz-input-number [nzMin]="0" [(ngModel)]="data.purchasePrice" [nzFormatter]="formatterDollar"
+                    [nzParser]="parserDollar"></nz-input-number>
+                </td>
+                <td>
+                  <a nz-popconfirm nzTitle="{{ 'confirm.to.delete' | translate }}?" nzOkText="{{ 'yes' | translate }}"
+                    nzCancelText="{{ 'no' | translate }}"
+                    (nzOnConfirm)="moduleDeleteRow(product,data.id)">{{ 'table.delete' | translate }}</a>
+                </td>
+              </tr>
+            </tbody>
+          </nz-table>
+        </div>
+      </div>
+    </nz-tab>
+  </nz-tabset>
+</nz-card>

+ 24 - 0
src/app/routes/contract-management/contract-file/add/product-module/product-module.component.spec.ts

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

+ 130 - 0
src/app/routes/contract-management/contract-file/add/product-module/product-module.component.ts

@@ -0,0 +1,130 @@
+import { Component, OnInit, Output, EventEmitter } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { ContractFileProduct } from 'app/entity/contract-management/contract-file-product';
+import { ContractFileModular } from 'app/entity/contract-management/contract-file-modular';
+import { ContractFile } from 'app/entity/contract-management/contract-file';
+
+@Component({
+  selector: 'app-contract-management-contract-file-add-product-module',
+  templateUrl: './product-module.component.html',
+})
+export class ContractManagementContractFileAddProductModuleComponent implements OnInit {
+  constructor() {}
+  ngOnInit(): void {}
+
+  productList: ContractFileProduct[] = []; //产品数据
+  // moduleList:ContractFileModular[]=[];//模块数据
+  formatterDollar = (value: number): string => `¥ ${value}`;
+  parserDollar = (value: string): string => value.replace('¥ ', '');
+
+  /**
+   * 产品新增行
+   */
+  prouctI = 0;
+  productAddRow() {
+    this.productList = [
+      ...this.productList,
+      {
+        id: `${this.prouctI}`,
+        code: '',
+        name: '',
+        discountRate: 0,
+        standardQuotation: 0,
+        unitPriceAfterDiscount: 0,
+        standardAmount: 0,
+        amountAfterDiscount: 0,
+        costUnitPrice: 0,
+        costAmount: 0,
+        contractFileModularList: [],
+      },
+    ];
+    this.prouctI++;
+  }
+
+  /**
+   * 产品删除行
+   */
+  productDeleteRow(id) {
+    this.productList = this.productList.filter(d => d.id !== id);
+  }
+
+  /**
+   * 模块新增行
+   */
+  moduleI = 0;
+  moduleAddRow(product) {
+    product.contractFileModularList = [
+      ...product.contractFileModularList,
+      {
+        id: `${this.moduleI}`,
+        code: '',
+        name: '',
+        standardQuotation: 0,
+        purchasePrice: 0,
+      },
+    ];
+    this.moduleI++;
+  }
+
+  /**
+   * 模块删除行
+   */
+  moduleDeleteRow(product, id) {
+    product.contractFileModularList = product.contractFileModularList.filter(d => d.id !== id);
+  }
+
+  /**
+   * 模块标准报价键盘弹起事件
+   * @param product 产品对象
+   */
+  standardQuotationModuleKeyUp(product){
+    //判断当前产品下是否存在模块
+    if(product&&product.contractFileModularList){
+      let standardQuotationTotal=0.0;//定义模块中标准报价总计
+      //循环模块
+      product.contractFileModularList.forEach(element => {
+        //判断标准报价是否为数字
+        if(!isNaN(Number(element.standardQuotation))){
+          //累加
+          standardQuotationTotal=standardQuotationTotal+Number(element.standardQuotation);
+        }
+      });
+      //把模块标准报价总和赋值给产品的标准报价
+      product.standardQuotation=standardQuotationTotal;
+      //获取品总标准报价并传入基本信息
+      this.getContractFileStandardQuotationTotal();
+    }
+  }
+
+  /**
+   * 获取合同总共的标准报价
+   */
+  
+  getContractFileStandardQuotationTotal(){
+    if(this.productList){
+      let standardQuotationProductTotal=0.0;//定义产品中标准报价总计
+      this.productList.forEach(element => {
+        //判断标准报价是否为数字
+        if(!isNaN(Number(element.standardQuotation))){
+          //累加
+          standardQuotationProductTotal=standardQuotationProductTotal+Number(element.standardQuotation);
+        }
+      });
+      //把产品的总标准报价给合同标准报价
+      this.contractFile.standardQuotation=standardQuotationProductTotal;
+      //传给基本信息
+      this.outContractFileObject();
+    }
+  }
+
+  contractFile:ContractFile={}//合同的对象
+  /**
+   * 获取当前页面的相关信息传个父级页面
+   */
+  @Output() contractFileObject = new EventEmitter<{}>();
+  outContractFileObject(){
+    this.contractFileObject.emit(this.contractFile);
+  }
+  close() {}
+}

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

@@ -4,12 +4,14 @@ import { ContractManagementRoutingModule } from './contract-management-routing.m
 import { ContractManagementContractFileComponent } from './contract-file/contract-file.component';
 import { ContractManagementContractFileAddComponent } from './contract-file/add/add.component';
 import { ContractManagementContractFileAddEssentialInformationComponent } from './contract-file/add/essential-information/essential-information.component';
+import { ContractManagementContractFileAddProductModuleComponent } from './contract-file/add/product-module/product-module.component';
 
 const COMPONENTS = [
   ContractManagementContractFileComponent];
 const COMPONENTS_NOROUNT = [
   ContractManagementContractFileAddComponent,
-  ContractManagementContractFileAddEssentialInformationComponent];
+  ContractManagementContractFileAddEssentialInformationComponent,
+  ContractManagementContractFileAddProductModuleComponent];
 
 @NgModule({
   imports: [