OmgPaymentAttemptMapper.xml 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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.omgpay.mapper.OmgPaymentAttemptMapper">
  4. <sql id="attemptColumns">
  5. id, dd_id AS ddId, merchant_trade_no AS merchantTradeNo,
  6. store_id AS storeId, merchant_id AS merchantId, amount,
  7. hash_key_snapshot AS hashKeySnapshot, hash_iv_snapshot AS hashIvSnapshot,
  8. attempt_status AS attemptStatus, active_dd_id AS activeDdId,
  9. trade_no AS tradeNo, rtn_code AS rtnCode, rtn_msg AS rtnMsg,
  10. payment_type AS paymentType, payment_date AS paymentDate, trade_date AS tradeDate,
  11. payment_type_charge_fee AS paymentTypeChargeFee, simulate_paid AS simulatePaid,
  12. last_notify_time AS lastNotifyTime,
  13. create_time AS createTime, update_time AS updateTime
  14. </sql>
  15. <!-- FOR UPDATE serializes concurrent endpoint calls before MerchantTradeNo generation/reuse decisions. -->
  16. <select id="selectOrderForUpdate"
  17. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentOrderSnapshot">
  18. SELECT id, dd_id AS ddId, parent_dd_id AS parentDdId, md_id AS storeId,
  19. user_id AS userId, amount, state, pay_status AS payStatus, pay_type AS payType
  20. FROM pos_order WHERE dd_id = #{ddId} LIMIT 1 FOR UPDATE
  21. </select>
  22. <select id="selectOrder"
  23. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentOrderSnapshot">
  24. SELECT id, dd_id AS ddId, parent_dd_id AS parentDdId, md_id AS storeId,
  25. user_id AS userId, amount, state, pay_status AS payStatus, pay_type AS payType
  26. FROM pos_order WHERE dd_id = #{ddId} LIMIT 1
  27. </select>
  28. <!-- Locking current reads see attempts committed by a transaction that won a unique-key race. -->
  29. <select id="selectActiveCreatedByDdIdForUpdate"
  30. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentAttempt">
  31. SELECT <include refid="attemptColumns"/>
  32. FROM pos_order_omg_attempt
  33. WHERE active_dd_id = #{ddId}
  34. LIMIT 1 FOR UPDATE
  35. </select>
  36. <select id="selectActiveCreatedByDdId"
  37. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentAttempt">
  38. SELECT <include refid="attemptColumns"/>
  39. FROM pos_order_omg_attempt
  40. WHERE active_dd_id = #{ddId}
  41. LIMIT 1
  42. </select>
  43. <select id="selectPaidByDdId"
  44. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentAttempt">
  45. SELECT <include refid="attemptColumns"/>
  46. FROM pos_order_omg_attempt
  47. WHERE dd_id = #{ddId} AND attempt_status = 1
  48. ORDER BY payment_date IS NULL, payment_date ASC, id ASC
  49. LIMIT 1
  50. </select>
  51. <select id="selectByMerchantTradeNoForUpdate"
  52. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentAttempt">
  53. SELECT <include refid="attemptColumns"/>
  54. FROM pos_order_omg_attempt
  55. WHERE merchant_trade_no = #{merchantTradeNo}
  56. LIMIT 1 FOR UPDATE
  57. </select>
  58. <select id="selectByMerchantTradeNo"
  59. resultType="com.ruoyi.system.omgpay.domain.OmgPaymentAttempt">
  60. SELECT <include refid="attemptColumns"/>
  61. FROM pos_order_omg_attempt
  62. WHERE merchant_trade_no = #{merchantTradeNo}
  63. LIMIT 1
  64. </select>
  65. <!-- active_dd_id is a DB-generated key invariant, so Java inserts only the created facts. -->
  66. <insert id="insertCreated" useGeneratedKeys="true" keyProperty="id">
  67. INSERT INTO pos_order_omg_attempt
  68. (dd_id, merchant_trade_no, store_id, merchant_id, amount,
  69. hash_key_snapshot, hash_iv_snapshot, attempt_status, create_time, update_time)
  70. VALUES
  71. (#{ddId}, #{merchantTradeNo}, #{storeId}, #{merchantId}, #{amount},
  72. #{hashKeySnapshot}, #{hashIvSnapshot}, #{attemptStatus}, #{createTime}, #{updateTime})
  73. </insert>
  74. <!-- PAID is irreversible; a late success may upgrade FAILED or SUPERSEDED. -->
  75. <update id="markPaid">
  76. UPDATE pos_order_omg_attempt
  77. SET attempt_status = 1, trade_no = #{tradeNo}, rtn_code = #{rtnCode}, rtn_msg = #{rtnMsg},
  78. payment_type = #{paymentType}, payment_date = #{paymentDate}, trade_date = #{tradeDate},
  79. payment_type_charge_fee = #{paymentTypeChargeFee}, simulate_paid = #{simulatePaid},
  80. last_notify_time = #{lastNotifyTime}, update_time = #{updateTime}
  81. WHERE id = #{id} AND attempt_status IN (0, 2, 3)
  82. </update>
  83. <update id="markFailed">
  84. UPDATE pos_order_omg_attempt
  85. SET attempt_status = 2, trade_no = #{tradeNo}, rtn_code = #{rtnCode}, rtn_msg = #{rtnMsg},
  86. payment_type = #{paymentType}, payment_date = #{paymentDate}, trade_date = #{tradeDate},
  87. payment_type_charge_fee = #{paymentTypeChargeFee}, simulate_paid = #{simulatePaid},
  88. last_notify_time = #{lastNotifyTime}, update_time = #{updateTime}
  89. WHERE id = #{id} AND attempt_status IN (0, 2)
  90. </update>
  91. <update id="supersedeOtherCreated">
  92. UPDATE pos_order_omg_attempt
  93. SET attempt_status = 3, update_time = #{updateTime}
  94. WHERE dd_id = #{ddId} AND id != #{paidAttemptId} AND attempt_status = 0
  95. </update>
  96. <!-- Payment notification owns only the payment fact; no order/delivery state is changed here. -->
  97. <update id="markOrderPaid">
  98. UPDATE pos_order SET pay_status = 1
  99. WHERE dd_id = #{ddId} AND pay_status != 1
  100. </update>
  101. <select id="countOtherPaidAttempts" resultType="int">
  102. SELECT COUNT(*) FROM pos_order_omg_attempt
  103. WHERE dd_id = #{ddId} AND id != #{attemptId} AND attempt_status = 1
  104. </select>
  105. </mapper>