|
|
@@ -0,0 +1,172 @@
|
|
|
+package service
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ dao "dashoo.cn/micro/app/dao/contract"
|
|
|
+ "dashoo.cn/micro/app/model/contract"
|
|
|
+ "dashoo.cn/micro/app/service"
|
|
|
+ "dashoo.cn/opms_libary/micro_srv"
|
|
|
+ "dashoo.cn/opms_libary/myerrors"
|
|
|
+ "fmt"
|
|
|
+ "github.com/gogf/gf/frame/g"
|
|
|
+)
|
|
|
+
|
|
|
+type ContractReportService struct {
|
|
|
+ Dao *dao.CtrContractDao
|
|
|
+ *service.ContextService
|
|
|
+}
|
|
|
+
|
|
|
+func NewContractReportService(ctx context.Context) (svc *ContractReportService, err error) {
|
|
|
+ tenant, err := micro_srv.GetTenant(ctx)
|
|
|
+ if err != nil {
|
|
|
+ err = myerrors.TipsError(fmt.Sprintf("获取租户码异常:%s", err.Error()))
|
|
|
+ return nil, err //fmt.Errorf("获取租户码异常:%s", err.Error())
|
|
|
+ }
|
|
|
+
|
|
|
+ svc = new(ContractReportService)
|
|
|
+ if svc.ContextService, err = svc.Init(ctx); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ svc.Dao = dao.NewCtrContractDao(tenant)
|
|
|
+ return svc, nil
|
|
|
+}
|
|
|
+
|
|
|
+type CollectionNumData struct {
|
|
|
+ contract.CtrContractCollection
|
|
|
+ InchargeId int `orm:"incharge_id" json:"inchargeId"` // 负责人ID
|
|
|
+ InchargeName string `orm:"incharge_name" json:"inchargeName"` // 负责人(销售工程师)
|
|
|
+ ProductLine string `orm:"product_line" json:"productLine"` // 产品线
|
|
|
+ Total float64 `orm:"total"` // 合计
|
|
|
+}
|
|
|
+
|
|
|
+// QueryCollectionNum 业绩指标-回款金额
|
|
|
+func (s *ContractReportService) QueryCollectionNum(date string) (interface{}, error) {
|
|
|
+ // 获取数据
|
|
|
+ var collectionInfos []*CollectionNumData
|
|
|
+ err := s.Dao.DB.Model("ctr_contract_collection a").InnerJoin("ctr_contract b", "a.contract_id=b.id").Where(fmt.Sprintf("collection_datetime LIKE '%v%%'", date)).Fields("a.*,b.incharge_id,b.incharge_name,b.product_line,SUM(a.collection_amount) total").Group("incharge_id, product_line").Order("incharge_id ASC, product_line ASC").Scan(&collectionInfos)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // 获取销售数据
|
|
|
+ userList, err := service.GetUserListByRoleCode(s.Ctx, []string{"SalesEngineer", "ProductLineManager"}, 1000)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // BIOBANK CELLSOP LIMS+基因 其他
|
|
|
+ header, data := make([]g.Map, 0), make([]g.Map, 0)
|
|
|
+ header = append(header, g.Map{"prop": "userName", "label": "销售工程师"}, g.Map{"prop": "bio", "label": "BIOBANK"}, g.Map{"prop": "cell", "label": "CELLSOP"}, g.Map{"prop": "lims", "label": "LIMS+基因"}, g.Map{"prop": "other", "label": "其他"}, g.Map{"prop": "total", "label": "合计"})
|
|
|
+
|
|
|
+ user2Collections := make(map[int][]*CollectionNumData, 0)
|
|
|
+ total := float64(0)
|
|
|
+ for _, col := range collectionInfos {
|
|
|
+ if _, ok := user2Collections[col.InchargeId]; !ok {
|
|
|
+ user2Collections[col.InchargeId] = make([]*CollectionNumData, 0)
|
|
|
+ }
|
|
|
+ user2Collections[col.InchargeId] = append(user2Collections[col.InchargeId], col)
|
|
|
+ total += col.Total
|
|
|
+ }
|
|
|
+ // 统计数据
|
|
|
+ for _, user := range userList {
|
|
|
+ bio, cell, lims, other, tot := float64(0), float64(0), float64(0), float64(0), float64(0)
|
|
|
+ if len(user2Collections[user["Id"].(int)]) > 0 {
|
|
|
+ for _, col := range user2Collections[user["Id"].(int)] {
|
|
|
+ tot += col.Total
|
|
|
+ if col.ProductLine == "10" {
|
|
|
+ bio += col.Total
|
|
|
+ } else if col.ProductLine == "20" {
|
|
|
+ cell += col.Total
|
|
|
+ } else if col.ProductLine == "30" {
|
|
|
+ lims += col.Total
|
|
|
+ } else {
|
|
|
+ other += col.Total
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data = append(data, g.Map{
|
|
|
+ "userName": user["NickName"],
|
|
|
+ "bio": fmt.Sprintf("%.2f", bio),
|
|
|
+ "cell": fmt.Sprintf("%.2f", cell),
|
|
|
+ "lims": fmt.Sprintf("%.2f", lims),
|
|
|
+ "other": fmt.Sprintf("%.2f", other),
|
|
|
+ "total": fmt.Sprintf("%.2f", tot),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ data = append(data, g.Map{
|
|
|
+ "userName": "",
|
|
|
+ "bio": "",
|
|
|
+ "cell": "",
|
|
|
+ "lims": "",
|
|
|
+ "other": "",
|
|
|
+ "total": fmt.Sprintf("总计:%.2f元", total),
|
|
|
+ })
|
|
|
+
|
|
|
+ return g.Map{"header": header, "data": data}, nil
|
|
|
+}
|
|
|
+
|
|
|
+// QueryContractNum 业绩指标-签约合同金额
|
|
|
+func (s *ContractReportService) QueryContractNum(date string) (interface{}, error) {
|
|
|
+ type ContractNumData struct {
|
|
|
+ contract.CtrContract
|
|
|
+ Total float64 `orm:"total"` // 合计
|
|
|
+ }
|
|
|
+ // 获取数据
|
|
|
+ var contractInfos []*ContractNumData
|
|
|
+ err := s.Dao.Where(fmt.Sprintf("contract_sign_time LIKE '%v%%'", date)).Fields("ctr_contract.*,SUM(contract_amount) total").Group("incharge_id, product_line").Order("incharge_id ASC, product_line ASC").Scan(&contractInfos)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // 获取销售数据
|
|
|
+ userList, err := service.GetUserListByRoleCode(s.Ctx, []string{"SalesEngineer", "ProductLineManager"}, 1000)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // BIOBANK CELLSOP LIMS+基因 其他
|
|
|
+ header, data := make([]g.Map, 0), make([]g.Map, 0)
|
|
|
+ header = append(header, g.Map{"prop": "userName", "label": "销售工程师"}, g.Map{"prop": "bio", "label": "BIOBANK"}, g.Map{"prop": "cell", "label": "CELLSOP"}, g.Map{"prop": "lims", "label": "LIMS+基因"}, g.Map{"prop": "other", "label": "其他"}, g.Map{"prop": "total", "label": "合计"})
|
|
|
+
|
|
|
+ user2Collections := make(map[int][]*ContractNumData, 0)
|
|
|
+ total := float64(0)
|
|
|
+ for _, col := range contractInfos {
|
|
|
+ if _, ok := user2Collections[col.InchargeId]; !ok {
|
|
|
+ user2Collections[col.InchargeId] = make([]*ContractNumData, 0)
|
|
|
+ }
|
|
|
+ user2Collections[col.InchargeId] = append(user2Collections[col.InchargeId], col)
|
|
|
+ total += col.Total
|
|
|
+ }
|
|
|
+ // 统计数据
|
|
|
+ for _, user := range userList {
|
|
|
+ bio, cell, lims, other, tot := float64(0), float64(0), float64(0), float64(0), float64(0)
|
|
|
+ if len(user2Collections[user["Id"].(int)]) > 0 {
|
|
|
+ for _, col := range user2Collections[user["Id"].(int)] {
|
|
|
+ tot += col.Total
|
|
|
+ if col.ProductLine == "10" {
|
|
|
+ bio += col.Total
|
|
|
+ } else if col.ProductLine == "20" {
|
|
|
+ cell += col.Total
|
|
|
+ } else if col.ProductLine == "30" {
|
|
|
+ lims += col.Total
|
|
|
+ } else {
|
|
|
+ other += col.Total
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data = append(data, g.Map{
|
|
|
+ "userName": user["NickName"],
|
|
|
+ "bio": fmt.Sprintf("%.2f", bio),
|
|
|
+ "cell": fmt.Sprintf("%.2f", cell),
|
|
|
+ "lims": fmt.Sprintf("%.2f", lims),
|
|
|
+ "other": fmt.Sprintf("%.2f", other),
|
|
|
+ "total": fmt.Sprintf("%.2f", tot),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ data = append(data, g.Map{
|
|
|
+ "userName": "",
|
|
|
+ "bio": "",
|
|
|
+ "cell": "",
|
|
|
+ "lims": "",
|
|
|
+ "other": "",
|
|
|
+ "total": fmt.Sprintf("总计:%.2f元", total),
|
|
|
+ })
|
|
|
+
|
|
|
+ return g.Map{"header": header, "data": data}, nil
|
|
|
+}
|