目录
- 1. 实现订单创建流程
- 1.1 需求分析
- 1.2 数据模型:订单模型 (`jz_orders`)
- 1.3 后端逻辑:创建订单云函数 API
- 1.4 前端实现:搭建订单创建页面
- 1.5 测试与调试
- 总结
在用户找到并选定了需要的服务后,接下来的关键步骤就是创建订单。订单是用户需求的服务在平台中的具体体现,贯穿了服务从预订到完成的整个生命周期。本篇我们将详细讲解订单相关的核心功能实现。
1. 实现订单创建流程
用户在浏览服务详情后,如果决定预订,就需要填写相关的订单信息,比如服务时间、地点、详细需求等,然后提交订单。这个过程涉及到前端表单的填写、数据的收集,以及后端 API 的处理和订单记录的创建。
1.1 需求分析
根据需求,订单创建流程应包含以下步骤和要素:
- 用户从服务详情页发起预订。
- 用户需要选择服务的具体时间。
- 用户需要指定服务地点(从已有的地址中选择,或新增地址)。
- 用户可以添加订单备注和上传相关的图片/视频(如故障照片)。
- 系统需要根据选择的服务计算或展示预估价格。
- 用户确认所有信息后,提交订单。
- 系统在后端创建订单记录,并设置初始状态。
1.2 数据模型:订单模型 (jz_orders
)
订单是平台的核心数据之一。我们需要一个独立的数据模型来存储订单的所有相关信息。
订单模型 (jz_orders
):
userId
(关联关系类型):关联到jz_users
模型 (多对一关系),谁创建的订单。serviceId
(关联关系类型):关联到jz_services
模型 (多对一关系),预订的是哪个服务。addressId
(关联关系类型):关联到jz_addresses
模型 (多对一关系),服务地点是哪个地址。status
(枚举类型):订单当前状态(如“待付款”、“待接单”、“已接单”、“服务中”、“待评价”、“已完成”、“已取消”、“已退款”等)。serviceDateTime
(日期时间类型):用户期望的服务时间。description
(字符串/文本类型):用户的详细需求或备注。images
(文件类型/数组):用户上传的图片或视频文件 ID/URL 列表。contactName
(字符串类型):服务联系人姓名(可从地址带入)。contactPhone
(电话类型 或 字符串类型):服务联系人手机号(可从地址带入)。totalAmount
(数字类型):订单总金额(预估或最终金额)。paymentStatus
(枚举类型):支付状态(如“待支付”、“已支付”、“退款中”、“已退款”)。assignedProviderId
(关联关系类型):关联到jz_users
模型 (多对一关系),指派给哪个服务商(初始为空)。adminNotes
(文本类型):管理员备注。_createTime
(日期时间类型):订单创建时间(平台自动添加)。_updateTime
(日期时间类型):订单最后更新时间(平台自动添加)。- … (其他可能需要的字段,如取消原因、完成时间、评价 ID 等)
权限设置: 为 jz_orders
模型设置权限。用户可以读写属于自己的订单;管理员可以读写所有订单;服务商可以读取指派给自己的订单并更新其状态(细化的权限控制将在后续章节实现)。
1.3 后端逻辑:创建订单云函数 API
我们需要一个云函数 API 来接收前端提交的订单数据,进行必要的处理,并在数据库中创建新的订单记录。
步骤 1:创建 API
在云函数管理模块,新建一个“订单管理”分组,并在该分组下添加一个新的 API 方法,命名为 createOrder
。
步骤 2:添加入参
createOrder
API 的入参将包含前端订单表单收集的所有数据。这会是一个参数对象,包含 serviceId
, serviceDateTime
, addressId
, description
, images
(文件 URL 数组), contactName
, contactPhone
等字段。
步骤 3:编写自定义代码
编写云函数代码,实现订单数据的接收、验证和创建。
const ErrorCode = {
SUCCESS: 0,
PARAM_ERROR: 1001,
NOT_FOUND: 1002, // 服务或地址未找到
SYSTEM_ERROR: 1003,
// ... 其他错误码
};
// 创建订单
module.exports = async function (params, context) {
const { serviceId, userId,serviceDateTime, addressId, description, images, contactName, contactPhone, totalAmount} = params;
// 1. 参数验证 (简化示例,实际需要更严格)
if (!userId || !serviceId || !serviceDateTime || !addressId || !contactName || !contactPhone) {
return { code: ErrorCode.PARAM_ERROR, message: '必填参数缺失' };
}
try {
// 3. 创建订单记录
const result = await context.callModel({
name: "jz_orders", // 操作订单模型
methodName: "wedaCreateV2", // 使用创建方法
params: {
data: {
userId: { _id: userId }, // 关联用户
serviceId: { _id: serviceId }, // 关联服务
addressId: { _id: addressId }, // 关联地址
serviceDateTime: serviceDateTime, // 存储为日期时间类型
description: description || '', // 如果没有描述则存空字符串
images: images || [], // 如果没有图片则存空数组
contactName: contactName,
contactPhone: contactPhone,
totalAmount: totalAmount, // 初始金额
status: '1', // 初始状态:待付款 (假设1代表待付款)
paymentStatus: '1', // 初始支付状态:待支付 (假设1代表待支付)
// assignedProviderId 初始为空
}
}
});
const orderId = result.id; // 获取新创建订单的 ID
// 4. 返回创建成功的订单信息
return {
code: ErrorCode.SUCCESS,
data: {
orderId: orderId,
totalAmount: totalAmount,
status: '1' // 返回当前状态
}
};
} catch (error) {
console.error("createOrder error:", error);
return {
code: ErrorCode.SYSTEM_ERROR,
message: `系统错误: ${error.message}`
};
}
};
(代码说明:)
- 云函数接收订单相关的参数。
- 从
context.trigger.user
中获取当前用户 ID,确保订单是为当前用户创建的。 - 进行了基础的参数验证。
- 重要: 在创建订单时,将用户 ID, 服务 ID, 地址 ID 作为关联关系字段存储。
- 设置订单的初始
status
和paymentStatus
。这里假设 ‘1’ 代表“待付款”和“待支付”,您需要根据您的枚举值定义进行调整。 - 将服务时间
serviceDateTime
转换为日期时间对象存储。 images
字段存储用户上传的图片文件 ID 或 URL 数组。- 返回新创建的订单 ID 和一些初始信息。
步骤 4:运行测试与配置出参
在平台提供的 API 测试界面,输入测试参数(模拟从前端获取的数据),运行测试,检查返回结果和数据库中是否新增了订单记录。然后配置出参自动映射。
1.4 前端实现:搭建订单创建页面
点击创建页面的图标,创建新增预约页面
添加表单容器,选择订单表
选择页面组件,创建URL参数,添加serviceId、userId、totalAmount
选中用户标识,设置选中值,选择URL参数中的userId
选择服务项目标识,设置选中值,选择URL参数中的serviceId
选中订单总金额,设置输入值,选择URL参数中的totalAmount
选中表单容器,配置事件,修改默认的表单调用数据源方法,改为我们的自定义代码中的创建订单方法
然后回到我们的服务详情页,给立即预约的按钮添加页面跳转,跳转到我们的新增预约页面,并且传入对应的参数
1.5 测试与调试
- 在小程序预览中,从服务详情页点击预订,检查是否正确跳转到订单创建页并带上服务信息。
- 测试填写订单信息,包括选择时间、选择/修改地址、填写备注、上传图片。
- 检查预估价格是否正确显示(如果前端有这部分逻辑)。
- 点击“提交订单”,观察是否成功调用后端 API。
- 检查平台数据库中是否新增了订单记录,订单字段是否正确,特别是用户、服务、地址的关联是否正确,初始状态和金额是否符合预期。
- 测试必填项为空时的前端/后端校验。
- 使用平台调试工具,查看 API 调用日志、云函数日志,排查问题。
总结
本章我们实现了平台最核心的功能之一:订单创建。我们设计了存储订单关键信息的 jz_orders
数据模型,开发了处理订单创建逻辑的 createOrder
云函数 API,并在用户小程序端搭建了订单信息填写页面,通过数据绑定和事件调用将前端用户操作与后端服务连接起来。用户现在可以将他们的服务需求转化为平台中的订单记录了。
成功创建订单后,用户最关心的就是订单的状态和后续进展。下一章,我们将实现订单列表与详情的展示功能,让用户、服务商和管理员都能查看订单信息。