ctr_contract_sale_target.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. var shares []*model.Share
  88. 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)
  89. if err != nil {
  90. return err
  91. }
  92. // 统计 人/年度/月度金额
  93. for _, share := range shares {
  94. name := ""
  95. amount := float64(0)
  96. year := share.ContractSignTime.Format("Y")
  97. month := share.ContractSignTime.Format("m")
  98. if share.Id == 0 {
  99. name = share.InchargeName
  100. amount = share.ContractAmount
  101. } else {
  102. name = share.SaleName
  103. amount = share.ShareAmount
  104. }
  105. if _, ok := shareMap[name]; !ok {
  106. shareMap[name] = make(map[string]map[string]float64)
  107. }
  108. if _, ok := shareMap[name][year]; !ok {
  109. shareMap[name][year] = make(map[string]float64)
  110. }
  111. shareMap[name][year][month] += amount
  112. }
  113. // 获取用户信息
  114. saleMap := make(map[string]int)
  115. users, err := s.Dao.DB.Model("sys_user").FindAll()
  116. if err != nil {
  117. return err
  118. }
  119. for _, user := range users {
  120. saleMap[user["nick_name"].String()] = user["id"].Int()
  121. }
  122. // 获取历史销售目标信息
  123. targetMap := make(map[string]map[string]*model.CtrContractSaleTarget)
  124. targets, err := s.Dao.Where(fmt.Sprintf("year >= '%v'", minYear)).FindAll()
  125. if err != nil {
  126. return err
  127. }
  128. for index, target := range targets {
  129. if _, ok := targetMap[target.SaleName]; !ok {
  130. targetMap[target.SaleName] = make(map[string]*model.CtrContractSaleTarget)
  131. }
  132. targetMap[target.SaleName][target.Year] = targets[index]
  133. }
  134. for _, target := range saleTargets {
  135. updateTargetInfo(target, targetMap, saleMap, shareMap)
  136. }
  137. // 保存销售目标数据
  138. if len(saleTargets) > 0 {
  139. _, err = s.Dao.Save(saleTargets)
  140. }
  141. return err
  142. }
  143. // excel解构为数据
  144. func (s CtrContractSaleTargetService) parseExcel(b []byte) ([]*model.CtrContractSaleTarget, string, error) {
  145. f, err := excelize.OpenReader(bytes.NewBuffer(b))
  146. if err != nil {
  147. return nil, "", err
  148. }
  149. sheet := "销售指标"
  150. rows, err := f.GetRows(sheet)
  151. if err != nil {
  152. return nil, "", err
  153. }
  154. minYear := "9999"
  155. // 序号 销售 年度 1月计划 1月达成 2月计划 2月达成 3月计划 3月达成 第一季度计划 第一季度达成 第一季度完成率 4月计划 4月达成 5月计划 5月达成 6月计划 6月达成 第二季度计划 第二季度达成 第二季度完成率 7月计划 7月达成 8月计划 8月达成 9月计划 9月达成 第三季度计划 第三季度达成 第三季度完成率 10月计划 10月达成 11月计划 11月达成 12月计划 12月达成 年度计划 年度达成 年度完成率
  156. var saleTargets []*model.CtrContractSaleTarget
  157. for _, row := range rows[1:] {
  158. temp := &model.CtrContractSaleTarget{
  159. SaleName: row[1],
  160. Year: row[2],
  161. Plan1: gconv.Float64(row[3]),
  162. Plan2: gconv.Float64(row[5]),
  163. Plan3: gconv.Float64(row[7]),
  164. Plan4: gconv.Float64(row[12]),
  165. Plan5: gconv.Float64(row[14]),
  166. Plan6: gconv.Float64(row[16]),
  167. Plan7: gconv.Float64(row[21]),
  168. Plan8: gconv.Float64(row[23]),
  169. Plan9: gconv.Float64(row[25]),
  170. Plan10: gconv.Float64(row[30]),
  171. Plan11: gconv.Float64(row[32]),
  172. Plan12: gconv.Float64(row[34]),
  173. Remark: "",
  174. CreatedBy: s.userInfo.Id,
  175. CreatedName: s.userInfo.NickName,
  176. CreatedTime: gtime.Now(),
  177. UpdatedBy: s.userInfo.Id,
  178. UpdatedName: s.userInfo.NickName,
  179. UpdatedTime: gtime.Now(),
  180. }
  181. if temp.Year < minYear {
  182. minYear = temp.Year
  183. }
  184. temp.QuarterPlan1 = temp.Plan1 + temp.Plan2 + temp.Plan3
  185. temp.QuarterPlan2 = temp.Plan4 + temp.Plan5 + temp.Plan6
  186. temp.QuarterPlan3 = temp.Plan7 + temp.Plan8 + temp.Plan9
  187. temp.YearPlan = temp.QuarterPlan1 + temp.QuarterPlan2 + temp.QuarterPlan3 + temp.Plan10 + temp.Plan11 + temp.Plan12
  188. saleTargets = append(saleTargets, temp)
  189. }
  190. return saleTargets, minYear, nil
  191. }
  192. func updateTargetInfo(target *model.CtrContractSaleTarget, targetMap map[string]map[string]*model.CtrContractSaleTarget, saleMap map[string]int, shareMap map[string]map[string]map[string]float64) {
  193. // 有则更新
  194. if targetMap[target.SaleName] != nil && targetMap[target.SaleName][target.Year] != nil {
  195. target.Id = targetMap[target.SaleName][target.Year].Id
  196. target.CreatedBy = targetMap[target.SaleName][target.Year].CreatedBy
  197. target.CreatedName = targetMap[target.SaleName][target.Year].CreatedName
  198. target.CreatedTime = targetMap[target.SaleName][target.Year].CreatedTime
  199. } else {
  200. target.SaleId = saleMap[target.SaleName]
  201. }
  202. if shareMap[target.SaleName] != nil && shareMap[target.SaleName][target.Year] != nil {
  203. for month, amount := range shareMap[target.SaleName][target.Year] {
  204. switch month {
  205. case "01":
  206. target.Complete1 = amount
  207. break
  208. case "02":
  209. target.Complete2 = amount
  210. break
  211. case "03":
  212. target.Complete3 = amount
  213. break
  214. case "04":
  215. target.Complete4 = amount
  216. break
  217. case "05":
  218. target.Complete5 = amount
  219. break
  220. case "06":
  221. target.Complete6 = amount
  222. break
  223. case "07":
  224. target.Complete7 = amount
  225. break
  226. case "08":
  227. target.Complete8 = amount
  228. break
  229. case "09":
  230. target.Complete9 = amount
  231. break
  232. case "10":
  233. target.Complete10 = amount
  234. break
  235. case "11":
  236. target.Complete11 = amount
  237. break
  238. case "12":
  239. target.Complete12 = amount
  240. break
  241. }
  242. }
  243. }
  244. target.QuarterComplete1 = target.Complete1 + target.Complete2 + target.Complete3
  245. target.QuarterComplete2 = target.Complete4 + target.Complete5 + target.Complete6
  246. target.QuarterComplete3 = target.Complete7 + target.Complete8 + target.Complete9
  247. target.YearComplete = target.QuarterComplete1 + target.QuarterComplete2 + target.QuarterComplete3 + target.Complete10 + target.Complete11 + target.Complete12
  248. if target.QuarterPlan1 != 0 {
  249. target.QuarterCompleteRatio1 = target.QuarterComplete1 / target.QuarterPlan1 * 100
  250. }
  251. if target.QuarterPlan2 != 0 {
  252. target.QuarterCompleteRatio2 = target.QuarterComplete2 / target.QuarterPlan2 * 100
  253. }
  254. if target.QuarterPlan3 != 0 {
  255. target.QuarterCompleteRatio3 = target.QuarterComplete3 / target.QuarterPlan3 * 100
  256. }
  257. if target.YearPlan != 0 {
  258. target.YearCompleteRatio = target.YearComplete / target.YearPlan * 100
  259. }
  260. }