cust_customer.go 34 KB

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