| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656 |
- package cust
- import (
- "bytes"
- "context"
- "fmt"
- "math"
- "strconv"
- "github.com/gogf/gf/database/gdb"
- "github.com/gogf/gf/encoding/gjson"
- "dashoo.cn/opms_libary/myerrors"
- "github.com/360EntSecGroup-Skylar/excelize"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/os/gtime"
- "github.com/gogf/gf/util/gconv"
- "dashoo.cn/micro/app/dao/cust"
- platdao "dashoo.cn/micro/app/dao/plat"
- model "dashoo.cn/micro/app/model/cust"
- "dashoo.cn/micro/app/service"
- )
- type CustomerService struct {
- *service.ContextService
- Dao *cust.CustCustomerDao
- BelongDao *cust.CustCustomerBelongDao
- DynamicsDao *cust.CustCustomerDynamicsDao
- ContactDao *cust.CustCustomerContactDao
- FollowDao *platdao.PlatFollowupDao
- BelongServer *CustomerbelongService
- ContanctServer *CustomercontactService
- }
- var isPublic, noPublic = "10", "20" // 公海,非公海
- var AllocaTion, OperaTion, Receive, Merge = "10", "20", "30", "40" // 10分配20转移30领取40合并
- type OpnType struct {
- OperaTion string
- }
- func NewCustomerService(ctx context.Context) (svc *CustomerService, err error) {
- svc = new(CustomerService)
- if svc.ContextService, err = svc.Init(ctx); err != nil {
- return nil, err
- }
- svc.Dao = cust.NewCustCustomerDao(svc.Tenant)
- svc.BelongDao = cust.NewCustCustomerBelongDao(svc.Tenant)
- svc.DynamicsDao = cust.NewCustCustomerDynamicsDao(svc.Tenant)
- svc.ContactDao = cust.NewCustCustomerContactDao(svc.Tenant)
- svc.FollowDao = platdao.NewPlatFollowupDao(svc.Tenant)
- svc.BelongServer, _ = NewCustomerBelongService(ctx)
- svc.ContanctServer, _ = NewCustomerContactService(ctx)
- return svc, nil
- }
- // GetList 客户列表列表
- func (s *CustomerService) GetList(req *model.CustCustomerSearchReq) (total int, customerList []*model.CustList, err error) {
- Model := s.Dao.M
- if req.TargetType == "" {
- if !req.IsPublic {
- Model = Model.Where(s.Dao.Columns.SalesId, s.CxtUser.Id).Where(s.Dao.Columns.IsPublic, noPublic)
- } else {
- Model = Model.Where(s.Dao.Columns.IsPublic, isPublic)
- }
- }
- //客户名称
- if req.CustName != "" {
- Model = Model.Where(s.Dao.Columns.CustName+" like ?", "%"+req.CustName+"%")
- }
- //客户编码
- if req.CustCode != "" {
- Model = Model.Where(s.Dao.Columns.CustCode+" like ?", "%"+req.CustCode+"%")
- }
- //客户行业
- if req.CustIndustry != "" {
- Model = Model.Where(s.Dao.Columns.CustIndustry+" like ?", "%"+req.CustIndustry+"%")
- }
- //客户级别
- if req.CustLevel != "" {
- Model = Model.Where(s.Dao.Columns.CustLevel, req.CustLevel)
- }
- //
- if req.FollowUpDate != "" {
- Model = Model.Where(s.Dao.Columns.FollowUpDate+" like ? ", req.FollowUpDate+"%")
- }
- total, err = Model.Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if req.IsRemovePage {
- Model = Model
- } else {
- Model = Model.Page(req.GetPage())
- }
- err = Model.Order("id desc").Scan(&customerList)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // Create 创建客户
- func (s *CustomerService) Create(req *model.CustomerAddSeq) (insertId int64, err error) {
- cusTomer := new(model.CustCustomer)
- count, err := s.Dao.Where(s.Dao.Columns.CustName, req.CustName).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if count > 0 {
- return 0, myerrors.NewMsgError(nil, "该客户信息已存在,不可重复添加")
- }
- if err = gconv.Struct(req, cusTomer); err != nil {
- return
- }
- service.SetCreatedInfo(cusTomer, s.GetCxtUserId(), s.CxtUser.NickName)
- cusTomer.CustCode = "CT" + strconv.Itoa(int(gtime.Timestamp()))
- cusTomer.CustStatus = "10"
- roles := s.GetCxtUserRoles()
- isSales := false
- for _, v := range roles {
- if v == "Sales" { // 销售角色
- isSales = true
- }
- }
- // 销售角色
- if isSales {
- cusTomer.IsPublic = noPublic
- cusTomer.SalesId = s.GetCxtUserId()
- cusTomer.SalesName = s.CxtUser.NickName
- insertId, err = s.Dao.InsertAndGetId(cusTomer)
- if err != nil {
- g.Log().Error(err)
- return 0, err
- }
- s.CreateBelong(gconv.Int(insertId))
- return
- } else {
- cusTomer.IsPublic = isPublic
- insertId, err = s.Dao.InsertAndGetId(cusTomer)
- if err != nil {
- g.Log().Error(err)
- return 0, err
- }
- }
- return insertId, err
- }
- // CreateBelong 创建客户归属信息
- func (s *CustomerService) CreateBelong(custId int) (err error) {
- belong := new(model.CustomerBelongAddSeq)
- belong.CustId = custId
- belong.SaleName = s.CxtUser.NickName
- belong.OpnType = AllocaTion
- belong.OpnPeople = s.CxtUser.NickName
- err = s.BelongServer.Create(belong)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // 删除客户
- func (s *CustomerService) DeleteByIds(Ids []int64) (err error) {
- customerCount, err := s.Dao.Where(" id in (?)", Ids).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if customerCount == 0 {
- err = myerrors.NewMsgError(nil, "客户信息不存在")
- return
- }
- //删除客户表
- _, err = s.Dao.Where("id in (?) ", Ids).Delete()
- if err == nil {
- _, err = s.ContactDao.Where("cust_id in (?)", Ids).Delete()
- if err == nil {
- _, err = s.BelongDao.Where("cust_id in (?)", Ids).Delete()
- if err != nil {
- g.Log().Error(err)
- return
- }
- } else {
- g.Log().Error(err)
- return
- }
- } else {
- g.Log().Error(err)
- return
- }
- return
- }
- // UpdateById 修改客户
- func (s *CustomerService) UpdateById(req *model.UpdateCustomer) (err error) {
- //判断数据是否存在
- count, err := s.Dao.Where("id = ", req.Id).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if count == 0 {
- return
- }
- //新的客户名字是否存在
- num, err := s.Dao.Where(s.Dao.Columns.CustName, req.CustName).WhereNot(s.Dao.Columns.Id, req.Id).Count()
- if err != nil {
- g.Log().Error(err)
- return err
- }
- if num > 0 {
- return myerrors.NewMsgError(nil, fmt.Sprintf("客户名称[%s]已存在", req.CustName))
- }
- CustomertData := new(model.CustomerAddSeq)
- if err = gconv.Struct(req, CustomertData); err != nil {
- return
- }
- service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.CxtUser.NickName)
- _, err = s.Dao.FieldsEx(s.Dao.Columns.CreatedTime, s.Dao.Columns.CreatedBy, s.Dao.Columns.CreatedName, s.Dao.Columns.Id, s.Dao.Columns.CustCode, s.Dao.Columns.SalesName, s.Dao.Columns.SalesId).
- WherePri(s.Dao.Columns.Id, req.Id).Update(CustomertData)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // MoveToPubic 移入公海
- func (s *CustomerService) MoveToPubic(Ids []int64) (err error) {
- count, err := s.Dao.WhereIn(s.Dao.Columns.Id, Ids).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if count == 0 {
- err = myerrors.NewMsgError(nil, "没有要移除的数据")
- return
- }
- userName := s.GetCxtUserName()
- currentTime := gtime.Now()
- s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- //更新客户信息
- _, err = s.Dao.Data(g.Map{
- "is_public": isPublic,
- "sales_id": 0,
- "sales_name": "",
- "dept_id": 0,
- "dept_name": "",
- "create_time": currentTime,
- "updated_by": s.GetCxtUserId(),
- "updated_name": userName,
- "updated_time": currentTime,
- }).WhereIn(s.ContactDao.Columns.Id, Ids).Update()
- if err != nil {
- g.Log().Error(err)
- return err
- }
- //更新销售归属表结束时间
- _, err = s.BelongDao.Data(
- g.Map{
- "updated_by": s.GetCxtUserId(),
- "updated_name": userName,
- "end_date": currentTime,
- }).WhereIn(s.BelongDao.Columns.CustId, Ids).Update()
- if err != nil {
- g.Log().Error(err)
- return err
- }
- return nil
- })
- return
- }
- // AssignCustomer 分配客户
- func (s *CustomerService) AssignCustomer(req *model.AssignCustomerReq) (err error) {
- data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if len(data) == 0 {
- return myerrors.NewMsgError(nil, "无可分配客户")
- }
- for _, v := range data {
- if v.SalesId != 0 {
- return myerrors.NewMsgError(nil, fmt.Sprintf("客户名称[%s]已被领取或分配", v.CustName))
- }
- }
- err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
- if err != nil {
- return
- }
- if req.Receive != "" {
- req.Receive = Receive
- } else {
- req.Receive = AllocaTion
- }
- s.BatchCreatebelong(data, req)
- return
- }
- // GetEntityById 客户详情
- func (s *CustomerService) GetEntityById(Ids []int64) (entityInfo []*model.CustList, err error) {
- Model := s.Dao //
- err = Model.Where(" id in (?)", Ids).Scan(&entityInfo)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // GetCustNameIsExist 判断客户名称是否存在
- func (s *CustomerService) GetCustNameIsExist(req *model.IsExistsCustName) (exist bool, err error) {
- custDao := s.Dao.M
- if req.Id > 0 {
- custDao = custDao.Where("cust_name = ", req.CustName).WhereNot(" id ", req.Id)
- } else {
- custDao = custDao.Where("cust_name = ", req.CustName)
- }
- count, err := custDao.Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- exist = false
- if count > 0 {
- exist = true
- }
- return
- }
- // CustAbstract 客户摘要
- func (s *CustomerService) CustAbstract(Id int64) (followInfo *model.Follow, err error) {
- count, err := s.FollowDao.Where(s.FollowDao.Columns.CustId, Id).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- followInfo = new(model.Follow)
- followInfo.FollowCount = count
- followTime, err := s.Dao.Fields(s.Dao.Columns.FollowUpDate, s.Dao.Columns.CreatedTime).FindOne(Id)
- if err != nil {
- g.Log().Error(err)
- return
- }
- now := gtime.Now()
- var hours float64
- if followTime.FollowUpDate == nil {
- poor := now.Sub(gtime.New(followTime.CreatedTime))
- hours = float64(poor.Hours() / 24)
- } else {
- poor := now.Sub(gtime.New(followTime.FollowUpDate))
- hours = float64(poor.Hours() / 24)
- }
- if hours < 0 {
- followInfo.NotFollowDay = 0
- } else {
- followInfo.NotFollowDay = int(math.Floor(hours))
- }
- return
- }
- // TransCustomer 转移客户
- func (s *CustomerService) TransCustomer(req *model.AssignCustomerReq) (err error) {
- data, err := s.Dao.Fields("sales_id,sales_name,id").Where("id in (?)", req.Ids).All()
- if err != nil {
- g.Log().Error(err)
- return err
- }
- if len(data) == 0 {
- return myerrors.NewMsgError(nil, "数据不存在")
- }
- err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
- if err != nil {
- g.Log().Error(err)
- return
- }
- req.Receive = OperaTion
- s.BatchCreatebelong(data, req)
- return
- }
- // ChangeCustBelong 变更客户所属关系
- func (s *CustomerService) ChangeCustBelong(Ids []int64, salesId int64, salesName string) (err error) {
- _, err = s.Dao.Data(g.Map{
- "sales_id": salesId,
- "is_public": noPublic,
- "sales_name": salesName,
- "updated_by": s.GetCxtUserId(),
- "updated_name": s.GetCxtUserName(),
- "updated_time": gtime.Now(),
- }).Where("id in (?)", Ids).Update()
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- //CreateDynamics 创建客户动态信息
- func (s *CustomerService) CreateDynamics(opnTpye string, content interface{}, ids ...int64) (err error) {
- datas := make([]*model.CustCustomerDynamics, 0)
- for _, id := range ids {
- dynameics := new(model.CustCustomerDynamics)
- dynameics.CustId = int(id)
- dynameics.OpnPeopleId = s.GetCxtUserId()
- dynameics.OpnPeople = s.GetCxtUserName()
- dynameics.OpnDate = gtime.Now()
- dynameics.OpnType = opnTpye
- v, _ := gjson.Encode(content)
- dynameics.OpnContent = gconv.String(v)
- service.SetCreatedInfo(dynameics, s.GetCxtUserId(), s.GetCxtUserName())
- datas = append(datas, dynameics)
- }
- _, err = s.DynamicsDao.Insert(datas)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // GetDynamicsList 客户动态
- func (s *CustomerService) GetDynamicsList(req *model.CustomerDynameicsReq) (total int, result []interface{}, err error) {
- total, err = s.DynamicsDao.Where("cust_id = ", req.CustId).Count()
- if err != nil {
- g.Log().Error(err)
- return
- }
- dynamics := []*model.CustomerDynameicsRep{}
- err = s.DynamicsDao.Where("cust_id = ?", req.CustId).Order("created_time desc").Scan(&dynamics)
- if err != nil {
- g.Log().Error(err)
- return
- }
- dynamicsList := make(map[string][]*model.CustomerDynameicsRep)
- for _, v := range dynamics {
- opnDate := gtime.New(v.OpnDate).Format("Y-m-d")
- dynamicsList[opnDate] = append(dynamicsList[opnDate], &model.CustomerDynameicsRep{
- OpnPeople: v.OpnPeople,
- OpnDate: v.OpnDate,
- OpnType: v.OpnType,
- OpnContent: v.OpnContent,
- })
- }
- result = append(result, dynamicsList)
- return
- }
- // MergeCustomer 合并客户
- func (s *CustomerService) MergeCustomer(req *model.MergeCustomerRep) (err error) {
- //当前目标客户是否存在并取出合并前的销售
- customer, err := s.Dao.Where("id = ", req.Id).One()
- if err != nil {
- g.Log().Error(err)
- return
- }
- if customer == nil {
- return myerrors.NewMsgError(nil, "该客户不存在")
- }
- _, err = s.ContactDao.Where(" cust_id in (?)", req.ChooseId).Delete()
- if err != nil {
- g.Log().Error(err)
- return
- }
- CustomertData := new(model.CustomerAddSeq)
- if err = gconv.Struct(req, CustomertData); err != nil {
- g.Log().Error(err)
- return
- }
- service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.GetCxtUserName())
- _, err = s.Dao.FieldsEx(s.Dao.Columns.CreatedTime, s.Dao.Columns.CreatedBy,
- s.Dao.Columns.CreatedName, s.Dao.Columns.Id,
- s.Dao.Columns.CustCode).WherePri(s.Dao.Columns.Id, req.Id).Update(CustomertData)
- if err != nil {
- g.Log().Error(err)
- return
- }
- //删除被合并的客户信息
- _, err = s.Dao.Where(" id in (?)", req.ChooseId).Delete()
- if err != nil {
- g.Log().Error(err)
- return
- }
- //删除 所选客户销售联系人
- _, err = s.BelongDao.Where(" cust_id in (?)", req.ChooseId).Delete()
- if err != nil {
- g.Log().Error(err)
- return
- }
- //插入一条合并成功的归属记录
- //更新销售归属表销售结束时间
- _, err = s.BelongDao.Data(
- g.Map{
- "updated_by": s.GetCxtUserId(),
- "updated_name": s.GetCxtUserName(),
- "end_date": gtime.Now(),
- }).WhereIn(s.BelongDao.Columns.CustId, req.Id).Update()
- if err != nil {
- g.Log().Error(err)
- return
- }
- req.CustomerBelongAddSeq.CustId = int(req.Id)
- req.CustomerBelongAddSeq.OpnType = Merge
- req.CustomerBelongAddSeq.OpnPeople = s.GetCxtUserName()
- req.CustomerBelongAddSeq.OrigSaleName = customer.SalesName
- req.CustomerBelongAddSeq.SaleName = req.SalesName
- s.BelongServer.Create(req.CustomerBelongAddSeq)
- return
- }
- // Createcontact 联系人(合并)预留
- func (s *CustomerService) Createcontact(Ids []int64, req *model.CustCustomerContactSeq) (err error) {
- _, err = s.ContactDao.Where(" cust_id in (?)", Ids).Delete()
- if err != nil {
- g.Log().Error(err)
- return
- }
- s.ContanctServer.Create(req)
- return
- }
- // BatchCreatebelong 批量插入客户归属记录表
- func (s *CustomerService) BatchCreatebelong(rep []*model.CustCustomer, req *model.AssignCustomerReq, n ...interface{}) (err error) {
- //更新销售归属表销售结束时间
- _, err = s.BelongDao.Data(
- g.Map{
- "updated_by": s.GetCxtUserId(),
- "updated_name": s.GetCxtUserName(),
- "end_date": gtime.Now(),
- }).WhereIn(s.BelongDao.Columns.CustId, req.Ids).Update()
- if err != nil {
- g.Log().Error(err)
- return
- }
- var belongData []*model.CustCustomerBelong
- userName := s.GetCxtUserName()
- for _, v := range rep {
- orig_sale_name := v.SalesName
- belong := new(model.CustCustomerBelong)
- belong.CustId = v.Id
- belong.SaleName = req.SalesName
- belong.OrigSaleName = orig_sale_name
- belong.OpnType = req.Receive
- belong.OpnPeople = userName
- belong.CreatedName = userName
- belong.StartDate = gtime.Now() //新增开始时间
- belong.OpnDatetime = gtime.Now()
- belong.Remark = req.Remark
- belong.CreatedBy = s.GetCxtUserId()
- belongData = append(belongData, belong)
- }
- _, err = s.BelongDao.Insert(belongData)
- if err != nil {
- g.Log().Error(err)
- return
- }
- return
- }
- // 导出数据
- func (s *CustomerService) Export(req *model.CustCustomerExport) (content *model.CustExport, err error) {
- var con model.CustExport
- req.IsRemovePage = true // 去掉分页标识
- total, data, err := s.GetList(&req.CustCustomerSearchReq)
- if err != nil {
- return
- }
- f := excelize.NewFile()
- index := f.NewSheet("Sheet1")
- for index, item := range req.Columns {
- sheetPosition := service.Div(index+1) + "1"
- f.SetCellValue("Sheet1", sheetPosition, item)
- }
- if total > 0 {
- for ck, item := range data {
- for index, v := range req.Columns {
- if v == "客户编码" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustCode)
- }
- if v == "客户名称" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustName)
- }
- if v == "助记名" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
- }
- if v == "助记名" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
- }
- if v == "所在地区" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLocation)
- }
- if v == "客户行业" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustIndustry)
- }
- if v == "客户级别" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLevel)
- }
- if v == "客户状态" {
- var CustStatus string
- CustStatus = "正常"
- if item.CustStatus != "10" {
- CustStatus = "异常"
- }
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), CustStatus)
- }
- if v == "最后跟进时间" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.FollowUpDate)
- }
- if v == "创建时间" {
- f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CreatedTime)
- }
- }
- }
- }
- f.SetActiveSheet(index)
- var buffer *bytes.Buffer
- buffer, _ = f.WriteToBuffer()
- con.Content = buffer.Bytes()
- return &con, err
- }
|