invoice_payment.go 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971
  1. package census
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/go-playground/validator/v10"
  7. "github.com/tealeg/xlsx"
  8. "hongze/fms_api/controller/resp"
  9. "hongze/fms_api/global"
  10. "hongze/fms_api/models/base"
  11. "hongze/fms_api/models/crm"
  12. "hongze/fms_api/models/fms"
  13. crmService "hongze/fms_api/services/crm"
  14. fmsService "hongze/fms_api/services/fms"
  15. "hongze/fms_api/utils"
  16. "net/http"
  17. "strconv"
  18. "strings"
  19. "sync"
  20. "time"
  21. )
  22. // InvoicePaymentController 商品到款统计
  23. type InvoicePaymentController struct{}
  24. // ExportInvoicePaymentCensusList 导出商品到款统计列表
  25. func ExportInvoicePaymentCensusList(c *gin.Context, results *fms.InvoicePaymentCensusResp) {
  26. list := results.DataList
  27. if len(list) == 0 {
  28. resp.Fail("列表数据为空", c)
  29. return
  30. }
  31. // 生成Excel文件
  32. xlsxFile := xlsx.NewFile()
  33. style := xlsx.NewStyle()
  34. alignment := xlsx.Alignment{
  35. Horizontal: "center",
  36. Vertical: "center",
  37. WrapText: true,
  38. }
  39. style.Alignment = alignment
  40. style.ApplyAlignment = true
  41. sheet, err := xlsxFile.AddSheet("商品到款统计")
  42. if err != nil {
  43. resp.FailData("新增Sheet失败", "Err:"+err.Error(), c)
  44. return
  45. }
  46. _ = sheet.SetColWidth(1, 1, 30)
  47. _ = sheet.SetColWidth(3, 3, 30)
  48. // 前三行-开票金额合计
  49. rowA := sheet.AddRow()
  50. cellAA := rowA.AddCell()
  51. cellAA.SetString(fmt.Sprintf("已开票合计金额(换算后):%.2f(元)", results.InvoiceTotal))
  52. rowBData := "已开票金额:"
  53. for _, v := range results.InvoiceCurrencyTotal {
  54. rowBData += fmt.Sprintf("%s%.2f(%s) ", v.Name, v.Amount, v.UnitName)
  55. }
  56. rowB := sheet.AddRow()
  57. rowB.AddCell().SetString(rowBData)
  58. sheet.AddRow()
  59. // 四至六-到款金额合计
  60. rowD := sheet.AddRow()
  61. cellDA := rowD.AddCell()
  62. cellDA.SetString(fmt.Sprintf("已到款合计金额(换算后):%.2f(元)", results.PaymentTotal))
  63. rowEData := "已到款金额:"
  64. for _, v := range results.PaymentCurrencyTotal {
  65. rowEData += fmt.Sprintf("%s%.2f(%s) ", v.Name, v.Amount, v.UnitName)
  66. }
  67. rowE := sheet.AddRow()
  68. rowE.AddCell().SetString(rowEData)
  69. sheet.AddRow()
  70. // 表头, 套餐动态获取
  71. rowTitle := []string{"序号", "客户名称", "代付方", "是否新客户", "合同起始日期", "合同结束日期", "开票日", "开票金额", "开票换算金额(元)", "到款日", "到款金额", "到款换算金额(元)", "付款方式", "销售",
  72. "销售组别", "销售类型"}
  73. serviceTempCond := ``
  74. serviceTempPars := make([]interface{}, 0)
  75. serviceTempOB := new(fms.ContractServiceTemplate)
  76. serviceTempList, e := serviceTempOB.OrderList(serviceTempCond, serviceTempPars)
  77. if e != nil {
  78. resp.FailData("获取套餐模板列表失败", "Err:"+e.Error(), c)
  79. return
  80. }
  81. serviceTempListMap := make(map[int]*fms.ContractServiceTemplate)
  82. var serviceTempShow []*fms.ContractServiceTemplate
  83. for i := range serviceTempList {
  84. serviceTempListMap[serviceTempList[i].ServiceTemplateId] = serviceTempList[i]
  85. }
  86. for i := range serviceTempList {
  87. if serviceTempList[i].ProductId == 1 {
  88. rowTitle = append(rowTitle, serviceTempList[i].Title)
  89. serviceTempShow = append(serviceTempShow, serviceTempList[i])
  90. } else if serviceTempList[i].ProductId == 2 {
  91. if serviceTempList[i].Title == "行业套餐" || serviceTempList[i].Title == "权益大套餐" || (serviceTempList[i].Title == "策略" && serviceTempListMap[serviceTempList[i].Pid].Pid == 0) {
  92. } else if serviceTempList[i].Title == "医药" || serviceTempList[i].Title == "消费" || serviceTempList[i].Title == "科技" || serviceTempList[i].Title == "智造" {
  93. } else {
  94. serviceTempShow = append(serviceTempShow, serviceTempList[i])
  95. }
  96. if serviceTempList[i].Title == "行业套餐" || serviceTempList[i].Title == "45万" || serviceTempList[i].Title == "70万" {
  97. continue
  98. }
  99. if serviceTempList[i].Pid > 0 && serviceTempListMap[serviceTempList[i].Pid].Pid > 0 {
  100. continue
  101. }
  102. rowTitle = append(rowTitle, serviceTempList[i].Title)
  103. }
  104. }
  105. hi := 0
  106. insertHi := 0
  107. titleRow := sheet.AddRow()
  108. for i := range rowTitle {
  109. v := titleRow.AddCell()
  110. v.SetString(rowTitle[i])
  111. v.SetStyle(style)
  112. if rowTitle[i] != "权益大套餐" && rowTitle[i] != "医药" && rowTitle[i] != "消费" && rowTitle[i] != "科技" && rowTitle[i] != "智造" {
  113. v.VMerge = 1
  114. hi++
  115. } else {
  116. if insertHi == 0 {
  117. insertHi = hi
  118. }
  119. v.HMerge = 1
  120. titleRow.AddCell().SetString("")
  121. }
  122. }
  123. // 新增一行放主观和客观
  124. specialRow := sheet.AddRow()
  125. for i := 0; i < hi; i++ {
  126. if i == insertHi {
  127. v1 := specialRow.AddCell()
  128. v1.SetString("45万")
  129. v1.SetStyle(style)
  130. v1 = specialRow.AddCell()
  131. v1.SetString("70万")
  132. v1.SetStyle(style)
  133. for j := 0; j < 8; j++ {
  134. if j%2 == 0 {
  135. v1 = specialRow.AddCell()
  136. v1.SetString("主观")
  137. v1.SetStyle(style)
  138. } else {
  139. v1 = specialRow.AddCell()
  140. v1.SetString("客观")
  141. v1.SetStyle(style)
  142. }
  143. }
  144. } else {
  145. v := specialRow.AddCell()
  146. v.SetString("")
  147. }
  148. }
  149. newCompanyMap := map[int]string{0: "/", 1: "是", 2: "否", 3: "否", 4: "否"}
  150. for k, v := range list {
  151. dataRow := sheet.AddRow()
  152. // 前四个单元格根据每行开票到款条数向下合并
  153. l := len(v.InvoicePaymentList)
  154. mergeRowNum := l - 1
  155. // 序号
  156. sortNum := k + 1
  157. colA := dataRow.AddCell()
  158. colA.VMerge = mergeRowNum
  159. colA.SetString(fmt.Sprint(sortNum))
  160. // 客户名称
  161. colB := dataRow.AddCell()
  162. colB.VMerge = mergeRowNum
  163. colB.SetString(v.CompanyName)
  164. // 代付方
  165. colE := dataRow.AddCell()
  166. colE.VMerge = mergeRowNum
  167. colE.SetString(v.ActualPayCompanies)
  168. // 是否新客户
  169. colC := dataRow.AddCell()
  170. colC.VMerge = mergeRowNum
  171. colC.SetString(newCompanyMap[v.ContractType])
  172. // 合同有效期
  173. colD := dataRow.AddCell()
  174. colD.VMerge = mergeRowNum
  175. colD.SetString(v.StartDate)
  176. colF := dataRow.AddCell()
  177. colF.VMerge = mergeRowNum
  178. colF.SetString(v.EndDate)
  179. // 开票到款信息
  180. for k2, v2 := range v.InvoicePaymentList {
  181. rowData := []string{
  182. v2.InvoiceDate, // 开票日
  183. fmt.Sprint(v2.InvoiceOriginAmount), // 开票金额
  184. fmt.Sprint(v2.InvoiceAmount), // 开票换算金额
  185. v2.PaymentDate, // 到款日
  186. fmt.Sprint(v2.PaymentOriginAmount), // 到款金额
  187. fmt.Sprint(v2.PaymentAmount), // 到款换算金额
  188. fms.ContractPaymentPayTypeNameMap[v2.PayType], // 付款方式
  189. v2.SellerName, // 销售
  190. v2.SellerGroupName, // 组别
  191. v2.SellerType, // 销售类型
  192. }
  193. // 套餐金额信息
  194. serviceTempShowAmount := make(map[int]string)
  195. for i := range serviceTempShow {
  196. for s2 := range v2.ServiceAmountList {
  197. item := v2.ServiceAmountList[s2]
  198. if item.ServiceTemplateId == serviceTempShow[i].ServiceTemplateId {
  199. serviceTempShowAmount[serviceTempShow[i].ServiceTemplateId] = fmt.Sprint(item.Amount)
  200. break
  201. } else if serviceTempShow[i].Pid == item.ServiceTemplateId {
  202. serviceTempShowAmount[serviceTempShow[i].ServiceTemplateId] = fmt.Sprint(item.Amount / 2)
  203. break
  204. }
  205. }
  206. }
  207. for i := range serviceTempShow {
  208. sa := ""
  209. if am, ok := serviceTempShowAmount[serviceTempShow[i].ServiceTemplateId]; ok {
  210. sa = am
  211. }
  212. rowData = append(rowData, sa)
  213. }
  214. // 首行开票到款
  215. if k2 == 0 {
  216. for i := range rowData {
  217. dataRow.AddCell().SetString(rowData[i])
  218. }
  219. continue
  220. }
  221. // 其他行开票到款, 加四列空的单元格用于合并
  222. dataRowExtra := sheet.AddRow()
  223. for i := 0; i < 4; i++ {
  224. dataRowExtra.AddCell()
  225. }
  226. for i := range rowData {
  227. dataRowExtra.AddCell().SetString(rowData[i])
  228. }
  229. }
  230. }
  231. // 输出文件
  232. var buffer bytes.Buffer
  233. _ = xlsxFile.Write(&buffer)
  234. content := bytes.NewReader(buffer.Bytes())
  235. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  236. fileName := "商品到款统计_" + randStr + ".xlsx"
  237. c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
  238. c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  239. http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
  240. }
  241. // List
  242. // @Title 商品到款统计列表
  243. // @Description 商品到款统计列表
  244. // @Param Keyword query string false "关键词"
  245. // @Param SellGroupId query int false "销售组别ID"
  246. // @Param ServiceType query int false "套餐类型"
  247. // @Param StartDate query string false "合同开始日期"
  248. // @Param EndDate query string false "合同结束日期"
  249. // @Param TimeType query int false "时间类型: 1-开票时间; 2-到款时间"
  250. // @Param HasInvoice query string false "是否已开票: 0-否; 1-是; 空-全部"
  251. // @Param HasPayment query string false "是否已到款: 0-否; 1-是; 空-全部"
  252. // @Param IsExport query int false "是否导出: 0-否; 1-是"
  253. // @Param ListParam query int false "套餐类型: 0-全部; 1-ficc; 2-权益"
  254. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'invoice_time':开票日 、 'payment_date':到款日"
  255. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  256. // @Success 200 {object} fms.ContractRegisterItem
  257. // @router /census/invoice_payment/list [get]
  258. func (ct *InvoicePaymentController) List(c *gin.Context) {
  259. var req fms.InvoicePaymentCensusListReq
  260. if e := c.BindQuery(&req); e != nil {
  261. err, ok := e.(validator.ValidationErrors)
  262. if !ok {
  263. resp.FailData("参数解析失败", "Err:"+e.Error(), c)
  264. return
  265. }
  266. resp.FailData("参数解析失败", err.Translate(global.Trans), c)
  267. return
  268. }
  269. cond := `1 = 1`
  270. pars := make([]interface{}, 0)
  271. // 客户姓名/销售
  272. if req.Keyword != "" {
  273. kw := "%" + req.Keyword + "%"
  274. cond += ` AND (b.company_name LIKE ? OR b.actual_pay_companies LIKE ? )`
  275. pars = append(pars, kw, kw)
  276. }
  277. if req.SellerIds != "" {
  278. sellerIds := strings.Split(req.SellerIds, ",")
  279. cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
  280. pars = append(pars, sellerIds, sellerIds)
  281. }
  282. // 套餐筛选
  283. if req.ServiceTypes != "" {
  284. serviceTypes := strings.Split(req.ServiceTypes, ",")
  285. tempRegisterIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
  286. if e != nil {
  287. resp.FailMsg("获取失败", "获取合同登记IDs失败, Err: "+e.Error(), c)
  288. return
  289. }
  290. if len(tempRegisterIds) > 0 {
  291. cond += ` AND a.register_id IN ?`
  292. pars = append(pars, tempRegisterIds)
  293. } else {
  294. cond += ` AND 1 = 2`
  295. }
  296. }
  297. if req.ListParam == 1 {
  298. cond += ` AND a.service_product_id = 1 `
  299. } else if req.ListParam == 2 {
  300. cond += ` AND a.service_product_id = 2 `
  301. }
  302. // 开票到款日期
  303. if req.TimeType != 0 {
  304. if req.TimeType == 1 && req.StartDate != "" && req.EndDate != "" {
  305. st := fmt.Sprint(req.StartDate, " 00:00:00")
  306. ed := fmt.Sprint(req.EndDate, " 23:59:59")
  307. cond += ` AND (c.invoice_time BETWEEN ? AND ?) `
  308. pars = append(pars, st, ed)
  309. } else if req.TimeType == 2 && req.StartDate != "" && req.EndDate != "" {
  310. st := fmt.Sprint(req.StartDate, " 00:00:00")
  311. ed := fmt.Sprint(req.EndDate, " 23:59:59")
  312. cond += ` AND (d.invoice_time BETWEEN ? AND ?) `
  313. pars = append(pars, st, ed)
  314. } else if req.TimeType == 3 && req.StartDate != "" && req.EndDate != "" {
  315. st := fmt.Sprint(req.StartDate, " 00:00:00")
  316. ed := fmt.Sprint(req.EndDate, " 23:59:59")
  317. cond += ` AND (c.invoice_time BETWEEN ? AND ?) AND (d.invoice_time BETWEEN ? AND ?) `
  318. pars = append(pars, st, ed, st, ed)
  319. }
  320. } else if req.StartDate != "" && req.EndDate != "" {
  321. st := fmt.Sprint(req.StartDate, " 00:00:00")
  322. ed := fmt.Sprint(req.EndDate, " 23:59:59")
  323. if req.SellerIds != "" {
  324. sellerIds := strings.Split(req.SellerIds, ",")
  325. cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
  326. pars = append(pars, sellerIds, sellerIds)
  327. cond += ` AND ((c.seller_id in ? AND a.invoice_id <> 0 AND c.invoice_time BETWEEN ? AND ?)`
  328. cond += `OR (d.seller_id in ? AND a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))`
  329. pars = append(pars, sellerIds, st, ed, sellerIds, st, ed)
  330. } else {
  331. cond += ` AND ((a.invoice_id <> 0 AND c.invoice_time BETWEEN ? AND ?)`
  332. cond += `OR (a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))`
  333. pars = append(pars, st, ed, st, ed)
  334. }
  335. }
  336. if req.HasInvoice == "1" {
  337. cond += ` AND a.invoice_id > 0 `
  338. } else if req.HasInvoice == "0" {
  339. cond += ` AND a.invoice_id = 0 `
  340. }
  341. if req.HasPayment == "1" {
  342. cond += ` AND a.payment_id > 0 `
  343. } else if req.HasPayment == "0" {
  344. cond += ` AND a.payment_id = 0 `
  345. }
  346. page := new(base.Page)
  347. page.SetPageSize(req.PageSize)
  348. page.SetCurrent(req.Current)
  349. //排序
  350. if req.SortType == "" {
  351. req.SortType = "desc"
  352. }
  353. if req.SortType != "desc" && req.SortType != "asc" {
  354. resp.Fail("排序类型不正确", c)
  355. return
  356. }
  357. if req.SortParam == "" {
  358. page.AddOrderItem(base.OrderItem{Column: "sort_invoice_id", Asc: true})
  359. page.AddOrderItem(base.OrderItem{Column: "sort_payment_id", Asc: false})
  360. page.AddOrderItem(base.OrderItem{Column: "c.invoice_time", Asc: false})
  361. page.AddOrderItem(base.OrderItem{Column: "c.amount", Asc: false})
  362. page.AddOrderItem(base.OrderItem{Column: "a.create_time", Asc: false})
  363. } else if req.SortParam == "invoice_time" {
  364. if req.SortType == "asc" {
  365. page.AddOrderItem(base.OrderItem{Column: "sort_invoice_id", Asc: false})
  366. page.AddOrderItem(base.OrderItem{Column: "c.invoice_time", Asc: true})
  367. page.AddOrderItem(base.OrderItem{Column: "c.amount", Asc: true})
  368. page.AddOrderItem(base.OrderItem{Column: "a.create_time", Asc: true})
  369. } else {
  370. page.AddOrderItem(base.OrderItem{Column: "sort_invoice_id", Asc: true})
  371. page.AddOrderItem(base.OrderItem{Column: "c.invoice_time", Asc: false})
  372. page.AddOrderItem(base.OrderItem{Column: "c.amount", Asc: false})
  373. page.AddOrderItem(base.OrderItem{Column: "a.create_time", Asc: false})
  374. }
  375. } else if req.SortParam == "payment_date" {
  376. if req.SortType == "asc" {
  377. page.AddOrderItem(base.OrderItem{Column: "sort_payment_id", Asc: false})
  378. page.AddOrderItem(base.OrderItem{Column: "d.invoice_time", Asc: true})
  379. page.AddOrderItem(base.OrderItem{Column: "d.amount", Asc: true})
  380. page.AddOrderItem(base.OrderItem{Column: "a.create_time", Asc: true})
  381. } else {
  382. page.AddOrderItem(base.OrderItem{Column: "sort_payment_id", Asc: true})
  383. page.AddOrderItem(base.OrderItem{Column: "d.invoice_time", Asc: false})
  384. page.AddOrderItem(base.OrderItem{Column: "d.amount", Asc: false})
  385. page.AddOrderItem(base.OrderItem{Column: "a.create_time", Asc: false})
  386. }
  387. } else {
  388. resp.Fail("排序字段不正确", c)
  389. return
  390. }
  391. if req.IsExport == 1 {
  392. page.SetPageSize(10000)
  393. page.SetCurrent(1)
  394. }
  395. registerList, total, e := fms.GetInvoicePaymentCensusPageList(page, cond, pars)
  396. if e != nil {
  397. resp.FailMsg("获取失败", "获取商品到款统计列表总数失败, Err: "+e.Error(), c)
  398. return
  399. }
  400. queryRegisterIds := make([]int, 0)
  401. for i := range registerList {
  402. queryRegisterIds = append(queryRegisterIds, registerList[i].ContractRegisterId)
  403. }
  404. //fmt.Println("queryRegisterIds:",queryRegisterIds)
  405. results := new(fms.InvoicePaymentCensusResp)
  406. if len(queryRegisterIds) > 0 {
  407. // 获取汇总数据IDs, 用于查询合计数据
  408. summaryIdsCond := cond
  409. summaryIdsPars := pars
  410. summaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(summaryIdsCond, summaryIdsPars)
  411. if e != nil {
  412. resp.FailMsg("获取失败", "获取商品到款汇总IDs失败, Err: "+e.Error(), c)
  413. return
  414. }
  415. //fmt.Println("summaryIds:",summaryIds)
  416. var listErr, totalErr, totalGroupErr error
  417. wg := sync.WaitGroup{}
  418. // 响应列表
  419. respList := make([]*fms.InvoicePaymentCensusItem, 0)
  420. summaryList := make([]*fms.InvoicePaymentSummaryItem, 0)
  421. wg.Add(1)
  422. go func() {
  423. defer wg.Done()
  424. // 获取汇总数据
  425. summaryCond := cond
  426. summaryCond += ` AND a.register_id IN ?`
  427. summaryPars := pars
  428. summaryPars = append(summaryPars, queryRegisterIds)
  429. summaryData, e := fms.GetInvoicePaymentCensusSummaryData(summaryCond, summaryPars)
  430. if e != nil {
  431. resp.FailMsg("获取失败", "获取商品到款汇总列表失败, Err: "+e.Error(), c)
  432. return
  433. }
  434. summaryList = summaryData
  435. //summaryIds := make([]int, 0)
  436. paymentIds := make([]int, 0)
  437. for i := range summaryList {
  438. //summaryIds = append(summaryIds, summaryList[i].SummaryId)
  439. if summaryList[i].PaymentId > 0 {
  440. paymentIds = append(paymentIds, summaryList[i].PaymentId)
  441. }
  442. }
  443. // 合同套餐
  444. /*contractServiceCond := `contract_register_id IN ?`
  445. contractServicePars := make([]interface{}, 0)
  446. contractServicePars = append(contractServicePars, queryRegisterIds)
  447. contractServiceOB := new(fms.ContractService)
  448. contractServiceList, e := contractServiceOB.List(contractServiceCond, contractServicePars)
  449. if e != nil {
  450. listErr = fmt.Errorf("获取合同套餐列表失败, Err: %s", e.Error())
  451. return
  452. }
  453. contractServiceMap := make(map[int][]*fms.ContractService, 0)
  454. servicesNameMap := make(map[int][]string, 0)
  455. for i := range contractServiceList {
  456. if contractServiceMap[contractServiceList[i].ContractRegisterId] == nil {
  457. contractServiceMap[contractServiceList[i].ContractRegisterId] = make([]*fms.ContractService, 0)
  458. }
  459. contractServiceMap[contractServiceList[i].ContractRegisterId] = append(contractServiceMap[contractServiceList[i].ContractRegisterId], contractServiceList[i])
  460. servicesNameMap[contractServiceList[i].ContractRegisterId] = append(servicesNameMap[contractServiceList[i].ContractRegisterId], contractServiceList[i].Title)
  461. }
  462. */
  463. servicesNameMap, serviceFormatMap, e := fmsService.GetContractServiceNameFormat(queryRegisterIds)
  464. if e != nil {
  465. listErr = fmt.Errorf("获取合同套餐列表失败, Err: %s", e.Error())
  466. return
  467. }
  468. // 到款套餐分配
  469. serviceAmountMap := make(map[int][]*fms.ContractPaymentServiceAmount, 0)
  470. if len(paymentIds) > 0 {
  471. serviceAmountCond := `contract_payment_id IN ?`
  472. serviceAmountPars := make([]interface{}, 0)
  473. serviceAmountPars = append(serviceAmountPars, paymentIds)
  474. serviceAmountOB := new(fms.ContractPaymentServiceAmount)
  475. serviceAmountList, e := serviceAmountOB.List(serviceAmountCond, serviceAmountPars)
  476. if e != nil {
  477. listErr = fmt.Errorf("获取到款套餐分配列表失败, Err: %s", e.Error())
  478. return
  479. }
  480. for i := range serviceAmountList {
  481. if serviceAmountMap[serviceAmountList[i].ContractPaymentId] == nil {
  482. serviceAmountMap[serviceAmountList[i].ContractPaymentId] = make([]*fms.ContractPaymentServiceAmount, 0)
  483. }
  484. serviceAmountMap[serviceAmountList[i].ContractPaymentId] = append(serviceAmountMap[serviceAmountList[i].ContractPaymentId], serviceAmountList[i])
  485. }
  486. }
  487. sellerTypeMap := map[int]string{2: "FICC销售", 5: "权益销售"}
  488. sellerList, e := crmService.GetSellerDepartmentListWithEnable()
  489. if e != nil {
  490. resp.FailData("获取销售失败", "Err:"+e.Error(), c)
  491. return
  492. }
  493. sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
  494. for i := range sellerList {
  495. sellerMap[sellerList[i].SellerId] = sellerList[i]
  496. }
  497. // 重组汇总数据
  498. summaryMap := make(map[int][]*fms.InvoicePaymentCensusInfo)
  499. amountMap := make(map[string]*fms.ContractPaymentServiceAmount)
  500. for i := range summaryList {
  501. v := new(fms.InvoicePaymentCensusInfo)
  502. v.InvoiceId = summaryList[i].InvoiceId
  503. v.InvoiceDate = utils.TimeTransferString(utils.FormatDate, summaryList[i].InvoiceDate)
  504. v.InvoiceAmount = summaryList[i].InvoiceAmount
  505. v.InvoiceOriginAmount = summaryList[i].InvoiceOriginAmount
  506. v.SellerId = summaryList[i].SellerId
  507. v.SellerName = summaryList[i].SellerName
  508. v.SellerGroupId = summaryList[i].SellerGroupId
  509. v.SellerGroupName = summaryList[i].SellerGroupName
  510. if seller, ok := sellerMap[summaryList[i].SellerId]; ok {
  511. v.SellerType = sellerTypeMap[seller.DepartmentId]
  512. }
  513. v.PaymentId = summaryList[i].PaymentId
  514. v.PaymentDate = utils.TimeTransferString(utils.FormatDate, summaryList[i].PaymentDate)
  515. v.PaymentAmount = summaryList[i].PaymentAmount
  516. v.PaymentOriginAmount = summaryList[i].PaymentOriginAmount
  517. v.PayType = summaryList[i].PayType
  518. // 套餐到款分配
  519. svaList := make([]*fms.ContractPaymentServiceAmountItem, 0)
  520. amountList := serviceAmountMap[summaryList[i].PaymentId]
  521. if amountList != nil {
  522. for i := range amountList {
  523. k := fmt.Sprintf("%d-%d", amountList[i].ContractPaymentId, amountList[i].ServiceTemplateId)
  524. amountMap[k] = amountList[i]
  525. }
  526. }
  527. // 合同对应的所有套餐
  528. svList := serviceFormatMap[summaryList[i].RegisterId]
  529. if svList != nil {
  530. for ii := range svList {
  531. vv := new(fms.ContractPaymentServiceAmountItem)
  532. vv.ServiceTemplateId = svList[ii].ServiceTemplateId
  533. vv.ServiceTemplateName = svList[ii].FormatTitle
  534. vv.ServiceTemplatePid = svList[ii].ServiceTemplatePid
  535. vv.ServiceProductId = svList[ii].ServiceProductId
  536. k2 := fmt.Sprintf("%d-%d", summaryList[i].PaymentId, svList[ii].ServiceTemplateId)
  537. a := amountMap[k2]
  538. if a != nil {
  539. vv.ContractPaymentServiceAmountId = a.ContractPaymentServiceAmountId
  540. vv.ContractPaymentId = a.ContractPaymentId
  541. vv.Amount = a.Amount
  542. }
  543. svaList = append(svaList, vv)
  544. }
  545. }
  546. v.ServiceAmountList = svaList
  547. summaryMap[summaryList[i].SummaryId] = append(summaryMap[summaryList[i].SummaryId], v)
  548. }
  549. // 响应列表
  550. for i := range registerList {
  551. v := new(fms.InvoicePaymentCensusItem)
  552. v.SummaryId = registerList[i].SummaryId
  553. v.ContractRegisterId = registerList[i].ContractRegisterId
  554. v.CompanyName = registerList[i].CompanyName
  555. v.NewCompany = registerList[i].NewCompany
  556. v.StartDate = utils.TimeTransferString(utils.FormatDate, registerList[i].StartDate)
  557. v.EndDate = utils.TimeTransferString(utils.FormatDate, registerList[i].EndDate)
  558. v.ServicesName = servicesNameMap[registerList[i].ContractRegisterId]
  559. v.InvoicePaymentList = summaryMap[registerList[i].SummaryId]
  560. v.ContractType = registerList[i].ContractType
  561. v.ActualPayCompanies = registerList[i].ActualPayCompanies
  562. respList = append(respList, v)
  563. }
  564. }()
  565. // 开票到款金额合计(换算后)
  566. var invoiceTotal, paymentTotal, amountTotal float64
  567. wg.Add(1)
  568. go func() {
  569. defer wg.Done()
  570. if len(summaryIds) == 0 {
  571. return
  572. }
  573. amountTotalCond := `a.id IN ?`
  574. amountTotalPars := make([]interface{}, 0)
  575. amountTotalPars = append(amountTotalPars, summaryIds)
  576. invoiceSum, e := fms.GetContractSummaryInvoicePaymentAmountTotal(amountTotalCond, amountTotalPars, 1)
  577. if e != nil {
  578. totalErr = fmt.Errorf("获取汇总开票金额合计失败, Err: %s", e.Error())
  579. return
  580. }
  581. invoiceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceSum), 64)
  582. paymentSum, e := fms.GetContractSummaryInvoicePaymentAmountTotal(amountTotalCond, amountTotalPars, 2)
  583. if e != nil {
  584. totalErr = fmt.Errorf("获取汇总到款金额合计失败, Err: %s", e.Error())
  585. return
  586. }
  587. paymentTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", paymentSum), 64)
  588. amountCond := `a.id IN ? AND (a.invoice_id <> 0 OR (a.payment_id <> 0 AND a.invoice_id =0))`
  589. amountPars := make([]interface{}, 0)
  590. amountPars = append(amountPars, summaryIds)
  591. amountSum, e := fms.GetContractSummaryInvoicePaymentAmount(amountCond, amountPars)
  592. if e != nil {
  593. totalErr = fmt.Errorf("获取汇总金额合计失败, Err: %s", e.Error())
  594. return
  595. }
  596. amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
  597. }()
  598. // 分币种金额统计
  599. invoiceCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  600. paymentCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  601. wg.Add(1)
  602. go func() {
  603. defer wg.Done()
  604. currencyOB := new(fms.CurrencyUnit)
  605. currencyCond := `enable = 1`
  606. currencyPars := make([]interface{}, 0)
  607. currencyList, e := currencyOB.List(currencyCond, currencyPars)
  608. if e != nil {
  609. totalGroupErr = fmt.Errorf("获取货币列表失败, Err: %s", e.Error())
  610. return
  611. }
  612. //unitMap := make(map[string]string)
  613. for i := range currencyList {
  614. //unitMap[currencyList[i].Code] = currencyList[i].UnitName
  615. invoiceCurrencyTotals = append(invoiceCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  616. Name: currencyList[i].Name,
  617. UnitName: currencyList[i].UnitName,
  618. Code: currencyList[i].Code,
  619. FlagImg: currencyList[i].FlagImg,
  620. })
  621. paymentCurrencyTotals = append(paymentCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  622. Name: currencyList[i].Name,
  623. UnitName: currencyList[i].UnitName,
  624. Code: currencyList[i].Code,
  625. FlagImg: currencyList[i].FlagImg,
  626. })
  627. }
  628. if len(summaryIds) == 0 {
  629. return
  630. }
  631. totalGroupCond := `a.id IN ?`
  632. totalGroupPars := make([]interface{}, 0)
  633. totalGroupPars = append(totalGroupPars, summaryIds)
  634. invoiceSumGroup, e := fms.GetSummaryListCurrencySum(totalGroupCond, totalGroupPars, 1)
  635. if e != nil {
  636. totalGroupErr = fmt.Errorf("获取汇总货币合计开票金额失败, Err: %s", e.Error())
  637. return
  638. }
  639. paymentSumGroup, e := fms.GetSummaryListCurrencySum(totalGroupCond, totalGroupPars, 2)
  640. if e != nil {
  641. totalGroupErr = fmt.Errorf("获取汇总货币合计到款金额失败, Err: %s", e.Error())
  642. return
  643. }
  644. invoiceSumMap := make(map[string]float64)
  645. paymentSumMap := make(map[string]float64)
  646. for i := range invoiceSumGroup {
  647. invoiceSumMap[invoiceSumGroup[i].CurrencyUnit] = invoiceSumGroup[i].OriginAmountTotal
  648. continue
  649. }
  650. for i := range paymentSumGroup {
  651. paymentSumMap[paymentSumGroup[i].CurrencyUnit] = paymentSumGroup[i].OriginAmountTotal
  652. continue
  653. }
  654. for i := range invoiceCurrencyTotals {
  655. a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceSumMap[invoiceCurrencyTotals[i].Code]), 64)
  656. invoiceCurrencyTotals[i].Amount = a
  657. }
  658. for i := range paymentCurrencyTotals {
  659. a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", paymentSumMap[paymentCurrencyTotals[i].Code]), 64)
  660. paymentCurrencyTotals[i].Amount = a
  661. }
  662. }()
  663. wg.Wait()
  664. if listErr != nil {
  665. resp.FailMsg("获取失败", listErr.Error(), c)
  666. return
  667. }
  668. if totalErr != nil {
  669. resp.FailMsg("获取失败", totalErr.Error(), c)
  670. return
  671. }
  672. if totalGroupErr != nil {
  673. resp.FailMsg("获取失败", totalGroupErr.Error(), c)
  674. return
  675. }
  676. results.DataList = respList
  677. results.InvoiceTotal = invoiceTotal
  678. results.PaymentTotal = paymentTotal
  679. results.AmountTotal = amountTotal
  680. results.InvoiceCurrencyTotal = invoiceCurrencyTotals
  681. results.PaymentCurrencyTotal = paymentCurrencyTotals
  682. }
  683. // 是否导出
  684. if req.IsExport == 1 {
  685. ExportInvoicePaymentCensusList(c, results)
  686. return
  687. }
  688. page.SetTotal(total)
  689. baseData := new(base.BaseData)
  690. baseData.SetPage(page)
  691. baseData.SetList(results)
  692. resp.OkData("获取成功", baseData, c)
  693. }
  694. // List
  695. // @Title 未开票统计列表
  696. // @Description 未开票统计列表
  697. // @Param Keyword query string false "关键词"
  698. // @Param SellGroupId query int false "销售组别ID"
  699. // @Param ServiceType query int false "套餐类型"
  700. // @Param StartDate query string false "合同开始日期"
  701. // @Param EndDate query string false "合同结束日期"
  702. // @Param TimeType query int false "时间类型: 1-开票时间; 2-到款时间"
  703. // @Param HasInvoice query string false "是否已开票: 0-否; 1-是; 空-全部"
  704. // @Param HasPayment query string false "是否已到款: 0-否; 1-是; 空-全部"
  705. // @Param IsExport query int false "是否导出: 0-否; 1-是"
  706. // @Param ListParam query int false "套餐类型: 0-全部; 1-ficc; 2-权益"
  707. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'start_date':开票日 、 'end_date':到款日"
  708. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  709. // @Success 200 {object} fms.ContractRegisterItem
  710. // @router /census/invoice_payment/not_invoice/list [get]
  711. func (ct *InvoicePaymentController) NotInvoiceList(c *gin.Context) {
  712. var req fms.InvoicePaymentCensusListReq
  713. if e := c.BindQuery(&req); e != nil {
  714. err, ok := e.(validator.ValidationErrors)
  715. if !ok {
  716. resp.FailData("参数解析失败", "Err:"+e.Error(), c)
  717. return
  718. }
  719. resp.FailData("参数解析失败", err.Translate(global.Trans), c)
  720. return
  721. }
  722. cond := `1 = 1`
  723. pars := make([]interface{}, 0)
  724. noSummaryCond := `1 = 1`
  725. noSummaryPars := make([]interface{}, 0)
  726. // 客户姓名/合同编号
  727. if req.Keyword != "" {
  728. kw := "%" + req.Keyword + "%"
  729. cond += ` AND (b.company_name LIKE ? OR b.contract_code LIKE ?)`
  730. pars = append(pars, kw, kw)
  731. noSummaryCond += ` AND (b.company_name LIKE ? OR b.contract_code LIKE ?)`
  732. noSummaryPars = append(noSummaryPars, kw, kw)
  733. }
  734. if req.SellerIds != "" {
  735. sellerIds := strings.Split(req.SellerIds, ",")
  736. cond += ` AND (b.seller_id in ? OR b.rai_seller_id in ?)`
  737. pars = append(pars, sellerIds, sellerIds)
  738. noSummaryCond += ` AND (b.seller_id in ? OR b.rai_seller_id in ?)`
  739. noSummaryPars = append(noSummaryPars, sellerIds, sellerIds)
  740. }
  741. // 套餐筛选
  742. if req.ServiceTypes != "" {
  743. serviceTypes := strings.Split(req.ServiceTypes, ",")
  744. tempRegisterIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
  745. if e != nil {
  746. resp.FailMsg("获取失败", "获取合同登记IDs失败, Err: "+e.Error(), c)
  747. return
  748. }
  749. if len(tempRegisterIds) > 0 {
  750. cond += ` AND a.register_id IN ?`
  751. pars = append(pars, tempRegisterIds)
  752. noSummaryCond += ` AND b.register_id IN ? `
  753. noSummaryPars = append(noSummaryPars, tempRegisterIds)
  754. } else {
  755. cond += ` AND 1 = 2`
  756. noSummaryCond += ` AND 1 = 2`
  757. }
  758. }
  759. if req.ListParam == 1 {
  760. cond += ` AND a.service_product_id = 1 `
  761. noSummaryCond += ` AND b.product_ids = '1' `
  762. } else if req.ListParam == 2 {
  763. cond += ` AND a.service_product_id = 2 `
  764. noSummaryCond += ` AND b.product_ids = '2' `
  765. }
  766. page := new(base.Page)
  767. page.SetPageSize(req.PageSize)
  768. page.SetCurrent(req.Current)
  769. // 排序
  770. if req.SortType == "" {
  771. req.SortType = "asc"
  772. }
  773. if req.SortType != "desc" && req.SortType != "asc" {
  774. resp.Fail("排序类型不正确", c)
  775. return
  776. }
  777. if req.SortParam == "" {
  778. page.AddOrderItem(base.OrderItem{Column: "e.start_date", Asc: true})
  779. } else if req.SortParam == "start_date" {
  780. if req.SortType == "asc" {
  781. page.AddOrderItem(base.OrderItem{Column: "e.start_date", Asc: true})
  782. } else {
  783. page.AddOrderItem(base.OrderItem{Column: "e.start_date", Asc: false})
  784. }
  785. } else if req.SortParam == "end_date" {
  786. if req.SortType == "asc" {
  787. page.AddOrderItem(base.OrderItem{Column: "e.end_date", Asc: true})
  788. } else {
  789. page.AddOrderItem(base.OrderItem{Column: "e.end_date", Asc: false})
  790. }
  791. } else {
  792. resp.Fail("排序字段不正确", c)
  793. return
  794. }
  795. if req.IsExport == 1 {
  796. page.SetPageSize(10000)
  797. page.SetCurrent(1)
  798. }
  799. // 先拿到在筛选范围内的合同列表
  800. cond += ` AND b.contract_amount <> b.invoiced_amount AND b.is_deleted = 0 AND b.contract_amount <> b.payment_amount AND b.contract_status <> 4 `
  801. registerList, total, e := fms.GetInvoiceCensusPageList(page, cond, pars)
  802. if e != nil {
  803. resp.FailMsg("获取失败", "获取商品到款统计列表总数失败, Err: "+e.Error(), c)
  804. return
  805. }
  806. queryRegisterIds := make([]int, 0)
  807. for _, v := range registerList {
  808. queryRegisterIds = append(queryRegisterIds, v.ContractRegisterId)
  809. }
  810. fmt.Println("queryRegisterIds:", queryRegisterIds)
  811. results := new(fms.NotInvoicePaymentCensusResp)
  812. if len(queryRegisterIds) > 0 {
  813. // 获取合同的套餐金额信息
  814. serviceAmountList, e := fms.GetContractServiceAmountByContractRegisterIds(queryRegisterIds)
  815. if e != nil {
  816. resp.FailData("获取合同的套餐金额信息失败", "Err:"+e.Error(), c)
  817. return
  818. }
  819. serviceAmountMap := make(map[int]map[int]*fms.ContractServiceAmount, 0)
  820. for _, v := range serviceAmountList {
  821. if _, ok := serviceAmountMap[v.ContractRegisterId]; !ok {
  822. serviceAmountMap[v.ContractRegisterId] = make(map[int]*fms.ContractServiceAmount)
  823. }
  824. serviceAmountMap[v.ContractRegisterId][v.ProductId] = v
  825. }
  826. var listErr, totalErr, totalGroupErr error
  827. wg := sync.WaitGroup{}
  828. // 响应列表
  829. respList := make([]*fms.NotPaymentCensusItem, 0)
  830. summaryList := make([]*fms.NotInvoicePaymentSummaryItem, 0)
  831. wg.Add(1)
  832. go func() {
  833. defer wg.Done()
  834. // 获取汇总数据
  835. // 这里只能获取到有开票到款过的记录
  836. summaryCond := cond
  837. summaryCond += ` AND a.register_id IN ?`
  838. summaryPars := pars
  839. summaryPars = append(summaryPars, queryRegisterIds)
  840. summaryData, e := fms.GetNotInvoicePaymentCensusSummaryData(summaryCond, summaryPars)
  841. if e != nil {
  842. resp.FailMsg("获取失败", "获取商品到款汇总列表失败, Err: "+e.Error(), c)
  843. return
  844. }
  845. //fmt.Println("len(summaryData)", len(summaryData))
  846. // 有过开票到款记录的合同ids,在后面的查询中去除
  847. notQueryRegisterIds := make([]int, 0)
  848. for _, v := range summaryData {
  849. notQueryRegisterIds = append(notQueryRegisterIds, v.ContractRegisterId)
  850. }
  851. summaryList = summaryData
  852. // 有开票到款过的记录map,用于在后面判断是否有过开票到款,然后补充数据
  853. NotInvoiceSummaryMap := make(map[int][]*fms.NotInvoicePaymentSummaryItem, 0)
  854. for _, v := range summaryList {
  855. // fmt.Println("v2.ContractRegisterId", v.ContractRegisterId)
  856. NotInvoiceSummaryMap[v.RegisterId] = append(NotInvoiceSummaryMap[v.RegisterId], v)
  857. }
  858. // 获取未进行过开票到款的合同数据,其实只用到了合同id和ProductIds用来补充不同的套餐信息
  859. noSummaryCond += ` AND b.is_deleted = 0 AND b.contract_status <> 4 `
  860. if len(notQueryRegisterIds) > 0 {
  861. noSummaryCond += ` AND b.contract_register_id IN ? AND b.contract_register_id NOT IN ?`
  862. noSummaryPars = append(noSummaryPars, queryRegisterIds, notQueryRegisterIds)
  863. } else {
  864. noSummaryCond += ` AND b.contract_register_id IN ? `
  865. noSummaryPars = append(noSummaryPars, queryRegisterIds)
  866. }
  867. noSummaryData, e := fms.GetNoInvoicePaymentCensusData(noSummaryCond, noSummaryPars)
  868. if e != nil {
  869. resp.FailMsg("获取失败", "GetNoInvoicePaymentCensusData, Err: "+e.Error(), c)
  870. return
  871. }
  872. //fmt.Println("len(noSummaryData)", len(noSummaryData))
  873. // 补充为完整的list,包含有汇总记录的和没有汇总记录的
  874. summaryList = append(summaryList, noSummaryData...)
  875. //fmt.Println("len(NotInvoiceSummaryMap):", len(NotInvoiceSummaryMap))
  876. // 遍历列表,补充数据
  877. for _, v := range summaryList {
  878. // fmt.Println("ProductIds:", v.ProductIds)
  879. // fmt.Println("ContractRegisterId:", v.ContractRegisterId)
  880. // fmt.Println("ServiceProductId:", v.ServiceProductId)
  881. // fmt.Println("RegisterId:", v.RegisterId)
  882. fmt.Println("len(NotInvoiceSummaryMap[v.RegisterId]):", len(NotInvoiceSummaryMap[v.ContractRegisterId]))
  883. if (v.ProductIds == "1,2" || v.ProductIds == "2,1") && len(NotInvoiceSummaryMap[v.ContractRegisterId]) == 1 {
  884. // 套餐是ficc权益都有的,但是只有一个套餐有过开票到款,手动补充另一个套餐的信息
  885. if v.ServiceProductId == 1 {
  886. if serviceAmount, ok := serviceAmountMap[v.ContractRegisterId]; ok {
  887. item := fms.NotInvoicePaymentSummaryItem{
  888. NotInvoicedAmountOriginTotal: serviceAmount[2].ServiceAmount,
  889. ServiceProductId: 2,
  890. }
  891. item.SellerId = v.SellerId
  892. item.SellerName = v.SellerName
  893. item.RaiSellerId = v.RaiSellerId
  894. item.RaiSellerName = v.RaiSellerName
  895. item.RMBRate = v.RMBRate
  896. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item)
  897. }
  898. } else {
  899. if serviceAmount, ok := serviceAmountMap[v.ContractRegisterId]; ok {
  900. item := fms.NotInvoicePaymentSummaryItem{
  901. NotInvoicedAmountOriginTotal: serviceAmount[1].ServiceAmount,
  902. ServiceProductId: 1,
  903. }
  904. item.SellerId = v.SellerId
  905. item.SellerName = v.SellerName
  906. item.RaiSellerId = v.RaiSellerId
  907. item.RaiSellerName = v.RaiSellerName
  908. item.RMBRate = v.RMBRate
  909. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item)
  910. }
  911. }
  912. } else if (v.ProductIds == "1,2" || v.ProductIds == "2,1") && len(NotInvoiceSummaryMap[v.ContractRegisterId]) == 0 {
  913. // 套餐是ficc权益都有的,但是都没进行过开票到款,补充两个套餐的内容,直接用合同金额当作未开票金额即可
  914. if serviceAmount, ok := serviceAmountMap[v.ContractRegisterId]; ok {
  915. item1 := fms.NotInvoicePaymentSummaryItem{
  916. NotInvoicedAmountOriginTotal: serviceAmount[2].ServiceAmount,
  917. ServiceProductId: 2,
  918. }
  919. item1.SellerId = v.SellerId
  920. item1.SellerName = v.SellerName
  921. item1.RaiSellerId = v.RaiSellerId
  922. item1.RaiSellerName = v.RaiSellerName
  923. item1.RMBRate = v.RMBRate
  924. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item1)
  925. item2 := fms.NotInvoicePaymentSummaryItem{
  926. NotInvoicedAmountOriginTotal: serviceAmount[1].ServiceAmount,
  927. ServiceProductId: 1,
  928. }
  929. item2.SellerId = v.SellerId
  930. item2.SellerName = v.SellerName
  931. item2.RaiSellerId = v.RaiSellerId
  932. item2.RaiSellerName = v.RaiSellerName
  933. item2.RMBRate = v.RMBRate
  934. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item2)
  935. }
  936. } else if v.ProductIds == "1" && len(NotInvoiceSummaryMap[v.ContractRegisterId]) == 0 {
  937. // 只有ficc套餐,但是未进行过开票到款,手动补充信息
  938. if serviceAmount, ok := serviceAmountMap[v.ContractRegisterId]; ok {
  939. item1 := fms.NotInvoicePaymentSummaryItem{
  940. NotInvoicedAmountOriginTotal: serviceAmount[1].ServiceAmount,
  941. ServiceProductId: 1,
  942. }
  943. item1.SellerId = v.SellerId
  944. item1.SellerName = v.SellerName
  945. item1.RaiSellerId = v.RaiSellerId
  946. item1.RaiSellerName = v.RaiSellerName
  947. item1.RMBRate = v.RMBRate
  948. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item1)
  949. }
  950. } else if v.ProductIds == "2" && len(NotInvoiceSummaryMap[v.ContractRegisterId]) == 0 {
  951. // 只有权益套餐,但是未进行过开票到款,手动补充信息
  952. if serviceAmount, ok := serviceAmountMap[v.ContractRegisterId]; ok {
  953. item2 := fms.NotInvoicePaymentSummaryItem{
  954. NotInvoicedAmountOriginTotal: serviceAmount[2].ServiceAmount,
  955. ServiceProductId: 2,
  956. }
  957. item2.SellerId = v.SellerId
  958. item2.SellerName = v.SellerName
  959. item2.RaiSellerId = v.RaiSellerId
  960. item2.RaiSellerName = v.RaiSellerName
  961. item2.RMBRate = v.RMBRate
  962. NotInvoiceSummaryMap[v.ContractRegisterId] = append(NotInvoiceSummaryMap[v.ContractRegisterId], &item2)
  963. }
  964. }
  965. }
  966. // 重组汇总数据
  967. sellerList, e := crmService.GetSellerDepartmentListWithEnable()
  968. if e != nil {
  969. resp.FailData("获取销售失败", "Err:"+e.Error(), c)
  970. return
  971. }
  972. sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
  973. for i := range sellerList {
  974. sellerMap[sellerList[i].SellerId] = sellerList[i]
  975. }
  976. sellerTypeMap := map[int]string{2: "FICC销售", 5: "权益销售"}
  977. // 货币列表
  978. currencyOB := new(fms.CurrencyUnit)
  979. currencyCond := `enable = 1`
  980. currencyPars := make([]interface{}, 0)
  981. currencyList, e := currencyOB.List(currencyCond, currencyPars)
  982. if e != nil {
  983. resp.FailMsg("获取失败", "获取货币列表失败, Err: "+e.Error(), c)
  984. return
  985. }
  986. unitMap := make(map[string]string)
  987. for i := range currencyList {
  988. unitMap[currencyList[i].Code] = currencyList[i].UnitName
  989. }
  990. for registerId, list := range NotInvoiceSummaryMap {
  991. for i, v := range list {
  992. // fmt.Println("v.ContractRegisterId", v.ContractRegisterId)
  993. // fmt.Println("v.ServiceProductId:", v.ServiceProductId)
  994. // fmt.Println("v.NotInvoicedAmountTotal:", v.NotInvoicedAmountTotal)
  995. // fmt.Println("registerId:",registerId)
  996. if v.NotInvoicedAmountOriginTotal == 0 {
  997. if v.InvoiceAmountTotal > v.PaymentAmountTotal {
  998. // 有合规登记或补录合同过的,有serviceAmountMap信息
  999. if _, ok := serviceAmountMap[registerId]; ok {
  1000. if _, ok2 := serviceAmountMap[registerId][v.ServiceProductId]; ok2 {
  1001. list[i].NotInvoicedAmountOriginTotal = serviceAmountMap[registerId][v.ServiceProductId].ServiceAmount - v.InvoiceAmountTotal
  1002. }
  1003. } else {
  1004. // 预登记没有合同套餐金额信息
  1005. list[i].NotInvoicedAmountOriginTotal = v.InvoiceAmountTotal - v.PaymentAmountTotal
  1006. }
  1007. } else {
  1008. if _, ok := serviceAmountMap[registerId]; ok {
  1009. // 有合规登记或补录合同过的,有serviceAmountMap信息
  1010. if _, ok2 := serviceAmountMap[registerId][v.ServiceProductId]; ok2 {
  1011. list[i].NotInvoicedAmountOriginTotal = serviceAmountMap[registerId][v.ServiceProductId].ServiceAmount - v.PaymentAmountTotal
  1012. }
  1013. } else {
  1014. // 预登记没有合同套餐金额信息
  1015. list[i].NotInvoicedAmountOriginTotal = v.PaymentAmountTotal - v.InvoiceAmountTotal
  1016. }
  1017. }
  1018. } else {
  1019. list[i].NotInvoicedAmountOriginTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", list[i].NotInvoicedAmountOriginTotal), 64)
  1020. }
  1021. list[i].NotInvoicedAmountOriginTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", list[i].NotInvoicedAmountOriginTotal), 64)
  1022. list[i].NotInvoicedAmountTotal = v.NotInvoicedAmountOriginTotal / v.RMBRate
  1023. list[i].NotInvoicedAmountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.NotInvoicedAmountTotal), 64)
  1024. // 补充销售信息
  1025. if v.SellerId > 0 && v.RaiSellerId > 0 {
  1026. if v.ServiceProductId == 1 {
  1027. if seller, ok := sellerMap[v.SellerId]; ok {
  1028. v.SellerType = sellerTypeMap[seller.DepartmentId]
  1029. v.SellerGroupId = seller.GroupId
  1030. v.SellerGroupName = seller.GroupName
  1031. }
  1032. } else {
  1033. if seller, ok := sellerMap[v.RaiSellerId]; ok {
  1034. v.SellerType = sellerTypeMap[seller.DepartmentId]
  1035. v.RaiSellerGroupId = seller.GroupId
  1036. v.RaiSellerGroupName = seller.GroupName
  1037. }
  1038. }
  1039. } else if v.SellerId > 0 && v.RaiSellerId == 0 {
  1040. if seller, ok := sellerMap[v.SellerId]; ok {
  1041. v.SellerType = sellerTypeMap[seller.DepartmentId]
  1042. v.SellerGroupId = seller.GroupId
  1043. v.SellerGroupName = seller.GroupName
  1044. }
  1045. } else if v.SellerId == 0 && v.RaiSellerId > 0 {
  1046. if seller, ok := sellerMap[v.RaiSellerId]; ok {
  1047. v.SellerType = sellerTypeMap[seller.DepartmentId]
  1048. v.RaiSellerGroupId = seller.GroupId
  1049. v.RaiSellerGroupName = seller.GroupName
  1050. }
  1051. }
  1052. }
  1053. }
  1054. // 响应列表
  1055. for i := range registerList {
  1056. v := new(fms.NotPaymentCensusItem)
  1057. v.SummaryId = registerList[i].SummaryId
  1058. v.ContractRegisterId = registerList[i].ContractRegisterId
  1059. v.CompanyName = registerList[i].CompanyName
  1060. v.NewCompany = registerList[i].NewCompany
  1061. v.StartDate = utils.TimeTransferString(utils.FormatDate, registerList[i].StartDate)
  1062. v.EndDate = utils.TimeTransferString(utils.FormatDate, registerList[i].EndDate)
  1063. v.ContractType = registerList[i].ContractType
  1064. v.ContractCode = registerList[i].ContractCode
  1065. v.ContractAmount = registerList[i].ContractAmount
  1066. v.UnitName = unitMap[registerList[i].CurrencyUnit]
  1067. v.ProductIds = registerList[i].ProductIds
  1068. //if registerList[i].InvoicedAmount != 0 {
  1069. // v.NotInvoiceTotal = registerList[i].ContractAmount - registerList[i].InvoicedAmount
  1070. //} else {
  1071. // v.NotInvoiceTotal = registerList[i].ContractAmount - registerList[i].PaymentAmount
  1072. //}
  1073. v.NotInvoiceList = NotInvoiceSummaryMap[registerList[i].ContractRegisterId]
  1074. respList = append(respList, v)
  1075. }
  1076. }()
  1077. // 开票到款金额合计(换算后)V2
  1078. var invoiceTotal, contractAmount float64
  1079. wg.Add(1)
  1080. go func() {
  1081. defer wg.Done()
  1082. registerList, e := fms.GetInvoiceCensusList(cond, pars)
  1083. if e != nil {
  1084. resp.FailMsg("获取失败", "获取商品到款统计列表总数失败, Err: "+e.Error(), c)
  1085. return
  1086. }
  1087. contractIdSumMap := make(map[int]int)
  1088. for _, v := range registerList {
  1089. if v.InvoicedAmount >= v.PaymentAmount {
  1090. invoiceTotal += v.InvoicedAmount
  1091. } else if v.InvoicedAmount == 0 {
  1092. invoiceTotal += v.PaymentAmount
  1093. }
  1094. rate := v.RMBRate
  1095. if rate == 0.0 {
  1096. rate = 1.0
  1097. }
  1098. if _, ok := contractIdSumMap[v.ContractRegisterId]; !ok {
  1099. contractIdSumMap[v.ContractRegisterId] = 1
  1100. contractAmount += v.ContractAmount / rate
  1101. }
  1102. }
  1103. }()
  1104. // 分币种金额统计
  1105. invoiceCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1106. paymentCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1107. contractAmountCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1108. wg.Add(1)
  1109. go func() {
  1110. defer wg.Done()
  1111. currencyOB := new(fms.CurrencyUnit)
  1112. currencyCond := `enable = 1`
  1113. currencyPars := make([]interface{}, 0)
  1114. currencyList, e := currencyOB.List(currencyCond, currencyPars)
  1115. if e != nil {
  1116. totalGroupErr = fmt.Errorf("获取货币列表失败, Err: %s", e.Error())
  1117. return
  1118. }
  1119. unitMap := make(map[string]string)
  1120. for i := range currencyList {
  1121. unitMap[currencyList[i].Code] = currencyList[i].UnitName
  1122. invoiceCurrencyTotals = append(invoiceCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1123. Name: currencyList[i].Name,
  1124. UnitName: currencyList[i].UnitName,
  1125. Code: currencyList[i].Code,
  1126. FlagImg: currencyList[i].FlagImg,
  1127. })
  1128. paymentCurrencyTotals = append(paymentCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1129. Name: currencyList[i].Name,
  1130. UnitName: currencyList[i].UnitName,
  1131. Code: currencyList[i].Code,
  1132. FlagImg: currencyList[i].FlagImg,
  1133. })
  1134. contractAmountCurrencyTotals = append(contractAmountCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1135. Name: currencyList[i].Name,
  1136. UnitName: currencyList[i].UnitName,
  1137. Code: currencyList[i].Code,
  1138. FlagImg: currencyList[i].FlagImg,
  1139. })
  1140. }
  1141. registerList, e := fms.GetInvoiceCensusList(cond, pars)
  1142. if e != nil {
  1143. resp.FailMsg("获取失败", "获取商品到款统计列表总数失败, Err: "+e.Error(), c)
  1144. return
  1145. }
  1146. invoiceSumMap := make(map[string]float64)
  1147. contractSumMap := make(map[string]float64)
  1148. contractIdSumMap := make(map[int]int)
  1149. for _, v := range registerList {
  1150. if v.InvoiceOrigin >= v.PaymentOrigin {
  1151. invoiceSumMap[v.CurrencyUnit] += v.InvoicedAmount
  1152. } else {
  1153. invoiceSumMap[v.CurrencyUnit] += v.PaymentAmount
  1154. }
  1155. if _, ok := contractIdSumMap[v.ContractRegisterId]; !ok {
  1156. contractIdSumMap[v.ContractRegisterId] = 1
  1157. contractSumMap[v.CurrencyUnit] += v.ContractAmount
  1158. }
  1159. }
  1160. for _, v := range contractAmountCurrencyTotals {
  1161. v.Amount = contractSumMap[v.Code] - invoiceSumMap[v.Code]
  1162. v.Amount, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.Amount), 64)
  1163. }
  1164. }()
  1165. wg.Wait()
  1166. if listErr != nil {
  1167. resp.FailMsg("获取失败", listErr.Error(), c)
  1168. return
  1169. }
  1170. if totalErr != nil {
  1171. resp.FailMsg("获取失败", totalErr.Error(), c)
  1172. return
  1173. }
  1174. if totalGroupErr != nil {
  1175. resp.FailMsg("获取失败", totalGroupErr.Error(), c)
  1176. return
  1177. }
  1178. results.DataList = respList
  1179. results.InvoiceTotal = invoiceTotal
  1180. results.NotInvoiceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", contractAmount-invoiceTotal), 64)
  1181. results.InvoiceCurrencyTotal = invoiceCurrencyTotals
  1182. results.PaymentCurrencyTotal = paymentCurrencyTotals
  1183. results.NotInvoiceCurrencyTotal = contractAmountCurrencyTotals
  1184. fmt.Println("NotInvoiceTotal:", contractAmount-invoiceTotal)
  1185. fmt.Println("contractAmount:", contractAmount)
  1186. fmt.Println("invoiceTotal:", invoiceTotal)
  1187. }
  1188. // 是否导出
  1189. if req.IsExport == 1 {
  1190. ExportNotInvoiceCensusList(c, results)
  1191. return
  1192. }
  1193. page.SetTotal(total)
  1194. baseData := new(base.BaseData)
  1195. baseData.SetPage(page)
  1196. baseData.SetList(results)
  1197. resp.OkData("获取成功", baseData, c)
  1198. }
  1199. // List
  1200. // @Title 开票未到款统计列表
  1201. // @Description 开票未到款统计列表
  1202. // @Param Keyword query string false "关键词"
  1203. // @Param SellGroupId query int false "销售组别ID"
  1204. // @Param ServiceType query int false "套餐类型"
  1205. // @Param StartDate query string false "合同开始日期"
  1206. // @Param EndDate query string false "合同结束日期"
  1207. // @Param TimeType query int false "时间类型: 1-开票时间; 2-到款时间"
  1208. // @Param HasInvoice query string false "是否已开票: 0-否; 1-是; 空-全部"
  1209. // @Param HasPayment query string false "是否已到款: 0-否; 1-是; 空-全部"
  1210. // @Param IsExport query int false "是否导出: 0-否; 1-是"
  1211. // @Param ListParam query int false "套餐类型: 0-全部; 1-ficc; 2-权益"
  1212. // @Param SortParam query string false "排序字段参数,用来排序的字段, 枚举值:'invoice_time':开票日 、 'payment_date':到款日"
  1213. // @Param SortType query string true "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
  1214. // @Success 200 {object} fms.ContractRegisterItem
  1215. // @router /census/invoice_payment/not_payment/list [get]
  1216. func (ct *InvoicePaymentController) NotPaymentList(c *gin.Context) {
  1217. var req fms.InvoicePaymentCensusListReq
  1218. if e := c.BindQuery(&req); e != nil {
  1219. err, ok := e.(validator.ValidationErrors)
  1220. if !ok {
  1221. resp.FailData("参数解析失败", "Err:"+e.Error(), c)
  1222. return
  1223. }
  1224. resp.FailData("参数解析失败", err.Translate(global.Trans), c)
  1225. return
  1226. }
  1227. cond := `1 = 1`
  1228. pars := make([]interface{}, 0)
  1229. // 客户姓名/销售
  1230. if req.Keyword != "" {
  1231. kw := "%" + req.Keyword + "%"
  1232. cond += ` AND (b.company_name LIKE ? OR b.contract_code LIKE ?)`
  1233. pars = append(pars, kw, kw)
  1234. }
  1235. if req.SellerIds != "" {
  1236. sellerIds := strings.Split(req.SellerIds, ",")
  1237. cond += ` AND (c.seller_id in ?)`
  1238. pars = append(pars, sellerIds)
  1239. }
  1240. // 套餐筛选
  1241. if req.ServiceTypes != "" {
  1242. serviceTypes := strings.Split(req.ServiceTypes, ",")
  1243. tempRegisterIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
  1244. if e != nil {
  1245. resp.FailMsg("获取失败", "获取合同登记IDs失败, Err: "+e.Error(), c)
  1246. return
  1247. }
  1248. if len(tempRegisterIds) > 0 {
  1249. cond += ` AND a.register_id IN ?`
  1250. pars = append(pars, tempRegisterIds)
  1251. } else {
  1252. cond += ` AND 1 = 2`
  1253. }
  1254. }
  1255. if req.ListParam == 1 {
  1256. cond += ` AND a.service_product_id = 1 `
  1257. } else if req.ListParam == 2 {
  1258. cond += ` AND a.service_product_id = 2 `
  1259. }
  1260. page := new(base.Page)
  1261. page.SetPageSize(req.PageSize)
  1262. page.SetCurrent(req.Current)
  1263. // 排序
  1264. if req.SortType == "" {
  1265. req.SortType = "asc"
  1266. }
  1267. if req.SortType != "desc" && req.SortType != "asc" {
  1268. resp.Fail("排序类型不正确", c)
  1269. return
  1270. }
  1271. if req.SortType == "asc" {
  1272. page.AddOrderItem(base.OrderItem{Column: "e.invoice_time", Asc: true})
  1273. page.AddOrderItem(base.OrderItem{Column: "e.modify_time", Asc: false})
  1274. } else {
  1275. page.AddOrderItem(base.OrderItem{Column: "e.invoice_time", Asc: false})
  1276. page.AddOrderItem(base.OrderItem{Column: "e.modify_time", Asc: false})
  1277. }
  1278. if req.IsExport == 1 {
  1279. page.SetPageSize(10000)
  1280. page.SetCurrent(1)
  1281. }
  1282. cond += ` AND b.payment_amount <> b.invoiced_amount AND b.is_deleted = 0 AND b.contract_status <> 4 `
  1283. registerList, total, e := fms.GetNoPaymentCensusPageList(page, cond, pars)
  1284. if e != nil {
  1285. resp.FailMsg("获取失败", "获取商品到款统计列表总数失败, Err: "+e.Error(), c)
  1286. return
  1287. }
  1288. queryRegisterIds := make([]int, 0)
  1289. for i := range registerList {
  1290. queryRegisterIds = append(queryRegisterIds, registerList[i].ContractRegisterId)
  1291. }
  1292. fmt.Println("queryRegisterIds:", queryRegisterIds)
  1293. // fmt.Println("queryRegisterIds:",queryRegisterIds)
  1294. results := new(fms.NotInvoicePaymentCensusResp)
  1295. if len(queryRegisterIds) > 0 {
  1296. // 获取汇总数据IDs, 用于查询合计数据
  1297. summaryIdsCond := cond
  1298. summaryIdsPars := pars
  1299. if req.SellerIds != "" {
  1300. sellerIds := strings.Split(req.SellerIds, ",")
  1301. summaryIdsCond += ` AND c.seller_id in ? AND a.invoice_id <> 0 AND (c.origin_amount > d.origin_amount OR d.origin_amount IS NULL) `
  1302. summaryIdsPars = append(summaryIdsPars, sellerIds)
  1303. } else {
  1304. summaryIdsCond += ` AND a.invoice_id <> 0 AND (c.origin_amount > d.origin_amount OR d.origin_amount IS NULL) `
  1305. summaryIdsPars = append(summaryIdsPars)
  1306. }
  1307. summaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(summaryIdsCond, summaryIdsPars)
  1308. if e != nil {
  1309. resp.FailMsg("获取失败", "获取商品到款汇总IDs失败, Err: "+e.Error(), c)
  1310. return
  1311. }
  1312. // fmt.Println("summaryIds:",summaryIds)
  1313. var listErr, totalErr, totalGroupErr error
  1314. wg := sync.WaitGroup{}
  1315. // 响应列表
  1316. respList := make([]*fms.NotPaymentCensusItem, 0)
  1317. summaryList := make([]*fms.InvoicePaymentSummaryItem, 0)
  1318. wg.Add(1)
  1319. go func() {
  1320. defer wg.Done()
  1321. // 获取汇总数据
  1322. summaryCond := cond
  1323. summaryCond += ` AND a.register_id IN ?`
  1324. summaryPars := pars
  1325. summaryPars = append(summaryPars, queryRegisterIds)
  1326. if req.SellerIds != "" {
  1327. sellerIds := strings.Split(req.SellerIds, ",")
  1328. summaryCond += ` AND c.seller_id in ? AND a.invoice_id <> 0 AND (c.origin_amount > d.origin_amount OR d.origin_amount IS NULL) `
  1329. summaryPars = append(summaryPars, sellerIds)
  1330. } else {
  1331. summaryCond += ` AND a.invoice_id <> 0 AND (c.origin_amount > d.origin_amount OR d.origin_amount IS NULL) `
  1332. summaryPars = append(summaryPars)
  1333. }
  1334. summaryData, e := fms.GetInvoicePaymentCensusSummaryData(summaryCond, summaryPars)
  1335. if e != nil {
  1336. resp.FailMsg("获取失败", "获取商品到款汇总列表失败, Err: "+e.Error(), c)
  1337. return
  1338. }
  1339. summaryList = summaryData
  1340. // summaryIds := make([]int, 0)
  1341. //
  1342. // for i := range summaryList {
  1343. // //summaryIds = append(summaryIds, summaryList[i].SummaryId)
  1344. //
  1345. // }
  1346. // 货币列表
  1347. currencyOB := new(fms.CurrencyUnit)
  1348. currencyCond := `enable = 1`
  1349. currencyPars := make([]interface{}, 0)
  1350. currencyList, e := currencyOB.List(currencyCond, currencyPars)
  1351. if e != nil {
  1352. resp.FailMsg("获取失败", "获取货币列表失败, Err: "+e.Error(), c)
  1353. return
  1354. }
  1355. unitMap := make(map[string]string)
  1356. for i := range currencyList {
  1357. unitMap[currencyList[i].Code] = currencyList[i].UnitName
  1358. }
  1359. sellerList, e := crmService.GetSellerDepartmentListWithEnable()
  1360. if e != nil {
  1361. resp.FailData("获取销售失败", "Err:"+e.Error(), c)
  1362. return
  1363. }
  1364. sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
  1365. for i := range sellerList {
  1366. sellerMap[sellerList[i].SellerId] = sellerList[i]
  1367. }
  1368. sellerTypeMap := map[int]int{crm.SellerDepartmentId: 1, crm.RaiSellerDepartmentId: 2}
  1369. // 重组汇总数据
  1370. summaryMap := make(map[int][]*fms.NotPaymentCensusInfo)
  1371. for i := range summaryList {
  1372. v := new(fms.NotPaymentCensusInfo)
  1373. v.InvoiceId = summaryList[i].InvoiceId
  1374. v.InvoiceDate = utils.TimeTransferString(utils.FormatDate, summaryList[i].InvoiceDate)
  1375. v.InvoiceAmount = summaryList[i].InvoiceAmount
  1376. v.InvoiceOriginAmount = summaryList[i].InvoiceOriginAmount
  1377. v.SellerId = summaryList[i].SellerId
  1378. v.SellerName = summaryList[i].SellerName
  1379. v.SellerGroupId = summaryList[i].SellerGroupId
  1380. v.SellerGroupName = summaryList[i].SellerGroupName
  1381. if seller, ok := sellerMap[summaryList[i].SellerId]; ok {
  1382. v.SellerType = sellerTypeMap[seller.DepartmentId]
  1383. }
  1384. v.PaymentId = summaryList[i].PaymentId
  1385. v.PaymentDate = utils.TimeTransferString(utils.FormatDate, summaryList[i].PaymentDate)
  1386. v.PaymentAmount = summaryList[i].PaymentAmount
  1387. v.PaymentOriginAmount = summaryList[i].PaymentOriginAmount
  1388. v.PayType = summaryList[i].PayType
  1389. v.NotPaymentOriginAmount = summaryList[i].InvoiceOriginAmount - summaryList[i].PaymentOriginAmount
  1390. v.NotPaymentAmount = summaryList[i].InvoiceAmount - summaryList[i].PaymentAmount
  1391. v.ServiceProductId = summaryList[i].ServiceProductId
  1392. v.UnitName = unitMap[summaryList[i].CurrencyUnit]
  1393. summaryMap[summaryList[i].SummaryId] = append(summaryMap[summaryList[i].SummaryId], v)
  1394. }
  1395. // 响应列表
  1396. for i := range registerList {
  1397. v := new(fms.NotPaymentCensusItem)
  1398. v.SummaryId = registerList[i].SummaryId
  1399. v.ContractRegisterId = registerList[i].ContractRegisterId
  1400. v.CompanyName = registerList[i].CompanyName
  1401. v.NewCompany = registerList[i].NewCompany
  1402. v.StartDate = utils.TimeTransferString(utils.FormatDate, registerList[i].StartDate)
  1403. v.EndDate = utils.TimeTransferString(utils.FormatDate, registerList[i].EndDate)
  1404. v.InvoicePaymentList = summaryMap[registerList[i].SummaryId]
  1405. v.ContractType = registerList[i].ContractType
  1406. v.ContractCode = registerList[i].ContractCode
  1407. v.ContractAmount = registerList[i].ContractAmount
  1408. v.UnitName = unitMap[registerList[i].CurrencyUnit]
  1409. v.ProductIds = registerList[i].ProductIds
  1410. v.NotInvoiceTotal = registerList[i].ContractAmount - registerList[i].InvoicedAmount
  1411. respList = append(respList, v)
  1412. }
  1413. }()
  1414. // 开票到款金额合计(换算后)
  1415. var invoiceTotal, paymentTotal float64
  1416. wg.Add(1)
  1417. go func() {
  1418. defer wg.Done()
  1419. if len(summaryIds) == 0 {
  1420. return
  1421. }
  1422. amountTotalCond := `a.id IN ?`
  1423. amountTotalPars := make([]interface{}, 0)
  1424. amountTotalPars = append(amountTotalPars, summaryIds)
  1425. invoiceSum, e := fms.GetContractSummaryInvoicePaymentAmountTotal(amountTotalCond, amountTotalPars, 1)
  1426. if e != nil {
  1427. totalErr = fmt.Errorf("获取汇总开票金额合计失败, Err: %s", e.Error())
  1428. return
  1429. }
  1430. invoiceTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceSum), 64)
  1431. paymentSum, e := fms.GetContractSummaryInvoicePaymentAmountTotal(amountTotalCond, amountTotalPars, 2)
  1432. if e != nil {
  1433. totalErr = fmt.Errorf("获取汇总到款金额合计失败, Err: %s", e.Error())
  1434. return
  1435. }
  1436. paymentTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", paymentSum), 64)
  1437. }()
  1438. // 分币种金额统计
  1439. invoiceCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1440. paymentCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1441. notpaymentCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1442. // contractAmountCurrencyTotals := make([]*fms.InvoiceListCurrencyTotal, 0)
  1443. wg.Add(1)
  1444. go func() {
  1445. defer wg.Done()
  1446. currencyOB := new(fms.CurrencyUnit)
  1447. currencyCond := `enable = 1`
  1448. currencyPars := make([]interface{}, 0)
  1449. currencyList, e := currencyOB.List(currencyCond, currencyPars)
  1450. if e != nil {
  1451. totalGroupErr = fmt.Errorf("获取货币列表失败, Err: %s", e.Error())
  1452. return
  1453. }
  1454. unitMap := make(map[string]string)
  1455. for i := range currencyList {
  1456. unitMap[currencyList[i].Code] = currencyList[i].UnitName
  1457. invoiceCurrencyTotals = append(invoiceCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1458. Name: currencyList[i].Name,
  1459. UnitName: currencyList[i].UnitName,
  1460. Code: currencyList[i].Code,
  1461. FlagImg: currencyList[i].FlagImg,
  1462. })
  1463. paymentCurrencyTotals = append(paymentCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1464. Name: currencyList[i].Name,
  1465. UnitName: currencyList[i].UnitName,
  1466. Code: currencyList[i].Code,
  1467. FlagImg: currencyList[i].FlagImg,
  1468. })
  1469. notpaymentCurrencyTotals = append(notpaymentCurrencyTotals, &fms.InvoiceListCurrencyTotal{
  1470. Name: currencyList[i].Name,
  1471. UnitName: currencyList[i].UnitName,
  1472. Code: currencyList[i].Code,
  1473. FlagImg: currencyList[i].FlagImg,
  1474. })
  1475. }
  1476. if len(summaryIds) == 0 {
  1477. return
  1478. }
  1479. totalGroupCond := `a.id IN ?`
  1480. totalGroupPars := make([]interface{}, 0)
  1481. totalGroupPars = append(totalGroupPars, summaryIds)
  1482. invoiceSumGroup, e := fms.GetSummaryListCurrencySum(totalGroupCond, totalGroupPars, 1)
  1483. if e != nil {
  1484. totalGroupErr = fmt.Errorf("获取汇总货币合计开票金额失败, Err: %s", e.Error())
  1485. return
  1486. }
  1487. paymentSumGroup, e := fms.GetSummaryListCurrencySum(totalGroupCond, totalGroupPars, 2)
  1488. if e != nil {
  1489. totalGroupErr = fmt.Errorf("获取汇总货币合计到款金额失败, Err: %s", e.Error())
  1490. return
  1491. }
  1492. invoiceSumMap := make(map[string]float64)
  1493. paymentSumMap := make(map[string]float64)
  1494. //contractSumMap := make(map[string]float64)
  1495. for i := range invoiceSumGroup {
  1496. invoiceSumMap[invoiceSumGroup[i].CurrencyUnit] = invoiceSumGroup[i].OriginAmountTotal
  1497. continue
  1498. }
  1499. for i := range paymentSumGroup {
  1500. paymentSumMap[paymentSumGroup[i].CurrencyUnit] = paymentSumGroup[i].OriginAmountTotal
  1501. continue
  1502. }
  1503. for i := range invoiceCurrencyTotals {
  1504. a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceSumMap[invoiceCurrencyTotals[i].Code]), 64)
  1505. invoiceCurrencyTotals[i].Amount = a
  1506. }
  1507. for i := range paymentCurrencyTotals {
  1508. a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", paymentSumMap[paymentCurrencyTotals[i].Code]), 64)
  1509. paymentCurrencyTotals[i].Amount = a
  1510. }
  1511. for i := range notpaymentCurrencyTotals {
  1512. a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceSumMap[invoiceCurrencyTotals[i].Code]-paymentSumMap[paymentCurrencyTotals[i].Code]), 64)
  1513. notpaymentCurrencyTotals[i].Amount = a
  1514. }
  1515. }()
  1516. wg.Wait()
  1517. if listErr != nil {
  1518. resp.FailMsg("获取失败", listErr.Error(), c)
  1519. return
  1520. }
  1521. if totalErr != nil {
  1522. resp.FailMsg("获取失败", totalErr.Error(), c)
  1523. return
  1524. }
  1525. if totalGroupErr != nil {
  1526. resp.FailMsg("获取失败", totalGroupErr.Error(), c)
  1527. return
  1528. }
  1529. results.DataList = respList
  1530. results.InvoiceTotal = invoiceTotal
  1531. results.PaymentTotal = paymentTotal
  1532. results.NotPaymentTotal = invoiceTotal - paymentTotal
  1533. results.NotPaymentCurrencyTotal = notpaymentCurrencyTotals
  1534. }
  1535. // 是否导出
  1536. if req.IsExport == 1 {
  1537. ExportNotPaymentCensusList(c, results)
  1538. return
  1539. }
  1540. page.SetTotal(total)
  1541. baseData := new(base.BaseData)
  1542. baseData.SetPage(page)
  1543. baseData.SetList(results)
  1544. resp.OkData("获取成功", baseData, c)
  1545. }
  1546. // ExportNotInvoiceCensusList 导出未开票统计列表
  1547. func ExportNotInvoiceCensusList(c *gin.Context, results *fms.NotInvoicePaymentCensusResp) {
  1548. list := results.DataList
  1549. if len(list) == 0 {
  1550. resp.Fail("列表数据为空", c)
  1551. return
  1552. }
  1553. // 生成Excel文件
  1554. xlsxFile := xlsx.NewFile()
  1555. style := xlsx.NewStyle()
  1556. alignment := xlsx.Alignment{
  1557. Horizontal: "center",
  1558. Vertical: "center",
  1559. WrapText: true,
  1560. }
  1561. style.Alignment = alignment
  1562. style.ApplyAlignment = true
  1563. sheetName := "未开票统计表"
  1564. sheet, err := xlsxFile.AddSheet(sheetName)
  1565. if err != nil {
  1566. resp.FailData("新增Sheet失败", "Err:"+err.Error(), c)
  1567. return
  1568. }
  1569. // 前三行-开票金额合计
  1570. rowA := sheet.AddRow()
  1571. cellAA := rowA.AddCell()
  1572. cellAA.SetString(fmt.Sprintf("未开票合计金额(换算后):%.2f(元)", results.NotInvoiceTotal))
  1573. rowBData := "未开票金额:"
  1574. for _, v := range results.NotInvoiceCurrencyTotal {
  1575. rowBData += fmt.Sprintf("%s%.2f(%s) ", v.Name, v.Amount, v.UnitName)
  1576. }
  1577. rowB := sheet.AddRow()
  1578. rowB.AddCell().SetString(rowBData)
  1579. sheet.AddRow()
  1580. // 数据表头
  1581. rowTitle := []string{"序号", "客户名称", "合同编号", "合同开始时间", "合同结束时间", "合同金额", "金额单位", "未开票金额", "未开票换算金额", "套餐类型", "销售", "销售组别", "销售类型"}
  1582. titleRow := sheet.AddRow()
  1583. for i := range rowTitle {
  1584. v := titleRow.AddCell()
  1585. v.SetString(rowTitle[i])
  1586. v.SetStyle(style)
  1587. }
  1588. incomeSummaryItemList := make([]*fms.NotPaymentCensusItem, 0)
  1589. incomeSummaryItemList = list
  1590. sellerList, e := crmService.GetSellerDepartmentListWithEnable()
  1591. if e != nil {
  1592. resp.FailData("获取销售失败", "Err:"+e.Error(), c)
  1593. return
  1594. }
  1595. sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
  1596. for i := range sellerList {
  1597. sellerMap[sellerList[i].SellerId] = sellerList[i]
  1598. }
  1599. sellerTypeMap := map[int]string{2: "FICC销售", 5: "权益销售"}
  1600. serviceProductIdMap := map[int]string{
  1601. 1: "FICC套餐",
  1602. 2: "权益套餐",
  1603. }
  1604. // 填充数据
  1605. for i, v := range incomeSummaryItemList {
  1606. dataRow := sheet.AddRow()
  1607. dataRow2 := sheet.AddRow()
  1608. cell := dataRow.AddCell()
  1609. cell.VMerge = 1
  1610. cell.SetString(strconv.Itoa(i + 1)) //序号
  1611. dataRow2.AddCell().SetString("")
  1612. cell2 := dataRow.AddCell()
  1613. cell2.VMerge = 1
  1614. cell2.SetString(v.CompanyName) // 客户名称
  1615. dataRow2.AddCell().SetString("")
  1616. cell3 := dataRow.AddCell()
  1617. cell3.VMerge = 1
  1618. cell3.SetString(v.ContractCode) // 合同编号
  1619. dataRow2.AddCell().SetString("")
  1620. cell4 := dataRow.AddCell()
  1621. cell4.VMerge = 1
  1622. cell4.SetString(v.StartDate) // 合同开始时间
  1623. dataRow2.AddCell().SetString("")
  1624. cell5 := dataRow.AddCell()
  1625. cell5.VMerge = 1
  1626. cell5.SetString(v.EndDate) // 合同结束时间
  1627. dataRow2.AddCell().SetString("")
  1628. cell6 := dataRow.AddCell()
  1629. cell6.VMerge = 1
  1630. cell6.SetString(fmt.Sprintf("%.2f", v.ContractAmount)) // 合同金额
  1631. dataRow2.AddCell().SetString("")
  1632. cell7 := dataRow.AddCell()
  1633. cell7.VMerge = 1
  1634. cell7.SetString(v.UnitName) // 金额单位
  1635. dataRow2.AddCell().SetString("")
  1636. for j, item := range v.NotInvoiceList {
  1637. if j == 1 {
  1638. dataRow2.AddCell().SetString(fmt.Sprintf("%.2f", item.NotInvoicedAmountTotal)) // 未开票金额
  1639. dataRow2.AddCell().SetString(serviceProductIdMap[item.ServiceProductId]) // 套餐类型
  1640. if item.SellerId > 0 && item.RaiSellerId > 0 {
  1641. if item.ServiceProductId == 1 {
  1642. item.SellerGroupName = sellerMap[item.SellerId].GroupName
  1643. if seller, ok := sellerMap[item.SellerId]; ok {
  1644. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1645. }
  1646. dataRow2.AddCell().SetString(item.SellerName) // 销售
  1647. dataRow2.AddCell().SetString(item.SellerGroupName) // 销售组别
  1648. dataRow2.AddCell().SetString(item.SellerType) // 销售类型
  1649. } else {
  1650. item.RaiSellerGroupName = sellerMap[item.RaiSellerId].GroupName
  1651. if seller, ok := sellerMap[item.RaiSellerId]; ok {
  1652. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1653. }
  1654. dataRow2.AddCell().SetString(item.RaiSellerName) // 销售
  1655. dataRow2.AddCell().SetString(item.RaiSellerGroupName) // 销售组别
  1656. dataRow2.AddCell().SetString(item.SellerType) // 销售类型
  1657. }
  1658. } else if item.SellerId > 0 && item.RaiSellerId == 0 {
  1659. item.SellerGroupName = sellerMap[item.SellerId].GroupName
  1660. if seller, ok := sellerMap[item.SellerId]; ok {
  1661. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1662. }
  1663. dataRow2.AddCell().SetString(item.SellerName) // 销售
  1664. dataRow2.AddCell().SetString(item.SellerGroupName) // 销售组别
  1665. dataRow2.AddCell().SetString(item.SellerType) // 销售类型
  1666. } else if item.SellerId == 0 && item.RaiSellerId > 0 {
  1667. item.RaiSellerGroupName = sellerMap[item.RaiSellerId].GroupName
  1668. if seller, ok := sellerMap[item.RaiSellerId]; ok {
  1669. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1670. }
  1671. dataRow2.AddCell().SetString(item.RaiSellerName) // 销售
  1672. dataRow2.AddCell().SetString(item.RaiSellerGroupName) // 销售组别
  1673. dataRow2.AddCell().SetString(item.SellerType) // 销售类型
  1674. }
  1675. } else {
  1676. dataRow.AddCell().SetString(fmt.Sprintf("%.2f", item.NotInvoicedAmountOriginTotal)) // 未开票金额
  1677. dataRow.AddCell().SetString(fmt.Sprintf("%.2f", item.NotInvoicedAmountTotal)) // 未开票换算金额
  1678. dataRow.AddCell().SetString(serviceProductIdMap[item.ServiceProductId]) // 套餐类型
  1679. if item.SellerId > 0 && item.RaiSellerId > 0 {
  1680. if item.ServiceProductId == 1 {
  1681. item.SellerGroupName = sellerMap[item.SellerId].GroupName
  1682. if seller, ok := sellerMap[item.SellerId]; ok {
  1683. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1684. }
  1685. dataRow.AddCell().SetString(item.SellerName) // 销售
  1686. dataRow.AddCell().SetString(item.SellerGroupName) // 销售组别
  1687. dataRow.AddCell().SetString(item.SellerType) // 销售类型
  1688. } else {
  1689. item.RaiSellerGroupName = sellerMap[item.RaiSellerId].GroupName
  1690. if seller, ok := sellerMap[item.RaiSellerId]; ok {
  1691. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1692. }
  1693. dataRow.AddCell().SetString(item.RaiSellerName) // 销售
  1694. dataRow.AddCell().SetString(item.RaiSellerGroupName) // 销售组别
  1695. dataRow.AddCell().SetString(item.SellerType) // 销售类型
  1696. }
  1697. } else if item.SellerId > 0 && item.RaiSellerId == 0 {
  1698. if seller, ok := sellerMap[item.SellerId]; ok {
  1699. item.SellerGroupName = seller.GroupName
  1700. }
  1701. if seller, ok := sellerMap[item.SellerId]; ok {
  1702. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1703. }
  1704. dataRow.AddCell().SetString(item.SellerName) // 销售
  1705. dataRow.AddCell().SetString(item.SellerGroupName) // 销售组别
  1706. dataRow.AddCell().SetString(item.SellerType) // 销售类型
  1707. } else if item.SellerId == 0 && item.RaiSellerId > 0 {
  1708. item.RaiSellerGroupName = sellerMap[item.RaiSellerId].GroupName
  1709. if seller, ok := sellerMap[item.RaiSellerId]; ok {
  1710. item.SellerType = sellerTypeMap[seller.DepartmentId]
  1711. }
  1712. dataRow.AddCell().SetString(item.RaiSellerName) // 销售
  1713. dataRow.AddCell().SetString(item.RaiSellerGroupName) // 销售组别
  1714. dataRow.AddCell().SetString(item.SellerType) // 销售类型
  1715. }
  1716. }
  1717. }
  1718. }
  1719. // 输出文件
  1720. var buffer bytes.Buffer
  1721. _ = xlsxFile.Write(&buffer)
  1722. content := bytes.NewReader(buffer.Bytes())
  1723. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  1724. fileName := sheetName + randStr + ".xlsx"
  1725. c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
  1726. c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  1727. http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
  1728. }
  1729. // ExportNotPaymentCensusList 导出开票未到款统计列表
  1730. func ExportNotPaymentCensusList(c *gin.Context, results *fms.NotInvoicePaymentCensusResp) {
  1731. list := results.DataList
  1732. if len(list) == 0 {
  1733. resp.Fail("列表数据为空", c)
  1734. return
  1735. }
  1736. // 生成Excel文件
  1737. xlsxFile := xlsx.NewFile()
  1738. style := xlsx.NewStyle()
  1739. alignment := xlsx.Alignment{
  1740. Horizontal: "center",
  1741. Vertical: "center",
  1742. WrapText: true,
  1743. }
  1744. style.Alignment = alignment
  1745. style.ApplyAlignment = true
  1746. sheet, err := xlsxFile.AddSheet("开票未到款统计")
  1747. if err != nil {
  1748. resp.FailData("新增Sheet失败", "Err:"+err.Error(), c)
  1749. return
  1750. }
  1751. _ = sheet.SetColWidth(1, 1, 30)
  1752. _ = sheet.SetColWidth(3, 3, 30)
  1753. // 前三行-开票金额合计
  1754. rowA := sheet.AddRow()
  1755. cellAA := rowA.AddCell()
  1756. cellAA.SetString(fmt.Sprintf("开票未到款合计金额(换算后):%.2f(元)", results.NotPaymentTotal))
  1757. rowBData := "开票未到款金额:"
  1758. for _, v := range results.NotPaymentCurrencyTotal {
  1759. rowBData += fmt.Sprintf("%s%.2f(%s) ", v.Name, v.Amount, v.UnitName)
  1760. }
  1761. rowB := sheet.AddRow()
  1762. rowB.AddCell().SetString(rowBData)
  1763. sheet.AddRow()
  1764. // 表头, 套餐动态获取
  1765. rowTitle := []string{"序号", "客户名称", "合同编号", "合同起始日期", "合同结束日期", "套餐类型", "开票日", "开票金额", "金额单位", "开票换算金额", "开票销售",
  1766. "销售组别", "销售类型"}
  1767. titleRow := sheet.AddRow()
  1768. for i := range rowTitle {
  1769. v := titleRow.AddCell()
  1770. v.SetString(rowTitle[i])
  1771. v.SetStyle(style)
  1772. }
  1773. serviceProductIdMap := map[int]string{
  1774. 1: "FICC套餐",
  1775. 2: "权益套餐",
  1776. }
  1777. sellerTypeMap := map[int]string{1: "FICC销售", 2: "权益销售"}
  1778. for k, v := range list {
  1779. dataRow := sheet.AddRow()
  1780. // 前四个单元格根据每行开票到款条数向下合并
  1781. l := len(v.InvoicePaymentList)
  1782. mergeRowNum := l - 1
  1783. // 序号
  1784. sortNum := k + 1
  1785. colA := dataRow.AddCell()
  1786. colA.VMerge = mergeRowNum
  1787. colA.SetString(fmt.Sprint(sortNum))
  1788. // 客户名称
  1789. colB := dataRow.AddCell()
  1790. colB.VMerge = mergeRowNum
  1791. colB.SetString(v.CompanyName)
  1792. // 合同编号
  1793. colC := dataRow.AddCell()
  1794. colC.VMerge = mergeRowNum
  1795. colC.SetString(v.ContractCode)
  1796. // 合同有效期
  1797. colD := dataRow.AddCell()
  1798. colD.VMerge = mergeRowNum
  1799. colD.SetString(v.StartDate)
  1800. colF := dataRow.AddCell()
  1801. colF.VMerge = mergeRowNum
  1802. colF.SetString(v.EndDate)
  1803. // 套餐类型
  1804. colE := dataRow.AddCell()
  1805. colE.VMerge = mergeRowNum
  1806. colE.SetString(serviceProductIdMap[v.InvoicePaymentList[0].ServiceProductId])
  1807. // 开票到款信息
  1808. for _, v2 := range v.InvoicePaymentList {
  1809. rowData := []string{
  1810. v2.InvoiceDate, // 开票日
  1811. fmt.Sprint(v2.NotPaymentOriginAmount), // 开票原始金额
  1812. v2.UnitName, // 开票金额
  1813. fmt.Sprint(v2.NotPaymentAmount), // 开票换算金额
  1814. v2.SellerName, // 销售
  1815. v2.SellerGroupName, // 组别
  1816. sellerTypeMap[v2.SellerType], // 销售类型
  1817. }
  1818. for i := range rowData {
  1819. dataRow.AddCell().SetString(rowData[i])
  1820. }
  1821. }
  1822. }
  1823. // 输出文件
  1824. var buffer bytes.Buffer
  1825. _ = xlsxFile.Write(&buffer)
  1826. content := bytes.NewReader(buffer.Bytes())
  1827. randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
  1828. fileName := "商品到款统计_" + randStr + ".xlsx"
  1829. c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
  1830. c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  1831. http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
  1832. }