public async Task <Result <string> > DelWxNews([FromBody] WxNewsShow item)
        {
            try
            {
                var delRes = PubMediaApi.DeleteMaterial(item.MediaId);
                logHelper.Debug("DelWxNews:删除永久图文结果:" + delRes.JsonSerialize());
                if (!delRes.IsSuss)
                {
                    var msg = "删除永久图文失败:代码:" + delRes.errcode + "       " + delRes.errmsg;
                    logHelper.Error("DelWxNews:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                item.IsDel      = 1;
                item.Updater    = currentUser.UserName;
                item.UpdateTime = DateTime.Now;
                var upRes = await repo.UpdateAsync(item, new List <string> {
                    "IsDel", "Updater", "UpdateTime"
                });

                return(new Result <string> {
                    IsSucc = upRes, Message = $"获取微信永久图文列表{(upRes ? "成功!" : "失败!")}"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("DelWxNews:获取微信永久图文列表失败:" + ex.Message + "        " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "获取微信永久图文列表失败!"
            });
        }
        public async Task <Result <string> > SyncNewsList([FromBody] JObject objPara)
        {
            try
            {
                int count = Convert.ToInt32(objPara["count"]);
                // 所有素材
                var lstAll     = new List <PubNews>();
                var lstNewsIds = new List <string>();
                var startInd   = 0;
                int pageSize   = 20;
                var syncRes    = PubMediaApi.GetMaterialNewsList(startInd, pageSize);
                logHelper.Debug("SyncNewsList:同步微信公众号永久图文素材结果:" + syncRes.JsonSerialize());
                if (!syncRes.IsSuss)
                {
                    var msg = "同步微信公众号永久图文素材失败:" + syncRes.errcode + "     " + syncRes.errmsg;
                    logHelper.Error("SyncNewsList:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                // 总数
                var allCount = syncRes.total_count;
                if (allCount > count)
                {
                    allCount = count;
                }

                lstAll.AddRange(syncRes.item);
                await SyncWxNews(lstNewsIds, syncRes);

                // 循环同步
                while (syncRes.IsSuss && lstAll.Count < allCount)
                {
                    startInd += pageSize;
                    syncRes   = PubMediaApi.GetMaterialNewsList(startInd, pageSize);
                    logHelper.Debug("SyncNewsList:同步微信公众号永久图文素材结果:" + syncRes.JsonSerialize());
                    if (syncRes.IsSuss)
                    {
                        lstAll.AddRange(syncRes.item);
                        await SyncWxNews(lstNewsIds, syncRes);
                    }
                }

                return(new Result <string> {
                    IsSucc = true, Message = "获取微信永久图文列表成功!"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("SyncNewsList:获取微信永久图文列表失败:" + ex.Message + "        " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "获取微信永久图文列表失败!"
            });
        }
        /// <summary>
        /// 下载微信永久素材
        /// </summary>
        /// <param name="lstWxMedia"></param>
        /// <param name="mType"></param>
        /// <param name="virPath"></param>
        /// <param name="phyPath"></param>
        private void DownWxMedia(List <WxMediaShow> lstWxMedia, PubMediaType mType, string virPath, string phyPath)
        {
            var client   = new WebClient();
            var dtNow    = DateTime.Now;
            var userName = currentUser.UserName;

            foreach (var item in lstWxMedia)
            {
                string extension   = GetMediaExtension(mType, item);
                var    fileName    = item.MediaId + extension;
                var    filePhyPath = phyPath + fileName;
                // 判断路径是否存在
                var fi = new FileInfo(filePhyPath);
                if (!fi.Directory.Exists)
                {
                    fi.Directory.Create();
                }

                // 视频特殊处理
                if (mType == PubMediaType.video)
                {
                    var vRes = PubMediaApi.GetMaterialVedio(item.MediaId, mType);
                    logHelper.Debug("DownWxMedia:下载视频素材结果:" + vRes.JsonSerialize());
                    if (vRes.IsSuss)
                    {
                        item.WxUrl        = vRes.down_url;
                        item.Title        = vRes.title;
                        item.Introduction = vRes.description;
                        item.Updater      = userName;
                        item.UpdateTime   = dtNow;
                        repo.Update(item, new List <string> {
                            "WxUrl", "Title", "Introduction", "Updater", "UpdateTime"
                        });
                    }
                }

                // 下载微信永久素材
                if (!string.IsNullOrEmpty(item.WxUrl))
                {
                    // 有返回url链接的
                    client.DownloadFile(item.WxUrl, filePhyPath);
                }
                else
                {
                    // 其他素材直接下载
                    PubMediaApi.GetMaterial(item.MediaId, filePhyPath, mType);
                }

                // 更新永久素材路径
                item.LocalUrl   = virPath + fileName;
                item.Updater    = userName;
                item.UpdateTime = dtNow;
                repo.Update(item, new List <string> {
                    "LocalUrl", "Updater", "UpdateTime"
                });
            }
        }
        public Result <string> SaveMedia([FromBody] WxMediaShow item)
        {
            try
            {
                if (string.IsNullOrEmpty(item.Type) || string.IsNullOrEmpty(item.LocalUrl))
                {
                    return(new Result <string> {
                        Message = "保存失败:参数不足!"
                    });
                }

                var mType    = ComHelper.GetEnumValueByStr <PubMediaType>(item.Type);
                var filePath = ComHelper.GetPhyWWWRoot(item.LocalUrl);

                // 上传永久素材
                var upRes = PubMediaApi.AddMaterial(mType, filePath, item.Title, item.Introduction);
                logHelper.Debug("SaveMedia:上传微信永久素材结果:" + upRes.JsonSerialize());
                if (!upRes.IsSuss)
                {
                    var msg = "上传微信永久素材失败:" + upRes.errcode + "     " + upRes.errmsg;
                    logHelper.Debug("SaveMedia:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                // 保存上传结果
                var userName = currentUser.UserName;
                var dtNow    = DateTime.Now;
                item.MediaId    = upRes.media_id;
                item.WxUrl      = upRes.url;
                item.Creater    = userName;
                item.Updater    = userName;
                item.CreateTime = dtNow;
                item.UpdateTime = dtNow;
                repo.Save(item);

                return(new Result <string> {
                    IsSucc = true, Message = "保存永久素材成功!"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("SaveMedia:保存永久素材失败:" + ex.Message + "      " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "保存永久素材失败!"
            });
        }
        public Result <string> DelMedia([FromBody] WxMediaShow item)
        {
            try
            {
                // 删除永久素材
                var delRes = PubMediaApi.DeleteMaterial(item.MediaId);
                logHelper.Debug("DelMedia:删除永久素材结果:" + delRes.JsonSerialize());
                if (!delRes.IsSuss)
                {
                    var msg = "删除永久素材失败:" + delRes.errcode + "     " + delRes.errmsg;
                    logHelper.Error("DelMedia:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                // 保存数据库记录
                item.IsDel      = 1;
                item.Updater    = currentUser.UserName;
                item.UpdateTime = DateTime.Now;
                repo.Update(item, new List <string> {
                    "IsDel", "Updater", "UpdateTime"
                });

                return(new Result <string> {
                    IsSucc = true, Message = "删除永久素材成功!"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("DelMedia:删除永久素材失败:" + ex.Message + "      " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "删除永久素材失败!"
            });
        }
        public async Task <Result <string> > SaveWxNews([FromBody] JObject objPara)
        {
            try
            {
                dynamic obj     = objPara as dynamic;
                var     lstNews = ComHelper.JsonDeserialize <List <WxNewsDetailShow> >(obj.lstNews.ToString());
                var     now     = DateTime.Now;
                // 先把图文保存到数据
                var userName = currentUser.UserName;
                foreach (var item in lstNews)
                {
                    item.ShowCoverPic = 1;
                    item.IsDel        = 1;
                    item.Creater      = userName;
                    item.Updater      = userName;
                    item.CreateTime   = now;
                    item.UpdateTime   = now;
                    //await repo.SaveAsync(item);
                }

                // 批量保存
                var mulSaveRes = await repo.SaveAsync(lstNews);

                // 构造微信图文消息
                var lstWxNew = new List <PubMediaArticle>();
                var root     = ComHelper.GetAbsPath("~/");
                // TODO:预览界面待开发
                var newsVirUrl = "~/WxAdmin/Wechat/WxNewsShow?id=";
                foreach (var item in lstNews)
                {
                    // 文章相对路径
                    item.ContentSourceUrl = newsVirUrl + item.Id;
                    // 文章真实路径
                    item.ContentSourceUrlShow = ComHelper.UpdImgAbsPath(root, item.ContentSourceUrl);

                    // 保存图文信息
                    var temp = new PubMediaArticle();
                    temp.title              = item.Title;
                    temp.thumb_media_id     = item.ThumbMediaId;
                    temp.author             = item.Author;
                    temp.digest             = item.Digest;
                    temp.show_cover_pic     = 1;
                    temp.content            = item.Content;
                    temp.content_source_url = item.ContentSourceUrlShow;
                    lstWxNew.Add(temp);
                }

                // 创建永久图文消息
                var newRes = PubMediaApi.AddNews(lstWxNew);
                logHelper.Debug("SaveWxNews:保存图文消息结果:" + newRes.JsonSerialize());
                if (!newRes.IsSuss)
                {
                    var msg = "保存图文消息失败:代码:" + newRes.errcode + "   原因:" + newRes.errmsg;
                    logHelper.Error("SaveWxNews:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                // 更新图文信息
                foreach (var item in lstNews)
                {
                    item.MediaId = newRes.media_id;
                    item.IsDel   = 0;
                    //await repo.SaveAsync(item);
                }

                // 批量保存
                mulSaveRes = await repo.SaveAsync(lstNews);

                // 保存图文消息
                var dtNow      = DateTime.Now;
                var wxNewsInfo = new WxNewsShow();
                wxNewsInfo.MediaId        = newRes.media_id;
                wxNewsInfo.FirstNewsTitle = lstNews[0].Title;
                wxNewsInfo.IsMultiple     = lstNews.Count > 0 ? 1 : 0;
                wxNewsInfo.Creater        = userName;
                wxNewsInfo.Updater        = userName;
                wxNewsInfo.CreateTime     = dtNow;
                wxNewsInfo.UpdateTime     = dtNow;
                await repo.SaveAsync(wxNewsInfo);

                return(new Result <string> {
                    IsSucc = true, Message = "保存图文成功!"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("SaveWxNews:保存微信图文素材失败:" + ex.Message + "        " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "保存微信图文素材失败!"
            });
        }
        public Result <string> SyncMediaList([FromBody] JObject objPara)
        {
            try
            {
                // 参数
                dynamic obj   = objPara as dynamic;
                string  type  = obj.type.ToString();
                int     count = Convert.ToInt32(obj.count.ToString());
                if (string.IsNullOrEmpty(type))
                {
                    return(new Result <string> {
                        Message = "请先选择要同步的素材类别!"
                    });
                }

                if (count <= 0)
                {
                    return(new Result <string> {
                        Message = "请先选择要同步的素材的数量!"
                    });
                }

                // 所有的素材
                var lstAll = new List <PubMeterial>();
                // 同步素材
                var mType    = ComHelper.GetEnumValueByStr <PubMediaType>(type);
                var startInd = 0;
                var pageSize = 20;
                var syncRes  = PubMediaApi.GetMaterialList(mType, startInd, pageSize);
                logHelper.Debug("SyncMediaList:同步微信公众号永久素材结果:" + syncRes.JsonSerialize());
                if (!syncRes.IsSuss)
                {
                    var msg = "同步微信公众号永久素材失败:" + syncRes.errcode + "     " + syncRes.errmsg;
                    logHelper.Error("SyncMediaList:" + msg);
                    return(new Result <string> {
                        Message = msg
                    });
                }

                // 总数
                var allCount = syncRes.total_count;
                if (allCount > count)
                {
                    allCount = count;
                }

                lstAll.AddRange(syncRes.item);
                SyncMedias(mType, syncRes);

                // 循环同步
                while (syncRes.IsSuss && lstAll.Count < allCount)
                {
                    startInd += pageSize;
                    syncRes   = PubMediaApi.GetMaterialList(mType, startInd, pageSize);
                    logHelper.Debug("SyncMediaList:同步微信公众号永久素材结果:" + syncRes.JsonSerialize());
                    if (syncRes.IsSuss)
                    {
                        lstAll.AddRange(syncRes.item);
                        SyncMedias(mType, syncRes);
                    }
                }

                return(new Result <string> {
                    IsSucc = true, Message = "同步微信公众号永久素材成功!"
                });
            }
            catch (Exception ex)
            {
                logHelper.Error("SyncMediaList:同步微信公众号永久素材失败:" + ex.Message + "      " + ex.StackTrace);
            }

            return(new Result <string> {
                Message = "同步微信公众号永久素材失败!"
            });
        }