cust_customer.go 23 KB

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