import { Body, Controller, Get, Inject, Param, Post, Put, Query, Files } from "@midwayjs/core"; import { Context } from "@midwayjs/koa"; import { UploadFileInfo } from "@midwayjs/upload"; import { CustomerAppService } from "../service/customer_app.service"; import { UploadService } from "../service/upload.service"; import { CustomerAcceptRepairDTO, CustomerCreateRepairDTO, CustomerLoginDTO, CustomerWxBindDTO, CustomerWxLoginDTO } from "../dto/customer_app.dto"; @Controller("/api/customer-app") export class CustomerAppController { @Inject() ctx!: Context; @Inject() customerAppService!: CustomerAppService; @Inject() uploadService!: UploadService; // 账号密码登录 @Post("/auth/login") async login(@Body() dto: CustomerLoginDTO) { return this.customerAppService.login(dto.phone, dto.password); } // 微信静默登录(未绑定返回 bindToken) @Post("/auth/wx-login") async wxLogin(@Body() dto: CustomerWxLoginDTO) { return this.customerAppService.wxLogin(dto.code); } // 微信首次绑定:手机号 + 密码 + bindToken @Post("/auth/wx-bind") async wxBind(@Body() dto: CustomerWxBindDTO) { return this.customerAppService.wxBind(dto.bindToken, dto.phone, dto.password); } // 我的:账号、客户、统计、客户经理 @Get("/profile") async profile() { return this.customerAppService.profile(this.currentAccountId()); } // 报修工单列表(按状态页签过滤) @Get("/repairs") async listRepairs( @Query("tab") tab: string, @Query("page") page: string, @Query("pageSize") pageSize: string ) { return this.customerAppService.listRepairs(this.currentAccountId(), tab, Number(page) || 1, Number(pageSize) || 20); } // 客户提交报修,落库为待处理工单 @Post("/repairs") async createRepair(@Body() dto: CustomerCreateRepairDTO) { return this.customerAppService.createRepair(this.currentAccountId(), dto); } // 客户验收并评价 @Put("/repairs/:id/accept") async acceptRepair(@Param("id") id: string, @Body() dto: CustomerAcceptRepairDTO) { return this.customerAppService.acceptRepair(this.currentAccountId(), Number(id), dto.rating); } // 报修照片上传 @Post("/upload/image") async uploadImage(@Files() files: UploadFileInfo[]) { const file = files && files[0]; if (!file) return { code: 400, message: "请选择要上传的图片", data: null }; try { const data = await this.uploadService.uploadFile(file); return { code: 200, message: "上传成功", data }; } catch (err: any) { return { code: 500, message: `图片上传失败:${err?.message || "对象存储不可用"}`, data: null }; } } private currentAccountId(): number { const customer = this.ctx.state.customer; if (!customer?.accountId) { throw new Error("未登录"); } return Number(customer.accountId); } }