cust_customer.go 38 KB

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