package service import ( "encoding/json" "fmt" "log" "strconv" "strings" "time" "context" . "app.yhyue.com/moapp/jybase/date" "app.yhyue.com/moapp/jybase/mongodb" . "bp.jydev.jianyu360.cn/BaseService/entManageApplication/entity" "bp.jydev.jianyu360.cn/BaseService/entManageApplication/rpc/entmanageapplication" "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter" // "github.com/zeromicro/go-zero/core/logx" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/redis" ) func AddUsePerson(this *entmanageapplication.AddUsePersonReq) *entmanageapplication.AddUsePersonResp { timeStr, ok, id, msg, code := time.Now().Format("2006-01-02 15:04:05"), false, int64(0), "", int64(0) if this.EntUserId == "" { return &entmanageapplication.AddUsePersonResp{ ErrorCode: -1, ErrorMsg: "添加失败", Data: &entmanageapplication.AddUsePerson{Status: int64(-1)}, } } UserArr := strings.Split(this.EntUserId, ",") sourceData := JyMysql.FindOne(EntnicheWaitEmpower, map[string]interface{}{"id": this.WaitEmpowerId}, "", "") if sourceData != nil && len(*sourceData) > 0 { empower_count := common.IntAll((*sourceData)["empower_count"]) use_count := common.IntAll((*sourceData)["use_count"]) if empower_count-use_count < len(UserArr) { msg = "购买数量不足" code = int64(-1) } else { for _, v := range UserArr { //过滤空值2023-01-04 if v == "" { continue } // entUserId, _ := strconv.Atoi(v) data := JyMysql.FindOne(EntnichePower, map[string]interface{}{"ent_user_id": entUserId}, "", "") if data != nil && len(*data) > 0 { dataStatus := common.IntAll((*data)["status"]) wait_empower_id := common.Int64All((*data)["wait_empower_id"]) if dataStatus == -1 { ok = JyMysql.Update(EntnichePower, map[string]interface{}{"ent_user_id": entUserId}, map[string]interface{}{"wait_empower_id": this.WaitEmpowerId, "status": 1, "update_time": timeStr}) } else { resdata := JyMysql.FindOne(EntnicheWaitEmpower, map[string]interface{}{"id": wait_empower_id}, "", "") end_time := common.ObjToString((*resdata)["end_time"]) res, _ := time.ParseInLocation("2006-01-02 15:04:05", end_time, time.Local) if res.Unix() > time.Now().Unix() { msg = "人员已经拥有权限,请先删除原有权限" code = int64(-1) break } else { ok = JyMysql.Update(EntnichePower, map[string]interface{}{"ent_user_id": entUserId}, map[string]interface{}{"wait_empower_id": this.WaitEmpowerId, "status": 1, "update_time": timeStr}) } } } else { id = JyMysql.Insert(EntnichePower, map[string]interface{}{ "wait_empower_id": this.WaitEmpowerId, "ent_id": this.EntId, "ent_user_id": entUserId, "status": 1, "create_time": timeStr, "update_time": timeStr, }) } JyMysql.UpdateOrDeleteBySql(`update `+EntnicheWaitEmpower+` set use_count = use_count + 1 where id = ?`, this.WaitEmpowerId) addPower(this.WaitEmpowerId, entUserId, this.EntId) } } } status := 0 if ok || id > 0 { status = 1 } return &entmanageapplication.AddUsePersonResp{ ErrorCode: code, ErrorMsg: msg, Data: &entmanageapplication.AddUsePerson{Status: int64(status)}, } } func DelUsePerson(this *entmanageapplication.DelUsePersonReq) *entmanageapplication.AddUsePersonResp { timeStr := time.Now().Format("2006-01-02 15:04:05") ok := JyMysql.Update(EntnichePower, map[string]interface{}{"id": this.EntnichePowerId}, map[string]interface{}{"status": -1, "update_time": timeStr}) delPower(this.EntnichePowerId) status := 0 if ok { status = 1 } return &entmanageapplication.AddUsePersonResp{ ErrorCode: 0, Data: &entmanageapplication.AddUsePerson{Status: int64(status)}, } } func UsePersonList(this *entmanageapplication.UsePersonListReq) *entmanageapplication.UsePersonListResp { nowTime := time.Now().Format("2006-01-02 15:04:05") data := JyMysql.SelectBySql(`select a.id,a.wait_empower_id,c.name,c.phone,c.mail,g.name as department,e.name as role from entniche_power a INNER JOIN entniche_user c on (a.ent_user_id=c.id and a.ent_id = c.ent_id) LEFT JOIN entniche_user_role d on (c.id=d.user_id) LEFT JOIN entniche_role e on (d.role_id=e.id) LEFT JOIN entniche_department_user f on (a.ent_user_id=f.user_id) LEFT JOIN entniche_department g on (g.id=f.dept_id) LEFT JOIN entniche_wait_empower h on (h.id=a.wait_empower_id) where a.status = 1 and a.ent_id = ? and end_time >= ? order by a.update_time desc`, this.EntId, nowTime) arr := []*entmanageapplication.UsePersonList{} if data != nil && len(*data) > 0 { for _, v := range *data { wait_empower_id := common.Int64All(v["wait_empower_id"]) if wait_empower_id == this.WaitEmpowerId { obj := &entmanageapplication.UsePersonList{ EntnichePowerId: common.Int64All(v["id"]), Name: common.ObjToString(v["name"]), Phone: common.ObjToString(v["phone"]), Email: common.ObjToString(v["mail"]), Department: common.ObjToString(v["department"]), Role: common.ObjToString(v["role"]), Status: 1, } arr = append(arr, obj) } else { obj := &entmanageapplication.UsePersonList{ EntnichePowerId: common.Int64All(v["id"]), Name: common.ObjToString(v["name"]), Phone: common.ObjToString(v["phone"]), Email: common.ObjToString(v["mail"]), Department: common.ObjToString(v["department"]), Role: common.ObjToString(v["role"]), Status: 2, } arr = append(arr, obj) } } } return &entmanageapplication.UsePersonListResp{ ErrorCode: 0, Data: arr, } } func BuyProductList(this *entmanageapplication.BuyProductListReq) *entmanageapplication.BuyProductListResp { nowTime := time.Now().Format("2006-01-02 15:04:05") data := JyMysql.SelectBySql(`select * from `+EntnicheWaitEmpower+` where ent_id = ? and end_time >= ? order by create_time desc`, this.EntId, nowTime) arr := []*entmanageapplication.BuyProductList{} if data != nil && len(*data) > 0 { for _, v := range *data { product_type := common.ObjToString(v["product_type"]) if product_type == "VIP订阅" { product_type = "超级订阅" } obj := &entmanageapplication.BuyProductList{ WaitEmpowerId: common.Int64All(v["id"]), ProductType: product_type, UseCount: common.Int64All(v["use_count"]), EmpowerCount: common.Int64All(v["empower_count"]), ProvinceCount: common.Int64All(v["province_count"]), EndTime: common.ObjToString(v["end_time"]), } arr = append(arr, obj) } } return &entmanageapplication.BuyProductListResp{ ErrorCode: 0, Data: arr, } } func addPower(waitEmpowerId int64, entUserId int, entId int64) { data := JyMysql.FindOne(EntnicheOrder, map[string]interface{}{"wait_empower_id": waitEmpowerId}, "", "") if data != nil && len(*data) > 0 { orderId := common.Int64All((*data)["order_id"]) orderData := JyMysql.FindOne(Order, map[string]interface{}{"id": orderId}, "", "") if orderData != nil && len(*orderData) > 0 { productType := common.ObjToString((*orderData)["product_type"]) posititonId := getPositionId(entUserId) if productType == "VIP订阅" { log.Println("开通超级订阅", posititonId) setRule(1, int64(entUserId), entId, *orderData, posititonId) } else if productType == "大会员" { log.Println("开通大会员", posititonId) setRule(2, int64(entUserId), entId, *orderData, posititonId) } } } } func GetServerPid() map[int]int { pidMap := map[int]int{} datas := JyMysql.Find("bigmember_service", map[string]interface{}{"i_status": 0}, "id,i_pid", "", 0, 0) if datas != nil && len(*datas) > 0 { for _, v := range *datas { if v["i_pid"] != nil { pidMap[common.IntAll(v["id"])] = common.IntAll(v["i_pid"]) } } } return pidMap } func RedisDel(userId string) { redis.Del(NewOther, "pl_indexMessage_"+userId) cacheKey := fmt.Sprintf(PowerCacheKey, userId) baseInfoCacheKey := fmt.Sprintf(IsGetUserBaseInfoRedisKey, userId) redisMenuKeyPC := fmt.Sprintf(RedisMenuKey1, userId) redisMenuKeyWX := fmt.Sprintf(RedisMenuKey2, userId) redisMenuKeyAPP := fmt.Sprintf(RedisMenuKey3, userId) userPowerRedisKey := fmt.Sprintf(UserPowerRedisKey, time.Now().Day(), userId) powerCheckKey := fmt.Sprintf(PowerCheckKey, userId) redis.Del(NewOther, cacheKey) redis.Del(NewOther, baseInfoCacheKey) redis.Del(NewOther, redisMenuKeyPC) redis.Del(NewOther, redisMenuKeyWX) redis.Del(NewOther, redisMenuKeyAPP) redis.Del(NewOther, userPowerRedisKey) redis.Del(NewOther, powerCheckKey) delRedisMenuByUserCenter(userId) } // 初始化vip订阅关键词 func MergeKws(entId, entUserId int64) { if entUserId == 0 || entId == 0 { //11-11 取消此操作 return } data, ok := Mgo.FindOneByField("entniche_rule", map[string]interface{}{"i_entid": entId, "i_userid": entUserId}, `{"o_entniche":1,"_id":1}`) var o_entniche map[string]interface{} if ok && data != nil && len(*data) > 0 { o_entniche, _ = (*data)["o_entniche"].(map[string]interface{}) a_items, _ := o_entniche["a_items"].([]interface{}) if a_items == nil { //首次 _id := mongodb.BsonIdToSId((*data)["_id"]) Mgo.UpdateById("entniche_rule", _id, map[string]interface{}{ "$set": map[string]interface{}{"o_entniche.i_matchway": 1, "o_entniche.i_ratemode": 1, "o_entniche.i_wxpush": 1, "o_entniche.i_apppush": 1, "o_entniche.i_projectmatch": 0, "o_entniche.a_infotype": []string{}, "o_entniche.a_items": []string{}, "o_entniche.l_modifydate": time.Now().Unix()}, }) } } } func delPower(id int64) { data := JyMysql.FindOne(EntnichePower, map[string]interface{}{"id": id}, "", "") if data != nil && len(*data) > 0 { waitEmpowerId := common.Int64All((*data)["wait_empower_id"]) entUserId := common.IntAll((*data)["ent_user_id"]) JyMysql.UpdateOrDeleteBySql(`update `+EntnicheWaitEmpower+` set use_count = use_count - 1 where id = ? and use_count > 0`, waitEmpowerId) eOData := JyMysql.FindOne(EntnicheOrder, map[string]interface{}{"wait_empower_id": waitEmpowerId}, "", "") if eOData != nil && len(*eOData) > 0 { orderId := common.Int64All((*eOData)["order_id"]) orderData := JyMysql.FindOne(Order, map[string]interface{}{"id": orderId}, "", "") set := map[string]interface{}{} if orderData != nil && len(*orderData) > 0 { posititonId := getPositionId(entUserId) productType := common.ObjToString((*orderData)["product_type"]) entId := common.Int64All((*orderData)["ent_id"]) if productType == "VIP订阅" { set["l_vip_endtime"] = time.Now().Unix() set["i_vip_status"] = 0 } else if productType == "大会员" { set["i_member_endtime"] = time.Now().Unix() set["i_member_status"] = 0 JyMysql.Update(BigServiceUser, map[string]interface{}{"s_userid": posititonId}, map[string]interface{}{"i_status": -1}) } Mgo.Update("ent_user", map[string]interface{}{ "i_entid": entId, "i_userid": entUserId, }, map[string]interface{}{ "$set": set, }, true, false) posititonIdStr := strconv.Itoa(int(posititonId)) RedisDel(posititonIdStr) } } } } //获取用户信息 //return 职位id func getPositionId(entUserId int) int64 { ctx, _ := context.WithTimeout(context.Background(), 2*time.Second) res, _ := UserCenterRpc.IdentityByEntUserId(ctx, &usercenter.IdentityReq{ Id: int64(entUserId), }) log.Println(res) return res.PositionId } //订阅设置 //types:1超级订阅 2大会员 func setRule(types int64, entUserId, entId int64, orderData map[string]interface{}, posititonId int64) bool { //订阅设置 query := map[string]interface{}{ "i_entid": entId, "i_userid": entUserId, } //orderData相关权益 set := map[string]interface{}{} setEntUser := map[string]interface{}{} //超级订阅 if types == 1 { set, setEntUser = vipSetMap(orderData) } else if types == 2 { set, setEntUser = memberSetMap(posititonId, orderData) } ok1 := Mgo.Update("entniche_rule", query, map[string]interface{}{ "$set": set, }, true, false) ok2 := Mgo.Update("ent_user", query, map[string]interface{}{ "$set": setEntUser, }, true, false) go func() { MergeKws(entId, entUserId) posititonIdStr := strconv.Itoa(int(posititonId)) RedisDel(posititonIdStr) }() return ok1 && ok2 } // func vipSetMap(orderData map[string]interface{}) (set map[string]interface{}, setEntUser map[string]interface{}) { set, setEntUser = map[string]interface{}{}, map[string]interface{}{} startTime := common.ObjToString(orderData["vip_starttime"]) endTime := common.ObjToString(orderData["vip_endtime"]) Date_Full_Layout := "2006-01-02 15:04:05" startdate, _ := time.ParseInLocation(Date_Full_Layout, startTime, time.Local) enddate, _ := time.ParseInLocation(Date_Full_Layout, endTime, time.Local) dataType := 1 if startdate.Unix() > time.Now().Unix() { dataType = 2 } //为用户开通超级订阅权限 //是否开通超级订阅 -1 试用到期 -2 正式到期 1 试用 2 开通 isTrial := false if dataType == 2 { isTrial = true } setEntUser["l_createtime"] = time.Now().Unix() setEntUser["l_vip_starttime"] = startdate.Unix() setEntUser["l_vip_endtime"] = enddate.Unix() setEntUser["i_vip_status"] = common.If(isTrial, -2, 2) //1试用 2正式 -2 试用到期 vms := VipSimpleMsg{} json.Unmarshal([]byte(common.ObjToString(orderData["filter"])), &vms) set = map[string]interface{}{ "o_entniche": map[string]interface{}{ "i_trial": -1, //已激活试用 "o_area": *vms.Area, //设置地区 "o_buyset": *vms.NewBuyset, //购买内容 城市、省份、行业数量 "a_buyerclass": []interface{}{}, //设置行业 }, "i_vip_expire_tip": 0, //消息提示初始化 "i_type": 1, } return } func memberSetMap(userId int64, orderData map[string]interface{}) (set map[string]interface{}, setEntUser map[string]interface{}) { set, setEntUser = map[string]interface{}{}, map[string]interface{}{} filterMap := common.ObjToMap(orderData["filter"]) level := common.IntAll((*filterMap)["level"]) comboId := common.IntAll((*filterMap)["comboId"]) payCycle := common.IntAll((*filterMap)["cycle"]) serversId := common.ObjToString((*filterMap)["serversId"]) startTime := common.ObjToString(orderData["vip_starttime"]) endTime := common.ObjToString(orderData["vip_endtime"]) tmp := "2006-01-02 15:04:05" startdate, _ := time.ParseInLocation(tmp, startTime, time.Local) enddate, _ := time.ParseInLocation(tmp, endTime, time.Local) serverMap := GetServerPid() dataType := 1 if startdate.Unix() > time.Now().Unix() { dataType = 2 } set = map[string]interface{}{ "o_member_jy": map[string]interface{}{ "i_wxpush": 1, }, } setEntUser = map[string]interface{}{ "i_member_status": common.If(dataType == 1, level, -level), "i_member_starttime": startdate.Unix(), "i_member_endtime": enddate.Unix(), "i_mainaccount": 1, "l_createtime": time.Now().Unix(), } if comboId != 0 { datas := JyMysql.FindOne("bigmember_combo", map[string]interface{}{"id": comboId}, "", "") if datas == nil || len(*datas) == 0 { log.Println("未找到此套餐") return } s_servers := common.ObjToString((*datas)["s_servers"]) for _, s := range strings.Split(s_servers, ",") { serverId, _ := strconv.Atoi(s) mainId := serverId if serverMap[serverId] != 0 { serverId = serverMap[serverId] } serverData := JyMysql.FindOne("bigmember_service", map[string]interface{}{"id": mainId}, "", "") frequency := 0 if serverData != nil && len(*serverData) > 0 { if serverId == 11 || serverId == 15 { if serverId == 15 { if payCycle >= 12 { frequency = (payCycle / 12 * common.IntAll((*serverData)["s_count_year"])) + (payCycle % 12 * common.IntAll((*serverData)["s_count_month"])) } else { frequency = payCycle * common.IntAll((*serverData)["s_count_month"]) } } else { frequency = payCycle * common.IntAll((*serverData)["s_count_month"]) } } else { frequency = common.IntAll((*serverData)["s_count_month"]) } } sqls := "select * from bigmember_service_user where s_serviceid = ? and s_userid = ? and i_status = -1" serverDatas := JyMysql.SelectBySql(sqls, serverId, userId) if serverDatas != nil && len(*serverDatas) > 0 { i_status := common.If(dataType == 1, 0, 1) sql := "update bigmember_service_user set i_frequency = ?,l_updatetime = ?,l_starttime = ?,l_endtime = ?,i_status = ? where s_serviceid = ? and s_userid = ?" status1 := JyMysql.UpdateOrDeleteBySql(sql, fmt.Sprint(frequency), time.Now().Format(tmp), startdate.Format(tmp), enddate.Format(tmp), fmt.Sprint(i_status), serverId, userId) if status1 < 0 { log.Println("新建服务-更新服务表出错", userId) return } } else { insert := map[string]interface{}{ "s_smainid": mainId, "s_userid": userId, "s_serviceid": serverId, "i_frequency": frequency, "l_starttime": startdate.Format(tmp), "l_endtime": enddate.Format(tmp), "i_status": common.If(dataType == 1, 0, 1), "l_createtime": time.Now().Format(tmp), "l_updatetime": time.Now().Format(tmp), } order_id := JyMysql.Insert(BigServiceUser, insert) if order_id > 0 { log.Println("用户服务表插入成功", userId) } else { log.Println("用户服务表插入失败", userId) return } } } } else { for _, s := range strings.Split(serversId, ",") { serverId, _ := strconv.Atoi(s) mainId := serverId if serverMap[serverId] != 0 { serverId = serverMap[serverId] } serverData := JyMysql.FindOne("bigmember_service", map[string]interface{}{"id": mainId}, "", "") frequency := 0 if serverData != nil && len(*serverData) > 0 { if serverId == 11 || serverId == 15 { if serverId == 15 { if payCycle >= 12 { frequency = (payCycle / 12 * common.IntAll((*serverData)["s_count_year"])) + (payCycle % 12 * common.IntAll((*serverData)["s_count_month"])) } else { frequency = payCycle * common.IntAll((*serverData)["s_count_month"]) } } else { frequency = payCycle * common.IntAll((*serverData)["s_count_month"]) } } else { frequency = common.IntAll((*serverData)["s_count_month"]) } } sqls := "select * from bigmember_service_user where s_serviceid = ? and s_userid = ? and i_status = -1" serverDatas := JyMysql.SelectBySql(sqls, serverId, userId) if serverDatas != nil && len(*serverDatas) > 0 { i_status := common.If(dataType == 1, 0, 1) sql := "update bigmember_service_user set i_frequency = ?,l_updatetime = ?,l_starttime = ?,l_endtime = ?,i_status = ? where s_serviceid = ? and s_userid = ?" status1 := JyMysql.UpdateOrDeleteBySql(sql, fmt.Sprint(frequency), time.Now().Format(tmp), startdate.Format(tmp), enddate.Format(tmp), fmt.Sprint(i_status), serverId, userId) if status1 < 0 { log.Println("新建服务-更新服务表出错") return } } else { insert := map[string]interface{}{ "s_userid": userId, "s_smainid": mainId, "s_serviceid": serverId, "i_frequency": frequency, "l_starttime": startdate.Format(tmp), "l_endtime": enddate.Format(tmp), "i_status": common.If(dataType == 1, 0, 1), "l_createtime": time.Now().Format(tmp), "l_updatetime": time.Now().Format(tmp), } order_id := JyMysql.Insert(BigServiceUser, insert) if order_id > 0 { log.Println("用户服务表插入成功", userId) } else { log.Println("用户服务表插入失败") return } } } } return } // func EmpowerUserIds(ids []int64) *entmanageapplication.EmpowerUserIds { result := &entmanageapplication.EmpowerUserIds{} array := []string{} for _, v := range ids { array = append(array, fmt.Sprint(v)) } list := JyMysql.SelectBySql(`SELECT a.ent_user_id from entniche_power a inner join entniche_wait_empower b on (a.ent_user_id in (`+strings.Join(array, ",")+`) and a.status=1 and b.end_time>? and a.wait_empower_id=b.id) ORDER BY a.create_time desc`, NowFormat(Date_Full_Layout)) if list != nil { for _, v := range *list { result.Ids = append(result.Ids, common.Int64All(v["ent_user_id"])) } } return result } //调用用户中台清除菜单缓存 func delRedisMenuByUserCenter(positionId string) bool { ctx, _ := context.WithTimeout(context.Background(), 2*time.Second) res, err := UserCenterRpc.WorkDesktopClearUserInfo(ctx, &usercenter.WorkDesktopClearUserInfoReq{ AppId: "10000", PositionId: positionId, }) if err != nil || res == nil { log.Println("delRedisMenuByUserCenter err", err) } return true }