47 changed files with 1501 additions and 53 deletions
@ -0,0 +1,52 @@ |
|||
<div class="overflow-hidden flex-1"> |
|||
<app-server-paginated-table [options]="table" [renderColumn]="renderColumnTpl" [formGroup]="queryForm"> |
|||
<ng-template #renderColumnTpl let-data let-key="key" let-row="row"> |
|||
@switch (key) { |
|||
@case ('status') { |
|||
<!-- <nz-badge |
|||
[nzText]="data === 0 ? '在职' : '离职'" |
|||
[nzStatus]="data === 0 ? 'processing' : 'error'" |
|||
/> --> |
|||
} |
|||
@case ('_repairType') { |
|||
{{ data.name }} |
|||
} |
|||
|
|||
@default { |
|||
{{ data }} |
|||
} |
|||
} |
|||
</ng-template> |
|||
|
|||
<!-- <ng-container *appTableForm> |
|||
<div class="mr-3"> |
|||
<div nz-row nzGutter="24"> |
|||
<div nz-col nzSpan="8"> |
|||
<nz-form-item> |
|||
<nz-form-label>业务编号</nz-form-label> |
|||
<nz-form-control> |
|||
<input nz-input placeholder="请输入" formControlName="businessId" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col nzSpan="8"> |
|||
<nz-form-item> |
|||
<nz-form-label>操作内容</nz-form-label> |
|||
<nz-form-control> |
|||
<input nz-input placeholder="请输入" formControlName="operationNotes" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col nzSpan="8"> |
|||
<nz-form-item> |
|||
<nz-form-label>操作类型</nz-form-label> |
|||
<nz-form-control> |
|||
<input nz-input placeholder="请输入" formControlName="operationType" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</ng-container> --> |
|||
</app-server-paginated-table> |
|||
</div> |
@ -0,0 +1,63 @@ |
|||
import { Component, Input, OnInit, TemplateRef, ViewChild } from '@angular/core' |
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
|
|||
import { ApiService } from 'app/services' |
|||
import { FormBuilder, FormGroup } from '@angular/forms' |
|||
import { AnyObject, TableOption } from 'app/shared/components/server-paginated-table' |
|||
import { NzSafeAny } from 'ng-zorro-antd/core/types' |
|||
import { NzModalService } from 'ng-zorro-antd/modal' |
|||
import { NzMessageService } from 'ng-zorro-antd/message' |
|||
import { NzDrawerRef, NzDrawerService } from 'ng-zorro-antd/drawer' |
|||
import { lastValueFrom } from 'rxjs' |
|||
import { FormValidators } from 'app/utils' |
|||
@Component({ |
|||
selector: 'app-asset-repair-records', |
|||
standalone: true, |
|||
imports: [SharedModule], |
|||
templateUrl: './asset-repair-records.component.html', |
|||
styleUrl: './asset-repair-records.component.less', |
|||
}) |
|||
export class AssetRepairRecordsComponent { |
|||
constructor( |
|||
private modal: NzModalService, |
|||
private msg: NzMessageService, |
|||
private drawer: NzDrawerService, |
|||
private api: ApiService, |
|||
private fb: FormBuilder, |
|||
) {} |
|||
|
|||
@Input() assetId!: number |
|||
|
|||
table = new TableOption(this.fetchData.bind(this)) |
|||
|
|||
queryForm!: FormGroup |
|||
|
|||
initQueryForm() { |
|||
this.queryForm = this.fb.group({ |
|||
businessId: [], |
|||
operationNotes: [], |
|||
operationType: [], |
|||
}) |
|||
} |
|||
|
|||
ngOnInit(): void { |
|||
this.table |
|||
.setConfig({ |
|||
cacheKey: 'asset-repair-records.component', |
|||
}) |
|||
.setColumn([ |
|||
{ key: 'id', title: '主键', width: '100px' }, |
|||
{ key: 'businessId', title: '业务编号', width: '170px' }, |
|||
{ key: 'name', title: '名称' }, |
|||
{ key: '_repairType', title: '维修类型' }, |
|||
{ key: 'plannedDate', title: '计划完成时间' }, |
|||
|
|||
// { key: 'createTime', title: '创建时间' },
|
|||
]) |
|||
this.initQueryForm() |
|||
} |
|||
|
|||
fetchData(p: {}, q: AnyObject) { |
|||
return this.api.getAssetRepairLog({ ...p, ...q }, this.assetId) |
|||
} |
|||
} |
@ -0,0 +1,89 @@ |
|||
<div class="modal"> |
|||
<form nz-form [formGroup]="formGroup" nzLayout="vertical"> |
|||
<div class="overflow-hidden"> |
|||
<div nz-row [nzGutter]="24"> |
|||
<div nz-col [nzSpan]="6"> |
|||
<nz-form-item> |
|||
<nz-form-label [nzRequired]="true">盘点状态</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<nz-select [nzPlaceHolder]="'请选择状态'" formControlName="status"> |
|||
@for (item of STOCKTAKING_JOB_STATUS_MAP | keyvalue; track $index) { |
|||
<nz-option [nzLabel]="item.value" [nzValue]="item.key"></nz-option> |
|||
} |
|||
</nz-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col [nzSpan]="6"> |
|||
<nz-form-item> |
|||
<nz-form-label>盘点任务</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<input |
|||
nz-input |
|||
[ngModel]="jobName" |
|||
[disabled]="true" |
|||
[ngModelOptions]="{ standalone: true }" |
|||
/> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col [nzSpan]="6"> |
|||
<nz-form-item> |
|||
<nz-form-label>图片</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<input type="hidden" nz-input formControlName="img" /> |
|||
<div class="mb-2" *ngIf="iconPreview"> |
|||
<img [src]="iconPreview" class="h-20 w-20" /> |
|||
</div> |
|||
<button class="upload-btn" nz-button [nzLoading]="uploadImgLoading"> |
|||
<i nz-icon nzType="upload"></i> |
|||
上传图片 |
|||
<input type="file" (change)="onImgChange($event)" accept=".jpg,.jpeg,.png" /> |
|||
</button> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col [nzSpan]="6"> |
|||
<nz-form-item> |
|||
<nz-form-label>附件</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<input type="hidden" formControlName="attachment" /> |
|||
<button class="upload-btn" nz-button [nzLoading]="uploadLoading"> |
|||
<i nz-icon nzType="upload"></i> |
|||
选择文件 |
|||
<input type="file" (change)="onFileChange($event)" /> |
|||
</button> |
|||
@if (formGroup.get('attachment')?.value) { |
|||
<div class="mt-1"> |
|||
<nz-tag class="break-words w-full !whitespace-pre-wrap"> |
|||
{{ formGroup.get('attachment')?.value }} |
|||
</nz-tag> |
|||
</div> |
|||
} |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col [nzSpan]="24"> |
|||
<nz-form-item> |
|||
<nz-form-label>盘点说明</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<textarea nz-input placeholder="请输入盘点说明" formControlName="notes"></textarea> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
<div nz-col [nzSpan]="24"> |
|||
<nz-form-item> |
|||
<nz-form-label>资产列表</nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<app-asset-select [radio]="true" formControlName="assetId" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</form> |
|||
|
|||
<ng-template #errorTpl let-control> |
|||
<form-error-tips [control]="control"></form-error-tips> |
|||
</ng-template> |
|||
</div> |
@ -0,0 +1,125 @@ |
|||
import { Component, Input, OnInit, inject } from '@angular/core' |
|||
import { FormBuilder, FormGroup } from '@angular/forms' |
|||
import { ApiService } from 'app/services' |
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
import { FormValidators, Utils } from 'app/utils' |
|||
import { NzMessageService } from 'ng-zorro-antd/message' |
|||
import { OrgSelectComponent } from '../org-select/org-select.component' |
|||
import { SelectUserByOrgComponent } from '../select-user-by-org/select-user-by-org.component' |
|||
import { PositionSelectComponent } from '../position-select/position-select.component' |
|||
import { NzSafeAny } from 'ng-zorro-antd/core/types' |
|||
import { NZ_MODAL_DATA } from 'ng-zorro-antd/modal' |
|||
import { SupplierSelectComponent } from '../supplier-select/supplier-select.component' |
|||
import { AssetSelectComponent } from '../asset-select/asset-select.component' |
|||
import { ActivatedRoute } from '@angular/router' |
|||
import { STOCKTAKING_JOB_STATUS_MAP } from 'app/constants' |
|||
|
|||
@Component({ |
|||
selector: 'app-stocktaking-detail-form', |
|||
standalone: true, |
|||
imports: [ |
|||
SharedModule, |
|||
SelectUserByOrgComponent, |
|||
SupplierSelectComponent, |
|||
AssetSelectComponent, |
|||
OrgSelectComponent, |
|||
PositionSelectComponent, |
|||
], |
|||
templateUrl: './stocktaking-detail-form.component.html', |
|||
styleUrl: './stocktaking-detail-form.component.less', |
|||
}) |
|||
export class StocktakingDetailFormComponent { |
|||
constructor( |
|||
private fb: FormBuilder, |
|||
private api: ApiService, |
|||
private msg: NzMessageService, |
|||
private route: ActivatedRoute, |
|||
) {} |
|||
|
|||
readonly data: NzSafeAny = inject(NZ_MODAL_DATA) |
|||
|
|||
STOCKTAKING_JOB_STATUS_MAP = STOCKTAKING_JOB_STATUS_MAP |
|||
|
|||
jobName = '' |
|||
|
|||
formGroup!: FormGroup |
|||
|
|||
groupIndex = 0 |
|||
|
|||
uploadLoading = false |
|||
|
|||
uploadImgLoading = false |
|||
|
|||
iconPreview = '' |
|||
|
|||
ngOnInit(): void { |
|||
this.jobName = this.route.snapshot.queryParamMap.get('name') || '' |
|||
this.formGroup = this.fb.group({ |
|||
id: this.fb.control(null, []), |
|||
status: this.fb.control(null, [FormValidators.required('请选择')]), |
|||
assetId: this.fb.control([], [FormValidators.required('请选择')]), |
|||
notes: this.fb.control(null, []), |
|||
img: this.fb.control('', []), |
|||
attachment: this.fb.control('', []), |
|||
}) |
|||
|
|||
this.patchValues() |
|||
} |
|||
|
|||
patchValues() { |
|||
const { value: data, preview } = this.data |
|||
if (data) { |
|||
this.formGroup.patchValue({ |
|||
...data, |
|||
}) |
|||
} |
|||
if (preview) { |
|||
this.formGroup.disable() |
|||
} |
|||
} |
|||
|
|||
public getValues() { |
|||
let values = null |
|||
if (FormValidators.validateFormGroup(this.formGroup)) { |
|||
const v = this.formGroup.value |
|||
values = { |
|||
...v, |
|||
assetId: v.assetId[0], |
|||
} |
|||
} |
|||
return values |
|||
} |
|||
|
|||
onFileChange(e: Event) { |
|||
const target = e.target as HTMLInputElement |
|||
const file = target.files![0] |
|||
target.value = '' |
|||
|
|||
const formdata = new FormData() |
|||
formdata.append('file', file) |
|||
this.api.upload(formdata).subscribe((res) => { |
|||
this.formGroup.get('attachment')?.setValue(res.body.fileName) |
|||
}) |
|||
} |
|||
|
|||
onImgChange(e: Event) { |
|||
const target = e.target as HTMLInputElement |
|||
const file = target.files![0] |
|||
target.value = '' |
|||
if (file.size / 1024 / 1024 >= 2) { |
|||
this.msg.error('图片大小不能超过2M') |
|||
return |
|||
} |
|||
const fileReader = new FileReader() |
|||
fileReader.onload = () => { |
|||
const base64 = fileReader.result as string |
|||
this.iconPreview = base64 |
|||
} |
|||
fileReader.readAsDataURL(file) |
|||
const formdata = new FormData() |
|||
formdata.append('file', file) |
|||
this.api.upload(formdata).subscribe((res) => { |
|||
this.formGroup.get('img')?.setValue(res.body.fileName) |
|||
}) |
|||
} |
|||
} |
@ -1 +1,221 @@ |
|||
<p>stockaking-plan works!</p> |
|||
<app-page class="p-3"> |
|||
<div class="flex-1 overflow-hidden"> |
|||
<app-server-paginated-table |
|||
[options]="table" |
|||
[tableAction]="tableActionTpl" |
|||
[renderColumn]="renderColumnTpl" |
|||
[formGroup]="queryForm" |
|||
> |
|||
<ng-template #renderColumnTpl let-data let-key="key" let-row="row"> |
|||
@switch (key) { |
|||
@case ('fullStocktaking') { |
|||
@switch (data) { |
|||
@case (0) { |
|||
<nz-badge [nzText]="'禁用'" [nzStatus]="'error'" /> |
|||
} |
|||
@case (1) { |
|||
<nz-badge [nzText]="'启用'" [nzStatus]="'processing'" /> |
|||
} |
|||
@default { |
|||
- |
|||
} |
|||
} |
|||
} |
|||
@case ('status') { |
|||
@switch (data) { |
|||
@case (0) { |
|||
<nz-badge [nzText]="'未开始'" [nzStatus]="'default'" /> |
|||
} |
|||
@case (1) { |
|||
<nz-badge [nzText]="'进行中'" [nzStatus]="'processing'" /> |
|||
} |
|||
@case (2) { |
|||
<nz-badge [nzText]="'取消'" [nzStatus]="'error'" /> |
|||
} |
|||
@case (3) { |
|||
<nz-badge [nzText]="'已完成'" [nzStatus]="'success'" /> |
|||
} |
|||
@default { |
|||
- |
|||
} |
|||
} |
|||
} |
|||
@case ('_stocktakingUser') { |
|||
{{ data?.userName ?? '-' }} |
|||
} |
|||
@case ('_useUser') { |
|||
{{ data?.userName ?? '-' }} |
|||
} |
|||
@case ('_warehouse') { |
|||
{{ data?.name ?? '-' }} |
|||
} |
|||
@case ('_position') { |
|||
{{ data?.name ?? '-' }} |
|||
} |
|||
@case ('_head') { |
|||
{{ data?.userName ?? '-' }} |
|||
} |
|||
@case ('_ownCompany') { |
|||
{{ data?.organizationName ?? '-' }} |
|||
} |
|||
@case ('_useOrganization') { |
|||
{{ data?.organizationName ?? '-' }} |
|||
} |
|||
@case ('_category') { |
|||
{{ data?.categoryName ?? '-' }} |
|||
} |
|||
@default { |
|||
{{ data }} |
|||
} |
|||
} |
|||
</ng-template> |
|||
|
|||
<ng-template #tableActionTpl> |
|||
<nz-space> |
|||
<button *nzSpaceItem nz-button nzType="primary" (click)="onCreate()">新建</button> |
|||
</nz-space> |
|||
</ng-template> |
|||
|
|||
<ng-container *appTableForm> |
|||
<app-query-item label="名称" class="w-60"> |
|||
<input nz-input placeholder="请输入" formControlName="name" /> |
|||
</app-query-item> |
|||
<app-query-item label="备注" class="w-60"> |
|||
<input nz-input placeholder="请输入" formControlName="notes" /> |
|||
</app-query-item> |
|||
<app-query-item label="盘点状态"> |
|||
<nz-select |
|||
nzPlacement="bottomRight" |
|||
class="!w-40" |
|||
[nzPlaceHolder]="'请选择'" |
|||
[nzDropdownMatchSelectWidth]="false" |
|||
formControlName="status" |
|||
nzAllowClear |
|||
> |
|||
<nz-option [nzValue]="0" nzLabel="未开始"></nz-option> |
|||
<nz-option [nzValue]="1" nzLabel="进行中"></nz-option> |
|||
<nz-option [nzValue]="2" nzLabel="取消"></nz-option> |
|||
<nz-option [nzValue]="3" nzLabel="已完成"></nz-option> |
|||
</nz-select> |
|||
</app-query-item> |
|||
</ng-container> |
|||
</app-server-paginated-table> |
|||
</div> |
|||
</app-page> |
|||
|
|||
<ng-template #drawerFooterTpl> |
|||
<nz-space> |
|||
<button *nzSpaceItem nz-button nzType="primary" (click)="onConfirm()">确定</button> |
|||
<button *nzSpaceItem nz-button nzType="default" (click)="onCancel()">取消</button> |
|||
</nz-space> |
|||
</ng-template> |
|||
|
|||
<ng-template #formContentTpl> |
|||
<form nz-form nzLayout="vertical" [formGroup]="createForm"> |
|||
<nz-form-item> |
|||
<nz-form-label nzRequired> 名称 </nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<input type="text" nz-input formControlName="name" placeholder="请输入名称" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 全员盘点 </nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<nz-radio-group formControlName="fullStocktaking"> |
|||
<label nz-radio [nzValue]="1">启用</label> |
|||
<label nz-radio [nzValue]="0">禁用</label> |
|||
</nz-radio-group> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 负责人 </nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<app-select-user-by-org [radio]="true" formControlName="head" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 盘点人 </nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<app-select-user-by-org [radio]="true" formControlName="stocktakingUserId" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
|
|||
<nz-form-item> |
|||
<nz-form-label> 备注 </nz-form-label> |
|||
<nz-form-control [nzErrorTip]="errorTpl"> |
|||
<textarea nz-input formControlName="notes" placeholder="请输入备注"></textarea> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
|
|||
<h2>盘点范围</h2> |
|||
<nz-form-item> |
|||
<nz-form-label> 购置开始日期 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-date-picker nzShowTime class="w-full" formControlName="stocktakingStartDate" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 购置结束日期 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-date-picker nzShowTime class="w-full" formControlName="stocktakingEndDate" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 资产分类 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-tree-select [nzNodes]="assetCategoryTree" formControlName="categoryId"></nz-tree-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 资产状态 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-select nzPlaceHolder="请选择" formControlName="assetStatus"> |
|||
@for (item of ASSET_STATUS; track $index) { |
|||
<nz-option [nzLabel]="item.label" [nzValue]="item.value"></nz-option> |
|||
} |
|||
</nz-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 位置 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-tree-select nzPlaceHolder="请选择" [nzNodes]="positionTree" formControlName="positionId"> |
|||
</nz-tree-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 仓库 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-select nzPlaceHolder="请选择" formControlName="warehouseId"> |
|||
@for (item of warehouse; track $index) { |
|||
<nz-option [nzLabel]="item.label" [nzValue]="item.value"></nz-option> |
|||
} |
|||
</nz-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 所属公司 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-tree-select nzPlaceHolder="请选择" [nzNodes]="companyTree" formControlName="ownCompanyId"> |
|||
</nz-tree-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 使用公司/部门 </nz-form-label> |
|||
<nz-form-control> |
|||
<nz-tree-select nzPlaceHolder="请选择" [nzNodes]="orgTree" formControlName="useOrganizationId"> |
|||
</nz-tree-select> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
<nz-form-item> |
|||
<nz-form-label> 保管人 </nz-form-label> |
|||
<nz-form-control> |
|||
<app-select-user-by-org [radio]="true" formControlName="useUserId" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</form> |
|||
</ng-template> |
|||
|
|||
<ng-template #errorTpl let-control> |
|||
<form-error-tips [control]="control"></form-error-tips> |
|||
</ng-template> |
|||
|
@ -0,0 +1,97 @@ |
|||
<app-page> |
|||
<div class="flex-1 overflow-hidden"> |
|||
<app-server-paginated-table |
|||
[options]="table" |
|||
[formGroup]="queryForm" |
|||
[renderColumn]="renderColumnTpl" |
|||
[tableAction]="tableActionTpl" |
|||
> |
|||
<ng-template #tableActionTpl> |
|||
<nz-space> |
|||
<button *nzSpaceItem nz-button nzType="primary" (click)="add()">新增盘点</button> |
|||
<button |
|||
*nzSpaceItem |
|||
nz-button |
|||
nzDanger |
|||
[disabled]="table.ref.selected.size === 0" |
|||
(click)="deleteItem()" |
|||
> |
|||
删除 |
|||
</button> |
|||
</nz-space> |
|||
</ng-template> |
|||
<ng-template #renderColumnTpl let-data let-key="key" let-row="row"> |
|||
@switch (key) { |
|||
@case ('status') { |
|||
<nz-tag> |
|||
{{ STOCKTAKING_JOB_STATUS_MAP.get(data) }} |
|||
</nz-tag> |
|||
} |
|||
@case ('code') { |
|||
{{ row?._asset.assetCode ?? '-' }} |
|||
} |
|||
@case ('name') { |
|||
{{ row?._asset.name ?? '-' }} |
|||
} |
|||
@case ('category') { |
|||
{{ row?._asset._category?.categoryName ?? '-' }} |
|||
} |
|||
@case ('_warehouse') { |
|||
{{ data?.name ?? '-' }} |
|||
} |
|||
@case ('_position') { |
|||
{{ data?.name ?? '-' }} |
|||
} |
|||
@case ('_head') { |
|||
{{ data?.userName ?? '-' }} |
|||
} |
|||
@case ('_ownCompany') { |
|||
{{ data?.organizationName ?? '-' }} |
|||
} |
|||
@case ('_useOrganization') { |
|||
{{ data?.organizationName ?? '-' }} |
|||
} |
|||
@case ('_category') { |
|||
{{ data?.categoryName ?? '-' }} |
|||
} |
|||
@default { |
|||
{{ data }} |
|||
} |
|||
} |
|||
</ng-template> |
|||
<!-- <ng-container *appTableAction> |
|||
<nz-space> |
|||
<button *nzSpaceItem nz-button nzType="link">资产确认</button> |
|||
<button *nzSpaceItem nz-button nzType="link" nzDanger="">删除</button> |
|||
</nz-space> |
|||
</ng-container> --> |
|||
<ng-container *appTableForm> |
|||
<app-query-item label="资产名称"> |
|||
<input nz-input placeholder="请输入" formControlName="name" /> |
|||
</app-query-item> |
|||
<app-query-item label="资产编号"> |
|||
<input nz-input placeholder="请输入" formControlName="assetCode" /> |
|||
</app-query-item> |
|||
<app-query-item label="规格型号"> |
|||
<input nz-input placeholder="请输入" formControlName="model" /> |
|||
</app-query-item> |
|||
<app-query-item label="序列号"> |
|||
<input nz-input placeholder="请输入" formControlName="serialNumber" /> |
|||
</app-query-item> |
|||
|
|||
<app-query-item label="资产状态"> |
|||
<nz-select |
|||
nzPlacement="bottomRight" |
|||
class="!w-24" |
|||
[nzDropdownMatchSelectWidth]="false" |
|||
formControlName="status" |
|||
> |
|||
@for (item of ASSET_STATUS_MAP | keyvalue; track $index) { |
|||
<nz-option [nzLabel]="item.value" [nzValue]="item.key"></nz-option> |
|||
} |
|||
</nz-select> |
|||
</app-query-item> |
|||
</ng-container> |
|||
</app-server-paginated-table> |
|||
</div> |
|||
</app-page> |
@ -0,0 +1,138 @@ |
|||
import { STOCKTAKING_JOB_STATUS_MAP } from './../../../../constants/index' |
|||
import { |
|||
ChangeDetectorRef, |
|||
Component, |
|||
EventEmitter, |
|||
Input, |
|||
OnInit, |
|||
Output, |
|||
TemplateRef, |
|||
ViewChild, |
|||
forwardRef, |
|||
} from '@angular/core' |
|||
import { ControlValueAccessor, FormControl, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms' |
|||
|
|||
import { NzSafeAny } from 'ng-zorro-antd/core/types' |
|||
|
|||
import { NzModalService } from 'ng-zorro-antd/modal' |
|||
|
|||
import { ApiService } from 'app/services' |
|||
import { NzMessageService } from 'ng-zorro-antd/message' |
|||
|
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
import { Utils } from 'app/utils' |
|||
import { NzFormatEmitEvent, NzTreeNode } from 'ng-zorro-antd/tree' |
|||
import { NzTreeSelectComponent } from 'ng-zorro-antd/tree-select' |
|||
import { ASSET_SOURCE_MAP, ASSET_STATUS_MAP, MAX_PAGE_SIZE } from 'app/constants' |
|||
import { AnyObject, TableOption } from 'app/shared/components/server-paginated-table' |
|||
import { AssetSelectComponent, StocktakingDetailFormComponent } from 'app/components' |
|||
import { lastValueFrom } from 'rxjs' |
|||
import { ActivatedRoute } from '@angular/router' |
|||
|
|||
@Component({ |
|||
selector: 'app-stocktaking-detail', |
|||
standalone: true, |
|||
imports: [SharedModule], |
|||
templateUrl: './stocktaking-detail.component.html', |
|||
styleUrl: './stocktaking-detail.component.less', |
|||
}) |
|||
export class StocktakingDetailComponent { |
|||
constructor( |
|||
private api: ApiService, |
|||
private modal: NzModalService, |
|||
private msg: NzMessageService, |
|||
private route: ActivatedRoute, |
|||
) {} |
|||
|
|||
originData: NzSafeAny[] = [] |
|||
|
|||
loading = false |
|||
|
|||
ASSET_SOURCE_MAP = ASSET_SOURCE_MAP |
|||
|
|||
ASSET_STATUS_MAP = ASSET_STATUS_MAP() |
|||
|
|||
STOCKTAKING_JOB_STATUS_MAP = STOCKTAKING_JOB_STATUS_MAP |
|||
|
|||
table = new TableOption(this.fetchData.bind(this)) |
|||
|
|||
queryForm = new FormGroup({ |
|||
name: new FormControl(), |
|||
model: new FormControl(), |
|||
status: new FormControl(), |
|||
assetCode: new FormControl(), |
|||
serialNumber: new FormControl(), |
|||
sourceId: new FormControl(), |
|||
positionId: new FormControl(), |
|||
manufacturersVendorId: new FormControl(), |
|||
}) |
|||
|
|||
ngOnInit(): void { |
|||
this.api.getBasicSupplierVendorPage({ pageSize: MAX_PAGE_SIZE, pageNum: 1 }).subscribe((res) => { |
|||
this.originData = res.body.rows |
|||
}) |
|||
this.table |
|||
.setConfig({ |
|||
selectable: true, |
|||
}) |
|||
.setColumn([ |
|||
{ key: 'id', title: '主键', visible: true }, |
|||
{ key: 'code', title: '资产编号', visible: true }, |
|||
{ key: 'name', title: '资产名称', visible: true }, |
|||
{ key: 'category', title: '资产分类', visible: true }, |
|||
{ key: 'status', title: '盘点状态', visible: true }, |
|||
{ key: 'createTime', title: '操作时间', visible: true }, |
|||
// { key: '_ownCompany', title: '所属公司', visible: true },
|
|||
// { key: '_useOrganization', title: '使用组织', visible: true },
|
|||
// { key: '_position', title: '存放位置', visible: true },
|
|||
]) |
|||
} |
|||
|
|||
fetchData(p: {}, q: AnyObject) { |
|||
return this.api.getStocktakingJobDetailPage({ ...p, ...q }).pipe() |
|||
} |
|||
|
|||
add(data?: NzSafeAny) { |
|||
let nzTitle = data ? '编辑资产盘点' : '添加资产盘点' |
|||
|
|||
this.modal.create({ |
|||
nzTitle, |
|||
nzContent: StocktakingDetailFormComponent, |
|||
nzWidth: '80vw', |
|||
nzWrapClassName: 'modal-lg', |
|||
nzData: { |
|||
value: data, |
|||
}, |
|||
nzOnOk: async (e) => { |
|||
const vals = e.getValues() |
|||
if (vals) { |
|||
const res = await lastValueFrom( |
|||
this.api.saveStocktakingJobDetail({ |
|||
...vals, |
|||
stocktakingJobId: Number(this.route.snapshot.paramMap.get('id')), |
|||
}), |
|||
) |
|||
this.msg.success(res.desc) |
|||
this.table.ref.reload() |
|||
return true |
|||
} |
|||
|
|||
return false |
|||
}, |
|||
}) |
|||
} |
|||
|
|||
deleteItem() { |
|||
this.modal.confirm({ |
|||
nzTitle: '警告', |
|||
nzContent: '是否要删除该盘点?', |
|||
nzOnOk: async () => { |
|||
const res = await lastValueFrom( |
|||
this.api.deleteStocktakingDetail(Array.from(this.table.ref.selected).map((i) => Number(i))), |
|||
) |
|||
this.msg.success(res.desc) |
|||
this.table.ref.reload() |
|||
}, |
|||
}) |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<div |
|||
class="menu bg-white shadow fixed left-0 top-12 bottom-0 z-20 w-48 flex-shrink-0 py-3 overflow-y-auto overflow-x-hidden" |
|||
> |
|||
<ul nz-menu nzMode="inline"> |
|||
<li nz-menu-item [nzPaddingLeft]="12" [routerLink]="['/asset-flow/index']" nzMatchRouter>流程首页</li> |
|||
<li nz-menu-item [nzPaddingLeft]="12" [routerLink]="['/asset-flow/my-apply']" nzMatchRouter>我的申请</li> |
|||
<li nz-menu-item [nzPaddingLeft]="12" [routerLink]="['/asset-flow/my-todo']" nzMatchRouter>待我处理</li> |
|||
</ul> |
|||
</div> |
|||
|
|||
<div class="pl-48 overflow-hidden"> |
|||
<router-outlet></router-outlet> |
|||
</div> |
@ -0,0 +1,24 @@ |
|||
import { Component } from '@angular/core' |
|||
import { Router } from '@angular/router' |
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
|
|||
@Component({ |
|||
selector: 'app-flow-layout', |
|||
standalone: true, |
|||
imports: [SharedModule], |
|||
templateUrl: './flow-layout.component.html', |
|||
styleUrl: './flow-layout.component.less', |
|||
}) |
|||
export class FlowLayoutComponent { |
|||
constructor(private router: Router) { |
|||
this.openedSubmenu = this.router.url |
|||
} |
|||
|
|||
openedSubmenu = '' |
|||
|
|||
ngOnInit(): void {} |
|||
|
|||
onMenuOpenChange(open: boolean) { |
|||
this.openedSubmenu = open ? this.router.url : '' |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
<app-page> |
|||
<nz-spin [nzSpinning]="loading"> |
|||
<div nz-row [nzGutter]="[24, 24]"> |
|||
@for (item of assetFlows; track $index) { |
|||
<div nz-col nzSpan="6"> |
|||
<nz-card [nzBordered]="false" [nzActions]="[actionSetting]"> |
|||
<div class="h-28"> |
|||
<div> |
|||
{{ item.name }} |
|||
</div> |
|||
</div> |
|||
<ng-template #actionSetting> 发起流程 </ng-template> |
|||
</nz-card> |
|||
</div> |
|||
} |
|||
</div> |
|||
</nz-spin> |
|||
</app-page> |
@ -0,0 +1,40 @@ |
|||
import { Component, OnInit } from '@angular/core' |
|||
import { ApiService } from 'app/services' |
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
import { NzSafeAny } from 'ng-zorro-antd/core/types' |
|||
import { NzMessageService } from 'ng-zorro-antd/message' |
|||
import { NzModalService } from 'ng-zorro-antd/modal' |
|||
import { finalize } from 'rxjs' |
|||
|
|||
@Component({ |
|||
selector: 'app-flow-main', |
|||
standalone: true, |
|||
imports: [SharedModule], |
|||
templateUrl: './flow-main.component.html', |
|||
styleUrl: './flow-main.component.less', |
|||
}) |
|||
export class FlowMainComponent implements OnInit { |
|||
constructor( |
|||
private api: ApiService, |
|||
private msg: NzMessageService, |
|||
private modal: NzModalService, |
|||
) {} |
|||
|
|||
assetFlows: NzSafeAny[] = [] |
|||
|
|||
loading = false |
|||
|
|||
ngOnInit(): void { |
|||
this.loading = true |
|||
this.api |
|||
.getFlowForms({}) |
|||
.pipe( |
|||
finalize(() => { |
|||
this.loading = false |
|||
}), |
|||
) |
|||
.subscribe((res) => { |
|||
this.assetFlows = res.body |
|||
}) |
|||
} |
|||
} |
@ -0,0 +1 @@ |
|||
<p>flow-my-apply works!</p> |
@ -0,0 +1,12 @@ |
|||
import { Component } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'app-flow-my-apply', |
|||
standalone: true, |
|||
imports: [], |
|||
templateUrl: './flow-my-apply.component.html', |
|||
styleUrl: './flow-my-apply.component.less' |
|||
}) |
|||
export class FlowMyApplyComponent { |
|||
|
|||
} |
@ -0,0 +1 @@ |
|||
<p>flow-my-todo works!</p> |
@ -0,0 +1,12 @@ |
|||
import { Component } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'app-flow-my-todo', |
|||
standalone: true, |
|||
imports: [], |
|||
templateUrl: './flow-my-todo.component.html', |
|||
styleUrl: './flow-my-todo.component.less' |
|||
}) |
|||
export class FlowMyTodoComponent { |
|||
|
|||
} |
@ -0,0 +1,28 @@ |
|||
<app-page> |
|||
<div class="flex-1 overflow-hidden"> |
|||
<app-server-paginated-table [options]="table" [renderColumn]="renderColumnTpl"> |
|||
<ng-template #renderColumnTpl let-data let-key="key" let-row="row"> |
|||
@switch (key) { |
|||
@default { |
|||
{{ data }} |
|||
} |
|||
} |
|||
</ng-template> |
|||
</app-server-paginated-table> |
|||
</div> |
|||
</app-page> |
|||
|
|||
<ng-template #createFormTpl> |
|||
<form nz-form [formGroup]="createForm"> |
|||
<nz-form-item> |
|||
<nz-form-label [nzSpan]="6" [nzRequired]="true">审批人</nz-form-label> |
|||
<nz-form-control [nzSpan]="12" [nzErrorTip]="errorTpl"> |
|||
<app-select-user-by-org formControlName="userId" /> |
|||
</nz-form-control> |
|||
</nz-form-item> |
|||
</form> |
|||
</ng-template> |
|||
|
|||
<ng-template #errorTpl let-control> |
|||
<form-error-tips [control]="control"></form-error-tips> |
|||
</ng-template> |
@ -0,0 +1,95 @@ |
|||
import { Component, TemplateRef, ViewChild } from '@angular/core' |
|||
import { FormControl, FormGroup } from '@angular/forms' |
|||
|
|||
import { AnyObject, TableOption } from 'app/shared/components/server-paginated-table' |
|||
import { ApiService } from 'app/services' |
|||
import { SharedModule } from 'app/shared/shared.module' |
|||
|
|||
import { lastValueFrom, map, of } from 'rxjs' |
|||
import { NzSafeAny } from 'ng-zorro-antd/core/types' |
|||
import { NzModalService } from 'ng-zorro-antd/modal' |
|||
import { NzMessageService } from 'ng-zorro-antd/message' |
|||
import { FormValidators } from 'app/utils' |
|||
import { SelectUserByOrgComponent } from 'app/components' |
|||
|
|||
@Component({ |
|||
selector: 'app-flow-form', |
|||
standalone: true, |
|||
imports: [SharedModule, SelectUserByOrgComponent], |
|||
templateUrl: './flow-form.component.html', |
|||
styleUrl: './flow-form.component.less', |
|||
}) |
|||
export class FlowFormComponent { |
|||
constructor( |
|||
private api: ApiService, |
|||
private modal: NzModalService, |
|||
private msg: NzMessageService, |
|||
) {} |
|||
|
|||
@ViewChild('createFormTpl') createFormTpl!: TemplateRef<{}> |
|||
|
|||
createForm = new FormGroup({ |
|||
formId: new FormControl(''), |
|||
userId: new FormControl('', [FormValidators.required('请选择')]), |
|||
}) |
|||
|
|||
table = new TableOption(this.fetchData.bind(this)) |
|||
|
|||
ngOnInit(): void { |
|||
this.table |
|||
// .setConfig({
|
|||
// selectable: true,
|
|||
// rowKey: 'id',
|
|||
// })
|
|||
.setColumn([ |
|||
{ key: 'formId', title: '主键', visible: true }, |
|||
{ key: 'formKey', title: '标识', visible: true }, |
|||
{ key: 'name', title: '名称', visible: true }, |
|||
{ key: 'deployId', title: '流程ID', visible: true }, |
|||
// { key: 'createTime', title: '创建时间', visible: true },
|
|||
]) |
|||
.setRowOperate([{ title: '设置审批人', onClick: this.onSetApprover.bind(this) }]) |
|||
} |
|||
|
|||
fetchData(p: {}, q: AnyObject) { |
|||
return this.api.getFlowForms({ ...p, ...q }).pipe( |
|||
map((r) => { |
|||
return { |
|||
body: { |
|||
rows: r.body, |
|||
total: r.body.length, |
|||
}, |
|||
} |
|||
}), |
|||
) |
|||
} |
|||
|
|||
onSetApprover(data?: NzSafeAny) { |
|||
if (data) { |
|||
this.createForm.patchValue(data) |
|||
} |
|||
this.modal.create({ |
|||
nzTitle: '设置审批人', |
|||
nzContent: this.createFormTpl, |
|||
nzOnOk: async () => { |
|||
if (FormValidators.validateFormGroup(this.createForm)) { |
|||
const vals = this.createForm.value |
|||
const res = await lastValueFrom( |
|||
this.api.setFlowFormsAssignee({ |
|||
...vals, |
|||
userId: vals.userId?.[0], |
|||
}), |
|||
) |
|||
this.msg.success(res.desc) |
|||
this.table.ref.reload() |
|||
this.createForm.reset() |
|||
return true |
|||
} |
|||
return false |
|||
}, |
|||
nzOnCancel: () => { |
|||
this.createForm.reset() |
|||
}, |
|||
}) |
|||
} |
|||
} |
Loading…
Reference in new issue