private async Task <string> UpdateProductSpecMesh(AssetFileModel file, ProductSpecModel spec, StreamWriter loger)
        {
            StaticMeshModel mesh = cache.Parsed.GetById(file.ObjId) as StaticMeshModel;

            if (mesh == null)
            {
                return("mesh obj not found " + file.ObjId);
            }

            spec.name          = file.Name;
            spec.iconAssetId   = file.iconfid;
            spec.ComponentsObj = new List <FProductComponentModel>();
            FProductStaticMeshComponent meshcomp = new FProductStaticMeshComponent();

            meshcomp.StaticMesh = mesh;
            meshcomp.Id         = mesh.id;
            meshcomp.Name       = mesh.name;
            meshcomp.Icon       = file.iconurl;
            spec.ComponentsObj.Add(meshcomp);
            spec.staticMeshIds = "{\"Items\":[{\"StaticMeshId\":\"" + mesh.id + "\",\"MaterialIds\":[]}]}";
            spec.PropObjToStr();

            var res = await api.PutAsync <ProductSpecModel>("/productspec", spec);

            return(res.IsSuccess ? "ok" : "failed " + res.StatusCode);
        }
        private async Task <string> CreateProductForMesh(AssetFileModel file, StreamWriter loger)
        {
            StaticMeshModel mesh = cache.Parsed.GetById(file.ObjId) as StaticMeshModel;

            if (mesh == null)
            {
                return("mesh obj not found " + file.ObjId);
            }

            ProductSpecModel spec = new ProductSpecModel();

            spec.name          = file.Name;
            spec.iconAssetId   = file.iconfid;
            spec.IconUrl       = file.iconurl;
            spec.ComponentsObj = new List <FProductComponentModel>();
            FProductStaticMeshComponent meshcomp = new FProductStaticMeshComponent();

            meshcomp.StaticMesh = mesh;
            meshcomp.Id         = mesh.id;
            meshcomp.Name       = mesh.name;
            meshcomp.Icon       = file.iconurl;
            spec.ComponentsObj.Add(meshcomp);
            spec.staticMeshIds = "{\"Items\":[{\"StaticMeshId\":\"" + mesh.id + "\",\"MaterialIds\":[]}]}";
            spec.PropObjToStr();

            ProductModel product = new ProductModel();

            product.name        = file.Name;
            product.iconAssetId = file.iconfid;
            product.IconUrl     = file.iconurl;
            var prodres = await api.PostAsync <ProductModel>("/products", product);

            string productId = "";
            string specId    = "";

            if (prodres.IsSuccess && prodres.Content != null && prodres.Content.specifications?.Count > 0)
            {
                productId = prodres.Content.id;
                specId    = prodres.Content.specifications[0]?.id;
                spec.id   = specId;
                var specres = await api.PutAsync("/productspec", spec);//现在的api版本,put 不需要id

                if (specres.IsSuccess)
                {
                    loger.WriteLine($"{DateTime.Now}, CREATE, {file.Package}, {file.Type}, {file.ObjId}, productid {prodres.Content.id} SpecId {specId} update ok");
                }
                else
                {
                    loger.WriteLine($"{DateTime.Now}, CREATE, {file.Package}, {file.Type}, {file.ObjId}, productid {prodres.Content.id} SpecId {specId} update failed. {specres.StatusCode} {specres.Content}");
                }
            }
            else
            {
                loger.WriteLine($"{DateTime.Now}, CREATE, {file.Package}, {file.Type}, {file.ObjId}, create product failed. {prodres.StatusCode} {prodres.Content}");
            }
            string ids = $"product id {productId} specid {specId}";

            return(prodres.IsSuccess ? "ok " + ids : "failed " + prodres.StatusCode);
        }