Waste/Waste.Application/ThirdApiInfo/OpenAppService.cs

288 lines
10 KiB
C#

using Furion.DynamicApiController;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Net.Http.Headers;
using Nirvana.Common;
using Nirvana.Common.File;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Waste.Application.ThirdApiInfo
{
/// <summary>
/// 开放数据
/// </summary>
[ApiDescriptionSettings("DevApi")]
[NonUnify]
public class OpenAppService : IDynamicApiController
{
private readonly IOpenService _openService;
private static IWebHostEnvironment _hostingEnvironment;
private readonly IHttpContextAccessor _httpContextAccessor;
private static readonly FormOptions _defaultFormOptions = new FormOptions();
public OpenAppService(IOpenService openService, IWebHostEnvironment webHostEnvironment, IHttpContextAccessor httpContextAccessor)
{
_openService = openService;
_hostingEnvironment = webHostEnvironment;
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// 获取设备上报相关信息
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
[HttpPost]
public async Task<ResultInfo> GetDevInfoAsync(GetDevInfoRequestDto data)
{
return await _openService.GetDevInfoAsync(data);
}
/// <summary>
/// 心跳数据上报
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
[HttpPost]
public async Task<ResultInfo> PostHeartAsync(DevHeartRequestDto data)
{
return await _openService.PostHeartAsync(data);
}
/// <summary>
/// 获取设备注册信息,第一次开机使用
/// </summary>
/// <param name="ecode"></param>
/// <returns></returns>
[HttpGet]
[QueryParameters]
public async Task<ResultInfo> RegInfoAsync(string ecode)
{
return await _openService.RegInfoAsync(ecode);
}
/// <summary>
/// BUG上报
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/reportbug/Post")]
public async Task<object> PostAsync([FromQuery]string ecode="")
{
var Request = _httpContextAccessor.HttpContext.Request;
//先保存上传的图片
if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
{
return new
{
status = new
{
code = 0,
name = "FAIL",
message = "上传失败"
}
};
}
var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit);
var reader = new MultipartReader(boundary, Request.Body);
var section = await reader.ReadNextSectionAsync();
while (section != null && section.Body.Position != section.Body.Length)
{
var hasContentDispositionHeader =
ContentDispositionHeaderValue.TryParse(
section.ContentDisposition, out var contentDisposition);
if (hasContentDispositionHeader)
{
if (!MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
{
}
else
{
string[] _permittedExtensions = {};
long _fileSizeLimit = 1048576 * 10;
string rootname = $"/bugs/{DateTime.Now.ToString("yyyyMMdd")}";
string savefolder = _hostingEnvironment.WebRootPath;
ModelStateDictionary modelState = new ModelStateDictionary();
var streameFileData = await FileHelpers.ApiProcessStreamedFile(
section, contentDisposition, modelState,
_permittedExtensions, _fileSizeLimit);
var streamedFileContent = streameFileData.data;
modelState = streameFileData.modelState;
if (!modelState.IsValid)
{
string msg = "上传失败";
if (modelState.Values.Count() > 0)
{
msg = modelState.Values.FirstOrDefault().Errors.FirstOrDefault().ErrorMessage;
}
return new
{
status = new
{
code = 0,
name = "FAIL",
message = msg
}
};
}
var name = $"{Path.GetRandomFileName()}{Path.GetExtension(contentDisposition.FileName.Value)}";
if (!string.IsNullOrEmpty(ecode))
{
name = $"{ecode}_{name}";
}
var thumbnailPath = Path.Combine(savefolder + "/" + rootname, name);
if (!Directory.Exists(Path.GetDirectoryName(thumbnailPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(thumbnailPath));
}
else
{
//检查文件是否存在
if (System.IO.File.Exists(thumbnailPath))
{
return new
{
status = new
{
code = 0,
name = "FAIL",
message = "此文件已存在"
}
};
}
}
var filepath = Path.Combine("wwwroot" + rootname + "/", name);
var filename = contentDisposition.FileName.Value;
using (var targetStream = File.Create(filepath))
{
await targetStream.WriteAsync(streamedFileContent);
}
}
}
}
return new
{
status = new
{
code = 1,
name = "SUCCESS",
message = ""
}
};
}
/// <summary>
/// BUG上报
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/reportbug/postbug")]
public object PostBug(BugModel bug)
{
var errmsg = $"机器码:{bug.ecode},位置:{bug.ExceptionPos},信息:{bug.ExceptionInfo}";
return new
{
status = new
{
code = 1,
name = "SUCCESS",
message = ""
}
};
}
/// <summary>
/// 正式升级
/// </summary>
/// <param name="ecode">机器码</param>
/// <param name="myver">版本号</param>
/// <param name="type">类型</param>
/// <returns></returns>
[HttpGet]
[QueryParameters]
[Route("api/upgrade/get")]
public async Task<object> GetAsync(string type, string ecode = "",int myver=400)
{
string rootpath = _hostingEnvironment.WebRootPath;
//读取文件,返回升级信息
var path = $"{rootpath}/apks/upgrade/{type}.txt";
if (!File.Exists(path))
{
return new
{
status = new
{
code = 0,
name = "FAIL",
message = "不存在任何信息"
}
};
}
FileStream fileStream = new FileStream(path, FileMode.Open);
string result = string.Empty;
using (StreamReader reader = new StreamReader(fileStream))
{
result = await reader.ReadToEndAsync();
}
if (string.IsNullOrEmpty(result))
{
return new
{
status = new
{
code = 0,
name = "FAIL",
message = "不存在任何信息"
}
};
}
return result.ToJson();
}
/// <summary>
/// 获取机器到期时间
/// </summary>
/// <param name="ecode"></param>
/// <returns></returns>
[HttpGet]
[QueryParameters]
[Route("api/machine/getisenable")]
public Object GetIsEnable(string ecode)
{
if (string.IsNullOrEmpty(ecode))
{
return new
{
status = new
{
code = 0,
name = "FAIL",
message = "参数错误"
}
};
}
return new
{
status = new
{
code = 1,
name = "SUCCESS",
message = ""
},
data = new
{
isenable = true,
deadline = DateTime.Now.AddYears(2).ToString("yyyy-MM-dd")
}
};
}
}
}