cust_customer.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. package cust
  2. import (
  3. "bytes"
  4. "context"
  5. "fmt"
  6. "math"
  7. "strconv"
  8. "strings"
  9. "dashoo.cn/opms_libary/myerrors"
  10. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  11. "dashoo.cn/opms_libary/plugin/dingtalk/workflow"
  12. "github.com/360EntSecGroup-Skylar/excelize"
  13. "github.com/gogf/gf/database/gdb"
  14. "github.com/gogf/gf/encoding/gjson"
  15. "github.com/gogf/gf/frame/g"
  16. "github.com/gogf/gf/os/gtime"
  17. "github.com/gogf/gf/util/gconv"
  18. "github.com/mozillazg/go-pinyin"
  19. "dashoo.cn/micro/app/dao/cust"
  20. platdao "dashoo.cn/micro/app/dao/plat"
  21. sysDao "dashoo.cn/micro/app/dao/sys"
  22. model "dashoo.cn/micro/app/model/cust"
  23. workflowModel "dashoo.cn/micro/app/model/workflow"
  24. "dashoo.cn/micro/app/service"
  25. workflowService "dashoo.cn/micro/app/service/workflow"
  26. )
  27. type CustomerService struct {
  28. *service.ContextService
  29. Dao *cust.CustCustomerDao
  30. BelongDao *cust.CustCustomerBelongDao
  31. DynamicsDao *cust.CustCustomerDynamicsDao
  32. ContactDao *cust.CustCustomerContactDao
  33. FollowDao *platdao.PlatFollowupDao
  34. UserDao *sysDao.SysUserDao
  35. BelongServer *CustomerbelongService
  36. ContanctServer *CustomercontactService
  37. }
  38. var isPublic, noPublic = "10", "20" // 公海,非公海
  39. var AllocaTion, OperaTion, Receive, Merge = "10", "20", "30", "40" // 10分配20转移30领取40合并
  40. type OpnType struct {
  41. OperaTion string
  42. }
  43. func NewCustomerService(ctx context.Context) (svc *CustomerService, err error) {
  44. svc = new(CustomerService)
  45. if svc.ContextService, err = svc.Init(ctx); err != nil {
  46. return nil, err
  47. }
  48. svc.Dao = cust.NewCustCustomerDao(svc.Tenant)
  49. svc.BelongDao = cust.NewCustCustomerBelongDao(svc.Tenant)
  50. svc.DynamicsDao = cust.NewCustCustomerDynamicsDao(svc.Tenant)
  51. svc.ContactDao = cust.NewCustCustomerContactDao(svc.Tenant)
  52. svc.FollowDao = platdao.NewPlatFollowupDao(svc.Tenant)
  53. svc.BelongServer, _ = NewCustomerBelongService(ctx)
  54. svc.ContanctServer, _ = NewCustomerContactService(ctx)
  55. svc.UserDao = sysDao.NewSysUserDao(svc.Tenant)
  56. return svc, nil
  57. }
  58. // GetList 客户列表列表
  59. func (s *CustomerService) GetList(req *model.CustCustomerSearchReq) (total int, customerList []*model.CustList, err error) {
  60. Model := s.Dao.M
  61. if req.TargetType == "" {
  62. if !req.IsPublic {
  63. Model = Model.Where(s.Dao.Columns.SalesId, s.CxtUser.Id).Where(s.Dao.Columns.IsPublic, noPublic)
  64. } else {
  65. Model = Model.Where(s.Dao.Columns.IsPublic, isPublic)
  66. }
  67. }
  68. //客户名称
  69. if req.CustName != "" {
  70. Model = Model.Where(s.Dao.Columns.CustName+" like ?", "%"+req.CustName+"%")
  71. }
  72. //客户编码
  73. if req.CustCode != "" {
  74. Model = Model.Where(s.Dao.Columns.CustCode+" like ?", "%"+req.CustCode+"%")
  75. }
  76. //客户行业
  77. if req.CustIndustry != "" {
  78. Model = Model.Where(s.Dao.Columns.CustIndustry+" like ?", "%"+req.CustIndustry+"%")
  79. }
  80. //客户级别
  81. if req.CustLevel != "" {
  82. Model = Model.Where(s.Dao.Columns.CustLevel, req.CustLevel)
  83. }
  84. //
  85. if req.FollowUpDate != "" {
  86. Model = Model.Where(s.Dao.Columns.FollowUpDate+" like ? ", req.FollowUpDate+"%")
  87. }
  88. if req.IsRemovePage {
  89. Model = Model
  90. } else {
  91. Model = Model.Page(req.GetPage())
  92. }
  93. total, err = Model.Count()
  94. if err != nil {
  95. g.Log().Error(err)
  96. err = myerrors.DbError("获取总行数失败。")
  97. return
  98. }
  99. err = Model.Order("id desc").Scan(&customerList)
  100. if err != nil {
  101. g.Log().Error(err)
  102. return
  103. }
  104. return
  105. }
  106. func (s *CustomerService) customerCode(province, industry string) (string, error) {
  107. sequence, err := service.Sequence(s.Dao.DB, "customer_code")
  108. if err != nil {
  109. return "", err
  110. }
  111. return s.customerProvinceCode(province) + industry + sequence, nil
  112. }
  113. func (s *CustomerService) customerProvinceCode(province string) string {
  114. province = strings.Trim(province, "市")
  115. province = strings.Trim(province, "省")
  116. province = strings.Trim(province, "特别行政区")
  117. province = strings.Trim(province, "自治区")
  118. province = strings.Trim(province, "壮族")
  119. province = strings.Trim(province, "回族")
  120. province = strings.Trim(province, "维吾尔")
  121. pinyinArg := pinyin.NewArgs()
  122. pinyinArg.Style = pinyin.FIRST_LETTER
  123. provincePinyin := pinyin.Pinyin(province, pinyinArg)
  124. provinceFirstletter := []string{}
  125. for _, i := range provincePinyin {
  126. provinceFirstletter = append(provinceFirstletter, i[0])
  127. }
  128. provinceCode := strings.Join(provinceFirstletter, "")
  129. provinceCode = strings.ToUpper(provinceCode)
  130. fmt.Println(provincePinyin, provinceFirstletter, provinceCode)
  131. return provinceCode
  132. }
  133. // Create 创建客户
  134. func (s *CustomerService) Create(req *model.CustomerAddSeq) (insertId int64, err error) {
  135. cusTomer := new(model.CustCustomer)
  136. count, err := s.Dao.Where(s.Dao.Columns.CustName, req.CustName).Count()
  137. if err != nil {
  138. g.Log().Error(err)
  139. return
  140. }
  141. if count > 0 {
  142. return 0, myerrors.TipsError("该客户信息已存在,不可重复添加")
  143. }
  144. if err = gconv.Struct(req, cusTomer); err != nil {
  145. return
  146. }
  147. service.SetCreatedInfo(cusTomer, s.GetCxtUserId(), s.CxtUser.NickName)
  148. custCode, err := s.customerCode(req.CustProvince, req.CustIndustryCode)
  149. if err != nil {
  150. return 0, err
  151. }
  152. cusTomer.CustCode = custCode
  153. cusTomer.CustStatus = "10"
  154. roles := s.GetCxtUserRoles()
  155. isSales := false
  156. for _, v := range roles {
  157. if v == "Sales" { // 销售角色
  158. isSales = true
  159. break
  160. }
  161. }
  162. // 销售角色
  163. if isSales {
  164. cusTomer.IsPublic = noPublic
  165. cusTomer.SalesId = s.GetCxtUserId()
  166. cusTomer.SalesName = s.CxtUser.NickName
  167. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  168. if err != nil {
  169. g.Log().Error(err)
  170. return 0, err
  171. }
  172. s.CreateBelong(gconv.Int(insertId))
  173. return
  174. } else {
  175. cusTomer.IsPublic = isPublic
  176. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  177. if err != nil {
  178. g.Log().Error(err)
  179. return 0, err
  180. }
  181. }
  182. return insertId, err
  183. }
  184. // CreateBelong 创建客户归属信息
  185. func (s *CustomerService) CreateBelong(custId int) (err error) {
  186. belong := new(model.CustomerBelongAddSeq)
  187. belong.CustId = custId
  188. belong.SaleName = s.CxtUser.NickName
  189. belong.OpnType = AllocaTion
  190. belong.OpnPeople = s.CxtUser.NickName
  191. err = s.BelongServer.Create(belong)
  192. if err != nil {
  193. g.Log().Error(err)
  194. return
  195. }
  196. return
  197. }
  198. // 删除客户
  199. func (s *CustomerService) DeleteByIds(Ids []int64) (err error) {
  200. customerCount, err := s.Dao.Where(" id in (?)", Ids).Count()
  201. if err != nil {
  202. g.Log().Error(err)
  203. return
  204. }
  205. if customerCount == 0 {
  206. err = myerrors.TipsError("客户信息不存在")
  207. return
  208. }
  209. //删除客户表
  210. s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  211. //客户表
  212. _, err = s.Dao.TX(tx).Where("id in (?)", Ids).Delete()
  213. if err != nil {
  214. g.Log().Error(err)
  215. return err
  216. }
  217. //客户联系人表
  218. _, err = s.ContactDao.Where("cust_id in (?)", Ids).Delete()
  219. if err != nil {
  220. g.Log().Error(err)
  221. return err
  222. }
  223. //客户归属表
  224. _, err = s.BelongDao.Where("cust_id in (?)", Ids).Delete()
  225. if err != nil {
  226. g.Log().Error(err)
  227. return err
  228. }
  229. return nil
  230. })
  231. return
  232. }
  233. // UpdateById 修改客户
  234. func (s *CustomerService) UpdateById(req *model.UpdateCustomer) (err error) {
  235. //判断数据是否存在
  236. count, err := s.Dao.Where("id = ", req.Id).Count()
  237. if err != nil {
  238. g.Log().Error(err)
  239. return
  240. }
  241. if count == 0 {
  242. return
  243. }
  244. //新的客户名字是否存在
  245. num, err := s.Dao.Where(s.Dao.Columns.CustName, req.CustName).WhereNot(s.Dao.Columns.Id, req.Id).Count()
  246. if err != nil {
  247. g.Log().Error(err)
  248. return err
  249. }
  250. if num > 0 {
  251. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已存在", req.CustName))
  252. }
  253. CustomertData := new(model.CustomerAddSeq)
  254. if err = gconv.Struct(req, CustomertData); err != nil {
  255. return
  256. }
  257. service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.CxtUser.NickName)
  258. _, 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).
  259. WherePri(s.Dao.Columns.Id, req.Id).Update(CustomertData)
  260. if err != nil {
  261. g.Log().Error(err)
  262. return
  263. }
  264. return
  265. }
  266. // MoveToPubic 移入公海
  267. func (s *CustomerService) MoveToPubic(Ids []int64) (err error) {
  268. count, err := s.Dao.WhereIn(s.Dao.Columns.Id, Ids).Count()
  269. if err != nil {
  270. g.Log().Error(err)
  271. return
  272. }
  273. if count == 0 {
  274. err = myerrors.TipsError("没有要移除的数据")
  275. return
  276. }
  277. userName := s.GetCxtUserName()
  278. currentTime := gtime.Now() // 当前时间
  279. s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  280. //更新客户信息
  281. _, err = s.Dao.TX(tx).Data(g.Map{
  282. "is_public": isPublic,
  283. "sales_id": 0,
  284. "dept_id": 0,
  285. "dept_name": "",
  286. "create_time": currentTime,
  287. "updated_by": s.GetCxtUserId(),
  288. "updated_name": userName,
  289. "updated_time": currentTime,
  290. }).WhereIn(s.ContactDao.Columns.Id, Ids).Update()
  291. if err != nil {
  292. g.Log().Error(err)
  293. return err
  294. }
  295. //更新销售归属表结束时间
  296. _, err = s.BelongDao.TX(tx).Data(
  297. g.Map{
  298. "updated_by": s.GetCxtUserId(),
  299. "updated_name": userName,
  300. "end_date": currentTime,
  301. }).WhereIn(s.BelongDao.Columns.CustId, Ids).Update()
  302. if err != nil {
  303. g.Log().Error(err)
  304. return err
  305. }
  306. return nil
  307. })
  308. return
  309. }
  310. var AssignCustomerRequestProcessCode = ""
  311. func ptrString(s string) *string {
  312. return &s
  313. }
  314. // 领取客户申请
  315. func (s *CustomerService) AssignCustomerRequest(ctx context.Context, req *model.AssignCustomerReq) error {
  316. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  317. if err != nil {
  318. return err
  319. }
  320. if len(data) == 0 {
  321. return myerrors.TipsError("领取用户不能为空")
  322. }
  323. for _, v := range data {
  324. if v.CustStatus != "10" {
  325. return myerrors.TipsError(fmt.Sprintf("客户: %s 已被领取", v.CustName))
  326. }
  327. }
  328. workflowSrv, err := workflowService.NewFlowService(ctx)
  329. if err != nil {
  330. return err
  331. }
  332. for _, u := range data {
  333. bizCode := strconv.Itoa(u.Id) + ":" + strconv.Itoa(s.GetCxtUserId())
  334. _, err = workflowSrv.StartProcessInstance(bizCode, "11", &workflow.StartProcessInstanceRequest{
  335. ProcessCode: &AssignCustomerRequestProcessCode,
  336. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  337. {
  338. Name: ptrString(""),
  339. Value: ptrString(""),
  340. },
  341. },
  342. })
  343. if err != nil {
  344. return err
  345. }
  346. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  347. "is_public": noPublic,
  348. "cust_status": "20",
  349. }).Update()
  350. if err != nil {
  351. return err
  352. }
  353. }
  354. return nil
  355. }
  356. func (s *CustomerService) AssignCustomerRequestApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  357. bizCode := strings.Split(flow.BizCode, ":")
  358. if len(bizCode) != 2 {
  359. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  360. }
  361. custId, err := strconv.Atoi(bizCode[0])
  362. if err != nil {
  363. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  364. }
  365. userId, err := strconv.Atoi(bizCode[1])
  366. if err != nil {
  367. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  368. }
  369. user, err := s.UserDao.Where("id = ?", userId).One()
  370. if err != nil {
  371. return err
  372. }
  373. if user == nil {
  374. return fmt.Errorf("用户不存在:%s Id: %d", flow.BizCode, flow.Id)
  375. }
  376. cust, err := s.Dao.Where("id = ?", custId).One()
  377. if err != nil {
  378. return err
  379. }
  380. if cust == nil {
  381. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  382. }
  383. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  384. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  385. }
  386. if msg.Result != "agree" && msg.Result != "refuse" {
  387. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  388. }
  389. if msg.ProcessType == "terminate" {
  390. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  391. "is_public": isPublic,
  392. "cust_status": "10",
  393. }).Update()
  394. return err
  395. }
  396. pass := msg.Result == "agree"
  397. if !pass {
  398. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  399. "is_public": isPublic,
  400. "cust_status": "10",
  401. }).Update()
  402. return err
  403. }
  404. err = s.ChangeCustBelong([]int64{int64(custId)}, int64(userId), user.NickName)
  405. if err != nil {
  406. return err
  407. }
  408. s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
  409. Ids: []int64{int64(custId)},
  410. SalesId: int64(user.Id),
  411. SalesName: user.NickName,
  412. Remark: "",
  413. Receive: Receive,
  414. })
  415. return nil
  416. }
  417. // AssignCustomer 分配客户
  418. func (s *CustomerService) AssignCustomer(ctx context.Context, req *model.AssignCustomerReq) (err error) {
  419. if req.Receive != "" {
  420. return s.AssignCustomerRequest(ctx, req)
  421. }
  422. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  423. if err != nil {
  424. g.Log().Error(err)
  425. return
  426. }
  427. if len(data) == 0 {
  428. return myerrors.TipsError("无可分配客户")
  429. }
  430. for _, v := range data {
  431. if v.SalesId != 0 {
  432. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已被领取或分配", v.CustName))
  433. }
  434. }
  435. err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
  436. if err != nil {
  437. return
  438. }
  439. if req.Receive != "" {
  440. req.Receive = Receive
  441. } else {
  442. req.Receive = AllocaTion
  443. }
  444. s.BatchCreatebelong(data, req)
  445. return
  446. }
  447. // GetEntityById 客户详情
  448. func (s *CustomerService) GetEntityById(Ids []int64) (entityInfo []*model.CustList, err error) {
  449. Model := s.Dao //
  450. err = Model.Where(" id in (?)", Ids).Scan(&entityInfo)
  451. if err != nil {
  452. g.Log().Error(err)
  453. return
  454. }
  455. return
  456. }
  457. // GetCustNameIsExist 判断客户名称是否存在
  458. func (s *CustomerService) GetCustNameIsExist(req *model.IsExistsCustName) (exist bool, err error) {
  459. custDao := s.Dao.M
  460. if req.Id > 0 {
  461. custDao = custDao.Where("cust_name = ", req.CustName).WhereNot(" id ", req.Id)
  462. } else {
  463. custDao = custDao.Where("cust_name = ", req.CustName)
  464. }
  465. count, err := custDao.Count()
  466. if err != nil {
  467. g.Log().Error(err)
  468. return
  469. }
  470. exist = false
  471. if count > 0 {
  472. exist = true
  473. }
  474. return
  475. }
  476. // CustAbstract 客户摘要
  477. func (s *CustomerService) CustAbstract(Id int64) (followInfo *model.Follow, err error) {
  478. count, err := s.FollowDao.Where(s.FollowDao.Columns.CustId, Id).Count()
  479. if err != nil {
  480. g.Log().Error(err)
  481. return
  482. }
  483. followInfo = new(model.Follow)
  484. followInfo.FollowCount = count
  485. followTime, err := s.Dao.Fields(s.Dao.Columns.FollowUpDate, s.Dao.Columns.CreatedTime).FindOne(Id)
  486. if err != nil {
  487. g.Log().Error(err)
  488. return
  489. }
  490. if followTime == nil {
  491. err = myerrors.TipsError("获取客户信息不存在")
  492. return
  493. }
  494. now := gtime.Now()
  495. var hours float64
  496. if followTime.FollowUpDate == nil {
  497. poor := now.Sub(gtime.New(followTime.CreatedTime))
  498. hours = float64(poor.Hours() / 24)
  499. } else {
  500. poor := now.Sub(gtime.New(followTime.FollowUpDate))
  501. hours = float64(poor.Hours() / 24)
  502. }
  503. if hours < 0 {
  504. followInfo.NotFollowDay = 0
  505. } else {
  506. followInfo.NotFollowDay = int(math.Floor(hours))
  507. }
  508. return
  509. }
  510. // TransCustomer 转移客户
  511. func (s *CustomerService) TransCustomer(req *model.AssignCustomerReq) (err error) {
  512. data, err := s.Dao.Fields("sales_id,sales_name,id").Where("id in (?)", req.Ids).All()
  513. if err != nil {
  514. g.Log().Error(err)
  515. return err
  516. }
  517. if len(data) == 0 {
  518. return myerrors.TipsError("数据不存在")
  519. }
  520. err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
  521. if err != nil {
  522. g.Log().Error(err)
  523. return
  524. }
  525. req.Receive = OperaTion
  526. s.BatchCreatebelong(data, req)
  527. return
  528. }
  529. // ChangeCustBelong 变更客户所属关系
  530. func (s *CustomerService) ChangeCustBelong(Ids []int64, salesId int64, salesName string) (err error) {
  531. _, err = s.Dao.Data(g.Map{
  532. "cust_status": "30",
  533. "sales_id": salesId,
  534. "is_public": noPublic,
  535. "sales_name": salesName,
  536. "updated_by": s.GetCxtUserId(),
  537. "updated_name": s.GetCxtUserName(),
  538. "updated_time": gtime.Now(),
  539. }).Where("id in (?)", Ids).Update()
  540. return err
  541. }
  542. // CreateDynamics 创建客户动态信息
  543. func (s *CustomerService) CreateDynamics(opnTpye string, content interface{}, ids ...int64) (err error) {
  544. datas := make([]*model.CustCustomerDynamics, 0)
  545. for _, id := range ids {
  546. dynameics := new(model.CustCustomerDynamics)
  547. dynameics.CustId = int(id)
  548. dynameics.OpnPeopleId = s.GetCxtUserId()
  549. dynameics.OpnPeople = s.GetCxtUserName()
  550. dynameics.OpnDate = gtime.Now()
  551. dynameics.OpnType = opnTpye
  552. v, _ := gjson.Encode(content)
  553. dynameics.OpnContent = gconv.String(v)
  554. service.SetCreatedInfo(dynameics, s.GetCxtUserId(), s.GetCxtUserName())
  555. datas = append(datas, dynameics)
  556. }
  557. _, err = s.DynamicsDao.Insert(datas)
  558. if err != nil {
  559. g.Log().Error(err)
  560. return
  561. }
  562. return
  563. }
  564. // GetDynamicsList 客户动态
  565. func (s *CustomerService) GetDynamicsList(req *model.CustomerDynameicsReq) (total int, result []interface{}, err error) {
  566. total, err = s.DynamicsDao.Where("cust_id = ", req.CustId).Count()
  567. if err != nil {
  568. g.Log().Error(err)
  569. return
  570. }
  571. dynamics := []*model.CustomerDynameicsRep{}
  572. err = s.DynamicsDao.Where("cust_id = ", req.CustId).Order("created_time desc").Scan(&dynamics)
  573. if err != nil {
  574. g.Log().Error(err)
  575. return
  576. }
  577. dynamicsList := make(map[string][]*model.CustomerDynameicsRep)
  578. for _, v := range dynamics {
  579. opnDate := gtime.New(v.OpnDate).Format("Y-m-d")
  580. dynamicsList[opnDate] = append(dynamicsList[opnDate], &model.CustomerDynameicsRep{
  581. OpnPeople: v.OpnPeople,
  582. OpnDate: v.OpnDate,
  583. OpnType: v.OpnType,
  584. OpnContent: v.OpnContent,
  585. })
  586. }
  587. result = append(result, dynamicsList)
  588. return
  589. }
  590. // MergeCustomer 合并客户
  591. func (s *CustomerService) MergeCustomer(req *model.MergeCustomerRep) (err error) {
  592. //当前目标客户是否存在并取出合并前的销售
  593. customer, err := s.Dao.Where("id = ", req.Id).One()
  594. if err != nil {
  595. g.Log().Error(err)
  596. return
  597. }
  598. if customer == nil {
  599. return myerrors.TipsError("该客户不存在")
  600. }
  601. _, err = s.ContactDao.Where(" cust_id in (?)", req.ChooseId).Delete()
  602. if err != nil {
  603. g.Log().Error(err)
  604. return
  605. }
  606. CustomertData := new(model.CustomerAddSeq)
  607. if err = gconv.Struct(req, CustomertData); err != nil {
  608. g.Log().Error(err)
  609. return
  610. }
  611. service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.GetCxtUserName())
  612. _, err = s.Dao.FieldsEx(s.Dao.Columns.CreatedTime, s.Dao.Columns.CreatedBy,
  613. s.Dao.Columns.CreatedName, s.Dao.Columns.Id,
  614. s.Dao.Columns.CustCode).WherePri(s.Dao.Columns.Id, req.Id).Update(CustomertData)
  615. if err != nil {
  616. g.Log().Error(err)
  617. return
  618. }
  619. //删除被合并的客户信息
  620. _, err = s.Dao.Where(" id in (?)", req.ChooseId).Delete()
  621. if err != nil {
  622. g.Log().Error(err)
  623. return
  624. }
  625. //删除 所选客户销售联系人
  626. _, err = s.BelongDao.Where(" cust_id in (?)", req.ChooseId).Delete()
  627. if err != nil {
  628. g.Log().Error(err)
  629. return
  630. }
  631. //插入一条合并成功的归属记录
  632. //更新销售归属表销售结束时间
  633. _, err = s.BelongDao.Data(
  634. g.Map{
  635. "updated_by": s.GetCxtUserId(),
  636. "updated_name": s.GetCxtUserName(),
  637. "end_date": gtime.Now(),
  638. }).WhereIn(s.BelongDao.Columns.CustId, req.Id).Update()
  639. if err != nil {
  640. g.Log().Error(err)
  641. return
  642. }
  643. req.CustomerBelongAddSeq.CustId = int(req.Id)
  644. req.CustomerBelongAddSeq.OpnType = Merge
  645. req.CustomerBelongAddSeq.OpnPeople = s.GetCxtUserName()
  646. req.CustomerBelongAddSeq.OrigSaleName = customer.SalesName
  647. req.CustomerBelongAddSeq.SaleName = req.SalesName
  648. s.BelongServer.Create(req.CustomerBelongAddSeq)
  649. return
  650. }
  651. // CreateContact 联系人(合并)预留
  652. func (s *CustomerService) CreateContact(Ids []int64, req *model.CustCustomerContactSeq) (err error) {
  653. _, err = s.ContactDao.Where(" cust_id in (?)", Ids).Delete()
  654. if err != nil {
  655. g.Log().Error(err)
  656. return
  657. }
  658. s.ContanctServer.Create(req)
  659. return
  660. }
  661. // BatchCreatebelong 批量插入客户归属记录表
  662. func (s *CustomerService) BatchCreatebelong(rep []*model.CustCustomer, req *model.AssignCustomerReq, n ...interface{}) (err error) {
  663. //更新销售归属表销售结束时间
  664. _, err = s.BelongDao.Data(
  665. g.Map{
  666. "updated_by": s.GetCxtUserId(),
  667. "updated_name": s.GetCxtUserName(),
  668. "end_date": gtime.Now(),
  669. }).WhereIn(s.BelongDao.Columns.CustId, req.Ids).Update()
  670. if err != nil {
  671. return err
  672. }
  673. var belongData []*model.CustCustomerBelong
  674. userName := s.GetCxtUserName()
  675. for _, v := range rep {
  676. orig_sale_name := v.SalesName
  677. belong := new(model.CustCustomerBelong)
  678. belong.CustId = v.Id
  679. belong.SaleName = req.SalesName
  680. belong.OrigSaleName = orig_sale_name
  681. belong.OpnType = req.Receive
  682. belong.OpnPeople = userName
  683. belong.CreatedName = userName
  684. belong.StartDate = gtime.Now() //新增开始时间
  685. belong.OpnDatetime = gtime.Now()
  686. belong.Remark = req.Remark
  687. belong.CreatedBy = s.GetCxtUserId()
  688. belongData = append(belongData, belong)
  689. }
  690. _, err = s.BelongDao.Insert(belongData)
  691. return err
  692. }
  693. // 导出数据
  694. func (s *CustomerService) Export(req *model.CustCustomerExport) (content *model.CustExport, err error) {
  695. var con model.CustExport
  696. req.IsRemovePage = true // 去掉分页标识
  697. total, data, err := s.GetList(&req.CustCustomerSearchReq)
  698. if err != nil {
  699. return
  700. }
  701. f := excelize.NewFile()
  702. index := f.NewSheet("Sheet1")
  703. for index, item := range req.Columns {
  704. sheetPosition := service.Div(index+1) + "1"
  705. f.SetCellValue("Sheet1", sheetPosition, item)
  706. }
  707. if total > 0 {
  708. for ck, item := range data {
  709. for index, v := range req.Columns {
  710. if v == "客户编码" {
  711. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustCode)
  712. }
  713. if v == "客户名称" {
  714. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustName)
  715. }
  716. if v == "助记名" {
  717. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
  718. }
  719. if v == "助记名" {
  720. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
  721. }
  722. if v == "所在地区" {
  723. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLocation)
  724. }
  725. if v == "客户行业" {
  726. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustIndustry)
  727. }
  728. if v == "客户级别" {
  729. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLevel)
  730. }
  731. if v == "客户状态" {
  732. var CustStatus string
  733. CustStatus = "正常"
  734. if item.CustStatus != "10" {
  735. CustStatus = "异常"
  736. }
  737. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), CustStatus)
  738. }
  739. if v == "创建人" {
  740. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CreatedName)
  741. }
  742. if v == "最后跟进时间" {
  743. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.FollowUpDate)
  744. }
  745. if v == "创建时间" {
  746. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CreatedTime)
  747. }
  748. }
  749. }
  750. }
  751. f.SetActiveSheet(index)
  752. var buffer *bytes.Buffer
  753. buffer, _ = f.WriteToBuffer()
  754. con.Content = buffer.Bytes()
  755. return &con, err
  756. }