contract_invoice.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. package fms
  2. import (
  3. "fmt"
  4. "hongze/fms_api/global"
  5. "hongze/fms_api/models/base"
  6. "hongze/fms_api/utils"
  7. "time"
  8. )
  9. // ContractInvoice 合同开票表
  10. type ContractInvoice struct {
  11. ContractInvoiceId int `gorm:"primaryKey;column:contract_invoice_id" json:"contract_invoice_id" description:"开票ID"`
  12. ContractRegisterId int `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  13. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  14. Amount float64 `gorm:"column:amount" json:"amount" description:"换算后的金额(人民币)"`
  15. OriginAmount float64 `gorm:"column:origin_amount" json:"origin_amount" description:"开票/到款金额"`
  16. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  17. InvoiceType int `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记"`
  18. InvoiceDate time.Time `gorm:"column:invoice_time" json:"invoice_time" description:"开票日期/到款月"`
  19. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
  20. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
  21. SellerGroupId int `gorm:"column:seller_group_id" json:"seller_group_id" description:"销售分组ID"`
  22. SellerGroupName string `gorm:"column:seller_group_name" json:"seller_group_name" description:"销售分组名称"`
  23. SellerTeamId int `gorm:"column:seller_team_id" json:"seller_team_id" description:"销售小组ID"`
  24. SellerTeamName string `gorm:"column:seller_team_name" json:"seller_team_name" description:"销售小组名称"`
  25. PayType int `gorm:"column:pay_type" json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  26. AdminId int `gorm:"column:admin_id" json:"admin_id" description:"操作人ID"`
  27. AdminName string `gorm:"column:admin_name" json:"admin_name" description:"操作人姓名"`
  28. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  29. IsDeleted int `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
  30. base.TimeBase
  31. }
  32. func (c *ContractInvoice) TableName() string {
  33. return "contract_invoice"
  34. }
  35. // ContractInvoiceItem 合同开票/到款
  36. type ContractInvoiceItem struct {
  37. ContractInvoiceId int `gorm:"column:contract_invoice_id" json:"contract_invoice_id" description:"开票ID"`
  38. ContractRegisterId int `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  39. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  40. Amount float64 `gorm:"column:amount" json:"amount" description:"换算金额"`
  41. OriginAmount float64 `gorm:"column:origin_amount" json:"origin_amount" description:"开票/到款金额"`
  42. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  43. UnitName string `json:"unit_name" description:"货币单位名称"`
  44. InvoiceType int `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记"`
  45. InvoiceDate string `gorm:"column:invoice_time" json:"invoice_time" description:"开票日期/到款月"`
  46. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
  47. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
  48. PayType int `gorm:"column:pay_type" json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  49. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  50. CreateTime string `gorm:"column:create_time" json:"create_time" description:"创建时间"`
  51. }
  52. func (c *ContractInvoice) Create() (err error) {
  53. err = global.DEFAULT_MYSQL.Create(c).Error
  54. return
  55. }
  56. func (c *ContractInvoice) AddInBatches(list []*ContractInvoice) (err error) {
  57. err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
  58. return
  59. }
  60. func (c *ContractInvoice) Update(updateCols []string) (err error) {
  61. err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
  62. return
  63. }
  64. func (c *ContractInvoice) Fetch(id int) (item *ContractInvoice, err error) {
  65. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_invoice_id = ?", id).First(&item).Error
  66. return
  67. }
  68. func (c *ContractInvoice) Sum(field, condition string, pars []interface{}) (total float64, err error) {
  69. totalList := make([]float64, 0)
  70. err = global.DEFAULT_MYSQL.Model(c).
  71. Where("is_deleted = 0").
  72. Where(condition, pars...).
  73. Pluck(field, &totalList).Error
  74. for i := range totalList {
  75. total += totalList[i]
  76. }
  77. return
  78. }
  79. func (c *ContractInvoice) List(condition string, pars []interface{}, orderRule string) (list []*ContractInvoice, err error) {
  80. list = make([]*ContractInvoice, 0)
  81. query := global.DEFAULT_MYSQL.Model(c).
  82. Where("is_deleted = 0").
  83. Where(condition, pars...)
  84. if orderRule != "" {
  85. query.Order(orderRule)
  86. } else {
  87. query.Order("contract_invoice_id ASC")
  88. }
  89. err = query.Find(&list).Error
  90. return
  91. }
  92. func (c *ContractInvoice) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractInvoice, err error) {
  93. results = make([]*ContractInvoice, 0)
  94. query := global.DEFAULT_MYSQL.Model(c).
  95. Where("is_deleted = 0").
  96. Where(condition, pars...)
  97. query.Count(&count)
  98. if len(page.GetOrderItemsString()) > 0 {
  99. query = query.Order(page.GetOrderItemsString())
  100. }
  101. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  102. return
  103. }
  104. // DeleteAndCreateNewInvoice 删除并新增登记
  105. func (c *ContractInvoice) DeleteAndCreateNewInvoice(contractRegisterId, invoiceType int, deleteInvoiceIds []int, invoices []*ContractInvoice) (err error) {
  106. tx := global.DEFAULT_MYSQL.Begin()
  107. defer func() {
  108. if err != nil {
  109. tx.Rollback()
  110. } else {
  111. tx.Commit()
  112. }
  113. }()
  114. if len(deleteInvoiceIds) > 0 {
  115. err = tx.Model(c).
  116. Where("contract_register_id = ? AND invoice_type = ? AND contract_invoice_id IN (?)", contractRegisterId, invoiceType, deleteInvoiceIds).
  117. UpdateColumn("is_deleted", 1).Error
  118. if err != nil {
  119. return
  120. }
  121. }
  122. if len(invoices) > 0 {
  123. err = tx.CreateInBatches(invoices, len(invoices)).Error
  124. if err != nil {
  125. return
  126. }
  127. }
  128. return
  129. }
  130. // ContractInvoiceSaveReq 合同开票-请求体
  131. type ContractInvoiceSaveReq struct {
  132. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  133. InvoiceType int `json:"invoice_type" binding:"oneof=1 2" description:"类型: 1-开票登记; 2-到款登记"`
  134. AmountList []*ContractInvoiceSaveItem `json:"amount_list"`
  135. }
  136. // ContractInvoiceSaveItem 合同开票数据
  137. type ContractInvoiceSaveItem struct {
  138. InvoiceId int `json:"invoice_id" description:"开票ID"`
  139. OriginAmount float64 `json:"origin_amount" description:"开票(到款)金额"`
  140. Amount float64 `json:"amount" description:"换算后的金额"`
  141. InvoiceDate string `json:"invoice_date" description:"开票日期/到款月"`
  142. Remark string `json:"remark" description:"备注"`
  143. SellerId int `json:"seller_id" description:"销售ID"`
  144. }
  145. // GetContractInvoiceItemList 获取开票到款列表
  146. func GetContractInvoiceItemList(condition string, pars []interface{}) (itemList []*ContractInvoiceItem, err error) {
  147. list := make([]*ContractInvoice, 0)
  148. err = global.DEFAULT_MYSQL.Model(ContractInvoice{}).
  149. Where("is_deleted = 0").
  150. Where(condition, pars...).
  151. Order("contract_invoice_id ASC").
  152. Find(&list).Error
  153. if err != nil {
  154. return
  155. }
  156. itemList = formatContractInvoice2ItemList(list)
  157. return
  158. }
  159. // formatContractInvoice2ItemList 格式化ContractInvoice
  160. func formatContractInvoice2ItemList(list []*ContractInvoice) (itemList []*ContractInvoiceItem) {
  161. itemList = make([]*ContractInvoiceItem, 0)
  162. for i := range list {
  163. itemList = append(itemList, &ContractInvoiceItem{
  164. ContractInvoiceId: list[i].ContractInvoiceId,
  165. ContractRegisterId: list[i].ContractRegisterId,
  166. ContractCode: list[i].ContractCode,
  167. Amount: list[i].Amount,
  168. OriginAmount: list[i].OriginAmount,
  169. CurrencyUnit: list[i].CurrencyUnit,
  170. InvoiceType: list[i].InvoiceType,
  171. InvoiceDate: utils.TimeTransferString(utils.FormatDate, list[i].InvoiceDate),
  172. SellerId: list[i].SellerId,
  173. SellerName: list[i].SellerName,
  174. PayType: list[i].PayType,
  175. Remark: list[i].Remark,
  176. CreateTime: utils.TimeTransferString(utils.FormatDateTime, list[i].CreateTime),
  177. })
  178. }
  179. return
  180. }
  181. // ContractInvoiceListReq 合同开票/到款登记列表请求体
  182. type ContractInvoiceListReq struct {
  183. InvoiceType int `json:"invoice_type" form:"invoice_type" binding:"oneof=1 2" description:"类型: 1-开票登记; 2-到款登记"`
  184. ContractCode string `json:"contract_code" form:"contract_code" binding:"omitempty" description:"合同编号"`
  185. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  186. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  187. MinAmount float64 `json:"min_amount" form:"min_amount" description:"开票金额区间-最小值"`
  188. MaxAmount float64 `json:"max_amount" form:"max_amount" description:"开票金额区间-最大值"`
  189. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  190. base.PageReq
  191. }
  192. // GetContractInvoiceItemPageList 获取合同开票/到款列表-分页
  193. func GetContractInvoiceItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractInvoiceItem, err error) {
  194. list := make([]*ContractInvoice, 0)
  195. query := global.DEFAULT_MYSQL.Table("contract_invoice").
  196. Where("is_deleted = 0").
  197. Where(condition, pars...)
  198. query.Count(&count)
  199. if len(page.GetOrderItemsString()) > 0 {
  200. query = query.Order(page.GetOrderItemsString())
  201. }
  202. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&list).Error
  203. if err != nil {
  204. return
  205. }
  206. for i := range list {
  207. results = append(results, formatContractInvoice2Item(list[i]))
  208. }
  209. return
  210. }
  211. // formatContractInvoice2Item 格式化ContractInvoiceItem
  212. func formatContractInvoice2Item(item *ContractInvoice) (formatItem *ContractInvoiceItem) {
  213. formatItem = new(ContractInvoiceItem)
  214. formatItem.ContractInvoiceId = item.ContractInvoiceId
  215. formatItem.ContractRegisterId = item.ContractRegisterId
  216. formatItem.ContractCode = item.ContractCode
  217. formatItem.Amount = item.Amount
  218. formatItem.OriginAmount = item.OriginAmount
  219. formatItem.CurrencyUnit = item.CurrencyUnit
  220. formatItem.InvoiceType = item.InvoiceType
  221. formatItem.InvoiceDate = utils.TimeTransferString(utils.FormatDate, item.InvoiceDate)
  222. formatItem.SellerId = item.SellerId
  223. formatItem.SellerName = item.SellerName
  224. formatItem.PayType = item.PayType
  225. formatItem.Remark = item.Remark
  226. formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  227. return
  228. }
  229. // DeleteContractInvoicesByRegisterId 根据合同登记ID删除开票/到款记录
  230. func DeleteContractInvoicesByRegisterId(registerId int) (err error) {
  231. sql := `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?`
  232. err = global.DEFAULT_MYSQL.Exec(sql, registerId).Error
  233. return
  234. }
  235. // InvoicePaymentCensusListReq 商品到款统计列表请求体
  236. type InvoicePaymentCensusListReq struct {
  237. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  238. SellGroupId int `json:"sell_group_id" form:"sell_group_id" description:"销售组别ID"`
  239. ServiceType int `json:"service_type" form:"service_type" description:"套餐类型"`
  240. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  241. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  242. TimeType int `json:"time_type" form:"time_type" description:"时间类型: 1-开票时间; 2-到款时间"`
  243. HasInvoice int `json:"has_invoice" form:"has_invoice" description:"是否已开票: 0-否; 1-是"`
  244. HasPayment int `json:"has_payment" form:"has_payment" description:"是否已到款: 0-否; 1-是"`
  245. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  246. base.PageReq
  247. }
  248. // GetInvoicePaymentCensusPageList 获取商品到款统计列表-分页
  249. func GetInvoicePaymentCensusPageList(page base.IPage, condition string, pars []interface{}) (results []*ContractRegister, registerIds []int, err error) {
  250. query := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  251. Select("b.*").
  252. Joins("JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id").
  253. Where("a.is_deleted = 0 AND b.is_deleted = 0").
  254. Where(condition, pars...).
  255. Group("b.contract_register_id")
  256. if len(page.GetOrderItemsString()) > 0 {
  257. query = query.Order(page.GetOrderItemsString())
  258. }
  259. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  260. if err != nil {
  261. return
  262. }
  263. // 计数
  264. queryCount := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  265. Select("b.contract_register_id").
  266. Joins("JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id").
  267. Where("a.is_deleted = 0 AND b.is_deleted = 0").
  268. Where(condition, pars...).
  269. Group("b.contract_register_id")
  270. queryCount.Find(&registerIds)
  271. return
  272. }
  273. // InvoicePaymentCensusResp 商品到款统计响应体
  274. type InvoicePaymentCensusResp struct {
  275. DataList []*InvoicePaymentCensusItem `json:"data_list"`
  276. InvoiceTotal float64 `json:"invoice_total" description:"开票总金额(换算后)"`
  277. PaymentTotal float64 `json:"payment_total" description:"到款总金额(换算后)"`
  278. InvoiceCurrencyTotal []*InvoiceListCurrencyTotal `json:"invoice_currency_total" description:"开票-分币种总金额"`
  279. PaymentCurrencyTotal []*InvoiceListCurrencyTotal `json:"payment_currency_total" description:"到款-分币种总金额"`
  280. }
  281. // InvoicePaymentCensusItem 商品到款统计信息
  282. type InvoicePaymentCensusItem struct {
  283. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  284. CompanyName string `json:"company_name" description:"客户名称"`
  285. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  286. StartDate string `json:"start_date" description:"合同开始日期"`
  287. EndDate string `json:"end_date" description:"合同结束日期"`
  288. ServicesName string `json:"services_name" description:"套餐信息字符串拼接"`
  289. InvoicePaymentList []*InvoicePaymentCensusInfo `json:"invoice_payment_list" description:"开票到款列表"`
  290. }
  291. // InvoicePaymentCensusInfo 开票到款统计信息
  292. type InvoicePaymentCensusInfo struct {
  293. InvoiceId int `json:"invoice_id" description:"开票ID"`
  294. InvoiceDate string `json:"invoice_time" description:"开票日期"`
  295. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  296. SellerId int `json:"seller_id" description:"销售ID"`
  297. SellerName string `json:"seller_name" description:"销售名称"`
  298. SellerGroupId int `json:"seller_group_id" description:"销售组别ID"`
  299. SellerGroupName string `json:"seller_group_name" description:"销售组别名称"`
  300. PaymentId int `json:"payment_id" description:"到款ID"`
  301. PaymentDate string `json:"payment_date" description:"到款日期"`
  302. PaymentAmount float64 `json:"payment_amount" description:"到款金额"`
  303. PayType int `json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  304. ServiceAmountList []*ContractPaymentServiceAmountItem `json:"service_amount_list" description:"到款套餐金额分配信息"`
  305. }
  306. // ContractInvoiceAmountTotal 开票到款金额合计信息
  307. type ContractInvoiceAmountTotal struct {
  308. InvoiceType int `json:"invoice_type" description:"类型: 1-开票; 2-到款"`
  309. TotalAmount float64 `json:"total_amount" description:"金额合计"`
  310. }
  311. // GetContractInvoiceAmountTotal 获取开票到款金额合计信息
  312. func GetContractInvoiceAmountTotal(condition string, pars []interface{}) (results []*ContractInvoiceAmountTotal, err error) {
  313. query := global.DEFAULT_MYSQL.Table("contract_invoice").
  314. Select("invoice_type, SUM(amount) AS total_amount").
  315. Where("is_deleted = 0").
  316. Where(condition, pars...).
  317. Group("invoice_type")
  318. err = query.Find(&results).Error
  319. return
  320. }
  321. // UpdatePaymentPayTypeReq 到款登记-修改付款方式请求体
  322. type UpdatePaymentPayTypeReq struct {
  323. ContractPaymentId int `json:"contract_payment_id" binding:"required,gte=1" description:"到款登记ID"`
  324. PayType int `json:"pay_type" binding:"oneof=1 2 3 4" description:"付款方式: 1-年付; 2-半年付; 3-季付; 4-次付"`
  325. }
  326. // CensusSellerGroupInvoiceListReq 销售组开票统计列表请求体
  327. type CensusSellerGroupInvoiceListReq struct {
  328. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  329. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  330. SortField int `json:"sort_field" form:"sort_field" description:"排序字段: 1-开票金额; 2-组别占比"`
  331. SortType int `json:"sort_type" form:"sort_type" description:"排序方式: 1-正序; 2-倒序"`
  332. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  333. base.PageReq
  334. }
  335. // CensusSellerGroupInvoiceItem 销售组开票统计数据
  336. type CensusSellerGroupInvoiceItem struct {
  337. GroupId int `json:"group_id" description:"分组ID"`
  338. GroupName string `json:"group_name" description:"分组名称"`
  339. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  340. GroupRate float64 `json:"group_rate" description:"分组占比"`
  341. }
  342. // GetCensusSellerGroupInvoicePageList 获取销售组开票统计列表-分页
  343. func GetCensusSellerGroupInvoicePageList(page base.IPage, condition, outCond string, pars []interface{}, amountSum float64) (results []*CensusSellerGroupInvoiceItem, err error) {
  344. tableName := `weekly_report.sys_group`
  345. if global.CONFIG.Serve.RunMode == "debug" {
  346. tableName = `test_v2_weekly_report.sys_group`
  347. }
  348. sql := `SELECT a.group_id, a.group_name, b.invoice_amount, b.group_rate FROM %s AS a LEFT JOIN `
  349. sql += ` (
  350. SELECT
  351. seller_group_id,
  352. seller_group_name,
  353. SUM(amount) AS invoice_amount,
  354. SUM(amount) / %f AS group_rate
  355. FROM
  356. contract_invoice
  357. WHERE
  358. %s
  359. GROUP BY
  360. seller_group_id
  361. ) AS b ON a.group_id = b.seller_group_id`
  362. sql += ` WHERE %s ORDER BY %s LIMIT %d,%d`
  363. sql = fmt.Sprintf(sql, tableName, amountSum, condition, outCond, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  364. err = global.DEFAULT_MYSQL.Raw(sql, pars).Scan(&results).Error
  365. return
  366. }
  367. // CensusSellerInvoiceListReq 销售开票统计列表请求体
  368. type CensusSellerInvoiceListReq struct {
  369. GroupId int `json:"group_id" form:"group_id" description:"销售组别ID"`
  370. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  371. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  372. SortField int `json:"sort_field" form:"sort_field" description:"排序字段: 1-开票金额; 2-小组占比; 3-全员占比"`
  373. SortType int `json:"sort_type" form:"sort_type" description:"排序方式: 1-正序; 2-倒序"`
  374. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  375. base.PageReq
  376. }
  377. // CensusSellerInvoiceItem 销售组开票统计数据
  378. type CensusSellerInvoiceItem struct {
  379. SellerId int `json:"seller_id" description:"销售ID"`
  380. SellerName string `json:"seller_name" description:"销售名称"`
  381. GroupId int `json:"group_id" description:"分组ID"`
  382. GroupName string `json:"group_name" description:"分组名称"`
  383. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  384. GroupRate float64 `json:"group_rate" description:"分组占比"`
  385. SellerRate float64 `json:"seller_rate" description:"全员占比"`
  386. }
  387. // GetCensusSellerInvoicePageList 获取销售开票统计列表-分页
  388. func GetCensusSellerInvoicePageList(page base.IPage, condition, outCond string, pars []interface{}, amountSum float64) (results []*CensusSellerInvoiceItem, err error) {
  389. tableName := `weekly_report.admin`
  390. if global.CONFIG.Serve.RunMode == "debug" {
  391. tableName = `test_v2_weekly_report.admin`
  392. }
  393. sql := `SELECT a.admin_id AS seller_id, a.real_name AS seller_name, a.group_id, b.invoice_amount, b.group_rate, b.seller_rate FROM %s AS a LEFT JOIN `
  394. sql += ` (
  395. SELECT c.seller_id, c.seller_group_id, SUM(c.amount) AS invoice_amount,
  396. SUM(c.amount) / (
  397. SELECT SUM(amount) FROM contract_invoice WHERE seller_group_id = c.seller_group_id AND %s
  398. ) AS group_rate,
  399. SUM(c.amount) / %f AS seller_rate
  400. FROM contract_invoice AS c
  401. WHERE %s
  402. GROUP BY c.seller_id
  403. ) AS b ON a.admin_id = b.seller_id `
  404. sql += ` WHERE %s ORDER BY %s LIMIT %d,%d`
  405. sql = fmt.Sprintf(sql, tableName, condition, amountSum, condition, outCond, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  406. err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&results).Error
  407. return
  408. }
  409. // InvoiceListRespData 开票/到款列表响应体
  410. type InvoiceListRespData struct {
  411. Page *base.Page `json:"page"`
  412. List interface{} `json:"list"`
  413. AmountTotal float64 `json:"amount_total"`
  414. CurrencyTotal []*InvoiceListCurrencyTotal `json:"currency_total"`
  415. }
  416. // InvoiceListCurrencyTotal 开票/到款列表分币种合计信息
  417. type InvoiceListCurrencyTotal struct {
  418. Name string `json:"name" description:"货币名称"`
  419. UnitName string `json:"unit_name" description:"单位名称"`
  420. Code string `json:"code" description:"国际代码"`
  421. Amount float64 `json:"amount" description:"金额"`
  422. FlagImg string `json:"flag_img" description:"国旗图标"`
  423. }
  424. // InvoiceListCurrencySum 开票/到款列表分币种总和
  425. type InvoiceListCurrencySum struct {
  426. CurrencyUnit string `json:"currency_unit" description:"货币代码"`
  427. InvoiceType int `json:"invoice_type" description:"开票类型:1-开票; 2-到款"`
  428. AmountTotal float64 `json:"amount_total" description:"换算后合计金额"`
  429. OriginAmountTotal float64 `json:"origin_amount_total" description:"原合计金额"`
  430. }
  431. // GetInvoiceListCurrencySum 获取开票/到款分货币合计
  432. func GetInvoiceListCurrencySum(condition string, pars []interface{}, groupRule string) (results []*InvoiceListCurrencySum, err error) {
  433. query := global.DEFAULT_MYSQL.Table("contract_invoice").
  434. Select("currency_unit, invoice_type, SUM(amount) AS amount_total, SUM(origin_amount) AS origin_amount_total").
  435. Where("is_deleted = 0").
  436. Where(condition, pars...).
  437. Group(groupRule)
  438. err = query.Find(&results).Error
  439. return
  440. }