diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 58649d1..74f2315 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,7 +1,6 @@ import { Routes } from '@angular/router'; import {IndexComponent} from "./pages/body/index/index.component"; import {InitGuardService} from "./utils/initGuard.service"; -import {AUDIT_ROUTES} from "./pages/audit/audit.routes"; export const routes: Routes = [ {path: '', pathMatch: 'full', redirectTo: 'admin/index'}, { diff --git a/src/app/data/goods/goods.namespace.ts b/src/app/data/goods/goods.namespace.ts index c7853d8..74b6a34 100644 --- a/src/app/data/goods/goods.namespace.ts +++ b/src/app/data/goods/goods.namespace.ts @@ -1,3 +1,13 @@ export const fallbackImg = 'data:image/png;base64,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'; +export const orderGoodsStatus = [ + {name: "待发货" , key: 1} , + {name: "已发货" , key: 2}, + {name: "配送中" , key: 3}, + {name: "已送达" , key: 4}, + {name: "已取消" , key: 5}, + {name: "退货中" , key: 6}, + {name: "已退货" , key: 7}, + {name: "待支付" , key: 8} +]; diff --git a/src/app/model/discount.interface.ts b/src/app/model/discount.interface.ts index 94295b0..137c62a 100644 --- a/src/app/model/discount.interface.ts +++ b/src/app/model/discount.interface.ts @@ -10,14 +10,14 @@ export interface DiscountData { effectiveNum: number; createTime: string; updateTime: string; - salesEndTime: string, + salesEndTime: string; } export interface NodesDiscountGoods { id: number; discountId: number; - specsId: String; - specsName: String; + specsId: string; + specsName: string; createTime: string; goodsName: string; SpecsName: string; diff --git a/src/app/model/order.interface.ts b/src/app/model/order.interface.ts new file mode 100644 index 0000000..30b2c5b --- /dev/null +++ b/src/app/model/order.interface.ts @@ -0,0 +1,39 @@ + +export interface OrderGoodsData { + id: number; + logisticsNo: string; + freightPrice: string; + deliveryAddressId: number; + deliveryAddress: string; + orderNo: string; + childOrderNo: string; + merId: number; + userId: number; + userPhone: string; + goodsId: number; + img: string; + goodsName: string; + goodsTypeId: number; + goodsTypeName: string, + goodsBrandId: number; + goodsBrandName: string; + goodsSpecsId: number; + goodsSpecsName: string; + goodsSpecsOriginalPrice: string; + goodsCount: string; + totalPrice: string; + totalDeductionPrice: string; + couponDiscountPrice: string; + integralDiscountPrice: string; + payRealPrice: string; + payChannel: string; + paySerialNo: string; + payType: number; + status: number; + createTime: string; + payTime: string; + cancelTime: string; + refundTime: string; + finishTime: string; + updateTime: string; +} diff --git a/src/app/pages/trade/goods-list/goods-list.component.html b/src/app/pages/trade/goods-list/goods-list.component.html new file mode 100644 index 0000000..1f024dc --- /dev/null +++ b/src/app/pages/trade/goods-list/goods-list.component.html @@ -0,0 +1,214 @@ +
+
+
+ + 商品名称 + + + + +
+
+ + 物流订单号 + + + + +
+
+ + 订单号 + + + + +
+
+ + 用户手机号 + + + + +
+ +
+ + 商品分类 + + + + +
+
+ + 商品品牌 + + + + + + +
+ +
+ + 订单状态 + + + + + + +
+ +
+ + +
+
+
+ + + + + 商品名称 + 商品图片 + 商品分类 + 商品品牌 + 物流单号 + 创建时间 + 更新时间 + 状态 + 操作 + + + + + {{data.goodsName}} - {{data.goodsSpecsName}} + + + + {{data.goodsTypeName}} + {{data.goodsBrandName}} + {{data.logisticsNo}} + {{ data.createTime | date: 'yyyy-MM-dd HH:mm'}} + {{ data.updateTime | date: 'yyyy-MM-dd HH:mm'}} + {{data.status | orderGoodsStatus}} + + 详情 + + + 更多 + + + + + + + + + 总计 {{ total }} 条 + + + + + + + + {{orderGoodsData?.goodsName}} - {{orderGoodsData?.goodsSpecsName}} + {{ orderGoodsData?.userPhone }} + {{ orderGoodsData?.goodsTypeName }} + {{ orderGoodsData?.goodsBrandName }} + {{ orderGoodsData?.goodsSpecsOriginalPrice }} + {{ orderGoodsData?.goodsCount }} + + + + + + + + + + + + + + + + + + + + {{ orderGoodsData?.orderNo }} + {{ orderGoodsData?.childOrderNo }} + {{ orderGoodsData?.paySerialNo }} + {{ orderGoodsData?.totalPrice }} + {{ orderGoodsData?.couponDiscountPrice }} + {{ orderGoodsData?.integralDiscountPrice }} + {{ orderGoodsData?.totalDeductionPrice }} + {{ orderGoodsData?.payRealPrice }} + + + + + {{ orderGoodsData?.createTime | date: 'yyyy-MM-dd HH:mm' }} + {{ orderGoodsData?.payTime | date: 'yyyy-MM-dd HH:mm' }} + {{ orderGoodsData?.cancelTime | date: 'yyyy-MM-dd HH:mm' }} + {{ orderGoodsData?.refundTime | date: 'yyyy-MM-dd HH:mm' }} + {{ orderGoodsData?.finishTime | date: 'yyyy-MM-dd HH:mm' }} + {{ orderGoodsData?.updateTime | date: 'yyyy-MM-dd HH:mm' }} + + + + + + + + + +
+
+ + 物流单号 + + + + +
+
+
+
+ + + + + + +

{{item['desc']}}

+

{{item.time | date : 'yyyy-MM-dd HH:mm:ss'}}

+
+
+ +
+
+
diff --git a/src/app/pages/trade/goods-list/goods-list.component.less b/src/app/pages/trade/goods-list/goods-list.component.less new file mode 100644 index 0000000..6d5c351 --- /dev/null +++ b/src/app/pages/trade/goods-list/goods-list.component.less @@ -0,0 +1,12 @@ +[nz-form-label] { + overflow: visible; +} +button { + margin-left: 8px; +} +.submit-btn { + width: 150px; +} +.search-area { + margin-top: 30px; +} diff --git a/src/app/pages/trade/goods-list/goods-list.component.ts b/src/app/pages/trade/goods-list/goods-list.component.ts new file mode 100644 index 0000000..58ed3af --- /dev/null +++ b/src/app/pages/trade/goods-list/goods-list.component.ts @@ -0,0 +1,242 @@ +import { Component } from '@angular/core'; +import {DatePipe, NgClass, NgForOf, NgIf} from "@angular/common"; +import {FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule} from "@angular/forms"; +import {NzButtonComponent} from "ng-zorro-antd/button"; +import { + NzTableComponent, NzTableModule, + NzThMeasureDirective +} from "ng-zorro-antd/table"; +import {NzColDirective, NzRowDirective} from "ng-zorro-antd/grid"; + +import {NzFormDirective, NzFormModule} from "ng-zorro-antd/form"; +import {NzImageDirective, NzImageModule,} from "ng-zorro-antd/image"; +import {NzInputDirective} from "ng-zorro-antd/input"; + +import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; +import {NzTreeSelectComponent} from "ng-zorro-antd/tree-select"; + +import {environment} from "../../../../environments/environment"; +import {NzMessageService} from "ng-zorro-antd/message"; +import {GoodsService} from "../../../services/goods/goods.service"; +import {fallbackImg, orderGoodsStatus} from '../../../data/goods/goods.namespace'; +import {GoodsStatusPipe} from "../../../pipes/goods/goods-status.pipe"; +import {NzModalModule} from "ng-zorro-antd/modal"; +import {OrderGoodsService} from "../../../services/trade/order-goods.service"; +import {OrderGoodsStatusPipe} from "../../../pipes/order/order-goods-status.pipe"; +import {NzDropDownADirective, NzDropDownDirective, NzDropdownMenuComponent} from "ng-zorro-antd/dropdown"; +import {NzMenuDirective, NzMenuItemComponent} from "ng-zorro-antd/menu"; +import {NzPopconfirmDirective} from "ng-zorro-antd/popconfirm"; +import {OrderGoodsData} from "../../../model/order.interface"; +import {NzDividerComponent} from "ng-zorro-antd/divider"; +import {NzIconDirective} from "ng-zorro-antd/icon"; +import {NzDescriptionsModule} from "ng-zorro-antd/descriptions"; +import {NzBadgeComponent} from "ng-zorro-antd/badge"; +import {AuditStatusPipe} from "../../../pipes/audit/audit-status.pipe"; +import {NzTabComponent, NzTabSetComponent, NzTabsModule} from "ng-zorro-antd/tabs"; +import {NzSpinComponent} from "ng-zorro-antd/spin"; +import {NzTimelineComponent, NzTimelineItemComponent} from "ng-zorro-antd/timeline"; +import {NzResultComponent} from "ng-zorro-antd/result"; + +@Component({ + selector: 'app-goods-list', + standalone: true, + imports: [ + NzColDirective, + NzRowDirective, + NzFormDirective, + ReactiveFormsModule, + NzTreeSelectComponent, + NzInputDirective, + NzSelectComponent, + NzOptionComponent, + NzButtonComponent, + NzTableComponent, + NzImageModule, + NzModalModule, + NzTableModule, + NzFormModule, + NzThMeasureDirective, + NgForOf, + NzImageDirective, + GoodsStatusPipe, + DatePipe, + OrderGoodsStatusPipe, + NzDropdownMenuComponent, + NgIf, + NzMenuDirective, + NzDescriptionsModule, + NzMenuItemComponent, + NzPopconfirmDirective, + NzDividerComponent, + NzDropDownADirective, + NzDropDownDirective, + NzTabsModule, + NzIconDirective, + NzBadgeComponent, + AuditStatusPipe, + NzTabSetComponent, + FormsModule, + NzSpinComponent, + NzTimelineItemComponent, + NgClass, + NzResultComponent, + NzTimelineComponent, + + ], + templateUrl: './goods-list.component.html', + styleUrl: './goods-list.component.less' +}) +export class GoodsListComponent { + // 表单页数 + tablePageNum = 1; + // 表单数据 + tableData: any = { + total: 0, + loading: false, + list: [], + }; + // 搜索表单 + searchForm: FormGroup; + + baseUrl = environment.baseUrl; + imageUrl = environment.imageUrl; + + // 商品类型数据 + nodes = []; + nodesBrand = []; + orderGoodsData: any; + orderDetailModal = false; + isVisible = false; + orderDetailModalChild = false; + orderDetailModalLoading = false; + logisticsNo: any; + logisticsTraceDetails: any; + goodsOrderId: any; + + protected readonly fallbackImg = fallbackImg; + protected readonly orderGoodsStatus = orderGoodsStatus; + + constructor(private fb: NonNullableFormBuilder, + private msg: NzMessageService, + private orderGoodsService: OrderGoodsService, + private goodsService: GoodsService) { + + + // 初始化搜索框 + this.searchForm = this.fb.group({ + logisticsNo: [''], + orderNo: [''], + goodsType: [''], + goodsBrand: [''], + userPhone: [''], + goodsSpecsName: [''], + goodsName: [''], + payType: [''], + status: [''], + }); + + + this.getRequest(); + this.getGoodsTypeNode(); + this.getGoodsBrandNode(); + + } + + // 查询列表 + public getRequest(reset: boolean = false) { + this.tableData.loading = true; + if (reset) { + this.tablePageNum = 1; + } + this.searchForm.value.pageNum = this.tablePageNum; + this.searchForm.value.pageSize = 10; + this.searchForm.value.time = new Date().getTime(); + + this.orderGoodsService.getListGoods(this.searchForm.value , (data: any) => { + if (data['return_code'] == '000000') { + this.tableData = data['return_data']; + } else { + this.msg.error(data['return_msg']); + } + this.tableData.loading = false; + }); + } + + // 获取商品分类 + getGoodsTypeNode() { + this.goodsService.getList({time: new Date().getTime()}, (data: any) => { + if (data['return_code'] === '000000') { + this.getNode(data['return_data']); + } + }); + } + + // 配置数据 + getNode(array: any): any { + array.forEach((item: any) => { + if (item.children) { + this.getNode(item.children); + }else { + item["isLeaf"] = true; + } + item["key"] = item.id; + + }); + this.nodes = array; + } + + // 获取商品品牌 + getGoodsBrandNode() { + this.goodsService.getListBrandAll( (data: any) => { + if (data['return_code'] == '000000') { + this.nodesBrand = data['return_data']; + } + }); + } + + getLogisticsNo(id: number): void { + this.goodsOrderId = id; + this.isVisible = true; + } + + showDetail(data: OrderGoodsData): void { + console.log(data); + this.orderGoodsData = data; + this.orderDetailModal = true; + } + + handleOk(): void { + let params = { + id: this.goodsOrderId, + logisticsNo: this.logisticsNo, + time: new Date().getTime() + } + + this.orderGoodsService.updateLogisticsNo(params , (data: any) => { + if (data['return_code'] == '000000') { + this.isVisible = false; + this.getRequest(false); + this.msg.success("成功") + } else { + this.msg.error(data['return_msg']); + } + }); + } + + showLogisticsNo(id: number): void { + let params = { + id:id, + time: new Date().getTime() + } + + this.orderGoodsService.getLogisticsMsg(params , (data: any) => { + if (data['return_code'] == '000000') { + this.orderDetailModalChild = true; + this.logisticsTraceDetails = data['return_data']['logisticsTraceDetails']; + } else { + this.msg.error(data['return_msg']); + } + }); + } + +} diff --git a/src/app/pages/trade/trade.routes.ts b/src/app/pages/trade/trade.routes.ts index 8ae9ae6..49a63e1 100644 --- a/src/app/pages/trade/trade.routes.ts +++ b/src/app/pages/trade/trade.routes.ts @@ -1,8 +1,10 @@ import { Routes } from '@angular/router'; import {CompOrderComponent} from "./comp-order/comp-order.component"; import {OrderAfterSalesComponent} from "./order-after-sales/order-after-sales.component"; +import {GoodsListComponent} from "./goods-list/goods-list.component"; export const TRADE_ROUTES: Routes = [ + { path: 'goods-list', component: GoodsListComponent }, { path: 'comp-order', component: CompOrderComponent }, { path: 'order-after-sales', component: OrderAfterSalesComponent }, ]; diff --git a/src/app/pipes/order/order-goods-status.pipe.ts b/src/app/pipes/order/order-goods-status.pipe.ts new file mode 100644 index 0000000..f543cfa --- /dev/null +++ b/src/app/pipes/order/order-goods-status.pipe.ts @@ -0,0 +1,32 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'orderGoodsStatus', + standalone: true +}) +export class OrderGoodsStatusPipe implements PipeTransform { + + transform(value: number): any { + 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 '待支付'; + default: + return '未知状态' + } + } + +} diff --git a/src/app/services/trade/order-goods.service.ts b/src/app/services/trade/order-goods.service.ts new file mode 100644 index 0000000..1eeee14 --- /dev/null +++ b/src/app/services/trade/order-goods.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import {HttpClient} from "@angular/common/http"; +import {environment} from "../../../environments/environment"; +import {ObjectData} from "../../utils/objectData.service"; + +@Injectable({ + providedIn: 'root' +}) +export class OrderGoodsService { + + constructor(private http: HttpClient) { } + + /** + * 查询订单列表 + * @param param + * @param callBack + */ + public getListGoods(param: object, callBack:any) { + this.http.get(environment.orderUrl + 'orderGoods/getListGoods?'+ObjectData.objectByString(param)).subscribe(data => { + callBack(data); + }); + } + + public updateLogisticsNo(params: object, callBack:any) { + this.http.post(environment.orderUrl + 'orderGoods/updateLogisticsNo', params).subscribe(data => { + callBack(data); + }); + } + + public getLogisticsMsg(param: object, callBack:any) { + this.http.get(environment.orderUrl + 'orderGoods/getLogisticsMsg?'+ObjectData.objectByString(param)).subscribe(data => { + callBack(data); + }); + } +}