Browse Source

项目管理

chenc 4 năm trước cách đây
mục cha
commit
2872f75277
29 tập tin đã thay đổi với 1413 bổ sung1 xóa
  1. 34 0
      src/app/entity/project-manage-archives/project-manage-archives-and-business.ts
  2. 55 0
      src/app/entity/project-manage-archives/project-manage-archives.ts
  3. 31 0
      src/app/entity/project-manage-archives/project-manage-business-other.ts
  4. 39 0
      src/app/routes/project-manage-archives/add/add.component.html
  5. 24 0
      src/app/routes/project-manage-archives/add/add.component.spec.ts
  6. 49 0
      src/app/routes/project-manage-archives/add/add.component.ts
  7. 373 0
      src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.html
  8. 24 0
      src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.spec.ts
  9. 112 0
      src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.ts
  10. 14 0
      src/app/routes/project-manage-archives/add/development/development.component.html
  11. 24 0
      src/app/routes/project-manage-archives/add/development/development.component.spec.ts
  12. 26 0
      src/app/routes/project-manage-archives/add/development/development.component.ts
  13. 159 0
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.html
  14. 24 0
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.spec.ts
  15. 58 0
      src/app/routes/project-manage-archives/add/essential-information/essential-information.component.ts
  16. 14 0
      src/app/routes/project-manage-archives/add/implementation/implementation.component.html
  17. 24 0
      src/app/routes/project-manage-archives/add/implementation/implementation.component.spec.ts
  18. 26 0
      src/app/routes/project-manage-archives/add/implementation/implementation.component.ts
  19. 14 0
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.html
  20. 24 0
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.spec.ts
  21. 26 0
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.ts
  22. 64 0
      src/app/routes/project-manage-archives/list/list.component.html
  23. 24 0
      src/app/routes/project-manage-archives/list/list.component.spec.ts
  24. 88 0
      src/app/routes/project-manage-archives/list/list.component.ts
  25. 13 0
      src/app/routes/project-manage-archives/project-manage-archives-routing.module.ts
  26. 34 0
      src/app/routes/project-manage-archives/project-manage-archives.module.ts
  27. 3 1
      src/app/routes/routes-routing.module.ts
  28. 6 0
      src/assets/tmp/i18n/en-US.json
  29. 7 0
      src/assets/tmp/i18n/zh-CN.json

+ 34 - 0
src/app/entity/project-manage-archives/project-manage-archives-and-business.ts

@@ -0,0 +1,34 @@
+import { Page } from '../page';
+
+export class ProjectManageArchivesAndBusiness extends Page{
+    id?:string;
+	//项目档案id
+	proArchivesId?: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;
+
+}

+ 55 - 0
src/app/entity/project-manage-archives/project-manage-archives.ts

@@ -0,0 +1,55 @@
+import { Page } from '../page';
+/**
+ * 项目档案主表
+ */
+export class ProjectManageArchives extends Page{
+    id?:string;
+    //"项目立项档案id"
+    proId?:string;
+    //项目编码(来自项目立项)
+    proCode?:string;
+    //项目名称(来自项目立项)
+    proName?:string;
+    //客户档案id
+    cusId?:string;
+    //客户编码(来自客户档案)
+    cusCode?:string;
+    //客户名称(来自客户档案)
+    cusName?:string;
+    //项目总金额
+    totalPrice?:number;
+    //销售经理id
+    saleManagerId?:string;
+    //销售经理
+    saleManager?:string;
+    //业务员id
+    saleManId?:string;
+    //业务员
+    saleMan?:string;
+    //实施项目经理id
+    impManagerId?:string;
+    //实施项目经理
+    impManager?:string;
+    //实施顾问id
+    impConsultantId?:string;
+    //实施顾问
+    impConsultant?:string;
+    //开发项目经理id
+    deManagerId?:string;
+    //开发项目经理
+    deManager?:string;
+    //开发工程师id
+    deEngineerId?:string;
+    //开发工程师
+    deEngineer?:string;
+    //服务经理id
+    seManagerId?:string;
+    //服务经理
+    seManager?:string;
+    //服务工程师id
+    seEngineerId?:string;
+    //服务工程师
+    seEngineer?:string;
+    //组织
+    pkOrg?:string;
+}

+ 31 - 0
src/app/entity/project-manage-archives/project-manage-business-other.ts

@@ -0,0 +1,31 @@
+import { Page } from '../page';
+
+export class ProjectManageBusinessOther extends Page{
+	id?:string;
+    //项目档案id
+    proArchivesId?:string;
+	 //计划类型 1.商务 2.实施 3.开发 4.服务
+    planType?:number;
+    //当前节点id
+	keyId?:string;
+	//父节点id
+	parentId?:string;
+	//里程碑id
+	muilesId?:string;
+	//里程碑名称
+	muilesName?:string;
+	//开始时间
+	startDate?:string;
+	//结束时间
+	endDate?:string;
+	//计划人天
+	planTime?:string;
+	//执行人
+	executor?:string;
+	//执行人id (来源角色表)
+	executorId?:string;
+	//实际人天
+	realTime?:string;
+	//组织
+	pkOrg?:string;
+}

+ 39 - 0
src/app/routes/project-manage-archives/add/add.component.html

@@ -0,0 +1,39 @@
+<nz-spin [nzSpinning]="isLoadingSave">
+  <nz-tabset nzTabPosition="left">
+    <!-- 基本信息 -->
+    <nz-tab nzTitle="{{'essential.information'|translate}}">
+      <app-project-manage-archives-add-essential-information #essentialInformation>
+
+      </app-project-manage-archives-add-essential-information>
+    </nz-tab>
+    <!-- 商务 -->
+    <nz-tab nzTitle="{{'business.affairs'|translate}}">
+      <app-project-manage-archives-add-business-affairs #businessAffairs>
+
+      </app-project-manage-archives-add-business-affairs>
+    </nz-tab>
+    <!-- 实施 -->
+    <nz-tab nzTitle="{{'implementation'|translate}}">
+
+    </nz-tab>
+    <!-- 开发 -->
+    <nz-tab nzTitle="{{'development'|translate}}">
+
+    </nz-tab>
+    <!-- 服务 -->
+    <nz-tab nzTitle="{{'service'|translate}}">
+
+    </nz-tab>
+  </nz-tabset>
+</nz-spin>
+<!-- 按钮 -->
+<div class="base">
+  <!-- 关闭按钮 -->
+  <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)="save()"
+    [nzLoading]="isLoadingSave"><span>{{'pm.finish' | translate}}</span></button>
+</div>

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

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

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

@@ -0,0 +1,49 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { NzModalRef, NzMessageService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { ProjectManageArchivesAddEssentialInformationComponent } from './essential-information/essential-information.component';
+import { ProjectManageArchivesAddBusinessAffairsComponent } from './business-affairs/business-affairs.component';
+
+@Component({
+  selector: 'app-project-manage-archives-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 ProjectManageArchivesAddComponent implements OnInit {
+  
+
+  constructor(
+    private drawerRef:NzDrawerRef
+  ) { }
+
+  ngOnInit(): void {
+  }
+
+  isLoadingSave=false;//保存加载
+  //基本信息
+  @ViewChild('essentialInformation') essentialInformation: ProjectManageArchivesAddEssentialInformationComponent;
+  //商务
+  @ViewChild('businessAffairs') businessAffairs: ProjectManageArchivesAddBusinessAffairsComponent;
+
+  save(){
+    this.essentialInformation.submitForm();
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+}

+ 373 - 0
src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.html

@@ -0,0 +1,373 @@
+<!-- 商务 -->
+<form nz-form>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="6">客户编码</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.proCode}}</nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="6">客户名称</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.cusName}}</nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="6">销售经理</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.saleManager}}</nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="6">业务员</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.saleMan}}</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]="6">项目总金额</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.totalPrice}}</nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="6">已汇款金额</nz-form-label>
+        <nz-form-control [nzSm]="18" [nzXs]="24">{{projectManageArchivesa.proCode}}</nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+</form>
+<!-- 收款计划 -->
+<nz-card nzTitle="收款计划" nzSize="small">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <!-- 新增按钮 -->
+      <button (click)="collectionPlanAdd()" nz-button nzType="primary">{{ 'button.add' | translate }}</button>
+    </div>
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable
+        [nzData]="collectionPlanList" [nzFrontPagination]="false" [nzShowPagination]="false" [nzScroll]="{x:'123vw'}">
+        <!-- <thead>
+          <tr>
+            <th>{{ 'customer.contacts.name' | translate }}</th>
+            <th>{{ 'customer.contacts.telephone' | translate }}</th>
+            <th>{{ 'customer.contacts.mail' | translate }}</th>
+            <th>{{ 'customer.is.it.default' | translate }}</th>
+            <th>{{ 'customer.contacts.client.address' | translate }}</th>
+            <th>{{ 'table.operation' | translate }}</th>
+          </tr>
+        </thead> -->
+        <tbody>
+          <tr *ngFor="let data of basicTable.data">
+            <td style="width: 7%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.planId" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of planList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 4%;">第一笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price1" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId1" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc1" nz-input />
+            </td>
+            <td style="width: 4%;">第二笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price2" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId2" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc2" nz-input />
+            </td>
+            <td style="width: 4%;">第三笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price3" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId3" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc3" nz-input />
+            </td>
+            <td style="width: 4%;">第四笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price4" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId4" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc4" nz-input />
+            </td>
+            <td style="width: 4%;">第五笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price5" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId5" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc5" nz-input />
+            </td>
+            <td nzRight="0"><a nz-popconfirm nzTitle="是否删除?"
+                (nzOnConfirm)="collectionPlanDelete(data.sort)">{{'table.delete'|translate}}</a></td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>
+
+
+<!-- 回款情况 -->
+<nz-card nzTitle="回款情况" nzSize="small">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <!-- 新增按钮 -->
+      <button (click)="paymentCollectionAdd()" nz-button nzType="primary">{{ 'button.add' | translate }}</button>
+    </div>
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable2
+        [nzData]="paymentCollectionList" [nzFrontPagination]="false" [nzShowPagination]="false"
+        [nzScroll]="{x:'123vw'}">
+        <!-- <thead>
+          <tr>
+            <th>{{ 'customer.contacts.name' | translate }}</th>
+            <th>{{ 'customer.contacts.telephone' | translate }}</th>
+            <th>{{ 'customer.contacts.mail' | translate }}</th>
+            <th>{{ 'customer.is.it.default' | translate }}</th>
+            <th>{{ 'customer.contacts.client.address' | translate }}</th>
+            <th>{{ 'table.operation' | translate }}</th>
+          </tr>
+        </thead> -->
+        <tbody>
+          <tr *ngFor="let data of basicTable2.data">
+            <td style="width: 7%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.planId" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of planList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 4%;">第一笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price1" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId1" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc1" nz-input />
+            </td>
+            <td style="width: 4%;">第二笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price2" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId2" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc2" nz-input />
+            </td>
+            <td style="width: 4%;">第三笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price3" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId3" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc3" nz-input />
+            </td>
+            <td style="width: 4%;">第四笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price4" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId4" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc4" nz-input />
+            </td>
+            <td style="width: 4%;">第五笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price5" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId5" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc5" nz-input />
+            </td>
+            <td nzRight="0"><a nz-popconfirm nzTitle="是否删除?"
+              (nzOnConfirm)="paymentCollectionDelete(data.sort)">{{'table.delete'|translate}}</a></td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>
+
+
+<!-- 付款计划 -->
+<nz-card nzTitle="付款计划" nzSize="small">
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <!-- 新增按钮 -->
+      <button (click)="paymentPlanAdd()" nz-button nzType="primary">{{ 'button.add' | translate }}</button>
+    </div>
+  </div>
+  <div nz-row [nzGutter]="24">
+    <div nz-col [nzSpan]="24">
+      <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable3
+        [nzData]="paymentPlanList" [nzFrontPagination]="false" [nzShowPagination]="false"
+        [nzScroll]="{x:'123vw'}">
+        <!-- <thead>
+          <tr>
+            <th>{{ 'customer.contacts.name' | translate }}</th>
+            <th>{{ 'customer.contacts.telephone' | translate }}</th>
+            <th>{{ 'customer.contacts.mail' | translate }}</th>
+            <th>{{ 'customer.is.it.default' | translate }}</th>
+            <th>{{ 'customer.contacts.client.address' | translate }}</th>
+            <th>{{ 'table.operation' | translate }}</th>
+          </tr>
+        </thead> -->
+        <tbody>
+          <tr *ngFor="let data of basicTable3.data">
+            <td style="width: 7%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.planId" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of planList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 4%;">第一笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price1" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId1" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc1" nz-input />
+            </td>
+            <td style="width: 4%;">第二笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price2" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId2" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc2" nz-input />
+            </td>
+            <td style="width: 4%;">第三笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price3" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId3" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc3" nz-input />
+            </td>
+            <td style="width: 4%;">第四笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price4" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId4" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc4" nz-input />
+            </td>
+            <td style="width: 4%;">第五笔</td>
+            <td style="width: 4%;">
+              <nz-input-number [(ngModel)]="data.price5" [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar"
+                [nzParser]="parserDollar"></nz-input-number>
+            </td>
+            <td style="width: 5%;">
+              <nz-select style="width: 100%;" nzShowSearch nzAllowClear [(ngModel)]="data.mileId5" nzPlaceHolder="请选择"
+                [nzDropdownMatchSelectWidth]="false">
+                <nz-option *ngFor="let i of milestoneList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+              </nz-select>
+            </td>
+            <td style="width: 5%;">
+              <input [(ngModel)]="data.desc5" nz-input />
+            </td>
+            <td nzRight="0"><a nz-popconfirm nzTitle="是否删除?"
+              (nzOnConfirm)="paymentPlanDelete(data.sort)">{{'table.delete'|translate}}</a></td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.spec.ts

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

+ 112 - 0
src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.ts

@@ -0,0 +1,112 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+
+@Component({
+  selector: 'app-project-manage-archives-add-business-affairs',
+  templateUrl: './business-affairs.component.html',
+})
+export class ProjectManageArchivesAddBusinessAffairsComponent implements OnInit {
+  
+
+  constructor(
+    
+  ) { }
+
+  ngOnInit(): void {
+    
+  }
+
+  projectManageArchivesa:ProjectManageArchives={}//项目档案实体对象
+  collectionPlanList=[];//收款计划数据
+  paymentCollectionList=[];//回款情况数据
+  paymentPlanList=[];//付款计划
+  planList=[];//计划下来集合数据
+  formatterDollar = (value: number) => `$ ${value}`;
+  parserDollar = (value: string) => value.replace('$ ', '');
+  milestoneList=[];//里程碑集合数据
+
+  /**
+   * 
+   收款计划新增
+   */
+  collectionPlanSort=0;//收款计划排序
+  collectionPlanAdd(){
+    this.collectionPlanList = [
+      ...this.collectionPlanList,
+      {
+        price1:0,
+        price2:0,
+        price3:0,
+        price4:0,
+        price5:0,
+        sort:this.collectionPlanSort,
+        planType:"1"
+      },
+    ];
+    this.collectionPlanSort++;
+  }
+
+  /**
+   * 收款删除按钮
+   */
+  collectionPlanDelete(sort){
+    this.collectionPlanList = this.collectionPlanList.filter(d => d.sort !== sort);
+  }
+
+  /**
+   * 回款计划新增
+   */
+  paymentCollectionSort=0;//回款情况排序
+  paymentCollectionAdd(){
+    this.paymentCollectionList = [
+      ...this.paymentCollectionList,
+      {
+        price1:0,
+        price2:0,
+        price3:0,
+        price4:0,
+        price5:0,
+        sort:this.paymentCollectionSort,
+        planType:"2"
+      },
+    ];
+    this.paymentCollectionSort++;
+  }
+
+  /**
+   * 回款删除按钮
+   */
+  paymentCollectionDelete(sort){
+    this.paymentCollectionList = this.paymentCollectionList.filter(d => d.sort !== sort);
+  }
+
+  /**
+   * 付款计划新增
+   */
+  paymentPlanSort=0;
+  paymentPlanAdd(){
+    this.paymentPlanList = [
+      ...this.paymentPlanList,
+      {
+        price1:0,
+        price2:0,
+        price3:0,
+        price4:0,
+        price5:0,
+        sort:this.paymentPlanSort,
+        planType:"3"
+      },
+    ];
+    this.paymentPlanSort++;
+  }
+
+  /**
+   * 付款计划删除按钮
+   */
+  paymentPlanDelete(sort){
+    this.paymentCollectionList = this.paymentCollectionList.filter(d => d.sort !== sort);
+  }
+  
+}

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

@@ -0,0 +1,14 @@
+<div class="modal-header">
+  <div class="modal-title">查看 {{ record.id }} 信息</div>
+</div>
+<nz-spin *ngIf="!i" class="modal-spin"></nz-spin>
+<div sv-container *ngIf="i">
+  <sv label="姓名">{{ i.owner }}</sv>
+  <sv label="会员卡号">32943898021309809423</sv>
+  <sv label="身份证">3321944288191034921</sv>
+  <sv label="联系方式">18112345678</sv>
+  <sv label="联系地址">曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口</sv>
+</div>
+<div class="modal-footer">
+  <button nz-button type="button" (click)="close()">关闭</button>
+</div>

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

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

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

@@ -0,0 +1,26 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+  selector: 'app-project-manage-archives-add-development',
+  templateUrl: './development.component.html',
+})
+export class ProjectManageArchivesAddDevelopmentComponent implements OnInit {
+  record: any = {};
+  i: any;
+
+  constructor(
+    private modal: NzModalRef,
+    public msgSrv: NzMessageService,
+    public http: _HttpClient
+  ) { }
+
+  ngOnInit(): void {
+    this.http.get(`/user/${this.record.id}`).subscribe(res => this.i = res);
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

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

@@ -0,0 +1,159 @@
+<!-- 基本信息 -->
+<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-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-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" [nzXs]="24">项目名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{projectManageArchivesa.proName}}
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="6">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" [nzXs]="24">客户编码</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="cusId" id="cusId"
+            [(ngModel)]="projectManageArchivesa.cusId" nzPlaceHolder="请选择">
+            <nz-option *ngFor="let i of cusList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+          </nz-select>
+          <nz-form-explain *ngIf="validateForm.get('cusId')?.dirty && validateForm.get('cusId')?.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" [nzXs]="24">客户名称</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          {{projectManageArchivesa.cusName}}
+        </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" [nzXs]="24" nzRequired>项目总金额</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-input-number [(ngModel)]="projectManageArchivesa.totalPrice" formControlName="totalPrice" id="totalPrice"
+            [nzMin]="1" [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
+        </nz-form-control>
+        <nz-form-explain *ngIf="validateForm.get('totalPrice')?.dirty && validateForm.get('totalPrice')?.errors">
+          请输入项目总金额
+        </nz-form-explain>
+      </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" [nzXs]="24">销售经理</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="saleManagerId" id="saleManagerId"
+            [(ngModel)]="projectManageArchivesa.saleManagerId" nzPlaceHolder="请选择">
+            <nz-option *ngFor="let i of personnelList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+          </nz-select>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="18">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" [nzXs]="24">业务员</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select [nzMaxTagCount]="3" nzMode="multiple" nzPlaceHolder="请选择" formControlName="saleManIds"
+            id="saleManIds" [(ngModel)]="saleManIds">
+            <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
+          </nz-select>
+        </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" [nzXs]="24">实施项目经理</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="impManagerId" id="impManagerId"
+            [(ngModel)]="projectManageArchivesa.impManagerId" nzPlaceHolder="请选择">
+            <nz-option *ngFor="let i of personnelList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+          </nz-select>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="18">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" [nzXs]="24">实施顾问</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select [nzMaxTagCount]="3" nzMode="multiple" nzPlaceHolder="请选择" formControlName="impConsultantIds"
+            id="impConsultantIds" [(ngModel)]="impConsultantIds">
+            <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
+          </nz-select>
+        </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" [nzXs]="24">开发项目经理</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="deManagerId" id="deManagerId"
+            [(ngModel)]="projectManageArchivesa.deManagerId" nzPlaceHolder="请选择">
+            <nz-option *ngFor="let i of personnelList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+          </nz-select>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="18">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" [nzXs]="24">开发工程师</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select [nzMaxTagCount]="3" nzMode="multiple" nzPlaceHolder="请选择" formControlName="deEngineerIds"
+            id="deEngineerIds" [(ngModel)]="deEngineerIds">
+            <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
+          </nz-select>
+        </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" [nzXs]="24">服务经理</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="seManagerId" id="seManagerId"
+            [(ngModel)]="projectManageArchivesa.seManagerId" nzPlaceHolder="请选择">
+            <nz-option *ngFor="let i of personnelList" [nzValue]="i.id" [nzLabel]="i.code"></nz-option>
+          </nz-select>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+    <div nz-col [nzSpan]="18">
+      <nz-form-item>
+        <nz-form-label [nzSpan]="'vertical' ? 24 : null" [nzXs]="24">服务工程师</nz-form-label>
+        <nz-form-control [nzSm]="24" [nzXs]="24">
+          <nz-select [nzMaxTagCount]="3" nzMode="multiple" nzPlaceHolder="请选择" formControlName="seEngineerIds"
+            id="seEngineerIds" [(ngModel)]="seEngineerIds">
+            <nz-option *ngFor="let item of personnelList" [nzLabel]="item.id" [nzValue]="item.name"></nz-option>
+          </nz-select>
+        </nz-form-control>
+      </nz-form-item>
+    </div>
+  </div>
+</form>

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

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

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

@@ -0,0 +1,58 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { Validators, FormGroup, FormBuilder } from '@angular/forms';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+
+@Component({
+  selector: 'app-project-manage-archives-add-essential-information',
+  templateUrl: './essential-information.component.html',
+})
+export class ProjectManageArchivesAddEssentialInformationComponent implements OnInit {
+  
+
+  constructor(
+    private fb: FormBuilder
+  ) { }
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      cusId: [null, [Validators.required]],
+      totalPrice: [null, [Validators.required]],
+      saleManagerId:[null],
+      saleManIds:[null],
+      impManagerId:[null],
+      impConsultantIds:[null],
+      deManagerId:[null],
+      deEngineerIds:[null],
+      seManagerId:[null],
+      seEngineerIds:[null]
+    });
+  }
+
+  validateForm!: FormGroup;
+  projectManageArchivesa:ProjectManageArchives={
+    totalPrice:0
+  };//项目档案主表对象
+  proList=[];//项目立项档案数据集合
+  cusList=[];//客户档案数据集合
+  //金额格式化
+  formatterDollar = (value: number) => `$ ${value}`;
+  parserDollar = (value: string) => value.replace('$ ', '');
+  saleManIds=[];//业务员id绑定
+  personnelList=[];//人员下拉数据
+  impConsultantIds=[];//实施顾问下拉选择绑定
+  deEngineerIds=[];//开发工程师下拉选择绑定
+  seEngineerIds=[];//服务工程师下拉选择绑定
+
+  submitForm(){
+    for (const i in this.validateForm.controls) {
+      this.validateForm.controls[i].markAsDirty();
+      this.validateForm.controls[i].updateValueAndValidity();
+    }
+    let valid = this.validateForm.valid;
+  }
+
+}

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

@@ -0,0 +1,14 @@
+<div class="modal-header">
+  <div class="modal-title">查看 {{ record.id }} 信息</div>
+</div>
+<nz-spin *ngIf="!i" class="modal-spin"></nz-spin>
+<div sv-container *ngIf="i">
+  <sv label="姓名">{{ i.owner }}</sv>
+  <sv label="会员卡号">32943898021309809423</sv>
+  <sv label="身份证">3321944288191034921</sv>
+  <sv label="联系方式">18112345678</sv>
+  <sv label="联系地址">曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口</sv>
+</div>
+<div class="modal-footer">
+  <button nz-button type="button" (click)="close()">关闭</button>
+</div>

+ 24 - 0
src/app/routes/project-manage-archives/add/implementation/implementation.component.spec.ts

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

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

@@ -0,0 +1,26 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+  selector: 'app-project-manage-archives-add-implementation',
+  templateUrl: './implementation.component.html',
+})
+export class ProjectManageArchivesAddImplementationComponent implements OnInit {
+  record: any = {};
+  i: any;
+
+  constructor(
+    private modal: NzModalRef,
+    public msgSrv: NzMessageService,
+    public http: _HttpClient
+  ) { }
+
+  ngOnInit(): void {
+    this.http.get(`/user/${this.record.id}`).subscribe(res => this.i = res);
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

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

@@ -0,0 +1,14 @@
+<div class="modal-header">
+  <div class="modal-title">查看 {{ record.id }} 信息</div>
+</div>
+<nz-spin *ngIf="!i" class="modal-spin"></nz-spin>
+<div sv-container *ngIf="i">
+  <sv label="姓名">{{ i.owner }}</sv>
+  <sv label="会员卡号">32943898021309809423</sv>
+  <sv label="身份证">3321944288191034921</sv>
+  <sv label="联系方式">18112345678</sv>
+  <sv label="联系地址">曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口</sv>
+</div>
+<div class="modal-footer">
+  <button nz-button type="button" (click)="close()">关闭</button>
+</div>

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

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

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

@@ -0,0 +1,26 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+
+@Component({
+  selector: 'app-project-manage-archives-add-serviceta',
+  templateUrl: './serviceta.component.html',
+})
+export class ProjectManageArchivesAddServicetaComponent implements OnInit {
+  record: any = {};
+  i: any;
+
+  constructor(
+    private modal: NzModalRef,
+    public msgSrv: NzMessageService,
+    public http: _HttpClient
+  ) { }
+
+  ngOnInit(): void {
+    this.http.get(`/user/${this.record.id}`).subscribe(res => this.i = res);
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

+ 64 - 0
src/app/routes/project-manage-archives/list/list.component.html

@@ -0,0 +1,64 @@
+<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)]="projectManageArchives.proCode" />
+          </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="name" [(ngModel)]="projectManageArchives.proName" />
+          </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>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of basicTable.data">
+            <td>{{ data.proCode }}</td>
+            <td>{{ data.proName }}</td>
+            <td>
+              <a (click)="update(data)" acl [acl-ability]="'base-archives-cost:update'">修改</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'base-archives-cost:update'"></nz-divider>
+              <a (click)="delete(data.id)" acl [acl-ability]="'base-archives-cost:delete'">删除</a>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/project-manage-archives/list/list.component.spec.ts

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

+ 88 - 0
src/app/routes/project-manage-archives/list/list.component.ts

@@ -0,0 +1,88 @@
+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 { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { NzDrawerService } from 'ng-zorro-antd';
+import { I18NService } from '@core';
+import { ProjectManageArchivesAddComponent } from '../add/add.component';
+
+@Component({
+  selector: 'app-project-manage-archives-list',
+  templateUrl: './list.component.html',
+})
+export class ProjectManageArchivesListComponent implements OnInit {
+  
+
+  constructor(
+    private nzDrawerService:NzDrawerService,
+    private i18NService:I18NService
+  ) { }
+
+  ngOnInit() { }
+
+  listOfData = [];
+  projectManageArchives: ProjectManageArchives={}; //对象
+  page = {
+    total: 0,
+    current: 0,
+  }; //页码
+  isSpinning = false;
+
+  //按页码显示数据
+  pageIndexChange(event) {
+    this.projectManageArchives.pageNo = event; //当前页码
+    this.getList();
+  }
+
+  /**
+   * 查询数据表
+   */
+  getList(){
+    // this.isSpinning=true;
+    this.projectManageArchives.pkOrg=sessionStorage.getItem("pkOrg");//组织
+    // this.baseArchivesCostService.getList(this.baseArchivesCost).then((response)=>{
+    //   this.listOfData=response.result.records
+    // })
+  }
+
+  /**
+   * 查询按钮
+   */
+  query(){
+    this.projectManageArchives.pageNo = 1;
+    this.getList();
+  }
+
+  /**
+   * 新增
+   */
+  add() {
+    const drawerRef = this.nzDrawerService.create<ProjectManageArchivesAddComponent, { quotationId: string }, string>({
+      nzTitle: this.i18NService.fanyi("button.add"),//新增标题
+      nzContent: ProjectManageArchivesAddComponent,
+      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.getProjectQuotation();
+    //   }
+    // });
+  }
+
+  update(){
+
+  }
+
+  delete(){
+
+  }
+
+}

+ 13 - 0
src/app/routes/project-manage-archives/project-manage-archives-routing.module.ts

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

+ 34 - 0
src/app/routes/project-manage-archives/project-manage-archives.module.ts

@@ -0,0 +1,34 @@
+import { NgModule } from '@angular/core';
+import { SharedModule } from '@shared';
+import { ProjectManageArchivesRoutingModule } from './project-manage-archives-routing.module';
+import { ProjectManageArchivesListComponent } from './list/list.component';
+import { ProjectManageArchivesAddComponent } from './add/add.component';
+import { ProjectManageArchivesAddEssentialInformationComponent } from './add/essential-information/essential-information.component';
+import { ProjectManageArchivesAddBusinessAffairsComponent } from './add/business-affairs/business-affairs.component';
+import { ProjectManageArchivesAddImplementationComponent } from './add/implementation/implementation.component';
+import { ProjectManageArchivesAddDevelopmentComponent } from './add/development/development.component';
+import { ProjectManageArchivesAddServicetaComponent } from './add/serviceta/serviceta.component';
+
+const COMPONENTS = [
+  ProjectManageArchivesListComponent
+  ];
+const COMPONENTS_NOROUNT = [
+  ProjectManageArchivesAddComponent,
+  ProjectManageArchivesAddEssentialInformationComponent,
+  ProjectManageArchivesAddBusinessAffairsComponent,
+  ProjectManageArchivesAddImplementationComponent,
+  ProjectManageArchivesAddDevelopmentComponent,
+  ProjectManageArchivesAddServicetaComponent];
+
+@NgModule({
+  imports: [
+    SharedModule,
+    ProjectManageArchivesRoutingModule
+  ],
+  declarations: [
+    ...COMPONENTS,
+    ...COMPONENTS_NOROUNT
+  ],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class ProjectManageArchivesModule { }

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

@@ -52,8 +52,10 @@ const routes: Routes = [
       //样本及耗材管理
       // { path: 'samplesAndConsumables', loadChildren: './samples-and-consumables/samples-and-consumables.module#SamplesAndConsumablesModule' },
       // 质量管理
-      { path: 'qualityControl', loadChildren: './quality-control/quality-control.module#QualityControlModule' },
+      { path: 'qualityControl', loadChildren: './quality-control/quality-control.module#QualityControlModule' }
       // { path: 'quality-management', loadChildren: './quality-management/quality-management.module#QualityManagementModule' },
+      //项目管理
+      ,{ path: 'project-manage-archives', loadChildren: './project-manage-archives/project-manage-archives.module#ProjectManageArchivesModule' }
     ],
   },
   // 全屏布局

+ 6 - 0
src/assets/tmp/i18n/en-US.json

@@ -2004,4 +2004,10 @@
   "Bioanalytical.Laboratory":"Bioanalytical Laboratory",
   "Suzhou.biological.analysis.and.laboratory":"Suzhou biological analysis and laboratory",
   "Zhengzhou.clinic":"Zhengzhou clinic"
+
+  ,"essential.information":"Essential Information"
+  ,"business.affairs":"Business Affairs"
+  ,"implementation":"Implementation"
+  ,"development":"Development"
+  ,"service":"Service"
 }

+ 7 - 0
src/assets/tmp/i18n/zh-CN.json

@@ -2017,4 +2017,11 @@
   "Bioanalytical.Laboratory":"生物分析实验室",
   "Suzhou.biological.analysis.and.laboratory":"苏州生物分析及实验室",
   "Zhengzhou.clinic":"郑州临床"
+
+
+  ,"essential.information":"基本信息"
+  ,"business.affairs":"商务"
+  ,"implementation":"实施"
+  ,"development":"开发"
+  ,"service":"服务"
 }