Browse Source

实施、开发、服务确认里程碑

chenc 4 years ago
parent
commit
f74444f130
36 changed files with 2738 additions and 45 deletions
  1. 6 1
      src/app/entity/project-work/pro-work-milestone.ts
  2. 2 1
      src/app/routes/project-manage-archives/list/list.component.ts
  3. 2 1
      src/app/routes/project-work/development-log/development-log.component.ts
  4. 115 0
      src/app/routes/project-work/development-milestone-confirm/add/add.component.html
  5. 24 0
      src/app/routes/project-work/development-milestone-confirm/add/add.component.spec.ts
  6. 223 0
      src/app/routes/project-work/development-milestone-confirm/add/add.component.ts
  7. 69 0
      src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.html
  8. 24 0
      src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.spec.ts
  9. 126 0
      src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.ts
  10. 115 0
      src/app/routes/project-work/development-milestone-confirm/update/update.component.html
  11. 24 0
      src/app/routes/project-work/development-milestone-confirm/update/update.component.spec.ts
  12. 261 0
      src/app/routes/project-work/development-milestone-confirm/update/update.component.ts
  13. 1 1
      src/app/routes/project-work/implementation-log/implementation-log.component.html
  14. 2 1
      src/app/routes/project-work/implementation-log/implementation-log.component.ts
  15. 75 13
      src/app/routes/project-work/implementation-milestone-confirm/add/add.component.html
  16. 185 9
      src/app/routes/project-work/implementation-milestone-confirm/add/add.component.ts
  17. 8 4
      src/app/routes/project-work/implementation-milestone-confirm/implementation-milestone-confirm.component.html
  18. 41 4
      src/app/routes/project-work/implementation-milestone-confirm/implementation-milestone-confirm.component.ts
  19. 115 0
      src/app/routes/project-work/implementation-milestone-confirm/update/update.component.html
  20. 24 0
      src/app/routes/project-work/implementation-milestone-confirm/update/update.component.spec.ts
  21. 261 0
      src/app/routes/project-work/implementation-milestone-confirm/update/update.component.ts
  22. 5 1
      src/app/routes/project-work/project-work-routing.module.ts
  23. 16 2
      src/app/routes/project-work/project-work.module.ts
  24. 1 1
      src/app/routes/project-work/service-log/service-log.component.html
  25. 2 1
      src/app/routes/project-work/service-log/service-log.component.ts
  26. 115 0
      src/app/routes/project-work/service-milestone-confirm/add/add.component.html
  27. 24 0
      src/app/routes/project-work/service-milestone-confirm/add/add.component.spec.ts
  28. 223 0
      src/app/routes/project-work/service-milestone-confirm/add/add.component.ts
  29. 69 0
      src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.html
  30. 24 0
      src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.spec.ts
  31. 125 0
      src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.ts
  32. 115 0
      src/app/routes/project-work/service-milestone-confirm/update/update.component.html
  33. 24 0
      src/app/routes/project-work/service-milestone-confirm/update/update.component.spec.ts
  34. 261 0
      src/app/routes/project-work/service-milestone-confirm/update/update.component.ts
  35. 5 0
      src/app/services/project-manage-archives/project-manage-archives.service.ts
  36. 26 5
      src/app/services/project-work/pro-work-milestone.service.ts

+ 6 - 1
src/app/entity/project-work/pro-work-milestone.ts

@@ -36,5 +36,10 @@ export class ProWorkMilestone extends Page{
 	currentUser?:string;
 	//组织
 	pkOrg?:string;
-
+	//创建时间
+	createTime?:string;
+	//里程碑模板明细计划id
+	planId?:string;
+	//文件集合
+	fileList?:any[];
 }

+ 2 - 1
src/app/routes/project-manage-archives/list/list.component.ts

@@ -45,10 +45,11 @@ export class ProjectManageArchivesListComponent implements OnInit {
    * 查询数据表
    */
   getList(){
-    // this.isSpinning=true;
+    this.isSpinning=true;
     this.projectManageArchives.pkOrg=sessionStorage.getItem("pkOrg");//组织
     this.projectManageArchivesService.getList(this.projectManageArchives).then((response)=>{
       this.listOfData=response.result.records
+      this.isSpinning=false;
     })
   }
 

+ 2 - 1
src/app/routes/project-work/development-log/development-log.component.ts

@@ -42,11 +42,12 @@ export class ProjectWorkDevelopmentLogComponent implements OnInit {
    * 查询数据表
    */
   getList() {
-    // this.isSpinning=true;
+    this.isSpinning=true;
     this.proWorkLogic.pkOrg = sessionStorage.getItem('pkOrg'); //组织
     this.proWorkLogic.type="1";
     this.proWorkLogicService.getList(this.proWorkLogic).then(response => {
       this.listOfData = response.result.records;
+      this.isSpinning=false;
     });
   }
 

+ 115 - 0
src/app/routes/project-work/development-milestone-confirm/add/add.component.html

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

+ 24 - 0
src/app/routes/project-work/development-milestone-confirm/add/add.component.spec.ts

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

+ 223 - 0
src/app/routes/project-work/development-milestone-confirm/add/add.component.ts

@@ -0,0 +1,223 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient, SettingsService } from '@delon/theme';
+import { FormBuilder, Validators, FormGroup } from '@angular/forms';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { DatePipe } from '@angular/common';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { I18NService } from '@core';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { environment } from '@env/environment';
+
+@Component({
+  selector: 'app-project-work-development-milestone-confirm-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 ProjectWorkDevelopmentMilestoneConfirmAddComponent implements OnInit {
+  constructor(
+    private fb: FormBuilder,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private datePipe: DatePipe,
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private nzNotificationService:NzNotificationService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private settingsService:SettingsService
+  ) {}
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      mileId: [null, [Validators.required]],
+      milSwitch: [null],
+      confirmTime: [null, [Validators.required]],
+    });
+    //项目集合
+    this.getProList().then(() => {});
+  }
+
+  validateForm!: FormGroup;
+  proWorkMilestone: ProWorkMilestone = {
+    currentUser: this.settingsService.user.realname,//当天填写人
+    createTime: this.datePipe.transform(new Date(), 'yyyy-MM-dd HH:mm:ss')//当前时间
+  }; //对象
+  isLoadingSave = false; //加载
+  proList = []; //项目下拉列表
+  milSwitch = false; //里程碑确认空间
+
+  /**
+   * 获取项目下拉数据
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let projectManageArchives = new ProjectManageArchives();
+      projectManageArchives.pageSize = 20000;
+      projectManageArchives.pkOrg = sessionStorage.getItem('pkOrg');
+      this.projectManageArchivesService.getList(projectManageArchives).then(response => {
+        if (response.result.records) {
+          this.proList = response.result.records;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 项目选择事件
+   * @param event 项目档案id
+   */
+  proChange(event) {
+    if (event) {
+      //根据id获取项目档案数据
+      this.projectManageArchivesService.getListById(event).then(response => {
+        if (response.success) {
+          let project = JSON.parse(JSON.stringify(response.result)); //项目档案对象
+          this.proWorkMilestone.proCode = project.proCode; //项目档案编码
+          this.proWorkMilestone.proName = project.proName; //项目档案名称
+          this.proWorkMilestone.cusId = project.cusId; //客户id
+          this.proWorkMilestone.cusCode = project.cusCode; //客户编码
+          this.proWorkMilestone.cusName = project.cusName; //客户名称
+          this.getMieList(event);
+        }
+      });
+    }
+  }
+
+  /**
+   * 里程碑数据下拉
+   */
+  mieList = []; //里程碑下来数据
+  getMieList(proArchivesId) {
+    return new Promise(resolve => {
+      let plan = { id: proArchivesId, planType: '3' };
+      this.projectManageArchivesService.getPlanListById(plan).then(response => {
+        if (response.result) {
+          this.mieList = response.result;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 里程碑选择事件
+   */
+  milChange(event) {
+    if (event) {
+      //获取里程碑id和名称
+      this.mieList.forEach(element => {
+        if (event === element.key) {
+          this.proWorkMilestone.planId = element.id;
+          this.proWorkMilestone.mileName = element.milesName;
+        }
+      });
+    }
+  }
+
+  fileList = [];
+
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    console.log(JSON.parse(JSON.stringify(this.fileList)))
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
+  }
+
+  /**
+   * 保存按钮
+   */
+  uploadUrlList = []; //传入后台的文件地址集合
+  submitForm() {
+    for (const i in this.validateForm.controls) {
+      this.validateForm.controls[i].markAsDirty();
+      this.validateForm.controls[i].updateValueAndValidity();
+    }
+    let valid = this.validateForm.valid;
+    if (valid) {
+      this.proWorkMilestone.type="1";//开发
+      this.proWorkMilestone.pkOrg=sessionStorage.getItem("pkOrg");
+      //获取里程碑确认状态
+      if (this.milSwitch) {
+        this.proWorkMilestone.mileConfirm = 1;
+      } else {
+        this.proWorkMilestone.mileConfirm = 0;
+      }
+      //事件格式化
+      this.proWorkMilestone.confirmTime = this.datePipe.transform(
+        this.proWorkMilestone.confirmTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      //文件集合
+      this.getFileList();
+      this.proWorkMilestone.fileList=this.uploadUrlList;
+      this.proWorkMilestoneService.add(this.proWorkMilestone).then((response)=>{
+        if (response.success) {
+          //保存成功
+          this.isLoadingSave = false;
+          this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+          this.drawerRef.close(true);
+        } else {
+          //保存失败
+          this.isLoadingSave = false;
+          this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+        }
+      })
+    }
+  }
+
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          }
+        ];
+      });
+    }
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+
+  //显示路径
+  setAppendix(file: any) {
+    const url = file.fileUrl;
+    if (url != null && url !== '') {
+      const idx = url.lastIndexOf('/');
+      const fileUrl = url.slice(idx + 1);
+      const index = fileUrl.lastIndexOf('_');
+      const i = fileUrl.lastIndexOf('.');
+      const fileName = fileUrl.substring(0, index);
+      const fileSuffix = fileUrl.slice(i + 1);
+      const f = fileName + '.' + fileSuffix;
+      return f;
+    }
+    return '';
+  }
+}

+ 69 - 0
src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.html

@@ -0,0 +1,69 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'development-milestone-confirm:add'">新建</button>
+  </ng-template>
+</page-header>
+<nz-card>
+  <!-- 查询条件 -->
+  <form nz-form>
+    <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">单据编码</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="code" [(ngModel)]="proWorkMilestone.billcode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="2" [nzXs]="24" [nzNoColon]=true></nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <button nzType="primary" (click)="query()" nz-button><span>查询</span></button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+   <!-- 表格 -->
+   <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+    <div nz-col [nzSpan]="24">
+      <nz-table nzSize="small" #basicTable [nzData]="listOfData" [nzFrontPagination]="false" [nzTotal]="page.total"
+        [nzPageIndex]="page.current" (nzPageIndexChange)="pageIndexChange($event)" [nzLoading]="isSpinning">
+        <thead>
+          <tr>
+            <th>单据编码</th>
+            <th>项目编码</th>
+            <th>项目名称</th>
+            <th>客户编码</th>
+            <th>客户名称</th>
+            <th>项目里程碑</th>
+            <th>里程碑确认</th>
+            <th>确认时间</th>
+            <th>操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of basicTable.data">
+            <td>{{ data.billcode }}</td>
+            <td>{{ data.proCode }}</td>
+            <td>{{ data.proName }}</td>
+            <td>{{ data.cusCode }}</td>
+            <td>{{ data.cusName }}</td>
+            <td>{{ data.mileName }}</td>
+            <td>
+              <nz-tag *ngIf="data.mileConfirm===0" [nzColor]="'red'">否</nz-tag>
+              <nz-tag *ngIf="data.mileConfirm===1" [nzColor]="'green'">是</nz-tag>
+            </td>
+            <td>{{ data.confirmTime }}</td>
+            <td>
+              <a (click)="update(data)" acl [acl-ability]="'development-milestone-confirm:update'">修改</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'development-milestone-confirm:update'"></nz-divider>
+              <a (click)="delete(data.id)" acl [acl-ability]="'development-milestone-confirm:delete'">删除</a>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.spec.ts

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

+ 126 - 0
src/app/routes/project-work/development-milestone-confirm/development-milestone-confirm.component.ts

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

+ 115 - 0
src/app/routes/project-work/development-milestone-confirm/update/update.component.html

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

+ 24 - 0
src/app/routes/project-work/development-milestone-confirm/update/update.component.spec.ts

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

+ 261 - 0
src/app/routes/project-work/development-milestone-confirm/update/update.component.ts

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

+ 1 - 1
src/app/routes/project-work/implementation-log/implementation-log.component.html

@@ -1,6 +1,6 @@
 <page-header [action]="phActionTpl">
   <ng-template #phActionTpl>
-    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'url:implementation-log:add'">新建</button>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'implementation-log:add'">新建</button>
   </ng-template>
 </page-header>
 <nz-card>

+ 2 - 1
src/app/routes/project-work/implementation-log/implementation-log.component.ts

@@ -42,11 +42,12 @@ export class ProjectWorkImplementationLogComponent implements OnInit {
    * 查询数据表
    */
   getList() {
-    // this.isSpinning=true;
+    this.isSpinning=true;
     this.proWorkLogic.pkOrg = sessionStorage.getItem('pkOrg'); //组织
     this.proWorkLogic.type="2";
     this.proWorkLogicService.getList(this.proWorkLogic).then(response => {
       this.listOfData = response.result.records;
+      this.isSpinning=false;
     });
   }
 

+ 75 - 13
src/app/routes/project-work/implementation-milestone-confirm/add/add.component.html

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

+ 185 - 9
src/app/routes/project-work/implementation-milestone-confirm/add/add.component.ts

@@ -1,47 +1,223 @@
 import { Component, OnInit } from '@angular/core';
-import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
-import { _HttpClient } from '@delon/theme';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient, SettingsService } from '@delon/theme';
 import { FormBuilder, Validators, FormGroup } from '@angular/forms';
 import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { environment } from '@env/environment';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { DatePipe } from '@angular/common';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { I18NService } from '@core';
 
 @Component({
   selector: 'app-project-work-implementation-milestone-confirm-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 ProjectWorkImplementationMilestoneConfirmAddComponent implements OnInit {
   constructor(
-    private fb: FormBuilder
+    private fb: FormBuilder,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private datePipe: DatePipe,
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private nzNotificationService:NzNotificationService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private settingsService:SettingsService
   ) {}
 
   ngOnInit(): void {
     //初始化表单
     this.validateForm = this.fb.group({
-      proId: [null, [Validators.required]]
+      proId: [null, [Validators.required]],
+      mileId: [null, [Validators.required]],
+      milSwitch: [null],
+      confirmTime: [null, [Validators.required]],
     });
+    //项目集合
+    this.getProList().then(() => {});
   }
 
   validateForm!: FormGroup;
-  proWorkMilestone: ProWorkMilestone = {}; //对象
-  proList=[];//项目下拉列表
+  proWorkMilestone: ProWorkMilestone = {
+    currentUser: this.settingsService.user.realname,//当天填写人
+    createTime: this.datePipe.transform(new Date(), 'yyyy-MM-dd HH:mm:ss')//当前时间
+  }; //对象
+  isLoadingSave = false; //加载
+  proList = []; //项目下拉列表
+  milSwitch = false; //里程碑确认空间
+
+  /**
+   * 获取项目下拉数据
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let projectManageArchives = new ProjectManageArchives();
+      projectManageArchives.pageSize = 20000;
+      projectManageArchives.pkOrg = sessionStorage.getItem('pkOrg');
+      this.projectManageArchivesService.getList(projectManageArchives).then(response => {
+        if (response.result.records) {
+          this.proList = response.result.records;
+        }
+        resolve();
+      });
+    });
+  }
 
   /**
    * 项目选择事件
+   * @param event 项目档案id
+   */
+  proChange(event) {
+    if (event) {
+      //根据id获取项目档案数据
+      this.projectManageArchivesService.getListById(event).then(response => {
+        if (response.success) {
+          let project = JSON.parse(JSON.stringify(response.result)); //项目档案对象
+          this.proWorkMilestone.proCode = project.proCode; //项目档案编码
+          this.proWorkMilestone.proName = project.proName; //项目档案名称
+          this.proWorkMilestone.cusId = project.cusId; //客户id
+          this.proWorkMilestone.cusCode = project.cusCode; //客户编码
+          this.proWorkMilestone.cusName = project.cusName; //客户名称
+          this.getMieList(event);
+        }
+      });
+    }
+  }
+
+  /**
+   * 里程碑数据下拉
+   */
+  mieList = []; //里程碑下来数据
+  getMieList(proArchivesId) {
+    return new Promise(resolve => {
+      let plan = { id: proArchivesId, planType: '2' };
+      this.projectManageArchivesService.getPlanListById(plan).then(response => {
+        if (response.result) {
+          this.mieList = response.result;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 里程碑选择事件
    */
-  proChange(event){
+  milChange(event) {
+    if (event) {
+      //获取里程碑id和名称
+      this.mieList.forEach(element => {
+        if (event === element.key) {
+          this.proWorkMilestone.planId = element.id;
+          this.proWorkMilestone.mileName = element.milesName;
+        }
+      });
+    }
+  }
+
+  fileList = [];
 
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    console.log(JSON.parse(JSON.stringify(this.fileList)))
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
   }
 
   /**
    * 保存按钮
    */
-  submitForm(){
+  uploadUrlList = []; //传入后台的文件地址集合
+  submitForm() {
     for (const i in this.validateForm.controls) {
       this.validateForm.controls[i].markAsDirty();
       this.validateForm.controls[i].updateValueAndValidity();
     }
     let valid = this.validateForm.valid;
+    if (valid) {
+      this.proWorkMilestone.type="2";
+      this.proWorkMilestone.pkOrg=sessionStorage.getItem("pkOrg");
+      //获取里程碑确认状态
+      if (this.milSwitch) {
+        this.proWorkMilestone.mileConfirm = 1;
+      } else {
+        this.proWorkMilestone.mileConfirm = 0;
+      }
+      //事件格式化
+      this.proWorkMilestone.confirmTime = this.datePipe.transform(
+        this.proWorkMilestone.confirmTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      //文件集合
+      this.getFileList();
+      this.proWorkMilestone.fileList=this.uploadUrlList;
+      this.proWorkMilestoneService.add(this.proWorkMilestone).then((response)=>{
+        if (response.success) {
+          //保存成功
+          this.isLoadingSave = false;
+          this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+          this.drawerRef.close(true);
+        } else {
+          //保存失败
+          this.isLoadingSave = false;
+          this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+        }
+      })
+    }
+  }
 
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          }
+        ];
+      });
+    }
   }
 
-  close() {}
+  close() {
+    this.drawerRef.close();
+  }
+
+  //显示路径
+  setAppendix(file: any) {
+    const url = file.fileUrl;
+    if (url != null && url !== '') {
+      const idx = url.lastIndexOf('/');
+      const fileUrl = url.slice(idx + 1);
+      const index = fileUrl.lastIndexOf('_');
+      const i = fileUrl.lastIndexOf('.');
+      const fileName = fileUrl.substring(0, index);
+      const fileSuffix = fileUrl.slice(i + 1);
+      const f = fileName + '.' + fileSuffix;
+      return f;
+    }
+    return '';
+  }
 }

+ 8 - 4
src/app/routes/project-work/implementation-milestone-confirm/implementation-milestone-confirm.component.html

@@ -1,6 +1,6 @@
 <page-header [action]="phActionTpl">
   <ng-template #phActionTpl>
-    <button (click)="add()" nz-button nzType="primary">新建</button>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'implementation-milestone-confirm:add'">新建</button>
   </ng-template>
 </page-header>
 <nz-card>
@@ -51,11 +51,15 @@
             <td>{{ data.cusCode }}</td>
             <td>{{ data.cusName }}</td>
             <td>{{ data.mileName }}</td>
+            <td>
+              <nz-tag *ngIf="data.mileConfirm===0" [nzColor]="'red'">否</nz-tag>
+              <nz-tag *ngIf="data.mileConfirm===1" [nzColor]="'green'">是</nz-tag>
+            </td>
             <td>{{ data.confirmTime }}</td>
             <td>
-              <a (click)="update(data)" acl [acl-ability]="'implementation-log:update'">修改</a>
-              <nz-divider nzType="vertical" acl [acl-ability]="'implementation-log:update'"></nz-divider>
-              <a (click)="delete(data.id)" acl [acl-ability]="'implementation-log:delete'">删除</a>
+              <a (click)="update(data)" acl [acl-ability]="'implementation-milestone-confirm:update'">修改</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'implementation-milestone-confirm:update'"></nz-divider>
+              <a (click)="delete(data.id)" acl [acl-ability]="'implementation-milestone-confirm:delete'">删除</a>
             </td>
           </tr>
         </tbody>

+ 41 - 4
src/app/routes/project-work/implementation-milestone-confirm/implementation-milestone-confirm.component.ts

@@ -4,9 +4,10 @@ import { STColumn, STComponent } from '@delon/abc';
 import { SFSchema } from '@delon/form';
 import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
 import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
-import { NzDrawerService } from 'ng-zorro-antd';
+import { NzDrawerService, NzNotificationService } from 'ng-zorro-antd';
 import { ProjectWorkImplementationMilestoneConfirmAddComponent } from './add/add.component';
 import { I18NService } from '@core';
+import { ProjectWorkImplementationMilestoneConfirmUpdateComponent } from './update/update.component';
 
 @Component({
   selector: 'app-project-work-implementation-milestone-confirm',
@@ -16,10 +17,13 @@ export class ProjectWorkImplementationMilestoneConfirmComponent implements OnIni
   constructor(
     private proWorkMilestoneService:ProWorkMilestoneService,
     private nzDrawerService:NzDrawerService,
-    private i18NService:I18NService
+    private i18NService:I18NService,
+    private nzNotificationService:NzNotificationService
   ) {}
 
-  ngOnInit() {}
+  ngOnInit() {
+    this.getList()
+  }
 
   listOfData = [];
   proWorkMilestone: ProWorkMilestone = {}; //对象
@@ -40,10 +44,12 @@ export class ProjectWorkImplementationMilestoneConfirmComponent implements OnIni
    */
   getList() {
     // this.isSpinning=true;
+    this.isSpinning=true;
     this.proWorkMilestone.pkOrg = sessionStorage.getItem('pkOrg'); //组织
     this.proWorkMilestone.type = '2';
     this.proWorkMilestoneService.getList(this.proWorkMilestone).then(response => {
       this.listOfData = response.result.records;
+      this.isSpinning=false;
     });
   }
 
@@ -79,10 +85,41 @@ export class ProjectWorkImplementationMilestoneConfirmComponent implements OnIni
   }
 
   update(data){
+    const drawerRef = this.nzDrawerService.create<ProjectWorkImplementationMilestoneConfirmUpdateComponent, { id: string }, string>({
+      nzTitle: this.i18NService.fanyi("table.update"),//修改标题
+      nzContent: ProjectWorkImplementationMilestoneConfirmUpdateComponent,
+      nzWidth: window.innerWidth,
+      nzBodyStyle: { height: 'calc(100% - 55px)', overflow: 'auto', 'padding-bottom': '53px' },
+      nzContentParams: {
+        //id
+        id: data.id
+      }
+    });
 
+    //关闭抽屉的回调
+    drawerRef.afterClose.subscribe((isRefresh) => {
+      if (isRefresh) {//刷新list列表
+        this.getList();
+      }
+    });
   }
 
+  /**
+   * 删除按钮
+   * @param id 删除id
+   */
   delete(id){
-
+    let proWorkMilestone=new ProWorkMilestone();
+    proWorkMilestone.id=id;
+    this.proWorkMilestoneService.delete(proWorkMilestone).then((response)=>{
+      if (response.success) {
+        //删除成功
+        this.nzNotificationService.success(this.i18NService.fanyi('successful.deletion'), '');
+        this.getList();
+      } else {
+        //删除失败
+        this.nzNotificationService.error(this.i18NService.fanyi('delete.failed'), '');
+      }
+    })
   }
 }

+ 115 - 0
src/app/routes/project-work/implementation-milestone-confirm/update/update.component.html

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

+ 24 - 0
src/app/routes/project-work/implementation-milestone-confirm/update/update.component.spec.ts

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

+ 261 - 0
src/app/routes/project-work/implementation-milestone-confirm/update/update.component.ts

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

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

@@ -4,13 +4,17 @@ import { ProjectWorkImplementationLogComponent } from './implementation-log/impl
 import { ProjectWorkDevelopmentLogComponent } from './development-log/development-log.component';
 import { ProjectWorkServiceLogComponent } from './service-log/service-log.component';
 import { ProjectWorkImplementationMilestoneConfirmComponent } from './implementation-milestone-confirm/implementation-milestone-confirm.component';
+import { ProjectWorkDevelopmentMilestoneConfirmComponent } from './development-milestone-confirm/development-milestone-confirm.component';
+import { ProjectWorkServiceMilestoneConfirmComponent } from './service-milestone-confirm/service-milestone-confirm.component';
 
 const routes: Routes = [
 
   { path: 'implementation-log', component: ProjectWorkImplementationLogComponent },
   { path: 'development-log', component: ProjectWorkDevelopmentLogComponent },
   { path: 'service-log', component: ProjectWorkServiceLogComponent },
-  { path: 'implementation-milestone-confirm', component: ProjectWorkImplementationMilestoneConfirmComponent }];
+  { path: 'implementation-milestone-confirm', component: ProjectWorkImplementationMilestoneConfirmComponent },
+  { path: 'development-milestone-confirm', component: ProjectWorkDevelopmentMilestoneConfirmComponent },
+  { path: 'service-milestone-confirm', component: ProjectWorkServiceMilestoneConfirmComponent }];
 
 @NgModule({
   imports: [RouterModule.forChild(routes)],

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

@@ -12,12 +12,21 @@ import { ProjectWorkServiceLogAddComponent } from './service-log/add/add.compone
 import { ProjectWorkServiceLogUpdateComponent } from './service-log/update/update.component';
 import { ProjectWorkImplementationMilestoneConfirmComponent } from './implementation-milestone-confirm/implementation-milestone-confirm.component';
 import { ProjectWorkImplementationMilestoneConfirmAddComponent } from './implementation-milestone-confirm/add/add.component';
+import { ProjectWorkImplementationMilestoneConfirmUpdateComponent } from './implementation-milestone-confirm/update/update.component';
+import { ProjectWorkDevelopmentMilestoneConfirmComponent } from './development-milestone-confirm/development-milestone-confirm.component';
+import { ProjectWorkDevelopmentMilestoneConfirmAddComponent } from './development-milestone-confirm/add/add.component';
+import { ProjectWorkDevelopmentMilestoneConfirmUpdateComponent } from './development-milestone-confirm/update/update.component';
+import { ProjectWorkServiceMilestoneConfirmComponent } from './service-milestone-confirm/service-milestone-confirm.component';
+import { ProjectWorkServiceMilestoneConfirmAddComponent } from './service-milestone-confirm/add/add.component';
+import { ProjectWorkServiceMilestoneConfirmUpdateComponent } from './service-milestone-confirm/update/update.component';
 
 const COMPONENTS = [
   ProjectWorkImplementationLogComponent,
   ProjectWorkDevelopmentLogComponent,
   ProjectWorkServiceLogComponent,
-  ProjectWorkImplementationMilestoneConfirmComponent];
+  ProjectWorkImplementationMilestoneConfirmComponent,
+  ProjectWorkDevelopmentMilestoneConfirmComponent,
+  ProjectWorkServiceMilestoneConfirmComponent];
 const COMPONENTS_NOROUNT = [
   ProjectWorkImplementationLogAddComponent,
   ProjectWorkImplementationLogUpdateComponent,
@@ -25,7 +34,12 @@ const COMPONENTS_NOROUNT = [
   ProjectWorkDevelopmentLogUpdateComponent,
   ProjectWorkServiceLogAddComponent,
   ProjectWorkServiceLogUpdateComponent,
-  ProjectWorkImplementationMilestoneConfirmAddComponent];
+  ProjectWorkImplementationMilestoneConfirmAddComponent,
+  ProjectWorkImplementationMilestoneConfirmUpdateComponent,
+  ProjectWorkDevelopmentMilestoneConfirmAddComponent,
+  ProjectWorkDevelopmentMilestoneConfirmUpdateComponent,
+  ProjectWorkServiceMilestoneConfirmAddComponent,
+  ProjectWorkServiceMilestoneConfirmUpdateComponent];
 
 @NgModule({
   imports: [

+ 1 - 1
src/app/routes/project-work/service-log/service-log.component.html

@@ -1,6 +1,6 @@
 <page-header [action]="phActionTpl">
   <ng-template #phActionTpl>
-    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'url:service-log:view'">新建</button>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'service-log:add'">新建</button>
   </ng-template>
 </page-header>
 <nz-card>

+ 2 - 1
src/app/routes/project-work/service-log/service-log.component.ts

@@ -42,11 +42,12 @@ export class ProjectWorkServiceLogComponent implements OnInit {
    * 查询数据表
    */
   getList() {
-    // this.isSpinning=true;
+    this.isSpinning=true;
     this.proWorkLogic.pkOrg = sessionStorage.getItem('pkOrg'); //组织
     this.proWorkLogic.type="3";
     this.proWorkLogicService.getList(this.proWorkLogic).then(response => {
       this.listOfData = response.result.records;
+      this.isSpinning=false;
     });
   }
 

+ 115 - 0
src/app/routes/project-work/service-milestone-confirm/add/add.component.html

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

+ 24 - 0
src/app/routes/project-work/service-milestone-confirm/add/add.component.spec.ts

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

+ 223 - 0
src/app/routes/project-work/service-milestone-confirm/add/add.component.ts

@@ -0,0 +1,223 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { _HttpClient, SettingsService } from '@delon/theme';
+import { FormBuilder, Validators, FormGroup } from '@angular/forms';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { DatePipe } from '@angular/common';
+import { ProWorkMilestoneService } from 'app/services/project-work/pro-work-milestone.service';
+import { I18NService } from '@core';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { environment } from '@env/environment';
+
+@Component({
+  selector: 'app-project-work-service-milestone-confirm-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 ProjectWorkServiceMilestoneConfirmAddComponent implements OnInit {
+  constructor(
+    private fb: FormBuilder,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private datePipe: DatePipe,
+    private proWorkMilestoneService:ProWorkMilestoneService,
+    private nzNotificationService:NzNotificationService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private settingsService:SettingsService
+  ) {}
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      mileId: [null, [Validators.required]],
+      milSwitch: [null],
+      confirmTime: [null, [Validators.required]],
+    });
+    //项目集合
+    this.getProList().then(() => {});
+  }
+
+  validateForm!: FormGroup;
+  proWorkMilestone: ProWorkMilestone = {
+    currentUser: this.settingsService.user.realname,//当天填写人
+    createTime: this.datePipe.transform(new Date(), 'yyyy-MM-dd HH:mm:ss')//当前时间
+  }; //对象
+  isLoadingSave = false; //加载
+  proList = []; //项目下拉列表
+  milSwitch = false; //里程碑确认空间
+
+  /**
+   * 获取项目下拉数据
+   */
+  getProList() {
+    return new Promise(resolve => {
+      let projectManageArchives = new ProjectManageArchives();
+      projectManageArchives.pageSize = 20000;
+      projectManageArchives.pkOrg = sessionStorage.getItem('pkOrg');
+      this.projectManageArchivesService.getList(projectManageArchives).then(response => {
+        if (response.result.records) {
+          this.proList = response.result.records;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 项目选择事件
+   * @param event 项目档案id
+   */
+  proChange(event) {
+    if (event) {
+      //根据id获取项目档案数据
+      this.projectManageArchivesService.getListById(event).then(response => {
+        if (response.success) {
+          let project = JSON.parse(JSON.stringify(response.result)); //项目档案对象
+          this.proWorkMilestone.proCode = project.proCode; //项目档案编码
+          this.proWorkMilestone.proName = project.proName; //项目档案名称
+          this.proWorkMilestone.cusId = project.cusId; //客户id
+          this.proWorkMilestone.cusCode = project.cusCode; //客户编码
+          this.proWorkMilestone.cusName = project.cusName; //客户名称
+          this.getMieList(event);
+        }
+      });
+    }
+  }
+
+  /**
+   * 里程碑数据下拉
+   */
+  mieList = []; //里程碑下来数据
+  getMieList(proArchivesId) {
+    return new Promise(resolve => {
+      let plan = { id: proArchivesId, planType: '4' };
+      this.projectManageArchivesService.getPlanListById(plan).then(response => {
+        if (response.result) {
+          this.mieList = response.result;
+        }
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 里程碑选择事件
+   */
+  milChange(event) {
+    if (event) {
+      //获取里程碑id和名称
+      this.mieList.forEach(element => {
+        if (event === element.key) {
+          this.proWorkMilestone.planId = element.id;
+          this.proWorkMilestone.mileName = element.milesName;
+        }
+      });
+    }
+  }
+
+  fileList = [];
+
+  handleChange(info: any): void {
+    this.fileList = info.fileList;
+    console.log(JSON.parse(JSON.stringify(this.fileList)))
+    this.fileList.forEach(element => {
+      if(!element.url&&element.response){
+        element.url = environment.SERVER_URL + "sys/common/downloadFile/" + element.response.message
+      }
+    });
+  }
+
+  /**
+   * 保存按钮
+   */
+  uploadUrlList = []; //传入后台的文件地址集合
+  submitForm() {
+    for (const i in this.validateForm.controls) {
+      this.validateForm.controls[i].markAsDirty();
+      this.validateForm.controls[i].updateValueAndValidity();
+    }
+    let valid = this.validateForm.valid;
+    if (valid) {
+      this.proWorkMilestone.type="3";
+      this.proWorkMilestone.pkOrg=sessionStorage.getItem("pkOrg");
+      //获取里程碑确认状态
+      if (this.milSwitch) {
+        this.proWorkMilestone.mileConfirm = 1;
+      } else {
+        this.proWorkMilestone.mileConfirm = 0;
+      }
+      //事件格式化
+      this.proWorkMilestone.confirmTime = this.datePipe.transform(
+        this.proWorkMilestone.confirmTime,
+        'yyyy-MM-dd HH:mm:ss',
+      );
+      //文件集合
+      this.getFileList();
+      this.proWorkMilestone.fileList=this.uploadUrlList;
+      this.proWorkMilestoneService.add(this.proWorkMilestone).then((response)=>{
+        if (response.success) {
+          //保存成功
+          this.isLoadingSave = false;
+          this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+          this.drawerRef.close(true);
+        } else {
+          //保存失败
+          this.isLoadingSave = false;
+          this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+        }
+      })
+    }
+  }
+
+  /**
+   * 获取文件集合
+   */
+  getFileList() {
+    if (this.fileList != null && this.fileList.length > 0) {
+      this.fileList.forEach(element => {
+        this.uploadUrlList = [
+          ...this.uploadUrlList,
+          {
+            fileUrl: element.response.message, //文件地址
+          }
+        ];
+      });
+    }
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+
+  //显示路径
+  setAppendix(file: any) {
+    const url = file.fileUrl;
+    if (url != null && url !== '') {
+      const idx = url.lastIndexOf('/');
+      const fileUrl = url.slice(idx + 1);
+      const index = fileUrl.lastIndexOf('_');
+      const i = fileUrl.lastIndexOf('.');
+      const fileName = fileUrl.substring(0, index);
+      const fileSuffix = fileUrl.slice(i + 1);
+      const f = fileName + '.' + fileSuffix;
+      return f;
+    }
+    return '';
+  }
+}

+ 69 - 0
src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.html

@@ -0,0 +1,69 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <button (click)="add()" nz-button nzType="primary" acl [acl-ability]="'service-milestone-confirm:add'">新建</button>
+  </ng-template>
+</page-header>
+<nz-card>
+  <!-- 查询条件 -->
+  <form nz-form>
+    <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">单据编码</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <input nz-input name="code" [(ngModel)]="proWorkMilestone.billcode" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="2" [nzXs]="24" [nzNoColon]=true></nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <button nzType="primary" (click)="query()" nz-button><span>查询</span></button>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+   <!-- 表格 -->
+   <div nz-row [nzGutter]="{ xs: 8, sm: 16, md: 24, lg: 32 }">
+    <div nz-col [nzSpan]="24">
+      <nz-table nzSize="small" #basicTable [nzData]="listOfData" [nzFrontPagination]="false" [nzTotal]="page.total"
+        [nzPageIndex]="page.current" (nzPageIndexChange)="pageIndexChange($event)" [nzLoading]="isSpinning">
+        <thead>
+          <tr>
+            <th>单据编码</th>
+            <th>项目编码</th>
+            <th>项目名称</th>
+            <th>客户编码</th>
+            <th>客户名称</th>
+            <th>项目里程碑</th>
+            <th>里程碑确认</th>
+            <th>确认时间</th>
+            <th>操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr *ngFor="let data of basicTable.data">
+            <td>{{ data.billcode }}</td>
+            <td>{{ data.proCode }}</td>
+            <td>{{ data.proName }}</td>
+            <td>{{ data.cusCode }}</td>
+            <td>{{ data.cusName }}</td>
+            <td>{{ data.mileName }}</td>
+            <td>
+              <nz-tag *ngIf="data.mileConfirm===0" [nzColor]="'red'">否</nz-tag>
+              <nz-tag *ngIf="data.mileConfirm===1" [nzColor]="'green'">是</nz-tag>
+            </td>
+            <td>{{ data.confirmTime }}</td>
+            <td>
+              <a (click)="update(data)" acl [acl-ability]="'service-milestone-confirm:update'">修改</a>
+              <nz-divider nzType="vertical" acl [acl-ability]="'service-milestone-confirm:update'"></nz-divider>
+              <a (click)="delete(data.id)" acl [acl-ability]="'service-milestone-confirm:delete'">删除</a>
+            </td>
+          </tr>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+</nz-card>

+ 24 - 0
src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.spec.ts

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

+ 125 - 0
src/app/routes/project-work/service-milestone-confirm/service-milestone-confirm.component.ts

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

+ 115 - 0
src/app/routes/project-work/service-milestone-confirm/update/update.component.html

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

+ 24 - 0
src/app/routes/project-work/service-milestone-confirm/update/update.component.spec.ts

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

+ 261 - 0
src/app/routes/project-work/service-milestone-confirm/update/update.component.ts

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

+ 5 - 0
src/app/services/project-manage-archives/project-manage-archives.service.ts

@@ -27,6 +27,11 @@ export class ProjectManageArchivesService {
   }
 
   //根据id查询
+  async queryById(id: string): Promise<BaseResponse<any>> {
+    return await this.http.get<BaseResponse<any>>("archives/projectManageArchives/queryById", { params: { id: id } }).toPromise();
+  }
+
+  //根据id查询主子表
   async getListById(id: string): Promise<BaseResponse<any>> {
     return await this.http.get<BaseResponse<any>>("archives/projectManageArchives/getListById", { params: { id: id } }).toPromise();
   }

+ 26 - 5
src/app/services/project-work/pro-work-milestone.service.ts

@@ -2,22 +2,43 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { BaseResponse } from 'app/entity/baseResponse';
 import { Result } from 'app/entity/Result';
+import { ProWorkMilestone } from 'app/entity/project-work/pro-work-milestone';
 
 @Injectable({
-  providedIn: 'root'
+  providedIn: 'root',
 })
 /**
  * 里程碑确认单
  */
 export class ProWorkMilestoneService {
+  constructor(private http: HttpClient) {}
 
-  constructor(private http:HttpClient) { }
-
-   //分页查询
-   async getList(body: any): Promise<BaseResponse<Result<any>>> {
+  //分页查询
+  async getList(body: any): Promise<BaseResponse<Result<any>>> {
     return await this.http
       .get<BaseResponse<Result<any>>>('/prowork/proWorkMilestone/list', { params: body })
       .toPromise();
   }
 
+  //新增
+  async add(body: ProWorkMilestone): Promise<BaseResponse<any>> {
+    return await this.http.post<BaseResponse<any>>('/prowork/proWorkMilestone/add', body).toPromise();
+  }
+
+  //根据id查询
+  async queryById(id: string): Promise<BaseResponse<any>> {
+    return await this.http
+      .get<BaseResponse<any>>('prowork/proWorkMilestone/queryById', { params: { id: id } })
+      .toPromise();
+  }
+
+  //修改
+  async update(body: ProWorkMilestone): Promise<BaseResponse<any>> {
+    return await this.http.put<BaseResponse<any>>('prowork/proWorkMilestone/edit', body).toPromise();
+  }
+
+  //删除
+  async delete(body: any): Promise<BaseResponse<any>> {
+    return await this.http.delete<BaseResponse<any>>('prowork/proWorkMilestone/delete', { params: body }).toPromise();
+  }
 }