|
|
@@ -3,9 +3,14 @@ package cust
|
|
|
import (
|
|
|
"bytes"
|
|
|
"context"
|
|
|
+ "dashoo.cn/micro/app/model/base"
|
|
|
+ "dashoo.cn/micro/app/model/contract"
|
|
|
+ sbase "dashoo.cn/micro/app/service/base"
|
|
|
+ "dashoo.cn/micro/app/service/partner"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
"github.com/gogf/gf/container/garray"
|
|
|
+ "github.com/gogf/gf/util/gvalid"
|
|
|
"math"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
@@ -227,6 +232,194 @@ func (s *CustomerService) Create(req *model.CustomerAddSeq) (insertId int64, err
|
|
|
return insertId, err
|
|
|
}
|
|
|
|
|
|
+func reverseMap(originalMap map[string]string) map[string]string {
|
|
|
+ reversedMap := make(map[string]string)
|
|
|
+ for key, value := range originalMap {
|
|
|
+ reversedMap[value] = key
|
|
|
+ }
|
|
|
+ return reversedMap
|
|
|
+}
|
|
|
+
|
|
|
+// Create 导入客户
|
|
|
+func (s *CustomerService) Import(ctx context.Context, req *contract.ExcelImportReq) (err error) {
|
|
|
+ validErr := gvalid.CheckStruct(ctx, req, nil)
|
|
|
+ if validErr != nil {
|
|
|
+ return myerrors.TipsError(validErr.Current().Error())
|
|
|
+ }
|
|
|
+
|
|
|
+ // 下载文件
|
|
|
+ buf, err := partner.DownFile(req.ExcelUrl)
|
|
|
+ if err != nil {
|
|
|
+ return myerrors.TipsError(fmt.Sprintf("下载 excel 异常 %s", err.Error()))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析excel,构造销售目标数据
|
|
|
+ excelData, err := s.parseExcel(buf)
|
|
|
+ if err != nil {
|
|
|
+ return myerrors.TipsError(fmt.Sprintf("解析 excel 异常 %s", err.Error()))
|
|
|
+ }
|
|
|
+ //客户类型
|
|
|
+ idyMap, err := service.GetDictDataByType(ctx, "cust_idy")
|
|
|
+ idyMap = reverseMap(idyMap)
|
|
|
+ //客户来源
|
|
|
+ sourceMap, err := service.GetDictDataByType(ctx, "cust_source")
|
|
|
+ sourceMap = reverseMap(sourceMap)
|
|
|
+
|
|
|
+ //关键字
|
|
|
+ keywordsMap, err := service.GetDictDataByType(ctx, "customer_bidding_keywords")
|
|
|
+ keywordsMap = reverseMap(keywordsMap)
|
|
|
+ svc, err := sbase.NewDistrictService(ctx)
|
|
|
+ treeList, err := svc.GetProvincesList(0)
|
|
|
+ fmt.Println("treeList", treeList)
|
|
|
+ //insertContactList := make([]*model.CustCustomerContactSeq, 0)
|
|
|
+ contactService, err := NewCustomerContactService(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ CustomerService, err := NewCustomerService(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ yesOrNoMap := map[string]string{
|
|
|
+ "是": "10",
|
|
|
+ "否": "20",
|
|
|
+ }
|
|
|
+ genderMap := map[string]string{
|
|
|
+ "男": "10",
|
|
|
+ "女": "20",
|
|
|
+ }
|
|
|
+
|
|
|
+ e := s.Dao.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ for _, data := range excelData {
|
|
|
+ var province *base.ProvincesTree
|
|
|
+ var city *base.ProvincesTree
|
|
|
+ var region *base.ProvincesTree
|
|
|
+
|
|
|
+ keywords := strings.Split(data.Keyword, ",")
|
|
|
+ for _, keyword := range keywords {
|
|
|
+ if _, ok := keywordsMap[keyword]; !ok {
|
|
|
+ return myerrors.TipsError(fmt.Sprintf("关键字 %s 不存在", keyword))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if data.CustProvince == "" {
|
|
|
+ return myerrors.TipsError("客户省份不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tree := range treeList {
|
|
|
+ if tree.DistName == data.CustProvince {
|
|
|
+ province = tree
|
|
|
+ if data.CustCity != "" {
|
|
|
+ for _, cityData := range province.Children {
|
|
|
+ if cityData.DistName == data.CustCity {
|
|
|
+ city = cityData
|
|
|
+ if data.CustRegion != "" {
|
|
|
+ for _, RegionData := range cityData.Children {
|
|
|
+ if RegionData.DistName == data.CustRegion {
|
|
|
+ region = RegionData
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (province.Id == 0) || (city.Id == 0 && data.CustCity != "") || (region.Id == 0 && data.CustRegion != "") {
|
|
|
+ return myerrors.TipsError("省市区填写错误,请检查后重试")
|
|
|
+ }
|
|
|
+
|
|
|
+ insertCustomer := &model.CustomerAddSeq{
|
|
|
+ CustName: data.CustName,
|
|
|
+ AbbrName: data.AbbrName,
|
|
|
+ CustAddress: data.CustAddress,
|
|
|
+ CustProvinceId: province.Id,
|
|
|
+ CustProvince: data.CustProvince,
|
|
|
+ CustCityId: city.Id,
|
|
|
+ CustCity: data.CustCity,
|
|
|
+ CustRegionId: region.Id,
|
|
|
+ CustRegion: data.CustRegion,
|
|
|
+ CustIndustry: idyMap[data.CustIndustry],
|
|
|
+ CustSource: sourceMap[data.CustSource],
|
|
|
+ CustDistCode: province.Id,
|
|
|
+ Remark: data.Remark,
|
|
|
+ Keyword: keywords,
|
|
|
+ }
|
|
|
+ id, err := s.Create(insertCustomer)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ s.CreateDynamics("创建客户", req, id)
|
|
|
+
|
|
|
+ seq := model.CustCustomerContactSeq{
|
|
|
+ CustId: int(id),
|
|
|
+ CuctName: data.CuctName,
|
|
|
+ CuctGender: genderMap[data.CuctGender],
|
|
|
+ Telephone: data.Telephone,
|
|
|
+ Wechat: data.Wechat,
|
|
|
+ Email: data.Email,
|
|
|
+ Dept: data.Dept,
|
|
|
+ Postion: data.Postion,
|
|
|
+ OfficeLocation: data.OfficeLocation,
|
|
|
+ IsDecision: yesOrNoMap[data.IsDecision],
|
|
|
+ Remark: data.ContactRemark,
|
|
|
+ }
|
|
|
+ err = contactService.Create(&seq)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ CustomerService.CreateDynamics("创建联系人", req, gconv.Int64(seq.CustId))
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+
|
|
|
+ return e
|
|
|
+}
|
|
|
+
|
|
|
+// excel解构为数据
|
|
|
+func (s CustomerService) parseExcel(b []byte) ([]*model.CustomerAddImport, error) {
|
|
|
+ f, err := excelize.OpenReader(bytes.NewBuffer(b))
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ sheet := "Sheet1"
|
|
|
+ rows := f.GetRows(sheet)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 客户名称 助计名 所在地区 详细地址 所在省 所在市 所在区县 客户行业 客户级别 客户来源 备注 销售名称 开票抬头 关联客户 姓名 性别 电话 微信 邮箱 部门 职位 办公地点 是否关键决策人 招标关键字
|
|
|
+ var saleTargets []*model.CustomerAddImport
|
|
|
+ for _, row := range rows[1:] {
|
|
|
+ temp := &model.CustomerAddImport{
|
|
|
+ CustName: row[0],
|
|
|
+ AbbrName: row[1],
|
|
|
+ CustAddress: row[2],
|
|
|
+ CustProvince: row[3],
|
|
|
+ CustCity: row[4],
|
|
|
+ CustRegion: row[5],
|
|
|
+ CustIndustry: row[6],
|
|
|
+ CustSource: row[7],
|
|
|
+ Keyword: row[8],
|
|
|
+ Remark: row[9],
|
|
|
+ CuctName: row[10],
|
|
|
+ CuctGender: row[11],
|
|
|
+ Telephone: row[12],
|
|
|
+ Wechat: row[13],
|
|
|
+ Email: row[14],
|
|
|
+ Dept: row[15],
|
|
|
+ Postion: row[16],
|
|
|
+ OfficeLocation: row[17],
|
|
|
+ IsDecision: row[18],
|
|
|
+ ContactRemark: row[19],
|
|
|
+ }
|
|
|
+
|
|
|
+ saleTargets = append(saleTargets, temp)
|
|
|
+ }
|
|
|
+
|
|
|
+ return saleTargets, nil
|
|
|
+}
|
|
|
+
|
|
|
// CreateBelong 创建客户归属信息
|
|
|
func (s *CustomerService) CreateBelong(custId int) (err error) {
|
|
|
belong := new(model.CustomerBelongAddSeq)
|