cust_customer.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. package cust
  2. import (
  3. "context"
  4. "strconv"
  5. "github.com/gogf/gf/errors/gerror"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/os/gtime"
  8. "github.com/gogf/gf/util/gconv"
  9. "dashoo.cn/micro/app/dao/cust"
  10. model "dashoo.cn/micro/app/model/cust"
  11. "dashoo.cn/micro/app/service"
  12. )
  13. type CustomerService struct {
  14. *service.ContextService
  15. Dao *cust.CustCustomerDao
  16. BelongDao *cust.CustCustomerBelongDao
  17. DynamicsDao *cust.CustCustomerDynamicsDao
  18. ContactDao *cust.CustCustomerContactDao
  19. }
  20. var isPublic, noPublic = "10", "20" // 公海,非公海
  21. var isTransfer int8 = 1 //转移
  22. var isAllocation int8 = 2 //分配 Allocation
  23. var OperaTion, AllocaTion = "20", "10"
  24. type OpnType struct {
  25. OperaTion string
  26. }
  27. func NewCustomerService(ctx context.Context) (svc *CustomerService, err error) {
  28. svc = new(CustomerService)
  29. if svc.ContextService, err = svc.Init(ctx); err != nil {
  30. return nil, err
  31. }
  32. svc.Dao = cust.NewCustCustomerDao(svc.Tenant)
  33. svc.BelongDao = cust.NewCustCustomerBelongDao(svc.Tenant)
  34. svc.DynamicsDao = cust.NewCustCustomerDynamicsDao(svc.Tenant)
  35. svc.ContactDao = cust.NewCustCustomerContactDao(svc.Tenant)
  36. return svc, nil
  37. }
  38. //创建客户
  39. func (c *CustomerService) Create(req *model.Customer) (insertId int64, err error) {
  40. cusTomer := new(model.CustCustomer)
  41. g.Log().Info(err)
  42. Model := c.Dao.M
  43. record, err := Model.Where(g.Map{"cust_name": req.CustName}).One()
  44. g.Log().Info("recordE", record.IsEmpty())
  45. if err != nil || !record.IsEmpty() {
  46. err = gerror.New("该客户信息已存在,不可重复添加")
  47. return
  48. }
  49. //OpnPeopleId int ` json:"opnPeopleId"` // 操作人ID
  50. //OpnPeople string ` json:"opnPeople"` // 操作人
  51. //OpnDate *gtime.Time ` json:"opnDate"` // 操作日期
  52. //OpnType string ` json:"opnType"` // 操作类型
  53. //OpnContent string ` json:"opnContent"` // 操作内容
  54. //c.OperationLog()
  55. if err = gconv.Struct(req, cusTomer); err != nil {
  56. return
  57. }
  58. g.Log().Info("部门ID", c.CxtUser.DeptId)
  59. service.SetCreatedInfo(cusTomer, c.GetCxtUserId(), c.GetCxtUserName())
  60. cusTomer.CustCode = strconv.Itoa(int(gtime.Timestamp()))
  61. cusTomer.IsPublic = isPublic
  62. cusTomer.CustStatus = "10"
  63. //if c.CxtUser.DeptId == 2 {
  64. // cusTomer.IsPublic = noPublic // 非公海用户
  65. // cusTomer.DeptId = c.GetCxtUserDeptId() // 部门id
  66. // cusTomer.DeptId = c.GetCxtUserDeptId() // 部门名称
  67. // cusTomer.SalesId = c.GetCxtUserId() // 销售id
  68. // cusTomer.SalesName = c.GetCxtUserName() // 销售名称
  69. //}
  70. res, err := Model.Insert(cusTomer)
  71. if err != nil {
  72. g.Log().Error(err)
  73. err = gerror.New("创建失败")
  74. return
  75. }
  76. //
  77. insertId, _ = res.LastInsertId()
  78. //销售人员创建条件成立 同步belong 表
  79. //custBelong := new(model.AddCustomerBelong)
  80. //custBelong.CustId = int(insertId)
  81. //custBelong.SaleName = "xxx"
  82. //custBelong.OpnPeople = "xxxx"
  83. //custBelong.OpnDatetime = gtime.Now()
  84. //err = c.CreateBelong()
  85. return
  86. }
  87. //销售人员创建 直接认领客户
  88. func (c *CustomerService) CreateBelong(req *model.AddCustomerBelong) (err error) {
  89. cusTomerBelong := new(model.CustCustomerBelong)
  90. if err = gconv.Struct(req, cusTomerBelong); err != nil {
  91. g.Log().Info("error", err)
  92. return
  93. }
  94. service.SetCreatedInfo(cusTomerBelong, c.GetCxtUserId(), c.GetCxtUserName())
  95. cusTomerBelong.OpnType = isPublic
  96. cusTomerBelong.OpnDatetime = gtime.Now()
  97. service.SetCreatedInfo(cusTomerBelong, c.GetCxtUserId(), c.GetCxtUserName())
  98. _, err = c.BelongDao.Insert(cusTomerBelong)
  99. if err != nil {
  100. g.Log().Error(err)
  101. err = gerror.New("创建失败")
  102. return
  103. }
  104. return nil
  105. }
  106. //客户列表列表
  107. func (c *CustomerService) GetList(req *model.CustCustomerSearchReq) (total int, customerList []*model.CustList, err error) {
  108. g.Log().Info("serverS", req)
  109. Model := c.Dao.M
  110. Model = Model.Where(c.Dao.Columns.DeletedTime + " is null")
  111. if req.TargetType == "" {
  112. if !req.IsPublic {
  113. Model = Model.Where(c.Dao.Columns.SalesId, c.CxtUser.Id).Where(c.Dao.Columns.IsPublic, noPublic)
  114. } else {
  115. g.Log().Info("serverS", req)
  116. Model = Model.Where(c.Dao.Columns.IsPublic, isPublic)
  117. }
  118. }
  119. //客户名称
  120. if req.CustName != "" {
  121. Model = Model.Where(c.Dao.Columns.CustName+" like ?", "%"+req.CustName+"%")
  122. }
  123. //客户编码
  124. if req.CustCode != "" {
  125. Model = Model.Where(c.Dao.Columns.CustCode+" like ?", "%"+req.CustCode+"%")
  126. }
  127. //客户行业
  128. if req.CustIndustry != "" {
  129. Model = Model.Where(c.Dao.Columns.CustIndustry+" like ?", "%"+req.CustIndustry+"%")
  130. }
  131. //客户级别
  132. if req.CustLevel != "" {
  133. Model = Model.Where(c.Dao.Columns.CustLevel, req.CustLevel)
  134. }
  135. total, err = Model.Fields().Count()
  136. if err != nil {
  137. g.Log().Error(err)
  138. err = gerror.New("获取总行数失败")
  139. return
  140. }
  141. if req.PageNum == 0 {
  142. req.PageNum = 1
  143. }
  144. err = Model.Page(req.PageNum, req.PageSize).Order("id desc").Scan(&customerList)
  145. return
  146. }
  147. //删除客户
  148. func (c *CustomerService) DeleteById(id int) error {
  149. Model := c.Dao.M
  150. ContactModel := c.ContactDao //联系人
  151. regionDetail := new(model.CustCustomer)
  152. err := Model.Where(c.Dao.Columns.Id, id).Scan(&regionDetail)
  153. //g.Log().Info("DeleteByIds", one)
  154. if err != nil {
  155. g.Log().Error(err)
  156. err = gerror.New("没有要删除的数据")
  157. return err
  158. }
  159. deleteTime := gtime.Now()
  160. //删除客户表
  161. _, err = Model.Data(g.Map{
  162. "deleted_time": deleteTime,
  163. }).Where(c.Dao.Columns.Id, id).Update()
  164. // 删除客户联系人表
  165. _, err = ContactModel.Data(g.Map{
  166. "deleted_time": deleteTime,
  167. }).Where(c.ContactDao.Columns.CustId, id).Update()
  168. if err != nil {
  169. g.Log().Error(err)
  170. err = gerror.New("删除数据失败")
  171. return err
  172. }
  173. return nil
  174. }
  175. //修改客户
  176. func (c *CustomerService) UpdateById(req *model.UpdateCustomer) (err error) {
  177. db := c.Dao.M
  178. record, err := db.FindOne(c.Dao.Columns.Id, req.Id)
  179. if err != nil || record.IsEmpty() {
  180. err = gerror.New("该数据不存在")
  181. return err
  182. }
  183. CustomertData := new(model.Customer)
  184. if err = gconv.Struct(req, CustomertData); err != nil {
  185. return
  186. }
  187. service.SetUpdatedInfo(CustomertData, c.GetCxtUserId(), c.GetCxtUserName())
  188. _, err = db.FieldsEx(c.Dao.Columns.CreatedTime, c.Dao.Columns.CreatedBy, c.Dao.Columns.CreatedName, c.Dao.Columns.Id, c.Dao.Columns.CustCode, c.Dao.Columns.SalesName, c.Dao.Columns.SalesId).
  189. WherePri(c.Dao.Columns.Id, req.Id).Update(CustomertData)
  190. if err != nil {
  191. g.Log().Error(err)
  192. err = gerror.New("修改用户信息失败")
  193. return
  194. }
  195. return
  196. }
  197. //移入公海
  198. func (c *CustomerService) MoveToPubic(ids []int64) error {
  199. Model := c.Dao.M
  200. //Cust := new(model.CustCustomer)
  201. list, err := Model.Fields(c.Dao.Columns.CreatedTime).Where(c.Dao.Columns.Id+" in (?) ", ids).All()
  202. if err != nil || list.Len() <= 0 {
  203. g.Log().Error(err)
  204. err = gerror.New("没有要移除的数据")
  205. return err
  206. }
  207. _, err = Model.Data(g.Map{
  208. "is_public": isPublic,
  209. "sales_id": 0,
  210. "sales_name": "",
  211. "dept_id": 0,
  212. "dept_name": "",
  213. "create_time": gtime.Now(),
  214. "updated_by": c.GetCxtUserId(),
  215. "updated_name": c.GetCxtUserName(),
  216. "updated_time": gtime.Now(),
  217. }).Where(c.ContactDao.Columns.Id+" in (?)", ids).Update()
  218. if err != nil {
  219. g.Log().Error(err)
  220. err = gerror.New("移入公海失败")
  221. return err
  222. }
  223. return nil
  224. }
  225. //分配客户
  226. func (c *CustomerService) DistriCustomer(req *model.DistriCustomer) error {
  227. /**
  228. 待写逻辑(销售总监或销售助理将公海客户分配给指定销售工程师)
  229. if c.user.id != 销售总监 || c.user.id!=销售助理 {
  230. err = gerror.New("该账号无权限操作!")
  231. return
  232. }
  233. */
  234. custModel := c.Dao.M
  235. rep, err := custModel.Where(cust.CustCustomer.Columns.Id+" in (?) ", req.Ids).Where(cust.CustCustomer.Columns.IsPublic, isPublic).All()
  236. if err != nil || rep.IsEmpty() {
  237. err = gerror.New("该数据不存在")
  238. return err
  239. }
  240. err = c.updateCustomer(req.Ids, req.SalesId, req.SalesName)
  241. if err != nil {
  242. err = gerror.New("可配客户失败")
  243. return err
  244. }
  245. var maps = make(map[string]string)
  246. maps["remark"] = req.Remark
  247. maps["opn_type"] = AllocaTion
  248. maps["sale_name"] = req.SalesName
  249. err = c.belongInsters(rep.List(), maps)
  250. if err != nil {
  251. err = gerror.New("转移客户失败")
  252. return err
  253. }
  254. return nil
  255. }
  256. //客户详情
  257. func (c *CustomerService) GetEntityById(ids []int64) (entityInfo []*model.CustList, err error) {
  258. Model := c.Dao.M
  259. err = Model.Where(cust.CustCustomer.Columns.Id+" in (?)", ids).Scan(&entityInfo)
  260. if err != nil {
  261. g.Log().Error(err)
  262. return nil, gerror.New("获取用户数据失败")
  263. }
  264. return
  265. }
  266. //转移客户
  267. func (c *CustomerService) UpdateBytransfer(req *model.CustSalesReq) (entityInfo []*model.CustCustomer, err error) {
  268. custModel := c.Dao.M
  269. rep, err := custModel.Fields("sales_id,sales_name,id").Where(cust.CustCustomer.Columns.Id+" in (?)", req.Ids).All()
  270. if err != nil || rep.IsEmpty() {
  271. err = gerror.New("该数据不存在")
  272. return
  273. }
  274. err = c.updateCustomer(req.Ids, req.SalesIds, req.SalesName)
  275. if err != nil {
  276. err = gerror.New("转移客户失败")
  277. return
  278. }
  279. var maps = make(map[string]string)
  280. maps["remark"] = req.Remark
  281. maps["opn_type"] = OperaTion
  282. maps["sale_name"] = req.SalesName
  283. err = c.belongInsters(rep.List(), maps)
  284. if err != nil {
  285. err = gerror.New("转移客户失败")
  286. return
  287. }
  288. return
  289. }
  290. //变更客户所属关系
  291. func (c *CustomerService) updateCustomer(ids []int64, salesId int64, salesName string) error {
  292. custModel := c.Dao.M
  293. _, err := custModel.Data(g.Map{
  294. "sales_id": salesId,
  295. "is_public": noPublic,
  296. "sales_name": salesName,
  297. "updated_by": c.GetCxtUserId(),
  298. "updated_name": c.GetCxtUserName(),
  299. "updated_time": gtime.Now(),
  300. }).Where(cust.CustCustomer.Columns.Id+" in (?)", ids).Update()
  301. if err != nil {
  302. g.Log().Error(err)
  303. err = gerror.New("变更失败")
  304. return err
  305. }
  306. return nil
  307. }
  308. //客户操作日志
  309. func (c *CustomerService) OperationLog(ctx context.Context, ids []int64, req *model.AddCustomerDynameicsReq) (err error) {
  310. g.Log("fdasfsa", gconv.String(ctx))
  311. cusDynameics := new(model.CustCustomerDynamics)
  312. if err = gconv.Struct(req, cusDynameics); err != nil {
  313. g.Log().Info("error", err)
  314. return
  315. }
  316. Model := c.DynamicsDao.M
  317. g.Log().Info("IDS", ids)
  318. maps := []map[string]interface{}{}
  319. for _, v := range ids {
  320. contact := map[string]interface{}{}
  321. contact["cust_id"] = v
  322. contact["opn_people_id"] = c.GetCxtUserId()
  323. contact["opn_people"] = c.GetCxtUserName()
  324. contact["opn_date"] = req.OpnDate
  325. contact["opn_type"] = req.OpnType
  326. contact["remark"] = ""
  327. contact["created_by"] = c.GetCxtUserId()
  328. contact["created_name"] = c.GetCxtUserName()
  329. contact["created_by"] = c.GetCxtUserId()
  330. contact["created_time"] = gtime.Now()
  331. contact["opn_content"] = req.OpnContent
  332. maps = append(maps, contact)
  333. }
  334. _, err = Model.Insert(maps)
  335. if err != nil {
  336. g.Log().Error(err)
  337. err = gerror.New("创建失败")
  338. return
  339. }
  340. return
  341. }
  342. //客户动态
  343. func (c *CustomerService) DynamicsList(req *model.CustomerDynameicsReq) (total int, result []interface{}, err error) {
  344. Model := c.DynamicsDao.M
  345. total, err = Model.Fields().Count()
  346. if err != nil {
  347. g.Log().Error(err)
  348. err = gerror.New("获取总行数失败")
  349. return
  350. }
  351. if req.PageNum == 0 {
  352. req.PageNum = 1
  353. }
  354. dynamics := []*model.CustomerDynameicsRep{}
  355. err = Model.Page(req.PageNum, req.PageSize).Where("cust_id = ", req.CustId).Order("id desc").Scan(&dynamics)
  356. dynamicsList := make(map[string][]*model.CustomerDynameicsRep)
  357. for _, v := range dynamics {
  358. gt1 := gtime.New(v.OpnDate)
  359. opnDate := gt1.Format("Y-m-d")
  360. dynamicsList[opnDate] = append(dynamicsList[opnDate], &model.CustomerDynameicsRep{
  361. OpnPeople: v.OpnPeople,
  362. OpnDate: v.OpnDate,
  363. OpnType: v.OpnType,
  364. OpnContent: v.OpnContent,
  365. })
  366. }
  367. g.Log().Info("DynamicsList----", dynamicsList)
  368. result = append(result, dynamicsList)
  369. return
  370. }
  371. //合并客户
  372. func (c *CustomerService) Mergecustomer(req *model.MergecustomerRep) (err error) {
  373. Model := c.Dao.M
  374. ContactModel := c.ContactDao.M
  375. BelongDao := c.BelongDao.M
  376. //当前目标客户是否存在
  377. FindOne, err := Model.Where(c.Dao.Columns.DeletedTime+" is null").Where(c.Dao.Columns.Id, req.Id).FindOne()
  378. if err != nil || FindOne.IsEmpty() {
  379. err = gerror.New("该数据不存在")
  380. return
  381. }
  382. //所选客户联系人信息
  383. List, err := ContactModel.Where(c.ContactDao.Columns.CustId+" in (?)", req.ChooseId).All()
  384. g.Log().Info("list", List.List())
  385. CustomertData := new(model.Customer)
  386. if err = gconv.Struct(req, CustomertData); err != nil {
  387. return
  388. }
  389. service.SetUpdatedInfo(CustomertData, c.GetCxtUserId(), c.GetCxtUserName())
  390. _, err = Model.FieldsEx(c.Dao.Columns.CreatedTime, c.Dao.Columns.CreatedBy,
  391. c.Dao.Columns.CreatedName, c.Dao.Columns.Id,
  392. c.Dao.Columns.CustCode,
  393. c.Dao.Columns.SalesName,
  394. c.Dao.Columns.SalesId).WherePri(c.Dao.Columns.Id, req.Id).Update(CustomertData)
  395. if err != nil {
  396. err = gerror.New("合并失败")
  397. return
  398. }
  399. Model.Data(g.Map{"deleted_time": gtime.Now()}).Where(c.ContactDao.Columns.Id+" in (?)", req.ChooseId).Update()
  400. if err != nil || List.Len() > 0 {
  401. err = c.contactInster(req.Id, req.ChooseId, List.List())
  402. if err != nil {
  403. err = gerror.New("合并失败")
  404. return
  405. }
  406. }
  407. ////所选客户销售联系人信息
  408. BelongList, err := BelongDao.Where(c.BelongDao.Columns.CustId+" in (?)", req.ChooseId).All()
  409. if err != nil || BelongList.Len() > 0 {
  410. err = c.belongInster(req.Id, req.ChooseId, req.Customer.SalesName)
  411. if err != nil {
  412. err = gerror.New("合并失败")
  413. return
  414. }
  415. }
  416. return
  417. }
  418. //联系人
  419. func (c *CustomerService) contactInster(id int, Ids []int64, list []map[string]interface{}) (err error) {
  420. ContactModel := c.ContactDao.M
  421. ContactModel.Data(g.Map{"deleted_time": gtime.Now()}).Where(c.ContactDao.Columns.CustId+" in (?)", Ids).Update()
  422. maps := []map[string]interface{}{}
  423. for _, v := range list {
  424. contact := map[string]interface{}{}
  425. contact["cust_id"] = id
  426. contact["cuct_name"] = v["cuct_name"]
  427. contact["cuct_gender"] = v["cuct_gender"]
  428. contact["postion"] = v["postion"]
  429. contact["telephone"] = v["telephone"]
  430. contact["wechat"] = v["wechat"]
  431. contact["email"] = v["email"]
  432. contact["policy"] = v["policy"]
  433. contact["remark"] = v["remark"]
  434. contact["created_by"] = v["created_by"]
  435. contact["created_name"] = v["created_name"]
  436. contact["created_time"] = v["created_time"]
  437. maps = append(maps, contact)
  438. }
  439. _, err = ContactModel.Insert(maps)
  440. if err != nil {
  441. err = gerror.New("操作失败")
  442. g.Log().Info("contactInster", err)
  443. return
  444. }
  445. return
  446. }
  447. //销售
  448. func (c *CustomerService) belongInster(Id int, BelongIds []int64, SaleName string) (err error) {
  449. BelongDao := c.BelongDao.M
  450. BelongDao.Data(g.Map{"deleted_time": gtime.Now()}).Where(c.BelongDao.Columns.CustId+" in (?)", BelongIds).Update()
  451. BelongData := new(model.CustCustomerBelong)
  452. BelongData.CustId = Id
  453. service.SetCreatedInfo(BelongData, c.GetCxtUserId(), c.GetCxtUserName())
  454. BelongData.SaleName = SaleName
  455. BelongData.OpnType = AllocaTion
  456. BelongData.OrigSaleName = ""
  457. BelongData.OpnPeople = "admin"
  458. BelongData.OpnDatetime = gtime.Now()
  459. _, err = BelongDao.Insert(BelongData)
  460. if err != nil {
  461. g.Log().Info("BeloongInster", err)
  462. err = gerror.New("操作失败")
  463. return
  464. }
  465. return
  466. }
  467. //批量插入客户归属记录表
  468. func (c *CustomerService) belongInsters(rep []map[string]interface{}, parameter map[string]string) (err error) {
  469. belongModel := c.BelongDao.M
  470. maps := []map[string]interface{}{}
  471. date_time := gtime.Now()
  472. for _, v := range rep {
  473. orig_sale_name := v["sales_name"]
  474. belong := map[string]interface{}{}
  475. belong["cust_id"] = v["id"].(int)
  476. belong["sale_name"] = parameter["sale_name"]
  477. belong["orig_sale_name"] = orig_sale_name
  478. belong["opn_type"] = parameter["opn_type"]
  479. belong["opn_people"] = 1
  480. belong["opn_datetime"] = date_time
  481. belong["created_by"] = 1
  482. belong["remark"] = parameter["remark"]
  483. belong["created_name"] = "admin"
  484. belong["created_time"] = date_time
  485. belong["opn_datetime"] = date_time
  486. maps = append(maps, belong)
  487. }
  488. _, err = belongModel.Insert(maps)
  489. if err != nil {
  490. err = gerror.New("插入失败")
  491. return err
  492. }
  493. return
  494. }