cust_customer.go 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. package cust
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "math"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "dashoo.cn/common_definition/comm_def"
  12. "dashoo.cn/opms_libary/micro_srv"
  13. "dashoo.cn/opms_libary/plugin/dingtalk/workflow"
  14. "dashoo.cn/opms_libary/request"
  15. "dashoo.cn/opms_libary/utils"
  16. "dashoo.cn/opms_libary/myerrors"
  17. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  18. "github.com/360EntSecGroup-Skylar/excelize"
  19. "github.com/gogf/gf/database/gdb"
  20. "github.com/gogf/gf/encoding/gjson"
  21. "github.com/gogf/gf/frame/g"
  22. "github.com/gogf/gf/os/gtime"
  23. "github.com/gogf/gf/util/gconv"
  24. "github.com/mozillazg/go-pinyin"
  25. "dashoo.cn/micro/app/dao/cust"
  26. platdao "dashoo.cn/micro/app/dao/plat"
  27. model "dashoo.cn/micro/app/model/cust"
  28. workflowModel "dashoo.cn/micro/app/model/workflow"
  29. "dashoo.cn/micro/app/service"
  30. workflowService "dashoo.cn/micro/app/service/workflow"
  31. )
  32. type CustomerService struct {
  33. *service.ContextService
  34. Dao *cust.CustCustomerDao
  35. BelongDao *cust.CustCustomerBelongDao
  36. DynamicsDao *cust.CustCustomerDynamicsDao
  37. ContactDao *cust.CustCustomerContactDao
  38. FollowDao *platdao.PlatFollowupDao
  39. BelongServer *CustomerbelongService
  40. ContanctServer *CustomercontactService
  41. }
  42. var isPublic, noPublic = "10", "20" // 公海,非公海
  43. var AllocaTion, OperaTion, Receive, Merge = "10", "20", "30", "40" // 10分配20转移30领取40合并
  44. type OpnType struct {
  45. OperaTion string
  46. }
  47. func NewCustomerService(ctx context.Context) (svc *CustomerService, err error) {
  48. svc = new(CustomerService)
  49. if svc.ContextService, err = svc.Init(ctx); err != nil {
  50. return nil, err
  51. }
  52. svc.Dao = cust.NewCustCustomerDao(svc.Tenant)
  53. svc.BelongDao = cust.NewCustCustomerBelongDao(svc.Tenant)
  54. svc.DynamicsDao = cust.NewCustCustomerDynamicsDao(svc.Tenant)
  55. svc.ContactDao = cust.NewCustCustomerContactDao(svc.Tenant)
  56. svc.FollowDao = platdao.NewPlatFollowupDao(svc.Tenant)
  57. svc.BelongServer, _ = NewCustomerBelongService(ctx)
  58. svc.ContanctServer, _ = NewCustomerContactService(ctx)
  59. return svc, nil
  60. }
  61. // GetList 客户列表列表
  62. func (s *CustomerService) GetList(req *model.CustCustomerSearchReq) (total int, customerList []*model.CustList, err error) {
  63. Model := s.Dao.FieldsEx(s.Dao.C.DeletedTime)
  64. if req.IsPublic {
  65. Model = Model.Where(s.Dao.C.IsPublic, isPublic)
  66. } else {
  67. Model = Model.Where(s.Dao.C.IsPublic, noPublic)
  68. if req.TargetType == "self" {
  69. Model = Model.Where(s.Dao.C.SalesId, s.CxtUser.Id)
  70. } else if req.TargetType == "other" {
  71. Model = Model.Where(s.Dao.C.SalesId, s.DataScope["userIds"]).WhereNot(s.Dao.C.SalesId, s.CxtUser.Id)
  72. } else {
  73. Model = Model.DataScope(s.Ctx, "sales_id").Where(s.Dao.C.IsPublic, noPublic)
  74. }
  75. }
  76. //客户名称
  77. if req.CustName != "" {
  78. Model = Model.Where(s.Dao.C.CustName+" like ?", "%"+req.CustName+"%")
  79. }
  80. //客户编码
  81. if req.CustCode != "" {
  82. Model = Model.Where(s.Dao.C.CustCode+" like ?", "%"+req.CustCode+"%")
  83. }
  84. //客户行业
  85. if req.CustIndustry != "" {
  86. Model = Model.Where(s.Dao.C.CustIndustry, req.CustIndustry)
  87. }
  88. //客户级别
  89. if req.CustLevel != "" {
  90. Model = Model.Where(s.Dao.C.CustLevel, req.CustLevel)
  91. }
  92. //
  93. if req.FollowUpDate != "" {
  94. Model = Model.Where(s.Dao.C.FollowUpDate+" like ? ", req.FollowUpDate+"%")
  95. }
  96. if req.IsRemovePage {
  97. Model = Model
  98. } else {
  99. Model = Model.Page(req.GetPage())
  100. }
  101. total, err = Model.Count()
  102. if err != nil {
  103. g.Log().Error(err)
  104. err = myerrors.DbError("获取总行数失败。")
  105. return
  106. }
  107. err = Model.Order("id desc").Scan(&customerList)
  108. if err != nil {
  109. g.Log().Error(err)
  110. return
  111. }
  112. return
  113. }
  114. func (s *CustomerService) customerCode(province, industry string) (string, error) {
  115. sequence, err := service.Sequence(s.Dao.DB, "customer_code")
  116. if err != nil {
  117. return "", err
  118. }
  119. return s.customerProvinceCode(province) + industry + sequence, nil
  120. }
  121. func (s *CustomerService) customerProvinceCode(province string) string {
  122. province = strings.Trim(province, "市")
  123. province = strings.Trim(province, "省")
  124. province = strings.Trim(province, "特别行政区")
  125. province = strings.Trim(province, "自治区")
  126. province = strings.Trim(province, "壮族")
  127. province = strings.Trim(province, "回族")
  128. province = strings.Trim(province, "维吾尔")
  129. pinyinArg := pinyin.NewArgs()
  130. pinyinArg.Style = pinyin.FIRST_LETTER
  131. provincePinyin := pinyin.Pinyin(province, pinyinArg)
  132. provinceFirstletter := []string{}
  133. for _, i := range provincePinyin {
  134. provinceFirstletter = append(provinceFirstletter, i[0])
  135. }
  136. provinceCode := strings.Join(provinceFirstletter, "")
  137. provinceCode = strings.ToUpper(provinceCode)
  138. fmt.Println(provincePinyin, provinceFirstletter, provinceCode)
  139. return provinceCode
  140. }
  141. // Create 创建客户
  142. func (s *CustomerService) Create(req *model.CustomerAddSeq) (insertId int64, err error) {
  143. cusTomer := new(model.CustCustomer)
  144. count, err := s.Dao.Where(s.Dao.C.CustName, req.CustName).Count()
  145. if err != nil {
  146. g.Log().Error(err)
  147. return
  148. }
  149. if count > 0 {
  150. return 0, myerrors.TipsError("该客户信息已存在,不可重复添加")
  151. }
  152. if err = gconv.Struct(req, cusTomer); err != nil {
  153. return
  154. }
  155. service.SetCreatedInfo(cusTomer, s.GetCxtUserId(), s.CxtUser.NickName)
  156. custCode, err := s.customerCode(req.CustProvince, req.CustIndustry)
  157. if err != nil {
  158. return 0, err
  159. }
  160. cusTomer.CustCode = custCode
  161. cusTomer.CustStatus = "10"
  162. roles := s.GetCxtUserRoles()
  163. isSales := false
  164. for _, v := range roles {
  165. if v == "SalesEngineer" || v == "ProductLineManager" { // 销售角色
  166. isSales = true
  167. break
  168. }
  169. }
  170. if isBig, ok := s.DataScope["is_big"]; ok && isBig.(bool) {
  171. isSales = true
  172. }
  173. // 销售角色
  174. if isSales {
  175. cusTomer.IsPublic = noPublic
  176. cusTomer.SalesId = s.GetCxtUserId()
  177. cusTomer.SalesName = s.CxtUser.NickName
  178. cusTomer.CustStatus = "30"
  179. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  180. if err != nil {
  181. g.Log().Error(err)
  182. return 0, err
  183. }
  184. err = s.CreateBelong(gconv.Int(insertId))
  185. return insertId, err
  186. } else {
  187. cusTomer.IsPublic = isPublic
  188. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  189. if err != nil {
  190. g.Log().Error(err)
  191. return 0, err
  192. }
  193. }
  194. return insertId, err
  195. }
  196. // CreateBelong 创建客户归属信息
  197. func (s *CustomerService) CreateBelong(custId int) (err error) {
  198. belong := new(model.CustomerBelongAddSeq)
  199. belong.CustId = custId
  200. belong.SaleName = s.CxtUser.NickName
  201. belong.OpnType = AllocaTion
  202. belong.OpnPeople = s.CxtUser.NickName
  203. err = s.BelongServer.Create(belong)
  204. if err != nil {
  205. g.Log().Error(err)
  206. return
  207. }
  208. return
  209. }
  210. // 删除客户
  211. func (s *CustomerService) DeleteByIds(Ids []int64) (err error) {
  212. customerCount, err := s.Dao.Where(" id in (?)", Ids).Count()
  213. if err != nil {
  214. g.Log().Error(err)
  215. return
  216. }
  217. if customerCount == 0 {
  218. err = myerrors.TipsError("客户信息不存在")
  219. return
  220. }
  221. //删除客户表
  222. s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  223. //客户表
  224. _, err = s.Dao.TX(tx).Where("id in (?)", Ids).Delete()
  225. if err != nil {
  226. g.Log().Error(err)
  227. return err
  228. }
  229. //客户联系人表
  230. _, err = s.ContactDao.Where("cust_id in (?)", Ids).Delete()
  231. if err != nil {
  232. g.Log().Error(err)
  233. return err
  234. }
  235. //客户归属表
  236. _, err = s.BelongDao.Where("cust_id in (?)", Ids).Delete()
  237. if err != nil {
  238. g.Log().Error(err)
  239. return err
  240. }
  241. return nil
  242. })
  243. return
  244. }
  245. // UpdateById 修改客户
  246. func (s *CustomerService) UpdateById(req *model.UpdateCustomer) (err error) {
  247. //判断数据是否存在
  248. count, err := s.Dao.Where("id = ", req.Id).Count()
  249. if err != nil {
  250. g.Log().Error(err)
  251. return
  252. }
  253. if count == 0 {
  254. return
  255. }
  256. //新的客户名字是否存在
  257. num, err := s.Dao.Where(s.Dao.C.CustName, req.CustName).WhereNot(s.Dao.C.Id, req.Id).Count()
  258. if err != nil {
  259. g.Log().Error(err)
  260. return err
  261. }
  262. if num > 0 {
  263. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已存在", req.CustName))
  264. }
  265. CustomertData := new(model.CustomerAddSeq)
  266. if err = gconv.Struct(req, CustomertData); err != nil {
  267. return
  268. }
  269. service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.CxtUser.NickName)
  270. _, err = s.Dao.FieldsEx(s.Dao.C.CreatedTime, s.Dao.C.CreatedBy, s.Dao.C.CreatedName, s.Dao.C.Id, s.Dao.C.CustCode, s.Dao.C.SalesName, s.Dao.C.SalesId).
  271. WherePri(s.Dao.C.Id, req.Id).Update(CustomertData)
  272. if err != nil {
  273. g.Log().Error(err)
  274. return
  275. }
  276. return
  277. }
  278. var AssignCustomerRequestProcessCode = "PROC-FE42B2D1-6097-4DE8-8AC5-23541B7D5C8A" // BizCode: 11
  279. var MoveToPubicRequestProcessCode = "PROC-C030BD3D-74A3-4FE5-9EBA-DF3BA9F8AEF9" // BizCode: 12
  280. var TransCustomerRequestProcessCode = "PROC-03BE93D3-9A44-43A1-BA6D-D1BB75702542" // BizCode: 13
  281. // AssignCustomerRequest 领取客户申请
  282. func (s *CustomerService) AssignCustomerRequest(ctx context.Context, req *model.AssignCustomerReq) error {
  283. if req.ApplyRemark == "" {
  284. return myerrors.TipsError("请输入申请说明")
  285. }
  286. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  287. if err != nil {
  288. return err
  289. }
  290. if len(data) == 0 {
  291. return myerrors.TipsError("领取用户不能为空")
  292. }
  293. for _, v := range data {
  294. if v.CustStatus != "10" {
  295. return myerrors.TipsError(fmt.Sprintf("客户: %s 已被领取", v.CustName))
  296. }
  297. if v.CustProvince == "" {
  298. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  299. }
  300. if v.CustCity == "" {
  301. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  302. }
  303. if v.CustIndustry == "" {
  304. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  305. }
  306. }
  307. city := []string{}
  308. cityData := s.DataScope["cust_city_id"]
  309. if cityData != nil {
  310. for _, i := range cityData.([]interface{}) {
  311. city = append(city, i.(string))
  312. }
  313. }
  314. fmt.Println(city)
  315. cust := []*model.CustCustomer{}
  316. noNeedApprovalCust := []*model.CustCustomer{}
  317. noNeedApprovalCustId := []int64{}
  318. for _, v := range data {
  319. if service.StringSlicecontains(city, strconv.Itoa(v.CustCityId)) {
  320. noNeedApprovalCust = append(noNeedApprovalCust, v)
  321. noNeedApprovalCustId = append(noNeedApprovalCustId, int64(v.Id))
  322. } else {
  323. cust = append(cust, v)
  324. }
  325. }
  326. if len(noNeedApprovalCustId) != 0 {
  327. err = s.ChangeCustBelong(noNeedApprovalCustId, req.SalesId, req.SalesName)
  328. if err != nil {
  329. return err
  330. }
  331. req.Receive = AllocaTion
  332. err = s.BatchCreatebelong(data, req)
  333. if err != nil {
  334. return err
  335. }
  336. err = s.CreateDynamics("领取客户", &model.AssignCustomerReq{
  337. Ids: noNeedApprovalCustId,
  338. SalesId: req.SalesId,
  339. SalesName: req.SalesName,
  340. Remark: "",
  341. Receive: Receive,
  342. }, noNeedApprovalCustId...)
  343. if err != nil {
  344. return err
  345. }
  346. }
  347. remark, err := json.Marshal(map[string]string{
  348. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  349. "applyUserName": s.GetCxtUserName(),
  350. })
  351. if err != nil {
  352. return err
  353. }
  354. workflowSrv, err := workflowService.NewFlowService(ctx)
  355. if err != nil {
  356. return err
  357. }
  358. for _, u := range cust {
  359. bizCode := strconv.Itoa(u.Id) + ":" + strconv.Itoa(s.GetCxtUserId())
  360. _, err = workflowSrv.StartProcessInstance(bizCode, "11", string(remark), &workflow.StartProcessInstanceRequest{
  361. ProcessCode: &AssignCustomerRequestProcessCode,
  362. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  363. {
  364. Id: utils.String("TextField_1QEXO83G7GDC0"),
  365. Name: utils.String("客户编码"),
  366. Value: utils.String(u.CustCode),
  367. },
  368. {
  369. Id: utils.String("TextField_13MDZ97RV16K0"),
  370. Name: utils.String("客户名称"),
  371. Value: utils.String(u.CustName),
  372. },
  373. {
  374. Id: utils.String("TextField_Q32G87K9Y680"),
  375. Name: utils.String("所在省"),
  376. Value: utils.String(u.CustProvince),
  377. },
  378. {
  379. Id: utils.String("TextField_1C81AAVZELY80"),
  380. Name: utils.String("所在市"),
  381. Value: utils.String(u.CustCity),
  382. },
  383. {
  384. Id: utils.String("TextField_7EF74WG6AJ40"),
  385. Name: utils.String("客户类别"),
  386. Value: utils.String(u.CustIndustry),
  387. },
  388. {
  389. Id: utils.String("TextField_1ZY48VZY6WG00"),
  390. Name: utils.String("申请人"),
  391. Value: utils.String(s.GetCxtUserName()),
  392. },
  393. {
  394. Id: utils.String("TextareaField_5U6VKA6N1VK0"),
  395. Name: utils.String("申请说明"),
  396. Value: utils.String(req.ApplyRemark),
  397. },
  398. },
  399. })
  400. if err != nil {
  401. return err
  402. }
  403. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  404. "is_public": noPublic,
  405. "cust_status": "20",
  406. }).Update()
  407. if err != nil {
  408. return err
  409. }
  410. }
  411. return nil
  412. }
  413. func (s *CustomerService) AssignCustomerRequestApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  414. remark := map[string]string{}
  415. err := json.Unmarshal([]byte(flow.Remark), &remark)
  416. if err != nil {
  417. return err
  418. }
  419. userName := remark["applyUserName"]
  420. bizCode := strings.Split(flow.BizCode, ":")
  421. if len(bizCode) != 2 {
  422. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  423. }
  424. custId, err := strconv.Atoi(bizCode[0])
  425. if err != nil {
  426. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  427. }
  428. userId, err := strconv.Atoi(bizCode[1])
  429. if err != nil {
  430. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  431. }
  432. cust, err := s.Dao.Where("id = ?", custId).One()
  433. if err != nil {
  434. return err
  435. }
  436. if cust == nil {
  437. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  438. }
  439. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  440. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  441. }
  442. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  443. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  444. }
  445. if msg.ProcessType == "terminate" {
  446. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  447. "is_public": isPublic,
  448. "cust_status": "10",
  449. }).Update()
  450. return err
  451. }
  452. pass := msg.Result == "agree"
  453. if !pass {
  454. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  455. "is_public": isPublic,
  456. "cust_status": "10",
  457. }).Update()
  458. return err
  459. }
  460. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  461. err = s.ChangeCustBelong([]int64{int64(custId)}, int64(userId), remark["applyUserName"])
  462. if err != nil {
  463. return err
  464. }
  465. err = s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
  466. Ids: []int64{int64(custId)},
  467. SalesId: int64(userId),
  468. SalesName: userName,
  469. Remark: "",
  470. Receive: Receive,
  471. })
  472. if err != nil {
  473. return err
  474. }
  475. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  476. return s.CreateDynamics("领取客户", map[string]interface{}{
  477. "userId": userId,
  478. "custId": cust.Id,
  479. }, int64(cust.Id))
  480. }
  481. // 移回公海
  482. func (s *CustomerService) MoveToPublicRequest(ctx context.Context, req *model.MoveToPubicRep) error {
  483. if req.Remark == "" {
  484. return myerrors.TipsError("请输入移回原因")
  485. }
  486. data, err := s.Dao.Where("id in (?)", req.Ids).All()
  487. if err != nil {
  488. return err
  489. }
  490. if len(data) == 0 {
  491. return myerrors.TipsError("移回用户不能为空")
  492. }
  493. cusType, err := service.GetDictDataByType(ctx, "cust_idy")
  494. if err != nil {
  495. return err
  496. }
  497. for _, v := range data {
  498. if v.CustStatus == "10" {
  499. return myerrors.TipsError(fmt.Sprintf("客户: %s 已被移回公海", v.CustName))
  500. }
  501. if v.CustStatus == "20" {
  502. return myerrors.TipsError(fmt.Sprintf("客户: %s 正在等待审批", v.CustName))
  503. }
  504. if v.CustProvince == "" {
  505. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  506. }
  507. if v.CustCity == "" {
  508. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  509. }
  510. if v.CustIndustry == "" {
  511. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  512. }
  513. }
  514. remark, err := json.Marshal(map[string]string{
  515. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  516. "applyUserName": s.GetCxtUserName(),
  517. })
  518. if err != nil {
  519. return err
  520. }
  521. workflowSrv, err := workflowService.NewFlowService(ctx)
  522. if err != nil {
  523. return err
  524. }
  525. for _, u := range data {
  526. bizCode := strconv.Itoa(u.Id) + ":" + strconv.Itoa(s.GetCxtUserId())
  527. _, err = workflowSrv.StartProcessInstance(bizCode, "12", string(remark), &workflow.StartProcessInstanceRequest{
  528. ProcessCode: &MoveToPubicRequestProcessCode,
  529. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  530. {
  531. Id: utils.String("TextField_JFWRAP0D1IO0"),
  532. Name: utils.String("客户编码"),
  533. Value: utils.String(u.CustCode),
  534. },
  535. {
  536. Id: utils.String("TextField-K2AD4O5B"),
  537. Name: utils.String("客户名称"),
  538. Value: utils.String(u.CustName),
  539. },
  540. {
  541. Id: utils.String("TextField_1THUAFLY5RGG0"),
  542. Name: utils.String("所在省"),
  543. Value: utils.String(u.CustProvince),
  544. },
  545. {
  546. Id: utils.String("TextField_15SRKAQIYY680"),
  547. Name: utils.String("所在市"),
  548. Value: utils.String(u.CustCity),
  549. },
  550. {
  551. Id: utils.String("TextField_S966SSJHCCG0"),
  552. Name: utils.String("客户类别"),
  553. Value: utils.String(cusType[u.CustIndustry]),
  554. },
  555. {
  556. Id: utils.String("TextField_Y3EQ11P49LC0"),
  557. Name: utils.String("申请人"),
  558. Value: utils.String(s.GetCxtUserName()),
  559. },
  560. {
  561. Id: utils.String("TextareaField_1790F8J2SPJ40"),
  562. Name: utils.String("移回原因"),
  563. Value: utils.String(req.Remark),
  564. },
  565. },
  566. })
  567. if err != nil {
  568. return err
  569. }
  570. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  571. "cust_status": "20",
  572. }).Update()
  573. if err != nil {
  574. return err
  575. }
  576. }
  577. return nil
  578. }
  579. // 移入公海回调
  580. func (s *CustomerService) MoveToPublicApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  581. remark := map[string]string{}
  582. err := json.Unmarshal([]byte(flow.Remark), &remark)
  583. if err != nil {
  584. return err
  585. }
  586. userName := remark["applyUserName"]
  587. bizCode := strings.Split(flow.BizCode, ":")
  588. if len(bizCode) != 2 {
  589. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  590. }
  591. custId, err := strconv.Atoi(bizCode[0])
  592. if err != nil {
  593. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  594. }
  595. userId, err := strconv.Atoi(bizCode[1])
  596. if err != nil {
  597. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  598. }
  599. cust, err := s.Dao.Where("id = ?", custId).One()
  600. if err != nil {
  601. return err
  602. }
  603. if cust == nil {
  604. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  605. }
  606. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  607. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  608. }
  609. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  610. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  611. }
  612. if msg.ProcessType == "terminate" {
  613. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  614. "cust_status": "30",
  615. }).Update()
  616. return err
  617. }
  618. pass := msg.Result == "agree"
  619. if !pass {
  620. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  621. "cust_status": "30",
  622. }).Update()
  623. return err
  624. }
  625. now := gtime.Now()
  626. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  627. //更新客户信息
  628. _, err = s.Dao.TX(tx).Data(g.Map{
  629. "cust_status": "10",
  630. "is_public": isPublic,
  631. "sales_id": 0,
  632. "dept_id": 0,
  633. "dept_name": "",
  634. "updated_time": now,
  635. }).Where("id = ?", cust.Id).Update()
  636. if err != nil {
  637. return err
  638. }
  639. //更新销售归属表结束时间
  640. _, err = s.BelongDao.TX(tx).Data(g.Map{
  641. "end_date": now,
  642. }).Where("cust_id = ?", cust.Id).Update()
  643. if err != nil {
  644. return err
  645. }
  646. return nil
  647. })
  648. if err != nil {
  649. return err
  650. }
  651. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  652. return s.CreateDynamics("移入公海", map[string]interface{}{
  653. "userId": userId,
  654. "custId": cust.Id,
  655. }, int64(cust.Id))
  656. }
  657. // 转移客户
  658. func (s *CustomerService) TransCustomerRequest(ctx context.Context, req *model.AssignCustomerReq) error {
  659. if req.Remark == "" {
  660. return myerrors.TipsError("请输入转移原因")
  661. }
  662. data, err := s.Dao.Where("id in (?)", req.Ids).All()
  663. if err != nil {
  664. return err
  665. }
  666. if len(data) == 0 {
  667. return myerrors.TipsError("转移用户不能为空")
  668. }
  669. for _, v := range data {
  670. if v.CustStatus == "10" {
  671. return myerrors.TipsError(fmt.Sprintf("客户: %s 为公海客户", v.CustName))
  672. }
  673. if v.CustStatus == "20" {
  674. return myerrors.TipsError(fmt.Sprintf("客户: %s 正在等待审批", v.CustName))
  675. }
  676. if v.CustProvince == "" {
  677. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  678. }
  679. if v.CustCity == "" {
  680. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  681. }
  682. if v.CustIndustry == "" {
  683. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  684. }
  685. }
  686. remark, err := json.Marshal(map[string]string{
  687. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  688. "applyUserName": s.GetCxtUserName(),
  689. "toUserId": strconv.FormatInt(req.SalesId, 10),
  690. "toUserName": req.SalesName,
  691. })
  692. if err != nil {
  693. return err
  694. }
  695. workflowSrv, err := workflowService.NewFlowService(ctx)
  696. if err != nil {
  697. return err
  698. }
  699. for _, u := range data {
  700. bizCode := strings.Join([]string{
  701. strconv.Itoa(u.Id),
  702. strconv.Itoa(s.GetCxtUserId()),
  703. strconv.FormatInt(req.SalesId, 10),
  704. }, ":")
  705. _, err = workflowSrv.StartProcessInstance(bizCode, "13", string(remark), &workflow.StartProcessInstanceRequest{
  706. ProcessCode: &TransCustomerRequestProcessCode,
  707. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  708. {
  709. Id: utils.String("TextField-K2AD4O5B"),
  710. Name: utils.String("客户编码"),
  711. Value: utils.String(u.CustCode),
  712. },
  713. {
  714. Id: utils.String("TextField_HMF1CTLP55S0"),
  715. Name: utils.String("客户名称"),
  716. Value: utils.String(u.CustName),
  717. },
  718. {
  719. Id: utils.String("TextField_SAITVT7MNF40"),
  720. Name: utils.String("所在省"),
  721. Value: utils.String(u.CustProvince),
  722. },
  723. {
  724. Id: utils.String("TextField_12DGEUTR74NK0"),
  725. Name: utils.String("所在市"),
  726. Value: utils.String(u.CustCity),
  727. },
  728. {
  729. Id: utils.String("TextField_16FDRGG3URCW0"),
  730. Name: utils.String("客户类别"),
  731. Value: utils.String(u.CustIndustry),
  732. },
  733. {
  734. Id: utils.String("TextField_1JSO6EU9XQCG0"),
  735. Name: utils.String("申请人"),
  736. Value: utils.String(s.GetCxtUserName()),
  737. },
  738. {
  739. Id: utils.String("TextareaField_1ZSSTZFCT0G00"),
  740. Name: utils.String("转移原因"),
  741. Value: utils.String(req.Remark),
  742. },
  743. },
  744. })
  745. if err != nil {
  746. return err
  747. }
  748. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  749. "cust_status": "20",
  750. }).Update()
  751. if err != nil {
  752. return err
  753. }
  754. }
  755. return nil
  756. }
  757. // 转移客户回调
  758. func (s *CustomerService) TransCustomerApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  759. remark := map[string]string{}
  760. err := json.Unmarshal([]byte(flow.Remark), &remark)
  761. if err != nil {
  762. return err
  763. }
  764. userName := remark["applyUserName"]
  765. toUserName := remark["toUserName"]
  766. bizCode := strings.Split(flow.BizCode, ":")
  767. if len(bizCode) != 3 {
  768. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  769. }
  770. custId, err := strconv.Atoi(bizCode[0])
  771. if err != nil {
  772. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  773. }
  774. userId, err := strconv.Atoi(bizCode[1])
  775. if err != nil {
  776. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  777. }
  778. toUserId, err := strconv.Atoi(bizCode[2])
  779. if err != nil {
  780. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  781. }
  782. // user, err := s.UserDao.Where("id = ?", userId).One()
  783. // if err != nil {
  784. // return err
  785. // }
  786. // if user == nil {
  787. // return fmt.Errorf("用户不存在:%s Id: %d", flow.BizCode, flow.Id)
  788. // }
  789. // toUser, err := s.UserDao.Where("id = ?", toUserId).One()
  790. // if err != nil {
  791. // return err
  792. // }
  793. // if toUser == nil {
  794. // return fmt.Errorf("用户不存在:%s Id: %d", flow.BizCode, flow.Id)
  795. // }
  796. cust, err := s.Dao.Where("id = ?", custId).One()
  797. if err != nil {
  798. return err
  799. }
  800. if cust == nil {
  801. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  802. }
  803. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  804. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  805. }
  806. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  807. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  808. }
  809. if msg.ProcessType == "terminate" {
  810. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  811. "cust_status": "30",
  812. }).Update()
  813. return err
  814. }
  815. pass := msg.Result == "agree"
  816. if !pass {
  817. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  818. "cust_status": "30",
  819. }).Update()
  820. return err
  821. }
  822. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  823. err = s.ChangeCustBelong([]int64{int64(custId)}, int64(toUserId), toUserName)
  824. if err != nil {
  825. return err
  826. }
  827. err = s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
  828. Ids: []int64{int64(custId)},
  829. SalesId: int64(toUserId),
  830. SalesName: toUserName,
  831. Remark: "",
  832. Receive: OperaTion,
  833. })
  834. if err != nil {
  835. return err
  836. }
  837. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  838. return s.CreateDynamics("转移客户", map[string]interface{}{
  839. "userId": userId,
  840. "custId": cust.Id,
  841. "toUserId": toUserId,
  842. }, int64(cust.Id))
  843. }
  844. // AssignCustomer 分配客户
  845. func (s *CustomerService) AssignCustomer(ctx context.Context, req *model.AssignCustomerReq) (err error) {
  846. if req.Receive != "" {
  847. return s.AssignCustomerRequest(ctx, req)
  848. }
  849. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  850. if err != nil {
  851. g.Log().Error(err)
  852. return
  853. }
  854. if len(data) == 0 {
  855. return myerrors.TipsError("无可分配客户")
  856. }
  857. for _, v := range data {
  858. if v.SalesId != 0 {
  859. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已被领取或分配", v.CustName))
  860. }
  861. }
  862. err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
  863. if err != nil {
  864. return
  865. }
  866. req.Receive = AllocaTion
  867. err = s.BatchCreatebelong(data, req)
  868. if err != nil {
  869. return err
  870. }
  871. return s.CreateDynamics("分配客户", req, req.Ids...)
  872. }
  873. // GetEntityById 客户详情
  874. func (s *CustomerService) GetEntityById(Ids []int64) (entityInfo []*model.CustList, err error) {
  875. Model := s.Dao //
  876. err = Model.Where(" id in (?)", Ids).Scan(&entityInfo)
  877. if err != nil {
  878. g.Log().Error(err)
  879. return
  880. }
  881. return
  882. }
  883. // GetCustNameIsExist 判断客户名称是否存在
  884. func (s *CustomerService) GetCustNameIsExist(req *model.IsExistsCustName) (exist bool, err error) {
  885. custDao := s.Dao.M
  886. if req.Id > 0 {
  887. custDao = custDao.Where("cust_name = ", req.CustName).WhereNot(" id ", req.Id)
  888. } else {
  889. custDao = custDao.Where("cust_name = ", req.CustName)
  890. }
  891. count, err := custDao.Count()
  892. if err != nil {
  893. g.Log().Error(err)
  894. return
  895. }
  896. exist = false
  897. if count > 0 {
  898. exist = true
  899. }
  900. return
  901. }
  902. // CustAbstract 客户摘要
  903. func (s *CustomerService) CustAbstract(Id int64) (followInfo *model.Follow, err error) {
  904. count, err := s.FollowDao.Where(s.FollowDao.C.CustId, Id).Count()
  905. if err != nil {
  906. g.Log().Error(err)
  907. return
  908. }
  909. followInfo = new(model.Follow)
  910. followInfo.FollowCount = count
  911. followTime, err := s.Dao.Fields(s.Dao.C.FollowUpDate, s.Dao.C.CreatedTime).FindOne(Id)
  912. if err != nil {
  913. g.Log().Error(err)
  914. return
  915. }
  916. if followTime == nil {
  917. err = myerrors.TipsError("获取客户信息不存在")
  918. return
  919. }
  920. now := gtime.Now()
  921. var difference time.Duration
  922. if followTime.FollowUpDate.IsZero() {
  923. difference = now.Sub(gtime.New(followTime.CreatedTime))
  924. } else {
  925. difference = now.Sub(gtime.New(followTime.FollowUpDate))
  926. }
  927. days := difference.Hours() / 24
  928. if days < 0 {
  929. followInfo.NotFollowDay = 0
  930. } else {
  931. followInfo.NotFollowDay = int(math.Floor(days))
  932. }
  933. return
  934. }
  935. // // TransCustomer 转移客户
  936. // func (s *CustomerService) TransCustomer(req *model.AssignCustomerReq) (err error) {
  937. // data, err := s.Dao.Fields("sales_id,sales_name,id").Where("id in (?)", req.Ids).All()
  938. // if err != nil {
  939. // g.Log().Error(err)
  940. // return err
  941. // }
  942. // if len(data) == 0 {
  943. // return myerrors.TipsError("数据不存在")
  944. // }
  945. // err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
  946. // if err != nil {
  947. // g.Log().Error(err)
  948. // return
  949. // }
  950. // req.Receive = OperaTion
  951. // s.BatchCreatebelong(data, req)
  952. // return
  953. // }
  954. // ChangeCustBelong 变更客户所属关系
  955. func (s *CustomerService) ChangeCustBelong(Ids []int64, salesId int64, salesName string) (err error) {
  956. _, err = s.Dao.Data(g.Map{
  957. "cust_status": "30",
  958. "sales_id": salesId,
  959. "is_public": noPublic,
  960. "sales_name": salesName,
  961. "updated_by": s.GetCxtUserId(),
  962. "updated_name": s.GetCxtUserName(),
  963. "updated_time": gtime.Now(),
  964. }).Where("id in (?)", Ids).Update()
  965. return err
  966. }
  967. // CreateDynamics 创建客户动态信息
  968. func (s *CustomerService) CreateDynamics(opnTpye string, content interface{}, ids ...int64) (err error) {
  969. datas := make([]*model.CustCustomerDynamics, 0)
  970. for _, id := range ids {
  971. dynameics := new(model.CustCustomerDynamics)
  972. dynameics.CustId = int(id)
  973. dynameics.OpnPeopleId = s.GetCxtUserId()
  974. dynameics.OpnPeople = s.GetCxtUserName()
  975. dynameics.OpnDate = gtime.Now()
  976. dynameics.OpnType = opnTpye
  977. v, _ := gjson.Encode(content)
  978. dynameics.OpnContent = gconv.String(v)
  979. service.SetCreatedInfo(dynameics, s.GetCxtUserId(), s.GetCxtUserName())
  980. datas = append(datas, dynameics)
  981. }
  982. _, err = s.DynamicsDao.Insert(datas)
  983. if err != nil {
  984. g.Log().Error(err)
  985. return
  986. }
  987. return
  988. }
  989. // GetDynamicsList 客户动态
  990. func (s *CustomerService) GetDynamicsList(req *model.CustomerDynameicsReq) (total int, result []interface{}, err error) {
  991. total, err = s.DynamicsDao.Where("cust_id = ", req.CustId).Count()
  992. if err != nil {
  993. g.Log().Error(err)
  994. return
  995. }
  996. dynamics := []*model.CustomerDynameicsRep{}
  997. err = s.DynamicsDao.Where("cust_id = ", req.CustId).Order("created_time desc").Scan(&dynamics)
  998. if err != nil {
  999. g.Log().Error(err)
  1000. return
  1001. }
  1002. dynamicsList := make(map[string][]*model.CustomerDynameicsRep)
  1003. for _, v := range dynamics {
  1004. opnDate := gtime.New(v.OpnDate).Format("Y-m-d")
  1005. dynamicsList[opnDate] = append(dynamicsList[opnDate], &model.CustomerDynameicsRep{
  1006. OpnPeople: v.OpnPeople,
  1007. OpnDate: v.OpnDate,
  1008. OpnType: v.OpnType,
  1009. OpnContent: v.OpnContent,
  1010. })
  1011. }
  1012. result = append(result, dynamicsList)
  1013. return
  1014. }
  1015. // MergeCustomer 合并客户
  1016. func (s *CustomerService) MergeCustomer(req *model.MergeCustomerRep) (err error) {
  1017. //当前目标客户是否存在并取出合并前的销售
  1018. customer, err := s.Dao.Where("id = ", req.Id).One()
  1019. if err != nil {
  1020. g.Log().Error(err)
  1021. return
  1022. }
  1023. if customer == nil {
  1024. return myerrors.TipsError("该客户不存在")
  1025. }
  1026. _, err = s.ContactDao.Where(" cust_id in (?)", req.ChooseId).Delete()
  1027. if err != nil {
  1028. g.Log().Error(err)
  1029. return
  1030. }
  1031. CustomertData := new(model.CustomerAddSeq)
  1032. if err = gconv.Struct(req, CustomertData); err != nil {
  1033. g.Log().Error(err)
  1034. return
  1035. }
  1036. service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.GetCxtUserName())
  1037. _, err = s.Dao.FieldsEx(s.Dao.C.CreatedTime, s.Dao.C.CreatedBy,
  1038. s.Dao.C.CreatedName, s.Dao.C.Id,
  1039. s.Dao.C.CustCode).WherePri(s.Dao.C.Id, req.Id).Update(CustomertData)
  1040. if err != nil {
  1041. g.Log().Error(err)
  1042. return
  1043. }
  1044. //删除被合并的客户信息
  1045. _, err = s.Dao.Where(" id in (?)", req.ChooseId).Delete()
  1046. if err != nil {
  1047. g.Log().Error(err)
  1048. return
  1049. }
  1050. //删除 所选客户销售联系人
  1051. _, err = s.BelongDao.Where(" cust_id in (?)", req.ChooseId).Delete()
  1052. if err != nil {
  1053. g.Log().Error(err)
  1054. return
  1055. }
  1056. //插入一条合并成功的归属记录
  1057. //更新销售归属表销售结束时间
  1058. _, err = s.BelongDao.Data(
  1059. g.Map{
  1060. "updated_by": s.GetCxtUserId(),
  1061. "updated_name": s.GetCxtUserName(),
  1062. "end_date": gtime.Now(),
  1063. }).WhereIn(s.BelongDao.C.CustId, req.Id).Update()
  1064. if err != nil {
  1065. g.Log().Error(err)
  1066. return
  1067. }
  1068. req.CustomerBelongAddSeq.CustId = int(req.Id)
  1069. req.CustomerBelongAddSeq.OpnType = Merge
  1070. req.CustomerBelongAddSeq.OpnPeople = s.GetCxtUserName()
  1071. req.CustomerBelongAddSeq.OrigSaleName = customer.SalesName
  1072. req.CustomerBelongAddSeq.SaleName = req.SalesName
  1073. s.BelongServer.Create(req.CustomerBelongAddSeq)
  1074. return
  1075. }
  1076. // CreateContact 联系人(合并)预留
  1077. func (s *CustomerService) CreateContact(Ids []int64, req *model.CustCustomerContactSeq) (err error) {
  1078. _, err = s.ContactDao.Where(" cust_id in (?)", Ids).Delete()
  1079. if err != nil {
  1080. g.Log().Error(err)
  1081. return
  1082. }
  1083. s.ContanctServer.Create(req)
  1084. return
  1085. }
  1086. // BatchCreatebelong 批量插入客户归属记录表
  1087. func (s *CustomerService) BatchCreatebelong(rep []*model.CustCustomer, req *model.AssignCustomerReq, n ...interface{}) (err error) {
  1088. //更新销售归属表销售结束时间
  1089. _, err = s.BelongDao.Data(
  1090. g.Map{
  1091. "updated_by": s.GetCxtUserId(),
  1092. "updated_name": s.GetCxtUserName(),
  1093. "end_date": gtime.Now(),
  1094. }).WhereIn(s.BelongDao.C.CustId, req.Ids).Update()
  1095. if err != nil {
  1096. return err
  1097. }
  1098. var belongData []*model.CustCustomerBelong
  1099. userName := s.GetCxtUserName()
  1100. for _, v := range rep {
  1101. orig_sale_name := v.SalesName
  1102. belong := new(model.CustCustomerBelong)
  1103. belong.CustId = v.Id
  1104. belong.SaleName = req.SalesName
  1105. belong.OrigSaleName = orig_sale_name
  1106. belong.OpnType = req.Receive
  1107. belong.OpnPeople = userName
  1108. belong.CreatedName = userName
  1109. belong.StartDate = gtime.Now() //新增开始时间
  1110. belong.OpnDatetime = gtime.Now()
  1111. belong.Remark = req.Remark
  1112. belong.CreatedBy = s.GetCxtUserId()
  1113. belongData = append(belongData, belong)
  1114. }
  1115. _, err = s.BelongDao.Insert(belongData)
  1116. return err
  1117. }
  1118. // 导出数据
  1119. func (s *CustomerService) Export(ctx context.Context, req *model.CustCustomerExport) (content *model.CustExport, err error) {
  1120. var con model.CustExport
  1121. req.IsRemovePage = true // 去掉分页标识
  1122. total, data, err := s.GetList(&req.CustCustomerSearchReq)
  1123. if err != nil {
  1124. return
  1125. }
  1126. cusType, err := service.GetDictDataByType(ctx, "cust_idy")
  1127. if err != nil {
  1128. return nil, err
  1129. }
  1130. f := excelize.NewFile()
  1131. index := f.NewSheet("Sheet1")
  1132. for index, item := range req.Columns {
  1133. sheetPosition := service.Div(index+1) + "1"
  1134. f.SetCellValue("Sheet1", sheetPosition, item)
  1135. }
  1136. if total > 0 {
  1137. for ck, item := range data {
  1138. for index, v := range req.Columns {
  1139. if v == "客户编码" {
  1140. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustCode)
  1141. }
  1142. if v == "客户名称" {
  1143. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustName)
  1144. }
  1145. if v == "助记名" {
  1146. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
  1147. }
  1148. if v == "助记名" {
  1149. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.AbbrName)
  1150. }
  1151. if v == "所在地区" {
  1152. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLocation)
  1153. }
  1154. if v == "客户类型" {
  1155. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), cusType[item.CustIndustry])
  1156. }
  1157. if v == "客户级别" {
  1158. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustLevel)
  1159. }
  1160. if v == "客户状态" {
  1161. var CustStatus string
  1162. CustStatus = "正常"
  1163. if item.CustStatus != "10" {
  1164. CustStatus = "异常"
  1165. }
  1166. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), CustStatus)
  1167. }
  1168. if v == "创建人" {
  1169. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CreatedName)
  1170. }
  1171. if v == "最后跟进时间" {
  1172. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.FollowUpDate)
  1173. }
  1174. if v == "创建时间" {
  1175. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CreatedTime)
  1176. }
  1177. if v == "所在省" {
  1178. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustProvince)
  1179. }
  1180. if v == "所在市" {
  1181. f.SetCellValue("Sheet1", service.Div(index+1)+strconv.Itoa(ck+2), item.CustCity)
  1182. }
  1183. }
  1184. }
  1185. }
  1186. f.SetActiveSheet(index)
  1187. var buffer *bytes.Buffer
  1188. buffer, _ = f.WriteToBuffer()
  1189. con.Content = buffer.Bytes()
  1190. return &con, err
  1191. }
  1192. func GetUser(ctx context.Context, id int) error {
  1193. srv := micro_srv.InitMicroSrvClient("User", "micro_srv.auth")
  1194. defer srv.Close()
  1195. resp := &comm_def.CommonMsg{}
  1196. err := srv.Call(ctx, "GetUserInfo", &comm_def.IdReq{
  1197. Id: int64(id),
  1198. }, resp)
  1199. if err != nil {
  1200. return fmt.Errorf("获取用户信息 %d %s", id, err.Error())
  1201. }
  1202. fmt.Println(resp.Data)
  1203. fmt.Println("---------------")
  1204. fmt.Println(resp.Data.(map[string]interface{})["entity"])
  1205. return nil
  1206. }