306 lines
14 KiB
C#
306 lines
14 KiB
C#
|
|
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 });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|