cust_customer.go 36 KB

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