contract_invoice.go 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  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. ServiceProductId int `gorm:"column:service_product_id" json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  31. IsPrePay int `gorm:"column:is_pre_pay" json:"is_pre_pay" description:"是否预付款: 0-不是; 1-是"`
  32. StartDate time.Time `gorm:"column:start_date" json:"start_date" description:"约定开始时间"`
  33. EndDate time.Time `gorm:"column:end_date" json:"end_date" description:"约定结束时间"`
  34. PreRegisterId int `gorm:"column:pre_register_id" json:"pre_register_id" description:"预登记ID"`
  35. base.TimeBase
  36. }
  37. func (c *ContractInvoice) TableName() string {
  38. return "contract_invoice"
  39. }
  40. // ContractInvoiceItem 合同开票/到款
  41. type ContractInvoiceItem struct {
  42. ContractInvoiceId int `gorm:"column:contract_invoice_id" json:"contract_invoice_id" description:"开票ID"`
  43. ContractRegisterId int `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  44. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  45. ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  46. Amount float64 `gorm:"column:amount" json:"amount" description:"换算金额"`
  47. OriginAmount float64 `gorm:"column:origin_amount" json:"origin_amount" description:"开票/到款金额"`
  48. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  49. UnitName string `json:"unit_name" description:"货币单位名称"`
  50. InvoiceType int `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记;3-开票预登记;4-到款预登记"`
  51. InvoiceDate string `gorm:"column:invoice_time" json:"invoice_time" description:"开票日期/到款月"`
  52. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
  53. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
  54. PayType int `gorm:"column:pay_type" json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  55. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  56. ServiceProductId int `gorm:"column:service_product_id" json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  57. IsPrePay int `gorm:"column:is_pre_pay" json:"is_pre_pay" description:"是否预付款: 0-不是; 1-是"`
  58. StartDate string `gorm:"column:start_date" json:"start_date" description:"约定开始时间"`
  59. EndDate string `gorm:"column:end_date" json:"end_date" description:"约定结束时间"`
  60. CreateTime string `gorm:"column:create_time" json:"create_time" description:"创建时间"`
  61. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  62. WxUserId int `json:"wx_user_id" description:"用户id,针对某份合同仅对单个用户使用的时候的场景"`
  63. WxUserName string `json:"wx_user_name" description:"用户姓名,针对某份合同仅对单个用户使用的时候的场景"`
  64. }
  65. func (c *ContractInvoice) Create() (err error) {
  66. err = global.DEFAULT_MYSQL.Create(c).Error
  67. return
  68. }
  69. func (c *ContractInvoice) AddInBatches(list []*ContractInvoice) (err error) {
  70. err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
  71. return
  72. }
  73. func (c *ContractInvoice) Update(updateCols []string) (err error) {
  74. err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
  75. return
  76. }
  77. func (c *ContractInvoice) Fetch(id int) (item *ContractInvoice, err error) {
  78. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_invoice_id = ?", id).First(&item).Error
  79. return
  80. }
  81. // 删除
  82. func (c *ContractInvoice) Delete() (err error) {
  83. err = global.DEFAULT_MYSQL.Delete(c).Error
  84. return
  85. }
  86. func (c *ContractInvoice) Sum(field, condition string, pars []interface{}) (total float64, err error) {
  87. totalList := make([]float64, 0)
  88. err = global.DEFAULT_MYSQL.Table("contract_invoice AS a").Joins("INNER JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id ").
  89. Where("a.is_deleted = 0").
  90. Where(condition, pars...).
  91. Pluck(field, &totalList).Error
  92. for i := range totalList {
  93. total += totalList[i]
  94. }
  95. return
  96. }
  97. func (c *ContractInvoice) List(condition string, pars []interface{}, orderRule string) (list []*ContractInvoice, err error) {
  98. list = make([]*ContractInvoice, 0)
  99. query := global.DEFAULT_MYSQL.Model(c).
  100. Where("is_deleted = 0").
  101. Where(condition, pars...)
  102. if orderRule != "" {
  103. query.Order(orderRule)
  104. } else {
  105. query.Order("contract_invoice_id ASC")
  106. }
  107. err = query.Find(&list).Error
  108. return
  109. }
  110. func (c *ContractInvoice) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractInvoice, err error) {
  111. results = make([]*ContractInvoice, 0)
  112. query := global.DEFAULT_MYSQL.Model(c).
  113. Where("is_deleted = 0").
  114. Where(condition, pars...)
  115. query.Count(&count)
  116. if len(page.GetOrderItemsString()) > 0 {
  117. query = query.Order(page.GetOrderItemsString())
  118. }
  119. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  120. return
  121. }
  122. // DeleteAndCreateNewInvoice 删除并新增登记
  123. func (c *ContractInvoice) DeleteAndCreateNewInvoice(contractRegisterId, invoiceType int, deleteInvoiceIds []int, invoices []*ContractInvoice) (err error) {
  124. tx := global.DEFAULT_MYSQL.Begin()
  125. defer func() {
  126. if err != nil {
  127. tx.Rollback()
  128. } else {
  129. tx.Commit()
  130. }
  131. }()
  132. if len(deleteInvoiceIds) > 0 {
  133. err = tx.Model(c).
  134. Where("contract_register_id = ? AND invoice_type = ? AND contract_invoice_id IN (?)", contractRegisterId, invoiceType, deleteInvoiceIds).
  135. UpdateColumn("is_deleted", 1).Error
  136. if err != nil {
  137. return
  138. }
  139. }
  140. if len(invoices) > 0 {
  141. err = tx.CreateInBatches(invoices, len(invoices)).Error
  142. if err != nil {
  143. return
  144. }
  145. }
  146. return
  147. }
  148. // ContractInvoiceSaveReq 合同开票-请求体
  149. type ContractInvoiceSaveReq struct {
  150. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  151. InvoiceType int `json:"invoice_type" binding:"oneof=1 2 3" description:"类型: 1-开票登记; 2-到款登记; 3-预到款登记"`
  152. AmountList []*ContractInvoiceSaveItem `json:"amount_list"`
  153. }
  154. // ContractInvoiceSaveItem 合同开票数据
  155. type ContractInvoiceSaveItem struct {
  156. ServiceProductId int `json:"service_product_id" binding:"oneof=1 2" description:"套餐类型:1ficc套餐,2权益套餐"`
  157. InvoiceId int `json:"invoice_id" description:"开票ID"`
  158. OriginAmount float64 `json:"origin_amount" description:"开票(到款)金额"`
  159. Amount float64 `json:"amount" description:"换算后的金额"`
  160. InvoiceDate string `json:"invoice_date" description:"开票日期/到款月"`
  161. Remark string `json:"remark" description:"备注"`
  162. SellerId int `json:"seller_id" description:"销售ID"`
  163. }
  164. // GetContractInvoiceItemList 获取开票到款列表
  165. func GetContractInvoiceItemList(condition string, pars []interface{}) (itemList []*ContractInvoiceItem, err error) {
  166. list := make([]*ContractInvoice, 0)
  167. err = global.DEFAULT_MYSQL.Model(ContractInvoice{}).
  168. Where("is_deleted = 0").
  169. Where(condition, pars...).
  170. Order("contract_invoice_id ASC").
  171. Find(&list).Error
  172. if err != nil {
  173. return
  174. }
  175. itemList = formatContractInvoice2ItemList(list)
  176. return
  177. }
  178. // formatContractInvoice2ItemList 格式化ContractInvoice
  179. func formatContractInvoice2ItemList(list []*ContractInvoice) (itemList []*ContractInvoiceItem) {
  180. itemList = make([]*ContractInvoiceItem, 0)
  181. for i := range list {
  182. itemList = append(itemList, &ContractInvoiceItem{
  183. ContractInvoiceId: list[i].ContractInvoiceId,
  184. ContractRegisterId: list[i].ContractRegisterId,
  185. ContractCode: list[i].ContractCode,
  186. Amount: list[i].Amount,
  187. OriginAmount: list[i].OriginAmount,
  188. CurrencyUnit: list[i].CurrencyUnit,
  189. InvoiceType: list[i].InvoiceType,
  190. InvoiceDate: utils.TimeTransferString(utils.FormatDate, list[i].InvoiceDate),
  191. SellerId: list[i].SellerId,
  192. SellerName: list[i].SellerName,
  193. PayType: list[i].PayType,
  194. Remark: list[i].Remark,
  195. ServiceProductId: list[i].ServiceProductId,
  196. IsPrePay: list[i].IsPrePay,
  197. StartDate: list[i].StartDate.Format(utils.FormatDate),
  198. EndDate: list[i].StartDate.Format(utils.FormatDate),
  199. CreateTime: utils.TimeTransferString(utils.FormatDateTime, list[i].CreateTime),
  200. })
  201. }
  202. return
  203. }
  204. // ContractInvoiceListReq 合同开票/到款登记列表请求体
  205. type ContractInvoiceListReq struct {
  206. InvoiceType int `json:"invoice_type" form:"invoice_type" binding:"oneof=1 2" description:"类型: 1-开票登记; 2-到款登记"`
  207. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售ID, 多个id用逗号拼接"`
  208. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"搜索关键字"`
  209. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  210. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  211. MinAmount float64 `json:"min_amount" form:"min_amount" description:"开票金额区间-最小值"`
  212. MaxAmount float64 `json:"max_amount" form:"max_amount" description:"开票金额区间-最大值"`
  213. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  214. ServiceProductId int `json:"service_product_id" form:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  215. base.PageReq
  216. }
  217. // GetContractInvoiceItemPageList 获取合同开票/到款列表-分页
  218. func GetContractInvoiceItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractInvoiceItem, err error) {
  219. list := make([]*ContractInvoiceRespItem, 0)
  220. query := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  221. Select("a.*, b.company_name,b.wx_user_id,b.wx_user_name").
  222. Joins("JOIN contract_register b ON a.contract_register_id = b.contract_register_id").
  223. Where("a.is_deleted = 0").
  224. Where(condition, pars...)
  225. query.Count(&count)
  226. if len(page.GetOrderItemsString()) > 0 {
  227. query = query.Order(page.GetOrderItemsString())
  228. }
  229. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&list).Error
  230. if err != nil {
  231. return
  232. }
  233. for i := range list {
  234. results = append(results, formatContractInvoice2Item(list[i]))
  235. }
  236. return
  237. }
  238. // formatContractInvoice2Item 格式化ContractInvoiceItem
  239. func formatContractInvoice2Item(item *ContractInvoiceRespItem) (formatItem *ContractInvoiceItem) {
  240. formatItem = new(ContractInvoiceItem)
  241. formatItem.ContractInvoiceId = item.ContractInvoiceId
  242. formatItem.ContractRegisterId = item.ContractRegisterId
  243. formatItem.ContractCode = item.ContractCode
  244. formatItem.Amount = item.Amount
  245. formatItem.OriginAmount = item.OriginAmount
  246. formatItem.CurrencyUnit = item.CurrencyUnit
  247. formatItem.InvoiceType = item.InvoiceType
  248. formatItem.InvoiceDate = utils.TimeTransferString(utils.FormatDate, item.InvoiceDate)
  249. formatItem.SellerId = item.SellerId
  250. formatItem.SellerName = item.SellerName
  251. formatItem.PayType = item.PayType
  252. formatItem.Remark = item.Remark
  253. formatItem.IsPrePay = item.IsPrePay
  254. formatItem.ServiceProductId = item.ServiceProductId
  255. formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  256. formatItem.CompanyName = item.CompanyName
  257. formatItem.WxUserId = item.WxUserId
  258. formatItem.WxUserName = item.WxUserName
  259. formatItem.CompanyName = item.CompanyName
  260. return
  261. }
  262. // DeleteContractInvoicesByRegisterId 根据合同登记ID删除开票/到款记录
  263. func DeleteContractInvoicesByRegisterId(registerId int) (err error) {
  264. sql := `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?`
  265. err = global.DEFAULT_MYSQL.Exec(sql, registerId).Error
  266. return
  267. }
  268. // InvoicePaymentCensusListReq 商品到款统计列表请求体
  269. type InvoicePaymentCensusListReq struct {
  270. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  271. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售ID,多个ID之间用逗号拼接"`
  272. ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型, 多个套餐之间用逗号拼接"`
  273. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  274. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  275. HasInvoice string `json:"has_invoice" form:"has_invoice" description:"是否已开票: 0-否; 1-是; 空-全部"`
  276. HasPayment string `json:"has_payment" form:"has_payment" description:"是否已到款: 0-否; 1-是; 空-全部"`
  277. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  278. ListParam int `json:"list_param" form:"list_param" description:"套餐类型: 0-全部; 1-ficc; 2-权益"`
  279. SortParam string `json:"sort_param" form:"sort_param" description:"排序字段参数,用来排序的字段, 枚举值:'invoice_time':开票日 、 'payment_date':到款日"`
  280. SortType string `json:"sort_type" form:"sort_type" description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒叙"`
  281. TimeType int `json:"time_type" form:"time_type" description:"时间类型: 1-开票时间; 2-到款时间;3-开票时间&到款时间"`
  282. base.PageReq
  283. }
  284. // GetInvoicePaymentCensusPageListV2 获取商品到款统计列表-分页
  285. func GetInvoicePaymentCensusPageListV2(page base.IPage, condition string, pars []interface{}) (results []*ContractRegister, registerIds []int, err error) {
  286. query := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  287. Select("b.*").
  288. Joins("JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id").
  289. Where("a.is_deleted = 0 AND b.is_deleted = 0").
  290. Where(condition, pars...).
  291. Group("b.contract_register_id")
  292. if len(page.GetOrderItemsString()) > 0 {
  293. query = query.Order(page.GetOrderItemsString())
  294. }
  295. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  296. if err != nil {
  297. return
  298. }
  299. // 计数
  300. queryCount := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  301. Select("b.contract_register_id").
  302. Joins("JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id").
  303. Where("a.is_deleted = 0 AND b.is_deleted = 0").
  304. Where(condition, pars...).
  305. Group("b.contract_register_id")
  306. queryCount.Find(&registerIds)
  307. return
  308. }
  309. // InvoicePaymentCensusResp 商品到款统计响应体
  310. type InvoicePaymentCensusResp struct {
  311. DataList []*InvoicePaymentCensusItem `json:"data_list"`
  312. InvoiceTotal float64 `json:"invoice_total" description:"开票总金额(换算后)"`
  313. PaymentTotal float64 `json:"payment_total" description:"到款总金额(换算后)"`
  314. AmountTotal float64 `json:"amount_total" description:"合计总金额(换算后)"`
  315. InvoiceCurrencyTotal []*InvoiceListCurrencyTotal `json:"invoice_currency_total" description:"开票-分币种总金额"`
  316. PaymentCurrencyTotal []*InvoiceListCurrencyTotal `json:"payment_currency_total" description:"到款-分币种总金额"`
  317. }
  318. // InvoicePaymentCensusItem 商品到款统计信息
  319. type InvoicePaymentCensusItem struct {
  320. SummaryId int `json:"summary_id" description:"汇总ID"`
  321. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  322. CompanyName string `json:"company_name" description:"客户名称"`
  323. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  324. StartDate string `json:"start_date" description:"合同开始日期"`
  325. EndDate string `json:"end_date" description:"合同结束日期"`
  326. ServicesName string `json:"services_name" description:"套餐信息字符串拼接"`
  327. ContractType int `json:"contract_type" description:"合同类型: 0-无 1-新签; 2-续约"`
  328. ActualPayCompanies string `json:"actual_pay_companies" description:"该合同关联的所有代付方, 英文逗号拼接"`
  329. InvoicePaymentList []*InvoicePaymentCensusInfo `json:"invoice_payment_list" description:"开票到款列表"`
  330. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  331. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  332. UnitName string `gorm:"unit_name" json:"unit_name" description:"单位名称"`
  333. ProductIds string `gorm:"column:product_ids" json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
  334. NotInvoiceTotal float64 `json:"not_invoice_total" description:"未开票总金额(换算后)"`
  335. }
  336. // InvoicePaymentCensusInfo 开票到款统计信息
  337. type InvoicePaymentCensusInfo struct {
  338. InvoiceId int `json:"invoice_id" description:"开票ID"`
  339. InvoiceDate string `json:"invoice_time" description:"开票日期"`
  340. InvoiceAmount float64 `json:"invoice_amount" description:"开票换算金额"`
  341. InvoiceOriginAmount float64 `json:"invoice_origin_amount" description:"开票原始金额"`
  342. SellerId int `json:"seller_id" description:"销售ID"`
  343. SellerName string `json:"seller_name" description:"销售名称"`
  344. SellerGroupId int `json:"seller_group_id" description:"销售组别ID"`
  345. SellerGroupName string `json:"seller_group_name" description:"销售组别名称"`
  346. PaymentId int `json:"payment_id" description:"到款ID"`
  347. PaymentDate string `json:"payment_date" description:"到款日期"`
  348. PaymentAmount float64 `json:"payment_amount" description:"到款换算金额"`
  349. PaymentOriginAmount float64 `json:"payment_origin_amount" description:"到款原始金额"`
  350. PayType int `json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  351. ServiceAmountList []*ContractPaymentServiceAmountItem `json:"service_amount_list" description:"到款套餐金额分配信息"`
  352. SellerType string `json:"seller_type" description:"销售类型:1ficc销售,2权益销售"`
  353. }
  354. // ContractInvoiceAmountTotal 开票到款金额合计信息
  355. type ContractInvoiceAmountTotal struct {
  356. InvoiceType int `json:"invoice_type" description:"类型: 1-开票; 2-到款"`
  357. TotalAmount float64 `json:"total_amount" description:"金额合计"`
  358. }
  359. // GetContractInvoiceAmountTotal 获取开票到款金额合计信息
  360. func GetContractInvoiceAmountTotal(condition string, pars []interface{}) (results []*ContractInvoiceAmountTotal, err error) {
  361. query := global.DEFAULT_MYSQL.Table("contract_invoice").
  362. Select("invoice_type, SUM(amount) AS total_amount").
  363. Where("is_deleted = 0").
  364. Where(condition, pars...).
  365. Group("invoice_type")
  366. err = query.Find(&results).Error
  367. return
  368. }
  369. // UpdatePaymentPayTypeReq 到款登记-修改付款方式请求体
  370. type UpdatePaymentPayTypeReq struct {
  371. ContractPaymentId int `json:"contract_payment_id" binding:"required,gte=1" description:"到款登记ID"`
  372. PayType int `json:"pay_type" binding:"oneof=1 2 3 4" description:"付款方式: 1-年付; 2-半年付; 3-季付; 4-次付"`
  373. }
  374. // CensusSellerGroupInvoiceListReq 销售组开票统计列表请求体
  375. type CensusSellerGroupInvoiceListReq struct {
  376. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  377. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  378. SortField int `json:"sort_field" form:"sort_field" description:"排序字段: 1-开票金额; 2-组别占比"`
  379. SortType int `json:"sort_type" form:"sort_type" description:"排序方式: 1-正序; 2-倒序"`
  380. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  381. SellerType int `json:"seller_type" form:"seller_type" description:"销售类型:1ficc销售,2权益销售"`
  382. CompanyType int `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户"`
  383. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售IDs"`
  384. base.PageReq
  385. }
  386. // CensusSellerGroupInvoiceItem 销售组开票统计数据
  387. type CensusSellerGroupInvoiceItem struct {
  388. GroupId int `json:"group_id" description:"分组ID"`
  389. GroupName string `json:"group_name" description:"分组名称"`
  390. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  391. GroupRate float64 `json:"group_rate" description:"分组占比"`
  392. }
  393. // GetCensusSellerGroupInvoicePageList 获取销售组开票统计列表-分页
  394. func GetCensusSellerGroupInvoicePageList(page base.IPage, condition, outCond string, pars []interface{}, amountSum float64) (results []*CensusSellerGroupInvoiceItem, err error) {
  395. tableName := `weekly_report.sys_group`
  396. if global.CONFIG.Serve.RunMode == "debug" {
  397. tableName = `test_v2_weekly_report.sys_group`
  398. }
  399. sql := `SELECT a.group_id, a.group_name, b.invoice_amount, b.group_rate FROM %s AS a LEFT JOIN `
  400. sql += ` (
  401. SELECT
  402. seller_group_id,
  403. seller_group_name,
  404. SUM(amount) AS invoice_amount,
  405. SUM(amount) / %f AS group_rate
  406. FROM
  407. contract_invoice
  408. WHERE
  409. %s
  410. GROUP BY
  411. seller_group_id
  412. ) AS b ON a.group_id = b.seller_group_id`
  413. sql += ` WHERE %s ORDER BY %s LIMIT %d,%d`
  414. sql = fmt.Sprintf(sql, tableName, amountSum, condition, outCond, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  415. err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&results).Error
  416. return
  417. }
  418. // CensusSellerInvoiceListReq 销售开票统计列表请求体
  419. type CensusSellerInvoiceListReq struct {
  420. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售IDs"`
  421. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"开始日期"`
  422. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"结束日期"`
  423. SortField int `json:"sort_field" form:"sort_field" description:"排序字段: 1-开票金额; 2-小组占比; 3-全员占比"`
  424. SortType int `json:"sort_type" form:"sort_type" description:"排序方式: 1-正序; 2-倒序"`
  425. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  426. SellerType int `json:"seller_type" form:"seller_type" description:"销售类型:1ficc销售,2权益销售"`
  427. ShowResign bool `json:"show_resign" form:"show_resign" description:"是否显示离职销售"`
  428. CompanyType int `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户"`
  429. base.PageReq
  430. }
  431. // CensusSellerInvoiceItem 销售组开票统计数据
  432. type CensusSellerInvoiceItem struct {
  433. SellerId int `json:"seller_id" description:"销售ID"`
  434. SellerName string `json:"seller_name" description:"销售名称"`
  435. GroupId int `json:"group_id" description:"分组ID"`
  436. GroupName string `json:"group_name" description:"分组名称"`
  437. InvoiceAmount float64 `json:"invoice_amount" description:"开票金额"`
  438. GroupRate float64 `json:"group_rate" description:"分组占比"`
  439. SellerRate float64 `json:"seller_rate" description:"全员占比"`
  440. }
  441. // GetCensusSellerInvoicePageList 获取销售开票统计列表-分页
  442. func GetCensusSellerInvoicePageList(page base.IPage, condition, outCond string, pars []interface{}, amountSum float64) (results []*CensusSellerInvoiceItem, err error) {
  443. tableName := `weekly_report.admin`
  444. if global.CONFIG.Serve.RunMode == "debug" {
  445. tableName = `test_v2_weekly_report.admin`
  446. }
  447. 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 `
  448. sql += ` (
  449. SELECT c.seller_id, c.seller_group_id, SUM(c.amount) AS invoice_amount,
  450. SUM(c.amount) / (
  451. SELECT SUM(amount) FROM contract_invoice WHERE seller_group_id = c.seller_group_id AND %s
  452. ) AS group_rate,
  453. SUM(c.amount) / %f AS seller_rate
  454. FROM contract_invoice AS c
  455. WHERE %s
  456. GROUP BY c.seller_id
  457. ) AS b ON a.admin_id = b.seller_id `
  458. sql += ` WHERE %s ORDER BY %s LIMIT %d,%d`
  459. sql = fmt.Sprintf(sql, tableName, condition, amountSum, condition, outCond, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  460. err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&results).Error
  461. return
  462. }
  463. // InvoiceListRespData 开票/到款列表响应体
  464. type InvoiceListRespData struct {
  465. Page *base.Page `json:"page"`
  466. List interface{} `json:"list"`
  467. AmountTotal float64 `json:"amount_total"`
  468. CurrencyTotal []*InvoiceListCurrencyTotal `json:"currency_total"`
  469. }
  470. // InvoiceListCurrencyTotal 开票/到款列表分币种合计信息
  471. type InvoiceListCurrencyTotal struct {
  472. Name string `json:"name" description:"货币名称"`
  473. UnitName string `json:"unit_name" description:"单位名称"`
  474. Code string `json:"code" description:"国际代码"`
  475. Amount float64 `json:"amount" description:"金额"`
  476. FlagImg string `json:"flag_img" description:"国旗图标"`
  477. }
  478. // InvoiceListCurrencySum 开票/到款列表分币种总和
  479. type InvoiceListCurrencySum struct {
  480. CurrencyUnit string `json:"currency_unit" description:"货币代码"`
  481. InvoiceType int `json:"invoice_type" description:"开票类型:1-开票; 2-到款"`
  482. AmountTotal float64 `json:"amount_total" description:"换算后合计金额"`
  483. OriginAmountTotal float64 `json:"origin_amount_total" description:"原合计金额"`
  484. }
  485. // GetInvoiceListCurrencySum 获取开票/到款分货币合计
  486. func GetInvoiceListCurrencySum(condition string, pars []interface{}, groupRule string) (results []*InvoiceListCurrencySum, err error) {
  487. query := global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  488. Select("a.currency_unit, a.invoice_type, SUM(a.amount) AS amount_total, SUM(a.origin_amount) AS origin_amount_total, b.company_name").
  489. Joins("JOIN contract_register b ON a.contract_register_id = b.contract_register_id").
  490. Where("a.is_deleted = 0").
  491. Where(condition, pars...).
  492. Group(groupRule)
  493. err = query.Find(&results).Error
  494. return
  495. }
  496. // PreRegisterListReq 预登记列表请求体
  497. type PreRegisterListReq struct {
  498. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  499. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  500. base.PageReq
  501. }
  502. // ContractInvoiceDetailItem 预登记列表详情用-invoice_time换register_time
  503. type ContractInvoiceDetailItem struct {
  504. ContractInvoiceId int `gorm:"column:contract_invoice_id" json:"contract_invoice_id" description:"开票ID"`
  505. ContractRegisterId int `gorm:"column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  506. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  507. ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  508. OriginAmount float64 `gorm:"column:amount" json:"amount" description:"开票/到款金额"`
  509. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  510. UnitName string `json:"unit_name" description:"货币单位名称"`
  511. InvoiceType int `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记;3-开票预登记;4-到款预登记"`
  512. InvoiceDate string `gorm:"column:register_date" json:"register_date" description:"开票日期/到款月"`
  513. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
  514. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
  515. PayType int `gorm:"column:pay_type" json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  516. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  517. ServiceProductId int `gorm:"column:service_product_id" json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  518. IsPrePay int `gorm:"column:is_pre_pay" json:"is_pre_pay" description:"是否预付款: 0-不是; 1-是"`
  519. StartDate string `gorm:"column:start_date" json:"start_date" description:"约定开始时间"`
  520. EndDate string `gorm:"column:end_date" json:"end_date" description:"约定结束时间"`
  521. CreateTime string `gorm:"column:create_time" json:"create_time" description:"创建时间"`
  522. PreRegisterId int `gorm:"column:pre_register_id" json:"pre_register_id" description:"预登记ID"`
  523. HasInvoiceSeller int `json:"has_invoice_seller" description:"对应的开票记录有没有销售 0没有 1有"`
  524. }
  525. type InvoiceDetailItem struct {
  526. ContractInvoice
  527. HasInvoiceSeller int `json:"has_invoice_seller" description:"对应的开票记录有没有销售 0没有 1有"`
  528. }
  529. // GetContractInvoiceDetailItemList 预登记列表详情用-获取开票到款列表
  530. func GetContractInvoiceDetailItemList(condition string, pars []interface{}) (itemList []*ContractInvoiceDetailItem, err error) {
  531. list := make([]*InvoiceDetailItem, 0)
  532. err = global.DEFAULT_MYSQL.Table("contract_invoice AS a").
  533. Select("a.*,IF(p.seller_id > 0, 1, 0) AS has_invoice_seller ").
  534. Joins("JOIN contract_pre_register AS p ON p.invoice_id = a.contract_invoice_id OR p.arrive_id = a.contract_invoice_id ").
  535. Where("is_deleted = 0").
  536. Where(condition, pars...).
  537. Order("contract_invoice_id ASC").
  538. Scan(&list).Error
  539. if err != nil {
  540. return
  541. }
  542. itemList = formatContractInvoice2DetailItemList(list)
  543. return
  544. }
  545. // formatContractInvoice2ItemList 预登记列表详情用-格式化ContractInvoice
  546. func formatContractInvoice2DetailItemList(list []*InvoiceDetailItem) (itemList []*ContractInvoiceDetailItem) {
  547. itemList = make([]*ContractInvoiceDetailItem, 0)
  548. for i := range list {
  549. itemList = append(itemList, &ContractInvoiceDetailItem{
  550. ContractInvoiceId: list[i].ContractInvoiceId,
  551. ContractRegisterId: list[i].ContractRegisterId,
  552. ContractCode: list[i].ContractCode,
  553. OriginAmount: list[i].OriginAmount,
  554. CurrencyUnit: list[i].CurrencyUnit,
  555. InvoiceType: list[i].InvoiceType,
  556. InvoiceDate: utils.TimeTransferString(utils.FormatDate, list[i].InvoiceDate),
  557. SellerId: list[i].SellerId,
  558. SellerName: list[i].SellerName,
  559. PayType: list[i].PayType,
  560. Remark: list[i].Remark,
  561. ServiceProductId: list[i].ServiceProductId,
  562. IsPrePay: list[i].IsPrePay,
  563. StartDate: list[i].StartDate.Format(utils.FormatDate),
  564. EndDate: list[i].StartDate.Format(utils.FormatDate),
  565. CreateTime: utils.TimeTransferString(utils.FormatDateTime, list[i].CreateTime),
  566. PreRegisterId: list[i].PreRegisterId,
  567. HasInvoiceSeller: list[i].HasInvoiceSeller,
  568. })
  569. }
  570. return
  571. }
  572. type ContractInvoiceRespItem struct {
  573. ContractInvoice
  574. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  575. WxUserId int `json:"wx_user_id" description:"用户id,针对某份合同仅对单个用户使用的时候的场景"`
  576. WxUserName string `json:"wx_user_name" description:"用户姓名,针对某份合同仅对单个用户使用的时候的场景"`
  577. }
  578. func (c *ContractInvoice) FetchByRegisterId(registerId int) (items []*ContractInvoice, err error) {
  579. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", registerId).Scan(&items).Error
  580. return
  581. }
  582. // GetDuplicateContractInvoiceDetailItemListWithType 预登记列表详情用-获取开票到款列表
  583. func GetDuplicateContractInvoiceDetailItemListWithType(companyName, startDate, endDate string, contractType, hasPayment int) (itemList []*ContractInvoiceDetailItem, err error) {
  584. list := make([]*InvoiceDetailItem, 0)
  585. err = global.DEFAULT_MYSQL.Table("contract_invoice as a ").
  586. Select(" a.*,IF(p.seller_id > 0, 1, 0) AS has_invoice_seller ").
  587. Joins(" JOIN contract_register as b ON a.contract_register_id = b.contract_register_id ").
  588. Joins("JOIN contract_pre_register AS p ON p.invoice_id = a.contract_invoice_id OR p.arrive_id = a.contract_invoice_id ").
  589. Where(fmt.Sprintf("a.is_deleted = 0 AND b.company_name = '%s' AND b.start_date= '%s' AND b.end_date= '%s'"+
  590. " AND b.is_deleted=0 AND (a.invoice_type=3 OR a.invoice_type=4) "+
  591. "AND b.contract_type=? AND b.has_payment=?", companyName, startDate, endDate), contractType, hasPayment).
  592. Order("a.contract_invoice_id ASC").
  593. Find(&list).Error
  594. if err != nil {
  595. return
  596. }
  597. itemList = formatContractInvoice2DetailItemList(list)
  598. return
  599. }
  600. func GetContractInvoiceByRegisterIdAndType(registerId int) (items *ContractInvoice, err error) {
  601. err = global.DEFAULT_MYSQL.Model(ContractInvoice{}).Where("is_deleted = 0 AND contract_register_id = ? AND invoice_type = 2", registerId).Order("create_time DESC").First(&items).Error
  602. return
  603. }
  604. type DupInvoice struct {
  605. ContractInvoice
  606. TemplateIds string
  607. }
  608. // GetDuplicateContractInvoiceDetailItemList 预登记列表详情用-获取开票到款列表
  609. func GetDuplicateContractInvoiceDetailItemList(companyName, startDate, endDate string, contractType, hasPayment int) (list []*DupInvoice, err error) {
  610. err = global.DEFAULT_MYSQL.Table("contract_invoice as a ").
  611. Select(" a.*,GROUP_CONCAT(DISTINCT c.service_template_id ORDER BY c.service_template_id ) AS template_ids ").
  612. Joins(" JOIN contract_register as b ON a.contract_register_id = b.contract_register_id ").
  613. Joins("JOIN contract_service AS c ON a.contract_register_id = c.contract_register_id").
  614. Where(fmt.Sprintf("a.is_deleted = 0 AND b.company_name = '%s' AND b.start_date= '%s' AND b.end_date= '%s' AND b.is_deleted=0 AND (a.invoice_type=3 OR a.invoice_type=4) AND b.contract_type=? AND b.has_payment=?", companyName, startDate, endDate), contractType, hasPayment).
  615. Group("a.contract_invoice_id").
  616. Order("a.contract_invoice_id ASC").
  617. Find(&list).Error
  618. if err != nil {
  619. return
  620. }
  621. return
  622. }
  623. type IncomeChartListReq struct {
  624. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售ID,多个ID之间用逗号拼接"`
  625. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01" description:"开始日期"`
  626. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01" description:"结束日期"`
  627. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  628. ListParam string `json:"list_param" form:"list_param" description:"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"`
  629. CompanyType int `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户 3未续约"`
  630. ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"`
  631. IncomeType int `json:"income_type" form:"income_type" description:"收入类型 0开票收入 1到款收入"`
  632. }
  633. // 获取最新的开票或到款日期
  634. func GetLatestIncome(condition string, pars []interface{}) (result *ContractInvoice, err error) {
  635. sql := `SELECT
  636. a.*
  637. FROM
  638. contract_invoice AS a
  639. INNER JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id
  640. WHERE
  641. a.is_deleted = 0 `
  642. sql += condition
  643. sql += `ORDER BY a.invoice_time DESC `
  644. err = global.DEFAULT_MYSQL.Raw(sql, pars...).First(&result).Error
  645. return
  646. }
  647. // NotPaymentCensusItem 商品到款统计信息
  648. type NotPaymentCensusItem struct {
  649. SummaryId int `json:"summary_id" description:"汇总ID"`
  650. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  651. CompanyName string `json:"company_name" description:"客户名称"`
  652. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  653. StartDate string `json:"start_date" description:"合同开始日期"`
  654. EndDate string `json:"end_date" description:"合同结束日期"`
  655. ServicesName string `json:"services_name" description:"套餐信息字符串拼接"`
  656. ContractType int `json:"contract_type" description:"合同类型: 0-无 1-新签; 2-续约"`
  657. ActualPayCompanies string `json:"actual_pay_companies" description:"该合同关联的所有代付方, 英文逗号拼接"`
  658. InvoicePaymentList []*NotPaymentCensusInfo `json:"invoice_payment_list" description:"开票到款列表"`
  659. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  660. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  661. UnitName string `gorm:"unit_name" json:"unit_name" description:"单位名称"`
  662. ProductIds string `gorm:"column:product_ids" json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
  663. NotInvoiceTotal float64 `json:"not_invoice_total" description:"未开票总金额(换算后)"`
  664. NotInvoiceList []*NotInvoicePaymentSummaryItem `json:"not_invoice_list" description:"未开票invoice列表"`
  665. }
  666. // NotPaymentCensusInfo 开票到款统计信息
  667. type NotPaymentCensusInfo struct {
  668. InvoiceId int `json:"invoice_id" description:"开票ID"`
  669. InvoiceDate string `json:"invoice_time" description:"开票日期"`
  670. InvoiceAmount float64 `json:"invoice_amount" description:"开票换算金额"`
  671. InvoiceOriginAmount float64 `json:"invoice_origin_amount" description:"开票原始金额"`
  672. SellerId int `json:"seller_id" description:"销售ID"`
  673. SellerName string `json:"seller_name" description:"销售名称"`
  674. SellerGroupId int `json:"seller_group_id" description:"销售组别ID"`
  675. SellerGroupName string `json:"seller_group_name" description:"销售组别名称"`
  676. PaymentId int `json:"payment_id" description:"到款ID"`
  677. PaymentDate string `json:"payment_date" description:"到款日期"`
  678. PaymentAmount float64 `json:"payment_amount" description:"到款换算金额"`
  679. PaymentOriginAmount float64 `json:"payment_origin_amount" description:"到款原始金额"`
  680. PayType int `json:"pay_type" description:"付款方式:0-无;1-年付;2-半年付;3-季付;4-次付;5-异常"`
  681. ServiceAmountList []*ContractPaymentServiceAmountItem `json:"service_amount_list" description:"到款套餐金额分配信息"`
  682. SellerType int `json:"seller_type" description:"销售类型:1ficc销售,2权益销售"`
  683. NotPaymentOriginAmount float64 `json:"not_payment_origin_amount" description:"开票未到款金额"`
  684. NotPaymentAmount float64 `json:"not_payment_amount" description:"开票未到款换算金额"`
  685. ServiceProductId int `json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
  686. UnitName string `json:"unit_name" description:"单位名称"`
  687. }
  688. // GetCensusSellerGroupInvoicePageListV2 获取销售组开票统计列表-分页
  689. func GetCensusSellerGroupInvoicePageListV2(page base.IPage, groupStr, condition string, pars []interface{}, amountSum float64) (count int, results []*CensusSellerGroupInvoiceItem, err error) {
  690. sql := `
  691. SELECT
  692. seller_group_id AS group_id,
  693. SUM(amount) AS invoice_amount,
  694. SUM(amount) / %f AS group_rate
  695. FROM
  696. contract_invoice AS a
  697. INNER JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id
  698. WHERE
  699. %s
  700. AND seller_group_id IN (` + groupStr + `)
  701. GROUP BY
  702. seller_group_id ORDER BY %s LIMIT %d,%d
  703. `
  704. sqlCount := ` select count(1) as count from (SELECT *
  705. FROM
  706. contract_invoice AS a
  707. WHERE
  708. %s
  709. AND seller_group_id IN (` + groupStr + `)
  710. GROUP BY
  711. seller_group_id )as a
  712. `
  713. sqlCount = fmt.Sprintf(sqlCount, condition)
  714. err = global.DEFAULT_MYSQL.Raw(sqlCount, pars...).Find(&count).Error
  715. sql = fmt.Sprintf(sql, amountSum, condition, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  716. err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&results).Error
  717. return
  718. }
  719. // GetCensusSellerInvoicePageList 获取销售开票统计列表-分页
  720. func GetCensusSellerInvoicePageListV2(page base.IPage, adminStr, inCond, condition string, pars []interface{}, amountSum float64) (count int, results []*CensusSellerInvoiceItem, err error) {
  721. //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 `
  722. sql := ` SELECT c.seller_id , SUM(c.amount) AS invoice_amount,
  723. SUM(c.amount) / (
  724. SELECT SUM(amount) FROM contract_invoice WHERE seller_group_id = c.seller_group_id AND %s
  725. ) AS group_rate,
  726. SUM(c.amount) / %f AS seller_rate
  727. FROM contract_invoice AS c
  728. INNER JOIN contract_register AS b ON c.contract_register_id = b.contract_register_id
  729. WHERE %s
  730. AND c.seller_id IN (` + adminStr + `)
  731. GROUP BY c.seller_id ORDER BY %s LIMIT %d,%d `
  732. sqlCount := ` select count(1) as count from (SELECT c.*
  733. FROM contract_invoice AS c
  734. INNER JOIN contract_register AS b ON c.contract_register_id = b.contract_register_id
  735. WHERE %s
  736. AND c.seller_id IN (` + adminStr + `) GROUP BY c.seller_id ) as a
  737. `
  738. sqlCount = fmt.Sprintf(sqlCount, condition)
  739. err = global.DEFAULT_MYSQL.Raw(sqlCount, pars...).Find(&count).Error
  740. //query := global.DEFAULT_MYSQL.Table("contract_invoice").
  741. // Where(condition, pars...).Where("AND seller_id IN (`+adminStr+`)")
  742. //query.Count(&count)
  743. sql = fmt.Sprintf(sql, inCond, amountSum, condition, page.GetOrderItemsString(), page.Offset(), page.GetPageSize())
  744. err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&results).Error
  745. return
  746. }
  747. // GetInvoiceListByFix
  748. func GetInvoiceListByFix() (results []*ContractInvoice, err error) {
  749. sql := `SELECT * FROM contract_invoice WHERE invoice_type = 2 AND seller_id = 0 `
  750. err = global.DEFAULT_MYSQL.Raw(sql).Find(&results).Error
  751. return
  752. }
  753. // GetDuplicateContractInvoiceDetailItemList 补录合同用-获取开票到款列表
  754. func GetDuplicateContractInvoiceDetailItemListForSupplement(companyName, startDate, endDate string, contractType, hasPayment int) (list []*DupInvoice, err error) {
  755. err = global.DEFAULT_MYSQL.Table("contract_invoice as a ").
  756. Select(" a.*,GROUP_CONCAT(DISTINCT c.service_template_id ORDER BY c.service_template_id ) AS template_ids ").
  757. Joins(" JOIN contract_register as b ON a.contract_register_id = b.contract_register_id ").
  758. Joins("JOIN contract_service AS c ON a.contract_register_id = c.contract_register_id").
  759. Where(fmt.Sprintf("a.is_deleted = 0 AND b.company_name = '%s' AND b.start_date= '%s' AND b.end_date= '%s' AND b.is_deleted=0 AND b.contract_type=? AND b.has_payment=?", companyName, startDate, endDate), contractType, hasPayment).
  760. Group("a.contract_register_id").
  761. Order("a.contract_invoice_id ASC").
  762. Find(&list).Error
  763. if err != nil {
  764. return
  765. }
  766. return
  767. }
  768. func GetInvoiceCountByRegisterId(registerId int) (total int64, err error) {
  769. err = global.DEFAULT_MYSQL.Table("contract_invoice as a ").
  770. Where("is_deleted = 0 AND contract_register_id = ?", registerId).Count(&total).Error
  771. return
  772. }
  773. type IncomeListReq struct {
  774. SellerIds string `json:"seller_ids" form:"seller_ids" description:"销售ID,多个ID之间用逗号拼接"`
  775. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01" description:"开始日期"`
  776. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01" description:"结束日期"`
  777. IsExport int `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
  778. ListParam string `json:"list_param" form:"list_param" description:"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"`
  779. CompanyType int `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户 3未续约"`
  780. ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"`
  781. IncomeType int `json:"income_type" form:"income_type" description:"收入类型 0开票收入 1到款收入"`
  782. SortType string `json:"sort_type" form:"sort_type" description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒叙"`
  783. Keyword string `json:"keyword" form:"keyword" description:"搜索关键字"`
  784. base.PageReq
  785. }
  786. // 获取最新的到款日期
  787. func GetLatestPaymentIncome(condition string, pars []interface{}) (result *ContractInvoice, err error) {
  788. sql := `SELECT
  789. a.*
  790. FROM
  791. contract_invoice AS a
  792. INNER JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id
  793. WHERE
  794. a.is_deleted = 0 AND a.invoice_type IN (2,4) `
  795. sql += condition
  796. sql += `ORDER BY a.invoice_time DESC `
  797. err = global.DEFAULT_MYSQL.Raw(sql, pars...).First(&result).Error
  798. return
  799. }
  800. // 获取最早的到款日期
  801. func GetEarliestPaymentIncome(condition string, pars []interface{}) (result *ContractInvoice, err error) {
  802. sql := `SELECT
  803. a.*
  804. FROM
  805. contract_invoice AS a
  806. INNER JOIN contract_register AS b ON a.contract_register_id = b.contract_register_id
  807. WHERE
  808. a.is_deleted = 0 AND a.invoice_type IN (2,4) `
  809. sql += condition
  810. sql += `ORDER BY a.invoice_time ASC `
  811. err = global.DEFAULT_MYSQL.Raw(sql, pars...).First(&result).Error
  812. return
  813. }