using Nirvana.Common; using Nirvana.Common.ApiBase; using Nirvana.Data; using Senparc.Weixin.MP; using Senparc.Weixin.MP.AdvancedAPIs; using Senparc.Weixin.MP.AdvancedAPIs.OAuth; using Senparc.Weixin.Open; using Senparc.Weixin.Open.Containers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using YBDevice.Entity; namespace YBDevice.NApi.DBServices { /// /// 扫码订单处理 /// public partial class OrderApp : WebBaseApp { /// /// 获取可用的订单 /// /// 设备信息 /// 身高,CM /// 体重,KG /// 阻抗 /// 测量时间 /// 用户资料 /// 是否取默认订单,0-否,1-是 public async Task GetAsync(YB_Device equ, decimal height, decimal weight, decimal imp, DateTime time, OAuthUserInfo userinfo, int isdefault = 1) { try { using (var dbClient = ReadDbContext.GetInstance()) { //检查设备绑定的订单 var orderlist = (await dbClient.Ado.UseStoredProcedure().GetDataTableAsync("PROC_GetScanOrder", new { equid = equ.Id, fansid = userinfo.unionid, isdefault = isdefault })).ToList(); if (orderlist.Count == 0) { return null; } //返回取出的订单,如果订单id为1,则为系统默认关注公众号的订单,如果订单id为2,则为系统默认的打开链接的订单 var order = orderlist.FirstOrDefault(); var returndata = new OrderInfo { id = order.Id, type = order.Type }; //如果是关注公众号 string publicid = ""; if (order.Type == (int)OrderType.Office) { var office = await dbClient.Queryable().Where(x => x.authorizer_appid == order.Url && x.type == 1).FirstAsync(); if (office == null) { returndata.code = (int)ErrorInfoDesc.wxinfoerror; return returndata; } publicid = office.user_name; //如果是认证的服务号 if (office.service_type_info == ServiceType.服务号.ToString() && office.verify_type_info == VerifyType.微信认证.ToString()) { //带参二维码格式:yb1|fansid var sceneid = $"yb1|{userinfo.unionid}"; var token = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(componentAppid, office.authorizer_appid); var qrresult = await QrCodeApi.CreateAsync(token, 10000, 0, QrCode_ActionName.QR_STR_SCENE, sceneid); if (qrresult.ErrorCodeValue != 0) { returndata.code = (int)ErrorInfoDesc.ercodeerror; return returndata; } returndata.officetype = (int)OfficeType.RZFW; returndata.content = $"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={qrresult.ticket}"; } else if (office.service_type_info == "个人") { //个人回复由第三方插件自动回复 returndata.officetype = (int)OfficeType.FRZ; returndata.content = $"{WXURL}/open/qr/{office.user_name}.jpg"; } else { returndata.officetype = (int)OfficeType.GR; returndata.vrcode = new Random().Next(100000, 999999).ToString().Substring(1, 4); returndata.content = $"{WXURL}/open/qr/{office.user_name}.jpg"; } } else if (order.Type == (int)OrderType.URL) { returndata.content = order.Url; } else { returndata.code = (int)ErrorInfoDesc.develop; return returndata; } //保存记录 await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("proc_saveresult", new { vrcode = "", weight = weight, height = height, imp = imp, fansid = userinfo.unionid.ToStr(), oldopenid = userinfo.openid, equid = equ.Id, ecode = equ.Ecode, facecode = equ.FacCode, orderid = order.Id, businessid = equ.BusinessId, publicid = publicid, headimgurl = userinfo.headimgurl.ToStr(), nickname = userinfo.nickname.ToStr(), sex = userinfo.sex, city = userinfo.city.ToStr(), province = userinfo.province.ToStr(), country = userinfo.country.ToStr(), language = "", ordertype = order.Type, resulttime = DateTime.Now }); return returndata; } } catch (Exception ex) { //写入异常日志 var param = $"equ={equ.ToJson()},height={height},weight={weight},imp={imp},time={time},userinfo={userinfo.ToJson()},isdefault={isdefault}"; new LoggerApp().InsertErrorLog(ex, param, "获取订单"); return new OrderInfo { code = (int)ErrorInfoDesc.systemerror }; } } /// /// 获取可用的订单 /// /// 设备信息 /// 用户资料 /// 是否取默认订单,0-否,1-是 /// public async Task GetAsync(YB_Device equ, OAuthUserInfo userinfo, int isdefault = 1) { try { using (var dbClient = ReadDbContext.GetInstance()) { //检查设备绑定的订单 var orderlist = (await dbClient.Ado.UseStoredProcedure().GetDataTableAsync("PROC_GetScanOrder", new { equid = equ.Id, fansid = userinfo.unionid, isdefault = isdefault })).ToList(); if (orderlist.Count == 0) { return null; } //返回取出的订单,如果订单id为1,则为系统默认关注公众号的订单,如果订单id为2,则为系统默认的打开链接的订单 var order = orderlist.FirstOrDefault(); var returndata = new OrderInfo { id = order.Id, type = order.Type }; //如果是关注公众号 string publicid = ""; if (order.Type == (int)OrderType.Office) { var office = await dbClient.Queryable().Where(x => x.authorizer_appid == order.Url && x.type == 1).FirstAsync(); if (office == null) { returndata.code = (int)ErrorInfoDesc.wxinfoerror; return returndata; } publicid = office.user_name; //如果是认证的服务号 if (office.service_type_info == ServiceType.服务号.ToString() && office.verify_type_info == VerifyType.微信认证.ToString()) { //带参二维码格式:yb#设备id#粉丝唯一标识 var sceneid = $"yb#1#{equ.Id}#{userinfo.unionid}"; var token = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(componentAppid, office.authorizer_appid); var qrresult = await QrCodeApi.CreateAsync(token, 10000, 0, QrCode_ActionName.QR_STR_SCENE, sceneid); if (qrresult.ErrorCodeValue != 0) { returndata.code = (int)ErrorInfoDesc.ercodeerror; return returndata; } returndata.officetype = (int)OfficeType.RZFW; returndata.content = $"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={qrresult.ticket}"; } else if (office.service_type_info == "个人") { //个人回复由第三方插件自动回复 returndata.officetype = (int)OfficeType.FRZ; returndata.content = $"{WXURL}/open/qr/{office.user_name}.jpg"; } else { returndata.officetype = (int)OfficeType.GR; returndata.vrcode = new Random().Next(100000, 999999).ToString().Substring(1, 4); returndata.content = $"{WXURL}/open/qr/{office.user_name}.jpg"; } } else if (order.Type == (int)OrderType.URL) { returndata.content = order.Url; } else { returndata.code = (int)ErrorInfoDesc.develop; return returndata; } //保存记录 await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("proc_body_binduser", new { fansid = userinfo.unionid.ToStr(), oldopenid = userinfo.openid, equid = equ.Id, ecode = equ.Ecode, facecode = equ.FacCode, orderid = order.Id, businessid = equ.BusinessId, publicid = publicid, headimgurl = userinfo.headimgurl.ToStr(), nickname = userinfo.nickname.ToStr(), sex = userinfo.sex, city = userinfo.city.ToStr(), province = userinfo.province.ToStr(), country = userinfo.country.ToStr(), language = "", ordertype = order.Type }); return returndata; } } catch (Exception ex) { //写入异常日志 var param = $"equ={equ.ToJson()},userinfo={userinfo.ToJson()},isdefault={isdefault}"; new LoggerApp().InsertErrorLog(ex, param, "获取订单"); return new OrderInfo { code = (int)ErrorInfoDesc.systemerror }; } } /// /// 设备状态描述 /// /// 设备状态 /// private string EquStatusMsg(int status) => (status) switch { _ when status == (int)DeviceStatus.Stop => "设备已停止运行", _ when status == (int)DeviceStatus.UnActive => "设备还未激活", _ => "正常运行" }; /// /// 获取设备 /// /// /// public async Task GetEquAsync(string ecode) { using (var dbClient = ReadDbContext.GetInstance()) { var data = await dbClient.Queryable().FirstAsync(x => x.Ecode == ecode); var types = await dbClient.Queryable().ToListAsync(); return new DeviceAndTypeModel { equ = data, types = types }; } } } }