/// <summary> /// 更新tcardlog日志 /// </summary> /// <param name="tcardlog"></param> /// <returns></returns> public async Task <int> InsertCardLogAsync(tcardlog tcardlog) { const string sql = @"insert INTO public.tcardlog(pkid,fcode,fid,fcreatetime,flng,flat,ftype)values(@pkid,@fcode,@fid,@fcreatetime,@flng,@flat,@ftype)"; return(await ExecuteEntityAsync(sql, tcardlog)); }
/// <summary> /// TODO Mqtt回调消息处理 /// </summary> /// <param name="received"></param> /// <returns></returns> public async Task MqttMessageReceivedAsync(MqttMessageReceived received) { if (!string.IsNullOrEmpty(received.Payload) && received.Payload != "close" && !string.IsNullOrEmpty(received.Topic) && received.Topic == "cnc_sbm/gps_card") { try { var mqttMessage = JsonConvert.DeserializeObject <MqttMessage>(received.Payload); if (int.TryParse(mqttMessage.card_num, out var cardnum) && cardnum > 0) { decimal.TryParse(mqttMessage.jd, out var jd); decimal.TryParse(mqttMessage.wd, out var wd); int.TryParse(mqttMessage.sxc_zt, out var sxcZt); var cardList = mqttMessage.card_list; if (cardList != null && cardList.Count > 0) { #region 记录打卡位置和实时位置 var map = new Dictionary <string, string>(); var cardLogList = new List <tcardlog>(); foreach (var cardid in cardList) { //await _chatHub.Clients.Group(cardid).SendAsync("ReceiveMessage", jd, wd); await _chatHub.Clients.Group("3603631297").SendAsync("ReceiveMessage", jd, wd); var tcardlog = new tcardlog { pkid = Guid.NewGuid().ToString("N"), fcreatetime = DateTime.Now, fcode = mqttMessage.dev_id, fid = cardid, flng = jd, flat = wd, ftype = sxcZt }; cardLogList.Add(tcardlog); map.TryAdd(cardid, tcardlog.pkid); } if (cardLogList.Count == 1) { await _schoolBusRepository.InsertCardLogAsync(cardLogList.First()); } else { await _schoolBusRepository.InsertCardLogListAsync(cardLogList); } await _schoolBusRepository.InsertLocatelogAsync(new tlocatelog { fcreatetime = DateTime.Now, fcode = mqttMessage.dev_id, flng = jd, flat = wd }); #endregion #region 推送模板消息和日志 var sb = new StringBuilder("SELECT tcard.fname as fname,twxuser.fwxid as fwxid,tdevice.fplatenumber as fplatenumber,tdevice.fdriver,tdevice.fdriverphone,tcard.fid,"); sb.Append("case when(tcard.ftrialdate >= now() or (SELECT count(1) FROM tterm INNER JOIN ttermpay ON ttermpay.fk_term_id = tterm.pkid "); // 是否服务判断,未在试用期和付费用户只推送一条上车消息 sb.Append("where ttermpay.fcode = tcard.fcode and tterm.fstartdate <= now() and tterm.fenddate >= now()) > 0)"); sb.Append("then 1 else 0 end as paystate,"); // 判断当天是否推送过消息判断 sb.Append("(select count(1) from twxpushlog where twxpushlog.fwxid = twxuser.fwxid and "); sb.Append("to_char(twxpushlog.fcreatetime, 'yyyy-mm-dd') = to_char(now(), 'yyyy-mm-dd')) as wxmsgcount "); sb.Append("FROM tcard LEFT JOIN twxuser ON twxuser.fk_card_id = tcard.pkid LEFT JOIN tdevice ON tdevice.fcode = '" + mqttMessage.dev_id + "' and tdevice.fstate = 0 "); // 2019年3月7日 填加试用和付款筛选 去掉筛选 sb.Append("WHERE tcard.fstatus in (0,1) and tcard.fid IN ( '" + cardList[0] + "'"); for (var i = 1; i < cardList.Count; i++) { sb.Append(",'" + cardList[i] + "'"); } sb.Append(")"); var twxpushlogs = new List <twxpushlog>(); // 查询系统微信绑定卡记录 var userList = await _schoolBusRepository.GetUserBindCardAsync(sb.ToString()); foreach (var user in userList) { // paystate:1 付款用户,非付款用户 每天第一次上车 推送一条消息 if (user.paystate != 1 && (!int.TryParse(mqttMessage.sxc_zt, out var sxc) || sxc != 1 || user.wxmsgcount != 0)) { continue; } twxpushlogs.Add(new twxpushlog { fk_id = map.GetValueOrDefault(user.fid), fcreatetime = DateTime.Now, fwxid = user.fwxid, fstate = 1, fmsg = "微信id:" + _option.WxOption.WXConfigName + ",模板id:" + _option.WxOption.TemplateId }); #region 发送模板消息 #if !DEBUG const string remk = "\r\n鲸卫士全面上线,关注学生安全,鲸卫士让您实时了解孩子行程!"; string url = _option.WxOption.Domainnames + "SchoolBus/GoAddress?showType=0&cardLogId=" + map.GetValueOrDefault(user.fid); const string openid = "ovzSu1Ux_R10fGTWCEawfdVADSy8"; //user.fwxid var schoolData = new { first = new TemplateDataItem("点击查看刷卡位置", "#000000"), keyword1 = new TemplateDataItem(user.fname, "#000000"), keyword2 = new TemplateDataItem(DateTime.Now.ToString("HH:mm"), "#000000"), keyword3 = new TemplateDataItem(user.fplatenumber, "#000000"), remark = new TemplateDataItem(remk, "#ff0000") }; await Senparc.Weixin.MP.AdvancedAPIs.TemplateApi.SendTemplateMessageAsync(Senparc.Weixin.Config.SenparcWeixinSetting.WeixinAppId, openid, _option.WxOption.TemplateId, url, schoolData, null); #endif #endregion } await _schoolBusRepository.InsertWXpushlogListAsync(twxpushlogs); #endregion } } } catch (Exception e) { Console.WriteLine(e); } } }