Browse Source

Merge branch 'master' of http://139.196.39.194:9021/chenc/cd-project-management-web

liangyan0105 3 years ago
parent
commit
0c90c4bece
18 changed files with 935 additions and 8 deletions
  1. 35 0
      src/app/entity/contract-management/contract-file-and-business.ts
  2. 24 0
      src/app/entity/contract-management/contract-file-modular.ts
  3. 46 0
      src/app/entity/contract-management/contract-file-product.ts
  4. 84 0
      src/app/entity/contract-management/contract-file.ts
  5. 7 0
      src/app/routes/contract-management/contract-file/add/add.component.html
  6. 24 0
      src/app/routes/contract-management/contract-file/add/add.component.spec.ts
  7. 73 0
      src/app/routes/contract-management/contract-file/add/add.component.ts
  8. 313 0
      src/app/routes/contract-management/contract-file/add/essential-information/essential-information.component.html
  9. 24 0
      src/app/routes/contract-management/contract-file/add/essential-information/essential-information.component.spec.ts
  10. 193 0
      src/app/routes/contract-management/contract-file/add/essential-information/essential-information.component.ts
  11. 9 0
      src/app/routes/contract-management/contract-file/contract-file.component.html
  12. 24 0
      src/app/routes/contract-management/contract-file/contract-file.component.spec.ts
  13. 62 0
      src/app/routes/contract-management/contract-file/contract-file.component.ts
  14. 3 1
      src/app/routes/contract-management/contract-management-routing.module.ts
  15. 8 2
      src/app/routes/contract-management/contract-management.module.ts
  16. 0 4
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.html
  17. 2 0
      src/app/routes/routes-routing.module.ts
  18. 4 1
      src/app/services/basedata/customer.service.ts

+ 35 - 0
src/app/entity/contract-management/contract-file-and-business.ts

@@ -0,0 +1,35 @@
+import { Page } from '../page';
+/**
+ * 合同收款计划
+ */
+export class ContractFileAndBusiness extends Page {
+    id?:string;
+	//项目档案id
+	contractFileId?:string;
+	//计划类型 1.商务 2.实施 3.开发 4.服务
+	planType?:number;
+	//计划名称
+	planName?:string;
+	//第一笔
+	price1?:number;
+	//第二笔
+	price2?:number;
+	//第三笔
+	price3?:number;
+	//第四笔
+	price4?:number;
+	//第五笔
+	price5?:number;
+	//对应里程碑1
+	milestone1?:string;
+	//对应里程碑2
+	milestone2?:string;
+	//对应里程碑3
+	milestone3?:string;
+	//对应里程碑4
+	milestone4?:string;
+	//对应里程碑5
+	milestone5?:string;
+	//组织
+	pkOrg?:string;
+}

+ 24 - 0
src/app/entity/contract-management/contract-file-modular.ts

@@ -0,0 +1,24 @@
+import { Page } from '../page';
+/**
+ * 合同产品模块
+ */
+export class ContractFileModular extends Page {
+    /**主键*/
+	id?:string;
+	/**产品模块编码*/
+	code?:string;
+	/**产品模块名称*/
+	name?:string;
+	/**标准价格*/
+	standardQuotation?:number;
+	/**采购价格*/
+	purchasePrice?:number;
+	/**合同产品id*/
+	contractFileProductId?:string;
+	/**组织*/
+	pkOrg?:string;
+	/**排序*/
+	sort?:number;
+	/**主表id*/
+	contractFileId?:string;
+}

+ 46 - 0
src/app/entity/contract-management/contract-file-product.ts

@@ -0,0 +1,46 @@
+import { Page } from '../page';
+import { ContractFileModular } from './contract-file-modular';
+/**
+ * 合同产品
+ */
+export class ContractFileProduct extends Page {
+    /**主键*/
+	id?:string;
+	/**产品编码*/
+	code?:string;
+	/**产品名称*/
+	name?:string;
+	/**物料档案产品id*/
+	baseMaterialFileProductId?:string;
+	/**标准报价*/
+	standardQuotation?:number;
+	/**折扣后单价*/
+	unitPriceAfterDiscount?:number;
+	/**标准金额*/
+	standardAmount?:number;
+	/**折扣后金额*/
+	amountAfterDiscount?:number;
+	/**成本单价*/
+	costUnitPrice?:number;
+	/**成本金额*/
+	costAmount?:number;
+	/**备注*/
+	memo?:string;
+	/**创建时间yyyy-MM-dd HH:mm:ss*/
+	createTime?:string;
+	/**创建人*/
+	createBy?:string;
+	/**修改时间yyyy-MM-dd HH:mm:ss*/
+	updateTime?:string;
+	/**修改人*/
+	updateBy?:string;
+	/**组织*/
+	pkOrg?:string;
+	/**排序*/
+	sort?:number;
+	/**主表id*/
+	contractFileId?:string;
+
+	/**合同产品模块子表*/
+	contractFileModularList?:ContractFileModular[];
+}

+ 84 - 0
src/app/entity/contract-management/contract-file.ts

@@ -0,0 +1,84 @@
+import { Page } from '../page';
+import { ContractFileProduct } from './contract-file-product';
+import { ContractFileAndBusiness } from './contract-file-and-business';
+/**
+ * 合同档案主表基本信息
+ */
+export class ContractFile extends Page {
+    /**主键*/
+	 id?:string;
+	/**合同日期yyyy-MM-dd*/
+	contractDate?:string;
+	/**合同编码*/
+	 code?:string;
+	/**合同概述*/
+	 overview?:string;
+	/**业务类型(数据字典)*/
+	 businessTypeDictId?:string;
+	/**客户id(客户档案id)*/
+	 fdCustomerId?:string;
+	/**客户人员id(客户档案联系人id)*/
+	 fdCustomerPersonnelId?:string;
+	/**销售部门id*/
+	 salesDepartmentId?:string;
+	/**销售部门名称*/
+	 salesDepartmentName?:string;
+	/**免费售后起始yyyy-MM-dd*/
+	freeAfterSalesStart?:string;
+	/**免费售后截至yyyy-MM-dd*/
+	freeAfterSalesEnd?:string;
+	/**标准报价*/
+	standardQuotation?:number;
+	/**成交金额*/
+	transactionAmount?:number;
+	/**折扣率*/
+	discountRate?:number;
+	/**赠品金额*/
+	giftAmount?:number;
+	/**成本*/
+	cost?:number;
+	/**合同费用*/
+	contractCost?:number;
+	/**合同利润*/
+	contractProfit?:number;
+	/**备注*/
+	memo?:string;
+	/**应收账款*/
+	accountsReceivable?:number;
+	/**业绩计算率*/
+	performanceCalculationRate?:number;
+	/**创建时间yyyy-MM-dd HH:mm:ss*/
+	createTime?:string;
+	/**创建人*/
+	 createBy?:string;
+	/**修改时间yyyy-MM-dd HH:mm:ss*/
+	updateTime?:string;
+	/**修改人*/
+	 updateBy?:string;
+	/**组织*/
+	 pkOrg?:string;
+	/**里程碑类型id(数据字典)*/
+	 milestoneId?:string;
+	 /**项目理想id */
+	 proId?:string;
+	/**销售人员id*/
+	salesmanId?:string;
+	/**销售人员名称*/
+	salesmanName?:string;
+
+	 //显示
+	 /**客户名称 */
+	 fdCustomerName?:string;
+	 /**客户人员名称 */
+	 fdCustomerPersonnelName?:string;
+	 /**客户人员电话 */
+	 fdCustomerPersonnelTel?:string;
+	 /**客户地址 */
+	 fdCustomeraddress?:string;
+
+	/**合同产品子表*/
+	contractFileProductList?:ContractFileProduct[];
+
+	/**合同收款计划子表*/
+	contractFileAndBusinessList?:ContractFileAndBusiness[];
+}

+ 7 - 0
src/app/routes/contract-management/contract-file/add/add.component.html

@@ -0,0 +1,7 @@
+<nz-tabset nzTabPosition="left">
+  <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="收款计划">Content of Tab Pane 3</nz-tab>
+</nz-tabset>

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

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

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

@@ -0,0 +1,73 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { BaseArchivesProjectApprovalService } from 'app/services/basedata/base-archives-project-approval.service';
+import { DictService } from 'app/services/dict.service';
+import { BaseArchivesProjectApproval } from 'app/entity/basedata/base-archives-project-approval';
+import { ContractManagementContractFileAddEssentialInformationComponent } from './essential-information/essential-information.component';
+import { PersonnelService } from 'app/services/basedata/personnel.service';
+import { recursiveQuery } from '@shared';
+
+@Component({
+  selector: 'app-contract-management-contract-file-add',
+  templateUrl: './add.component.html',
+})
+export class ContractManagementContractFileAddComponent implements OnInit {
+  constructor(
+    private baseArchivesProjectApprovalService: BaseArchivesProjectApprovalService,
+    private dictService: DictService,
+    private personnelService: PersonnelService,
+  ) {}
+
+  ngOnInit(): void {
+    this.getDictList().then(() => {
+      return this.getProList();
+    }).then(()=>{
+      return this.getSalesStaffTree();
+    });
+  }
+  //基本信息组件
+  @ViewChild('essentialInformation')
+  essentialInformation: ContractManagementContractFileAddEssentialInformationComponent;
+
+  /**
+   * 查询项目立项
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let baseArchivesProjectApproval = new BaseArchivesProjectApproval();
+      baseArchivesProjectApproval.pkOrg = sessionStorage.getItem('pkOrg');
+      this.baseArchivesProjectApprovalService.getTreeList(baseArchivesProjectApproval).then(response => {
+        this.essentialInformation.proList = JSON.parse(JSON.stringify(response.result));
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 获取数据字典数据
+   */
+  getDictList() {
+    return new Promise(resolve => {
+      this.dictService.getByDictCode('business_type').then(response => {
+        this.essentialInformation.businessTypeDictList = JSON.parse(JSON.stringify(response.result));
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 获取销售人员下拉
+   */
+  getSalesStaffTree() {
+    return new Promise(resolve => {
+      this.personnelService.queryApprover(sessionStorage.getItem('pkOrg')).then(res => {
+        this.essentialInformation.salesStaffList = JSON.parse(JSON.stringify(res.result));
+        recursiveQuery(this.essentialInformation.salesStaffList);
+        resolve();
+      });
+    });
+  }
+
+  close() {}
+}

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

@@ -0,0 +1,313 @@
+<!-- 基本信息 -->
+<form nz-form [formGroup]="validateForm" (ngSubmit)="submitForm()">
+  <nz-card>
+    <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">
+            <input nz-input placeholder="自动生成" disabled="true" />
+          </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-tree-select style="width: 100%" [nzNodes]="proList" nzShowSearch [nzMultiple]="false"
+              formControlName="proId" id="proId" nzPlaceHolder="请选择" [(ngModel)]="contractFile.proId"
+              [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="proChange($event)">
+            </nz-tree-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" nzRequired>免费售后起始</nz-form-label>
+          <nz-form-control>
+            <nz-date-picker nzFormat="yyyy-MM-dd" formControlName="freeAfterSalesStart" id="freeAfterSalesStart"
+              [(ngModel)]="contractFile.freeAfterSalesStart" [nzDisabledDate]="disabledDate"></nz-date-picker>
+            <nz-form-explain
+              *ngIf="validateForm.get('freeAfterSalesStart')?.dirty && validateForm.get('freeAfterSalesStart')?.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-explain>
+            <nz-date-picker nzFormat="yyyy-MM-dd" formControlName="freeAfterSalesEnd" id="freeAfterSalesEnd"
+              [(ngModel)]="contractFile.freeAfterSalesEnd" [nzDisabledDate]="disabledDate2"></nz-date-picker>
+            <nz-form-explain
+              *ngIf="validateForm.get('freeAfterSalesEnd')?.dirty && validateForm.get('freeAfterSalesEnd')?.errors">
+              请选择免费售后截至
+            </nz-form-explain>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+    </div>
+    <div nz-row [nzGutter]="24">
+      <!-- 合同概述 -->
+      <div nz-col [nzSpan]="24">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">合同概述</nz-form-label>
+          <nz-form-control [nzSm]="24" [nzXs]="24">
+            <textarea rows="2" formControlName="overview" id="overview" nz-input [(ngModel)]="contractFile.overview"
+              placeholder="请输入合同概述"></textarea>
+          </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" nzRequired>客户</nz-form-label>
+          <nz-form-control [nzSm]="24" [nzXs]="24">
+            <nz-input-group nzSearch [nzAddOnAfter]="suffixIconButton">
+              <input type="text" [(ngModel)]="contractFile.fdCustomerName" formControlName="fdCustomerName"
+                id="fdCustomerName" nz-input placeholder="{{ 'select.please.choose' | translate }}" disabled="true" />
+            </nz-input-group>
+            <ng-template #suffixIconButton>
+              <!-- 放大镜  勾选列表 -->
+              <button nz-button nzType="primary" nzSearch (click)="modalTable()">
+                <i nz-icon type="search"></i>
+              </button>
+            </ng-template>
+            <nz-form-explain
+              *ngIf="validateForm.get('fdCustomerName')?.dirty && validateForm.get('fdCustomerName')?.errors">
+              请选择客户
+            </nz-form-explain>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="18">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">客户地址</nz-form-label>
+          <nz-form-control [nzSm]="24" [nzXs]="24">
+            <input disabled="true" nz-input [(ngModel)]="contractFile.fdCustomeraddress"
+              formControlName="fdCustomeraddress" id="fdCustomeraddress" placeholder="客户地址" [disabled]="true" />
+          </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" nzRequired>客户人员</nz-form-label>
+          <nz-form-control>
+            <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="fdCustomerPersonnelId"
+              id="fdCustomerPersonnelId" [(ngModel)]="contractFile.fdCustomerPersonnelId" nzPlaceHolder="请选择"
+              (ngModelChange)="fdCustomerPersonnelChange($event)">
+              <nz-option *ngFor="let i of fdCustomerPersonnelList" [nzValue]="i.id" [nzLabel]="i.contactPsn">
+              </nz-option>
+            </nz-select>
+            <nz-form-explain
+              *ngIf="validateForm.get('fdCustomerPersonnelId')?.dirty && validateForm.get('fdCustomerPersonnelId')?.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>
+            <input disabled="true" nz-input [(ngModel)]="contractFile.fdCustomerPersonnelTel"
+              formControlName="fdCustomerPersonnelTel" id="fdCustomerPersonnelTel" placeholder="客户地址"
+              [disabled]="true" />
+          </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>
+            <nz-tree-select [nzNodes]="salesStaffList" nzShowSearch formControlName="salesmanId" id="salesmanId"
+              nzAllowClear="false" [(ngModel)]="contractFile.salesmanId" (ngModelChange)="onChangeSalesmanId($event)"
+              nzPlaceHolder="{{ 'select.please.choose' | translate }}"></nz-tree-select>
+            <nz-form-explain *ngIf="validateForm.get('salesmanId')?.dirty && validateForm.get('salesmanId')?.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">
+            <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="businessTypeDictId"
+              id="businessTypeDictId" [(ngModel)]="contractFile.businessTypeDictId" nzPlaceHolder="请选择"
+              (ngModelChange)="businessTypeDictIdChange($event)">
+              <nz-option *ngFor="let i of businessTypeDictList" [nzValue]="i.value" [nzLabel]="i.text"></nz-option>
+            </nz-select>
+            <nz-form-explain
+              *ngIf="validateForm.get('businessTypeDictId')?.dirty && validateForm.get('businessTypeDictId')?.errors">
+              请选择业务类型
+            </nz-form-explain>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </nz-card>
+  <nz-card>
+    <div nz-row [nzGutter]="24">
+      <!-- 标准报价 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <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">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 成交金额 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">成交金额</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.transactionAmount" formControlName="transactionAmount"
+              id="transactionAmount" [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 折扣率 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">折扣率</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.discountRate" formControlName="discountRate" id="discountRate"
+              [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 赠品金额 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">赠品金额</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.giftAmount" formControlName="giftAmount" id="giftAmount"
+              [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 成本 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">成本</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.cost" formControlName="cost" id="cost" [nzMin]="0"
+              [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 合同费用 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">合同费用</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.contractCost" formControlName="contractCost" id="contractCost"
+              [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+    </div>
+    <div nz-row [nzGutter]="24">
+      <!-- 合同利润 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">合同利润</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.contractProfit" formControlName="contractProfit"
+              id="contractProfit" [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 应收款账 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">应收款账</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.accountsReceivable" formControlName="accountsReceivable"
+              id="accountsReceivable" [nzMin]="0" [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 业绩计算率 -->
+      <div nz-col [nzSpan]="4">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">业绩计算率</nz-form-label>
+          <nz-form-explain>
+            <nz-input-number [(ngModel)]="contractFile.performanceCalculationRate"
+              formControlName="performanceCalculationRate" id="performanceCalculationRate" [nzMin]="0"
+              [nzFormatter]="formatterDollar" [nzParser]="parserDollar">
+            </nz-input-number>
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+    </div>
+  </nz-card>
+  <nz-card>
+    <div nz-row [nzGutter]="24">
+      <!-- 制单人 -->
+      <div nz-col [nzSpan]="12">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">制单人</nz-form-label>
+          <nz-form-explain>
+            xxx
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 制单时间 -->
+      <div nz-col [nzSpan]="12">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">制单人</nz-form-label>
+          <nz-form-explain>
+            xxx
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+    </div>
+    <div nz-row [nzGutter]="24">
+      <!-- 修改人 -->
+      <div nz-col [nzSpan]="12">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">修改人</nz-form-label>
+          <nz-form-explain>
+            xxx
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+      <!-- 修改时间 -->
+      <div nz-col [nzSpan]="12">
+        <nz-form-item>
+          <nz-form-label [nzSpan]="'vertical' ? 24 : null">修改时间</nz-form-label>
+          <nz-form-explain>
+            xxx
+          </nz-form-explain>
+        </nz-form-item>
+      </div>
+    </div>
+  </nz-card>
+</form>

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

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

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

@@ -0,0 +1,193 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzModalService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { FormGroup, Validators, FormBuilder } from '@angular/forms';
+import { ContractFile } from 'app/entity/contract-management/contract-file';
+import { BaseArchivesProjectApproval } from 'app/entity/basedata/base-archives-project-approval';
+import { BaseArchivesProjectApprovalService } from 'app/services/basedata/base-archives-project-approval.service';
+import { DictService } from 'app/services/dict.service';
+import { BasedataCustomerModalTableComponent } from 'app/routes/basedata/customer/modal-table/modal-table.component';
+import { CustomerService } from 'app/services/basedata/customer.service';
+
+@Component({
+  selector: 'app-contract-management-contract-file-add-essential-information',
+  templateUrl: './essential-information.component.html',
+})
+export class ContractManagementContractFileAddEssentialInformationComponent implements OnInit {
+  constructor(private fb: FormBuilder, private modalService: NzModalService,
+    private customerService:CustomerService) {}
+
+  validateForm!: FormGroup;
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      overview: [],
+      businessTypeDictId: [],
+      fdCustomerName:[null, [Validators.required]],
+      fdCustomerPersonnelId:[null, [Validators.required]],
+      fdCustomeraddress:[],
+      fdCustomerPersonnelTel:[],
+      salesmanId:[null, [Validators.required]],
+      freeAfterSalesStart:[null, [Validators.required]],
+      freeAfterSalesEnd:[null, [Validators.required]],
+      standardQuotation:[],
+      transactionAmount:[],
+      discountRate:[],
+      giftAmount:[],
+      cost:[],
+      contractCost:[],
+      contractProfit:[],
+      accountsReceivable:[],
+      performanceCalculationRate:[]
+    });
+  }
+
+  contractFile: ContractFile = {
+    standardQuotation:0,
+    transactionAmount:0,
+    discountRate:0,
+    giftAmount:0,
+    cost:0,
+    contractCost:0,
+    contractProfit:0,
+    accountsReceivable:0,
+    performanceCalculationRate:0
+  }; //合同对象
+  proList: any = []; //项目下拉集合
+  businessTypeDictList: any = []; //业务类型集合
+  salesStaffList:any=[];//销售人员tree下拉数据
+  formatterDollar = (value: number): string => `$ ${value}`;
+  parserDollar = (value: string): string => value.replace('$ ', '');
+
+  /**
+   * 项目名称下拉款触发事件
+   */
+  proChange(event) {
+    if (!event) {
+      this.contractFile.proId = '';
+    }
+  }
+
+  /**
+   * 客户选择
+   */
+  modalTable() {
+    this.getLdCustomerPersonnelList("");
+    const modalRef = this.modalService.create({
+      nzTitle: '选择客户',
+      nzContent: BasedataCustomerModalTableComponent,
+      nzWidth: 1400,
+      nzFooter: [
+        {
+          label: '关闭',
+          type: 'default',
+          onClick: addModel => {
+            addModel.handleCancel();
+          },
+        },
+        {
+          label: '确定',
+          type: 'primary',
+          onClick: addModel => {
+            addModel.handleOk();
+            // addModel.selectObj 包含勾选项的 id 和 name
+            this.contractFile.fdCustomerName = addModel.selectObj[0].name;
+            this.contractFile.fdCustomerId = addModel.selectObj[0].id;
+          },
+        },
+      ],
+    });
+  }
+
+  /**
+   * 根据客户获取客户人员数据
+   */
+  fdCustomerPersonnelList:any=[]
+  getLdCustomerPersonnelList(customerId){
+    return new Promise((resolve)=>{
+      this.customerService.getContactsByMainId("4d0df0dc441aff4655d8aa4380b194dc").then((response)=>{
+        this.fdCustomerPersonnelList=response.result
+        resolve();
+      })
+    })
+  }
+
+  /**
+   * 客户人员选择事件
+   */
+  fdCustomerPersonnelChange(event){
+    if(event){
+      this.fdCustomerPersonnelList.forEach(element => {
+        if(element.id==event){
+          this.contractFile.fdCustomerPersonnelTel=element.contectTel
+        }
+      });
+    }else{
+      this.contractFile.fdCustomerPersonnelId=""
+      this.contractFile.fdCustomerPersonnelTel=""
+    }
+  }
+
+  /**
+   * 业务类型选择事件
+   */
+  businessTypeDictIdChange(event){
+    if(!event){
+      this.contractFile.businessTypeDictId="";
+    }
+  }
+
+  /**
+   * 销售人员选择时间
+   * @param event 
+   */
+  onChangeSalesmanId(event){
+    if(event){
+      //获取人员名称
+      this.salesStaffList.forEach(pkOrg => {
+        pkOrg.children.forEach(depart => {
+          depart.children.forEach(personnel => {
+            if (personnel.key === event) {
+              this.contractFile.salesmanName=personnel.name;
+            }
+          });
+        });
+      });
+    }else{
+      this.contractFile.salesmanName=""
+    }
+  }
+
+  /**
+   * 免费售后起始
+   */
+  disabledDate = (current: Date): boolean => {
+    // Can not select days before today and today
+    if(this.contractFile.freeAfterSalesEnd){
+      let end=new Date(this.contractFile.freeAfterSalesEnd);//结束时间
+      //开始时间大于结束时间的禁用
+      return current.getTime()>end.getTime();
+    }else{
+      return false;
+    }
+  };
+
+  /**
+   * 免费售后截至
+   */
+  disabledDate2 = (current: Date): boolean => {
+    // Can not select days before today and today
+    if(this.contractFile.freeAfterSalesStart){
+      let start=new Date(this.contractFile.freeAfterSalesStart);//开始时间
+      //结束时间小于开始时间禁用
+      return current.getTime()<start.getTime();
+    }else{
+      return false;
+    }
+  };
+
+  submitForm() {}
+
+  close() {}
+}

+ 9 - 0
src/app/routes/contract-management/contract-file/contract-file.component.html

@@ -0,0 +1,9 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <button (click)="add()" nz-button nzType="primary">新建</button>
+  </ng-template>
+</page-header>
+<nz-card>
+  <sf mode="search" [schema]="searchSchema" (formSubmit)="st.reset($event)" (formReset)="st.reset($event)"></sf>
+  <st #st [data]="url" [columns]="columns"></st>
+</nz-card>

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

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

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

@@ -0,0 +1,62 @@
+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 { NzDrawerService } from 'ng-zorro-antd';
+import { ContractManagementContractFileAddComponent } from './add/add.component';
+import { I18NService } from '@core';
+
+@Component({
+  selector: 'app-contract-management-contract-file',
+  templateUrl: './contract-file.component.html',
+})
+export class ContractManagementContractFileComponent implements OnInit {
+  url = `/user`;
+  searchSchema: SFSchema = {
+    properties: {
+      no: {
+        type: 'string',
+        title: '编号'
+      }
+    }
+  };
+  @ViewChild('st') st: STComponent;
+  columns: STColumn[] = [
+    { title: '编号', index: 'no' },
+    { title: '调用次数', type: 'number', index: 'callNo' },
+    { title: '头像', type: 'img', width: '50px', index: 'avatar' },
+    { title: '时间', type: 'date', index: 'updatedAt' },
+    {
+      title: '',
+      buttons: [
+        // { text: '查看', click: (item: any) => `/form/${item.id}` },
+        // { text: '编辑', type: 'static', component: FormEditComponent, click: 'reload' },
+      ]
+    }
+  ];
+
+  constructor(private nzDrawerService:NzDrawerService,private i18NService:I18NService) { }
+
+  ngOnInit() { }
+
+  add() {
+    const drawerRef = this.nzDrawerService.create({
+      nzTitle: this.i18NService.fanyi("button.add"),//新增标题
+      nzContent: ContractManagementContractFileAddComponent,
+      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();
+      }
+    });
+  }
+
+}

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

@@ -1,8 +1,10 @@
 import { NgModule } from '@angular/core';
 import { Routes, RouterModule } from '@angular/router';
+import { ContractManagementContractFileComponent } from './contract-file/contract-file.component';
 
 const routes: Routes = [
-];
+
+  { path: 'contract-file', component: ContractManagementContractFileComponent }];
 
 @NgModule({
   imports: [RouterModule.forChild(routes)],

+ 8 - 2
src/app/routes/contract-management/contract-management.module.ts

@@ -1,9 +1,15 @@
 import { NgModule } from '@angular/core';
 import { SharedModule } from '@shared';
 import { ContractManagementRoutingModule } from './contract-management-routing.module';
+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';
 
-const COMPONENTS = [];
-const COMPONENTS_NOROUNT = [];
+const COMPONENTS = [
+  ContractManagementContractFileComponent];
+const COMPONENTS_NOROUNT = [
+  ContractManagementContractFileAddComponent,
+  ContractManagementContractFileAddEssentialInformationComponent];
 
 @NgModule({
   imports: [

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

@@ -5,10 +5,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)]="projectManageArchivesa.proId" nzPlaceHolder="请选择">
-            <nz-option *ngFor="let i of proList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
-          </nz-select> -->
           <nz-tree-select style="width: 100%" [nzNodes]="proList" nzShowSearch [nzMultiple]="false"
             formControlName="proId" id="proId" nzPlaceHolder="请选择" [(ngModel)]="projectManageArchivesa.proId"
             [nzMaxTagCount]="3" [nzAllowClear]="true" (ngModelChange)="proChange($event)">

+ 2 - 0
src/app/routes/routes-routing.module.ts

@@ -66,6 +66,8 @@ const routes: Routes = [
       ,{ path: 'expense-reimbursement', loadChildren: './expense-reimbursement/expense-reimbursement.module#ExpenseReimbursementModule' }
       //报表
       ,{ path: 'report-form', loadChildren: './report-form/report-form.module#ReportFormModule' }
+      //合同管理
+      ,{path:'contract-management',loadChildren:'./contract-management/contract-management.module#ContractManagementModule'}
   ],
   },
   // 全屏布局

+ 4 - 1
src/app/services/basedata/customer.service.ts

@@ -84,5 +84,8 @@ export class CustomerService {
     return await this.http.put<BaseResponse<any>>('basedata/fdCustomerContacts/edit',body).toPromise();
   }
 
-
+  //根据客户id查询客户联系人
+  async getContactsByMainId(customerId: string): Promise<BaseResponse<any>> {
+    return await this.http.get<BaseResponse<any>>("basedata/fdCustomerContacts/getContactsByMainId", { params: { customerId: customerId } }).toPromise();
+  }
 }