package managecenterModel import ( "fmt" "sort" "strconv" "strings" "time" "goutil/stringUtil" "goutil/typeUtil" ) // 游戏版本 type ResourceVersion struct { // 资源版本唯一标识 Id int32 `json:"ResourceVersionID"` // 资源版本名称 Name string `json:"ResourceVersionName"` // 资源版本的url地址 Url string `json:"ResourceVersionUrl"` // 资源大小 Size int32 `json:"Size"` // 资源文件MD5加密的结果 MD5 string `json:"MD5"` //大区Id AreaID int32 `json:"AreaID"` // 资源生效时间 StartTime string `json:"StartTime"` StartTimeTick int64 `json:"StartTimeTick"` // 资源失效时间 EndTime string `json:"EndTime"` EndTimeTick int64 `json:"EndTimeTick"` // 添加时间 Crdate string `json:"Crdate"` CrdateTick int64 `json:"CrdateTick"` // 更新时间 UpdateTime string `json:"UpdateTime"` UpdateTimeTick int64 `json:"UpdateTimeTick"` // 是否重启客户端 IfRestart int32 `json:"IfRestart"` // 是否禁用 IfDelete int32 `json:"IfDelete"` // 是否审核服下载 IfAuditServiceDownload int32 `json:"IfAuditServiceDownload"` // 资源所属的合作商ID集合 PartnerIds string `json:"PartnerIDs"` // 资源所属的游戏版本ID集合 GameVersionIds string `json:"GameVersionIDs"` } // 判断资源是否包含指定合作商 // partnerId:合作商Id // 返回值 // 是否包含 func (this *ResourceVersion) ContainsPartner(partnerId int32) bool { partnerIdList, _ := stringUtil.SplitToInt32Slice(this.PartnerIds, ",") for _, item := range partnerIdList { if item == partnerId { return true } } return false } // 判断资源是否包含指定游戏版本 // gameVersionId:游戏版本Id // 返回值 // 是否包含 func (this *ResourceVersion) ContainsGameVersion(gameVersionId int32) bool { gameVersionIdList, _ := stringUtil.SplitToInt32Slice(this.GameVersionIds, ",") for _, item := range gameVersionIdList { if item == gameVersionId { return true } } return false } // 获取有效资源包 func GetAvailableResource(resourceVersionList []*ResourceVersion, partnerId, gameVersionId int32, resourceVersionName string, offTest OfficialOrTest) (availableResourceVersion map[string]interface{}) { if len(resourceVersionList) == 0 { return } //判断资源是否有效 _, hashCode, isVaild := IsResourceVersionNameValid(resourceVersionName) if !isVaild { return } //根据合作商Id和游戏版本Id和开始时间来过滤 var targetResourceVersionList []*ResourceVersion for _, resourceVersion := range resourceVersionList { startime, err := typeUtil.DateTime(resourceVersion.StartTimeTick) if resourceVersion.ContainsPartner(partnerId) && resourceVersion.ContainsGameVersion(gameVersionId) && err == nil && startime.Before(time.Now()) { targetResourceVersionList = append(targetResourceVersionList, resourceVersion) } } if len(targetResourceVersionList) == 0 { return } //组装数据 //按照资源Id进行降序排列 sort.Slice(targetResourceVersionList, func(i, j int) bool { return targetResourceVersionList[i].SortByIdDesc(targetResourceVersionList[j]) }) //取出资源号最大的资源,如果与传入的资源名称相等,则表示没有新资源 availableResourceVersion = make(map[string]interface{}, 0) newResource := targetResourceVersionList[0] availableResourceVersion["ResourceVersionName"] = newResource.Name availableResourceVersion["Url"] = strings.Replace(newResource.Url, ".zip", "", -1) if newResource.Name == resourceVersionName { //是否有新资源,如果为fasle,也需要返回project.manifest.temp.zip 用于子包验证 availableResourceVersion["IsNewResource"] = false return } //判断资源号中的HashCode是否相等,如果相等,则表示没有新资源;如果传入的timeTick>最新的timeTick说明服务器没有被刷新,表示没有新资源 _, newHashCode, newIsVaild := IsResourceVersionNameValid(newResource.Name) if !newIsVaild { return } if compareRes := strings.Compare(hashCode, newHashCode); compareRes == 0 { //是否有新资源,如果为fasle,也需要返回project.manifest.temp.zip 用于子包验证 availableResourceVersion["IsNewResource"] = false return } if offTest == Con_Test && newResource.IfAuditServiceDownload == 0 { return nil } availableResourceVersion["IsNewResource"] = true return } // 按照Id进行升序排序 // target:另一个资源对象 // 是否是小于 func (this *ResourceVersion) SortByIdAsc(target *ResourceVersion) bool { return this.Id < target.Id } // 按照Id进行降序排序 // target:另一个资源对象 // 是否是大于 func (this *ResourceVersion) SortByIdDesc(target *ResourceVersion) bool { return this.Id > target.Id } //判断资源版本是否有效 func IsResourceVersionNameValid(resourceVersionName string) (timeTick int64, hashCode string, isValid bool) { if len(resourceVersionName) == 0 { isValid = false return } if index := strings.Index(resourceVersionName, "_"); index == -1 { resourceVersionName = fmt.Sprintf("0_%s", resourceVersionName) } resourceList := stringUtil.Split(resourceVersionName, []string{"_"}) if len(resourceList) != 2 { isValid = false return } //解析timeTick timeTick, err := strconv.ParseInt(resourceList[0], 10, 64) if err != nil { isValid = false return } hashCode = resourceList[1] isValid = true return }