FlashDeliveryOrderMapper.xml 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper">
  4. <resultMap id="FlashDeliveryOrderResult" type="FlashDeliveryOrder">
  5. <id property="id" column="id"/>
  6. <result property="orderNo" column="order_no"/>
  7. <result property="clientRequestId" column="client_request_id"/>
  8. <result property="userId" column="user_id"/>
  9. <result property="receiverUserId" column="receiver_user_id"/>
  10. <result property="riderId" column="rider_id"/>
  11. <result property="serviceType" column="service_type"/>
  12. <result property="deliveryType" column="delivery_type"/>
  13. <result property="status" column="status"/>
  14. <result property="packageType" column="package_type"/>
  15. <result property="quantity" column="quantity"/>
  16. <result property="weightRange" column="weight_range"/>
  17. <result property="specification" column="specification"/>
  18. <result property="deliveryMode" column="delivery_mode"/>
  19. <result property="scheduledPickupStartAt" column="scheduled_pickup_start_at"/>
  20. <result property="scheduledPickupEndAt" column="scheduled_pickup_end_at"/>
  21. <result property="pinRequired" column="pin_required"/>
  22. <result property="deliveryPinCode" column="delivery_pin_code"/>
  23. <result property="pickupName" column="pickup_name"/>
  24. <result property="pickupPhone" column="pickup_phone"/>
  25. <result property="pickupAddress" column="pickup_address"/>
  26. <result property="pickupAddressDetail" column="pickup_address_detail"/>
  27. <result property="pickupCity" column="pickup_city"/>
  28. <result property="pickupArea" column="pickup_area"/>
  29. <result property="pickupHandoffMethod" column="pickup_handoff_method"/>
  30. <result property="pickupLongitude" column="pickup_longitude"/>
  31. <result property="pickupLatitude" column="pickup_latitude"/>
  32. <result property="deliveryName" column="delivery_name"/>
  33. <result property="deliveryPhone" column="delivery_phone"/>
  34. <result property="deliveryAddress" column="delivery_address"/>
  35. <result property="deliveryAddressDetail" column="delivery_address_detail"/>
  36. <result property="deliveryCity" column="delivery_city"/>
  37. <result property="deliveryArea" column="delivery_area"/>
  38. <result property="deliveryHandoffMethod" column="delivery_handoff_method"/>
  39. <result property="deliveryLongitude" column="delivery_longitude"/>
  40. <result property="deliveryLatitude" column="delivery_latitude"/>
  41. <result property="distanceMeters" column="distance_meters"/>
  42. <result property="distanceSource" column="distance_source"/>
  43. <result property="estimatedDurationSeconds" column="estimated_duration_seconds"/>
  44. <result property="amount" column="amount"/>
  45. <result property="currency" column="currency"/>
  46. <result property="pricingId" column="pricing_id"/>
  47. <result property="pricingVersion" column="pricing_version"/>
  48. <result property="pricingStartTime" column="pricing_start_time"/>
  49. <result property="pricingEndTime" column="pricing_end_time"/>
  50. <result property="startingDistance" column="starting_distance"/>
  51. <result property="startingFare" column="starting_fare"/>
  52. <result property="distance" column="distance"/>
  53. <result property="freight" column="freight"/>
  54. <result property="distanceFee" column="distance_fee"/>
  55. <result property="baseDeliveryFee" column="base_delivery_fee"/>
  56. <result property="urgentRate" column="urgent_rate"/>
  57. <result property="minimumUrgentFee" column="minimum_urgent_fee"/>
  58. <result property="urgentFee" column="urgent_fee"/>
  59. <result property="tipAmount" column="tip_amount"/>
  60. <result property="userNote" column="user_note"/>
  61. <result property="version" column="version"/>
  62. <result property="acceptedAt" column="accepted_at"/>
  63. <result property="pickedUpAt" column="picked_up_at"/>
  64. <result property="deliveredAt" column="delivered_at"/>
  65. <result property="completedAt" column="completed_at"/>
  66. <result property="cancelledAt" column="cancelled_at"/>
  67. <result property="cancelReason" column="cancel_reason"/>
  68. <result property="cancelOperatorType" column="cancel_operator_type"/>
  69. <result property="cancelOperatorId" column="cancel_operator_id"/>
  70. <result property="createTime" column="create_time"/>
  71. <result property="updateTime" column="update_time"/>
  72. </resultMap>
  73. <select id="selectByUserRequestId" resultMap="FlashDeliveryOrderResult">
  74. select * from flash_delivery_order where user_id = #{userId} and client_request_id = #{clientRequestId} limit 1
  75. </select>
  76. <!-- 抢单必须在单条 SQL 中同时校验状态和骑手为空,避免并发查询后重复绑定。 -->
  77. <update id="accept">
  78. update flash_delivery_order
  79. set rider_id=#{riderId}, status='ACCEPTED', accepted_at=#{now}, update_time=#{now}, version = version + 1
  80. where id=#{id} and status = 'WAITING_ACCEPTANCE' and rider_id is null
  81. and (delivery_mode = 'NOW' or scheduled_pickup_start_at &lt;= #{now})
  82. </update>
  83. <!-- 骑手履约同时校验订单归属和预期状态,只有中单骑手能按顺序推进。 -->
  84. <update id="transitionByRider">
  85. update flash_delivery_order
  86. set status=#{nextStatus},
  87. <choose><when test="timeColumn == 'picked_up_at'">picked_up_at=#{now},</when><otherwise>delivered_at=#{now},</otherwise></choose>
  88. update_time=#{now}, version = version + 1
  89. where id=#{id} and rider_id=#{riderId} and status=#{expectedStatus}
  90. </update>
  91. <!-- 用户确认收货必须同时满足订单归属和已送达状态。 -->
  92. <update id="transitionByParticipant">
  93. update flash_delivery_order
  94. set status=#{nextStatus}, completed_at=#{now}, update_time=#{now}, version = version + 1
  95. where id=#{id} and (user_id=#{userId} or receiver_user_id = #{userId}) and status=#{expectedStatus}
  96. </update>
  97. <!-- 平台/系统完成同样使用预期状态条件,防止与用户确认并发重复成功。 -->
  98. <update id="transitionByStatus">
  99. update flash_delivery_order
  100. set status=#{nextStatus}, completed_at=#{now}, update_time=#{now}, version = version + 1
  101. where id=#{id} and status=#{expectedStatus}
  102. </update>
  103. <!-- 取消时保存完整审计字段,并以调用前读取的状态作为并发条件。 -->
  104. <update id="cancel">
  105. update flash_delivery_order
  106. set status='CANCELLED', cancelled_at=#{now}, cancel_reason=#{reason},
  107. cancel_operator_type=#{operatorType}, cancel_operator_id=#{operatorId},
  108. update_time=#{now}, version = version + 1
  109. where id=#{id} and status=#{expectedStatus}
  110. </update>
  111. <!-- 定时任务只扫描达到 24 小时阈值且仍处于已送达状态的订单。 -->
  112. <select id="selectAutoCompletable" resultMap="FlashDeliveryOrderResult">
  113. select * from flash_delivery_order
  114. where status='DELIVERED' and delivered_at &lt;= #{deadline}
  115. order by delivered_at asc limit #{limit}
  116. </select>
  117. </mapper>