ctr_contract_sale_target.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package service
  2. import (
  3. "bytes"
  4. "context"
  5. dao "dashoo.cn/micro/app/dao/contract"
  6. model "dashoo.cn/micro/app/model/contract"
  7. "dashoo.cn/micro/app/service/partner"
  8. "dashoo.cn/opms_libary/micro_srv"
  9. "dashoo.cn/opms_libary/myerrors"
  10. "dashoo.cn/opms_libary/request"
  11. "fmt"
  12. "github.com/gogf/gf/frame/g"
  13. "github.com/gogf/gf/os/gtime"
  14. "github.com/gogf/gf/util/gconv"
  15. "github.com/gogf/gf/util/gvalid"
  16. "github.com/xuri/excelize/v2"
  17. )
  18. type CtrContractSaleTargetService struct {
  19. Dao *dao.CtrContractSaleTargetDao
  20. Tenant string
  21. userInfo request.UserInfo
  22. DataScope g.Map `json:"dataScope"`
  23. }
  24. func NewCtrContractSaleTargetService(ctx context.Context) (*CtrContractSaleTargetService, error) {
  25. tenant, err := micro_srv.GetTenant(ctx)
  26. if err != nil {
  27. return nil, myerrors.TipsError(fmt.Sprintf("获取租户码异常:%s", err.Error())) //fmt.Errorf("获取租户码异常:%s", err.Error())
  28. }
  29. // 获取用户信息
  30. userInfo, err := micro_srv.GetUserInfo(ctx)
  31. if err != nil {
  32. return nil, myerrors.TipsError(fmt.Sprintf("获取用户信息异常:%s", err.Error())) //fmt.Errorf("获取用户信息异常:%s", err.Error())
  33. }
  34. if err != nil {
  35. return nil, err
  36. }
  37. return &CtrContractSaleTargetService{
  38. Dao: dao.NewCtrContractSaleTargetDao(tenant),
  39. Tenant: tenant,
  40. userInfo: userInfo,
  41. DataScope: userInfo.DataScope,
  42. }, nil
  43. }
  44. // List 获取列表
  45. func (s CtrContractSaleTargetService) List(ctx context.Context, req *model.SaleTargetReq) (int, []*model.CtrContractSaleTarget, error) {
  46. saleTargetDao := s.Dao.As("ctr_contract_sale_target")
  47. if req.Year != "" {
  48. saleTargetDao = saleTargetDao.Where("year = ?", req.Year)
  49. }
  50. if req.SaleName != "" {
  51. likeStr := fmt.Sprintf("%%%s%%", req.SaleName)
  52. saleTargetDao = saleTargetDao.Where("sale_name like ?", likeStr)
  53. }
  54. total, err := saleTargetDao.Count()
  55. if err != nil {
  56. return 0, nil, err
  57. }
  58. if req.PageNum != 0 {
  59. saleTargetDao = saleTargetDao.Page(req.GetPage())
  60. }
  61. orderBy := "id ASC"
  62. if req.OrderBy != "" {
  63. orderBy = req.OrderBy
  64. }
  65. saleTargetDao = saleTargetDao.Order(orderBy)
  66. results, err := saleTargetDao.FindAll()
  67. return total, results, err
  68. }
  69. // Import excel数据导入
  70. func (s CtrContractSaleTargetService) Import(ctx context.Context, req *model.ExcelImportReq) error {
  71. validErr := gvalid.CheckStruct(ctx, req, nil)
  72. if validErr != nil {
  73. return myerrors.TipsError(validErr.Current().Error())
  74. }
  75. // 下载文件
  76. buf, err := partner.DownFile(req.ExcelUrl)
  77. if err != nil {
  78. return myerrors.TipsError(fmt.Sprintf("下载 excel 异常 %s", err.Error()))
  79. }
  80. // 解析excel,构造销售目标数据
  81. saleTargets, minYear, err := s.parseExcel(buf)
  82. if err != nil {
  83. return myerrors.TipsError(fmt.Sprintf("解析 excel 异常 %s", err.Error()))
  84. }
  85. // 获取销售分成数据 人/年/月份
  86. shareMap := make(map[string]map[string]map[string]float64)
  87. saleMap := make(map[string]int)
  88. var shares []*model.Share
  89. err = s.Dao.DB.Model("ctr_contract a").LeftJoin("ctr_contract_share b", "a.id=b.contract_id").Where(fmt.Sprintf("a.contract_sign_time >= '%v'", minYear)).Fields("a.contract_amount, a.incharge_id, a.incharge_name, a.contract_sign_time, b.id, b.sale_id, b.sale_name, b.share_amount").Scan(&shares)
  90. if err != nil {
  91. return err
  92. }
  93. // 统计 人/年度/月度金额
  94. for _, share := range shares {
  95. id := 0
  96. name := ""
  97. amount := float64(0)
  98. year := share.ContractSignTime.Format("Y")
  99. month := share.ContractSignTime.Format("m")
  100. if share.Id == 0 {
  101. id = share.InchargeId
  102. name = share.InchargeName
  103. amount = share.ContractAmount
  104. } else {
  105. id = share.SaleId
  106. name = share.SaleName
  107. amount = share.ShareAmount
  108. }
  109. if _, ok := shareMap[name]; !ok {
  110. shareMap[name] = make(map[string]map[string]float64)
  111. }
  112. if _, ok := shareMap[name][year]; !ok {
  113. shareMap[name][year] = make(map[string]float64)
  114. }
  115. saleMap[name] = id
  116. shareMap[name][year][month] += amount
  117. }
  118. // 获取历史销售目标信息
  119. targetMap := make(map[string]map[string]*model.CtrContractSaleTarget)
  120. targets, err := s.Dao.Where(fmt.Sprintf("year >= '%v'", minYear)).FindAll()
  121. if err != nil {
  122. return err
  123. }
  124. for index, target := range targets {
  125. if _, ok := targetMap[target.SaleName]; !ok {
  126. targetMap[target.SaleName] = make(map[string]*model.CtrContractSaleTarget)
  127. }
  128. targetMap[target.SaleName][target.Year] = targets[index]
  129. }
  130. for _, target := range saleTargets {
  131. updateTargetInfo(target, targetMap, saleMap, shareMap)
  132. }
  133. // 保存销售目标数据
  134. if len(saleTargets) > 0 {
  135. _, err = s.Dao.Save(saleTargets)
  136. }
  137. return err
  138. }
  139. // excel解构为数据
  140. func (s CtrContractSaleTargetService) parseExcel(b []byte) ([]*model.CtrContractSaleTarget, string, error) {
  141. f, err := excelize.OpenReader(bytes.NewBuffer(b))
  142. if err != nil {
  143. return nil, "", err
  144. }
  145. sheet := "Sheet1"
  146. rows, err := f.GetRows(sheet)
  147. if err != nil {
  148. return nil, "", err
  149. }
  150. minYear := "9999"
  151. // 序号 销售 年度 1月计划 1月达成 2月计划 2月达成 3月计划 3月达成 第一季度计划 第一季度达成 第一季度完成率 4月计划 4月达成 5月计划 5月达成 6月计划 6月达成 第二季度计划 第二季度达成 第二季度完成率 7月计划 7月达成 8月计划 8月达成 9月计划 9月达成 第三季度计划 第三季度达成 第三季度完成率 10月计划 10月达成 11月计划 11月达成 12月计划 12月达成 年度计划 年度达成 年度完成率
  152. var saleTargets []*model.CtrContractSaleTarget
  153. for _, row := range rows[1:] {
  154. temp := &model.CtrContractSaleTarget{
  155. SaleName: row[1],
  156. Year: row[2],
  157. Plan1: gconv.Float64(row[3]),
  158. Plan2: gconv.Float64(row[5]),
  159. Plan3: gconv.Float64(row[7]),
  160. Plan4: gconv.Float64(row[12]),
  161. Plan5: gconv.Float64(row[14]),
  162. Plan6: gconv.Float64(row[16]),
  163. Plan7: gconv.Float64(row[21]),
  164. Plan8: gconv.Float64(row[23]),
  165. Plan9: gconv.Float64(row[25]),
  166. Plan10: gconv.Float64(row[30]),
  167. Plan11: gconv.Float64(row[32]),
  168. Plan12: gconv.Float64(row[34]),
  169. Remark: "",
  170. CreatedBy: s.userInfo.Id,
  171. CreatedName: s.userInfo.NickName,
  172. CreatedTime: gtime.Now(),
  173. UpdatedBy: s.userInfo.Id,
  174. UpdatedName: s.userInfo.NickName,
  175. UpdatedTime: gtime.Now(),
  176. }
  177. if temp.Year < minYear {
  178. minYear = temp.Year
  179. }
  180. temp.QuarterPlan1 = temp.Plan1 + temp.Plan2 + temp.Plan3
  181. temp.QuarterPlan2 = temp.Plan4 + temp.Plan5 + temp.Plan6
  182. temp.QuarterPlan3 = temp.Plan7 + temp.Plan8 + temp.Plan9
  183. temp.YearPlan = temp.QuarterPlan1 + temp.QuarterPlan2 + temp.QuarterPlan3 + temp.Plan10 + temp.Plan11 + temp.Plan12
  184. saleTargets = append(saleTargets, temp)
  185. }
  186. return saleTargets, minYear, nil
  187. }
  188. func updateTargetInfo(target *model.CtrContractSaleTarget, targetMap map[string]map[string]*model.CtrContractSaleTarget, saleMap map[string]int, shareMap map[string]map[string]map[string]float64) {
  189. // 有则更新
  190. if targetMap[target.SaleName] != nil && targetMap[target.SaleName][target.Year] != nil {
  191. target.Id = targetMap[target.SaleName][target.Year].Id
  192. target.CreatedBy = targetMap[target.SaleName][target.Year].CreatedBy
  193. target.CreatedName = targetMap[target.SaleName][target.Year].CreatedName
  194. target.CreatedTime = targetMap[target.SaleName][target.Year].CreatedTime
  195. } else {
  196. target.SaleId = saleMap[target.SaleName]
  197. }
  198. if shareMap[target.SaleName] != nil && shareMap[target.SaleName][target.Year] != nil {
  199. for month, amount := range shareMap[target.SaleName][target.Year] {
  200. switch month {
  201. case "01":
  202. target.Complete1 = amount
  203. break
  204. case "02":
  205. target.Complete2 = amount
  206. break
  207. case "03":
  208. target.Complete3 = amount
  209. break
  210. case "04":
  211. target.Complete4 = amount
  212. break
  213. case "05":
  214. target.Complete5 = amount
  215. break
  216. case "06":
  217. target.Complete6 = amount
  218. break
  219. case "07":
  220. target.Complete7 = amount
  221. break
  222. case "08":
  223. target.Complete8 = amount
  224. break
  225. case "09":
  226. target.Complete9 = amount
  227. break
  228. case "10":
  229. target.Complete10 = amount
  230. break
  231. case "11":
  232. target.Complete11 = amount
  233. break
  234. case "12":
  235. target.Complete12 = amount
  236. break
  237. }
  238. }
  239. }
  240. target.QuarterComplete1 = target.Complete1 + target.Complete2 + target.Complete3
  241. target.QuarterComplete2 = target.Complete4 + target.Complete5 + target.Complete6
  242. target.QuarterComplete3 = target.Complete7 + target.Complete8 + target.Complete9
  243. target.YearComplete = target.QuarterComplete1 + target.QuarterComplete2 + target.QuarterComplete3 + target.Complete10 + target.Complete11 + target.Complete12
  244. if target.QuarterPlan1 != 0 {
  245. target.QuarterCompleteRatio1 = target.QuarterComplete1 / target.QuarterPlan1 * 100
  246. }
  247. if target.QuarterPlan2 != 0 {
  248. target.QuarterCompleteRatio2 = target.QuarterComplete2 / target.QuarterPlan2 * 100
  249. }
  250. if target.QuarterPlan3 != 0 {
  251. target.QuarterCompleteRatio3 = target.QuarterComplete3 / target.QuarterPlan3 * 100
  252. }
  253. if target.YearPlan != 0 {
  254. target.YearCompleteRatio = target.YearComplete / target.YearPlan * 100
  255. }
  256. }