Parcourir la source

项目档案等

chenc il y a 4 ans
Parent
commit
f538e49526
42 fichiers modifiés avec 1569 ajouts et 63 suppressions
  1. 2 0
      src/app/entity/expense-reimbursement/re-expense-slip.ts
  2. 5 1
      src/app/routes/basedata/base-archives-milestone/base-archives-milestone.component.ts
  3. 4 2
      src/app/routes/basedata/basedata-routing.module.ts
  4. 7 3
      src/app/routes/basedata/basedata.module.ts
  5. 34 0
      src/app/routes/basedata/milestone-category/edit/edit.component.html
  6. 24 0
      src/app/routes/basedata/milestone-category/edit/edit.component.spec.ts
  7. 90 0
      src/app/routes/basedata/milestone-category/edit/edit.component.ts
  8. 30 0
      src/app/routes/basedata/milestone-category/milestone-category.component.html
  9. 24 0
      src/app/routes/basedata/milestone-category/milestone-category.component.spec.ts
  10. 102 0
      src/app/routes/basedata/milestone-category/milestone-category.component.ts
  11. 61 1
      src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.html
  12. 147 14
      src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.ts
  13. 4 4
      src/app/routes/expense-reimbursement/expense-reimbursement-form/expense-reimbursement-form.component.html
  14. 33 5
      src/app/routes/expense-reimbursement/expense-reimbursement-form/expense-reimbursement-form.component.ts
  15. 118 0
      src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.html
  16. 24 0
      src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.spec.ts
  17. 255 0
      src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.ts
  18. 3 1
      src/app/routes/expense-reimbursement/expense-reimbursement.module.ts
  19. 68 0
      src/app/routes/project-manage-archives/add/add.component.ts
  20. 2 3
      src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.ts
  21. 1 0
      src/app/routes/project-manage-archives/add/development/development.component.ts
  22. 1 0
      src/app/routes/project-manage-archives/add/implementation/implementation.component.ts
  23. 1 0
      src/app/routes/project-manage-archives/add/serviceta/serviceta.component.ts
  24. 3 3
      src/app/routes/project-manage-archives/update/business-affairs/business-affairs.component.ts
  25. 68 0
      src/app/routes/project-manage-archives/update/update.component.ts
  26. 9 0
      src/app/routes/report-form/project-statistics/project-statistics.component.html
  27. 24 0
      src/app/routes/report-form/project-statistics/project-statistics.component.spec.ts
  28. 45 0
      src/app/routes/report-form/project-statistics/project-statistics.component.ts
  29. 13 0
      src/app/routes/report-form/report-form-routing.module.ts
  30. 21 0
      src/app/routes/report-form/report-form.module.ts
  31. 2 2
      src/app/routes/system/depart/depart.component.html
  32. 1 1
      src/app/routes/system/depart/depart.component.ts
  33. 34 18
      src/app/routes/system/depart/personnel-add/personnel-add.component.html
  34. 44 2
      src/app/routes/system/depart/personnel-add/personnel-add.component.ts
  35. 48 0
      src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.html
  36. 24 0
      src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.spec.ts
  37. 156 0
      src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.ts
  38. 4 2
      src/app/routes/system/system.module.ts
  39. 1 1
      src/app/routes/system/user/user.component.ts
  40. 30 0
      src/app/services/expense-reimbursement/re-expense-slip.service.ts
  41. 1 0
      src/assets/tmp/i18n/en-US.json
  42. 1 0
      src/assets/tmp/i18n/zh-CN.json

+ 2 - 0
src/app/entity/expense-reimbursement/re-expense-slip.ts

@@ -24,4 +24,6 @@ export class ReExpenseSlip  extends Page{
     proName?:string;
     //组织
     pkOrg?:string;
+    //明细集合
+    detailList?:any[];
 }

+ 5 - 1
src/app/routes/basedata/base-archives-milestone/base-archives-milestone.component.ts

@@ -64,7 +64,11 @@ export class BasedataBaseArchivesMilestoneComponent implements OnInit {
   getTreeList() {
     this.baseArchivesMilestone.pkOrg=sessionStorage.getItem("pkOrg");//组织
     this.baseArchivesMilestoneService.getTreeList(this.baseArchivesMilestone).then((response)=>{
-      this.listOfMapData=response.result
+      if(response.result){
+        this.listOfMapData=response.result
+      }else{
+        this.listOfMapData=[];
+      }
       this.getLoding();
     })
 

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

@@ -9,7 +9,8 @@ import { BasedataPostComponent } from './post/post.component';
 import { BasedataProjectApprovalComponent } from './project-approval/project-approval.component';
 import { BasedataBaseArchivesMilestoneComponent } from './base-archives-milestone/base-archives-milestone.component';
 import { BasedataBaseArchivesCollectionLineComponent } from './base-archives-collection-line/base-archives-collection-line.component';
-import { BasedataBaseArchivesCostComponent } from './base-archives-cost/base-archives-cost.component';
+import { BasedataBaseArchivesCostComponent } from './base-archives-cost/base-archives-cost.component';
+import { BasedataMilestoneCategoryComponent } from './milestone-category/milestone-category.component';
 
 const routes: Routes = [
   { path: 'customer', component: BasedataCustomerComponent },
@@ -20,7 +21,8 @@ const routes: Routes = [
   { path: 'project-approval', component: BasedataProjectApprovalComponent },
   { path: 'base-archives-milestone', component: BasedataBaseArchivesMilestoneComponent },
   { path: 'base-archives-collection-line', component: BasedataBaseArchivesCollectionLineComponent },
-  { path: 'base-archives-cost', component: BasedataBaseArchivesCostComponent }];
+  { path: 'base-archives-cost', component: BasedataBaseArchivesCostComponent },
+  { path: 'milestone-category', component: BasedataMilestoneCategoryComponent }];
 @NgModule({
   imports: [RouterModule.forChild(routes)],
   exports: [RouterModule]

+ 7 - 3
src/app/routes/basedata/basedata.module.ts

@@ -18,7 +18,9 @@ import { BasedataBaseArchivesMilestoneAddComponent } from './base-archives-miles
 import { BasedataBaseArchivesCollectionLineComponent } from './base-archives-collection-line/base-archives-collection-line.component';
 import { BasedataBaseArchivesCollectionLineAddComponent } from './base-archives-collection-line/add/add.component';
 import { BasedataBaseArchivesCostComponent } from './base-archives-cost/base-archives-cost.component';
-import { BasedataBaseArchivesCostAddComponent } from './base-archives-cost/add/add.component';
+import { BasedataBaseArchivesCostAddComponent } from './base-archives-cost/add/add.component';
+import { BasedataMilestoneCategoryComponent } from './milestone-category/milestone-category.component';
+import { BasedataMilestoneCategoryEditComponent } from './milestone-category/edit/edit.component';
 
 const COMPONENTS = [
   BasedataCustomerComponent,
@@ -30,14 +32,16 @@ const COMPONENTS = [
   BasedataProjectApprovalComponent,
   BasedataBaseArchivesMilestoneComponent,
   BasedataBaseArchivesCollectionLineComponent,
-  BasedataBaseArchivesCostComponent];
+  BasedataBaseArchivesCostComponent,
+  BasedataMilestoneCategoryComponent];
 const COMPONENTS_NOROUNT = [BasedataCustomerEditComponent,
   BasedataCustomerIsAbbreviationComponent,
   BasedataPostAddComponent,
   BasedataProjectApprovalAddComponent,
   BasedataBaseArchivesMilestoneAddComponent,
   BasedataBaseArchivesCollectionLineAddComponent,
-  BasedataBaseArchivesCostAddComponent];
+  BasedataBaseArchivesCostAddComponent,
+  BasedataMilestoneCategoryEditComponent];
 
 @NgModule({
   imports: [

+ 34 - 0
src/app/routes/basedata/milestone-category/edit/edit.component.html

@@ -0,0 +1,34 @@
+<nz-modal [(nzVisible)]="isVisible" nzTitle="{{title}}" nzClosable="false" nzWidth="900" (nzOnCancel)="handleCancel()" (nzOnOk)="handleOk('')">
+  <form nz-form >
+    <nz-form-item>
+      <nz-form-label class="back-gauge" [nzSm]="6" [nzXs]="24" nzFor="itemText" nzRequired>{{ 'contract.name' | translate }}</nz-form-label>
+      <nz-form-control [nzSm]="14" [nzXs]="24">
+        <input nz-input placeholder="{{'please.enter.name'|translate}}" [(ngModel)]="dictitem.itemText" id="itemText" name="itemText"/>
+      </nz-form-control>
+    </nz-form-item>
+    <nz-form-item>
+      <nz-form-label class="back-gauge" [nzSm]="6" [nzXs]="24" nzFor="itemValue" nzRequired>{{'data.value'|translate}}</nz-form-label>
+      <nz-form-control [nzSm]="14" [nzXs]="24">
+        <input nz-input placeholder="{{'please.enter.data.value'|translate}}" [(ngModel)]="dictitem.itemValue" id="itemValue" name="itemValue"/>
+      </nz-form-control>
+    </nz-form-item>
+    <nz-form-item>
+      <nz-form-label class="back-gauge" [nzSm]="6" [nzXs]="24" nzFor="description">{{'depart.description'|translate}}</nz-form-label>
+      <nz-form-control [nzSm]="14" [nzXs]="24">
+        <input nz-input placeholder="" [(ngModel)]="dictitem.description" id="description" name="description"/>
+      </nz-form-control>
+    </nz-form-item>
+    <nz-form-item>
+      <nz-form-label class="back-gauge" [nzSm]="6" [nzXs]="24" nzFor="sortOrder">{{'depart.sort'|translate}}</nz-form-label>
+      <nz-form-control [nzSm]="14" [nzXs]="24">
+        <input nz-input placeholder="" [(ngModel)]="dictitem.sortOrder" id="sortOrder" name="sortOrder"/>
+      </nz-form-control>
+    </nz-form-item>
+    <nz-form-item>
+      <nz-form-label class="back-gauge" [nzSm]="6" [nzXs]="24" nzFor="status">{{"depart.Whether.to.enable"|translate}}</nz-form-label>
+      <nz-form-control [nzSm]="14" [nzXs]="24">
+          <nz-switch [(ngModel)]="dictitem.status" name="status" nzCheckedChildren="{{'yes'|translate}}" nzUnCheckedChildren="{{'no'|translate}}"></nz-switch>
+      </nz-form-control>
+    </nz-form-item>
+  </form>
+</nz-modal>

+ 24 - 0
src/app/routes/basedata/milestone-category/edit/edit.component.spec.ts

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

+ 90 - 0
src/app/routes/basedata/milestone-category/edit/edit.component.ts

@@ -0,0 +1,90 @@
+import { Component, OnInit, Output, EventEmitter } from '@angular/core';
+import { NzModalRef, NzMessageService, NzNotificationService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { DictService } from 'app/services/dict.service';
+import { I18NService } from '@core';
+import { messageShared } from '@shared/utils/message';
+
+@Component({
+  selector: 'app-basedata-milestone-category-edit',
+  templateUrl: './edit.component.html',
+})
+export class BasedataMilestoneCategoryEditComponent implements OnInit {
+  
+  constructor(
+    private msgSrv: NzMessageService,
+    private notification: NzNotificationService,
+    private dictService:DictService,
+    private i18NService:I18NService
+  ) {}
+
+  ngOnInit(): void {
+    this.initDictItem();
+  }
+
+  isVisible = false;
+  dictitem:any;
+  title="";
+  @Output() afterSave = new EventEmitter<string>();
+
+  add(id){
+    this.isVisible = true;
+    this.title=this.i18NService.fanyi("add.dictionary.data.items")
+    this.dictitem = {
+      dictId:id,
+      status:1
+    }
+  }
+
+  edit(item){
+    this.isVisible = true;
+    this.title=this.i18NService.fanyi("modify.dictionary.data.items")
+    this.dictitem = item;
+  }
+
+  handleOk(value: any) {
+    if(this.dictitem.id==null ||this.dictitem.id==""){
+      this.dictService.addDictItem(this.dictitem).then((response) => {
+        if(response.success){
+          this.notification.success(this.i18NService.fanyi("insert.success"),"");
+          this.afterSave.emit(this.dictitem.dictId);
+          this.initDictItem();
+          this.close();
+        }else{
+          this.notification.error(this.i18NService.fanyi("insert.defeated"),messageShared(this.i18NService,response.message));
+        }
+      })
+    }else{
+      this.dictService.editDictItem(this.dictitem).then((response) => {
+        if(response.success){
+          this.notification.success(this.i18NService.fanyi("successful.revision"),"");
+          this.afterSave.emit(this.dictitem.dictId);
+          this.initDictItem();
+          this.close();
+        }else{
+          this.notification.error(this.i18NService.fanyi("modification.failed"),messageShared(this.i18NService,response.message));
+        }
+      })
+    }
+  }
+
+  close() {
+    this.isVisible = false;
+  }
+
+  handleCancel(){
+    this.close();
+  }
+
+  initDictItem(){
+    this.dictitem = {
+      id:"",
+      itemText:"",
+      itemValue:"",
+      sortOrder:"",
+      status:"",
+      dictId:"",
+      description:""
+    }
+  }
+}

+ 30 - 0
src/app/routes/basedata/milestone-category/milestone-category.component.html

@@ -0,0 +1,30 @@
+<page-header [action]="phActionTpl">
+  <ng-template #phActionTpl>
+    <button (click)="add()" nz-button nzType="primary">新建</button>
+  </ng-template>
+</page-header>
+<nz-card>
+  <nz-table nzSize="small" #basicTable [nzData]="listOfData" [nzFrontPagination]="false" [nzLoading]="isSpinning"
+  [nzTotal]="page.total" [nzPageIndex]="page.current" (nzPageIndexChange)="pageIndexChange($event)">
+    <thead>
+      <tr>
+        <th nzAlign="center">{{'contract.name'|translate}}</th>
+        <th nzAlign="center">{{'data.value'|translate}}</th>
+        <th nzAlign="center" style="width: 21%">{{'table.operation'|translate}}</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr *ngFor="let data of basicTable.data">
+        <td nzAlign="center">{{ data.itemText }}</td>
+        <td nzAlign="center">{{ data.itemValue }}</td>
+        <td nzAlign="center">
+          <a href="javascript:void(0);" (click)="edit(data)">{{'table.update'|translate}}</a>
+          <nz-divider nzType="vertical"></nz-divider>
+          <a href="javascript:void(0);" (click)="delete(data.id)">{{'table.delete'|translate}}</a>
+        </td>
+      </tr>
+    </tbody>
+  </nz-table>
+</nz-card>
+<app-basedata-milestone-category-edit #categoryEdit (afterSave)="getDictItems()">
+</app-basedata-milestone-category-edit>

+ 24 - 0
src/app/routes/basedata/milestone-category/milestone-category.component.spec.ts

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

+ 102 - 0
src/app/routes/basedata/milestone-category/milestone-category.component.ts

@@ -0,0 +1,102 @@
+import { Component, OnInit, ViewChild, HostListener } from '@angular/core';
+import { _HttpClient, ModalHelper } from '@delon/theme';
+import { STColumn, STComponent } from '@delon/abc';
+import { SFSchema } from '@delon/form';
+import { NzNotificationService } from 'ng-zorro-antd';
+import { DictService } from 'app/services/dict.service';
+import { I18NService } from '@core';
+import { DictItem } from 'app/entity/dict-item';
+import { messageShared } from '@shared/utils/message';
+import { BasedataMilestoneCategoryEditComponent } from './edit/edit.component';
+
+@Component({
+  selector: 'app-basedata-milestone-category',
+  templateUrl: './milestone-category.component.html',
+})
+export class BasedataMilestoneCategoryComponent implements OnInit {
+  constructor(
+    private notification: NzNotificationService,
+    private dictService: DictService,
+    private i18NService: I18NService,
+    ) { }
+
+  ngOnInit() { 
+    this.getDictItems();
+  }
+
+  visible = false;
+  drawerWidth = 900;
+  title="";
+  listOfData=[];
+  isSpinning=false;
+  item={
+    id:"",
+    itemText:"",
+    itemValue:"",
+    dictName:"",
+    dictCode:""
+  };
+
+  @ViewChild("categoryEdit") categoryEdit:BasedataMilestoneCategoryEditComponent;
+  @HostListener('window:resize', ['$event'])
+  onResize(event) {
+    const width = event.target.innerWidth;
+    if(width>900){
+      this.drawerWidth = 900;
+    }else{
+      this.drawerWidth = width;
+    }
+  }
+
+  dictItem:DictItem={}//处理查询条件
+  page:any={};//分页参数对象
+
+  getDictItems(){
+    // this.dictItem.dictId=this.item.id;
+    this.dictItem.dictId="0cbf1113fd44010fb464aa4d2daacf6a";
+    this.isSpinning = true;
+    this.dictService.getDictItems(this.dictItem).then((response)=>{
+      this.listOfData = response.result.records;
+      this.page=response.result
+      this.isSpinning = false;
+    })
+  }
+
+  //页码点击事件
+  pageIndexChange(event) {
+    this.dictItem.pageNo = event; // 当前页码
+    this.getDictItems();
+  }
+
+  config(item) {
+    this.visible = true;
+    this.title = this.i18NService.fanyi("configuration.dictionary")
+    this.item = item;
+    this.getDictItems();
+  }
+
+  close(){
+    this.visible = false;
+  }
+
+  add(){
+    this.categoryEdit.add(this.item.id);
+  }
+
+  edit(item){
+    this.categoryEdit.edit(item);
+  }
+
+  delete(id:string){
+    this.dictService.deleteDictItem(id).then((response) => {
+      if(response.success){
+        this.notification.success(this.i18NService.fanyi("successful.deletion"),"");
+        this.getDictItems();
+      }else{
+        this.notification.error(this.i18NService.fanyi("delete.failed"),messageShared(this.i18NService,response.message));
+      }
+    })
+  }
+
+
+}

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

@@ -9,7 +9,7 @@
               formControlName="personId" id="personId" nzPlaceHolder="请选择" [(ngModel)]="reExpenseSlip.personId"
               [nzMaxTagCount]="3" [nzAllowClear]="true">
             </nz-tree-select>
-            <nz-form-explain *ngIf="validateForm.get('date')?.dirty && validateForm.get('date')?.errors">
+            <nz-form-explain *ngIf="validateForm.get('personId')?.dirty && validateForm.get('personId')?.errors">
               请选择人员
             </nz-form-explain>
           </nz-form-control>
@@ -42,7 +42,67 @@
         </nz-form-item>
       </div>
     </div>
+    <div nz-row [nzGutter]="24">
+      <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">
+            {{reExpenseSlip.producer}}
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">审核人</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            {{reExpenseSlip.reviewer}}
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
   </form>
+
+  <nz-card>
+    <div nz-row [nzGutter]="24">
+      <div nz-col [nzSpan]="24">
+        <!-- 新增按钮 -->
+        <!-- <button (click)="addRow()" nz-button nzType="primary">{{ 'button.add' | translate }}</button> -->
+      </div>
+    </div>
+    <div nz-row [nzGutter]="24">
+      <div nz-col [nzSpan]="24">
+        <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable
+          [nzData]="itemDataList" [nzFrontPagination]="false" [nzShowPagination]="false" >
+          <thead>
+            <tr>
+              <th nzAlign="center">序号</th>
+              <th>费用项目</th>
+              <th>金额</th>
+              <th>操作</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr *ngFor="let data of basicTable.data;let i=index">
+              <td nzAlign="center">{{i+1}}</td>
+              <td style="width: 20%;">
+                <nz-select style="width: 100%;" nzShowSearch [(ngModel)]="data.costId" nzPlaceHolder="请选择">
+                <nz-option *ngFor="let i of costIdList" [nzValue]="i.id" [nzLabel]="i.name"></nz-option>
+              </nz-select>
+              </td>
+              <td>
+                <nz-input-number [(ngModel)]="data.price" [nzMin]="0" [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
+              </td>
+              <td ><a nz-popconfirm nzTitle="是否删除?"
+                  (nzOnConfirm)="deleteRow(data.sort)">{{'table.delete'|translate}}</a></td>
+            </tr>
+            <tr>
+              <td colSpan="4"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
+            </tr>
+          </tbody>
+        </nz-table>
+      </div>
+    </div>
+  </nz-card>
 </nz-spin>
 
 <!-- 按钮 -->

+ 147 - 14
src/app/routes/expense-reimbursement/expense-reimbursement-form/add/add.component.ts

@@ -1,12 +1,17 @@
 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 { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
 import { PersonnelService } from 'app/services/basedata/personnel.service';
 import { recursiveQuery } from '@shared';
 import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
 import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { BaseArchivesCost } from 'app/entity/basedata/base-archives-cost';
+import { BaseArchivesCostService } from 'app/services/basedata/base-archives-cost.service';
+import { ReExpenseSlipService } from 'app/services/expense-reimbursement/re-expense-slip.service';
+import { I18NService } from '@core';
+import { DatePipe } from '@angular/common';
 
 @Component({
   selector: 'app-expense-reimbursement-expense-reimbursement-form-add',
@@ -30,28 +35,42 @@ import { ProjectManageArchivesService } from 'app/services/project-manage-archiv
 export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements OnInit {
   constructor(
     private fb: FormBuilder,
-    private personnelService:PersonnelService,
-    private projectManageArchivesService:ProjectManageArchivesService
+    private personnelService: PersonnelService,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private settingsService: SettingsService,
+    private baseArchivesCostService: BaseArchivesCostService,
+    private nzNotificationService:NzNotificationService,
+    private reExpenseSlipService:ReExpenseSlipService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private datePipe:DatePipe
   ) {}
 
   ngOnInit(): void {
     //初始化表单
     this.validateForm = this.fb.group({
       proId: [null, [Validators.required]],
-      date:[null,[Validators.required]],
-      personId:[null,[Validators.required]]
+      date: [null, [Validators.required]],
+      personId: [null, [Validators.required]],
     });
+    this.isLoadingSave=true;
     //人员
-    this.getPersonnelList().then(()=>{
-      return this.getProList();//项目下拉
-    })
+    this.getPersonnelList().then(() => {
+      return this.getProList(); //项目下拉
+    }).then(()=>{
+      return this.getCostIdList();//费用项目数据
+    }).then(()=>{
+      this.isLoadingSave=false;
+    });
   }
 
-  isLoadingSave=false;
+  isLoadingSave = false;
   validateForm!: FormGroup;
-  reExpenseSlip:ReExpenseSlip={};//对象
-  proList=[];//项目集合
-  personnelList=[];//人员集合
+  reExpenseSlip: ReExpenseSlip = {
+    producer: this.settingsService.user.realname,
+  }; //对象
+  proList = []; //项目集合
+  personnelList = []; //人员集合
 
   /**
    * 获取人员下拉数据到各个页签中
@@ -86,6 +105,57 @@ export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements
     });
   }
 
+  /**
+   * 增行按钮
+   */
+  itemDataList = []; //明细集合
+  sort = 0;
+  addRow() {
+    this.itemDataList = [
+      ...this.itemDataList,
+      {
+        price: '',
+        uncoPrice: '',
+        coPrice: '',
+        sort: this.sort,
+      },
+    ];
+    this.sort++;
+  }
+
+  /**
+   * 删除行
+   */
+  deleteRow(sort) {
+    this.itemDataList = this.itemDataList.filter(d => d.sort !== sort);
+  }
+
+  //金额格式化
+  formatterDollar = (value: number) => {
+    if (value) {
+      return `$ ${value}`;
+    } else {
+      return `$ `;
+    }
+  };
+  parserDollar = (value: string) => value.replace('$ ', '');
+
+  /**
+   * 查询费用档案数据
+   */
+  costIdList = []; //费用项目下拉数据集合
+  getCostIdList() {
+    return new Promise(resolve => {
+      let baseArchivesCost = new BaseArchivesCost();
+      baseArchivesCost.pkOrg = sessionStorage.getItem('pkOrg'); //组织
+      baseArchivesCost.pageSize = 20000;
+      this.baseArchivesCostService.getList(baseArchivesCost).then(response => {
+        this.costIdList = response.result.records;
+        resolve();
+      });
+    });
+  }
+
   /**
    * 保存提交
    */
@@ -96,8 +166,71 @@ export class ExpenseReimbursementExpenseReimbursementFormAddComponent implements
         this.validateForm.controls[i].updateValueAndValidity();
       }
       let valid = this.validateForm.valid;
+      if(valid){
+        this.isLoadingSave=true;
+        this.reExpenseSlip.pkOrg=sessionStorage.getItem("pkOrg");//组织
+        //日期
+        this.reExpenseSlip.date = this.datePipe.transform(this.reExpenseSlip.date, 'yyyy-MM-dd HH:mm:ss');
+        //人员名称
+        if (this.reExpenseSlip.personId) {
+          //循环集合数据获取名称
+          this.personnelList.forEach(pkOrg => {
+            pkOrg.children.forEach(depart => {
+              depart.children.forEach(personnel => {
+                if (personnel.key === this.reExpenseSlip.personId) {
+                  this.reExpenseSlip.person = personnel.name;
+                }
+              });
+            });
+          });
+        }
+        //项目名称
+        if(this.reExpenseSlip.proId){
+          this.proList.forEach(element => {
+            if(element.id===this.reExpenseSlip.proId){
+              this.reExpenseSlip.proName=element.proName;
+            }
+          });
+        }
+        //明细
+        if(this.itemDataList){
+          this.itemDataList.forEach(element => {
+            //获取明细中下拉选择的费用项目名称
+            if(element.costId){
+              this.costIdList.forEach(cost => {
+                if(cost.id===element.costId){
+                  element.costName=cost.name;
+                }
+              });
+            }else{
+              element.costName="";
+            }
+          });
+          //获取明细数据
+          this.reExpenseSlip.detailList=this.itemDataList;
+        }else{
+          this.nzNotificationService.warning('费用项目必填', '');
+          this.isLoadingSave=false;
+          return;
+        }
+        this.reExpenseSlipService.add(this.reExpenseSlip).then((response)=>{
+          if (response.success) {
+            //保存成功
+            this.isLoadingSave = false;
+            this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+            this.drawerRef.close(true);
+            resolve();
+          } else {
+            //保存失败
+            this.isLoadingSave = false;
+            this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+          }
+        })
+      }
     });
   }
 
-  close() {}
+  close() {
+    this.drawerRef.close();
+  }
 }

+ 4 - 4
src/app/routes/expense-reimbursement/expense-reimbursement-form/expense-reimbursement-form.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]="'expense-reimbursement-form:add'">新建</button>
   </ng-template>
 </page-header>
 <nz-card>
@@ -46,9 +46,9 @@
           <td>{{ data.proName }}</td>
           <td>{{ data.producer }}</td>
           <td>
-            <a (click)="update(data)" acl [acl-ability]="'receipt:update'">修改</a>
-            <nz-divider nzType="vertical" acl [acl-ability]="'receipt:update'"></nz-divider>
-            <a (click)="delete(data.id)" acl [acl-ability]="'receipt:delete'">删除</a>
+            <a (click)="update(data)" acl [acl-ability]="'expense-reimbursement-form:update'">修改</a>
+            <nz-divider nzType="vertical" acl [acl-ability]="'expense-reimbursement-form:update'"></nz-divider>
+            <a (click)="delete(data.id)" acl [acl-ability]="'expense-reimbursement-form:delete'">删除</a>
           </td>
         </tr>
       </tbody>

+ 33 - 5
src/app/routes/expense-reimbursement/expense-reimbursement-form/expense-reimbursement-form.component.ts

@@ -4,9 +4,10 @@ import { STColumn, STComponent } from '@delon/abc';
 import { SFSchema } from '@delon/form';
 import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
 import { ReExpenseSlipService } from 'app/services/expense-reimbursement/re-expense-slip.service';
-import { NzDrawerService } from 'ng-zorro-antd';
+import { NzDrawerService, NzNotificationService } from 'ng-zorro-antd';
 import { ExpenseReimbursementExpenseReimbursementFormAddComponent } from './add/add.component';
 import { I18NService } from '@core';
+import { ExpenseReimbursementExpenseReimbursementFormUpdateComponent } from './update/update.component';
 
 @Component({
   selector: 'app-expense-reimbursement-expense-reimbursement-form',
@@ -17,7 +18,8 @@ export class ExpenseReimbursementExpenseReimbursementFormComponent implements On
   constructor(
     private reExpenseSlipService:ReExpenseSlipService,
     private nzDrawerService:NzDrawerService,
-    private i18NService:I18NService
+    private i18NService:I18NService,
+    private nzNotificationService:NzNotificationService
   ) { }
 
   ngOnInit() { 
@@ -78,12 +80,38 @@ export class ExpenseReimbursementExpenseReimbursementFormComponent implements On
     });
   }
 
-  update(){
+  update(data){
+    const drawerRef = this.nzDrawerService.create<ExpenseReimbursementExpenseReimbursementFormUpdateComponent, { id: string }, string>({
+      nzTitle: this.i18NService.fanyi("table.update"),//修改标题
+      nzContent: ExpenseReimbursementExpenseReimbursementFormUpdateComponent,
+      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();
+      }
+    });
   }
 
-  delete(){
-
+  delete(id){
+    let reExpenseSlip={id:id}
+    this.reExpenseSlipService.delete(reExpenseSlip).then((response)=>{
+      if (response.success) {
+        //删除成功
+        this.nzNotificationService.success(this.i18NService.fanyi('successful.deletion'), '');
+        this.getList();
+      } else {
+        //删除失败
+        this.nzNotificationService.error(this.i18NService.fanyi('delete.failed'), '');
+      }
+    })
   }
 
 }

+ 118 - 0
src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.html

@@ -0,0 +1,118 @@
+<nz-spin [nzSpinning]="isLoadingSave">
+  <form nz-form [formGroup]="validateForm" (ngSubmit)="submitForm()">
+    <div nz-row [nzGutter]="24">
+      <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">
+            <nz-tree-select style="width: 100%" [nzNodes]="personnelList" nzShowSearch [nzMultiple]="false"
+              formControlName="personId" id="personId" nzPlaceHolder="请选择" [(ngModel)]="reExpenseSlip.personId"
+              [nzMaxTagCount]="3" [nzAllowClear]="true">
+            </nz-tree-select>
+            <nz-form-explain *ngIf="validateForm.get('personId')?.dirty && validateForm.get('personId')?.errors">
+              请选择人员
+            </nz-form-explain>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">日期</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <nz-date-picker formControlName="date" id="date" [(ngModel)]="reExpenseSlip.date">
+            </nz-date-picker>
+            <nz-form-explain *ngIf="validateForm.get('date')?.dirty && validateForm.get('date')?.errors">
+              请选择时间
+            </nz-form-explain>
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired>项目名称</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            <nz-select style="widows: 100%;" nzShowSearch nzAllowClear formControlName="proId" id="proId"
+              [(ngModel)]="reExpenseSlip.proId" nzPlaceHolder="请选择">
+              <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>
+    <div nz-row [nzGutter]="24">
+      <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">
+            {{reExpenseSlip.producer}}
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+      <div nz-col [nzSpan]="8">
+        <nz-form-item>
+          <nz-form-label [nzSm]="6" [nzXs]="24">审核人</nz-form-label>
+          <nz-form-control [nzSm]="14" [nzXs]="24">
+            {{reExpenseSlip.reviewer}}
+          </nz-form-control>
+        </nz-form-item>
+      </div>
+    </div>
+  </form>
+
+  <nz-card>
+    <div nz-row [nzGutter]="24">
+      <div nz-col [nzSpan]="24">
+        <!-- 新增按钮 -->
+        <!-- <button (click)="addRow()" nz-button nzType="primary">{{ 'button.add' | translate }}</button> -->
+      </div>
+    </div>
+    <div nz-row [nzGutter]="24">
+      <div nz-col [nzSpan]="24">
+        <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable
+          [nzData]="itemDataList" [nzFrontPagination]="false" [nzShowPagination]="false" >
+          <thead>
+            <tr>
+              <th nzAlign="center">序号</th>
+              <th>费用项目</th>
+              <th>金额</th>
+              <th>操作</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr *ngFor="let data of basicTable.data;let i=index">
+              <td nzAlign="center">{{i+1}}</td>
+              <td style="width: 20%;">
+                <nz-select style="width: 100%;" nzShowSearch [(ngModel)]="data.costId" nzPlaceHolder="请选择">
+                <nz-option *ngFor="let i of costIdList" [nzValue]="i.id" [nzLabel]="i.name"></nz-option>
+              </nz-select>
+              </td>
+              <td>
+                <nz-input-number [(ngModel)]="data.price" [nzMin]="0" [nzStep]="1" [nzFormatter]="formatterDollar" [nzParser]="parserDollar"></nz-input-number>
+              </td>
+              <td ><a nz-popconfirm nzTitle="是否删除?"
+                  (nzOnConfirm)="deleteRow(data.sort)">{{'table.delete'|translate}}</a></td>
+            </tr>
+            <tr>
+              <td colSpan="4"><button (click)="addRow()" nz-button nzType="dashed" nzBlock >{{ 'button.add' | translate }}</button></td>
+            </tr>
+          </tbody>
+        </nz-table>
+      </div>
+    </div>
+  </nz-card>
+</nz-spin>
+
+<!-- 按钮 -->
+<div class="base">
+  <!-- 关闭按钮 -->
+  <a nz-popconfirm nzTitle="{{'pm.contract.contract.add.button.cancel'|translate}}" (nzOnConfirm)="close()"
+    style="padding-right: 8px">
+    <button nz-button>{{'pm.quotation.cancel'|translate}}</button>
+  </a>
+  <!-- 保存按钮 -->
+  <button nz-button nzType="primary" class="ant-btn ant-btn-primary" (click)="submitForm()"
+    [nzLoading]="isLoadingSave"><span>{{'pm.finish' | translate}}</span></button>
+</div>

+ 24 - 0
src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.spec.ts

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

+ 255 - 0
src/app/routes/expense-reimbursement/expense-reimbursement-form/update/update.component.ts

@@ -0,0 +1,255 @@
+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 { PersonnelService } from 'app/services/basedata/personnel.service';
+import { ProjectManageArchivesService } from 'app/services/project-manage-archives/project-manage-archives.service';
+import { BaseArchivesCostService } from 'app/services/basedata/base-archives-cost.service';
+import { ReExpenseSlipService } from 'app/services/expense-reimbursement/re-expense-slip.service';
+import { I18NService } from '@core';
+import { DatePipe } from '@angular/common';
+import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
+import { recursiveQuery } from '@shared';
+import { ProjectManageArchives } from 'app/entity/project-manage-archives/project-manage-archives';
+import { BaseArchivesCost } from 'app/entity/basedata/base-archives-cost';
+
+@Component({
+  selector: 'app-expense-reimbursement-expense-reimbursement-form-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 ExpenseReimbursementExpenseReimbursementFormUpdateComponent implements OnInit {
+  constructor(
+    private fb: FormBuilder,
+    private personnelService: PersonnelService,
+    private projectManageArchivesService: ProjectManageArchivesService,
+    private settingsService: SettingsService,
+    private baseArchivesCostService: BaseArchivesCostService,
+    private nzNotificationService:NzNotificationService,
+    private reExpenseSlipService:ReExpenseSlipService,
+    private i18NService:I18NService,
+    private drawerRef:NzDrawerRef,
+    private datePipe:DatePipe
+  ) {}
+
+  ngOnInit(): void {
+    //初始化表单
+    this.validateForm = this.fb.group({
+      proId: [null, [Validators.required]],
+      date: [null, [Validators.required]],
+      personId: [null, [Validators.required]],
+    });
+    this.isLoadingSave=true;
+    //人员
+    this.getPersonnelList().then(() => {
+      return this.getProList(); //项目下拉
+    }).then(()=>{
+      return this.getCostIdList();//费用项目数据
+    }).then(()=>{
+      return this.getListById();//根据id查询
+    }).then(()=>{
+      this.isLoadingSave=false;
+    });
+  }
+
+  isLoadingSave = false;
+  validateForm!: FormGroup;
+  reExpenseSlip: ReExpenseSlip = {
+    producer: this.settingsService.user.realname,
+  }; //对象
+  proList = []; //项目集合
+  personnelList = []; //人员集合
+  id="";
+
+  /**
+   * 根据id查询主子表数据
+   */
+  getListById(){
+    return new Promise((resolve)=>{
+      this.reExpenseSlipService.getListById(this.id).then((response)=>{
+        this.reExpenseSlip=response.result;//主表
+        this.itemDataList=response.result.detailList;//子表明细
+        if(this.itemDataList){
+          this.sort=this.itemDataList.length+1;
+        }
+        resolve();
+      })
+    })
+  }
+
+  /**
+   * 获取人员下拉数据到各个页签中
+   */
+  getPersonnelList() {
+    return new Promise(resolve => {
+      this.personnelService.queryApprover(sessionStorage.getItem('pkOrg')).then(response => {
+        //人员
+        this.personnelList = JSON.parse(JSON.stringify(response.result));
+        recursiveQuery(this.personnelList);
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 获取项目下拉数据
+   */
+  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();
+      });
+    });
+  }
+
+  /**
+   * 增行按钮
+   */
+  itemDataList = []; //明细集合
+  sort = 0;
+  addRow() {
+    this.itemDataList = [
+      ...this.itemDataList,
+      {
+        price: '',
+        uncoPrice: '',
+        coPrice: '',
+        sort: this.sort,
+      },
+    ];
+    this.sort++;
+  }
+
+  /**
+   * 删除行
+   */
+  deleteRow(sort) {
+    this.itemDataList = this.itemDataList.filter(d => d.sort !== sort);
+  }
+
+  //金额格式化
+  formatterDollar = (value: number) => {
+    if (value) {
+      return `$ ${value}`;
+    } else {
+      return `$ `;
+    }
+  };
+  parserDollar = (value: string) => value.replace('$ ', '');
+
+  /**
+   * 查询费用档案数据
+   */
+  costIdList = []; //费用项目下拉数据集合
+  getCostIdList() {
+    return new Promise(resolve => {
+      let baseArchivesCost = new BaseArchivesCost();
+      baseArchivesCost.pkOrg = sessionStorage.getItem('pkOrg'); //组织
+      baseArchivesCost.pageSize = 20000;
+      this.baseArchivesCostService.getList(baseArchivesCost).then(response => {
+        this.costIdList = response.result.records;
+        resolve();
+      });
+    });
+  }
+
+  /**
+   * 保存提交
+   */
+  submitForm(): any {
+    return new Promise(resolve => {
+      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;
+        this.reExpenseSlip.pkOrg=sessionStorage.getItem("pkOrg");//组织
+        //日期
+        this.reExpenseSlip.date = this.datePipe.transform(this.reExpenseSlip.date, 'yyyy-MM-dd HH:mm:ss');
+        //人员名称
+        if (this.reExpenseSlip.personId) {
+          //循环集合数据获取名称
+          this.personnelList.forEach(pkOrg => {
+            pkOrg.children.forEach(depart => {
+              depart.children.forEach(personnel => {
+                if (personnel.key === this.reExpenseSlip.personId) {
+                  this.reExpenseSlip.person = personnel.name;
+                }
+              });
+            });
+          });
+        }
+        //项目名称
+        if(this.reExpenseSlip.proId){
+          this.proList.forEach(element => {
+            if(element.id===this.reExpenseSlip.proId){
+              this.reExpenseSlip.proName=element.proName;
+            }
+          });
+        }
+        //明细
+        if(this.itemDataList){
+          this.itemDataList.forEach(element => {
+            //获取明细中下拉选择的费用项目名称
+            if(element.costId){
+              this.costIdList.forEach(cost => {
+                if(cost.id===element.costId){
+                  element.costName=cost.name;
+                }
+              });
+            }else{
+              element.costName="";
+            }
+          });
+          //获取明细数据
+          this.reExpenseSlip.detailList=this.itemDataList;
+        }else{
+          this.nzNotificationService.warning('费用项目必填', '');
+          this.isLoadingSave=false;
+          return;
+        }
+        this.reExpenseSlipService.update(this.reExpenseSlip).then((response)=>{
+          if (response.success) {
+            //保存成功
+            this.isLoadingSave = false;
+            this.nzNotificationService.success(this.i18NService.fanyi('save.ok'), '');
+            this.drawerRef.close(true);
+            resolve();
+          } else {
+            //保存失败
+            this.isLoadingSave = false;
+            this.nzNotificationService.error(this.i18NService.fanyi('save.not'), '');
+          }
+        })
+      }
+    });
+  }
+
+  close() {
+    this.drawerRef.close();
+  }
+}

+ 3 - 1
src/app/routes/expense-reimbursement/expense-reimbursement.module.ts

@@ -3,11 +3,13 @@ import { SharedModule } from '@shared';
 import { ExpenseReimbursementRoutingModule } from './expense-reimbursement-routing.module';
 import { ExpenseReimbursementExpenseReimbursementFormComponent } from './expense-reimbursement-form/expense-reimbursement-form.component';
 import { ExpenseReimbursementExpenseReimbursementFormAddComponent } from './expense-reimbursement-form/add/add.component';
+import { ExpenseReimbursementExpenseReimbursementFormUpdateComponent } from './expense-reimbursement-form/update/update.component';
 
 const COMPONENTS = [
   ExpenseReimbursementExpenseReimbursementFormComponent];
 const COMPONENTS_NOROUNT = [
-  ExpenseReimbursementExpenseReimbursementFormAddComponent];
+  ExpenseReimbursementExpenseReimbursementFormAddComponent,
+  ExpenseReimbursementExpenseReimbursementFormUpdateComponent];
 
 @NgModule({
   imports: [

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

@@ -206,6 +206,10 @@ export class ProjectManageArchivesAddComponent implements OnInit {
         //已回款金额
         projectManageArchives.received = this.businessAffairs.projectManageArchives.received;
         let bsInfo: any = {};
+        this.getPlanListName(this.businessAffairs.collectionPlanList)
+        this.getPlanListName(this.businessAffairs.paymentCollectionList)
+        this.getPlanListName(this.businessAffairs.paymentPlanList)
+        this.getPlanListName(this.businessAffairs.paymentStatusList)
         bsInfo.coPlanList = this.businessAffairs.collectionPlanList; //收款计划
         bsInfo.coSituationList = this.businessAffairs.paymentCollectionList; //收款情况
         bsInfo.payPlanList = this.businessAffairs.paymentPlanList; //付款计划
@@ -250,6 +254,70 @@ export class ProjectManageArchivesAddComponent implements OnInit {
     });
   }
 
+  /**
+   * 获取计划的里程碑名称
+   */
+  getPlanListName(list){
+    //循环表格数据
+    list.forEach(element => {
+      //判断是否选择里程碑
+      if(element.mileId1){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId1){
+            element.milestone1=mile.name;
+          }
+        });
+      }else{
+        element.milestone1="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId2){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId2){
+            element.milestone2=mile.name;
+          }
+        });
+      }else{
+        element.milestone2="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId3){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId3){
+            element.milestone3=mile.name;
+          }
+        });
+      }else{
+        element.milestone3="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId4){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId4){
+            element.milestone4=mile.name;
+          }
+        });
+      }else{
+        element.milestone4="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId5){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId5){
+            element.milestone5=mile.name;
+          }
+        });
+      }else{
+        element.milestone5="";
+      }
+    });
+  }
+
   /**
    * 获取计划里程碑明细数据
    * @param component 页签组件对象

+ 2 - 3
src/app/routes/project-manage-archives/add/business-affairs/business-affairs.component.ts

@@ -152,15 +152,14 @@ export class ProjectManageArchivesAddBusinessAffairsComponent implements OnInit
     if (type === '2') {
       //获取收款计划的金额
       this.getCollectionPlanPrice(this.collectionPlanList,data);
-      
+      //回写数据到实施、开发、服务页签的回款信息
+      this.getRemittanceInformationChange(data);
     }
     //如果是付款情况表格中下来触发
     if (type === '4') {
       //获取付款计划中的金额
       this.getCollectionPlanPrice(this.paymentPlanList,data);
     }
-    //回写数据到实施、开发、服务页签的回款信息
-    this.getRemittanceInformationChange(data);
   }
 
   /**

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

@@ -172,6 +172,7 @@ export class ProjectManageArchivesAddDevelopmentComponent implements OnInit {
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.name=element.name;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

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

@@ -172,6 +172,7 @@ export class ProjectManageArchivesAddImplementationComponent implements OnInit {
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.name=element.name;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

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

@@ -157,6 +157,7 @@ export class ProjectManageArchivesAddServicetaComponent implements OnInit {
         mapData.forEach(el => {
           data.forEach(element => {
             if (element.key === el.key) {
+              el.name=element.name;
               el.muilesId = element.muilesId;
               el.muilesName = element.muilesName;
               el.startDate = element.startDate;

+ 3 - 3
src/app/routes/project-manage-archives/update/business-affairs/business-affairs.component.ts

@@ -151,15 +151,15 @@ export class ProjectManageArchivesUpdateBusinessAffairsComponent implements OnIn
     if (type === '2') {
       //获取收款计划的金额
       this.getCollectionPlanPrice(this.collectionPlanList,data);
-      
+      //回写数据到实施、开发、服务页签的回款信息
+      this.getRemittanceInformationChange(data);
     }
     //如果是付款情况表格中下来触发
     if (type === '4') {
       //获取付款计划中的金额
       this.getCollectionPlanPrice(this.paymentPlanList,data);
     }
-    //回写数据到实施、开发、服务页签的回款信息
-    this.getRemittanceInformationChange(data);
+    
   }
 
   /**

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

@@ -233,6 +233,10 @@ export class ProjectManageArchivesUpdateComponent implements OnInit {
         //已回款金额
         projectManageArchives.received = this.businessAffairs.projectManageArchives.received;
         let bsInfo: any = {};
+        this.getPlanListName(this.businessAffairs.collectionPlanList)
+        this.getPlanListName(this.businessAffairs.paymentCollectionList)
+        this.getPlanListName(this.businessAffairs.paymentPlanList)
+        this.getPlanListName(this.businessAffairs.paymentStatusList)
         bsInfo.coPlanList = this.businessAffairs.collectionPlanList; //收款计划
         bsInfo.coSituationList = this.businessAffairs.paymentCollectionList; //收款情况
         bsInfo.payPlanList = this.businessAffairs.paymentPlanList; //付款计划
@@ -277,6 +281,70 @@ export class ProjectManageArchivesUpdateComponent implements OnInit {
     });
   }
 
+  /**
+   * 获取计划的里程碑名称
+   */
+  getPlanListName(list){
+    //循环表格数据
+    list.forEach(element => {
+      //判断是否选择里程碑
+      if(element.mileId1){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId1){
+            element.milestone1=mile.name;
+          }
+        });
+      }else{
+        element.milestone1="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId2){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId2){
+            element.milestone2=mile.name;
+          }
+        });
+      }else{
+        element.milestone2="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId3){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId3){
+            element.milestone3=mile.name;
+          }
+        });
+      }else{
+        element.milestone3="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId4){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId4){
+            element.milestone4=mile.name;
+          }
+        });
+      }else{
+        element.milestone4="";
+      }
+      //判断是否选择里程碑
+      if(element.mileId5){
+        //循环商务页签中计划表中里程碑下拉数据获取名称
+        this.businessAffairs.milestoneList.forEach(mile => {
+          if(mile.id===element.mileId5){
+            element.milestone5=mile.name;
+          }
+        });
+      }else{
+        element.milestone5="";
+      }
+    });
+  }
+
   /**
    * 获取计划里程碑明细数据
    * @param component 页签组件对象

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

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

+ 24 - 0
src/app/routes/report-form/project-statistics/project-statistics.component.spec.ts

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

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

@@ -0,0 +1,45 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { _HttpClient, ModalHelper } from '@delon/theme';
+import { STColumn, STComponent } from '@delon/abc';
+import { SFSchema } from '@delon/form';
+
+@Component({
+  selector: 'app-report-form-project-statistics',
+  templateUrl: './project-statistics.component.html',
+})
+export class ReportFormProjectStatisticsComponent implements OnInit {
+  url = `/user`;
+  searchSchema: SFSchema = {
+    properties: {
+      no: {
+        type: 'string',
+        title: '编号'
+      }
+    }
+  };
+  @ViewChild('st') st: STComponent;
+  columns: STColumn[] = [
+    { title: '编号', index: 'no' },
+    { title: '调用次数', type: 'number', index: 'callNo' },
+    { title: '头像', type: 'img', width: '50px', index: 'avatar' },
+    { title: '时间', type: 'date', index: 'updatedAt' },
+    {
+      title: '',
+      buttons: [
+        // { text: '查看', click: (item: any) => `/form/${item.id}` },
+        // { text: '编辑', type: 'static', component: FormEditComponent, click: 'reload' },
+      ]
+    }
+  ];
+
+  constructor(private http: _HttpClient, private modal: ModalHelper) { }
+
+  ngOnInit() { }
+
+  add() {
+    // this.modal
+    //   .createStatic(FormEditComponent, { i: { id: 0 } })
+    //   .subscribe(() => this.st.reload());
+  }
+
+}

+ 13 - 0
src/app/routes/report-form/report-form-routing.module.ts

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

+ 21 - 0
src/app/routes/report-form/report-form.module.ts

@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { SharedModule } from '@shared';
+import { ReportFormRoutingModule } from './report-form-routing.module';
+import { ReportFormProjectStatisticsComponent } from './project-statistics/project-statistics.component';
+
+const COMPONENTS = [
+  ReportFormProjectStatisticsComponent];
+const COMPONENTS_NOROUNT = [];
+
+@NgModule({
+  imports: [
+    SharedModule,
+    ReportFormRoutingModule
+  ],
+  declarations: [
+    ...COMPONENTS,
+    ...COMPONENTS_NOROUNT
+  ],
+  entryComponents: COMPONENTS_NOROUNT
+})
+export class ReportFormModule { }

+ 2 - 2
src/app/routes/system/depart/depart.component.html

@@ -97,7 +97,7 @@
                 <th nzAlign="center">{{ 'depart' | translate }}</th>
                 <th nzAlign="center">{{ 'personnel.manager' | translate }}</th>
                 <th nzAlign="center">{{ 'email' | translate }}</th>
-                <th nzAlign="center">{{ 'personnel.state' | translate }}</th>
+                <th nzAlign="center">{{ 'On.the.job.status' | translate }}</th>
                 <th nzAlign="center">{{ 'whether.using.or.not' | translate }}</th>
                 <th nzAlign="center" nzRight="0px">{{ 'table.operation' | translate }}</th>
               </tr>
@@ -141,7 +141,7 @@
                     {{'yes'| translate}}
                   </ng-container> -->
                 </td>
-                <td nzAlign="center" nzRight="0px">
+                <td nzAlign="center" nzRight="0px" style="width: 10%;">
                   <a href="javascript:void(0);"
                     (click)="openDetailsComponent(data.id)">{{ 'table.view' | translate }}</a>
                   <nz-divider nzType="vertical"></nz-divider>

+ 1 - 1
src/app/routes/system/depart/depart.component.ts

@@ -228,7 +228,7 @@ export class SystemDepartComponent implements OnInit {
     //打开抽屉
     const drawerAddDepar = this.drawerService.create<SystemDepartPersonnelAddComponent, { id: string }, string>({
       nzTitle: title,
-      nzWidth: "10",
+      nzWidth: 800,
       nzContent: SystemDepartPersonnelAddComponent,
       nzContentParams: {
         id: id

+ 34 - 18
src/app/routes/system/depart/personnel-add/personnel-add.component.html

@@ -1,7 +1,7 @@
 <form nz-form>
-  <table>
+  <!-- <table>
     <th style="width: 500px;"></th>
-  </table>
+  </table> -->
   <nz-form-item>
     <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'personnel.code' | translate }}</nz-form-label>
     <nz-form-control [nzSm]="14" [nzXs]="24">
@@ -41,17 +41,45 @@
       </nz-select>
     </nz-form-control>
   </nz-form-item>
+  <nz-form-item>
+    <nz-form-label [nzSm]="8" [nzXs]="24" nzNoColon="true"></nz-form-label>
+    <nz-form-control [nzSm]="14" [nzXs]="24">
+      <button nzType="dashed" nzBlock nz-button (click)="selectPkOrg()"><span>选择公司与部门</span></button>
+    </nz-form-control>
+  </nz-form-item>
   <nz-form-item>
     <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'company' | translate }}</nz-form-label>
     <nz-form-control [nzSm]="14" [nzXs]="24">
-      <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
+      <!-- <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
         [(ngModel)]="personnel.pkOrg" name="pkOrg" (ngModelChange)="companyChange($event)">
         <nz-option *ngIf="personnel.pkOrg==''" nzLabel="{{ 'select.please.choose' | translate }}" nzValue=""
           selected="selected"></nz-option>
         <ng-container *ngFor="let org of listOrg">
           <nz-option nzLabel="{{org.departName}}" nzValue="{{org.id}}"></nz-option>
         </ng-container>
-      </nz-select>
+      </nz-select> -->
+
+      <!-- <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
+        [(ngModel)]="pkOrgList" name="pkOrgList" (ngModelChange)="companyChange($event)" nzMode="multiple">
+        <ng-container *ngFor="let org of listOrg">
+          <nz-option nzLabel="{{org.departName}}" nzValue="{{org.id}}"></nz-option>
+        </ng-container>
+      </nz-select> -->
+      {{personnel.pkOrgName}}
+    </nz-form-control>
+  </nz-form-item>
+  <nz-form-item>
+    <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'depart' | translate }}</nz-form-label>
+    <nz-form-control [nzSm]="14" [nzXs]="24">
+      <!-- <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
+        [(ngModel)]="personnel.pkDepart" name="pkDepart">
+        <nz-option *ngIf="personnel.pkDepart==''" nzLabel="{{ 'select.please.choose' | translate }}" nzValue=""
+          selected="selected"></nz-option>
+        <ng-container *ngFor="let de of listDepart">
+          <nz-option nzLabel="{{de.departName}}" nzValue="{{de.id}}"></nz-option>
+        </ng-container>
+      </nz-select> -->
+      {{personnel.pkDepartName}}
     </nz-form-control>
   </nz-form-item>
   <nz-form-item>
@@ -67,21 +95,9 @@
       <input [(ngModel)]="personnel.tel" name="tel" nz-input />
     </nz-form-control>
   </nz-form-item>
+
   <nz-form-item>
-    <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'depart' | translate }}</nz-form-label>
-    <nz-form-control [nzSm]="14" [nzXs]="24">
-      <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
-        [(ngModel)]="personnel.pkDepart" name="pkDepart">
-        <nz-option *ngIf="personnel.pkDepart==''" nzLabel="{{ 'select.please.choose' | translate }}" nzValue=""
-          selected="selected"></nz-option>
-        <ng-container *ngFor="let de of listDepart">
-          <nz-option nzLabel="{{de.departName}}" nzValue="{{de.id}}"></nz-option>
-        </ng-container>
-      </nz-select>
-    </nz-form-control>
-  </nz-form-item>
-  <nz-form-item>
-    <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'personnel.state' | translate }}</nz-form-label>
+    <nz-form-label nzRequired [nzSm]="8" [nzXs]="24">{{ 'On.the.job.status' | translate }}</nz-form-label>
     <nz-form-control [nzSm]="14" [nzXs]="24">
       <nz-select nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}" [nzDisabled]="false"
         [(ngModel)]="personnel.status" name="status">

+ 44 - 2
src/app/routes/system/depart/personnel-add/personnel-add.component.ts

@@ -1,6 +1,6 @@
 import { I18NService } from './../../../../core/i18n/i18n.service';
 import { Component, OnInit, ViewChild, Input } from '@angular/core';
-import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef } from 'ng-zorro-antd';
+import { NzModalRef, NzMessageService, NzNotificationService, NzDrawerRef, NzModalService } from 'ng-zorro-antd';
 import { _HttpClient } from '@delon/theme';
 import { SFSchema, SFUISchema } from '@delon/form';
 import { DepartService } from 'app/services/depart.service';
@@ -9,6 +9,7 @@ import { PersonnelService } from 'app/services/basedata/personnel.service';
 import { DictService } from 'app/services/dict.service';
 import { Dict } from 'app/entity/dict';
 import { messageShared } from '@shared/utils/message';
+import { SystemDepartPersonnelAddSelectPkOrgComponent } from './select-pk-org/select-pk-org.component';
 
 @Component({
   selector: 'app-system-depart-personnel-add',
@@ -39,6 +40,8 @@ export class SystemDepartPersonnelAddComponent implements OnInit {
     tel: "",//电话
     pkDepart: "",//所属部门
     pkOrg: "",//所属公司
+    pkDepartName: "",//所属部门名称
+    pkOrgName: "",//所属公司名称
     status: "",//人员状态
     email: "",//邮箱
     pkPersonnel: "",//直属领导
@@ -60,7 +63,8 @@ export class SystemDepartPersonnelAddComponent implements OnInit {
     private notification: NzNotificationService,
     private nzDrawerRef: NzDrawerRef,
     private dictService: DictService,
-    private i18NService: I18NService
+    private i18NService: I18NService,
+    private modalService:NzModalService
   ) { }
   disabled = false;
   ngOnInit(): void {
@@ -128,6 +132,8 @@ export class SystemDepartPersonnelAddComponent implements OnInit {
     })
   }
 
+
+
   //保存
   save(value: any) {
     if (this.enable) {//是否停用
@@ -163,6 +169,42 @@ export class SystemDepartPersonnelAddComponent implements OnInit {
 
   }
 
+  /**
+   * 选择公司按钮
+   */
+  selectPkOrg(){
+    const modalRef = this.modalService.create({
+      nzTitle: "选择公司与部门",
+      nzContent: SystemDepartPersonnelAddSelectPkOrgComponent,
+      nzWidth: 600,
+      nzComponentParams:{
+        personnelGet:this.personnel
+      },
+      nzFooter: [
+        {
+          label: "关闭",
+          type: "default",
+          onClick: addModel => {
+            addModel.close()
+          }
+        },
+        {
+          label: "确定",
+          type: "primary",
+          // loading:this.modelSaveLoading,
+          onClick: addModel => {
+            addModel.submitForm().then(()=>{
+              this.personnel.pkOrg=addModel.personnel.pkOrg;
+              this.personnel.pkOrgName=addModel.personnel.pkOrgName;
+              this.personnel.pkDepart=addModel.personnel.pkDepart;
+              this.personnel.pkDepartName=addModel.personnel.pkDepartName;
+            })
+          }
+        }
+      ]
+    })
+  }
+
   close() {
     this.nzDrawerRef.close(false);//关闭抽屉是否刷新列表
   }

+ 48 - 0
src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.html

@@ -0,0 +1,48 @@
+<div nz-row [nzGutter]="24">
+  <div nz-col [nzSpan]="24">
+    <!-- 新增按钮 -->
+    <!-- <button (click)="addRow()" nz-button nzType="primary">{{ 'button.add' | translate }}</button> -->
+  </div>
+</div>
+<div nz-row [nzGutter]="24">
+  <div nz-col [nzSpan]="24">
+    <nz-table style="padding-top: 5px;" nzSize="small" class="tableTdPadding" #basicTable [nzData]="itemDataList"
+      [nzFrontPagination]="false" [nzShowPagination]="false">
+      <thead>
+        <tr>
+          <th nzAlign="center">序号</th>
+          <th>公司</th>
+          <th>部门</th>
+          <th>操作</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let data of basicTable.data;let i=index">
+          <td style="width: 10%;" nzAlign="center">{{i+1}}</td>
+          <td style="width: 50%;">
+            <nz-select style="width: 100%;" nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}"
+              [nzDisabled]="false" [(ngModel)]="data.pkOrgId" (ngModelChange)="companyChange(data)">
+              <ng-container *ngFor="let org of listOrg">
+                <nz-option nzLabel="{{org.departName}}" nzValue="{{org.id}}"></nz-option>
+              </ng-container>
+            </nz-select>
+          </td>
+          <td style="width: 30%;">
+            <nz-select style="width: 100%;" nzShowSearch nzAllowClear nzPlaceHolder="{{ 'select.please.choose' | translate }}"
+              [nzDisabled]="false" [(ngModel)]="data.departId" name="departId">
+              <ng-container *ngFor="let de of data.listDepart">
+                <nz-option nzLabel="{{de.departName}}" nzValue="{{de.id}}"></nz-option>
+              </ng-container>
+            </nz-select>
+          </td>
+          <td style="width: 10%;"><a nz-popconfirm nzTitle="是否删除?" (nzOnConfirm)="deleteRow(data.sort)">{{'table.delete'|translate}}</a>
+          </td>
+        </tr>
+        <tr>
+          <td colSpan="4"><button (click)="addRow()" nz-button nzType="dashed"
+              nzBlock>{{ 'button.add' | translate }}</button></td>
+        </tr>
+      </tbody>
+    </nz-table>
+  </div>
+</div>

+ 24 - 0
src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.spec.ts

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

+ 156 - 0
src/app/routes/system/depart/personnel-add/select-pk-org/select-pk-org.component.ts

@@ -0,0 +1,156 @@
+import { Component, OnInit } from '@angular/core';
+import { NzModalRef, NzMessageService } from 'ng-zorro-antd';
+import { _HttpClient } from '@delon/theme';
+import { DepartService } from 'app/services/depart.service';
+
+@Component({
+  selector: 'app-system-depart-personnel-add-select-pk-org',
+  templateUrl: './select-pk-org.component.html',
+})
+export class SystemDepartPersonnelAddSelectPkOrgComponent implements OnInit {
+  constructor(private modal: NzModalRef, private departService: DepartService) {}
+
+  ngOnInit(): void {
+    this.getByType().then(() => {
+      this.getPersonnel();
+    });
+  }
+
+  personnelGet: any = {}; //传入的人员对象
+
+  /**
+   * 获取保存的数据
+   */
+  getPersonnel() {
+    if (this.personnelGet.pkOrg) {
+      //根据字符拆分
+      let pkOrgList = this.personnelGet.pkOrg.split('、');
+      let pkDepartList = this.personnelGet.pkDepart.split('、');
+      //组成表格数据
+      pkOrgList.forEach((pkOrg, index) => {
+        let personnel = { pkOrgId: pkOrg, departId: pkDepartList[index] };
+        this.getByOrgId(personnel);
+        this.itemDataList = [...this.itemDataList, personnel];
+      });
+    }
+  }
+
+  //根据类型查询公司和部门1公司2部门
+  listOrg = []; //公司下拉数据集合
+  getByType() {
+    return new Promise(resolve => {
+      //查询公司
+      this.departService.getByType('1').then(response => {
+        this.listOrg = response.result;
+        resolve();
+      });
+    });
+  }
+
+  //公司下拉款选中
+  listDepart = []; //部门下拉数据
+  companyChange(data) {
+    if (data.pkOrgId) {
+      //是否有值
+      this.getByOrgId(data);
+    } else {
+      this.listDepart = [];
+    }
+  }
+
+  //(根据公司id查出部门下拉框)
+  getByOrgId(data) {
+    this.departService.getByOrgId(data.pkOrgId).then(response => {
+      data.listDepart = response.result;
+    });
+  }
+
+  /**
+   * 增行按钮
+   */
+  itemDataList = []; //明细集合
+  sort = 0;
+  addRow() {
+    this.itemDataList = [
+      ...this.itemDataList,
+      {
+        pkOrgId: '',
+        pkOrgName: '',
+        departId: '',
+        departName: '',
+        departList: [],
+        sort: this.sort,
+      },
+    ];
+    this.sort++;
+  }
+
+  /**
+   * 删除行
+   */
+  deleteRow(sort) {
+    this.itemDataList = this.itemDataList.filter(d => d.sort !== sort);
+  }
+
+  personnel = {
+    pkOrg: '',
+    pkOrgName: '',
+    pkDepart: '',
+    pkDepartName: '',
+  };
+
+  submitForm() {
+    return new Promise(resolve => {
+      let i = 0;
+      this.itemDataList.forEach(element => {
+        if (i == 0) {
+          //公司id
+          this.personnel.pkOrg = element.pkOrgId;
+          //公司名称
+          if (element.pkOrgId) {
+            this.personnel.pkOrgName = this.getDeparName(this.listOrg, element.pkOrgId);
+          }
+          //部门id
+          this.personnel.pkDepart = element.departId;
+          //公司名称
+          if (element.departId) {
+            this.personnel.pkDepartName = this.getDeparName(element.listDepart, element.departId);
+          }
+        } else {
+          //公司id
+          this.personnel.pkOrg = this.personnel.pkOrg + '、' + element.pkOrgId;
+          //公司名称
+          if (element.pkOrgId) {
+            this.personnel.pkOrgName =
+              this.personnel.pkOrgName + '、' + this.getDeparName(this.listOrg, element.pkOrgId);
+          }
+          //部门id
+          this.personnel.pkDepart = this.personnel.pkDepart + '、' + element.departId;
+          //公司名称
+          if (element.departId) {
+            this.personnel.pkDepartName =
+              this.personnel.pkDepartName + '、' + this.getDeparName(element.listDepart, element.departId);
+          }
+        }
+        i++;
+      });
+      console.log(this.personnel);
+      this.modal.destroy();
+      resolve();
+    });
+  }
+
+  getDeparName(list, id) {
+    let name = '';
+    list.forEach(org => {
+      if (id === org.id) {
+        name = org.departName;
+      }
+    });
+    return name;
+  }
+
+  close() {
+    this.modal.destroy();
+  }
+}

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

@@ -34,7 +34,8 @@ import { SystemTimedTaskComponent } from './timed-task/timed-task.component';
 import { SystemTimedTaskAddComponent } from './timed-task/add/add.component';
 import { SystemDepartDetailsComponent } from './depart/details/details.component';
 import { SystemRoleViewUserComponent } from './role/view-user/view-user.component';
-import { SystemUpdatePasswordComponent } from './update-password/update-password.component';
+import { SystemUpdatePasswordComponent } from './update-password/update-password.component';
+import { SystemDepartPersonnelAddSelectPkOrgComponent } from './depart/personnel-add/select-pk-org/select-pk-org.component';
 const COMPONENTS = [SystemDictComponent,
   SystemUserComponent,
   SystemDepartComponent,
@@ -66,7 +67,8 @@ const COMPONENTS_NOROUNT = [SystemMenuEditComponent,
   SystemMenuDataRolesDataRolesEditComponent,
   SystemRoleAuthAuthDataRulesComponent,
   SystemTimedTaskAddComponent,
-  SystemRoleViewUserComponent];
+  SystemRoleViewUserComponent,
+  SystemDepartPersonnelAddSelectPkOrgComponent];
 
 @NgModule({
   imports: [

+ 1 - 1
src/app/routes/system/user/user.component.ts

@@ -122,7 +122,7 @@ export class SystemUserComponent implements OnInit {
     this.isVisible = true;
     this.id = id;
     this.title = this.i18NService.fanyi("agent") + ":[" + username + "]"
-    this.personnelService.queryApprover(null).then((response) => {
+    this.personnelService.queryApprover(sessionStorage.getItem("pkOrg")).then((response) => {
       this.nzOptions = response.result;
       this.nzOptions.forEach(e => {
         e.children.forEach(element => {

+ 30 - 0
src/app/services/expense-reimbursement/re-expense-slip.service.ts

@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { BaseResponse } from 'app/entity/baseResponse';
 import { Result } from 'app/entity/Result';
+import { ReExpenseSlip } from 'app/entity/expense-reimbursement/re-expense-slip';
 
 @Injectable({
   providedIn: 'root'
@@ -16,4 +17,33 @@ export class ReExpenseSlipService {
       .get<BaseResponse<Result<any>>>('/expense/reExpenseSlip/list', { params: body })
       .toPromise();
   }
+
+  //新增
+  async add(body: ReExpenseSlip): Promise<BaseResponse<any>> {
+    return await this.http.post<BaseResponse<any>>('expense/reExpenseSlip/add', body).toPromise();
+  }
+
+  //根据id查询
+  async queryById(id: string): Promise<BaseResponse<any>> {
+    return await this.http
+      .get<BaseResponse<any>>('expense/reExpenseSlip/queryById', { params: { id: id } })
+      .toPromise();
+  }
+
+  //根据id查询主子表
+  async getListById(id: string): Promise<BaseResponse<any>> {
+    return await this.http
+      .get<BaseResponse<any>>('expense/reExpenseSlip/getListById', { params: { id: id } })
+      .toPromise();
+  }
+
+  //删除
+  async delete(body:any):Promise<BaseResponse<any>>{
+    return await this.http.delete<BaseResponse<any>>('expense/reExpenseSlip/delete',{params:body}).toPromise();
+  }
+
+  //修改
+  async update(body: ReExpenseSlip): Promise<BaseResponse<any>> {
+    return await this.http.put<BaseResponse<any>>('expense/reExpenseSlip/edit', body).toPromise();
+  }
 }

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

@@ -523,6 +523,7 @@
   "personnel.code": "Staff Code",
   "personnel.name": "Staff Name",
   "personnel.state": "Staff Status",
+  "On.the.job.status": "On the job status",
   "personnel.manager": "Line Manager",
 
 

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

@@ -525,6 +525,7 @@
   "personnel.code": "人员编码",
   "personnel.name": "人员名称",
   "personnel.state": "人员状态",
+  "On.the.job.status": "在职状态",
   "personnel.manager": "直接领导",
   "contract.class": "合同类型",
   "contract.code": "编码",