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. "time"
  11. "dashoo.cn/common_definition/comm_def"
  12. "dashoo.cn/opms_libary/micro_srv"
  13. "dashoo.cn/opms_libary/plugin/dingtalk/workflow"
  14. "dashoo.cn/opms_libary/request"
  15. "dashoo.cn/opms_libary/utils"
  16. "dashoo.cn/opms_libary/myerrors"
  17. "dashoo.cn/opms_libary/plugin/dingtalk/message"
  18. "github.com/360EntSecGroup-Skylar/excelize"
  19. "github.com/gogf/gf/database/gdb"
  20. "github.com/gogf/gf/encoding/gjson"
  21. "github.com/gogf/gf/frame/g"
  22. "github.com/gogf/gf/os/gtime"
  23. "github.com/gogf/gf/util/gconv"
  24. "github.com/mozillazg/go-pinyin"
  25. "dashoo.cn/micro/app/dao/cust"
  26. platdao "dashoo.cn/micro/app/dao/plat"
  27. model "dashoo.cn/micro/app/model/cust"
  28. workflowModel "dashoo.cn/micro/app/model/workflow"
  29. "dashoo.cn/micro/app/service"
  30. workflowService "dashoo.cn/micro/app/service/workflow"
  31. )
  32. type CustomerService struct {
  33. *service.ContextService
  34. Dao *cust.CustCustomerDao
  35. BelongDao *cust.CustCustomerBelongDao
  36. DynamicsDao *cust.CustCustomerDynamicsDao
  37. ContactDao *cust.CustCustomerContactDao
  38. FollowDao *platdao.PlatFollowupDao
  39. BelongServer *CustomerbelongService
  40. ContanctServer *CustomercontactService
  41. }
  42. var isPublic, noPublic = "10", "20" // 公海,非公海
  43. var AllocaTion, OperaTion, Receive, Merge = "10", "20", "30", "40" // 10分配20转移30领取40合并
  44. type OpnType struct {
  45. OperaTion string
  46. }
  47. func NewCustomerService(ctx context.Context) (svc *CustomerService, err error) {
  48. svc = new(CustomerService)
  49. if svc.ContextService, err = svc.Init(ctx); err != nil {
  50. return nil, err
  51. }
  52. svc.Dao = cust.NewCustCustomerDao(svc.Tenant)
  53. svc.BelongDao = cust.NewCustCustomerBelongDao(svc.Tenant)
  54. svc.DynamicsDao = cust.NewCustCustomerDynamicsDao(svc.Tenant)
  55. svc.ContactDao = cust.NewCustCustomerContactDao(svc.Tenant)
  56. svc.FollowDao = platdao.NewPlatFollowupDao(svc.Tenant)
  57. svc.BelongServer, _ = NewCustomerBelongService(ctx)
  58. svc.ContanctServer, _ = NewCustomerContactService(ctx)
  59. return svc, nil
  60. }
  61. // GetList 客户列表列表
  62. func (s *CustomerService) GetList(req *model.CustCustomerSearchReq) (total int, customerList []*model.CustList, err error) {
  63. Model := s.Dao.FieldsEx(s.Dao.C.DeletedTime)
  64. if req.IsPublic {
  65. Model = Model.Where(s.Dao.C.IsPublic, isPublic)
  66. } else {
  67. Model = Model.Where(s.Dao.C.IsPublic, noPublic)
  68. if req.TargetType == "self" {
  69. Model = Model.Where(s.Dao.C.SalesId, s.CxtUser.Id)
  70. } else if req.TargetType == "other" {
  71. Model = Model.Where(s.Dao.C.SalesId, s.DataScope["userIds"]).WhereNot(s.Dao.C.SalesId, s.CxtUser.Id)
  72. } else {
  73. Model = Model.DataScope(s.Ctx, "sales_id").Where(s.Dao.C.IsPublic, noPublic)
  74. }
  75. }
  76. //客户名称
  77. if req.CustName != "" {
  78. Model = Model.Where(s.Dao.C.CustName+" like ?", "%"+req.CustName+"%")
  79. }
  80. //客户编码
  81. if req.CustCode != "" {
  82. Model = Model.Where(s.Dao.C.CustCode+" like ?", "%"+req.CustCode+"%")
  83. }
  84. //客户行业
  85. if req.CustIndustry != "" {
  86. Model = Model.Where(s.Dao.C.CustIndustry, req.CustIndustry)
  87. }
  88. //客户级别
  89. if req.CustLevel != "" {
  90. Model = Model.Where(s.Dao.C.CustLevel, req.CustLevel)
  91. }
  92. //
  93. if req.FollowUpDate != "" {
  94. Model = Model.Where(s.Dao.C.FollowUpDate+" like ? ", req.FollowUpDate+"%")
  95. }
  96. if req.IsRemovePage {
  97. Model = Model
  98. } else {
  99. Model = Model.Page(req.GetPage())
  100. }
  101. total, err = Model.Count()
  102. if err != nil {
  103. g.Log().Error(err)
  104. err = myerrors.DbError("获取总行数失败。")
  105. return
  106. }
  107. err = Model.Order("id desc").Scan(&customerList)
  108. if err != nil {
  109. g.Log().Error(err)
  110. return
  111. }
  112. return
  113. }
  114. func (s *CustomerService) customerCode(province, industry string) (string, error) {
  115. sequence, err := service.Sequence(s.Dao.DB, "customer_code")
  116. if err != nil {
  117. return "", err
  118. }
  119. return s.customerProvinceCode(province) + industry + sequence, nil
  120. }
  121. func (s *CustomerService) customerProvinceCode(province string) string {
  122. province = strings.Trim(province, "市")
  123. province = strings.Trim(province, "省")
  124. province = strings.Trim(province, "特别行政区")
  125. province = strings.Trim(province, "自治区")
  126. province = strings.Trim(province, "壮族")
  127. province = strings.Trim(province, "回族")
  128. province = strings.Trim(province, "维吾尔")
  129. pinyinArg := pinyin.NewArgs()
  130. pinyinArg.Style = pinyin.FIRST_LETTER
  131. provincePinyin := pinyin.Pinyin(province, pinyinArg)
  132. provinceFirstletter := []string{}
  133. for _, i := range provincePinyin {
  134. provinceFirstletter = append(provinceFirstletter, i[0])
  135. }
  136. provinceCode := strings.Join(provinceFirstletter, "")
  137. provinceCode = strings.ToUpper(provinceCode)
  138. fmt.Println(provincePinyin, provinceFirstletter, provinceCode)
  139. return provinceCode
  140. }
  141. // Create 创建客户
  142. func (s *CustomerService) Create(req *model.CustomerAddSeq) (insertId int64, err error) {
  143. cusTomer := new(model.CustCustomer)
  144. count, err := s.Dao.Where(s.Dao.C.CustName, req.CustName).Count()
  145. if err != nil {
  146. g.Log().Error(err)
  147. return
  148. }
  149. if count > 0 {
  150. return 0, myerrors.TipsError("该客户信息已存在,不可重复添加")
  151. }
  152. if err = gconv.Struct(req, cusTomer); err != nil {
  153. return
  154. }
  155. service.SetCreatedInfo(cusTomer, s.GetCxtUserId(), s.CxtUser.NickName)
  156. custCode, err := s.customerCode(req.CustProvince, req.CustIndustry)
  157. if err != nil {
  158. return 0, err
  159. }
  160. cusTomer.CustCode = custCode
  161. cusTomer.CustStatus = "10"
  162. roles := s.GetCxtUserRoles()
  163. isSales := false
  164. for _, v := range roles {
  165. if v == "SalesEngineer" { // 销售角色
  166. isSales = true
  167. break
  168. }
  169. }
  170. // 销售角色
  171. if isSales {
  172. cusTomer.IsPublic = noPublic
  173. cusTomer.SalesId = s.GetCxtUserId()
  174. cusTomer.SalesName = s.CxtUser.NickName
  175. cusTomer.CustStatus = "30"
  176. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  177. if err != nil {
  178. g.Log().Error(err)
  179. return 0, err
  180. }
  181. err = s.CreateBelong(gconv.Int(insertId))
  182. return insertId, err
  183. } else {
  184. cusTomer.IsPublic = isPublic
  185. insertId, err = s.Dao.InsertAndGetId(cusTomer)
  186. if err != nil {
  187. g.Log().Error(err)
  188. return 0, err
  189. }
  190. }
  191. return insertId, err
  192. }
  193. // CreateBelong 创建客户归属信息
  194. func (s *CustomerService) CreateBelong(custId int) (err error) {
  195. belong := new(model.CustomerBelongAddSeq)
  196. belong.CustId = custId
  197. belong.SaleName = s.CxtUser.NickName
  198. belong.OpnType = AllocaTion
  199. belong.OpnPeople = s.CxtUser.NickName
  200. err = s.BelongServer.Create(belong)
  201. if err != nil {
  202. g.Log().Error(err)
  203. return
  204. }
  205. return
  206. }
  207. // 删除客户
  208. func (s *CustomerService) DeleteByIds(Ids []int64) (err error) {
  209. customerCount, err := s.Dao.Where(" id in (?)", Ids).Count()
  210. if err != nil {
  211. g.Log().Error(err)
  212. return
  213. }
  214. if customerCount == 0 {
  215. err = myerrors.TipsError("客户信息不存在")
  216. return
  217. }
  218. //删除客户表
  219. s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  220. //客户表
  221. _, err = s.Dao.TX(tx).Where("id in (?)", Ids).Delete()
  222. if err != nil {
  223. g.Log().Error(err)
  224. return err
  225. }
  226. //客户联系人表
  227. _, err = s.ContactDao.Where("cust_id in (?)", Ids).Delete()
  228. if err != nil {
  229. g.Log().Error(err)
  230. return err
  231. }
  232. //客户归属表
  233. _, err = s.BelongDao.Where("cust_id in (?)", Ids).Delete()
  234. if err != nil {
  235. g.Log().Error(err)
  236. return err
  237. }
  238. return nil
  239. })
  240. return
  241. }
  242. // UpdateById 修改客户
  243. func (s *CustomerService) UpdateById(req *model.UpdateCustomer) (err error) {
  244. //判断数据是否存在
  245. count, err := s.Dao.Where("id = ", req.Id).Count()
  246. if err != nil {
  247. g.Log().Error(err)
  248. return
  249. }
  250. if count == 0 {
  251. return
  252. }
  253. //新的客户名字是否存在
  254. num, err := s.Dao.Where(s.Dao.C.CustName, req.CustName).WhereNot(s.Dao.C.Id, req.Id).Count()
  255. if err != nil {
  256. g.Log().Error(err)
  257. return err
  258. }
  259. if num > 0 {
  260. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已存在", req.CustName))
  261. }
  262. CustomertData := new(model.CustomerAddSeq)
  263. if err = gconv.Struct(req, CustomertData); err != nil {
  264. return
  265. }
  266. service.SetUpdatedInfo(CustomertData, s.GetCxtUserId(), s.CxtUser.NickName)
  267. _, 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).
  268. WherePri(s.Dao.C.Id, req.Id).Update(CustomertData)
  269. if err != nil {
  270. g.Log().Error(err)
  271. return
  272. }
  273. return
  274. }
  275. var AssignCustomerRequestProcessCode = "PROC-FE42B2D1-6097-4DE8-8AC5-23541B7D5C8A" // BizCode: 11
  276. var MoveToPubicRequestProcessCode = "PROC-C030BD3D-74A3-4FE5-9EBA-DF3BA9F8AEF9" // BizCode: 12
  277. var TransCustomerRequestProcessCode = "PROC-03BE93D3-9A44-43A1-BA6D-D1BB75702542" // BizCode: 13
  278. // AssignCustomerRequest 领取客户申请
  279. func (s *CustomerService) AssignCustomerRequest(ctx context.Context, req *model.AssignCustomerReq) error {
  280. if req.ApplyRemark == "" {
  281. return myerrors.TipsError("请输入申请说明")
  282. }
  283. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  284. if err != nil {
  285. return err
  286. }
  287. if len(data) == 0 {
  288. return myerrors.TipsError("领取用户不能为空")
  289. }
  290. for _, v := range data {
  291. if v.CustStatus != "10" {
  292. return myerrors.TipsError(fmt.Sprintf("客户: %s 已被领取", v.CustName))
  293. }
  294. if v.CustProvince == "" {
  295. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  296. }
  297. if v.CustCity == "" {
  298. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  299. }
  300. if v.CustIndustry == "" {
  301. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  302. }
  303. }
  304. city := []string{}
  305. cityData := s.DataScope["cust_city_id"]
  306. if cityData != nil {
  307. for _, i := range cityData.([]interface{}) {
  308. city = append(city, i.(string))
  309. }
  310. }
  311. fmt.Println(city)
  312. cust := []*model.CustCustomer{}
  313. noNeedApprovalCust := []*model.CustCustomer{}
  314. noNeedApprovalCustId := []int64{}
  315. for _, v := range data {
  316. if service.StringSlicecontains(city, strconv.Itoa(v.CustCityId)) {
  317. noNeedApprovalCust = append(noNeedApprovalCust, v)
  318. noNeedApprovalCustId = append(noNeedApprovalCustId, int64(v.Id))
  319. } else {
  320. cust = append(cust, v)
  321. }
  322. }
  323. if len(noNeedApprovalCustId) != 0 {
  324. err = s.ChangeCustBelong(noNeedApprovalCustId, req.SalesId, req.SalesName)
  325. if err != nil {
  326. return err
  327. }
  328. req.Receive = AllocaTion
  329. err = s.BatchCreatebelong(data, req)
  330. if err != nil {
  331. return err
  332. }
  333. err = s.CreateDynamics("领取客户", &model.AssignCustomerReq{
  334. Ids: noNeedApprovalCustId,
  335. SalesId: req.SalesId,
  336. SalesName: req.SalesName,
  337. Remark: "",
  338. Receive: Receive,
  339. }, noNeedApprovalCustId...)
  340. if err != nil {
  341. return err
  342. }
  343. }
  344. remark, err := json.Marshal(map[string]string{
  345. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  346. "applyUserName": s.GetCxtUserName(),
  347. })
  348. if err != nil {
  349. return err
  350. }
  351. workflowSrv, err := workflowService.NewFlowService(ctx)
  352. if err != nil {
  353. return err
  354. }
  355. for _, u := range cust {
  356. bizCode := strconv.Itoa(u.Id) + ":" + strconv.Itoa(s.GetCxtUserId())
  357. _, err = workflowSrv.StartProcessInstance(bizCode, "11", string(remark), &workflow.StartProcessInstanceRequest{
  358. ProcessCode: &AssignCustomerRequestProcessCode,
  359. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  360. {
  361. Id: utils.String("TextField_1QEXO83G7GDC0"),
  362. Name: utils.String("客户编码"),
  363. Value: utils.String(u.CustCode),
  364. },
  365. {
  366. Id: utils.String("TextField_13MDZ97RV16K0"),
  367. Name: utils.String("客户名称"),
  368. Value: utils.String(u.CustName),
  369. },
  370. {
  371. Id: utils.String("TextField_Q32G87K9Y680"),
  372. Name: utils.String("所在省"),
  373. Value: utils.String(u.CustProvince),
  374. },
  375. {
  376. Id: utils.String("TextField_1C81AAVZELY80"),
  377. Name: utils.String("所在市"),
  378. Value: utils.String(u.CustCity),
  379. },
  380. {
  381. Id: utils.String("TextField_7EF74WG6AJ40"),
  382. Name: utils.String("客户类别"),
  383. Value: utils.String(u.CustIndustry),
  384. },
  385. {
  386. Id: utils.String("TextField_1ZY48VZY6WG00"),
  387. Name: utils.String("申请人"),
  388. Value: utils.String(s.GetCxtUserName()),
  389. },
  390. {
  391. Id: utils.String("TextareaField_5U6VKA6N1VK0"),
  392. Name: utils.String("申请说明"),
  393. Value: utils.String(req.ApplyRemark),
  394. },
  395. },
  396. })
  397. if err != nil {
  398. return err
  399. }
  400. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  401. "is_public": noPublic,
  402. "cust_status": "20",
  403. }).Update()
  404. if err != nil {
  405. return err
  406. }
  407. }
  408. return nil
  409. }
  410. func (s *CustomerService) AssignCustomerRequestApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  411. remark := map[string]string{}
  412. err := json.Unmarshal([]byte(flow.Remark), &remark)
  413. if err != nil {
  414. return err
  415. }
  416. userName := remark["applyUserName"]
  417. bizCode := strings.Split(flow.BizCode, ":")
  418. if len(bizCode) != 2 {
  419. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  420. }
  421. custId, err := strconv.Atoi(bizCode[0])
  422. if err != nil {
  423. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  424. }
  425. userId, err := strconv.Atoi(bizCode[1])
  426. if err != nil {
  427. return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  428. }
  429. cust, err := s.Dao.Where("id = ?", custId).One()
  430. if err != nil {
  431. return err
  432. }
  433. if cust == nil {
  434. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  435. }
  436. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  437. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  438. }
  439. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  440. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  441. }
  442. if msg.ProcessType == "terminate" {
  443. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  444. "is_public": isPublic,
  445. "cust_status": "10",
  446. }).Update()
  447. return err
  448. }
  449. pass := msg.Result == "agree"
  450. if !pass {
  451. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  452. "is_public": isPublic,
  453. "cust_status": "10",
  454. }).Update()
  455. return err
  456. }
  457. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  458. err = s.ChangeCustBelong([]int64{int64(custId)}, int64(userId), remark["applyUserName"])
  459. if err != nil {
  460. return err
  461. }
  462. err = s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
  463. Ids: []int64{int64(custId)},
  464. SalesId: int64(userId),
  465. SalesName: userName,
  466. Remark: "",
  467. Receive: Receive,
  468. })
  469. if err != nil {
  470. return err
  471. }
  472. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  473. return s.CreateDynamics("领取客户", map[string]interface{}{
  474. "userId": userId,
  475. "custId": cust.Id,
  476. }, int64(cust.Id))
  477. }
  478. // 移回公海
  479. func (s *CustomerService) MoveToPublicRequest(ctx context.Context, req *model.MoveToPubicRep) error {
  480. if req.Remark == "" {
  481. return myerrors.TipsError("请输入移回原因")
  482. }
  483. data, err := s.Dao.Where("id in (?)", req.Ids).All()
  484. if err != nil {
  485. return err
  486. }
  487. if len(data) == 0 {
  488. return myerrors.TipsError("移回用户不能为空")
  489. }
  490. cusType, err := service.GetDictDataByType(ctx, "cust_idy")
  491. if err != nil {
  492. return err
  493. }
  494. for _, v := range data {
  495. if v.CustStatus == "10" {
  496. return myerrors.TipsError(fmt.Sprintf("客户: %s 已被移回公海", v.CustName))
  497. }
  498. if v.CustStatus == "20" {
  499. return myerrors.TipsError(fmt.Sprintf("客户: %s 正在等待审批", v.CustName))
  500. }
  501. if v.CustProvince == "" {
  502. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  503. }
  504. if v.CustCity == "" {
  505. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  506. }
  507. if v.CustIndustry == "" {
  508. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  509. }
  510. }
  511. remark, err := json.Marshal(map[string]string{
  512. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  513. "applyUserName": s.GetCxtUserName(),
  514. })
  515. if err != nil {
  516. return err
  517. }
  518. workflowSrv, err := workflowService.NewFlowService(ctx)
  519. if err != nil {
  520. return err
  521. }
  522. for _, u := range data {
  523. bizCode := strconv.Itoa(u.Id) + ":" + strconv.Itoa(s.GetCxtUserId())
  524. _, err = workflowSrv.StartProcessInstance(bizCode, "12", string(remark), &workflow.StartProcessInstanceRequest{
  525. ProcessCode: &MoveToPubicRequestProcessCode,
  526. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  527. {
  528. Id: utils.String("TextField_JFWRAP0D1IO0"),
  529. Name: utils.String("客户编码"),
  530. Value: utils.String(u.CustCode),
  531. },
  532. {
  533. Id: utils.String("TextField-K2AD4O5B"),
  534. Name: utils.String("客户名称"),
  535. Value: utils.String(u.CustName),
  536. },
  537. {
  538. Id: utils.String("TextField_1THUAFLY5RGG0"),
  539. Name: utils.String("所在省"),
  540. Value: utils.String(u.CustProvince),
  541. },
  542. {
  543. Id: utils.String("TextField_15SRKAQIYY680"),
  544. Name: utils.String("所在市"),
  545. Value: utils.String(u.CustCity),
  546. },
  547. {
  548. Id: utils.String("TextField_S966SSJHCCG0"),
  549. Name: utils.String("客户类别"),
  550. Value: utils.String(cusType[u.CustIndustry]),
  551. },
  552. {
  553. Id: utils.String("TextField_Y3EQ11P49LC0"),
  554. Name: utils.String("申请人"),
  555. Value: utils.String(s.GetCxtUserName()),
  556. },
  557. {
  558. Id: utils.String("TextareaField_1790F8J2SPJ40"),
  559. Name: utils.String("移回原因"),
  560. Value: utils.String(req.Remark),
  561. },
  562. },
  563. })
  564. if err != nil {
  565. return err
  566. }
  567. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  568. "cust_status": "20",
  569. }).Update()
  570. if err != nil {
  571. return err
  572. }
  573. }
  574. return nil
  575. }
  576. // 移入公海回调
  577. func (s *CustomerService) MoveToPublicApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  578. remark := map[string]string{}
  579. err := json.Unmarshal([]byte(flow.Remark), &remark)
  580. if err != nil {
  581. return err
  582. }
  583. userName := remark["applyUserName"]
  584. bizCode := strings.Split(flow.BizCode, ":")
  585. if len(bizCode) != 2 {
  586. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  587. }
  588. custId, err := strconv.Atoi(bizCode[0])
  589. if err != nil {
  590. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  591. }
  592. userId, err := strconv.Atoi(bizCode[1])
  593. if err != nil {
  594. return fmt.Errorf("客户移回审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  595. }
  596. cust, err := s.Dao.Where("id = ?", custId).One()
  597. if err != nil {
  598. return err
  599. }
  600. if cust == nil {
  601. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  602. }
  603. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  604. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  605. }
  606. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  607. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  608. }
  609. if msg.ProcessType == "terminate" {
  610. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  611. "cust_status": "30",
  612. }).Update()
  613. return err
  614. }
  615. pass := msg.Result == "agree"
  616. if !pass {
  617. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  618. "cust_status": "30",
  619. }).Update()
  620. return err
  621. }
  622. now := gtime.Now()
  623. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  624. //更新客户信息
  625. _, err = s.Dao.TX(tx).Data(g.Map{
  626. "cust_status": "10",
  627. "is_public": isPublic,
  628. "sales_id": 0,
  629. "dept_id": 0,
  630. "dept_name": "",
  631. "updated_time": now,
  632. }).Where("id = ?", cust.Id).Update()
  633. if err != nil {
  634. return err
  635. }
  636. //更新销售归属表结束时间
  637. _, err = s.BelongDao.TX(tx).Data(g.Map{
  638. "end_date": now,
  639. }).Where("cust_id = ?", cust.Id).Update()
  640. if err != nil {
  641. return err
  642. }
  643. return nil
  644. })
  645. if err != nil {
  646. return err
  647. }
  648. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  649. return s.CreateDynamics("移入公海", map[string]interface{}{
  650. "userId": userId,
  651. "custId": cust.Id,
  652. }, int64(cust.Id))
  653. }
  654. // 转移客户
  655. func (s *CustomerService) TransCustomerRequest(ctx context.Context, req *model.AssignCustomerReq) error {
  656. if req.Remark == "" {
  657. return myerrors.TipsError("请输入转移原因")
  658. }
  659. data, err := s.Dao.Where("id in (?)", req.Ids).All()
  660. if err != nil {
  661. return err
  662. }
  663. if len(data) == 0 {
  664. return myerrors.TipsError("转移用户不能为空")
  665. }
  666. for _, v := range data {
  667. if v.CustStatus == "10" {
  668. return myerrors.TipsError(fmt.Sprintf("客户: %s 为公海客户", v.CustName))
  669. }
  670. if v.CustStatus == "20" {
  671. return myerrors.TipsError(fmt.Sprintf("客户: %s 正在等待审批", v.CustName))
  672. }
  673. if v.CustProvince == "" {
  674. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在省信息", v.CustName))
  675. }
  676. if v.CustCity == "" {
  677. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的所在市信息", v.CustName))
  678. }
  679. if v.CustIndustry == "" {
  680. return myerrors.TipsError(fmt.Sprintf("请先完善客户: %s 的客户类型信息", v.CustName))
  681. }
  682. }
  683. remark, err := json.Marshal(map[string]string{
  684. "applyUserId": strconv.Itoa(s.GetCxtUserId()),
  685. "applyUserName": s.GetCxtUserName(),
  686. "toUserId": strconv.FormatInt(req.SalesId, 10),
  687. "toUserName": req.SalesName,
  688. })
  689. if err != nil {
  690. return err
  691. }
  692. workflowSrv, err := workflowService.NewFlowService(ctx)
  693. if err != nil {
  694. return err
  695. }
  696. for _, u := range data {
  697. bizCode := strings.Join([]string{
  698. strconv.Itoa(u.Id),
  699. strconv.Itoa(s.GetCxtUserId()),
  700. strconv.FormatInt(req.SalesId, 10),
  701. }, ":")
  702. _, err = workflowSrv.StartProcessInstance(bizCode, "13", string(remark), &workflow.StartProcessInstanceRequest{
  703. ProcessCode: &TransCustomerRequestProcessCode,
  704. FormComponentValues: []*workflow.StartProcessInstanceRequestFormComponentValues{
  705. {
  706. Id: utils.String("TextField-K2AD4O5B"),
  707. Name: utils.String("客户编码"),
  708. Value: utils.String(u.CustCode),
  709. },
  710. {
  711. Id: utils.String("TextField_HMF1CTLP55S0"),
  712. Name: utils.String("客户名称"),
  713. Value: utils.String(u.CustName),
  714. },
  715. {
  716. Id: utils.String("TextField_SAITVT7MNF40"),
  717. Name: utils.String("所在省"),
  718. Value: utils.String(u.CustProvince),
  719. },
  720. {
  721. Id: utils.String("TextField_12DGEUTR74NK0"),
  722. Name: utils.String("所在市"),
  723. Value: utils.String(u.CustCity),
  724. },
  725. {
  726. Id: utils.String("TextField_16FDRGG3URCW0"),
  727. Name: utils.String("客户类别"),
  728. Value: utils.String(u.CustIndustry),
  729. },
  730. {
  731. Id: utils.String("TextField_1JSO6EU9XQCG0"),
  732. Name: utils.String("申请人"),
  733. Value: utils.String(s.GetCxtUserName()),
  734. },
  735. {
  736. Id: utils.String("TextareaField_1ZSSTZFCT0G00"),
  737. Name: utils.String("转移原因"),
  738. Value: utils.String(req.Remark),
  739. },
  740. },
  741. })
  742. if err != nil {
  743. return err
  744. }
  745. _, err = s.Dao.Where("id = ?", u.Id).Data(map[string]interface{}{
  746. "cust_status": "20",
  747. }).Update()
  748. if err != nil {
  749. return err
  750. }
  751. }
  752. return nil
  753. }
  754. // 转移客户回调
  755. func (s *CustomerService) TransCustomerApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
  756. remark := map[string]string{}
  757. err := json.Unmarshal([]byte(flow.Remark), &remark)
  758. if err != nil {
  759. return err
  760. }
  761. userName := remark["applyUserName"]
  762. toUserName := remark["toUserName"]
  763. bizCode := strings.Split(flow.BizCode, ":")
  764. if len(bizCode) != 3 {
  765. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  766. }
  767. custId, err := strconv.Atoi(bizCode[0])
  768. if err != nil {
  769. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  770. }
  771. userId, err := strconv.Atoi(bizCode[1])
  772. if err != nil {
  773. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  774. }
  775. toUserId, err := strconv.Atoi(bizCode[2])
  776. if err != nil {
  777. return fmt.Errorf("转移客户审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
  778. }
  779. // user, err := s.UserDao.Where("id = ?", userId).One()
  780. // if err != nil {
  781. // return err
  782. // }
  783. // if user == nil {
  784. // return fmt.Errorf("用户不存在:%s Id: %d", flow.BizCode, flow.Id)
  785. // }
  786. // toUser, err := s.UserDao.Where("id = ?", toUserId).One()
  787. // if err != nil {
  788. // return err
  789. // }
  790. // if toUser == nil {
  791. // return fmt.Errorf("用户不存在:%s Id: %d", flow.BizCode, flow.Id)
  792. // }
  793. cust, err := s.Dao.Where("id = ?", custId).One()
  794. if err != nil {
  795. return err
  796. }
  797. if cust == nil {
  798. return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
  799. }
  800. if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
  801. return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
  802. }
  803. if msg.Result != "agree" && msg.Result != "refuse" && msg.Result != "" {
  804. return fmt.Errorf("无法识别的 Result :%s", msg.Result)
  805. }
  806. if msg.ProcessType == "terminate" {
  807. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  808. "cust_status": "30",
  809. }).Update()
  810. return err
  811. }
  812. pass := msg.Result == "agree"
  813. if !pass {
  814. _, err = s.Dao.Where("id = ?", custId).Data(map[string]interface{}{
  815. "cust_status": "30",
  816. }).Update()
  817. return err
  818. }
  819. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  820. err = s.ChangeCustBelong([]int64{int64(custId)}, int64(toUserId), toUserName)
  821. if err != nil {
  822. return err
  823. }
  824. err = s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
  825. Ids: []int64{int64(custId)},
  826. SalesId: int64(toUserId),
  827. SalesName: toUserName,
  828. Remark: "",
  829. Receive: OperaTion,
  830. })
  831. if err != nil {
  832. return err
  833. }
  834. s.CxtUser = &request.UserInfo{Id: userId, UserName: userName}
  835. return s.CreateDynamics("转移客户", map[string]interface{}{
  836. "userId": userId,
  837. "custId": cust.Id,
  838. "toUserId": toUserId,
  839. }, int64(cust.Id))
  840. }
  841. // AssignCustomer 分配客户
  842. func (s *CustomerService) AssignCustomer(ctx context.Context, req *model.AssignCustomerReq) (err error) {
  843. if req.Receive != "" {
  844. return s.AssignCustomerRequest(ctx, req)
  845. }
  846. data, err := s.Dao.Where("id in (?)", req.Ids).LockShared().All()
  847. if err != nil {
  848. g.Log().Error(err)
  849. return
  850. }
  851. if len(data) == 0 {
  852. return myerrors.TipsError("无可分配客户")
  853. }
  854. for _, v := range data {
  855. if v.SalesId != 0 {
  856. return myerrors.TipsError(fmt.Sprintf("客户名称[%s]已被领取或分配", v.CustName))
  857. }
  858. }
  859. err = s.ChangeCustBelong(req.Ids, req.SalesId, req.SalesName)
  860. if err != nil {
  861. return
  862. }
  863. req.Receive = AllocaTion
  864. err = s.BatchCreatebelong(data, req)
  865. if err != nil {
  866. return err
  867. }
  868. return s.CreateDynamics("分配客户", req, req.Ids...)
  869. }
  870. // GetEntityById 客户详情
  871. func (s *CustomerService) GetEntityById(Ids []int64) (entityInfo []*model.CustList, err error) {
  872. Model := s.Dao //
  873. err = Model.Where(" id in (?)", Ids).Scan(&entityInfo)
  874. if err != nil {
  875. g.Log().Error(err)
  876. return
  877. }
  878. return
  879. }
  880. // GetCustNameIsExist 判断客户名称是否存在
  881. func (s *CustomerService) GetCustNameIsExist(req *model.IsExistsCustName) (exist bool, err error) {
  882. custDao := s.Dao.M
  883. if req.Id > 0 {
  884. custDao = custDao.Where("cust_name = ", req.CustName).WhereNot(" id ", req.Id)
  885. } else {
  886. custDao = custDao.Where("cust_name = ", req.CustName)
  887. }
  888. count, err := custDao.Count()
  889. if err != nil {
  890. g.Log().Error(err)
  891. return
  892. }
  893. exist = false
  894. if count > 0 {
  895. exist = true
  896. }
  897. return
  898. }
  899. // CustAbstract 客户摘要
  900. func (s *CustomerService) CustAbstract(Id int64) (followInfo *model.Follow, err error) {
  901. count, err := s.FollowDao.Where(s.FollowDao.C.CustId, Id).Count()
  902. if err != nil {
  903. g.Log().Error(err)
  904. return
  905. }
  906. followInfo = new(model.Follow)
  907. followInfo.FollowCount = count
  908. followTime, err := s.Dao.Fields(s.Dao.C.FollowUpDate, s.Dao.C.CreatedTime).FindOne(Id)
  909. if err != nil {
  910. g.Log().Error(err)
  911. return
  912. }
  913. if followTime == nil {
  914. err = myerrors.TipsError("获取客户信息不存在")
  915. return
  916. }
  917. now := gtime.Now()
  918. var difference time.Duration
  919. if followTime.FollowUpDate.IsZero() {
  920. difference = now.Sub(gtime.New(followTime.CreatedTime))
  921. } else {
  922. difference = now.Sub(gtime.New(followTime.FollowUpDate))
  923. }
  924. days := difference.Hours() / 24
  925. if days < 0 {
  926. followInfo.NotFollowDay = 0
  927. } else {
  928. followInfo.NotFollowDay = int(math.Floor(days))
  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. }