package main import ( "database/sql" "fmt" "github.com/gogf/gf/v2/util/gconv" "log" "strings" "time" "app.yhyue.com/moapp/jybase/date" "app.yhyue.com/moapp/jybase/redis" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/mongodb" ) func FormatData(data map[string]interface{}, item string) (bool, bool) { userId, uId, positionId, source, cluename, phone, sourceCode, keyword := common.ObjToString(data["user_id"]), "", "", "", "", "", "", []string{} role, industry, department, departments, position, name, top_cluetype, sub_cluetype, follow_project_area, level := "", "", "", "", "", "", "", "", "", "" query, topname, subname, belong_to, sourceName, remark, sourceId := map[string]interface{}{}, "", "", "01", "", "", int64(0) nowTime := time.Now().Format("2006-01-02 15:04:05") if item == "orders" { //订单 if !mongodb.IsObjectIdHex(userId) { positionId = userId userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"position_id": userId}, "", "") if userMapping != nil && len(*userMapping) > 0 { userId = common.ObjToString((*userMapping)["userid"]) } } query["userid"] = userId userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) //用户来源 belong_to = common.ObjToString((*userInfo)["belong_to"]) //用户归属 } cluename = common.ObjToString(data["company_name"]) phone = common.ObjToString(data["user_phone"]) } else if item == "message" { userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"base_user_id": common.Int64All(data["own_id"])}, "", "") if userMapping != nil && len(*userMapping) > 0 { userId = common.ObjToString((*userMapping)["userid"]) positionId = fmt.Sprint((*userMapping)["position_id"]) } query["userid"] = userId userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) belong_to = common.ObjToString((*userInfo)["belong_to"]) phone = common.ObjToString((*userInfo)["phone"]) if phone != "" { phoneMapping := TiDb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"phone": phone}, "", "") if phoneMapping != nil && len(*phoneMapping) > 0 { cluename = common.ObjToString((*phoneMapping)["cluename"]) } } } } else if item == "users" || item == "xcxusers" { //注册用户 userId = mongodb.BsonIdToSId(data["userid"]) //新用户没有uid、source要等5分钟 cluename = common.ObjToString(data["company_name"]) phone = common.ObjToString(data["phone"]) if phone != "" { contactsData := TiDb.SelectBySql("select * from dwd_f_userbase_contacts where phone = ? and is_delete = 1", phone) if contactsData != nil && len(*contactsData) > 0 { if common.ObjToString((*contactsData)[0]["baseinfo_id"]) != "" { uId = common.ObjToString((*contactsData)[0]["baseinfo_id"]) query["uid"] = uId } else { query["userid"] = userId } } else { query["userid"] = userId } userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) belong_to = common.ObjToString((*userInfo)["belong_to"]) } if item == "xcxusers" { sourceCode = common.ObjToString(data["s_sourceid"]) if sourceCode == "" { log.Println("留资没有source", phone) return true, true } } } } else if item == "saleLeads" { //留资 userId = common.ObjToString(data["userid"]) if !mongodb.IsObjectIdHex(userId) { positionId = userId userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"position_id": userId}, "", "") if userMapping != nil && len(*userMapping) > 0 { userId = common.ObjToString((*userMapping)["userid"]) } } cluename = common.ObjToString(data["company"]) phone = common.ObjToString(data["phone"]) role = common.ObjToString(data["companyType"]) industry = common.ObjToString(data["industry"]) department = common.ObjToString(data["branch"]) departments = common.ObjToString(data["department"]) position = common.ObjToString(data["position"]) name = common.ObjToString(data["name"]) sourceCode = common.ObjToString(data["source"]) if sourceCode == "" { log.Println("留资没有source", phone) return true, true } remark = common.ObjToString(data["jyRemark"]) //荟聚线索备注 keywordArr := data["keyword"] if keywordArr != nil { keyword = common.ObjArrToStringArr(data["keyword"].([]interface{})) } contactsData := TiDb.SelectBySql("select * from dwd_f_userbase_contacts where phone = ? and is_delete = 1", phone) if contactsData != nil && len(*contactsData) > 0 { if common.ObjToString((*contactsData)[0]["baseinfo_id"]) != "" { uId = common.ObjToString((*contactsData)[0]["baseinfo_id"]) query["uid"] = uId } else { query["userid"] = userId } } else { query["userid"] = userId } if userId != "" || uId != "" { userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) belong_to = common.ObjToString((*userInfo)["belong_to"]) userId = common.ObjToString((*userInfo)["userid"]) } } else { if sourceCode == "report_retention" || sourceCode == "marketing_retention" { //荟聚线索来源,不是剑鱼用户,需要等待用户归集 log.Println("不是剑鱼用户留资,等待用户", phone) return false, false } else if remark != "" { log.Println("留资source过滤", phone, sourceCode) return true, true } } } else if item == "eventReg" { //渠道 userId = common.ObjToString(data["userid"]) cluename = common.ObjToString(data["company"]) phone = common.ObjToString(data["sign_phone"]) role = common.ObjToString(data["company_type"]) department = common.ObjToString(data["branch"]) position = common.ObjToString(data["position"]) name = common.ObjToString(data["sign_name"]) sourceCode = common.ObjToString(data["source_code"]) sourceName = common.ObjToString(data["source_name"]) log.Println(sourceName) contactsData := TiDb.SelectBySql("select * from dwd_f_userbase_contacts where phone = ? and is_delete = 1", phone) if contactsData != nil && len(*contactsData) > 0 { if common.ObjToString((*contactsData)[0]["baseinfo_id"]) != "" { uId = common.ObjToString((*contactsData)[0]["baseinfo_id"]) query["uid"] = uId } else { query["userid"] = userId } } else { query["userid"] = userId } userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) belong_to = common.ObjToString((*userInfo)["belong_to"]) userId = common.ObjToString((*userInfo)["userid"]) } if role == "集成商" || role == "设计院" { role = "其他-" + role } } else if item == "readClue" { userId = common.ObjToString(data["userId"]) query["userid"] = userId userInfo := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "") if userInfo != nil && len(*userInfo) > 0 { uId = common.ObjToString((*userInfo)["uid"]) source = common.ObjToString((*userInfo)["source"]) belong_to = common.ObjToString((*userInfo)["belong_to"]) } // cluename = common.ObjToString(data["companyName"]) phone = common.ObjToString(data["phone"]) sourceId = common.Int64All(data["sourceId"]) } if cluename == "" && item != "message" && item != "orders" && item != "readClue" { cluename = phone //没有线索名,手机号代替 } isGroup, isCommerce := GetCompanyType(cluename) //判断是否集团公司、工商库 if source == "0104" || strings.HasPrefix(belong_to, "02") || source == "0102" || source == "0103" || phone == "" { //参照用户来源代码表 //log.Println("线索分配失败,线索过滤!!", item, source, phone, userId) //saveHlyj(belong_to, item, phone, name, sourceName, cluename, position, nowTime, isGroup, isCommerce) return true, true } if uId == "" { //没有进用户归集,等待进入,结束任务,放在下次继续执行 if isExists, _ := redis.Exists("bidx", "bidx_userId_"+userId); isExists { redisInt := redis.GetInt("bidx", "bidx_userId_"+userId) if redisInt > 4 { log.Println("线索分配失败,线索缺少信息,任务已执行超过1次", item, userId, phone) return true, true } else { redis.Incr("bidx", "bidx_userId_"+userId) } } else { redis.Put("bidx", "bidx_userId_"+userId, 1, 3600) } log.Println("线索分配失败,线索缺少信息", item, phone, userId) return false, false } if item == "orders" { //订单没信息再查一遍留资 qid := positionId if qid == "" { qid = userId } saleLeadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"userid": qid}, map[string]interface{}{"_id": -1}, nil, false, 0, 1) if ok && saleLeadsData != nil && len(*saleLeadsData) > 0 { sdata := (*saleLeadsData)[0] role = common.ObjToString(sdata["companyType"]) industry = common.ObjToString(sdata["industry"]) department = common.ObjToString(sdata["branch"]) departments = common.ObjToString(sdata["department"]) position = common.ObjToString(sdata["position"]) name = common.ObjToString(sdata["name"]) } } top_cluetype, sub_cluetype, level, topname, subname = getClueType(item, data, sourceCode, sourceId) //查留资来源名字 if topname == "市场活动" && item == "saleLeads" { //市场活动的不要 log.Println("市场活动留资过滤 ", userId, phone) return true, true } if strings.HasPrefix(belong_to, "03") { //一切都好的不进 isOk := saveEverything(userId, phone, item, subname, sourceCode) log.Println("渠道线索电销", userId, phone, item, subname, sourceCode) if !isOk { return true, true } } follow_project_area = getAreaCode(userId) //关注项目区域 log.Println("data +++", top_cluetype, sub_cluetype, level, follow_project_area, isGroup, isCommerce) if top_cluetype == "" || sub_cluetype == "" || level == "" { log.Println("线索分配失败,线索过滤top_cluetype!!", item, uId, phone, userId) return true, true } position_id, seatNumber, saleName, saleData, pIsOk, isFreeze, noticePositionId := autoDraw(level, cluename, phone, isGroup, isCommerce) //查询当前分配次数最少的,如果当前线索有销售,此次找出的不会+1 log.Println("data -------", position_id, seatNumber, saleName, pIsOk, isFreeze, noticePositionId) if position_id > 0 && seatNumber != "" { uCount, oks := TiDb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, "", ""), true //查当前线索是否已存在 if uCount != nil && len(*uCount) > 0 { //已存在,走更新 batch_import := common.ObjToString((*uCount)["batch_import"]) if batch_import != "" && item == "users" { //有导入批次号还是新用户,不执行 return true, true } //oks = UpdateClue(*uCount, saleData, item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, level, position_id, source, sourceCode, remark, keyword, belong_to, isGroup, isCommerce, pIsOk, "") oks = UpdateClue(*uCount, saleData, item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, level, position_id, source, sourceCode, remark, keyword, belong_to, isGroup, isCommerce, pIsOk) } else { //不存在走新增 oks = SaveClue(item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, position_id, source, sourceCode, remark, keyword, belong_to, isGroup, isCommerce, isFreeze, "") if oks { //新增成功,销售分配次数+1 TiDb.UpdateOrDeleteBySql(`update dwd_f_crm_clue_autodraw_record set count = count + 1 where position_id = ? and clue_level = ?`, position_id, level) } } if !oks { log.Println("线索分配失败!!", item, position_id, seatNumber, uId, userId, phone) return false, false } } else { if isFreeze { //达上限放公海处理 uCount, oks := TiDb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, "", ""), true //查当前线索是否已存在 if uCount == nil || len(*uCount) == 0 { oks = SaveClue0(item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, position_id, source, sourceCode, remark, keyword, belong_to, isGroup, isCommerce, isFreeze) log.Println(oks) } else { //留资线索更新 if item != "orders" && item != "users" { //新用户和订单之外的替换一下新的留资信息 BCPCID := common.GetRandom(32) clueId := common.Int64All((*uCount)["id"]) old_name := common.ObjToString((*uCount)["name"]) old_position := common.ObjToString((*uCount)["position"]) old_department := common.ObjToString((*uCount)["department"]) old_follow_project_area := common.ObjToString((*uCount)["follow_project_area"]) old_role := common.ObjToString((*uCount)["role"]) old_cluename := common.ObjToString((*uCount)["cluename"]) old_top_cluetype := common.ObjToString((*uCount)["top_cluetype"]) old_sub_cluetype := common.ObjToString((*uCount)["sub_cluetype"]) clueUpdateData := map[string]interface{}{} if old_name != name && name != "" { clueUpdateData["name"] = name TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "name", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_name != "", old_name, "/"), "new_value": common.If(name != "", name, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_position != position && position != "" { clueUpdateData["position"] = position TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "position", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_position != "", old_position, "/"), "new_value": common.If(position != "", position, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_department != department && department != "" { clueUpdateData["department"] = department TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "department", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_department != "", old_department, "/"), "new_value": common.If(department != "", department, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_follow_project_area != follow_project_area && follow_project_area != "" { clueUpdateData["follow_project_area"] = follow_project_area TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "follow_project_area", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_follow_project_area != "", old_follow_project_area, "/"), "new_value": common.If(follow_project_area != "", follow_project_area, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_role != role && role != "" { TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "role", "change_type": "基本信息变更", "old_value": common.If(old_role != "", old_role, "/"), "new_value": common.If(role != "", role, "/"), "createtime": nowTime, "position_id": 0, "BCPCID": BCPCID, "operator_id": -1}) clueUpdateData["role"] = role } if old_cluename != cluename && cluename != "" { clueUpdateData["cluename"] = cluename //新的线索名不为空才替换 TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "cluename", "change_type": "基本信息变更", "old_value": common.If(old_cluename != "", old_cluename, "/"), "new_value": common.If(cluename != "", cluename, "/"), "createtime": nowTime, "BCPCID": BCPCID, "position_id": 0, "operator_id": -1}) } old_topname := "" old_subname := "" if old_top_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_top_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_topname = common.ObjToString((*pcodeData)["name"]) } } if old_sub_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_sub_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_subname = common.ObjToString((*pcodeData)["name"]) } } if old_top_cluetype != top_cluetype && top_cluetype != "" { clueUpdateData["top_cluetype"] = top_cluetype //新的线索名不为空才替换 TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "top_cluetype", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_topname != "", old_topname, "/"), "new_value": common.If(topname != "", topname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_sub_cluetype != sub_cluetype && sub_cluetype != "" { clueUpdateData["sub_cluetype"] = sub_cluetype //新的线索名不为空才替换 TiDb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "change_field": "sub_cluetype", "position_id": 0, "change_type": "基本信息变更", "old_value": common.If(old_subname != "", old_subname, "/"), "new_value": common.If(subname != "", subname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } clueUpdateData["company_nature"] = isGroup clueUpdateData["company_verification"] = isCommerce TiDb.Update("dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, clueUpdateData) } } AssFail(noticePositionId, cluename, phone) return true, true } return true, false } return true, true } func SaveClue(item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber string, positionId int64, source, sourceCode, remark string, keyword []string, belong_to string, isGroup, isCommerce int, isFreeze bool, demand string) bool { nowTime := time.Now().Format("2006-01-02 15:04:05") nowTimes := time.Unix(time.Now().Unix()+3600*12, 0).Format("2006-01-02 15:04:05") clueId, uodateId1, uodateId2, uodateId3, uodateId4, uodateId5, uodateId6 := int64(0), int64(0), int64(0), int64(0), int64(0), int64(0), int64(0) if TiDb.ExecTx("保存线索", func(tx *sql.Tx) bool { keywords := "" if sourceCode == "app_xzcyh" { if len(keyword) > 0 && keyword[0] != "" { keywords = strings.Join(keyword, ",") } } if cluename == "" { cluename = phone } clueId = TiDb.InsertByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{ "userid": userId, "uid": uId, "seatNumber": seatNumber, "position_id": positionId, "is_assign": common.If(isFreeze, -3, 1), "comeintime": nowTime, "createtime": nowTime, "updatetime": nowTime, "cluename": cluename, "top_cluetype": top_cluetype, "sub_cluetype": sub_cluetype, "trailstatus": "01", "name": name, "phone": phone, "position": position, "department": common.If(sourceCode == "app_xzcyh", departments, department), "industry": industry, "follow_project_area": follow_project_area, "role": role, "comeinsource_private": 2, "is_task": 1, "task_time": nowTime, "tasktime": common.If(item == "users", nowTimes, nowTime), "taskstatus": 0, "tasksource": "线索自动分配" + "-" + topname + "-" + subname, "business_scope": common.If(sourceCode == "app_xzcyh", keywords, nil), "company_nature": isGroup, "company_verification": isCommerce, "remark": remark, "customer_demand": demand, "FREEZE_TIME": nowTime, }) uodateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_type": "创建线索", "new_value": "系统自动创建", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId2 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": "/", "new_value": saleName, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId4 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_type": "加入任务车", "new_value": "线索自动分配" + "-" + topname + "-" + subname, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId5 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "top_cluetype", "change_type": "基本信息变更", "old_value": "/", "new_value": topname, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId6 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "sub_cluetype", "change_type": "基本信息变更", "old_value": "/", "new_value": subname, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) //冻结处理 return clueId > -1 && uodateId1 > -1 && uodateId2 > -1 && uodateId3 > -1 && uodateId4 > -1 && uodateId5 > -1 && uodateId6 > -1 }) { log.Println("线索分配成功") if TiDb.Count("dwd_f_userbase_contacts", map[string]interface{}{"phone": phone}) == 0 { TiDb.Insert("dwd_f_userbase_contacts", map[string]interface{}{ "status": 1, "is_delete": 1, "createtime": nowTime, "updatetime": nowTime, "phone": phone, "baseinfo_id": uId, "SOURCE": source, }) } return true } else { log.Println("线索分配失败!!!", clueId, uodateId1, uodateId2, uodateId3, uodateId4, uodateId5, uodateId6, " 用户信息 ", item, position, seatNumber, uId, userId, phone) return false } } func SaveClue0(item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber string, positionId int64, source, sourceCode, remark string, keyword []string, belong_to string, isGroup, isCommerce int, isFreeze bool) bool { nowTime := time.Now().Format("2006-01-02 15:04:05") clueId, uodateId1, uodateId2, uodateId3 := int64(0), int64(0), int64(0), int64(0) if TiDb.ExecTx("保存线索", func(tx *sql.Tx) bool { keywords := "" if sourceCode == "app_xzcyh" { if len(keyword) > 0 && keyword[0] != "" { keywords = strings.Join(keyword, ",") } } if cluename == "" { cluename = phone } clueId = TiDb.InsertByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{ "userid": userId, "uid": uId, "seatNumber": "", "position_id": 0, "is_assign": 0, "comeintime": nowTime, "createtime": nowTime, "updatetime": nowTime, "cluename": cluename, "top_cluetype": top_cluetype, "sub_cluetype": sub_cluetype, "trailstatus": "01", "name": name, "phone": phone, "position": position, "department": common.If(sourceCode == "app_xzcyh", departments, department), "industry": industry, "follow_project_area": follow_project_area, "role": role, "comeinsource_private": 2, "business_scope": common.If(sourceCode == "app_xzcyh", keywords, nil), "company_nature": isGroup, "company_verification": isCommerce, "remark": remark, "FREEZE_TIME": nowTime, }) uodateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_type": "创建线索", "new_value": "系统自动创建", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId2 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": "", "new_value": "/", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) uodateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) return clueId > -1 && uodateId1 > -1 && uodateId2 > -1 && uodateId3 > -1 }) { log.Println("线索分配成功") if TiDb.Count("dwd_f_userbase_contacts", map[string]interface{}{"phone": phone}) == 0 { TiDb.Insert("dwd_f_userbase_contacts", map[string]interface{}{ "status": 1, "is_delete": 1, "createtime": nowTime, "updatetime": nowTime, "phone": phone, "baseinfo_id": uId, "SOURCE": source, }) } return true } else { log.Println("线索分配失败!!!", clueId, uodateId1, uodateId2, uodateId3, " 用户信息 ", item, position, seatNumber, uId, userId, phone) return false } } func WorkUpdateClue(data map[string]interface{}, saleData []map[string]interface{}, item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, level string, positionId int64, source, sourceCode, remark string, keyword []string, belong_to string, isGroup, isCommerce int, pIsOk bool, demand string) bool { log.Println("工单线索修改前", data) nowTime := time.Now().Format("2006-01-02 15:04:05") nowTimes := time.Unix(time.Now().Unix()+3600*12, 0).Format("2006-01-02 15:04:05") trailstatus := common.ObjToString(data["trailstatus"]) //data都为原线索数据 trailstatusTime := common.ObjToString(data["trailstatus_time"]) var trailstatusTimes time.Time if trailstatusTime != "" { trailstatusTimes, _ = time.ParseInLocation(date.Date_Full_Layout, trailstatusTime, time.Local) } clueId := common.Int64All(data["id"]) is_assign := common.IntAll(data["is_assign"]) oldsaleName, oldTaskTime, taskTime, is_task, taskstatus := "", "", "", 0, 0 old_position_id, old_seatNumber := common.Int64All(data["position_id"]), common.ObjToString(data["seatNumber"]) oldTaskTime = common.ObjToString(data["tasktime"]) is_task = common.IntAll(data["is_task"]) taskstatus = common.IntAll(data["taskstatus"]) BCPCID := common.GetRandom(32) old_name := common.ObjToString(data["name"]) old_position := common.ObjToString(data["position"]) old_department := common.ObjToString(data["department"]) old_follow_project_area := common.ObjToString(data["follow_project_area"]) old_role := common.ObjToString(data["role"]) old_cluename := common.ObjToString(data["cluename"]) old_top_cluetype := common.ObjToString(data["top_cluetype"]) old_sub_cluetype := common.ObjToString(data["sub_cluetype"]) old_topname, old_subname := "", "" is_transfer := common.IntAll(data["is_transfer"]) if taskstatus == 1 || is_task == 0 { taskTime = common.ObjToString(common.If(item != "users", nowTime, nowTimes)) //任务时间,正常的是当前时间,新用户是当前时间+12个小时 } else { if is_task == 1 { if oldTaskTime != "" { //以最新的任务时间为主 t1, err := time.Parse("2006-01-02 15:04:05", oldTaskTime) if err == nil && time.Now().Before(t1) { taskTime = nowTime } else { taskTime = oldTaskTime } } } } count, counts, t := 0, 0, time.Now() //加入任务车判断节假日 for { count++ currentTime := t.AddDate(0, 0, -count) if currentTime.Weekday() == time.Sunday || currentTime.Weekday() == time.Saturday { isok := false for k, v := range DateMap { if currentTime.Format(date.Date_Short_Layout) == k && v == 2 { isok = true } } if isok { counts++ } } else { isok := true for k, v := range DateMap { if currentTime.Format(date.Date_Short_Layout) == k && v == 1 { isok = false } } if isok { counts++ } } if counts >= 2 { break } } //两天之前不包含节假日,有没有跟进记录 recordCount := TiDb.CountBySql(`select count(1) from dwd_f_crm_trail_content where clue_id = ? and createtime > ?`, clueId, t.AddDate(0, 0, -count).Format(date.Date_Full_Layout)) // clueUpdateData := map[string]interface{}{ "updatetime": nowTime, "top_cluetype": top_cluetype, "sub_cluetype": sub_cluetype, "userid": userId, "comeinsource_private": 2, "tasksource": gconv.String(common.If(gconv.Int64(data["position_id"]) == 0, "线索自动分配", "线索来源自动更新")) + "-" + topname + "-" + subname, "company_nature": isGroup, "company_verification": isCommerce, } old_remark := common.ObjToString(data["remark"]) if old_remark != "" { remark = old_remark + ";" + remark //备注不能替换,只能往上拼接 } clueUpdateData["remark"] = remark old_demand := common.ObjToString(data["customer_demand"]) if demand != old_demand { clueUpdateData["customer_demand"] = demand } if cluename != "" { clueUpdateData["cluename"] = cluename //新的线索名不为空才替换 } if item != "orders" && item != "users" { //新用户和订单之外的替换一下新的留资信息 if name != "" { clueUpdateData["name"] = name } if position != "" { clueUpdateData["position"] = position } if department != "" { clueUpdateData["department"] = department } if follow_project_area != "" { clueUpdateData["follow_project_area"] = follow_project_area } if role != "" { clueUpdateData["role"] = role } // clueUpdateData["industry"] = industry } if sourceCode == "app_xzcyh" { //这个留资单独处理一下 if departments != "" { clueUpdateData["department"] = departments department = departments } business_scope := common.ObjToString(data["business_scope"]) keywords := "" if len(keyword) > 0 && keyword[0] != "" { keywords = strings.Join(keyword, ",") if business_scope != "" { clueUpdateData["business_scope"] = business_scope + "," + keywords } else { clueUpdateData["business_scope"] = keywords } } } if old_position_id != 0 { for _, v := range saleData { if old_position_id == common.Int64All(v["position_id"]) { oldsaleName = common.ObjToString(v["name"]) } } } if trailstatus == "00" || old_position_id == 0 || is_assign != 1 || (pIsOk && old_cluename != cluename && cluename != "") { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { clueUpdateData["seatNumber"] = seatNumber clueUpdateData["position_id"] = positionId clueUpdateData["comeintime"] = nowTime clueUpdateData["is_assign"] = 1 clueUpdateData["comeinsource_open"] = nil clueUpdateData["level_open"] = nil clueUpdateData["clue_level"] = nil } } else if is_assign == 1 && positionId != old_position_id { clueUpdateData["seatNumber"] = seatNumber clueUpdateData["position_id"] = positionId clueUpdateData["comeintime"] = nowTime clueUpdateData["is_assign"] = 1 clueUpdateData["comeinsource_open"] = nil clueUpdateData["level_open"] = nil clueUpdateData["clue_level"] = nil } else { //不属于上边情况就还是属于原来的销售,不更换销售 clueUpdateData["seatNumber"] = old_seatNumber clueUpdateData["position_id"] = old_position_id clueUpdateData["is_assign"] = 1 clueUpdateData["comeinsource_open"] = nil clueUpdateData["level_open"] = nil clueUpdateData["clue_level"] = nil } if trailstatus != "08" && is_assign == 0 { //在公海的成交客户 if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { clueUpdateData["trailstatus"] = "01" clueUpdateData["trailstatus_time"] = nowTime } } is_ok := false if (trailstatus != "08" && recordCount <= 0) || is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { if item == "eventReg" { eData := TiDb.Find("dwd_f_crm_clue_change_record", map[string]interface{}{"clue_id": clueId, "change_type": "加入任务车"}, "", "", -1, -1) if eData != nil && len(*eData) > 0 { for _, e := range *eData { new_value := common.ObjToString(e["new_value"]) if strings.Contains(new_value, subname) { is_ok = true } } } if !is_ok { if old_sub_cluetype != sub_cluetype || is_assign == 0 { if taskTime == "" { taskTime = nowTime } clueUpdateData["task_time"] = nowTime clueUpdateData["tasktime"] = taskTime clueUpdateData["taskstatus"] = 0 } if is_transfer != 1 { clueUpdateData["is_task"] = 1 } } } else { if old_sub_cluetype != sub_cluetype || is_assign == 0 { if taskTime == "" { taskTime = nowTime } clueUpdateData["task_time"] = nowTime clueUpdateData["tasktime"] = taskTime clueUpdateData["taskstatus"] = 0 } if is_transfer != 1 { clueUpdateData["is_task"] = 1 } } } } ok, updateId14 := true, true updateId1, updateId2, updateId3, updateId4, updateId5 := int64(0), int64(0), int64(0), int64(0), int64(0) updateId6, updateId7, updateId8, updateId9, updateId10 := int64(0), int64(0), int64(0), int64(0), int64(0) updateId11, updateId12, updateId13 := int64(0), int64(0), int64(0) if TiDb.ExecTx("更新线索", func(tx *sql.Tx) bool { //线索 ok = TiDb.UpdateByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, clueUpdateData) //变更记录 if (trailstatus == "00" || old_position_id == 0 || (pIsOk && old_cluename != cluename && cluename != "")) && is_assign == 1 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else if old_position_id == 0 { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": CodeTrail[trailstatus], "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { if pIsOk && old_cluename != cluename && cluename != "" { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId2 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.Int64All(data["position_id"]), "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "无意向客户", "new_value": "流失", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId4 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "无意向客户", "new_value": "商机线索", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } } } else if trailstatus != "08" && is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) if trailstatus != "01" { updateId4 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": CodeTrail[trailstatus], "new_value": "商机线索", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } } else if (pIsOk && old_cluename == cluename && cluename != "") && is_assign == 1 && positionId != old_position_id { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } if (trailstatus != "08" && recordCount <= 0) || is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { if old_sub_cluetype != sub_cluetype && !is_ok { if is_transfer != 1 { updateId5 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"]))), "change_type": "加入任务车", "new_value": "线索来源自动更新" + "-" + topname + "-" + subname, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { cdata := TiDb.FindOne("dwd_f_csm_customer_info", map[string]interface{}{"clue_id": clueId}, "", "") if cdata != nil && len(*cdata) > 0 { kcpositionId := common.Int64All((*cdata)["position_id"]) tasksource := common.ObjToString((*cdata)["tasksource"]) taskstatus := common.IntAll((*cdata)["taskstatus"]) updateId5 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": kcpositionId, "change_type": "加入任务车", "new_value": "线上主动留资", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) if taskstatus == 1 { tasksource = "10" } else { if tasksource != "" && !strings.Contains(tasksource, "10") { if !strings.Contains(tasksource, "10") { tasksource += ",10" } } else { tasksource = "10" } } updateId14 = TiDb.UpdateByTx(tx, "dwd_f_csm_customer_info", map[string]interface{}{"clue_id": clueId}, map[string]interface{}{ "tasksource": tasksource, "tasktime": nowTime, "is_task": 1, "taskstatus": 0, }) } } } } } if old_top_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_top_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_topname = common.ObjToString((*pcodeData)["name"]) } } if old_sub_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_sub_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_subname = common.ObjToString((*pcodeData)["name"]) } } if item != "orders" { if old_name != name && name != "" { updateId6 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "name", "change_type": "基本信息变更", "old_value": common.If(old_name != "", old_name, "/"), "new_value": common.If(name != "", name, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_position != position && position != "" { updateId7 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "position", "change_type": "基本信息变更", "old_value": common.If(old_position != "", old_position, "/"), "new_value": common.If(position != "", position, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_department != department && department != "" { updateId8 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "department", "change_type": "基本信息变更", "old_value": common.If(old_department != "", old_department, "/"), "new_value": common.If(department != "", department, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_role != role && role != "" { updateId9 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{"clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "role", "change_type": "基本信息变更", "old_value": common.If(old_role != "", old_role, "/"), "new_value": common.If(role != "", role, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_follow_project_area != follow_project_area && follow_project_area != "" { old_area, old_area_arr := "", []string{} new_area, new_area_arr := "", []string{} for _, v := range strings.Split(old_follow_project_area, ",") { old_area_arr = append(old_area_arr, CodeArea[v]) } for _, v := range strings.Split(follow_project_area, ",") { new_area_arr = append(new_area_arr, CodeArea[v]) } old_area = strings.Join(old_area_arr, ",") new_area = strings.Join(new_area_arr, ",") updateId10 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "follow_project_area", "change_type": "基本信息变更", "old_value": common.If(old_area != "", old_area, "/"), "new_value": common.If(new_area != "", new_area, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_cluename != cluename && cluename != "" { updateId11 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "cluename", "change_type": "基本信息变更", "old_value": common.If(old_cluename != "", old_cluename, "/"), "new_value": common.If(cluename != "", cluename, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } } if old_top_cluetype != top_cluetype { updateId12 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"])))), "change_field": "top_cluetype", "change_type": "基本信息变更", "old_value": common.If(old_topname != "", old_topname, "/"), "new_value": common.If(topname != "", topname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_sub_cluetype != sub_cluetype { updateId13 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.If(is_assign == 1, positionId, common.If(is_assign == 1, positionId, common.Int64All(data["position_id"]))))), "change_field": "sub_cluetype", "change_type": "基本信息变更", "old_value": common.If(old_subname != "", old_subname, "/"), "new_value": common.If(subname != "", subname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } return ok && updateId1 > -1 && updateId2 > -1 && updateId3 > -1 && updateId4 > -1 && updateId5 > -1 && updateId6 > -1 && updateId7 > -1 && updateId8 > -1 && updateId9 > -1 && updateId10 > -1 && updateId11 > -1 && updateId12 > -1 && updateId13 > -1 && updateId14 }) { log.Println("线索更新成功") if TiDb.Count("dwd_f_userbase_contacts", map[string]interface{}{"phone": phone}) == 0 { TiDb.Insert("dwd_f_userbase_contacts", map[string]interface{}{ "status": 1, "is_delete": 1, "createtime": nowTime, "updatetime": nowTime, "phone": phone, "baseinfo_id": uId, "SOURCE": source, }) } if old_position_id == 0 { TiDb.UpdateOrDeleteBySql(`update dwd_f_crm_clue_autodraw_record set count = count + 1 where position_id = ? and clue_level = ?`, positionId, level) } return true } else { log.Println("线索更新失败!!!", ok, updateId1, updateId2, updateId3, updateId4, updateId5, updateId6, updateId7, updateId8, updateId9, updateId10, updateId11, updateId12, updateId13, updateId14, " 用户信息 ", item, position, seatNumber, uId, userId, phone) return false } } func UpdateClue(data map[string]interface{}, saleData []map[string]interface{}, item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, level string, positionId int64, source, sourceCode, remark string, keyword []string, belong_to string, isGroup, isCommerce int, pIsOk bool) bool { log.Println("线索修改前", data) nowTime := time.Now().Format("2006-01-02 15:04:05") nowTimes := time.Unix(time.Now().Unix()+3600*12, 0).Format("2006-01-02 15:04:05") trailstatus := common.ObjToString(data["trailstatus"]) //data都为原线索数据 trailstatusTime := common.ObjToString(data["trailstatus_time"]) var trailstatusTimes time.Time if trailstatusTime != "" { trailstatusTimes, _ = time.ParseInLocation(date.Date_Full_Layout, trailstatusTime, time.Local) } clueId := common.Int64All(data["id"]) is_assign := common.IntAll(data["is_assign"]) oldsaleName, oldTaskTime, taskTime, is_task, taskstatus := "", "", "", 0, 0 old_position_id, old_seatNumber := common.Int64All(data["position_id"]), common.ObjToString(data["seatNumber"]) oldTaskTime = common.ObjToString(data["tasktime"]) is_task = common.IntAll(data["is_task"]) taskstatus = common.IntAll(data["taskstatus"]) BCPCID := common.GetRandom(32) old_name := common.ObjToString(data["name"]) old_position := common.ObjToString(data["position"]) old_department := common.ObjToString(data["department"]) old_follow_project_area := common.ObjToString(data["follow_project_area"]) old_role := common.ObjToString(data["role"]) old_cluename := common.ObjToString(data["cluename"]) old_top_cluetype := common.ObjToString(data["top_cluetype"]) old_sub_cluetype := common.ObjToString(data["sub_cluetype"]) old_topname, old_subname := "", "" is_transfer := common.IntAll(data["is_transfer"]) if taskstatus == 1 || is_task == 0 { taskTime = common.ObjToString(common.If(item != "users", nowTime, nowTimes)) //任务时间,正常的是当前时间,新用户是当前时间+12个小时 } else { if is_task == 1 { if oldTaskTime != "" { //以最新的任务时间为主 t1, err := time.Parse("2006-01-02 15:04:05", oldTaskTime) if err == nil && time.Now().Before(t1) { taskTime = nowTime } else { taskTime = oldTaskTime } } } } count, counts, t := 0, 0, time.Now() //加入任务车判断节假日 for { count++ currentTime := t.AddDate(0, 0, -count) if currentTime.Weekday() == time.Sunday || currentTime.Weekday() == time.Saturday { isok := false for k, v := range DateMap { if currentTime.Format(date.Date_Short_Layout) == k && v == 2 { isok = true } } if isok { counts++ } } else { isok := true for k, v := range DateMap { if currentTime.Format(date.Date_Short_Layout) == k && v == 1 { isok = false } } if isok { counts++ } } if counts >= 2 { break } } //两天之前不包含节假日,有没有跟进记录 recordCount := TiDb.CountBySql(`select count(1) from dwd_f_crm_trail_content where clue_id = ? and createtime > ?`, clueId, t.AddDate(0, 0, -count).Format(date.Date_Full_Layout)) // clueUpdateData := map[string]interface{}{ "updatetime": nowTime, "top_cluetype": top_cluetype, "sub_cluetype": sub_cluetype, "userid": userId, "comeinsource_private": 2, "tasksource": "线索来源自动更新" + "-" + topname + "-" + subname, "company_nature": isGroup, "company_verification": isCommerce, } old_remark := common.ObjToString(data["remark"]) if old_remark != "" { remark = old_remark + ";" + remark //备注不能替换,只能往上拼接 } clueUpdateData["remark"] = remark if cluename != "" { clueUpdateData["cluename"] = cluename //新的线索名不为空才替换 } if item != "orders" && item != "users" { //新用户和订单之外的替换一下新的留资信息 if name != "" { clueUpdateData["name"] = name } if position != "" { clueUpdateData["position"] = position } if department != "" { clueUpdateData["department"] = department } if follow_project_area != "" { clueUpdateData["follow_project_area"] = follow_project_area } if role != "" { clueUpdateData["role"] = role } // clueUpdateData["industry"] = industry } if sourceCode == "app_xzcyh" { //这个留资单独处理一下 if departments != "" { clueUpdateData["department"] = departments department = departments } business_scope := common.ObjToString(data["business_scope"]) keywords := "" if len(keyword) > 0 && keyword[0] != "" { keywords = strings.Join(keyword, ",") if business_scope != "" { clueUpdateData["business_scope"] = business_scope + "," + keywords } else { clueUpdateData["business_scope"] = keywords } } } if trailstatus == "00" || old_position_id == 0 || is_assign != 1 || (pIsOk && old_cluename != cluename && cluename != "") { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { clueUpdateData["seatNumber"] = seatNumber clueUpdateData["position_id"] = positionId clueUpdateData["comeintime"] = nowTime clueUpdateData["is_assign"] = 1 clueUpdateData["comeinsource_open"] = nil clueUpdateData["level_open"] = nil clueUpdateData["clue_level"] = nil for _, v := range saleData { if common.Int64All(data["position_id"]) == common.Int64All(v["position_id"]) { oldsaleName = common.ObjToString(v["name"]) } } } } else { //不属于上边情况就还是属于原来的销售,不更换销售 clueUpdateData["seatNumber"] = old_seatNumber clueUpdateData["position_id"] = old_position_id clueUpdateData["is_assign"] = 1 clueUpdateData["comeinsource_open"] = nil clueUpdateData["level_open"] = nil clueUpdateData["clue_level"] = nil } if trailstatus != "08" && is_assign == 0 { //在公海的成交客户 if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { clueUpdateData["trailstatus"] = "01" clueUpdateData["trailstatus_time"] = nowTime } } is_ok := false if (trailstatus != "08" && recordCount <= 0) || is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { if item == "eventReg" { eData := TiDb.Find("dwd_f_crm_clue_change_record", map[string]interface{}{"clue_id": clueId, "change_type": "加入任务车"}, "", "", -1, -1) if eData != nil && len(*eData) > 0 { for _, e := range *eData { new_value := common.ObjToString(e["new_value"]) if strings.Contains(new_value, subname) { is_ok = true } } } if !is_ok { if old_sub_cluetype != sub_cluetype || is_assign == 0 { if taskTime == "" { taskTime = nowTime } clueUpdateData["task_time"] = nowTime clueUpdateData["tasktime"] = taskTime clueUpdateData["taskstatus"] = 0 } if is_transfer != 1 { clueUpdateData["is_task"] = 1 } } } else { if old_sub_cluetype != sub_cluetype || is_assign == 0 { if taskTime == "" { taskTime = nowTime } clueUpdateData["task_time"] = nowTime clueUpdateData["tasktime"] = taskTime clueUpdateData["taskstatus"] = 0 } if is_transfer != 1 { clueUpdateData["is_task"] = 1 } } } } ok, updateId14 := true, true updateId1, updateId2, updateId3, updateId4, updateId5 := int64(0), int64(0), int64(0), int64(0), int64(0) updateId6, updateId7, updateId8, updateId9, updateId10 := int64(0), int64(0), int64(0), int64(0), int64(0) updateId11, updateId12, updateId13 := int64(0), int64(0), int64(0) if TiDb.ExecTx("更新线索", func(tx *sql.Tx) bool { //线索 ok = TiDb.UpdateByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, clueUpdateData) //变更记录 if (trailstatus == "00" || old_position_id == 0 || (pIsOk && old_cluename != cluename && cluename != "")) && is_assign == 1 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else if old_position_id == 0 { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": CodeTrail[trailstatus], "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { if pIsOk && old_cluename != cluename && cluename != "" { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId2 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.Int64All(data["position_id"]), "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "无意向客户", "new_value": "流失", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) updateId4 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "无意向客户", "new_value": "商机线索", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } } } else if trailstatus != "08" && is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { updateId1 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "position_id", "change_type": "所属人变更", "old_value": common.If(oldsaleName != "", oldsaleName, "/"), "new_value": common.If(saleName != "", saleName, "/"), "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) if trailstatus != "01" { updateId4 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": CodeTrail[trailstatus], "new_value": "商机线索", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } updateId3 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": positionId, "change_field": "trailstatus", "change_type": "基本信息变更", "old_value": "商机线索", "new_value": "新增", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } } if (trailstatus != "08" && recordCount <= 0) || is_assign == 0 { if trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400 { } else { if old_sub_cluetype != sub_cluetype && !is_ok { if is_transfer != 1 { updateId5 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"])), "change_type": "加入任务车", "new_value": gconv.String(common.If(gconv.Int64(data["position_id"]) == 0, "线索自动分配", "线索来源自动更新")) + "-" + topname + "-" + subname, "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) } else { cdata := TiDb.FindOne("dwd_f_csm_customer_info", map[string]interface{}{"clue_id": clueId}, "", "") if cdata != nil && len(*cdata) > 0 { kcpositionId := common.Int64All((*cdata)["position_id"]) tasksource := common.ObjToString((*cdata)["tasksource"]) taskstatus := common.IntAll((*cdata)["taskstatus"]) updateId5 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": kcpositionId, "change_type": "加入任务车", "new_value": "线上主动留资", "createtime": nowTime, "BCPCID": common.GetRandom(32), "operator_id": -1, }) if taskstatus == 1 { tasksource = "10" } else { if tasksource != "" && !strings.Contains(tasksource, "10") { if !strings.Contains(tasksource, "10") { tasksource += ",10" } } else { tasksource = "10" } } updateId14 = TiDb.UpdateByTx(tx, "dwd_f_csm_customer_info", map[string]interface{}{"clue_id": clueId}, map[string]interface{}{ "tasksource": tasksource, "tasktime": nowTime, "is_task": 1, "taskstatus": 0, }) } } } } } if old_top_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_top_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_topname = common.ObjToString((*pcodeData)["name"]) } } if old_sub_cluetype != "" { pcodeData := TiDb.FindOne("dwd_d_crm_cluetype_code", map[string]interface{}{"code": old_sub_cluetype}, "", "") if pcodeData != nil && len(*pcodeData) > 0 { old_subname = common.ObjToString((*pcodeData)["name"]) } } if item != "orders" { if old_name != name && name != "" { updateId6 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "name", "change_type": "基本信息变更", "old_value": common.If(old_name != "", old_name, "/"), "new_value": common.If(name != "", name, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_position != position && position != "" { updateId7 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "position", "change_type": "基本信息变更", "old_value": common.If(old_position != "", old_position, "/"), "new_value": common.If(position != "", position, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_department != department && department != "" { updateId8 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "department", "change_type": "基本信息变更", "old_value": common.If(old_department != "", old_department, "/"), "new_value": common.If(department != "", department, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_role != role && role != "" { updateId9 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{"clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "role", "change_type": "基本信息变更", "old_value": common.If(old_role != "", old_role, "/"), "new_value": common.If(role != "", role, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1}) } if old_follow_project_area != follow_project_area && follow_project_area != "" { old_area, old_area_arr := "", []string{} new_area, new_area_arr := "", []string{} for _, v := range strings.Split(old_follow_project_area, ",") { old_area_arr = append(old_area_arr, CodeArea[v]) } for _, v := range strings.Split(follow_project_area, ",") { new_area_arr = append(new_area_arr, CodeArea[v]) } old_area = strings.Join(old_area_arr, ",") new_area = strings.Join(new_area_arr, ",") updateId10 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "follow_project_area", "change_type": "基本信息变更", "old_value": common.If(old_area != "", old_area, "/"), "new_value": common.If(new_area != "", new_area, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_cluename != cluename && cluename != "" { updateId11 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "cluename", "change_type": "基本信息变更", "old_value": common.If(old_cluename != "", old_cluename, "/"), "new_value": common.If(cluename != "", cluename, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } } if old_top_cluetype != top_cluetype { updateId12 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "top_cluetype", "change_type": "基本信息变更", "old_value": common.If(old_topname != "", old_topname, "/"), "new_value": common.If(topname != "", topname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } if old_sub_cluetype != sub_cluetype { updateId13 = TiDb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{ "clue_id": clueId, "position_id": common.If(trailstatus == "00" && trailstatusTime != "" && time.Now().Unix()-trailstatusTimes.Unix() < 86400, -1, common.If(trailstatus == "00" || is_assign == 0, positionId, common.Int64All(data["position_id"]))), "change_field": "sub_cluetype", "change_type": "基本信息变更", "old_value": common.If(old_subname != "", old_subname, "/"), "new_value": common.If(subname != "", subname, "/"), "createtime": nowTime, "BCPCID": BCPCID, "operator_id": -1, }) } return ok && updateId1 > -1 && updateId2 > -1 && updateId3 > -1 && updateId4 > -1 && updateId5 > -1 && updateId6 > -1 && updateId7 > -1 && updateId8 > -1 && updateId9 > -1 && updateId10 > -1 && updateId11 > -1 && updateId12 > -1 && updateId13 > -1 && updateId14 }) { log.Println("线索更新成功") if TiDb.Count("dwd_f_userbase_contacts", map[string]interface{}{"phone": phone}) == 0 { TiDb.Insert("dwd_f_userbase_contacts", map[string]interface{}{ "status": 1, "is_delete": 1, "createtime": nowTime, "updatetime": nowTime, "phone": phone, "baseinfo_id": uId, "SOURCE": source, }) } if old_position_id == 0 { TiDb.UpdateOrDeleteBySql(`update dwd_f_crm_clue_autodraw_record set count = count + 1 where position_id = ? and clue_level = ?`, positionId, level) } return true } else { log.Println("线索更新失败!!!", ok, updateId1, updateId2, updateId3, updateId4, updateId5, updateId6, updateId7, updateId8, updateId9, updateId10, updateId11, updateId12, updateId13, updateId14, " 用户信息 ", item, position, seatNumber, uId, userId, phone) return false } }