MeiRiYiCheng_1_old/YBDevice.NApi/Controllers/Body/BodyController.cs

306 lines
14 KiB
C#
Raw Permalink Normal View History

2025-07-16 17:14:38 +08:00
using DotNetCore.CAP;
using Furion.DistributedIDGenerator;
using Microsoft.AspNetCore.Mvc;
using Nirvana.Common;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.MP.AdvancedAPIs.OAuth;
using System.Text;
using System.Web;
using YBDevice.Entity;
namespace YBDevice.NApi.Controllers.Body
{
/// <summary>
/// 八电极接口
/// </summary>
[Route("[controller]/[action]")]
[ApiController]
public class BodyController : ControllerBase
{
public static string appId = Senparc.Weixin.Config.SenparcWeixinSetting.WeixinAppId;
public static string appSecret = Senparc.Weixin.Config.SenparcWeixinSetting.WeixinAppSecret;
public static readonly string Component_Token = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Token;
public static readonly string Component_EncodingAESKey = Senparc.Weixin.Config.SenparcWeixinSetting.Component_EncodingAESKey;
public static readonly string Component_Appid = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Appid;
public static readonly string Component_Secret = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Secret;
private readonly IBodyService _bodyService;
private readonly IOrderService _orderService;
private readonly IDeviceService _deviceService;
private readonly INoticeService _noticeService;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ICapPublisher _capBus;
public BodyController(IBodyService bodyService, IOrderService orderService, IDeviceService deviceService, INoticeService noticeService, IHttpContextAccessor httpContextAccessor, ICapPublisher capPublisher)
{
_bodyService = bodyService;
_orderService = orderService;
_deviceService = deviceService;
_noticeService = noticeService;
_httpContextAccessor = httpContextAccessor;
_capBus = capPublisher;
}
/// <summary>
/// 接收八电极秤发过来的消息
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
[HttpPost]
public async Task<int> GetAsync([FromBody] BodyRequstDto data)
{
//对结果进行解析
return await _bodyService.HandlerBodyDataAsync(data);
}
/// <summary>
/// PCH01W接收端
/// </summary>
/// <param name="data"></param>
[HttpPost]
public async Task<Object> GetData([FromBody] BodyRequstDto data)
{
return await _bodyService.Handler01WDataAsync(data);
}
/// <summary>
///二维码结果r=重量|左手阻抗|右手阻抗|左脚阻抗|左脚阻抗|全身阻抗|身高| and SN=xxx and t=2重量单位kg分度值0.05阻抗单位欧母分度值1身高单位cm分度值0.5
///示例r=60.05|500.1|250|250|300|300|600|180.5|and SN=xxx and t=2
/// </summary>
/// <param name="r"></param>
/// <param name="sn"></param>
/// <param name="t"></param>
/// <param name="type">1-测试,2-正式</param>
/// <returns></returns>
[HttpGet]
public IActionResult get(string r, string sn, string t, int type = 1)
{
//对结果进行解析
var arr = r.Split('|');
if (arr.Length != 7)
{
return Redirect($"/qr/error?msg=1&eid=0");
}
//对数据进行拼接
var str = $"{sn}|{arr[0]}|{arr[6]}|{arr[1]}|{arr[2]}|{arr[3]}|{arr[4]}|{arr[5]}|{t}";
//对参数进行base64编码
var data = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{str}"));
var url = $"{Configs.GetString("APIURL")}/body/r?data={data}";
//对url进行base64编码
url = Convert.ToBase64String(Encoding.UTF8.GetBytes(url));
//跳转授权页面
var state = "xbpage";//用于识别请求可靠性
var redirecturl = $"{Configs.GetString("APIURL")}/Auth/page?r={url}";
var rurl = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_userinfo);
return Redirect(rurl);
}
/// <summary>
/// 八电极数据结果展示
/// </summary>
/// <param name="d">sn|weight|height|lefthandimp|righthandimp|leftfootimp|rightfootimp|bodyimp</param>
/// <returns></returns>
[WeChatFilter]
[HttpGet]
public IActionResult br(string d)
{
var arr = d.Split('|');
if (arr.Length != 9)
{
return Redirect($"/qr/error?msg=1&eid={Guid.Empty}");
}
//对数据进行拼接
//对参数进行base64编码
var data = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{d}"));
var url = $"{Configs.GetString("APIURL")}/body/qr?data={data}";
//对url进行base64编码
url = Convert.ToBase64String(Encoding.UTF8.GetBytes(url));
//跳转授权页面
var state = "xbpage";//用于识别请求可靠性
var redirecturl = $"{Configs.GetString("APIURL")}/Auth/page?r={url}";
var rurl = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_userinfo);
return Redirect(rurl);
}
/// <summary>
/// 八电极推送的模版消息数据解析
/// </summary>
/// <param name="data"></param>
/// <param name="info"></param>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> qrAsync(string data, string info)
{
//记录发送过来的数据
// _loggerService.AddLogger($"八电极二维码扫码数据,r={r},sn={sn},t={t}");
var ua = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString();
//对data进行base64解密,格式:sn|重量|身高|左手阻抗|右手阻抗|左脚阻抗|左脚阻抗|全身阻抗|设备类型
var str = Encoding.UTF8.GetString(Convert.FromBase64String(data));
var arr = str.Split('|');
string sn = arr[0];
decimal weight = arr[1].ToDecimal();
decimal height = arr[2].ToDecimal();
decimal lefthandimp = arr[3].ToDecimal();
decimal righthandimp = arr[4].ToDecimal();
decimal leftfootimp = arr[5].ToDecimal();
decimal rightfootimp = arr[6].ToDecimal();
decimal bodyimp = arr[7].ToDecimal();
//对info进行base64解密然后urldecode解码
info = HttpUtility.UrlDecode(Encoding.UTF8.GetString(Convert.FromBase64String(info)));
UserBaseInfoS2SDto userInfo = info.ToObject<UserBaseInfoS2SDto>();
Guid eid = Guid.Empty;//错误代码
//根据设备绑定的订单,跳转到不同的页面
var equ = await _deviceService.GetDeviceByEcodeAsync(sn);
var orderinfo = await _orderService.GetBodyOrderAsync(equ, userInfo);
if (orderinfo == null)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str}",
FromInfo = "八电极扫码,未找到可用的订单",
UA = ua,
Id = eid
});
return RedirectToAction("error", "qr", new { msg = (int)ErrorInfoDesc.NoOrder, eid = eid });
}
//订单信息有误
if (orderinfo.code > 0)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str},返回:{orderinfo.code}",
FromInfo = "八电极模版消息,获取订单失败",
UA = ua,
Id = eid
});
return RedirectToAction("error", "qr", new { msg = orderinfo.code, eid = eid });
}
if (!int.TryParse(arr[8], out int tid))
{
Guid resultid = Guid.Parse(arr[8]);
//记录数据
await _orderService.UpdateBodyResultAsync(resultid, userInfo, orderinfo);
}
var jsondata = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{orderinfo.ToJson()}"));
return RedirectToAction("f", "qr", new { info = jsondata });
}
/// <summary>
/// 数据解析,二维码展示
/// </summary>
/// <param name="data"></param>
/// <param name="info"></param>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> rAsync(string data, string info)
{
//记录发送过来的数据
// _loggerService.AddLogger($"八电极二维码扫码数据,r={r},sn={sn},t={t}");
var ua = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString();
//对data进行base64解密,格式:sn|重量|身高|左手阻抗|右手阻抗|左脚阻抗|左脚阻抗|全身阻抗|设备类型
var str = Encoding.UTF8.GetString(Convert.FromBase64String(data));
var arr = str.Split('|');
string sn = arr[0];
//对info进行base64解密然后urldecode解码
info = HttpUtility.UrlDecode(Encoding.UTF8.GetString(Convert.FromBase64String(info)));
UserBaseInfoS2SDto userInfo = info.ToObject<UserBaseInfoS2SDto>();
Guid eid = Guid.Empty;//错误代码
#region
var equ = await _deviceService.GetDeviceByEcodeAsync(sn);
if (equ == null)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str}",
FromInfo = "八电极扫码,设备未找到",
UA = ua,
Id = eid
});
//去激活小程序
var order = await _orderService.GetDevMagOrderAsync(equ, userInfo);
return RedirectToAction("bmini", "qr", new { sn = order.appid, n = order.NickName, h = order.HeadImg });
// return RedirectToAction("error", "qr", new { msg = (int)ErrorInfoDesc.devnotfound, eid = eid });
}
//判断设备是否可用
if (equ.Status == (int)DeviceStatus.Stop)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str}",
FromInfo = "八电极扫码,设备已停止运行",
UA = ua,
Id = eid
});
return RedirectToAction("error", "qr", new { msg = (int)ErrorInfoDesc.deverror, eid = eid });
}
//判断设备是否激活
if (!equ.ActiveTime.HasValue
//|| equ.EndTime < DateTime.Now
|| equ.Status == DeviceStatus.UnActive)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str}",
FromInfo = "八电极扫码,设备未激活",
UA = ua,
Id = eid
});
//跳转到打开设备管理小程序的页面
//获取设备绑定的设备管理小程序
var order = await _orderService.GetDevMagOrderAsync(equ, userInfo);
return RedirectToAction("bmini", "qr", new { sn = order.appid, n = order.NickName, h = order.HeadImg });
}
#endregion
//根据设备绑定的订单,跳转到不同的页面
var orderinfo = await _orderService.GetOrderByTrendAsync(equ, userInfo);
if (orderinfo == null)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str}",
FromInfo = "八电极扫码,未找到可用的订单",
UA = ua,
Id = eid
});
return RedirectToAction("error", "qr", new { msg = (int)ErrorInfoDesc.NoOrder, eid = eid });
}
//订单信息有误
if (orderinfo.code > 0)
{
eid = IDGen.NextID();
await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger
{
UserInfo = info,
Info = $"参数:{str},返回:{orderinfo.code}",
FromInfo = "八电极扫码,获取订单失败",
UA = ua,
Id = eid
});
return RedirectToAction("error", "qr", new { msg = orderinfo.code, eid = eid });
}
//记录数据
decimal height = arr[2].ToDecimal();
decimal weight = arr[1].ToDecimal();
decimal lefthandimp = arr[3].ToDecimal();
decimal righthandimp = arr[4].ToDecimal();
decimal leftfootimp = arr[5].ToDecimal();
decimal rightfootimp = arr[6].ToDecimal();
decimal bodyimp = arr[7].ToDecimal();
await _orderService.InsertResultAsync(equ, userInfo, orderinfo, height, weight, 2, bodyimp, leftfootimp, rightfootimp
, lefthandimp, righthandimp);
var jsondata = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{orderinfo.ToJson()}"));
return RedirectToAction("f", "qr", new { info = jsondata });
}
}
}