diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/DispensingMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/DispensingMapper.java
new file mode 100644
index 000000000..98b136927
--- /dev/null
+++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/mapper/DispensingMapper.java
@@ -0,0 +1,61 @@
+package com.openhis.web.inpatient.mapper;
+
+import org.apache.ibatis.annotations.*;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 住院发退药数据访问层
+ * 配合 InpatientDispensingServiceImpl 修复 Bug #503 状态流转逻辑
+ */
+@Mapper
+public interface DispensingMapper {
+
+ @Update("UPDATE med_order SET exec_status = #{status} WHERE id = #{orderId}")
+ int updateOrderExecStatus(@Param("orderId") Long orderId, @Param("status") String status);
+
+ @Insert("INSERT INTO phm_dispensing_detail (order_id, submit_status, create_time) " +
+ "VALUES (#{orderId}, #{submitStatus}, NOW())")
+ int initDispensingRecord(@Param("orderId") Long orderId, @Param("submitStatus") String submitStatus);
+
+ @Insert("INSERT INTO phm_dispensing_summary (order_id, ward_code, status, create_time) " +
+ "SELECT #{orderId}, ward_code, 'PENDING', NOW() FROM med_order WHERE id = #{orderId}")
+ int syncToSummaryList(@Param("orderId") Long orderId);
+
+ @Update("")
+ int batchUpdateSubmitStatus(@Param("orderIds") List orderIds, @Param("status") String status);
+
+ @Insert("")
+ int batchSyncToSummaryList(@Param("orderIds") List orderIds);
+
+ @Select("")
+ List