invoice_payment_summary.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package fms
  2. import (
  3. "github.com/beego/beego/v2/client/orm"
  4. "strings"
  5. "time"
  6. )
  7. // InvoicePaymentSummary 开票到款汇总表
  8. type InvoicePaymentSummary struct {
  9. Id int `gorm:"primaryKey;column:id" json:"id" description:"汇总ID"`
  10. RegisterId int `gorm:"column:register_id" json:"register_id" description:"登记ID"`
  11. InvoiceId int `gorm:"column:invoice_id" json:"invoice_id" description:"开票ID"`
  12. PaymentId int `gorm:"column:payment_id" json:"payment_id" description:"到款ID"`
  13. ServiceProductId int `gorm:"column:service_product_id" json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  14. CreateTime time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time" description:"创建时间"`
  15. ModifyTime time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time" description:"最后更新时间"`
  16. }
  17. type ContractRegisterSummary struct {
  18. SummaryId int `json:"summary_id" description:"汇总ID"`
  19. ContractRegister
  20. ServiceProductId int `json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  21. }
  22. // GetInvoicePaymentCensusPageList 获取商品到款统计列表-总数
  23. func GetInvoicePaymentCensusPageList(condition string, pars []interface{}, order string, startSize, pageSize int) (results []*ContractRegisterSummary, total int64, err error) {
  24. o := orm.NewOrmUsingDB("fms")
  25. sql := `SELECT b.*, a.id as summary_id, IF(a.invoice_id >0, 1,0) as sort_invoice_id, IF(a.payment_id >0, 1,0) as sort_payment_id, a.service_product_id FROM invoice_payment_summary AS a
  26. JOIN contract_register AS b ON a.register_id = b.contract_register_id AND b.is_deleted = 0
  27. LEFT JOIN contract_invoice AS c ON a.invoice_id = c.contract_invoice_id AND c.is_deleted = 0
  28. LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0
  29. WHERE `
  30. if condition != "" {
  31. sql += condition
  32. }
  33. totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) as a`
  34. if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
  35. return
  36. }
  37. if order != "" {
  38. sql += order
  39. } else {
  40. sql += ` ORDER BY sort_invoice_id DESC`
  41. }
  42. sql += ` LIMIT ?,?`
  43. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&results)
  44. return
  45. }
  46. type InvoicePaymentSummaryItem struct {
  47. SummaryId int `json:"summary_id" description:"汇总ID"`
  48. RegisterId int `json:"register_id" description:"登记ID"`
  49. CompanyName string `json:"company_name" description:"客户名称"`
  50. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  51. StartDate time.Time `json:"start_date" description:"合同开始日期"`
  52. EndDate time.Time `json:"end_date" description:"合同结束日期"`
  53. InvoiceId int `json:"invoice_id" description:"开票ID"`
  54. InvoiceDate time.Time `json:"invoice_time" description:"开票日期"`
  55. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  56. SellerId int `json:"seller_id" description:"销售ID"`
  57. SellerName string `json:"seller_name" description:"销售名称"`
  58. SellerGroupId int `json:"seller_group_id" description:"销售组别ID"`
  59. SellerGroupName string `json:"seller_group_name" description:"销售组别名称"`
  60. PaymentId int `json:"payment_id" description:"到款ID"`
  61. PaymentDate time.Time `json:"payment_date" description:"到款日期"`
  62. PaymentAmount float64 `json:"payment_amount" description:"到款金额"`
  63. PayType int `json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  64. ServiceProductId int `json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  65. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  66. InvoicedAmount float64 `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"`
  67. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  68. RMBRate float64 `gorm:"column:rmb_rate" json:"rmb_rate" description:"人民币汇率(create_time当日)"`
  69. }
  70. // GetInvoicePaymentCensusSummaryData 获取商品到款统计列表-汇总数据
  71. func GetInvoicePaymentCensusSummaryData(condition string, pars []interface{}) (results []*InvoicePaymentSummaryItem, err error) {
  72. fields := []string{"a.id AS summary_id", "a.register_id", "a.invoice_id", "a.payment_id", "a.service_product_id", "b.company_name", "b.start_date", "b.end_date",
  73. "c.origin_amount AS invoice_amount", "c.invoice_time AS invoice_date", "IF(c.seller_id > 0, c.seller_id, d.seller_id) AS seller_id", "IF(c.seller_name = '' OR c.seller_name IS NULL, d.seller_name, c.seller_name) AS seller_name", "IF(c.seller_group_id > 0,c.seller_group_id,d.seller_group_id) AS seller_group_id",
  74. "IF(c.seller_group_name = '' OR c.seller_group_name IS NULL, d.seller_group_name, c.seller_group_name) AS seller_group_name", "d.origin_amount AS payment_amount", "d.invoice_time AS payment_date", "d.pay_type",
  75. }
  76. o := orm.NewOrmUsingDB("fms")
  77. sql := `SELECT ` + strings.Join(fields, ",") + ` FROM invoice_payment_summary AS a
  78. JOIN contract_register AS b ON a.register_id = b.contract_register_id AND b.is_deleted = 0
  79. LEFT JOIN contract_invoice AS c ON a.invoice_id = c.contract_invoice_id AND c.is_deleted = 0
  80. LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0
  81. WHERE `
  82. sql += condition
  83. _, err = o.Raw(sql, pars).QueryRows(&results)
  84. return
  85. }
  86. // GetInvoicePaymentCensusSummaryDataIds 获取商品到款统计列表-汇总数据IDs
  87. func GetInvoicePaymentCensusSummaryDataIds(condition string, pars []interface{}) (summaryIds []int, err error) {
  88. o := orm.NewOrmUsingDB("fms")
  89. sql := `SELECT a.id AS summary_id FROM invoice_payment_summary AS a
  90. JOIN contract_register AS b ON a.register_id = b.contract_register_id AND b.is_deleted = 0
  91. LEFT JOIN contract_invoice AS c ON a.invoice_id = c.contract_invoice_id AND c.is_deleted = 0
  92. LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0
  93. WHERE `
  94. sql += condition
  95. _, err = o.Raw(sql, pars).QueryRows(&summaryIds)
  96. return
  97. }
  98. // GetContractSummaryInvoicePaymentAmountTotal 获取汇总金额合计信息
  99. func GetContractSummaryInvoicePaymentAmountTotal(condition string, pars []interface{}, amountType int) (amountTotal float64, err error) {
  100. joinCond := `a.invoice_id = b.contract_invoice_id`
  101. if amountType == 2 {
  102. joinCond = `a.payment_id = b.contract_invoice_id`
  103. }
  104. o := orm.NewOrmUsingDB("fms")
  105. sql := `SELECT IFNULL(SUM(b.amount),0) FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
  106. sql += condition
  107. err = o.Raw(sql, pars).QueryRow(&amountTotal)
  108. return
  109. }
  110. // GetSummaryListCurrencySum 获取汇总分货币合计
  111. func GetSummaryListCurrencySum(condition string, pars []interface{}, amountType int) (results []*InvoiceListCurrencySum, err error) {
  112. joinCond := `a.invoice_id = b.contract_invoice_id`
  113. if amountType == 2 {
  114. joinCond = `a.payment_id = b.contract_invoice_id`
  115. }
  116. o := orm.NewOrmUsingDB("fms")
  117. sql := `SELECT b.currency_unit, b.invoice_type, SUM(b.amount) AS amount_total, SUM(b.origin_amount) AS origin_amount_total
  118. FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
  119. sql += condition
  120. sql += ` GROUP BY b.currency_unit `
  121. _, err = o.Raw(sql, pars).QueryRows(&results)
  122. return
  123. }
  124. // GetContractSummaryInvoicePaymentAmount 获取汇总金额合计信息
  125. func GetContractSummaryInvoicePaymentAmount(condition string, pars []interface{}) (amountTotal float64, err error) {
  126. joinCond := ` (a.invoice_id = b.contract_invoice_id OR a.payment_id = b.contract_invoice_id) `
  127. o := orm.NewOrmUsingDB("fms")
  128. sql := `SELECT b.amount FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
  129. sql += condition
  130. sql += ` GROUP BY id `
  131. nsql := `SELECT IFNULL( SUM( e.amount ), 0 ) FROM (` + sql + `) as e`
  132. err = o.Raw(nsql, pars).QueryRow(&amountTotal)
  133. return
  134. }
  135. type InvoiceSummary struct {
  136. SummaryId int `json:"summary_id" description:"汇总ID"`
  137. ContractAmountCount float64 `gorm:"column:contract_amount_count" json:"contract_amount_count" description:"合同金额"`
  138. InvoicedAmountCount float64 `gorm:"column:invoiced_amount_count" json:"invoiced_amount_count" description:"开票金额"`
  139. ContractRegister
  140. }
  141. type ContractRegisterRaiData struct {
  142. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  143. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  144. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-权益销售名称"`
  145. RaiSellerName string `gorm:"column:rai_seller_name" json:"rai_seller_name" description:"CRM系统-权益销售名称"`
  146. RaiSellerId int `gorm:"column:rai_seller_id" json:"rai_seller_id" description:"CRM系统-权益销售ID"`
  147. Amount float64 `json:"amount" description:"分配金额"`
  148. InvoiceTime string `json:"invoice_time" description:"开票日期"`
  149. InvoiceType int `json:"invoice_type" description:"1-开票登记; 2-到款登记"`
  150. ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  151. }
  152. // 列表
  153. func GetContractRegisterList(condition string, pars []interface{}, startSize, pageSize int) (items []*ContractRegisterRaiData, err error) {
  154. o := orm.NewOrmUsingDB("fms")
  155. sql := `SELECT
  156. a.amount,
  157. a.invoice_time ,
  158. a.seller_name ,
  159. b.company_name,
  160. b.rai_seller_name,
  161. b.contract_code
  162. FROM contract_invoice as a
  163. INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id
  164. WHERE 1= 1 `
  165. if condition != "" {
  166. sql += condition
  167. }
  168. if startSize+pageSize > 0 {
  169. sql += ` LIMIT ?,? `
  170. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  171. } else {
  172. _, err = o.Raw(sql, pars).QueryRows(&items)
  173. }
  174. return
  175. }
  176. // 获取开票金额与未到账金额的统计
  177. func GetContractRegisterAmountList(condition string, pars []interface{}) (items []*ContractRegisterSummary, err error) {
  178. o := orm.NewOrmUsingDB("fms")
  179. sql := `SELECT
  180. SUM( invoiced_amount ) AS invoiced_amount,
  181. SUM( payment_amount ) AS payment_amount FROM contract_register as a WHERE 1= 1 `
  182. if condition != "" {
  183. sql += condition
  184. }
  185. _, err = o.Raw(sql, pars).QueryRows(&items)
  186. return
  187. }
  188. // 列表
  189. func GetContractInvoiceList(condition string, pars []interface{}, startSize, pageSize int) (items []*ContractInvoice, err error) {
  190. o := orm.NewOrmUsingDB("fms")
  191. sql := `SELECT * FROM contract_invoice as a WHERE 1= 1 `
  192. if condition != "" {
  193. sql += condition
  194. }
  195. if startSize+pageSize > 0 {
  196. sql += ` LIMIT ?,? `
  197. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  198. } else {
  199. _, err = o.Raw(sql, pars).QueryRows(&items)
  200. }
  201. return
  202. }
  203. // 获取数量
  204. func GetContractInvoiceCount(condition string, pars []interface{}) (count int, err error) {
  205. o := orm.NewOrmUsingDB("fms")
  206. sqlCount := ` SELECT COUNT(1) AS count FROM contract_invoice as a
  207. INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id
  208. WHERE 1= 1 `
  209. if condition != "" {
  210. sqlCount += condition
  211. }
  212. err = o.Raw(sqlCount, pars).QueryRow(&count)
  213. return
  214. }
  215. // 获取开票金额与未到账金额的统计
  216. func GetContractInvoiceAmountCount(condition string, pars []interface{}) (amount float64, err error) {
  217. o := orm.NewOrmUsingDB("fms")
  218. sql := `SELECT
  219. SUM( amount ) AS amount FROM contract_invoice as a
  220. INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id
  221. WHERE 1= 1 `
  222. if condition != "" {
  223. sql += condition
  224. }
  225. err = o.Raw(sql, pars).QueryRow(&amount)
  226. return
  227. }
  228. // GetContractRegisterListByStartDate 根据起始日期的时间段筛选合同登记信息。
  229. func GetContractRegisterListByStartDate(startDate, endDate string) (results []*ContractRegisterRaiData, err error) {
  230. o := orm.NewOrmUsingDB("fms")
  231. sql := `SELECT
  232. a.seller_id as rai_seller_id ,
  233. b.contract_type,
  234. a.amount,
  235. a.invoice_time,
  236. a.invoice_type
  237. FROM contract_invoice as a
  238. INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id AND a.is_deleted = 0 AND a.invoice_time >= ? AND a.invoice_time <= ? `
  239. _, err = o.Raw(sql, startDate, endDate).QueryRows(&results)
  240. return
  241. }