课程名称:多端全栈项目实战:商业级代驾全流程落地
课程章节: 华夏代驾全栈小程序实战
课程讲师: 神思者
课程内容:
创建代驾订单,保存到mysql
课程收获

通过fegin接口调用抽象方法 需要先定义form类
@Data@Schema(description = "顾客下单的表单")public class InsertOrderForm {
@NotBlank(message = "uuid不能为空")
@Pattern(regexp = "^[0-9A-Za-z]{32}$", message = "uuid内容不正确")
@Schema(description = "uuid")
private String uuid;
@Schema(description = "客户ID")
private Long customerId;
@NotBlank(message = "startPlace不能为空")
@Pattern(regexp = "[\\(\\)0-9A-Z#\\-_\\u4e00-\\u9fa5]{2,50}", message = "startPlace内容不正确")
@Schema(description = "订单起点")
private String startPlace;
@NotBlank(message = "startPlaceLatitude不能为空")
@Pattern(regexp = "^(([1-8]\\d?)|([1-8]\\d))(\\.\\d{1,18})|90|0(\\.\\d{1,18})?$", message = "startPlaceLatitude内容不正确")
@Schema(description = "订单起点的纬度")
private String startPlaceLatitude;
@NotBlank(message = "startPlaceLongitude不能为空")
@Pattern(regexp = "^(([1-9]\\d?)|(1[0-7]\\d))(\\.\\d{1,18})|180|0(\\.\\d{1,18})?$", message = "startPlaceLongitude内容不正确")
@Schema(description = "订单起点的经度")
private String startPlaceLongitude;
@NotBlank(message = "endPlace不能为空")
@Pattern(regexp = "[\\(\\)0-9A-Z#\\-_\\u4e00-\\u9fa5]{2,50}", message = "endPlace内容不正确")
@Schema(description = "订单终点")
private String endPlace;
@NotBlank(message = "endPlaceLatitude不能为空")
@Pattern(regexp = "^(([1-8]\\d?)|([1-8]\\d))(\\.\\d{1,18})|90|0(\\.\\d{1,18})?$", message = "endPlaceLatitude内容不正确")
@Schema(description = "订单终点的纬度")
private String endPlaceLatitude;
@NotBlank(message = "endPlaceLongitude不能为空")
@Pattern(regexp = "^(([1-9]\\d?)|(1[0-7]\\d))(\\.\\d{1,18})|180|0(\\.\\d{1,18})?$", message = "endPlaceLongitude内容不正确")
@Schema(description = "订单终点的经度")
private String endPlaceLongitude;
@NotBlank(message = "expectsMileage不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d+$|^0\\.\\d*[1-9]\\d*$|^[1-9]\\d*$", message = "expectsMileage内容不正确")
@Schema(description = "预估代驾公里数")
private String expectsMileage;
@NotBlank(message = "expectsFee不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "expectsFee内容不正确")
@Schema(description = "预估代驾费用")
private String expectsFee;
@NotBlank(message = "favourFee不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "favourFee内容不正确")
@Schema(description = "顾客好处费")
private String favourFee;
@NotNull(message = "chargeRuleId不能为空")
@Min(value = 1, message = "chargeRuleId不能小于1")
@Schema(description = "规则ID")
private Long chargeRuleId;
@NotBlank(message = "carPlate不能为空")
@Pattern(regexp = "^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1})$",
message = "carPlate内容不正确")
@Schema(description = "车牌号")
private String carPlate;
@NotBlank(message = "carType不能为空")
@Pattern(regexp = "^[\\u4e00-\\u9fa5A-Za-z0-9\\-\\_\\s]{2,20}$", message = "carType内容不正确")
@Schema(description = "车型")
private String carType;
@NotBlank(message = "date不能为空")
@Pattern(regexp = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$", message = "date内容不正确")
@Schema(description = "日期")
private String date;
@NotNull(message = "baseMileage不能为空")
@Min(value = 1, message = "baseMileage不能小于1")
@Schema(description = "基础里程(公里)")
private Short baseMileage;
@NotBlank(message = "baseMileagePrice不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "baseMileagePrice内容不正确")
@Schema(description = "基础里程价格")
private String baseMileagePrice;
@NotBlank(message = "exceedMileagePrice不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "exceedMileagePrice内容不正确")
@Schema(description = "超出基础里程的价格")
private String exceedMileagePrice;
@NotNull(message = "baseMinute不能为空")
@Min(value = 1, message = "baseMinute不能小于1")
@Schema(description = "基础分钟")
private Short baseMinute;
@NotBlank(message = "exceedMinutePrice不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "exceedMinutePrice内容不正确")
@Schema(description = "超出基础分钟的价格")
private String exceedMinutePrice;
@NotNull(message = "baseReturnMileage不能为空")
@Min(value = 1, message = "baseReturnMileage不能小于1")
@Schema(description = "基础返程里程(公里)")
private Short baseReturnMileage;
@NotBlank(message = "exceedReturnPrice不能为空")
@Pattern(regexp = "^[1-9]\\d*\\.\\d{1,2}$|^0\\.\\d{1,2}$|^[1-9]\\d*$", message = "exceedReturnPrice内容不正确")
@Schema(description = "超出基础返程里程的价格")
private String exceedReturnPrice;}创建fegin接口 调用/oeder/insertOrder
@PostMapping("/order/insertOrder")
public R insertOrder(InsertOrderForm form);接下来是生成订单记录 调用订单子系统
@PostMapping("/createNewOrder")
@Operation(summary = "创建新订单")
@SaCheckLogin
public R createNewOrder(@RequestBody @Valid CreateNewOrderForm form) {
Long customerId = StpUtil.getLoginIdAsLong();
form.setCustomerId(customerId);
int count = orderService.createNewOrder(form);
return R.ok().put("count", count);
}上面的代码虽然进行了创建订单 但是缺失了 寻找附近的司机 这时候就需要引出一个新的功能
Redis 的 Geo
Redis的Geo主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。 我们用GEOADD命令向Redis里面添加几个景点的定位。
既然Redis的GEO命令可以帮我们提取出某个坐标点指定距离以内的景点,如果Redis里面缓存的是司机的定位信息,那么我们用代驾单的起点坐标来查询附近几公里以内的司机,是不是也可以?而且Redis的Geo计算是在内存中完成的,比MySQL的Geo计算快了上千倍。
有个需要特别注意的问题就是Geo中的定位我们没办法设置超时时间,所以我们想要知道哪些司机上线中,就得额外创建带有超时的缓存。
我的设想是缓存司机信息用的Key是driver_online#driverId,对应的Value是接单距离#订单里程范围#定向接单的坐标,超时时间为1分钟。当系统接到订单之后,到Redis上面根据driverId查找缓存,找到了就是在线,找不到就是不在线

随时随地看视频