Merge branch '2.0-dev'

dev
袁野 2 years ago
commit 71c18fe838
  1. 2
      angular.json
  2. 22
      src/app/admin/audit/audit.module.ts
  3. 160
      src/app/admin/audit/goods-audit/goods-audit.component.html
  4. 0
      src/app/admin/audit/goods-audit/goods-audit.component.scss
  5. 119
      src/app/admin/audit/goods-audit/goods-audit.component.ts
  6. 135
      src/app/admin/config-manage/freight/freight.component.html
  7. 0
      src/app/admin/config-manage/freight/freight.component.scss
  8. 172
      src/app/admin/config-manage/freight/freight.component.ts
  9. 14
      src/app/admin/goods/goods-routing.module.ts
  10. 30
      src/app/admin/goods/goods.module.ts
  11. 434
      src/app/admin/goods/list/list.component.html
  12. 3
      src/app/admin/goods/list/list.component.scss
  13. 562
      src/app/admin/goods/list/list.component.ts
  14. 227
      src/app/admin/order-manage/goods-child-order/goods-child-order.component.html
  15. 9
      src/app/admin/order-manage/goods-child-order/goods-child-order.component.scss
  16. 176
      src/app/admin/order-manage/goods-child-order/goods-child-order.component.ts
  17. 296
      src/app/admin/order-manage/goods-order/goods-order.component.html
  18. 9
      src/app/admin/order-manage/goods-order/goods-order.component.scss
  19. 210
      src/app/admin/order-manage/goods-order/goods-order.component.ts
  20. 42
      src/app/admin/order-manage/mobile-recharge-order-list/mobile-recharge-order-list.component.html
  21. 3
      src/app/admin/order-manage/mobile-recharge-order-list/mobile-recharge-order-list.component.scss
  22. 45
      src/app/admin/order-manage/mobile-recharge-order-list/mobile-recharge-order-list.component.ts
  23. 2
      src/app/admin/order-manage/order-manage-routing.module.ts
  24. 3
      src/app/admin/order-manage/order-manage.module.ts
  25. 7
      src/app/common/preview-image/preview-image.component.html
  26. 4
      src/app/common/preview-image/preview-image.component.scss
  27. 21
      src/app/common/preview-image/preview-image.component.ts
  28. 21
      src/app/common/preview-image/preview-image.module.ts
  29. 5
      src/app/enum/present-type.enum.ts
  30. 3
      src/app/enum/url.enum.ts
  31. 19
      src/app/pipes/goods/goods-status.pipe.ts
  32. 28
      src/app/pipes/goods/logistics-status.pipe.ts
  33. 321
      src/app/services/goods/goods.service.ts
  34. 28
      src/app/services/order/order-mobile-recharge.service.ts

@ -70,7 +70,7 @@
}
]
},
"test": {
"dev": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",

@ -10,19 +10,21 @@ import {BreadcrumbModule} from '../../common/breadcrumb/breadcrumb.module';
import {AppCommonModule} from '../../app-common.module';
import { RefundAuditComponent } from './refund-audit/refund-audit.component';
import { GoodsAuditComponent } from './goods-audit/goods-audit.component';
import {PreviewImageModule} from '../../common/preview-image/preview-image.module';
@NgModule({
declarations: [AuditCouponComponent, RefundAuditComponent, GoodsAuditComponent],
imports: [
CommonModule,
AuditRoutingModule,
NgZorroAntdModule,
SeparateModule,
ReactiveFormsModule,
FormsModule,
BreadcrumbModule,
AppCommonModule
]
imports: [
CommonModule,
AuditRoutingModule,
NgZorroAntdModule,
SeparateModule,
ReactiveFormsModule,
FormsModule,
BreadcrumbModule,
AppCommonModule,
PreviewImageModule
]
})
export class AuditModule { }

@ -0,0 +1,160 @@
<!-- start 面包屑 -->
<app-breadcrumb></app-breadcrumb>
<!-- end 面包屑 -->
<!--条件搜索-->
<div class="inner-content">
<form nz-form [formGroup]="searchForm" (ngSubmit)="getRequest(true , searchForm.value)">
<div nz-row>
<div nz-col nzSpan="6">
<nz-form-item>
<nz-form-label [nzSpan]="6">审核对象名称</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="objectName"/>
</nz-form-control>
</nz-form-item>
</div>
<!-- <div nz-col nzSpan="6">-->
<!-- <nz-form-item>-->
<!-- <nz-form-label [nzSpan]="6">审核类型</nz-form-label>-->
<!-- <nz-form-control [nzSpan]="16">-->
<!-- <nz-select formControlName="objectType">-->
<!-- <nz-option nzValue="1" nzLabel="Jack"></nz-option>-->
<!-- <nz-option nzValue="2" nzLabel="Lucy"></nz-option>-->
<!-- <nz-option nzValue="disabled" nzLabel="Disabled" nzDisabled></nz-option>-->
<!-- </nz-select>-->
<!-- </nz-form-control>-->
<!-- </nz-form-item>-->
<!-- </div>-->
<div nz-col nzSpan="6">
<nz-form-item>
<nz-form-label [nzSpan]="6">审核流水号</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="approveSerialNo"/>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-row>
<div nz-col nzSpan="24" class="search-button">
<button nz-button nzType="primary"><i nz-icon nzType="search" nzTheme="outline"></i>搜索</button>
<button nz-button nzType="default" (click)="resetForm()"><i nz-icon nzType="reload" nzTheme="outline"></i>重置</button>
</div>
</div>
</form>
</div>
<div class="inner-content">
<span>共计 {{total}} 条数据</span>
<nz-table
class="table"
#ajaxTable
nzShowSizeChanger
[nzFrontPagination]="false"
[nzData]="requestData"
[nzLoading]="loading"
[nzTotal]="total"
[(nzPageIndex)]="pageNum"
[(nzPageSize)]="pageSize"
[nzScroll]="{ x: '1200px' }"
(nzPageIndexChange)="getRequest(false , searchForm.value)"
(nzPageSizeChange)="getRequest(false , searchForm.value)">
<thead nzSingleSort>
<tr>
<th nzWidth="50px">编号</th>
<th nzWidth="120px">审核流水号</th>
<th nzWidth="80px">审核对象名称</th>
<th nzWidth="80px">审核类型</th>
<th nzWidth="100px">提交人员</th>
<th nzWidth="100px">创建时间</th>
<th nzWidth="80px">状态</th>
<th nzWidth="80px" nzRight="0px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of ajaxTable.data; let i = index">
<td>{{i+1}}</td>
<td>{{data.approveSerialNo}}</td>
<td>{{data.objectName}}</td>
<td>{{data.objectType | auditType}}</td>
<td>{{data.submitOperatorName}}</td>
<td>{{data.createTime | date: 'yyyy-MM-dd HH:mm'}}</td>
<td>{{data.status | auditStatus}}</td>
<td nzRight="0px" class="table-td-operation">
<a (click)="getDetail(data.id , data.objectType)"><i nz-icon [nzIconfont]="'icon-xiangqing'" nz-tooltip="审核详情"></i></a>
<nz-divider *ngIf="data['status'] === 1" nzType="vertical"></nz-divider>
<a (click)="approveProcessed(3 , data.id)" *ngIf="data['status'] === 1"><i nz-icon nzType="check-circle" nzTheme="outline" nz-tooltip="通过"></i></a>
<nz-divider *ngIf="data['status'] === 1" nzType="vertical"></nz-divider>
<a (click)="approveProcessed(2 , data.id)" *ngIf="data['status'] === 1"><i nz-icon nzType="stop" nz-tooltip="驳回" nzTheme="outline"></i></a>
</td>
</tbody>
</nz-table>
</div>
<nz-modal [(nzVisible)]="isVisible" nzWidth="900" nzTitle="审核详情" (nzOnCancel)="handleCancel()">
<nz-tabset [nzType]="'card'">
<nz-tab nzTitle="审核内容">
<ng-container *ngIf="objectType !== 3">
<nz-descriptions nzBordered>
<nz-descriptions-item nzTitle="审核类型" >{{data['approve']['objectType'] | auditType}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="审核状态">{{data['approve']['status'] | auditStatus}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="申请人员">{{data['approve']['submitOperatorName']}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="审核名称">{{data['approve']['objectName']}}</nz-descriptions-item>
</nz-descriptions>
</ng-container>
<div *nzModalFooter>
<button *ngIf="data['approve']['status'] !== 1" nz-button nzType="default" (click)="handleCancel()">关闭</button>
<button *ngIf="data['approve']['status'] === 1" nz-button nzType="default" (click)="approveProcessed(2 , this.id)">审核驳回</button>
<button *ngIf="data['approve']['status'] === 1" nz-button nzType="primary" (click)="approveProcessed(3 , this.id)">审核通过</button>
</div>
</nz-tab>
<nz-tab *ngIf="objectType === 4" nzTitle="实物商品内容">
<ng-container *ngIf="objectType !== 3">
<nz-descriptions nzBordered>
<nz-descriptions-item nzTitle="商品名称">{{data['object']['name']}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="类型名称">{{data['object']['goodsTypeName']}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="创建时间">{{data['object']['createTime'] | date : 'yyyy-MM-dd'}}</nz-descriptions-item>
<nz-descriptions-item [nzSpan]="3" nzTitle="列表图">
<app-preview-image class="ml" *ngFor="let item of data['object']['listImg'].split(',') " [previewImage] = item ></app-preview-image>
</nz-descriptions-item>
<nz-descriptions-item [nzSpan]="3" nzTitle="轮播图">
<app-preview-image class="ml" *ngFor="let item of data['object']['bannerImg'].split(',') " [previewImage] = item ></app-preview-image>
</nz-descriptions-item>
<nz-descriptions-item [nzSpan]="3" nzTitle="详情图">
<app-preview-image class="ml" *ngFor="let item of data['object']['detailImg'].split(',') " [previewImage] = item ></app-preview-image>
</nz-descriptions-item>
</nz-descriptions>
</ng-container>
</nz-tab>
<nz-tab *ngIf="objectType === 4" nzTitle="规格内容">
<nz-table nzBordered #skuDataList [nzData]="data['object']['goodsSkus']" [nzHideOnSinglePage]="true">
<thead>
<tr>
<th nzWidth="80px">名称</th>
<th nzWidth="80px">图片</th>
<th nzWidth="80px">销售价格</th>
<th nzWidth="80px">售卖价格</th>
<th nzWidth="100px">创建时间</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of skuDataList.data">
<td>{{data.name}}</td>
<td>
<app-preview-image [previewImage] = data.showImg ></app-preview-image>
</td>
<td>¥{{data.originalPrice}}</td>
<td>¥{{data.price}}</td>
<td>{{data.createTime | date: 'yyyy-MM-dd HH:mm'}}</td>
</tr>
</tbody>
</nz-table>
</nz-tab>
</nz-tabset>
</nz-modal>

@ -0,0 +1,119 @@
import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup} from '_@angular_forms@9.0.7@@angular/forms';
import {AuditService} from '../../../services/audit.service';
import {IconService} from '../../../services/icon.service';
import {NzMessageService} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {CommonsService} from '../../../services/commons.service';
@Component({
selector: 'app-goods-audit',
templateUrl: './goods-audit.component.html',
styleUrls: ['./goods-audit.component.scss']
})
export class GoodsAuditComponent implements OnInit {
searchForm: FormGroup; // 搜索框
requestData = []; // 列表数据
total: number; // 页码
pageNum = 1; // 页码
pageSize = 10; // 条码
loading = true;
isVisible = false;
id: number;
objectType;
data = {
approve: {},
object: {}
};
constructor(
private form: FormBuilder,
private audit: AuditService,
private iconService: IconService,
private message: NzMessageService,
private common: CommonsService,
) {
}
ngOnInit(): void {
this.init();
}
public init(): void {
this.searchForm = this.form.group({
objectType: [4],
objectName: [null],
approveSerialNo: [null],
});
this.getRequest(true, this.searchForm.value);
}
// 查询列表
public getRequest(reset: boolean = false, whereObject: object) {
this.loading = false;
if (reset) {
this.pageNum = 1;
}
whereObject['pageNum'] = this.pageNum;
whereObject['pageSize'] = this.pageSize;
this.audit.getApproveList(whereObject, data => {
if (data['return_code'] === '000000') {
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
this.message.error(data['return_msg']);
}
});
}
// 重置
public resetForm(): void {
this.searchForm.reset();
}
// 查看详情
public getDetail(id: number , objectType: number): void {
this.id = id;
this.objectType = objectType;
this.audit.getApproveDetail(id, data => {
if (data['return_code'] === '000000') {
this.data = data['return_data'];
this.isVisible = true;
} else {
this.message.error(data['return_msg']);
}
});
}
handleCancel(): void {
this.isVisible = false;
}
public approveProcessed(statusD: number, id: number): void {
this.id = id;
const p = {
approveId: this.id,
status: statusD,
remarks: '',
};
this.common.showConfirm('是否确定', r => {
if (r) {
this.audit.approveProcessed(p, data => {
if (data['return_code'] === '000000') {
this.isVisible = false;
this.getRequest(true, this.searchForm.value);
this.message.success('操作成功');
} else {
this.message.error(data['return_msg']);
}
});
}
});
}
}

@ -0,0 +1,135 @@
<!--面包屑-->
<app-breadcrumb></app-breadcrumb>
<!--条件搜索-->
<div class="inner-content">
<form nz-form [formGroup]="searchForm" (ngSubmit)="getRequest(true , searchForm.value)">
<div nz-row>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="6">区域名称</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="regionName"/>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-row>
<div nz-col nzSpan="24" class="search-button">
<button nz-button nzType="primary"><i nz-icon nzType="search" nzTheme="outline"></i>搜索</button>
<button nz-button nzType="default" (click)="searchForm.reset()">
<i nz-icon nzType="reload" nzTheme="outline"></i>重置
</button>
</div>
</div>
</form>
</div>
<div class="inner-content">
<span>共计 {{total}} 条数据</span>
<div class="operating-button">
<button nz-button nzType="primary" class="right-btn" (click)="getEdit()"><i nz-icon nzType="plus" nzTheme="outline"></i>添加</button>
</div>
<nz-table
class="table"
#ajaxTable
nzBordered
nzShowSizeChanger
[nzFrontPagination]="false"
[nzData]="requestData"
[nzLoading]="loading"
[nzTotal]="total"
[(nzPageIndex)]="pageNum"
[(nzPageSize)]="pageSize"
[nzScroll]="{ x: '1200px' }"
(nzPageIndexChange)="getRequest(false , searchForm.value)"
(nzPageSizeChange)="getRequest(false , searchForm.value)">
<thead nzSingleSort>
<tr>
<th nzWidth="80px">编号</th>
<th nzWidth="120px">区域名称</th>
<th nzWidth="80px">包邮价格</th>
<th nzWidth="130px">运费</th>
<th nzWidth="120px">创建时间</th>
<th nzRight nzWidth="90px">状态</th>
<th nzRight nzWidth="100px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of ajaxTable.data; let i = index">
<td>{{i + 1}}</td>
<td>{{data.regionName}}</td>
<td>¥{{data.freePostPrice}}</td>
<td>¥{{data.freightPrice}}</td>
<td>{{data.createTime | date: 'yyyy-MM-dd'}}</td>
<td nzRight="">{{data.status== 2? '审核中':'生效'}}</td>
<td nzRight class="table-td-operation">
<a (click)="getEdit(data.id)">编辑</a>
<nz-divider nzType="vertical"></nz-divider>
<a (click)="deleteFreight(data.id)">删除</a>
</td>
</tbody>
</nz-table>
</div>
<nz-modal [(nzVisible)]="isVisible" nzTitle="编辑" (nzOnCancel)="isVisible = false" (nzOnOk)="handleOkEdit()">
<nz-spin [nzSpinning]="isSpinningEdit">
<form nz-form [formGroup]="validateForm" class="login-form">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>区域</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择区域!">
<nz-tree-select
style="width: 250px"
nzPlaceHolder="请选择区域"
formControlName="regionId"
[nzDropdownMatchSelectWidth]="true"
[nzDropdownStyle]="{ 'max-height': '300px' }"
[nzNodes]="regionalData"
>
</nz-tree-select>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>包邮价格</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入包邮价格!">
<nz-input-number
style="width: 200px"
formControlName="freePostPrice"
[nzMin]="0"
[nzMax]="100000"
[nzStep]="1"
[nzPrecision]="2"
nzPrecisionMode="cut"
nzPlaceHolder="请输入包邮价格!"
[nzFormatter]="formatterPercent"
[nzParser]="parserPercent"
></nz-input-number>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>运费</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入运费!">
<nz-input-number
style="width: 200px"
formControlName="freightPrice"
[nzMin]="0"
[nzMax]="100000"
[nzStep]="1"
[nzPrecision]="2"
nzPrecisionMode="cut"
nzPlaceHolder="请输入原价!"
[nzFormatter]="formatterPercent"
[nzParser]="parserPercent"
></nz-input-number>
</nz-form-control>
</nz-form-item>
</form>
</nz-spin>
</nz-modal>

@ -0,0 +1,172 @@
import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '_@angular_forms@9.0.7@@angular/forms';
import {environment} from '../../../../environments/environment';
import {NzModalService, NzNotificationService, NzUploadFile} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {CommonsService} from '../../../services/commons.service';
import {GoodsService} from '../../../services/goods/goods.service';
@Component({
selector: 'app-freight',
templateUrl: './freight.component.html',
styleUrls: ['./freight.component.scss']
})
export class FreightComponent implements OnInit {
// 搜索框
searchForm: FormGroup;
// 表单
validateForm: FormGroup;
url = environment;
// 列表数据
requestData = [];
// 总数
total: number;
// 页码
pageNum = 1;
// 条码
pageSize = 10;
// 等待
loading = false;
// 是否修改
editFlag = false;
// 编辑等待
isSpinningEdit = false;
// 弹出框编辑
isVisible = false;
id;
regionalData = [];
constructor(
private form: FormBuilder,
private notification: NzNotificationService,
private commonsService: CommonsService,
private modalService: NzModalService,
private goods: GoodsService
) {
}
// 输入框内容
formatterPercent = (value: number): string => `${value == null ? 0 : value} ¥`;
parserPercent = (value: string): string => value.replace(' ¥', '');
ngOnInit(): void {
// 初始化搜索表单
this.searchForm = this.form.group({
regionName: [null],
regionId: [null],
});
// 初始化商品表单
this.validateForm = this.form.group({
regionId: [null, [Validators.required]],
freePostPrice: [null, [Validators.required]],
freightPrice: [null, [Validators.required]],
});
this.getRequest(true, this.searchForm.value);
this.commonsService.getRegional(data => {
if (data['return_code'] === '000000') {
this.regionalData = data['return_data'];
}
});
}
// 查询列表
public getRequest(reset: boolean = false, whereObject: object) {
this.loading = true;
if (reset) {
this.pageNum = 1;
}
whereObject['pageNum'] = this.pageNum;
whereObject['pageSize'] = this.pageSize;
this.goods.getListRegionFreight(whereObject, data => {
this.loading = false;
if (data['return_code'] === '000000') {
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
this.notification.error('失败', data['return_msg']);
}
});
}
// 编辑产品
public getEdit(id?: number): void {
this.isVisible = true;
this.id = id;
if (id != null) {
this.editFlag = true;
this.findGoodsDetailById(id);
}
}
// 查询商品详情
public findGoodsDetailById(id: number): void {
this.goods.findRegionFreightById(id , data => {
if (data['return_code'] === '000000') {
data['return_data']['regionId'] = Number(data['return_data']['regionId']);
this.validateForm.patchValue(data['return_data']);
}
});
}
// 确认提交
public handleOkEdit() {
for (const i in this.validateForm.controls) {
this.validateForm.controls[i].markAsDirty();
this.validateForm.controls[i].updateValueAndValidity();
if (this.validateForm.controls[i].errors != null) {
return;
}
}
if (this.editFlag) {
this.validateForm.value.id = this.id;
this.isSpinningEdit = true;
this.goods.updateRegionFreight(this.validateForm.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '修改成功!');
this.isVisible = false;
this.getRequest(true, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
} else {
this.goods.insertRegionFreight(this.validateForm.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '添加成功!');
this.isVisible = false;
this.getRequest(true, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
}
}
// 删除商品
public deleteFreight(id): void {
this.modalService.confirm({
nzTitle: '确定删除',
nzOkText: '是',
nzOnOk: () => {
this.goods.deleteRegionFreight(id, data => {
if (data['return_code'] === '000000') {
this.notification.success('成功', `删除成功!`);
this.getRequest(true, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
},
nzCancelText: '否',
});
}
}

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

@ -0,0 +1,30 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GoodsRoutingModule } from './goods-routing.module';
import { ListComponent } from './list/list.component';
import {NgZorroAntdModule} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {SeparateModule} from '../../common/separate/separate.module';
import {FormsModule, ReactiveFormsModule} from '_@angular_forms@9.0.7@@angular/forms';
import {BreadcrumbModule} from '../../common/breadcrumb/breadcrumb.module';
import {RegionSelectorModule} from '../../common/region-selector/region-selector.module';
import {AppCommonModule} from '../../app-common.module';
import {PreviewImageModule} from '../../common/preview-image/preview-image.module';
@NgModule({
declarations: [ListComponent],
imports: [
CommonModule,
GoodsRoutingModule,
NgZorroAntdModule,
SeparateModule,
ReactiveFormsModule,
FormsModule,
BreadcrumbModule,
RegionSelectorModule,
AppCommonModule,
PreviewImageModule
]
})
export class GoodsModule { }

@ -0,0 +1,434 @@
<!--面包屑-->
<app-breadcrumb></app-breadcrumb>
<!--条件搜索-->
<div class="inner-content">
<form nz-form [formGroup]="searchForm" (ngSubmit)="getRequest(true , searchForm.value)">
<div nz-row>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="6">商品名称</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="name"/>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="6">商品标签</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="goodsLabel"/>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="6">状态</nz-form-label>
<nz-form-control [nzSpan]="16">
<nz-select nzShowSearch nzAllowClear formControlName="status" nzPlaceHolder="请选择状态">
<nz-option nzLabel="上架" [nzValue]="1"></nz-option>
<nz-option nzLabel="编辑中" [nzValue]="2"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-row>
<div nz-col nzSpan="24" class="search-button">
<button nz-button nzType="primary"><i nz-icon nzType="search" nzTheme="outline"></i>搜索</button>
<button nz-button nzType="default" (click)="searchForm.reset()">
<i nz-icon nzType="reload" nzTheme="outline"></i>重置
</button>
</div>
</div>
</form>
</div>
<div class="inner-content">
<span>共计 {{total}} 条数据</span>
<div class="operating-button">
<button nz-button nzType="primary" class="right-btn" (click)="getEdit()"><i nz-icon nzType="plus" nzTheme="outline"></i>添加</button>
</div>
<nz-table
class="table"
#ajaxTable
nzBordered
nzShowSizeChanger
[nzFrontPagination]="false"
[nzData]="requestData"
[nzLoading]="loading"
[nzTotal]="total"
[(nzPageIndex)]="pageNum"
[(nzPageSize)]="pageSize"
[nzScroll]="{ x: '1200px' }"
(nzPageIndexChange)="getRequest(false , searchForm.value)"
(nzPageSizeChange)="getRequest(false , searchForm.value)">
<thead nzSingleSort>
<tr>
<th nzWidth="80px">编号</th>
<th nzWidth="120px">商品名称</th>
<th nzWidth="120px">商品标签</th>
<th nzWidth="80px">商品类型</th>
<th nzWidth="130px">列表图片</th>
<th nzWidth="120px">创建时间</th>
<th nzRight nzWidth="90px">状态</th>
<th nzRight nzWidth="100px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of ajaxTable.data; let i = index">
<td>{{i + 1}}</td>
<td>{{data.name}}</td>
<td>{{data.goodsLabel }}</td>
<td>{{data.goodsTypeName }}</td>
<td>
<app-preview-image [previewImage] = data.listImg ></app-preview-image>
</td>
<td>{{data.createTime | date: 'yyyy-MM-dd'}}</td>
<td nzRight="">{{data.status | goodsStatus}}</td>
<td nzRight class="table-td-operation">
<a *ngIf="data.status != 1" (click)="getEdit(data.id)">编辑</a>
<nz-divider nzType="vertical"></nz-divider>
<a nz-dropdown [nzDropdownMenu]="menu">更多操作</a>
<nz-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu nzSelectable>
<li nz-menu-item> <a (click)="getSku(data.id)">查看规格</a></li>
<li class="li-a" nz-menu-item><a (click)="configSku(data.id)">配置规格</a></li>
<li *ngIf="'BTN_CONFIG_AWARD' | button" nz-menu-item> <a (click)="getPresent(data.id)">赠送列表</a></li>
<li *ngIf="'BTN_CONFIG_AWARD' | button" class="li-a" nz-menu-item><a (click)="configPresent(data.id)">配置赠送规则</a></li>
<li class="li-a" nz-menu-item><a (click)='goodsUpDown(data.id , data.status)'>{{data.status === 2 ? '申请上线': '禁用'}}</a></li>
<li class="li-a" *ngIf="data.status != 1" nz-menu-item><a (click)="deleteGoods(data.id)">删除</a></li>
</ul>
</nz-dropdown-menu>
</td>
</tbody>
</nz-table>
</div>
<nz-modal [(nzVisible)]="isVisibleEdit" nzTitle="编辑{{title}}" (nzOnCancel)="isVisibleEdit = false" (nzOnOk)="handleOkEdit()">
<nz-spin [nzSpinning]="isSpinningEdit">
<form nz-form [formGroup]="validateForm" class="login-form">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>商品名称</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入商品名称!">
<input nz-input formControlName="name" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>商品类型</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入商品类型!">
<nz-tree-select
style="width: 250px"
nzPlaceHolder="请选择商品类型"
formControlName="goodsType"
[nzDropdownMatchSelectWidth]="true"
[nzDropdownStyle]="{ 'max-height': '300px' }"
[nzNodes]="goodsTypeData"
>
</nz-tree-select>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" >商品标签</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="goodsLabel" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6">列表描述</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input formControlName="listDescribe" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>列表图</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择列表图!">
<nz-upload
nzAction="{{url.baseUrl}}/fileUpload/uploadfile"
nzListType="picture-card"
[(nzFileList)]="listImg"
[nzShowButton]="listImg.length < 1"
[nzPreview]="handlePreview"
>
<i nz-icon nzType="plus"></i>
<div class="ant-upload-text">上传图片</div>
</nz-upload>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>轮播图</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择轮播图!">
<nz-upload
nzAction="{{url.baseUrl}}/fileUpload/uploadfile"
nzListType="picture-card"
[(nzFileList)]="bannerImg"
[nzShowButton]="bannerImg.length < 6"
[nzPreview]="handlePreview"
>
<i nz-icon nzType="plus"></i>
<div class="ant-upload-text">上传图片</div>
</nz-upload>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>详情图</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择详情图!">
<nz-upload
nzAction="{{url.baseUrl}}/fileUpload/uploadfile"
nzListType="picture-card"
[(nzFileList)]="detailImg"
[nzShowButton]="detailImg.length < 7"
[nzPreview]="handlePreview"
>
<i nz-icon nzType="plus"></i>
<div class="ant-upload-text">上传图片</div>
</nz-upload>
</nz-form-control>
</nz-form-item>
</form>
</nz-spin>
</nz-modal>
<nz-modal [(nzVisible)]="isVisibleSku" nzTitle="编辑{{title}}" (nzOnCancel)="isVisibleSku = false" (nzOnOk)="handleOkSku()">
<nz-spin [nzSpinning]="isSpinningEdit">
<form nz-form [formGroup]="validateFormSku" class="login-form">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>规格名称</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入规格名称!">
<input nz-input formControlName="name" />
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>价格</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入价格!">
<nz-input-number
style="width: 200px"
formControlName="price"
[nzMin]="0"
[nzMax]="100000"
[nzStep]="1"
[nzPrecision]="2"
nzPrecisionMode="cut"
nzPlaceHolder="请输入价格!"
[nzFormatter]="formatterPercent"
[nzParser]="parserPercent"
></nz-input-number>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>原价</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入原价!">
<nz-input-number
style="width: 200px"
formControlName="originalPrice"
[nzMin]="0"
[nzMax]="100000"
[nzStep]="1"
[nzPrecision]="2"
nzPrecisionMode="cut"
nzPlaceHolder="请输入原价!"
[nzFormatter]="formatterPercent"
[nzParser]="parserPercent"
></nz-input-number>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>库存</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入库存!">
<nz-input-number
style="width: 200px"
formControlName="stock"
[nzMin]="1"
[nzMax]="100000"
[nzStep]="1"
nzPlaceHolder="请输入库存!"
></nz-input-number>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>小图</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择小图!">
<nz-upload
nzAction="{{url.baseUrl}}/fileUpload/uploadfile"
nzListType="picture-card"
[(nzFileList)]="showImg"
[nzShowButton]="showImg.length < 1"
[nzPreview]="handlePreview"
>
<i nz-icon nzType="plus"></i>
<div class="ant-upload-text">上传图片</div>
</nz-upload>
</nz-form-control>
</nz-form-item>
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>轮播图</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择轮播图!">
<nz-upload
nzAction="{{url.baseUrl}}/fileUpload/uploadfile"
nzListType="picture-card"
[(nzFileList)]="bannerSkuImg"
[nzShowButton]="bannerSkuImg.length < 4"
[nzPreview]="handlePreview"
>
<i nz-icon nzType="plus"></i>
<div class="ant-upload-text">上传图片</div>
</nz-upload>
</nz-form-control>
</nz-form-item>
</form>
</nz-spin>
</nz-modal>
<nz-modal [nzVisible]="previewVisible" [nzContent]="modalContent" [nzFooter]="null" (nzOnCancel)="previewVisible = false">
<ng-template #modalContent>
<img [src]="previewImage" [ngStyle]="{ width: '100%' }" />
</ng-template>
</nz-modal>
<!--sku列表-->
<nz-modal [(nzVisible)]="isVisibleSkuList" nzTitle="规格列表" (nzOnCancel)="isVisibleSkuList = false" [nzFooter]="null"
nzWidth="1000px" [nzBodyStyle]=" { padding: '20px 20px 30px 20px'}">
<nz-table [nzLoading]="loadingSku" nzBordered #skuDataList [nzData]="skuData" [nzHideOnSinglePage]="true">
<thead>
<tr>
<th nzWidth="80px">名称</th>
<th nzWidth="80px">图片</th>
<th nzWidth="80px">销售价格</th>
<th nzWidth="80px">售卖价格</th>
<th nzWidth="100px">创建时间</th>
<th nzWidth="100px">更新时间</th>
<th nzWidth="70px" nzRight="0px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of skuDataList.data">
<td>{{data.name}}</td>
<td>
<app-preview-image [previewImage] = data.showImg ></app-preview-image>
</td>
<td>¥{{data.originalPrice}}</td>
<td>¥{{data.price}}</td>
<td>{{data.createTime | date: 'yyyy-MM-dd HH:mm'}}</td>
<td>{{data.updateTime | date: 'yyyy-MM-dd HH:mm'}}</td>
<td nzRight="0px" class="table-td-operation">
<a (click)="configSku(data.goodsId , data.id)">编辑</a>
<nz-divider nzType="vertical"></nz-divider>
<a (click)="deleteSku(data.id)">删除</a>
</td>
</tr>
</tbody>
</nz-table>
</nz-modal>
<nz-modal [(nzVisible)]="isVisiblePresent" nzTitle="配置奖励" (nzOnCancel)="isVisiblePresent = false" (nzOnOk)="handleOk()">
<div nz-row *ngFor="let control of listOfControl; let i = index">
<div nz-col class="gutter-row" [nzSpan]="20">
<div nz-col class="gutter-row" [nzSpan]="24">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>类型</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择类型">
<nz-select *ngIf="control.isEdit" nzShowSearch nzAllowClear [(ngModel)]="control.type" nzPlaceHolder="请选择类型">
<nz-option nzLabel="卡券" [nzValue]="1"></nz-option>
<nz-option nzLabel="优惠券" [nzValue]="2"></nz-option>
</nz-select>
<span *ngIf="!control.isEdit">{{control.type === 1 ? '卡券': '优惠券'}}</span>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col *ngIf="control.type == 2" class="gutter-row" [nzSpan]="24">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>代理商</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择代理商">
<nz-select *ngIf="control.isEdit" nzShowSearch nzAllowClear [(ngModel)]="control.agentId" (ngModelChange)="getSourceNameName($event , i , presentType.agentName)" nzPlaceHolder="请选择代理商状态">
<nz-option *ngFor="let item of agentData" nzLabel="{{item.agentName}}" [nzValue]="item.id"></nz-option>
</nz-select>
<span *ngIf="!control.isEdit">{{control.agentName}}</span>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col *ngIf="control.type == 2" class="gutter-row" [nzSpan]="24">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>优惠券</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择优惠券">
<nz-select *ngIf="control.isEdit" nzShowSearch nzAllowClear [(ngModel)]="control.sourceId" (ngModelChange)="getSourceNameName($event , i , presentType.discountName)" nzPlaceHolder="请选择优惠券">
<nz-option *ngFor="let item of discountList" nzLabel="{{item['highDiscount'].discountName}}" [nzValue]="item.id"></nz-option>
</nz-select>
<span *ngIf="!control.isEdit">{{control.sourceName}}</span>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col *ngIf="control.type !== 2" class="gutter-row" [nzSpan]="24">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>卡券</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请选择卡券">
<nz-select *ngIf="control.isEdit" nzShowSearch [(ngModel)]="control.sourceId"
(ngModelChange)="getSourceNameName($event , i , presentType.couponName)"
nzPlaceHolder="请选择卡券"
>
<nz-option *ngFor="let item of listOfOption" [nzLabel]="item['couponName']" [nzValue]="item['id']"></nz-option>
</nz-select>
<span *ngIf="!control.isEdit">{{control.sourceName}}</span>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col class="gutter-row" [nzSpan]="24">
<nz-form-item>
<nz-form-label [nzSpan]="6" nzRequired>奖励数量</nz-form-label>
<nz-form-control [nzSpan]="16" nzErrorTip="请输入奖励数量">
<input nz-input type="number" *ngIf="control.isEdit" [(ngModel)]="control.num" placeholder="请输入奖励数量" />
<span *ngIf="!control.isEdit">{{control.num}}</span>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-col class="gutter-row" [nzSpan]="4">
<button nz-button nzType="default" (click)="removeField(i , $event)"><i nz-icon nzType="delete" nzTheme="outline"></i>删除</button>
<br/>
<button class="btn" *ngIf="control.isEdit" nz-button nzType="primary" (click)="addField(i)"><i nz-icon nzType="plus" nzTheme="outline"></i>添加</button>
</div>
</div>
</nz-modal>
<nz-modal [(nzVisible)]="isVisiblePresentList" nzTitle="赠送列表列表" (nzOnCancel)="isVisiblePresentList = false" [nzFooter]="null"
nzWidth="1000px" [nzBodyStyle]=" { padding: '20px 20px 30px 20px'}">
<nz-table [nzLoading]="loadingSku" nzBordered #presentDataList [nzData]="presentData" [nzHideOnSinglePage]="true">
<thead>
<tr>
<th nzWidth="80px">类型</th>
<th nzWidth="120px">赠送内容</th>
<th nzWidth="40px">数量</th>
<th nzWidth="100px">创建时间</th>
<th nzWidth="100px">更新时间</th>
<th nzWidth="50px" nzRight="0px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of presentDataList.data">
<td>{{data.type === 1 ? '卡券': '优惠券'}}</td>
<td>{{data.sourceName}}</td>
<td>{{data.num}}</td>
<td>{{data.createTime | date: 'yyyy-MM-dd HH:mm'}}</td>
<td>{{data.updateTime | date: 'yyyy-MM-dd HH:mm'}}</td>
<td nzRight="0px" class="table-td-operation">
<!-- <a (click)="configSku(data.goodsId , data.id)">编辑</a>-->
<!-- <nz-divider nzType="vertical"></nz-divider>-->
<a (click)="deletePresent(data.id)">删除</a>
</td>
</tr>
</tbody>
</nz-table>
</nz-modal>

@ -0,0 +1,3 @@
.btn {
margin-top: 20px;
}

@ -0,0 +1,562 @@
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {GoodsService} from '../../../services/goods/goods.service';
import {environment} from '../../../../environments/environment';
import {NzNotificationService, NzUploadFile} from 'ng-zorro-antd';
import {NzModalService} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {CommonsService} from '../../../services/commons.service';
import {AgentService} from '../../../services/agent.service';
import {CouponService} from '../../../services/coupon.service';
import {PresentType} from '../../../enum/present-type.enum';
@Component({
selector: 'app-list',
templateUrl: './list.component.html',
styleUrls: ['./list.component.scss']
})
export class ListComponent implements OnInit {
// 搜索框
searchForm: FormGroup;
// 商品表单
validateForm: FormGroup;
// 商品sku表单
validateFormSku: FormGroup;
url = environment;
// 列表数据
requestData = [];
// 总数
total: number;
// 页码
pageNum = 1;
// 条码
pageSize = 10;
// 等待
loading = false;
// 是否修改
editFlag = false;
// 编辑等待
isSpinningEdit = false;
// 弹出框编辑商品
isVisibleEdit = false;
// 弹出框编辑sku
isVisibleSku = false;
// 商品标题
title: string;
// 商品ID
goodsId: number;
// 商品类型数据
goodsTypeData;
// 展示大图图片
previewImage: string | undefined = '';
previewVisible = false;
// 列表图片
listImg = [];
// 轮播图
bannerImg = [];
// 详情图
detailImg = [];
// sku展示小图
showImg = [];
// sku轮播图
bannerSkuImg = [];
// sku弹出框
isVisibleSkuList = false;
// SKU列表等待
loadingSku = false;
// SKU数据
skuData = [];
skuId = null;
isVisiblePresent = false;
// 优惠券数据
discountList = [];
// 卡券列表
listOfOption = [];
// 赠送内容
listOfControl = [{
isEdit: true,
agentId: null,
num: null,
sourceId: null,
agentName: null,
goodsId: null,
sourceName: null,
type: null,
}];
// 代理商列表
agentData = [];
presentType = PresentType;
isVisiblePresentList = false;
presentData = [];
constructor(
private form: FormBuilder,
private notification: NzNotificationService,
private commonsService: CommonsService,
private modalService: NzModalService,
private agent: AgentService,
private coupon: CouponService,
private goods: GoodsService
) {
}
// 输入框内容
formatterPercent = (value: number): string => `${value == null ? 0 : value} ¥`;
parserPercent = (value: string): string => value.replace(' ¥', '');
ngOnInit(): void {
// 初始化搜索表单
this.searchForm = this.form.group({
name: [null],
status: [null],
goodsLabel: [null],
});
// 初始化商品表单
this.validateForm = this.form.group({
name: [null, [Validators.required]],
goodsType: [null, [Validators.required]],
goodsLabel: [null],
listDescribe: [null],
});
// 初始化商品表单
this.validateFormSku = this.form.group({
name: [null, [Validators.required]],
price: [null, [Validators.required]],
originalPrice: [null, [Validators.required]],
stock: [null, [Validators.required]],
});
// 获取商品分类树
this.goods.getGoodsTypeTree(3, data => {
if (data['return_code'] === '000000') {
this.goodsTypeData = data['return_data'];
}
});
this.getRequest(true, this.searchForm.value);
this.agent.getListAgent({
pageNum: 1 ,
pageSize: 800 ,
type: 1
}, data => {
if (data['return_code'] === '000000') {
this.agentData = data['return_data'].list;
}
});
this.coupon.getCouponListByAll({} , data => {
if (data['return_code'] === '000000') {
this.listOfOption = data['return_data'];
}
});
}
// 查询列表
public getRequest(reset: boolean = false, whereObject: object) {
this.loading = true;
if (reset) {
this.pageNum = 1;
}
whereObject['pageNum'] = this.pageNum;
whereObject['pageSize'] = this.pageSize;
this.goods.getListGoodsDetail(whereObject, data => {
this.loading = false;
if (data['return_code'] === '000000') {
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
this.notification.error('失败', data['return_msg']);
}
});
}
public getDiscount(id: number): void {
const whereObject = {};
whereObject['pageNum'] = 1;
whereObject['pageSize'] = 10000;
whereObject['agentId'] = id;
this.agent.getDiscountAgentList(whereObject, data => {
if (data['return_code'] === '000000') {
this.discountList = data['return_data'].list;
}
});
}
getSourceNameName(id: number , i , presentType: any ) {
console.log(i);
if (presentType === this.presentType.discountName) {
this.listOfControl[i].sourceName = this.discountList.find(item => {
return item.id === id;
})['highDiscount'].discountName;
}
if (presentType === this.presentType.couponName) {
this.listOfControl[i].sourceName = this.listOfOption.find(item => {
return item.id === id;
}).couponName;
}
if (presentType === this.presentType.agentName) {
this.getDiscount(id);
this.listOfControl[i].agentName = this.agentData.find(item => {
return item.id === id;
})['agentName'];
}
}
// 编辑产品
public getEdit(id?: number): void {
this.isVisibleEdit = true;
this.goodsId = id;
if (id != null) {
this.editFlag = true;
this.findGoodsDetailById(id);
}
}
// 查询商品详情
public findGoodsDetailById(id: number): void {
this.goods.findGoodsDetailById(id , data => {
if (data['return_code'] === '000000') {
if (!this.commonsService.whetherStringIsNull(data['return_data']['listImg'])) {
this.listImg = this.commonsService.stitchImg(data['return_data']['listImg']);
}
if (!this.commonsService.whetherStringIsNull(data['return_data']['bannerImg'])) {
this.bannerImg = this.commonsService.stitchImg(data['return_data']['bannerImg']);
}
if (!this.commonsService.whetherStringIsNull(data['return_data']['detailImg'])) {
this.detailImg = this.commonsService.stitchImg(data['return_data']['detailImg']);
}
this.validateForm.patchValue(data['return_data']);
}
});
}
// 确认提交
public handleOkEdit() {
for (const i in this.validateForm.controls) {
this.validateForm.controls[i].markAsDirty();
this.validateForm.controls[i].updateValueAndValidity();
if (this.validateForm.controls[i].errors != null) {
return;
}
}
if (this.listImg.length === 0 || this.bannerImg.length === 0 || this.detailImg.length === 0) {
this.notification.error('错误', '相关图片未上传!');
}
this.validateForm.value.listImg = this.commonsService.postImg(this.listImg);
this.validateForm.value.bannerImg = this.commonsService.postImg(this.bannerImg);
this.validateForm.value.detailImg = this.commonsService.postImg(this.detailImg);
if (this.editFlag) {
this.validateForm.value.id = this.goodsId;
this.isSpinningEdit = true;
this.goods.updateGoods(this.validateForm.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '修改成功!');
this.isVisibleEdit = false;
this.getRequest(false, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
} else {
this.goods.insertGoods(this.validateForm.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '添加成功!');
this.isVisibleEdit = false;
this.getRequest(false, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
}
}
// 图片查看
handlePreview = async (file: NzUploadFile) => {
if (!file.url && !file.preview) {
file.preview = await this.getBase64(file.originFileObj!);
}
this.previewImage = file.url || file.preview;
this.previewVisible = true;
}
// 图片转换成base64
getBase64(file: File): Promise<string | ArrayBuffer | null> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
public configSku(id: number , skuId?: number) {
this.isVisibleSku = true;
this.goodsId = id;
this.skuId = skuId;
if (skuId != null) {
this.findGoodsSkuById(skuId);
}
}
// sku编辑
public handleOkSku() {
for (const i in this.validateFormSku.controls) {
this.validateFormSku.controls[i].markAsDirty();
this.validateFormSku.controls[i].updateValueAndValidity();
if (this.validateFormSku.controls[i].errors != null) {
return;
}
}
if (this.showImg.length === 0 || this.bannerSkuImg.length === 0) {
this.notification.error('错误', '相关图片未上传!');
}
if (this.showImg[0]['response'] != null) {
this.validateFormSku.value.showImg = this.showImg[0]['response']['return_data'][0];
} else {
this.validateFormSku.value.showImg = this.showImg[0].name;
}
if (this.bannerSkuImg[0]['response'] != null) {
this.validateFormSku.value.bannerImg = this.bannerSkuImg[0]['response']['return_data'][0];
} else {
this.validateFormSku.value.bannerImg = this.bannerSkuImg[0].name;
}
this.validateFormSku.value.goodsId = this.goodsId;
if (this.skuId != null) {
this.validateFormSku.value.id = this.skuId;
this.isSpinningEdit = true;
this.goods.updateGoodsSku(this.validateFormSku.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '修改成功!');
this.isVisibleSku = false;
this.skuId = null;
this.getListGoodsSku({goodsId : this.goodsId});
} else {
this.notification.error('失败', data['return_msg']);
}
});
} else {
this.goods.insertGoodsSku(this.validateFormSku.value, data => {
this.isSpinningEdit = false;
if (data['return_code'] === '000000') {
this.notification.success('成功', '添加成功!');
this.isVisibleSku = false;
this.getListGoodsSku({goodsId : this.goodsId});
} else {
this.notification.error('失败', data['return_msg']);
}
});
}
}
// 展示sku列表
public getSku(id: number): void {
this.goodsId = id;
this.isVisibleSkuList = true;
this.getListGoodsSku({goodsId : id});
}
// 展示配置规则
public configPresent(id: number): void {
this.goodsId = id;
this.listOfControl[0].goodsId = id;
this.isVisiblePresent = true;
}
// 查询sku列表
public getListGoodsSku( whereObject: object): void {
this.loadingSku = true;
this.goods.getListGoodsSku(whereObject , data => {
this.loadingSku = false;
if (data['return_code'] === '000000') {
this.skuData = data['return_data'];
}
});
}
// 查询sku详情
public findGoodsSkuById(id: number): void {
this.goods.findGoodsSkuById(id , data => {
if (data['return_code'] === '000000') {
if (!this.commonsService.whetherStringIsNull(data['return_data']['showImg'])) {
this.showImg = this.commonsService.stitchImg(data['return_data']['showImg']);
}
if (!this.commonsService.whetherStringIsNull(data['return_data']['bannerImg'])) {
this.bannerSkuImg = this.commonsService.stitchImg(data['return_data']['bannerImg']);
}
this.validateFormSku.patchValue(data['return_data']);
}
});
}
// 删除sku
public deleteSku(id): void {
this.modalService.confirm({
nzTitle: '确定删除',
nzOkText: '是',
nzOnOk: () => {
this.goods.deleteSku(id, data => {
if (data['return_code'] === '000000') {
this.notification.success('成功', `删除成功!`);
this.getListGoodsSku({goodsId : this.goodsId});
} else {
this.notification.error('失败', data['return_msg']);
}
});
},
nzCancelText: '否',
});
}
// 商品的上下架
public goodsUpDown(id: number , status: number): void {
this.modalService.confirm({
nzTitle: status === 2 ? '是否申请上线' : '是否禁用',
nzOkText: '是',
nzOnOk: () => {
this.goods.goodsUpDown(id, data => {
if (data['return_code'] === '000000') {
this.notification.success('成功', `操作成功!`);
this.getRequest(false, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
},
nzCancelText: '否',
});
}
// 删除商品
public deleteGoods(id): void {
this.modalService.confirm({
nzTitle: '确定删除',
nzOkText: '是',
nzOnOk: () => {
this.goods.deleteGoods(id, data => {
if (data['return_code'] === '000000') {
this.notification.success('成功', `删除成功!`);
this.getRequest(false, this.searchForm.value);
} else {
this.notification.error('失败', data['return_msg']);
}
});
},
nzCancelText: '否',
});
}
// 删除
removeField(i, e: MouseEvent): void {
e.preventDefault();
if (this.listOfControl.length > 1) {
this.listOfControl.splice(i, 1);
this.listOfControl[i - 1].isEdit = true;
}
}
// 新增
addField(i): void {
if (
this.listOfControl[i].type == null ||
this.listOfControl[i].sourceId == null ||
this.listOfControl[i].num == null
) {
this.notification.error('失败' , '请填写必填项!');
return;
}
if (
this.listOfControl[i].type === 2 && this.listOfControl[i].agentId == null
) {
this.notification.error('失败' , '请选择代理商!');
return;
}
this.listOfControl[i].isEdit = false;
const control = {
isEdit: true,
agentId: null,
goodsId: this.goodsId ,
num: null,
sourceId: null,
agentName: null,
sourceName: null,
type: null,
};
this.listOfControl.push(control);
}
handleOk(): void {
for (const item of this.listOfControl) {
if (item.sourceId != null) {
this.goods.insertPresent(item , data => {
if (data['return_code'] !== '000000') {
this.notification.error('失败', data['return_msg']);
return;
}
});
}
}
this.isVisiblePresent = false;
this.notification.success('成功', `新增成功!`);
}
public getListPresent( whereObject: object): void {
this.loadingSku = true;
this.goods.getListPresent(whereObject , data => {
this.loadingSku = false;
if (data['return_code'] === '000000') {
this.presentData = data['return_data'];
}
});
}
public getPresent(id: number): void {
this.goodsId = id;
this.isVisiblePresentList = true;
this.getListPresent({goodsId : id});
}
public deletePresent(id): void {
this.modalService.confirm({
nzTitle: '确定删除',
nzOkText: '是',
nzOnOk: () => {
this.goods.deletePresent(id, data => {
if (data['return_code'] === '000000') {
this.notification.success('成功', `删除成功!`);
this.getListPresent({goodsId : this.goodsId});
} else {
this.notification.error('失败', data['return_msg']);
}
});
},
nzCancelText: '否',
});
}
}

@ -0,0 +1,227 @@
<!-- start 面包屑 -->
<app-breadcrumb></app-breadcrumb>
<!-- end 面包屑 -->
<nz-spin [nzSpinning]="loadingObject.status" [nzTip]="loadingObject.title">
<!-- start 搜索条件 -->
<div class="inner-content">
<form nz-form [formGroup]="searchForm" (ngSubmit)="getRequest(true , searchForm.value)">
<div nz-row>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">交易单号</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="orderNo" />
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">客户电话</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="memPhone" />
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">交易状态</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-select formControlName="status" nzAllowClear>
<nz-option *ngFor="let item of orderStatusArray" nzValue="{{item.codeValue}}" nzLabel="{{item.codeName}}"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">创建时间</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-range-picker
[nzShowTime]="{ nzHideDisabledOptions: true }"
formControlName="createTimeArray"
nzFormat="yyyy-MM-dd HH:mm:ss"
></nz-range-picker>
</nz-form-control>
</nz-form-item>
</div>
<div nz-row>
<div nz-col nzSpan="24" class="search-button">
<button nz-button nzType="primary"><i nz-icon nzType="search" nzTheme="outline"></i>搜索</button>
<button nz-button nzType="default" (click)="searchForm.reset();"><i nz-icon nzType="reload" nzTheme="outline"></i>重置</button>
</div>
</div>
</form>
</div>
<!-- end 搜索条件 -->
<!--列表数据-->
<div class="inner-content">
<span>共计 {{total?total:0}} 条数据</span>
<div class="operating-button">
<button nz-button nzType="primary" class="right-btn" (click)="excelOrder(searchForm.value)" ><i nz-icon nzType="export" nzTheme="outline"></i>导出Excel</button>
</div>
<!--数组表格 -->
<nz-table #basicTable
nzShowPagination
nzShowSizeChanger
nzBordered
[nzData]="requestData"
[nzTotal]="total"
[nzLoading]="loading"
[nzFrontPagination]="false"
[(nzPageIndex)]="pageNum"
[(nzPageSize)]="pageSize"
(nzPageIndexChange)="getRequest(false , searchForm.value)"
(nzPageSizeChange)="getRequest(false , searchForm.value)"
[nzPageSizeOptions]="[10,20,50,100]"
[nzScroll]="{ x: '1200px'}">
<thead>
<tr>
<th nzWidth="200px">交易单号</th>
<th nzWidth="130px">客户电话</th>
<th nzWidth="200px">订单名称</th>
<th nzWidth="100px">订单金额</th>
<th nzWidth="100px">支付金额</th>
<th nzWidth="100px">支付方式</th>
<th nzWidth="100px">订单状态</th>
<th nzWidth="180px">创建时间</th>
<th nzWidth="180px" nzRight="0px">物流状态</th>
<th nzWidth="110px" nzRight="0px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of basicTable.data;let i = index" [ngClass]="{'fontColor': data.logisticsStatus === '1' }">
<td>{{data.orderNo}}</td>
<td>{{data.memPhone}}</td>
<td>{{data.title}}</td>
<td>¥{{data.totalPrice}}</td>
<td>¥{{data.payPrice}}</td>
<td>{{data.orderStatus == 1 || data.orderStatus == 5 ? '未支付' : data.payType | orderPayType}}</td>
<td>{{data.orderStatus | orderStatus}}</td>
<td>{{data.createTime | date : 'yyyy-MM-dd HH:mm:ss'}}</td>
<td nzRight="0px" >{{data.logisticsStatus | logisticsStatus}}</td>
<td nzRight="0px" class="table-td-operation">
<a nz-dropdown [nzDropdownMenu]="menu"> 操作列表 <i nz-icon nzType="down"></i> </a>
<nz-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu nzSelectable>
<li nz-menu-item (click)="showOrderDetail(data.orderNo)"><a>详情</a></li>
<li nz-menu-item (click)="updateLogisticsNo(data.orderNo)"><a>录入物流编码</a></li>
</ul>
</nz-dropdown-menu>
</td>
</tr>
</tbody>
</nz-table>
</div>
</nz-spin>
<nz-modal [(nzVisible)]="orderDetailModal" nzTitle="交易详情" (nzOnCancel)="orderDetailModal = false" [nzFooter]="null"
nzWidth="1000px" [nzBodyStyle]=" { padding: '20px 20px 30px 20px'}">
<nz-spin [nzSpinning]="orderDetailModalLoading">
<nz-tabset [nzType]="'card'">
<nz-tab nzTitle="订单信息">
<nz-descriptions nzBordered [nzColumn]="2" [nzSize]="'middle'">
<nz-descriptions-item nzTitle="交易订单号">{{orderDetailObject.tradeOrder.orderNo}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="第三方交易号">{{orderDetailObject.tradeOrder.paySerialNo!=null?orderDetailObject.tradeOrder.paySerialNo:'无'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="客户手机号">{{orderDetailObject.tradeOrder.memPhone}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="交易状态">{{orderDetailObject.tradeOrder.orderStatus | orderStatus}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="支付方式">{{orderDetailObject.tradeOrder.payType | orderPayType}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="支付卡号" *ngIf="orderDetailObject.tradeOrder.payType == 4 || orderDetailObject.tradeOrder.payType == 7">
{{orderDetailObject.tradeOrder.memCardNo}}
</nz-descriptions-item>
<nz-descriptions-item nzTitle="优惠券">{{orderDetailObject.tradeOrder.memDiscountName?orderDetailObject.tradeOrder.memDiscountName:'无'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="返利">{{orderDetailObject.tradeOrder.whetherRebate?'是':'否'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="备注">{{orderDetailObject.tradeOrder.remarks}}</nz-descriptions-item>
</nz-descriptions>
</nz-tab>
<nz-tab nzTitle="支付信息">
<nz-descriptions nzBordered [nzColumn]="3" [nzSize]="'middle'">
<nz-descriptions-item nzTitle="交易总额" >{{orderDetailObject.tradeOrder.totalPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="总优惠" >{{orderDetailObject.tradeOrder.totalDeductionPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="产品优惠金额" >{{orderDetailObject.tradeOrder.deductionProductPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="优惠券优惠" >{{orderDetailObject.tradeOrder.deductionCouponPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="应付金额" >{{orderDetailObject.tradeOrder.payablePrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="积分抵扣" >{{orderDetailObject.tradeOrder.payGold / 100}} 元 </nz-descriptions-item>
<nz-descriptions-item nzTitle="实付金额" >
{{orderDetailObject.tradeOrder.payRealPrice!=null?orderDetailObject.tradeOrder.payRealPrice+' 元':'未支付'}}
</nz-descriptions-item>
</nz-descriptions>
</nz-tab>
<nz-tab nzTitle="订单时间">
<nz-card>
<nz-timeline>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.createTime != null">
<p>创建时间:{{orderDetailObject.tradeOrder.createTime | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
<p>备注:{{orderDetailObject.tradeOrder.remarks?orderDetailObject.tradeOrder.remarks:'无'}}</p>
</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.cancelTime != null">
<p>取消时间:{{orderDetailObject.tradeOrder.cancelTime | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
<p>备注:{{orderDetailObject.tradeOrder.cancelRemarks?orderDetailObject.tradeOrder.cancelRemarks:'无'}}</p>
</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.payTime != null">支付时间:{{orderDetailObject.tradeOrder.payTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.finishTime != null">完成时间:{{orderDetailObject.tradeOrder.finishTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.refundTime != null">退款时间:{{orderDetailObject.tradeOrder.refundTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
</nz-timeline>
</nz-card>
</nz-tab>
<nz-tab nzTitle="商品信息">
<nz-table nzBordered #childOrder [nzData]="orderDetailObject.tradeOrder.highChildOrderList" [nzHideOnSinglePage]="true">
<thead>
<tr>
<th nzWidth="80px">产品类型</th>
<th nzWidth="100px">产品图片</th>
<th nzWidth="120px">产品名称</th>
<th nzWidth="30px">商品原价</th>
<th nzWidth="30px">支付价格</th>
<th nzWidth="20px">数量</th>
<th nzWidth="20px">支付总价</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of childOrder.data">
<td>{{ data.goodsType | orderChildGoodsType}}</td>
<td>
<app-preview-image [previewImage] = data.goodsImg ></app-preview-image>
</td>
<td>
{{ data.goodsName }}
<nz-tag *ngIf="data.giveawayType == 1" [nzColor]="'magenta'">赠品</nz-tag>
</td>
<td>{{ data.goodsPrice }} 元</td>
<td>{{ data.goodsActualPrice }} 元</td>
<td>{{ data.saleCount }}</td>
<td>{{ data.totalActualPrice }} 元</td>
</tr>
</tbody>
</nz-table>
</nz-tab>
<nz-tab nzTitle="物流信息" *ngIf="orderDetailObject.goodsOrder.logisticsNo != null">
<nz-timeline [nzReverse]="true">
<nz-timeline-item *ngFor="let item of logisticsTraceDetails;let i = index" [nzColor]="i===logisticsTraceDetails.length -1?'green':'gray'">
<p [ngClass]="{'fontColorBlue': i===logisticsTraceDetails.length -1 }">{{item['desc']}}</p>
<p [ngClass]="{'fontColorBlue': i===logisticsTraceDetails.length -1 }">{{item.time | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
</nz-timeline-item>
</nz-timeline>
</nz-tab>
</nz-tabset>
</nz-spin>
</nz-modal>
<nz-modal [(nzVisible)]="isVisible" nzTitle="新增物流单号" (nzOnCancel)="isVisible = false" (nzOnOk)="handleOk()">
<div nz-row>
<div nz-col nzSpan="20">
<nz-form-item>
<nz-form-label [nzSpan]="6">物流单号</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input [(ngModel)]="logisticsNo"/>
</nz-form-control>
</nz-form-item>
</div>
</div>
</nz-modal>

@ -0,0 +1,9 @@
img {
width: 60px;
}
.fontColor {
color: red;
}
.fontColorBlue {
color: #00a2d4;
}

@ -0,0 +1,176 @@
import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup} from '_@angular_forms@9.0.7@@angular/forms';
import {environment} from '../../../../environments/environment';
import {LocalStorageService} from '../../../services/local-storage.service';
import {NzMessageService, NzNotificationService} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {OrderThirdPartyService} from '../../../services/order/order-third-party.service';
import {GoodsService} from '../../../services/goods/goods.service';
import {CompanyService} from '../../../services/company.service';
import {CommonsService} from '../../../services/commons.service';
import {ADMIN_INFO_OBJECT} from '../../../services/local-storage.namespace';
@Component({
selector: 'app-goods-child-order',
templateUrl: './goods-child-order.component.html',
styleUrls: ['./goods-child-order.component.scss']
})
export class GoodsChildOrderComponent implements OnInit {
// 搜索框
searchForm: FormGroup;
// 搜索框折叠
isCollapse = false;
// 订单状态数据
orderStatusArray = [];
// 公司数据
companyArray = [];
// 角色类型
roleType: number;
// 列表相关参数
// 总条数
total: number;
// 页码
pageNum = 1;
// 条码
pageSize = 10;
// 列表数据
requestData = [];
// 列表加载
loading = true;
isVisible = false;
// 订单详情相关参数
// 详情模态框
orderDetailModal = false;
// 详情模态框数据等待
orderDetailModalLoading = false;
// 订单详情数据
orderDetailObject: any = {
tradeOrder: {},
goodsOrder: {
logisticsNo: null
},
};
// 数据加载中参数
loadingObject = {
title: '加载中...',
status: false,
};
// 请求地址参数
FILE_URL = environment.imageUrl;
orderNo;
logisticsNo;
logisticsTraceDetails;
constructor(
private form: FormBuilder,
private store: LocalStorageService,
private message: NzMessageService,
private thirdPartyOrder: OrderThirdPartyService,
private goods: GoodsService,
private companyService: CompanyService,
private commonsService: CommonsService,
private notification: NzNotificationService,
) { }
ngOnInit(): void {
// 搜索表单初始化
this.searchForm = this.form.group({
orderNo: [null],
memPhone: [null],
status: [null],
createTimeArray: [null],
});
// 角色类型初始化
this.roleType = Number(this.store.get(ADMIN_INFO_OBJECT)['secRole'].roleType);
// 查询公司列表
if (this.roleType === 0 || this.roleType === 1) {
this.companyService.selectCompanyList({ pageNum: 1, pageSize: 999 }, data => {
this.companyArray = data['return_data']['list'];
});
}
// 查询订单状态数据
this.commonsService.getDictionary('ORDER_STATUS', data => {
this.orderStatusArray = data['return_data'];
});
this.getRequest(true, this.searchForm.value);
}
// 查询列表
public getRequest(reset: boolean = false, whereObject: object) {
this.loading = true;
if (reset) {
this.pageNum = 1;
}
whereObject['pageNum'] = this.pageNum;
whereObject['pageSize'] = this.pageSize;
if (whereObject['createTimeArray'] != null && whereObject['createTimeArray'].length !== 0) {
whereObject['createTimeS'] = whereObject['createTimeArray'][0].getTime();
whereObject['createTimeE'] = whereObject['createTimeArray'][1].getTime();
}
this.goods.getOrderChildList(whereObject, data => {
this.loading = false;
if (data['return_code'] === '000000') {
console.log(data);
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
this.message.error(data['return_msg']);
}
});
}
// 展示订单详情
public showOrderDetail(orderNo: string) {
this.orderDetailModal = true;
this.orderDetailModalLoading = true;
this.goods.getGoodsOrderDetail(orderNo, data => {
if (data['return_code'] === '000000') {
console.log(data);
this.orderDetailObject = data['return_data'];
this.logisticsTraceDetails = data['return_data']['logisticsTraceDetails'];
console.log(this.logisticsTraceDetails);
} else {
this.message.error(data['return_msg']);
}
this.orderDetailModalLoading = false;
});
}
// 导出数据
public excelOrder(whereObject) {
this.loadingObject.status = true;
this.loadingObject.title = '数据导出中...';
this.thirdPartyOrder.exportThirdPartyOrderList(whereObject, data => {
if (data['return_code'] === '000000') {
window.location.href = this.FILE_URL + 'temporary/' + data['return_data'];
} else {
this.message.error(data['return_msg']);
}
this.loadingObject.status = false;
});
}
// 更新运费单号
public updateLogisticsNo(order: string): void {
this.orderNo = order;
this.isVisible = true;
}
public handleOk(): void {
this.goods.updateLogisticsNo({
orderNo: this.orderNo ,
logisticsNo: this.logisticsNo
} , data => {
if (data['return_code'] === '000000') {
this.isVisible = false;
this.notification.success('成功' , '更新成功');
} else {
this.notification.error( '失败' , '更新成功');
}
});
}
}

@ -0,0 +1,296 @@
<!-- start 面包屑 -->
<app-breadcrumb></app-breadcrumb>
<!-- end 面包屑 -->
<nz-spin [nzSpinning]="loadingObject.status" [nzTip]="loadingObject.title">
<!-- start 搜索条件 -->
<div [@openClose]="isCollapse ? 'open' : 'closed'">
<div class="inner-content">
<form nz-form [formGroup]="searchForm" (ngSubmit)="getRequest(true , searchForm.value)">
<div nz-row>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">交易单号</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="orderNo" />
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">客户电话</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="memPhone" />
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">交易状态</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-select formControlName="orderStatus" nzAllowClear>
<nz-option *ngFor="let item of orderStatusArray" nzValue="{{item.codeValue}}" nzLabel="{{item.codeName}}"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-row *ngIf="isCollapse">
<div nz-col nzSpan="8" *ngIf="roleType == 0 || roleType == 1">
<nz-form-item>
<nz-form-label [nzSpan]="8">分公司</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-select nzShowSearch formControlName="companyId" nzAllowClear>
<nz-option *ngFor="let item of companyArray" nzValue="{{item['id']}}" nzLabel="{{item['name']}}"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">支付方式</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-select nzAllowClear formControlName="payType">
<nz-option nzValue="1" nzLabel="支付宝"></nz-option>
<nz-option nzValue="2" nzLabel="微信"></nz-option>
<nz-option nzValue="3" nzLabel="积分抵扣"></nz-option>
<nz-option nzValue="4" nzLabel="汇联通工会卡"></nz-option>
<nz-option nzValue="5" nzLabel="银联"></nz-option>
<nz-option nzValue="6" nzLabel="银联分期"></nz-option>
<nz-option nzValue="7" nzLabel="嗨森逛油卡"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">支付卡号</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="memCardNo" />
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">支付时间</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-range-picker
[nzShowTime]="{ nzHideDisabledOptions: true }"
formControlName="payTimeArray"
nzFormat="yyyy-MM-dd HH:mm:ss"
></nz-range-picker>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">创建时间</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-range-picker
[nzShowTime]="{ nzHideDisabledOptions: true }"
formControlName="createTimeArray"
nzFormat="yyyy-MM-dd HH:mm:ss"
></nz-range-picker>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">退款时间</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-range-picker
[nzShowTime]="{ nzHideDisabledOptions: true }"
formControlName="refundTimeArray"
nzFormat="yyyy-MM-dd HH:mm:ss"
></nz-range-picker>
</nz-form-control>
</nz-form-item>
</div>
</div>
<div nz-row>
<div nz-col nzSpan="24" class="search-button">
<button nz-button nzType="primary"><i nz-icon nzType="search" nzTheme="outline"></i>搜索</button>
<button nz-button nzType="default" (click)="searchForm.reset();"><i nz-icon nzType="reload" nzTheme="outline"></i>重置</button>
<a class="collapse" (click)="isCollapse = !isCollapse;">{{!isCollapse ? '更多条件' : '隐藏条件'}}<i nz-icon [nzType]="!isCollapse ? 'down' : 'up'"></i></a>
</div>
</div>
</form>
</div>
</div>
<!-- end 搜索条件 -->
<!--列表数据-->
<div class="inner-content">
<span>共计 {{total?total:0}} 条数据</span>
<div class="operating-button">
<button nz-button nzType="primary" class="right-btn" (click)="excelOrder(searchForm.value)" ><i nz-icon nzType="export" nzTheme="outline"></i>导出Excel</button>
</div>
<!--数组表格 -->
<nz-table #basicTable
nzShowPagination
nzShowSizeChanger
nzBordered
[nzData]="requestData"
[nzTotal]="total"
[nzLoading]="loading"
[nzFrontPagination]="false"
[(nzPageIndex)]="pageNum"
[(nzPageSize)]="pageSize"
(nzPageIndexChange)="getRequest(false , searchForm.value)"
(nzPageSizeChange)="getRequest(false , searchForm.value)"
[nzPageSizeOptions]="[10,20,50,100]"
[nzScroll]="{ x: '1200px'}">
<thead>
<tr>
<th nzWidth="200px">交易单号</th>
<th nzWidth="130px">客户电话</th>
<th nzWidth="200px">订单名称</th>
<th nzWidth="100px">订单金额</th>
<th nzWidth="100px">支付金额</th>
<th nzWidth="100px">支付方式</th>
<th nzWidth="100px">订单状态</th>
<th nzWidth="180px">创建时间</th>
<th nzWidth="180px" nzRight="0px">物流状态</th>
<th nzWidth="110px" nzRight="0px">操作</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of basicTable.data;let i = index" [ngClass]="{'fontColor': data.logisticsStatus === '1' }">
<td>{{data.orderNo}}</td>
<td>{{data.memPhone}}</td>
<td>{{data.title}}</td>
<td>¥{{data.totalPrice}}</td>
<td>¥{{data.payPrice}}</td>
<td>{{data.orderStatus == 1 || data.orderStatus == 5 ? '未支付' : data.payType | orderPayType}}</td>
<td>{{data.orderStatus | orderStatus}}</td>
<td>{{data.createTime | date : 'yyyy-MM-dd HH:mm:ss'}}</td>
<td nzRight="0px" >{{data.logisticsStatus | logisticsStatus}}</td>
<td nzRight="0px" class="table-td-operation">
<a nz-dropdown [nzDropdownMenu]="menu"> 操作列表 <i nz-icon nzType="down"></i> </a>
<nz-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu nzSelectable>
<li nz-menu-item (click)="showOrderDetail(data.orderNo)"><a>详情</a></li>
<li nz-menu-item (click)="updateLogisticsNo(data.orderNo)"><a>录入物流编码</a></li>
</ul>
</nz-dropdown-menu>
</td>
</tr>
</tbody>
</nz-table>
</div>
</nz-spin>
<nz-modal [(nzVisible)]="orderDetailModal" nzTitle="交易详情" (nzOnCancel)="orderDetailModal = false" [nzFooter]="null"
nzWidth="1000px" [nzBodyStyle]=" { padding: '20px 20px 30px 20px'}">
<nz-spin [nzSpinning]="orderDetailModalLoading">
<nz-tabset [nzType]="'card'">
<nz-tab nzTitle="订单信息">
<nz-descriptions nzBordered [nzColumn]="2" [nzSize]="'middle'">
<nz-descriptions-item nzTitle="交易订单号">{{orderDetailObject.tradeOrder.orderNo}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="第三方交易号">{{orderDetailObject.tradeOrder.paySerialNo!=null?orderDetailObject.tradeOrder.paySerialNo:'无'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="客户手机号">{{orderDetailObject.tradeOrder.memPhone}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="交易状态">{{orderDetailObject.tradeOrder.orderStatus | orderStatus}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="支付方式">{{orderDetailObject.tradeOrder.payType | orderPayType}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="支付卡号" *ngIf="orderDetailObject.tradeOrder.payType == 4 || orderDetailObject.tradeOrder.payType == 7">
{{orderDetailObject.tradeOrder.memCardNo}}
</nz-descriptions-item>
<nz-descriptions-item nzTitle="优惠券">{{orderDetailObject.tradeOrder.memDiscountName?orderDetailObject.tradeOrder.memDiscountName:'无'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="返利">{{orderDetailObject.tradeOrder.whetherRebate?'是':'否'}}</nz-descriptions-item>
<nz-descriptions-item nzTitle="备注">{{orderDetailObject.tradeOrder.remarks}}</nz-descriptions-item>
</nz-descriptions>
</nz-tab>
<nz-tab nzTitle="支付信息">
<nz-descriptions nzBordered [nzColumn]="3" [nzSize]="'middle'">
<nz-descriptions-item nzTitle="交易总额" >{{orderDetailObject.tradeOrder.totalPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="总优惠" >{{orderDetailObject.tradeOrder.totalDeductionPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="产品优惠金额" >{{orderDetailObject.tradeOrder.deductionProductPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="优惠券优惠" >{{orderDetailObject.tradeOrder.deductionCouponPrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="应付金额" >{{orderDetailObject.tradeOrder.payablePrice}} 元</nz-descriptions-item>
<nz-descriptions-item nzTitle="积分抵扣" >{{orderDetailObject.tradeOrder.payGold / 100}} 元 </nz-descriptions-item>
<nz-descriptions-item nzTitle="实付金额" >
{{orderDetailObject.tradeOrder.payRealPrice!=null?orderDetailObject.tradeOrder.payRealPrice+' 元':'未支付'}}
</nz-descriptions-item>
</nz-descriptions>
</nz-tab>
<nz-tab nzTitle="订单时间">
<nz-card>
<nz-timeline>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.createTime != null">
<p>创建时间:{{orderDetailObject.tradeOrder.createTime | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
<p>备注:{{orderDetailObject.tradeOrder.remarks?orderDetailObject.tradeOrder.remarks:'无'}}</p>
</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.cancelTime != null">
<p>取消时间:{{orderDetailObject.tradeOrder.cancelTime | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
<p>备注:{{orderDetailObject.tradeOrder.cancelRemarks?orderDetailObject.tradeOrder.cancelRemarks:'无'}}</p>
</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.payTime != null">支付时间:{{orderDetailObject.tradeOrder.payTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.finishTime != null">完成时间:{{orderDetailObject.tradeOrder.finishTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
<nz-timeline-item *ngIf="orderDetailObject.tradeOrder.refundTime != null">退款时间:{{orderDetailObject.tradeOrder.refundTime | date : 'yyyy-MM-dd HH:mm:ss'}}</nz-timeline-item>
</nz-timeline>
</nz-card>
</nz-tab>
<nz-tab nzTitle="商品信息">
<nz-table nzBordered #childOrder [nzData]="orderDetailObject.tradeOrder.highChildOrderList" [nzHideOnSinglePage]="true">
<thead>
<tr>
<th nzWidth="80px">产品类型</th>
<th nzWidth="100px">产品图片</th>
<th nzWidth="120px">产品名称</th>
<th nzWidth="30px">商品原价</th>
<th nzWidth="30px">支付价格</th>
<th nzWidth="20px">数量</th>
<th nzWidth="20px">支付总价</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let data of childOrder.data">
<td>{{ data.goodsType | orderChildGoodsType}}</td>
<td>
<app-preview-image [previewImage] = data.goodsImg ></app-preview-image>
</td>
<td>
{{ data.goodsName }}
<nz-tag *ngIf="data.giveawayType == 1" [nzColor]="'magenta'">赠品</nz-tag>
</td>
<td>{{ data.goodsPrice }} 元</td>
<td>{{ data.goodsActualPrice }} 元</td>
<td>{{ data.saleCount }}</td>
<td>{{ data.totalActualPrice }} 元</td>
</tr>
</tbody>
</nz-table>
</nz-tab>
<nz-tab nzTitle="物流信息" *ngIf="orderDetailObject.goodsOrder.logisticsNo != null">
<nz-timeline [nzReverse]="true">
<nz-timeline-item *ngFor="let item of logisticsTraceDetails;let i = index" [nzColor]="i===logisticsTraceDetails.length -1?'green':'gray'">
<p [ngClass]="{'fontColorBlue': i===logisticsTraceDetails.length -1 }">{{item['desc']}}</p>
<p [ngClass]="{'fontColorBlue': i===logisticsTraceDetails.length -1 }">{{item.time | date : 'yyyy-MM-dd HH:mm:ss'}}</p>
</nz-timeline-item>
</nz-timeline>
</nz-tab>
</nz-tabset>
</nz-spin>
</nz-modal>
<nz-modal [(nzVisible)]="isVisible" nzTitle="新增物流单号" (nzOnCancel)="isVisible = false" (nzOnOk)="handleOk()">
<div nz-row>
<div nz-col nzSpan="20">
<nz-form-item>
<nz-form-label [nzSpan]="6">物流单号</nz-form-label>
<nz-form-control [nzSpan]="16">
<input nz-input [(ngModel)]="logisticsNo"/>
</nz-form-control>
</nz-form-item>
</div>
</div>
</nz-modal>

@ -0,0 +1,9 @@
img {
width: 60px;
}
.fontColor {
color: red;
}
.fontColorBlue {
color: #00a2d4;
}

@ -0,0 +1,210 @@
import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup} from '_@angular_forms@9.0.7@@angular/forms';
import {environment} from '../../../../environments/environment';
import {LocalStorageService} from '../../../services/local-storage.service';
import {NzMessageService, NzNotificationService} from '_ng-zorro-antd@9.3.0@ng-zorro-antd';
import {OrderThirdPartyService} from '../../../services/order/order-third-party.service';
import {CompanyService} from '../../../services/company.service';
import {CommonsService} from '../../../services/commons.service';
import {ADMIN_INFO_OBJECT} from '../../../services/local-storage.namespace';
import {animate, state, style, transition, trigger} from '_@angular_animations@9.0.7@@angular/animations';
import {GoodsService} from "../../../services/goods/goods.service";
@Component({
selector: 'app-goods-order',
animations: [
trigger('openClose', [
state('open', style({
height: '260px',
opacity: 1,
backgroundColor: 'white'
})),
state('closed', style({
opacity: 1,
backgroundColor: 'white'
})),
transition('open => closed', [
animate('0.3s')
]),
transition('closed => open', [
animate('0.3s')
]),
]),
],
templateUrl: './goods-order.component.html',
styleUrls: ['./goods-order.component.scss']
})
export class GoodsOrderComponent implements OnInit {
// 搜索框
searchForm: FormGroup;
// 搜索框折叠
isCollapse = false;
// 订单状态数据
orderStatusArray = [];
// 公司数据
companyArray = [];
// 角色类型
roleType: number;
// 列表相关参数
// 总条数
total: number;
// 页码
pageNum = 1;
// 条码
pageSize = 10;
// 列表数据
requestData = [];
// 列表加载
loading = true;
isVisible = false;
// 订单详情相关参数
// 详情模态框
orderDetailModal = false;
// 详情模态框数据等待
orderDetailModalLoading = false;
// 订单详情数据
orderDetailObject: any = {
tradeOrder: {},
goodsOrder: {
logisticsNo: null
},
};
// 数据加载中参数
loadingObject = {
title: '加载中...',
status: false,
};
// 请求地址参数
FILE_URL = environment.imageUrl;
orderNo;
logisticsNo;
logisticsTraceDetails;
constructor(
private form: FormBuilder,
private store: LocalStorageService,
private message: NzMessageService,
private thirdPartyOrder: OrderThirdPartyService,
private goods: GoodsService,
private companyService: CompanyService,
private commonsService: CommonsService,
private notification: NzNotificationService,
) { }
ngOnInit(): void {
// 搜索表单初始化
this.searchForm = this.form.group({
orderNo: [null],
memPhone: [null],
payTimeArray: [null],
orderStatus: [null],
createTimeArray: [null],
refundTimeArray: [null],
companyId: [null],
payType: [null],
memCardNo: [null],
productType: [12],
});
// 角色类型初始化
this.roleType = Number(this.store.get(ADMIN_INFO_OBJECT)['secRole'].roleType);
// 查询公司列表
if (this.roleType === 0 || this.roleType === 1) {
this.companyService.selectCompanyList({ pageNum: 1, pageSize: 999 }, data => {
this.companyArray = data['return_data']['list'];
});
}
// 查询订单状态数据
this.commonsService.getDictionary('ORDER_STATUS', data => {
this.orderStatusArray = data['return_data'];
});
this.getRequest(true, this.searchForm.value);
}
// 查询列表
public getRequest(reset: boolean = false, whereObject: object) {
this.loading = true;
if (reset) {
this.pageNum = 1;
}
whereObject['pageNum'] = this.pageNum;
whereObject['pageSize'] = this.pageSize;
if (whereObject['payTimeArray'] != null && whereObject['payTimeArray'].length !== 0) {
whereObject['payTimeS'] = whereObject['payTimeArray'][0].getTime();
whereObject['payTimeE'] = whereObject['payTimeArray'][1].getTime();
}
if (whereObject['refundTimeArray'] != null && whereObject['refundTimeArray'].length !== 0) {
whereObject['refundTimeS'] = whereObject['refundTimeArray'][0].getTime();
whereObject['refundTimeE'] = whereObject['refundTimeArray'][1].getTime();
}
if (whereObject['createTimeArray'] != null && whereObject['createTimeArray'].length !== 0) {
whereObject['createTimeS'] = whereObject['createTimeArray'][0].getTime();
whereObject['createTimeE'] = whereObject['createTimeArray'][1].getTime();
}
this.goods.getOrderList(whereObject, data => {
this.loading = false;
if (data['return_code'] === '000000') {
console.log(data);
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
this.message.error(data['return_msg']);
}
});
}
// 展示订单详情
public showOrderDetail(orderNo: string) {
this.orderDetailModal = true;
this.orderDetailModalLoading = true;
this.goods.getGoodsOrderDetail(orderNo, data => {
if (data['return_code'] === '000000') {
console.log(data);
this.orderDetailObject = data['return_data'];
this.logisticsTraceDetails = data['return_data']['logisticsTraceDetails'];
} else {
this.message.error(data['return_msg']);
}
this.orderDetailModalLoading = false;
});
}
// 导出数据
public excelOrder(whereObject) {
this.loadingObject.status = true;
this.loadingObject.title = '数据导出中...';
this.thirdPartyOrder.exportThirdPartyOrderList(whereObject, data => {
if (data['return_code'] === '000000') {
window.location.href = this.FILE_URL + 'temporary/' + data['return_data'];
} else {
this.message.error(data['return_msg']);
}
this.loadingObject.status = false;
});
}
// 更新运费单号
public updateLogisticsNo(order: string): void {
this.orderNo = order;
this.isVisible = true;
}
public handleOk(): void {
this.goods.updateLogisticsNo({
orderNo: this.orderNo ,
logisticsNo: this.logisticsNo
} , data => {
if (data['return_code'] === '000000') {
this.isVisible = false;
this.notification.success('成功' , '更新成功');
} else {
this.notification.error( '失败' , data['return_msg']);
}
});
}
}

@ -28,9 +28,9 @@
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">客户电话</nz-form-label>
<nz-form-label [nzSpan]="8">标题</nz-form-label>
<nz-form-control [nzSpan]="14">
<input nz-input formControlName="memPhone" />
<input nz-input formControlName="title" />
</nz-form-control>
</nz-form-item>
</div>
@ -38,6 +38,17 @@
</div>
<div nz-row *ngIf="isCollapse">
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">异常订单</nz-form-label>
<nz-form-control [nzSpan]="14">
<nz-select formControlName="exceptionStatus" nzAllowClear>
<nz-option [nzValue]="true" nzLabel="异常"></nz-option>
<nz-option [nzValue]="false" nzLabel="正常"></nz-option>
</nz-select>
</nz-form-control>
</nz-form-item>
</div>
<div nz-col nzSpan="8">
<nz-form-item>
<nz-form-label [nzSpan]="8">交易状态</nz-form-label>
@ -170,7 +181,7 @@
</tr>
</thead>
<tbody>
<tr *ngFor="let data of basicTable.data;let i = index">
<tr *ngFor="let data of basicTable.data;let i = index" [ngClass]="{'fontColor': data.exceptionStatus === true }">
<td>{{data.orderNo}}</td>
<td>{{data.memPhone}}</td>
<td>{{data.title}}</td>
@ -184,6 +195,9 @@
<nz-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu nzSelectable>
<li nz-menu-item (click)="showOrderDetail(data.orderNo)"><a>详情</a></li>
<li nz-menu-item *ngIf="data.exceptionStatus === true" (click)="orderNormal(data.orderNo)"><a>异常转正常</a></li>
<li nz-menu-item *ngIf="data.exceptionStatus === true && data.orderStatus=== 2" (click)="refundOrder(data.orderNo)"><a>订单退款</a></li>
</ul>
</nz-dropdown-menu>
</td>
@ -252,13 +266,18 @@
</nz-tab>
<nz-tab nzTitle="充值记录">
<nz-table nzBordered #childOrder [nzData]="orderDetailObject.mobileOrder.outRechargeChildOrders" [nzHideOnSinglePage]="true">
<nz-table nzBordered #childOrder [nzData]="orderDetailObject.mobileOrder.outRechargeChildOrders" [nzHideOnSinglePage]="true"
[nzScroll]="{ x: '1200px'}">
<thead>
<tr>
<th>请求订单号</th>
<th>充值平台</th>
<th>充值状态</th>
<th>创建时间</th>
<th nzWidth="100px">请求订单号</th>
<th nzWidth="80px">充值平台</th>
<th nzWidth="80px">充值状态</th>
<th nzWidth="200px">充值内容</th>
<th nzWidth="200px">查询内容</th>
<th nzWidth="100px">创建时间</th>
<th nzRight nzWidth="100px">更新时间</th>
</tr>
</thead>
<tbody>
@ -266,11 +285,18 @@
<td>{{data.orderNo}}</td>
<td>{{data.rechargePlatform | platform}}</td>
<td>{{data.status | chlidRechargeStatus}}</td>
<td>{{data.ext1}}</td>
<td>{{data.ext3}}</td>
<td>{{data['createTime'] | date: 'yyyy-MM-dd HH:mm'}}</td>
<td nzRight>{{data['updateTime'] | date: 'yyyy-MM-dd HH:mm:ss'}}</td>
</tr>
</tbody>
</nz-table>
</nz-tab>
</nz-tabset>
</nz-spin>
<div *nzModalFooter>
<button *ngIf="orderDetailObject.tradeOrder.exceptionStatus === true" nz-button nzType="primary" (click)="orderNormal(orderDetailObject.tradeOrder.orderNo)">异常转正常</button>
</div>
</nz-modal>

@ -8,6 +8,7 @@ import {OrderMobileRechargeService} from '../../../services/order/order-mobile-r
import {FormBuilder, FormGroup} from '@angular/forms';
import {NzMessageService} from 'ng-zorro-antd';
import {animate, state, style, transition, trigger} from '@angular/animations';
import {NzNotificationService} from "_ng-zorro-antd@9.3.0@ng-zorro-antd";
@Component({
selector: 'app-mobile-recharge-order-list',
@ -80,6 +81,7 @@ export class MobileRechargeOrderListComponent implements OnInit {
private orderMobileRechargeService: OrderMobileRechargeService,
private companyService: CompanyService,
private commonsService: CommonsService,
private notification: NzNotificationService,
) { }
ngOnInit(): void {
@ -92,6 +94,7 @@ export class MobileRechargeOrderListComponent implements OnInit {
createTimeArray: [null],
refundTimeArray: [null],
title: [null],
exceptionStatus: [null],
companyId: [null],
payType: [null],
memCardNo: [null],
@ -136,7 +139,6 @@ export class MobileRechargeOrderListComponent implements OnInit {
this.orderMobileRechargeService.getOrderList(whereObject, data => {
this.loading = false;
if (data['return_code'] === '000000') {
console.log(data);
this.requestData = data['return_data'].list;
this.total = data['return_data'].total;
} else {
@ -175,5 +177,46 @@ export class MobileRechargeOrderListComponent implements OnInit {
});
}
public refundOrder(orderNo: string): void {
this.commonsService.showConfirm('请确定当前订单无充值中记录!!!', item => {
if (item) {
this.loadingObject.status = true;
this.loadingObject.title = '订单退款中...';
this.orderMobileRechargeService.refundOrder(orderNo , data => {
if (data['return_code'] === '000000') {
this.getRequest(false, this.searchForm.value);
this.notification.success('成功' , '退款成功');
} else {
this.message.error(data['return_msg']);
this.notification.error( '失败' , data['return_msg']);
}
this.loadingObject.status = false;
});
}
});
}
public orderNormal(orderNo: string): void {
if (this.orderDetailModal) {
this.orderDetailModal = false;
}
this.loadingObject.status = true;
this.loadingObject.title = '修改中...';
this.orderMobileRechargeService.orderNormal(orderNo , data => {
if (data['return_code'] === '000000') {
this.getRequest(false, this.searchForm.value);
this.notification.success('成功' , '修改成功');
} else {
this.message.error(data['return_msg']);
this.notification.error( '失败' , data['return_msg']);
}
this.loadingObject.status = false;
});
}
}

@ -13,6 +13,7 @@ import {PreOrderComponent} from './pre-order/pre-order.component';
import {MobileRechargeOrderListComponent} from './mobile-recharge-order-list/mobile-recharge-order-list.component';
import {HltChargeOrderComponent} from './hlt-charge-order/hlt-charge-order.component';
import {GoodsOrderComponent} from './goods-order/goods-order.component';
import {GoodsChildOrderComponent} from './goods-child-order/goods-child-order.component';
const routes: Routes = [
@ -29,6 +30,7 @@ const routes: Routes = [
{ path: 'discount-package-order-list', component: DicountPackageOrderListComponent},
{ path: 'hlt-order-list', component: HltChargeOrderComponent},
{ path: 'goods-order', component: GoodsOrderComponent},
{ path: 'goods-child-order', component: GoodsChildOrderComponent},
];
@NgModule({

@ -23,9 +23,10 @@ import {MobileRechargeOrderListComponent} from './mobile-recharge-order-list/mob
import { HltChargeOrderComponent } from './hlt-charge-order/hlt-charge-order.component';
import { GoodsOrderComponent } from './goods-order/goods-order.component';
import {PreviewImageModule} from "../../common/preview-image/preview-image.module";
import { GoodsChildOrderComponent } from './goods-child-order/goods-child-order.component';
@NgModule({
declarations: [OrderOilListComponent, OrderCouponListComponent, OrderIntegralRechargeComponent, OrderRefundListComponent, KfcOrderListComponent, StarbucksOrderListComponent, MemberChargeOrderListComponent, MobileRechargeOrderListComponent, PreOrderComponent,DicountPackageOrderListComponent, MemberChargeOrderListComponent, DiscountUseConditionListComponent, HltChargeOrderComponent, GoodsOrderComponent],
declarations: [OrderOilListComponent, OrderCouponListComponent, OrderIntegralRechargeComponent, OrderRefundListComponent, KfcOrderListComponent, StarbucksOrderListComponent, MemberChargeOrderListComponent, MobileRechargeOrderListComponent, PreOrderComponent,DicountPackageOrderListComponent, MemberChargeOrderListComponent, DiscountUseConditionListComponent, HltChargeOrderComponent, GoodsOrderComponent, GoodsChildOrderComponent],
imports: [
CommonModule,
OrderManageRoutingModule,

@ -0,0 +1,7 @@
<img class="head_img" src="{{imageUrl + previewImage}}" (click)="previewVisible = true" onerror="this.src='../../../../assets/admin/navigation/icon.png'" alt="">
<nz-modal [nzVisible]="previewVisible" [nzContent]="modalContent" [nzFooter]="null" (nzOnCancel)="previewVisible = false">
<ng-template #modalContent>
<img [src]="imageUrl + previewImage" [ngStyle]="{ width: '100%' }" />
</ng-template>
</nz-modal>

@ -0,0 +1,4 @@
.head_img {
height: 60px;
width: 60px;
}

@ -0,0 +1,21 @@
import {Component, Input, OnInit} from '@angular/core';
import {environment} from '../../../environments/environment';
@Component({
selector: 'app-preview-image',
templateUrl: './preview-image.component.html',
styleUrls: ['./preview-image.component.scss']
})
export class PreviewImageComponent implements OnInit {
imageUrl = environment.imageUrl;
@Input() previewImage: string;
previewVisible = false;
constructor() { }
ngOnInit(): void {
}
}

@ -0,0 +1,21 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PreviewImageComponent } from './preview-image.component';
import {NgZorroAntdModule} from 'ng-zorro-antd';
import {FormsModule} from '@angular/forms';
@NgModule({
declarations: [PreviewImageComponent],
exports: [
PreviewImageComponent
],
imports: [
CommonModule,
FormsModule,
NgZorroAntdModule
]
})
export class PreviewImageModule { }

@ -0,0 +1,5 @@
export enum PresentType {
discountName,
couponName,
agentName,
}

@ -0,0 +1,3 @@
export enum Url {
}

@ -0,0 +1,19 @@
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'goodsStatus'
})
export class GoodsStatusPipe implements PipeTransform {
transform(value: number): string {
switch (value) {
case 1:
return '上线中';
case 2:
return '编辑中';
case 3:
return '审核中';
}
}
}

@ -0,0 +1,28 @@
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'logisticsStatus'
})
export class LogisticsStatusPipe implements PipeTransform {
transform(value: string): string {
switch (value) {
case '1':
return '待发货';
case '2':
return '已发货';
case '3':
return '配送中';
case '4':
return '已送达';
case '5':
return '已取消';
case '6':
return '退货中';
case '7':
return '已退货';
case '8':
return '待付款';
}
}
}

@ -0,0 +1,321 @@
import { Injectable } from '@angular/core';
import {HttpClient} from '_@angular_common@9.0.7@@angular/common/http';
import {CommonsService} from '../commons.service';
import {environment} from '../../../environments/environment';
@Injectable({
providedIn: 'root'
})
export class GoodsService {
constructor(
private http: HttpClient,
private common: CommonsService
) { }
/**
*
*
* @param paramsObject
* @param callBack
*/
public getListGoodsDetail(paramsObject: object, callBack) {
this.http.get(environment.baseUrl + 'goods/getListGoodsDetail?' + this.common.getWhereCondition(paramsObject)).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName insertProduct
* @Description // 新增商品
* @Date 13:54 2023/4/12
* @Param params
* @Param callBack
*/
public insertGoods(params: object, callBack) {
this.http.post(environment.baseUrl + 'goods/insertGoods', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName editPriceStatus
* @Description // 修改商品
* @Date 15:03 2021/8/12
* @Param mod
**/
public updateGoods(params: object, callBack) {
this.http.post(environment.baseUrl + 'goods/updateGoods', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName findGoodsDetailById
* @Description // 查询商品详情
* @Date 13:58 2023/4/12
* @Param id
* @Param callBack
*/
public findGoodsDetailById(id: number, callBack) {
this.http.get(environment.baseUrl + 'goods/findGoodsDetailById?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName getGoodsTypeTree
* @Description // 查询商品类型树
* @Date 18:33 2023/4/12
* @Param businessType
* @Param callBack
*/
public getGoodsTypeTree(businessType: number, callBack) {
this.http.get(environment.baseUrl + 'highGoodsType/getGoodsTypeTree?businessType=' + businessType).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName getListGoodsSku
* @Description // 查询商品SKU
* @Date 18:34 2023/4/12
* @Param paramsObject
* @Param callBack
*/
public getListGoodsSku(paramsObject: object, callBack) {
this.http.get(environment.baseUrl + 'goodsSku/getListGoodsSku?' + this.common.getWhereCondition(paramsObject)).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName insertGoodsSku
* @Description // 新增商品SKU
* @Date 18:35 2023/4/12
* @Param params
* @Param callBack
*/
public insertGoodsSku(params: object, callBack) {
this.http.post(environment.baseUrl + 'goodsSku/insertGoodsSku', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName updateGoodsSku
* @Description // 更新商品SKU
* @Date 18:35 2023/4/12
* @Param params
* @Param callBack
*/
public updateGoodsSku(params: object, callBack) {
this.http.post(environment.baseUrl + 'goodsSku/updateGoodsSku', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName findGoodsSkuById
* @Description // 查询商品SKU详情
* @Date 18:36 2023/4/12
* @Param id
* @Param callBack
*/
public findGoodsSkuById(id: number, callBack) {
this.http.get(environment.baseUrl + 'goodsSku/findGoodsSkuById?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName deleteSku
* @Description // 删除sku
* @Date 11:38 2023/4/13
* @Param id
*/
public deleteSku(id: number, callBack) {
this.http.get(environment.baseUrl + 'goodsSku/deleteSku?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName goodsUpDown
* @Description // 商品上下架
* @Date 11:38 2023/4/13
* @Param id
*/
public goodsUpDown(id: number, callBack) {
this.http.get(environment.baseUrl + 'goods/goodsUpDown?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName deleteGoods
* @Description // 删除商品
* @Date 11:39 2023/4/13
* @Param id
*/
public deleteGoods(id: number, callBack) {
this.http.get(environment.baseUrl + 'goods/deleteGoods?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName getListRegionFreight
* @Description // 查询区域运费内容
* @Date 16:50 2023/4/14
* @Param paramsObject
*/
public getListRegionFreight(paramsObject: object, callBack) {
this.http.get(environment.baseUrl + 'regionFreight/getListRegionFreight?' + this.common.getWhereCondition(paramsObject)).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName insertRegionFreight
* @Description // 插入区域运费
* @Date 16:51 2023/4/14
* @Param params
*/
public insertRegionFreight(params: object, callBack) {
this.http.post(environment.baseUrl + 'regionFreight/insertRegionFreight', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName updateRegionFreight
* @Description // 查询区域内容
* @Date 16:51 2023/4/14
* @Param params
*/
public updateRegionFreight(params: object, callBack) {
this.http.post(environment.baseUrl + 'regionFreight/updateRegionFreight', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName deleteRegionFreight
* @Description // 删除区域运费内容
* @Date 16:52 2023/4/14
* @Param id
*/
public deleteRegionFreight(id: number, callBack) {
this.http.get(environment.baseUrl + 'regionFreight/deleteRegionFreight?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName findRegionFreightById
* @Description // 查询区域运费内容
* @Date 16:53 2023/4/14
* @Param id
*/
public findRegionFreightById(id: number, callBack) {
this.http.get(environment.baseUrl + 'regionFreight/findRegionFreightById?id=' + id).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName insertPresent
* @Description // 新增赠送内容
* @Date 15:07 2023/4/18
* @Param params
*/
public insertPresent(params: object, callBack) {
this.http.post(environment.baseUrl + 'goodsPresent/insertPresent', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName updatePresent
* @Description // 更新赠送内容
* @Date 15:07 2023/4/18
* @Param params
*/
public updatePresent(params: object, callBack) {
this.http.post(environment.baseUrl + 'goodsPresent/updatePresent', params).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName getListPresent
* @Description // 查询赠送配置列表
* @Date 15:08 2023/4/18
* @Param paramsObject
*/
public getListPresent(paramsObject: object, callBack) {
this.http.get(environment.baseUrl + 'goodsPresent/getListPresent?' + this.common.getWhereCondition(paramsObject)).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName deleteGoods
* @Description // 删除
* @Date 15:09 2023/4/18
* @Param id
*/
public deletePresent(id: number, callBack) {
this.http.get(environment.baseUrl + 'goodsPresent/deletePresent?id=' + id).subscribe(data => {
callBack(data);
});
}
public getOrderList(param: object, callBack) {
this.http.get(environment.orderUrl + 'goodsOrder/getOrderList?' + this.common.getWhereCondition(param)).subscribe(data => {
callBack(data);
});
}
public getOrderChildList(param: object, callBack) {
this.http.get(environment.orderUrl + 'goodsOrder/getOrderChildList?' + this.common.getWhereCondition(param)).subscribe(data => {
callBack(data);
});
}
public updateLogisticsNo(param: object, callBack) {
this.http.get(environment.orderUrl + 'goodsOrder/updateLogisticsNo?' + this.common.getWhereCondition(param)).subscribe(data => {
callBack(data);
});
}
public getGoodsOrderDetail(orderNo: string, callBack) {
this.http.get(environment.orderUrl + 'goodsOrder/getGoodsOrderDetail?orderNo=' + orderNo).subscribe(data => {
callBack(data);
});
}
}

@ -51,4 +51,32 @@ export class OrderMobileRechargeService {
});
}
/**
* @Author Sum1Dream
* @methodName refundOrder
* @Description // 订单退款
* @Date 15:04 2023/5/18
* @Param orderNo
* @Param callBack
*/
public refundOrder(orderNo: string, callBack) {
this.http.get(environment.orderUrl + 'mobileRecharge/refundOrder?orderNo=' + orderNo).subscribe(data => {
callBack(data);
});
}
/**
* @Author Sum1Dream
* @methodName orderNormal
* @Description // 异常转正常
* @Date 17:26 2023/5/18
* @Param orderNo
* @Param callBack
*/
public orderNormal(orderNo: string, callBack) {
this.http.get(environment.orderUrl + 'mobileRecharge/orderNormal?orderNo=' + orderNo).subscribe(data => {
callBack(data);
});
}
}

Loading…
Cancel
Save