select vo.id, vo.order_no, vo.user_id, u.user_name, u.nick_name, vo.resource_id, r.resource_title, vo.product_id, vo.price_fen, vo.open_id, vo.status, vo.wx_order_no, vo.transaction_id, vo.create_time, vo.pay_time, vo.provide_time, vo.refund_time, vo.last_query_time from app_virtual_order vo left join sys_user u on u.user_id = vo.user_id left join app_resource r on r.id = vo.resource_id insert into app_virtual_order (order_no, user_id, resource_id, product_id, price_fen, open_id, status, create_time) values (#{orderNo}, #{userId}, #{resourceId}, #{productId}, #{priceFen}, #{openId}, #{status}, #{createTime}) update app_virtual_order set status = 1, wx_order_no = coalesce(#{wxOrderNo}, wx_order_no), transaction_id = coalesce(#{transactionId}, transaction_id), pay_time = coalesce(#{payTime}, pay_time), provide_time = now() where order_no = #{orderNo} and status = 0 insert into app_resource_entitlement (user_id, resource_id, order_no, status, granted_time) values (#{userId}, #{resourceId}, #{orderNo}, 1, now()) on duplicate key update order_no = values(order_no), status = 1, granted_time = now(), revoked_time = null update app_virtual_order set status = 2, refund_time = #{refundTime} where order_no = #{orderNo} and status in (0, 1) update app_resource_entitlement set status = 0, revoked_time = now() where order_no = #{orderNo} and status = 1 update app_virtual_order set status = 3 where order_no = #{orderNo} and status = 0 update app_virtual_order set last_query_time = now() where order_no = #{orderNo} and status = 0 and (last_query_time is null or last_query_time < date_sub(now(), interval 5 second))