ExpenseItemMapper.xml 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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="cn.iocoder.yudao.module.system.dal.mysql.biz.ExpenseItemMapper">
  4. <select id="selectCurrentMonthList" resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseItemDO">
  5. SELECT
  6. eei.*
  7. FROM
  8. elderly_expense ee
  9. INNER JOIN elderly_expense_item eei ON ee.id = eei.expense_id
  10. WHERE
  11. ee.elder_id = #{elderlyId}
  12. AND eei.type = #{type}
  13. -- AND eei.change_flag = 0
  14. AND DATE_FORMAT( eei.change_start_date, '%Y-%m' ) = DATE_FORMAT(#{retreatDate},'%Y-%m')
  15. </select>
  16. <select id="selectListByMonth"
  17. resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseItemDO">
  18. SELECT
  19. eei.*
  20. FROM
  21. elderly_expense ee
  22. INNER JOIN elderly_expense_item eei ON ee.id = eei.expense_id
  23. WHERE
  24. ee.elder_id = #{elderId}
  25. AND eei.type = #{type}
  26. AND DATE_FORMAT( eei.change_start_date, '%Y-%m' ) = DATE_FORMAT(#{queryDate},'%Y-%m')
  27. ORDER BY eei.change_start_date asc
  28. </select>
  29. <!-- 月度账单生成查询 -->
  30. <select id="generateMonthlyBill" resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseItemDO">
  31. SELECT
  32. expense_data.id,
  33. expense_data.expenseId,
  34. expense_data.itemId,
  35. expense_data.itemCategoryId,
  36. expense_data.itemCategoryName,
  37. expense_data.itemName,
  38. expense_data.billAmount AS amount,
  39. expense_data.billAmount AS actualAmount,
  40. expense_data.isDiscount,
  41. expense_data.discount,
  42. expense_data.isMonthlyExpense,
  43. expense_data.isOneTimeFee,
  44. expense_data.isDeposit,
  45. expense_data.isFreeGift,
  46. expense_data.freeStartTime,
  47. expense_data.freeEndTime,
  48. expense_data.isHirePurchase,
  49. expense_data.hirePurchaseNumber,
  50. expense_data.hirePurchaseAmount,
  51. expense_data.count,
  52. expense_data.billAmount AS totalAmount,
  53. expense_data.type,
  54. expense_data.discountAmount,
  55. expense_data.tenantId,
  56. expense_data.changeStartDate,
  57. expense_data.changeEndDate,
  58. expense_data.changeFlag,
  59. expense_data.createTime,
  60. expense_data.billAmount
  61. FROM (
  62. SELECT
  63. eei.id,
  64. eei.expense_id AS expenseId,
  65. CASE
  66. WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
  67. THEN COALESCE(
  68. (
  69. SELECT ecr.overhead_charge_id
  70. FROM elderly_change_record ecr
  71. WHERE ecr.elderly_id = ee.elder_id
  72. AND ecr.overhead_charge_id = eei.item_id
  73. AND ecr.deleted = 0
  74. LIMIT 1
  75. ),
  76. (
  77. SELECT epcr.original_id
  78. FROM elderly_change_record ecr
  79. INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
  80. WHERE ecr.elderly_id = ee.elder_id
  81. AND ecr.overhead_charge_id = eei.item_id
  82. AND ecr.deleted = 0
  83. AND epcr.deleted = 0
  84. LIMIT 1
  85. ),
  86. eei.item_id
  87. )
  88. ELSE eei.item_id
  89. END AS itemId,
  90. eei.item_category_id AS itemCategoryId,
  91. CASE
  92. WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
  93. THEN COALESCE(
  94. (
  95. SELECT ecr.category_name
  96. FROM elderly_change_record ecr
  97. WHERE ecr.elderly_id = ee.elder_id
  98. AND ecr.overhead_charge_id = eei.item_id
  99. AND ecr.deleted = 0
  100. LIMIT 1
  101. ),
  102. (
  103. SELECT epcr.category_name
  104. FROM elderly_change_record ecr
  105. INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
  106. WHERE ecr.elderly_id = ee.elder_id
  107. AND ecr.overhead_charge_id = eei.item_id
  108. AND ecr.deleted = 0
  109. AND epcr.deleted = 0
  110. LIMIT 1
  111. ),
  112. eei.item_category_name
  113. )
  114. ELSE eei.item_category_name
  115. END AS itemCategoryName,
  116. CASE
  117. WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
  118. THEN COALESCE(
  119. (
  120. SELECT ecr.original_name
  121. FROM elderly_change_record ecr
  122. WHERE ecr.elderly_id = ee.elder_id
  123. AND ecr.overhead_charge_id = eei.item_id
  124. AND ecr.deleted = 0
  125. LIMIT 1
  126. ),
  127. (
  128. SELECT epcr.original_name
  129. FROM elderly_change_record ecr
  130. INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
  131. WHERE ecr.elderly_id = ee.elder_id
  132. AND ecr.overhead_charge_id = eei.item_id
  133. AND ecr.deleted = 0
  134. AND epcr.deleted = 0
  135. LIMIT 1
  136. ),
  137. eei.item_name
  138. )
  139. ELSE eei.item_name
  140. END AS itemName,
  141. eei.is_discount AS isDiscount,
  142. eei.discount,
  143. eei.is_monthly_expense AS isMonthlyExpense,
  144. eei.is_one_time_fee AS isOneTimeFee,
  145. eei.is_deposit AS isDeposit,
  146. eei.is_free_gift AS isFreeGift,
  147. eei.free_start_time AS freeStartTime,
  148. eei.free_end_time AS freeEndTime,
  149. eei.is_hire_purchase AS isHirePurchase,
  150. eei.hire_purchase_number AS hirePurchaseNumber,
  151. eei.hire_purchase_amount AS hirePurchaseAmount,
  152. eei.count,
  153. eei.type,
  154. eei.discount_amount AS discountAmount,
  155. eei.tenant_id AS tenantId,
  156. eei.change_start_date AS changeStartDate,
  157. eei.change_end_date AS changeEndDate,
  158. eei.change_flag AS changeFlag,
  159. eei.create_time AS createTime,
  160. CASE
  161. WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
  162. THEN COALESCE(
  163. (
  164. SELECT pcr.original_amount
  165. FROM elderly_price_change_record pcr
  166. INNER JOIN elderly_change_record ecr ON pcr.change_id = ecr.id
  167. WHERE pcr.original_id = eei.item_id
  168. AND ecr.elderly_id = ee.elder_id
  169. AND pcr.deleted = 0
  170. AND ecr.deleted = 0
  171. ORDER BY ecr.change_date DESC
  172. LIMIT 1
  173. ),
  174. (
  175. SELECT original_amount
  176. FROM elderly_change_record ecr
  177. WHERE ecr.elderly_id = ee.elder_id
  178. AND ecr.overhead_charge_id = eei.item_id
  179. AND ecr.deleted = 0
  180. ORDER BY ecr.change_date DESC
  181. LIMIT 1
  182. ),
  183. eei.actual_amount
  184. )
  185. ELSE eei.actual_amount
  186. END AS billAmount
  187. FROM elderly_expense_item eei
  188. INNER JOIN elderly_expense ee ON eei.expense_id = ee.id
  189. WHERE eei.is_monthly_expense = 1
  190. AND ee.elder_id = #{elderId}
  191. AND (
  192. -- 情况1:有明确的开始和结束日期,且查询月份在这个区间内
  193. (DATE_FORMAT(eei.change_start_date, '%Y-%m') &lt;= #{billingMonth}
  194. AND DATE_FORMAT(eei.change_end_date, '%Y-%m') &gt;= #{billingMonth})
  195. -- 情况2:开始日期 &lt;= 查询月份,且结束日期为NULL
  196. OR (DATE_FORMAT(eei.change_start_date, '%Y-%m') &lt;= #{billingMonth}
  197. AND eei.change_end_date IS NULL)
  198. )
  199. -- 关键修复:排除在账单月开始的新费用(当存在同一老人、同一费用项的旧版本时)
  200. AND NOT (
  201. DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
  202. AND eei.change_start_date &gt; STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
  203. AND EXISTS (
  204. SELECT 1
  205. FROM elderly_expense_item eei2
  206. INNER JOIN elderly_expense ee2 ON eei2.expense_id = ee2.id
  207. WHERE ee2.elder_id = ee.elder_id -- 同一老人
  208. AND eei2.item_id = eei.item_id -- 同一费用项
  209. AND eei2.id != eei.id -- 排除自身
  210. AND eei2.is_monthly_expense = 1 -- 同样只考虑月费用
  211. AND DATE_FORMAT(eei2.change_start_date, '%Y-%m') &lt; #{billingMonth}
  212. AND (eei2.change_end_date IS NULL
  213. OR DATE_FORMAT(eei2.change_end_date, '%Y-%m') &gt;= #{billingMonth})
  214. )
  215. )
  216. ) expense_data
  217. </select>
  218. </mapper>