cust_customer.go 35 KB

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