From 73873d7f9d0aab9480a3d11332e8ca06e3de47fd Mon Sep 17 00:00:00 2001
From: shanji <18996038927@163.com>
Date: Thu, 22 Feb 2024 12:28:00 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B6=88=E6=81=AF=E4=B8=AD?=
=?UTF-8?q?=E5=BF=83=E6=9C=AC=E5=9C=B0=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
QYMessageCenter.Business/MessageBusiness.cs | 9 +-
QYMessageCenter.Client/App.xaml | 8 +-
QYMessageCenter.Client/App.xaml.cs | 2 +
.../Converters/AppCodeConverter.cs | 42 ++
QYMessageCenter.Client/GlobalContext.cs | 105 +++
QYMessageCenter.Client/MainWindow.xaml | 3 +-
QYMessageCenter.Client/MainWindow.xaml.cs | 17 +-
QYMessageCenter.Client/Models/Msg/Message.cs | 71 ++
.../Models/Msg/Message_PJZS_SHANGJIASHIBAI.cs | 25 +
QYMessageCenter.Client/PopupManager.cs | 64 ++
QYMessageCenter.Client/PopupWindow.xaml | 122 +++
QYMessageCenter.Client/PopupWindow.xaml.cs | 47 ++
.../QYMessageCenter.Client.csproj | 2 +
.../Resources/Themes/Generic.xaml | 19 +
.../MessageTemplateSelector.cs | 30 +
QYMessageCenter.Client/static/index.html | 95 ++-
QYMessageCenter.Model/DB/QYNotification.cs | 8 +-
.../DTO/Message/SendMessageRequest.cs | 5 +
QYMessageCenter.sln | 9 +-
QYMessageCenter/SWDescription.txt | 5 +-
SJ.Controls/AssemblyInfo.cs | 10 +
SJ.Controls/BAsyncImage.cs | 705 ++++++++++++++++++
SJ.Controls/BButton.cs | 72 ++
SJ.Controls/BTextBox.cs | 210 ++++++
SJ.Controls/BTextBoxAnimation.cs | 109 +++
SJ.Controls/BWindow.cs | 178 +++++
SJ.Controls/Extensions/VisualTreeExtension.cs | 71 ++
SJ.Controls/Helpers/StoryboardHelper.cs | 188 +++++
SJ.Controls/PageControl.xaml | 24 +
SJ.Controls/PageControl.xaml.cs | 137 ++++
SJ.Controls/RoundWaitProgress.xaml | 56 ++
SJ.Controls/RoundWaitProgress.xaml.cs | 180 +++++
SJ.Controls/SJ.Controls.csproj | 17 +
SJ.Controls/Themes/Generic.xaml | 377 ++++++++++
34 files changed, 2975 insertions(+), 47 deletions(-)
create mode 100644 QYMessageCenter.Client/Converters/AppCodeConverter.cs
create mode 100644 QYMessageCenter.Client/Models/Msg/Message.cs
create mode 100644 QYMessageCenter.Client/Models/Msg/Message_PJZS_SHANGJIASHIBAI.cs
create mode 100644 QYMessageCenter.Client/PopupManager.cs
create mode 100644 QYMessageCenter.Client/PopupWindow.xaml
create mode 100644 QYMessageCenter.Client/PopupWindow.xaml.cs
create mode 100644 QYMessageCenter.Client/Resources/Themes/Generic.xaml
create mode 100644 QYMessageCenter.Client/TemplateSelector/MessageTemplateSelector.cs
create mode 100644 SJ.Controls/AssemblyInfo.cs
create mode 100644 SJ.Controls/BAsyncImage.cs
create mode 100644 SJ.Controls/BButton.cs
create mode 100644 SJ.Controls/BTextBox.cs
create mode 100644 SJ.Controls/BTextBoxAnimation.cs
create mode 100644 SJ.Controls/BWindow.cs
create mode 100644 SJ.Controls/Extensions/VisualTreeExtension.cs
create mode 100644 SJ.Controls/Helpers/StoryboardHelper.cs
create mode 100644 SJ.Controls/PageControl.xaml
create mode 100644 SJ.Controls/PageControl.xaml.cs
create mode 100644 SJ.Controls/RoundWaitProgress.xaml
create mode 100644 SJ.Controls/RoundWaitProgress.xaml.cs
create mode 100644 SJ.Controls/SJ.Controls.csproj
create mode 100644 SJ.Controls/Themes/Generic.xaml
diff --git a/QYMessageCenter.Business/MessageBusiness.cs b/QYMessageCenter.Business/MessageBusiness.cs
index 9fcd4b4..c322493 100644
--- a/QYMessageCenter.Business/MessageBusiness.cs
+++ b/QYMessageCenter.Business/MessageBusiness.cs
@@ -1,8 +1,11 @@
using BBWYB.Server.Business;
using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using QYMessageCenter.Common.Extensions;
using QYMessageCenter.Common.Http;
using QYMessageCenter.Common.Log;
using QYMessageCenter.Common.Models;
+using QYMessageCenter.Model.DB;
using QYMessageCenter.Model.DTO;
using System.Configuration;
using System.Threading.Channels;
@@ -25,12 +28,16 @@ namespace QYMessageCenter.Business
///
public void Send(SendMessageRequest request)
{
+ var msg = request.Map();
+ msg.Id = idGenerator.NewLong();
+ msg.CreateTime = DateTime.Now;
+
#region 调用goeasy
var goeasy_httpResult = restApiService.SendRequest("https://rest-hz.goeasy.io/", "v2/pubsub/publish", new
{
appkey = Key,
channel = request.Channel,
- content = request.Content
+ content = JsonConvert.SerializeObject(msg)
}, null, HttpMethod.Post);
if (goeasy_httpResult.StatusCode != System.Net.HttpStatusCode.OK)
diff --git a/QYMessageCenter.Client/App.xaml b/QYMessageCenter.Client/App.xaml
index 4f02c61..96f5eb9 100644
--- a/QYMessageCenter.Client/App.xaml
+++ b/QYMessageCenter.Client/App.xaml
@@ -2,8 +2,14 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:QYMessageCenter.Client"
+ xmlns:ctr="clr-namespace:QYMessageCenter.Client.Converters"
StartupUri="MainWindow.xaml">
-
+
+
+
+
+
+
diff --git a/QYMessageCenter.Client/App.xaml.cs b/QYMessageCenter.Client/App.xaml.cs
index fca2011..67d7ca2 100644
--- a/QYMessageCenter.Client/App.xaml.cs
+++ b/QYMessageCenter.Client/App.xaml.cs
@@ -24,6 +24,8 @@ namespace QYMessageCenter.Client
#if DEBUG
//齐越山鸡
userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNTM1MzMwMzI4ODkyMTQ5NzYwIiwidGVhbUlkIjoiMTUxNjk3NDI1MDU0MjUwMTg4OCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNzI2MzAwNjY0fQ.hPSbgJEuTt0MLy_7YkSJX4rRG3drJAfso-5IS8ZlOkY";
+
+ //userToken="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMzk1NzA4MjA4NjU1MzcyMjg4IiwidGVhbUlkIjoiMTQzNjI4ODUwMDIzNTI0MzUyMCIsInNvblRlYW1JZHMiOiIxNDM2Mjg4NTAwMjM1MjQzNTIwIiwiZXhwIjoxNzQwMTM3NzY5fQ.Wq7IRvAkrVpn28Bj3ImG_KAg9MZ3C2Ux84vSjXyd0ZY"; //测试
#else
var tokenResult = ReadMMF();
diff --git a/QYMessageCenter.Client/Converters/AppCodeConverter.cs b/QYMessageCenter.Client/Converters/AppCodeConverter.cs
new file mode 100644
index 0000000..5762650
--- /dev/null
+++ b/QYMessageCenter.Client/Converters/AppCodeConverter.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace QYMessageCenter.Client.Converters
+{
+ public class AppCodeConverter : IValueConverter
+ {
+ private IDictionary codeDic;
+
+ public AppCodeConverter()
+ {
+ codeDic = new Dictionary()
+ {
+ { "PJZS", "评价助手" },
+ { "BBWYC", "步步为盈C端" },
+ { "BBWYB", "步步为盈B端" },
+ { "QK", "齐库" },
+ { "LK", "良库" },
+ { "SBF", "三板斧" },
+ { "SN", "司南" },
+ };
+ }
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var appCode = value?.ToString() ?? string.Empty;
+ if (codeDic.TryGetValue(appCode, out var appName))
+ return appName;
+ else return "UnKnow App";
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/QYMessageCenter.Client/GlobalContext.cs b/QYMessageCenter.Client/GlobalContext.cs
index ec732b3..046df36 100644
--- a/QYMessageCenter.Client/GlobalContext.cs
+++ b/QYMessageCenter.Client/GlobalContext.cs
@@ -1,6 +1,11 @@
using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
using QYMessageCenter.Client.Models;
+using QYMessageCenter.Client.Models.Msg;
+using QYMessageCenter.Common.Extensions;
using System.Runtime.InteropServices;
+using System.Windows;
+using System.Windows.Interop;
namespace QYMessageCenter.Client
{
@@ -8,6 +13,16 @@ namespace QYMessageCenter.Client
[ComVisible(true)]
public class GlobalContext
{
+ public GlobalContext()
+ {
+ messageHandleDic = new Dictionary>()
+ {
+ { "PJZS", OnReceiveMessageFromPJZS }
+ };
+
+ popupManager = new PopupManager();
+ }
+
public User User { get; set; }
public string UserToken { get; set; }
@@ -16,5 +31,95 @@ namespace QYMessageCenter.Client
{
return JsonConvert.SerializeObject(User);
}
+
+
+ private IDictionary> messageHandleDic;
+
+ private PopupManager popupManager;
+
+ public void OnError(string msg)
+ {
+ App.Current.Dispatcher.Invoke(() =>
+ {
+ MessageBox.Show(msg, "齐越消息中心");
+ });
+ }
+
+ public void OnReceiveMessage(string channel, string message)
+ {
+ try
+ {
+ var msg = JsonConvert.DeserializeObject(message);
+
+ if (!string.IsNullOrEmpty(msg.RecevierId) && !msg.RecevierId.Contains(User.Id.ToString()))
+ return; //忽略不是自己的消息
+ if (messageHandleDic.ContainsKey(msg.AppCode))
+ messageHandleDic[msg.AppCode](msg);
+ else
+ OnReceiveMessageFromUnknow(msg);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "齐越消息中心");
+ }
+ }
+
+ private void OnReceiveMessageFromPJZS(Message msg)
+ {
+ if (msg.CustomTypeCode == "SHANGJIASHIBAI")
+ {
+ var smsg = msg.Map();
+ var j = JObject.Parse(msg.Content);
+
+ smsg.ActivityName = j.Value("ActivityName");
+ smsg.SpuLogo = j.Value("SpuLogo");
+ smsg.MainProductSpu = j.Value("MainProductSpu");
+ smsg.ErrorMsg = j.Value("ErrorMsg");
+
+ App.Current.Dispatcher.BeginInvoke(() => popupManager.Show(smsg));
+ return;
+ }
+
+ App.Current.Dispatcher.BeginInvoke(() => popupManager.Show(msg));
+ }
+
+ private void OnReceiveMessageFromUnknow(Message msg)
+ {
+ //ReceiveMessageList.Insert(0, msg);
+ App.Current.Dispatcher.BeginInvoke(() => popupManager.Show(msg));
+ }
+
+ public void Test()
+ {
+ App.Current.Dispatcher.BeginInvoke((Action)delegate
+ {
+ popupManager.Show(new Message_PJZS_SHANGJIASHIBAI()
+ {
+ AppCode = "PJZS",
+ ShopId = "12899501",
+ CustomTypeCode = "SHANGJIASHIBAI",
+ Title = "信奉玩具专营店",
+ Content = JsonConvert.SerializeObject(new
+ {
+
+ }),
+ ActivityName = "小熊头枕腰靠",
+ MainProductSpu = "10025305065298",
+ SpuLogo = "https://img13.360buyimg.com/n9/s100x100_jfs/t1/235072/18/12198/94918/65b261a6F6de6ba33/23b803a34546427f.jpg",
+ ErrorMsg = "上架sku失败-com,jd.bk,saf.exception.SafJosException:销售属性排序冲冲突,同一顺序下不能有两个相同别名,别名:[柿柿如意发财果串-乔迁吊坠]顺序:[3]#8d306b629bae458faa58e9f5f0c883fb(Solution reference: https://jos.jd.com/commondoc?listld=171)"
+ });
+ });
+
+ App.Current.Dispatcher.BeginInvoke((Action)delegate
+ {
+ popupManager.Show(new Message()
+ {
+ AppCode = "PJZS",
+ ShopId = "12899501",
+ Title = "信奉玩具专营店",
+ Content = "上架sku失败-com,jd.bk,saf.exception.SafJosException:这是一个普通模板消息",
+ });
+ });
+ }
}
}
diff --git a/QYMessageCenter.Client/MainWindow.xaml b/QYMessageCenter.Client/MainWindow.xaml
index 495cb2e..128945e 100644
--- a/QYMessageCenter.Client/MainWindow.xaml
+++ b/QYMessageCenter.Client/MainWindow.xaml
@@ -6,7 +6,8 @@
xmlns:local="clr-namespace:QYMessageCenter.Client"
mc:Ignorable="d"
ShowInTaskbar="False"
- Title="齐越消息中心" Height="450" Width="800">
+ WindowStartupLocation="CenterScreen"
+ Title="齐越消息中心" Height="100" Width="300">
diff --git a/QYMessageCenter.Client/MainWindow.xaml.cs b/QYMessageCenter.Client/MainWindow.xaml.cs
index 49c8b25..61e7f7b 100644
--- a/QYMessageCenter.Client/MainWindow.xaml.cs
+++ b/QYMessageCenter.Client/MainWindow.xaml.cs
@@ -7,6 +7,7 @@ using QYMessageCenter.Common.Extensions;
using System.IO;
using System.Reflection;
using System.Text;
+using System.Transactions;
using System.Windows;
using io = System.IO;
namespace QYMessageCenter.Client
@@ -45,17 +46,29 @@ namespace QYMessageCenter.Client
var wb2Setting = CoreWebView2Environment.CreateAsync(userDataFolder: io.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "QYMessageCenter.Client")).Result;
wb2.CoreWebView2InitializationCompleted += Wb2_CoreWebView2InitializationCompleted;
await wb2.EnsureCoreWebView2Async(wb2Setting);
+ wb2.CoreWebView2.PermissionRequested += CoreWebView2_PermissionRequested;
//wb2.CoreWebView2.NavigateToString(html);
}
+ private void CoreWebView2_PermissionRequested(object? sender, CoreWebView2PermissionRequestedEventArgs e)
+ {
+ e.State = CoreWebView2PermissionState.Allow;
+ }
+
private void Wb2_CoreWebView2InitializationCompleted(object? sender, CoreWebView2InitializationCompletedEventArgs e)
{
Login();
wb2.CoreWebView2.AddHostObjectToScript("qymsgcenter", this.globalContext);
- var html = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "static", "index.html"), Encoding.UTF8);
- wb2.CoreWebView2.NavigateToString(html);
+ //var html = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "static", "index.html"), Encoding.UTF8);
+ //wb2.CoreWebView2.NavigateToString(html);
+
+ var htmlPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "static", "index.html");
+ wb2.CoreWebView2.Navigate(htmlPath);
+
this.Visibility = Visibility.Collapsed;
+
+ //globalContext.Test();
}
private void Login()
diff --git a/QYMessageCenter.Client/Models/Msg/Message.cs b/QYMessageCenter.Client/Models/Msg/Message.cs
new file mode 100644
index 0000000..8a15403
--- /dev/null
+++ b/QYMessageCenter.Client/Models/Msg/Message.cs
@@ -0,0 +1,71 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace QYMessageCenter.Client.Models
+{
+ public class Message : ObservableObject
+ {
+ private string appCode;
+ private string title;
+ private string content;
+
+
+ public long Id { get; set; }
+
+ ///
+ /// 消息频道
+ ///
+ public string Channel { get; set; }
+
+ ///
+ /// 消息所属团队Id
+ ///
+ public string TeamId { get; set; }
+
+ ///
+ /// 消息所属店铺Id
+ ///
+ public string ShopId { get; set; }
+
+ public DateTime? CreateTime { get; set; }
+
+ ///
+ /// 自定义类型编码
+ ///
+ public string CustomTypeCode { get; set; }
+
+ ///
+ /// 已读人员
+ ///
+ public string ReaderId { get; set; }
+
+ ///
+ /// 发送人
+ ///
+ public string SenderId { get; set; }
+
+ ///
+ /// 接收人(可空)
+ ///
+ public string RecevierId { get; set; }
+
+ ///
+ /// 是否为Json消息, 解析规则参考CustomTypeCode的约定
+ ///
+ public bool IsJsonMsg { get; set; }
+
+ ///
+ /// 消息所属应用
+ ///
+ public string AppCode { get => appCode; set { SetProperty(ref appCode, value); } }
+
+ ///
+ /// 消息标题
+ ///
+ public string Title { get => title; set { SetProperty(ref title, value); } }
+
+ ///
+ /// 消息内容
+ ///
+ public string Content { get => content; set { SetProperty(ref content, value); } }
+ }
+}
diff --git a/QYMessageCenter.Client/Models/Msg/Message_PJZS_SHANGJIASHIBAI.cs b/QYMessageCenter.Client/Models/Msg/Message_PJZS_SHANGJIASHIBAI.cs
new file mode 100644
index 0000000..643cbe0
--- /dev/null
+++ b/QYMessageCenter.Client/Models/Msg/Message_PJZS_SHANGJIASHIBAI.cs
@@ -0,0 +1,25 @@
+namespace QYMessageCenter.Client.Models.Msg
+{
+ ///
+ /// 消息_评价助手_上架失败
+ ///
+ public class Message_PJZS_SHANGJIASHIBAI : Message
+ {
+
+ private string activityName;
+
+ private string spuLogo;
+
+ private string mainProductSpu;
+
+ private string errorMsg;
+
+ public string ActivityName { get => activityName; set { SetProperty(ref activityName, value); } }
+
+ public string SpuLogo { get => spuLogo; set { SetProperty(ref spuLogo, value); } }
+
+ public string MainProductSpu { get => mainProductSpu; set { SetProperty(ref mainProductSpu, value); } }
+
+ public string ErrorMsg { get => errorMsg; set { SetProperty(ref errorMsg, value); } }
+ }
+}
diff --git a/QYMessageCenter.Client/PopupManager.cs b/QYMessageCenter.Client/PopupManager.cs
new file mode 100644
index 0000000..2022cec
--- /dev/null
+++ b/QYMessageCenter.Client/PopupManager.cs
@@ -0,0 +1,64 @@
+using CommunityToolkit.Mvvm.Messaging;
+using CommunityToolkit.Mvvm.Messaging.Messages;
+using QYMessageCenter.Client.Models;
+
+namespace QYMessageCenter.Client
+{
+ public class PopupManager
+ {
+ private List MessageList { get; set; }
+
+
+ private PopupWindow pw;
+
+ public PopupManager()
+ {
+ MessageList = new List();
+ WeakReferenceMessenger.Default.Register(this, (o, x) => ShowNext());
+ }
+
+ public void Show(Message msg)
+ {
+ MessageList.Insert(0, msg);
+ Show();
+ }
+
+ private void Show()
+ {
+ var msg = MessageList[0];
+ if (pw != null)
+ {
+ pw.RefreshMsg(msg);
+ }
+ else
+ {
+ pw = new PopupWindow(msg);
+ pw.Closed += Pw_Closed;
+ pw.Show();
+ }
+ }
+
+ private void Pw_Closed(object? sender, EventArgs e)
+ {
+ pw = null;
+ MessageList.Clear();
+ }
+
+ public void ShowNext()
+ {
+ if (MessageList.Count() > 0)
+ MessageList.RemoveAt(0);
+ if (MessageList.Count() == 0)
+ pw.Close();
+ else
+ Show();
+ }
+ }
+
+ public class MVVMMessage_ShowNext : ValueChangedMessage