# 接口变更记录 — 2026-03-17 15:40 > **提交** `e6c349d` · **作者** wx · **时间** 2026-03-17 15:40:15 +0800 > > feat: 定制需求模块+管理员发票管理接口+Knife4j分组 ## 变更总览 - **订单服务** - 🆕 AdminInvoice (+5 接口) - 🆕 AdminCustomize (+5 接口) - 🆕 InternalCustomize (+4 接口) --- ## 订单服务 ### 🆕 新增: AdminInvoice #### `GET` /admin/invoice/page — 发票分页列表 **响应** `Result>` | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | `String` | 发票ID | | `orderId` | `String` | 订单ID | | `orderNo` | `String` | 订单号 | | `amount` | `String` | 金额 | | `titleType` | `String` | 抬头类型(personal=个人/company=企业) | | `invoiceTitle` | `String` | 发票抬头 | | `taxNumber` | `String` | 税号 | | `email` | `String` | 接收邮箱 | | `invoiceType` | `String` | 发票类型 | | `invoiceContent` | `String` | 发票内容 | | `status` | `String` | 发票状态 | | `fileUrl` | `String` | 发票文件URL | | `failReason` | `String` | 失败原因 | | `contactPhone` | `String` | 联系电话 | | `remark` | `String` | 备注信息 | | `bankName` | `String` | 开户行(企业发票) | | `bankAccount` | `String` | 银行账号(企业发票) | | `companyAddress` | `String` | 企业地址(企业发票) | | `companyPhone` | `String` | 企业电话(企业发票) | | `invoiceNo` | `String` | 发票号码 | | `issuedAt` | `LocalDateTime` | 开票时间 | | `issuedBy` | `String` | 开票操作人ID | | `userId` | `String` | 用户ID | | `originalInvoiceId` | `String` | 原发票ID(换开时关联) | | `reissueCount` | `Integer` | 换开次数 | | `createdAt` | `LocalDateTime` | 创建时间 | | `updatedAt` | `LocalDateTime` | 更新时间 | #### `GET` /admin/invoice/{id} — 发票详情 **参数** - `{id}` (Long) — 路径参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | `String` | 发票ID | | `orderId` | `String` | 订单ID | | `orderNo` | `String` | 订单号 | | `amount` | `String` | 金额 | | `titleType` | `String` | 抬头类型(personal=个人/company=企业) | | `invoiceTitle` | `String` | 发票抬头 | | `taxNumber` | `String` | 税号 | | `email` | `String` | 接收邮箱 | | `invoiceType` | `String` | 发票类型 | | `invoiceContent` | `String` | 发票内容 | | `status` | `String` | 发票状态 | | `fileUrl` | `String` | 发票文件URL | | `failReason` | `String` | 失败原因 | | `contactPhone` | `String` | 联系电话 | | `remark` | `String` | 备注信息 | | `bankName` | `String` | 开户行(企业发票) | | `bankAccount` | `String` | 银行账号(企业发票) | | `companyAddress` | `String` | 企业地址(企业发票) | | `companyPhone` | `String` | 企业电话(企业发票) | | `invoiceNo` | `String` | 发票号码 | | `issuedAt` | `LocalDateTime` | 开票时间 | | `issuedBy` | `String` | 开票操作人ID | | `userId` | `String` | 用户ID | | `originalInvoiceId` | `String` | 原发票ID(换开时关联) | | `reissueCount` | `Integer` | 换开次数 | | `createdAt` | `LocalDateTime` | 创建时间 | | `updatedAt` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/invoice/{id}/issue — 开票完成 **参数** - `{id}` (Long) — 路径参数 **请求体** `AdminInvoiceIssueRequest` | 字段 | 类型 | 说明 | | --- | --- | --- | | `fileUrl` | `String` | 发票文件URL | | `invoiceNo` | `String` | 发票号码 | **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | `String` | 发票ID | | `orderId` | `String` | 订单ID | | `orderNo` | `String` | 订单号 | | `amount` | `String` | 金额 | | `titleType` | `String` | 抬头类型(personal=个人/company=企业) | | `invoiceTitle` | `String` | 发票抬头 | | `taxNumber` | `String` | 税号 | | `email` | `String` | 接收邮箱 | | `invoiceType` | `String` | 发票类型 | | `invoiceContent` | `String` | 发票内容 | | `status` | `String` | 发票状态 | | `fileUrl` | `String` | 发票文件URL | | `failReason` | `String` | 失败原因 | | `contactPhone` | `String` | 联系电话 | | `remark` | `String` | 备注信息 | | `bankName` | `String` | 开户行(企业发票) | | `bankAccount` | `String` | 银行账号(企业发票) | | `companyAddress` | `String` | 企业地址(企业发票) | | `companyPhone` | `String` | 企业电话(企业发票) | | `invoiceNo` | `String` | 发票号码 | | `issuedAt` | `LocalDateTime` | 开票时间 | | `issuedBy` | `String` | 开票操作人ID | | `userId` | `String` | 用户ID | | `originalInvoiceId` | `String` | 原发票ID(换开时关联) | | `reissueCount` | `Integer` | 换开次数 | | `createdAt` | `LocalDateTime` | 创建时间 | | `updatedAt` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/invoice/{id}/fail — 开票失败 **参数** - `{id}` (Long) — 路径参数 **请求体** `AdminInvoiceFailRequest` | 字段 | 类型 | 说明 | | --- | --- | --- | | `failReason` | `String` | 失败原因 | **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | `String` | 发票ID | | `orderId` | `String` | 订单ID | | `orderNo` | `String` | 订单号 | | `amount` | `String` | 金额 | | `titleType` | `String` | 抬头类型(personal=个人/company=企业) | | `invoiceTitle` | `String` | 发票抬头 | | `taxNumber` | `String` | 税号 | | `email` | `String` | 接收邮箱 | | `invoiceType` | `String` | 发票类型 | | `invoiceContent` | `String` | 发票内容 | | `status` | `String` | 发票状态 | | `fileUrl` | `String` | 发票文件URL | | `failReason` | `String` | 失败原因 | | `contactPhone` | `String` | 联系电话 | | `remark` | `String` | 备注信息 | | `bankName` | `String` | 开户行(企业发票) | | `bankAccount` | `String` | 银行账号(企业发票) | | `companyAddress` | `String` | 企业地址(企业发票) | | `companyPhone` | `String` | 企业电话(企业发票) | | `invoiceNo` | `String` | 发票号码 | | `issuedAt` | `LocalDateTime` | 开票时间 | | `issuedBy` | `String` | 开票操作人ID | | `userId` | `String` | 用户ID | | `originalInvoiceId` | `String` | 原发票ID(换开时关联) | | `reissueCount` | `Integer` | 换开次数 | | `createdAt` | `LocalDateTime` | 创建时间 | | `updatedAt` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/invoice/{id}/void — 作废发票 **参数** - `{id}` (Long) — 路径参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | `String` | 发票ID | | `orderId` | `String` | 订单ID | | `orderNo` | `String` | 订单号 | | `amount` | `String` | 金额 | | `titleType` | `String` | 抬头类型(personal=个人/company=企业) | | `invoiceTitle` | `String` | 发票抬头 | | `taxNumber` | `String` | 税号 | | `email` | `String` | 接收邮箱 | | `invoiceType` | `String` | 发票类型 | | `invoiceContent` | `String` | 发票内容 | | `status` | `String` | 发票状态 | | `fileUrl` | `String` | 发票文件URL | | `failReason` | `String` | 失败原因 | | `contactPhone` | `String` | 联系电话 | | `remark` | `String` | 备注信息 | | `bankName` | `String` | 开户行(企业发票) | | `bankAccount` | `String` | 银行账号(企业发票) | | `companyAddress` | `String` | 企业地址(企业发票) | | `companyPhone` | `String` | 企业电话(企业发票) | | `invoiceNo` | `String` | 发票号码 | | `issuedAt` | `LocalDateTime` | 开票时间 | | `issuedBy` | `String` | 开票操作人ID | | `userId` | `String` | 用户ID | | `originalInvoiceId` | `String` | 原发票ID(换开时关联) | | `reissueCount` | `Integer` | 换开次数 | | `createdAt` | `LocalDateTime` | 创建时间 | | `updatedAt` | `LocalDateTime` | 更新时间 | ### 🆕 新增: AdminCustomize #### `GET` /admin/order/customize/page — 定制请求列表 **响应** `Result>` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `createTime` | `LocalDateTime` | 创建时间 | #### `GET` /admin/order/customize/{requestId} — 定制请求详情 **参数** - `{requestId}` (Long) — 路径参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/order/customize/{requestId}/accept — 接受定制请求 **参数** - `{requestId}` (Long) — 路径参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/order/customize/{requestId}/reply — 回复/报价 **参数** - `{requestId}` (Long) — 路径参数 **请求体** `AdminReplyRequest` | 字段 | 类型 | 说明 | | --- | --- | --- | | `reply` | `String` | 回复内容 | | `productId` | `Long` | 关联产品ID(定制产品已创建时传入) | **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | #### `PUT` /admin/order/customize/{requestId}/complete — 标记完成 **参数** - `{requestId}` (Long) — 路径参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | ### 🆕 新增: InternalCustomize #### `POST` /internal/mp/customize/submit — 提交定制请求 **参数** - `userId` (Long) — 查询参数 **请求体** `CreateCustomizeRequestDTO` | 字段 | 类型 | 说明 | | --- | --- | --- | | `designerId` | `Long` | 指定定制师ID(可为空=系统分配) | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | #### `GET` /internal/mp/customize/list — 定制请求列表 **参数** - `userId` (Long) — 查询参数 - `page` (int) — 查询参数 - `pageSize` (int) — 查询参数 **响应** `Result>` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `createTime` | `LocalDateTime` | 创建时间 | #### `GET` /internal/mp/customize/{requestId} — 定制请求详情 **参数** - `{requestId}` (Long) — 路径参数 - `userId` (Long) — 查询参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | #### `POST` /internal/mp/customize/{requestId}/cancel — 取消定制请求 **参数** - `{requestId}` (Long) — 路径参数 - `userId` (Long) — 查询参数 **响应** `Result` | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的(字典:travel_purpose) | | `requestType` | `String` | 需求类型(字典:customize_request_type) | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围(字典:customize_budget) | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态(字典:customize_request_status) | | `statusLabel` | `String` | 状态标签 | | `designerName` | `String` | 定制师姓名 | | `designerAvatar` | `String` | 定制师头像 | | `productId` | `Long` | 关联产品ID | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 | --- ## 📦 其他数据对象变更 > 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 ### 订单服务 #### 🆕 AdminCustomizeQueryRequest | 字段 | 类型 | 说明 | | --- | --- | --- | | `keyword` | `String` | 搜索关键词(联系人/目标地区/需求描述) | | `status` | `String` | 状态(字典:customize_request_status) | | `designerId` | `Long` | 定制师ID | | `sortBy` | `String` | 排序字段(createTime/startDate) | | `sortDir` | `String` | 排序方向(desc/asc) | #### 🆕 AdminInvoiceQueryRequest | 字段 | 类型 | 说明 | | --- | --- | --- | | `status` | `String` | 发票状态(字典:invoice_status) | | `orderNo` | `String` | 订单编号(模糊搜索) | | `userId` | `Long` | 用户ID | #### 🆕 CustomizeRequest | 字段 | 类型 | 说明 | | --- | --- | --- | | `requestId` | `Long` | 请求ID | | `userId` | `Long` | 用户ID | | `designerId` | `Long` | 指定定制师ID(可为空=系统分配) | | `destination` | `String` | 目标地区 | | `travelPurpose` | `String` | 旅游目的 | | `requestType` | `String` | 需求类型 | | `startDate` | `LocalDate` | 期望出发日期 | | `endDate` | `LocalDate` | 期望结束日期 | | `days` | `Integer` | 期望天数 | | `adultCount` | `Integer` | 成人数 | | `childCount` | `Integer` | 儿童数 | | `budget` | `String` | 预算范围 | | `requirements` | `String` | 详细需求描述 | | `contactPhone` | `String` | 联系电话 | | `contactName` | `String` | 联系人 | | `status` | `String` | 状态:PENDING/ACCEPTED/DESIGNING/QUOTED/COMPLETED/CANCELLED | | `designerName` | `String` | 定制师姓名(冗余) | | `designerAvatar` | `String` | 定制师头像(冗余) | | `productId` | `Long` | 关联产品ID(定制师创建的定制产品) | | `reply` | `String` | 定制师回复 | | `repliedAt` | `LocalDateTime` | 回复时间 | | `deletedAt` | `LocalDateTime` | 删除时间(软删除) | | `createTime` | `LocalDateTime` | 创建时间 | | `updateTime` | `LocalDateTime` | 更新时间 |
📁 全部变更文件 (点击展开) ``` M hl-order-service/src/main/java/com/hulalv/order/OrderServiceApplication.java M hl-order-service/src/main/java/com/hulalv/order/config/Knife4jConfig.java A hl-order-service/src/main/java/com/hulalv/order/controller/AdminInvoiceController.java A hl-order-service/src/main/java/com/hulalv/order/customize/constant/CustomizeConstants.java A hl-order-service/src/main/java/com/hulalv/order/customize/controller/AdminCustomizeController.java A hl-order-service/src/main/java/com/hulalv/order/customize/controller/InternalCustomizeController.java A hl-order-service/src/main/java/com/hulalv/order/customize/dto/AdminCustomizeQueryRequest.java A hl-order-service/src/main/java/com/hulalv/order/customize/dto/AdminReplyRequest.java A hl-order-service/src/main/java/com/hulalv/order/customize/dto/CreateCustomizeRequestDTO.java A hl-order-service/src/main/java/com/hulalv/order/customize/entity/CustomizeRequest.java A hl-order-service/src/main/java/com/hulalv/order/customize/mapper/CustomizeRequestMapper.java A hl-order-service/src/main/java/com/hulalv/order/customize/service/CustomizeRequestService.java A hl-order-service/src/main/java/com/hulalv/order/customize/vo/CustomizeRequestListVO.java A hl-order-service/src/main/java/com/hulalv/order/customize/vo/CustomizeRequestVO.java A hl-order-service/src/main/java/com/hulalv/order/dto/AdminInvoiceFailRequest.java A hl-order-service/src/main/java/com/hulalv/order/dto/AdminInvoiceIssueRequest.java A hl-order-service/src/main/java/com/hulalv/order/dto/AdminInvoiceQueryRequest.java A sql/customize_request.sql ```