Commit f26d46c3 by xiongyuwen

no message

parent 1224fc9d
using Abp.Domain.Services;
using Abp.Application.Services;
using Abp.Domain.Services;
using Bailun.Discuz.Application.WeiPan.Dto.ResponseDto;
using Bailun.Discuz.Domain.WeiPan;
using System;
......@@ -8,7 +9,7 @@ using System.Threading.Tasks;
namespace Bailun.Discuz.Application.WeiPan
{
public interface IWeiPanService: IDomainService
public interface IWeiPanService: IApplicationService
{
/// <summary>
///创建微盘空间
......@@ -26,7 +27,7 @@ namespace Bailun.Discuz.Application.WeiPan
///// 获取首层文件列表
///// </summary>
///// <returns></returns>
Task<GetFileListResponse> GetFirstFileList(string userId);
Task<GetFileListResponse> GetFirstFileList(string userId,bool isGetRedis = true);
///// <summary>
///// 获取下载文件链接地址
......@@ -47,6 +48,8 @@ namespace Bailun.Discuz.Application.WeiPan
Task<long> CreateAttachment(long userId, string fileMd5, long typeId);
Task<List<WeiPanFileList>> GetFileList();
Task ProcessWeiPanWorker();
Task<string> ProcessWeiPanWorker();
Task<WeiPanFileList> GetFileInfo(string fileId);
}
}
......@@ -25,6 +25,7 @@ using System.Net.Http.Headers;
using Newtonsoft.Json;
using Bailun.Discuz.Application.Util;
using Abp.Domain.Uow;
using Abp.Domain.Services;
namespace Bailun.Discuz.Application.WeiPan
{
......@@ -91,13 +92,13 @@ namespace Bailun.Discuz.Application.WeiPan
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<long> CreateAttachment(long userId, string fileMd5, long typeId)
public async Task<long> CreateAttachment(long userId, string fileId, long typeId)
{
var file =await GetFileUrl(fileMd5);
var file =await GetWeiPanFile(fileId);
if (file != null)
{
Attachments attachments = new Attachments();
attachments.Uuid = fileMd5;
attachments.Uuid = fileId;
attachments.UserId = userId;
attachments.TypeId = typeId;
attachments.IsRemote = 0;
......@@ -110,7 +111,7 @@ namespace Bailun.Discuz.Application.WeiPan
attachments.Ip = "";
attachments.CreatedAt = DateTime.Now;
attachments.UpdatedAt = DateTime.Now;
return _attachmentsRepository.InsertAndGetId(attachments);
return await _attachmentsRepository.InsertAndGetIdAsync(attachments);
}
else
{
......@@ -124,12 +125,17 @@ namespace Bailun.Discuz.Application.WeiPan
///// 获取首层文件列表
///// </summary>
///// <returns></returns>
public async Task<GetFileListResponse> GetFirstFileList(string userId)
public async Task<GetFileListResponse> GetFirstFileList(string userId,bool isGetRedis=true)
{
//判断缓存中是否有值,如果有值直接读取
var redisKey = Constants.First_File_List;
var cachingResponse = RedisHelper.HGet<GetFileListResponse>(redisKey, userId);
if(cachingResponse != null)
GetFileListResponse cachingResponse = null;
if(isGetRedis)
{
cachingResponse = RedisHelper.HGet<GetFileListResponse>(redisKey, userId);
}
if (cachingResponse != null)
{
return cachingResponse;
}
......@@ -168,6 +174,7 @@ namespace Bailun.Discuz.Application.WeiPan
u.ctime = ConvertToDateTime(u.ctime).ToString();
});
}
if(isGetRedis)
RedisHelper.HSet(redisKey, userId, apiOutput);
return apiOutput;
}
......@@ -346,15 +353,21 @@ namespace Bailun.Discuz.Application.WeiPan
}
public async Task<WeiPanFileList> GetFileInfo(string fileId)
{
return await GetWeiPanFile(fileId);
}
///// <summary>
///// 获取下载文件链接地址
///// </summary>
///// <returns></returns>
public async Task<string> GetViewFile(string userId, string fileId, string md5, string fileName)
{
string fileUrl =(await GetFileUrl(md5))?.QiniuUrl;
if (fileUrl == null)
{
string fileUrl = "";
// string fileUrl =(await GetFileUrl(md5))?.QiniuUrl;
//if (fileUrl == null)
// {
GetViewFileReuqest getViewFileRequest = new GetViewFileReuqest();
getViewFileRequest.userid = userId;
getViewFileRequest.fileid = fileId;
......@@ -388,13 +401,13 @@ namespace Bailun.Discuz.Application.WeiPan
{
fileUrl = $"http://img.blsct.com/{uploadFileName}";
//存入至表中
WeiPanFileList weiPanFileList = new WeiPanFileList();
weiPanFileList.CreateTime = DateTime.Now;
weiPanFileList.FileId = fileId;
weiPanFileList.FileMd5 = md5;
weiPanFileList.FileName = fileName;
weiPanFileList.QiniuUrl = fileUrl;
await _weiPanFileListRepository.AddAsync(weiPanFileList, true);
//WeiPanFileList weiPanFileList = new WeiPanFileList();
//weiPanFileList.CreateTime = DateTime.Now;
//weiPanFileList.FileId = fileId;
//weiPanFileList.FileMd5 = md5;
//weiPanFileList.FileName = fileName;
//weiPanFileList.QiniuUrl = fileUrl;
//await _weiPanFileListRepository.AddAsync(weiPanFileList, true);
}
else
{
......@@ -406,7 +419,7 @@ namespace Bailun.Discuz.Application.WeiPan
{
throw new Exception(apiOutput.errmsg);
}
}
// }
return fileUrl;
}
......@@ -443,9 +456,9 @@ namespace Bailun.Discuz.Application.WeiPan
/// 处理微盘自动发帖功能
/// </summary>
public async Task ProcessWeiPanWorker()
public async Task<string> ProcessWeiPanWorker()
{
StringBuilder messageSb = new StringBuilder(); ;
string userId = "chenzekai";
List<WeiPanFileList> inserWeiPanFileList = new List<WeiPanFileList>();
//1:获取线上的所有文档数据
......@@ -454,7 +467,7 @@ namespace Bailun.Discuz.Application.WeiPan
//string value = "测试数据";
//RedisHelper.Set("key", filList);
//List<WeiPanFileList> filList = RedisHelper.Get<List<WeiPanFileList>>("key");
//filList.RemoveAt(1);
//2:判断当前fileid是否存在于数据库中, 如果不存在则添加
foreach (var file in filList)
{
......@@ -470,17 +483,14 @@ namespace Bailun.Discuz.Application.WeiPan
//判断当前的md5是否一致,如果不一致则要更新URL地址
if(weiPanFile.FileMd5!=file.FileMd5)
{
messageSb.Append($"修改了文件:{weiPanFile.FileName};");
//重新上传至七牛云
weiPanFile.QiniuUrl = await GetViewFile(userId, file.FileId, file.FileMd5, file.FileName);
weiPanFile.FileMd5 = file.FileMd5;
weiPanFile.FileName = file.FileName;
//更新表md5值
_weiPanFileListRepository.Update(weiPanFile);
//更新附件表
var typeId =weiPanFile.ThreadId;
if(typeId>0)
{
var attachment=await _attachmentsRepository.Query().AsNoTracking().Where(u => u.TypeId == typeId).FirstOrDefaultAsync();
//var typeId =weiPanFile.ThreadId;
//if(typeId>0)
//{
var attachment=await _attachmentsRepository.Query().AsNoTracking().Where(u => u.Uuid == weiPanFile.FileId).OrderByDescending(u=>u.CreatedAt).FirstOrDefaultAsync();
if(attachment!=null)
{
attachment.FilePath = weiPanFile.QiniuUrl;
......@@ -488,11 +498,34 @@ namespace Bailun.Discuz.Application.WeiPan
attachment.FileName = weiPanFile.FileName;
_attachmentsRepository.Update(attachment);
}
//}
//更新表md5值
weiPanFile.FileMd5 = file.FileMd5;
weiPanFile.FileName = file.FileName;
_weiPanFileListRepository.Update(weiPanFile);
}
}
}
//判断线上文件列表数据是否有删除,如果有删除要进行同步删除
var fileList= await _weiPanFileListRepository.Query().AsNoTracking().ToListAsync();
var onLineFileIds = filList.Select(u => u.FileId).ToArray();
var delFiles=fileList.Where(u => !onLineFileIds.Contains(u.FileId)).ToList();
if(delFiles.Any())
{
messageSb.Append($"删除帖子数量为:{delFiles.Count},分别为:{string.Join(",", delFiles.Select(u => u.FileName).ToArray()) };");
foreach (var item in delFiles)
{
await _weiPanFileListRepository.DeleteAsync(item);
}
}
if (inserWeiPanFileList.Count>0|| delFiles.Any())//有新增则清除缓存
{
messageSb.Append($"新增帖子数量为:{inserWeiPanFileList.Count},分别为:{string.Join(",", inserWeiPanFileList.Select(u => u.FileName).ToArray()) };");
RedisHelper.HDel(Constants.File_List_Tree);//清除缓存
RedisHelper.HDel(Constants.First_File_List);//清除缓存
}
_weiPanFileListRepository.BulkInsert(inserWeiPanFileList.ToArray());
var noTieZilist=await _weiPanFileListRepository.Query().AsNoTracking().Where(u => u.ThreadId == 0).ToListAsync();
foreach (var item in noTieZilist)
......@@ -502,9 +535,11 @@ namespace Bailun.Discuz.Application.WeiPan
if(!string.IsNullOrEmpty(threadId))
{
item.ThreadId = Convert.ToInt64(threadId);
_weiPanFileListRepository.Add(item,true);
await _weiPanFileListRepository.UpdateAsync(item);
}
}
return messageSb.Length==0?"无新增帖子":messageSb.ToString();
}
......@@ -516,7 +551,7 @@ namespace Bailun.Discuz.Application.WeiPan
var result = JsonHelper.FromJson<GetDiscuzTokenRespnse>(response);
var token= result.data.attributes.access_token;
//生成附件
var attachmentid = await CreateAttachment(result.data.id, weiPanFile.FileMd5, 0);
var attachmentid = await CreateAttachment(result.data.id, weiPanFile.FileId, 0);
if (!string.IsNullOrEmpty(token))
{
//发布帖子
......@@ -543,10 +578,7 @@ namespace Bailun.Discuz.Application.WeiPan
data.attributes.price =0 ;
publishTieZiRequest.data = data;
var apiUrl = $"http://discuz.bailuntec.com/api/threads";
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("authorization", "Bearer " + token);
var res= JsonHelper.ToObject<PublishTieZiResponse>(HY.Base.Util.HttpHelper.PostData(apiUrl, publishTieZiRequest.ToJson(), null, dic, null, null, null));
var res = JsonHelper.ToObject<PublishTieZiResponse>(Client_Post(publishTieZiRequest.ToJson(), apiUrl, "Bearer " + token));
resultId = res.data.id;
}
return resultId;
......@@ -572,24 +604,7 @@ namespace Bailun.Discuz.Application.WeiPan
HttpResponseMessage response = client.PostAsync(requestUri, content).Result;
return response.Content.ReadAsStringAsync().Result;
}
static readonly HttpClient Client = new HttpClient();
public string Post(string url,string token,string postData)
{
//发送Post请求
var request = (HttpWebRequest)WebRequest.Create(url);
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Headers.Add("authorization", token);
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
return new StreamReader(response.GetResponseStream()).ReadToEnd();
}
List<ItemItem> fileItems = new List<ItemItem>();
//}
/// <summary>
......@@ -641,7 +656,7 @@ namespace Bailun.Discuz.Application.WeiPan
List<WeiPanFileList> weiPanFileLists = new List<WeiPanFileList>();
List<ItemItem> itemItems = new List<ItemItem>();
var token = GetQYWeChatToken(userId);
var firstFiles = await GetFirstFileList(userId);
var firstFiles = await GetFirstFileList(userId,false);
if (firstFiles.file_list != null)
{
firstFiles.file_list.item.ForEach(u =>
......
......@@ -76,10 +76,14 @@ namespace Bailun.Discuz.Service.Controllers
}
[HttpGet("ProcessWeiPanWorker")]
public async Task ProcessWeiPanWorker()
public async Task<string> ProcessWeiPanWorker()
{
await _iweiPanService.ProcessWeiPanWorker();
return await _iweiPanService.ProcessWeiPanWorker();
}
[HttpGet("GetFileInfo")]
public async Task<WeiPanFileList> GetFileInfo(string fileId)
{
return await _iweiPanService.GetFileInfo(fileId);
}
}
}
......@@ -3,10 +3,13 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>..\..\..</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CSRedisCore" Version="3.6.6" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
......
......@@ -4,6 +4,7 @@ using Abp.Reflection.Extensions;
using Abp.Threading.BackgroundWorkers;
using Bailun.AbpCore;
using Bailun.AbpCore.ServiceFabric;
using Bailun.Discuz;
using Bailun.Discuz.ConsoleApp.Publish.Worker;
using Bailun.Discuz.Domain.ExternalApi;
using Bailun.ServiceFabric;
......@@ -16,7 +17,7 @@ using System;
using System.IO;
using Z.EntityFramework.Extensions;
namespace Bailun.Discuz.ConsoleApp.Publish
namespace Bailun.Amazon.ConsoleApp.Publish
{
[DependsOn(
typeof(EFCoreModule),
......@@ -26,6 +27,7 @@ namespace Bailun.Discuz.ConsoleApp.Publish
{
public override void PreInitialize()
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
......@@ -38,7 +40,7 @@ namespace Bailun.Discuz.ConsoleApp.Publish
var serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(IocManager.IocContainer, services);
var dbContextOptionsBuilder = new DbContextOptionsBuilder<BaseContext>();
var conn = configuration.GetConnectionString("Default");
var conn = configuration.GetConnectionString("Discuz");
dbContextOptionsBuilder.UseMySql(conn).UseInternalServiceProvider(serviceProvider);
IocManager.IocContainer.Register(Component.For<DbContextOptions<BaseContext>>()
.Instance(dbContextOptionsBuilder.Options)
......@@ -53,23 +55,34 @@ namespace Bailun.Discuz.ConsoleApp.Publish
ConfigManagerConf.SetConfiguration(configuration);
services.AddMicroServiceApi<ITaskJobApi>(ConfigManagerConf.GetValue("ApiServerUrl:TaskJobUrl"));
services.AddMicroServiceApi<IPamsApi>(ConfigManagerConf.GetValue("ApiServerUrl:PamsUrl"));
services.AddAbp<ConsoleModule>();
string hostName = ConfigManagerConf.GetValue("redis:HostName");
string port = ConfigManagerConf.GetValue("redis:Port");
string password = ConfigManagerConf.GetValue("redis:Password");
string defaultdatabase = ConfigManagerConf.GetValue("redis:Defaultdatabase");
var redis_connString = $"{hostName}:{port}, defaultDatabase = {defaultdatabase},password={password}, poolsize = 500, ssl = false, writeBuffer = 10240";
var rs = new CSRedis.CSRedisClient(redis_connString);
RedisHelper.Initialization(rs);//初始化
Configuration.UnitOfWork.IsTransactional = false;
}
public override void Initialize()
{
var workManager = IocManager.Resolve<IBackgroundWorkerManager>();
IocManager.RegisterAssemblyByConvention(typeof(ConsoleModule).GetAssembly());
workManager.Add(IocManager.Resolve<PublishWeiPanWorker>());
}
public override void PostInitialize()
{
var workManager = IocManager.Resolve<IBackgroundWorkerManager>();
var workManager = IocManager.Resolve<IBackgroundWorkerManager>();
var taskType = Environment.GetEnvironmentVariable("TaskType");
Console.WriteLine($"TaskType:{taskType}");
workManager.Add(IocManager.Resolve<PublishWeiPanWorker>());
}
}
}
\ No newline at end of file
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["src/console/Bailun.Discuz.ConsoleApp.Publish/Bailun.Discuz.ConsoleApp.Publish.csproj", "src/console/Bailun.Discuz.ConsoleApp.Publish/"]
COPY ["src/Bailun.Discuz.Application/Bailun.Discuz.Application.csproj", "src/Bailun.Discuz.Application/"]
COPY ["src/Bailun.Discuz.Domain/Bailun.Discuz.Domain.csproj", "src/Bailun.Discuz.Domain/"]
COPY ["src/Bailun.Discuz.EFCore/Bailun.Discuz.EFCore.csproj", "src/Bailun.Discuz.EFCore/"]
COPY ["src/Bailun.Discuz.Service/Bailun.Discuz.Service.csproj", "src/Bailun.Discuz.Service/"]
RUN dotnet restore "src/console/Bailun.Discuz.ConsoleApp.Publish/Bailun.Discuz.ConsoleApp.Publish.csproj"
COPY . .
WORKDIR "/src/src/console/Bailun.Discuz.ConsoleApp.Publish"
RUN dotnet build "Bailun.Discuz.ConsoleApp.Publish.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Bailun.Discuz.ConsoleApp.Publish.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Bailun.Discuz.ConsoleApp.Publish.dll"]
\ No newline at end of file
{
"profiles": {
"Bailun.Discuz.ConsoleApp.Publish": {
"commandName": "Project"
},
"Docker": {
"commandName": "Docker"
}
}
}
\ No newline at end of file
using Abp.Dependency;
using Abp.Threading.BackgroundWorkers;
using Abp.Threading.Timers;
using Bailun.Discuz.Application.WeiPan;
using Bailun.ServiceFabric;
using System;
namespace Bailun.Discuz.ConsoleApp.Publish.Worker
{
public class PublishWeiPanWorker : PeriodicBackgroundWorkerBase, ISingletonDependency
{
//private readonly IListingAnalysisService _listingAnalysisService;
//private readonly IListingGroupService _listingGroupService;
//public PublishWeiPanWorker(AbpTimer timer,
// IListingAnalysisService listingAnalysisService,
// IListingGroupService listingGroupService) : base(timer)
//{
// timer.Period = 1000 * 60 * 30;
// timer.RunOnStart = true;
private readonly IWeiPanService _weiPanService;
// _listingAnalysisService = listingAnalysisService;
// _listingGroupService = listingGroupService;
//}
public PublishWeiPanWorker(AbpTimer timer) : base(timer)
public PublishWeiPanWorker(AbpTimer timer,
IWeiPanService weiPanService) : base(timer)
{
timer.Period = 1000; //*60 * 30
_weiPanService = weiPanService;
var minute = ConfigManagerConf.GetValue("PublishWeiPanWorkerRunTime:Minute");
timer.Period = 1000 * 60 * Convert.ToInt32(minute);
timer.RunOnStart = true;
}
protected override void DoWork()
{
try
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:开始listing分析");
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:结束listing分析");
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:开始生成帖子中");
var result= _weiPanService.ProcessWeiPanWorker().GetAwaiter().GetResult();
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:生成帖子完毕,"+ result);
}
catch (Exception ex)
{
Console.WriteLine($"lazada listing分析异常:{ex.Message},异常堆栈为:{ex.StackTrace}");
Console.WriteLine($"生成帖子异常:{ex.Message},异常堆栈为:{ex.StackTrace}");
}
}
}
......
{
"ConnectionStrings": {
"Default": "Server=10.0.8.6;port=3306;database=bailun_bltpro;uid=root;password=#7kfnymAM$Y9-Ntf;Convert Zero Datetime=True;Allow User Variables=True;pooling=true",
"BltPro": "Server=10.0.8.6;port=3306;database=bailun_bltpro;uid=root;password=#7kfnymAM$Y9-Ntf;Convert Zero Datetime=True;Allow User Variables=True;pooling=true"
"Discuz": "Server=106.55.44.113;port=3306;database=discuz;uid=admin;password=e066d4d1;Convert Zero Datetime=True;Allow User Variables=True;pooling=true"
},
"redis": {
"HostName": "172.31.255.227",
"HostName": "10.0.8.8",
"Port": "6379",
"Password": "",
"Defaultdatabase": 1
},
"PublishWeiPanWorkerRunTime": {
"minute": "30"
},
"QYWeChat": {
"AppId": "ww833808f6b8dc0745",
"Secret": "QmoJDF4oHEppM1CAAfjtkeu494LuKmUOZSwNCxO7E40",
"WeiPanSpaceId": "s.ww833808f6b8dc0745.610693393XlV",
"WeiPanSpaceFileId": "s.ww833808f6b8dc0745.610693393XlV_d.6106935069y7b"
},
"ApiServerUrl": {
"ProductUrl": "http://pro.bailuntec.com",
"ProfitApiAddress": "http://profit.bailuntec.com",
......
{
"ConnectionStrings": {
"Default": "Server=gz-cdb-oxt89knc.sql.tencentcdb.com;port=62967;database=bailun_bltpro;uid=root;password=#7kfnymAM$Y9-Ntf;Convert Zero Datetime=True;Allow User Variables=True;pooling=true"
"Discuz": "Server=106.55.44.113;port=3306;database=discuz;uid=admin;password=e066d4d1;Convert Zero Datetime=True;Allow User Variables=True;pooling=true"
},
"redis": {
"HostName": "localhost",
"HostName": "10.0.8.8",
"Port": "6379",
"Password": "",
"Defaultdatabase": "1"
"Defaultdatabase": 1
},
"PublishWeiPanWorkerRunTime": {
"Minute": "1"
},
"QYWeChat": {
"AppId": "ww833808f6b8dc0745",
"Secret": "QmoJDF4oHEppM1CAAfjtkeu494LuKmUOZSwNCxO7E40",
"WeiPanSpaceId": "s.ww833808f6b8dc0745.610693393XlV",
"WeiPanSpaceFileId": "s.ww833808f6b8dc0745.610693393XlV_d.6106935069y7b"
},
"ApiServerUrl": {
"ProductUrl": "http://pro.bailuntec.com",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment